From 7a395e2e7f63de16a434d35da53f528d992bf1a3 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 18 Mar 2024 14:49:11 +0100 Subject: [PATCH] Revert changes from main commits that were merged into blender-v4.1-release The last good commit was f57e4c5b98c075f3dfc61faebbcb43c99a778956. After this one more fix was committed, this one is preserved as well: 67bd678887d7f8aec9f3b23bbf1aaf29f80d0da4. --- .gitmodules | 17 +- AUTHORS | 7 - CMakeLists.txt | 102 +- GNUmakefile | 6 +- build_files/build_environment/CMakeLists.txt | 19 +- .../build_environment/cmake/alembic.cmake | 18 +- build_files/build_environment/cmake/aom.cmake | 17 +- .../build_environment/cmake/blosc.cmake | 7 +- .../build_environment/cmake/boost.cmake | 41 +- .../cmake/boost_build_options.cmake | 5 +- .../build_environment/cmake/brotli.cmake | 20 +- .../build_environment/cmake/bzip2.cmake | 19 +- .../build_environment/cmake/deflate.cmake | 7 +- .../build_environment/cmake/deps_html.cmake | 3 +- .../build_environment/cmake/download.cmake | 2 +- .../build_environment/cmake/dpcpp.cmake | 13 +- .../build_environment/cmake/embree.cmake | 42 +- .../cmake/embree_windows_arm.cmake | 142 - .../build_environment/cmake/epoxy.cmake | 28 +- .../build_environment/cmake/expat.cmake | 7 +- build_files/build_environment/cmake/ffi.cmake | 34 +- .../build_environment/cmake/ffmpeg.cmake | 126 +- .../build_environment/cmake/fftw.cmake | 42 +- .../build_environment/cmake/flac.cmake | 23 +- .../build_environment/cmake/flex.cmake | 18 +- .../build_environment/cmake/flexbison.cmake | 14 +- build_files/build_environment/cmake/fmt.cmake | 7 +- .../build_environment/cmake/freetype.cmake | 20 +- .../build_environment/cmake/fribidi.cmake | 21 +- .../build_environment/cmake/gmmlib.cmake | 7 +- build_files/build_environment/cmake/gmp.cmake | 97 +- .../build_environment/cmake/harfbuzz.cmake | 25 +- .../build_environment/cmake/haru.cmake | 16 +- .../build_environment/cmake/harvest.cmake | 18 +- .../build_environment/cmake/iconv.cmake | 24 +- build_files/build_environment/cmake/igc.cmake | 66 +- .../build_environment/cmake/imath.cmake | 25 +- .../build_environment/cmake/ispc.cmake | 21 +- .../build_environment/cmake/jemalloc.cmake | 16 +- .../build_environment/cmake/jpeg.cmake | 12 +- .../build_environment/cmake/lame.cmake | 66 +- .../build_environment/cmake/level-zero.cmake | 16 +- .../build_environment/cmake/libglu.cmake | 12 +- .../build_environment/cmake/llvm.cmake | 38 +- .../build_environment/cmake/lzma.cmake | 17 +- .../build_environment/cmake/materialx.cmake | 41 +- .../build_environment/cmake/mesa.cmake | 17 +- .../build_environment/cmake/minizipng.cmake | 7 +- .../build_environment/cmake/nasm.cmake | 23 +- .../build_environment/cmake/numpy.cmake | 8 +- .../build_environment/cmake/ocloc.cmake | 12 +- build_files/build_environment/cmake/ogg.cmake | 6 +- .../build_environment/cmake/openal.cmake | 20 +- .../build_environment/cmake/opencollada.cmake | 22 +- .../build_environment/cmake/opencolorio.cmake | 46 +- .../build_environment/cmake/openexr.cmake | 42 +- .../cmake/openimagedenoise.cmake | 39 +- .../build_environment/cmake/openimageio.cmake | 93 +- .../build_environment/cmake/openjpeg.cmake | 43 +- .../build_environment/cmake/openmp.cmake | 18 +- .../build_environment/cmake/openpgl.cmake | 21 +- .../build_environment/cmake/opensubdiv.cmake | 25 +- .../build_environment/cmake/openvdb.cmake | 54 +- .../build_environment/cmake/options.cmake | 24 +- .../build_environment/cmake/opus.cmake | 37 +- build_files/build_environment/cmake/osl.cmake | 51 +- .../cmake/package_python.cmake | 94 +- build_files/build_environment/cmake/png.cmake | 28 +- .../build_environment/cmake/potrace.cmake | 17 +- .../build_environment/cmake/pthreads.cmake | 43 +- .../build_environment/cmake/pugixml.cmake | 17 +- .../build_environment/cmake/pybind11.cmake | 12 +- .../build_environment/cmake/pystring.cmake | 21 +- .../build_environment/cmake/python.cmake | 90 +- .../build_environment/cmake/robinmap.cmake | 7 +- build_files/build_environment/cmake/sdl.cmake | 31 +- .../build_environment/cmake/setup_msys2.cmake | 41 +- .../build_environment/cmake/shaderc.cmake | 28 +- .../build_environment/cmake/sndfile.cmake | 40 +- .../build_environment/cmake/spnav.cmake | 33 +- .../build_environment/cmake/sqlite.cmake | 22 +- .../build_environment/cmake/sse2neon.cmake | 9 +- build_files/build_environment/cmake/ssl.cmake | 46 +- build_files/build_environment/cmake/tbb.cmake | 97 +- .../build_environment/cmake/theora.cmake | 59 +- .../build_environment/cmake/tiff.cmake | 16 +- build_files/build_environment/cmake/usd.cmake | 41 +- .../build_environment/cmake/versions.cmake | 6 +- .../build_environment/cmake/vorbis.cmake | 19 +- build_files/build_environment/cmake/vpx.cmake | 43 +- .../build_environment/cmake/vulkan.cmake | 28 +- .../build_environment/cmake/wayland.cmake | 15 +- .../cmake/wayland_libdecor.cmake | 6 +- .../cmake/wayland_protocols.cmake | 12 +- .../cmake/wayland_weston.cmake | 59 +- .../build_environment/cmake/webp.cmake | 13 +- .../build_environment/cmake/x264.cmake | 27 +- .../build_environment/cmake/xml2.cmake | 16 +- .../build_environment/cmake/xr_openxr.cmake | 21 +- .../build_environment/cmake/yamlcpp.cmake | 7 +- .../build_environment/cmake/zlib.cmake | 34 +- .../build_environment/cmake/zlib_mingw.cmake | 11 +- .../build_environment/cmake/zstd.cmake | 16 +- .../install_linux_packages.py | 2 +- .../patches/cmakelists_tbb.txt | 8 +- .../build_environment/patches/embree.diff | 15 +- .../patches/embree_Directory.Build.Props.in | 7 - .../build_environment/patches/level-zero.diff | 20 +- .../patches/openjpeg_msvc.diff | 13 - .../build_environment/patches/pthreads.diff | 39 +- ...n_windows_x64.diff => python_windows.diff} | 0 .../patches/python_windows_arm64.diff | 34 - .../build_environment/patches/tbb.diff | 624 +- .../build_environment/patches/usd.diff | 117 +- .../build_environment/windows/build_deps.cmd | 30 +- build_files/cmake/Modules/FindAudaspace.cmake | 2 - build_files/cmake/Modules/FindBlosc.cmake | 2 - build_files/cmake/Modules/FindBrotli.cmake | 10 +- build_files/cmake/Modules/FindClang.cmake | 26 +- build_files/cmake/Modules/FindClangTidy.cmake | 2 - build_files/cmake/Modules/FindEigen3.cmake | 2 - build_files/cmake/Modules/FindFFmpeg.cmake | 2 - build_files/cmake/Modules/FindFftw3.cmake | 4 +- build_files/cmake/Modules/FindFribidi.cmake | 2 - build_files/cmake/Modules/FindGMP.cmake | 2 - build_files/cmake/Modules/FindHIP.cmake | 2 - build_files/cmake/Modules/FindHIPRT.cmake | 2 - build_files/cmake/Modules/FindHarfbuzz.cmake | 2 - build_files/cmake/Modules/FindIcuLinux.cmake | 2 - build_files/cmake/Modules/FindJack.cmake | 2 - build_files/cmake/Modules/FindJeMalloc.cmake | 2 - build_files/cmake/Modules/FindLZO.cmake | 2 - build_files/cmake/Modules/FindLevelZero.cmake | 8 +- build_files/cmake/Modules/FindOSL.cmake | 8 - .../cmake/Modules/FindOpenCOLLADA.cmake | 6 +- .../cmake/Modules/FindOpenColorIO.cmake | 1 - .../cmake/Modules/FindOpenImageDenoise.cmake | 8 +- .../cmake/Modules/FindOpenSubdiv.cmake | 7 - build_files/cmake/Modules/FindPCRE.cmake | 2 - build_files/cmake/Modules/FindPotrace.cmake | 2 - build_files/cmake/Modules/FindPugiXML.cmake | 2 - build_files/cmake/Modules/FindPulse.cmake | 2 - .../cmake/Modules/FindPythonLibsUnix.cmake | 8 +- build_files/cmake/Modules/FindSDL2.cmake | 2 - build_files/cmake/Modules/FindSYCL.cmake | 14 +- build_files/cmake/Modules/FindSndFile.cmake | 2 - build_files/cmake/Modules/FindSpacenav.cmake | 2 - build_files/cmake/Modules/FindTBB.cmake | 2 - build_files/cmake/Modules/FindWebP.cmake | 4 - build_files/cmake/Modules/FindXML2.cmake | 2 - .../cmake/Modules/FindXR_OpenXR_SDK.cmake | 2 - build_files/cmake/Modules/FindZstd.cmake | 2 - build_files/cmake/config/blender_full.cmake | 1 + build_files/cmake/config/blender_lite.cmake | 1 + .../cmake/config/blender_release.cmake | 20 +- build_files/cmake/macros.cmake | 16 +- build_files/cmake/packaging.cmake | 2 +- .../cmake/platform/platform_unix.cmake | 38 +- .../cmake/platform/platform_win32.cmake | 163 +- build_files/cmake/testing.cmake | 4 +- build_files/utils/make_source_archive.py | 8 +- build_files/windows/check_libraries.cmd | 6 +- build_files/windows/configure_msbuild.cmd | 5 - build_files/windows/detect_architecture.cmd | 6 - build_files/windows/doc_py.cmd | 2 +- build_files/windows/find_dependencies.cmd | 18 - build_files/windows/format.cmd | 5 - build_files/windows/parse_arguments.cmd | 2 - build_files/windows/show_hashes.cmd | 6 +- .../BlendFileDnaExporter_25.py | 6 +- doc/blender_file_format/README | 6 +- doc/doxygen/Doxyfile | 2 +- .../bpy.utils.register_cli_command.1.py | 73 - .../bpy.utils.register_cli_command.py | 42 - doc/python_api/rst/include__bmesh.rst | 2 +- doc/python_api/rst_from_bmesh_opdefines.py | 12 +- doc/python_api/sphinx_doc_gen.py | 6 +- extern/CMakeLists.txt | 3 +- extern/README | 2 +- extern/audaspace/CMakeLists.txt | 2 - extern/audaspace/README.blender | 4 +- extern/audaspace/bindings/C/AUD_Sound.cpp | 12 +- extern/audaspace/bindings/C/AUD_Sound.h | 4 +- extern/audaspace/bindings/C/AUD_Special.cpp | 14 +- extern/audaspace/bindings/C/AUD_Special.h | 10 +- extern/audaspace/bindings/C/AUD_Types.h | 9 - extern/audaspace/bindings/python/PySound.cpp | 25 +- extern/audaspace/include/Exception.h | 8 +- .../audaspace/include/devices/DeviceManager.h | 6 +- .../include/devices/IDeviceFactory.h | 2 +- .../include/devices/OpenCloseDevice.h | 103 - .../include/devices/SoftwareDevice.h | 8 +- extern/audaspace/include/file/File.h | 2 +- extern/audaspace/include/file/FileManager.h | 6 +- extern/audaspace/include/file/FileWriter.h | 2 +- extern/audaspace/include/file/IFileInput.h | 4 +- extern/audaspace/include/file/IFileOutput.h | 2 +- extern/audaspace/include/respec/JOSResample.h | 4 +- .../include/respec/JOSResampleReader.h | 26 +- .../audaspace/include/respec/Specification.h | 9 - extern/audaspace/include/sequence/Sequence.h | 5 +- .../include/sequence/SequenceReader.h | 4 +- extern/audaspace/include/util/RingBuffer.h | 2 - .../plugins/coreaudio/CoreAudioDevice.cpp | 69 +- .../plugins/coreaudio/CoreAudioDevice.h | 17 +- extern/audaspace/plugins/ffmpeg/FFMPEG.cpp | 6 +- extern/audaspace/plugins/ffmpeg/FFMPEG.h | 6 +- .../audaspace/plugins/ffmpeg/FFMPEGReader.cpp | 2 +- .../audaspace/plugins/ffmpeg/FFMPEGReader.h | 2 +- .../audaspace/plugins/ffmpeg/FFMPEGWriter.cpp | 2 +- .../audaspace/plugins/ffmpeg/FFMPEGWriter.h | 2 +- extern/audaspace/plugins/jack/JackDevice.cpp | 4 +- extern/audaspace/plugins/jack/JackDevice.h | 2 +- .../audaspace/plugins/libsndfile/SndFile.cpp | 6 +- extern/audaspace/plugins/libsndfile/SndFile.h | 6 +- .../plugins/libsndfile/SndFileReader.cpp | 2 +- .../plugins/libsndfile/SndFileReader.h | 2 +- .../plugins/libsndfile/SndFileWriter.cpp | 2 +- .../plugins/libsndfile/SndFileWriter.h | 2 +- .../audaspace/plugins/openal/OpenALDevice.cpp | 8 +- .../audaspace/plugins/openal/OpenALDevice.h | 2 +- .../plugins/pulseaudio/PulseAudioDevice.cpp | 17 +- .../plugins/pulseaudio/PulseAudioDevice.h | 7 +- extern/audaspace/plugins/sdl/SDLDevice.cpp | 2 +- .../audaspace/plugins/wasapi/WASAPIDevice.cpp | 2 +- extern/audaspace/src/Exception.cpp | 8 +- .../audaspace/src/devices/DeviceManager.cpp | 6 +- extern/audaspace/src/devices/NULLDevice.cpp | 2 +- .../audaspace/src/devices/OpenCloseDevice.cpp | 66 - .../audaspace/src/devices/SoftwareDevice.cpp | 14 +- extern/audaspace/src/file/File.cpp | 2 +- extern/audaspace/src/file/FileManager.cpp | 6 +- extern/audaspace/src/file/FileWriter.cpp | 2 +- extern/audaspace/src/respec/JOSResample.cpp | 7 +- .../src/respec/JOSResampleReader.cpp | 8 +- extern/audaspace/src/sequence/Sequence.cpp | 4 +- .../audaspace/src/sequence/SequenceReader.cpp | 2 +- extern/audaspace/src/util/RingBuffer.cpp | 5 - extern/clew/CMakeLists.txt | 24 + extern/clew/README.blender | 5 + extern/clew/include/clew.h | 2822 + extern/clew/src/clew.c | 407 + extern/cuew/include/cuew.h | 2 +- extern/hipew/include/hipew.h | 2 +- extern/lzma/7zTypes.h | 597 - extern/lzma/7zWindows.h | 101 - extern/lzma/Alloc.c | 522 +- extern/lzma/Alloc.h | 53 +- extern/lzma/CMakeLists.txt | 14 +- extern/lzma/Compiler.h | 159 - extern/lzma/CpuArch.c | 823 - extern/lzma/CpuArch.h | 523 - extern/lzma/LzFind.c | 1732 +- extern/lzma/LzFind.h | 126 +- extern/lzma/LzFindMt.c | 1406 - extern/lzma/LzFindMt.h | 109 - extern/lzma/LzFindOpt.c | 578 - extern/lzma/LzHash.h | 66 +- extern/lzma/LzmaDec.c | 1050 +- extern/lzma/LzmaDec.h | 68 +- extern/lzma/LzmaEnc.c | 3390 +- extern/lzma/LzmaEnc.h | 69 +- extern/lzma/LzmaLib.c | 18 +- extern/lzma/LzmaLib.h | 47 +- extern/lzma/Precomp.h | 10 - extern/lzma/README.blender | 7 +- extern/lzma/Threads.c | 562 - extern/lzma/Threads.h | 240 - extern/lzma/Types.h | 208 + extern/lzma/history.txt | 236 + extern/lzma/lzma.txt | 594 + extern/lzo/README.blender | 2 +- extern/lzo/minilzo/lzodefs.h | 2 +- extern/lzo/minilzo/minilzo.c | 2 +- extern/tinygltf/README.blender | 2 +- extern/tinygltf/tiny_gltf.h | 2398 +- extern/xdnd/xdnd.h | 6 +- intern/clog/CLG_log.h | 20 + intern/cycles/CMakeLists.txt | 75 +- intern/cycles/blender/addon/properties.py | 14 +- intern/cycles/blender/addon/ui.py | 6 +- intern/cycles/blender/camera.cpp | 19 +- intern/cycles/blender/light.cpp | 2 +- intern/cycles/blender/object.cpp | 2 +- intern/cycles/blender/python.cpp | 17 +- intern/cycles/blender/shader.cpp | 6 +- intern/cycles/blender/sync.cpp | 2 - intern/cycles/blender/sync.h | 2 - intern/cycles/blender/util.h | 2 +- intern/cycles/device/cpu/device.cpp | 3 +- intern/cycles/device/cpu/kernel.cpp | 3 +- intern/cycles/device/cpu/kernel_function.h | 25 +- intern/cycles/device/cuda/kernel.cpp | 2 +- intern/cycles/device/denoise.h | 3 +- intern/cycles/device/device.cpp | 25 + intern/cycles/device/hip/kernel.cpp | 2 +- intern/cycles/device/metal/kernel.mm | 2 +- intern/cycles/device/metal/util.h | 2 +- .../cycles/integrator/denoiser_oidn_gpu.cpp | 56 +- intern/cycles/kernel/CMakeLists.txt | 8 +- .../closure/bsdf_principled_hair_huang.h | 210 +- intern/cycles/kernel/device/cpu/kernel.cpp | 22 +- intern/cycles/kernel/device/cpu/kernel.h | 5 +- .../cycles/kernel/device/cpu/kernel_avx2.cpp | 2 +- .../cycles/kernel/device/cpu/kernel_sse2.cpp | 22 + .../{kernel_sse42.cpp => kernel_sse41.cpp} | 11 +- .../cycles/kernel/integrator/shade_surface.h | 12 +- .../cycles/kernel/integrator/surface_shader.h | 16 + intern/cycles/kernel/light/tree.h | 4 +- intern/cycles/kernel/osl/closures_setup.h | 17 +- intern/cycles/kernel/svm/closure.h | 15 - intern/cycles/kernel/types.h | 10 +- intern/cycles/scene/osl.cpp | 10 +- intern/cycles/scene/shader_nodes.h | 2 +- intern/cycles/test/util_float8_test.h | 4 +- intern/cycles/util/CMakeLists.txt | 7 +- intern/cycles/util/debug.cpp | 3 +- intern/cycles/util/debug.h | 13 +- intern/cycles/util/defines.h | 2 +- intern/cycles/util/guiding.h | 2 +- intern/cycles/util/math.h | 2 +- intern/cycles/util/math_fast.h | 2 +- intern/cycles/util/math_float3.h | 10 +- intern/cycles/util/math_float4.h | 4 +- intern/cycles/util/math_int3.h | 4 +- intern/cycles/util/math_int4.h | 4 +- intern/cycles/util/math_intersect.h | 10 +- intern/cycles/util/openimagedenoise.h | 7 +- intern/cycles/util/optimization.h | 25 +- intern/cycles/util/simd.cpp | 32 + intern/cycles/util/simd.h | 146 +- intern/cycles/util/system.cpp | 48 +- intern/cycles/util/system.h | 3 +- intern/cycles/util/transform.h | 6 +- intern/cycles/util/transform_inverse.h | 2 +- ...ransform_sse42.cpp => transform_sse41.cpp} | 2 +- intern/ghost/GHOST_Path-api.hh | 6 +- intern/ghost/intern/GHOST_ContextEGL.cc | 4 +- .../ghost/intern/GHOST_DisplayManagerCocoa.hh | 2 +- .../ghost/intern/GHOST_DisplayManagerWin32.hh | 2 +- intern/ghost/intern/GHOST_DropTargetWin32.hh | 6 +- intern/ghost/intern/GHOST_DropTargetX11.cc | 3 +- intern/ghost/intern/GHOST_PathUtils.cc | 12 +- intern/ghost/intern/GHOST_PathUtils.hh | 5 +- intern/ghost/intern/GHOST_System.hh | 4 +- intern/ghost/intern/GHOST_SystemWayland.cc | 291 +- intern/ghost/intern/GHOST_SystemWayland.hh | 21 - intern/ghost/intern/GHOST_SystemWin32.cc | 29 +- intern/ghost/intern/GHOST_SystemWin32.hh | 17 +- intern/ghost/intern/GHOST_WindowCocoa.hh | 4 +- intern/ghost/intern/GHOST_WindowCocoa.mm | 2 +- intern/ghost/intern/GHOST_WindowWayland.cc | 2 +- intern/ghost/intern/GHOST_WindowWin32.cc | 30 +- intern/ghost/intern/GHOST_Wintab.hh | 22 +- intern/opencolorio/ocio_impl_glsl.cc | 2 +- intern/opencolorio/ocio_shader_shared.hh | 6 +- .../include/renderdoc_api.hh | 3 +- .../renderdoc_dynload/intern/renderdoc_api.cc | 10 +- lib/linux_x64 | 2 +- lib/macos_arm64 | 2 +- lib/macos_x64 | 2 +- lib/windows_arm64 | 1 - lib/windows_x64 | 2 +- release/datafiles/assets | 2 +- release/datafiles/blender_icons.svg | 604 +- .../datafiles/blender_icons16/icon16_back.dat | Bin 1048 -> 1048 bytes .../datafiles/blender_icons16/icon16_bold.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_collapsemenu.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_export.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_file_parent.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_file_refresh.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_forward.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_import.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_internet.dat | Bin 1048 -> 0 bytes .../blender_icons16/icon16_italic.dat | Bin 1048 -> 1048 bytes .../icon16_linenumbers_off.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_loop_back.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_loop_forwards.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_small_caps.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_solo_off.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_solo_on.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_sort_asc.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_sort_desc.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_sortalpha.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_sortbyext.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_syntax_off.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_three_dots.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_underline.dat | Bin 1048 -> 1048 bytes .../datafiles/blender_icons32/icon32_back.dat | Bin 4120 -> 4120 bytes .../datafiles/blender_icons32/icon32_bold.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_collapsemenu.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_export.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_file_parent.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_file_refresh.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_forward.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_import.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_internet.dat | Bin 4120 -> 0 bytes .../blender_icons32/icon32_italic.dat | Bin 4120 -> 4120 bytes .../icon32_linenumbers_off.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_loop_back.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_loop_forwards.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_small_caps.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_solo_off.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_solo_on.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_sort_asc.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_sort_desc.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_sortalpha.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_sortbyext.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_syntax_off.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_three_dots.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_underline.dat | Bin 4120 -> 4120 bytes .../datafiles/blender_icons_geom_update.py | 2 +- release/datafiles/blender_icons_update.py | 4 +- release/datafiles/colormanagement/config.ocio | 20 +- .../colormanagement/luts/pbrNeutral.cube | 185198 --------------- .../datafiles/icons/ops.sculpt.lasso_hide.dat | Bin 2240 -> 0 bytes release/datafiles/splash.png | Bin 730581 -> 601233 bytes release/datafiles/userdef/userdef_default.c | 2 +- .../datafiles/userdef/userdef_default_theme.c | 2 +- release/license/THIRD-PARTY-LICENSES.txt | 13 +- scripts/modules/bpy/__init__.py | 1 - scripts/modules/bpy/utils/__init__.py | 4 - scripts/modules/bpy/utils/toolsystem.py | 4 - scripts/modules/bpy_extras/anim_utils.py | 2 +- scripts/modules/bpy_extras/io_utils.py | 2 +- scripts/modules/bpy_types.py | 18 + scripts/modules/rna_keymap_ui.py | 2 +- scripts/modules/sys_info.py | 1 - .../keyconfig/keymap_data/blender_default.py | 44 +- .../keymap_data/industry_compatible_data.py | 8 +- .../startup/bl_operators/add_mesh_torus.py | 3 +- scripts/startup/bl_operators/anim.py | 10 +- scripts/startup/bl_operators/clip.py | 6 +- scripts/startup/bl_operators/console.py | 15 +- scripts/startup/bl_operators/file.py | 18 +- scripts/startup/bl_operators/mesh.py | 4 +- scripts/startup/bl_operators/node.py | 3 +- scripts/startup/bl_operators/object.py | 89 +- scripts/startup/bl_operators/object_align.py | 11 +- .../bl_operators/object_quick_effects.py | 9 +- .../object_randomize_transform.py | 12 +- scripts/startup/bl_operators/presets.py | 91 +- scripts/startup/bl_operators/userpref.py | 8 +- .../startup/bl_operators/uvcalc_transform.py | 3 +- scripts/startup/bl_operators/view3d.py | 3 +- scripts/startup/bl_operators/wm.py | 9 +- scripts/startup/bl_ui/anim.py | 4 - .../startup/bl_ui/node_add_menu_geometry.py | 43 +- scripts/startup/bl_ui/properties_animviz.py | 2 +- .../startup/bl_ui/properties_collection.py | 6 +- .../startup/bl_ui/properties_data_armature.py | 13 +- scripts/startup/bl_ui/properties_data_bone.py | 17 +- .../startup/bl_ui/properties_data_camera.py | 7 +- .../bl_ui/properties_data_grease_pencil.py | 200 +- .../startup/bl_ui/properties_data_light.py | 1 - scripts/startup/bl_ui/properties_data_mesh.py | 3 +- .../startup/bl_ui/properties_data_modifier.py | 17 +- scripts/startup/bl_ui/properties_freestyle.py | 3 +- .../bl_ui/properties_grease_pencil_common.py | 2 - .../startup/bl_ui/properties_mask_common.py | 6 +- scripts/startup/bl_ui/properties_object.py | 2 +- .../startup/bl_ui/properties_paint_common.py | 83 +- scripts/startup/bl_ui/properties_particle.py | 4 +- .../bl_ui/properties_physics_common.py | 18 +- scripts/startup/bl_ui/properties_render.py | 47 +- .../startup/bl_ui/properties_view_layer.py | 20 +- scripts/startup/bl_ui/space_clip.py | 55 +- scripts/startup/bl_ui/space_console.py | 4 +- scripts/startup/bl_ui/space_dopesheet.py | 3 +- scripts/startup/bl_ui/space_filebrowser.py | 33 +- scripts/startup/bl_ui/space_graph.py | 2 +- scripts/startup/bl_ui/space_image.py | 59 +- scripts/startup/bl_ui/space_info.py | 4 +- scripts/startup/bl_ui/space_nla.py | 2 + scripts/startup/bl_ui/space_node.py | 12 +- scripts/startup/bl_ui/space_outliner.py | 3 +- scripts/startup/bl_ui/space_sequencer.py | 2 +- scripts/startup/bl_ui/space_text.py | 15 +- scripts/startup/bl_ui/space_time.py | 2 +- .../startup/bl_ui/space_toolsystem_common.py | 3 +- .../startup/bl_ui/space_toolsystem_toolbar.py | 25 +- scripts/startup/bl_ui/space_topbar.py | 126 +- scripts/startup/bl_ui/space_userpref.py | 53 +- scripts/startup/bl_ui/space_view3d.py | 246 +- scripts/startup/bl_ui/space_view3d_toolbar.py | 240 +- scripts/templates_py/custom_nodes.py | 2 +- source/CMakeLists.txt | 8 + source/blender/animrig/ANIM_animation.hh | 297 - .../blender/animrig/ANIM_bone_collections.hh | 2 +- source/blender/animrig/ANIM_keyframing.hh | 4 +- source/blender/animrig/CMakeLists.txt | 4 - source/blender/animrig/intern/action.cc | 2 +- source/blender/animrig/intern/animation.cc | 260 - source/blender/animrig/intern/animdata.cc | 4 +- .../animrig/intern/bone_collections.cc | 14 +- .../animrig/intern/bone_collections_test.cc | 2 +- source/blender/animrig/intern/driver.cc | 1 + source/blender/animrig/intern/fcurve.cc | 2 +- source/blender/animrig/intern/keyframing.cc | 342 +- .../blender/animrig/intern/keyframing_auto.cc | 9 +- source/blender/animrig/intern/visualkey.cc | 7 +- .../blender/asset_system/AS_asset_catalog.hh | 162 +- .../asset_system/AS_asset_catalog_tree.hh | 16 +- .../blender/asset_system/AS_asset_library.hh | 36 +- .../asset_system/AS_asset_representation.hh | 18 +- source/blender/asset_system/CMakeLists.txt | 4 - .../asset_system/intern/asset_catalog.cc | 429 +- .../intern/asset_catalog_collection.cc | 68 - .../intern/asset_catalog_collection.hh | 61 - .../intern/asset_catalog_definition_file.cc | 289 - .../intern/asset_catalog_definition_file.hh | 87 - .../asset_system/intern/asset_catalog_path.cc | 34 +- .../asset_system/intern/asset_catalog_tree.cc | 20 +- .../asset_system/intern/asset_library.cc | 64 +- .../asset_system/intern/asset_library_all.cc | 52 +- .../asset_system/intern/asset_library_all.hh | 16 +- .../intern/asset_library_on_disk.cc | 4 +- .../intern/asset_library_runtime.cc | 2 +- .../intern/asset_library_service.cc | 64 +- .../intern/asset_library_service.hh | 24 +- .../intern/asset_representation.cc | 41 +- .../asset_system/intern/asset_storage.cc | 10 +- .../asset_system/intern/asset_storage.hh | 7 +- .../asset_system/tests/asset_catalog_test.cc | 39 +- .../tests/asset_catalog_tree_test.cc | 38 +- .../tests/asset_library_service_test.cc | 24 +- .../asset_system/tests/asset_library_test.cc | 13 +- .../tests/asset_library_test_common.hh | 22 +- .../tests/asset_representation_test.cc | 49 +- .../blender/blendthumb/src/blendthumb_png.cc | 8 +- source/blender/blenfont/BLF_api.hh | 30 +- source/blender/blenfont/CMakeLists.txt | 2 + source/blender/blenfont/intern/blf.cc | 13 +- source/blender/blenfont/intern/blf_font.cc | 53 +- source/blender/blenfont/intern/blf_glyph.cc | 93 +- .../blender/blenfont/intern/blf_internal.hh | 23 +- .../blenfont/intern/blf_internal_types.hh | 98 +- source/blender/blenfont/intern/blf_thumbs.cc | 2 +- source/blender/blenfont/intern/blf_util.cc | 43 + source/blender/blenkernel/BKE_DerivedMesh.hh | 9 +- .../{BKE_anim_data.hh => BKE_anim_data.h} | 72 +- source/blender/blenkernel/BKE_animation.hh | 17 - source/blender/blenkernel/BKE_animsys.h | 5 +- source/blender/blenkernel/BKE_appdir.hh | 28 +- source/blender/blenkernel/BKE_armature.hh | 12 - source/blender/blenkernel/BKE_asset.hh | 3 + source/blender/blenkernel/BKE_attribute.hh | 2 +- .../blender/blenkernel/BKE_attribute_math.hh | 26 +- .../{BKE_blender.hh => BKE_blender.h} | 35 +- .../blenkernel/BKE_blender_cli_command.hh | 67 - .../blender/blenkernel/BKE_blender_version.h | 6 +- source/blender/blenkernel/BKE_blendfile.hh | 12 +- .../blenkernel/BKE_blendfile_link_append.hh | 2 +- .../blenkernel/{BKE_bpath.hh => BKE_bpath.h} | 59 +- source/blender/blenkernel/BKE_bvhutils.hh | 105 +- source/blender/blenkernel/BKE_cachefile.h | 70 + source/blender/blenkernel/BKE_cachefile.hh | 58 - .../{BKE_callbacks.hh => BKE_callbacks.h} | 41 +- source/blender/blenkernel/BKE_camera.h | 4 +- source/blender/blenkernel/BKE_cloth.hh | 2 +- .../{BKE_collection.hh => BKE_collection.h} | 245 +- source/blender/blenkernel/BKE_constraint.h | 1 + source/blender/blenkernel/BKE_curve.hh | 3 +- source/blender/blenkernel/BKE_curves.hh | 9 +- source/blender/blenkernel/BKE_customdata.hh | 53 +- source/blender/blenkernel/BKE_data_transfer.h | 1 + .../{BKE_duplilist.hh => BKE_duplilist.h} | 63 +- .../{BKE_fcurve.hh => BKE_fcurve.h} | 240 +- source/blender/blenkernel/BKE_fcurve_driver.h | 2 +- .../{BKE_global.hh => BKE_global.h} | 33 +- .../blenkernel/BKE_gpencil_geom_legacy.h | 2 +- .../blenkernel/BKE_gpencil_modifier_legacy.h | 1 + .../blender/blenkernel/BKE_grease_pencil.hh | 62 +- .../BKE_grease_pencil_legacy_convert.hh | 40 - source/blender/blenkernel/BKE_icons.h | 2 + source/blender/blenkernel/BKE_idprop.h | 2 + source/blender/blenkernel/BKE_idtype.hh | 85 +- source/blender/blenkernel/BKE_instances.hh | 9 +- source/blender/blenkernel/BKE_lattice.hh | 1 + source/blender/blenkernel/BKE_layer.hh | 2 +- source/blender/blenkernel/BKE_lib_id.hh | 102 +- source/blender/blenkernel/BKE_lib_query.hh | 95 +- source/blender/blenkernel/BKE_lib_remap.hh | 185 +- source/blender/blenkernel/BKE_main.hh | 3 +- source/blender/blenkernel/BKE_mesh.h | 2 +- source/blender/blenkernel/BKE_mesh.hh | 14 - .../blenkernel/BKE_mesh_boolean_convert.hh | 38 + .../blender/blenkernel/BKE_mesh_iterators.hh | 2 +- source/blender/blenkernel/BKE_mesh_remap.hh | 2 + source/blender/blenkernel/BKE_mesh_runtime.hh | 2 +- source/blender/blenkernel/BKE_mesh_tangent.hh | 2 +- source/blender/blenkernel/BKE_modifier.hh | 8 +- source/blender/blenkernel/BKE_nla.h | 5 +- source/blender/blenkernel/BKE_node.h | 1377 + source/blender/blenkernel/BKE_node.hh | 1361 +- source/blender/blenkernel/BKE_node_runtime.hh | 21 +- .../blenkernel/BKE_node_tree_interface.hh | 4 +- source/blender/blenkernel/BKE_object.hh | 9 +- source/blender/blenkernel/BKE_object_types.hh | 9 +- source/blender/blenkernel/BKE_paint.hh | 2 + source/blender/blenkernel/BKE_pbvh_api.hh | 4 +- source/blender/blenkernel/BKE_preferences.h | 23 +- .../{BKE_report.hh => BKE_report.h} | 8 + source/blender/blenkernel/BKE_scene.h | 363 + source/blender/blenkernel/BKE_scene.hh | 330 - .../blender/blenkernel/BKE_scene_runtime.hh | 25 - source/blender/blenkernel/BKE_screen.hh | 9 +- source/blender/blenkernel/BKE_shader_fx.h | 1 + source/blender/blenkernel/BKE_shrinkwrap.hh | 33 - source/blender/blenkernel/BKE_subdiv_ccg.hh | 1 + source/blender/blenkernel/BKE_undo_system.hh | 2 - source/blender/blenkernel/BKE_vfont.hh | 2 +- source/blender/blenkernel/BKE_viewer_path.hh | 10 +- .../blender/blenkernel/BKE_volume_to_mesh.hh | 2 - source/blender/blenkernel/BKE_wm_runtime.hh | 23 - .../{BKE_writemovie.hh => BKE_writeavi.h} | 47 +- source/blender/blenkernel/BKE_writeffmpeg.hh | 54 +- source/blender/blenkernel/CMakeLists.txt | 56 +- .../blenkernel/intern/CCGSubSurf_intern.h | 5 + .../blender/blenkernel/intern/DerivedMesh.cc | 34 +- source/blender/blenkernel/intern/action.cc | 22 +- .../blenkernel/intern/action_mirror.cc | 4 +- source/blender/blenkernel/intern/anim_data.cc | 40 +- source/blender/blenkernel/intern/anim_sys.cc | 45 +- .../blenkernel/intern/anim_visualization.cc | 6 +- source/blender/blenkernel/intern/animation.cc | 255 - source/blender/blenkernel/intern/appdir.cc | 6 +- source/blender/blenkernel/intern/armature.cc | 25 +- .../blenkernel/intern/armature_deform.cc | 61 +- .../blenkernel/intern/armature_update.cc | 13 +- source/blender/blenkernel/intern/asset.cc | 16 +- .../blenkernel/intern/asset_weak_reference.cc | 45 +- source/blender/blenkernel/intern/attribute.cc | 10 +- .../blenkernel/intern/attribute_access.cc | 44 +- .../blenkernel/intern/attribute_math.cc | 87 - .../intern/bake_geometry_nodes_modifier.cc | 8 +- .../blender/blenkernel/intern/bake_items.cc | 7 + .../blenkernel/intern/bake_items_serialize.cc | 32 +- .../blenkernel/intern/bake_items_socket.cc | 2 - source/blender/blenkernel/intern/blender.cc | 43 +- .../blenkernel/intern/blender_cli_command.cc | 181 - .../blenkernel/intern/blender_copybuffer.cc | 14 +- .../blender/blenkernel/intern/blender_undo.cc | 4 +- source/blender/blenkernel/intern/blendfile.cc | 144 +- .../intern/blendfile_link_append.cc | 8 +- source/blender/blenkernel/intern/boids.cc | 8 +- source/blender/blenkernel/intern/bpath.cc | 10 +- .../blender/blenkernel/intern/bpath_test.cc | 2 +- source/blender/blenkernel/intern/brush.cc | 18 +- source/blender/blenkernel/intern/bvhutils.cc | 521 +- source/blender/blenkernel/intern/cachefile.cc | 23 +- source/blender/blenkernel/intern/callbacks.cc | 3 +- source/blender/blenkernel/intern/camera.cc | 54 +- .../blenkernel/intern/cdderivedmesh.cc | 13 +- source/blender/blenkernel/intern/cloth.cc | 15 +- .../blender/blenkernel/intern/collection.cc | 27 +- source/blender/blenkernel/intern/collision.cc | 9 +- source/blender/blenkernel/intern/colorband.cc | 1 + .../blender/blenkernel/intern/colortools.cc | 2 +- .../blender/blenkernel/intern/constraint.cc | 118 +- source/blender/blenkernel/intern/context.cc | 9 +- source/blender/blenkernel/intern/cpp_types.cc | 1 + .../blender/blenkernel/intern/crazyspace.cc | 15 +- source/blender/blenkernel/intern/curve.cc | 18 +- .../blender/blenkernel/intern/curve_bevel.cc | 4 +- .../blenkernel/intern/curve_catmull_rom.cc | 12 +- .../blenkernel/intern/curve_convert.cc | 2 + .../blenkernel/intern/curve_decimate.cc | 4 +- .../blender/blenkernel/intern/curve_deform.cc | 5 +- .../intern/curve_to_mesh_convert.cc | 31 +- source/blender/blenkernel/intern/curves.cc | 21 +- .../blenkernel/intern/curves_geometry.cc | 162 +- .../blender/blenkernel/intern/customdata.cc | 543 +- .../blenkernel/intern/data_transfer.cc | 2 +- source/blender/blenkernel/intern/deform.cc | 2 +- source/blender/blenkernel/intern/displist.cc | 5 + .../blender/blenkernel/intern/dynamicpaint.cc | 32 +- source/blender/blenkernel/intern/editmesh.cc | 2 + .../blenkernel/intern/editmesh_cache.cc | 2 + .../blenkernel/intern/editmesh_tangent.cc | 1 + source/blender/blenkernel/intern/effect.cc | 45 +- source/blender/blenkernel/intern/fcurve.cc | 182 +- .../blender/blenkernel/intern/fcurve_cache.cc | 2 +- .../blenkernel/intern/fcurve_driver.cc | 31 +- .../blender/blenkernel/intern/fcurve_test.cc | 2 +- source/blender/blenkernel/intern/fluid.cc | 32 +- source/blender/blenkernel/intern/fmodifier.cc | 4 +- source/blender/blenkernel/intern/freestyle.cc | 2 +- .../intern/geometry_component_curves.cc | 1 + .../intern/geometry_component_instances.cc | 79 +- .../intern/geometry_component_volume.cc | 2 + .../blenkernel/intern/geometry_fields.cc | 7 +- .../blender/blenkernel/intern/geometry_set.cc | 2 +- .../intern/geometry_set_instances.cc | 19 +- .../blenkernel/intern/gpencil_curve_legacy.cc | 12 +- .../blenkernel/intern/gpencil_geom_legacy.cc | 32 +- .../blenkernel/intern/gpencil_legacy.cc | 32 +- .../intern/gpencil_modifier_legacy.cc | 14 +- .../intern/gpencil_update_cache_legacy.cc | 3 + .../blenkernel/intern/grease_pencil.cc | 296 +- .../intern/grease_pencil_convert_legacy.cc | 1722 +- .../blenkernel/intern/grease_pencil_test.cc | 92 - .../intern/grease_pencil_vertex_groups.cc | 3 + source/blender/blenkernel/intern/icons.cc | 2 +- .../blenkernel/intern/icons_rasterize.cc | 3 +- source/blender/blenkernel/intern/idprop.cc | 4 +- .../blenkernel/intern/idprop_serialize.cc | 152 +- .../intern/idprop_serialize_test.cc | 22 +- .../blender/blenkernel/intern/idprop_utils.cc | 2 +- source/blender/blenkernel/intern/idtype.cc | 295 +- source/blender/blenkernel/intern/image.cc | 28 +- .../blender/blenkernel/intern/image_format.cc | 1 + source/blender/blenkernel/intern/image_gpu.cc | 5 +- .../blenkernel/intern/image_partial_update.cc | 1 + .../intern/image_partial_update_test.cc | 2 +- .../blender/blenkernel/intern/image_save.cc | 12 +- source/blender/blenkernel/intern/instances.cc | 83 +- source/blender/blenkernel/intern/ipo.cc | 15 +- source/blender/blenkernel/intern/key.cc | 15 +- source/blender/blenkernel/intern/lattice.cc | 23 +- .../blenkernel/intern/lattice_deform.cc | 7 +- .../blenkernel/intern/lattice_deform_test.cc | 23 +- source/blender/blenkernel/intern/layer.cc | 10 +- .../blender/blenkernel/intern/layer_utils.cc | 5 +- source/blender/blenkernel/intern/lib_id.cc | 211 +- .../blenkernel/intern/lib_id_delete.cc | 285 +- .../blender/blenkernel/intern/lib_id_eval.cc | 2 +- .../blenkernel/intern/lib_id_remapper.cc | 291 +- .../blenkernel/intern/lib_id_remapper_test.cc | 57 +- .../blender/blenkernel/intern/lib_override.cc | 133 +- .../intern/lib_override_proxy_conversion.cc | 6 +- source/blender/blenkernel/intern/lib_query.cc | 363 +- source/blender/blenkernel/intern/lib_remap.cc | 163 +- .../blenkernel/intern/lib_remap_test.cc | 42 +- source/blender/blenkernel/intern/library.cc | 12 +- source/blender/blenkernel/intern/light.cc | 24 +- .../blenkernel/intern/light_linking.cc | 8 +- .../blender/blenkernel/intern/lightprobe.cc | 5 +- source/blender/blenkernel/intern/linestyle.cc | 22 +- source/blender/blenkernel/intern/main.cc | 25 +- .../blender/blenkernel/intern/main_idmap.cc | 1 + .../blender/blenkernel/intern/main_namemap.cc | 3 +- source/blender/blenkernel/intern/main_test.cc | 2 +- source/blender/blenkernel/intern/mask.cc | 14 +- .../blenkernel/intern/mask_rasterize.cc | 2 +- source/blender/blenkernel/intern/material.cc | 39 +- source/blender/blenkernel/intern/mball.cc | 17 +- .../blenkernel/intern/mball_tessellate.cc | 22 +- source/blender/blenkernel/intern/mesh.cc | 59 +- .../intern/mesh_boolean_convert.cc} | 454 +- .../blender/blenkernel/intern/mesh_compare.cc | 10 - .../blender/blenkernel/intern/mesh_convert.cc | 10 +- .../blenkernel/intern/mesh_evaluate.cc | 5 + source/blender/blenkernel/intern/mesh_fair.cc | 6 + .../blenkernel/intern/mesh_iterators.cc | 4 +- .../blenkernel/intern/mesh_legacy_convert.cc | 32 +- .../blender/blenkernel/intern/mesh_mapping.cc | 2 +- .../intern/mesh_merge_customdata.cc | 4 +- .../blender/blenkernel/intern/mesh_mirror.cc | 13 +- .../blender/blenkernel/intern/mesh_normals.cc | 201 +- .../blender/blenkernel/intern/mesh_remap.cc | 2 +- .../blender/blenkernel/intern/mesh_runtime.cc | 45 +- .../blender/blenkernel/intern/mesh_sample.cc | 1 + .../blender/blenkernel/intern/mesh_tangent.cc | 36 +- .../blenkernel/intern/mesh_tessellate.cc | 230 +- source/blender/blenkernel/intern/modifier.cc | 4 +- source/blender/blenkernel/intern/movieclip.cc | 20 +- source/blender/blenkernel/intern/multires.cc | 6 +- .../blenkernel/intern/multires_reshape.cc | 5 + .../intern/multires_reshape_apply_base.cc | 10 + .../intern/multires_reshape_smooth.cc | 3 + .../intern/multires_reshape_subdivide.cc | 6 + .../intern/multires_reshape_util.cc | 6 +- .../intern/multires_reshape_vertcos.cc | 3 + .../blenkernel/intern/multires_subdiv.cc | 4 + .../blenkernel/intern/multires_unsubdivide.cc | 7 + source/blender/blenkernel/intern/nla.cc | 10 +- source/blender/blenkernel/intern/node.cc | 57 +- .../blenkernel/intern/node_enum_definition.cc | 2 + .../blender/blenkernel/intern/node_runtime.cc | 1 + .../blenkernel/intern/node_socket_value.cc | 12 - .../blenkernel/intern/node_tree_update.cc | 7 +- .../blenkernel/intern/node_tree_zones.cc | 2 + source/blender/blenkernel/intern/object.cc | 228 +- .../blenkernel/intern/object_deform.cc | 2 +- .../blender/blenkernel/intern/object_dupli.cc | 119 +- .../blenkernel/intern/object_update.cc | 40 +- .../blender/blenkernel/intern/packedFile.cc | 2 +- source/blender/blenkernel/intern/paint.cc | 38 +- .../blenkernel/intern/paint_toolslots.cc | 1 + source/blender/blenkernel/intern/particle.cc | 44 +- .../blenkernel/intern/particle_child.cc | 6 +- .../blenkernel/intern/particle_distribute.cc | 5 +- .../blenkernel/intern/particle_system.cc | 46 +- source/blender/blenkernel/intern/pbvh.cc | 35 +- .../blender/blenkernel/intern/pbvh_bmesh.cc | 58 +- .../blender/blenkernel/intern/pbvh_intern.hh | 2 +- .../blender/blenkernel/intern/pbvh_pixels.cc | 5 +- .../blenkernel/intern/pbvh_pixels_copy.cc | 2 +- .../blenkernel/intern/pbvh_uv_islands.cc | 2 +- .../blender/blenkernel/intern/pointcache.cc | 14 +- .../blender/blenkernel/intern/pointcloud.cc | 14 +- .../blender/blenkernel/intern/preferences.cc | 150 +- .../blenkernel/intern/preview_image.cc | 4 +- source/blender/blenkernel/intern/report.cc | 6 +- source/blender/blenkernel/intern/rigidbody.cc | 63 +- source/blender/blenkernel/intern/scene.cc | 82 +- source/blender/blenkernel/intern/screen.cc | 15 +- source/blender/blenkernel/intern/shader_fx.cc | 10 +- .../blender/blenkernel/intern/shrinkwrap.cc | 57 +- source/blender/blenkernel/intern/softbody.cc | 32 +- source/blender/blenkernel/intern/sound.cc | 39 +- source/blender/blenkernel/intern/speaker.cc | 6 +- .../blender/blenkernel/intern/studiolight.cc | 4 +- source/blender/blenkernel/intern/subdiv.cc | 1 + .../blender/blenkernel/intern/subdiv_ccg.cc | 11 +- .../blenkernel/intern/subdiv_ccg_mask.cc | 3 + .../blenkernel/intern/subdiv_converter.cc | 2 + .../intern/subdiv_converter_mesh.cc | 3 + .../blenkernel/intern/subdiv_displacement.cc | 2 + .../intern/subdiv_displacement_multires.cc | 1 + .../blender/blenkernel/intern/subdiv_eval.cc | 1 + .../blenkernel/intern/subdiv_foreach.cc | 3 + .../blender/blenkernel/intern/subdiv_mesh.cc | 3 + .../blenkernel/intern/subdiv_modifier.cc | 4 + .../blender/blenkernel/intern/subdiv_stats.cc | 4 +- .../blender/blenkernel/intern/subsurf_ccg.cc | 20 +- source/blender/blenkernel/intern/text.cc | 19 +- .../blenkernel/intern/text_suggestions.cc | 1 + source/blender/blenkernel/intern/texture.cc | 27 +- source/blender/blenkernel/intern/tracking.cc | 30 +- .../blenkernel/intern/tracking_auto.cc | 3 + .../blenkernel/intern/tracking_solver.cc | 6 +- .../blenkernel/intern/tracking_stabilize.cc | 4 +- .../blenkernel/intern/tracking_util.cc | 3 +- .../blenkernel/intern/type_conversions.cc | 13 - .../blender/blenkernel/intern/undo_system.cc | 4 +- source/blender/blenkernel/intern/vfont.cc | 18 +- .../blender/blenkernel/intern/viewer_path.cc | 5 +- source/blender/blenkernel/intern/volume.cc | 29 +- .../blenkernel/intern/volume_render.cc | 1 + .../blenkernel/intern/volume_to_mesh.cc | 10 +- .../blender/blenkernel/intern/wm_runtime.cc | 24 - source/blender/blenkernel/intern/workspace.cc | 10 +- source/blender/blenkernel/intern/world.cc | 21 +- source/blender/blenkernel/intern/writeavi.cc | 319 + .../blender/blenkernel/intern/writeffmpeg.cc | 279 +- .../blender/blenkernel/intern/writemovie.cc | 105 - source/blender/blenkernel/particle_private.h | 2 +- source/blender/blenlib/BLI_array_utils.hh | 4 +- source/blender/blenlib/BLI_bit_vector.hh | 4 +- source/blender/blenlib/BLI_bitmap_draw_2d.h | 12 +- source/blender/blenlib/BLI_bounds.hh | 77 +- source/blender/blenlib/BLI_bounds_types.hh | 46 - source/blender/blenlib/BLI_compiler_attrs.h | 4 +- source/blender/blenlib/BLI_convexhull_2d.h | 14 +- source/blender/blenlib/BLI_hash_mm2a.hh | 4 +- .../blender/blenlib/BLI_implicit_sharing.hh | 5 - source/blender/blenlib/BLI_index_mask.hh | 141 +- .../blenlib/BLI_index_mask_expression.hh | 94 - source/blender/blenlib/BLI_index_range.hh | 71 +- source/blender/blenlib/BLI_lasso_2d.h | 33 + source/blender/blenlib/BLI_lasso_2d.hh | 25 - .../blender/blenlib/BLI_linear_allocator.hh | 32 - .../BLI_linear_allocator_chunked_list.hh | 190 - .../blender/blenlib/BLI_math_basis_types.hh | 10 +- source/blender/blenlib/BLI_math_interp.hh | 2 +- source/blender/blenlib/BLI_math_matrix.h | 3 +- .../blender/blenlib/BLI_math_matrix_types.hh | 180 +- source/blender/blenlib/BLI_offset_indices.hh | 6 +- source/blender/blenlib/BLI_offset_span.hh | 19 +- .../BLI_random_access_iterator_mixin.hh | 133 - source/blender/blenlib/BLI_serialize.hh | 76 +- source/blender/blenlib/BLI_shared_cache.hh | 14 +- source/blender/blenlib/BLI_simd.h | 4 +- source/blender/blenlib/BLI_strict_flags.h | 6 +- source/blender/blenlib/BLI_string_ref.hh | 9 +- source/blender/blenlib/BLI_string_search.hh | 2 +- source/blender/blenlib/BLI_system.h | 2 +- source/blender/blenlib/BLI_task.hh | 41 +- source/blender/blenlib/BLI_tempfile.h | 19 +- source/blender/blenlib/BLI_time.h | 20 +- source/blender/blenlib/BLI_time_utildefines.h | 12 +- source/blender/blenlib/BLI_uuid.h | 7 +- source/blender/blenlib/BLI_uvproject.h | 6 +- source/blender/blenlib/BLI_virtual_array.hh | 17 +- source/blender/blenlib/CMakeLists.txt | 18 +- source/blender/blenlib/intern/BLI_assert.c | 5 +- source/blender/blenlib/intern/BLI_filelist.cc | 2 + source/blender/blenlib/intern/BLI_ghash.c | 3 +- .../blender/blenlib/intern/BLI_ghash_utils.cc | 19 +- source/blender/blenlib/intern/BLI_heap.c | 3 +- .../blender/blenlib/intern/BLI_heap_simple.c | 3 +- .../blender/blenlib/intern/BLI_index_range.cc | 5 +- source/blender/blenlib/intern/BLI_kdopbvh.c | 2 +- source/blender/blenlib/intern/BLI_linklist.c | 2 +- .../blenlib/intern/BLI_linklist_lockfree.c | 3 +- source/blender/blenlib/intern/BLI_memarena.c | 3 +- source/blender/blenlib/intern/BLI_memblock.c | 4 +- source/blender/blenlib/intern/BLI_memiter.c | 2 +- source/blender/blenlib/intern/BLI_mempool.c | 4 +- source/blender/blenlib/intern/BLI_timer.c | 2 +- source/blender/blenlib/intern/array_store.cc | 10 +- .../blenlib/intern/array_store_utils.cc | 2 + source/blender/blenlib/intern/array_utils.c | 3 +- .../{bitmap_draw_2d.cc => bitmap_draw_2d.c} | 51 +- source/blender/blenlib/intern/boxpack_2d.c | 2 +- source/blender/blenlib/intern/buffer.c | 2 +- source/blender/blenlib/intern/convexhull_2d.c | 283 + .../blender/blenlib/intern/convexhull_2d.cc | 443 - source/blender/blenlib/intern/delaunay_2d.cc | 13 +- source/blender/blenlib/intern/easing.c | 2 +- .../blender/blenlib/intern/filereader_zstd.c | 2 + .../blenlib/intern/generic_virtual_array.cc | 54 +- source/blender/blenlib/intern/gsqueue.c | 3 +- source/blender/blenlib/intern/hash_md5.cc | 19 +- source/blender/blenlib/intern/hash_mm2a.cc | 4 +- source/blender/blenlib/intern/index_mask.cc | 548 +- .../blenlib/intern/index_mask_expression.cc | 1360 - source/blender/blenlib/intern/jitter_2d.c | 2 +- source/blender/blenlib/intern/kdtree_impl.h | 3 +- source/blender/blenlib/intern/lasso_2d.c | 89 + source/blender/blenlib/intern/lasso_2d.cc | 86 - source/blender/blenlib/intern/listbase.cc | 2 +- source/blender/blenlib/intern/math_base.c | 3 +- source/blender/blenlib/intern/math_boolean.cc | 1 + source/blender/blenlib/intern/math_color.c | 2 +- source/blender/blenlib/intern/math_geom.cc | 3 +- source/blender/blenlib/intern/math_interp.cc | 21 +- source/blender/blenlib/intern/math_matrix.c | 3 +- source/blender/blenlib/intern/math_matrix.cc | 14 +- source/blender/blenlib/intern/math_rotation.c | 5 +- source/blender/blenlib/intern/math_solvers.c | 4 +- .../blender/blenlib/intern/math_statistics.c | 3 +- source/blender/blenlib/intern/math_vector.c | 3 +- source/blender/blenlib/intern/memory_utils.c | 2 +- source/blender/blenlib/intern/mesh_boolean.cc | 56 +- .../blender/blenlib/intern/mesh_intersect.cc | 28 +- source/blender/blenlib/intern/path_util.cc | 3 + source/blender/blenlib/intern/polyfill_2d.c | 2 +- .../blenlib/intern/polyfill_2d_beautify.c | 2 +- source/blender/blenlib/intern/quadric.c | 4 +- source/blender/blenlib/intern/rand.cc | 4 +- source/blender/blenlib/intern/scanfill.c | 2 +- .../blender/blenlib/intern/scanfill_utils.c | 6 +- source/blender/blenlib/intern/serialize.cc | 31 +- source/blender/blenlib/intern/session_uid.c | 2 + source/blender/blenlib/intern/stack.c | 2 +- source/blender/blenlib/intern/string.c | 2 +- .../blenlib/intern/string_cursor_utf8.c | 2 +- .../blender/blenlib/intern/string_search.cc | 1 + source/blender/blenlib/intern/string_utf8.cc | 2 +- source/blender/blenlib/intern/string_utils.cc | 2 +- source/blender/blenlib/intern/system.c | 25 +- source/blender/blenlib/intern/system_win32.c | 14 +- source/blender/blenlib/intern/task_graph.cc | 4 +- source/blender/blenlib/intern/task_iterator.c | 6 + source/blender/blenlib/intern/task_range.cc | 46 +- source/blender/blenlib/intern/tempfile.c | 40 +- source/blender/blenlib/intern/threads.cc | 12 +- source/blender/blenlib/intern/time.c | 14 +- source/blender/blenlib/intern/timecode.c | 2 +- source/blender/blenlib/intern/uuid.cc | 9 +- .../intern/{uvproject.cc => uvproject.c} | 23 +- source/blender/blenlib/intern/voxel.c | 2 +- .../blender/blenlib/tests/BLI_array_test.cc | 6 +- .../tests/BLI_bit_group_vector_test.cc | 5 +- .../blenlib/tests/BLI_bit_vector_test.cc | 5 +- .../blender/blenlib/tests/BLI_bounds_test.cc | 105 - .../blenlib/tests/BLI_convexhull_2d_test.cc | 346 - .../blenlib/tests/BLI_delaunay_2d_test.cc | 16 +- .../blenlib/tests/BLI_disjoint_set_test.cc | 5 +- .../tests/BLI_index_mask_expression_test.cc | 269 - .../blenlib/tests/BLI_index_mask_test.cc | 403 +- .../blenlib/tests/BLI_index_range_test.cc | 86 +- .../BLI_linear_allocator_chunked_list_test.cc | 102 - .../tests/BLI_linear_allocator_test.cc | 6 +- source/blender/blenlib/tests/BLI_map_test.cc | 5 +- .../blenlib/tests/BLI_math_interp_test.cc | 2 +- .../tests/BLI_math_matrix_types_test.cc | 15 - .../blenlib/tests/BLI_memory_utils_test.cc | 6 +- .../blenlib/tests/BLI_mesh_intersect_test.cc | 18 +- source/blender/blenlib/tests/BLI_pool_test.cc | 6 +- .../BLI_random_access_iterator_mixin_test.cc | 52 - source/blender/blenlib/tests/BLI_set_test.cc | 6 +- source/blender/blenlib/tests/BLI_span_test.cc | 6 +- .../blenlib/tests/BLI_stack_cxx_test.cc | 6 +- .../blenlib/tests/BLI_string_ref_test.cc | 69 +- source/blender/blenlib/tests/BLI_uuid_test.cc | 4 - .../blenlib/tests/BLI_vector_set_test.cc | 4 +- .../blender/blenlib/tests/BLI_vector_test.cc | 3 +- .../blenlib/tests/BLI_virtual_array_test.cc | 3 +- source/blender/blenloader/BLO_read_write.hh | 40 - .../{BLO_readfile.hh => BLO_readfile.h} | 206 +- source/blender/blenloader/BLO_undofile.hh | 24 +- .../blender/blenloader/BLO_userdef_default.h | 20 - source/blender/blenloader/CMakeLists.txt | 10 +- .../blenloader/intern/blend_validate.cc | 7 +- .../blenloader/intern/readblenentry.cc | 4 +- source/blender/blenloader/intern/readfile.cc | 173 +- source/blender/blenloader/intern/readfile.hh | 2 +- .../blenloader/intern/readfile_tempload.cc | 3 +- source/blender/blenloader/intern/undofile.cc | 71 +- .../blenloader/intern/versioning_250.cc | 14 +- .../blenloader/intern/versioning_260.cc | 19 +- .../blenloader/intern/versioning_270.cc | 18 +- .../blenloader/intern/versioning_280.cc | 29 +- .../blenloader/intern/versioning_290.cc | 15 +- .../blenloader/intern/versioning_300.cc | 12 +- .../blenloader/intern/versioning_400.cc | 143 +- .../blenloader/intern/versioning_common.cc | 3 +- .../blenloader/intern/versioning_defaults.cc | 17 +- .../blenloader/intern/versioning_dna.cc | 2 +- .../blenloader/intern/versioning_legacy.cc | 13 +- .../blenloader/intern/versioning_userdef.cc | 18 +- source/blender/blenloader/intern/writefile.cc | 36 +- .../tests/blendfile_loading_base_test.cc | 10 +- .../{BLT_lang.hh => BLT_lang.h} | 16 +- .../{BLT_translation.hh => BLT_translation.h} | 25 +- source/blender/blentranslation/CMakeLists.txt | 4 +- .../blentranslation/intern/blt_lang.cc | 4 +- .../blentranslation/intern/blt_translation.cc | 2 +- source/blender/bmesh/intern/bmesh_core.cc | 2 +- source/blender/bmesh/intern/bmesh_delete.cc | 1 + source/blender/bmesh/intern/bmesh_interp.cc | 1 + .../blender/bmesh/intern/bmesh_iterators.cc | 1 + source/blender/bmesh/intern/bmesh_log.cc | 13 +- source/blender/bmesh/intern/bmesh_log.hh | 9 - source/blender/bmesh/intern/bmesh_mesh.cc | 1 + .../bmesh/intern/bmesh_mesh_convert.cc | 136 +- .../bmesh/intern/bmesh_mesh_convert.hh | 13 - .../blender/bmesh/intern/bmesh_mesh_debug.cc | 2 +- .../bmesh/intern/bmesh_mesh_duplicate.cc | 4 + .../bmesh/intern/bmesh_mesh_normals.cc | 2 +- .../bmesh/intern/bmesh_mesh_partial_update.cc | 4 + .../bmesh/intern/bmesh_mesh_tessellate.cc | 3 + .../bmesh/intern/bmesh_mesh_validate.cc | 7 - .../blender/bmesh/intern/bmesh_operators.cc | 2 +- source/blender/bmesh/intern/bmesh_polygon.cc | 1 + .../bmesh/intern/bmesh_polygon_edgenet.cc | 2 +- source/blender/bmesh/intern/bmesh_query.cc | 2 +- source/blender/bmesh/intern/bmesh_query_uv.cc | 3 + source/blender/bmesh/operators/bmo_bevel.cc | 1 + .../bmesh/operators/bmo_fill_edgeloop.cc | 2 + .../blender/bmesh/operators/bmo_fill_grid.cc | 2 +- .../bmesh/operators/bmo_mesh_convert.cc | 2 +- source/blender/bmesh/operators/bmo_utils.cc | 2 + source/blender/bmesh/tools/bmesh_bevel.cc | 5 +- .../blender/bmesh/tools/bmesh_bisect_plane.cc | 1 + source/blender/bmesh/tools/bmesh_boolean.cc | 9 +- source/blender/bmesh/tools/bmesh_edgenet.cc | 2 +- source/blender/bmesh/tools/bmesh_intersect.cc | 2 +- source/blender/bmesh/tools/bmesh_path_uv.cc | 2 + .../blender/bmesh/tools/bmesh_region_match.cc | 2 +- source/blender/bmesh/tools/bmesh_wireframe.cc | 2 + source/blender/compositor/CMakeLists.txt | 46 +- source/blender/compositor/COM_compositor.hh | 242 +- source/blender/compositor/COM_defines.h | 32 + source/blender/compositor/COM_precomp.h | 2 + source/blender/compositor/COM_profile.hh | 58 - .../compositor/intern/COM_BufferOperation.cc | 82 + .../compositor/intern/COM_BufferOperation.h | 28 + .../compositor/intern/COM_CPUDevice.cc | 19 +- .../compositor/intern/COM_ChunkOrder.cc | 28 + .../compositor/intern/COM_ChunkOrder.h | 33 + .../intern/COM_ChunkOrderHotspot.cc | 19 + .../compositor/intern/COM_ChunkOrderHotspot.h | 27 + .../intern/COM_CompositorContext.cc | 17 + .../compositor/intern/COM_CompositorContext.h | 35 + .../compositor/intern/COM_ConstantFolder.cc | 2 +- .../compositor/intern/COM_Converter.cc | 12 +- source/blender/compositor/intern/COM_Debug.cc | 109 +- source/blender/compositor/intern/COM_Debug.h | 28 +- source/blender/compositor/intern/COM_Enums.cc | 19 + source/blender/compositor/intern/COM_Enums.h | 38 + .../compositor/intern/COM_ExecutionGroup.cc | 583 + .../compositor/intern/COM_ExecutionGroup.h | 392 + .../compositor/intern/COM_ExecutionModel.h | 10 - .../compositor/intern/COM_ExecutionSystem.cc | 34 +- .../compositor/intern/COM_ExecutionSystem.h | 53 +- .../intern/COM_FullFrameExecutionModel.cc | 12 +- .../compositor/intern/COM_MemoryBuffer.cc | 72 +- .../compositor/intern/COM_MemoryBuffer.h | 91 +- .../compositor/intern/COM_MemoryProxy.cc | 37 + .../compositor/intern/COM_MemoryProxy.h | 114 + .../intern/COM_MultiThreadedOperation.cc | 1 + source/blender/compositor/intern/COM_Node.h | 4 +- .../compositor/intern/COM_NodeGraph.cc | 14 +- .../blender/compositor/intern/COM_NodeGraph.h | 4 +- .../compositor/intern/COM_NodeOperation.cc | 190 +- .../compositor/intern/COM_NodeOperation.h | 250 +- .../intern/COM_NodeOperationBuilder.cc | 222 +- .../intern/COM_NodeOperationBuilder.h | 17 +- .../compositor/intern/COM_OpenCLDevice.cc | 271 + .../compositor/intern/COM_OpenCLDevice.h | 120 + .../intern/COM_SingleThreadedOperation.cc | 49 + .../intern/COM_SingleThreadedOperation.h | 44 + .../intern/COM_TiledExecutionModel.cc | 148 + .../intern/COM_TiledExecutionModel.h | 41 + .../compositor/intern/COM_WorkPackage.cc | 22 + .../compositor/intern/COM_WorkPackage.h | 30 +- .../compositor/intern/COM_WorkScheduler.cc | 268 +- .../compositor/intern/COM_WorkScheduler.h | 23 +- .../compositor/intern/COM_compositor.cc | 29 +- .../blender/compositor/intern/COM_profile.cc | 76 - .../blender/compositor/nodes/COM_BlurNode.cc | 32 +- .../compositor/nodes/COM_BokehBlurNode.cc | 1 - .../compositor/nodes/COM_CornerPinNode.cc | 54 +- .../compositor/nodes/COM_DefocusNode.cc | 5 - .../compositor/nodes/COM_DilateErodeNode.cc | 3 +- .../blender/compositor/nodes/COM_GlareNode.cc | 12 +- .../compositor/nodes/COM_KeyingNode.cc | 3 +- .../compositor/nodes/COM_KuwaharaNode.cc | 10 +- .../nodes/COM_PlaneTrackDeformNode.cc | 61 +- .../compositor/nodes/COM_RotateNode.cc | 19 +- .../compositor/nodes/COM_SocketProxyNode.cc | 45 + .../compositor/nodes/COM_SocketProxyNode.h | 7 + .../compositor/nodes/COM_Stabilize2dNode.cc | 146 +- .../compositor/nodes/COM_TransformNode.cc | 83 +- .../compositor/nodes/COM_TranslateNode.cc | 24 +- .../compositor/nodes/COM_ViewerNode.cc | 1 + .../operations/COM_AlphaOverKeyOperation.cc | 30 + .../operations/COM_AlphaOverKeyOperation.h | 5 + .../operations/COM_AlphaOverMixedOperation.cc | 31 + .../operations/COM_AlphaOverMixedOperation.h | 5 + .../COM_AlphaOverPremultiplyOperation.cc | 30 + .../COM_AlphaOverPremultiplyOperation.h | 5 + .../operations/COM_BilateralBlurOperation.cc | 73 + .../operations/COM_BilateralBlurOperation.h | 19 + .../operations/COM_BlurBaseOperation.cc | 63 +- .../operations/COM_BlurBaseOperation.h | 13 + .../operations/COM_BokehBlurOperation.cc | 203 +- .../operations/COM_BokehBlurOperation.h | 28 + .../operations/COM_BokehImageOperation.cc | 24 + .../operations/COM_BokehImageOperation.h | 12 + .../operations/COM_BoxMaskOperation.cc | 76 + .../operations/COM_BoxMaskOperation.h | 19 + .../operations/COM_BrightnessOperation.cc | 58 + .../operations/COM_BrightnessOperation.h | 22 + .../operations/COM_CalculateMeanOperation.cc | 139 +- .../operations/COM_CalculateMeanOperation.h | 53 +- ...COM_CalculateStandardDeviationOperation.cc | 110 +- .../COM_CalculateStandardDeviationOperation.h | 18 +- .../operations/COM_ChangeHSVOperation.cc | 42 + .../operations/COM_ChangeHSVOperation.h | 17 + .../operations/COM_ChannelMatteOperation.cc | 47 + .../operations/COM_ChannelMatteOperation.h | 11 + .../operations/COM_ChromaMatteOperation.cc | 81 + .../operations/COM_ChromaMatteOperation.h | 13 + .../COM_ColorBalanceASCCDLOperation.cc | 38 + .../COM_ColorBalanceASCCDLOperation.h | 24 + .../COM_ColorBalanceLGGOperation.cc | 38 + .../operations/COM_ColorBalanceLGGOperation.h | 24 + .../COM_ColorCorrectionOperation.cc | 118 + .../operations/COM_ColorCorrectionOperation.h | 20 + .../operations/COM_ColorCurveOperation.cc | 94 + .../operations/COM_ColorCurveOperation.h | 40 + .../operations/COM_ColorExposureOperation.cc | 31 + .../operations/COM_ColorExposureOperation.h | 22 + .../operations/COM_ColorMatteOperation.cc | 55 + .../operations/COM_ColorMatteOperation.h | 13 + .../operations/COM_ColorRampOperation.cc | 21 + .../operations/COM_ColorRampOperation.h | 19 + .../operations/COM_ColorSpillOperation.cc | 43 + .../operations/COM_ColorSpillOperation.h | 11 + .../operations/COM_CompositorOperation.cc | 103 +- .../operations/COM_CompositorOperation.h | 11 + .../operations/COM_ConstantOperation.cc | 1 + .../operations/COM_ConstantOperation.h | 2 +- .../COM_ConvertColorProfileOperation.cc | 22 + .../COM_ConvertColorProfileOperation.h | 20 + .../COM_ConvertColorSpaceOperation.cc | 15 + .../COM_ConvertColorSpaceOperation.h | 12 + .../COM_ConvertDepthToRadiusOperation.cc | 34 + .../COM_ConvertDepthToRadiusOperation.h | 7 +- .../operations/COM_ConvertOperation.cc | 286 + .../operations/COM_ConvertOperation.h | 55 + .../COM_ConvolutionEdgeFilterOperation.cc | 74 + .../COM_ConvolutionEdgeFilterOperation.h | 2 + .../COM_ConvolutionFilterOperation.cc | 79 + .../COM_ConvolutionFilterOperation.h | 9 + .../operations/COM_CropOperation.cc | 44 + .../compositor/operations/COM_CropOperation.h | 9 + .../operations/COM_CryptomatteOperation.cc | 28 + .../operations/COM_CryptomatteOperation.h | 1 + .../operations/COM_CurveBaseOperation.h | 6 + .../operations/COM_DenoiseOperation.cc | 109 +- .../operations/COM_DenoiseOperation.h | 27 +- .../operations/COM_DespeckleOperation.cc | 112 + .../operations/COM_DespeckleOperation.h | 11 + .../COM_DifferenceMatteOperation.cc | 57 + .../operations/COM_DifferenceMatteOperation.h | 13 + .../operations/COM_DilateErodeOperation.cc | 498 + .../operations/COM_DilateErodeOperation.h | 93 + .../COM_DirectionalBlurOperation.cc | 89 + .../operations/COM_DirectionalBlurOperation.h | 25 + .../operations/COM_DisplaceOperation.cc | 89 +- .../operations/COM_DisplaceOperation.h | 25 + .../operations/COM_DisplaceSimpleOperation.cc | 94 + .../operations/COM_DisplaceSimpleOperation.h | 28 + .../COM_DistanceRGBMatteOperation.cc | 59 + .../COM_DistanceRGBMatteOperation.h | 13 + .../operations/COM_DotproductOperation.cc | 27 + .../operations/COM_DotproductOperation.h | 8 + .../operations/COM_DoubleEdgeMaskOperation.cc | 64 + .../operations/COM_DoubleEdgeMaskOperation.h | 29 + .../operations/COM_EllipseMaskOperation.cc | 82 + .../operations/COM_EllipseMaskOperation.h | 19 + .../COM_FastGaussianBlurOperation.cc | 139 +- .../COM_FastGaussianBlurOperation.h | 11 + .../operations/COM_FileOutputOperation.cc | 41 +- .../operations/COM_FileOutputOperation.h | 1 + .../operations/COM_FlipOperation.cc | 24 +- .../compositor/operations/COM_FlipOperation.h | 6 +- .../operations/COM_GammaCorrectOperation.cc | 72 + .../operations/COM_GammaCorrectOperation.h | 42 + .../operations/COM_GammaOperation.cc | 29 + .../operations/COM_GammaOperation.h | 22 + .../COM_GaussianAlphaBlurBaseOperation.cc | 14 +- .../COM_GaussianAlphaBlurBaseOperation.h | 10 - .../COM_GaussianAlphaXBlurOperation.cc | 170 + .../COM_GaussianAlphaXBlurOperation.h | 40 + .../COM_GaussianAlphaYBlurOperation.cc | 171 + .../COM_GaussianAlphaYBlurOperation.h | 40 + .../COM_GaussianBlurBaseOperation.cc | 78 +- .../COM_GaussianBlurBaseOperation.h | 10 - .../COM_GaussianBokehBlurOperation.cc | 335 +- .../COM_GaussianBokehBlurOperation.h | 31 +- .../operations/COM_GaussianXBlurOperation.cc | 185 + .../operations/COM_GaussianXBlurOperation.h | 52 + .../operations/COM_GaussianYBlurOperation.cc | 185 + .../operations/COM_GaussianYBlurOperation.h | 52 + .../operations/COM_GlareBaseOperation.cc | 42 + .../operations/COM_GlareBaseOperation.h | 24 +- .../operations/COM_GlareBloomOperation.cc | 316 - .../operations/COM_GlareBloomOperation.h | 21 - .../operations/COM_GlareThresholdOperation.cc | 33 + .../operations/COM_GlareThresholdOperation.h | 20 + .../COM_HueSaturationValueCorrectOperation.cc | 52 +- .../COM_HueSaturationValueCorrectOperation.h | 22 + .../operations/COM_IDMaskOperation.cc | 16 + .../operations/COM_IDMaskOperation.h | 3 + .../operations/COM_ImageOperation.cc | 86 +- .../operations/COM_ImageOperation.h | 5 + .../operations/COM_InpaintOperation.cc | 46 + .../operations/COM_InpaintOperation.h | 9 + .../operations/COM_InvertOperation.cc | 43 + .../operations/COM_InvertOperation.h | 21 + .../operations/COM_KeyingBlurOperation.cc | 62 + .../operations/COM_KeyingBlurOperation.h | 8 + .../operations/COM_KeyingClipOperation.cc | 88 + .../operations/COM_KeyingClipOperation.h | 8 + .../operations/COM_KeyingDespillOperation.cc | 46 + .../operations/COM_KeyingDespillOperation.h | 7 + .../operations/COM_KeyingOperation.cc | 66 +- .../operations/COM_KeyingOperation.h | 8 + .../operations/COM_KeyingScreenOperation.cc | 55 +- .../operations/COM_KeyingScreenOperation.h | 4 + .../COM_KuwaharaAnisotropicOperation.cc | 284 +- .../COM_KuwaharaAnisotropicOperation.h | 12 +- ...haraAnisotropicStructureTensorOperation.cc | 72 + ...aharaAnisotropicStructureTensorOperation.h | 5 + .../COM_KuwaharaClassicOperation.cc | 128 +- .../operations/COM_KuwaharaClassicOperation.h | 14 +- .../operations/COM_LuminanceMatteOperation.cc | 49 + .../operations/COM_LuminanceMatteOperation.h | 9 + .../operations/COM_MapRangeOperation.cc | 69 + .../operations/COM_MapRangeOperation.h | 24 + .../operations/COM_MapUVOperation.cc | 98 +- .../operations/COM_MapUVOperation.h | 27 + .../operations/COM_MapValueOperation.cc | 34 + .../operations/COM_MapValueOperation.h | 22 + .../operations/COM_MaskOperation.cc | 33 + .../compositor/operations/COM_MaskOperation.h | 2 + .../operations/COM_MathBaseOperation.cc | 727 + .../operations/COM_MathBaseOperation.h | 156 +- .../compositor/operations/COM_MixOperation.cc | 780 + .../compositor/operations/COM_MixOperation.h | 84 + .../COM_MovieClipAttributeOperation.cc | 8 + .../COM_MovieClipAttributeOperation.h | 4 + .../operations/COM_MovieClipOperation.cc | 39 + .../operations/COM_MovieClipOperation.h | 2 + .../COM_MovieDistortionOperation.cc | 56 + .../operations/COM_MovieDistortionOperation.h | 5 + .../COM_MultilayerImageOperation.cc | 78 + .../operations/COM_MultilayerImageOperation.h | 3 + .../operations/COM_NormalizeOperation.cc | 91 + .../operations/COM_NormalizeOperation.h | 25 + .../operations/COM_OpenCLKernels.cl | 297 + .../operations/COM_PixelateOperation.cc | 55 + .../operations/COM_PixelateOperation.h | 35 + .../operations/COM_PlaneCornerPinOperation.cc | 173 +- .../operations/COM_PlaneCornerPinOperation.h | 27 + .../COM_PlaneDistortCommonOperation.cc | 165 +- .../COM_PlaneDistortCommonOperation.h | 23 + .../operations/COM_PlaneTrackOperation.cc | 26 +- .../operations/COM_PlaneTrackOperation.h | 7 + .../operations/COM_PosterizeOperation.cc | 33 + .../operations/COM_PosterizeOperation.h | 22 + .../operations/COM_PreviewOperation.cc | 43 + .../operations/COM_PreviewOperation.h | 7 +- .../COM_ProjectorLensDistortionOperation.cc | 115 +- .../COM_ProjectorLensDistortionOperation.h | 28 + .../operations/COM_QualityStepHelper.h | 3 + .../operations/COM_ReadBufferOperation.cc | 125 + .../operations/COM_ReadBufferOperation.h | 63 + .../operations/COM_RenderLayersProg.cc | 117 + .../operations/COM_RenderLayersProg.h | 4 + .../operations/COM_RotateOperation.cc | 86 +- .../operations/COM_RotateOperation.h | 12 + .../operations/COM_SMAAOperation.cc | 333 + .../compositor/operations/COM_SMAAOperation.h | 67 + .../operations/COM_ScaleOperation.cc | 193 +- .../operations/COM_ScaleOperation.h | 22 + .../COM_ScreenLensDistortionOperation.cc | 326 +- .../COM_ScreenLensDistortionOperation.h | 21 + .../COM_SetAlphaMultiplyOperation.cc | 28 + .../COM_SetAlphaMultiplyOperation.h | 9 + .../COM_SetAlphaReplaceOperation.cc | 26 + .../operations/COM_SetAlphaReplaceOperation.h | 15 + .../operations/COM_SetColorOperation.cc | 8 + .../operations/COM_SetColorOperation.h | 5 + .../operations/COM_SetSamplerOperation.cc | 17 + .../operations/COM_SetSamplerOperation.h | 11 + .../operations/COM_SetValueOperation.cc | 8 + .../operations/COM_SetValueOperation.h | 5 + .../operations/COM_SetVectorOperation.cc | 10 + .../operations/COM_SetVectorOperation.h | 5 + .../operations/COM_SplitOperation.cc | 31 + .../operations/COM_SplitOperation.h | 6 + .../COM_SummedAreaTableOperation.cc | 110 + .../operations/COM_SummedAreaTableOperation.h | 22 +- .../operations/COM_SunBeamsOperation.cc | 64 + .../operations/COM_SunBeamsOperation.h | 7 + .../operations/COM_TextureOperation.cc | 139 +- .../operations/COM_TextureOperation.h | 5 + .../operations/COM_TonemapOperation.cc | 121 + .../operations/COM_TonemapOperation.h | 32 + .../operations/COM_TrackPositionOperation.cc | 15 + .../operations/COM_TrackPositionOperation.h | 2 + .../operations/COM_TranslateOperation.cc | 76 +- .../operations/COM_TranslateOperation.h | 43 +- .../COM_VariableSizeBokehBlurOperation.cc | 492 +- .../COM_VariableSizeBokehBlurOperation.h | 58 +- .../operations/COM_VectorBlurOperation.cc | 54 + .../operations/COM_VectorBlurOperation.h | 24 + .../operations/COM_VectorCurveOperation.cc | 25 + .../operations/COM_VectorCurveOperation.h | 22 + .../operations/COM_ViewerOperation.cc | 49 +- .../operations/COM_ViewerOperation.h | 15 +- .../operations/COM_WrapOperation.cc | 108 + .../compositor/operations/COM_WrapOperation.h | 29 + .../operations/COM_WriteBufferOperation.cc | 215 + .../operations/COM_WriteBufferOperation.h | 53 + .../operations/COM_ZCombineOperation.cc | 122 + .../operations/COM_ZCombineOperation.h | 30 + .../realtime_compositor/CMakeLists.txt | 7 +- .../realtime_compositor/COM_context.hh | 4 - .../COM_algorithm_parallel_reduction.hh | 6 - .../intern/morphological_distance_feather.cc | 1 + .../algorithms/intern/parallel_reduction.cc | 29 +- .../cached_resources/intern/cached_mask.cc | 1 + .../ocio_color_space_conversion_shader.cc | 2 +- .../intern/compile_state.cc | 3 +- .../realtime_compositor/intern/context.cc | 11 - .../intern/node_operation.cc | 2 +- .../intern/render_context.cc | 3 +- .../realtime_compositor/intern/scheduler.cc | 1 + .../intern/shader_operation.cc | 2 +- ...compositor_glare_fog_glow_downsample.glsl} | 0 ...> compositor_glare_fog_glow_upsample.glsl} | 0 .../shaders/compositor_plane_deform.glsl | 14 +- .../shaders/compositor_plane_deform_mask.glsl | 19 - .../compositor_plane_deform_motion_blur.glsl | 24 +- ...positor_plane_deform_motion_blur_mask.glsl | 26 - ...mpositor_symmetric_blur_variable_size.glsl | 125 +- .../shaders/compositor_write_output.glsl | 5 - .../shaders/infos/compositor_glare_info.hh | 22 +- .../compositor_parallel_reduction_info.hh | 22 - .../infos/compositor_plane_deform_info.hh | 27 +- ...ompositor_plane_deform_motion_blur_info.hh | 15 + .../infos/compositor_write_output_info.hh | 1 - .../gpu_shader_compositor_hue_correct.glsl | 38 +- ...OM_ComputeSummedAreaTableOperation_test.cc | 6 + .../tests/COM_NodeOperation_test.cc | 9 +- source/blender/datatoc/datatoc_icon_split.py | 2 +- source/blender/depsgraph/CMakeLists.txt | 2 - .../blender/depsgraph/DEG_depsgraph_build.hh | 5 - .../blender/depsgraph/DEG_depsgraph_query.hh | 4 +- .../depsgraph/intern/builder/deg_builder.cc | 6 +- .../intern/builder/deg_builder_nodes.cc | 113 +- .../intern/builder/deg_builder_nodes.h | 7 +- .../builder/deg_builder_nodes_view_layer.cc | 10 +- .../intern/builder/deg_builder_relations.cc | 115 +- .../builder/deg_builder_relations_drivers.cc | 2 +- .../builder/deg_builder_relations_rig.cc | 20 +- .../deg_builder_relations_view_layer.cc | 6 +- .../depsgraph/intern/builder/pipeline.cc | 6 +- .../builder/pipeline_from_collection.cc | 122 - .../intern/builder/pipeline_from_collection.h | 42 - .../depsgraph/intern/debug/deg_debug.cc | 6 +- .../depsgraph/intern/debug/deg_debug.h | 2 +- .../debug/deg_debug_relations_graphviz.cc | 8 +- source/blender/depsgraph/intern/depsgraph.cc | 24 +- source/blender/depsgraph/intern/depsgraph.hh | 2 +- .../depsgraph/intern/depsgraph_build.cc | 11 +- .../depsgraph/intern/depsgraph_eval.cc | 2 +- .../intern/depsgraph_light_linking.cc | 2 +- .../depsgraph/intern/depsgraph_query.cc | 21 +- .../intern/depsgraph_query_foreach.cc | 2 +- .../depsgraph/intern/depsgraph_query_iter.cc | 11 +- .../blender/depsgraph/intern/depsgraph_tag.cc | 48 +- .../blender/depsgraph/intern/eval/deg_eval.cc | 36 +- .../intern/eval/deg_eval_copy_on_write.cc | 76 +- .../intern/eval/deg_eval_copy_on_write.h | 26 +- .../depsgraph/intern/eval/deg_eval_flush.cc | 10 +- .../intern/eval/deg_eval_runtime_backup.cc | 2 +- .../intern/eval/deg_eval_runtime_backup.h | 4 +- .../eval/deg_eval_runtime_backup_animation.cc | 2 +- .../eval/deg_eval_runtime_backup_gpencil.cc | 2 +- .../blender/depsgraph/intern/node/deg_node.cc | 8 +- .../blender/depsgraph/intern/node/deg_node.hh | 4 +- .../intern/node/deg_node_component.cc | 4 +- .../intern/node/deg_node_component.hh | 4 +- .../depsgraph/intern/node/deg_node_id.cc | 15 +- .../depsgraph/intern/node/deg_node_id.hh | 8 +- .../intern/node/deg_node_operation.cc | 6 +- .../intern/node/deg_node_operation.hh | 2 +- source/blender/draw/CMakeLists.txt | 17 +- source/blender/draw/DRW_engine.hh | 8 +- source/blender/draw/DRW_select_buffer.hh | 4 +- .../draw/engines/basic/basic_engine.cc | 4 +- .../engines/compositor/compositor_engine.cc | 36 +- .../blender/draw/engines/eevee/eevee_data.cc | 2 +- .../engines/eevee/eevee_depth_of_field.cc | 2 +- .../draw/engines/eevee/eevee_effects.cc | 2 +- .../draw/engines/eevee/eevee_engine.cc | 14 +- .../draw/engines/eevee/eevee_lightcache.cc | 6 +- .../draw/engines/eevee/eevee_lightprobes.cc | 45 +- .../draw/engines/eevee/eevee_lights.cc | 4 +- .../draw/engines/eevee/eevee_materials.cc | 4 +- .../draw/engines/eevee/eevee_motion_blur.cc | 8 +- .../draw/engines/eevee/eevee_occlusion.cc | 2 +- .../draw/engines/eevee/eevee_render.cc | 2 +- .../draw/engines/eevee/eevee_renderpasses.cc | 2 +- .../draw/engines/eevee/eevee_shaders_extra.cc | 12 +- .../draw/engines/eevee/eevee_shadows.cc | 4 +- .../draw/engines/eevee/eevee_shadows_cube.cc | 4 +- .../draw/engines/eevee/eevee_volumes.cc | 4 +- .../eevee/shaders/closure_type_lib.glsl | 1 - .../eevee/shaders/common_uniforms_lib.glsl | 12 +- .../infos/engine_eevee_legacy_shared.h | 28 +- .../engines/eevee/shaders/surface_lib.glsl | 5 - .../eevee/shaders/volumetric_frag.glsl | 5 - .../eevee/shaders/volumetric_vert.glsl | 5 - .../draw/engines/eevee_next/eevee_camera.cc | 2 +- .../draw/engines/eevee_next/eevee_defines.hh | 38 +- .../eevee_next/eevee_depth_of_field.cc | 2 +- .../eevee_next/eevee_depth_of_field.hh | 2 +- .../draw/engines/eevee_next/eevee_engine.cc | 2 +- .../draw/engines/eevee_next/eevee_film.cc | 65 +- .../draw/engines/eevee_next/eevee_film.hh | 7 - .../draw/engines/eevee_next/eevee_gbuffer.hh | 36 - .../engines/eevee_next/eevee_hizbuffer.cc | 8 +- .../draw/engines/eevee_next/eevee_instance.cc | 62 +- .../draw/engines/eevee_next/eevee_instance.hh | 17 +- .../eevee_next/eevee_irradiance_cache.cc | 145 +- .../eevee_next/eevee_irradiance_cache.hh | 24 +- .../draw/engines/eevee_next/eevee_light.cc | 21 +- .../engines/eevee_next/eevee_lightcache.cc | 6 +- .../engines/eevee_next/eevee_lightprobe.cc | 344 +- .../engines/eevee_next/eevee_lightprobe.hh | 196 +- .../draw/engines/eevee_next/eevee_lookdev.cc | 4 +- .../draw/engines/eevee_next/eevee_material.hh | 3 - .../engines/eevee_next/eevee_motion_blur.cc | 12 +- .../engines/eevee_next/eevee_motion_blur.hh | 2 +- .../draw/engines/eevee_next/eevee_pipeline.cc | 230 +- .../draw/engines/eevee_next/eevee_pipeline.hh | 38 +- .../engines/eevee_next/eevee_planar_probes.cc | 84 +- .../engines/eevee_next/eevee_planar_probes.hh | 83 +- .../draw/engines/eevee_next/eevee_raytrace.cc | 18 +- .../eevee_next/eevee_reflection_probes.cc | 696 +- .../eevee_next/eevee_reflection_probes.hh | 289 +- .../draw/engines/eevee_next/eevee_sampling.cc | 4 +- .../draw/engines/eevee_next/eevee_shader.cc | 105 +- .../draw/engines/eevee_next/eevee_shader.hh | 7 +- .../engines/eevee_next/eevee_shader_shared.hh | 120 +- .../draw/engines/eevee_next/eevee_shadow.cc | 91 +- .../draw/engines/eevee_next/eevee_shadow.hh | 8 +- .../draw/engines/eevee_next/eevee_sync.cc | 13 + .../draw/engines/eevee_next/eevee_sync.hh | 3 +- .../draw/engines/eevee_next/eevee_velocity.cc | 16 +- .../draw/engines/eevee_next/eevee_view.cc | 93 +- .../draw/engines/eevee_next/eevee_volume.cc | 4 +- .../draw/engines/eevee_next/eevee_world.cc | 9 +- .../eevee_next/shaders/eevee_bxdf_lib.glsl | 15 - .../eevee_next/shaders/eevee_closure_lib.glsl | 5 +- .../shaders/eevee_cryptomatte_lib.glsl | 4 - .../shaders/eevee_deferred_capture_frag.glsl | 1 - .../shaders/eevee_deferred_combine_frag.glsl | 15 +- .../shaders/eevee_deferred_light_frag.glsl | 59 +- .../eevee_film_cryptomatte_post_comp.glsl | 2 - .../eevee_next/shaders/eevee_film_lib.glsl | 128 +- .../eevee_next/shaders/eevee_forward_lib.glsl | 105 +- .../shaders/eevee_gbuffer_closure_test.glsl | 152 +- .../eevee_next/shaders/eevee_gbuffer_lib.glsl | 405 +- .../shaders/eevee_gbuffer_normal_test.glsl | 103 +- .../shaders/eevee_horizon_denoise_comp.glsl | 9 +- .../shaders/eevee_horizon_scan_comp.glsl | 13 +- .../eevee_light_culling_debug_frag.glsl | 2 +- .../shaders/eevee_light_eval_lib.glsl | 60 +- .../eevee_next/shaders/eevee_light_lib.glsl | 28 +- .../shaders/eevee_lightprobe_eval_lib.glsl | 81 +- .../eevee_lightprobe_irradiance_ray_comp.glsl | 2 +- .../shaders/eevee_lightprobe_lib.glsl | 10 +- .../eevee_lightprobe_volume_eval_lib.glsl | 17 +- .../shaders/eevee_nodetree_lib.glsl | 138 +- .../shaders/eevee_octahedron_lib.glsl | 13 - .../eevee_ray_denoise_bilateral_comp.glsl | 17 +- .../eevee_ray_denoise_spatial_comp.glsl | 9 +- .../shaders/eevee_ray_generate_comp.glsl | 9 +- .../shaders/eevee_ray_tile_classify_comp.glsl | 4 +- .../shaders/eevee_ray_trace_planar_comp.glsl | 5 +- .../shaders/eevee_ray_trace_screen_comp.glsl | 3 +- .../shaders/eevee_ray_trace_screen_lib.glsl | 2 +- .../eevee_reflection_probe_convolve_comp.glsl | 147 - .../eevee_reflection_probe_eval_lib.glsl | 12 +- .../shaders/eevee_reflection_probe_lib.glsl | 17 +- .../eevee_reflection_probe_mapping_lib.glsl | 128 - .../eevee_reflection_probe_remap_comp.glsl | 56 +- .../eevee_reflection_probe_select_comp.glsl | 2 +- ...flection_probe_update_irradiance_comp.glsl | 22 +- .../shaders/eevee_sampling_lib.glsl | 20 - .../shaders/eevee_shadow_debug_frag.glsl | 44 +- .../eevee_next/shaders/eevee_shadow_lib.glsl | 244 +- .../shaders/eevee_shadow_tag_usage_lib.glsl | 4 +- .../shaders/eevee_shadow_tilemap_lib.glsl | 18 - .../shaders/eevee_shadow_tracing_lib.glsl | 96 +- .../eevee_spherical_harmonics_lib.glsl | 21 +- .../shaders/eevee_surf_capture_frag.glsl | 20 +- .../shaders/eevee_surf_deferred_frag.glsl | 32 +- .../shaders/eevee_surf_depth_frag.glsl | 4 +- .../shaders/eevee_surf_forward_frag.glsl | 8 +- .../shaders/eevee_surf_hybrid_frag.glsl | 32 +- .../shaders/eevee_surf_shadow_frag.glsl | 8 +- .../shaders/eevee_surf_world_frag.glsl | 2 +- .../shaders/eevee_surfel_light_comp.glsl | 2 - .../shaders/eevee_surfel_ray_comp.glsl | 2 +- .../shaders/eevee_thickness_lib.glsl | 2 +- .../shaders/eevee_vertex_copy_comp.glsl | 2 +- .../shaders/infos/eevee_deferred_info.hh | 2 +- .../shaders/infos/eevee_film_info.hh | 4 - .../infos/eevee_irradiance_cache_info.hh | 10 +- .../infos/eevee_reflection_probe_info.hh | 40 +- .../engines/gpencil/gpencil_antialiasing.hh | 154 + .../engines/gpencil/gpencil_cache_utils.cc | 232 +- .../draw/engines/gpencil/gpencil_draw_data.cc | 21 +- .../draw/engines/gpencil/gpencil_engine.cc | 449 + .../draw/engines/gpencil/gpencil_engine.h | 24 +- .../draw/engines/gpencil/gpencil_engine_c.cc | 230 +- .../draw/engines/gpencil/gpencil_layer.hh | 69 + .../draw/engines/gpencil/gpencil_light.hh | 131 + .../draw/engines/gpencil/gpencil_material.hh | 319 + .../draw/engines/gpencil/gpencil_object.hh | 324 + .../draw/engines/gpencil/gpencil_render.cc | 2 +- .../draw/engines/gpencil/gpencil_shader.cc | 119 + .../draw/engines/gpencil/gpencil_shader.hh | 66 + .../draw/engines/gpencil/gpencil_shader_fx.cc | 45 +- .../engines/gpencil/gpencil_shader_shared.h | 43 + .../draw/engines/gpencil/gpencil_vfx.hh | 336 + .../grease_pencil_depth_merge_vert.glsl | 9 + .../gpencil/shaders/grease_pencil_frag.glsl | 153 + .../gpencil/shaders/grease_pencil_vert.glsl | 139 + .../gpencil/shaders/infos/gpencil_info.hh | 45 + .../draw/engines/image/image_shader_params.hh | 2 +- .../draw/engines/overlay/overlay_armature.cc | 58 +- .../draw/engines/overlay/overlay_edit_text.cc | 6 +- .../draw/engines/overlay/overlay_edit_uv.cc | 5 - .../draw/engines/overlay/overlay_engine.cc | 6 +- .../draw/engines/overlay/overlay_extra.cc | 113 +- .../engines/overlay/overlay_gpencil_legacy.cc | 6 +- .../draw/engines/overlay/overlay_image.cc | 4 +- .../draw/engines/overlay/overlay_lattice.cc | 2 +- .../draw/engines/overlay/overlay_metaball.cc | 8 +- .../engines/overlay/overlay_mode_transfer.cc | 2 +- .../engines/overlay/overlay_motion_path.cc | 7 +- .../engines/overlay/overlay_next_empty.hh | 3 +- .../engines/overlay/overlay_next_engine.cc | 2 +- .../engines/overlay/overlay_next_instance.cc | 8 +- .../draw/engines/overlay/overlay_outline.cc | 101 +- .../draw/engines/overlay/overlay_paint.cc | 11 +- .../draw/engines/overlay/overlay_private.hh | 4 +- .../overlay/overlay_viewer_attribute.cc | 7 +- .../engines/overlay/overlay_viewer_text.cc | 4 +- .../draw/engines/overlay/overlay_wireframe.cc | 22 +- .../shaders/infos/overlay_edit_mode_info.hh | 1 - .../overlay_edit_uv_stretching_vert.glsl | 2 +- .../overlay_motion_path_point_vert.glsl | 2 +- .../draw/engines/select/select_engine.cc | 2 +- .../draw/engines/select/select_engine.hh | 6 +- .../draw/engines/select/select_instance.hh | 4 +- .../shaders/workbench_world_light_lib.glsl | 2 +- .../workbench_effect_antialiasing.cc | 25 +- .../engines/workbench/workbench_effect_dof.cc | 29 +- .../workbench/workbench_effect_outline.cc | 11 +- .../engines/workbench/workbench_engine.cc | 103 +- .../draw/engines/workbench/workbench_enums.hh | 3 +- .../workbench/workbench_mesh_passes.cc | 55 +- .../engines/workbench/workbench_private.hh | 184 +- .../engines/workbench/workbench_resources.cc | 4 +- .../workbench/workbench_shader_cache.cc | 192 +- .../engines/workbench/workbench_shadow.cc | 64 +- .../engines/workbench/workbench_volume.cc | 49 +- source/blender/draw/intern/DRW_gpu_wrapper.hh | 6 +- source/blender/draw/intern/DRW_render.hh | 6 +- .../blender/draw/intern/attribute_convert.cc | 38 +- source/blender/draw/intern/draw_cache.hh | 4 +- .../blender/draw/intern/draw_cache_extract.hh | 10 +- .../draw/intern/draw_cache_extract_mesh.cc | 32 +- .../draw_cache_extract_mesh_render_data.cc | 23 +- .../draw/intern/draw_cache_impl_curves.cc | 68 +- .../intern/draw_cache_impl_gpencil_legacy.cc | 2 +- .../intern/draw_cache_impl_grease_pencil.cc | 41 +- .../draw/intern/draw_cache_impl_mesh.cc | 146 +- .../intern/draw_cache_impl_subdivision.cc | 25 +- .../draw/intern/draw_cache_impl_volume.cc | 2 +- source/blender/draw/intern/draw_command.hh | 10 +- source/blender/draw/intern/draw_common.cc | 2 +- source/blender/draw/intern/draw_curves.cc | 4 +- source/blender/draw/intern/draw_debug.cc | 4 +- source/blender/draw/intern/draw_debug.hh | 4 +- source/blender/draw/intern/draw_hair.cc | 8 +- .../blender/draw/intern/draw_instance_data.cc | 2 +- source/blender/draw/intern/draw_manager.cc | 6 +- source/blender/draw/intern/draw_manager.h | 8 +- source/blender/draw/intern/draw_manager_c.cc | 63 +- .../blender/draw/intern/draw_manager_data.cc | 37 +- .../blender/draw/intern/draw_manager_exec.cc | 2 +- .../draw/intern/draw_manager_profiling.cc | 2 +- .../draw/intern/draw_manager_shader.cc | 6 +- .../blender/draw/intern/draw_manager_text.cc | 36 +- source/blender/draw/intern/draw_pass.hh | 2 +- source/blender/draw/intern/draw_pbvh.cc | 63 +- source/blender/draw/intern/draw_resource.hh | 6 +- source/blender/draw/intern/draw_sculpt.cc | 2 +- .../blender/draw/intern/draw_select_buffer.cc | 7 +- source/blender/draw/intern/draw_shader.hh | 2 +- .../blender/draw/intern/draw_subdivision.hh | 3 +- .../blender/draw/intern/draw_texture_pool.cc | 2 +- source/blender/draw/intern/draw_view_c.cc | 2 +- source/blender/draw/intern/draw_volume.cc | 6 +- .../intern/mesh_extractors/extract_mesh.cc | 7 +- .../intern/mesh_extractors/extract_mesh.hh | 17 +- .../extract_mesh_vbo_attributes.cc | 78 +- .../extract_mesh_vbo_edge_fac.cc | 2 +- .../extract_mesh_vbo_edituv_stretch_angle.cc | 4 +- .../mesh_extractors/extract_mesh_vbo_lnor.cc | 261 +- .../extract_mesh_vbo_mesh_analysis.cc | 19 +- .../mesh_extractors/extract_mesh_vbo_pos.cc | 306 - .../extract_mesh_vbo_pos_nor.cc | 580 + .../mesh_extractors/extract_mesh_vbo_vnor.cc | 72 - .../shaders/common_debug_print_lib.glsl | 12 +- .../intern/shaders/common_gpencil_lib.glsl | 10 +- .../shaders/common_grease_pencil_lib.glsl | 10 +- .../common_subdiv_patch_evaluation_comp.glsl | 4 +- .../animation/anim_channels_defines.cc | 12 +- .../editors/animation/anim_channels_edit.cc | 7 +- source/blender/editors/animation/anim_deps.cc | 8 +- source/blender/editors/animation/anim_draw.cc | 50 +- .../blender/editors/animation/anim_filter.cc | 13 +- .../editors/animation/anim_ipo_utils.cc | 2 +- .../blender/editors/animation/anim_markers.cc | 23 +- .../editors/animation/anim_motion_paths.cc | 15 +- source/blender/editors/animation/anim_ops.cc | 6 +- source/blender/editors/animation/drivers.cc | 11 +- .../blender/editors/animation/fmodifier_ui.cc | 10 +- .../editors/animation/keyframes_draw.cc | 4 + .../editors/animation/keyframes_edit.cc | 169 +- .../editors/animation/keyframes_general.cc | 5 +- .../editors/animation/keyframes_keylist.cc | 3 +- .../animation/keyframes_keylist_test.cc | 2 +- .../blender/editors/animation/keyframing.cc | 51 +- .../blender/editors/animation/keyingsets.cc | 50 +- .../editors/animation/time_scrub_ui.cc | 12 +- .../blender/editors/armature/armature_add.cc | 18 +- .../blender/editors/armature/armature_edit.cc | 47 +- .../editors/armature/armature_naming.cc | 28 +- .../editors/armature/armature_relations.cc | 34 +- .../editors/armature/armature_select.cc | 46 +- .../editors/armature/armature_skinning.cc | 20 +- .../editors/armature/armature_utils.cc | 5 +- .../editors/armature/bone_collections.cc | 16 +- .../blender/editors/armature/meshlaplacian.cc | 11 +- source/blender/editors/armature/pose_edit.cc | 36 +- source/blender/editors/armature/pose_lib_2.cc | 6 +- .../blender/editors/armature/pose_select.cc | 10 +- source/blender/editors/armature/pose_slide.cc | 21 +- .../editors/armature/pose_transform.cc | 14 +- source/blender/editors/armature/pose_utils.cc | 3 +- source/blender/editors/asset/CMakeLists.txt | 1 + .../blender/editors/asset/ED_asset_catalog.hh | 2 +- .../blender/editors/asset/ED_asset_filter.hh | 8 +- .../blender/editors/asset/ED_asset_shelf.hh | 4 +- .../editors/asset/intern/asset_catalog.cc | 87 +- .../editors/asset/intern/asset_filter.cc | 19 +- .../editors/asset/intern/asset_handle.cc | 8 + .../editors/asset/intern/asset_import.cc | 2 +- .../editors/asset/intern/asset_indexer.cc | 431 +- .../asset/intern/asset_library_reference.cc | 38 + .../asset/intern/asset_library_reference.hh | 29 +- .../intern/asset_library_reference_enum.cc | 1 + .../editors/asset/intern/asset_list.cc | 159 +- .../editors/asset/intern/asset_mark_clear.cc | 4 +- .../editors/asset/intern/asset_menu_utils.cc | 17 +- .../blender/editors/asset/intern/asset_ops.cc | 34 +- .../editors/asset/intern/asset_shelf.cc | 6 +- .../asset/intern/asset_shelf_asset_view.cc | 6 +- .../intern/asset_shelf_catalog_selector.cc | 32 +- .../asset/intern/asset_temp_id_consumer.cc | 4 +- source/blender/editors/curve/curve_ops.cc | 1 + source/blender/editors/curve/editcurve.cc | 62 +- source/blender/editors/curve/editcurve_add.cc | 3 +- .../blender/editors/curve/editcurve_paint.cc | 26 +- source/blender/editors/curve/editcurve_pen.cc | 18 +- .../blender/editors/curve/editcurve_query.cc | 5 +- .../blender/editors/curve/editcurve_select.cc | 10 +- .../blender/editors/curve/editcurve_undo.cc | 4 +- source/blender/editors/curve/editfont.cc | 19 +- source/blender/editors/curve/editfont_undo.cc | 4 +- .../editors/curves/intern/curves_add.cc | 3 +- .../curves/intern/curves_attribute_set.cc | 4 +- .../editors/curves/intern/curves_draw.cc | 27 +- .../editors/curves/intern/curves_extrude.cc | 1 + .../editors/curves/intern/curves_ops.cc | 10 +- .../editors/curves/intern/curves_selection.cc | 51 +- .../blender/editors/datafiles/CMakeLists.txt | 2 - .../editors/geometry/geometry_attributes.cc | 10 +- .../geometry/geometry_randomization.cc | 2 +- .../editors/geometry/node_group_operator.cc | 15 +- .../editors/gizmo_library/gizmo_draw_utils.cc | 13 +- .../gizmo_library/gizmo_library_presets.cc | 7 + .../gizmo_library/gizmo_library_utils.cc | 2 +- .../gizmo_types/arrow3d_gizmo.cc | 9 +- .../gizmo_types/blank3d_gizmo.cc | 2 + .../gizmo_types/button2d_gizmo.cc | 4 + .../gizmo_library/gizmo_types/cage2d_gizmo.cc | 1 + .../gizmo_library/gizmo_types/dial3d_gizmo.cc | 28 +- .../gizmo_library/gizmo_types/move3d_gizmo.cc | 1 + .../gizmo_types/primitive3d_gizmo.cc | 5 +- .../gizmo_library/gizmo_types/snap3d_gizmo.cc | 33 +- .../editors/gpencil_legacy/annotate_draw.cc | 10 +- .../editors/gpencil_legacy/annotate_paint.cc | 13 +- .../editors/gpencil_legacy/drawgpencil.cc | 26 +- .../gpencil_legacy/editaction_gpencil.cc | 2 + .../gpencil_legacy/gpencil_add_blank.cc | 5 +- .../gpencil_legacy/gpencil_add_lineart.cc | 9 +- .../gpencil_legacy/gpencil_add_monkey.cc | 4 +- .../gpencil_legacy/gpencil_add_stroke.cc | 4 +- .../gpencil_legacy/gpencil_armature.cc | 10 +- .../gpencil_legacy/gpencil_bake_animation.cc | 23 +- .../editors/gpencil_legacy/gpencil_convert.cc | 19 +- .../editors/gpencil_legacy/gpencil_data.cc | 84 +- .../editors/gpencil_legacy/gpencil_edit.cc | 58 +- .../gpencil_legacy/gpencil_edit_curve.cc | 1 + .../editors/gpencil_legacy/gpencil_fill.cc | 7 +- .../gpencil_legacy/gpencil_interpolate.cc | 5 +- .../editors/gpencil_legacy/gpencil_merge.cc | 5 +- .../editors/gpencil_legacy/gpencil_mesh.cc | 17 +- .../gpencil_legacy/gpencil_ops_versioning.cc | 1 + .../editors/gpencil_legacy/gpencil_paint.cc | 22 +- .../gpencil_legacy/gpencil_primitive.cc | 19 +- .../gpencil_legacy/gpencil_sculpt_paint.cc | 25 +- .../editors/gpencil_legacy/gpencil_select.cc | 85 +- .../gpencil_legacy/gpencil_trace_ops.cc | 9 +- .../gpencil_legacy/gpencil_trace_utils.cc | 4 + .../editors/gpencil_legacy/gpencil_undo.cc | 1 + .../editors/gpencil_legacy/gpencil_utils.cc | 43 +- .../editors/gpencil_legacy/gpencil_uv.cc | 7 +- .../gpencil_legacy/gpencil_vertex_ops.cc | 8 +- .../gpencil_legacy/gpencil_vertex_paint.cc | 6 +- .../gpencil_legacy/gpencil_weight_paint.cc | 7 +- .../editors/grease_pencil/CMakeLists.txt | 3 - .../grease_pencil/intern/grease_pencil_add.cc | 7 +- .../intern/grease_pencil_edit.cc | 336 +- .../intern/grease_pencil_frames.cc | 51 - .../intern/grease_pencil_layers.cc | 273 +- .../intern/grease_pencil_material.cc | 17 +- .../grease_pencil/intern/grease_pencil_ops.cc | 10 - .../intern/grease_pencil_select.cc | 69 +- .../intern/grease_pencil_undo.cc | 431 - .../intern/grease_pencil_utils.cc | 150 +- source/blender/editors/include/ED_anim_api.hh | 3 - source/blender/editors/include/ED_curves.hh | 7 +- .../editors/include/ED_file_indexer.hh | 2 +- .../blender/editors/include/ED_fileselect.hh | 2 +- .../editors/include/ED_gpencil_legacy.hh | 2 +- .../editors/include/ED_grease_pencil.hh | 36 +- .../editors/include/ED_keyframes_edit.hh | 5 +- .../blender/editors/include/ED_keyframing.hh | 24 +- source/blender/editors/include/ED_mesh.hh | 10 +- source/blender/editors/include/ED_scene.hh | 4 +- source/blender/editors/include/ED_undo.hh | 4 +- source/blender/editors/include/ED_util.hh | 9 +- source/blender/editors/include/ED_view3d.hh | 47 +- .../editors/include/ED_view3d_offscreen.hh | 4 +- .../editors/include/UI_abstract_view.hh | 14 +- source/blender/editors/include/UI_icons.hh | 2 +- .../blender/editors/include/UI_interface.hh | 8 +- .../blender/editors/include/UI_interface_c.hh | 144 +- .../interface/eyedroppers/eyedropper_color.cc | 4 + .../eyedroppers/eyedropper_datablock.cc | 4 +- .../interface/eyedroppers/eyedropper_depth.cc | 9 +- .../eyedroppers/eyedropper_driver.cc | 2 + .../eyedroppers/eyedropper_gpencil_color.cc | 6 +- source/blender/editors/interface/interface.cc | 431 +- .../editors/interface/interface_anim.cc | 7 +- .../interface/interface_button_group.cc | 2 + .../interface/interface_context_menu.cc | 30 +- .../interface/interface_context_path.cc | 6 + .../editors/interface/interface_drag.cc | 8 +- .../editors/interface/interface_draw.cc | 2 + .../editors/interface/interface_drop.cc | 2 + .../editors/interface/interface_dropboxes.cc | 3 +- .../editors/interface/interface_handlers.cc | 48 +- .../editors/interface/interface_icons.cc | 4 +- .../interface/interface_icons_event.cc | 1 + .../editors/interface/interface_intern.hh | 56 +- .../editors/interface/interface_layout.cc | 211 +- .../editors/interface/interface_ops.cc | 33 +- .../editors/interface/interface_panel.cc | 16 +- .../editors/interface/interface_query.cc | 6 +- .../interface_region_color_picker.cc | 10 +- .../editors/interface/interface_region_hud.cc | 5 +- .../interface/interface_region_menu_pie.cc | 26 +- .../interface/interface_region_menu_popup.cc | 24 +- .../interface/interface_region_popover.cc | 5 +- .../interface/interface_region_search.cc | 8 +- .../interface/interface_region_tooltip.cc | 73 +- .../editors/interface/interface_regions.cc | 1 + .../editors/interface/interface_style.cc | 6 +- .../interface_template_asset_view.cc | 12 +- .../interface_template_attribute_search.cc | 2 +- ...interface_template_bone_collection_tree.cc | 2 +- ...rface_template_grease_pencil_layer_tree.cc | 26 +- .../interface_template_light_linking.cc | 2 +- .../interface/interface_template_list.cc | 97 +- .../interface_template_node_inputs.cc | 6 +- .../interface_template_node_tree_interface.cc | 2 +- .../interface_template_search_menu.cc | 15 +- .../interface_template_search_operator.cc | 35 +- .../editors/interface/interface_templates.cc | 1343 +- .../editors/interface/interface_utils.cc | 220 +- .../editors/interface/interface_widgets.cc | 57 +- source/blender/editors/interface/resources.cc | 2 +- source/blender/editors/interface/view2d.cc | 6 +- .../blender/editors/interface/view2d_draw.cc | 2 + .../editors/interface/view2d_edge_pan.cc | 5 +- .../interface/view2d_gizmo_navigate.cc | 1 + .../blender/editors/interface/view2d_ops.cc | 5 +- .../editors/interface/views/abstract_view.cc | 41 +- .../interface/views/abstract_view_item.cc | 106 +- .../editors/interface/views/grid_view.cc | 12 +- .../editors/interface/views/interface_view.cc | 49 +- .../editors/interface/views/tree_view.cc | 66 +- source/blender/editors/io/io_alembic.cc | 4 +- source/blender/editors/io/io_cache.cc | 6 +- source/blender/editors/io/io_collada.cc | 6 +- .../blender/editors/io/io_drop_import_file.cc | 2 +- .../blender/editors/io/io_gpencil_export.cc | 11 +- .../blender/editors/io/io_gpencil_import.cc | 11 +- source/blender/editors/io/io_obj.cc | 4 +- source/blender/editors/io/io_ply_ops.cc | 7 +- source/blender/editors/io/io_stl_ops.cc | 4 +- source/blender/editors/io/io_usd.cc | 8 +- source/blender/editors/io/io_utils.cc | 8 +- .../editors/lattice/editlattice_select.cc | 2 +- source/blender/editors/mask/CMakeLists.txt | 1 - source/blender/editors/mask/mask_add.cc | 1 + source/blender/editors/mask/mask_draw.cc | 1 + .../blender/editors/mask/mask_editaction.cc | 2 + source/blender/editors/mask/mask_ops.cc | 28 +- source/blender/editors/mask/mask_select.cc | 35 +- source/blender/editors/mesh/CMakeLists.txt | 1 - source/blender/editors/mesh/editface.cc | 36 +- source/blender/editors/mesh/editmesh_add.cc | 3 +- .../editors/mesh/editmesh_add_gizmo.cc | 9 +- .../editors/mesh/editmesh_attribute.cc | 4 +- .../editors/mesh/editmesh_automerge.cc | 8 +- source/blender/editors/mesh/editmesh_bevel.cc | 113 +- .../blender/editors/mesh/editmesh_bisect.cc | 10 +- .../blender/editors/mesh/editmesh_extrude.cc | 27 +- .../editors/mesh/editmesh_extrude_screw.cc | 10 +- .../editors/mesh/editmesh_extrude_spin.cc | 4 +- .../mesh/editmesh_extrude_spin_gizmo.cc | 4 +- source/blender/editors/mesh/editmesh_inset.cc | 6 +- .../editors/mesh/editmesh_intersect.cc | 4 +- source/blender/editors/mesh/editmesh_knife.cc | 905 +- .../editors/mesh/editmesh_knife_project.cc | 27 +- .../blender/editors/mesh/editmesh_loopcut.cc | 10 +- .../editors/mesh/editmesh_mask_extract.cc | 7 + source/blender/editors/mesh/editmesh_path.cc | 2 +- .../editors/mesh/editmesh_polybuild.cc | 33 +- .../editors/mesh/editmesh_preselect_elem.cc | 8 +- source/blender/editors/mesh/editmesh_rip.cc | 5 +- .../blender/editors/mesh/editmesh_rip_edge.cc | 3 +- .../blender/editors/mesh/editmesh_select.cc | 40 +- .../editors/mesh/editmesh_select_similar.cc | 38 +- .../mesh/editmesh_set_sharpness_by_angle.cc | 1 + source/blender/editors/mesh/editmesh_tools.cc | 81 +- source/blender/editors/mesh/editmesh_utils.cc | 10 +- source/blender/editors/mesh/mesh_data.cc | 21 +- source/blender/editors/mesh/mesh_mirror.cc | 16 +- source/blender/editors/mesh/meshtools.cc | 92 +- .../blender/editors/metaball/CMakeLists.txt | 1 - source/blender/editors/metaball/mball_edit.cc | 20 +- .../editors/object/add_modifier_assets.cc | 13 +- source/blender/editors/object/object_add.cc | 364 +- source/blender/editors/object/object_bake.cc | 17 +- .../blender/editors/object/object_bake_api.cc | 51 +- .../editors/object/object_bake_simulation.cc | 33 +- .../editors/object/object_collection.cc | 19 +- .../editors/object/object_constraint.cc | 15 +- .../editors/object/object_data_transfer.cc | 23 +- .../editors/object/object_data_transform.cc | 12 +- source/blender/editors/object/object_edit.cc | 33 +- .../editors/object/object_gpencil_modifier.cc | 19 +- source/blender/editors/object/object_hook.cc | 29 +- source/blender/editors/object/object_intern.h | 8 +- .../object/object_light_linking_ops.cc | 2 + source/blender/editors/object/object_modes.cc | 18 +- .../blender/editors/object/object_modifier.cc | 528 +- source/blender/editors/object/object_ops.cc | 8 +- .../blender/editors/object/object_random.cc | 1 + .../editors/object/object_relations.cc | 107 +- .../blender/editors/object/object_remesh.cc | 33 +- .../blender/editors/object/object_select.cc | 16 +- .../editors/object/object_shader_fx.cc | 6 +- .../blender/editors/object/object_shapekey.cc | 8 +- .../editors/object/object_transform.cc | 80 +- source/blender/editors/object/object_utils.cc | 30 +- .../blender/editors/object/object_vgroup.cc | 12 +- .../blender/editors/object/object_volume.cc | 2 +- source/blender/editors/object/object_warp.cc | 2 +- .../editors/physics/dynamicpaint_ops.cc | 10 +- .../blender/editors/physics/particle_boids.cc | 1 + .../blender/editors/physics/particle_edit.cc | 47 +- .../editors/physics/particle_edit_undo.cc | 4 + .../editors/physics/particle_object.cc | 28 +- .../blender/editors/physics/physics_fluid.cc | 14 +- .../editors/physics/physics_pointcache.cc | 7 +- .../editors/physics/rigidbody_constraint.cc | 7 +- .../editors/physics/rigidbody_object.cc | 8 +- .../editors/physics/rigidbody_world.cc | 6 +- .../blender/editors/render/render_internal.cc | 11 +- .../blender/editors/render/render_opengl.cc | 20 +- .../blender/editors/render/render_preview.cc | 8 +- .../blender/editors/render/render_shading.cc | 49 +- .../blender/editors/render/render_update.cc | 5 +- source/blender/editors/render/render_view.cc | 10 +- source/blender/editors/scene/scene_edit.cc | 12 +- source/blender/editors/screen/area.cc | 6 +- source/blender/editors/screen/area_query.cc | 3 + source/blender/editors/screen/area_utils.cc | 3 + source/blender/editors/screen/glutil.cc | 5 + .../blender/editors/screen/screen_context.cc | 2 +- source/blender/editors/screen/screen_draw.cc | 2 + source/blender/editors/screen/screen_edit.cc | 7 +- source/blender/editors/screen/screen_ops.cc | 57 +- .../editors/screen/screen_user_menu.cc | 2 +- source/blender/editors/screen/screendump.cc | 7 +- .../blender/editors/screen/workspace_edit.cc | 25 +- .../editors/sculpt_paint/CMakeLists.txt | 17 - .../editors/sculpt_paint/curves_sculpt_add.cc | 10 +- .../sculpt_paint/curves_sculpt_brush.cc | 8 +- .../sculpt_paint/curves_sculpt_density.cc | 5 +- .../sculpt_paint/curves_sculpt_grow_shrink.cc | 1 + .../editors/sculpt_paint/curves_sculpt_ops.cc | 8 +- .../sculpt_paint/curves_sculpt_selection.cc | 2 + .../sculpt_paint/curves_sculpt_slide.cc | 4 +- .../sculpt_paint/grease_pencil_draw_ops.cc | 33 +- .../sculpt_paint/grease_pencil_erase.cc | 131 +- .../sculpt_paint/grease_pencil_paint.cc | 67 +- .../editors/sculpt_paint/paint_cursor.cc | 21 +- .../editors/sculpt_paint/paint_curve.cc | 3 +- .../editors/sculpt_paint/paint_curve_undo.cc | 1 + .../editors/sculpt_paint/paint_hide.cc | 633 +- .../editors/sculpt_paint/paint_image.cc | 18 +- .../editors/sculpt_paint/paint_image_2d.cc | 2 +- .../editors/sculpt_paint/paint_image_proj.cc | 93 +- .../editors/sculpt_paint/paint_intern.hh | 4 - .../editors/sculpt_paint/paint_mask.cc | 1706 +- .../blender/editors/sculpt_paint/paint_ops.cc | 7 +- .../editors/sculpt_paint/paint_stroke.cc | 16 +- .../editors/sculpt_paint/paint_utils.cc | 42 +- .../editors/sculpt_paint/paint_vertex.cc | 19 +- .../sculpt_paint/paint_vertex_color_ops.cc | 2 +- .../editors/sculpt_paint/paint_vertex_proj.cc | 12 +- .../sculpt_paint/paint_vertex_weight_ops.cc | 10 +- .../sculpt_paint/paint_vertex_weight_utils.cc | 2 +- .../editors/sculpt_paint/paint_weight.cc | 60 +- source/blender/editors/sculpt_paint/sculpt.cc | 75 +- .../sculpt_paint/sculpt_automasking.cc | 20 + .../editors/sculpt_paint/sculpt_boundary.cc | 1 + .../sculpt_paint/sculpt_brush_types.cc | 2 + .../editors/sculpt_paint/sculpt_cloth.cc | 9 +- .../editors/sculpt_paint/sculpt_detail.cc | 316 +- .../sculpt_paint/sculpt_detail_test.cc | 51 - .../editors/sculpt_paint/sculpt_dyntopo.cc | 7 +- .../editors/sculpt_paint/sculpt_expand.cc | 7 +- .../editors/sculpt_paint/sculpt_face_set.cc | 227 +- .../sculpt_paint/sculpt_filter_color.cc | 4 +- .../sculpt_paint/sculpt_filter_mask.cc | 75 +- .../sculpt_paint/sculpt_filter_mesh.cc | 42 +- .../editors/sculpt_paint/sculpt_gesture.cc | 453 - .../editors/sculpt_paint/sculpt_intern.hh | 195 +- .../editors/sculpt_paint/sculpt_mask_init.cc | 7 +- .../sculpt_paint/sculpt_multiplane_scrape.cc | 1 + .../editors/sculpt_paint/sculpt_ops.cc | 27 +- .../sculpt_paint/sculpt_paint_color.cc | 10 +- .../editors/sculpt_paint/sculpt_pose.cc | 1 + .../editors/sculpt_paint/sculpt_project.cc | 155 - .../editors/sculpt_paint/sculpt_smooth.cc | 1 + .../editors/sculpt_paint/sculpt_transform.cc | 2 + .../editors/sculpt_paint/sculpt_trim.cc | 774 - .../editors/sculpt_paint/sculpt_undo.cc | 13 +- source/blender/editors/sound/sound_ops.cc | 11 +- .../editors/space_action/action_data.cc | 17 +- .../editors/space_action/action_draw.cc | 7 + .../editors/space_action/action_edit.cc | 31 +- .../editors/space_action/action_select.cc | 12 +- .../editors/space_action/space_action.cc | 13 +- .../blender/editors/space_api/spacetypes.cc | 1 + .../editors/space_buttons/buttons_context.cc | 4 +- .../editors/space_buttons/buttons_ops.cc | 18 +- .../editors/space_buttons/buttons_texture.cc | 7 +- .../editors/space_buttons/space_buttons.cc | 14 +- .../editors/space_clip/clip_buttons.cc | 21 +- .../editors/space_clip/clip_dopesheet_ops.cc | 2 + .../blender/editors/space_clip/clip_draw.cc | 1 + .../blender/editors/space_clip/clip_editor.cc | 6 +- .../editors/space_clip/clip_graph_draw.cc | 2 + .../editors/space_clip/clip_graph_ops.cc | 20 +- source/blender/editors/space_clip/clip_ops.cc | 10 +- .../blender/editors/space_clip/clip_utils.cc | 2 + .../blender/editors/space_clip/space_clip.cc | 13 +- .../editors/space_clip/tracking_ops.cc | 43 +- .../editors/space_clip/tracking_ops_detect.cc | 2 +- .../editors/space_clip/tracking_ops_orient.cc | 2 +- .../editors/space_clip/tracking_ops_plane.cc | 8 +- .../editors/space_clip/tracking_ops_solve.cc | 6 +- .../editors/space_clip/tracking_ops_track.cc | 16 +- .../editors/space_clip/tracking_select.cc | 52 +- .../editors/space_console/console_draw.cc | 1 + .../editors/space_console/console_ops.cc | 2 +- .../editors/space_console/space_console.cc | 35 +- .../space_file/asset_catalog_tree_view.cc | 154 +- .../blender/editors/space_file/file_draw.cc | 27 +- .../editors/space_file/file_indexer.cc | 1 + .../blender/editors/space_file/file_intern.hh | 37 +- source/blender/editors/space_file/file_ops.cc | 25 +- .../blender/editors/space_file/file_panels.cc | 6 +- .../blender/editors/space_file/file_utils.cc | 7 +- source/blender/editors/space_file/filelist.cc | 11 +- source/blender/editors/space_file/filesel.cc | 4 +- source/blender/editors/space_file/fsmenu.cc | 4 +- .../editors/space_file/fsmenu_system.cc | 9 +- .../blender/editors/space_file/space_file.cc | 12 +- .../editors/space_graph/graph_buttons.cc | 26 +- .../blender/editors/space_graph/graph_draw.cc | 8 +- .../blender/editors/space_graph/graph_edit.cc | 45 +- .../blender/editors/space_graph/graph_ops.cc | 4 +- .../editors/space_graph/graph_select.cc | 18 +- .../editors/space_graph/graph_slider_ops.cc | 2 +- .../editors/space_graph/graph_utils.cc | 5 +- .../blender/editors/space_graph/graph_view.cc | 3 +- .../editors/space_graph/space_graph.cc | 11 +- .../editors/space_image/image_buttons.cc | 28 +- .../blender/editors/space_image/image_edit.cc | 6 +- .../blender/editors/space_image/image_ops.cc | 30 +- .../editors/space_image/image_sequence.cc | 1 + .../editors/space_image/space_image.cc | 18 +- .../blender/editors/space_info/info_draw.cc | 3 +- source/blender/editors/space_info/info_ops.cc | 28 +- .../blender/editors/space_info/info_report.cc | 1 + .../blender/editors/space_info/info_stats.cc | 32 +- .../blender/editors/space_info/space_info.cc | 2 + .../blender/editors/space_nla/nla_buttons.cc | 5 +- source/blender/editors/space_nla/nla_draw.cc | 6 +- source/blender/editors/space_nla/nla_edit.cc | 29 +- source/blender/editors/space_nla/nla_ops.cc | 1 + .../blender/editors/space_nla/nla_select.cc | 4 + .../blender/editors/space_nla/nla_tracks.cc | 11 +- source/blender/editors/space_nla/space_nla.cc | 11 +- .../editors/space_node/add_menu_assets.cc | 13 +- .../blender/editors/space_node/clipboard.cc | 7 +- source/blender/editors/space_node/drawnode.cc | 13 +- .../editors/space_node/link_drag_search.cc | 10 +- source/blender/editors/space_node/node_add.cc | 8 +- .../editors/space_node/node_context_path.cc | 4 + .../blender/editors/space_node/node_draw.cc | 253 +- .../blender/editors/space_node/node_edit.cc | 49 +- .../node_geometry_attribute_search.cc | 3 +- .../blender/editors/space_node/node_gizmo.cc | 19 +- .../blender/editors/space_node/node_group.cc | 4 +- source/blender/editors/space_node/node_ops.cc | 2 + .../editors/space_node/node_relationships.cc | 15 +- .../blender/editors/space_node/node_select.cc | 39 +- .../editors/space_node/node_shader_preview.cc | 6 +- .../editors/space_node/node_templates.cc | 15 +- .../blender/editors/space_node/node_view.cc | 6 +- .../blender/editors/space_node/space_node.cc | 23 +- .../editors/space_outliner/CMakeLists.txt | 4 - .../space_outliner/outliner_collections.cc | 11 +- .../space_outliner/outliner_context.cc | 2 + .../space_outliner/outliner_dragdrop.cc | 12 +- .../editors/space_outliner/outliner_draw.cc | 70 +- .../editors/space_outliner/outliner_edit.cc | 287 +- .../editors/space_outliner/outliner_intern.hh | 33 +- .../editors/space_outliner/outliner_ops.cc | 1 - .../editors/space_outliner/outliner_select.cc | 15 +- .../editors/space_outliner/outliner_sync.cc | 2 +- .../editors/space_outliner/outliner_tools.cc | 381 +- .../editors/space_outliner/outliner_utils.cc | 3 + .../editors/space_outliner/space_outliner.cc | 8 +- .../editors/space_outliner/tree/common.cc | 1 + .../space_outliner/tree/tree_display_data.cc | 2 + .../tree/tree_display_libraries.cc | 5 +- .../tree/tree_display_orphaned.cc | 1 + ...ee_display_override_library_hierarchies.cc | 7 +- ...ree_display_override_library_properties.cc | 5 + .../tree/tree_display_scenes.cc | 2 + .../tree/tree_display_sequencer.cc | 1 + .../tree/tree_display_view_layer.cc | 3 + .../space_outliner/tree/tree_element.cc | 3 + .../tree/tree_element_anim_data.cc | 2 +- .../tree/tree_element_bone_collection.cc | 5 +- .../tree/tree_element_collection.cc | 2 +- .../tree/tree_element_constraint.cc | 3 +- .../tree/tree_element_defgroup.cc | 2 +- .../tree/tree_element_driver.cc | 2 +- .../tree/tree_element_gpencil_effect.cc | 2 +- .../space_outliner/tree/tree_element_id.cc | 9 +- .../tree/tree_element_id_library.cc | 2 +- .../tree/tree_element_id_object.cc | 7 + .../tree/tree_element_modifier.cc | 2 +- .../space_outliner/tree/tree_element_nla.cc | 2 +- .../tree/tree_element_overrides.cc | 4 +- .../space_outliner/tree/tree_element_pose.cc | 3 +- .../space_outliner/tree/tree_element_rna.cc | 3 +- .../tree/tree_element_scene_objects.cc | 4 +- .../space_outliner/tree/tree_element_seq.cc | 2 +- .../tree/tree_element_view_collection.cc | 2 +- .../tree/tree_element_view_layer.cc | 2 +- .../editors/space_script/script_edit.cc | 4 +- .../editors/space_sequencer/sequencer_add.cc | 19 +- .../space_sequencer/sequencer_buttons.cc | 4 +- .../sequencer_channels_draw.cc | 11 +- .../sequencer_channels_edit.cc | 8 + .../space_sequencer/sequencer_clipboard.cc | 23 +- .../space_sequencer/sequencer_drag_drop.cc | 1 + .../editors/space_sequencer/sequencer_edit.cc | 7 +- .../space_sequencer/sequencer_modifier.cc | 2 + .../space_sequencer/sequencer_preview.cc | 2 +- .../space_sequencer/sequencer_preview_draw.cc | 7 +- .../space_sequencer/sequencer_proxy.cc | 12 +- .../space_sequencer/sequencer_retiming.cc | 11 +- .../sequencer_retiming_draw.cc | 18 +- .../space_sequencer/sequencer_scopes.cc | 3 +- .../space_sequencer/sequencer_select.cc | 4 +- .../space_sequencer/sequencer_thumbnails.cc | 4 +- .../sequencer_timeline_draw.cc | 159 +- .../editors/space_sequencer/sequencer_view.cc | 5 +- .../space_sequencer/space_sequencer.cc | 10 +- .../space_spreadsheet/space_spreadsheet.cc | 12 +- .../space_spreadsheet/spreadsheet_column.cc | 3 - .../spreadsheet_data_source_geometry.cc | 18 +- .../spreadsheet_dataset_draw.cc | 3 +- .../space_spreadsheet/spreadsheet_layout.cc | 85 +- .../space_spreadsheet/spreadsheet_ops.cc | 1 + .../space_spreadsheet/spreadsheet_panels.cc | 2 +- .../spreadsheet_row_filter_ui.cc | 4 +- .../space_statusbar/space_statusbar.cc | 3 + .../blender/editors/space_text/CMakeLists.txt | 1 - .../blender/editors/space_text/space_text.cc | 39 +- .../editors/space_text/text_autocomplete.cc | 2 + .../blender/editors/space_text/text_draw.cc | 1 + .../blender/editors/space_text/text_format.hh | 1 - .../editors/space_text/text_format_glsl.cc | 593 - .../editors/space_text/text_format_osl.cc | 3 - source/blender/editors/space_text/text_ops.cc | 39 +- .../blender/editors/space_text/text_undo.cc | 14 +- .../editors/space_topbar/space_topbar.cc | 4 +- .../editors/space_userpref/space_userpref.cc | 1 + .../editors/space_userpref/userpref_ops.cc | 260 +- .../editors/space_view3d/drawobject.cc | 25 + .../editors/space_view3d/space_view3d.cc | 57 +- .../editors/space_view3d/view3d_buttons.cc | 39 +- .../space_view3d/view3d_camera_control.cc | 4 +- .../editors/space_view3d/view3d_context.cc | 2 + .../space_view3d/view3d_cursor_snap.cc | 4 +- .../editors/space_view3d/view3d_draw.cc | 59 +- .../editors/space_view3d/view3d_edit.cc | 81 +- .../space_view3d/view3d_gizmo_armature.cc | 8 +- .../space_view3d/view3d_gizmo_camera.cc | 26 +- .../space_view3d/view3d_gizmo_empty.cc | 5 +- .../space_view3d/view3d_gizmo_forcefield.cc | 6 +- .../space_view3d/view3d_gizmo_light.cc | 20 +- .../view3d_gizmo_navigate_type.cc | 7 + .../space_view3d/view3d_gizmo_preselect.cc | 3 + .../view3d_gizmo_preselect_type.cc | 15 +- .../space_view3d/view3d_gizmo_ruler.cc | 13 +- .../space_view3d/view3d_gizmo_tool_generic.cc | 2 +- .../editors/space_view3d/view3d_header.cc | 11 +- .../editors/space_view3d/view3d_intern.h | 4 +- .../editors/space_view3d/view3d_iterators.cc | 37 +- .../editors/space_view3d/view3d_navigate.cc | 29 +- .../space_view3d/view3d_navigate_fly.cc | 21 +- .../view3d_navigate_smoothview.cc | 4 +- .../space_view3d/view3d_navigate_view_all.cc | 13 +- .../space_view3d/view3d_navigate_view_axis.cc | 21 +- .../view3d_navigate_view_camera.cc | 27 +- .../view3d_navigate_view_center_cursor.cc | 27 + .../view3d_navigate_view_center_pick.cc | 32 +- .../view3d_navigate_view_dolly.cc | 4 +- .../space_view3d/view3d_navigate_view_move.cc | 5 + .../space_view3d/view3d_navigate_view_ndof.cc | 4 + .../view3d_navigate_view_orbit.cc | 27 + .../space_view3d/view3d_navigate_view_pan.cc | 27 + .../space_view3d/view3d_navigate_view_roll.cc | 2 + .../view3d_navigate_view_rotate.cc | 2 + .../space_view3d/view3d_navigate_view_zoom.cc | 6 +- .../space_view3d/view3d_navigate_walk.cc | 30 +- .../view3d_navigate_zoom_border.cc | 4 +- .../editors/space_view3d/view3d_ops.cc | 7 +- .../editors/space_view3d/view3d_placement.cc | 1 + .../editors/space_view3d/view3d_project.cc | 20 +- .../editors/space_view3d/view3d_select.cc | 418 +- .../editors/space_view3d/view3d_snap.cc | 70 +- .../editors/space_view3d/view3d_utils.cc | 28 +- .../editors/space_view3d/view3d_view.cc | 20 +- .../blender/editors/transform/CMakeLists.txt | 1 - source/blender/editors/transform/transform.cc | 132 +- source/blender/editors/transform/transform.hh | 72 +- .../transform/transform_constraints.cc | 84 +- .../editors/transform/transform_convert.cc | 123 +- .../editors/transform/transform_convert.hh | 57 +- .../transform/transform_convert_action.cc | 148 +- .../transform/transform_convert_armature.cc | 177 +- .../transform/transform_convert_cursor.cc | 9 +- .../transform/transform_convert_curve.cc | 25 +- .../transform/transform_convert_curves.cc | 9 +- .../transform_convert_gpencil_legacy.cc | 59 +- .../transform/transform_convert_graph.cc | 219 +- .../transform_convert_grease_pencil.cc | 30 +- .../transform/transform_convert_lattice.cc | 3 +- .../transform/transform_convert_mask.cc | 14 +- .../transform/transform_convert_mball.cc | 10 +- .../transform/transform_convert_mesh.cc | 554 +- .../transform/transform_convert_mesh_edge.cc | 11 +- .../transform/transform_convert_mesh_skin.cc | 19 +- .../transform/transform_convert_mesh_uv.cc | 741 +- .../transform_convert_mesh_vert_cdata.cc | 10 +- .../transform/transform_convert_nla.cc | 117 +- .../transform/transform_convert_node.cc | 24 +- .../transform/transform_convert_object.cc | 94 +- .../transform_convert_object_texspace.cc | 8 +- .../transform/transform_convert_paintcurve.cc | 3 +- .../transform/transform_convert_particle.cc | 14 +- .../transform/transform_convert_sculpt.cc | 14 +- .../transform/transform_convert_sequencer.cc | 72 +- .../transform_convert_sequencer_image.cc | 10 +- .../transform_convert_sequencer_retiming.cc | 11 + .../transform/transform_convert_tracking.cc | 17 +- .../transform_convert_tracking_curves.cc | 15 +- .../editors/transform/transform_data.hh | 12 +- .../transform/transform_draw_cursors.cc | 3 +- .../transform/transform_draw_cursors.hh | 2 +- .../editors/transform/transform_generics.cc | 109 +- .../editors/transform/transform_gizmo_2d.cc | 19 +- .../editors/transform/transform_gizmo_3d.cc | 132 +- .../transform/transform_gizmo_3d_cage.cc | 8 +- .../transform/transform_gizmo_3d_shear.cc | 4 +- .../transform/transform_gizmo_extrude_3d.cc | 12 +- .../editors/transform/transform_input.cc | 43 +- .../editors/transform/transform_mode.cc | 210 +- .../editors/transform/transform_mode.hh | 4 +- .../editors/transform/transform_mode_align.cc | 10 +- .../transform/transform_mode_baketime.cc | 9 +- .../transform/transform_mode_bbone_resize.cc | 9 +- .../editors/transform/transform_mode_bend.cc | 30 +- .../transform/transform_mode_boneenvelope.cc | 7 +- .../transform/transform_mode_boneroll.cc | 8 +- .../transform_mode_curveshrinkfatten.cc | 5 +- .../transform/transform_mode_customdata.cc | 7 +- .../transform_mode_edge_rotate_normal.cc | 8 +- .../transform_mode_edge_seq_slide.cc | 8 +- .../transform/transform_mode_edge_slide.cc | 1213 +- .../transform/transform_mode_gpopacity.cc | 5 +- .../transform_mode_gpshrinkfatten.cc | 5 +- .../transform_mode_maskshrinkfatten.cc | 9 +- .../transform/transform_mode_mirror.cc | 7 +- .../transform/transform_mode_push_pull.cc | 7 +- .../transform/transform_mode_resize.cc | 7 +- .../transform/transform_mode_rotate.cc | 8 +- .../editors/transform/transform_mode_shear.cc | 11 +- .../transform/transform_mode_shrink_fatten.cc | 52 +- .../transform/transform_mode_skin_resize.cc | 1 + .../transform/transform_mode_snapsource.cc | 7 +- .../editors/transform/transform_mode_tilt.cc | 6 +- .../transform/transform_mode_timescale.cc | 29 +- .../transform/transform_mode_timeslide.cc | 43 +- .../transform/transform_mode_timetranslate.cc | 15 +- .../transform/transform_mode_tosphere.cc | 7 +- .../transform/transform_mode_trackball.cc | 3 +- .../transform/transform_mode_translate.cc | 19 +- .../transform/transform_mode_vert_slide.cc | 480 +- .../editors/transform/transform_ops.cc | 183 +- .../transform/transform_orientations.cc | 134 +- .../editors/transform/transform_snap.cc | 85 +- .../editors/transform/transform_snap.hh | 11 +- .../transform/transform_snap_animation.cc | 6 +- .../transform/transform_snap_object.cc | 73 +- .../transform/transform_snap_object.hh | 36 +- .../transform_snap_object_armature.cc | 1 + .../transform/transform_snap_object_camera.cc | 1 + .../transform/transform_snap_object_curve.cc | 3 +- .../transform_snap_object_editmesh.cc | 696 +- .../transform/transform_snap_object_mesh.cc | 67 +- .../transform/transform_snap_sequencer.cc | 4 + source/blender/editors/undo/ed_undo.cc | 10 +- source/blender/editors/undo/memfile_undo.cc | 26 +- .../blender/editors/undo/undo_system_types.cc | 2 - source/blender/editors/util/ed_draw.cc | 4 +- source/blender/editors/util/ed_transverts.cc | 2 + source/blender/editors/util/ed_util.cc | 19 +- source/blender/editors/util/ed_util_imbuf.cc | 2 + source/blender/editors/util/ed_util_ops.cc | 5 +- source/blender/editors/util/numinput.cc | 6 +- source/blender/editors/util/select_utils.cc | 2 +- .../blender/editors/uvedit/uvedit_buttons.cc | 2 +- .../editors/uvedit/uvedit_clipboard.cc | 5 +- source/blender/editors/uvedit/uvedit_draw.cc | 2 + source/blender/editors/uvedit/uvedit_ops.cc | 7 +- source/blender/editors/uvedit/uvedit_path.cc | 4 +- source/blender/editors/uvedit/uvedit_rip.cc | 2 +- .../blender/editors/uvedit/uvedit_select.cc | 78 +- .../editors/uvedit/uvedit_smart_stitch.cc | 4 +- .../editors/uvedit/uvedit_unwrap_ops.cc | 43 +- .../freestyle/intern/application/AppView.cpp | 2 +- .../intern/application/Controller.cpp | 2 +- .../blender_interface/BlenderFileLoader.cpp | 4 +- .../blender_interface/BlenderFileLoader.h | 2 +- .../BlenderStrokeRenderer.cpp | 6 +- .../blender_interface/FRS_freestyle.cpp | 8 +- .../freestyle/intern/geometry/FastGrid.cpp | 2 +- .../freestyle/intern/geometry/GeomCleaner.cpp | 2 +- .../intern/stroke/BasicStrokeShaders.cpp | 2 +- .../freestyle/intern/stroke/Canvas.cpp | 2 +- .../blender/freestyle/intern/stroke/Curve.cpp | 2 +- .../freestyle/intern/stroke/Operators.cpp | 2 +- .../freestyle/intern/stroke/Stroke.cpp | 2 +- .../freestyle/intern/stroke/StrokeRep.cpp | 2 +- .../intern/system/PythonInterpreter.h | 2 +- .../view_map/ArbitraryGridDensityProvider.cpp | 2 +- .../AverageAreaGridDensityProvider.cpp | 2 +- .../freestyle/intern/view_map/BoxGrid.cpp | 2 +- .../freestyle/intern/view_map/BoxGrid.h | 2 +- .../intern/view_map/CulledOccluderSource.cpp | 2 +- .../intern/view_map/FEdgeXDetector.cpp | 2 +- .../freestyle/intern/view_map/Functions0D.cpp | 2 +- .../intern/view_map/GridDensityProvider.h | 2 +- .../intern/view_map/OccluderSource.cpp | 2 +- .../view_map/Pow23GridDensityProvider.cpp | 2 +- .../intern/view_map/SilhouetteGeomEngine.cpp | 2 +- .../intern/view_map/SphericalGrid.cpp | 2 +- .../freestyle/intern/view_map/SphericalGrid.h | 2 +- .../intern/view_map/SteerableViewMap.cpp | 2 +- .../intern/view_map/ViewMapBuilder.cpp | 2 +- .../freestyle/intern/winged_edge/WXEdge.cpp | 2 +- .../intern/lazy_function_graph_executor.cc | 2 +- .../functions/intern/multi_function.cc | 6 +- source/blender/geometry/CMakeLists.txt | 18 - .../geometry/GEO_add_curves_on_mesh.hh | 2 - source/blender/geometry/GEO_extend_curves.hh | 33 - source/blender/geometry/GEO_mesh_boolean.hh | 82 - source/blender/geometry/GEO_mesh_to_volume.hh | 25 +- .../blender/geometry/GEO_points_to_volume.hh | 17 +- .../blender/geometry/GEO_resample_curves.hh | 11 - .../geometry/GEO_reverse_uv_sampler.hh | 6 +- source/blender/geometry/GEO_set_curve_type.hh | 13 + .../geometry/intern/add_curves_on_mesh.cc | 194 +- .../blender/geometry/intern/extend_curves.cc | 358 - .../blender/geometry/intern/fillet_curves.cc | 2 + .../geometry/intern/join_geometries.cc | 14 +- .../geometry/intern/mesh_copy_selection.cc | 34 +- .../geometry/intern/mesh_merge_by_distance.cc | 1 + .../intern/mesh_primitive_uv_sphere.cc | 2 + .../geometry/intern/mesh_to_curve_convert.cc | 4 +- .../blender/geometry/intern/mesh_to_volume.cc | 86 +- .../blender/geometry/intern/mix_geometries.cc | 31 +- .../intern/point_merge_by_distance.cc | 1 + .../geometry/intern/points_to_volume.cc | 62 +- source/blender/geometry/intern/randomize.cc | 20 +- .../geometry/intern/realize_instances.cc | 5 +- source/blender/geometry/intern/reorder.cc | 31 +- .../geometry/intern/resample_curves.cc | 148 +- .../geometry/intern/reverse_uv_sampler.cc | 226 +- .../blender/geometry/intern/set_curve_type.cc | 28 + .../geometry/intern/subdivide_curves.cc | 1 + source/blender/geometry/intern/transform.cc | 6 +- source/blender/geometry/intern/trim_curves.cc | 3 +- source/blender/geometry/intern/uv_pack.cc | 10 +- .../MOD_gpencil_legacy_lineart.h | 1 - .../intern/MOD_gpencil_legacy_armature.cc | 11 +- .../intern/MOD_gpencil_legacy_array.cc | 11 +- .../intern/MOD_gpencil_legacy_build.cc | 10 +- .../intern/MOD_gpencil_legacy_color.cc | 9 +- .../intern/MOD_gpencil_legacy_dash.cc | 5 +- .../intern/MOD_gpencil_legacy_envelope.cc | 6 +- .../intern/MOD_gpencil_legacy_hook.cc | 20 +- .../intern/MOD_gpencil_legacy_lattice.cc | 8 +- .../intern/MOD_gpencil_legacy_length.cc | 7 +- .../intern/MOD_gpencil_legacy_lineart.cc | 33 +- .../intern/MOD_gpencil_legacy_mirror.cc | 12 +- .../intern/MOD_gpencil_legacy_multiply.cc | 9 +- .../intern/MOD_gpencil_legacy_noise.cc | 5 +- .../intern/MOD_gpencil_legacy_offset.cc | 7 +- .../intern/MOD_gpencil_legacy_opacity.cc | 9 +- .../intern/MOD_gpencil_legacy_outline.cc | 13 +- .../intern/MOD_gpencil_legacy_shrinkwrap.cc | 9 +- .../intern/MOD_gpencil_legacy_simplify.cc | 9 +- .../intern/MOD_gpencil_legacy_smooth.cc | 9 +- .../intern/MOD_gpencil_legacy_subdiv.cc | 8 +- .../intern/MOD_gpencil_legacy_texture.cc | 8 +- .../intern/MOD_gpencil_legacy_thick.cc | 9 +- .../intern/MOD_gpencil_legacy_time.cc | 11 +- .../intern/MOD_gpencil_legacy_tint.cc | 12 +- .../intern/MOD_gpencil_legacy_ui_common.cc | 3 +- .../intern/MOD_gpencil_legacy_util.cc | 3 +- .../intern/MOD_gpencil_legacy_weight_angle.cc | 15 +- .../MOD_gpencil_legacy_weight_proximity.cc | 11 +- .../intern/lineart/MOD_lineart.h | 48 +- .../intern/lineart/lineart_chain.cc | 57 +- .../intern/lineart/lineart_cpu.cc | 598 +- .../intern/lineart/lineart_intern.h | 12 +- .../intern/lineart/lineart_ops.cc | 23 +- .../intern/lineart/lineart_shadow.cc | 102 +- source/blender/gpu/CMakeLists.txt | 6 +- source/blender/gpu/GPU_batch.h | 2 +- source/blender/gpu/GPU_capabilities.h | 1 - source/blender/gpu/GPU_debug.h | 6 +- source/blender/gpu/GPU_index_buffer.h | 4 - source/blender/gpu/GPU_material.hh | 17 +- source/blender/gpu/GPU_select.hh | 12 +- source/blender/gpu/GPU_shader.h | 6 +- source/blender/gpu/GPU_shader_builtin.h | 5 - source/blender/gpu/GPU_shader_shared.h | 8 +- source/blender/gpu/GPU_shader_shared_utils.h | 82 +- source/blender/gpu/GPU_storage_buffer.h | 5 +- ...uniform_buffer.hh => GPU_uniform_buffer.h} | 14 +- source/blender/gpu/dummy/dummy_context.hh | 2 +- source/blender/gpu/intern/gpu_capabilities.cc | 5 - .../gpu/intern/gpu_capabilities_private.hh | 1 - source/blender/gpu/intern/gpu_codegen.cc | 58 +- .../blender/gpu/intern/gpu_context_private.hh | 2 +- source/blender/gpu/intern/gpu_debug.cc | 6 +- .../blender/gpu/intern/gpu_debug_private.hh | 2 +- .../gpu/intern/gpu_framebuffer_private.hh | 4 +- source/blender/gpu/intern/gpu_index_buffer.cc | 50 - source/blender/gpu/intern/gpu_material.cc | 12 +- source/blender/gpu/intern/gpu_select_pick.cc | 2 +- source/blender/gpu/intern/gpu_shader.cc | 13 +- .../gpu/intern/gpu_shader_builder_stubs.cc | 16 +- .../blender/gpu/intern/gpu_shader_builtin.cc | 6 - .../gpu/intern/gpu_shader_create_info.cc | 15 +- .../gpu/intern/gpu_shader_dependency.cc | 40 - source/blender/gpu/intern/gpu_shader_log.cc | 6 +- .../blender/gpu/intern/gpu_shader_private.hh | 3 - .../blender/gpu/intern/gpu_texture_private.hh | 4 +- .../blender/gpu/intern/gpu_uniform_buffer.cc | 2 +- source/blender/gpu/intern/gpu_viewport.cc | 2 +- source/blender/gpu/metal/mtl_backend.mm | 4 +- source/blender/gpu/metal/mtl_batch.mm | 2 +- .../blender/gpu/metal/mtl_command_buffer.mm | 2 - source/blender/gpu/metal/mtl_context.hh | 2 +- source/blender/gpu/metal/mtl_context.mm | 10 +- source/blender/gpu/metal/mtl_debug.hh | 2 +- source/blender/gpu/metal/mtl_debug.mm | 4 +- source/blender/gpu/metal/mtl_framebuffer.mm | 2 +- source/blender/gpu/metal/mtl_immediate.mm | 2 +- source/blender/gpu/metal/mtl_index_buffer.mm | 4 +- source/blender/gpu/metal/mtl_memory.mm | 2 +- source/blender/gpu/metal/mtl_shader.mm | 44 +- .../blender/gpu/metal/mtl_shader_generator.mm | 18 +- .../blender/gpu/metal/mtl_shader_interface.mm | 2 +- .../gpu/metal/mtl_shader_interface_type.hh | 1 + .../blender/gpu/metal/mtl_storage_buffer.mm | 7 +- source/blender/gpu/metal/mtl_texture.hh | 8 - source/blender/gpu/metal/mtl_texture.mm | 13 +- source/blender/gpu/metal/mtl_texture_util.mm | 2 +- .../blender/gpu/metal/mtl_uniform_buffer.mm | 2 +- source/blender/gpu/metal/mtl_vertex_buffer.mm | 2 +- source/blender/gpu/opengl/gl_backend.cc | 15 +- source/blender/gpu/opengl/gl_backend.hh | 2 +- source/blender/gpu/opengl/gl_context.cc | 2 +- source/blender/gpu/opengl/gl_context.hh | 2 +- source/blender/gpu/opengl/gl_debug.cc | 15 +- source/blender/gpu/opengl/gl_framebuffer.cc | 2 +- source/blender/gpu/opengl/gl_shader.cc | 36 +- source/blender/gpu/opengl/gl_shader.hh | 2 - source/blender/gpu/opengl/gl_state.cc | 2 +- .../blender/gpu/opengl/gl_storage_buffer.cc | 75 +- .../blender/gpu/opengl/gl_storage_buffer.hh | 4 - .../gpu_shader_index_2d_array_lines.glsl | 27 - .../gpu_shader_index_2d_array_points.glsl | 23 - .../gpu_shader_index_2d_array_tris.glsl | 27 - .../shaders/infos/gpu_shader_index_info.hh | 34 - .../gpu_shader_material_tex_image.glsl | 9 - .../gpu_shader_material_tex_voronoi.glsl | 24 +- .../gpu/shaders/metal/mtl_shader_defines.msl | 35 +- .../shaders/opengl/glsl_shader_defines.glsl | 63 - source/blender/gpu/tests/gpu_testing.cc | 2 +- source/blender/gpu/tests/gpu_testing.hh | 2 +- source/blender/gpu/vulkan/vk_backend.cc | 6 +- source/blender/gpu/vulkan/vk_backend.hh | 2 +- source/blender/gpu/vulkan/vk_context.hh | 2 +- .../blender/gpu/vulkan/vk_data_conversion.cc | 2 +- source/blender/gpu/vulkan/vk_debug.cc | 19 +- source/blender/gpu/vulkan/vk_debug.hh | 2 +- source/blender/gpu/vulkan/vk_device.cc | 19 +- source/blender/gpu/vulkan/vk_device.hh | 3 +- source/blender/gpu/vulkan/vk_framebuffer.cc | 2 +- source/blender/gpu/vulkan/vk_framebuffer.hh | 2 +- source/blender/gpu/vulkan/vk_shader.cc | 18 +- source/blender/gpu/vulkan/vk_texture.cc | 2 +- source/blender/gpu/vulkan/vk_vertex_buffer.cc | 3 - .../ikplugin/intern/iksolver_plugin.cc | 4 +- .../blender/ikplugin/intern/itasc_plugin.cc | 18 +- source/blender/imbuf/CMakeLists.txt | 14 +- source/blender/imbuf/IMB_colormanagement.hh | 10 +- source/blender/imbuf/IMB_imbuf.hh | 28 +- source/blender/imbuf/IMB_imbuf_types.hh | 15 +- source/blender/imbuf/IMB_metadata.hh | 6 +- source/blender/imbuf/IMB_moviecache.hh | 15 +- source/blender/imbuf/IMB_openexr.hh | 2 +- source/blender/imbuf/IMB_thumbs.hh | 10 +- source/blender/imbuf/intern/IMB_allocimbuf.hh | 12 +- source/blender/imbuf/intern/IMB_anim.hh | 96 +- .../intern/IMB_colormanagement_intern.hh | 8 +- source/blender/imbuf/intern/IMB_filetype.hh | 8 +- source/blender/imbuf/intern/IMB_filter.hh | 2 + source/blender/imbuf/intern/allocimbuf.cc | 45 +- source/blender/imbuf/intern/anim_movie.cc | 423 +- .../blender/imbuf/intern/cineon/cineon_dpx.cc | 2 +- .../imbuf/intern/cineon/logImageCore.cc | 14 +- .../blender/imbuf/intern/colormanagement.cc | 1 + source/blender/imbuf/intern/divers.cc | 2 +- source/blender/imbuf/intern/filter.cc | 81 + source/blender/imbuf/intern/format_svg.cc | 1 + source/blender/imbuf/intern/imbuf.hh | 18 + source/blender/imbuf/intern/indexer.cc | 241 +- source/blender/imbuf/intern/iris.cc | 1 + source/blender/imbuf/intern/jpeg.cc | 5 +- source/blender/imbuf/intern/metadata.cc | 21 +- source/blender/imbuf/intern/moviecache.cc | 1 + .../blender/imbuf/intern/oiio/CMakeLists.txt | 4 +- .../imbuf/intern/oiio/openimageio_support.cc | 2 +- .../imbuf/intern/openexr/openexr_api.cpp | 1 + source/blender/imbuf/intern/readimage.cc | 2 +- source/blender/imbuf/intern/scaling.cc | 128 + source/blender/imbuf/intern/stereoimbuf.cc | 5 + source/blender/imbuf/intern/thumbs_blend.cc | 9 +- source/blender/imbuf/intern/thumbs_font.cc | 1 + source/blender/imbuf/intern/util.cc | 79 +- source/blender/imbuf/intern/util_gpu.cc | 5 + source/blender/imbuf/intern/writeimage.cc | 2 +- source/blender/io/CMakeLists.txt | 4 + source/blender/io/alembic/ABC_alembic.h | 18 +- .../io/alembic/exporter/abc_archive.cc | 14 +- .../io/alembic/exporter/abc_custom_props.cc | 4 + .../io/alembic/exporter/abc_custom_props.h | 2 +- .../io/alembic/exporter/abc_export_capi.cc | 7 +- .../exporter/abc_hierarchy_iterator.cc | 3 + .../alembic/exporter/abc_hierarchy_iterator.h | 1 + .../alembic/exporter/abc_writer_abstract.cc | 6 + .../io/alembic/exporter/abc_writer_abstract.h | 4 +- .../io/alembic/exporter/abc_writer_camera.cc | 9 +- .../io/alembic/exporter/abc_writer_hair.cc | 9 +- .../io/alembic/exporter/abc_writer_mball.cc | 6 +- .../io/alembic/exporter/abc_writer_mesh.cc | 11 +- .../io/alembic/exporter/abc_writer_nurbs.h | 3 - .../io/alembic/exporter/abc_writer_points.cc | 3 +- .../alembic/exporter/abc_writer_transform.cc | 2 + .../alembic/exporter/abc_writer_transform.h | 2 + .../io/alembic/intern/abc_axis_conversion.cc | 12 +- .../io/alembic/intern/abc_customdata.cc | 14 +- .../io/alembic/intern/abc_customdata.h | 14 +- .../io/alembic/intern/abc_reader_archive.cc | 2 - .../io/alembic/intern/abc_reader_archive.h | 5 +- .../io/alembic/intern/abc_reader_camera.cc | 3 +- .../io/alembic/intern/abc_reader_camera.h | 2 - .../io/alembic/intern/abc_reader_curves.cc | 540 +- .../io/alembic/intern/abc_reader_curves.h | 31 +- .../io/alembic/intern/abc_reader_mesh.cc | 56 +- .../io/alembic/intern/abc_reader_mesh.h | 29 +- .../io/alembic/intern/abc_reader_nurbs.cc | 4 +- .../io/alembic/intern/abc_reader_nurbs.h | 2 - .../io/alembic/intern/abc_reader_object.cc | 20 +- .../io/alembic/intern/abc_reader_object.h | 27 +- .../io/alembic/intern/abc_reader_points.cc | 143 +- .../io/alembic/intern/abc_reader_points.h | 20 +- .../io/alembic/intern/abc_reader_transform.cc | 4 +- .../io/alembic/intern/abc_reader_transform.h | 7 +- source/blender/io/alembic/intern/abc_util.cc | 13 +- source/blender/io/alembic/intern/abc_util.h | 15 +- .../blender/io/alembic/intern/alembic_capi.cc | 58 +- source/blender/io/avi/AVI_avi.h | 290 + source/blender/io/avi/CMakeLists.txt | 38 + source/blender/io/avi/intern/avi.cc | 1048 + source/blender/io/avi/intern/avi_codecs.cc | 125 + source/blender/io/avi/intern/avi_endian.cc | 188 + source/blender/io/avi/intern/avi_endian.h | 30 + source/blender/io/avi/intern/avi_intern.h | 55 + source/blender/io/avi/intern/avi_mjpeg.cc | 548 + source/blender/io/avi/intern/avi_mjpeg.h | 20 + source/blender/io/avi/intern/avi_options.cc | 134 + source/blender/io/avi/intern/avi_rgb.cc | 142 + source/blender/io/avi/intern/avi_rgb.h | 23 + source/blender/io/avi/intern/avi_rgb32.cc | 79 + source/blender/io/avi/intern/avi_rgb32.h | 20 + source/blender/io/collada/AnimationExporter.h | 4 +- .../blender/io/collada/AnimationImporter.cpp | 10 +- .../blender/io/collada/ArmatureExporter.cpp | 2 +- .../blender/io/collada/ArmatureImporter.cpp | 4 +- source/blender/io/collada/BCAnimationCurve.h | 2 +- source/blender/io/collada/BlenderContext.cpp | 2 +- .../blender/io/collada/ControllerExporter.cpp | 6 +- .../blender/io/collada/DocumentExporter.cpp | 6 +- .../blender/io/collada/DocumentImporter.cpp | 14 +- source/blender/io/collada/EffectExporter.cpp | 2 +- .../blender/io/collada/GeometryExporter.cpp | 2 +- source/blender/io/collada/ImageExporter.cpp | 2 +- source/blender/io/collada/Materials.h | 2 +- source/blender/io/collada/MeshImporter.cpp | 19 +- source/blender/io/collada/SceneExporter.cpp | 2 +- source/blender/io/collada/SceneExporter.h | 2 +- source/blender/io/collada/SkinInfo.cpp | 10 +- source/blender/io/collada/collada.cpp | 2 +- source/blender/io/collada/collada_utils.cpp | 16 +- source/blender/io/collada/collada_utils.h | 6 +- .../io/common/IO_dupli_persistent_id.hh | 2 +- .../intern/abstract_hierarchy_iterator.cc | 6 +- .../abstract_hierarchy_iterator_test.cc | 4 +- .../io/common/intern/dupli_parent_finder.hh | 2 +- .../io/common/intern/object_identifier.cc | 8 +- .../io/gpencil/intern/gpencil_io_base.cc | 6 +- .../io/gpencil/intern/gpencil_io_capi.cc | 2 +- .../gpencil/intern/gpencil_io_export_pdf.cc | 2 +- .../gpencil/intern/gpencil_io_export_svg.cc | 2 +- source/blender/io/ply/IO_ply.hh | 8 +- source/blender/io/ply/exporter/ply_export.cc | 9 +- .../ply/exporter/ply_export_load_plydata.cc | 18 +- .../io/ply/exporter/ply_file_buffer.cc | 3 - .../io/ply/exporter/ply_file_buffer.hh | 2 + source/blender/io/ply/importer/ply_import.cc | 7 +- source/blender/io/ply/importer/ply_import.hh | 5 - .../io/ply/importer/ply_import_buffer.cc | 1 - .../io/ply/importer/ply_import_buffer.hh | 3 +- .../io/ply/importer/ply_import_data.cc | 1 + .../io/ply/importer/ply_import_mesh.cc | 4 +- .../io/ply/importer/ply_import_mesh.hh | 2 - source/blender/io/ply/intern/ply_data.hh | 3 - .../io/ply/tests/io_ply_exporter_test.cc | 3 +- source/blender/io/stl/IO_stl.hh | 4 +- source/blender/io/stl/exporter/stl_export.cc | 11 +- source/blender/io/stl/exporter/stl_export.hh | 3 - source/blender/io/stl/importer/stl_import.cc | 5 +- source/blender/io/stl/importer/stl_import.hh | 5 - .../stl/importer/stl_import_ascii_reader.cc | 6 +- .../stl/importer/stl_import_ascii_reader.hh | 6 +- .../stl/importer/stl_import_binary_reader.cc | 2 + .../stl/importer/stl_import_binary_reader.hh | 16 +- .../io/stl/importer/stl_import_mesh.cc | 8 +- .../io/stl/importer/stl_import_mesh.hh | 1 + .../io/stl/tests/stl_exporter_tests.cc | 4 +- .../io/stl/tests/stl_importer_tests.cc | 2 +- source/blender/io/usd/CMakeLists.txt | 9 +- source/blender/io/usd/hydra/curves.cc | 6 +- source/blender/io/usd/hydra/curves.hh | 2 +- .../io/usd/hydra/hydra_scene_delegate.cc | 2 +- source/blender/io/usd/hydra/mesh.hh | 2 +- source/blender/io/usd/hydra/object.cc | 2 +- .../io/usd/hydra/usd_scene_delegate.cc | 2 +- .../blender/io/usd/hydra/volume_modifier.cc | 2 +- source/blender/io/usd/hydra/world.cc | 2 +- .../io/usd/intern/usd_armature_utils.cc | 6 +- .../io/usd/intern/usd_armature_utils.hh | 16 +- .../blender/io/usd/intern/usd_asset_utils.cc | 3 +- .../blender/io/usd/intern/usd_asset_utils.hh | 2 + .../io/usd/intern/usd_blend_shape_utils.cc | 28 +- .../io/usd/intern/usd_blend_shape_utils.hh | 25 +- .../blender/io/usd/intern/usd_capi_export.cc | 11 +- .../blender/io/usd/intern/usd_capi_import.cc | 46 +- .../io/usd/intern/usd_hierarchy_iterator.cc | 10 +- source/blender/io/usd/intern/usd_hook.cc | 4 +- source/blender/io/usd/intern/usd_hook.hh | 6 +- .../io/usd/intern/usd_reader_camera.cc | 1 + .../blender/io/usd/intern/usd_reader_curve.cc | 341 +- .../blender/io/usd/intern/usd_reader_curve.hh | 17 +- .../blender/io/usd/intern/usd_reader_geom.cc | 5 + .../blender/io/usd/intern/usd_reader_geom.hh | 10 +- .../io/usd/intern/usd_reader_instance.hh | 3 +- .../blender/io/usd/intern/usd_reader_light.hh | 2 - .../io/usd/intern/usd_reader_material.cc | 4 +- .../blender/io/usd/intern/usd_reader_mesh.cc | 22 +- .../blender/io/usd/intern/usd_reader_mesh.hh | 12 +- .../blender/io/usd/intern/usd_reader_nurbs.cc | 13 +- .../blender/io/usd/intern/usd_reader_nurbs.hh | 11 +- .../usd/intern/usd_reader_pointinstancer.cc | 5 +- .../blender/io/usd/intern/usd_reader_prim.cc | 2 +- .../blender/io/usd/intern/usd_reader_prim.hh | 1 - .../blender/io/usd/intern/usd_reader_shape.cc | 19 +- .../blender/io/usd/intern/usd_reader_shape.hh | 11 +- .../io/usd/intern/usd_reader_skeleton.cc | 5 + .../blender/io/usd/intern/usd_reader_stage.cc | 6 +- .../blender/io/usd/intern/usd_reader_stage.hh | 18 +- .../io/usd/intern/usd_reader_volume.hh | 2 +- .../blender/io/usd/intern/usd_reader_xform.cc | 10 +- .../blender/io/usd/intern/usd_reader_xform.hh | 8 +- .../blender/io/usd/intern/usd_skel_convert.cc | 17 +- .../blender/io/usd/intern/usd_skel_convert.hh | 6 +- .../io/usd/intern/usd_skel_root_utils.cc | 2 +- .../io/usd/intern/usd_skel_root_utils.hh | 2 +- .../io/usd/intern/usd_writer_abstract.cc | 2 +- .../io/usd/intern/usd_writer_abstract.hh | 10 +- .../io/usd/intern/usd_writer_armature.cc | 8 + .../io/usd/intern/usd_writer_armature.hh | 1 + .../io/usd/intern/usd_writer_camera.cc | 6 +- .../io/usd/intern/usd_writer_curves.cc | 17 +- .../io/usd/intern/usd_writer_curves.hh | 5 +- .../blender/io/usd/intern/usd_writer_light.cc | 2 + .../io/usd/intern/usd_writer_material.cc | 9 +- .../io/usd/intern/usd_writer_material.hh | 3 + .../blender/io/usd/intern/usd_writer_mesh.cc | 21 +- .../blender/io/usd/intern/usd_writer_mesh.hh | 2 +- .../io/usd/intern/usd_writer_metaball.cc | 12 +- .../io/usd/intern/usd_writer_transform.cc | 3 +- .../io/usd/intern/usd_writer_volume.cc | 8 +- .../io/usd/intern/usd_writer_volume.hh | 1 + .../blender/io/usd/tests/usd_curves_test.cc | 6 +- .../blender/io/usd/tests/usd_export_test.cc | 2 +- .../io/usd/tests/usd_usdz_export_test.cc | 2 +- source/blender/io/usd/usd.hh | 16 +- source/blender/io/usd/usd_private.hh | 2 +- .../io/wavefront_obj/IO_wavefront_obj.hh | 5 +- .../exporter/obj_export_file_writer.cc | 4 +- .../wavefront_obj/exporter/obj_export_mesh.cc | 2 +- .../exporter/obj_export_nurbs.cc | 7 +- .../exporter/obj_export_nurbs.hh | 2 +- .../io/wavefront_obj/exporter/obj_exporter.cc | 8 +- .../importer/importer_mesh_utils.cc | 3 +- .../importer/obj_import_file_reader.cc | 7 +- .../importer/obj_import_file_reader.hh | 8 +- .../wavefront_obj/importer/obj_import_mesh.cc | 6 +- .../wavefront_obj/importer/obj_import_mesh.hh | 4 +- .../wavefront_obj/importer/obj_import_mtl.cc | 2 + .../wavefront_obj/importer/obj_import_mtl.hh | 3 +- .../importer/obj_import_objects.hh | 2 + .../io/wavefront_obj/importer/obj_importer.cc | 4 +- .../wavefront_obj/tests/obj_exporter_tests.cc | 4 +- .../wavefront_obj/tests/obj_importer_tests.cc | 4 +- .../tests/obj_mtl_parser_tests.cc | 2 - source/blender/makesdna/DNA_ID.h | 40 +- source/blender/makesdna/DNA_ID_enums.h | 1 - source/blender/makesdna/DNA_anim_defaults.h | 38 - source/blender/makesdna/DNA_anim_types.h | 220 +- .../blender/makesdna/DNA_armature_defaults.h | 1 + source/blender/makesdna/DNA_armature_types.h | 2 +- source/blender/makesdna/DNA_asset_defaults.h | 1 + source/blender/makesdna/DNA_asset_types.h | 28 +- source/blender/makesdna/DNA_brush_defaults.h | 1 + source/blender/makesdna/DNA_brush_enums.h | 1 - source/blender/makesdna/DNA_brush_types.h | 4 +- .../blender/makesdna/DNA_cachefile_defaults.h | 1 + source/blender/makesdna/DNA_camera_defaults.h | 1 + .../makesdna/DNA_collection_defaults.h | 1 + .../blender/makesdna/DNA_constraint_types.h | 4 +- source/blender/makesdna/DNA_curve_defaults.h | 1 + source/blender/makesdna/DNA_curves_defaults.h | 1 + .../blender/makesdna/DNA_customdata_types.h | 5 +- source/blender/makesdna/DNA_fluid_defaults.h | 1 + .../makesdna/DNA_gpencil_legacy_types.h | 8 +- .../makesdna/DNA_gpencil_modifier_defaults.h | 9 +- .../makesdna/DNA_gpencil_modifier_types.h | 49 +- .../makesdna/DNA_grease_pencil_types.h | 26 - source/blender/makesdna/DNA_image_defaults.h | 1 + .../blender/makesdna/DNA_lattice_defaults.h | 1 + source/blender/makesdna/DNA_layer_types.h | 1 - source/blender/makesdna/DNA_light_defaults.h | 2 +- source/blender/makesdna/DNA_light_types.h | 2 +- .../makesdna/DNA_lightprobe_defaults.h | 1 + source/blender/makesdna/DNA_lineart_types.h | 80 +- .../blender/makesdna/DNA_linestyle_defaults.h | 1 + .../blender/makesdna/DNA_material_defaults.h | 1 + source/blender/makesdna/DNA_material_types.h | 2 +- source/blender/makesdna/DNA_mesh_defaults.h | 1 + source/blender/makesdna/DNA_mesh_types.h | 34 +- source/blender/makesdna/DNA_meshdata_types.h | 4 +- source/blender/makesdna/DNA_meta_defaults.h | 1 + .../blender/makesdna/DNA_modifier_defaults.h | 178 +- source/blender/makesdna/DNA_modifier_types.h | 556 +- .../blender/makesdna/DNA_movieclip_defaults.h | 1 + source/blender/makesdna/DNA_node_types.h | 51 +- source/blender/makesdna/DNA_object_defaults.h | 2 + .../blender/makesdna/DNA_object_force_types.h | 4 +- source/blender/makesdna/DNA_object_types.h | 18 +- .../blender/makesdna/DNA_particle_defaults.h | 1 + source/blender/makesdna/DNA_particle_types.h | 2 +- .../makesdna/DNA_pointcloud_defaults.h | 1 + source/blender/makesdna/DNA_rigidbody_types.h | 4 +- source/blender/makesdna/DNA_scene_defaults.h | 9 +- source/blender/makesdna/DNA_scene_types.h | 54 +- source/blender/makesdna/DNA_sequence_types.h | 2 +- source/blender/makesdna/DNA_space_defaults.h | 1 + source/blender/makesdna/DNA_space_types.h | 7 +- .../blender/makesdna/DNA_speaker_defaults.h | 1 + .../blender/makesdna/DNA_texture_defaults.h | 1 + .../blender/makesdna/DNA_userdef_defaults.h | 1 + source/blender/makesdna/DNA_userdef_types.h | 22 +- source/blender/makesdna/DNA_vec_types.h | 4 - source/blender/makesdna/DNA_view3d_defaults.h | 1 + source/blender/makesdna/DNA_volume_defaults.h | 1 + .../makesdna/DNA_windowmanager_types.h | 22 +- source/blender/makesdna/DNA_workspace_types.h | 2 +- source/blender/makesdna/DNA_world_defaults.h | 1 + source/blender/makesdna/intern/dna_defaults.c | 45 - .../blender/makesdna/intern/dna_rename_defs.h | 5 +- source/blender/makesrna/RNA_access.hh | 19 +- source/blender/makesrna/RNA_define.hh | 10 +- source/blender/makesrna/RNA_types.hh | 121 +- source/blender/makesrna/intern/CMakeLists.txt | 2 +- source/blender/makesrna/intern/makesrna.cc | 7 +- source/blender/makesrna/intern/rna_ID.cc | 18 +- source/blender/makesrna/intern/rna_access.cc | 42 +- .../intern/rna_access_compare_override.cc | 8 +- source/blender/makesrna/intern/rna_action.cc | 4 +- .../blender/makesrna/intern/rna_animation.cc | 10 +- .../makesrna/intern/rna_animation_api.cc | 2 +- source/blender/makesrna/intern/rna_animviz.cc | 2 +- .../blender/makesrna/intern/rna_armature.cc | 20 +- source/blender/makesrna/intern/rna_asset.cc | 4 +- .../blender/makesrna/intern/rna_attribute.cc | 43 +- source/blender/makesrna/intern/rna_brush.cc | 28 +- .../blender/makesrna/intern/rna_cachefile.cc | 8 +- source/blender/makesrna/intern/rna_camera.cc | 16 +- .../blender/makesrna/intern/rna_collection.cc | 14 +- source/blender/makesrna/intern/rna_color.cc | 4 +- .../blender/makesrna/intern/rna_constraint.cc | 2 +- source/blender/makesrna/intern/rna_curve.cc | 2 +- .../makesrna/intern/rna_curveprofile.cc | 2 +- source/blender/makesrna/intern/rna_curves.cc | 2 +- source/blender/makesrna/intern/rna_define.cc | 2 +- .../blender/makesrna/intern/rna_depsgraph.cc | 6 +- .../makesrna/intern/rna_dynamicpaint.cc | 2 +- source/blender/makesrna/intern/rna_fcurve.cc | 8 +- .../blender/makesrna/intern/rna_fcurve_api.cc | 2 +- source/blender/makesrna/intern/rna_fluid.cc | 2 +- .../makesrna/intern/rna_gpencil_legacy.cc | 22 +- .../intern/rna_gpencil_legacy_modifier.cc | 110 +- .../makesrna/intern/rna_grease_pencil.cc | 287 +- source/blender/makesrna/intern/rna_image.cc | 2 +- .../blender/makesrna/intern/rna_image_api.cc | 2 +- .../blender/makesrna/intern/rna_internal.hh | 2 +- .../makesrna/intern/rna_internal_types.hh | 2 +- source/blender/makesrna/intern/rna_key.cc | 2 +- source/blender/makesrna/intern/rna_layer.cc | 6 +- source/blender/makesrna/intern/rna_light.cc | 10 +- .../blender/makesrna/intern/rna_linestyle.cc | 2 +- source/blender/makesrna/intern/rna_main.cc | 2 +- .../blender/makesrna/intern/rna_main_api.cc | 8 +- source/blender/makesrna/intern/rna_mask.cc | 2 +- .../blender/makesrna/intern/rna_material.cc | 8 +- source/blender/makesrna/intern/rna_mesh.cc | 2 +- .../blender/makesrna/intern/rna_mesh_api.cc | 4 +- source/blender/makesrna/intern/rna_meta.cc | 4 +- .../blender/makesrna/intern/rna_modifier.cc | 2107 +- source/blender/makesrna/intern/rna_nla.cc | 8 +- .../makesrna/intern/rna_node_socket.cc | 34 +- .../intern/rna_node_tree_interface.cc | 38 +- .../blender/makesrna/intern/rna_nodetree.cc | 121 +- source/blender/makesrna/intern/rna_object.cc | 39 +- .../blender/makesrna/intern/rna_object_api.cc | 26 +- .../makesrna/intern/rna_object_force.cc | 4 +- source/blender/makesrna/intern/rna_palette.cc | 2 +- .../blender/makesrna/intern/rna_particle.cc | 4 +- source/blender/makesrna/intern/rna_pose.cc | 4 +- source/blender/makesrna/intern/rna_render.cc | 6 +- source/blender/makesrna/intern/rna_rna.cc | 50 +- source/blender/makesrna/intern/rna_scene.cc | 205 +- .../blender/makesrna/intern/rna_scene_api.cc | 6 +- source/blender/makesrna/intern/rna_screen.cc | 4 +- .../makesrna/intern/rna_sculpt_paint.cc | 6 +- .../blender/makesrna/intern/rna_sequencer.cc | 16 +- .../makesrna/intern/rna_sequencer_api.cc | 2 +- .../blender/makesrna/intern/rna_shader_fx.cc | 2 +- source/blender/makesrna/intern/rna_space.cc | 22 +- .../blender/makesrna/intern/rna_space_api.cc | 2 +- source/blender/makesrna/intern/rna_speaker.cc | 2 +- source/blender/makesrna/intern/rna_text.cc | 2 +- source/blender/makesrna/intern/rna_texture.cc | 4 +- .../makesrna/intern/rna_texture_api.cc | 2 +- .../blender/makesrna/intern/rna_timeline.cc | 2 +- .../blender/makesrna/intern/rna_tracking.cc | 8 +- source/blender/makesrna/intern/rna_ui.cc | 4 +- source/blender/makesrna/intern/rna_ui_api.cc | 37 +- source/blender/makesrna/intern/rna_userdef.cc | 114 +- source/blender/makesrna/intern/rna_volume.cc | 4 +- source/blender/makesrna/intern/rna_wm.cc | 21 +- source/blender/makesrna/intern/rna_wm_api.cc | 16 +- .../blender/makesrna/intern/rna_wm_gizmo.cc | 4 +- .../makesrna/intern/rna_wm_gizmo_api.cc | 4 +- .../blender/makesrna/intern/rna_workspace.cc | 4 +- source/blender/makesrna/intern/rna_xr.cc | 3 +- .../makesrna/rna_cleanup/rna_cleaner.py | 2 +- source/blender/modifiers/CMakeLists.txt | 19 - source/blender/modifiers/MOD_modifiertypes.hh | 14 - .../blender/modifiers/intern/MOD_armature.cc | 12 +- source/blender/modifiers/intern/MOD_array.cc | 15 +- source/blender/modifiers/intern/MOD_bevel.cc | 9 +- .../blender/modifiers/intern/MOD_boolean.cc | 58 +- source/blender/modifiers/intern/MOD_build.cc | 9 +- source/blender/modifiers/intern/MOD_cast.cc | 29 +- source/blender/modifiers/intern/MOD_cloth.cc | 10 +- .../blender/modifiers/intern/MOD_collision.cc | 19 +- .../modifiers/intern/MOD_correctivesmooth.cc | 11 +- source/blender/modifiers/intern/MOD_curve.cc | 11 +- .../modifiers/intern/MOD_datatransfer.cc | 10 +- .../blender/modifiers/intern/MOD_decimate.cc | 4 +- .../blender/modifiers/intern/MOD_displace.cc | 10 +- .../modifiers/intern/MOD_dynamicpaint.cc | 10 +- .../blender/modifiers/intern/MOD_edgesplit.cc | 6 +- .../blender/modifiers/intern/MOD_explode.cc | 15 +- source/blender/modifiers/intern/MOD_fluid.cc | 10 +- .../intern/MOD_grease_pencil_armature.cc | 243 - .../intern/MOD_grease_pencil_array.cc | 397 - .../intern/MOD_grease_pencil_color.cc | 3 +- .../intern/MOD_grease_pencil_dash.cc | 532 - .../intern/MOD_grease_pencil_envelope.cc | 760 - .../intern/MOD_grease_pencil_hook.cc | 363 - .../intern/MOD_grease_pencil_lattice.cc | 232 - .../intern/MOD_grease_pencil_length.cc | 377 - .../intern/MOD_grease_pencil_mirror.cc | 9 +- .../intern/MOD_grease_pencil_multiply.cc | 329 - .../intern/MOD_grease_pencil_noise.cc | 23 +- .../intern/MOD_grease_pencil_offset.cc | 13 +- .../intern/MOD_grease_pencil_opacity.cc | 14 +- .../intern/MOD_grease_pencil_outline.cc | 729 - .../intern/MOD_grease_pencil_shrinkwrap.cc | 365 - .../intern/MOD_grease_pencil_smooth.cc | 4 +- .../intern/MOD_grease_pencil_subdiv.cc | 6 +- .../intern/MOD_grease_pencil_thickness.cc | 4 +- .../intern/MOD_grease_pencil_time.cc | 715 - .../intern/MOD_grease_pencil_tint.cc | 8 +- .../intern/MOD_grease_pencil_util.cc | 8 +- .../intern/MOD_grease_pencil_weight_angle.cc | 310 - .../MOD_grease_pencil_weight_proximity.cc | 324 - source/blender/modifiers/intern/MOD_hook.cc | 19 +- .../modifiers/intern/MOD_laplaciandeform.cc | 10 +- .../modifiers/intern/MOD_laplaciansmooth.cc | 10 +- .../blender/modifiers/intern/MOD_lattice.cc | 10 +- .../blender/modifiers/intern/MOD_lineart.cc | 912 - source/blender/modifiers/intern/MOD_mask.cc | 7 +- .../modifiers/intern/MOD_mesh_to_volume.cc | 21 +- .../blender/modifiers/intern/MOD_meshcache.cc | 8 +- .../modifiers/intern/MOD_meshcache_mdd.cc | 2 +- .../modifiers/intern/MOD_meshcache_pc2.cc | 2 +- .../modifiers/intern/MOD_meshdeform.cc | 17 +- .../modifiers/intern/MOD_meshsequencecache.cc | 145 +- source/blender/modifiers/intern/MOD_mirror.cc | 7 +- .../blender/modifiers/intern/MOD_multires.cc | 6 +- source/blender/modifiers/intern/MOD_nodes.cc | 24 +- .../modifiers/intern/MOD_normal_edit.cc | 17 +- source/blender/modifiers/intern/MOD_ocean.cc | 8 +- .../modifiers/intern/MOD_particleinstance.cc | 11 +- .../modifiers/intern/MOD_particlesystem.cc | 7 +- source/blender/modifiers/intern/MOD_remesh.cc | 5 +- source/blender/modifiers/intern/MOD_screw.cc | 14 +- .../blender/modifiers/intern/MOD_shapekey.cc | 5 +- .../modifiers/intern/MOD_shrinkwrap.cc | 9 +- .../modifiers/intern/MOD_simpledeform.cc | 14 +- source/blender/modifiers/intern/MOD_skin.cc | 6 +- source/blender/modifiers/intern/MOD_smooth.cc | 11 +- .../blender/modifiers/intern/MOD_softbody.cc | 11 +- .../blender/modifiers/intern/MOD_solidify.cc | 2 +- .../modifiers/intern/MOD_solidify_extrude.cc | 1 + .../intern/MOD_solidify_nonmanifold.cc | 1 + .../blender/modifiers/intern/MOD_subsurf.cc | 8 +- .../blender/modifiers/intern/MOD_surface.cc | 12 +- .../modifiers/intern/MOD_surfacedeform.cc | 13 +- .../modifiers/intern/MOD_triangulate.cc | 7 +- .../blender/modifiers/intern/MOD_ui_common.cc | 10 +- source/blender/modifiers/intern/MOD_util.cc | 30 +- .../blender/modifiers/intern/MOD_uvproject.cc | 17 +- source/blender/modifiers/intern/MOD_uvwarp.cc | 10 +- .../modifiers/intern/MOD_volume_displace.cc | 19 +- .../modifiers/intern/MOD_volume_to_mesh.cc | 11 +- source/blender/modifiers/intern/MOD_warp.cc | 18 +- source/blender/modifiers/intern/MOD_wave.cc | 14 +- .../modifiers/intern/MOD_weighted_normal.cc | 2 +- .../modifiers/intern/MOD_weightvg_util.cc | 4 +- .../modifiers/intern/MOD_weightvgedit.cc | 5 +- .../modifiers/intern/MOD_weightvgmix.cc | 6 +- .../modifiers/intern/MOD_weightvgproximity.cc | 13 +- source/blender/modifiers/intern/MOD_weld.cc | 2 +- .../blender/modifiers/intern/MOD_wireframe.cc | 4 +- source/blender/nodes/NOD_common.h | 2 +- source/blender/nodes/NOD_composite.hh | 8 +- source/blender/nodes/NOD_geometry.hh | 2 +- source/blender/nodes/NOD_geometry_exec.hh | 11 +- .../nodes/NOD_geometry_nodes_execute.hh | 3 +- .../blender/nodes/NOD_geometry_nodes_log.hh | 15 +- source/blender/nodes/NOD_node_declaration.hh | 15 +- source/blender/nodes/NOD_shader.h | 2 +- source/blender/nodes/NOD_socket.hh | 2 +- .../blender/nodes/NOD_socket_declarations.hh | 16 - source/blender/nodes/NOD_socket_items.hh | 2 +- source/blender/nodes/NOD_static_types.h | 36 +- source/blender/nodes/NOD_texture.h | 2 +- source/blender/nodes/NOD_zone_socket_items.hh | 8 - .../nodes/composite/node_composite_tree.cc | 13 +- .../nodes/node_composite_antialiasing.cc | 2 +- .../composite/nodes/node_composite_blur.cc | 4 +- .../nodes/node_composite_bokehblur.cc | 14 +- .../nodes/node_composite_bokehimage.cc | 1 + .../composite/nodes/node_composite_boxmask.cc | 6 +- .../nodes/node_composite_composite.cc | 7 +- .../node_composite_convert_color_space.cc | 2 + .../nodes/node_composite_cornerpin.cc | 51 +- .../nodes/node_composite_cryptomatte.cc | 253 +- .../composite/nodes/node_composite_denoise.cc | 20 +- .../nodes/node_composite_ellipsemask.cc | 6 +- .../nodes/node_composite_file_output.cc | 2 +- .../composite/nodes/node_composite_glare.cc | 98 +- .../composite/nodes/node_composite_image.cc | 4 +- .../composite/nodes/node_composite_mask.cc | 1 + .../nodes/node_composite_planetrackdeform.cc | 74 +- .../composite/nodes/node_composite_split.cc | 3 + .../composite/nodes/node_composite_texture.cc | 1 + .../composite/nodes/node_composite_viewer.cc | 75 +- source/blender/nodes/function/CMakeLists.txt | 7 - .../nodes/node_fn_align_euler_to_vector.cc | 10 +- .../nodes/node_fn_axis_angle_to_rotation.cc | 1 + .../nodes/node_fn_combine_transform.cc | 98 - .../nodes/function/nodes/node_fn_compare.cc | 2 +- .../function/nodes/node_fn_input_bool.cc | 2 + .../function/nodes/node_fn_input_color.cc | 4 +- .../nodes/function/nodes/node_fn_input_int.cc | 2 + .../function/nodes/node_fn_input_vector.cc | 2 + .../function/nodes/node_fn_invert_matrix.cc | 45 - .../function/nodes/node_fn_matrix_multiply.cc | 46 - .../function/nodes/node_fn_replace_string.cc | 1 + .../nodes/node_fn_separate_transform.cc | 92 - .../nodes/node_fn_transform_direction.cc | 49 - .../function/nodes/node_fn_transform_point.cc | 47 - .../nodes/node_fn_transpose_matrix.cc | 45 - source/blender/nodes/geometry/CMakeLists.txt | 8 +- .../nodes/geometry/node_geometry_tree.cc | 16 +- .../nodes/geometry/node_geometry_util.cc | 17 +- .../nodes/geometry/node_geometry_util.hh | 1 - .../nodes/node_geo_attribute_capture.cc | 2 + .../nodes/node_geo_attribute_statistic.cc | 1 + .../nodes/geometry/nodes/node_geo_bake.cc | 2 +- .../geometry/nodes/node_geo_blur_attribute.cc | 4 - .../nodes/geometry/nodes/node_geo_boolean.cc | 80 +- .../nodes/node_geo_collection_info.cc | 11 +- .../node_geo_curve_endpoint_selection.cc | 11 +- .../geometry/nodes/node_geo_curve_fill.cc | 20 +- .../node_geo_curve_handle_type_selection.cc | 6 +- .../nodes/node_geo_curve_primitive_arc.cc | 1 + .../geometry/nodes/node_geo_curve_resample.cc | 27 +- .../geometry/nodes/node_geo_curve_reverse.cc | 4 +- .../nodes/node_geo_curve_spline_parameter.cc | 6 +- .../nodes/node_geo_curve_spline_type.cc | 9 + .../nodes/node_geo_curve_subdivide.cc | 1 + .../geometry/nodes/node_geo_curve_to_mesh.cc | 1 + .../nodes/node_geo_curve_to_points.cc | 4 +- .../node_geo_deform_curves_on_surface.cc | 7 + .../nodes/node_geo_delete_geometry.cc | 10 + .../node_geo_distribute_points_in_grid.cc | 278 - .../node_geo_distribute_points_on_faces.cc | 4 + .../geometry/nodes/node_geo_dual_mesh.cc | 94 +- .../nodes/node_geo_duplicate_elements.cc | 2 + .../nodes/node_geo_edge_paths_to_selection.cc | 1 + .../nodes/node_geo_evaluate_at_index.cc | 2 + .../nodes/node_geo_evaluate_on_domain.cc | 2 + .../geometry/nodes/node_geo_get_named_grid.cc | 10 +- .../geometry/nodes/node_geo_grid_to_mesh.cc | 58 - .../geometry/nodes/node_geo_image_info.cc | 3 + .../geometry/nodes/node_geo_image_texture.cc | 1 + .../geometry/nodes/node_geo_index_switch.cc | 6 +- .../nodes/node_geo_input_active_camera.cc | 2 + .../nodes/node_geo_input_curve_handles.cc | 8 +- .../nodes/node_geo_input_scene_time.cc | 2 +- .../nodes/node_geo_instance_on_points.cc | 9 +- .../nodes/node_geo_interpolate_curves.cc | 3 + .../geometry/nodes/node_geo_join_geometry.cc | 2 + .../nodes/node_geo_material_replace.cc | 1 + .../nodes/node_geo_material_selection.cc | 4 + .../geometry/nodes/node_geo_menu_switch.cc | 4 + .../geometry/nodes/node_geo_mesh_subdivide.cc | 2 + .../nodes/node_geo_mesh_to_density_grid.cc | 69 - .../geometry/nodes/node_geo_mesh_to_points.cc | 1 + .../nodes/node_geo_mesh_to_sdf_grid.cc | 63 - .../geometry/nodes/node_geo_mesh_to_volume.cc | 9 +- ...ode_geo_mesh_topology_corners_of_vertex.cc | 1 + .../node_geo_mesh_topology_edges_of_corner.cc | 1 + .../node_geo_mesh_topology_face_of_corner.cc | 1 + ...geo_mesh_topology_offset_corner_in_face.cc | 1 + .../geometry/nodes/node_geo_object_info.cc | 4 +- .../nodes/node_geo_points_to_sdf_grid.cc | 114 - .../nodes/node_geo_points_to_vertices.cc | 1 + .../nodes/node_geo_points_to_volume.cc | 32 +- .../geometry/nodes/node_geo_proximity.cc | 320 +- .../nodes/node_geo_realize_instances.cc | 1 + .../nodes/node_geo_remove_attribute.cc | 152 +- .../nodes/geometry/nodes/node_geo_repeat.cc | 21 +- .../nodes/node_geo_rotate_instances.cc | 2 +- .../geometry/nodes/node_geo_sample_grid.cc | 299 - .../geometry/nodes/node_geo_sample_nearest.cc | 7 +- .../nodes/node_geo_sample_nearest_surface.cc | 113 +- .../geometry/nodes/node_geo_scale_elements.cc | 45 +- .../nodes/node_geo_scale_instances.cc | 2 +- .../nodes/node_geo_set_curve_radius.cc | 41 +- .../geometry/nodes/node_geo_set_curve_tilt.cc | 48 +- .../geometry/nodes/node_geo_set_material.cc | 1 + .../nodes/node_geo_set_material_index.cc | 64 +- .../nodes/node_geo_set_point_radius.cc | 31 +- .../geometry/nodes/node_geo_set_position.cc | 252 +- .../nodes/node_geo_set_shade_smooth.cc | 43 +- .../nodes/node_geo_set_spline_cyclic.cc | 46 +- .../nodes/node_geo_set_spline_resolution.cc | 51 +- .../geometry/nodes/node_geo_simulation.cc | 29 +- .../geometry/nodes/node_geo_sort_elements.cc | 2 + .../nodes/node_geo_split_to_instances.cc | 26 +- .../nodes/node_geo_store_named_attribute.cc | 19 +- .../nodes/node_geo_store_named_grid.cc | 27 +- .../nodes/node_geo_string_to_curves.cc | 4 +- .../nodes/node_geo_subdivision_surface.cc | 1 + .../nodes/geometry/nodes/node_geo_switch.cc | 4 - .../geometry/nodes/node_geo_tool_3d_cursor.cc | 6 +- .../nodes/node_geo_tool_set_face_set.cc | 1 + .../nodes/node_geo_transform_geometry.cc | 14 + .../nodes/node_geo_translate_instances.cc | 2 +- .../geometry/nodes/node_geo_volume_cube.cc | 3 + .../geometry/nodes/node_geo_volume_to_mesh.cc | 2 + .../blender/nodes/intern/derived_node_tree.cc | 2 + .../nodes/intern/geometry_nodes_execute.cc | 14 +- .../intern/geometry_nodes_lazy_function.cc | 7 +- .../nodes/intern/geometry_nodes_log.cc | 6 +- source/blender/nodes/intern/node_common.cc | 11 +- .../blender/nodes/intern/node_declaration.cc | 27 +- source/blender/nodes/intern/node_exec.cc | 3 +- .../nodes/intern/node_geometry_exec.cc | 4 +- .../nodes/intern/node_multi_function.cc | 1 + source/blender/nodes/intern/node_register.cc | 6 +- source/blender/nodes/intern/node_socket.cc | 32 +- .../nodes/intern/node_socket_declarations.cc | 56 +- source/blender/nodes/intern/node_util.cc | 2 +- .../nodes/intern/node_zone_socket_items.cc | 2 + .../nodes/intern/socket_search_link.cc | 2 +- .../nodes/shader/materialx/group_nodes.cc | 2 +- .../blender/nodes/shader/node_shader_tree.cc | 182 +- .../blender/nodes/shader/node_shader_util.cc | 7 +- .../blender/nodes/shader/node_shader_util.hh | 9 +- .../shader/nodes/node_shader_background.cc | 10 +- .../shader/nodes/node_shader_blackbody.cc | 1 + .../nodes/node_shader_bsdf_principled.cc | 62 +- .../nodes/shader/nodes/node_shader_bump.cc | 12 +- .../shader/nodes/node_shader_color_ramp.cc | 11 +- .../shader/nodes/node_shader_mix_shader.cc | 9 +- .../shader/nodes/node_shader_output_aov.cc | 2 +- .../nodes/node_shader_output_material.cc | 6 +- .../shader/nodes/node_shader_particle_info.cc | 2 + .../shader/nodes/node_shader_tex_coord.cc | 2 +- .../shader/nodes/node_shader_tex_noise.cc | 40 +- .../nodes/shader/nodes/node_shader_tex_sky.cc | 2 +- .../shader/nodes/node_shader_wireframe.cc | 2 +- .../nodes/texture/node_texture_tree.cc | 5 + .../nodes/texture/node_texture_util.cc | 2 +- .../nodes/texture/node_texture_util.hh | 2 +- .../nodes/texture/nodes/node_texture_at.cc | 1 + .../texture/nodes/node_texture_bricks.cc | 1 + .../texture/nodes/node_texture_checker.cc | 1 + .../texture/nodes/node_texture_compose.cc | 1 + .../nodes/texture/nodes/node_texture_coord.cc | 1 + .../texture/nodes/node_texture_curves.cc | 1 + .../texture/nodes/node_texture_decompose.cc | 1 + .../texture/nodes/node_texture_distance.cc | 1 + .../texture/nodes/node_texture_hueSatVal.cc | 1 + .../nodes/texture/nodes/node_texture_image.cc | 1 + .../texture/nodes/node_texture_invert.cc | 1 + .../nodes/texture/nodes/node_texture_math.cc | 1 + .../texture/nodes/node_texture_mixRgb.cc | 1 + .../texture/nodes/node_texture_output.cc | 1 + .../nodes/texture/nodes/node_texture_proc.cc | 1 + .../texture/nodes/node_texture_rotate.cc | 1 + .../texture/nodes/node_texture_texture.cc | 2 + .../texture/nodes/node_texture_translate.cc | 1 + .../texture/nodes/node_texture_valToNor.cc | 1 + .../texture/nodes/node_texture_valToRgb.cc | 1 + .../texture/nodes/node_texture_viewer.cc | 1 + source/blender/python/bmesh/bmesh_py_types.cc | 16 +- .../python/bmesh/bmesh_py_types_meshdata.cc | 1 + .../python/bmesh/bmesh_py_types_select.cc | 1 + source/blender/python/generic/bgl.cc | 2 +- .../blender/python/generic/bl_math_py_api.cc | 2 + source/blender/python/generic/bpy_threads.cc | 1 + source/blender/python/gpu/gpu_py_batch.cc | 26 - .../blender/python/gpu/gpu_py_capabilities.cc | 15 - source/blender/python/gpu/gpu_py_compute.cc | 10 + source/blender/python/gpu/gpu_py_element.cc | 1 + source/blender/python/gpu/gpu_py_offscreen.cc | 9 +- source/blender/python/gpu/gpu_py_shader.cc | 2 +- source/blender/python/gpu/gpu_py_types.cc | 2 + .../python/gpu/gpu_py_uniformbuffer.cc | 5 +- .../python/gpu/gpu_py_vertex_format.cc | 1 + source/blender/python/intern/CMakeLists.txt | 6 +- source/blender/python/intern/bpy.cc | 45 +- source/blender/python/intern/bpy_app.cc | 2 +- .../python/intern/bpy_app_build_options.cc | 5 +- .../blender/python/intern/bpy_app_handlers.cc | 7 +- .../blender/python/intern/bpy_app_timers.cc | 5 + .../python/intern/bpy_app_translations.cc | 6 +- .../blender/python/intern/bpy_capi_utils.cc | 6 +- .../blender/python/intern/bpy_cli_command.cc | 315 - .../blender/python/intern/bpy_cli_command.h | 20 - source/blender/python/intern/bpy_driver.cc | 5 +- .../blender/python/intern/bpy_gizmo_wrap.cc | 1 + source/blender/python/intern/bpy_interface.cc | 12 +- .../python/intern/bpy_interface_run.cc | 3 +- .../blender/python/intern/bpy_library_load.cc | 5 +- .../python/intern/bpy_library_write.cc | 6 +- source/blender/python/intern/bpy_msgbus.cc | 6 + source/blender/python/intern/bpy_operator.cc | 6 +- source/blender/python/intern/bpy_props.cc | 34 +- source/blender/python/intern/bpy_rna.cc | 6 +- source/blender/python/intern/bpy_rna_anim.cc | 11 +- source/blender/python/intern/bpy_rna_data.cc | 2 +- source/blender/python/intern/bpy_rna_gizmo.cc | 4 + .../python/intern/bpy_rna_id_collection.cc | 28 +- .../blender/python/intern/bpy_rna_operator.cc | 2 +- source/blender/python/intern/bpy_rna_text.cc | 5 +- .../python/intern/bpy_rna_types_capi.cc | 1 + source/blender/python/intern/bpy_rna_ui.cc | 4 +- .../python/intern/bpy_utils_previews.cc | 8 + .../python/mathutils/mathutils_bvhtree.cc | 3 +- .../python/mathutils/mathutils_kdtree.cc | 2 +- source/blender/render/CMakeLists.txt | 1 - source/blender/render/RE_bake.h | 6 +- source/blender/render/RE_pipeline.h | 2 +- source/blender/render/hydra/CMakeLists.txt | 5 - source/blender/render/hydra/camera.cc | 2 +- source/blender/render/hydra/final_engine.cc | 4 +- .../blender/render/hydra/viewport_engine.cc | 10 +- source/blender/render/intern/bake.cc | 25 +- source/blender/render/intern/compositor.cc | 32 +- source/blender/render/intern/engine.cc | 12 +- source/blender/render/intern/initrender.cc | 5 + source/blender/render/intern/multires_bake.cc | 5 +- source/blender/render/intern/pipeline.cc | 49 +- source/blender/render/intern/render_result.cc | 11 +- source/blender/render/intern/render_types.cc | 2 + source/blender/render/intern/texture_image.cc | 2 + .../render/intern/texture_pointdensity.cc | 18 +- .../render/intern/texture_procedural.cc | 7 + .../blender/render/intern/tile_highlight.cc | 1 + source/blender/sequencer/intern/animation.cc | 3 +- source/blender/sequencer/intern/channels.cc | 4 + source/blender/sequencer/intern/disk_cache.cc | 15 +- source/blender/sequencer/intern/effects.cc | 32 +- .../blender/sequencer/intern/image_cache.cc | 12 +- source/blender/sequencer/intern/iterator.cc | 6 + source/blender/sequencer/intern/modifier.cc | 2 +- source/blender/sequencer/intern/multiview.cc | 2 +- source/blender/sequencer/intern/prefetch.cc | 9 +- source/blender/sequencer/intern/proxy.cc | 10 +- source/blender/sequencer/intern/proxy_job.cc | 10 + source/blender/sequencer/intern/render.cc | 165 +- source/blender/sequencer/intern/render.hh | 2 +- .../sequencer/intern/sequence_lookup.cc | 3 + source/blender/sequencer/intern/sequencer.cc | 8 +- source/blender/sequencer/intern/sequencer.hh | 2 +- source/blender/sequencer/intern/sound.cc | 4 + source/blender/sequencer/intern/strip_add.cc | 6 +- source/blender/sequencer/intern/strip_edit.cc | 6 +- .../sequencer/intern/strip_relations.cc | 5 +- .../sequencer/intern/strip_retiming.cc | 16 + .../blender/sequencer/intern/strip_select.cc | 2 + source/blender/sequencer/intern/strip_time.cc | 9 +- source/blender/sequencer/intern/strip_time.hh | 4 +- .../sequencer/intern/strip_transform.cc | 8 +- source/blender/sequencer/intern/utils.cc | 220 +- .../shader_fx/intern/FX_shader_blur.cc | 2 +- .../shader_fx/intern/FX_shader_colorize.cc | 2 +- .../shader_fx/intern/FX_shader_flip.cc | 2 +- .../shader_fx/intern/FX_shader_glow.cc | 2 +- .../shader_fx/intern/FX_shader_pixel.cc | 2 +- .../blender/shader_fx/intern/FX_shader_rim.cc | 2 +- .../shader_fx/intern/FX_shader_shadow.cc | 2 +- .../shader_fx/intern/FX_shader_swirl.cc | 2 +- .../shader_fx/intern/FX_shader_wave.cc | 2 +- .../blender/shader_fx/intern/FX_ui_common.cc | 2 +- .../simulation/intern/implicit_blender.cc | 12 +- .../simulation/intern/implicit_eigen.cc | 2 +- source/blender/windowmanager/WM_api.hh | 175 +- source/blender/windowmanager/WM_keymap.hh | 78 +- source/blender/windowmanager/WM_types.hh | 127 +- .../windowmanager/gizmo/WM_gizmo_api.hh | 20 +- .../windowmanager/gizmo/WM_gizmo_types.hh | 32 +- .../windowmanager/gizmo/intern/wm_gizmo.cc | 33 +- .../gizmo/intern/wm_gizmo_group.cc | 69 +- .../gizmo/intern/wm_gizmo_group_type.cc | 12 +- .../gizmo/intern/wm_gizmo_intern.hh | 24 +- .../gizmo/intern/wm_gizmo_map.cc | 92 +- .../gizmo/intern/wm_gizmo_target_props.cc | 17 +- .../gizmo/intern/wm_gizmo_type.cc | 9 +- .../windowmanager/gizmo/wm_gizmo_fn.hh | 12 +- .../windowmanager/gizmo/wm_gizmo_wmapi.hh | 4 +- source/blender/windowmanager/intern/wm.cc | 36 +- .../windowmanager/intern/wm_cursors.cc | 19 +- .../windowmanager/intern/wm_dragdrop.cc | 56 +- .../blender/windowmanager/intern/wm_draw.cc | 47 +- .../windowmanager/intern/wm_event_query.cc | 13 +- .../windowmanager/intern/wm_event_system.cc | 128 +- .../blender/windowmanager/intern/wm_files.cc | 435 +- .../windowmanager/intern/wm_files_link.cc | 41 +- .../windowmanager/intern/wm_gesture.cc | 30 +- .../windowmanager/intern/wm_gesture_ops.cc | 92 +- .../windowmanager/intern/wm_init_exit.cc | 83 +- .../blender/windowmanager/intern/wm_jobs.cc | 95 +- .../blender/windowmanager/intern/wm_keymap.cc | 303 +- .../windowmanager/intern/wm_keymap_utils.cc | 73 +- .../windowmanager/intern/wm_menu_type.cc | 19 +- .../windowmanager/intern/wm_operator_props.cc | 4 +- .../windowmanager/intern/wm_operator_type.cc | 64 +- .../windowmanager/intern/wm_operator_utils.cc | 4 +- .../windowmanager/intern/wm_operators.cc | 379 +- .../windowmanager/intern/wm_panel_type.cc | 18 +- .../intern/wm_platform_support.cc | 11 +- .../windowmanager/intern/wm_playanim.cc | 33 +- .../windowmanager/intern/wm_splash_screen.cc | 11 +- .../blender/windowmanager/intern/wm_stereo.cc | 41 +- .../windowmanager/intern/wm_subwindow.cc | 2 +- .../windowmanager/intern/wm_surface.cc | 11 +- .../windowmanager/intern/wm_toolsystem.cc | 16 +- .../windowmanager/intern/wm_tooltip.cc | 4 +- .../windowmanager/intern/wm_uilist_type.cc | 2 +- .../blender/windowmanager/intern/wm_window.cc | 145 +- .../message_bus/intern/wm_message_bus.cc | 2 +- .../message_bus/intern/wm_message_bus_rna.cc | 4 +- .../intern/wm_message_bus_static.cc | 4 +- .../message_bus/wm_message_bus.hh | 32 +- source/blender/windowmanager/wm.hh | 4 +- .../blender/windowmanager/wm_event_system.hh | 29 +- .../blender/windowmanager/wm_event_types.hh | 72 +- source/blender/windowmanager/wm_files.hh | 2 +- source/blender/windowmanager/wm_surface.hh | 8 +- .../blender/windowmanager/xr/intern/wm_xr.cc | 21 +- .../windowmanager/xr/intern/wm_xr_action.cc | 2 +- .../xr/intern/wm_xr_actionmap.cc | 3 + .../windowmanager/xr/intern/wm_xr_draw.cc | 3 + .../windowmanager/xr/intern/wm_xr_intern.hh | 12 +- .../xr/intern/wm_xr_operators.cc | 42 +- .../windowmanager/xr/intern/wm_xr_session.cc | 22 +- source/creator/CMakeLists.txt | 62 +- source/creator/creator.cc | 33 +- source/creator/creator_args.cc | 110 +- source/creator/creator_cpu_check.cc | 106 - source/creator/creator_intern.h | 6 - source/creator/creator_signals.cc | 37 +- tests/CMakeLists.txt | 4 +- tests/data | 2 +- tests/performance/api/config.py | 6 +- tests/performance/api/test.py | 11 +- tests/performance/benchmark.py | 36 +- tests/performance/tests/eevee.py | 3 - tests/python/CMakeLists.txt | 3 +- tests/python/bl_alembic_io_test.py | 2 +- tests/python/bl_animation_armature.py | 2 +- tests/python/bl_animation_drivers.py | 2 +- tests/python/bl_animation_fcurves.py | 2 +- tests/python/bl_animation_keyframing.py | 2 +- tests/python/bl_blendfile_io.py | 2 +- tests/python/bl_blendfile_liblink.py | 2 +- .../python/bl_blendfile_library_overrides.py | 12 +- tests/python/bl_blendfile_versioning.py | 2 +- tests/python/bl_constraints.py | 2 +- tests/python/bl_id_management.py | 2 +- tests/python/bl_io_curve_svg_test.py | 1 + tests/python/bl_keymap_validate.py | 2 +- tests/python/bl_load_addons.py | 2 +- tests/python/bl_load_py_modules.py | 2 +- tests/python/bl_node_group_interface.py | 7 + .../python/bl_pyapi_bpy_driver_secure_eval.py | 2 +- tests/python/bl_pyapi_bpy_path.py | 2 +- tests/python/bl_pyapi_bpy_utils_units.py | 2 +- tests/python/bl_pyapi_idprop.py | 2 +- tests/python/bl_pyapi_idprop_datablock.py | 2 +- tests/python/bl_pyapi_mathutils.py | 2 +- tests/python/bl_pyapi_prop_array.py | 2 +- tests/python/bl_pyapi_text.py | 2 +- tests/python/bl_rigging_symmetrize.py | 2 +- tests/python/bl_rna_defaults.py | 2 +- tests/python/bl_rna_manual_reference.py | 2 +- tests/python/bl_rst_completeness.py | 2 +- tests/python/collada/CMakeLists.txt | 6 +- tests/python/compositor_cpu_render_tests.py | 1 + .../compositor_realtime_render_tests.py | 3 +- tests/python/cycles_render_tests.py | 3 +- tests/python/eevee_next_render_tests.py | 103 +- tests/python/eevee_render_tests.py | 2 + tests/python/modules/render_report.py | 2 +- tests/python/modules/test_utils.py | 1 + tests/python/rna_info_dump.py | 2 +- tests/python/sequencer_render_tests.py | 1 + tests/python/storm_render_tests.py | 1 + tests/python/view_layer/CMakeLists.txt | 2 +- tests/python/workbench_render_tests.py | 1 + tests/utils/batch_load_blendfiles.py | 2 +- tools/check_source/check_descriptions.py | 2 +- tools/check_source/check_mypy_config.py | 3 + tools/check_source/check_spelling.py | 4 +- tools/check_source/check_spelling_config.py | 2 - tools/modules/blendfile.py | 297 +- tools/triage/gitea_utils.py | 92 +- tools/triage/issues_needing_info.py | 20 +- tools/triage/weekly_report.py | 151 +- tools/utils/blend2json.py | 41 +- tools/utils/blender_theme_as_c.py | 2 +- tools/utils/cycles_timeit.py | 1 + tools/utils_ide/natvis/Blender.natvis | 58 - tools/utils_maintenance/c_struct_clean.py | 12 +- tools/utils_maintenance/code_clean.py | 32 +- 3443 files changed, 70508 insertions(+), 264669 deletions(-) delete mode 100644 build_files/build_environment/cmake/embree_windows_arm.cmake delete mode 100644 build_files/build_environment/patches/embree_Directory.Build.Props.in delete mode 100644 build_files/build_environment/patches/openjpeg_msvc.diff rename build_files/build_environment/patches/{python_windows_x64.diff => python_windows.diff} (100%) delete mode 100644 build_files/build_environment/patches/python_windows_arm64.diff delete mode 100644 doc/python_api/examples/bpy.utils.register_cli_command.1.py delete mode 100644 doc/python_api/examples/bpy.utils.register_cli_command.py delete mode 100644 extern/audaspace/include/devices/OpenCloseDevice.h delete mode 100644 extern/audaspace/src/devices/OpenCloseDevice.cpp create mode 100644 extern/clew/CMakeLists.txt create mode 100644 extern/clew/README.blender create mode 100644 extern/clew/include/clew.h create mode 100644 extern/clew/src/clew.c delete mode 100644 extern/lzma/7zTypes.h delete mode 100644 extern/lzma/7zWindows.h delete mode 100644 extern/lzma/Compiler.h delete mode 100644 extern/lzma/CpuArch.c delete mode 100644 extern/lzma/CpuArch.h delete mode 100644 extern/lzma/LzFindMt.c delete mode 100644 extern/lzma/LzFindMt.h delete mode 100644 extern/lzma/LzFindOpt.c delete mode 100644 extern/lzma/Precomp.h delete mode 100644 extern/lzma/Threads.c delete mode 100644 extern/lzma/Threads.h create mode 100644 extern/lzma/Types.h create mode 100644 extern/lzma/history.txt create mode 100644 extern/lzma/lzma.txt create mode 100644 intern/cycles/kernel/device/cpu/kernel_sse2.cpp rename intern/cycles/kernel/device/cpu/{kernel_sse42.cpp => kernel_sse41.cpp} (78%) create mode 100644 intern/cycles/util/simd.cpp rename intern/cycles/util/{transform_sse42.cpp => transform_sse41.cpp} (77%) delete mode 160000 lib/windows_arm64 delete mode 100644 release/datafiles/blender_icons16/icon16_internet.dat delete mode 100644 release/datafiles/blender_icons32/icon32_internet.dat delete mode 100644 release/datafiles/colormanagement/luts/pbrNeutral.cube delete mode 100644 release/datafiles/icons/ops.sculpt.lasso_hide.dat delete mode 100644 source/blender/animrig/ANIM_animation.hh delete mode 100644 source/blender/animrig/intern/animation.cc delete mode 100644 source/blender/asset_system/intern/asset_catalog_collection.cc delete mode 100644 source/blender/asset_system/intern/asset_catalog_collection.hh delete mode 100644 source/blender/asset_system/intern/asset_catalog_definition_file.cc delete mode 100644 source/blender/asset_system/intern/asset_catalog_definition_file.hh create mode 100644 source/blender/blenfont/intern/blf_util.cc rename source/blender/blenkernel/{BKE_anim_data.hh => BKE_anim_data.h} (54%) delete mode 100644 source/blender/blenkernel/BKE_animation.hh rename source/blender/blenkernel/{BKE_blender.hh => BKE_blender.h} (55%) delete mode 100644 source/blender/blenkernel/BKE_blender_cli_command.hh rename source/blender/blenkernel/{BKE_bpath.hh => BKE_bpath.h} (81%) create mode 100644 source/blender/blenkernel/BKE_cachefile.h delete mode 100644 source/blender/blenkernel/BKE_cachefile.hh rename source/blender/blenkernel/{BKE_callbacks.hh => BKE_callbacks.h} (79%) rename source/blender/blenkernel/{BKE_collection.hh => BKE_collection.h} (51%) rename source/blender/blenkernel/{BKE_duplilist.hh => BKE_duplilist.h} (62%) rename source/blender/blenkernel/{BKE_fcurve.hh => BKE_fcurve.h} (70%) rename source/blender/blenkernel/{BKE_global.hh => BKE_global.h} (94%) delete mode 100644 source/blender/blenkernel/BKE_grease_pencil_legacy_convert.hh create mode 100644 source/blender/blenkernel/BKE_mesh_boolean_convert.hh create mode 100644 source/blender/blenkernel/BKE_node.h rename source/blender/blenkernel/{BKE_report.hh => BKE_report.h} (97%) create mode 100644 source/blender/blenkernel/BKE_scene.h delete mode 100644 source/blender/blenkernel/BKE_scene.hh delete mode 100644 source/blender/blenkernel/BKE_scene_runtime.hh delete mode 100644 source/blender/blenkernel/BKE_wm_runtime.hh rename source/blender/blenkernel/{BKE_writemovie.hh => BKE_writeavi.h} (50%) delete mode 100644 source/blender/blenkernel/intern/animation.cc delete mode 100644 source/blender/blenkernel/intern/blender_cli_command.cc rename source/blender/{geometry/intern/mesh_boolean.cc => blenkernel/intern/mesh_boolean_convert.cc} (70%) delete mode 100644 source/blender/blenkernel/intern/wm_runtime.cc create mode 100644 source/blender/blenkernel/intern/writeavi.cc delete mode 100644 source/blender/blenkernel/intern/writemovie.cc delete mode 100644 source/blender/blenlib/BLI_index_mask_expression.hh create mode 100644 source/blender/blenlib/BLI_lasso_2d.h delete mode 100644 source/blender/blenlib/BLI_lasso_2d.hh delete mode 100644 source/blender/blenlib/BLI_linear_allocator_chunked_list.hh delete mode 100644 source/blender/blenlib/BLI_random_access_iterator_mixin.hh rename source/blender/blenlib/intern/{bitmap_draw_2d.cc => bitmap_draw_2d.c} (90%) create mode 100644 source/blender/blenlib/intern/convexhull_2d.c delete mode 100644 source/blender/blenlib/intern/convexhull_2d.cc delete mode 100644 source/blender/blenlib/intern/index_mask_expression.cc create mode 100644 source/blender/blenlib/intern/lasso_2d.c delete mode 100644 source/blender/blenlib/intern/lasso_2d.cc rename source/blender/blenlib/intern/{uvproject.cc => uvproject.c} (87%) delete mode 100644 source/blender/blenlib/tests/BLI_convexhull_2d_test.cc delete mode 100644 source/blender/blenlib/tests/BLI_index_mask_expression_test.cc delete mode 100644 source/blender/blenlib/tests/BLI_linear_allocator_chunked_list_test.cc delete mode 100644 source/blender/blenlib/tests/BLI_random_access_iterator_mixin_test.cc rename source/blender/blenloader/{BLO_readfile.hh => BLO_readfile.h} (75%) delete mode 100644 source/blender/blenloader/BLO_userdef_default.h rename source/blender/blentranslation/{BLT_lang.hh => BLT_lang.h} (88%) rename source/blender/blentranslation/{BLT_translation.hh => BLT_translation.h} (96%) delete mode 100644 source/blender/compositor/COM_profile.hh create mode 100644 source/blender/compositor/intern/COM_BufferOperation.cc create mode 100644 source/blender/compositor/intern/COM_BufferOperation.h create mode 100644 source/blender/compositor/intern/COM_ChunkOrder.cc create mode 100644 source/blender/compositor/intern/COM_ChunkOrder.h create mode 100644 source/blender/compositor/intern/COM_ChunkOrderHotspot.cc create mode 100644 source/blender/compositor/intern/COM_ChunkOrderHotspot.h create mode 100644 source/blender/compositor/intern/COM_ExecutionGroup.cc create mode 100644 source/blender/compositor/intern/COM_ExecutionGroup.h create mode 100644 source/blender/compositor/intern/COM_MemoryProxy.cc create mode 100644 source/blender/compositor/intern/COM_MemoryProxy.h create mode 100644 source/blender/compositor/intern/COM_OpenCLDevice.cc create mode 100644 source/blender/compositor/intern/COM_OpenCLDevice.h create mode 100644 source/blender/compositor/intern/COM_SingleThreadedOperation.cc create mode 100644 source/blender/compositor/intern/COM_SingleThreadedOperation.h create mode 100644 source/blender/compositor/intern/COM_TiledExecutionModel.cc create mode 100644 source/blender/compositor/intern/COM_TiledExecutionModel.h create mode 100644 source/blender/compositor/intern/COM_WorkPackage.cc delete mode 100644 source/blender/compositor/intern/COM_profile.cc create mode 100644 source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cc create mode 100644 source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cc create mode 100644 source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_GaussianXBlurOperation.cc create mode 100644 source/blender/compositor/operations/COM_GaussianXBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_GaussianYBlurOperation.cc create mode 100644 source/blender/compositor/operations/COM_GaussianYBlurOperation.h delete mode 100644 source/blender/compositor/operations/COM_GlareBloomOperation.cc delete mode 100644 source/blender/compositor/operations/COM_GlareBloomOperation.h create mode 100644 source/blender/compositor/operations/COM_OpenCLKernels.cl create mode 100644 source/blender/compositor/operations/COM_ReadBufferOperation.cc create mode 100644 source/blender/compositor/operations/COM_ReadBufferOperation.h create mode 100644 source/blender/compositor/operations/COM_WrapOperation.cc create mode 100644 source/blender/compositor/operations/COM_WrapOperation.h create mode 100644 source/blender/compositor/operations/COM_WriteBufferOperation.cc create mode 100644 source/blender/compositor/operations/COM_WriteBufferOperation.h rename source/blender/compositor/realtime_compositor/shaders/{compositor_glare_bloom_downsample.glsl => compositor_glare_fog_glow_downsample.glsl} (100%) rename source/blender/compositor/realtime_compositor/shaders/{compositor_glare_bloom_upsample.glsl => compositor_glare_fog_glow_upsample.glsl} (100%) delete mode 100644 source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_mask.glsl delete mode 100644 source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_motion_blur_mask.glsl create mode 100644 source/blender/compositor/realtime_compositor/shaders/infos/compositor_plane_deform_motion_blur_info.hh delete mode 100644 source/blender/depsgraph/intern/builder/pipeline_from_collection.cc delete mode 100644 source/blender/depsgraph/intern/builder/pipeline_from_collection.h delete mode 100644 source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_convolve_comp.glsl delete mode 100644 source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_mapping_lib.glsl create mode 100644 source/blender/draw/engines/gpencil/gpencil_antialiasing.hh create mode 100644 source/blender/draw/engines/gpencil/gpencil_engine.cc create mode 100644 source/blender/draw/engines/gpencil/gpencil_layer.hh create mode 100644 source/blender/draw/engines/gpencil/gpencil_light.hh create mode 100644 source/blender/draw/engines/gpencil/gpencil_material.hh create mode 100644 source/blender/draw/engines/gpencil/gpencil_object.hh create mode 100644 source/blender/draw/engines/gpencil/gpencil_shader.cc create mode 100644 source/blender/draw/engines/gpencil/gpencil_shader.hh create mode 100644 source/blender/draw/engines/gpencil/gpencil_vfx.hh create mode 100644 source/blender/draw/engines/gpencil/shaders/grease_pencil_depth_merge_vert.glsl create mode 100644 source/blender/draw/engines/gpencil/shaders/grease_pencil_frag.glsl create mode 100644 source/blender/draw/engines/gpencil/shaders/grease_pencil_vert.glsl delete mode 100644 source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos.cc create mode 100644 source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc delete mode 100644 source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vnor.cc create mode 100644 source/blender/editors/asset/intern/asset_library_reference.cc delete mode 100644 source/blender/editors/grease_pencil/intern/grease_pencil_undo.cc delete mode 100644 source/blender/editors/sculpt_paint/sculpt_detail_test.cc delete mode 100644 source/blender/editors/sculpt_paint/sculpt_gesture.cc delete mode 100644 source/blender/editors/sculpt_paint/sculpt_project.cc delete mode 100644 source/blender/editors/sculpt_paint/sculpt_trim.cc delete mode 100644 source/blender/editors/space_text/text_format_glsl.cc delete mode 100644 source/blender/geometry/GEO_extend_curves.hh delete mode 100644 source/blender/geometry/GEO_mesh_boolean.hh delete mode 100644 source/blender/geometry/intern/extend_curves.cc rename source/blender/gpu/{GPU_uniform_buffer.hh => GPU_uniform_buffer.h} (85%) delete mode 100644 source/blender/gpu/shaders/gpu_shader_index_2d_array_lines.glsl delete mode 100644 source/blender/gpu/shaders/gpu_shader_index_2d_array_points.glsl delete mode 100644 source/blender/gpu/shaders/gpu_shader_index_2d_array_tris.glsl delete mode 100644 source/blender/gpu/shaders/infos/gpu_shader_index_info.hh create mode 100644 source/blender/io/avi/AVI_avi.h create mode 100644 source/blender/io/avi/CMakeLists.txt create mode 100644 source/blender/io/avi/intern/avi.cc create mode 100644 source/blender/io/avi/intern/avi_codecs.cc create mode 100644 source/blender/io/avi/intern/avi_endian.cc create mode 100644 source/blender/io/avi/intern/avi_endian.h create mode 100644 source/blender/io/avi/intern/avi_intern.h create mode 100644 source/blender/io/avi/intern/avi_mjpeg.cc create mode 100644 source/blender/io/avi/intern/avi_mjpeg.h create mode 100644 source/blender/io/avi/intern/avi_options.cc create mode 100644 source/blender/io/avi/intern/avi_rgb.cc create mode 100644 source/blender/io/avi/intern/avi_rgb.h create mode 100644 source/blender/io/avi/intern/avi_rgb32.cc create mode 100644 source/blender/io/avi/intern/avi_rgb32.h delete mode 100644 source/blender/makesdna/DNA_anim_defaults.h delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_armature.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_array.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_dash.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_hook.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_length.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_outline.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_time.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc delete mode 100644 source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc delete mode 100644 source/blender/modifiers/intern/MOD_lineart.cc delete mode 100644 source/blender/nodes/function/nodes/node_fn_combine_transform.cc delete mode 100644 source/blender/nodes/function/nodes/node_fn_invert_matrix.cc delete mode 100644 source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc delete mode 100644 source/blender/nodes/function/nodes/node_fn_separate_transform.cc delete mode 100644 source/blender/nodes/function/nodes/node_fn_transform_direction.cc delete mode 100644 source/blender/nodes/function/nodes/node_fn_transform_point.cc delete mode 100644 source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc delete mode 100644 source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc delete mode 100644 source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc delete mode 100644 source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc delete mode 100644 source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc delete mode 100644 source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc delete mode 100644 source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc delete mode 100644 source/blender/python/intern/bpy_cli_command.cc delete mode 100644 source/blender/python/intern/bpy_cli_command.h delete mode 100644 source/creator/creator_cpu_check.cc delete mode 100644 tools/utils_ide/natvis/Blender.natvis 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" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @hA1Fz0O5v)VTb?!|L+LIm&oxOP@gRjzXW0@QuPm%UXVM1 lc0U4QQowCw{{c1H05MtqhM6;n%&-T#@hA1Fz0O5v)QH&G@|NsBD1LBk9gbPrgH4wi9VrNqIQ=%7S z7f}CWASM>vM0X!hBgo$%x7(x35z7babp_(rKx{{>9&~j;z3xDK8C`soPn&!S0Db?y At^fc4 diff --git a/release/datafiles/blender_icons16/icon16_bold.dat b/release/datafiles/blender_icons16/icon16_bold.dat index 5ca4263c7e2b4f948ea7a8cfda1274064beb5528..361199b7ac0131d86db0f015969232fabe2291f8 100644 GIT binary patch literal 1048 zcmb`F!3n}Z5Jg8T$UPA}#6GOUYPJv09yH_@D-bL3AP9omz~+zaz_R=aA_;sZ`TxHO zY*L9x1@+K&A+lSF1XT#LDaLq#yz7migIe#M9$5HKZ-@2Req;@FPMyx_d}EfWhj5kn z7we=fvaH}AtTV+UtDzxv4pY4Capn#F`cM7@wqdM#_P#vVK4j;<&$IHL@oBG}`@LlH m=O1|b-E0Tr;pOLkv@V;*J5&GLnsMeKzY_KXuZK3)n{$rQx^Vgc literal 1048 zcmd6kF$w}P5Jg8V1&N->M!bVq=nb^7PHW{!yn%>?g*OoK28)%AjTrw(vV6uw>@@H< zGk^ZeE?Flc4q8L~hRCQX;#J=Nl|l%6$gT>;1{!|)Ud&q-%=DAe8N}Z?1HS{!<5?%3 zab4mygIPE7H)gml@$h@lD)MJ$xF$YE-?j&wDKlJu!Ou8vYvSwsgXf?nq-$px?lDjQ yujX|QKi%Dx^R~|M@Y>J<(si^9_n4>mzryCBcQ@vIu14lyxC{C%G|1(D?L7fh_EF3L diff --git a/release/datafiles/blender_icons16/icon16_collapsemenu.dat b/release/datafiles/blender_icons16/icon16_collapsemenu.dat index 4d6206f0d5025be76ba7030ec579a1e0ef6cf022..9f774d7da4f5e18299925f0771aec5ea17a26448 100644 GIT binary patch literal 1048 zcmWe&U|R|9=h;ZzdA=4HtjI{6V7sdtv&93r(W` Khh6-W8;=0bNza}D diff --git a/release/datafiles/blender_icons16/icon16_export.dat b/release/datafiles/blender_icons16/icon16_export.dat index 2f6a4360a841067a06cfae6c9035e229568d15f9..14832a9545e66b96a075c578241717c0e26848cd 100644 GIT binary patch delta 130 zcmbQiF@s~n5+;@Z|NmbGV#kJt1_lrYvi~Eo9e~_RlLeUNC%FemDo>qU^eCiiQWfd`^gQ=F#xgrPm%xt delta 97 zcmbQiF@s~n5~j%pjO>zU|NsB*(9qDp0HpszX&WH(_~Zaa^~u`IBCIcfJeP?I8UjGt j0f=7$F$lbx?7*xuS%I0G6D0Zwh#e;%V2+r4f!PHBV&XUa diff --git a/release/datafiles/blender_icons16/icon16_file_parent.dat b/release/datafiles/blender_icons16/icon16_file_parent.dat index 23959ff3f797825d33b69da225b153b9ae0b4450..0c3d000f0a5da3d2182c145e6c2443922fcfcb0f 100644 GIT binary patch literal 1048 zcmWe&U|%>O{z28d7K3MXW7pgKDsehI`5 sKnwy_K>PxTU69q`V}sNJF~|%M0MX9))MJwa>H(SYoE*K_%%i0k0P#T6bN~PV diff --git a/release/datafiles/blender_icons16/icon16_file_refresh.dat b/release/datafiles/blender_icons16/icon16_file_refresh.dat index 39cb6ae5d698b56108a66fad30b21450b84c379f..1eb7d5fc0cabf01afd106af34b7300b6f13b5a91 100644 GIT binary patch literal 1048 zcmdVYv1$TA5P;#m3qec~t_TDVdo5E~hw}-70UJT^0b*|>To>>a43g&v5iEp2x@b}; zSBnABCjI%3+{i}s3avc&*qPaxm6i33F&?UpF$LF{8bT3JHlY!nIW=-OT>723kL~(({UE z-6xh$X3JVjTj}#L)*j*|cE73apZm(iqTS1pFZ5o-BjhwsTj>iR|F!*QI;7pSIoYE} zXJxhLJ<@Nq;Oskxy1YMmTS0Qxc0S4T?8$rY;{i9g#2sEB=NI*C;(znW85firc!&Jf RA3o8)aW zL)#Z1sBQc{l7owQl}tVOaF^$Ie-d(OrBoU>j#33zsatr$^ZuRh`|oh&UFgf`VF791 z7@=Z&SF#P_Xy6l%I1lzaW&D6STG*Xq?nP~l8m7pYnI2P5;RS77(>*m=zeGvb4)x?G zc*T{O^SpxD7G`danRJh#S&K4e?HN9ztT{H9{pA1Uj?J^>tnK6Ok9h1@$Ac|1YxaT5-H5VM?fO(ys3 VE0`zW-ob^Q&-e|Y^K}-r-vSxPHl6?g diff --git a/release/datafiles/blender_icons16/icon16_forward.dat b/release/datafiles/blender_icons16/icon16_forward.dat index 49d6cdf044939996525b6c63037e57920801268c..a7e6e403ebddfc4144d403bca81cc3398419312d 100644 GIT binary patch literal 1048 zcmWe&U|@hA1Fz0O5v)VUPd+|9=sPoyheoP_H!*zW`!q3e9*)3p0Rb m-U4D$z!P%(0kpsdh(UfJIV=ZCFUX%jyDtN=137*k?s@=U7R>tq delta 82 zcmbQiF@s~mpNR%89RL6SKLf;$6BR5bH!#^uG~fVIGAux$dy^kBYBN5bJb}@E@^L0Z d9-xpF5WfUsXP}@t>m?w|b+Z672jfHo4*=o>Djfg- diff --git a/release/datafiles/blender_icons16/icon16_import.dat b/release/datafiles/blender_icons16/icon16_import.dat index dfd917d8f84cac84a58acc62af62976fd8e54d21..f8b665f9d398975edcc59f64dc34424e562818b2 100644 GIT binary patch literal 1048 zcmWe&U|yN07PS$fvg^x4OD9j(*vYIz#52O0I@T&I&5s98n|AN zJdpn%N`uS*xdX2mK=}(mYzs3R$Oh|&nqddzo`=a1LnG@aMm@TkQT_jKqK65!`2d37 B?_&S} literal 1048 zcmWe&U|!h0WpYnM3%?L2CB7z>Tv?ne}UK*h+hCPhC8sC15|e! ri0wggKpLc<3B(8D3)s}-69ei2>&K@CpWLYa|2KePz=$u523igPx(Mr% diff --git a/release/datafiles/blender_icons16/icon16_internet.dat b/release/datafiles/blender_icons16/icon16_internet.dat deleted file mode 100644 index 7624bc8d32b556ddc8600595e39da5d2913450c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048 zcmb`_&npCR7{~GNN=ez87PaNaS*wP5-@Q*huG z9>ZVe?FP%Hh)8gTc`stwkH{@KcS0%U2H)1zy@NwuFm^rlaksG3>?UpvZ%D4IKJF1# zn%%^m!5u2sRUh{P3(aogHgIx1^>GLAfT{M}#9hO|_0-25Li?5@?YW7&hmGs0k2`^< N=6@5Xvp@Cg&JVYu+V21W literal 1048 zcmd6hAr8Vo5Jjh`235iZnsAYN6qcayC@!$)K;f(EQN06>pa=p(Z?HVXcNP7HFv-i$ zZ2p^U6%iHm&=e8dSw#Ah(%+DCzQNes-G6fA1-0v`k9&rLb~kZ1aB)5Lapy3=LT_&3 ycCd3j^>O#mYIhTN32!J}SAE=&va~ z{V{A)GwU(eZ}Fm!+KX1(O;zR~vrbs$H8_EB7P3I}HmPc)V*K W^hR)oiS=^pA9?8i-{s~n-M<6ti~o=S literal 1048 zcmd6h!3se^6owCLi$QrAmyl9QHc~u{raToE9>GqO1q%xsY^=w3>aK1xZq21keT(`3 z`OX<5A_f{Ik)$j#2dh~7Gn{j0(DQ^f3}W`-8JNNe7BMr_!L7p;qW+Q2nBlJq{Go<_ zFW^`4A0eNv3A+#dgnr}e$rHFiKhW#$BMh@WSsT>tdAbVu7!I(^_IfA3KaosE|7Co$5d0ii0)Z#n9D(?G6yn64X zuP^Fz{Ai9)Mo${4*HERkW-c#06u+D;sh{EJ|H%t&J$9cS6|wa%I(lf18eY(~Zq0Y( Z>}guS9p*XuRP!&dX5j7$ji;W zw~(eHl0rKX>D5FQ;1uU7#e1K@8g8KLZ2bn_CFC%NrZuNN{L>=aDw7LdvRmy4=dwH5 z2h_{vg1>_Nj*cw!#XEWed+5Y^JaadL1H64d^a)(xTgQs~Bj~?q#Qi#>jp0{^W;bw$ kPb+`zwwx&&!4>)zf9xSMEV6@Gx6I`9{ZG)f`2Xp70xB)>!Tj^sH!&912*9zet!$jrpZES(SZ&qAmqO{>w1hzCZXb|OtB5)wlA z3^B$Y$gAakkkodLTHY~N0dvl!=MsN+?vH+avjaMvU(TQ9x6MuHRt?&#?^ya3hePK7 nzw%Lk>c{+^QQD#XTIU^hWB%~|TBnbF+h58U@>*ur-0`L_F*Y95 literal 1048 zcmdT>+X;X$42-&fBRPlDbV>!k{8!Kcgn9)}YDlYpYT!t@N7F|wA~i4rO(D{jA}+wW z&%k>>0&xvIA4qB^M=kE~RlpW=VV&Zi`u>>5nMHq)$ diff --git a/release/datafiles/blender_icons16/icon16_solo_off.dat b/release/datafiles/blender_icons16/icon16_solo_off.dat index ab61d611fc3ca366a16348e350f20cbc7af37b81..94762e16af97e878d1d7543c535e9d5ba7db3e06 100644 GIT binary patch literal 1048 zcmb`FF>b;@5JlGrQgZ-kXh4wyJ)!Y6s8WR^geVbqNe|=>)Et1C7NIDqA}S&QXE1Nj zj)X?*t+4d;J^# zvq~n<{DDy*lW&nMw6|6KH#mE(1m@-4UP1oR6dtsP`wgt1sa~1V)9}3;?V*Cm;e9( literal 1048 zcmd7Mu}Z^G6vpw}q(w*_G6|g&E7T>UV;6DCBlsLeC}|;-4t)y2LI)kX)Hf(CqGPKd zMQ|vHln(6+#Q%kRAY77w;9%j$x%s|x)A&j$9~In}l)845inTcYHHAn>iwFls$7BoUK=$oP7h;Z6JmMWIOi;%Rp?y!D>B{)Rna-G3xHRW;&TF`` zpEc>ni0qE6hX*^CXF3laN%jnVzbctM=?*c%Q%1KTPyeQ}L->*| zIDbo*HR)Y^;sQ;4z{%Rp%h>PY7W#W{^7is_?$ofu9!Gh5MLGA{`1OAmz4NcTA6n-g AbN~PV diff --git a/release/datafiles/blender_icons16/icon16_solo_on.dat b/release/datafiles/blender_icons16/icon16_solo_on.dat index 5693c8942d79e33f5935f598b15224a79a304d1f..23322d239c25f62e3bd731631a7171fd863003b2 100644 GIT binary patch literal 1048 zcmb`9KMKMy6o*q0=gy8ISQkBj2zm`CH;>?;Lq{*5ckmR>-9>Z~=T=uy!TJUAAcQ7# zF!1qSet%x9l!~DZ`$(x-L#b4grhlU>%K|RYbMK-h#>-t#{`fiQ_kf9|PmQL%P=BWb z=6#q8n8V9xdTiycJMqR=&bN--p8P39aP<|@ZxBh|op^mXgYRiCspvJ)m+};$A5$qJSc%By`c?^@- zCUBCuckayx5*cG6h+!QVGYySN9cfw{thFOpLSMcY-XPx%*IG}Bl4PDVRrm`pxtv1 zTDZj9i+)J%QIgf{tKXM11@}H@uXtf@$Xt~spLqSGDy!}2_TUX4h_%c=kKO`^>Hk|D F{4d$nU}FFP diff --git a/release/datafiles/blender_icons16/icon16_sort_asc.dat b/release/datafiles/blender_icons16/icon16_sort_asc.dat index 35d5733eec90794e63ea758ec33a18ea69796bcf..1105a144216ac46f9df3f575a6f8ef4af621e67e 100644 GIT binary patch literal 1048 zcmWe&U|^`2YX^PC)zwM3d@HsNR=A8U#Qz(PjYE+Cud> z0%;Ji24avI&V<|nR0G!wQVZn&htfou0aShgi0xqZ!1P1SumkeX!{msek@XX!9$n3- Ven|YGhYPWMVEEl2R_#Ej0{}H7%0mDE literal 1048 zcmWe&U|^`2YX^c0l|9M3d@HpdNc5ehI`N0HSS)H3O*D z2CByiNP~ba5QEHcAjS-!y7Mr#K>9yO50G*O;)}%SM^*#Vk1R$CdsIIp{7DHjWVKWX LzdOk04K_9aPFTKv diff --git a/release/datafiles/blender_icons16/icon16_sort_desc.dat b/release/datafiles/blender_icons16/icon16_sort_desc.dat index 21b7438fd6dc9be386a710cbeca61907f4450bc7..c7e26940042a499180634a4bfce504c150db17e9 100644 GIT binary patch delta 119 zcmbQiF@s~mZpJ$k6>K*CC}8CH|Ns9bAatr;HzNt1~N82|thM~46a delta 94 zcmbQiF@s~mZpM2P6>K*CC}5ndz$`rRx1r4c|Nl<`v0Xz$0|Su$52YP}%(IgNnAI8W kCVyZOXLOwGz@*LV02F-%QUwGrCp$1(Gd=*4CKC-Z095KSe*gdg diff --git a/release/datafiles/blender_icons16/icon16_sortalpha.dat b/release/datafiles/blender_icons16/icon16_sortalpha.dat index eb6c1c1d343c8b090e34bc8da458ab45e3cdef30..55954aca0dc986db3bfa3b10b7c42e13c263e769 100644 GIT binary patch literal 1048 zcmcJLI|{-;6h%itK`R&Gud@)f)JhA>bk^buv`=B&fwoqzL~9H2Q!3n448iRVEA z!$Zh44jksqdG``X#TZk80yOf*Ou!d>|L??c9DzP}*Kbn{!E?>)9NiYYp{aMSZ@M!$ zL0NZjHz?X(-r|+p;&!%^8Fzr8?Rk%2uUrXtgsJii+*-K}Zf-l7aW#;C(N1^FRrq!4 zX~w<@dJrmi!F9!P_u!oFB@6mQ=|1TM1cGEJEE zJDZv1-1<7_e7|!V3!X8?gFN^-W5y5)VVHTMD0+c@m$bi~!!u0M?(02nYjB5w&Sb_P zpx|aQi?@!x4i9KrXDe{8eD9>(78i)4wqRp(`YY)7wt0LrVqq2cYx<#^C-v+XLH;LxTuVteI_GW)N2xkX PGjrF0AGFi#XJO|LA)yNn diff --git a/release/datafiles/blender_icons16/icon16_sortbyext.dat b/release/datafiles/blender_icons16/icon16_sortbyext.dat index 493aff4db491c8f7ac35d84745e501076cfd2a53..485e7b1a5346786ce02b6cb27a02c14f31f8d36d 100644 GIT binary patch literal 1048 zcmc(dKMKMy7)RruMW@aVu1>vyL+@Z+Jb`)$o8wq-;Gl~aDA-L=+`L760R!@pq!k1U zk0igmFKwD6N~r`!FzG6_0BzCwrx;^u7|V5S24|VeF^-0w0 zz|du}7H?@FehSYwX@h&k`}Vmstl9egzIFJRJ=ndk z;ox&Z8Ga7(|Ib4HXHK0x{~Kg3r{DVgaSJG2t!v44uyNy1i(~If=>FHCx_{*_c#*ATwwWZ*kTjPT~=9%bwL#|h3e=faP#q|H`Vb&QyUpi!W4hKKlud;nMalHzsF4H`zqNTTAE|s!BO{Rs9(aS_!j^G diff --git a/release/datafiles/blender_icons16/icon16_syntax_off.dat b/release/datafiles/blender_icons16/icon16_syntax_off.dat index a855bd37206cd26e0f9cbffcffd710a91eb6c6a3..141a8da2eba2e9e2f806b557776cd693db2269de 100644 GIT binary patch literal 1048 zcmb`Eu}T9$6h$WrS|r5i2lxZFv5+9x2qG4y^+NB9FVUMp zf4aZ>KFQ9(3+Qe_`+7M4v9BEY8(4)kxc07{{ic6NuL}pz8>7EL?+OO6K1RPrPxpR> U>R*^~& z5X|-)GPAk4K@YFX9fAD{W!q4a;Aqd`{y diff --git a/release/datafiles/blender_icons16/icon16_three_dots.dat b/release/datafiles/blender_icons16/icon16_three_dots.dat index fdec8949c8b768bf456703bd040ab60d8e28efcc..50999b091716234e4af1e036553b3db822993405 100644 GIT binary patch literal 1048 zcmWe&U|(N-4EjJiiiv@t0fZYGXomm)|K9?{pMkiU9DAU8fziq)5 ZE#&AQXgwfz1Mz71k(owE!;f&@1^|ibzSIB! literal 1048 zcmWe&U|(N-4EjJiiiv@t0fZYG1||Og|GyLv-vQ!#KrBP5JAry!ffxq7$k5LS z)SL;#*+9%hs(wn<1MTDm;uS!=6o|P=H4msK0El6L9RKqGH7^3<=_W+0=1F<}*`iF{o0K?tKoB#j- diff --git a/release/datafiles/blender_icons16/icon16_underline.dat b/release/datafiles/blender_icons16/icon16_underline.dat index becd066213f3cd4520d33b78f570e722434628f8..cd6f1b68cca771507f2e46a31af879bc215ece9b 100644 GIT binary patch literal 1048 zcmWe&U|~ke0@022g$#5SL+712tnMHaVCWP|YVGmW1(< oX`ndB9UqXz(Ahxw|L9`K{84$@gby%W(en;U9w8);97m+G0hf&dg#Z8m literal 1048 zcmWe&U|8_6o6*J5 z`9L*qftU}AxHwS!8M-(!A1KcP#J`cnU~GJH#Hbm}`hjl4mUgd!{Dn^r=I?=|0R_DS AG5`Po diff --git a/release/datafiles/blender_icons32/icon32_back.dat b/release/datafiles/blender_icons32/icon32_back.dat index 944b9a7f6626d446a50c58d7c0e4ed27d306dfa4..c10e10e2f6ed0c6750830bba034dd1513d676f6a 100644 GIT binary patch literal 4120 zcmY#jU|>)H;sz!Lh6)x2hAlwMzzXCyG>qcWFc?h(M5KZL|Nn~v@p&LVP49dIwficN z1_8R-542AVh%bXI27+rqEI}{-1MM2Mdo;}HRz3mK+gTu{H8_DQ{{SsMMQh7}<{!ah zzbH`t64VVhfV3nowX_lk+Bxb5V0|7eoY?L1Dzl^4V K(KJAA8UO%_n;V<} literal 4120 zcmeH~O$x#=5Jrch2dD~)i1wH+a~W@-;L?RI1pg2eLGdc_MY0kkStRLZ1|Fd_oj0T( zg*GD6fT=|09g!tSmuq7bJp;{vX5eoIthEE!!lLx|!n-f5t_~&r_-f~LV(J0oQhr?O zE_~+h-E!`G$W^OQeh^=C$?3a`@DJH{_cNSX`=Mu2-^V%nnW2~35$cD30#9&tg0^OO xeJ8N?$XbWyPJJKe6yAP@b?W{x{cz9V2Ai1uIriYLa`e@n`v0LB&7D=p diff --git a/release/datafiles/blender_icons32/icon32_bold.dat b/release/datafiles/blender_icons32/icon32_bold.dat index f5e056f874e586df8f90af841b6e77e55396da75..36e13d6afc42ea6b5c217388d6e914e9dfabd287 100644 GIT binary patch literal 4120 zcmeHKu}T9$5Zwe*s+HKL67^5SLTvpIJK+k;81fhXfFSt?yM)AEKR`5A3g;VeU@~rY zXLhd4)&JgT(-L(`*r`LEE-xzzg6VA0W(t5pY~u zUvNvbL0cPNSdD>!cOPq6>KBjRJ=9D7$#CbXfo5B|;OzmIz_ZFh*TQ^1C~j-j=Q!~9 z0lkM2`*U-xKIKOas)HP}oG$w%iEKXZnL(p#A;-IwFG*xuc`^<(t-q4~l--fOuKzrx zDSfs2;M4uLRCy*+BV{X|x&Gko0vEtS<)G*9D5WWVirdBVR_4#yT?mRC_ptjpP3afh z8uJt6YoI4{TkIOqU+xt1p+zeeqxEAkbPREu`u!Vx2b*}g<5qpngZNm#zhS?3_Uco9 zaCE*6&^4T&zvARUdJwet#l!dTgy< zur|NzV*4u4lN9QG?r(m%5AaL=Kfb}6)N0c{kmDS91#)ABfH^P*PUSgl?fk#}51PJ| Ac>n+a literal 4120 zcmeH~y-EW?6op5L2tl#1wAo4_rG<@eAQpm+L{Mz<0(LfTFIHAQfCx4=cD{m*h@g#y z;13Z*NstKQ`fYc)$tH7WwvxSY;7<13^UW?pvPqnC32KfxmySDkQDZSdpQe?nXHa+s zvMgIc4`@_NjUwTyzbja@TV2O6?FrKNFSAGWT?~npDg6=rA7(dY rR%lO78(HcJ^J*wh&ykhC%RCR+z!%pZ(K*^drM!3ReN^lJ`9Jv&(su<8 diff --git a/release/datafiles/blender_icons32/icon32_collapsemenu.dat b/release/datafiles/blender_icons32/icon32_collapsemenu.dat index 92d7838bb65ae88b77bd184710357aa471cfb3d6..2ef8fbcd63c6cdb4603b83736f6a31281be8711c 100644 GIT binary patch literal 4120 zcmY#jU|>)H;(tsG3|v5Z3k#57WngG%Xc)z#VZiYJ|9?Lqeged_1|U0p(bFAJ>?N%& zMl%1!Ahh2f=)R{&Zlo0xWQQNR|3~?w<={w81E4$s#G~aOtx6qKbFr1bqvhXdJA`2* Ymq7#R_tEliz}ugr<=<%eNB8m%0NO1&w*UYD literal 4120 zcmY#jU|>)H;(tsG3|v5Z3k#57WngG%Xc)z#VKABoplRU$|NkvOyqN}g6VS{oLir7- zrjG`8!~9c3$o^6J(eiL4rvYHz>!D%(Db0=a2}zs1*++yq5b)U>>rgM&HtlmVC19$0Qh%0*Z=?k diff --git a/release/datafiles/blender_icons32/icon32_export.dat b/release/datafiles/blender_icons32/icon32_export.dat index 453ea86d012ad395176e893d934389fc11816ca0..89e764da3dfef927153ad888392a8be0af871184 100644 GIT binary patch literal 4120 zcmeHJNe;p=49o$Zz;^2+LBOrw;2%5!Q6VG{%YnayF~lesjDt#gK&>=NZD(d26IB$> zxdONVvyO91z;&G~%d!P#;Ju#!i_92n^Um!1IG5$G)$8W@e436`*LbOUOW&%e`e^$s zeXFkNrsgeut1f-8e+{f;UW+Y#)Mvm{dn1sJ;eUGyg&88{=)l& zxYo?sQ?AgBe+#}})CRxPUFk{QFJsXIdGnL)+_HZd#&aP5#=NqG+%9w2`M5T6EOvB@sn%A7(#)_x#fGEu=} z@&+z$-76rehK2?P5C*cr0EsUQ6gUSJz6jD}z|F6D9Vj4yt^p_}2*e<}K;RY-OHVG~ ziB<%w28%%mQ6O~@%D)MufvR}JRmFg;%TQ4m4dTMsAX6kKD#U;s0I~-TZU9+Q6BSZG i5}Y7Wu*%5^eEGZ}GtU6=Q6LuE{D9Abaq|a07DfO;<JT?(4crQ#H~}v`xFHkcddx9pvU-op(>-pUNAN~&GsA_8f literal 4120 zcmeH~y9&ZE6hPx^_ce$v?*4+CyIDh z2pb^o6Lg>kxi?8g;2+_VXxrurGam2Jw`*MqGu~zl-o({?w#gHAtn<72yY=T+z}JDt_~Gk^4la#oyBjCw;Y$v^>MW1zpn$`TSQ*- nSM$dhoWs}LW=_mO{tH=?YlyYx#u;q!$~}+>o_GEK{Eof=hyhh7 diff --git a/release/datafiles/blender_icons32/icon32_file_refresh.dat b/release/datafiles/blender_icons32/icon32_file_refresh.dat index 4fa387bb789952fe2bf34391f51e7bf82be8c700..71d3fb5b8009c8a7cf6b314bac57ce63b176bc29 100644 GIT binary patch literal 4120 zcmeH}J!=&~6o$uqNQx+mB!V_6EDS_~m4%h9g|V>^tkNi=qNt#Sa4iKZe}jb|l@LWp zkq{&?5evUT5fMSKPz=&G>nnNtAkADarfb0#7SJjC5$yeQTAbr`<;JP>)1czvi38^o5MMOJEq1ZkZCU+?~iezPrq?(tyP-v0%S+Z>t|fn zw`bnSz5|^DxjO3z{HE{2S>xLN8T2Bc^E|(TzOAFGoh{FAqL0v0l~}~T)P!cYM)$wJ zsWZSCosXQ;D%V_7x>g6F`&D8wzs<9j9DRQa&||))T51l%6DTaKP2i;uPK2@5jHy}H zF4hp%B=5M_*B!1ejQ`6xqOG;$7S_Y5d(NwNG$XvaZ<9LuAGQ6e9ac?WUji%#+*i<1YQfumke@6RpmS?%e0W_N+Ue z)*tSyq zu`!esqHH8W%J;|X_rLQzx=rVO-*YuJ(LD9*oO|B?^Z%dw-uK>nx-AAa??K42>?S;bw%9Yl`Yh;y^Y9dYfa*0|g}tyS)|;|M?^jTbYu5969vp|C zkW$wWEo=5jnbY&d%*RU4ybX51H(S^K&cP;F09DgXW4;;=!CO%Mf+H{?CEI*Fzn#7+ z^nurDCUeWY(2R$j@D5Z1Fr%!`@;^5^vP}6$ZLas+ozmZ|p=S=<0hOMqj^^vJIU3L3 zswPVJaC1zXvPSPDxB;p&Wj$y-|4pMK%MO?IlwHSXI=nK!4Mlo1pG>FWJ#-f7Q?KE( zMTXRUh<>-_#kJ;q>0>pJn(I1DYVg9$mizk9k?S8#Q#9Nj+L!Vg!~JG@AVoji8nRbf z{@vmBPVpnV1N43R0J+aVir4?D;l8{C)y$E2kL30%oLVtL`MU?>vps*4Pp|*hnoaId ziTR^mY#omnTYg6A(f@u*jfv%Jjpkcsur^QA$~s-Tkfbx!ikZsvYoEX&t#)k9F}+%wrdQ%8Dw zz|U=GnODHikA?ZlKsy_rfa)1+gxt@~_l0I5Tm&!8+s)JSYpyRE>C>}w!HpQ7!#-FA z+TT>@ge9;Yu7Ka;@630>pFK18&mt+`_eS4(@Xv#3VJY_*%=dmDS@XR$?uW0Zj`S~u hUbqbUt=3sv+=COa4RX&+TK^|^-EZuLY0Urt diff --git a/release/datafiles/blender_icons32/icon32_forward.dat b/release/datafiles/blender_icons32/icon32_forward.dat index 0dd7aeaaf8dda6559c6382d928e131cbff10d345..3bda513a16447bb25aa55e4b36305fb3acccb6d3 100644 GIT binary patch literal 4120 zcmeH~u?oU47=#be2XIiZQy`5wW}PFqn_5F7FFG3yz$uv^xcP2mh2w#aVI>@XQf zA*q0QOPaN%C8#5nW$Abgya&7oe$oRWgasU7*u-qXy90|0WX}QT0M1}>g;DN0;Pf2$ zp1-LBXEsn*oMOFzcw3j8_eTA({8FCd>x0b#iyMqn&R5xss|N?LXu`dJsl%N$=e@i5 pKHZZlbxb{rd;PxmgEgz$a>cmbsu5^A>_G{J)j4B75vXEy0h zj4=~n4J>-bYyi_YrmCt8yn(fL2CNceD!q4N-`Bk~e~JG#&-asbG+wF;&1?D^AL=8W z)ATi7(hbdP`Wo;1;A{z897>;)Voe|X0+>tnoX43Fa0PhX5saCacAQxPs=icDdDJ(( zk*Zfv4_(?C2N!zt+tbdT-A)_F#0C8e&8x{n*S|OU4FO&Q1V{G~{T-nD=1u*vxr>wZ zAbB_aQ}oc~-R2*=2l(?`(O!_g59I3Q=O{+90J!$lJDw3+88Qs=5K#;_67SB{O4fbu~RKympXWx@BZNT8Tbb7 zoPd@0to_8Ecj1<5;oH%6J;bAafqx9vz#V@-iC3G4ukx(c&wLX5h}HVxJ`-YbFRNJB z*TQ)VolpnbSPsdVxeo8Y@Gl68hd2NL diff --git a/release/datafiles/blender_icons32/icon32_internet.dat b/release/datafiles/blender_icons32/icon32_internet.dat deleted file mode 100644 index 76556b8bacc7037bc5c84a040b57f85de25a4170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4120 zcmeH}S%{8N7{}jXMk8x3#*$@ZT(}@*E0jbixlxLgwUh`Y7aB1{vR%1ATqqZoaAC=k zBBdFL5E0ozmNfQt@cR8f&odoo-cR3{x%AZUJLf$A=XuWg&byuRBuUC)Mav|qC{B`N zkd!1zRaMo03fO}*O-o=RY=_J63Vy;5cn()#7fgfJ&9$%8Du(&+1PZk`1g?a(O<4!| zeW3>2zR@`j56rQjcB}P2&~ApiHdb>FhW^VM$QusYW7!wj0G(h6_?~y9-wJMkY!MW} zRCo-s&oH?$Yao6Qya(A8=;QhHFUX0_4t!&OyV8fWE#;?e1G~-topz$f|E(piGd#1r z6SVC-p1$@(rhP4Tzgosxr)-@2>1!|6%Za^%0j}k1i8-oZO!Z2`IL139U`s>4`uG;) z6rPU^P0xkw5tPNckI^P52zv_^?pMoL|K%y@+IJ5%(|h5UY42KuI%8dn+aTK*YGEJk zVlE<0b)VNpyf&?=jp{UbF7XX)YT-uYPYM6G`sA*#{JpVe`bN{&W$96kU0E^Yudy0C zVjcfU)8@vS)jnwYk}Ta~=2^^tpmO7E|rMutn=? zdTr=eAHUyUy<^REeRE`a-(_e%|D8NFN^=!{|CEF=xb$qv%0s{R@%#H_s{7)W7`=C8 zH)Bm>{4GGwZ(Xb_2V}!y&2oMJ>)*R^9J#Y{71H!ltXYjNrf2Q{KGWvp$vtFxWtMLB z7hBBHtQfSBrk{^>{7X#R7i(5~lj+;CbcCEBAVargO?e zkj;qoaE!h;7nP>xXj?_vPSYA(U;H{B$(DyX>f`g8`o3lUch5mD17EA2iTX9r9|1D$ zXZ_iLzRqATpbmO?Et`8SKACd<_@;+(VV}7Ep!16CEOc|7zJH?^20lM~91MKziS={G z7y9E}E2Je}XFz`^>V8-TsyP~TopmpCFkaHi27~UCnc(+|a>o=hXBjOV~$zao3^<8JpJ&gXDh*lVVgnq;>~sjQ`RHq4hgpUZL(yMvr_L2gN} z&t*UE5w!B}dc~=~?uYO7u(`f$t|_lhxsQEf{*Kb|dSfq`|H|6%>XiGqf4|LjrQ`L+ zU$Z;7XDz%s)jsA3d9fK5RZi3wd)xfes7`f;JxM;vH)*Mys4wmjsh<6)PIZPm*VS`= zXB|^HQD59En_)AmQ=MV2nE%LHQ#oE=%pvk*Gc0>`%6;s%`4>vZ>y155K5T|ruTHs- zePI5f((!s@&yXL|AroGmav%4cRL_>u@p|Jfb@iN|S?gY%Y9F)u-}qoNtg4)-FZPD{ qH&LDH411Kk*$ne4C+ds6XZ~?ir#i!)Hov1Xs=gS5_oRRF-uw&M%tSQ+ literal 4120 zcmeI!AxHyp6vy%ZjmeT=5X5$iHnYuaT-7Gnv>Gp1Y-Z!CYujW+VGK5#Vlvt+T1+C! z-|ysSaxWa*+rQkwkJ}!P_j&v|cFRKuIXTNhC>kLQntWN|b5Yc(&*0xP5MvyZve&e# z=LvXH7N`HND&Lxe@vgl#tsc)h_O<*&Psf^#eI&nc^?25?H^?{nAgi91H5+$E=2yq+ z@vP&X{^~JyJsoQ{_LlrN?oF%DvyS_u9d)H;#Eux42xJ87`6a011keVLqo$TMhb)f|Nox^Vp@TNgu)wW@o8FF4m9^L zA^S(VJTQ!C8UK3;g)fcce?KAnN4orI{EyZLBRvm{`hVo+fzk4BNbng8(0M)|GB@NU7*G+eE!uv|2%)spFN=U|MC6T&|lZe`}P5c8mJ)v diff --git a/release/datafiles/blender_icons32/icon32_loop_back.dat b/release/datafiles/blender_icons32/icon32_loop_back.dat index a1a30fcf3b7ba9dbcfb2d60bdaa89b10f3bd28d9..47f7d49e69bffb60737f0f1220ac6fbf6a313766 100644 GIT binary patch literal 4120 zcmeH~OHRWu5QeQl+3?s=!LECH2)Fian#K`}jP%KgJu|;Ou@j|bjA=nTGNwCg%mtW+F>xH%Oi=@C?KQae!ObI_ zLI)ZlYfSzd$g*b!H$%?B&5hOqwBZOIKKK4Sari`iWl~Wyx88e3#)aiFu-3&7{QYe*D~Z%lex-R-`3f&Y#vX^Zb>qE%PPk9*Dhw_x;0Isq0R(*U9?@Vq3oYF;=QJ z`6Ac_)$WJZMr$5qpC5qkT`p}Oyx(8Oz|DXR0QtHJ8 literal 4120 zcmeH~yGjE=6ow}^3p+1(ZPE&Y`U+NQymUT;g^h}&ODcT{K|5bSu(lBuZzSIJ5!B8? z1=sJ_T^I&-vq{*+Vh?;|X3zQOpUe!iN!b`vhRM7!)uJ)`U`oc+>-CHd*1+?;Be3I* z&Nb}70u+;4TgJ}81w_Ry$x2dlaL2`~52j!P?m_VlHORU3N%rw8!YX`$qL!pz*x2}1 z;1jeCsqKY5AAHw9aRUWAmqr`U5mN2=C(rTC=J0nG{=+&9 evmg5Hq&V(mKfBf7t2vyAZpX^>+5cVp4EzB1>WcFK diff --git a/release/datafiles/blender_icons32/icon32_loop_forwards.dat b/release/datafiles/blender_icons32/icon32_loop_forwards.dat index 7f3520d0dbe4ee9ae81f1a2c47b5318acd9a883c..2df47306a0d2228612cf5b81aa59bb3d4794d414 100644 GIT binary patch literal 4120 zcmeH~OG?B*5Qdx4aicCBbT{kq5PAd^nJWwmK9(-C6wl$~0v~#gcSUw)2XVj(&@)c-x$+J!;Ucr)5e@5(={eZl2#RCkfv!DZK7lJgg#Nx zE@O=!kTvvLggM$*q4_X6=&-<%W5Z^Y>iOWB0*+$@zoWELVQmc5jKk#wz$9`TNhi zp8NKZ;~L$fo^Oo&@DDQnAV8yD&d_X5@a{Sk`)-}3wbme$2X literal 4120 zcmeH~O)CXa7=X_mE|;R%upqNh7XE?qBg75akOi`^w4A-fpRmA|Y*w-Br zfCqSoU|f{7j!0(UIVg+hUl#4h(E&RF*FF6$n1sHfec}0V?1IEMtbr9CQ`R=FS&;aG z>9Rag^Wy6U7bI4r#+11a=VH_Bd3UtN)?A+x&LiKyq4$|=aliWhag$!{!u{#{d-Oh2 zE#3;qHU9%OQ{JElZ>!h;m>MM3gLNh8lViaZoI`(-obVX(mO$bbD&gaC+l;S*epg)6 zPhA5!HFyJw=Ph1&ORR%>Sh~?}e!-PuxCoZE*cLvevNg=ga-D0;!&bjL%gA z`SSkV104-In=k>rap$j(F)mjPG7odq!G$8?RM(cKMJ(^c1vrE!_<$^Nmd2ZRECr6j zi(jbR&jWeqOq!2t1oX2&+=EGT^Nzzc438io-w`I=L-^zyT|({|lWuwb%XhMb(cfEs XGo14N7XJ+xJMX;LOFO@H|G|F&sPvC} diff --git a/release/datafiles/blender_icons32/icon32_small_caps.dat b/release/datafiles/blender_icons32/icon32_small_caps.dat index 0b8ef5893e170b3ab44ec44b6e428da733786ba5..e0eebaf6b9e6c02ac70d36680359fd8bfb3025ba 100644 GIT binary patch literal 4120 zcmeHINe;p=40KWXN1xh9aYu*~%LDiehcG}bIU!DL0;eXD71#F6q;Bg@L^Q!}1JS%8 z+Ksr_!k_1ENe@B@1MCc|t%K|ziZxtRCowsH;knktkv~d&0T0|7W^9ek9+)>W853d{g?2}qwO{R*1V?6@mBsC lo^`anhHuSlx*Qk$aGREEuCxAghw3+TJUy&yu1o#3`VV$VCC2~& literal 4120 zcmeHKOA5j;5KYA%z#Dkf9!kZnAa2E-r|hm)&#=IntxDae$n91aQLJA>Wh7gvB za~Hxe3t=_Kq(?mrQ~c-|jN`b-1^ad}hv8Ts{0?zKl*Ykp0L*xAIL~1R)2l9M0BMyzy98^;A6bwZ5vS;?0L;RZqn;U+b%SD&Blp zR`pao^R>RJr{c|rWmQkbGhgfH^su%^Yz=$QD&BKbHPic6KjrCr6+VDSqv{^DJwTb> zzgRm;&QI{(v}T*xO+&iZqCM2Sw@aIo-`Rc-Q~iJc!Z+`H4dVa+ diff --git a/release/datafiles/blender_icons32/icon32_solo_off.dat b/release/datafiles/blender_icons32/icon32_solo_off.dat index d4fdf4d15707eb70ce23e5ee8755f80b5c26ed1b..bbbcddabe25684c9fa4039c18650f837ea456767 100644 GIT binary patch literal 4120 zcmeH~yK59t7{w=K*LP4XgrLZR*odN7*qA@SN18|!(LSP$76BC$w$j+IilBvp78Y6< z3m?Hq6tz(Z0h=^7zAbzkFh=08BGB4g~6Xvmx z{MG8)8O>l*>D+$uCh*$&F>)>RVYVDRGtN757dT-3jga4} zN4M9sBjQr80D1q--h;V5-z%V){(RIAniJ>tcy4M&w-D&w`weQ+kvqUmp!g1UgC5}j zK6j{>77tAZw`YW zK=Bgv#JKqxoTcC#@bQ#lW1dr_M!Oa~@@C|#U|GzAc`tYm6kot0&>rI!naRVv*BtKMfP(9=x`QzK!{CqKAvM=iM3mPGpxql`MglGS&XU7KH|CU_wzN*0+J6rGPWn^}Y*`6)lpMI;&p8Hu@nLWpC z*G0dB{*uj(`B_<+J*$A;D?WkwU>^7g6sybHoA+hUljb((c9M5l{W#Alvu2-u8x_~U z^=9SV!7_K|z1i0ZegQpS1l65+PT4j4hJcT|W$z39S*&+Mz1s@g!}Hlb?f?2eL-l;` literal 4120 zcmeH~!AliU6o*I4%1|R(X#|f7+LW%^wQVJV3PNJFk+y|F1hw$(qQAg})J{^gRS5+Z zA?Bu~K~mJhphbibYDQGI@AtSzF2kEQGr^@6@4&}B_uSt(=goa{XWpwMNm7CRFtjU4 z9__|yOOk4}+N8M$|J^;{oNIw4Sci{r6ZYiYuhPH`SOeuQLTg@LdYzn3NZTrbvuUl( zwFc6p?VxFjjudEz-|z#@!+S8B#W`%X@Q=WpEi!%p<$U+CF4LA7$<^M;E`mN!6}CaP z0ovzVun97)Nh9qj$X=G|8EVPBT&v*R6N@uH1`9qO4iA|e4RlZa;+VzCj^rNzUDHq4 z*>BZhJ^(M^IrN9MnOEQ!XkR+RwX#0>Ga$QOG#9PD1KGWzIaxYt^w%mm_c}`x#?k8B z+P!)vT>BfJTI0UIhMv3{XifzBD|z~?b!zDR+up0>6traNEsmxY?txhFV9|ud5Cr9Y@ZwDJ`3~8 z`V{VfufD-)%V)0lp6oO1wRnt?`jcve?L6D?AJihw-Hy>StVy3<-|HLWA?OCZqxG&n z9%^Ix^jQYkHJFftJ&x5cU6)>Zw#eRrew)dL(z;l4dhLTRYU=G1V_U3#_3F~^jx}eT asHce;qo@7G8o`fx=3-t)v-ZFJ|NRH^@&?lY diff --git a/release/datafiles/blender_icons32/icon32_solo_on.dat b/release/datafiles/blender_icons32/icon32_solo_on.dat index 65776b0c7283fee56c2714157c1df0df40c4dbf1..eb8da52f0bb572fc7a5097bcfe15af91b7a27a61 100644 GIT binary patch literal 4120 zcmeH}J4*vW6onUJEL0RM1W6MRYc0gaf1oyz6rz1vEi4sM#$FV`RtsBGiK&91m5pF+ zqlH?DO28PuD_Jr->}Ka-0)iI~J9p+hE=kx-J_v$5m;)=BAgB(o$Ob{VT>eMQXV7Z3 z>OkrhY}tNJqG@Y+v}z7|(W!MrlTGu1lL33GkaaUnr=O!~Xdcp@gE5^O_Hx$d@Q73+ zP+XS^{Ce)4$7Kh-t3MLwnN2*YxOE^|VjmMU>S?=1 zf8ZL9Zr?Uf=i^cG$S>)BrahTMpaMQU^1sj?f>G04;lW=7_u#kc0i#0N3~-3x2cAFxql?povDv2kKmo8aQ3%deNA;_OaXbX#?`c`j}MRF>zME>A5R-C*_$!> t8#W$3T(T#D`oGwu&-r-TYRRjCur6%%zI=k^ZYcL&f%6^DcaFcV{|3yO^-2H$ literal 4120 zcmeH~J4*vW6op6QGeIPX*rpV;u<$&V_XYM`c+|5olNlge*1EXNFB*bnTLAww^5ELlhgMW7h z!Z2(B7eI~|PzPn(d8MWT*1#)}pheFQqd zmnjsjx0w4Cmv{hdM>%u)WFxhIbUnwWn6|znUI2^WLEAUO1J!5R8KEUp%ws*D)>qZz zRRtd&o{I8L(5v)(X83zb%wyj1@zgnZ&U*MN%9O5^Hb$fb)|HsYyb8zn?DxSv^zbw( z`)pLxTs!q6Kt5~o8kYzSyYxWa40y}SSkrkTo=EC}yu9C8K5v>`YITL1t6 diff --git a/release/datafiles/blender_icons32/icon32_sort_asc.dat b/release/datafiles/blender_icons32/icon32_sort_asc.dat index 42df075188c7e313affd71d22f1a1eeddbc9a3ee..aac1a301eaa635864cecb786ca06faf2644d5c38 100644 GIT binary patch literal 4120 zcmeHJK?(vf49r0vAS<$X+DG^}kA0LM5K%9J3WENoPIeopwJTEEUN(WDX+kpDX%5>F zQ3q^*?Tly#(45E^qfiZ!cEDQO0(XbD<}QJA1v~(;7o2sC8Nd^ASDOJutohRs-h>#Z z_?#>97U=7LH}fq4u?3uqyJUY0^!?)Iw-$2e7nxyDzswZ%cmp_r5fcCa literal 4120 zcmeHKI}XAy3^fQ&0Hp$!9)iO$_E23}n1F$wK)`9jbL&(Eff|vdEROUV$4UI0r?)gC zq6}C7%K=dV(2yw4bA@W~lLw4339uC;U3y8l&zS8vAsBbj19W!6F?J7c+*eDC z*~SONqZm2}H|xyf4ou6a`b;ogWF5Q*)Md?IxcQC3XCzLsj-mtVvd?*N{nYAPX7FjO zXIMTYzqWbb8TATa57gXTQ+R5A$<2|!0V`kLw)>y>rH4NDdTsZ8_rLM`)^)wF{FMT( kdWAlx`m6q|KxkjN)>Hqf|NiX19r!n{e${jOzuWY{6R&pa?*IS* diff --git a/release/datafiles/blender_icons32/icon32_sort_desc.dat b/release/datafiles/blender_icons32/icon32_sort_desc.dat index 5022d7eaa270880725bafe419fb301e57d97e5c5..73710eaecd279b2f88e068f21230b18109ada18f 100644 GIT binary patch delta 170 zcmbQCFhgNOG!yHo|NsA=*qp$0gN+BsIt#?-fmnQ^g2?0>Ofr)lxY=1j0;eY`SO|b< zAO?Y}KrBA_1d|3x#pL%~9E>0plLL79S#JQPBq#fDDNj!4_C*r8z$Fb72}KeK;V$MC e1**OT#2|2E@)hoKRKVm0U*Pdz1_0fERgVAw diff --git a/release/datafiles/blender_icons32/icon32_sortalpha.dat b/release/datafiles/blender_icons32/icon32_sortalpha.dat index 8c7b8596dbdf854d923c4d0d3dda4526309a154d..24a8f7c42290f3bc4c0ebf015f2877049490bd90 100644 GIT binary patch literal 4120 zcmeH~y-!p@6vZFvS|~P%1qI1QqJ^cX1+7AY1r1_FgN4Resk9{P#~(mY{{XeHm4G%h z%8J^m6jmmFR2CW|L?e*(clBH|S$395oYyhQ**kOYnR8~p-rKDfMNtKNz{swmmA7|-pW;z#x+<$tFhN!;@cZ9PS68nkWo^zQ;2Z^6E; ze9^3$n9-AjFcqnnlXymPUN?t-)rV;bYp90uQ{y|{(;oOF-c z>E!F*vxx-lS^55=4#f2I_JcKGpWW#DMXwY50PEmD%rE58%>Wx8KzG;+=k%VMh%pxO z;hdg7pC=*TZqA+xu+OWF1+cS~9{!366369M9x)EjUSQW|8&j=x@YO%vw16J_;;}WsNPZMb63j*@0D}R{aGIuXJ`0#F7M~8_}^024fkbzQ{0SmWmR%cDeH}A zu=Z>DN$1L{WZCuNi_UO}+Nb$fYNf2)(3hP1%DhUQ)cjtkDRWNV8D%a~>za?2nHhSM q=l7Wn<_5dxbcUL;=j6=;A9H2rHTx5M8rbh5!*Fwdd;S0a-G2j9wGnXu literal 4120 zcmeH}y)Oh|5Qmp@gb=0TM6Qr1HB>qhg^xQzp{Gz2E%yhY)DS%l@ex62lrEx`D~KRb z2+74)ko64nik$rtyN%o=zs$Qc&&=%YzPo!#%d(QF3Z=>{YXezv%gSUjMHR2XpZ9=m z+q)>J?S#GWf(}+L8^Qbs?cEc0?;!n{J)!gO@ohnB!e*E|t>qV{_J)&FW`J41y8{w{z*qqyZWfwj%d%%q&Kd8*S8&epEZ$){nn=H(mWAYu!1aa-A zE{LaLCwkV#qfRyCO3{TfUhayd>%Da9Eir0_v}xXhnN_B@kRhJZ+>Ar+H{UsFJ~Fl!c7MNq3{E5Y9*NR^d@&#Gd*MG`-*<8i<5B21$~P!3}6>*GjnH z7Tjy+l=0Ab1QLg39DiK6=?v!jxvG71cC6ML?MiGuoMrH8=j_J#nmk(PR_`Rnhj(hZ zgBVwvM{gCpgHNzkHjmu8<$TbtmGOQuj@~hlxB_#&hKzwrAkp*l)ArF^1WzJP?E89* zb<#|dywEQB`8xXO9$1fO*MsW?klkCS4zD5&Jlr)t$~cVofW!!Vdo~%bju!n5Ap0=g zW3;NhS%-I~f#(^J=z~Fe#e0|Kf4jxctubP+s!gH$LPOrGref&d3&z(?nd39^{j2nu zU;Fx3^v`QN_tNP8!*8O-({Jqk!^^Edd5vd0cs5j7+YlF@!Wz$b@N5WaYIAr5YdrbF zvq7sLWs)gFU4aW-hQH5_!+?-<t*22cZUM%br5k=HOuo4SVM8r}NQ5!)7 zgZ>5|h2jGnU-)7@H_phiWTT0bG|7d-%-nnT`*tS-yNN2LqRaLkoIwIYh4TN4 z5BF0B+pq=Ye%DZoz%I=B_2iNlPdEjMAwLajvX2r;zn)z4X!fR*9p{O$$*V)I4c_1r zy1jK9YjoE@V#}?^T7I8HDG;;nn$0=d4R9|eM4!=SKAg&YpW$kg&&P<*p!T|Dtc6B+ z0Et*WJl&dj1Yl3hhy~b4%^YXN-Ivcfel75#ePy_VdYhi;9f`1|Sk30%@RU71vE(f> z>)H7K){9;-(SS9`M}JzKgE;a;9r+)$r@r-tx?K5QRsb>#^mNP6v+~xYS+) zrib;2&dK|;%H(a2XwPe(ea3*%XC4G|UZ+gn=7@e5$h+kgTD{uj+Tk5Opu=1L?;6b{ kNF@BUsF`os1HYbJ^Jts19`VzlrxK1~$*-rBFYf=pUz&!dhyVZp diff --git a/release/datafiles/blender_icons32/icon32_syntax_off.dat b/release/datafiles/blender_icons32/icon32_syntax_off.dat index 3245aab9d6adc7110d83b78516df0f0d2a89111f..2a2a16835c76f6b61bc3b25a5614cfac44b26e6b 100644 GIT binary patch literal 4120 zcmeHKJ!lkR6#R0@5eNkBRDy6|l|l;zAqZNC0sjz$q|ibe8w)KYK}7Hbu}}~}&_WBf zNRvW~Ac!Q0qCvD2L{Jb5QLr%np+Q{doipL{`R(rMZJC9Sd2eRkJa)P4q7%^b?Z`anCFRJ0))|$w&hw`z{)Ek0Zfis5ljr#Ujr{^@aGhWN<;Xling?nQE z$9~O28>c=kP6&Prwa4Ph5dJ5e*(@*ny#4kZ?3$Bb2(Ayup3e`QrQ-7to+b2t2lmN_ zx^=1dSfoR{M}4QC^F4gK=)D_jr+F$$bEJi;t0dNBemnQ_R|{eDwRs z-4y4MdKLSRFzbqTpubA)usDwu?qAESm)e2;6}dIyJXW~BhOGC@YXDcVHm>IPs;8&p z=Wlt)y1~5tzyqu&wJU}6RJH#Q^R59WSRYL76<6{8)y#Vhe8YNByHZ&3{x0ObQzq~& yPFHHLIC<4~ipZN(CUBxGPu?FM12Tp)2tB_j>40=*;~j|5L0-Bk%JPkn8&mj>f#sUZyXLV{^Yrw71HM zqBx@-cKv_ln;+Uy)lXZ`D*ayN=B<~j=-&YO-a14}&E@x?k@dmzrvDav1G_yw?xEQa zWIeM!`&@pGzfn3m-;ZTjMK`S4k*JsR&+*6AbId&JRdlyi+iM!mIsY8ripQ$@HdEeN zw$%U4SC6S?f>m>Uo%s##Kg~a--b1l>yoW!lnqx^n_xWDaxd-uFyoYZGKft}XAMfE7 zz#7<@^xb@P2f$SzzViGz63?Z3_^03t*z0he^u^<@!&yGGyJYTSI+vc&T+r#$4mYCQ zu*22MmwS2!{PWyRJ>-n8TQeS}JpD!R6YO(1%Xgo@slL$}e|fe_PWfyVE&Dzo>xnl@ zzsmfHGN~xeSr+GU?VYz?Tr18W(5&+L&R+hbENQPN&b2*UmDk^b-?HY({cuS4uPiUE z@Rj9@H-3|vDfj$M-H)fac80Gye@HW5Q$Omy-}2JB0r_ose$`wl@*Y~!Tsy;6di~;y p=Pa;w$FjVNXe06m@qG`Lz(Ft9dhqfanFCYS+p5j|m)@+O(;sDWbGZNj diff --git a/release/datafiles/blender_icons32/icon32_three_dots.dat b/release/datafiles/blender_icons32/icon32_three_dots.dat index 6b6383454ed1201db02d9285b78b24584bcba56a..b9646a2a0a3204cbd15266e1d29204c6d85eb545 100644 GIT binary patch literal 4120 zcmeHJ$qj%Y5Zpwi4l1)2K3UE&ty6 IFZx>UodRq1O#lD@ literal 4120 zcmeH}v1$TA5Qf*>nV_#=5p8UQG`^2bKs!?i3KroCD+>`!5iB$oT3J~5SYir8Vj-O0 zq6@Ovr1>q}f$wIv`u66A-76Ynim-@`sgc()kE}6Ck_18z{xt(>nr5H}8`wf0BGoM6 zdIdk4LjTN{vtA1QZ&&9-KMIyLHIAvz)${A%S-&DSMBv3V+~Y zM^RDj0oRukU*r#=e|q6{>tSXJ|tU3QBiyoz5BhZtsDtx*s?n zUd-wXW68h`DoON61x8HvNKVWCz6K*w!vFg2pNB4hoFTFkj DKr++& diff --git a/release/datafiles/blender_icons32/icon32_underline.dat b/release/datafiles/blender_icons32/icon32_underline.dat index 2f80dd4039ebce424e113819b85ae7e902f2aac8..af9e9d92743d980fa4b0be7bf8e315a08a68fedd 100644 GIT binary patch literal 4120 zcmeH~F-`+95JjDc?FeT`iIO6rL4nil0U*gLoP&ynbP-)d1>yv70iXeauk>B-*l{F%*Uws7AV(}(MhF=f}7n*$yS_GOuIJ+RhxU=3~CDy7d9RsH+6i<9pz zrGAdd-$G~xn4tk&!UMd4H|^!Sfa8$9sh^w$RPYTk`yyZpMbmnJb;<)vkbS}e&Y#K~VefY!hkm#08AiTlXeH(ZUO+Yv#ijVs4?#WufM{)>lh`q+57G|2f7cc5 z3}jUUt^Oz3bXTp9NBi`X!P-;rOI^`Toc1wQQ;$Rc?s6Q~&tlK$j-2*278^QudK)^A z`Lq7F1F=4Z&U62A|I~rde8l{De)9aJ&JS^^_nxiyn3nV@_nxiy7+1fsKK3pB=kpE9 C66;z3 literal 4120 zcmeH}ze>bF5Qq2T-^N1iwD2B5Td^0e@&N?j!OkwNuOQg?04c=6N<^$gu+d68wNbFK zP!Jry2?=Z@+-~L$EZl*Q-R#cqH?SG9={x88Q1qP3Gv`hwd6;6J=ZSO%jUEt@9$djV z;v18rE`3IR26y8qUU?K<>ZjcFO=#-@dT9an;1ZtUt>TIC9Cl%@O*`ruzMJp@p?D-= zebjos9={FvtO}np4qyr9E0!6z-~u$>Vb%Ar&heRs2hi9b=EJ^zHx4wBxPfd~e#{;o z+iFH!!$e3!&J5gx#vqg*+Q*|PokVs*x%EEz+J_p4^_q3WL;GA~CDw!7wNfE+8>?x{ z!$a?(FVH(Ac=ojixr?CjTCZ6~^s}Xl$VV5wRrkAw)yJw!^_%ye^&G9bbpC&P{=B!? g|K4N&U0HR$htBbd{qH^VwN{<)k><_b`!DD51Mk+(UH||9 diff --git a/release/datafiles/blender_icons_geom_update.py b/release/datafiles/blender_icons_geom_update.py index 770b0bdc0cb..47b5e2f7b47 100755 --- a/release/datafiles/blender_icons_geom_update.py +++ b/release/datafiles/blender_icons_geom_update.py @@ -76,7 +76,7 @@ for blend in icons_blend: output_dir = os.path.join(BASEDIR, "icons") files_old = set(names_and_time_from_path(output_dir)) cmd = ( - blender_bin, "--background", "--factory-startup", + blender_bin, "--background", "--factory-startup", "-noaudio", blend, "--python", os.path.join(BASEDIR, "blender_icons_geom.py"), "--", diff --git a/release/datafiles/blender_icons_update.py b/release/datafiles/blender_icons_update.py index 397aaa93749..87fef1c552f 100755 --- a/release/datafiles/blender_icons_update.py +++ b/release/datafiles/blender_icons_update.py @@ -71,7 +71,7 @@ datatoc_icon_split_py = os.path.join(BASEDIR, "..", "..", "source", "blender", " # create .dat pixmaps (which are stored in git) cmd = ( - blender_bin, "--background", "--factory-startup", + blender_bin, "--background", "--factory-startup", "-noaudio", "--python", datatoc_icon_split_py, "--", "--image=" + os.path.join(BASEDIR, "blender_icons16.png"), "--output=" + os.path.join(BASEDIR, "blender_icons16"), @@ -85,7 +85,7 @@ cmd = ( run(cmd, env=env) cmd = ( - blender_bin, "--background", "--factory-startup", + blender_bin, "--background", "--factory-startup", "-noaudio", "--python", datatoc_icon_split_py, "--", "--image=" + os.path.join(BASEDIR, "blender_icons32.png"), "--output=" + os.path.join(BASEDIR, "blender_icons32"), diff --git a/release/datafiles/colormanagement/config.ocio b/release/datafiles/colormanagement/config.ocio index e223c8da9f6..46da58b4869 100644 --- a/release/datafiles/colormanagement/config.ocio +++ b/release/datafiles/colormanagement/config.ocio @@ -57,7 +57,6 @@ roles: displays: sRGB: - ! {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 452017b6a7cd13f158581b88bf73a111f7838db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2240 zcmeIuT}vWS7zgma(7=E!JFF#|%|MoDVODfu*<55xq>Y4;OSWTZj2D{tvdlnQN>R}! z64A?mv}B}_O?qZb=EZN~9>2rF-gw~oA9y(DIftLqY#ZwJhK642FXB@}s0zYs9aN;c zPz4qBUj8H9X=U|ZDywH&Svptq>X~??WYj#!$}uGacH~$q27K}k*a2?E2YgM3vIN|3 zmddc7lrblsgR>6kqQ7CC!+fcV9THDr`Hm%X^WSi+SZLXc{ zCffyx>vHW2v8WZKYjCMvi2TQmd<~u&l~4ZTwJr!RqELl00;oWjzS13(xs%FJrf+j5 zor_0mUOWO>D3fi)&qg?FZ_=Gt%zubLl>JXV4({X8X( zVdZV?MBc_Nq~^GV%u1ZhtRyIAJwZi-^k$IWg6WN}?QR8^V~cxhyR!)gv$$u?jvqJ} z;?T&BA3&L+ku{%;Ug=AtSNN@g$8RlFw6;RTK z3Vomu^no@El%cgGlwqI>*G+Z{Qc>f&7viN_)ULsee5vvumCqabsqrFKK8bxp90}=M znA0A{oH%X|pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@HAEFMWj zK~#9!ygb>GBso$cS48BUSy@?Cecv-ZJ;$F)y-gb+GH2q{B+ z+#%RxHF#u#kHTKez$E5@#_<7xf&?Xqjc^lJxvJ1gO4gI)kX@vTu&EkP2eDK+Af~Yj zL%Pt}8tTx9`ooFD1_kA+#OAO_{MGUCy$bFqb0j-tkPVsf0GY4)DwBFxi78_qU)Hy% zKpHAcX_q0vF0v-+qXer3-H^{fpkXiIKi9yz3Vq!3!4t0@;)oZzei^tBt}EYs@!9!s zG^lYl9WsGALbI^Gd%H8(BY}os@QX-7xPl9=5V%mhv~V*)xWFIJlKEsj`t^T&@tDNP$T%=>Ce1j67evh2)KBwDV6U89wSYf*LUf*6X3MHQ7UxcDlmvT+$!4OuPkt8H>V%MaQsgWE8lLR`Fupu^^6^ijSi*}!OcRdq zJfDB_`M*7S{A94RM}Q)A^R&nc02-u8^4*ue{@|mJ`u%M|083>#PcuRQ1R-y~f69v4 zdrv-$BUvFbE6G@z0inofIC}lwd`pM?>5`2J&n zkeK0z@f7I-t!<{Gi#OkY_3-fr?M^qMRL&J3LXhd4Ck3X|;IiV?H=lR9o!fWrhEaqN zw~$BEBIf`yB@lLY@FJa!-~aGK8b$!1F)@>KaWT%*oC#K793k`BXf`~!``}Th)1wsh z^yZvvF>-P`&lqEQjzwiC^7-^Mj^g`|9)%&5bId9{Zl*^`VyWQQwl{KwDkp@)LSi&Z z6iWuGB=U}8lUbS~d^Q;)Y_NNM|IN!^{puf2&M(`o=4dpDqOj9$)obzPXoCD{H5;`! zPSTWd9)=N4ynsR+(q5;X=S8hnPm=lD2w)2zTEy=LRl!@Cz37X=pu z7G~^XIKm$7?rujEnH^n)Lr3iU-a111P^7!F&Ha|E#navTifm9uxT_RI@-PU{e?>+nO#W^+# zM&n|qKK|fguiO6o>9gT@dVOawoJ_})8FH@MY0qW}wvNTyjrw-K+iKLGzj`YK$I{Ja z11K=YArP%ro3ng6&*oX4CaFXKy47hQJj?TBK5sSaNyetrd0dO~Ebn$ZlgSJl{qsNj z(^>=jBBvQE@&G8twcUcmRhGGzgmO|P^Lo8u=BGmT;z*YEvcjnwj~3XUf-c*2_OIZw zE#J12&T96CE5!Yk3_+r6S);DXa8a4$7OsUR**2u{28aZgibrw}fC9+&Fm*YZ|MQn~^7MefzcMB%;o2nP zZm5KgaE=ks%dK9o|LrgTjz$s2of+retEZVy8m`)1%Dap_p;=E>SzrOv$i%=EE|(Ki zX-kaAx-I?S%lbV5BAK~FWWPamK_duawuvh&zlvnoxOG`oiOJd&98Pt{u57woxy!0j ztC+|ozg5z#I03pDP;U-Iv6c(H27O!AzHeY!m59|gy->6fAD5I`xkUU-St6h+>TQ+Y z@?Jw2S)qE|%=MfvSA}p-lA3;IY8xbt&u}TZ{e~*AxFglPH*q1{JmvV)wgmACTD40^ zm0C0TRUY_m%fLDQ<<3$tTvEcvb>2%-LMYat;4*5I#FE!c0FgCvuGg}WV4B*pi;D=Y zKU4q$TJB*`G&>%8`9lDloY6)$0FfoQ!q;pEP$-r?ib6$*jshV}Ho)6Vt!feL{* zYhFdXzA#A(F_RV>btXHZlmI~0YRAY*)%*JeqCz!7u3Wr|U9}so?iKSi_!@k2RhPX0 zB}Ax%v)^4PKoPJ$puhR1%&Yc5v4sL2O9q}9BTZ-IpZo|u2S|w>oq2WG3~3%=L!a>51I+@E=ArQ z0{aMK4~f9#0P>%bKt+gtFu(%CWl>v+Q^pcajh0GF9)Wtw)7ysiJq3Uz+I^SH@b$HA z-27Ch)B2r2wZ$a|jWEFtlW<%2<%OZ)l~5U9kF#<$3E?PMiCM1AB|vDYvTA}=d!!#O z<5vz>M)vMk6DoUAjz7WQH5T%Z*%p|ha<43tzI*<}bFsL!#JxL1wc=&CjJSpXydttl z)t*y(_mpO zd4C?K{Y~D%sefRGL3_lxB*3<)i~7gQA+76x*wVTNOaXO`Vxm0U3SDK`Z52>}@$eEG zrcta}6h|@OyHUG+`xd2u=5jrbLxA}_nM}sh>68#?G#ZoH^zG5f@yR)AgfNWqJe$ww zSSuRV1?O6{;=2~d070HHBmg5@{azS`S(Xbf@`4pY@(-QpgY7}V#VkoXoi=*72mNl6 zBqwK=dwbWCc`}_PaZGRSZQs3hz1!)~Fr+{k7nFwRYcH}4J?mKWEJ^a5NzZz_JswXG z0r7tE^Pdj3x_di)BKViT{ThLB95)(ul$EuJ-nu@3kbe5bf1jO?kZjyJ9G{=h=4lj# z$!ywc;Nd}C@7a%0Bq z(~F!*)ixTBkx|I?R;vj>d)>}(Jnr|mo;-Ps-8?@#8x4nfmg|F80Iir7uOTekej0}{ z26SnNWjQm!?2PbQ2*~2Ht4u7rvjtU$3cBwI_No@V01sE$vR6L>-sG*Xx-|S=#ur~* zXtV369I298O|EgVueWO}a!b2UJka;f$I3=60=<9Ub5EzVm1`2D)YHw!;_Jg^o_Il9 z>Y)?LI^WVxmJR3C%FhdLKWdekCdy0%JH!3pR(#}`zuC*qZ4oFlYN^hZ9z;?eOywgf zq+!dP+n5m%$%wDJ#6F(}M3IE6w=WMA^^71g&V`j6%I-9~CE`sU zfdg>uR_@j1Lv?fj9Hw_}R99kkkyZ|I?9>9HPqP(*rPg^my!*uIZutUWuXZ2@plBzlgj2_6*P4^_IS1-OwT*D z_x0OM=Y!UoU7~{#{Dvc54Er6FqthsV#{dZjN0o;84*H_bmiKrV0Rpli&Sj<`hUQY| ziBLfi=O3cGrhAAy2GbpU`NGaJ=58us(i*RJBdyxx3gF%Cx+0>I<@E^x=T`1p*O|BS zZCS(<3+HC4Z@N+d;!fC%loT>o7v#3Dnn-+uHL9%SA(oYzX+n2W6%q;#h@$JZJ!lqGX? za`$@ZXK%z&n56k+dPaa=Twb1>UQQ;-y*oG3jOFQQYN={c7~SA6w-LX>xxF`Ov^}L^T(5V5#I<^wGhXC^ zBMy&bH%&WHgiVvf!?S~<(=_MPwCJ1{=jUgfqJYvT(fE_PE5aJHJS7|`t;MlBFcRF3 zmm5EU5D?b2s&y;Vb3qAR)F~KOIAZ;>!mKss`$nz3vDI=|S!%9MVH-63^k)-FH7`$7>$&g~+~6CB-eM75o5A*C(saS^tA$Ql z=fAChb8h7`v13`PUFd*0x*daP8eLFPW+(4TDmMgkeb>cx#sb;i2M=1(aYcjES*A6! zrnw4^Hn;1xtJ(JpqvjHDS(y7WTt>KZP++zr%T41Dpujrt;qrwr%OIr$y&^Y7so}AK zxuy}O`DAJJL4vqO@ruSX7HGTOou{+W*~RYl8x#NtD9ZVGGUE19JYy^hqoT-^Y0eqv zaXlYTCs~$X-%D#Dm6uyutt`vZG_BWAImAFO!;m&eaPRJ&?_Rzk*x4`&5d;MNL9AeV zgMJuAoaMt|((QGxHR{cJBhRzhEJ3&Z^=rHHd3ttnNq}6AC$sOKBQ5vu+-@~eY!pp= z!C6rhgTeOE@flKebUH+YIHEh-Tch!W3sR4w_wL`_KRTPv($Qp&1FJr_5P0$C!QESz z!^v+x`|@HmwN7Py>IwLlabB;5aTMb50w%FJER|+?974NUuf?G#IHm9gHQ(j99*1@O z7e*&1XRSt)AX$uU^}45L=ZqCt5DO51G)Wj|$UHriQ7n*GZ{NQC!$0~300kOKIFaOW z#tD#$?MF)ECIiSpS(qEvy@;_=aW%inqMNA409~YPzB|JQBwQ?g)yX-gLzmuowSAMG zzPh1&b)UKiuC_|SM)+zEvz_3p)%a*f;Qx( zhOF;**-#J$qCX5p6i!1LikL_XK1wsrYnWj!v>*_G0*PWufj)TD>h-%XUmc1ux@7A6 zr}WMF{PB&pzKNp84}_ppiv9b0TeSw(#`PKdR)cOgA|?Wgn1X}qT&R3ah>`JtaY@kY zVR|&l^jW$7y3w+tI;%IY-$j;^-(@UHNXwI4Sc`+W{HpKPq>bw56&uXYvT}pmCT*iX zR&dQ#7x;P(uh^jacNtDNGp9J#p3+-B3B<5ux%wm#3-{0M{#6yNbVLh8Pl>NV1}IBr z>#P2;w@g)DiFK}%B{nK_;mvY07~Fo~UjF14gz&arRV0v7yXKPX;>`Ecz^*&{wqz3{ z&xt=`@{5AIQr-yGH2V#5>3qo)Bw!lyjPh$rgDMBeF4*SvwxgsXF{T^W1ptWKK-kV& zvOso*3D-*bzecdZ>}<58;(6SaB8kUDTQw44~Ce{dx`wH`&O3CyTmEO8zMh&)I#fLlE z9dem?PftakZQdJP9pb7}BkQs>k>K%-i~7gAHx{`Bj>AmWO*Cu(7}E=OpG{G0UlRqSm_pB+G)i zApQ)%UVSN%KLJX7CmF~%oJel!;T z8fcyqp=V@?Gwaz~!Pz`Co3`A3Xfzni1s;=UKwj8So3Qs zn5n~;i8Rw)d#e0$R%4@dlzMSp?Ulabt?Y1CqPfu`D}DAWIqy#1Dh@KP;iTk%*ZuIP zf-=szM&hbtV0_*Z0DxH5XU-8(5RfTS+Is2zBt@vsQ%Sv&jRCB9Sn}8#iYjNGf~&Fj z7Kn`y0!y56l3g`y?x+9+Op>D7buE>24d_1ZWpl@vqtU- z#W|VH6*7^0rCM?UAg1Q9vDszc?EE3bx^*#>mpKoNZ<{mw=>Rcz?m@^BhAcldbhXwc z1PE{+#OtJW$cxhFaQ0(Z3ifWZP-tOouzQUHO?fJmG23i+cX#)G`|NqaWD!c~a5M(9 z^9aH)M2~o$$(t*UT2!mWomMj-aCm&$@3zytczbk=)yHvkd~){lpZ)aPAKqY+s*Cbt zAZXD>F=f(BPe;?)tsB>n{Im0m(~DuZ)4@{DU%t9~>t-@f`dhu>Xp&|bw%csPqtTcE zN#^r-=671{p5@!{z?S4Sd^dW4&SBF&yW ze(&?AU+=#?7LsvX4@aX>!yYAR8iirKhV6%GmiM>1-Ao z3LmOlhcW^wW0k!76?e2@Y1J!cnfJS14k0%DZ@O9C1C*Bbrl8ob$JawJ=>bBeJx4cw zcD5PEh7G4B<-Ts-sQBa6-~SN9*SqpFQyUz(JVRV5??zf#gAEnx*r`Kq(DnK=FhjQ~^O6h7Se&g@OQqu-9onym#~7jjh|eTW`*%A^=db zh*BBRq+zVvh;DVG+r8*sFM80gZ^huw1RyZCe5l;V%kot13gVDPA$8;-0?+=3w(oAX zB)9In06N|D^1L)*XLe_Ixl4IfEEUsQc8Qj&TvC-jhV_kHWq%90RQ}(xWz!Z*UYepr zZk(N+_;R|T6ApBcyD#R3(W82L?(0S$00;Tt;D>`;Ppsx`KwK>D++ug&avIWJ=d%5; z;?_4XkfMr_RTl|r%U~2DxQ##)WXO_i2|op2-!7=otj&T7uVtNi2$L|#kX8t98<))I zQhy33>CGI|Z($6pl>UNL1oY+uxm^tm^kZ)PqBaKL8m2OH`2Ht&5u_`IzE=uwCyJCoy?A8%ECYtgEmp&wD?{#mQkc7GxoI|ZN?$!Vf@}}E} z;$Je1w~o8LcUFC}>J9TrQTYtfNml<=NTiAN&$_)1qfr#;DuEA=KX@NM?d@(K?r!dG zArK~`lqQKB4UmPHvFRum0C`zXr}$G%#$$jQC2xff$uMY?aVrkvn`>TI$Rr0~l+^&h zML8{>zdRX@rco5XK01E#-HVg+t1L}<&8xD+h%T;fY7mHMk7M@1yLaOxy1E`?rXV6E zP2zsH+aU~>1)@kQ`wtHHr$xyaE6RE_kpo0oahyc}2wgt-dT)0JG3bBu%U``jlaY+- zy2Gf1o_DjfEDPX(l6o95)T~b?lh?10QR^Q?tmcw=M5}-J7_CeeD9-a5W0@YGTwua6 zsIn|EFtj0)#0gSj+6BPo+8PFx#<83jBnj%*vot}#J31182M_MQ``&w5x2wj(=d7k^iZ`sEVg-la9+!k?9CLBn{RtD8%+G2Ba%B-s~mDgJdSfN>i z6@|!UBJy$-T{~ZBz|~vhLvF$3lKuF;6Bk|^J-b0(ee>Q4#WWf93BlV4?u0DobM=f} z3W5(!^n~|2IQ+E?2i3f1hnPl3qpFRGik7T=ZJ&W!AimoZ1vF_CH*IwZ8SHOx@;ayBaPRUZR7l*c}G-YKDi&EapRzc>@>#PglO;l^Ox2E~MO-`0b_HTc+GN+Bg#9uG>1zr}E z3o$$GJSEY02oevi%7k*+YD$Ww8Dfh=y5GY3{-P_a63r=)$8WUuY58_!Wp}57YNA;@ z>Il>%bKd?Ow+tP2!UDh#_SVpf1K!L^6&4Mm`3>`dHgM!K0t0~Zp#w1Z{&r(D`e#=d zt&USWP(syTYdJ=^$(8@3+nl=y3C2^GC&8rCEM+z>VlPFjyF zp{&YoKLsvE;~WHx#?!K@qbLTbi>expN0@pPzNdLUly+d4UI|a*D4*uM0~q*tGA)V% zx2RrR-sDw%XL}P-?$jl~T4d~tMne}DIIZ(D%if^Y$oVtRUZ7N==m z7E%!JbhbCwHxNeC>tb#m9i5IwlQc__+hMQ!@%xW{@`LXeHT>rDZxB2KdVbY0>ZvSC z2_X`cPmx8yK!$@JO5s2F!;iBh;T&{!=6Qa0c8(9%qfuVMc#7%jCy_ymtPT48E)v)H z9L4PH?6Rymt|a`?Cm$h<2S6Y{m)AF#oQ-w7);|68)3n=lWvegJl&n;&MOh$=ZycH# zlR|wco#X8!cvllc8oWahPFD$2_h#E@d$mVP_%4nGTEM02;I1(=pF^>}VXaLvC{(Ec zx(AvI$ChYRZ=XgY9P!fG#p(mwii2X1u7E(un>s*{pbd>2H%p|d{rb)q)HZlf{z8C- z$_+PzpJ99D9PrO!dPCvHStE9x&y3*Gvf$r7BnuPFI=%uD=VBhr5@WNM2jZ8Hn2KxB zOo@ifV{m}C3zJaeGLusGY~BN)R4Arsal|9KR2N=zc_~PVd{Z=3m7fygwS-RqI$$e; zw@g1*L@+(S(atb^Me>KLTYt3J$_^JGfYg!)eB`}^9bHX%hw>UY2moH=KVA#`Q`cOY zlH?^`__svIx&uI!+-Zaa4b2zal%lO|%nUZ7DktbH=BwLP`6|vr^a2Rytyv1;^D3fz zNEv?Bwk_d}A#?z55JdB9eCZnq{+cbw9ew*S?B+QK!=}b=s_RlobDyhN3`q~?8=iTX zjdboZ(K17gp&ci5bJ$$o(RG_Eo^|mNp>LvIq`RG^csUp33OozCo!m|tZ_yyLo`HJaN7(W zOI|?@P2=~%T7BWtGl0i;`?Ji1feRXImuk_j0Z%uoabeYj!oXGZ&Uah52JTPM(U*mt z`cUd+T$OYkrXZlA#UR1qD2W{#?4c}OD^I8L@V2G`@8!Jz-n-TjC6?rv|bPs;+WynpfS zcV$r?9^6UO2sy@Wp)8X69S#DmG@@~ss>l!ab_C{KRY6BooMVBYDf&P9E z185Bw7$m2b9*glv`VNZE>m9w@jO9&Zq7nd_(%8~cm`4Ku%lDrICoKmAfZrTJ<76jr zt-(@q((%Q}1DBkX{WlzO*VOP-YRLcWnZ% z1qT6KOY|CIs82Ntp^q|T6`9W^&nnTpQ}xZE;nkztyX>^^Hf%ew(Z`|brM&&a{j8t; zo1gu=pa1;l_^sFNq7}$O*^R-(4|~0}VIScr`Lx7O=oL3&e)-LJAAj#LRkq|QV|87Z zRSBFELV-gZMTAn^yV*^X;b8ds=qxV~iT*0f(&=OpCCRfFFA!;yrOEi_=KkHguU;Qb zih`)3t7>s^GbuUfJtuWpCP|7%x?+kDi;j#9*M`?46s`Hj#@hAuIEtb{FZ<-94;ZCi zefR3ci(@^(OVboT@w$3=cyK+szP!9)N^4%#b;L-TL@!?-k8^~lU%xy$n&u@X9eL;} zCRtf{tU1q>(kYHuk|vbq9C#AZVJ{nxCPJABisR(PYXtwi#4ttUII);fbiqjt)b(Hg z_1`>v^ziX}52HBg_WG1ELuET3uvIqfw_Qu8gsF;U4)zL=;EvwOw9QFxNMoeNrm{w; z>4a%Y)S^|nIir9gze^>*TPmT$w(5`#frRQXKp{THw~+QLu_H*^z=fgA_>X|(WB-n4dv|K{U@bV^fMT?P;#_7{Rv)8VbVs(kR zajk^q^~lJ8;4M+YbF`je)Yi-zjRXfh+yaQYuB)n2R;v^N-gbf8_StTgSAXJodl!G{ zFu`eCb;NpX408!UVKSAKcf~?IE$X}|o}XTyp5NpM1H2iJ)m=@eqOR(qtjfB`%Y1_W zi+oy4#}fcB0RdOh;zKQ!smi4TLT!P{$I~f>jBymBYot;s3YEbiYy!ZzdwsWlai^u| zYqk9b%b^h>xK^u9c(-U=&U^i=X!WM9+o1yV-73CzwC>l$6(YO5u6a=t0DuM-VhI{& zK_)a+_$p42E+7_76?Am!;cc(5?SQ(S8I|TO78U*SrA7PQgtpiM%rbr#IT3R^Ct)6K z`8Q!$Hs#?FCZgfb;?b!VS`Aj)5?XJ;{td^BpOt}UDg-Cl!+*jNqG=VU4MfqwTJCj? zX)G(XWKS!_g7)P_77qy0j5@#Q7#hjc4`Ae5(vpn54u57c7~+YkF~VVW51K1aX4I=p zMqtmDtE2=k?@DE>;n42yZwH_$sKdQe-_XtCq@p2hII;4`C{Zueyc5zy6{u6WlQ_*@ zy*{qX`rz>J(W6K5g;#mn8OHUIT*zZmCvmc;k= z?hFT6hojdTtvXh9egAOp5C7o9UN@mk%DeaWw^6-)eKUFT^!e82ke9qeX;GHwm$2x+ z|KjhSK0B&`WBQ_)l~ox>G|SQ}iC<4Pw>G=oOcgoYzjycI@+wJ_ewGco+2Q`K6!IBU zh13C6ib;}GMFll5N)>pN?C)-U@c0p$Zy)2}he-lBy|_e)AM*!8j?`|~-JLCj-=Lk! z7#W7TD$8E4_wIY|?(Q8N9NcAbOlTX^svrHrHzoGBx!sF0BZ=Wdvj&Es23IZHQ20<@ z^;MlR7RB-?T|JBTa4%48(}LlNyL3z;6Sq`d2e1tT_;u|upr>9oZK-jF z8P#uizZG78bs2pD#@!LPW=^%}t8N0qnfX;Nfk|M!*s5rKiMmLIQIZ5(M}xc#I1JLb zTq|!`^@`z;uqnIy7-$2|j*-s;<+}~_p2Eb09>p?co8G%+aqSCKl}ju=htp&TDMNG( zi;3W%?eG(SkS-DO0knevvpS8Jhsuz-vjr`v`$%kDwhN(n8Gt+95g{7su5lVVrzz*6 zuEn$h+@czh4wLYBl0<}cL_$T(BENV?81hz@b*)f7U=BjpU_rC(nrMR5YD6G2QpiMKc^}UrW>x7>+jX}}4n(sssyaNV= zXsMh-o*ncez?IEPSaVQAo>fn|;=1A@SdqcCfO;0pn-77YkvEm{3q*X|o6lK&b-(S){p_cok}=uKg`=$=@0?1zX{fk;ysuaGyTZ{H2@Nu# zfj-4s25h=4!3D2%V*J>OL@f}rHw|gAfz+IVZFdtpG@ZFTXhwI{OoeJ>6-(0;8aw;@ zd--@=6qBER`f1ip%d#2{2N*mcdqSTg)QK4FWhs^MN)$L_?8U3sX%ZDh-bZ2?1wA=C z(MthB+t~y-IypzAI6}Y=_jd-p6l1GJXAMR8Uhn%KKK}mqKIr#)Wm(+W**e(0bN}uh zB~fiwnRz!&5yA5M^--*jg6d|8AneO;o*tiF?C;(|&39gwysj|h$L~J++t2yJ**e(Synnb8Crp_`s}KpFb-OrQ z_=~^z^Mn0;7RAKd_tAA#KRZloYc~e*m;8v{HBw*OXl{-{p`hOYefx77?9wi=Q$97e z>$*?P23f{*6dlgF>Ei%&gNZu9wbcIO(yz;xdhM*%%ZW2uT>F21L{xjdy%K$K2twQ* zN~9$^y2wH`C0+=y{ocGVSGSyfOZ3RwV{%CF$&~Mm)n4L7BJKM21xLX5&t5ANp1mr< zbDhEr^b5)XrN4YER6wV$xo(OUCdmV6lQWKBZB6Lf8#Wn&x1U>U*n=gY=7=^g;tQR7 zvTFuPSfplyG_L{u)&O4~jo(?%7{f0@cIwJkRg0pitC|;8U6ve|Ryh~Ltqt0VY@ed- z(o2RVd>`B)M}9)ei@XCI$($0+*}S7|yT6yQSTy-`|;|Z*M269lHR~ z(a*qdyn@wi7J{a<78)-h1l}Y=LfCe~q%v=sjI4%aJz5FRCC<|WN)?*bQw%I_R#w+7|U z5c>_F7MIeRhz14=iM+fRVIzBUSKC|@3Jfcg8T1VR5OrKX=awckEap2>!>Ku;#*0DJ z&{KRCIzCNlb#VS5ry0?l*dt4g7-S2;5u52CZ~>Zgg?xF81X~J~- zYh@(C0gN_n?NbS~0w*FE;Oqe-W@oVG+*r+bSRhT{Bu7*Sr%3`*q>g|3lOO+|U;N*) zC=j+@lpICah|!JpO@y{9JBb`A>#|IfI4`Ph)O z`}D;heEk0C`WlN7Kb@SMqE0$5iZoA#{qCKu^?o-+5&DYI!Jv0%XY=gxiV&K_Y^ntD zovqE9^Ml7C(Ia=!>tPT-{6vV>-9ihr`DY4qqOh;tYWU|9`*v zEyq7K2n!4-s~X9W;fMG3Fw8Vd&o8bDHPY?w>{NAic_|I-AoFpO=6T-jMef{T;uco5 zkxI(sD`}nr=|^;Ho@n;0XwEsMbiSSOR)1(L(X@@Y1Aq#_S2G)rpWX2qSR{jr8r|h` zt@DBb)qhz3=Je-*KmdNAHpSXInoF6-|C4aZH&5yIt%+OY}i(Z zBdiv}P^$Mp%D@*}!)^nAzun17rum2tI0U3u=mf`OD%zGS5&m4?#hWDraf<;|w9)e6 zbVrk_)+s`SJqg;_qT^KCLU~#9yygO+o5lh->o5a|G&R$B}=BdSpGA!p=h;>Y3U2P#P!lYS%kl|>t(NFTcy2wSY*q$yH7~44VG3M?ZsXH}ok7;u z5+K|{<58|dp?ZGhPzkp^;7H8vR9jl@Ir;16Ei0-U+GKP2ChckY$|;!>o#wGEBm4O6 z6x~B0gs}|WSR^NI-@g-2h2gGMj>3m6!ptJ>q*Fs~HNhYp949atApC}NZ{U84Dhu=PVg1a`WnxjGYNS^$kmD8fG%6?A*+_NM>^h;jV`*(JZ zj*cF_^WfR5WBddH9=>z`$+H(_r^bMjOhQd4B}tMJict*YnWg}no9lUAo*kX74SR7M zAzLV3pIu&~BZd>PNMg@2}14h z(AFoDqmHT(`oh1@y+9dbtgjzyL!hMscIFoO0Uz{{o}Kf&a)FFvG5>b zEL@0S+C$81nx;Sd+0V8*Ug@qAweW~EAJpm-&eatMK9gOfb7=fmzpL2Cr5B(zn${rL;yGLOv*&m3Fui`bLVUMpzWi<%jp;89iU_P4LdLGN-HQeAW#qj ztPT4%Ceor|NDCbArVjwNqXVITI#hiKY9M|j7EUUV0dE<lV8@uThcaJ+4kG&x6X z+~7(_5vyN+X>D;6TGL+Ku!%Jj^ro_3cXrKg#`5Mcv0!=j^IB*(a+)LwnlHrn!P?rN z{`)`utN;4nzJ2zh*X@ocW3Aw?N=TCwVIgI8+3WVM$ERvfQ|I(rV&ao1y1E&C^W>?7 zL;}QdQj{e|g~3kq>BYrW62~1Owe@*XPNx%m;LtfayTp*s&#vMm`uL-Fzx?_cYOHI~ zK^o*KNg@=jx7XGulgZ`PHRkkS*#G3C_mK5}`20($Gs<%W-CW#^^%njpQl@M;zq7eX zS*M$(^YjUL6-8oK-dofl4WU8po+aq zDMJhHf>I0<18-;+?SN$vT2xExV5JCMbHO)8=|)v4hAXFjP@}rlnU)B42aBd@bj}Wt zBitfAfOi*m@~mw{3zG)x7<|E-c1sso!3Zzbaj zr{W`vBK25k5so6^gk~ic9K)-pdi8T~?NgJPH;wCUsR3VCJj&Du;^bYI2R=SxXuKs8 z6$0UAIlFyPhcO7Nt5^=IF_RSm^*3qk`?*tT|UB-He7WG|p zHZiT!r=Ef_Th5`ioixUi-y2c4EXPgGnyN7dlbdKUk20kk-1r<9y@^i5e zx!h&>qa^x zB6hd2ee=Q3*v|KsUWnbl5y0rZ2HghXDiR1Ff;N@f)So3v6!@9>lqeca>@vY0v1Bbu znqs%uVz6Cc6EY@R4Xxd!B5%SE307_2s^EHOyt1AIzGxJ^Plz5)3?v;X&AC^ChFyaf zu$|$lH^~6P1rOji(zIs(O5Ng1K{OKK)2H*9rTw1Pc|Cmi?oWRDqoVqsc)UL%K2A>0 z?%zM?oSc?ri5QZ+$n$Bny}2QAFm;W)Jcq+!QPvylYn$tXC}LG!PbVmvM|yM7v?wkv zuOHkynB)c0qb>LCt*x5ZH=`+}a@!}3Xs%sK#Nhv+Oyh5|> z=jT_1(g%lomp9|jzx-yfhA5k?DDtYR7$r#@bIzkEO42yb%QTJEflbl&`mp5i#aG`V z{01RCKltQhgtPYt-M{(PWB~ia3rD|FgM1EGkUbB#!9ay9cMI7stoP`-g`e7FqQY z7?Bx-l?@E$!7Tb1ORDOR*EY6cq<&0noxB6OMO$AqFk;*6wB0@**UD@NhA-<*L9^N% zRF(?jA;IEpWNv(?ZOcux@f+^{!5dm9y-6A?{&+FCt>h8P4P-^X?P;mY<%zcpq_v5W z`0g!?NV^j6&-zf62^!jEYFPoY4VyU1o=WAtqtNhZrI`x`U>}6 zdI5s?lecImIM>Xw?BVB>5vCyP^46MgrmiT8(>RHHS(@S9OS|1(nx#paL`llBZrVk4 z%m9D!!{f(~KKk(C<|ZN`<0wt8O0EyNpfY3?2mVtBGcmj)Z9v{Do)o)G6YHDW9W|Oe zWK1$;eK38lghg|;0e|G5ccf_O5>n11USM@`g<2u+H(FL|SUNX!q$QDq-=&JLVb~V; z&_>XP8{f^Zi`I{G&gQ9QiuJFFzAWpg&0QRmxw?#E*6IKs18_(j_9g#TySeTk$5ZR_H2CXLWrMVHTp}(vKjXbu^{rnK}7+~ z1iu5ph^AwJOw*{*pNMNwHJZ9Odt08pnD!Qt-q$B!SO zKK}Vj1m~astB)T4$shk1lZIv`fAPy-y*fG{P0N#u%h6;U#W5}!V6ojj*m>vv0VO0! z6Vc&Y>%;Y7f34pecDo4gDT)#!LhJ8%Fee<;N5gsE=)Fr;Vec4vrYwISlQ!&^Ot9 z@>R~TAt~jrh*r}>hx^Gw4UlIpl-!N{3c|!CEN?*7}sQ43KlCP+82F&drX2&`#gH>#nXU!AVDlPam0-j z9&y*Z>ed@aF*-zXl4ac}N=&JNHzC}<-VB`= z-he2dA()L_@0U_9&DJhagen}WE>H%EHCR&q7&=&d`fF@a*RI}a`p`TIqhYp zc`h}yzf_bA0}Lq_2JS1?>dJe!A;qurw8+2%sM^~-@V358H3+THENFVdYd3t*mKX5W z6SWlRwZ*X5n*NIVnx%_Z%N8|Ozl6P4pHze;4lC9rn`z!iCb4e5V1yT(+ofj3XaGq- zw!d|`LL$xKwXGc>rowos-j|uzU(aG;8`5wqE&463e96(07Xpc5^J`KX1 zIp(4K^2It4YR_sArnp@!!nK8P%ZhaII!WIP5#zbF*_#lBdl529%VO9r-2$i3Vms&h zY&mc6O+OnVWo}jITi}~XDkT~cuX(o-HIwhbp}gZ3O`+onSW7IEDRpI`!S+O#@GMPVzId^_ zyB$Sw62+TaTa)pq-%IuUtg326fyYcD-Eng&hYklAL~&V_7uQ$#ih&e06ldp59oa2e z1d!E-P~aQ|{VbMC$a3DF`DPau-{)B3=sbQ{P^_A z(`SrDX!vD&eI51m2#ZIdzpN@X?$DT$?|<}uT@?p=cdDZ7km&gIL@3Y;^3d;gUmu+u z9PFiOj9C8?1@Uf{=Q#(VVNpVjLA`FuIiPvUeVoN?Z{ivSvK=Sv{Q4%#(#!L6@y;V6 z^VUzKW_GuL0Afxr@mrjlPg<`$$#QmuYtU2)o^FqAwFKR+)Dq?Q~k6C)8)QbD$7VR%v zfwLBoO||Vah5jp)Q#g+b#lEFh-WS6aLK^oPkcGBokYVj&I=C6&${bC9kRM{D*@dv9 z3!5nv`H8v{TAM9o>9$l$b8&g66+y91MNx9hZLKBkpSLqi75F0Jda>SLYjjYhc+B1Yz#jSJKK% zf$uIHD}XqioWo+m?(%D#4eIELhPOv(l{IqG~rA?M(vtI*uyyS4m8{!T&pyI=?9M<{^ei($N%)7 z{|k!3Q5>Prj9z+mg$Jg-JULS$6Nw{6DY>(~adM7_Cb9R2gM0fsUw!lZ>C*B z^I-V&yO&uv9bhPFa(r@rcW*mN669_?oqq4}L)3>?6`=Tgesx{f0HOu~TAj8&7~D)o z5sOe|{^0Q7{NiFX$pz;aXjN5*d;3%_Zj9uiPSYs|K=uxIcRv2$-J6@6|NpzsCwYxY z;XFrc@h^@~7^6i|C5bd;Gwk;`=Ve)6TwDT&jdg}HI+GS=DgiR>0Py7b%M5Ydh`UJi$S#P`<~zqq`7c<(@Rl|U~`>#BTk_W*fYAN0rL9E4zueDl>82Y2uF z`h77oE43y(0l=!y9f|uWt084Hi6coytw|(eS}-M4C|>~9&EnH%0PcRoQI{JZwYz4c zAuV`SPF>e=l0KLXrJz@3m+R!!}oVw=GmQo>P&+Lo@>Ef2yz_k#9@lzqZ_J|lw8|W=q z9RE`mM{H}5jmw(oWjc&qwwXvXnPpH`@NkRVTcgrT&8w=C@S0evFEle2=BHt-VqA!b zF(lpSGTlV|a3;h|euCDmxv_b^Q4v=k?5A+8%*z-5JW<{;wqgTcx_vWLql$pgJAm*u z$y|B+({Sh;!w!_xO_>jDTc>S3e0ZXe+v#X<6sxaZhIxoz!#1@zw-W_II=UB?T|~RLCQ^b~Ftuvg)E~7ZJ++~aW*DZ%9t)+?KbMV+;(HTz z*jhC7s&rv3+%iUuYEO{^{1aza`rF2F#kr?QiXtVMq7EyP;!AE2C8<#qMFaFhfqv+L z7VV#wul+AtphXch{m>vt?YeMW$95#8@-127ee80NneA`RU1}v+(u$_Z-I?JWZ)VzL=x_W*N!HpmcPK^} z+J#CS6icWeIC$6X)trwetgLY_`!4owDxHd`Rx_$FC)EwYNI*{zHIemfr6Q(}%EjKb z9ns3l@^63h%dh_VC0OAgV4#$KcLWq9$^^(8$dEn|Cs7I=%il45(!Q=3Z_rEHBmDoqnMZuCJ}`J$wFich7NLEb^<%je$4fek82|*T-{b z>fqWfLMTJh1m4So=Iv{%JA1EC^GdlCg@Hc~(X=wu@s2t4qs@)0PdI2NGEG6smMzXQNEE|HfyA+48#E++&qD{nh5*FT?sQ`kLsrAQ zj?fZ=0+~BMKaVPd#bD%2Vqs^85vL4sMIa_htNMfvhXYIz*canDhSm_l&_X0La7ZIs zj-FOBcRCd5o$UH*B0m)_w2gD@1bMdja==hzl)hlqI8v#Epan|Bsuf2uzB1blK~+c- z$EJwirZk!-YRmGQC^}rMBP5LY^2AQiOnI>0!-OxhnK{N> zecS8_!Vp}!$>ShCLkuzSOo>y0JkJ~V$fV~oCiXqO;R#es&eN@k@;Fw zKa0al^0br%&xn3gJBO)mYagOC)&8?FrxGEjfwVl(1{#`mt*E?03otWh7x;kod<+XQ zMKl?1$|aH$ihd=0*5U(?w}eSYjgnd6Kdk4B2qMC&7b9;hB!XDfM*7J}a)%5OL!$%3 zNDf||gUdZK7b|yyutmdjy@~|yWH;ZfraiwpIWI7uol7_7?4L2-5zj$CHS-ajL}zQZ zNmuMdp#N#bUjmPG3E#Us)wzSFaiLg+h2g z(dnEa8?*RQ-M) zvU$D#hOnL5^87J0){md=5*5dNZKZM8Y?+1yR;@P#XnYKAc>lnuO&7y3T3%{IQ8+hS z12^xwVWH358qQD66bHlAt1EEF4xf^g@Y*Y)w_SUwKD)ZKz`RnH%P`9N=Fw9O0Ngc# ztyy1LJZv>P9qjg=AB4yzJQQ2D0jD>W($oi=*TK_wdIQ9Kg+=U>ojq`RK>1S=p#&5d zMz}$V=eN6q`Dz8l3_X9vT?E(aI<8?mOt_*%Of0HR&*U~q!C@Xh*DYur3e}o;nkWPm zSAEGerkJ?Oz6D?OOrNyrGgbN2GQ~PhPd0|mI)y~tEOFoVykV!+die0+=FMBha;eqr z_`}iK+8TPl)oed_@L*$OJq&|JqX9V7{{F%C_O|Uhm2w5OUtDY~uPnDZoj?8guYfB- zDnik)i(6c%@9e$2^U)7}_3K~Ms3gnl-_fcJlgMd#(L3ng@*jQY2+!9jK zgtpu5-R+$lH?GZJsrS0wkOdkTzj*%2H0`aAKLl6fjl6|M!=0KcWW*gM94pnl`s7*$ zCOpSM@NP0L042KgX)-PmgxnPLlQMuzXo)y?4v`5@#v{*#P>E?7jKPeG@po(oG^h2i zA^^R%q=CeRlma)Y`S{Uj81rJq4q-tUklE9dT*q;cQ4}H;pg4{O{a<T3TKrgfyGY zzkU99aK@kh^v7^I%jGm&%-1YR5Yh(5BH`ysGqh^(se%PUw>nj6sEcPLDo#70gyMO- zb#V9Vd)qsEH?OY)UH9ba_n5bT`Qj_!Jy31eF=1>Dxu3@IN1N{>7WDeY`jqRw-rxV` z;kUp4!|xE%0&sNHp<1os7cMt^a$7YGv9tP0=ZLn0 z2V@~~wK|K%&wn^?i<61cvLOg^gDyu#7dmMXEMf;|&K|{|+|4y&DW!l3wfkvA%@6C% ztQ}j{6GGPSqV6m0=ukY%d8tq9mZ#brA<4BOH6FD!Tb~8^r=g=2gCzcC-xK3_lp6hf zA`7Qx-kHivO@65$B&39`YlP_<;>4te00`wG%=34SJLfND2`n`T%J?t^6lluVafK-U z)Igzblc*xC-+dL_@6s>J~=wr$6au!zVDUXT7doC0(Wbd z%4Oy+!NtYg71XcP4_hq|3Ouj3+Fdwggqqbx(t#NI0NA2~sWq4ahl%-C8fQYIi9}X6aN1dMM`EbA3>-C%MUKB^r z-zPleXQMuka7X~&5FV*elNhl00MA&=94mUV`y99HvsG}|qwyHI=4R`to@qJI>XxTV z&Xfy~I$9nR5)p!PgP;89lkcCsfPrfSo%)-hA$%cBIS@90*ukiPDMDhlY0+f&f6uNi zFF|qd*cMPUSFT?}pW3Dc#@-Y`2gCu03?rSfN5CD^$^vN&@s(2%Ein2rH9}rSO4D;% zPBAG4rUtJQ+6qcJ6=k6xc#spVQ|<^iP34A_Rhu1Ippg_THEs+#T`+lQIb2i#5d{)i zUA=ni)-9x&saCw<$aU>BM#(2I1o;I}n#z@LDt&z{p_l#VZ8F!Y^9=Dqeub-DG+vn#roaZ z@usJ}x7FTvSC)Qx&B@HlHZzbyA0BgZs;ko6ym{?8=l;+C92}Sk^+3QJ_hKb{A8`2ZWw9PT|;#a6^$+}539T$D3#`I(3YnM;w1|_j6JGoOz2H$YfVi}Wn~q6yZiSa zj^LCtHMfkio>So}h&OS*uj`GMF2W2uI1d{(OHjQO)>54x*MV>{v-c zzMLF^AC=lP5k8eHD+~@Uj{)y(L)^1@a}1xd3*N)DZQm59cYRtA490WHkSg19^KLf5 z{p?mS8`xOd=AkNKwUSJYvTq+8!u!i;PN^QS!}!HcY*m`gkvspr!6mTpa>^Lt z*^drc0CEL?_Xus#9njq7t3jsx&#Q)@4u;Cp6ttpQHq$11o=-1Exz(9~aj; ze)>qk&Cg)wPskhJjh*p1x06P`lQe|WslDaqRVuFLz2OHGcHr zHxe8=^%7VE2pCNrF)!Q4XxlNr=p!aK_7c^3Ib?L*ko8yHEDra6@^|hM)-La???%N~ z;)UJP10&D3@RGd1Tjk!|F&!itTKx!7WN<+MQzCA#VsX@0Iu`41=DdiRc0K({15X^k z_b&s3po+Q8J`h-+nje+qe&kMtilRlQ$nND+ICFAppwgu87BXbbB79}HnJDO<0frDW z+`6}zB~y#Gk}~0g|7qu#6E?a;t^#M85kHK573#zK}?mA1W**F zY((&ljSYlUOjtl9S{fSxQ6NnbE)dKKOe~0M*tT#LWnM?{-8(pdA{_}~V|#aceim;&SGG5|kWm#20O;X2k>MV^;pXB?7u6GC2(kT}2N^xv_lv)NLypEv#c6l+4ZS2$soK=+%xrB<4XL5LI?fKLI8H^_6sm-tOv;G+q(+ONeb5++ z%gQ(o2NO5Zbr}M=QtWfK0mabQ<1wx+JJ;Lu;RheBuHfem)U1MJxE>XOH*l-C*r7kW zdT~51P8j~h){}@_lupdW1`ds6`Q-6nb#-~XI7Ty_oL(T%1m5EGZW;ywhsGyow%69^ z5wr8ly&X+7;8;=d+}uK6|GBlb)%wQfu%K`TS$G&_q?i*FQV7X*m!Y1CK}oUEoPvY_ zVG4kzg4P$lS#L56vB(RlgP6VSkzi;>;{zjkwI6n()hCoQmeB%*<3c%pc$?eVws&`S zceXVEc4j43S6ZznHsdS8jzVaRR!1y5G6K>_kS&nmqp=b#Y-nc;O=(Zd0a{5(kO;`D zo!xCR%LeZODFkD|Y85V5h;iW~v=G4$zah>qmOH*fI;8%wRqGT68DRH0iut^m!yfWJ z8<;-$e3etQ{0yJb5XH^$7oXti zes+&Lj>lGhhHxyW!)gA%+;owjy^`R)u!mpvg)R>S$rp>7Xiy;(mSZRvBsR7vpc*%# z(+;a8)<_tv!Mqo+SmY1U=-G`S**qgaa2T!{eb|gWGNuKUB5%sbiv|?HzF2#t843M` zVDAl*`6$uZlGhkcbU*(ZFR524)j)X2j;sKY0JENYU)g-2G^|mDTpDRROpG8I3Q@5} z3!1KkSk@?4mC2A!Yi2j4$QAO9FtPdoPlW-h^|h&V2Kd1GCek=V?h%+7Bx1(Dm9_Ql z9oL|a6Q=@&x*Z?VGiK4XwXL@P9-^Fn`1x%l^0*2`f9MqL9vonphddJ79JiE~RU%wb zU*)cc=?-)>q(8s71PB7_I2ov~O|~@GC#n-9f`*V?UFXZQ(TT<7b%b)VtToZfvNA09 zU*3BR_+n`#i}X(pVUXO|+8}O7y0&h8V9X>lylg$ykTZCKEqR;x4LJG>DWm1FG^f<`t_tP9-slT z06R8NhdOAMHlL%blvh@82EM1Mi3v_(4rPUiAPWduAAIn^;^NZJe*WHn_22!EV9_|c zxxP6(Jo4oix2MM^mKGKf>q*xok#*tg@v?GyKviX;8W|ko)ryMB-QDd2B04B5z8k$P zxM|ui7R69(F>0XnqZ$!`h#+nE?mq+-qrAn*%r*&G{8zA+;0z0Kr zgvn`~ClW5Xskyl>RfAs)iXSnV85984bA3l!3vx5E<=$ZqjWJ$YT$ia$5Pcz$xNxD5 z*8qw~<3Zr&Q$Vp{6X5gcSC}{4{4lyH)&g!)@J<`0&%566DjRDu-_<7@pX_vbRW=%Y zDYppT&hBhJ;Zm28XG!Ltr^!2fcq+U4pv|anMFN`AYk}l^d;e&ceeYmqX$>gko{KKy zKi_uQSo`7w%gWZ)F8)v1?B-H-b8%&h%OYxGG*-_D-*U=VEEm-ymx>(De_hczqdsV| zWIl{}{dm*04`d*n(Ue!vhANw%OF|c(|5Sjr!x+l!4~e3p_Tc7tISRA#^C-2Q$|A25 zFT5sy@)l}ofs7r4=J)^bH}6s-#XJn9p#4p)djeaWx{_$yIjNW#RXAY!07a zMn6r-xKmVk8 znC6)vA3~5I88(il?CQTQ63@tCi$>X2klNinr%f1cDTU+cMb!IhEu8_8MBQpoM7p5~ z!Os=1##8O#6bfHrLpm5dpuNQwQLxa-g6ww7+xH|%drFGJG&1JIhNecqEdU*`h3_Bb z5NDB_F;{b|f|^7ii!3iKWAw)m4$(^PVE>~p?;+}58t6kf24#wvTT@+y$OZ6$l(~mz zFj4Xh;(&lDu1}}Qhg-<8ILjA28asL-Sv|kBh6Kn|nn)!2x;x5T;B-Y}rlvF=RR;A` zc^Q`_5WtwDnM5i|UF1$(id)Mef&>JSU0KD_&pJNM0cIG55y-LJyS=khUEy9lIXhpZ zSRjc5r7ht| z_3N*{as9^4it1FfxHPY<-TY_5)^il{t%ftOYveE+w&0wLgEy4QVky_Qb9E45+OCXo zK!0fTOQ6Tw&Za6+m_`lHze<%P^>04)bHsm6Wy!=?@k4W>bJH{1TRU?L%a0#DdGO%j z@WgaQRYLdO`b=hGd~#(4@z0H&%Sr^I;b(X54-QYv%r9>5GO2G34UZy4J$N+uqo2I@ zs}DaVhnQ^XWZ3U}db%$R^b$)83%v@fy9Z#Zt+ka!5SGy?x?*LX+}zw!r2aXD$3Qg% z-LzL%pFyLd6&@)0k?briF7geH3h9D?y)44iH#PN~>*b*M=V>H~D=(6GNimow-k0o8 z&n)71Y|I~m7zo0P!*D*kj$(($$O}+L7W_ONBxALGxmj-UBF!nmJLBCw+>&4{#lb`;AL~h^yoDe;(3qd-KZj($VU9DO@nN~|9 zrsNIZcO(jUsW=)xQfp6$a0uvV)5I-oqfh^;WlS;@66^qZ2W=xktQ3AzR$mVjU65&*u~GF{Z1lMP3L}r3X3)x0_BN7Y39X zpDDqQ=sPW>tX~|pTV7{fecH}1tKM?4EnTZiOMpTDstdbk2hsY!En*Sx#WL=w;fa>5 zv5Riu8N!Ef8{nuvj=fn)bZl;QvccFm7Ss~;;pu?N-+IV0v0Z*=MyK=?EzcCd@+xxQ+2d#URqqkj`ee=9d-`e1W%sPbLSrf!5d7u%f@S zy@wUQ2GM+D4Ye8-(b9x0F)_U`HaR;nH3L&5 zxOOCUtc0XPmR46b&{-1I6_sTy^hS{iFg)RFd+yx1bf&(%yi$vZ7^w}(Nt`{7FoT*x zvl6Rf#MTjj0_m?xp|ueTjri;s7YonCq-A;&pioTeX15M9f+k=W#m$EO;)v1JZIyex zG#WsIIK^jtaCqd|(CGNY6iORWsXz|ZH`aHxH_y&4OiWF$u5HdOWN9Ll4!oW$HUK|b zUnc@>IV&tA_~o64z@A8y21Jd4Z@KsI$;JL$ePaV&6gOXa8M*(9+jl$KTQ2nXvS|MC zr?W?fYY`BQ|Q`-lNFCNN1$%WF#u%M?0Qm9DQv{CY1p;Bb&{F;viX$jEzq>Hq~3V8_SfYh$9OJ8gISWlyz|SKh5(@ zr|=u|Jv->icEN@Z<2b9x4V6JAPJ=+zVKs!~AjEJBMi*-D>|9w|u5=+z6|6E~+ooQw zU%fIjH_zh7ox2ZkKDhq!O=v$`o0|41{|`Ut?dxl8ZmCKn0K;H`rsTlGX)!jDO7ZyZ z%?_|Fu%I8%rLsPx`OGwwYdpw+1S+L=-AXiUmux2 zP;5m&?x7Gwf~On1Yj!~*j&S_2u#lnKv}->>$3Jpr=jN#jz#C9bZEfef+FOSw=V7)& zvuGtcb1JcOkONaSG&=dtTW=m7?iI&*%d&FVrsDKvYx%JFij$%pg>7}>|EJ?4S0z)x z>&Y2fjSFNVmwB%T%l-b4c={<}F)Qpm9)dd9iPIfZ0#0V;i&#&i);%q7jY!Ekt=N~9 zmksoGcel6ZTzy%E`^L1OI0U0ypz_U-1y%6O?DG1;x>M?GO>b}JcJVdcfIc$nloTn{ zlZ%vPGlUQLFr&n{DMXG$=8ERQxhdp~UD_s}h6KrrEozNiKH@r>T&Pt%Um*RHA=pNG zG7Pf$pu?&szB}U1XH1}B>vpi?hZwlc&)=Mz{A~BxF!bb1XV6o6nSdPl@B^uX2iYBO z?fz8A*_nR2a^>@t#u;qu;oj=c#_2bPPtg(_-P@n9jKd2Q{*arVyHY^M^LUu`$)Mrd zPr~6>pQ56zhEO?%NlK7ifuc1!>S-%5_KI*#Nw?Iee0USKAmML8ng)!b?>BB4L2PQk zbKQ{)cyLejCx^wG z$z(nV1`{7Ouf?9k)Eo?UQV6IBYD1a@p@2@PvO3v)u5W&Rp$b@eWCuAIX&513e}5kD zFG4P{=z!FUREEpayz4`Fl&P!P+H!rF+FL<}XGokMiDb?6%mS~A=^8_4#znJigHhPn z*llb`BLHJQXOh@mUV#q~!)qo}dvLToJu~;_Yd4k_7x9(i5o8Hji|_2^U?X#R_R+~{ zVs;~@BbNhP!4i)UjU114ow}$=r63gHiFLIp)_7B?Bv^dlG~j<0mT+Ce+U+2eYr7At z3P56}=N5r);E{)9$P5BVNKb}9_ER-U$Wf@5hQ>N7ANhV|&4soT5*Fw%&rJTH z)lo+diz{fcOAnz>ah#(^he*0eQ}Itey$!Sl$rwQk*V5N+ywug%zMjqg@>d@s%1=$t zaox(=8aLLaYi8$XclWhr+}PZZ6q%@b1{Gg)bO`kNSHJ$`v(N6ndh_~Mzxq0=M*?|n ze+o$Y(f%O`PR`72?(Ay;2uX}g#}$Di4U5c?HU{#~zr4S&ywuUwnrX<)Ei3}B#~Zq- zxdr&e+R7@tF=&nd(!cP}Wa{ej3ciM6m_!KoP6`^OM+<=MS7@UmcDMu$h++S~3tzW;1^0@xBhzMp)0=l;VXRsdgr`6`f-b3Hxa|LE}X zDr8G*i@S2fgJLn{P^#7~(w%J_k?D8}J+W8J@w_XB7pXNhS^ySjWIh0DGqd9WyK()5 z)`p(>>yK`;7WVq9H|cvUdmO2umbMaAgr3IV%X0mO+4RFxudpOQIqFLPsl?LqDsJVp zx;L($ADNgza;AK8s1TbwGqZD7E)C#zF~7ii-YN*7eC}{|X0Extm9~mA4(c@}>;a;R zP7@|Vx#GXux#`cY9lV(Bx|pWmOAL#}*Y{shET| z_Z(xBAbnaDKh)ckh~j#8qRJaJVgo#YkpEBq%l}e2i5)2qF}-3Fr{J_*!|KCk29qGt z|M=heJ2!6Jv{;zaHox9=BCa~f?aH^P0Q&QG2|Hv|Gy`c6J7H(j5ZOxriyn-as2mN> zB$IvK(4=Q=VVRhB4@IRl`PL{rdLjCiw-(GyR;muvqG%CeelWF) zOOJOgI2`5EL|%&o{Sy?)m4VS2J9n^O7`9(V8wI*EK((-wwA|uwsU>i+-rGS|c*ERh z+Xp32=5$}sQj{>Rs{}n-8I7q>zx4zXl+o4oe8zMm@R};4MpBi+SuQ z?~dX?TzCyE@i+~#kUqb(yt})Ph=3eO7L!%wJOzLTpo!9CWo@z&yi##lyjU@gAiMJ_ zb+xsdyZeCPa|Bb(<*_sJg37K}22TlSAIx)@kI?~eX2m!02z^a0dLVB=0}ZGK2_J=E z&1EgGptO+bXBQS|YAO`?5#XGi>^=l4KxDw>(B;6yQ-0>4Q`&WP8I0)3L~?p+ z1}Pb@a9(sSyZ*<2{@0_U6WD9 zj~oiX_4SoCRBzToQS|mu^RNj)J%$y9e;bgD zy89-l`3(4(gn$sw38W6UtDxMbcAvay5ikke3BT;=p0awaCj2Zx2^j?^o+qizf$jI#2;OkiTBpNKzP1ZAHu$<{1mKgxL@=^ zTO;P7;jmNw2yYhMW5y+0^#LYBujoSz==SYo#Vi_Ht0^#U8x1D-LgpP1>vabFi(~9j z->}FCk3`OH*x7@~bMIk_9L9&xGvOf$Y;$^JK(*R=#JxPwc+Eu?uo|_4si{SIbfGdM z!RbuS0<~IFhs2LiH;IcA7}wFItm|huy|4^@WD|nE z<3KgT(9Qgitb`}rSPYHpFH&`)3f{Q7R5h3!urP=vlsT|_vdipob)fsJuimJxtXkjM zom*N4RUa#MJ>QroAiQa)tA$xI?h2+3(WBJp6k$!B$UhkM)5*%V<|b@{nBkRa*M$Zt zGQ$$C2f5za(opNdeGy^fT^+56q?8YDiWLcCJjN(8Ns!mNnj``<5oCdZP=h9LsA}}O zB>B)g#|%I{=AVe&i|rO*Ce;U!XXLj>8N@TpsH+c(F(B_DYE4s$c&*p+j>;3MCOzCz z-L7P-CS!Qj@kd0mf<(r3ZN_BFU8^fAn;Sc$qhmk%(T^WI9#l%t5wak~f#}Qy05vqo zS`*$ePrC}xzAIL183j28{4^zv;)9#umk*x&>{lORVyBuBrcuJS_YUz<)IAB!iC(E? z4w5X6M=L5yso(lc>KpIgx^S`Y!o^GL>)WWe$mwGq#foI2s;#LWbNji@j@9LCUw3CkX)&VGr*|Ly z#gE?mAO5#LdHQq+&^Hp?fufJp8ig)5S-7D{F{{tc&8=it;I4rw9q~&-6=;waw%K&L zj(!c4WoBU+EDwX_=GN}dfBk7HRf}{8-wXOUcPuO{&RY>I9;ERdt1CduLdox<9^sZ)jxl?)|58bBnjX#2;gPe0uTTgQqLYODr>? z%4%_3B=Ul~JB?+ZX0K+wczN{^gNf;`MgmmCnTKLKKixvCV3gQ+EI(s#=MwqigC)ec zOZR?j6qBFkQ*1>_4-=`~P@`*NO;;FqIfK|s;(S%#btZ}Os=PFTAv@MGB#u}zKw+(B|j(ZQE)&tE<=Ta!L zog|k(4{2lAEg)<|l~Z1u)Kt%2M0cB-!|oAPS}`xgTM(&1r;dB^ z;8Mehd_PV?-7GZCp+ znt=@{VO(9Kfnp9orK~;Oh6_~p`a>%Ob#nP_BseRc8CO_-1!6v1$42p*jYwXDuH=5_ z1Ng|(^^HBf=McBBvSYMDP{x#&PP(&yTXQ3%3`^PUHtwf@91b1O=gb&4uU~<`<*hev z5vH)CtM$z{UqK5(_{I%wd}`J?Jh*bcyCzkQ>!r1oJ@mDLqJtzax38=oNpD|hiy$P|m&)#{2e(7$8j zlasS^uq>E~FP{f?f9>)>GF8Ql0t$e1o;@2n*xO-dv3j7-@6%YcWaUcp!fVmm!|{rj zaIhDv6r>Y|BzW~-V@IPFt?sFf)%@USz(i#QUMsE6*Ne6;A|KyQCf$5-CCdHrJFTW`MJ-`~%(hKGg#TgQ+f%PQlp zyW|nAaBqJHtq5jADghXV%VDG#QaHlYuLDwSVy>h9V#QP=Iix&*Z6p$vo9k;b{AlWX z|Jt!OQ6jKtW!+~TC*$HUr_U79xayz3A-9aBj&fAYY7eB#?$(qQ2t-!mZBe+7TqhEK z@v`V$OH0d79zNP$-$bl$Y-|QqLO;V*WpHegcn8l$$9M7nP_#-k%*DkOye_EsU;O$L zifmhXk?K(p8Om*E%42|+WE8;tx4OD|ZFQ9z1(~z2x-J*$ffOtas$Hfr;~W(2?vY52 z*45S8_?>UQMIo|Wqd81jwsDt4Xl1;X^atC@&!m;0AYdmkWMMxdpgRs{!K7Q=Y zB*sE&tc>BEGZM4#Gy|IsOWv~EOgx(`!Vo=UHYCg2PUIWq;14T0;vF1~}%GxM^D9O+;cY53!K>E;G8Qg=gco7xyz;ExZ!qb9^*a0M^tY- zPYO*)j!DnN0QHNK4oCEP_iasw%~=l-v2`5TiZ`>D4wmAX>UpMXcs(+N_Bqp|LoNy? zhI51~j}D6%H#lIXPK~7rC?rwK&7um4FWTue*dOfcS|=gP;>{U#PUqGxJqcBimBqPK zi462_6N5sfYM4c$vS1U4vn^eps#duVbR#3jv3Z(+ih#$%ILlY-gToB18c_7w%dfV! zwlSXb!g}~2;3zm2j4?2#uWoF?vqt&=N`a@(FN1F>>F+)F;NgSr_Kqh{$M4*Ez^uBw zx(0P0c;l|Fc7*0fL*qw>MDmFvUol}o_gJZj(St+2$8lAPI!Pkf0&wx;v0C*I9yH+hD^D608f+d|*1+ z**SPNHmPHZ0R6?_NX`k}+R@f@slN*nn;nd}on8{RJK)0Gkk|lC5FdV=dPlzOz z4)D=E-`_tnHV!K{yr?*jVtO~24JWTd`A`tp=@9(2%0h)PDbu4*FgBa@e56dyGJ(%6 zEP+#RZ)<(^)$8>QjhNMQ%B`4b9D_crLoD=Q%g5CMVU)B`Fm)V$ti?1Jo~PH4Xs^_t z#vIqClaGf+v}R8u1_y?Oo35+(N01JT3#=hnD-6YUl7-LDWqt~-{cM|S*uJ9vg#f#D zpme+ume;`*m4R%3cfX;b0q0=UD!2~OvUp9R&ki0Qv3~N-S8s9u{RfXH<`!KUTCGJ; zI+;xJXYYS{<#KPPrsm1hXVbF<4&5cN7nls-2)`4gvK}%tniyD4U z;sC7e?0orX5MC*k%Bta)5KTM`oVmE7@{KCmYdGL2LDd6-3Z08QdDe>51G#CqZT}jYV~P zRg%8J*J8kD5Orvu@uF0DiNiOS1@{PLxEUa0u2?*ELF%9~kSzD|4D>k+JovXPU>32S zaHx5dsAt==eNup>AtERC@3 z5{pHdhaROfEI)&1<%jq8OrJ}Gw$!b|ChbUcW=|B;|MjtB?8Yq((Z&V=K8t$rQL)5L{(XHOV_;zgKnf%7e-NB zU0Hrun}R^Fr@I^A`eJsix;lYZ8&fdvKeM=^n-9|FQg)4^=xk{$jTfy#Gfq^&saaYH zOArX9NCLydqa9scj*k4ODuF4D*9^q$;M1<~Q$5nxPYSebY54O#eresyd_#oLZ+J4K z3n`_+i}$J!#(5Ylfp;0D*x?;5`aqwGXcWBbxPU0qn5pe*Yu?(THXV$(Q0re9=x=PO z$0YOBH(zONs8bFkh6kN`;zk5_dRtARx}h$E+DFrYl(U$r`_u(i#u`*EzLN;KsjQ^U zlstYiJU72GGCGdXhm9NzMg?s}F_e>C6|Osh!3^AvcdFkQAZK1wvdZkq`A(ZH?rHAKR9ZtzsZ_R@1>hJzWVJqf9r4G`mMk9 z(wo24eg1k$StSifC-x!~kg|oB9o>A29r~2JxR_Ewb%C9emrd2AD5zAb2I-dSK%;7F zYj1CDn_pa{BG7*XM8$tD_{Ljbxqhv8XKTl0P9&fXq(G`djW}uZPkCB?`AA7wDGCx_ zNss|YLz>Ne03YfR8>+%8`uZC;E^KV?{PKg(fAz}`fHPA=)Wz87D4mCE1h$!rDB~qN zj}A?}VJFeLOdZCSbzabkVnwJ=*8tMK(9_C@qh|yOIvZ1LOsY**$0?B8 z5d`>dpE`8^LrSp4dIuY>zM!D^z3Vy;fVe_!WMzeerTM*!$)gL&gG<%>SDLE7{qCE; zb)oLtm+HTDzV2HW>iGO-U+SAZRbTI_e7CFet*(kU+soc)E4xrvLZWOcah`UVQ!_O3 zH#>8-`pbWI7N(>~^_DX~IjeTwS=-$md&Dbdr(ol(y-^q6shbuuygKuzXHJ=F;o$;D z(VIH1K4llz7oKZgN3PYUOeRCSWIyN6lI_HW9Fk^+2yzq3QbqtbW>Yvx!VYVp;fSOs ziqtRcQ7Y7&dOzEl$S1WQD`(r+7rnx!>_t%wyTAI9Iwt3qXt)3vqwcfcgSQ*hbO9w% zK%WSp`$b%nY0C!_@o0fOY)YX1yyU{wCmc6E45VG? zj!yxm+HpyDy_{Yy3>UI(zfHXmJGe4D)^`F$p8H5yx zw#!w=a7qd_y!x~VD%%qHl}c5yxX{vAPr0*bl1wGJ5()QQH$DLMlgPhw3!6JIxbLxC z!b4eVK?6g6qgTMQ!y|yyeEpp_yV~0*Xgnlo6X<@&6LMLndh!4w*+pqPu3K@^wWCKe znVPwUg{OnVkDojtPq|O`S zT6g4%ZZT-i`APkgKF}VT7fHte&yZkx4zNR*;|!J z@uqG>(p0+R+=bWP`A%p5Wjt%yo|CRFWJvH>Ym7I_iQMoMoM}zG9j%iMcR${De0&@r z3Ud6$`kFhgA?_Ru3qeKYs$dP zv$VLhv9^Z3PE&SN%Qi7}W7Kt7teC$sje~A%X)UX$qRlBkU>7T`4L*rf4Yd6vLS20Q z-M9YfKltwL`-4Ay|I?rT^yi;_`UM5u)zb};Dglwr5>ip&ds!fgK_j_E5x}A6SF+3F zqciv|loh)%nU`1B0sp{!1Lc#AY2dg$nY`s3&HD}Jzp6A|Sz7%5N4F~~%dcI%g!=@I zHJ{T2V5bGpIq9dPI^fRQDi{xOIJZ_+N35-8IA#yQsU4q@k8ThIw@2&|b3b1s9>)p6 z^F3q^$?;^WMZBw{?4rv@#ET}TAa{=Y5#s=x86hlu$vw*RT;c!7)Qm1OT`6eNl(uHr zafc!9)~0uKF_p*icu`w*QDiItbc%Ncx2 zV^t-jCZfH|03c&?Z|?C8ghg|eE^@)(`bVK?|Qt{0Jr?{+&I zLr*oHjGz#iOh-Ov_uzS+B}Uv~`3xBQgQ8J**RO0GfsYeX_3>at9+LGt|3%C%Lw0Jn z0^wgwd=`oj=o+CY{-%&Eu7)p0fe|!CaLZDE&zB zuNy_Bz}bnDEHMLC1|~_I5ROS^0|KsY_71z7FYS24@Z+b@H(s7rbhmH?qqpc`&C|g= z*IX^Th-PKX@#?H!q_)|zyT3q80;Xc!LBaZxm^0R0(j?$x3ALxZ;_>XX?VVjO-FO-K z1dq(R+8X>9arU2@or7}*YYIH;AX#VtfJ|Tlz?zA`irh6bw}9suBz?*1YRCf+9Uz%O z4#otUN>#&D!{p!6kbyoD*$K%I(rMQ7@%4mJV0L~U9g5hk2=u_JVRZyI%Mg!iEWwYi zU%iYgE5|8j?3+YjZK|(>Yz711`UaGbTRfr`)|W(r*<^cfkGo*2B-$qpm(26r3w`Hs z-J?ygkrME1K)*O%g6uCVjyKk4BFci6NhLt!ceFMWp%a36WFcLf+(qa>+5o|%u==Cz zefZJGfBI*C#*4?)MolBqpekCdo0>a$aB*BE;E$XYkl^ju;>uyZgCeN=G493&uUVMc zOb1kValc$Uk3_IxoOS*`B~4x;=3G?q(a<~AeXyYIdQFH&D$AKFxBS65Ga^FVLM(()256SKy9?|+01o6?wHoL^a4tthVm z=1wunyE|$_&(Z$A9HAeomC7TSKejhEFtxfg?J7blZ-6cVwn`I35+utdS>M@t^NrVu zdrY5WI9`~WXUWVZNVXJ&e6s7e;t9uds9WqZqc)GAHmfVkE)8@8qX#+Nm|;w5YOJf_ zin8M3N_xM$aucUCQdO=md~atf8V4wR9BVFLy$lr(cAn>QC`QF`> zNi5FphM?2nbTICKT&zKfY$`K-^vEgNJIb$bV-U|_3n8wZvcv0aZ=yAgM z?y{5_C)1yM#TYh52EU)_3LJJV4Mjga*$wo$(hrlwpJC$T+J+DK#a{z-3Q|-Ya_9->QidGa%o_n{LGrgCrmiMF4i&w8V zG&NxkXY?gH65vAzN5Szatf-9V{D6Os8<`{l((ouoY+ksn3E)g(a1@Z~svB|@RO;3? zz;p^buA&Uye>}Lfly!m7Kwh03Ilz+3oJu-)GXj+WA&IqpWqoUPbqz88$S^3 zL-f-KTqCs|t&Ok)+uUkyNO!fj@LE7O zFxp~eM?k&v@Ch@Gnw^SJ22dVwpyL*3F7aJN2iQL(-v92(`X&Khdb>MP$x5Qi0?q{^ zk3N8Af?p=@^5p68AOHRT3$2B6D`trSxu?>--JLO_mT@zOnkQy;PhPe4?(X⁢5Mw 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�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

39v1 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⁡;`fN3}; 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

#`JE=KvBu&53X5Nm2sv3 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 r_+bGgu0zw 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 z zz{c;rck@SvUtxOx*5xY~&yRObkBUL#!&{Bt^z|u*)(iloeoxXc!r!asbFpw`1X`>Z zA62?;jPEkJxFs;$ZfUyH-gXSsETi?LmrfRnHOD*Wr*_YMd^mdX*Dw6|N8f+y>5rT{ zf01Wa0rTcPeibciod7;hldpgMx4--Czq)zz_T|f$e)5x_eCbQiF@D^#8CEZ>7gDV2 z8Oj-FOU_3Q3M7y&Fp7N?{QS&Xrcb^R?&x^e?{K(e54{vlL;$5a}giev+V%MuWHoE!6>uo{l7!BvbqW1S@MH(Z5LmJ2zU z1%rS*PZIgZPZ9=jp2lE2ANvah2gF$-d5?iaJa|I?l}b{qt0hlXte0`-t@p&CWssS` zgeNyg#A4}k;?*<(vIvSIyz&fYmnKJwmJk4DS6}IDW88cy%M`rU5Ry)027gPkwOiFW%U1oKLZc*3t^xr{y^Ia9}}^$}=b-Xe=?&OF=2JmPmr} zzVb_mYB1V4wLPC4TGMv<=yuM6#StQdFt`xzIc%G?_pzG!__PgERyXqT<%=LqI51^tjZrYlaL#v!KdIL>G!17tmx= zqPvQ$MjPERmN}=@u8jB*wjVoDbx%0vj;Rk(~1qsv2+Ga{Yn7{ zrD>hSP!Vdl8wRHX^FnD^41!n9kZW=P#&2lRW!aM6>mm0uTK?HSfy& z1o9`^V0kzJflmRZ#DZBkK7WdLHk}+i|LZp;dw0 zF9m`tR7L4fbg6LM5woqNT6iMG1$h?HvG%8vIu0-?7&Q(d$k7QYdF^w_%c2;diMa>A zp#%gmETbTnv-Fa)in|e zDTGF`cTvQZjI4oB#1_jT>_(-eF%DCtgeg!=(>CN>$0ZvMhV$9{?RPKXwkbp0Vwp3} zu|!O_#$La9TNlOlc(gqp52{LO)%{AW(L0FiCj@-&p~P^!ImD?D2_<1P8kS|*)D0R< z366g*?)VAJF*7i|Sm4MHVDILTlv-;l*%LF#7p88w^0aqu9bUbxxMv6+V4ZJ_X{|?F zAn8S4*=oz`J8 z(ono-1O+_c{ivv7na<{9wpR{2vzafv|L)s={D1r(k3I3^Z~yi;s^Ne-V>zPv8oT>& z@1-wjU4G@OU;FNN{_5uK+wWhwwE5DDAN$zHRx;mzT5lJWPof7ZI?-o@ZyLCC1HEqw zKp>S$5Jfm@laV^6oS$-%GX#3>F;usCGGU)L=H~v<#ocWl z#cvyT_9v75J5moEc#Gy2#yW*K00CL&RSiylLD{Ay`To-q13u++I4%R}K+&v|vkW*8 ztOpTGaMl-EQN(5x=hIZKkRAktHzp|>)8boF-4`J5Bgj(jG^?G~WMjfo@* zo|dJ|7LmM!aQ)Kj$dgkrgi=K(&Tar9ek36tBj84(Sz6W8R0Lr4qR7(1zC?$85F%#$s7g z_rMXca$IxBIY*H!kolyWb`}L)DFZ<}Ws$E`U3Tn(q*eEb?}6cXvb=`YNe@DDI;9IO zxFFq5PpbnID?lR6N02nm+3d`Na$0go(7O*k>Vc{Ih=If@FTL9ScG5pV*C|o%=Rm{bKBV`c&|GgZIyjW7O>fBffH_NQ-M-uu+q#}02^nNJV7R1i2S zQYj_m1_WSdN^-KXChcxrHy&U(8U$bnbMB1uo$vCzZo3SHlDbf|#?ULr#VrteuMix4 zFOggHyvyo=n>gzgu^F^eQ=7^5Co!P7WtF=eb8&Ot? znv(k3<;&+TUWhCo0#tODuxgb8U;%F8;1jFhVi^c+4G4rUWRHN!6av{H6B|bSn3M{s zc8al6&gV@AAi>)m7s4kiZP?l@o;`Q=!AJS?KYsoCr8BeJBNaB!o{kntN_81jYYbsY z#||f}7@vd%gk6I!$ZTs|O=mS4zB_6jxhr>JYN(S*qrApFlur7^dC3y1Di)^clvCsf z&-0qhaWf8-Q2Nm)p87}s#>PMYzy9fe^e$(``&5Wk zXGws79gFT-+(As#)I9&Cl;p8NMr~wiKmcO7SH=HJ+It4uwp`~zon}~J=Xi3yIp|(x z$+n&x79G7lyr!Ux2Seo58m^= zY!9bRy)vMV#|B7AfN+F zO5bfophbMGk+dEgA3iYpp3}QPDF{kOW8sL=#G$}|2cl)x@fgE|@&+U2m1K7${^8`< z@3I)1db0oF4^JL^=(!aDr68{&9!1&_6@pvh?%2Wz+Cxn|W#rBzuJ?Gh*hLcT4S9H6Y8PuP)J3W!!hJ=(i?UfqhX-=@d%S!?9=nu& z*x@hk@T=r_Q9=;FjFe*7nP3$7o5!6|O7CWEjO9o|d*^AP7N?w!m>NH447w{hFtoN{ z)Q`~BG*JrPqalPp@e)0Z98mAmjdgh(ny}MYqohg-B-td9+JzvRIfQ~47xTAM2r51_ zxk0D_Rj!-`cNP`QYNrUGZ19{0wRch=C4MsIP#EIg0z)t=UzW~B>u&hOBp8-LH`=8P@5iVBtDO`SSLb6uzfUXz)ETIqB6B?BN(s>7xVx~iP!!7hKR-gNH|6ra1RrzP`TKrT>S^W1*@J3q3_f9Z`E z=a!bN!}rD0iRlItfmnJ@NAHU`MQl=3(k(d}gekwX!1^q+fKtH8w`U zN#y}9HX0Sh@~8}iE-F(<=9m-GBW$3rIPqo4R+Iak256kVNc{C4^%fn{V6tX!q8g$?^XD zc+PlNH>L)zRV$^4=}U3dq;;;yv&NW{X??i8UFKPtp8>oh#T6`Pyr*!MFc!1opppTo7#_>k}5@Sx-|uH5tT!<0O#hh0#XvHbc^wWFIAvOhURR zYWAf65qLMPh>67oE2ms#+&QhV5S~8LBw4?*u=v}*_0|9KzyBT3wNWmN@(sO7{1Zeg zg}IO#U2B86mgG>e;h+dKkqe_imMKqiv-4@qrC?0T+|$qhhr4AzNEgR;TuW&5rk;c* zTb|2YV){8sR@YYnNn!vGzXUHH=>dn6nUs*Ey2#Wp&w_w%MQ$wsez*W!pmm@D13e4O zvWZ6+Wpvm@yyXnzVFgcQj;jKR9C1?u^UQCl-#!`vSQWKDzhRr$o8v0hKDKm5G! zurt>5M5r!{?Vpu@y4oq3T>PZ2lIZiTb>u=x*P`+5x?!1sT_i2z7F46LMyE^h%}E@` z^_5gR33bzXV4npd1aRHjUgV)qvJ!ze=n~QNo(!q*IP_NvWtIrQlblhwm`t3|D3u!D z0j0=5E9eqb$Oq+M)=9$R$Iq2YYip8q=&;sBWge6VcScUGr`IK0q5yE>!lmR(YrxEIiNsJzMctgtkfhk4@|6}O{ugFfND@43;3UOUK+dV2N_*HR zYS;p=dnyWz6B9r@Eq9SAfS!#<^9XLHh1&CEAfr0o?(H4@gZ-U{_X9V- zwQgFqTf0ZZ7}hwa+jed|!puvKA>}nSx`V5mi<>LP0*T5LnAf##HS_Sg3*>L07I5Cv z>ZBxBG?{BKuaMMkqO@(f5VNY8wVDi5Fv$}+5m{jb2&|+7B*81W2+7VxwpDbF!R-a& z^sumwaA6Jm3cyh);OFin9wL|)TvpSnQ;!8v;t-^kvZoh$PGIzt$@K8>L`p?=fly^M z8fow{Xv>@if`?}R=(sG(AhnMMWf0vJM&pOVI-)a5M^IO_#q_SI=W~WSIq75|@8`M4 zLKgRqbOACqfF;F5bbCydDg;q<7;6(DdIzcZuH)MvBb1X~pB(Sp`uOcNf-u~&gzWI%SoVju1 zMJ{Ec)%v*-G(SaU-AV8Xxp?u)HO}Stzx&5N%WmKPxTD3Xb&0fx{N=d zHxsCaG`Y34)xYg8fAzonU;c)14EJ;sLF7*H#35>pky%y(U%MX^`NG_AF{r)6fncEc zHrkL?k@|GR7oz1U$>ND?uk&M4;!&?VWd=Vy-FB!zW-yv48U88JZ0nNlhUX*~Dnb$^ zv%WFbqwLN{1N2ZEt68l?RaKnxSzS$MRo&Df@xg3_1W$;R@R5*=&Z-j>sb^ zOR(`c*b>BJ#Yl9ZZYaE)?LOT7@cZ@NBTxd0f_RQ8&j;txE==f2GA?7Bg6jrIvcN`z z@sIAE{LWiI%MJtZFHi`Q`ngxG{e6GstK(4#2xbZCmtm&Drts0wPI!wU^4T9)^AwqQFnqfq)U)R10#fC(xk}&nSKD3PFb0m zwGhkBxWv){4rA~G!$OJ#4Z7r-cg)iKLpSeubp26%bSL4>7#q0+I7ZhQ%TUuu@Z1Co z#O3GzOYyA7-HsN?)N%T7)Ks43YDj>(X9`NCf=QW?=H`VY>wF3$BeXHf(J2z4ZL`=dPZ+x;nmj>(LCd>?v)%Mz&w=*{o_um@Nq1u%I;3 z%O#{-)0)c{&OiplsxhrW&`!oYZ-MT;0OJePwg!sx5oIUBx6nKt2U@GK61-@uokKC$ zFrv;11+$5hmWZsTyd%DHM1n~xps}ts3HA-JF(+iWhq>_}&jHk#i%j9^$i?Ka09+f+ z=>&E~>b+?Urf^BlIdDgo#rrq!WM!F4i3^q+4husZDbi`%I_3|Lj*VkMUkJ6rvW`Bj zEPT@HZ4F$=A#B5;ES{HToRMN6W-Az9Uf7@*+`d&2?~PQT_?UgZ-LO&Db(%8~fPk<) z!2yXbB(0eFpg0b+-gj;`)pTwEz}Kp79Ly0s+Iu;}q}C*Pw*s&LIdE1Q6Z%Hv#5~@Y zQr44$!Th4*Ll2Wg1RZ&a4}*?)%9TbC385tM#!&anFho#c${K?9c1U#aKM<{UrX;TW znluv)==P#UzDSHZKt`J8qB&X2mDOOPEks@l1%lQSt1e@Z68RN{_3xB{mJOLW^H}*%U}7G_kQ-%58ip_$)iUvz5LqR#-_oaoGCW88wD&|alt__K z4K?0bj;>ga8l)<6SlzUN)wr#z=~TB37$6xBVc;@{d6U#ZL~%jzR-WZBqv@7r9BW)c z0HQ;!709A``SSU%{qisTpI-;oOzD^bM2%!v3`r*r4mF<5aNq znaF$>HPJ!A!*AvB)%^TOLI3PT(CrcUiTaUs@K8N!v)+_P8*t~2;%$=v^9h6-*k@9X zWQ)6SUUSrVJcY~KWVy6t)1t&s1nCjj76~}$63m1823gLy3R zxdctOr)k2Ik&M#)(qq7!PaV!!Zk7kBufXOVjaS;glCzI&{c+o zFf$6qo$y@*j%jt$rZ@)_pXo*2rOrT&8{cE>7^f*^{vVQqbmZ+F2pq*)(epDWr!{{@ ztEPTPdZ2eaTG%C1g;2Q%v5ay9kro*tWK@m#0gUfO)eAV7MEL}$civrj<@JC5wKo}y zk7vp6)Wz$@+r!GK+kiR7`G5J}_*cpK>=DH29Ta+|L=`(OLU|N6f?eX!-dw4O}k%s9xOI>;fUxT-brt6AqUM-tI6x%HJ`i!Ua})2gaM zjX_>;DG_VR@;qx>O<}0SQc`4UZUoY#cdY_F6O(kJK?HgcrVdb?Wzgq+i?Jce>DPZ% zM4!SLPS3apZpIOBId^cJFEWRAB(BhFnMpY)!S0@Ak=Yr9KM6GuQ*JdV4v`+7!YkVr z)1tRVDH)z+X>snOkM0eMj23i}IGUj+`PS&Vt^*0{WL7OLE|vU;qVuUgpEnT05&6U;;(7Qc=K5g8)3n zwDV?m;+mOvyv>Wj`~qiAg2t3N3x2ee*%#dx76~}C1k*j!4j{)i6m)BpgMn!qgf?We zrbP!c=ze*jBw0*6bf>BY1HU$nRAScDf~)B)?8%J*V?W1nRMkzFxk-g~ym;YC(^T+G zRrTo6qfDvk^yJ`R7h;n|CbPmZJ}l>s_78-}D56)%E^V80qw&xu=qUV4$aNaa_(xif z(A_5RtHhpsY7y+CT9TQIszsTPJmrxq8Fpq$zW(NC0>%3eLc)~q{YjwaeB;f}3`X-Y zpER?cWp#UytDzLRPnS!khf^*9Gz2d!F8!6i^0)rzM?c!$+Bun>{ONc95vHgBCuz>mIB++j(?pBU2D_AJfezeY!!W_1lQ^L0fAF5R}X zNqFzm07q+^)@lR`a)7>Fd+~Wb8Zj)Sr$T+(a!vtrhUoL8k|`ln0@H_$Prv!Hw)S_w z{%yyI^~oj?le&OIDu4jH3tqhW(a3Rjf~Y{!!aL`@=oWG%1PoCM-5|Z3v*<9wj_><< zhBGM>;1zc!F_?q{VpHe1$eIKwpoRt|$7{0mO93s8kUxx8bu$~=M{$Kw;KHjPP*?9%P94`KR2NMYj z^P}RQ{(Jw*n=f8wSpkYhq*GB*Kf_tOgSW$9ww_c+droVdHX?GD$PA>FE-FUR<)31y zX~Yrwh)RdG<%E+#-$;VVrLm7-tv(KzCS=-$bS_x^6NRUK4H`7^nl`x)Tru{f6QN?}Vl>VM9irv8Wy+Mann228-g>B*i=u0bW4!)bj= zptW8u1@EjDj1zx_ZfUaW2Tqb5BF?bnBI#0MQKXkgGX5B^+qNc#i?tf{Qm!(b7oFi) zkro#V`n)9!0Ek=Q#mW<4gjxqG8jI#DZ=CjMQ}qs&9|p^O%AOWEos8iKKkeK2X{Hqs zU#~Ee3|MAKg-#}Usz&6&RDqJ_C?yG;lfsSqmZ~(dleX#7rT>38aFgDJYp^(_7(9z$ zi^z5Ap;EDY%(8-u3~(DBBu8%?>%sx4KFvn-1k}`$P&6^H1~Y!)n?O_>_i;sw+!t7E zQbbX?;?FX&_03&r0qTpkICGv>o~5F|Mhsd=Zh3ES{^Uo;yZc-S8jBLdOS9ip5=f-P z2_n}~C4*Da`?H9bI={JAO>4|!=ps)Dv>Ol!Kzl?-rG>=>vWAzV!7!lbwKia!!1W^e zXE?5mQVNWoBnM!(yy9b~S&QDDAeAOscwLR+KQg5-gZcT3Jf9mBg%G8rHI$Qmp86s1 zsg@-Mcq4>@gRR#X8!S>vO1dR$JQ&CstR{~hKWUMt&Lbi}(PIDsW!;b?Vry$}ZhpQf z^KnrOhdFf$!QpV;%Z8Cy2tj5oN^c#lTpaVEo;|Y(qXxn5Gz|kZlNK@*T^xlicWZpI zM@U@y33Mtrr}1kj`#NpUCSYry&LlYrpo ziP#m!qAE}L5W1)2Il`;@wyCWa9#by0br8-^H0adExfsgBaMbHohprjI-&><26N}(# zHY*=Ky#C?~VGqr`)aMxTtJVOpuuDfv8waK^3ulY`sVt%jkU$4pmz)gMFu6$&;=@b zrrf^fKqa9{e2g2!Pxujp@>aadu|*6j9f_eQIW$RP5u*S*5sl+qjM{{+e7aT&V@UcQ zUJ9YT2rEQ}5XT7~&}D~4J2tsG;%X`xYn#^iMk<*6M`iiKjVsSxy>S20*6)7f+aKJy zXDoM?X`^>*$HA9NS=swwv(ts(sL!2W|EK@Hzvb+ibtb_S#04^mpy3QakF| zWOlsIyxTfB`SAz0qZJK=LyZn1ATmMQs7N;54p=M*uS9}4?i8dtP<}5;$&~K)6y085 zzv_qmMLqMA9cQq8dKT*eJg_)y?mk5V?~b7y8d55cjw&vAIxtmcsSp;1`WGX^uf%;g zl6{0Mq1|GJ)YrhOh@v$Dw6`W)W_&P((gOc*{;47g(5&0Y5QgDl#p5 zi*#q2WSc)Sx>3832S-;|OX<8cr{!HtT1WNp7@0 ziZ9}H1^*<8{4XxPlXaYqONXB}()%8LTUN?)%*(Oi3IlI6S^Tj96q&MntTEi$7?YZS zojp5fWcA@)isz&XlU)Uc1`$!OoirbVTq7St#QUYDz@wlfUF%e4mgu|azM>{hjPysl zJNG~Qkd`FpqUZLc)&jiL?(lfp#J~sVDfT~XqjsyUSzQ=wT#Kco@Mh_>&JY(-V^(q^ z@_<~2c{U#8uqGq=6hm4;*`V%+7A}C_cMTrdsJFDw>0n%$%ymJlXNf-ghU6)}q7MPMPw%Tgo9o4_Tbfye>4$*^-Ul8&*h zoulEPgw;O+3oXG}A+xG6x@{gm*@BJ?nu3@c4W#7wBVxV+FCxJj6*?TFwh}@x>?=Ux zAA~J54qAzjmGlPbK-RMt#hW7P!q2@K$3!p@F&?tWZPr+HqKgS>4G z=MqEdz(j3e+OUH%n;VUc^RudL8Ut^~8l@l^*8JQ^3JFc@q+_Bnp}^5J4`|PYKR<{*Kml)byHbPKHy;{AtrkbC-bT(!%=gKOQI-{-d4sm zT^2%tt62qN7;;S2O;Z$Qjp9DR9aFetRn=0es;;3;EV@8(L1~?)`73(PW1+Ga zUwva^^UT{n`O(kb`sug6{q0LvuPiSv99AFBFNrL7M5XAfH0FxDWryVwDh)`aZDvZzLSnmJbFY)02ZlLIowQ2HR8$k))lB7@0>aA5;jZH zw8Ge+6lEqSxbi4P%K%)IgxOi$zHnyc%8S>B^Ya-PRivUQbo_h<6-u8x8N8#8kV?vZ z)LTmgmd=iDX-#4s1CEb#Q6dGxN2Gp4Zy351QQLx;m*RM`7c^lih#kKmBVD_9pmx(UC}O2ogS# zA=n{58lXjqjiH1?YtBinoAy}Bxv?VBRLE?QjxL*=}v|Fgf(}`i_m*w2iwUG z*-I1UdngDO-B7Xg8R?-Xr#xleawcuJfKk=HNq|;sq~mo`xGU?!(SWtu)eQ%1CSm|u z?TzQeI%pm1Aq?TKNNiYjM!Qim1pqo3wV6YH0Kkapd~8++*sc>Y>Yc4yQg^o%#c`c zf{84EtjE~+|BAB=-)MhH!tMT&llp4{z5^w>&9h>V4Zzj!bV4)<2@lxyWI=CObj4wT zMFvZH*iI{Rg!h1LvdiPncs3zu-f)R?36-v}-%)rSJ(I(|$!99C-TL17cog)i6fEm` zkG&qVO5c9_rw98;WK7O?&W~sHbk3>y|%FlmP^>gwcZ!VMx* zwoR+U4=HkG4(5zW-FnXy5SoM6v~6{ofIXv8#*|>0;&mI}yTYdz4%-~36f$Fz3d+52 z9jh8$H^w@nq$KjOtSnVgC<2mYS)MB*XQ5soF(TH$e+%3u2qS^~n$8NT$PTDm-m_ZkM%!5pZ=EBR5O~xvNX(#%zRXlUKOU7C=wL{k z$K3H=1{28eM~`KmpSy5=X?dj_ zjjfc<#>i!rzEl2UV~woKJbHV^K<)6B+;^BY8FSmcFNGN>O#Q6@6< zKdaBX<(0Kx`0|(E`sq*Vx_almcYpZf9{_?teZT$Hzxr1LlD;2L_DP8{o;71VTa-RL zaFTeVyhQsXh$kpRHBDX5W*TM*=wtrmZ zQjUj3-I%IvVHe_=q$5)UC(#ve78%o|61nJ1m&()W-sH8u;#Y0FL&G6CIg$I%i z278KATpElM5}|aYBKY7mX)~f0IXOIfeDlLsKKr>~ZBN(jY-&9_S)6M`Px@r3zf!el zgEmrENE@^ir7@70Ub4O51%aR1y)eV9q*{o_Y>}en=&mvS`)o-WQ5r&`?@y zGIh|1Iyg9Z`0(N4FuQbSeP?G+h|Yr%e|~=PTnsY#+kfe^zx}me5T!zq1b-xKQGsWU ztw-=;*GvxEdd8T$_i+2)`j7wT``gEYQy+0LZ3q517^U0~&XuIG2VgL+Oqi!030mN2D z<@Brp-`^M>zI;|a-J3j}jgPe{Wj;5~f*>zBOw$DrOE6?cgOT1gwyv9_!=stbo=hVr zOdpbwK>yDQ*2x}BqGv*8(?gvK!a<%2$|m~^$q*+tOV=M4qzNR2iiBW-rjU)lX&Txt zih?jv>C#~*NsZwvs^*|1Zbz1CcAL@Y(1kQ`f!V1b>I+L-X#hePLnhK*suXXrP;@L^ zD0#a22_<5j8BZFuM2i^BQ9kvk2#mp!`U54?U_8B!PsC-N-g7#{BBfaCjAN-Ary9vd z1ziCk7yG+=>iBqJX_+ZN=t?DV-qa{5DaK;{kR0hdBY8z%JMwWh?%xdVkA?n>&)zSN z4#8iPSrkjkDnVzCVy}yE!;VHQ+2a`r_~{aT&}uuI-TvT%S>2MnU_CpU%<4ufp|%ev zEwcOBE)_;6a5`;V)!NHv&T{5xO-;jDqOd$Yo=&T_r3q6CkYsb!T4!*fE%Jgf-?U`2 zjcFFpc4j@oF32R*<(VSLG%*22<(7-2_Pa(y*b=p~b+DAHJRdA9!briui5!qB5~Xwl zxF)4`pKc#dW`q*Vi>%0zZAJkW)VS7agHcAjD6+E5-hS)-yeNber0Z*qgHc=EYC>sG zCiV92(O@(HE*(s*!3D_*R0JW&scVJ$glnP&t3P*TnF4dWcMPg&@X%YsFk^`!)F_sO z&P|hc)3hXYsH_7fa75G?0A@8O2geT|w6jTB=A%K`YCR)hu64qJRyQaC<_eGHdEK<| z+K>%4$a{0+p@Q&MAg`nxPIzh5F!5EXEOYcuKt{L5g)_wLTGq!L-r6zKEk?*ZA&6N> zTQ{q9V*m`%8mFm?P21y>4})rO=KT4Em6a?j$U0b6Ob9Zz2fICN5P(WbMe#q>l9`g>4AWVogsfZF>RJjWqgYW3C#u=;$G2`?y>dk=)fcPM zMhAe78$YK)1gi5>BJcl8fS*s+{Ir^Hp1<^KzkYl;xpjDOvip?l<3bxXH$RsANb-7P zb;Tl;IhjKC_V%i(3hlNKXv+tKJTG{P6U2?-c>dMb-}uhA|0twZ4SnN(|Lec=t6%+U zFz2(BbMG0Z_D>>^c($n730`6CV6$zD}k!8lfpIP3=Sl_7=shn2@K%(-Vz+Yz)*dy9aFq4GD0#~?uaeeGrzNU z^s^uQ;EgYSv7DQCR(FJ4@$m#tG=E9@>}zSPN9x=Uua43Z^-J0x6X=t$(|MtkkR-$l zEO_Avg{15=Ho1wgO8-L1)CY2{HAFSv2hR2+21n=-IEtteW44i*_hr*GcW&PioUgC1 z3C2G6#w&m0_r7U;p9QMV7TxEiaLeQ2Kl*q6+Gk&TQRX=plqW>etrBe*r5aCnF1T-| zM@Cnn&YioD{=@&`e|@lh935S>sN;kxB55fMv`CHVEdFLBriV|$94B0CqTi-H39*gm zF;tV9CUKmLI7E5hgLaBXkzQ7xRVL0jIE`U~YvT6G1h`Zp>Whf-9ooB*?kGnI--c?* z9PhC3PC4w!JrwXtnT^ba{AlOc)s1~`XKo~q#+KioGIQ7z>_90lT`QetwkqF;h z0|jE0GQtozn0hju96uT11dP#TSwvt-7t0>@lVn3TN#`VCi)4E08)3s@NjIF7feax4 z3A3Ia1c{bwZ2!IvFVV>WHG_JuwQew_29oP#i0Xk8(riHx9)Kv&2oQ9JzG5GXl*kPL zI}&8;FH};91pynonK;c#pL7u6&@;jF`Gu^SOrAb?xV*U$o`?urh~I=rc+nB(>uQE; z1}Xf|s$qZZx0WIp626nV4JYFWJqfjc?9XwJq>VUnC5^7%`LQInpTwq0hKqh3jt-F2 zu(WNgn>D&>3{n2=PXZdR%`>%ic+|GGYPBWGWTX;xF6PxH@6n6bE)Fk1H5RSp5jfr_S+6{%owF$vI*3xPs zr0B=?t*$I1NJgMy&=R*jCVv#swA(FVgu)M>lo2&brQXuO;F0^zw#HRQ`^OLN>bCNN z2k(J1rfSTz0%0jrz*-LEGXiuY!GVjj1~yMWD9iDvKnSI)5s5(QkjO35MTjJCs(>Cr zo^JSv$`$2zW1eADOA82481+!sc#n&<(+HJm!Vh7Y$)Vb~rqYv>>EiOz=Gk)#OA9Om z<3!W8xHjo92CcKRrY6d7m1nvQ|1=U~a8Fp@sMlG>MaskDBVjPNrkxv(_V*73;xM@v z9;7dcD}L^|@t$o52-*Dyx9{A2^HZ;{EH6ixulJ|CXNiHer=9b(B1XPq@}{0LR6E}x zC7*@-VP!`DUHl676JusB^Ubx_y;IZa&(<%`PL8LOL)jSCoUjj$KYDcM;JKGyIk&kX zMsq}~%3<_1hlht-+gsL{&~D{mxU{r191KCk^{gm|fpAhA{)d13{X6%b{K@yeAJ{^l zfAPhlEb(5zsPq@{YCijw{M-u{ljD_RWK)qB&ie*S+qB7nlp-=|jYoeFpddmejjASb zwNUpfi)=W^!#5Q;eo*K4_R{5xl;Dj-!%i-gjHSWTVX5(EPU{?=Br7oOMU?Vb-Z1_bsVO z(xY`Nl~^Ygvfp@$C+~bFbWYlt`0{AD!!>DiQX;obZ6E+{x>j1%n8TmA)AKHqqO*}_ z7C+&|5WRrWI>i;$_3Yt;2jkH==&w?OX=FSa{_tlXJw2SZ2Bzux0z@hA#lf`g$u!|d z-MFyvFa2YG_4((nWC|8E#Dyvp-s1;_Go^pb+v<4V>4tH3`{teh_J8>sPxek`7$-*O zyu7ja+~u>_(rIwV#+X)S|L{a9N%)PvuH0X|sn3vL#xVNJ(b;G| zk6-qzxV|sgBXJ2+*wvlNcp?0_BYL;U(bNMy zr^2nb4CBZ)i{m4$@{Bo_4+{PG=~3aPOJX{-hpm^UuCx`c7&Ux+;ztudH*uq>pR3ql zEj!V+VRCrX5bVwMVf1~jhJHz%Ds89R>#@;CVK%8rsX~%Xl>~rO-_=0ToG$JJI6Dz~ zhMj10ipFeA-%TQZVtp0fC*TczB1twDvX^@-DPuGxyrk^$=?0P3(qoKO$|EF;U4u{XtQ`>Ure)NKL4Geq$BDg#T|!B5lW?)HI^^ zB~P{JPb>l!7cGp#7ldl|@%~{`&%!q4l*M2+#LLcRO;aC)9 zW9+Q4j)~)GeNr{r!s!|&43}OiCKXp1SGY0>xiBie_W75?lRE3BGtgLoeZ0t9twY+> zKqA~|Q|5A5=0s@QXpOJiBsGI_1sdCBdyPc+z~F0~gR6J>8K`fh&;!^nx`+_O$uzA7 zE=XE9L_W8&IX5ga#g&jn0Sbjit9;Wm&bu7QZAPmrOT%*Dd_;|tyxBG_W+RZJaW1&H zd;gKj!ZRt4ccL+oX*fyP@bq3hd-!ClYMOFTA{k7!FdpT3Oe|c4Ei||zE+~@NS^{3< z;o9o8l@*DG$Z(m>jWvM;{sxTRjkAt|2NG?rHiniYY8GUb@d|lq(%`bjq9!klXS0Lt zy?eK8+jt=s7v`mqC)4S4)`SwO4~Bz5nfcg1IOsHp8d?Yl{UURgNH*yQ5kZz1*txTW z_I31&=JeKDBA>C*5XMC>$sQ62iA+L4Wkwk58*Lhh?sL$f_^`M#<2gN?r>d&Mg99nm z+`~u*km!7#55pammCLz@V zDJR}sS^#Mt0F=kvXnmA#3cu|2u$q{#WNvLA9vn@7`rgf(AAhXtN}Fb3aUNC#9CX9c zXeE^8<dg9*hnT-f zW9_6y?2j@1T>WU!;{B9Q(PPD2Lh#ecNyo8O4mN^*SaOTxo0i#8vrB!#IVGJ^<*xcjqh zjU!MG^NcVW482{sQjPX5`SIcWY;R}p{U876war z>+a4@Ai-2wfjk_o#`uWUm6gW_(@321>?p;l>dUWR{m1{V-wcpR#K)>W`ac#fd3tta z4xJwEIt#|g4?p<$fB&7|pU&z`M)5pB?VDC}9GRX5e3lv10(_Jb7?EVBM0;p zZa+#PAt;iR*%!ytO(q$HqEx9lNn9iXL2B5=fhck=z0H^@g!Zxlk-{-cm?d|zD%?}Q&^WHVqWekcj=otjS~3~SeY;Z3s)o(j!m@fOgN%%Y*R0KmgFmK^t*1- z7^%VgXm8dleXvlHX;QCC-JWtS{aK}jpf5Qk*rEez<*;3*NkDkwDo2x5a%UyCKzi3S zaZz|Z=g7T_B{>I@?m@5+g7D$(aa0av*yyP-L?a_C7OV+}cXs`V(UwvK*})jwLAhAJ zi?(gshZ}Y2X8%8xPmW&YfK0I9J}%nk0*KE;^jo(tm~ z`k#G|OO#tEP?dy7Qk)2N&%DEU3g)z9Tm*Cb5TtcM0y?!Jo4P2SPB z$++wVT%{Nl5V%_qxWNf2`0DDC=Zv^|Ld#P(aE>M2ILe)vh{ky)1#B~Pl+yqqbX*Lx z5u!cbKYDoAwJno!adECJ%7E>p5Z=+C91jPKvlh^6F!^h=!j9)g1 ziOv=xLrjSvxJcrt$7;@^dmr|9YG^3PqS?XElzilJN|`w_zYCR@YJIa<+uZQp9~~av zy?guQWb*joqxJQTfBv8Qr-Eqr!ykNK*IpO(4}bW*OP8-c|J?ITNcR7!D1mU`ER)1z zB81dh!@B}^3*iWRDXFkT3I##_c%MnhVtxVDK>!^Fxx(NHUAEQk!QNqLg)VE7lRev* zwV>q?!=n^XFeRrV%Zcp7Wx6mDmUw|#o`3O6Z{B;db@TS4P?P3M!hSWzF3Fs6pVJM6 zf^(UfwJ8dabWqTM%c9H`??OC9v|LHF?I%A2lzxPt=?pB!dMUx-k)f=Hb#brl`WP1B z0RLa09oRr$F_gEc$fS<|Fopq++*|kf{)2_3#Vaqo;**X^kygpa-AfmB+T0tz7kFp~ zIznH0Bn3=@mNj#*3>c9a zWtvt-a$=}Uz+w^+`q+c?>58E; z=K`*U-a@Sn#X=AohrT6*3_#nl&{uWcI4IGePT&v}#BIvEPC}}~VlkGHK?#)=x&oZV zLTvP*0wGUQxUH06W}`9Vz54`IQ#g>y zvx1f5@!a0d_QCe{-116ZmQqTXo3pH%PB08kg`J)`(`xP+Efdj>FStYjhFnptYkcF# zdrahcNc$~`_}p1b;x#>6mMc03+1s^l1dsk?DaaY<5DCDO1tbPl$IvZKBNUI~lzf+@ zeJ(T4os>K;3O5>#-Quz}x`D;j82D_enE_X|w#d<;3EXyaFxh>Iyiby>&Bj1Bp9z3% zn%23@vOLStxYqg@l*ynvrLcCKVtGj~g1HDMW+XUPWN}HhFormHN1|k+$ndzEasy}C zs4SayDziKQ07e4^#{UegJ{cwHlQNK?RdpSh*1cz=K_LVm4Dj8xKuS~QS<^Ig^9$Cv zM?1Ss>$1F*#Jq(dZ=<0YZOC#Ee)jf{w)YQ6YA45+M00(_yArLCR4JJ>`HEo>!3mAU zj*a3P-2dF%m>w2sSDdpkn1}qZ3ABwTVcP0kGSzcMN%!{;4w}Ybrbx1Z6YVej@Q56CKIU9WVgmyA zEy%q>M0=e?ajk$LS&;ygj&p5&-I^&t=^dt^a-p*%+*ry%;BZBzp}M=fcloN}ktsMW zTYwLoOee1YKmCU)KDbbQM z3oq}rmmw|Y;nCr2GBK@j#_6hVRraHwycHntmoHtSpyPhl5&Gvw+iqaOyI_+eRIyL$QF-Mde>o`zIS zAARuN;ojcsZ@gI!M*`nbUr{-={Vc3hB{&BMh2KhvYZ1D@2;D#-e#!WhjuagpoJ;tM z)|);mgN%+RJNuMcb8%rop(>WXrNyj^GlPB}^U|f*$DSC3=sRdvVtmgbTiM|6{i}cZ zKl!izr~BIn+`C?wqRi3zf>ITjZ!9Q^Ez#Gdls!s`LP<}gq}{tj=Yt^J4i2l1xxELb zw-K9YQCo7>MS&7ssF+($vR1cAu61&(dbL&VOMmdkZ$GT&531(!+`*h4Z0Y$nb3#+HGO;nT zM^(`X`S?JrkE(mebDX(QQpmU9#Gv!@BXZIP3A^F5&umD^7t>KJ4sQ5IPLDJd=2*x8 z<2s%nqE!%5L=+0vq)_G-DeyKXtiZS#&%!oIVgM&VzTM0v-G!s=smp&SLGaCJYPQt9dRy9Uj;|5t?7npQV(XU2Fm7Mx6Gk9YPcB3WU{6jEkj zv3TFfwZerU2qu|bD0CQ%W-W|PF8rCz4KUkansBlf5i&0s5Lrj$r?SlB^Cl}57J>2N zjg$)7*PCE#H%;w0n?vQK0!Iqy3I)8B%z%0fZJ0?VlKo_95P+%4l}FvXt~3Sva>i6fv#4lM2A6p`Dh3s3AfA@my0KgUtgD*M%Ce|U zYuieeGRUcQRpStV5xTd(x3;=0gf#8+qmMpp+jcY@UA=lO^qJkDKpgA`OZL%pa_!=! zfHUgao>39F;nK{{X<$h2d@n(B%G?B{TTwc+UaI#@D%K>hhwVN?2^l!z;W!zTgTa}> z`HhW@pZ@rVAK$$B!t>9Iym)Z`{_*7PJkPFPyM8ewTCxraz$6`o?i6<6;>CxL9)>7Y z&cyc4*5=vsA!SwYOAH3Z&d&DNfA9bL(wBc>X?25Ch)>Ska{4Q9Y)P=;DN8UV15*Me zU84u3<&F1B%6BML*dXw>q@9jRC*);Ht*$OV+1gv0AEQat(t43Fd4%O+P@k&|WG`^8 z!Qw>5NJ|5i=KO?AfKiGXdXZ;;-{1MS{s;fbe{)pn$ku^kXrY8>T|#xF*)lLnsS9|C ze7A!lgQ>pD_&|n6629q$A#@nl#!O zS4)G$;vE+}l1%AV`|ybvwYPrq<1c+>J{ycu7=1b&sXj*Q7^;Hh=c0spM{#TrYa3Os zp7R6_bdD+;j|z+f&8aUlrI^b;R|BEO1#XjGEs3p#k>AZFb7?Y;QWy@37yRhxH<&E~pnuO06YD zuh7Fft7iv$-T|EPd*A!-z9WK;N~uQ3BcCdy^hAQkKdp~NN||Qj6*<{D=BouOn4S7;X8aUZ zuj26bgpjbHxkH~;j#-9!Ju z!P4fixi;FrH<_O?o^c5ZEQF~UX2n*MU0G`GpK$Le4^$k^j)E1R0XUvgL{kE|e$Jr8 z;gf2ThUfe7h*(Id0g^ESPPPvY0_{rPi?{|m-cAuQXGphjA2oHLbbW>cAEp0T;{ z9Jl_?M;{e~;p)bES(a@Bb3o8`h`6@F;xu`&cu^L`Xuz2;Sga@4mRAzk5}i`kxl;-u zwUTZtA*0kzMi3gUVI!&E)Byb{7#yI?P-bGN>xHNNsH%BFL*a`fQ8-R$-ls_*E|IVz zI3}1>(leJg$2*Vi93LJAX(rF}x^6uK&_&&XU9tkJG)SoPkY!X%t2(u_CK;uhOqt0t&j*DnbD1kOEK8K< zpbkPo)my8I#{dRsipEr4kvd$};4$2M@z|FbZi|$*|ot4Tu~< z@m|iU6rGarQ52L(;~l#y#xYwX6}QYCKDs|UJ~obxO9=EenEkY)I$}h+B4s9#XP%g@ zAWj_&@{AIc^N2CFG+=O#NXX&1#_$+ojow^AG7VA+VKi^1Jn%5K6~qMC7UNbS+_^E} zB}N7bB5}7Ujr8cyV;d5qu{CBq9?Z{=m6E}klgu1V)1rg`b_7a=ZU`oC!as|-1EJ-; zF}NawsHn26ZuH!6xV?J_+Vo&Sd;WBLKa(oO3oS0KR<$Whb?wrn@t|wz#|sI(C|HTql1=4Lmxo zpXG1)Wb;I-mN3SNv4RvW^{LN({`|#DfAXzAI&=2?7ryZ2d-sFVapzCJ``x#G`qr1f z^b3p2%akoA!2=l+&p-eCyKn#GOJDkG@c*!@S3mt}|K!Qz?|l1PIN7VO|Nig4`RUJG zf9^R(Px#66XWzV~FsRbtm8i$05XKY)7A10)BsNC-rIJvh)egourDX9ahY^YthSq;e~$w;Y6_5cyj zpP|MDvbJ-51iVAacIylgmL&3!Byyqd&$pgD4TAgT`daj+`4~W>6vGA2c}tgO18~7* z^@+iih_wd58&}qs{;9wFt4gr#tzDSmF-{ao+ZBfb8>mQR#Pn+g1lp9PLeg3Oo$r4C zd*A<&;0mF(Trz;~<+0(|-}M_``mL{gUgbHRQxM6PkW{#o_aAJ1^zj|+0#aZh&Ke4* zqd*)N3%Q{+fXHALgNKd5g+f^m#BBoQ*JQ9vVE!1{+e;YXurRJTYv*OVI~!z7pPd&s z4?;Z~DqCimgK=|yW%QYs7T)=A=gv+8Sh$JX76+?E{lb^OIR4;&;GR95=_5A~qFNbL zyX{B{MywGDzT&xD%5~{0<8nLQ|HFr+_hP-6nQYOvmb>uJOU52NJvsi?Tfg#4uYdIM zgZFRlKCa3`onIa8AL{IJyLeVMd$m*?qyl60vCbE>`k=`YKTx!0B(Mx=EcCq8B8kl2 z;e;&(Ak#puZ5ap%n%ax(>t1jVO+ct8!@cbD{3KjcdOL{*(O8Q@n4lbU9P4XLXEPiQ zVI;)*HoopqFwqP+`i)J*k)&PF96~tt1gADe<8AmTi(5-9G#H=iF+dQiNj!Hy+DFQ0 zSV9c6kyzT6(vLImflr2F6LH;#i>8Mq9AnCmN>+AKHc(_wq1F9(82(Ap`6=f$)%oP& z6NDu3K6P(Z7?j!+CR!$pJ4l#l5VdF-U07TcNJNV7=C147I;>CSj0l1+zS7B7s%0Z#ZVx=LGS`>LOZsadS?Ps3zYzP zxR;XyJqFA;mlQUlGxsnWofZTxhvDy17;(~S92PGe>6DX`t=ZP2t%uvkM<;@_GS7}q zj&m5*=i8oBx#Unpf$u)<6*XxlI6}T={198g{<$2 zBC+r&d@iSyfTzN}EjkT|y})?@1dj$~o&&QXsQ{h>K*CuY+#sNDz&y!JU0LsE6(m~4 zHU~W;Bon-I_n~oCWx0@X#RrYcIo%pe5=9hb6f)F2c)Hsfi^CKh-&nXO;1SyLR75q( ztV`f6IL%tt8O}u5*48M@kF>eD=CP`2TR?!yOh*mDDuE16QXx%>Q?vmMXfjX?tRN>U zdW_L{$xM9`>^@qXJOkRj*4Vmgtg$FnbHM8ZGD|27BXFK+U|(nqbS_%2qp4V6>yeK= z6(QkUC1J&h=of1VqY`Hud{x@GX$59=po2%+Gi`w425tt~K^O;=t|n>(lr>Q#iFxw~ zNNc=pFkkQW8&{B?QshdJ{FW&d{yQYe5JG|GhnBLsZD5_X!bZ>n!R~3P5@8F%Fxnck zJ9!749>-WZ9#K_l}MZUVZ(|JTE+57fDZ2W{hVQ z59P^N7^U-Qt%-AQXYHoBFL9?T(K!~CBqOVj_C-(m7ia-NbrxEAZZsq*kxS`}p=GU) zTa5q;Mx4s%Le(Zxm7%=DKq#?k5rSh=iW={3T)Xrezw!(J$M1a$WB90~%#ramfXqq! zEto@YPy&@KJ~CL+>6NFPDQR*?oBCbkl0@yDS? z@WXUTa0n$#!F)1YlxRQ`@73b`_}~QA=}P-XgCXd+J@_~OH8$YY{`sZC4CXBt@CC@<=Ip#Vx17I!-?iD|xibQmkdv*A1=(iTw8{DA zEAz9PpIed-ri*jS%ZuW8`LMR-nuoz96{18O=c+kekVjIL#c2KUw7juwEYCLDkB66E z-rsui{K`Cx83!FzaP{%s!%w~X!p7R8hmQ@&gi_tek1riOV5U8ue`(k}RD*Mk5q`j~ zkDolzYb55#9`jfDNC`D!_yQ44a~zfU{DLQIDDl2I&qW#qB#dGL5&dXu3tFSo^OcHS zlmbApry1uGc?b}O-(N&-P99nd99PA8}%xaf_wM2v&8A5Bw&&P+#z4HQjV zycTa7O<_4vaKr*M!1zQGOJ~&Zl;*e#v~np!s@8_;Bp_DS*+FTrlPpf~8`L@y4JA+O z8dW3V@{<`HdjyDov680BwCbdS262|6+f!5-64)12RY?hOlB3DVXl|^eJPr%m-oD_F zu#<6iaL=@t(P(@V>{z4YDnaBHW3y@bT1LnB8`dmDajo575FDTw<^oX zmqPaj(ooxQEPY4Nv+?Ms927LDQ@i!5_16)In%TO4^U?cnA0C0stAv;zm$Rzc+nadK zwvVPK)4D8Fra)*OmBpX{+{k27VRFz!ZsX}m9p)!dPPwMl*vaVzq*4wIIq(6M38BU) z<8Q}=&LqARh3w{`Bu^>nir#89C@_u? zAu;@*$jkZpd76#!VulVRwnwcS>iG#G6?R%sd!)hB8e?fXGDbt|c@{u2x`FtIvM8+c zEk1^4oEA4^DTSFv2sjqxX>C%lJ7+PAIT;euypar}Lco!PFNdiZb^;hCxnR;BUTi9oE;5@TU#ed_wR$$qYQ=ct31n^x}l*HP6DGohBZRV zTt0tgHkoAw_&?u$@4cYC2iQABH6+e)6BFJ+?|tc|SKfZ>ZEM`cix)fJxJ!esGxhe^ zZ$BAFP8-i!CHiSsh>dFd=@XR|tLy7aE33c$8^0NVF5mq6?|tQ~zxstQe(49_|GqQ! z-u=5D-}?B)7hihrg%<{c5gd!QlILH1<=fx>rj*&a^B3u)OUui@@JnC$$&Y>%Q16pz z80oX=>^qLAuH=H$k>txryC`05KiyY-0L!JO%B=ks` zawW7z6!I6p@aERm&Ub$NzGa<@FA@-@AY_I_F0#l}p2=}pFh&v29b$yI>Zqj1OVM%r z#*k`MEwGiy5S^w2S^#|VS-}3-35atAmJMh^J}9zTt6`37G#UJmRg*%(+eRCUqQm7g z>ldzEwBAZ5IThg;TG7aMcp4I;WJ%CC@!s^cLa$&7p{p`}MAJ45{8Z2xG zNzWzf$r6`=Zm>D%EacK!H{0%nR{vV%*!uL ztGaNi(A9x?lAGNRo_pzq<0ou*`AyOx&GwHkZ@kK7fu4uB0Q2b8qDdCFu;5lVpQ5=q zDb2ANnP5GC4vHRvIs46Td~@$`2Ka@JniG%aiL#x<0tc2blgL{!eW|9bhx8t#VvZ6s zanYxUu~Z_rDb4bc%fE|#_otG2MrR3E$hk%Den*3@=XVS=Ux#H4|a=) zd+{j|eJCk8K(g$1Y?2B!7DCPtM@>TcCS=!N7|8x?dcVJLq59Z*+6G-ekiCmBe)i1fe(wrw8 zw;1k0GrR+sQ}1m`5#eg20~l>^VxX(yKT<5QC@z_TtK*ML z$%L_9s2I=m=+50c_qJ;T^6RKnRV`-C7lDfa8A_1@TLe0&bbrlv+7&~q%#AU4Q#2M!OPOR%)t6f5*We3t<}wJ5~9?g zzEa^c>|tIM#lT^wj3^NS2I*Ftu=&nAA9*g&bD|M}t3lpvK)O#XoD|DkSM9yWPpd|Q zCcvY01Pabb#3n^?LDO45THYs=F?2wTd+d)j z((p5dOAQw&aY=`4F*jE){0qENeNOP64|k;Zb0{Fo57$A-H%3u0T87l* z=P?wA8xx_zowB4D0x|>#=)Xa174rVu6l6nEw<@w%Uw{4fojVU7JrXjzdFRf~_Rj0C zyricba*KmydWYaDQJFPo~+9a{ROe zpE}<9#+hJAxP9}3(Re;2Tm6+^|II)8#@D~|tv~$2FZ|M9`pQ>s-@fy~2bJLMAOF#} zzyICufA+JVK7ZlD%Gx^TIak@|zxc)PeDj-QoW$tTc`^9(=f9wodi3ytwf4lb|Mh?Q zpRYZCL8@?%v-$JmCyDzcsC^_$J77PyjwJALNkdOyWXrP{az`DQ+n(w-N(MeN;u< zv}%qq`GvNWYqHN?2mKOGWj#5h(2htB+*o6Y@{o7B)rlalZ5#47K6(83`0yz3m5B0B5nLd3(q9Kur}U(`sBS2Z{yq<1(%Lp%S*vN z|JgUc@=IUHiX1FjSfYD9+S@7o75+RtI@;dZC3ia30*G%?GX4Grs@OCZ;NHK z|8zDxnp=Ot2*EQomEwZ9FfKxO=i1? zvz?>q_TkCF$@HXZtapP<&6inO$PC0LRwKc-kSuIhts%1QB2zFUfms4}!a{{FeUK}{ z#*jEd`7G!e4XTCM4jdfOc}9JM*h>^=^eS6)Rs=)f^767mMi}sl5D60M37N{Z26BC3 zGhA9+xOMBEmkQ+v2wEeu@TzK=G10{9qQzx4tM5K}+Gtn;Xx>f2Mi$PCTy=O~a5`*B zi4F)Thy{>neI_DyrvaW~%OZRI)fdqi6meN-Z|c?$+*XP#y#!$KsKb*Co?B#tgm*-= zFwCB8J=ArLl91HKP%24M9O(8!+%5CK>(Uysb-8|~1?oSE#4rl$lDaUYyUB|j>>5}g z<2!U}(`wvqfK{W>7Brr)>6yXMf(ke^+gWX@RyP`SxlRJXNBpyCiO9AcPO74C#a@5) zCB}U?mWE-B;gQ6QWU_8?mr^12K{TzUX~gQ*kK%PF>jlsFo0WF-k2+JlD= zrjtoHZq1KyLB6CU}pGP-9k`5MlY3^F+>q|JVF0Cr!agGew4JNF;LG! zs(Ww@;{8;OKd$Ofd4|y>1_xS}XN$`VpStkkrHki6Uar6nI}CT3mqIG)*)#zpFmys# zrtX#QBrZIicQ}oogfh}vCtZTRg8Ep943pt6itG2CxSwQ&6r7jR(c`D8>v}eu2`&g^ zLRTRnscD+~_wKh%v%IueHx1yRyg&6e37JeNUP1`?&e0pRENo!tNdMo8;CyfY*i0v6 z^LEIA8cJ%sPrd%y=RW^AmFF-Sp?pJyliJEIAJmjmN{17|@aqfCErG!!7m+1^piAF3u=X^)ZGH&SbN zQ7|l-JfbtZE5^Zfdu|p)voPOb|01^)<)~v_S-)^;63?#-+TY&!=1q9 zaC9`SHO|m-(oCy1&$9D*ZUDH>wXvvs2~uoRXd1#@q-Bu+Qvj${Li0#&Ei@K_RSEM5 zA}LzmEyY9PJK;s4awm=C)HgC?XH^XdSVV_=3q2oJKn7`o z<^qZQ?3wjYhv>$gg@SsHa>hXAE;$-mzx!4~A)~+ASuS&hVKBZuIjT>N8S@0iOdh-x zgHDLJ$qeLek4ETcF&OBs2dYvf1i>$rf?F*Sr`Kp()hz|9XvC~*gQ!sFh#p3x4o@Aa zwH6xI*cKX-0Fyv$za&#whNw?T#_9Tr*ghErlu|UxmX_v6<1xn0YM4ws2A)#jFJn}v zV-WE&Q(BuiL3NqcEn4wg-Hb|gczgn$Nf9Y)lhmGC)mcYNsn(iWK9U6Dcx*ih5;xqW42?eXKsj~+i>S>L#I z^P?aA==-m{^6KjPnP2+FuRMR_xwqc=+57K(SXE(UA3b^W_}#bOI(PBH%dft^y1M$a zpZ@6e&wP&93u)rLapSqAg~i|d{om8NRmyE%ske{6>)g!pTeJG)#cRLnVWm}ld!-tU zN)glkbFvu2Ahb|u4NJUK)*)OB=YYN?1KjkuZV}3wq#XQ|q~{REKLfI4uIt(#>CxRwu2FEnZqkaE3(mfIapdK{;7ZD@BH`wqyM%x z8f>~a-Q-G@nOY1n)T6S1DV|pitfycg%(DVxYfzAljP+@x8Ho94t5#2IUDXZ9>u8W` zH1{4KIUj}Vo%T(S0?LW=vgwxyT+Ir*_5%>Bv;we%JRjtn-|ZYxo~bHP$JHa z#(?FLF;Y!L!ycLhyZo5RqQiVYITR6?5n+Vr`-YO#PFi)s6+D}!i=f(M3!w@W7oF%G z6JE0@N=ljLu#mh`7NwDpxnMGxNQF>!gb3fhbvtk#T|9qob!8Lskkn1m#8M(vGBHwv z)BFP8M!tVGD2v3)#Cws8y_}}K0B)*?4dE#}OU!Qp&_ZfgbkH#JyoHa~Uw{46pZko; z^Thj3AUx<}9X$=@mW_iw%B(^gc#tp-gBwA0(T&1$i-@t+mu>)~x-C{xl8Brx2DJ_L2dZ=SPB8g|S%39MKfPJbKCq%UPk{gOHN~@a1k{p|a zhmjHyft}TW&KG_cMTYZrl*QA5T5Gf`t2_rKp+{9jI#298v;a$l_$&AXQHFMQ6dcN- zD21Ffk#Ie}hG(6~iI_d@A>T9ZOA8(%o_nvXOK_9AJAvS6>?CC-z29EclQUX}#7vXP zNl}y)2t{?Uu36^-;;U_&hxhITm}$V(FfKw(fwAe25{Wuq5ejnS5nawiKAyWUH+SaJ zm6zUpGgum*J_&36_S2oc?cIaJ zJiC4O0nm4HU&L577*3PviPi=mSUB5y&h`#Yp6u+yU?e#>N)9px(h*CdNUkl%n8X3g zSr?Dq$(L>9@upeSvujr_Q)?Kj8P2*M8zi#zLp3MyT9iqxuIoI{s5_8f4~1PcstJFz zyMs>}gIK^(%s9o5(qdt(o7S_cYB1%QVx85puLlxIkKha!N0n#M^k*?NFdT~3dTmf@ zM;;e)xSM#8g4ePxNtTwQm_-D5R8T96aX1YO3sa~9c5=VGvOJwtO{HFZXq1En8oP?*EH8@vqZ8f<7^HK>DHls;)#YK% z9ON02Jt@W^DRLHb(@Lbts<;FTAhTA*Qp;&(WqvASub zQX4DF|H$9_+kfqU`JILv?nEZ|{2*Ujnx7k#jPs@iiQYIGzaCP4%yJHn8p{GD`O^6p+ZxBj<%?aRz_CHbh#B=?a4iUb7bNzCGc(Q2#&$STJ( ztBva-sKxq1I5f6smI!vZUt3>$>E)L}S&EKQ2?tXi2r6V{gCEpg+nH`FXj`mXmc_*j z7tr*cx;^=(l!QM#z1)-oKKV-%dk-lcxI#GJvG<&Y5z{WmXUC7#V3D${fWvgMUmt&e z?#3^TZClK*??1UUyZcVgg=6x|5(E{o={fTTdRp zvpR1cefa)nm{M1-$hi$IGFS|ete`sFF6YlY`uL;Eub&0uj;*#I->N42OUvgjzw(O? zVF0kQBHcBFqOxLnY>y7TQ`!9a*Qa-W%3Uj0Zj?)xXHVZ93|124x6}VSoj-|Lu@^Y1 zf*Y~)V~i3o0nbCOZ*}I(`oYb6X^uM;KFD!9#ZjSb6YaiuHPp6Q24W2u?F6+Fnk)># z#(G{s*%7xZ+)r2NM<|N$N#iBCp*$9nTxmFvtU}NoYvDkeRh5jQd7?F-IMf(s2Sr+E zQ=^esPgcMLA9vi*{285Km`Q{gTtfU-TmtL=y*0| zEG9`H*~-I*U@;DaOw&CNN%ul*j5m!&pXeP&*Ret)h4ofRcwlYp1g-2CYYK}cM<;Av zl+GF{KxB_bStex6u7gv$w`EcO^e6A;|OzpmXoZxw!9Qj6BM1|jK{?A(shYVL`VBbaV>%; zDz>=(Qk|I0AyjVaU~bQV3MQL^tZRszha(Xgz~h-PjmCgmByo}m0*L{B{rtnAhqv^KUF0vACySR^U~7&&dVrZ1q)DDW@g6rz16u~s0>P7N3v zlVyrtKwe~PtE&jb(=+s|G_I{rrsMHg0{LbJD$yc_xJzi!F21wrPbkZ zeq639QEFrJf&A6q__gnU=XN#5->_xFK9z#SJy)f3~!{xBiPx6$oj&NSbrNd&3foHEF1GLJr;rzmIam8ejx5MFS zV=B9D0inRhNMM4H6v@>o2QIF=1b}u|E}Z#0|Bm1OKmL#3(T!Q24?%Vd&NEPmf!-kt z5Go~y5^p};Ek=Go-wWHVwh$U`{j6z@gDS0!py#DYl5=uf8RtYNgk^#!A4=8QN!yaG zqb!Q0#l_8y^$X|Dtgb99EzO0Fn`dQ~7mOwg6hl*Y!M}Orz#`Z>H3&5$V>Xg}! z7n6@qdJ@4MRuNInO*#*iY`B%>)d~CXp3K0@bouf{ z4Au68)<|v*4DM;sxR7-!F6-OsQb0w_2A&c@JR`Mxl43c4)b}5Lc;?2Zxy+!|+TcSw zTzTQwveCSoJP_IZ()m~U{U4SpKRiDE@TcE8ck%i8)w5hF=6MVr$2?g@o=;WDY%8;p z@kru7T)r#^^V{$JUmIu7POT}X$A0UU94?JEUNBh!p4)l`D_LF~?`|DDes_=$=Qb{{ zUwj$U4RWU~tXSNVi`JTI;L2yJ`#+ZZw~D1JmU~m5WP^En*kn;l zGF;rl=zT?0STdh;o^ba*F{JjaAh1YoZmxdt@jd5GArwysGt)i_u^@Uxp(qlWggFxj zwegftCS{-KgP@X0zAQ_FC1owh^ZZn_XtHL}NeH)3J}5kiq*=Gi#e{! zQx1nX;uHm=&|(qAAGlU52|SQAhonu>)X`7M3$2gNC67=OL#l=x5z7+Hs{xOL$_L1_+Lu4dD9W? zuhBe~sa#=Y%GMkjtpqTC9y$`{&jE(ZvksPnav;?jy8m$6+?rc4Qp~T6uAkj_eLCBJvipP8 z^RjiDvxB-Q&E^I1;BI+%Fku(CC(`z=s1^Wo$mis20vsnbl)#T!CW<^%!hlYk3#krG zQgndBz~Mfew40Qv;i5}aLz;%zf^h1+gL1fg?&{TYG`5Cu8Dn@lXfKNm-I7q(!hx;7?XZ(TlH_o~L<%4wGc6r$!fo5}+o-8&#tf zBDzjH+XjW4#y6gc0_SC@Oxb6;BB2Q9h&|fPW{?1xbB1}jjRPzbV8ow1c^XI{!ichj zCzevrX1wF5##|USoPipT?k&rdwKUxSZ1P>n4VXO@$9a-Q4z(B5bc_noo^)9xBXU}M zLA{SBV|dRaPyW-mbU@8MS!x7vB&HpLH^Fb%3787U{EIKX7_1bL>BHH?Mu(fu7)>$0 zk0}rT6G(uLppTSS zH4;_X2rq^cN2)0DNI2$_(}48+;P@u&yD>VHye#Xw_RbO9c6oKxdmre}@87*&4$5F` z6NLm&wQiH!0DBJk*_cQ2e%I4I((6d-O=7u;pm}TK(vNo21f5S*iQRKE&?}se;NY&y zrB~dKm+jLB#|Z=~kkCb*eL#>|#&TH}VCo)@7v@c?SJu~_d+Ei)z5NIG?(IB!65z#T zrO|>}>%+gWnH3E2)Noc5(HXJ+qs3Q{gh57kXcOpfQX3tWSQHiWEJLzlkO&p18BUcY z(Vn0bZg{5X0g?C6AA^3CA8qd%$MPbp>e^e(4@kgK0KcOzTI)wowhj(Ya6qTXK#_EB zPFwgHDMxTWwi%1j)tI#ntu{nt?8CkYcgDmE=g*&q!=&;!|E2&ifj*Pi_Z<106*`lR zz{o1%PmCZO=M+*UR>#LuO0eHGZ3d26NBnwu2Hcn}Li|aV>oWGKKHxTT0mqc{yl#;T z##thu^v+IZbqGN|o;8Nd?Z^@1J7NYY2!R|v9jTP$WzJ-bB|}Lb9PZflaIzyqJK7yu zZ#X&wGbNlO?=)Kq)@TQe`xIoXHPRG?U%>NNjYk8aWZkxdaxkj^%@SW?xB7?TP$4d} zylM>TQpVVD5$M<;A4lT&Zbfz&rZQ8R9F7VAW=lzso2G5+R)2i&fna`E79r#J#`@Zr zg13?G7FQI&5Go~F-DX*_5GYxOqjTrZ+`s=oOE}YRK$6X7tBZ?g&zn_|Z>(_@@`ITt9d2l9Z|#46fdI?)r`AjWLg(gb{pi>&c_K zY3Ejh9=m@$+kWBF*OnH}9-lmr{?UWG2lZq+URI-$h1}<_zSxMU6ncts1d=I)L!m57 z6Bg@{PeYN`df-r$d|2ij1z%$^p|A4^(|}Cc@Kn#_Esudu2m_YZiq-)pg$@i`lj(u= zcW%7$GFQ?V4bUl!P;}@cj#D0@QnWSkmUg6Km!=nH2zE?+#iwgTDvv#d~A-cM-Sr*KIwElW`nsm1yU0ys;}m!6dN^pUm6 z{hhe}DFlitr@W7>D@id+B1LpJVDwb{7E4A6TsRaW!zNk`g6K?60M-V?0;tZ^Rh{SH z1DwugAANjlG$;cfjp?bOT zsdQHQ6hV(WV-4SZ)78Psak;<`5#1H3q5A-UBuMwX|2{f0IMHuiynHT1h$nbY`XuUx zUQ3c$M@B~i+2Ojv`%+RoB0ZIN@E_?-5Dj(k=+?re=eTB$wfe#Li_O=oCm(rkJ)u#z z-d(@?Cd=oUK$6pJc<#ohy*K)B_v5$zq;d7di!TpX&L7WC!rEr%R`(x%#OKbU9%dEe zld3v;{Ne0m`{d|k`OMXP>1_M(r^UHXkFTG#&FuKz4<3H}QvHr!OMf7PiDcy z(N2tCjzuUVc@O9$30Fh6Cnbc5+ejuWlg*f_!5-xN^QT2~K^v}@Nv(H#y?{<0jZUoZ zMTyRhJ`*x(t$62&A~`zlBKcs9YcGl-rCqG+Hdxf!rlC`tR+9!rMBTbIN@bg8&$_k^ zF6lsivT^ndVIC-4CzD75Z96}k5Of1cbWYLveP7=xE^7LW(Gi^=tb5B~l6T%RAK9X$ zQUVLLe}Dd`%h8`{_VBQQCB<4sSWU!aqr#O-0R&bMjy#&%Ja@rZeXzS1;#s%1pC0ZX z98Fv6;8aWV+#8VGgj6H|w;CobB?-d8nLs11P?Y7Gap3#!>5t-A z`UIW4+aivDt^)UojuRv*>6yhS7t;V5B-`9r!(bA~icmLAYFH_R?RX(6QJ3;eAoRie zmPQ{Alc>rPUu|=8;F_v!?eVOJYf`WV>HrF{FSE(adjSM zY#*USXF|<5={Zg|m`G3y#Z9MG2-AR|2oF^h4t6C~J{p0)I)e8gq1By-55XoP)j}BC z3qf!gjt51Kb@IF*Y=Bg1emH#fl~)2ShIYcLA!R9x$&WdtosyDb5s0pesIEj>+y(DPV!=*a zkLV^}dHs!zjm@9_7ZbyA75XV0x~EN(qL^Zg(EIP`#(^V+lf zKmOStymbAGD+||_=dNA7coH&9ZQt9!dinW>4<3E@yWjcpmw$nCp5pi*kFNJBI`3$8 z#QC}xxE&LVNW~S*A0U*D${|fOVSfV?gH4T+7TTU4oOo$qA{h+^RZ$%rPg~#>0)?f~ z`e1MGXn${UeYMPTm|XC9YAX7+Vc0BT9r}`JvMV=DGaAn|Ee^%H3dZkW|E=Hn zqpyGC?$$16Vqr8GmYGLb1>)Cr1v;Ne&Yi}%gGn8v_Qqh8v_uMa4oeM1_T_nber33{ zFt@(4w7I^twi>iVz^NAnbb4?WpjLq4KBDhTp*u{=IRMd^63i!Ypx;){roB!1&-)eV zsMPEc&hCATDD6DLr@W2*<%$lBxt*n?11*+h@uDk63OS7HG6;5Wt7_^e;i-wUA~>~g z-Mq!P%d#SblmWU4Q@FQ{o>g_gZ4ym;*Qr3SP5mT36zq?`d)yApXyd)`B9V5Bl$bF# zPH(pNN%B1{lP5VmZO3}pX0c6(J04>UMA8MKh062px_o72d3}A|p#wU-<;Y_YFAutB z67?A8y-PT%-(RH=z$oLXs4zNK(&5(G*}=p0tH17@uI_y=Kl>Sx4Us3TneIRF_0yFr zpZ9VE(gWG-BHUG|g|*ACu6Wb#Z+-ma(R+u>=U)EeSEnp%riZ20+?w|INqh3NHDEuKPB&^A7c zrYB9$PRW=^389{V`hOb=y-*5n3)LuKPL+9pb4*SqcRu`ZWo>P|xR`kHlfj!~vCh(I z`){FV7l+c*^ay~7&NSnqiAP5G6Xmr`JRZsY>#-z`&U70|#Y)QoT|M1HM@u65jLDu3 z6HcZa;^?y;kLLqXwAQ+5o86~dAH4tm(s(!mFK< zqAc@4SwuZjZ~}Nx=~3Z>NMSJ2J&17uLW1i}HZBW=hW3DT3hqDx8Ic*76WHC;YR3sd zND!(dwPTK7aCK2nN+3>>4vjY96>_OQzID$coV0~W$IR+>TGinvY+J*0*x#DnN&Wa> za#U-F{M;&oc`BGE*Vk6UbnvN{u7B=RFMRPcuYLYgue|x{i!VHX?c&ArA;=>b+XEo1 zD9UgE{L7#XcqgmTO#%f(hFJpun2vx;qRNk%;Y1S6`%8G5*8B5*U&2UDi!mjUf>&i3 zvE7Exbe?46p~_T}m=Z0_os5$zP-k@0?F@DxLuaq~J#tm!Fs+c8(V8+KGf&PhMRZy%Ma#v^tZCh{0?8#2;K%TCqAZK&UV0T;k672EMwCQ? zggi^*C;m{)M0MA>?!~De4D=$;7krE6ZF0Uc+{xlkhx9$#KbTus048D8OZWgU6WAo- zN2-)?S9Aq=JtX6aa{~+S*vz~8^s&&f5#$axJVfBK_ik0QjyWji$m67F>C$rsqzL;A$`$DmD zP0tQacK1i4V!W`Njh5tSHCJ9AeC&psC)>9~u_8;!+iBBI^AU_w3LCZc;qjw)j-I@i z<#WrI-WV-kaWZdbM@kl4%E{it@#>|HW8Hf-RP*P=`~^PSvW^E-PXu$*D@tMtbpD8!yH3YRuQ++PfM0B9YpZIUlmL+=h)a^jlJPwS3bTHRs}5CmeZ@No-+iK+ z9v4c)qtir`5--s3B$RxD^QHuxB&yPF_n_E}Shf%n9q%EgPnHoSNT|g`&x)T=Gf9wm zesZXSrN0LmO1?h&<=0o25$x_yC-_X67a2{)iGYT)e&z008iQDgQ5Wy98C+{~uy>#- zIE-{G!2x2|3Gqp9kpgoo;!%_~h={$Lx-#14n1Ww$p_>*62fYKjBy1Wmu8f8UA)NEz zU@$22tVkRRK6NWlcr@?UsU#owi|sOQMqMj1q>}U6pHWEqrJ;w9AYe;(-EC0)_7Pg422-V&WJz7`-u~Le8)nn(cIjn%a^ZTzdD*< z(2kwVW=9b72pKnLbxWtPgbob_CGw^<(M#z(vMEHaL+d=X47xj-iScubOY18O!?N() zwP?TxPj#c~wiyhI_ul!)aX_pESymg3)Pk^lPpWEbfB(_eu10fPKn{Wo^gbf~IaF!SoI{fa~TnZ@k7}xD{bxvKBCnbjA3lh%QGe9?@dL z7#m5Pr0V#KGfEp#?LX1S2iEgRg&B~Ls)4dX4RXc2pViuj`ihA0v4im#DhhsM#DrnD zh+tZQ%FG~_x>Bqa1yPME%DIYMQ_M;&R`Rg#* zj4Sh8#0DqP2*muk`T51AMelvxG*U_m5TTP*x$jE#1UV|gw_#!KP+-g z-|HmGTKzlOLokdE z!ymbt&8n^4y}j_WcL@5DfjnO{Nh&bUFHmqnT~`ktKK^dVjL!L)_0_>}c>n%A;D(=@ z$5@D%9u(bTCh~JKOkLm99>YayApN$KYMNvdjXbH&I-F_sw5n~7$vN5MsGQn%&gVsO z=IlA}Crl@go;(TS;v7U1Eer=2a=y&{^4vJw>G{C9SDo-5{ouXBqshp zTUcBUV2;}#-30YAS35g<&X|zSiL8!_h!~LM)k_JgHhC>EF{(r86^15YzAj?$o8l0V zN;2*x3^q2%)p$6d@#a0WO0*+Jv|1;yaAvicO{b8`er^Q1d))-olC$$gkwHIzP82g; z*ci9SaLy6})5ue5VyHlcF~Wu>g|DuwAVFGV1V)htPT3b9^eI((J zXxa~F&7^6KXJwu(&gBc^@xoky6b=Fv&C+6U+62zA(Ax7raV2FI6K5jy9iOa^W=mF7 zPBh>hY?Nal4~Zvz98q%IBtT1lqUj6h=_)^$pEwyNlb;PQElr}mgkx^2HMX?c0?uwfq-#a|qzk2nO*183vI%t!yAsCy?j`J*U!R4fQ2WO&_ z(JW%<{bGqMUoCuIgMS9ds4lhi`q&y_f+AO5s?fVu*MkJMa3n9y|bYk zklO+9vUG{`jv`tY@efKkoFmBhLTgK;kx9-FD8yz-ltjMECD+f34i>%Rr#CNLf4zG6 z{c`;^Ib6`w{q}gPo$UlK`P!8g3o?-r18&hXZFws6%-ubTA}a=ixs}&H`^9$uqn*i8 ze&!4$Phpume0Z{TZ+`uvn+@{iO}&4Mt-a#p(r{#(y|R3eS_*+d)3 z5bLn?eP0AtNsjgYcucsIKII5~Mca|53rkTHrw9s@_D*nQqN7Rij+CvCgl}sNvZ;1? z`>`aPeN@!3kQ{l+BS-Qm*-eS668)fH;tJJaixdb9V+>mz%DrDA898Wl!9+DXo%L)UR*2+7Io*8w`E>7byeg!3c)5#WuXE+pzPRnh#W==2w4kH zwEg5sK0FEwr(}|-?v={Od4O`h;FRUER0V{z2zN@fn{;MBr>FOAhEM&ZN2&b`X4v)Q10X?f*^ zmtUGyv%p4i@9u+}x9;p5><=?BE;A73S}jnzqBk}uFl@0uXL7EM<;;?@UA3mtxZomO zL0i-4P{6XTwF$(lAK$!PwYF|+?Di^?!Z>pr=raQK-K_FVl;r?vJuF#sKse~qFQx9p zpq%PR2>tKbInroN$~_e!nAWhiE-x(slFZm-_{8)Dy(mfSmkvgvq(m_tk*j3AFfhiw zX{OcgUTZ8-Dt8JztoCRhlU37(dPOe7u0&pBEonyH!dA4r#t#7;`2$R)ShwxTtUjq) zMA8dPlI?|((X5UU-9+SKELzH~?UZ3pY5?(-d9U$?>B}S%aN{hYbdtvmP|(;Qz`qnB zhoWt?V}MC(>IUW~%+QqQnFQasDT~4(T{^|d7zDM041*}QOsQ4_DNxE`pXSUsQalqV z3-9h9gwrx1m6fEjQe`DL>GWv^%auy$DM&w2Qigm?O0a-&0H&-mH^$AXcJJ_Tdw17a zUzWwf!hFz1*4EY+78W^U!M9_azyIj*baEV+8CTaf-ulUps~2VgwW3t64My0sjdk&% z;!8*BYMiJEswahnKrKcACpJdjk@Kgn8Z^;nQg+Gs%e*KC47JeMs}r!90~yfO=bj5< z!~5^O^OGO^>7^^zo`3PBK^UlumsXbXt>HU*;i`Y}g_r)v|LK1@3;}{$kN@x+zyGOE zy>aE*^;h3`;~T&K`)AIE^d##K9^7}8z%P2z5-1iH54ilGbT)8VAr7=1GNU0}|%;4^K|&x;mM9 zYw|%!u?d~u!Nv&JGA|YWevAHTyzzI5r;!OG>V7)znZU4gz^*-rQJ@ltab z#HIyV%rhZ69Cy<^{>h5kKFVL^*#cu^P46=j5bmPSs~!35(}JEFn%)968V#s4MbOKW zl0AO1h0!L0jP7IsBGsnfJ(3seS-Jq~gb9_NG~PboA>oz#a(p^A9YRuIw8UdcGGgcB ziiCE zr_e_Se>^jw5=M>o;D74susR;>AJDvqTDlcN@}j2)hFhZzGKgoyQA0hpH5zqE0=7lYVwLeho{hqPrL@-5 zS#vb0CN;FbbBP0i2p_$`^+3ivP+c$%i!Yxtiu~Dpi-HCvt;S%_Kh_XN;y6O2LWvdZ>)|0^=oDlENEQ25|7c4Wggx+Iko% zJA3<)>sJx&xX0xXG)A(uQ#27rX^Nz0TE9cvqQ2)9Cj1Ju36VcHH(m@_<+ata%o$E8 zTie^y>7=QffM~yP?yM3nVvkw#Ok) z#u^h@$gvY7!IC}=j+cNF#sJHlxF@1GkTS}ku`c+*R+m?|wx2$I{P@Y^M=L87j6s#* z9dQqyfj8cGBUf@Zn+6n6tM%UA&iY2^)N4Ci+wXpK>)xa7fC~zC(z9pJ%Ga-+HBkz0 zDN&yx;m=y~sTo6)xbY+((LC(ByiA=R+&ZtJI%~rxP5~*65qRRP1u0(}joq4K-nBCP zFLLW#@aavf_W0trUMg(CV2GwLP3nuzV?miJfuu=IKjk|nqw|IH=Wc#{ z=isCQxUjZIReMw$Nti17l=v#wJB7VdMLPk~i2QBE52<~vk@kzcX=m-fV>AEP7dqby$KBp1S zlIYbffp}?8x=C_)rxO{AZ-_9bO7S#NB7tfj7%%}1tHvlXzPr13_s+db7tXJ(tl&z{ z5se_5T60|Ov@uFZ6Zs z3A&RkOrkTVcNlrx?8hu(1%YQ4hmYQKyKh@o>ZTekt}mW@IbS(1vQnvXw*PSb`e)Bw zd6Bc(!T$c;_kU{J$#`xtQzfoVg1iMpqg3SL{G#>ccyF&NilS}|mw9!vzjyzgi!XiI zJJTFInmh9xj4v}2&Z)r?G*6I!Cm_U??=uE?U4D0}GYY5n*oXP3(Zex8+^vE8s>1?ZBvAv=tR;&Fw>Kd@&e zw^B;++n1YtU)KV147t6t+h{9=Ah9MbYCJ3r0u>s(f7;sWOt}c!g`X(``QBSr1O(}NuS+~NqPj(XHc`uB=@cp z*3%PF#u5)ZQ>%JUzi3H{C0#B#uliA~v7o~(fLLg1BKeg^3!GO{kpZul;2D&BGz3WJ zokHs9P=Qu)!FgTH1Q{Dc1#45o!b&gTpRo?`i&BP_vaYHjW@aHRnljPoR+FF5+Q`3` zsGI;ygM8XygJjsIt{a&BTGnwNlj|noUz0vSXj+Fr-g-6-#~8FxThpQ=1tvX_V5m(v zYpolo6PH|T3CC^>99QFYtEy^S*tRW3=e8!!`NmT8La5^%a*2Rnl<3aMW0M7^aYztz z<;taV7tZB_;r_|w@$TXF;dJ+C0;zno6%26yErv+KWwb?Mg=uSdPNt5lGM7Q-W}JtF zP(k$Mf{(|8J9qAdB;`V7gTe6l`0)P2$48Ty^CIX=i{tUy(!$2-;@a~3>e9l>@_b-I z4kT+UOLMD><1=eZ=QdY2R+ollZqd4g%PE0OL2M-`S&r=BDAvIqqF~NY zwYIRJy!rYo!@-aX5$0)9KOM=M&UP>u*C7F5`l_Q zHDlN?ME=3s*3c+WTv7{D_fB(&F&f8#4r0;K@zgU$Rzg~@p@P=LN=c9&COEQ=5BHVx@XkoVaE|y=;09tu z1jw4qMlU}pWH`hGcQ6u!vrM9HOP&uL@=OXQFx=Qh&#CRgD?vw*+)69j)+#A-B|?81 z4hBIpJDgNIPj`#_&gJKC2&qn`p{75fw`on`z2tn=27Jf33`9pKIgyF44dcU13$HW( z{O8{Ium0EHYtj1*Z+%=Y&yUWoubkOfURerL%_tz+%W{x+z`C?pdWtl+QTruum9KwED(VQ9-LqsNAU&mNV&@>!C@U*N&Zz zpYS~wN-WXB=Y3Bya4E$)spFx2LbZ^>_uY5i6+A>nZ_-^+E6pGm8rU}*RNtu)DkPi< zgQ_WVVr6BA3iOIA$1+5?>!GogRR;X~rb!G!pGep6kPM z_5Ap`ua?6_CIN^nthb(fl^NY~*J>X!5uaJRd{)=9t%rAi_QS6$sV-f6ZGP>X6N+OV zY}f413G-loVKuko#U-n!gRDBLCXYY({&R1Bg=NFZ{kN9Sy#R``SHsmy(?{>fxebTj zhg)~I*DqXtdiULPuY9eT-*m!Rku9G6bbWMN@0|=6H(jL4#Hcp!oB+_It*1f_JX6-S zM-Sg;^}*W8#$IFn!nwq;l_HG*9$;B&4dlg-qbUiv>DAD5#3c{!DxDuCMCP4@LfOa-eCwz&Nm-&r%hS2T zPeKg#dp?gPY{eKP-wg)J4x8*6R8k5qmq?$m=vIfFWeKOM>lzvmQRAT=R~#TiSnwHo z)^36@S!*KbN`eC@&o?$Vj}H%TfArC4G}^pykx&aYj+{OIx4?YoceJ=%I0 zEP#izrP0Zm#j$i=dscOnUm&_^7jUF9=SL@#VDAgW+m7+MVY#-laPR)3lSw@+hfMGX zj~>h_Gauxq@o-e+W56Y6c>!`Q+0H$4G0$L^fs)j=i<|3pQ|}*5A8zgK?H_?W#EDZ? zI7jb-!=IR9kVlay#sphu&~)Vu3!8p4D1t4YltYV!(qY}@sLt*whR*%qQLhvQ-3A`JgbHJcot93CCF z)-owqHrB=qOC$JdULtG;eF9Mh?%@0a3BMoj?QB`HnbOO^8v=|6hO|MPsDcf2%kTn9 z8L$gCZ{OY9Jx~%MAE4N)fU8~&xkgtOLzd67DBD&a92``2E2ILWHJbUG#vF!&r&GwU zQ&*gm^+XoAnj4RmQo{kf($;7+;p&YwLyt_eA~F9sKpX@hxpVfot(*egX?O2HWd&z`w7(ZPYY^#FFhI>^Oi5yxRZ75&fkroDjg-no zIWJQv<&%v-3Q2$x!>mX0St(^x*J0OSSOn}29^(6=pr^BBgV#U(S)t^^2X`Oby?y=q zjlpQdMIz^bUe7oSFps6><&SUQ3s~5b$y9J3u<=3ZLR)}tnigd3|MfrrcSFzGe)=RN zl|9%y)J?@;LX6^)MPqrRF`ynzQ33_@OvtcB@>F!zVNn#b$LOYeHtEO*>|*>LW-cb6 zyaJ61G_AU7cJ~gewt4Z@R|9PaP4uAjkZ#kL=P-*ewqQydj>3#}ga@Vk9aNd7-LlNJ z@&Cn|ko9=vGS>MII3{ zJTWM%j>0Uu3wU%6;rKCa+ei@WSx8m*3PC?Z^ujG95A`t85#?++L2(6qkC zRPl+$M<~l_YU;k=&Z9x_v@t$u-QHWWD{3^1X=A7*olVfMF2I)tXD??YID%XPV|r4A z$hQkM(W{4WzG)}zkEJha_k9?CHkthR?GLj&2mctpfF$~-P!tM;OL#Wd z!S1PMA3T#x>0CtA7QI7sRhz!VoJ`<}W8_pP>@yyAQL{8EqnO@L4AhT{O?ysVD9QSL zgnfsVceD`FLs8orrFD&SD1awW;?7X{N4Dce6Y$?~z=)1Dsu9nBG^3pL|( zGP!;0uGX5?W&*}U&>_O*Q9AL+USD%A!emlaGdw+n_(OyYEvrhQ!Mo{X0!b)wV=SsD zlDd%;aNh{05kMzr?a}`J;qlSx>T*bxA|PH#kog~8fdG`eMgkDJv4nC=MB_pU0;!wU zLS?Pd-;a_v^4rkspj1{+O&hYAkfLaej@EQs)ClH{^v|f~Vc|;0uHWaEJ^<;9q8$j@nw;w#&-amkJ>`Jg4!7p^P;IpLw{{*r-l^&a+OWt61#k=lb_h8iu)Ah(35EVQoQG-hZnV8{ zX7yKo^_QKqff*A+nK5>`Lyc0P2!^zJvc%!*hL=T>iPo*rIv8(H9^XFR-f{*V`y3z>=wPnIkQ|#e^J+)&gu}w0J7Du)KQa(&e=?X98rAILMs^(H^o;WqDSVlwplv zeW}nkHAaU4<>+n_4uQ%jQAHWhIx8uR4Jxw)55y%#lKqR5LPA8uQNoCh#Dp}a`IPuE z!1+MJopnT(8sT~AZWxQPnvvFqMM72Y2-Fud6#A4+j3G?JK!PWNy?Ng@z7#Si-@3NY+7~dbKwTRCFytHm>3(f&Z)RSi=mn=d-P}L9D z43v>O+dC(d5OgtBS)tHiAGjt%ZN+(@oD7^TLS%ppcRtG`S3POQi&5_6CVD%937y%EOQMWElF*1#(X8%FE3<;CEzyL5K_;<@!R8><1jHyT0U zGRzKnPVJS_RVHj4sl|!iEbUBDOnnRj*_r*p+gR}^Ichn{`#(T`QN zpN~gbv23|^=(DlSOzT>e3*ObLNMydedT#ani?e!m`-i`OuzP25?M5+LV^UgE zFP+)gd;IX`55BQ{vhSiAV* z@y@N2C%5KSFBEz1I8%f9jAxVmTe6&IOaMLK^axCnwl-EX&kk;Wf9b}ji*j&q=biOe zf0f!TqY08rnyARoq_QmepHfLudvXn@_m@_`Q;}^EZGsz_QU`|zb*rgbr$PB7YkE%> zodg}G!V?NS$*g^r7}}Gx^iv5Xs4|uQ!_W-gze(Dl{X+C;pooErGWK~Am+2^plY~W2 zUF=2d&)zih4RchsHAm<(9M`ou-CN(rPclQU;G$$E;9XxODV&;?q-Re_;_&Yt+zV>P zpHCC%{%3uH=k3;xZuw!LePGeai;KAtD*vQh89AXJiRaG@abIqmzUdOMDrVUmTgrE06PDJ~zbJ|3-9d%)tWU!E=-b>QNI`9nBt+s~J54H?%z!;OLNW*p# zBPdXT5UsIw zRi8{|O6AV`Y6f(WXExRYFUI0RfU^(Bg8{H_hb6VhhhPUo)lk8;QfL7pVQ>#;wBi>< z9*$TT56`ZxhNXFKJZNiZZImgyJX$z>@YrNCf_Zv6m!uUeMFDu|knkkrk6%WjkENx>5tIR04Kk%z=VsSNd(X*A(1|k0 zA&v}ggv1U%ED1JXJ!0V20okpPpoux+G*9|!*f~G9uyHozl{pjcL84U?6&pZqtGsyd z;Ni~BZt#!<;`l+C;XFfqq#r%-jAQ| zAI*;U&Y!=?lGFzHWS>xxN@dGS%K^|Io^WexD~zpN@Z-tsr|*0q|Bk=%HLBDi&y&ov zax@AV=`P>6as8!NEaumiSm`{}wOmV>pp4H{oU@=k{24uJR z#Q;6V1!YRq&@1B$PI!OPqNI}0leAt~StaFv>2O3-n9$qS`lfCuilS{H zz7}EM5Gy^K)t-U#ePeZDbA4rPbtyDKc!m)Lkt$37`o(md|;P;B8gb~IR({4 zwGcn!RGZMleK>CtYOu*;>5FS*t?2IrNeibc^h?3|h3@tY{C=Fs$V!1t2+fZ+pXTu1`5P~vzxL(roktIE z{;)dPDTgcbrGEQc-&kFpU%B)dwC3@>+do;l@Cuh%XW?VnaG~D%XuNdMnX1~oJ6gYz zkCz?ub8FYi;ppMpU*}v6%Ej8WLX;vO&$i$5Ea$3l?Xi#l2#d&C~!kv zgxPQ!$mycv(Yz4i;e!W3&MV6jg)sn+5?(xFSh0}Ugy@Lq4uuIHilL4`{EuzZTG%oy zNm>R=Ohfs?fBWfTV>?+q!|(8m}HDJX#;q9A!+r84?W> zIYCOJVG&VNUoPI z6U?-G_ir(6aCVSdQyarnLhd_-z9}a1`HgdOdE@+z=dQl+@^i1ew!C>Rq_v0l-T=g% z8XVt#gy_Uxfn9|<|0%%$I);eZnv%n}oD(5H; zgHS6a1v`Q055-9ZJHH^jvj%Dq?fuBx@(M1!eo-IsH-POgvUi~P!0moNca~Z(asu*bdgyeU`v4m z>34qj8{Uh+{oS9*6KWAdDNVGRcjc5^m)h-FHb43{2@*swFss}B{rxhBMho(G3JS$T zNGwBb45>K--f3-hEufKa-@g0qN4Fi%)O0$buwLUVy|0W?^LV6*z(}Ao=gtoo=2sfy zb^YL@_ogRP34kEsCCj{w8Q*=6kbya)xs=TJa&~5jQ^O_}*2D6HG@uqG6>l7B^m!mH3be$UH_B}5zmc} zzdnwLl^!-)$NK{&=4DU|c9i~Yj1 z7ny3CMqqpb^8Ize420@&JgF-bZ|t3myrsQ|kD-@X5o>mj7crmdMY$dxroVBz#J527 zCY>dWGoIq4;Re&CoX1@pt{AGPBx-%!R5zH7>!vUviQa_({S;Efv3|rKpEe{*r664W z@+)6>`@3JSRhW4ex8M8g^B2D;28%KqRI@|xJOtS3DxY7HTv_H77i~Rx@WCISx%gVX za83w)<)zPX_UXyqqYr=bH{bo{*14Cyyt1Hb*MclqRou0*oEKdy5syi+uu-2p1r@;8 zgT)n`?4;*a9=O>*{kQGi|KYv2KVG@=Syqm`lEvC9&F=fs)m}Fu8|>eEr(C--KJ#j= zo9X+1Gr#;R!imN>-luTkV1-1GDUpZ80AUtG`gteG7@Fxip|dAsr%XmzeBby%qPoli zzVp$O9mk}%mZ!KbC=up|oF*wafj)RYJ3SeG=r-sEREO!Z-s;w+i_)M@*yx0RfcM=k z)OctQtdFJDS}K`Aq!v!`ttEI$lz(x9Siork7Ufsmq*A$n^QKl*>xk67+F9AJm^f)&YU8&@PciYi3(38w)XP3Opu~Q72G(C2( zZF~^oB?F`K&>Aoh5Q%%$&N2*J5~utyF~Whg^oSxryuPSrGh!8kv{_IbLG>JGkeU4a zxoP0V`uJvu7(<>KsSqR7G@4faBzCxtWWzf+9L28$xblW{doSPTwE!)aaV7A{>DSy=!b%Af#16}F)xbUm4YWDFYR znT(!z0#4B2#9>23=`!&?#Q}ny$y-K%e!{y;)UVLmYBMFyZ?3MdEgxc~4;YYdl# zbtpVZSYc!E5C|=f8~2${zrnnp&Sp3XL{}0=R1Eofq!9Gth*Oow+LHs#VECpvJP^(j zNx)==Hh&GmcP0hC92Uy_nKQ-m*}=l%bJs5CnQH5*s%t_@7;EraHHv6nLQ@kIDq5|f z<1vtO&{m!}of+2GMz{2qk!6_R_Q>j{B)(QdFffS|C|Wtitg4_rL2Am|M&scY3TG74 zB81Yd;n0^f6Wr-;t>?UM8aR=m-U7g(1nQ$1k1UCaZkr5nluunMMK=TV=NOEdA@NI} zQ|pujpWd<%vJ3i(rafnkBqbaDF%*E?_j)DxE^!TW9?vfY@k=TmJ?4%_{X7cmxSWMO z&;k+A0@GW*yu22IJ-ju6OgWUj?Z-QN2Tykn{`=ak)tMq=VBNQ7Wb1G%55iJbGF|J<7w&#r#(!3QBkWIP|_@>MAn%`+(>2AwVm z^w&dp%H_*fKKSSl{@{=0Z~djuldYYxm^m}x{V|5U37<_}TcbmTBFh67Cq$87x_;yC z?K>w&6YCOdFGE2j5hK7~^i|3?PA1-{(V^K16+~j@1-;r~4Qqk42(f@J_*Y^|Gv`vg zAW?~@4XR08H3)6j;hw?b-T=|;&fd|Zt%E0l+S9Zzy>NYLX+bJjpD22}$n&6t0lCcp zevd}uK*uwL5^`BUWJx&~hJWz)XdKKBVWS8o)P{Y7uy=sLtf7Q&%d(`zis3U;xf0M9 zWu}S}U50pEcr+p9Dcfy-B_m}qT5(zp4d1{ow6Vb3C!kSM$^}mODW`v03qjmZ30688 z$YK+bZzC?-M9X6=DgZs)kv3?mG4Fry!OqjIkOyIPWtn_piC{h`e|W=iIqLx36k`%N zhwYe|HLfdCC~Y0*lxHr|PD7UyEJw+P&WZISb7H!X%G67*z9wbHh~79!1aTt~8zswn z8bXPl{j|L9+@F^>!Lv^GvhX6{!Et_pPiI-e>kwNt^?yPRI4^t@+#}K=*&Cp0GLedY zUM+g@r?UAZt1XvQ7sQpb=dZl?)}Ia**VZq6diVBs&2)cm?ZVOawi)~o9mLsGZt zlayY^IZbN}fqeTs~sbg1f&<1PL`BCzNOC)y_ z^K@@5Oz4fluc!isJTl@{85A&y6=jL3kjwC)6y@+qQ8CJB{%yd)*lo@6r%5L+S>AloPN zPT){g2uW8;0`Vf}!Lpkv<#5WX>&BsNh)#lREf6yrK3ixgD8^7P&~Y)sIXJmM+g2xC z1$k+pS_)0BL#gUeAMtUZlMs(e;t(cO9jPDI7~+$GbpQx4G!cMNe{wb!jplRe&MevZ z5xW>Ww!vT6eUnH;6(}OHtBFOs94<%+GABaPQitHO|4h*12{P zF<+6XFMr|l*0f0H%yxFLExi*`O{S1));O;* z(+J@ivs~PG{mpD8(DICKT)Ak0WNZc*N)ZqP-IBNj=nZ0e1d>WfL=L5%Ro;0@M4*j! zu|#_r*&*n?2#m$`4*y|9TT&oVMsmbUCZt53Q)#TDF_y>~Nrd1~MR8=G-Q{3;>8+oOp--ZI!c6s#|$iyZvpzHNfNnrNUJG@LcW&pJg%-nj0o8I zKwOJbAT2pj*u{TDJ4_=#%k$~1(#Fr~+3w--?!ggv{@Rsupa1kr7tWpyT1SqOHGql9 z;E57^^0+61QIEKUBJ|06ER#;@;{F(0ivO@r(|4$=cxcv`1C_8Vom0M}f$LT&niKm} z24tt#Eu`Bs8WyU&EEKA_G$ Z;(_ld9Oxeu%go<7cdOq29ZMW6`rtdA)yJ8l6u=h z=SvE)$6OxJ#~7 z53QQ=9b|=yVtR*Fq;5?}DSD}Bjp6=uae|tSbu$7=C6e(3cL6nzSkSQaLmShc{#R6z z5wQoqiAsNk3qO6EMqmq6k}EiKkr^;4?ra?iM2T7OC;v?@N-4v04B>9qJcgPY? z_UZ(q?4X>TYK{$)VrN6~=qOZ~g373Mq)7lp=wzy4zSGr7{~>f-7w{&z63g=o5=qyn z@1@)h&xGlxPuk@ZHVSG_j{Y z>nQ6B{VCBsIo>2%G{K)5mrq5uSXw@F2%66WJu(w~ee+C~mn}#l+Rq|-$2(f8 zEX1CAu&7|XBj}E%8@VVgajUh7FbS6Uh*(E07k-0o)g0wzA*4ic9P^F32rQ&Pg}zN8 z>;%YuQQ~3;x&Xz_(lnFA6dxr6mjmJ`l!#u)R8A9EBxWJQr;m#@Q4&#?))M?+D0h-D z;w2P;*P_Ks&|m}Uy`xfqZr^d8byj4!XN!Bf*9}dY<~PBa6mfc_L=%!Tf`&7e2DKIF zb=q7DHn;KC&OQLng$sN7nF=qSza*Fo=5{ir_vu#Y({mP49FEcGNTUxGU3`^RD-TM> z;lWYWXcUXFGehx8iA>40a~B@%9xW}-lc6&dTr&;Ys#+~9UduxxyU1dYmnB^Vs0qEx zm;lZU9~XUU5Y9<5?h#nQn-Zz#RI?c^P+{9Rj_%{uIYagfk2IH*M;eAasyC$FS!)S$ zX1pVjT@x%viKcBZ3!5v-p|OtoK#HbF1hUlkQj@mUQs(B!-pjaQhGV>V0%)ataDCP< zG%_k@X{SjEp5w%blW1~MrO@zn=@e~}pkIU{gT0XuoOKBh37UX*!88+MG2P@$Q=-*| zfoZk4e&hK-h-9p<>b9<%yN^QhkF7yDynOMz=n)pv+(Ho!9HBeu5%8(uesF?iNqgxB z&h-U%Y9E8S3D2B4_u#?pwY8O-H$Qsm<<~5(zXD6@q8O>K`{2V6dBXqQfBj#i$pT)v z1P*+qlr^S178Fy7uBD~{@eg5M{_cl2PY#Zxq?LwV6+Bhs?H4I6zvrD}8lN|ogzq*M zzKxC(obWR#G9^Z3=Di&*ZQtSaOt|=NE`Wfx-NHJ0q_tz3S_SAl= zc?!SYL#alJLehreLeSZveXN0oO=%4&!Xk}!9s_Y~-%CZr0x$#9w9TS9Q@1T;LfPKg z2hP_#1E{~sgya$@>z&=b$B&<`2FBgdh#mn(ri-ze21}M@byHJP492|HrmCAPSIFS5 zk58(iPG7BUw!f-!$YB5Q z-hIzp2zJ>xdv0lIxo%+gDasNh25c^ru!vK3>&e5TKruQw3ADnOu3ioNTt3FJIU=vz z-FmXSyL)tWI3AAzd_P!FLWs6hiiRthOHZe##gg_=sC#_HN!0Fh3tHG9fed!`a{6$5 zj|pZF#ey{Dko1U-mX?9Z{{8ys>HPZD0MC@p8NnvEzULjAyY!l#98ZrPEnoUns77*dPnBiW z@zcGx{>J&w{q2F5-RhaC_M6$XI@;CM%yD&6JEn%?<@FE%ba3~3E1OrAFTQs8@SWM? z583<$t?OdAG#4l)eY9Alg)nRqQaSNLaM{5tdqQp3?y2!T>_!_q)xrufh@6@9hR+wqz~QMk{OwN+)(8m}buhtP${$IaPk#Sh%L zgm{sX6p#42QM`r+_m=bv(2WspPA}9slDq}OuQ>%mbuKleU7{I=Q7nI&MM8x@<#%#; zC}bAmt^x=WEXgVN69GWm*5Y!Nb$+cP&!0SgBBThg<^UAQvm)djl<=+Q%;$L_giQ7Y z=UrXZ!QIFh%)qqf^-~hC#OKJj5cTl&#dW!*rb2c&0DZW%6# zblN`($?mJJ#{e{_!E^*URwbA@WBMspYvV*H^CGfMG#x<~$;v zxU)VIBO2p5B$oxv9oLUJmV?9D`kN{%Lk zn)p1+VYb3atr!f*z)F1}oS(K$+cH?Nx%Dy4IW1(`7?~-uauNxe?abS%bDC9ERZz}U zc$Qpa&Q-KDyDmAj#?WLI4WQnpy!BD-#6n#?Nm(w5I94gNS@mn<~jLMwK3^#U1!0haZT|3qy3%7kM1j# z4@TpQm#=uwDO&~3F^YGdE1C=u+=&hQZ~ZI(Tne5gz)X?nWmyvRDuj^Fs_NkIX#e1- zsau2U^|WrTT|8H`C(&<=#kq)^rbmoxpk%5eKQ^5MtS1S1)3om5j@?IF?KpezZ<1(YQO|+=v$=v#KsQGsS4>Rl0s6zP57Y7+GrfEKAyp{#E3-2 z`DkQ{K`jV`p~2F3(}WrdXIt$ox!{?n`(ahnJlWp6d+*`F{$X9W4B6K&UpN!!LFX6d zic(r_LE2K_7-cTbv*drI5jmYrfeh6{na(OMsDrBggG02!zC&!x`n@dYezNc>W6|Gc=MmPOQF!z4YAw|^nQ}ED6QmLs>I+wZY?Xu2zQk*%MirYHq+gYr~8lR*RIze{_bpacD#Ik<+(3ncmh<3ZYSQw&f?Q2 zB_7v9fq%HO&-+x~e7HIzPkG`ey@>8GsRCx7wZrw7F zl_OtTSqdrWyz~3JyG;YxZDa}c zxC~w?v~<`2m<*k2G04!1i==!8wGdW8yagi2D$4=@qXPaJ6ugS8aLfvk1@v9`DlS53 zY9eb{ps1^6RY2~AOxVXqM|qw-_uTUsd2b#)dUSkvG^>C{BhWR3t{YH}1E?CO28~B%aX(Wf>Y^OHRJ1xz-Sijhn_N$pjP8Ma3Ffw$jna{?tp4O zCEH6D85By1B)1;~%&dgf>YAeF9Aj zw-NhrOgqrEWH)>J)M3eypQwJx=b5mAJ&*wP{2nNUu{58gwW-e&dg_(YX_G!cJE_@{ zb&%wK)~(8<$T??X^ih}G7xzcT{2uwKpodNTKg8&lqLl>F#Zos(IZ|THNVyd)ul*PX z3(~PBqZLx8>)EV6JUo25y&Hz%U-?^pliUzwMNY|vQ`QBg6mB@J8`5n6qFodL{5qLc z07yF8(MNl;O79#VH%3dwNr^&x0{n6I(v^0ww7s=6Hy*+)fue9;WMx?{1OoC>mAPVG zXyYy7D-;uijm)HK8@ecf;IpgCBn41k?2{ z>6zf=Bia?TW)^V8f8$^H#{??7WXfG$UgFFLm{(xQ32`Ao7Ot8$aIip@B%)!-vZ`s` z|M>pPS2icRdl6kuSWO;%rjd6Hp2lTe>~^S`vS+g-yCZv7G{O1^fdEJu$Yp#`s&c&G zA^D<6)Vc7=5&Su;FsFrf`{5?5DloD?e=Vf)JQG%~VBk?1EJ*aS`_RmO^2JZ$0w)^@ ziIS;KLP{{s6Ox+u%Bk4Leh#KSmop8I1mjL7bEznp7j;MC!WX^lJaC*$m*`vl=;S;C zUwwbBhhY{IF#z%ztV)a#UY?XCA-EEvZuDMQ)enyM4^E6TN&=8zP?j7Khbj_ysZbxR z1x-VWZ?J_!JWw=BNea_pmn)=&?pv4L8q zNaMU<@!Qhn-T%!-IWefJ9j+X|xqmg|A3X0zOLQ{tfa7 zXDlzux~@qnBJZt4-J>iEm8mi>f>bx2pWE0t698uk4sZ%c(|7cz-1P~_>v_LE%m-A` zdHQw;-%I6hv7`f|1cU>D39QcqUBYSGI9=`B+26W*?!_;A#~!}*f1SPld2|2kdsDCG zFJ$FhHkxDkoYead?%z9m<@J2Lz|iU@RR$I^&z)&@e)cz3F28ZG{doEL&tp6vh*5p) z5ZPB|$NQnakk*?<@=(hOZ)N!5M&`w6JkM=AnH(-`UML_VFa3~egiHva`Ni7M(;Qqb)dk2Ta z%ITd8U_7E_Xd3E`7V*#`gO1lKnNa}M+`?$<>GsOXvXnB&@k=W!L7hW@1V1^MaLzD! zJ0~q7^f8Z9AM`OSA=9w6;acT%G7Ix6MwsX@3PPPAB?}=!E;H_!aV7{NOUp|^^&LPu z>B2jIcyvU)s%fgg9p;>^t4a#7zOh=A!y_!1;wNj-+3%SPR`+l)2Kn%&ZNnw@c6SGZ zLU5RH!t;Xp3{7;Kn`d@*cf)bP!ZDf~m*p`05HYhOY1=y#N?kPDb`ZzY^h#a+Tko{T zLYii3{ID$v3`6yuOGGqec}1ZrqTC(oZ{(tlei*!^I1M_6mhxmBik*g-)cP5$=~#=l z34&Qhl4*LWU5pJ!8ID#YI!dT$ur(}F(|Uv7vos_*#beSEkR0Dhv5`qu7Fn6R1vNq@klu8Jp(APd>e_S>tx}P!Ynj zZ>crbz>D`h0^BJK2@f{Thc)Ho_?WOy1Q{T)I5mQ4b(UuqOyjz92#Dc$Y^|y4+8*!M zd)tlHlUaQPUhxlEawj~a5)JH63eaW-ZhLT8T zI2qcFQj*Aa6O*YRaU_D}5^XL8oG6Q~c(7t{0YbvCq#zcOvnhm{-lH~#f?}PEq`DMo zma^LQQ%oQ>A*w5ckLnA`&q8GTU|Mq2KYH}=-ouB^GYCplVlzkso12I}a^w%`7&2L$ z*{n-REh%Y6k_40lym*4mq^tB-SYjFvz3I-!9|hlLYwY<;*Mdq3_l#b;&L`|tj$PL= zt$|rve)UUlQaaXAIc(}CScyKqegEC}ZwAdnDHWEg!1{D1AWjy?Ai87t@OTIw)vbf$ zLa=H&>msb^lO=>BUXmrjCC?-Z@#N4>eAjWF#a%oGhaqmsA)?vaHkU#>-x@os8{?e8 zEOgUZeQ+|{*`I{fad~O}%~xOi)T=LCyl^g9yavM&1&J!9kP1!VkLau+ed+_2c-H7m z(=SH1=z57=l*GH2beNJd(Q>C*JN2G^hv>Wh6_&myD5X|`d0rsqJ{26mbl-i#!ERvM z#Pf=Kne|q8VQOeh^4!PN34km@Wq{UZ;$WiCVDA}0=Ywv>nAZtA~pPG$W6pobD*dUZ+0@EMj zQUl*6OmkTlV8B+YD9Rd)QeNoSKSinmx^#}3#X)zrSscU^FXw2oz-fT| zar6;64Fq8eq(a*l)JPnNDELI396zI~1>>d5Y#$2IhRzIgUridt|JY$ zscPNoyvWxe#o%&K6oclL<*LZDkYjH=4y*iJu%l<03JZ+DGgo!vJuI0glar&vLj<_% z5l91W0uYouSi3{gk8+UFxQDd62!xn{qF73mlVl%k+>H4!Wo4LC1_8_saH?7xa&44F z0o&;0$}$-Obuh(d9j=(?pb1MvweIf)GT^giIUr+R2(qv1I?yKX?e7I!J40Ync!Yz) z{l&$3NL(=-1PlFeG~U=eJDOXNSr&Sb3%a7$(*N^ z-oZ=-#aLv8i-%Lf7lgJOty2%|a|CzLtsdoKC#-h@gh)XV4#P&1Jd{onfstI$iiA=K zR3N3ZZyKb2PS$}83kk(-)3^@V(zE{Xu<7G7!v1GTGiAr5nIQfsYNQ0QDRi%sW;lx@ z?9Z;76jn}shA8$^m?<5e25F*B637tj(kvIf+)1EG*>y$VeGP4e^(d1%otdgaEs69v zP2CcggNcFH5j*N)Tr8=w6ptaGNaI`qBdd0%ojrY0H(|52*!?mEe3;}$pcI8GXU;yE z>Q|q;IxGv_!mNd|g_xh8TSjv7a1YaI^)vuXw|6JOC)|LQic5}+#Kt;Jt^^A6W*(R` zlmKyp)+G900vZJu2DW{l!wQCgCxCrQHSM4#vp3wwRp=*yBF`~7g`G_SSVS>n`p(1{U{7#hdc(NKV6jLHL>Ed{BGOGE zv#FF1A3gr?qniQsUe$HeXr;J~m*dIpP2^VS>JqdZl4+c{qG-K|w4*{0A3xkbo+42O zB?7y&p3#B0ijzGHE}cn5cj&S2E~Cja*w+cbSJzee1Z@*z7Zg&PWeS^wXb0}Z7v|&P{Uw2w-1xlj z+}7zrUGGIal7bdsLPj(T<1AVn1sc92mjjg#vT`iT`C_zKgwLh(vK$hyiu!Qk-5{0~ z>Zj8EOyvbQLn;sk-4Tq)5vOuw+bsOsCc}`@t_$u1KBv_WE zkdlmHWGt9YXBf}j=DDn@np&0e7?48=y&F78@F7~mSQBgwRR!jc&?lRwZlQ-aLo~XC zK2P}_0;Fd+8UQk_D6R8FIe(RK-{jHQ&ixra3fxk2%4K-IIm zT}_VL7Meh#6{!I9Bc}*Rj+`tD7oQ6kxO(xt>0r8~X3@LIu!IRDsKg;3r*(dNduMNF z7eH&H!2k&5@}_N)l?S0v6mVjlg)m}bwkif?Qvp=ZrA(^E_MPVxOJFgofi4|0$7@63 z=_x*5Dn+kbGERa!!9plWv^6HZl+b9Ac$82QBpL~+o0iiF(~963K__&i>v7aGc?!@X ze0eCoGsbl>M(&Pw;iq3}8_Pjpk7fy*K3uQz|3VBo{E;pgx*KtVuceQ?KSkqM9g% z`l-`W&q-4g?N7Wkv_B2!)MhbZ+4S#PoZ6qkXyCC>|2Ppl=JVv;c!8eUD8e3a4C zQra!j=ZQl~WyonAG4Y&)brPUy6Mj>RXp<>^FsXKrtNV{0IqzS(e(5uBy!_JhSJ&59 z$MegB66pa{F0u5ppWx|JN!mP>Bxk48KRmJp!B!_;r$34LJ!ro&e`wD4fN}>g4Do8$2Fn!nW+@WugYd@nGM3@BPE0 z!(cgBT$me;2VvU5Wb7_x38fSaFd-(6ofxCmYMmyL{t)#z%aahVq>4kx##>4Z*2!5R z(3eWE=j6$?9jYprNP~4yDHX)=PkSjKTwavB!?L{f-rKww zZk*j1i*24SiiI1#92SGQ(J-)_275t}0O!NhFdUES>f~tq$>GkE{iDV&TwmYVlv&;v z$f$IKNF@?(XGw}eKSX>M1r47ULS^VYP~kt%ONexab4uTNe$!%%hmk%?GL`V0Vq@a` zkyLl2;EX>WU5ZIbPD!?@GPYoUpb7GEcO)=zaPRMh>36Sgo5Q_*V_iso5p2(d=?slS z)|#Ts1Ilje>5~kYMs{!Ax_$2K2IVyI7^xZRQ}10_UF$R)sT4#=2Y)?d9MWhu6^#Y* zbs1wq0CZT$%OW>zI~WeRkdu>R)53MV_u&;eryoCl0$B#<=L!6(FrsvIbxjB!_*jXS z6gf9=u9uR*{Zx$mL0PV@L8M18qg2&YWioh81t2e>hZ~r!Q4p~KFLVzql&!h({0sSD zM92{e0!XF}3~5el4Y^N>3U!>mb0&$@X@fHArwOX#7!}mZ)0z8@Z*uO_Q5*}s_fwTU zmOc(X(d{FLgzj^sz|IJg6mfDu7Sw)1J*pog<7FCODHntkSduWUF_{2*(1fG%EG#I2N;-_|puInM@Sv_{N~&@& z0Q<6~B-~btb;irKr1$GSQXkt~^Q5`Ly zD5GQKn~9JZ%nghdF6FxvE*W+ev{Iv(flvcDADO_NE%Ka}GgKQAk3!gH9jeavq#!cs zL={ouFtq3-CWdY$Wvg39Vsw`bg~wF9)~ zXe4MR5k!JSy$in}gHbZHQ}d?LN*t!dr4gPz_)gI`JKWycY1(FCamkRU0?tgny0~ni zy%O%Wk6*VP18Ltnkmj_chetji=fhH6RWrq9RZpr`1CMx?!I|(UDdF0hJj>+5Aba$5 zYjJ*VeQkMe4s1_}S1WoCBLiaM`6k?(KRlTpPo_i3EeLSvMv2oCPaYYe!r8cjE};x?@gGWyM%H-olz_RQLFIKt&B z+uGSnc{Ea+bnbF1G5IAehxl6icH-#DNl_OTlQbceg@?~P%WPli#Fv|#r{q|mUP8g( z#5z)zIYY5Kyl9w%q(F0QcIWQ>5QI0Y>e2jylp-J#Bu1SEPg4t^2w&GtmgRU${_x-s zSADBncwf`H&N5Zx1<^j>6ku=Mcy4tKpzYlNiGuejl*=h{2A_y209Qb$ztHV*8cvFP ze7__LSYxQIZ1jrgD4}{!AQGxcqlLH?7#7^YlB8?+==kyb`;Xtddg;Q#So!j@7g>A! zX!i7@!w2v0KX~WKt+)5L9v&SW)hsW^A$9Pz)r+qzUwn1r(sS#Zn_kFM@cpFsstoX& zGN$5DC?|lBDrj&Ji+YyJ@C6)0rb0^hn5U6LO+o#qPi;ZfX+EU|AHRqeRNk2$Lp2V+ z(d(C56-(!m;-~WJlgbZ22@35wfp4BZf?OM5dq$uXxvI-S=^S`qv;n`3_gqQ<6YuTs zmqot0xv8=o=)F;%t*Xiz9ZWLSY&IUxdk6d{E__ZWG&4YibkiDbkh{=$XT!GOVmum# zE!19RJ!@vulMHBs!5b4E%3_8Qk&h~6pp=GNrisI<#xNdb*&rk!mQe*&U_r9rX z!C44P5mHjF(;y{enWRK5-Z7)~!r}r1sF`+ue@~+^l6fEW((5;#6GFk_gyJ9>;yS}E zBTP5>M3a!0CMy)j`+A*B^Htx%O4C$&DgBN9#MrYrr2=0-|LP{mRG+r{oVkRhp&7XE zFQQ3_NXJ2n?ZsbGolauoLZB(F#lYRb;c#hKuBm z?k|Gep+HZ{TXG8a!8s^txRhv%;{-v2IFj2SuXNJW6gZ@>7U> z&Kx<1vn3_kWS~z>DV(Q|?iiSSJa2#Hq3&}iXIPaZ$5YhC1d zup)(P2FsE64wBVa!#vIZx-2u@w9Xi8B#6<1#*}POmNe{y-SXL@6~MkFC=s61oGO6iGzLK<}9oj2Gp= z!?Sr(5-4;9^jRi~vd{>9!D&46j7uUzlz?c=a<~?mYYC?py-XQAnz!%@Vz2AmBhIrd z%SlSh!-gZOO_We2RrCs)-vr3)MHe%1vib9qBeF|=AXKL{`}=jfj}WE3M5O3x_c77PlfKL zlwB#v5I00}XwqDSm3c~vdWr8RKiB=oj54Q@tJXmCLN{u&zL~lO9rO+^z84IT+d_1`?(E05s zGMQ+uqis8;nHhM zQpf0_p@>w0S|BCqr&X;x)`pG9Q|r8o8nAN-ljFGJ%P&mX&A<7rw^x>)&?kx5Ts288)yMnE+wfq?S(ur$>=%JL(#I zO*F2#pGUWYb*^d}sYGxphWIk2R5jzF5)hS|mNB5i6PPFR`t|EaM|(v%XzD6R)oAgJ zxs8Y#Z+dd9wXT~cK+oYkRdo`^)nuAw`Cu?8uw)Z@pG z*EY|Bq+nezLxkYhP%qpm^^_pWS51AeyEQkr5D;G{#}n@ydM|<2=B1Zk3NfaP39WUA zjSH&mrAwD6ZA4Mz+GwSu(`}I#z#UQKiuyD)B_TdljyHg_hIS_PjRZrd z4TmM&VLv+jG-Izti+Cr3_j%<=fKIMM*&vu zJ*(SR2x?fRTPq~bG7wvvDU3$|LFE~-RaTVSYkH!m69>Llg*nrSjNBmg8sa?|&x@i} z&6%x_8Z-1c}CuhwCvFm->Jum+6dGsGX(Nxp-K6r01Tu(Mg7bOU?5r%$>fsqR93Vq-A>Gb#a zxMEm8Hi+YAf8}6=uZyf$aqqKk-?Rczi{V_LlS0T*zk{CF#m@C`&rpjb){d#i5!ybc zhfYB!up6u3pGjN}+mvdN;CE68%C%e9wZ$mX;HeLWx?4AIt*@`mk4JPv-h*&#@oK@y z_weZssduzgLuh43(kz9f+~9Rn14WTGWQpepm1CG58I@7EdN79MS>YU9x2d6ig^+q= zmq%LJ&dBB|Al;D*k7!v90Y*1BH-wTq!4F_81m^)7Y?MJ!kSdRu#W*htP_F}=CIoEk z?(Sz;@;q-_fD1DQ&lSk&&z(OPz-oH{me6h8dSt5&BGG3)`&k%Nk<<}&VjsfS9MHF~yKMW^IeF-A?O9ih<`I zjJYa$s6iJ3v7HeDM`CI;db1)jM5xYJPEwSmO&L1-(J9G5lh)Trwcf3iq#H}6s6mothfv2^reL7pv!o36bbDPWn@pO(^1Y1-vy;nyHZc4S)H0DfnxhkQ9&dDC>#*@IJq%I^n8gJ^M8UBPn1n%b^59le*P%u^ zD4IqKAt6V(H7yWKRn~?&`Nrnv-eC2@`qG(|W$ZjGp(SBPLik5rHRYgeTTNYBNd+w+ zU<=a}2=A;wrm3UD;~5Cb<&~>f^Sn5&LeW8XKROQd%Mc|WoW)IR1%v*9D_70A&x;am z8KMQyn?s^lBu|8e0GurV2=S&UOV~--a-4^Az=K?^?1}qtvaB3pk6ir_Ujv@`jS^y(;6Pl-gVf*f#ySA<0c=>u*J9baBXW%_# zAh84ZInOg@4WUtCEF$%+K)IfEiaXg_AWa-etqfDmQ8Y=0@`2;rSeJ3)SLvqdl!gZB zNLg|UB%X9;7$fq0UbjX+v}>Wjp@w-}w0X#F_TGhVlG<@u5hg#OXi{agcY;Jsl~7D!{Zpme=*exdH8O#T_h4U) zkdBx3v3}2*OD81rBL&9NWfO-C6(+f~-V)Pr1XRUh1?QBKn|xByCS+}yW$(ZDeqFbh zFJCM$e2w@Uv<7^&M)DbufJtVJ{)Ciu#m7(u#~r6Ta>=MhiIciyvRzD46yV@|w1?IM zW3Ax*h))*1A_+MIB`%_fO9ptr>dJEVe^d5eO_D5Enpi}5$c)S^(bc-Iz`ejg41fy_ z?CkDvmgEZ`X!}6h2l9b`hA%YZALG(&W`{GF0S3Uu6|K8;r3f9tbH2~rJGvTx8NI8s zq9Q|hc(^#?JKu@JNF9TwYwF!zug~aM3Gc%MF^C9m;-pksp|~Fy5ts^mM%;ozuRTsm z$RMByxv{E?nz4!xsnUm4Z(KXI7LRhGA z7la&7jyv9wwNrYN1r8Rga<`Laskz&7uuKDWg9z`?AgSKl`pnYN zqp$jycW0|}e-hh**5ISb53P?58GxCb@;jQ$Cb5MAHd++|e&IbviL+D^i7!7so|<#-(wBe*X2-Bu<*9CINO)h+MH0l^~Ons*P4;^rmj5SIdb4Vw7&1 z=Te!Ys;c$~mX$i^MX_8T%DMONoru9-Xpz49@(cMhgwwyCD9HGZKA#61eGHd^Vrr%s%Q1kEdJ25TtHG!*u(++C09KV)XmdwGDUU zzgZ5{Tkb4>>vvQL6mA+bp~t>c)jZD~P}@VjC;w1HZAH#6JGcH)PWM9|HW8H%dXR7v z6+mmEAMy+mAcWmbag>s+aL*@3?GQ4{sRfo1R>lEj2kOjBhQM3&C>{~oIjK=j_c5j< zIpriQ1BM6$B)Mj$0l`?AORkwh~taNLS>F z8~nk11A#*r&Otu&qyh8x^y(syjS~~7_^3ROGU#5sKE2u1WvY^iNr2wyjFeROFgz__ z$Ri}|U|Vg*u8no_&vf2ENEP|VT1Y;5ZVuK9X`1c6%CZN6TfDrt2Z{Da9GMRq`5L!~ zLaFOL8h?yUI>K2_1di0{=+3dk8l9b<{`%MddgtWc7cX92UTuabIMTIgnWvdbfpTM& zEi^`Um{it_9ri(l{$NtUjEWO7TcL#!k(_};mPR0W=^;$lom%3T^HQ)T_!aPHvH60!iOgOlDX`*Qvn> zHe9tL(P~MIdlDrr9;$^}>nS-@e?Va}tX2tqLeBg)DVu!OjeMudDoT$xLJKCW!G;91 zcsAe=KpP}>^ zV#xZCA#`S!!9ZEFG-yG`sXP-a1HnuSJRC8H)x*2Tpa1T6QqN_S-9O5vFv+q-lIEPv z`r_rm!BJk8^40rD1{OZ&tPXan zoZIK@qQg5`T(XVkBw5RxO9%#jGs|Wl+`1RbY_*tKN?1ew_CnH#BUxt8it4c)?SkR! z;G?{K(4?OY-R$O$;Z40IYzqGH`#;F7A3nH8{%K&Xv@^-6mJAG;M`ZaYpM*_~fmxo| zEei2-!;hs23+5SH{TtCw9>cNJBV-e!F`mQ04K6ir%mKy3=2{s%blR^g(Bxrml|6!W zkzaUX{V$S@$WN`7TFD=~Hb(#}oKRC!H~VTYBL_iON>C-B2K8o^N#^DL=HL58lXWu?KFEbj`z7pN4r|jn?iRJkLQ{! zmWDIRs!HNi zC^XqTXO5+x@WuE3@)R%J?%auIOZnu>uokgZDjYINmPwE? zqZOfY?0aCNrBSQ8R)e8t&D*MPN>}~#?BYT^PI4ou&(ZP87#PHv1tumq-iTFR?jn`v zyNhE+wOJ_~F7lYEdnYX(?xLSQnv=u>jK-DH5BiU*iLUf0KD5zi1DzA485En44twU1 zm3hwdTkIt~mo6ZjZt(VR!{|LYdlq|2yh-YHMeuP=h{_w0{tjCxgh;W@d|tgW7GMkt z>~jz0r?L0kbjCx*c~jPXuEx+)%Iz7=V#g=tk?-(>fdGQIS}F;ojmN{Pla4HhQozg6 zTQqjWkElZ# zS}5fFqRg^9-#48M>>qspJCD@$y%4Oj@>k(uX=&C>!)i6}Lannj7m~`SDKY-BiSksh zlf-eJB}yls<=Uz`R@Ge&t2->UA+iMr5$*1=26whuhFEO*gmX5sQ20pp$Ofspq)*88 zN5$P`)IHSoL;(fYksYCOH0ScCoE78GEQi$r{lOT^(yP{3jlorPIGn+%o)lRTo1~vq z7)WvjQQ^5vnyQa+gf)6m*Nfn`?pTpFrxjce;bL7u7)gNguxp|Jt81yc! zO=4JC)g*8Q`Qb70U-su{27_DUQVEng6+-0zZL~x#k|^16+w|ig9Fc-V7vjjA4;yPA zhJvBWt6Z5^(Eni&Bgk9sj0i&#lpAVC1VS^MOe%?hI@q)0;NiUo(v_New=Co(q?Z>L zNmfYB*aLUl8}lE3_Wc2&7{nW!=q+B*iJlVzN@xM5D{uteSRl?HjZ=o}gn?zFvs_Oo zZacUo2lSK1=Cz%UmbSA=oO=DiqE15y9#wmcqgkP5pi2Qvr>~wpTOBS1&+8p_?^&Ak z8jM)=Kv)mZg8tJ@5W7OpW*|1ONuwv_m9N?LVYXq#;C?l_5MEwh{N^{mlO_Dl@saeA zerBX6`%gz+GpM0eRd+qj=ho;9IZNy5vaZbX5Y1er^F|=I1J$qyDk&YQA-GyqX2ODF zEHKfu-eF2&T6Z<6*HUDcJPQ#S6T*Ta9>%I}5PsB&xI+vErg)<%Fr{BL?QXY`n!J4Z zN=6YlvrOA}@}02Iz!#xo{^!5^xdfz+v^Y8XV!m{r?!$N5_dC`5sc_x5b8(e6^gr5$%^uX#~2-ZS|jUf=4+nNkx=OEih788%)c1D1L5_Oka-7!kH;MyX@CbC za6zJCJ@X$peRCj`jcJp63PtqA6W=B~*^GYhu@)SLUeBd=I;V@7gO2F>qN-xB1o=q$ z5C!Uoq2$Ilg)?A+9myOQ-HJ3Ix7AhvrpskNNFRv1R@fL7a3c0>;a~}|(!_Bp9Y{p> zSThD>J3-M_m4LMbZ6%M=sdXd}bBlmaH0G)ABe;y=LO| zIld?gL81=`PQG(;B1}I!h2h5A-8N0FJ6J+pv%CP)5j;%lyly4xTCTY$vQ=3o8ZTRG zg9GZ?G@bPNU{dadtpZ?5C9Q`EX1!XPBnCDn7IS`pjxvJosqfSsoTh2j)Yu)Qal*KK z#&{7NrQ*2N!K}B3GL@%LWCx(e#{+1GbBj|n7rcD#=Tue9x5XPf(Dm)m@Y3o$Z5gy0 zgHO0on60883~^jYR001B8Onji?ZAEmp&ZvWT%qVioMwe*4ba<3OA}dD5I1!NlD9L> z0}ss*G#@-SCy^ixsDqM66rP-~z#IN;U-i>62dB;Bp@r6ZpcZ9&Myr~n8PmbQuo5_< zI35kOF{Fva0fA5DVU*7Sm&e4(m|*WwajH~I`Ir;<1dYn$POZtr-sv6gb}rxYql-7- zm1rS-G`B1^{Py>R4%;P?oTgoF0XEO zm6ALuQ9;vA5IxmU-PWZUNue0%PK9x{ZNIM-jUqKK%e+X_{k|!WPEPmjcfRo?pqY#Y zO*S=}z@`E~I#@jbYaCbPEYBF76~M;a)JhUk*NWVbUMR1u83GxVN9&TnsvXJRCI`i;QJc6WTj~)`vLoo z+oqL272=Yla-<3yfR9sMl#`7e&H;@DOowDZh7-do;qfpX>E|6)G)>*4h+$YTy?D-u z$?orXb^1Qfavd+Jax}|MI;!XgWUe%(3<8k7m8;2>6Ya5xEA3(RrS4=5O;)VQjB3e@ z7;b8|z=SZ5HD^YJ5rq~6?WEWyo5FIvmYG=+KE{!}!+Lvj{`BdKi>qtIIO+OJF0Tl^ z-K}C+8(hxEfOMrOiHqbMA$0ZXgVG#lRx>tHQLctw>R)$V`|{;WIZ^0?;lc`TuFlOb ze)ydM25)2Be1yUV}-%oAL*D#MO{gXCP zPw`F|Hey5tf!TDyb%#jI6a7lR4YWH zp7dWk8IyUSXe726f}tn4!qJwfJM8T8>Nmgrw>PiP9^bz!lz^ax(E>Vf9nyp%dD0uk zpvXI!We&v#RwqyB=Z#@r$K&VR#>{NhgpAX-3m|3$#%uL(fq^Tcm&y}LhS;_W7G($6 zEim0A6T+iq7r6^)1$y@Uxiqct(C<~{7}7+WMdYEocke3cK-KhJ+bF!ClF@;HJjMEd z=X>9M`0xQ6lN|Ll=(4ZayT7Lj`Um93pR={kw`aQF`{sEF-|kih#Sa-zQ3^4X#oyF} zK7F^h^oekNzRlHjtIm$u$&XLn?`eYOmG?KL>P2auPcwH>Vc`4Xo|qdPS#Gw{Pg>d> zPdqypU%H!WnCgK^(-QB!rH7Zzcnkc>QRoz&Y39+o?QoN0q$j+1`7%v284Nz}J3RmgNg6&!6AFcTYNIUdWnVK7aO1_RAn8U7i5I0_Ao{CuNhg{I9Lhzl*`nX&cv&eb{o z$J0$(F&%}qnn$(DhBr)bo>3MfYs#^ln>anD+H8>|Gp0)}vLt%)NtfAMJV=IbO1|+# zG$fA1OG@ye#WS)KA;x<03Tc)RnCpX34StCDr<;xk8<%Gx#4Dym&Y|r9sQxukzoMB) zu@iP$@!`BY1ywS*1s~ZnMcuZAxxyZm=c$MRl0E(8aCveh;FFa}lB#Wm`%ZYPtGdBD z(8_5ig;`_?HI@IH@YNE6D?bqpvYP|LnV}RWM=~fdXC@;DSt=O!yH}@9&mvjMC}r*B8e{BCJf* zPUNSjb(;{nTfs?K`$t$lWEAb{dRuq9N=>9quYHaJlX~}tsUx8WQn3(KUq6`rn{=RJFM}g1`R(< z*#L@$h>#V|L$Q+_NK@Yea^j+7napGu=YV;FSG@xZo` zA|sz?9{qy4Dnr`SufD45#u#&Yeql@^rtSgOjmsH&s#K&n+E{kxd?VTg)O zfIVBTmgTBk93GU%2Ww?^K|JCf0(vy|fA#2?ZlaM-^1pdmcq^TIhLb?^Kw_`sE<=?f`?qIc+ z_Hn)r75HLfIIeUs!a2jj%ce;}d^vj;0||g!92t8QCknU2{)hvR%`S6Snr7s}p=Zyi z6<{wdK3|jMhY|)6q*SeYSlI%yh(gBjLb-<_jn4Qpy27r|0l`K2O`d!n2QpWi`S?Ca zQog46K3Jq(4C zJ?qFJkY)=LCqv&>O?Pp&e0;zPP z1&SMZ#ejesrYqw_;~c~h#XY_h5+pm39SBOFj9UN1uVI9sL#W+AON@cE%RCXR7Rasj zU~lna!FH$PiutW%F8=ZV{g)^*A3S*=K19`Pq3!u|!w4BMp!sv~f~ zmY2i2aam{maOo<&_2?Go1A*a#ijV3;^bQS@9&q-FW2okiW!aMw@Zt^F@pg^){VUl* z_lqh-qR3a(zAhFjwM#$V3cjIkKuH-8-Ky%MBmJqWTJXMc3iEAZfb5@=G+D3KKmX+~ z5_ssmZu33{doPd`sLP*=$ER)$=uZ{(Dr@N-`|g>Pe6-CJ++D z4p&EU!LOS5Q@(-lZXHTmRgNlF$t4eVOf|QtIe}U-3h|T!$|5(4bc|C) zQf9j5rx`{%j6>8^5kgcHi#SR5b*(*WU$<@3As2VkG&h?~p6BP6mjrqW23=sR5ANU7 z{HA?N!{MF76f|I002cUsu(rQ=*bpXKAi9 zz$O5Xdw}FA(WLob>v7bnyls^ggG^Kx7gx%YQ>g^dDF{xX@REm1YK662+5IT%5a*C4 zspt%K+llnA5m!)#AU?)4&H4mPIyKRj7S8P#azXn#I9R-agemLf)4xsmVHO*e9*{tV zOJm;>cVI;#C-w~5hR717tHXdLU>X3TXBXfjleVI5NOx~hf1?d8=Qzia!qk&f;q(k zMMH}9Je9JMRZ0=)Mic}mg_&X#%?NX>@tW^ZKIan)VU~mqaCD==AswT2I-vaJMWHkF zZMCaJ6FqxrIyau1??6#Km>%4Mnist3zELXN#GWsJ+0 z-+XYmDm1<&&y~~q>S`l^nn}fpDA)8!s=`V~k{T*<`uJg8S06sQPgjF{`Unl|2suo; zwly$3bNmJ<$YGTb;{m}}jxlx9Bt~&-8aUpKS2tV9C)oCVzF4r^f~c*d-CAK?hT$=W zGbmH+Hg!XUZIWhf-AHpVeynSnyeM{c1>sHAJm!n_*<+G4k;j>AF64-25XE(1k8@~G zvJIlYq){it5W_+*f4Wf;N%QuDy(YM5j1D5GG%8XLBV{43=`^cLB}b%;m2(aK>Nr4N zCC3Hl78u~wA@7HeRzA|t32?ZGcSLY1zm@k$dOC`{9UwH+V&x8$ZK&RGU7(4RxP*!C zlt3)7MzRjx1i-scZe*2cf-K82%?i28Zg+kEcwOYC?Sls&1WA^JaWyq}X+pH14CjDi zC1+{Hw5h$eFz2fspz}b@)Bdw47UG=AlQ=C>dE*kJ)k!1&_Q=40%b5uIoQkFOHm)9G%fYhIN=eZ%xYsho! zN0(1E%xzjzuo1D5eRe}0BOQQq6UVm?hvFbnZw%muPhY$qT!+fiq%88~Vj(l|@zFX5 z)ko9zZ8yr+c3%l=N8f3rxlGqX--)$A5yO2?UPJMm%7Y%R4{AAQ82;uz{D;+A;bMWa zyuBl5hkqVbh4L5vytVNc&b`$?|I&%G)451_!JR^}ho^XuIWR{}ajxiW zl*_rWTcI#;6`<0Oe-7tk=B^S}R$Ffz#3)WfBk-lB+HGPJXKK=@ylsgrRY_Sj~ zTOF7RA4g0Zqj*ge%Y7#eV7&%8Mgo{iF22N~$h*F)>k0<5X(bgvMirI3ktOHmMgzD7 zT0c%F?^IWyuVv(e&=m|a`n7()d*%LSa&<%Zgb(tariWmU*#;qrpCJ35L zDIZ9|xkLpd4)r%E<$cpC9uLJqZr*`MGjA6xsRL>?;AixH%n&n11E+IiUjvUKf57Nf zP1%ssQZ1SMmqv~~8U|0DYULx|p57bUL4aP+8xfa}Y*|jGL{KB5R6ADQxa{#{zF=Ze z-WnD`NDTB**?W_|T0d#Uj3eV+O9V7fpY$GBKb_K+sR%<9pRtubCQ4edNgxM%+>Yg} z98kPh*2}>yN`sw@y_GhF7Bp~>P+3x%h^8KzeY3f|dGq}8`B#@Oo?gCuxjjGMZ?1(S zRixd`Mk7BiC9T_5J})j#Prv^1i`UPdUA}rPz%r?oPSEHiY;7tkvLB<;>L(sYbjyRy zC!GUqh@57J1Z!*C)Rp{5{7KuiQfL^Xzb=jq0RoK4R&{z+u9xM>x_r2d>RRP&8C&uI z7h-O2nj}`6PL6;=NBR_KYPt1^G|uDuCp|!=5$SqRqzWA4$W%v6a^wl}J)R^%7AjGj z#aSmKVo~I~YL{pTOqT^l7V5&d6rvqS$OyWQSDHgKb9IlcEOT<_ul-s4${g zw4o^dI~`ZEt?` zoliq>nNbkuic1)f3ecE{3j{9{&*U-9K$3*dU!N_rM6_|vi4HMLu&I?K(Bj$y8w@$w zpefS|;-fzj=fdem@!T5Y^_O-l+TfW4U9SS0?!i*VU~&HX&GE@`UY3Equ{U7QaPH0U z)(Gk5N&U}QpTH+&glIdDujk6@(U#u-=yP|R8=0ITlXcO|#Uu?jN2x}PL zD1)sy<3lKcQ%SDr@%p0!Y&h0Rk}J)P6IqrEdE!6)(?2(D^Z3!DQa$gM>Xp;F4mlHf z9F*5**da*|&lbD7-pXyb2vHuIFX4=K;$PO=<*+VZmSm5VopT|T+F*xJ(WYrkbX$;> zk5)=IUT?Nxq%5OFmfpK}JdV9cMWBHv6V513p1df|FE6U5l~zV@d<-mdzEny;0jal99Paga_D4Ri`;K4S!i)cTD?3W?Zb38t$?})MGt;}~ zb~{b6ThHr6YnJQbsI+@W9u3UVpoe%K7H$();{cMqY*-bJKXdWka!XIngr+-rQ$GXT z!p;D=;!dBu`bhc?k2IsuO;ohHaYN2!`a!NotrHGqN9A9$q&e0M%nw5Oc}FR{p;IwN zL6i4wD+<3(N=;iS4|;Y6b2zdlWy~`oA}=c3SNr|-^;X80?5XQoLL-Vi@48kXTXNX7 zqSzPYJ5tavUOnqW_kYL;e8pELd32t>?V>yDz_dGA~p^auwGgS&##q- zE^9mGGZr)cF!W_vih#a8STief-z|2t@TIK+9y3=&wG?vhhKo@%oJc(x<$8tPh0mhy?t`%}8%)6Mb}$Z!VaCQ-%d4ss2*~C<=s| zacrBt_*`B*J$v@$#fz`6Up=p{&WE~gwIjExG)XV*rA%!%?&_{;`%TkMp=tChMH@G5 zCm2g1+<5ci#p%lzL*HdZE_VqgIFS3!+1B;bxWHvr(&uI6Bh2X_qge4Y&<0z4g@TnU z1|J7gbuzIITZ@hqYZr^tMY$}NOS8Y3`XLG??cUvRets$8tMXpUB3tB{oCHH*Z@Fcq zQ!S6>MIJ5}Y*K1L^ZbUKi2JsUVH)RBDDqs}svsLPKbJz_7W=vpeS5dr3VG#zx6e}1 zkayd<6*SyZ?wzHLTtr=M`v7shVnLABE*2%}+6DkZ`VP!&1i4}D94R48N^27ub)n0> zZXE>=Q>0~*fy#XFfF=wOpz^Z9wx`NgV~g*W5^S#r@iZF z%Xi&l^79Wzsh$Wv>s-p*_)kCOF2yO#M1bXsZwGz zg}VRYg9j%kcVZ;L^)VJsJc7R|(i8DvjqX0>*qogc1_b4L)FK!s;?Osc|wMdK7B$ z%%0Fz2O2%eoQiy4mXY1*mx)4njZXAQY-pipRXJ~O_SN-f_wwTEU{$PFi^q@dhhv{5 zX`bi%s!||L-A>wndQe;+ZEkLa;PTGVT2f5Qw3xv5NxnZhB{D`JVs+glkRd+(=BFQj z@{O7C*c+66ntThj@$&9u#ogO5^tr(OmnC=>UM9SK%;{wOhR8z zE7cLwtCevyI9RS3W#ZKasM-4Gtv19(eKMLDdo6&#TS?gbOn)OD!YyK#U%oz-P<`en z$~D5X(BxumEk;BcDRtY>ktm9v^gXe5oZLA|Qx~2EJQ661*THo-(s2PHn;ic;DVg)sq}hqKM_G%D`eATms2Y# z3f;?2I|Y~sc&0B9aqP;mBN`|-j6J@o%(1$uSn3<#yCQ*Pz==t7AQilO2sX} zAwD$w&Bd!1Z~pkjSO4~#H&4I5eDg{=Wn1k{s1!p|&ykoH<@xTLPOVA%rn?dsr))>b zrfTx)2D%2b|Ra-E%BUDvIO!iVc+9IISD z24N4{8w0wfIu^+}yL))Zl*#T5I>nGQ0I`|0VG~ktMzPwez<-d)$PM8Dr`)EzF-0zE zn8XDq{)(b3uWxo)o~}v-=!k03HkvE2YqaC3ZWaY{g&@%ES8<$5jEuF*PMpm+iY-qw z@)lY0JuZBZn=_(le3YHyR})Q`545w6*}m=NumO;3^(%CMI{>`fb_&rZ+N7y#Y3o+5 z23cP&R@XKC{ag-41OSj<1!;zCL(+WPB;TQZK=C%i^MC8p;PcBmMo^`;n z4WN#B{lN!M#L~tZ`c%?B(Kj+U^pv}ZhT={RAAgJ-uu)^AqZkUU5^P9DhMkCpanhcv zA%#SCdaDWWO^`?)MQLGF*NPkDQ1I>~UT0g?g8Y-uyAqC3mJwi!5wN5Eioy2}JaxD(;LxxTrP=Gbmk6nXya zxp2+OMH>anw4xjqMWIUg&?6^b4>OM@F3}Ju>7Bi9APB5FzqpWRM2uqEDol^$y>FJvk^vNa?g?TFyvy5E1*S^{_af$HN$fsa(IJknN#GDBo18{DJ1>AZ_g2)nS( z6-+}Y>aNJEu)FKzCC`UbEwelM0XfEj+sTu}_$YQ}YnF4#<}TG{zB6etX;?O$eEKkP>t~Fqlkyo&1)N&5JY&E0^SS5Q;2zoLlR|=3U^IlWMA|t=E?c>Hn(N=% zy8t}!c%F!ym56et@o%dtl*mq%JcaCZ&Kx^)QfNj(L@)p%X2S-6pl*za=UDTxbX>WK zq4D%epOjIU8fK&(=V@`0sy1qruzP`A4_59Tz{_yqh ze*66MKb*gOC9y(H+fbJ?s=&km3P)0{7R11H(<^Lj7`OXo-wpLJRo!@gbuEt|kQu3k zD8lV9)?L5Z?I(?#E+VA#+KH>`{9Jl?BC_dnO~q!$=rH>Ptd~p>K5U9^5I#8lDruG_ zC>;KLWuXHrThRyppNRe!=%X?iu3vm@*j!<_l@Tf`Z{0|j&y)E0P$86fvxXf&Cz~|i zhuPt>JY20tGJehztLqMAGX>U(@-Y$Ww77LhzYk3IAdWB1F%%n7wu>Tf>PD`w@q1$^ z=|?_%@>uP)+daW80(g_F-E3|S*K0D9m?RybbOvDYv4B9iF-(I098P$zw$A-j%XxiDrn-ht>19h@657D)3Gexso* zn3qfphG^hiC{_`JL^L3iOx0}@CxFc${1gj|7HJmyQb?O)IZ;NbnKT8QZw}=FxE<5R z5sQsb+F;I@%sc>cYe&M?x0R`H4%_QT&E}xn+-tAzH`n*3Y5DBy7t%5IyDCmq$a($x zm2~$aUktM>V{{RCz8Zo*rg;PfJeeWZz_%JV)o{B4W!J{DWbbS9I>84_UHcDmhm z!|T)YrYD6_GJsus9MtVz6<4?qUg-p`p5B)MyWCMD)c+g?qFJ+xma(PThifvQ23bq%BwIOX(J20uH%3M;QJ1^ z%nc+JhF>@qGDZ>A$%!_xwqcYQbG?zW;{(@Cvn)%wvhq}{mrY&CKe@)MH>co))>~w0 z4953J?kOUBu~3rYulmhv>*9Sm*>6~v4T;)b|V zx)x!r?r2&jN1G1ORApuIY041RUuh;r?7Yb2e9!hrV$BgRXacf{<0v*U&ETj!1#!c9 zTaIV9SaO7aX)TaJ!Ha|`k{pI_fzgN5vfNwq zR(&^}%)ITMEZC{j@C;xnVn*0*zrB9*?DVV8PoMtr^7+&4^`$(zNN-~hHdvTLTp-hW zTlzRTSJlyB62ovmjFo6FRa@1Hc&K%G8r1pGw{k+=Flw!nlM>DEqi4w;t`qGzHC6rc z`3qyr(VaWcD?$&W^L8sX2M0WtJYxUop`ye;Vm~mSjkY)Xn{4oKy`ZxKWLeI+t=-(5 zef7uFr(Y^wB8;%sw4!F*Y}FAX&9p9av2%-Uh@9@d#$Q2SGI3Z66t2t?g;5z;K$(FU zs)AONfYXp+Z!Xl0)aF^5Qk|0xn3EP#acN%JqjG9j=XtTITB*dkTrfJ8ELCS0mvRNs z-sR$&9V}L)s{uwO0+|C_D9`d;RR<<264kQ?eOUuN;UM`KWN7Z2Dv$)w9ML%f#eGRIK7HhX0894jSpd%vn5e~$Pgn?4iNJ~mJI9sqmoMCD5-1%LLn{KxH z$S8(+KH#kDRJb=Brv^ZI%CxkoGIT~sdnYCRr04=jLICH0w&WCO7=4zAuVANVnQ69pfMrRT*LrjQg3qEEV5Koa5?4X>Vk6$t>d~_ zdINbsP->s^{s8D=AxDsJy#O?~;LeaIj8c_P6gd?M?SY~JW=6(w)oBieo6Yt+-~E=@ z-6?L(vv|@2Li-%0QHm+t;17>CDBgz0jaz@>07gEsaXHnH)`xJKVV-giW&msue~-Hv z7!v%PjQAVfL$Retaq*))0!s8&MBRiyp8d)E`FTu8P`WzB78G2 zrN5`yaZ}`^I;tbmj!dY@=fK?LLjk<;)}yY8nXz~y+s>{Pk+F|g<4l*R0zGh9qTnu{ zM7-fhHBmf!buOU8D7J~KWr?SBz9@<$F%rik*CIDOduiRa1Q^`hY@4>bQCi%iyvPwf z6E=;u{Cd44Soudk{fRER>|`Dk`G8tPk^0)o za_B%EKOg%eiIq<>h)`}tV>O#>7+jk zT(~R>@vWn2ed@)R<5#<5lT5(%ChSRG;!T!KyAFcwYDB1i)z&5%xo zZ>a0~28G#P+oqOA#w6JxUs6a5GcB&{!F(?Sw?J|p$q3Q34e9XYY9!ral|qxKyakHP z2@itVCSoSn9tdeJ_N~$iS=d!j=`k@DwqgQ8wyJp zLCknNA=x=S-({mY;I=&qf$m+`(mbrFVoz*_=9CY@D!7XZtalgr35TGvc^H1wGji(Ra0YM?BDh`|Z6MGdYNMpj*5NDCpysEk|WGYbQ%szYbI?uAB<71j=Sw>eF zZp#%!@2+J8)=7H~X8l;Yd-a3Jj@+<+QT1L2)8OL=*;*w3Jxot=Y^iZ$S`2@9yr`Q0a4Y zO3|!N@r!~@ECpRo^e!K)B7YKd!YFWZgfO;Au0cJYmV4fvtn(d#d0?p?NAz&*xCv_k zC?IG$)dColdb?h(i;((I`drg>P=TmO7?~@IB2RNYU0OcNb9vu&wTlr|!k(rFGN{+_ zdCXHRGtUE(G3h|i#8`MbDO^?aVrhQ$-Zgoca9qcwjepn18I%(NE~iB0mGa z96KaM5m)lx{_Wo|63B}Ye(pm*(+hgf#jUgsx2WIUl&Mh;9$Dq*P-7CfVs!#xrd&>} zM4bD`8-{pOBIh2;{{B)_r!d#_lcQhsHFPjN9z0TF%yaeH|I5GrOO|FIfAAz<

2E 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

o^v>xrHV2v|xI{gTVA5Fp`nbEaGiotFOhR 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¬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

Fu{fbB&;Xfb) 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

#e~N@@I7d+Z4Ni9E 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 z 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 literal 730581 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

weQC!Xaij6SRGmSv!wy1wdo5)%SAy3I8&Ndi@ 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

*{Bt~j&D|tBl^1SE6r~4_HL%CoG7l`f|Lxs~l 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

3tKx` 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�@7>S3l?cFaOe$~fy!@$5r8!Q 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≶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 z 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 Dz`b-@ 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(