Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/blender/CMakeLists.txt1
-rw-r--r--source/blender/blendthumb/src/Dll.cpp2
-rw-r--r--source/blender/blenfont/intern/blf.c2
-rw-r--r--source/blender/blenfont/intern/blf_dir.c7
-rw-r--r--source/blender/blenfont/intern/blf_font.c2
-rw-r--r--source/blender/blenkernel/BKE_animsys.h3
-rw-r--r--source/blender/blenkernel/BKE_attribute_access.hh7
-rw-r--r--source/blender/blenkernel/BKE_attribute_math.hh256
-rw-r--r--source/blender/blenkernel/BKE_blender_undo.h4
-rw-r--r--source/blender/blenkernel/BKE_blender_version.h6
-rw-r--r--source/blender/blenkernel/BKE_bvhutils.h15
-rw-r--r--source/blender/blenkernel/BKE_cloth.h10
-rw-r--r--source/blender/blenkernel/BKE_cryptomatte.h2
-rw-r--r--source/blender/blenkernel/BKE_curve.h12
-rw-r--r--source/blender/blenkernel/BKE_customdata.h7
-rw-r--r--source/blender/blenkernel/BKE_displist.h11
-rw-r--r--source/blender/blenkernel/BKE_effect.h3
-rw-r--r--source/blender/blenkernel/BKE_geometry_set.hh116
-rw-r--r--source/blender/blenkernel/BKE_geometry_set_instances.hh62
-rw-r--r--source/blender/blenkernel/BKE_global.h21
-rw-r--r--source/blender/blenkernel/BKE_gpencil.h25
-rw-r--r--source/blender/blenkernel/BKE_gpencil_curve.h8
-rw-r--r--source/blender/blenkernel/BKE_gpencil_geom.h5
-rw-r--r--source/blender/blenkernel/BKE_gpencil_modifier.h2
-rw-r--r--source/blender/blenkernel/BKE_idtype.h9
-rw-r--r--source/blender/blenkernel/BKE_keyconfig.h4
-rw-r--r--source/blender/blenkernel/BKE_lib_id.h2
-rw-r--r--source/blender/blenkernel/BKE_lib_override.h9
-rw-r--r--source/blender/blenkernel/BKE_lib_query.h2
-rw-r--r--source/blender/blenkernel/BKE_main.h50
-rw-r--r--source/blender/blenkernel/BKE_mask.h12
-rw-r--r--source/blender/blenkernel/BKE_mesh_boolean_convert.h38
-rw-r--r--source/blender/blenkernel/BKE_modifier.h12
-rw-r--r--source/blender/blenkernel/BKE_node.h53
-rw-r--r--source/blender/blenkernel/BKE_node_ui_storage.hh91
-rw-r--r--source/blender/blenkernel/BKE_object.h16
-rw-r--r--source/blender/blenkernel/BKE_paint.h4
-rw-r--r--source/blender/blenkernel/BKE_screen.h45
-rw-r--r--source/blender/blenkernel/BKE_shader_fx.h2
-rw-r--r--source/blender/blenkernel/BKE_softbody.h4
-rw-r--r--source/blender/blenkernel/BKE_subdiv_ccg.h2
-rw-r--r--source/blender/blenkernel/BKE_tracking.h33
-rw-r--r--source/blender/blenkernel/BKE_undo_system.h27
-rw-r--r--source/blender/blenkernel/BKE_volume.h2
-rw-r--r--source/blender/blenkernel/BKE_volume_to_mesh.hh43
-rw-r--r--source/blender/blenkernel/CMakeLists.txt28
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.cc45
-rw-r--r--source/blender/blenkernel/intern/action.c22
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c884
-rw-r--r--source/blender/blenkernel/intern/armature.c9
-rw-r--r--source/blender/blenkernel/intern/armature_update.c6
-rw-r--r--source/blender/blenkernel/intern/asset.cc (renamed from source/blender/blenkernel/intern/asset.c)18
-rw-r--r--source/blender/blenkernel/intern/attribute_access.cc1714
-rw-r--r--source/blender/blenkernel/intern/attribute_math.cc58
-rw-r--r--source/blender/blenkernel/intern/blender_undo.c5
-rw-r--r--source/blender/blenkernel/intern/blendfile.c7
-rw-r--r--source/blender/blenkernel/intern/bpath.c2
-rw-r--r--source/blender/blenkernel/intern/brush.c10
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c39
-rw-r--r--source/blender/blenkernel/intern/cachefile.c2
-rw-r--r--source/blender/blenkernel/intern/camera.c2
-rw-r--r--source/blender/blenkernel/intern/cloth.c2
-rw-r--r--source/blender/blenkernel/intern/collection.c25
-rw-r--r--source/blender/blenkernel/intern/constraint.c2
-rw-r--r--source/blender/blenkernel/intern/context.c2
-rw-r--r--source/blender/blenkernel/intern/cryptomatte.cc4
-rw-r--r--source/blender/blenkernel/intern/curve.c19
-rw-r--r--source/blender/blenkernel/intern/curve_convert.c81
-rw-r--r--source/blender/blenkernel/intern/curve_deform.c2
-rw-r--r--source/blender/blenkernel/intern/customdata.c179
-rw-r--r--source/blender/blenkernel/intern/displist.c397
-rw-r--r--source/blender/blenkernel/intern/dynamicpaint.c5
-rw-r--r--source/blender/blenkernel/intern/effect.c81
-rw-r--r--source/blender/blenkernel/intern/fcurve.c2
-rw-r--r--source/blender/blenkernel/intern/fluid.c2
-rw-r--r--source/blender/blenkernel/intern/fmodifier.c3
-rw-r--r--source/blender/blenkernel/intern/font.c2
-rw-r--r--source/blender/blenkernel/intern/geometry_set.cc133
-rw-r--r--source/blender/blenkernel/intern/geometry_set_instances.cc451
-rw-r--r--source/blender/blenkernel/intern/gpencil.c220
-rw-r--r--source/blender/blenkernel/intern/gpencil_curve.c14
-rw-r--r--source/blender/blenkernel/intern/gpencil_geom.c45
-rw-r--r--source/blender/blenkernel/intern/gpencil_modifier.c17
-rw-r--r--source/blender/blenkernel/intern/hair.c2
-rw-r--r--source/blender/blenkernel/intern/icons.cc1
-rw-r--r--source/blender/blenkernel/intern/idprop.c104
-rw-r--r--source/blender/blenkernel/intern/image.c2
-rw-r--r--source/blender/blenkernel/intern/image_gpu.c4
-rw-r--r--source/blender/blenkernel/intern/ipo.c2
-rw-r--r--source/blender/blenkernel/intern/key.c2
-rw-r--r--source/blender/blenkernel/intern/lattice.c2
-rw-r--r--source/blender/blenkernel/intern/lattice_deform.c11
-rw-r--r--source/blender/blenkernel/intern/lib_id.c29
-rw-r--r--source/blender/blenkernel/intern/lib_override.c472
-rw-r--r--source/blender/blenkernel/intern/lib_query.c12
-rw-r--r--source/blender/blenkernel/intern/library.c2
-rw-r--r--source/blender/blenkernel/intern/light.c2
-rw-r--r--source/blender/blenkernel/intern/lightprobe.c2
-rw-r--r--source/blender/blenkernel/intern/linestyle.c2
-rw-r--r--source/blender/blenkernel/intern/main.c127
-rw-r--r--source/blender/blenkernel/intern/mask.c2
-rw-r--r--source/blender/blenkernel/intern/mask_evaluate.c54
-rw-r--r--source/blender/blenkernel/intern/mask_rasterize.c4
-rw-r--r--source/blender/blenkernel/intern/material.c2
-rw-r--r--source/blender/blenkernel/intern/mball.c2
-rw-r--r--source/blender/blenkernel/intern/mball_tessellate.c2
-rw-r--r--source/blender/blenkernel/intern/mesh.c6
-rw-r--r--source/blender/blenkernel/intern/mesh_boolean_convert.cc835
-rw-r--r--source/blender/blenkernel/intern/mesh_fair.cc2
-rw-r--r--source/blender/blenkernel/intern/mesh_merge.c11
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.cc2
-rw-r--r--source/blender/blenkernel/intern/modifier.c10
-rw-r--r--source/blender/blenkernel/intern/movieclip.c104
-rw-r--r--source/blender/blenkernel/intern/multires.c2
-rw-r--r--source/blender/blenkernel/intern/multires_unsubdivide.c4
-rw-r--r--source/blender/blenkernel/intern/node.cc (renamed from source/blender/blenkernel/intern/node.c)807
-rw-r--r--source/blender/blenkernel/intern/node_ui_storage.cc112
-rw-r--r--source/blender/blenkernel/intern/object.c45
-rw-r--r--source/blender/blenkernel/intern/object_update.c2
-rw-r--r--source/blender/blenkernel/intern/ocean.c2
-rw-r--r--source/blender/blenkernel/intern/paint.c6
-rw-r--r--source/blender/blenkernel/intern/particle.c4
-rw-r--r--source/blender/blenkernel/intern/particle_system.c3
-rw-r--r--source/blender/blenkernel/intern/pointcloud.cc2
-rw-r--r--source/blender/blenkernel/intern/rigidbody.c2
-rw-r--r--source/blender/blenkernel/intern/scene.c19
-rw-r--r--source/blender/blenkernel/intern/screen.c5
-rw-r--r--source/blender/blenkernel/intern/simulation.cc2
-rw-r--r--source/blender/blenkernel/intern/softbody.c5
-rw-r--r--source/blender/blenkernel/intern/sound.c2
-rw-r--r--source/blender/blenkernel/intern/speaker.c2
-rw-r--r--source/blender/blenkernel/intern/text.c2
-rw-r--r--source/blender/blenkernel/intern/texture.c2
-rw-r--r--source/blender/blenkernel/intern/tracking.c345
-rw-r--r--source/blender/blenkernel/intern/tracking_stabilize.c6
-rw-r--r--source/blender/blenkernel/intern/tracking_test.cc170
-rw-r--r--source/blender/blenkernel/intern/tracking_util.c24
-rw-r--r--source/blender/blenkernel/intern/undo_system.c375
-rw-r--r--source/blender/blenkernel/intern/unit.c5
-rw-r--r--source/blender/blenkernel/intern/volume.cc34
-rw-r--r--source/blender/blenkernel/intern/volume_to_mesh.cc183
-rw-r--r--source/blender/blenkernel/intern/workspace.c2
-rw-r--r--source/blender/blenkernel/intern/world.c2
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c9
-rw-r--r--source/blender/blenkernel/nla_private.h22
-rw-r--r--source/blender/blenkernel/tracking_private.h2
-rw-r--r--source/blender/blenlib/BLI_fileops.h8
-rw-r--r--source/blender/blenlib/BLI_float2.hh13
-rw-r--r--source/blender/blenlib/BLI_fnmatch.h2
-rw-r--r--source/blender/blenlib/BLI_function_ref.hh154
-rw-r--r--source/blender/blenlib/BLI_hash.h10
-rw-r--r--source/blender/blenlib/BLI_math.h3
-rw-r--r--source/blender/blenlib/BLI_math_base.h3
-rw-r--r--source/blender/blenlib/BLI_math_bits.h3
-rw-r--r--source/blender/blenlib/BLI_math_color.h3
-rw-r--r--source/blender/blenlib/BLI_math_color_blend.h3
-rw-r--r--source/blender/blenlib/BLI_math_geom.h8
-rw-r--r--source/blender/blenlib/BLI_math_inline.h3
-rw-r--r--source/blender/blenlib/BLI_math_matrix.h2
-rw-r--r--source/blender/blenlib/BLI_math_rotation.h5
-rw-r--r--source/blender/blenlib/BLI_math_solvers.h2
-rw-r--r--source/blender/blenlib/BLI_math_statistics.h2
-rw-r--r--source/blender/blenlib/BLI_math_vector.h3
-rw-r--r--source/blender/blenlib/BLI_mesh_intersect.hh4
-rw-r--r--source/blender/blenlib/BLI_mmap.h56
-rw-r--r--source/blender/blenlib/BLI_simd.h36
-rw-r--r--source/blender/blenlib/BLI_span.hh80
-rw-r--r--source/blender/blenlib/BLI_string_ref.hh24
-rw-r--r--source/blender/blenlib/BLI_sys_types.h2
-rw-r--r--source/blender/blenlib/BLI_system.h2
-rw-r--r--source/blender/blenlib/BLI_task.hh6
-rw-r--r--source/blender/blenlib/BLI_voronoi_2d.h2
-rw-r--r--source/blender/blenlib/BLI_winstuff.h2
-rw-r--r--source/blender/blenlib/CMakeLists.txt4
-rw-r--r--source/blender/blenlib/intern/BLI_filelist.c2
-rw-r--r--source/blender/blenlib/intern/BLI_kdopbvh.c10
-rw-r--r--source/blender/blenlib/intern/BLI_mmap.c237
-rw-r--r--source/blender/blenlib/intern/array_store.c3
-rw-r--r--source/blender/blenlib/intern/bitmap_draw_2d.c3
-rw-r--r--source/blender/blenlib/intern/boxpack_2d.c5
-rw-r--r--source/blender/blenlib/intern/convexhull_2d.c2
-rw-r--r--source/blender/blenlib/intern/delaunay_2d.cc16
-rw-r--r--source/blender/blenlib/intern/dot_export.cc10
-rw-r--r--source/blender/blenlib/intern/fileops.c2
-rw-r--r--source/blender/blenlib/intern/freetypefont.c2
-rw-r--r--source/blender/blenlib/intern/gsqueue.c2
-rw-r--r--source/blender/blenlib/intern/jitter_2d.c2
-rw-r--r--source/blender/blenlib/intern/kdtree_impl.h2
-rw-r--r--source/blender/blenlib/intern/list_sort_impl.h2
-rw-r--r--source/blender/blenlib/intern/math_base.c3
-rw-r--r--source/blender/blenlib/intern/math_base_inline.c18
-rw-r--r--source/blender/blenlib/intern/math_bits_inline.c3
-rw-r--r--source/blender/blenlib/intern/math_boolean.cc2
-rw-r--r--source/blender/blenlib/intern/math_color.c3
-rw-r--r--source/blender/blenlib/intern/math_color_blend_inline.c3
-rw-r--r--source/blender/blenlib/intern/math_color_inline.c11
-rw-r--r--source/blender/blenlib/intern/math_geom.c72
-rw-r--r--source/blender/blenlib/intern/math_geom_inline.c3
-rw-r--r--source/blender/blenlib/intern/math_interp.c8
-rw-r--r--source/blender/blenlib/intern/math_matrix.c2
-rw-r--r--source/blender/blenlib/intern/math_rotation.c4
-rw-r--r--source/blender/blenlib/intern/math_solvers.c2
-rw-r--r--source/blender/blenlib/intern/math_statistics.c2
-rw-r--r--source/blender/blenlib/intern/math_vec.cc2
-rw-r--r--source/blender/blenlib/intern/math_vector.c3
-rw-r--r--source/blender/blenlib/intern/math_vector_inline.c3
-rw-r--r--source/blender/blenlib/intern/mesh_boolean.cc378
-rw-r--r--source/blender/blenlib/intern/mesh_intersect.cc25
-rw-r--r--source/blender/blenlib/intern/noise.c50
-rw-r--r--source/blender/blenlib/intern/path_util.c8
-rw-r--r--source/blender/blenlib/intern/polyfill_2d.c4
-rw-r--r--source/blender/blenlib/intern/scanfill.c6
-rw-r--r--source/blender/blenlib/intern/scanfill_utils.c2
-rw-r--r--source/blender/blenlib/intern/storage.c4
-rw-r--r--source/blender/blenlib/intern/string_search.cc2
-rw-r--r--source/blender/blenlib/intern/string_utf8.c3
-rw-r--r--source/blender/blenlib/intern/system.c3
-rw-r--r--source/blender/blenlib/intern/system_win32.c1
-rw-r--r--source/blender/blenlib/intern/task_graph.cc5
-rw-r--r--source/blender/blenlib/intern/task_pool.cc6
-rw-r--r--source/blender/blenlib/intern/task_range.cc7
-rw-r--r--source/blender/blenlib/intern/task_scheduler.cc6
-rw-r--r--source/blender/blenlib/intern/threads.cc7
-rw-r--r--source/blender/blenlib/intern/uvproject.c4
-rw-r--r--source/blender/blenlib/intern/voxel.c8
-rw-r--r--source/blender/blenlib/tests/BLI_delaunay_2d_test.cc6
-rw-r--r--source/blender/blenlib/tests/BLI_function_ref_test.cc102
-rw-r--r--source/blender/blenlib/tests/BLI_polyfill_2d_test.cc18
-rw-r--r--source/blender/blenlib/tests/BLI_span_test.cc42
-rw-r--r--source/blender/blenlib/tests/BLI_string_ref_test.cc22
-rw-r--r--source/blender/blenloader/BLO_readfile.h12
-rw-r--r--source/blender/blenloader/intern/blend_validate.c4
-rw-r--r--source/blender/blenloader/intern/readblenentry.c24
-rw-r--r--source/blender/blenloader/intern/readfile.c127
-rw-r--r--source/blender/blenloader/intern/readfile.h6
-rw-r--r--source/blender/blenloader/intern/versioning_250.c2
-rw-r--r--source/blender/blenloader/intern/versioning_260.c4
-rw-r--r--source/blender/blenloader/intern/versioning_270.c6
-rw-r--r--source/blender/blenloader/intern/versioning_280.c8
-rw-r--r--source/blender/blenloader/intern/versioning_290.c168
-rw-r--r--source/blender/blenloader/intern/versioning_cycles.c2
-rw-r--r--source/blender/blenloader/intern/versioning_defaults.c2
-rw-r--r--source/blender/blenloader/intern/versioning_legacy.c6
-rw-r--r--source/blender/blenloader/intern/versioning_userdef.c19
-rw-r--r--source/blender/blentranslation/intern/blt_lang.c26
-rw-r--r--source/blender/bmesh/bmesh_class.h4
-rw-r--r--source/blender/bmesh/intern/bmesh_core.c2
-rw-r--r--source/blender/bmesh/intern/bmesh_edgeloop.c2
-rw-r--r--source/blender/bmesh/intern/bmesh_error.h4
-rw-r--r--source/blender/bmesh/intern/bmesh_interp.c8
-rw-r--r--source/blender/bmesh/intern/bmesh_iterators.c2
-rw-r--r--source/blender/bmesh/intern/bmesh_marking.c2
-rw-r--r--source/blender/bmesh/intern/bmesh_mods.c6
-rw-r--r--source/blender/bmesh/intern/bmesh_opdefines.c12
-rw-r--r--source/blender/bmesh/intern/bmesh_operators.h2
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon_edgenet.c2
-rw-r--r--source/blender/bmesh/intern/bmesh_structure.c4
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers.h2
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers_impl.c173
-rw-r--r--source/blender/bmesh/operators/bmo_dissolve.c4
-rw-r--r--source/blender/bmesh/operators/bmo_dupe.c2
-rw-r--r--source/blender/bmesh/operators/bmo_fill_grid.c4
-rw-r--r--source/blender/bmesh/operators/bmo_inset.c2
-rw-r--r--source/blender/bmesh/operators/bmo_join_triangles.c2
-rw-r--r--source/blender/bmesh/operators/bmo_normals.c2
-rw-r--r--source/blender/bmesh/operators/bmo_primitive.c36
-rw-r--r--source/blender/bmesh/operators/bmo_removedoubles.c2
-rw-r--r--source/blender/bmesh/operators/bmo_subdivide.c6
-rw-r--r--source/blender/bmesh/tools/bmesh_bevel.c41
-rw-r--r--source/blender/bmesh/tools/bmesh_decimate_collapse.c7
-rw-r--r--source/blender/bmesh/tools/bmesh_decimate_dissolve.c2
-rw-r--r--source/blender/bmesh/tools/bmesh_edgenet.c2
-rw-r--r--source/blender/bmesh/tools/bmesh_intersect.c4
-rw-r--r--source/blender/bmesh/tools/bmesh_intersect_edges.c2
-rw-r--r--source/blender/compositor/COM_compositor.h10
-rw-r--r--source/blender/compositor/intern/COM_ChunkOrder.cpp25
-rw-r--r--source/blender/compositor/intern/COM_ChunkOrder.h43
-rw-r--r--source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp14
-rw-r--r--source/blender/compositor/intern/COM_ChunkOrderHotspot.h12
-rw-r--r--source/blender/compositor/intern/COM_ExecutionGroup.cpp20
-rw-r--r--source/blender/compositor/intern/COM_ExecutionSystem.cpp2
-rw-r--r--source/blender/compositor/intern/COM_MetaData.h2
-rw-r--r--source/blender/compositor/intern/COM_WorkScheduler.cpp201
-rw-r--r--source/blender/compositor/intern/COM_WorkScheduler.h9
-rw-r--r--source/blender/compositor/intern/COM_compositor.cpp126
-rw-r--r--source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp6
-rw-r--r--source/blender/compositor/nodes/COM_KeyingNode.cpp6
-rw-r--r--source/blender/compositor/operations/COM_BlurBaseOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_BlurBaseOperation.h6
-rw-r--r--source/blender/compositor/operations/COM_BokehImageOperation.h4
-rw-r--r--source/blender/compositor/operations/COM_ChromaMatteOperation.cpp7
-rw-r--r--source/blender/compositor/operations/COM_CryptomatteOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_DenoiseOperation.cpp6
-rw-r--r--source/blender/compositor/operations/COM_DotproductOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp4
-rw-r--r--source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h6
-rw-r--r--source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp3
-rw-r--r--source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp3
-rw-r--r--source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp10
-rw-r--r--source/blender/compositor/operations/COM_GaussianXBlurOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp10
-rw-r--r--source/blender/compositor/operations/COM_GaussianYBlurOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_MixOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_TonemapOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_VectorBlurOperation.cpp7
-rw-r--r--source/blender/datatoc/CMakeLists.txt2
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc304
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc116
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc11
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc6
-rw-r--r--source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc2
-rw-r--r--source/blender/depsgraph/intern/debug/deg_debug_stats_gnuplot.cc2
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query_iter.cc26
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_scene.h2
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_id.h4
-rw-r--r--source/blender/draw/CMakeLists.txt23
-rw-r--r--source/blender/draw/engines/eevee/eevee_cryptomatte.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_data.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_depth_of_field.c1050
-rw-r--r--source/blender/draw/engines/eevee/eevee_effects.c12
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c16
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightcache.c21
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightprobes.c10
-rw-r--r--source/blender/draw/engines/eevee/eevee_lookdev.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_lut.c34923
-rw-r--r--source/blender/draw/engines/eevee/eevee_lut.h2
-rw-r--r--source/blender/draw/engines/eevee/eevee_lut_gen.c190
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c27
-rw-r--r--source/blender/draw/engines/eevee/eevee_motion_blur.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_occlusion.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h147
-rw-r--r--source/blender/draw/engines/eevee/eevee_render.c6
-rw-r--r--source/blender/draw/engines/eevee/eevee_renderpasses.c6
-rw-r--r--source/blender/draw/engines/eevee/eevee_sampling.c6
-rw-r--r--source/blender/draw/engines/eevee/eevee_screen_raytrace.c20
-rw-r--r--source/blender/draw/engines/eevee/eevee_shaders.c290
-rw-r--r--source/blender/draw/engines/eevee/eevee_shadows.c8
-rw-r--r--source/blender/draw/engines/eevee/eevee_shadows_cascade.c4
-rw-r--r--source/blender/draw/engines/eevee/eevee_shadows_cube.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_temporal_sampling.c67
-rw-r--r--source/blender/draw/engines/eevee/eevee_volumes.c2
-rw-r--r--source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl480
-rw-r--r--source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl41
-rw-r--r--source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl75
-rw-r--r--source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl43
-rw-r--r--source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl101
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl87
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl140
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl324
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl128
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl71
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl545
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl (renamed from source/blender/draw/engines/eevee/shaders/closure_lib.glsl)26
-rw-r--r--source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl101
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl6
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl101
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl117
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl37
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl93
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl57
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl254
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl293
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl631
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl179
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl212
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl85
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl138
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl65
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl109
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl111
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl10
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl184
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl16
-rw-r--r--source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl76
-rw-r--r--source/blender/draw/engines/eevee/shaders/lights_lib.glsl77
-rw-r--r--source/blender/draw/engines/eevee/shaders/prepass_frag.glsl8
-rw-r--r--source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl13
-rw-r--r--source/blender/draw/engines/eevee/shaders/ssr_lib.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/surface_frag.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/surface_lib.glsl12
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl16
-rw-r--r--source/blender/draw/engines/external/external_engine.c2
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_antialiasing.c4
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_cache_utils.c6
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.c34
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.h10
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_render.c2
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_shader_fx.c10
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl31
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl2
-rw-r--r--source/blender/draw/engines/image/image_engine.c20
-rw-r--r--source/blender/draw/engines/image/image_shader.c2
-rw-r--r--source/blender/draw/engines/overlay/overlay_antialiasing.c6
-rw-r--r--source/blender/draw/engines/overlay/overlay_armature.c4
-rw-r--r--source/blender/draw/engines/overlay/overlay_edit_mesh.c2
-rw-r--r--source/blender/draw/engines/overlay/overlay_edit_uv.c4
-rw-r--r--source/blender/draw/engines/overlay/overlay_extra.c8
-rw-r--r--source/blender/draw/engines/overlay/overlay_gpencil.c19
-rw-r--r--source/blender/draw/engines/overlay/overlay_grid.c2
-rw-r--r--source/blender/draw/engines/overlay/overlay_metaball.c2
-rw-r--r--source/blender/draw/engines/overlay/overlay_particle.c2
-rw-r--r--source/blender/draw/engines/overlay/overlay_shader.c4
-rw-r--r--source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl2
-rw-r--r--source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl4
-rw-r--r--source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl2
-rw-r--r--source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl4
-rw-r--r--source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl6
-rw-r--r--source/blender/draw/engines/overlay/shaders/extra_vert.glsl2
-rw-r--r--source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl2
-rw-r--r--source/blender/draw/engines/overlay/shaders/grid_frag.glsl4
-rw-r--r--source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl9
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl10
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl17
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl2
-rw-r--r--source/blender/draw/engines/workbench/workbench_data.c2
-rw-r--r--source/blender/draw/engines/workbench/workbench_effect_antialiasing.c52
-rw-r--r--source/blender/draw/engines/workbench/workbench_effect_dof.c2
-rw-r--r--source/blender/draw/engines/workbench/workbench_materials.c2
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h13
-rw-r--r--source/blender/draw/engines/workbench/workbench_render.c2
-rw-r--r--source/blender/draw/engines/workbench/workbench_shader.c2
-rw-r--r--source/blender/draw/engines/workbench/workbench_shadow.c2
-rw-r--r--source/blender/draw/intern/DRW_render.h6
-rw-r--r--source/blender/draw/intern/draw_cache.c6
-rw-r--r--source/blender/draw/intern/draw_cache.h2
-rw-r--r--source/blender/draw/intern/draw_cache_extract.h4
-rw-r--r--source/blender/draw/intern/draw_cache_extract_mesh.c80
-rw-r--r--source/blender/draw/intern/draw_cache_impl_curve.c6
-rw-r--r--source/blender/draw/intern/draw_cache_impl_displist.c2
-rw-r--r--source/blender/draw/intern/draw_cache_impl_gpencil.c10
-rw-r--r--source/blender/draw/intern/draw_cache_impl_hair.c2
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c13
-rw-r--r--source/blender/draw/intern/draw_common.c6
-rw-r--r--source/blender/draw/intern/draw_common.h2
-rw-r--r--source/blender/draw/intern/draw_hair.c2
-rw-r--r--source/blender/draw/intern/draw_hair_private.h2
-rw-r--r--source/blender/draw/intern/draw_manager.c46
-rw-r--r--source/blender/draw/intern/draw_manager.h8
-rw-r--r--source/blender/draw/intern/draw_manager_data.c6
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c6
-rw-r--r--source/blender/draw/intern/draw_manager_texture.c3
-rw-r--r--source/blender/draw/intern/draw_select_buffer.c2
-rw-r--r--source/blender/draw/intern/draw_view.c2
-rw-r--r--source/blender/draw/intern/shaders/common_fxaa_lib.glsl2
-rw-r--r--source/blender/draw/intern/shaders/common_globals_lib.glsl2
-rw-r--r--source/blender/draw/intern/shaders/common_math_lib.glsl62
-rw-r--r--source/blender/draw/intern/shaders/common_smaa_lib.glsl2
-rw-r--r--source/blender/draw/intern/shaders/common_view_lib.glsl6
-rw-r--r--source/blender/draw/tests/shaders_test.cc29
-rw-r--r--source/blender/editors/animation/anim_channels_defines.c69
-rw-r--r--source/blender/editors/animation/anim_channels_edit.c10
-rw-r--r--source/blender/editors/animation/anim_filter.c7
-rw-r--r--source/blender/editors/animation/anim_motion_paths.c2
-rw-r--r--source/blender/editors/animation/anim_ops.c4
-rw-r--r--source/blender/editors/animation/drivers.c1
-rw-r--r--source/blender/editors/animation/fmodifier_ui.c1448
-rw-r--r--source/blender/editors/animation/keyframes_draw.c96
-rw-r--r--source/blender/editors/animation/keyframes_edit.c2
-rw-r--r--source/blender/editors/animation/keyframes_general.c2
-rw-r--r--source/blender/editors/animation/keyframing.c6
-rw-r--r--source/blender/editors/animation/time_scrub_ui.c33
-rw-r--r--source/blender/editors/armature/armature_add.c6
-rw-r--r--source/blender/editors/armature/armature_edit.c6
-rw-r--r--source/blender/editors/armature/armature_ops.c2
-rw-r--r--source/blender/editors/armature/armature_skinning.c3
-rw-r--r--source/blender/editors/armature/armature_utils.c4
-rw-r--r--source/blender/editors/armature/editarmature_undo.c7
-rw-r--r--source/blender/editors/armature/meshlaplacian.c4
-rw-r--r--source/blender/editors/armature/pose_edit.c2
-rw-r--r--source/blender/editors/armature/pose_group.c2
-rw-r--r--source/blender/editors/armature/pose_lib.c4
-rw-r--r--source/blender/editors/armature/pose_select.c6
-rw-r--r--source/blender/editors/armature/pose_slide.c28
-rw-r--r--source/blender/editors/armature/pose_transform.c2
-rw-r--r--source/blender/editors/armature/pose_utils.c3
-rw-r--r--source/blender/editors/asset/CMakeLists.txt4
-rw-r--r--source/blender/editors/asset/asset_edit.cc (renamed from source/blender/editors/asset/asset_edit.c)6
-rw-r--r--source/blender/editors/asset/asset_ops.c247
-rw-r--r--source/blender/editors/asset/asset_ops.cc259
-rw-r--r--source/blender/editors/curve/editcurve.c16
-rw-r--r--source/blender/editors/curve/editcurve_select.c6
-rw-r--r--source/blender/editors/curve/editcurve_undo.c7
-rw-r--r--source/blender/editors/curve/editfont_undo.c9
-rw-r--r--source/blender/editors/datafiles/CMakeLists.txt103
-rw-r--r--source/blender/editors/geometry/geometry_attributes.c2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_library_presets.c7
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c1
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c4
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c12
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c1
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c1
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c1
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c1
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c1
-rw-r--r--source/blender/editors/gpencil/annotate_paint.c32
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c11
-rw-r--r--source/blender/editors/gpencil/editaction_gpencil.c4
-rw-r--r--source/blender/editors/gpencil/gpencil_add_monkey.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_add_stroke.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_armature.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_convert.c10
-rw-r--r--source/blender/editors/gpencil/gpencil_data.c45
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c164
-rw-r--r--source/blender/editors/gpencil/gpencil_edit_curve.c5
-rw-r--r--source/blender/editors/gpencil/gpencil_fill.c1140
-rw-r--r--source/blender/editors/gpencil/gpencil_intern.h71
-rw-r--r--source/blender/editors/gpencil/gpencil_interpolate.c1024
-rw-r--r--source/blender/editors/gpencil/gpencil_merge.c6
-rw-r--r--source/blender/editors/gpencil/gpencil_mesh.c4
-rw-r--r--source/blender/editors/gpencil/gpencil_ops.c5
-rw-r--r--source/blender/editors/gpencil/gpencil_ops_versioning.c5
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c100
-rw-r--r--source/blender/editors/gpencil/gpencil_primitive.c19
-rw-r--r--source/blender/editors/gpencil/gpencil_sculpt_paint.c22
-rw-r--r--source/blender/editors/gpencil/gpencil_select.c83
-rw-r--r--source/blender/editors/gpencil/gpencil_trace_ops.c25
-rw-r--r--source/blender/editors/gpencil/gpencil_undo.c29
-rw-r--r--source/blender/editors/gpencil/gpencil_utils.c103
-rw-r--r--source/blender/editors/gpencil/gpencil_uv.c1
-rw-r--r--source/blender/editors/gpencil/gpencil_vertex_ops.c14
-rw-r--r--source/blender/editors/gpencil/gpencil_vertex_paint.c27
-rw-r--r--source/blender/editors/gpencil/gpencil_weight_paint.c25
-rw-r--r--source/blender/editors/include/ED_anim_api.h28
-rw-r--r--source/blender/editors/include/ED_clip.h24
-rw-r--r--source/blender/editors/include/ED_fileselect.h2
-rw-r--r--source/blender/editors/include/ED_gpencil.h15
-rw-r--r--source/blender/editors/include/ED_keyframes_draw.h2
-rw-r--r--source/blender/editors/include/ED_keyframes_edit.h4
-rw-r--r--source/blender/editors/include/ED_mask.h5
-rw-r--r--source/blender/editors/include/ED_node.h6
-rw-r--r--source/blender/editors/include/ED_object.h30
-rw-r--r--source/blender/editors/include/ED_render.h6
-rw-r--r--source/blender/editors/include/ED_screen.h44
-rw-r--r--source/blender/editors/include/ED_transform.h24
-rw-r--r--source/blender/editors/include/ED_view3d.h4
-rw-r--r--source/blender/editors/include/UI_interface.h85
-rw-r--r--source/blender/editors/include/UI_interface_icons.h5
-rw-r--r--source/blender/editors/include/UI_resources.h2
-rw-r--r--source/blender/editors/include/UI_view2d.h2
-rw-r--r--source/blender/editors/interface/interface.c39
-rw-r--r--source/blender/editors/interface/interface_context_menu.c2
-rw-r--r--source/blender/editors/interface/interface_draw.c734
-rw-r--r--source/blender/editors/interface/interface_eyedropper.c2
-rw-r--r--source/blender/editors/interface/interface_eyedropper_depth.c6
-rw-r--r--source/blender/editors/interface/interface_handlers.c90
-rw-r--r--source/blender/editors/interface/interface_icons.c8
-rw-r--r--source/blender/editors/interface/interface_icons_event.c10
-rw-r--r--source/blender/editors/interface/interface_intern.h14
-rw-r--r--source/blender/editors/interface/interface_layout.c7
-rw-r--r--source/blender/editors/interface/interface_ops.c15
-rw-r--r--source/blender/editors/interface/interface_panel.c92
-rw-r--r--source/blender/editors/interface/interface_region_color_picker.c3
-rw-r--r--source/blender/editors/interface/interface_region_menu_pie.c2
-rw-r--r--source/blender/editors/interface/interface_region_menu_popup.c2
-rw-r--r--source/blender/editors/interface/interface_region_popup.c15
-rw-r--r--source/blender/editors/interface/interface_region_search.c56
-rw-r--r--source/blender/editors/interface/interface_region_tooltip.c80
-rw-r--r--source/blender/editors/interface/interface_style.c17
-rw-r--r--source/blender/editors/interface/interface_template_search_menu.c1
-rw-r--r--source/blender/editors/interface/interface_template_search_operator.c3
-rw-r--r--source/blender/editors/interface/interface_templates.c166
-rw-r--r--source/blender/editors/interface/interface_utils.c176
-rw-r--r--source/blender/editors/interface/interface_widgets.c44
-rw-r--r--source/blender/editors/interface/view2d.c6
-rw-r--r--source/blender/editors/interface/view2d_ops.c125
-rw-r--r--source/blender/editors/io/io_alembic.c3
-rw-r--r--source/blender/editors/io/io_cache.c1
-rw-r--r--source/blender/editors/io/io_collada.c2
-rw-r--r--source/blender/editors/lattice/editlattice_select.c2
-rw-r--r--source/blender/editors/lattice/editlattice_undo.c7
-rw-r--r--source/blender/editors/lattice/lattice_ops.c5
-rw-r--r--source/blender/editors/mask/mask_add.c10
-rw-r--r--source/blender/editors/mask/mask_draw.c4
-rw-r--r--source/blender/editors/mask/mask_edit.c36
-rw-r--r--source/blender/editors/mask/mask_intern.h15
-rw-r--r--source/blender/editors/mask/mask_ops.c47
-rw-r--r--source/blender/editors/mask/mask_query.c42
-rw-r--r--source/blender/editors/mask/mask_select.c13
-rw-r--r--source/blender/editors/mesh/editmesh_add.c2
-rw-r--r--source/blender/editors/mesh/editmesh_automerge.c3
-rw-r--r--source/blender/editors/mesh/editmesh_bevel.c4
-rw-r--r--source/blender/editors/mesh/editmesh_extrude_spin.c4
-rw-r--r--source/blender/editors/mesh/editmesh_knife.c7
-rw-r--r--source/blender/editors/mesh/editmesh_loopcut.c4
-rw-r--r--source/blender/editors/mesh/editmesh_mask_extract.c6
-rw-r--r--source/blender/editors/mesh/editmesh_polybuild.c1
-rw-r--r--source/blender/editors/mesh/editmesh_select.c8
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c7
-rw-r--r--source/blender/editors/mesh/editmesh_undo.c11
-rw-r--r--source/blender/editors/mesh/mesh_ops.c3
-rw-r--r--source/blender/editors/mesh/meshtools.c4
-rw-r--r--source/blender/editors/metaball/editmball_undo.c7
-rw-r--r--source/blender/editors/metaball/mball_edit.c2
-rw-r--r--source/blender/editors/metaball/mball_ops.c2
-rw-r--r--source/blender/editors/object/object_add.c17
-rw-r--r--source/blender/editors/object/object_bake_api.c2
-rw-r--r--source/blender/editors/object/object_data_transfer.c4
-rw-r--r--source/blender/editors/object/object_gpencil_modifier.c72
-rw-r--r--source/blender/editors/object/object_modes.c1
-rw-r--r--source/blender/editors/object/object_modifier.c18
-rw-r--r--source/blender/editors/object/object_ops.c10
-rw-r--r--source/blender/editors/object/object_relations.c35
-rw-r--r--source/blender/editors/object/object_remesh.c8
-rw-r--r--source/blender/editors/object/object_select.c4
-rw-r--r--source/blender/editors/object/object_shapekey.c2
-rw-r--r--source/blender/editors/object/object_transform.c2
-rw-r--r--source/blender/editors/object/object_vgroup.c4
-rw-r--r--source/blender/editors/object/object_volume.c3
-rw-r--r--source/blender/editors/object/object_warp.c9
-rw-r--r--source/blender/editors/physics/dynamicpaint_ops.c2
-rw-r--r--source/blender/editors/physics/particle_boids.c1
-rw-r--r--source/blender/editors/physics/particle_edit.c312
-rw-r--r--source/blender/editors/physics/particle_edit_undo.c2
-rw-r--r--source/blender/editors/physics/physics_fluid.c6
-rw-r--r--source/blender/editors/physics/physics_ops.c5
-rw-r--r--source/blender/editors/physics/physics_pointcache.c1
-rw-r--r--source/blender/editors/physics/rigidbody_object.c2
-rw-r--r--source/blender/editors/render/render_internal.c12
-rw-r--r--source/blender/editors/render/render_opengl.c4
-rw-r--r--source/blender/editors/render/render_preview.c23
-rw-r--r--source/blender/editors/render/render_update.c6
-rw-r--r--source/blender/editors/render/render_view.c12
-rw-r--r--source/blender/editors/screen/area.c93
-rw-r--r--source/blender/editors/screen/area_utils.c14
-rw-r--r--source/blender/editors/screen/glutil.c22
-rw-r--r--source/blender/editors/screen/screen_context.c2
-rw-r--r--source/blender/editors/screen/screen_draw.c4
-rw-r--r--source/blender/editors/screen/screen_edit.c22
-rw-r--r--source/blender/editors/screen/screen_intern.h8
-rw-r--r--source/blender/editors/screen/screen_ops.c131
-rw-r--r--source/blender/editors/screen/workspace_edit.c1
-rw-r--r--source/blender/editors/sculpt_paint/paint_cursor.c10
-rw-r--r--source/blender/editors/sculpt_paint/paint_curve_undo.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_image_proj.c62
-rw-r--r--source/blender/editors/sculpt_paint/paint_mask.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex_color_utils.c4
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c30
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c11
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c2717
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_automasking.c24
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_boundary.c309
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_cloth.c283
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_detail.c17
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_face_set.c168
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_filter_color.c2
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_filter_mesh.c2
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h2
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c170
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_paint_color.c218
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_pose.c78
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_smooth.c162
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_undo.c13
-rw-r--r--source/blender/editors/sound/sound_ops.c3
-rw-r--r--source/blender/editors/space_action/action_buttons.c23
-rw-r--r--source/blender/editors/space_action/action_edit.c18
-rw-r--r--source/blender/editors/space_action/action_ops.c3
-rw-r--r--source/blender/editors/space_action/space_action.c73
-rw-r--r--source/blender/editors/space_api/spacetypes.c72
-rw-r--r--source/blender/editors/space_buttons/buttons_context.c3
-rw-r--r--source/blender/editors/space_buttons/buttons_texture.c3
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c40
-rw-r--r--source/blender/editors/space_clip/clip_buttons.c3
-rw-r--r--source/blender/editors/space_clip/clip_draw.c2
-rw-r--r--source/blender/editors/space_clip/clip_editor.c190
-rw-r--r--source/blender/editors/space_clip/clip_intern.h8
-rw-r--r--source/blender/editors/space_clip/clip_ops.c22
-rw-r--r--source/blender/editors/space_clip/clip_toolbar.c12
-rw-r--r--source/blender/editors/space_clip/clip_utils.c226
-rw-r--r--source/blender/editors/space_clip/space_clip.c69
-rw-r--r--source/blender/editors/space_clip/tracking_ops.c116
-rw-r--r--source/blender/editors/space_clip/tracking_ops_detect.c4
-rw-r--r--source/blender/editors/space_clip/tracking_ops_stabilize.c2
-rw-r--r--source/blender/editors/space_clip/tracking_ops_track.c1
-rw-r--r--source/blender/editors/space_clip/tracking_ops_utils.c4
-rw-r--r--source/blender/editors/space_clip/tracking_select.c18
-rw-r--r--source/blender/editors/space_console/console_ops.c4
-rw-r--r--source/blender/editors/space_console/space_console.c17
-rw-r--r--source/blender/editors/space_file/file_draw.c14
-rw-r--r--source/blender/editors/space_file/file_ops.c3
-rw-r--r--source/blender/editors/space_file/file_utils.c1
-rw-r--r--source/blender/editors/space_file/filelist.c17
-rw-r--r--source/blender/editors/space_file/filesel.c6
-rw-r--r--source/blender/editors/space_file/space_file.c99
-rw-r--r--source/blender/editors/space_graph/graph_buttons.c37
-rw-r--r--source/blender/editors/space_graph/graph_draw.c4
-rw-r--r--source/blender/editors/space_graph/graph_edit.c4
-rw-r--r--source/blender/editors/space_graph/graph_ops.c4
-rw-r--r--source/blender/editors/space_graph/graph_slider_ops.c20
-rw-r--r--source/blender/editors/space_graph/graph_utils.c2
-rw-r--r--source/blender/editors/space_graph/space_graph.c30
-rw-r--r--source/blender/editors/space_image/image_draw.c4
-rw-r--r--source/blender/editors/space_image/image_intern.h1
-rw-r--r--source/blender/editors/space_image/image_ops.c139
-rw-r--r--source/blender/editors/space_image/image_sequence.c4
-rw-r--r--source/blender/editors/space_image/image_undo.c8
-rw-r--r--source/blender/editors/space_image/space_image.c59
-rw-r--r--source/blender/editors/space_info/info_draw.c47
-rw-r--r--source/blender/editors/space_info/info_ops.c13
-rw-r--r--source/blender/editors/space_info/space_info.c36
-rw-r--r--source/blender/editors/space_info/textview.c17
-rw-r--r--source/blender/editors/space_nla/nla_buttons.c37
-rw-r--r--source/blender/editors/space_nla/nla_draw.c26
-rw-r--r--source/blender/editors/space_nla/nla_edit.c253
-rw-r--r--source/blender/editors/space_nla/nla_ops.c5
-rw-r--r--source/blender/editors/space_nla/space_nla.c64
-rw-r--r--source/blender/editors/space_node/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_node/drawnode.c328
-rw-r--r--source/blender/editors/space_node/node_add.c158
-rw-r--r--source/blender/editors/space_node/node_buttons.c1
-rw-r--r--source/blender/editors/space_node/node_draw.cc (renamed from source/blender/editors/space_node/node_draw.c)757
-rw-r--r--source/blender/editors/space_node/node_edit.c53
-rw-r--r--source/blender/editors/space_node/node_group.c12
-rw-r--r--source/blender/editors/space_node/node_intern.h66
-rw-r--r--source/blender/editors/space_node/node_ops.c5
-rw-r--r--source/blender/editors/space_node/node_relationships.c270
-rw-r--r--source/blender/editors/space_node/node_select.c6
-rw-r--r--source/blender/editors/space_node/node_templates.c1
-rw-r--r--source/blender/editors/space_node/node_toolbar.c3
-rw-r--r--source/blender/editors/space_node/node_view.c1
-rw-r--r--source/blender/editors/space_node/space_node.c102
-rw-r--r--source/blender/editors/space_outliner/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_outliner/outliner_context.c2
-rw-r--r--source/blender/editors/space_outliner/outliner_dragdrop.c19
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.c207
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h49
-rw-r--r--source/blender/editors/space_outliner/outliner_ops.c13
-rw-r--r--source/blender/editors/space_outliner/outliner_select.c1043
-rw-r--r--source/blender/editors/space_outliner/outliner_sync.c5
-rw-r--r--source/blender/editors/space_outliner/outliner_tools.c67
-rw-r--r--source/blender/editors/space_outliner/outliner_tree.c280
-rw-r--r--source/blender/editors/space_outliner/outliner_utils.c2
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c37
-rw-r--r--source/blender/editors/space_outliner/tree/common.cc1
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display.cc2
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_view_layer.cc9
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element.cc2
-rw-r--r--source/blender/editors/space_script/space_script.c9
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c5
-rw-r--r--source/blender/editors/space_sequencer/sequencer_buttons.c4
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c27
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c1
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c5
-rw-r--r--source/blender/editors/space_sequencer/sequencer_proxy.c1
-rw-r--r--source/blender/editors/space_sequencer/sequencer_scopes.c2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_select.c119
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c56
-rw-r--r--source/blender/editors/space_statusbar/space_statusbar.c21
-rw-r--r--source/blender/editors/space_text/space_text.c13
-rw-r--r--source/blender/editors/space_text/text_draw.c28
-rw-r--r--source/blender/editors/space_text/text_format.c2
-rw-r--r--source/blender/editors/space_text/text_ops.c2
-rw-r--r--source/blender/editors/space_text/text_undo.c11
-rw-r--r--source/blender/editors/space_topbar/space_topbar.c31
-rw-r--r--source/blender/editors/space_userpref/space_userpref.c34
-rw-r--r--source/blender/editors/space_userpref/userpref_ops.c4
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c159
-rw-r--r--source/blender/editors/space_view3d/view3d_camera_control.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c83
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c21
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c10
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_armature.c1
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_camera.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_forcefield.c1
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_navigate.c27
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c620
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_preselect.c3
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c3
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c3
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c3
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c7
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c1
-rw-r--r--source/blender/editors/space_view3d/view3d_utils.c46
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c13
-rw-r--r--source/blender/editors/space_view3d/view3d_walk.c4
-rw-r--r--source/blender/editors/transform/CMakeLists.txt1
-rw-r--r--source/blender/editors/transform/transform.c34
-rw-r--r--source/blender/editors/transform/transform.h460
-rw-r--r--source/blender/editors/transform/transform_constraints.c143
-rw-r--r--source/blender/editors/transform/transform_convert.c425
-rw-r--r--source/blender/editors/transform/transform_convert.h37
-rw-r--r--source/blender/editors/transform/transform_convert_action.c2
-rw-r--r--source/blender/editors/transform/transform_convert_armature.c10
-rw-r--r--source/blender/editors/transform/transform_convert_curve.c3
-rw-r--r--source/blender/editors/transform/transform_convert_gpencil.c13
-rw-r--r--source/blender/editors/transform/transform_convert_graph.c2
-rw-r--r--source/blender/editors/transform/transform_convert_lattice.c1
-rw-r--r--source/blender/editors/transform/transform_convert_mask.c2
-rw-r--r--source/blender/editors/transform/transform_convert_mball.c1
-rw-r--r--source/blender/editors/transform/transform_convert_mesh.c250
-rw-r--r--source/blender/editors/transform/transform_convert_mesh_edge.c1
-rw-r--r--source/blender/editors/transform/transform_convert_mesh_skin.c6
-rw-r--r--source/blender/editors/transform/transform_convert_mesh_uv.c2
-rw-r--r--source/blender/editors/transform/transform_convert_nla.c35
-rw-r--r--source/blender/editors/transform/transform_convert_node.c2
-rw-r--r--source/blender/editors/transform/transform_convert_object.c73
-rw-r--r--source/blender/editors/transform/transform_convert_object_texspace.c125
-rw-r--r--source/blender/editors/transform/transform_convert_paintcurve.c2
-rw-r--r--source/blender/editors/transform/transform_convert_particle.c3
-rw-r--r--source/blender/editors/transform/transform_convert_sculpt.c2
-rw-r--r--source/blender/editors/transform/transform_convert_sequencer.c30
-rw-r--r--source/blender/editors/transform/transform_convert_tracking.c248
-rw-r--r--source/blender/editors/transform/transform_data.h10
-rw-r--r--source/blender/editors/transform/transform_draw_cursors.c396
-rw-r--r--source/blender/editors/transform/transform_generics.c137
-rw-r--r--source/blender/editors/transform/transform_gizmo_3d.c4
-rw-r--r--source/blender/editors/transform/transform_gizmo_extrude_3d.c2
-rw-r--r--source/blender/editors/transform/transform_input.c24
-rw-r--r--source/blender/editors/transform/transform_mode.c14
-rw-r--r--source/blender/editors/transform/transform_mode_align.c2
-rw-r--r--source/blender/editors/transform/transform_mode_edge_seq_slide.c11
-rw-r--r--source/blender/editors/transform/transform_mode_edge_slide.c2
-rw-r--r--source/blender/editors/transform/transform_mode_mirror.c2
-rw-r--r--source/blender/editors/transform/transform_mode_resize.c2
-rw-r--r--source/blender/editors/transform/transform_mode_shrink_fatten.c17
-rw-r--r--source/blender/editors/transform/transform_mode_translate.c2
-rw-r--r--source/blender/editors/transform/transform_ops.c6
-rw-r--r--source/blender/editors/transform/transform_orientations.c30
-rw-r--r--source/blender/editors/transform/transform_snap.c247
-rw-r--r--source/blender/editors/transform/transform_snap_object.c2
-rw-r--r--source/blender/editors/undo/ed_undo.c222
-rw-r--r--source/blender/editors/undo/memfile_undo.c18
-rw-r--r--source/blender/editors/util/CMakeLists.txt2
-rw-r--r--source/blender/editors/util/ed_transverts.c4
-rw-r--r--source/blender/editors/util/ed_util.c2
-rw-r--r--source/blender/editors/util/ed_util_ops.cc (renamed from source/blender/editors/util/ed_util_ops.c)30
-rw-r--r--source/blender/editors/util/numinput.c2
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c14
-rw-r--r--source/blender/editors/uvedit/uvedit_smart_stitch.c12
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c6
-rw-r--r--source/blender/freestyle/intern/application/Controller.cpp2
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp13
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h4
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp2
-rw-r--r--source/blender/freestyle/intern/geometry/FitCurve.cpp2
-rw-r--r--source/blender/freestyle/intern/geometry/GeomUtils.cpp4
-rw-r--r--source/blender/freestyle/intern/geometry/matrix_util.cpp2
-rw-r--r--source/blender/freestyle/intern/geometry/matrix_util.h2
-rw-r--r--source/blender/freestyle/intern/geometry/normal_cycle.cpp2
-rw-r--r--source/blender/freestyle/intern/geometry/normal_cycle.h2
-rw-r--r--source/blender/freestyle/intern/python/BPy_BBox.cpp9
-rw-r--r--source/blender/freestyle/intern/python/BPy_BBox.h5
-rw-r--r--source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_Convert.cpp3
-rw-r--r--source/blender/freestyle/intern/python/BPy_Convert.h128
-rw-r--r--source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_FrsMaterial.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_FrsNoise.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_FrsNoise.h6
-rw-r--r--source/blender/freestyle/intern/python/BPy_Id.cpp16
-rw-r--r--source/blender/freestyle/intern/python/BPy_Id.h6
-rw-r--r--source/blender/freestyle/intern/python/BPy_IntegrationType.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_IntegrationType.h2
-rw-r--r--source/blender/freestyle/intern/python/BPy_Interface0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_Interface0D.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_Interface1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_Interface1D.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_Iterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_Iterator.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_MediumType.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_MediumType.h2
-rw-r--r--source/blender/freestyle/intern/python/BPy_Nature.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_Nature.h2
-rw-r--r--source/blender/freestyle/intern/python/BPy_Operators.cpp76
-rw-r--r--source/blender/freestyle/intern/python/BPy_Operators.h2
-rw-r--r--source/blender/freestyle/intern/python/BPy_SShape.cpp74
-rw-r--r--source/blender/freestyle/intern/python/BPy_SShape.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_StrokeAttribute.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_StrokeShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_StrokeShader.h6
-rw-r--r--source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h2
-rw-r--r--source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h2
-rw-r--r--source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_ViewMap.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_ViewMap.h4
-rw-r--r--source/blender/freestyle/intern/python/BPy_ViewShape.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BPy_ViewShape.h4
-rw-r--r--source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Director.cpp2
-rw-r--r--source/blender/freestyle/intern/python/Director.h33
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h2
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h2
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp8
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp74
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h3
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h3
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h3
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h3
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h2
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp72
-rw-r--r--source/blender/freestyle/intern/view_map/ViewMap.h6
-rw-r--r--source/blender/freestyle/intern/winged_edge/Curvature.cpp2
-rw-r--r--source/blender/freestyle/intern/winged_edge/Curvature.h2
-rw-r--r--source/blender/functions/FN_cpp_type.hh5
-rw-r--r--source/blender/functions/FN_generic_value_map.hh10
-rw-r--r--source/blender/functions/intern/multi_function_network_optimization.cc4
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c40
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c4
-rw-r--r--source/blender/gpu/GPU_batch.h4
-rw-r--r--source/blender/gpu/GPU_framebuffer.h10
-rw-r--r--source/blender/gpu/GPU_index_buffer.h2
-rw-r--r--source/blender/gpu/GPU_platform.h1
-rw-r--r--source/blender/gpu/GPU_shader.h2
-rw-r--r--source/blender/gpu/GPU_state.h4
-rw-r--r--source/blender/gpu/GPU_texture.h25
-rw-r--r--source/blender/gpu/GPU_vertex_buffer.h2
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c2
-rw-r--r--source/blender/gpu/intern/gpu_context_private.hh2
-rw-r--r--source/blender/gpu/intern/gpu_drawlist_private.hh2
-rw-r--r--source/blender/gpu/intern/gpu_framebuffer.cc31
-rw-r--r--source/blender/gpu/intern/gpu_framebuffer_private.hh9
-rw-r--r--source/blender/gpu/intern/gpu_immediate_private.hh8
-rw-r--r--source/blender/gpu/intern/gpu_index_buffer_private.hh4
-rw-r--r--source/blender/gpu/intern/gpu_material_library.c4
-rw-r--r--source/blender/gpu/intern/gpu_matrix.cc2
-rw-r--r--source/blender/gpu/intern/gpu_node_graph.c2
-rw-r--r--source/blender/gpu/intern/gpu_select_pick.c4
-rw-r--r--source/blender/gpu/intern/gpu_shader.cc7
-rw-r--r--source/blender/gpu/intern/gpu_shader_interface.hh6
-rw-r--r--source/blender/gpu/intern/gpu_shader_private.hh2
-rw-r--r--source/blender/gpu/intern/gpu_state.cc5
-rw-r--r--source/blender/gpu/intern/gpu_state_private.hh6
-rw-r--r--source/blender/gpu/intern/gpu_texture.cc16
-rw-r--r--source/blender/gpu/intern/gpu_texture_private.hh44
-rw-r--r--source/blender/gpu/intern/gpu_uniform_buffer_private.hh2
-rw-r--r--source/blender/gpu/intern/gpu_vertex_buffer_private.hh4
-rw-r--r--source/blender/gpu/intern/gpu_vertex_format.cc8
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c10
-rw-r--r--source/blender/gpu/opengl/gl_backend.cc28
-rw-r--r--source/blender/gpu/opengl/gl_batch.hh4
-rw-r--r--source/blender/gpu/opengl/gl_context.cc4
-rw-r--r--source/blender/gpu/opengl/gl_context.hh8
-rw-r--r--source/blender/gpu/opengl/gl_debug.cc2
-rw-r--r--source/blender/gpu/opengl/gl_framebuffer.cc12
-rw-r--r--source/blender/gpu/opengl/gl_framebuffer.hh12
-rw-r--r--source/blender/gpu/opengl/gl_primitive.hh2
-rw-r--r--source/blender/gpu/opengl/gl_shader_interface.cc6
-rw-r--r--source/blender/gpu/opengl/gl_state.hh2
-rw-r--r--source/blender/gpu/opengl/gl_texture.cc8
-rw-r--r--source/blender/gpu/opengl/gl_texture.hh19
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl19
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl23
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl84
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl2
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl66
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl37
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl579
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl30
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl4
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl32
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl2
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl16
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.cpp2
-rw-r--r--source/blender/imbuf/IMB_imbuf.h2
-rw-r--r--source/blender/imbuf/IMB_metadata.h2
-rw-r--r--source/blender/imbuf/IMB_thumbs.h1
-rw-r--r--source/blender/imbuf/intern/IMB_allocimbuf.h2
-rw-r--r--source/blender/imbuf/intern/IMB_colormanagement_intern.h9
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c4
-rw-r--r--source/blender/imbuf/intern/anim_movie.c10
-rw-r--r--source/blender/imbuf/intern/colormanagement.c549
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.cpp2
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.h2
-rw-r--r--source/blender/imbuf/intern/filter.c2
-rw-r--r--source/blender/imbuf/intern/imageprocess.c2
-rw-r--r--source/blender/imbuf/intern/indexer.c3
-rw-r--r--source/blender/imbuf/intern/jp2.c6
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp4
-rw-r--r--source/blender/imbuf/intern/readimage.c24
-rw-r--r--source/blender/imbuf/intern/targa.c2
-rw-r--r--source/blender/imbuf/intern/thumbs.c2
-rw-r--r--source/blender/imbuf/intern/thumbs_blend.c60
-rw-r--r--source/blender/imbuf/intern/tiff.c4
-rw-r--r--source/blender/imbuf/intern/util_gpu.c2
-rw-r--r--source/blender/io/alembic/exporter/abc_archive.cc6
-rw-r--r--source/blender/io/alembic/exporter/abc_writer_mesh.h2
-rw-r--r--source/blender/io/alembic/exporter/abc_writer_transform.cc2
-rw-r--r--source/blender/io/alembic/intern/abc_reader_mesh.cc2
-rw-r--r--source/blender/io/alembic/intern/abc_util.cc2
-rw-r--r--source/blender/io/collada/AnimationImporter.cpp4
-rw-r--r--source/blender/io/collada/ArmatureExporter.cpp4
-rw-r--r--source/blender/io/collada/ArmatureImporter.cpp2
-rw-r--r--source/blender/io/collada/BCAnimationCurve.h2
-rw-r--r--source/blender/io/collada/BCAnimationSampler.cpp2
-rw-r--r--source/blender/io/collada/DocumentImporter.cpp14
-rw-r--r--source/blender/io/collada/DocumentImporter.h2
-rw-r--r--source/blender/io/collada/GeometryExporter.h1
-rw-r--r--source/blender/io/collada/MeshImporter.cpp2
-rw-r--r--source/blender/io/common/IO_dupli_persistent_id.hh2
-rw-r--r--source/blender/io/common/intern/abstract_hierarchy_iterator.cc2
-rw-r--r--source/blender/io/common/intern/object_identifier_test.cc2
-rw-r--r--source/blender/io/usd/CMakeLists.txt3
-rw-r--r--source/blender/makesdna/DNA_ID.h105
-rw-r--r--source/blender/makesdna/DNA_ID_enums.h118
-rw-r--r--source/blender/makesdna/DNA_action_types.h8
-rw-r--r--source/blender/makesdna/DNA_anim_types.h18
-rw-r--r--source/blender/makesdna/DNA_armature_types.h37
-rw-r--r--source/blender/makesdna/DNA_boid_types.h2
-rw-r--r--source/blender/makesdna/DNA_brush_enums.h4
-rw-r--r--source/blender/makesdna/DNA_brush_types.h13
-rw-r--r--source/blender/makesdna/DNA_cloth_types.h27
-rw-r--r--source/blender/makesdna/DNA_color_types.h2
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h4
-rw-r--r--source/blender/makesdna/DNA_curve_types.h4
-rw-r--r--source/blender/makesdna/DNA_dynamicpaint_types.h6
-rw-r--r--source/blender/makesdna/DNA_gpencil_modifier_defaults.h3
-rw-r--r--source/blender/makesdna/DNA_gpencil_modifier_types.h4
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h51
-rw-r--r--source/blender/makesdna/DNA_lightprobe_types.h4
-rw-r--r--source/blender/makesdna/DNA_mask_types.h2
-rw-r--r--source/blender/makesdna/DNA_material_types.h4
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h5
-rw-r--r--source/blender/makesdna/DNA_meta_types.h6
-rw-r--r--source/blender/makesdna/DNA_modifier_defaults.h6
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h18
-rw-r--r--source/blender/makesdna/DNA_movieclip_types.h8
-rw-r--r--source/blender/makesdna/DNA_node_types.h136
-rw-r--r--source/blender/makesdna/DNA_object_force_types.h4
-rw-r--r--source/blender/makesdna/DNA_object_types.h9
-rw-r--r--source/blender/makesdna/DNA_outliner_types.h96
-rw-r--r--source/blender/makesdna/DNA_particle_types.h4
-rw-r--r--source/blender/makesdna/DNA_rigidbody_types.h18
-rw-r--r--source/blender/makesdna/DNA_scene_defaults.h3
-rw-r--r--source/blender/makesdna/DNA_scene_types.h230
-rw-r--r--source/blender/makesdna/DNA_screen_types.h6
-rw-r--r--source/blender/makesdna/DNA_space_types.h38
-rw-r--r--source/blender/makesdna/DNA_tracking_types.h14
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h30
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h4
-rw-r--r--source/blender/makesdna/intern/CMakeLists.txt6
-rw-r--r--source/blender/makesdna/intern/makesdna.c19
-rw-r--r--source/blender/makesrna/RNA_access.h2
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt1
-rw-r--r--source/blender/makesrna/intern/makesrna.c11
-rw-r--r--source/blender/makesrna/intern/rna_access.c6
-rw-r--r--source/blender/makesrna/intern/rna_access_compare_override.c14
-rw-r--r--source/blender/makesrna/intern/rna_animviz.c2
-rw-r--r--source/blender/makesrna/intern/rna_attribute.c130
-rw-r--r--source/blender/makesrna/intern/rna_brush.c37
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c2
-rw-r--r--source/blender/makesrna/intern/rna_curve.c4
-rw-r--r--source/blender/makesrna/intern/rna_define.c12
-rw-r--r--source/blender/makesrna/intern/rna_depsgraph.c4
-rw-r--r--source/blender/makesrna/intern/rna_dynamicpaint.c2
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c21
-rw-r--r--source/blender/makesrna/intern/rna_fluid.c2
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c212
-rw-r--r--source/blender/makesrna/intern/rna_gpencil_modifier.c9
-rw-r--r--source/blender/makesrna/intern/rna_lattice.c4
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c4
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c58
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c518
-rw-r--r--source/blender/makesrna/intern/rna_object.c38
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c46
-rw-r--r--source/blender/makesrna/intern/rna_pose.c1
-rw-r--r--source/blender/makesrna/intern/rna_render.c8
-rw-r--r--source/blender/makesrna/intern/rna_rna.c54
-rw-r--r--source/blender/makesrna/intern/rna_scene.c192
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c2
-rw-r--r--source/blender/makesrna/intern/rna_space.c44
-rw-r--r--source/blender/makesrna/intern/rna_tracking.c18
-rw-r--r--source/blender/makesrna/intern/rna_ui.c46
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c30
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c26
-rw-r--r--source/blender/makesrna/intern/rna_vfont.c2
-rw-r--r--source/blender/makesrna/intern/rna_wm_api.c10
-rw-r--r--source/blender/makesrna/intern/rna_wm_gizmo.c4
-rw-r--r--source/blender/modifiers/CMakeLists.txt2
-rw-r--r--source/blender/modifiers/intern/MOD_array.c3
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c81
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c2
-rw-r--r--source/blender/modifiers/intern/MOD_correctivesmooth.c4
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c11
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc177
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c6
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c4
-rw-r--r--source/blender/modifiers/intern/MOD_solidify_nonmanifold.c4
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c159
-rw-r--r--source/blender/modifiers/intern/MOD_volume_to_mesh.cc165
-rw-r--r--source/blender/nodes/CMakeLists.txt25
-rw-r--r--source/blender/nodes/NOD_derived_node_tree.hh7
-rw-r--r--source/blender/nodes/NOD_function.h7
-rw-r--r--source/blender/nodes/NOD_geometry.h35
-rw-r--r--source/blender/nodes/NOD_geometry_exec.hh70
-rw-r--r--source/blender/nodes/NOD_static_types.h10
-rw-r--r--source/blender/nodes/function/nodes/node_fn_boolean_math.cc9
-rw-r--r--source/blender/nodes/function/nodes/node_fn_float_compare.cc9
-rw-r--r--source/blender/nodes/function/nodes/node_fn_input_string.cc84
-rw-r--r--source/blender/nodes/function/nodes/node_fn_input_vector.cc11
-rw-r--r--source/blender/nodes/function/nodes/node_fn_switch.cc10
-rw-r--r--source/blender/nodes/geometry/node_geometry_util.cc51
-rw-r--r--source/blender/nodes/geometry/node_geometry_util.hh2
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc135
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc40
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc151
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc42
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc44
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc231
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc43
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc244
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc238
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc142
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc177
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc92
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_boolean.cc15
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_collection_info.cc105
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_edge_split.cc2
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc47
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc64
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_object_info.cc36
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc241
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_instance.cc51
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc26
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_scale.cc13
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_separate.cc4
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_translate.cc13
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc276
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc20
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc115
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_transform.cc50
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_triangulate.cc12
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc171
-rw-r--r--source/blender/nodes/intern/derived_node_tree.cc2
-rw-r--r--source/blender/nodes/intern/node_geometry_exec.cc107
-rw-r--r--source/blender/nodes/intern/node_tree_multi_function.cc58
-rw-r--r--source/blender/nodes/intern/node_util.c26
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c4
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c4
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c46
-rw-r--r--source/blender/nodes/texture/node_texture_util.c2
-rw-r--r--source/blender/python/bmesh/bmesh_py_ops.c8
-rw-r--r--source/blender/python/bmesh/bmesh_py_ops_call.c4
-rw-r--r--source/blender/python/bmesh/bmesh_py_types.c102
-rw-r--r--source/blender/python/bmesh/bmesh_py_types_customdata.c4
-rw-r--r--source/blender/python/generic/idprop_py_api.c52
-rw-r--r--source/blender/python/generic/imbuf_py_api.c16
-rw-r--r--source/blender/python/generic/py_capi_utils.c74
-rw-r--r--source/blender/python/generic/py_capi_utils.h6
-rw-r--r--source/blender/python/gpu/CMakeLists.txt12
-rw-r--r--source/blender/python/gpu/gpu_py.c60
-rw-r--r--source/blender/python/gpu/gpu_py.h24
-rw-r--r--source/blender/python/gpu/gpu_py_api.c65
-rw-r--r--source/blender/python/gpu/gpu_py_api.h4
-rw-r--r--source/blender/python/gpu/gpu_py_batch.c104
-rw-r--r--source/blender/python/gpu/gpu_py_buffer.c667
-rw-r--r--source/blender/python/gpu/gpu_py_buffer.h53
-rw-r--r--source/blender/python/gpu/gpu_py_element.c33
-rw-r--r--source/blender/python/gpu/gpu_py_framebuffer.c546
-rw-r--r--source/blender/python/gpu/gpu_py_framebuffer.h33
-rw-r--r--source/blender/python/gpu/gpu_py_matrix.c193
-rw-r--r--source/blender/python/gpu/gpu_py_matrix.h2
-rw-r--r--source/blender/python/gpu/gpu_py_offscreen.c267
-rw-r--r--source/blender/python/gpu/gpu_py_offscreen.h1
-rw-r--r--source/blender/python/gpu/gpu_py_select.c20
-rw-r--r--source/blender/python/gpu/gpu_py_select.h2
-rw-r--r--source/blender/python/gpu/gpu_py_shader.c268
-rw-r--r--source/blender/python/gpu/gpu_py_shader.h2
-rw-r--r--source/blender/python/gpu/gpu_py_state.c423
-rw-r--r--source/blender/python/gpu/gpu_py_state.h23
-rw-r--r--source/blender/python/gpu/gpu_py_texture.c556
-rw-r--r--source/blender/python/gpu/gpu_py_texture.h34
-rw-r--r--source/blender/python/gpu/gpu_py_types.c40
-rw-r--r--source/blender/python/gpu/gpu_py_types.h7
-rw-r--r--source/blender/python/gpu/gpu_py_uniformbuffer.c195
-rw-r--r--source/blender/python/gpu/gpu_py_uniformbuffer.h33
-rw-r--r--source/blender/python/gpu/gpu_py_vertex_buffer.c61
-rw-r--r--source/blender/python/gpu/gpu_py_vertex_format.c170
-rw-r--r--source/blender/python/intern/bpy.c4
-rw-r--r--source/blender/python/intern/bpy_app.c5
-rw-r--r--source/blender/python/intern/bpy_app_handlers.c2
-rw-r--r--source/blender/python/intern/bpy_app_translations.c14
-rw-r--r--source/blender/python/intern/bpy_capi_utils.c6
-rw-r--r--source/blender/python/intern/bpy_capi_utils.h4
-rw-r--r--source/blender/python/intern/bpy_driver.c4
-rw-r--r--source/blender/python/intern/bpy_interface.c210
-rw-r--r--source/blender/python/intern/bpy_interface_atexit.c2
-rw-r--r--source/blender/python/intern/bpy_library_load.c44
-rw-r--r--source/blender/python/intern/bpy_msgbus.c2
-rw-r--r--source/blender/python/intern/bpy_operator.c2
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.c2
-rw-r--r--source/blender/python/intern/bpy_props.c165
-rw-r--r--source/blender/python/intern/bpy_props.h10
-rw-r--r--source/blender/python/intern/bpy_rna.c500
-rw-r--r--source/blender/python/intern/bpy_rna.h3
-rw-r--r--source/blender/python/intern/bpy_traceback.c2
-rw-r--r--source/blender/python/mathutils/mathutils.c10
-rw-r--r--source/blender/python/mathutils/mathutils_Euler.c2
-rw-r--r--source/blender/python/mathutils/mathutils_Matrix.c4
-rw-r--r--source/blender/python/mathutils/mathutils_Quaternion.c2
-rw-r--r--source/blender/python/mathutils/mathutils_Vector.c16
-rw-r--r--source/blender/python/mathutils/mathutils_bvhtree.c6
-rw-r--r--source/blender/python/mathutils/mathutils_kdtree.c2
-rw-r--r--source/blender/render/RE_engine.h1
-rw-r--r--source/blender/render/RE_multires_bake.h2
-rw-r--r--source/blender/render/RE_pipeline.h4
-rw-r--r--source/blender/render/intern/initrender.c42
-rw-r--r--source/blender/render/intern/multires_bake.c2
-rw-r--r--source/blender/render/intern/pipeline.c80
-rw-r--r--source/blender/render/intern/render_result.c2
-rw-r--r--source/blender/render/intern/render_types.h2
-rw-r--r--source/blender/render/intern/texture_image.c2
-rw-r--r--source/blender/render/intern/texture_procedural.c6
-rw-r--r--source/blender/render/intern/zbuf.c2
-rw-r--r--source/blender/sequencer/SEQ_render.h2
-rw-r--r--source/blender/sequencer/SEQ_select.h4
-rw-r--r--source/blender/sequencer/intern/image_cache.c182
-rw-r--r--source/blender/sequencer/intern/image_cache.h9
-rw-r--r--source/blender/sequencer/intern/iterator.c20
-rw-r--r--source/blender/sequencer/intern/prefetch.c8
-rw-r--r--source/blender/sequencer/intern/render.c36
-rw-r--r--source/blender/sequencer/intern/strip_select.c16
-rw-r--r--source/blender/simulation/intern/implicit_blender.c4
-rw-r--r--source/blender/simulation/intern/implicit_eigen.cpp4
-rw-r--r--source/blender/windowmanager/WM_api.h35
-rw-r--r--source/blender/windowmanager/WM_keymap.h10
-rw-r--r--source/blender/windowmanager/WM_toolsystem.h2
-rw-r--r--source/blender/windowmanager/WM_types.h8
-rw-r--r--source/blender/windowmanager/gizmo/WM_gizmo_api.h2
-rw-r--r--source/blender/windowmanager/gizmo/WM_gizmo_types.h8
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo.c2
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c4
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c6
-rw-r--r--source/blender/windowmanager/gizmo/wm_gizmo_fn.h3
-rw-r--r--source/blender/windowmanager/intern/wm.c2
-rw-r--r--source/blender/windowmanager/intern/wm_cursors.c3
-rw-r--r--source/blender/windowmanager/intern/wm_dragdrop.c52
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c2
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c43
-rw-r--r--source/blender/windowmanager/intern/wm_files.c33
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c14
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c23
-rw-r--r--source/blender/windowmanager/intern/wm_keymap_utils.c6
-rw-r--r--source/blender/windowmanager/intern/wm_operator_props.c18
-rw-r--r--source/blender/windowmanager/intern/wm_operator_type.c5
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c12
-rw-r--r--source/blender/windowmanager/intern/wm_playanim.c6
-rw-r--r--source/blender/windowmanager/intern/wm_splash_screen.c21
-rw-r--r--source/blender/windowmanager/intern/wm_toolsystem.c2
-rw-r--r--source/blender/windowmanager/intern/wm_window.c198
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr.c1
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_draw.c2
-rw-r--r--source/creator/CMakeLists.txt13
-rw-r--r--source/creator/creator_args.c22
-rw-r--r--source/creator/creator_intern.h2
m---------source/tools0
1419 files changed, 60683 insertions, 43541 deletions
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index efd30ba8509..f875a990d0a 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -20,6 +20,7 @@
set(SRC_DNA_INC
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_ID.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_ID_enums.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_action_types.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_anim_types.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_armature_types.h
diff --git a/source/blender/blendthumb/src/Dll.cpp b/source/blender/blendthumb/src/Dll.cpp
index 8a8ae8c9996..6516540034e 100644
--- a/source/blender/blendthumb/src/Dll.cpp
+++ b/source/blender/blendthumb/src/Dll.cpp
@@ -160,7 +160,7 @@ struct REGISTRY_ENTRY {
PCWSTR pszValueName;
DWORD dwValueType;
PCWSTR pszData; // These two fields could/should have been a union, but C++
- DWORD dwData; // only lets you initalize the first field in a union.
+ DWORD dwData; // only lets you initialize the first field in a union.
};
// Creates a registry key (if needed) and sets the default value of the key
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c
index 48f283e67b9..4d483934717 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -560,7 +560,7 @@ void BLF_draw_ascii_ex(int fontid, const char *str, size_t len, struct ResultBLF
if (font) {
blf_draw_gl__start(font);
if (font->flags & BLF_WORD_WRAP) {
- /* use non-ascii draw function for word-wrap */
+ /* Use non-ASCII draw function for word-wrap. */
blf_font_draw__wrap(font, str, len, r_info);
}
else {
diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c
index 25235097505..9520e971148 100644
--- a/source/blender/blenfont/intern/blf_dir.c
+++ b/source/blender/blenfont/intern/blf_dir.c
@@ -140,7 +140,7 @@ char *blf_dir_search(const char *file)
}
if (!s) {
- /* Assume file is either an abslute path, or a relative path to current directory. */
+ /* Assume file is either an absolute path, or a relative path to current directory. */
BLI_strncpy(full_path, file, sizeof(full_path));
BLI_path_abs(full_path, BKE_main_blendfile_path(G_MAIN));
if (BLI_exists(full_path)) {
@@ -151,8 +151,9 @@ char *blf_dir_search(const char *file)
return s;
}
-/* Some font have additional file with metrics information,
- * in general, the extension of the file is: .afm or .pfm
+/**
+ * Some font have additional file with metrics information,
+ * in general, the extension of the file is: `.afm` or `.pfm`
*/
char *blf_dir_metrics_search(const char *filename)
{
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 189cbaf152d..f83ee409187 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -192,7 +192,7 @@ static GPUTexture *blf_batch_cache_texture_load(void)
int remain_row = tex_width - offset_x;
int width = remain > remain_row ? remain_row : remain;
GPU_texture_update_sub(gc->texture,
- GPU_DATA_UNSIGNED_BYTE,
+ GPU_DATA_UBYTE,
&gc->bitmap_result[bitmap_len_landed],
offset_x,
offset_y,
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index 8d904bd6019..2fce4bfc5b8 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -212,8 +212,7 @@ struct NlaKeyframingContext *BKE_animsys_get_nla_keyframing_context(
struct ListBase *cache,
struct PointerRNA *ptr,
struct AnimData *adt,
- const struct AnimationEvalContext *anim_eval_context,
- const bool flush_to_original);
+ const struct AnimationEvalContext *anim_eval_context);
bool BKE_animsys_nla_remap_keyframe_values(struct NlaKeyframingContext *context,
struct PointerRNA *prop_ptr,
struct PropertyRNA *prop,
diff --git a/source/blender/blenkernel/BKE_attribute_access.hh b/source/blender/blenkernel/BKE_attribute_access.hh
index abcf8ed1c54..653c0f0d85d 100644
--- a/source/blender/blenkernel/BKE_attribute_access.hh
+++ b/source/blender/blenkernel/BKE_attribute_access.hh
@@ -24,6 +24,7 @@
#include "BKE_attribute.h"
#include "BLI_color.hh"
+#include "BLI_float2.hh"
#include "BLI_float3.hh"
namespace blender::bke {
@@ -32,6 +33,8 @@ using fn::CPPType;
const CPPType *custom_data_type_to_cpp_type(const CustomDataType type);
CustomDataType cpp_type_to_custom_data_type(const CPPType &type);
+CustomDataType attribute_data_type_highest_complexity(Span<CustomDataType> data_types);
+AttributeDomain attribute_domain_highest_priority(Span<AttributeDomain> domains);
/**
* This class offers an indirection for reading an attribute.
@@ -127,7 +130,7 @@ class WriteAttribute {
void *array_buffer_ = nullptr;
/* True, when the buffer points to a temporary array. */
bool array_is_temporary_ = false;
- /* This helps to protect agains forgetting to apply changes done to the array. */
+ /* This helps to protect against forgetting to apply changes done to the array. */
bool array_should_be_applied_ = false;
public:
@@ -301,11 +304,13 @@ template<typename T> class TypedWriteAttribute {
using BooleanReadAttribute = TypedReadAttribute<bool>;
using FloatReadAttribute = TypedReadAttribute<float>;
+using Float2ReadAttribute = TypedReadAttribute<float2>;
using Float3ReadAttribute = TypedReadAttribute<float3>;
using Int32ReadAttribute = TypedReadAttribute<int>;
using Color4fReadAttribute = TypedReadAttribute<Color4f>;
using BooleanWriteAttribute = TypedWriteAttribute<bool>;
using FloatWriteAttribute = TypedWriteAttribute<float>;
+using Float2WriteAttribute = TypedWriteAttribute<float2>;
using Float3WriteAttribute = TypedWriteAttribute<float3>;
using Int32WriteAttribute = TypedWriteAttribute<int>;
using Color4fWriteAttribute = TypedWriteAttribute<Color4f>;
diff --git a/source/blender/blenkernel/BKE_attribute_math.hh b/source/blender/blenkernel/BKE_attribute_math.hh
new file mode 100644
index 00000000000..0294a8c09d5
--- /dev/null
+++ b/source/blender/blenkernel/BKE_attribute_math.hh
@@ -0,0 +1,256 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "BLI_array.hh"
+#include "BLI_color.hh"
+#include "BLI_float2.hh"
+#include "BLI_float3.hh"
+
+#include "DNA_customdata_types.h"
+
+namespace blender::attribute_math {
+
+/**
+ * Utility function that simplifies calling a templated function based on a custom data type.
+ */
+template<typename Func>
+void convert_to_static_type(const CustomDataType data_type, const Func &func)
+{
+ switch (data_type) {
+ case CD_PROP_FLOAT:
+ func(float());
+ break;
+ case CD_PROP_FLOAT2:
+ func(float2());
+ break;
+ case CD_PROP_FLOAT3:
+ func(float3());
+ break;
+ case CD_PROP_INT32:
+ func(int());
+ break;
+ case CD_PROP_BOOL:
+ func(bool());
+ break;
+ case CD_PROP_COLOR:
+ func(Color4f());
+ break;
+ default:
+ BLI_assert(false);
+ break;
+ }
+}
+
+/* -------------------------------------------------------------------- */
+/** \name Mix three values of the same type.
+ *
+ * This is typically used to interpolate values within a triangle.
+ * \{ */
+
+template<typename T> T mix3(const float3 &weights, const T &v0, const T &v1, const T &v2);
+
+template<> inline bool mix3(const float3 &weights, const bool &v0, const bool &v1, const bool &v2)
+{
+ return (weights.x * v0 + weights.y * v1 + weights.z * v2) >= 0.5f;
+}
+
+template<> inline int mix3(const float3 &weights, const int &v0, const int &v1, const int &v2)
+{
+ return static_cast<int>(weights.x * v0 + weights.y * v1 + weights.z * v2);
+}
+
+template<>
+inline float mix3(const float3 &weights, const float &v0, const float &v1, const float &v2)
+{
+ return weights.x * v0 + weights.y * v1 + weights.z * v2;
+}
+
+template<>
+inline float2 mix3(const float3 &weights, const float2 &v0, const float2 &v1, const float2 &v2)
+{
+ return weights.x * v0 + weights.y * v1 + weights.z * v2;
+}
+
+template<>
+inline float3 mix3(const float3 &weights, const float3 &v0, const float3 &v1, const float3 &v2)
+{
+ return weights.x * v0 + weights.y * v1 + weights.z * v2;
+}
+
+template<>
+inline Color4f mix3(const float3 &weights, const Color4f &v0, const Color4f &v1, const Color4f &v2)
+{
+ Color4f result;
+ interp_v4_v4v4v4(result, v0, v1, v2, weights);
+ return result;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Mix a dynamic amount of values with weights for many elements.
+ *
+ * This section provides an abstraction for "mixers". The abstraction encapsulates details about
+ * how different types should be mixed. Usually #DefaultMixer<T> should be used to get a mixer for
+ * a specific type.
+ * \{ */
+
+template<typename T> class SimpleMixer {
+ private:
+ MutableSpan<T> buffer_;
+ T default_value_;
+ Array<float> total_weights_;
+
+ public:
+ /**
+ * \param buffer: Span where the interpolated values should be stored.
+ * \param default_value: Output value for an element that has not been affected by a #mix_in.
+ */
+ SimpleMixer(MutableSpan<T> buffer, T default_value = {})
+ : buffer_(buffer), default_value_(default_value), total_weights_(buffer.size(), 0.0f)
+ {
+ BLI_STATIC_ASSERT(std::is_trivial_v<T>, "");
+ memset(buffer_.data(), 0, sizeof(T) * buffer_.size());
+ }
+
+ /**
+ * Mix a #value into the element with the given #index.
+ */
+ void mix_in(const int64_t index, const T &value, const float weight = 1.0f)
+ {
+ BLI_assert(weight >= 0.0f);
+ buffer_[index] += value * weight;
+ total_weights_[index] += weight;
+ }
+
+ /**
+ * Has to be called before the buffer provided in the constructor is used.
+ */
+ void finalize()
+ {
+ for (const int64_t i : buffer_.index_range()) {
+ const float weight = total_weights_[i];
+ if (weight > 0.0f) {
+ buffer_[i] *= 1.0f / weight;
+ }
+ else {
+ buffer_[i] = default_value_;
+ }
+ }
+ }
+};
+
+/** This mixer accumulates values in a type that is different from the one that is mixed. Some
+ * types cannot encode the floating point weights in their values (e.g. int and bool). */
+template<typename T, typename AccumulationT, T (*ConvertToT)(const AccumulationT &value)>
+class SimpleMixerWithAccumulationType {
+ private:
+ struct Item {
+ /* Store both values together, because they are accessed together. */
+ AccumulationT value = {0};
+ float weight = 0.0f;
+ };
+
+ MutableSpan<T> buffer_;
+ T default_value_;
+ Array<Item> accumulation_buffer_;
+
+ public:
+ SimpleMixerWithAccumulationType(MutableSpan<T> buffer, T default_value = {})
+ : buffer_(buffer), default_value_(default_value), accumulation_buffer_(buffer.size())
+ {
+ }
+
+ void mix_in(const int64_t index, const T &value, const float weight = 1.0f)
+ {
+ const AccumulationT converted_value = static_cast<AccumulationT>(value);
+ Item &item = accumulation_buffer_[index];
+ item.value += converted_value * weight;
+ item.weight += weight;
+ }
+
+ void finalize()
+ {
+ for (const int64_t i : buffer_.index_range()) {
+ const Item &item = accumulation_buffer_[i];
+ if (item.weight > 0.0f) {
+ const float weight_inv = 1.0f / item.weight;
+ const T converted_value = ConvertToT(item.value * weight_inv);
+ buffer_[i] = converted_value;
+ }
+ else {
+ buffer_[i] = default_value_;
+ }
+ }
+ }
+};
+
+class Color4fMixer {
+ private:
+ MutableSpan<Color4f> buffer_;
+ Color4f default_color_;
+ Array<float> total_weights_;
+
+ public:
+ Color4fMixer(MutableSpan<Color4f> buffer, Color4f default_color = {0, 0, 0, 1});
+ void mix_in(const int64_t index, const Color4f &color, const float weight = 1.0f);
+ void finalize();
+};
+
+template<typename T> struct DefaultMixerStruct {
+ /* Use void by default. This can be check for in `if constexpr` statements. */
+ using type = void;
+};
+template<> struct DefaultMixerStruct<float> {
+ using type = SimpleMixer<float>;
+};
+template<> struct DefaultMixerStruct<float2> {
+ using type = SimpleMixer<float2>;
+};
+template<> struct DefaultMixerStruct<float3> {
+ using type = SimpleMixer<float3>;
+};
+template<> struct DefaultMixerStruct<Color4f> {
+ /* Use a special mixer for colors. Color4f can't be added/multiplied, because this is not
+ * something one should usually do with colors. */
+ using type = Color4fMixer;
+};
+template<> struct DefaultMixerStruct<int> {
+ static int double_to_int(const double &value)
+ {
+ return static_cast<int>(value);
+ }
+ /* Store interpolated ints in a double temporarily, so that weights are handled correctly. It
+ * uses double instead of float so that it is accurate for all 32 bit integers. */
+ using type = SimpleMixerWithAccumulationType<int, double, double_to_int>;
+};
+template<> struct DefaultMixerStruct<bool> {
+ static bool float_to_bool(const float &value)
+ {
+ return value >= 0.5f;
+ }
+ /* Store interpolated booleans in a float temporary.
+ * Otherwise information provided by weights is easily rounded away. */
+ using type = SimpleMixerWithAccumulationType<bool, float, float_to_bool>;
+};
+
+/* Utility to get a good default mixer for a given type. This is `void` when there is no default
+ * mixer for the given type. */
+template<typename T> using DefaultMixer = typename DefaultMixerStruct<T>::type;
+
+/** \} */
+
+} // namespace blender::attribute_math
diff --git a/source/blender/blenkernel/BKE_blender_undo.h b/source/blender/blenkernel/BKE_blender_undo.h
index e5ce91df3fb..1febe75b6f2 100644
--- a/source/blender/blenkernel/BKE_blender_undo.h
+++ b/source/blender/blenkernel/BKE_blender_undo.h
@@ -27,12 +27,14 @@ struct Main;
struct MemFileUndoData;
struct bContext;
+enum eUndoStepDir;
+
#define BKE_UNDO_STR_MAX 64
struct MemFileUndoData *BKE_memfile_undo_encode(struct Main *bmain,
struct MemFileUndoData *mfu_prev);
bool BKE_memfile_undo_decode(struct MemFileUndoData *mfu,
- const int undo_direction,
+ const enum eUndoStepDir undo_direction,
const bool use_old_bmain_data,
struct bContext *C);
void BKE_memfile_undo_free(struct MemFileUndoData *mfu);
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index a904bb439df..7db6980c91a 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -31,15 +31,15 @@ extern "C" {
*/
/* Blender major and minor version. */
-#define BLENDER_VERSION 292
+#define BLENDER_VERSION 293
/* Blender patch version for bugfix releases. */
#define BLENDER_VERSION_PATCH 0
/** Blender release cycle stage: alpha/beta/rc/release. */
-#define BLENDER_VERSION_CYCLE rc
+#define BLENDER_VERSION_CYCLE alpha
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
-#define BLENDER_FILE_SUBVERSION 15
+#define BLENDER_FILE_SUBVERSION 8
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and show a warning if the file
diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h
index 84a17136361..78908908343 100644
--- a/source/blender/blenkernel/BKE_bvhutils.h
+++ b/source/blender/blenkernel/BKE_bvhutils.h
@@ -38,6 +38,7 @@ struct BMEditMesh;
struct MFace;
struct MVert;
struct Mesh;
+struct PointCloud;
struct BVHCache;
@@ -249,6 +250,20 @@ float bvhtree_sphereray_tri_intersection(const BVHTreeRay *ray,
const float v1[3],
const float v2[3]);
+typedef struct BVHTreeFromPointCloud {
+ struct BVHTree *tree;
+
+ BVHTree_NearestPointCallback nearest_callback;
+
+ const float (*coords)[3];
+} BVHTreeFromPointCloud;
+
+BVHTree *BKE_bvhtree_from_pointcloud_get(struct BVHTreeFromPointCloud *data,
+ const struct PointCloud *pointcloud,
+ const int tree_type);
+
+void free_bvhtree_from_pointcloud(struct BVHTreeFromPointCloud *data);
+
/**
* BVHCache
*/
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index e9267955d70..04fcdd6ed6f 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -131,13 +131,13 @@ typedef struct ClothVertex {
* The definition of a spring.
*/
typedef struct ClothSpring {
- int ij; /* Pij from the paper, one end of the spring. */
- int kl; /* Pkl from the paper, one end of the spring. */
+ int ij; /* `Pij` from the paper, one end of the spring. */
+ int kl; /* `Pkl` from the paper, one end of the spring. */
int mn; /* For hair springs: third vertex index; For bending springs: edge index; */
int *pa; /* Array of vert indices for poly a (for bending springs). */
int *pb; /* Array of vert indices for poly b (for bending springs). */
- int la; /* Length of *pa. */
- int lb; /* Length of *pb. */
+ int la; /* Length of `*pa`. */
+ int lb; /* Length of `*pb`. */
float restlen; /* The original length of the spring. */
float restang; /* The original angle of the bending springs. */
int type; /* Types defined in BKE_cloth.h ("springType"). */
@@ -208,7 +208,7 @@ typedef enum {
/* SPRING FLAGS */
typedef enum {
CLOTH_SPRING_FLAG_DEACTIVATE = (1 << 1),
- CLOTH_SPRING_FLAG_NEEDED = (1 << 2), // springs has values to be applied
+ CLOTH_SPRING_FLAG_NEEDED = (1 << 2), /* Springs has values to be applied. */
} CLOTH_SPRINGS_FLAGS;
/////////////////////////////////////////////////
diff --git a/source/blender/blenkernel/BKE_cryptomatte.h b/source/blender/blenkernel/BKE_cryptomatte.h
index eb2de96a745..2b5a6a2044b 100644
--- a/source/blender/blenkernel/BKE_cryptomatte.h
+++ b/source/blender/blenkernel/BKE_cryptomatte.h
@@ -31,9 +31,9 @@ extern "C" {
#endif
struct CryptomatteSession;
-struct Material;
struct ID;
struct Main;
+struct Material;
struct Object;
struct RenderResult;
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 881b93fe709..660e7c08062 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -338,6 +338,18 @@ void BKE_curve_deform_co(const struct Object *ob_curve,
/** \} */
+/* curve_convert.c */
+
+/* Create a new curve from the given object at its current state. This only works for curve and
+ * text objects, otherwise NULL is returned.
+ *
+ * If apply_modifiers is true and the object is a curve one, then spline deform modifiers are
+ * applied on the control points of the splines.
+ */
+struct Curve *BKE_curve_new_from_object(struct Object *object,
+ struct Depsgraph *depsgraph,
+ bool apply_modifiers);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 57fdafaf8d9..ed319948160 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -249,6 +249,13 @@ void CustomData_copy_data(const struct CustomData *source,
int source_index,
int dest_index,
int count);
+void CustomData_copy_data_layer(const CustomData *source,
+ CustomData *dest,
+ int src_layer_index,
+ int dst_layer_index,
+ int src_index,
+ int dst_index,
+ int count);
void CustomData_copy_data_named(const struct CustomData *source,
struct CustomData *dest,
int source_index,
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index b2502031029..05e60d38487 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -112,11 +112,18 @@ void BKE_displist_make_mball_forRender(struct Depsgraph *depsgraph,
struct Object *ob,
struct ListBase *dispbase);
+bool BKE_curve_calc_modifiers_pre(struct Depsgraph *depsgraph,
+ struct Scene *scene,
+ struct Object *ob,
+ struct ListBase *source_nurb,
+ struct ListBase *target_nurb,
+ const bool for_render);
+
bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4);
-void BKE_displist_fill(struct ListBase *dispbase,
+void BKE_displist_fill(const struct ListBase *dispbase,
struct ListBase *to,
const float normal_proj[3],
- const bool flipnormal);
+ const bool flip_normal);
float BKE_displist_calc_taper(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *taperobj, int cur, int tot);
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h
index 3cba47afc46..231a4563630 100644
--- a/source/blender/blenkernel/BKE_effect.h
+++ b/source/blender/blenkernel/BKE_effect.h
@@ -121,7 +121,8 @@ void BKE_effector_relations_free(struct ListBase *lb);
struct ListBase *BKE_effectors_create(struct Depsgraph *depsgraph,
struct Object *ob_src,
struct ParticleSystem *psys_src,
- struct EffectorWeights *weights);
+ struct EffectorWeights *weights,
+ bool use_rotation);
void BKE_effectors_apply(struct ListBase *effectors,
struct ListBase *colliders,
struct EffectorWeights *weights,
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 6f6269be208..ad01814ce82 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -25,6 +25,7 @@
#include "BLI_float3.hh"
#include "BLI_float4x4.hh"
+#include "BLI_function_ref.hh"
#include "BLI_hash.hh"
#include "BLI_map.hh"
#include "BLI_set.hh"
@@ -37,6 +38,7 @@ struct Collection;
struct Mesh;
struct Object;
struct PointCloud;
+struct Volume;
/* Each geometry component has a specific type. The type determines what kind of data the component
* stores. Functions modifying a geometry will usually just modify a subset of the component types.
@@ -45,6 +47,7 @@ enum class GeometryComponentType {
Mesh = 0,
PointCloud = 1,
Instances = 2,
+ Volume = 3,
};
enum class GeometryOwnershipType {
@@ -66,6 +69,10 @@ template<> struct DefaultHash<GeometryComponentType> {
};
} // namespace blender
+namespace blender::bke {
+class ComponentAttributeProviders;
+}
+
class GeometryComponent;
/**
@@ -123,6 +130,20 @@ class OutputAttributePtr {
};
/**
+ * Contains information about an attribute in a geometry component.
+ * More information can be added in the future. E.g. whether the attribute is builtin and how it is
+ * stored (uv map, vertex group, ...).
+ */
+struct AttributeMetaData {
+ AttributeDomain domain;
+ CustomDataType data_type;
+};
+
+/* Returns false when the iteration should be stopped. */
+using AttributeForeachCallback = blender::FunctionRef<bool(blender::StringRefNull attribute_name,
+ const AttributeMetaData &meta_data)>;
+
+/**
* This is the base class for specialized geometry component types.
*/
class GeometryComponent {
@@ -150,40 +171,37 @@ class GeometryComponent {
bool attribute_exists(const blender::StringRef attribute_name) const;
/* Returns true when the geometry component supports this attribute domain. */
- virtual bool attribute_domain_supported(const AttributeDomain domain) const;
- /* Returns true when the given data type is supported in the given domain. */
- virtual bool attribute_domain_with_type_supported(const AttributeDomain domain,
- const CustomDataType data_type) const;
+ bool attribute_domain_supported(const AttributeDomain domain) const;
/* Can only be used with supported domain types. */
virtual int attribute_domain_size(const AttributeDomain domain) const;
- /* Attributes with these names cannot be created or removed via this api. */
- virtual bool attribute_is_builtin(const blender::StringRef attribute_name) const;
/* Get read-only access to the highest priority attribute with the given name.
* Returns null if the attribute does not exist. */
- virtual blender::bke::ReadAttributePtr attribute_try_get_for_read(
+ blender::bke::ReadAttributePtr attribute_try_get_for_read(
const blender::StringRef attribute_name) const;
/* Get read and write access to the highest priority attribute with the given name.
* Returns null if the attribute does not exist. */
- virtual blender::bke::WriteAttributePtr attribute_try_get_for_write(
+ blender::bke::WriteAttributePtr attribute_try_get_for_write(
const blender::StringRef attribute_name);
/* Get a read-only attribute for the domain based on the given attribute. This can be used to
* interpolate from one domain to another.
* Returns null if the interpolation is not implemented. */
virtual blender::bke::ReadAttributePtr attribute_try_adapt_domain(
- blender::bke::ReadAttributePtr attribute, const AttributeDomain domain) const;
+ blender::bke::ReadAttributePtr attribute, const AttributeDomain new_domain) const;
/* Returns true when the attribute has been deleted. */
- virtual bool attribute_try_delete(const blender::StringRef attribute_name);
+ bool attribute_try_delete(const blender::StringRef attribute_name);
/* Returns true when the attribute has been created. */
- virtual bool attribute_try_create(const blender::StringRef attribute_name,
- const AttributeDomain domain,
- const CustomDataType data_type);
+ bool attribute_try_create(const blender::StringRef attribute_name,
+ const AttributeDomain domain,
+ const CustomDataType data_type);
+
+ blender::Set<std::string> attribute_names() const;
+ void attribute_foreach(const AttributeForeachCallback callback) const;
- virtual blender::Set<std::string> attribute_names() const;
virtual bool is_empty() const;
/* Get a read-only attribute for the given domain and data type.
@@ -255,6 +273,9 @@ class GeometryComponent {
const AttributeDomain domain,
const CustomDataType data_type,
const void *default_value = nullptr);
+
+ private:
+ virtual const blender::bke::ComponentAttributeProviders *get_attribute_providers() const;
};
template<typename T>
@@ -304,6 +325,8 @@ struct GeometrySet {
void add(const GeometryComponent &component);
+ blender::Vector<const GeometryComponent *> get_components_for_read() const;
+
void compute_boundbox_without_instances(blender::float3 *r_min, blender::float3 *r_max) const;
friend std::ostream &operator<<(std::ostream &stream, const GeometrySet &geometry_set);
@@ -320,10 +343,13 @@ struct GeometrySet {
bool has_mesh() const;
bool has_pointcloud() const;
bool has_instances() const;
+ bool has_volume() const;
const Mesh *get_mesh_for_read() const;
const PointCloud *get_pointcloud_for_read() const;
+ const Volume *get_volume_for_read() const;
Mesh *get_mesh_for_write();
PointCloud *get_pointcloud_for_write();
+ Volume *get_volume_for_write();
/* Utility methods for replacement. */
void replace_mesh(Mesh *mesh, GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
@@ -354,30 +380,22 @@ class MeshComponent : public GeometryComponent {
Mesh *release();
void copy_vertex_group_names_from_object(const struct Object &object);
+ const blender::Map<std::string, int> &vertex_group_names() const;
+ blender::Map<std::string, int> &vertex_group_names();
const Mesh *get_for_read() const;
Mesh *get_for_write();
- bool attribute_domain_supported(const AttributeDomain domain) const final;
- bool attribute_domain_with_type_supported(const AttributeDomain domain,
- const CustomDataType data_type) const final;
int attribute_domain_size(const AttributeDomain domain) const final;
- bool attribute_is_builtin(const blender::StringRef attribute_name) const final;
-
- blender::bke::ReadAttributePtr attribute_try_get_for_read(
- const blender::StringRef attribute_name) const final;
- blender::bke::WriteAttributePtr attribute_try_get_for_write(
- const blender::StringRef attribute_name) final;
+ blender::bke::ReadAttributePtr attribute_try_adapt_domain(
+ blender::bke::ReadAttributePtr attribute, const AttributeDomain new_domain) const final;
- bool attribute_try_delete(const blender::StringRef attribute_name) final;
- bool attribute_try_create(const blender::StringRef attribute_name,
- const AttributeDomain domain,
- const CustomDataType data_type) final;
-
- blender::Set<std::string> attribute_names() const final;
bool is_empty() const final;
static constexpr inline GeometryComponentType static_type = GeometryComponentType::Mesh;
+
+ private:
+ const blender::bke::ComponentAttributeProviders *get_attribute_providers() const final;
};
/** A geometry component that stores a point cloud. */
@@ -400,26 +418,14 @@ class PointCloudComponent : public GeometryComponent {
const PointCloud *get_for_read() const;
PointCloud *get_for_write();
- bool attribute_domain_supported(const AttributeDomain domain) const final;
- bool attribute_domain_with_type_supported(const AttributeDomain domain,
- const CustomDataType data_type) const final;
int attribute_domain_size(const AttributeDomain domain) const final;
- bool attribute_is_builtin(const blender::StringRef attribute_name) const final;
-
- blender::bke::ReadAttributePtr attribute_try_get_for_read(
- const blender::StringRef attribute_name) const final;
- blender::bke::WriteAttributePtr attribute_try_get_for_write(
- const blender::StringRef attribute_name) final;
-
- bool attribute_try_delete(const blender::StringRef attribute_name) final;
- bool attribute_try_create(const blender::StringRef attribute_name,
- const AttributeDomain domain,
- const CustomDataType data_type) final;
- blender::Set<std::string> attribute_names() const final;
bool is_empty() const final;
static constexpr inline GeometryComponentType static_type = GeometryComponentType::PointCloud;
+
+ private:
+ const blender::bke::ComponentAttributeProviders *get_attribute_providers() const final;
};
/** A geometry component that stores instances. */
@@ -458,3 +464,25 @@ class InstancesComponent : public GeometryComponent {
static constexpr inline GeometryComponentType static_type = GeometryComponentType::Instances;
};
+
+/** A geometry component that stores volume grids. */
+class VolumeComponent : public GeometryComponent {
+ private:
+ Volume *volume_ = nullptr;
+ GeometryOwnershipType ownership_ = GeometryOwnershipType::Owned;
+
+ public:
+ VolumeComponent();
+ ~VolumeComponent();
+ GeometryComponent *copy() const override;
+
+ void clear();
+ bool has_volume() const;
+ void replace(Volume *volume, GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
+ Volume *release();
+
+ const Volume *get_for_read() const;
+ Volume *get_for_write();
+
+ static constexpr inline GeometryComponentType static_type = GeometryComponentType::Volume;
+};
diff --git a/source/blender/blenkernel/BKE_geometry_set_instances.hh b/source/blender/blenkernel/BKE_geometry_set_instances.hh
new file mode 100644
index 00000000000..16c28e32e3c
--- /dev/null
+++ b/source/blender/blenkernel/BKE_geometry_set_instances.hh
@@ -0,0 +1,62 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#include "BKE_geometry_set.hh"
+
+namespace blender::bke {
+
+/**
+ * Used to keep track of a group of instances using the same geometry data.
+ */
+struct GeometryInstanceGroup {
+ /**
+ * The geometry set instanced on each of the transforms. The components are not necessarily
+ * owned here. For example, they may be owned by the instanced object. This cannot be a
+ * reference because not all instanced data will necessarily have a #geometry_set_eval.
+ */
+ GeometrySet geometry_set;
+
+ /**
+ * As an optimization to avoid copying, the same geometry set can be associated with multiple
+ * instances. Each instance is stored as a transform matrix here. Again, these must be owned
+ * because they may be transformed from the original data. TODO: Validate that last statement.
+ */
+ Vector<float4x4> transforms;
+};
+
+Vector<GeometryInstanceGroup> geometry_set_gather_instances(const GeometrySet &geometry_set);
+
+GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set);
+GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set);
+
+struct AttributeKind {
+ CustomDataType data_type;
+ AttributeDomain domain;
+};
+
+/**
+ * Add information about all the attributes on every component of the type. The resulting info
+ * will contain the highest complexity data type and the highest priority domain among every
+ * attribute with the given name on all of the input components.
+ */
+void gather_attribute_info(Map<std::string, AttributeKind> &attributes,
+ Span<GeometryComponentType> component_types,
+ Span<bke::GeometryInstanceGroup> set_groups,
+ const Set<std::string> &ignored_attributes);
+
+} // namespace blender::bke
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 5e16c9c979c..d6b6ffd425e 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -59,7 +59,7 @@ typedef struct Global {
short moving;
- /** To indicate render is busy, prevent renderwindow events etc. */
+ /** To indicate render is busy, prevent render-window events etc. */
bool is_rendering;
/**
@@ -147,21 +147,18 @@ enum {
G_DEBUG_DEPSGRAPH = (G_DEBUG_DEPSGRAPH_BUILD | G_DEBUG_DEPSGRAPH_EVAL | G_DEBUG_DEPSGRAPH_TAG |
G_DEBUG_DEPSGRAPH_TIME | G_DEBUG_DEPSGRAPH_UUID),
G_DEBUG_SIMDATA = (1 << 15), /* sim debug data display */
- G_DEBUG_GPU_MEM = (1 << 16), /* gpu memory in status bar */
- G_DEBUG_GPU = (1 << 17), /* gpu debug */
- G_DEBUG_IO = (1 << 18), /* IO Debugging (for Collada, ...)*/
- G_DEBUG_GPU_SHADERS = (1 << 19), /* GLSL shaders */
- G_DEBUG_GPU_FORCE_WORKAROUNDS = (1 << 20), /* force gpu workarounds bypassing detections. */
- G_DEBUG_XR = (1 << 21), /* XR/OpenXR messages */
- G_DEBUG_XR_TIME = (1 << 22), /* XR/OpenXR timing messages */
-
- G_DEBUG_GHOST = (1 << 23), /* Debug GHOST module. */
+ G_DEBUG_GPU = (1 << 16), /* gpu debug */
+ G_DEBUG_IO = (1 << 17), /* IO Debugging (for Collada, ...)*/
+ G_DEBUG_GPU_FORCE_WORKAROUNDS = (1 << 18), /* force gpu workarounds bypassing detections. */
+ G_DEBUG_XR = (1 << 19), /* XR/OpenXR messages */
+ G_DEBUG_XR_TIME = (1 << 20), /* XR/OpenXR timing messages */
+
+ G_DEBUG_GHOST = (1 << 21), /* Debug GHOST module. */
};
#define G_DEBUG_ALL \
(G_DEBUG | G_DEBUG_FFMPEG | G_DEBUG_PYTHON | G_DEBUG_EVENTS | G_DEBUG_WM | G_DEBUG_JOBS | \
- G_DEBUG_FREESTYLE | G_DEBUG_DEPSGRAPH | G_DEBUG_GPU_MEM | G_DEBUG_IO | G_DEBUG_GPU_SHADERS | \
- G_DEBUG_GHOST)
+ G_DEBUG_FREESTYLE | G_DEBUG_DEPSGRAPH | G_DEBUG_IO | G_DEBUG_GHOST)
/** #Global.fileflags */
enum {
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index df5711f5120..5cfdcf241d1 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -101,17 +101,24 @@ void BKE_gpencil_tag(struct bGPdata *gpd);
void BKE_gpencil_batch_cache_dirty_tag(struct bGPdata *gpd);
void BKE_gpencil_batch_cache_free(struct bGPdata *gpd);
-void BKE_gpencil_stroke_sync_selection(struct bGPDstroke *gps);
-void BKE_gpencil_curve_sync_selection(struct bGPDstroke *gps);
+void BKE_gpencil_stroke_sync_selection(struct bGPdata *gpd, struct bGPDstroke *gps);
+void BKE_gpencil_curve_sync_selection(struct bGPdata *gpd, struct bGPDstroke *gps);
+void BKE_gpencil_stroke_select_index_set(struct bGPdata *gpd, struct bGPDstroke *gps);
+void BKE_gpencil_stroke_select_index_reset(struct bGPDstroke *gps);
struct bGPDframe *BKE_gpencil_frame_addnew(struct bGPDlayer *gpl, int cframe);
struct bGPDframe *BKE_gpencil_frame_addcopy(struct bGPDlayer *gpl, int cframe);
struct bGPDlayer *BKE_gpencil_layer_addnew(struct bGPdata *gpd, const char *name, bool setactive);
struct bGPdata *BKE_gpencil_data_addnew(struct Main *bmain, const char name[]);
-struct bGPDframe *BKE_gpencil_frame_duplicate(const struct bGPDframe *gpf_src);
-struct bGPDlayer *BKE_gpencil_layer_duplicate(const struct bGPDlayer *gpl_src);
+struct bGPDframe *BKE_gpencil_frame_duplicate(const struct bGPDframe *gpf_src,
+ const bool dup_strokes);
+struct bGPDlayer *BKE_gpencil_layer_duplicate(const struct bGPDlayer *gpl_src,
+ const bool dup_frames,
+ const bool dup_strokes);
void BKE_gpencil_frame_copy_strokes(struct bGPDframe *gpf_src, struct bGPDframe *gpf_dst);
+void BKE_gpencil_frame_selected_hash(struct bGPdata *gpd, struct GHash *r_list);
+
struct bGPDcurve *BKE_gpencil_stroke_curve_duplicate(struct bGPDcurve *gpc_src);
struct bGPDstroke *BKE_gpencil_stroke_duplicate(struct bGPDstroke *gps_src,
const bool dup_points,
@@ -280,12 +287,12 @@ void BKE_gpencil_frame_original_pointers_update(const struct bGPDframe *gpf_orig
const struct bGPDframe *gpf_eval);
void BKE_gpencil_update_orig_pointers(const struct Object *ob_orig, const struct Object *ob_eval);
-void BKE_gpencil_parent_matrix_get(const struct Depsgraph *depsgraph,
- struct Object *obact,
- struct bGPDlayer *gpl,
- float diff_mat[4][4]);
+void BKE_gpencil_layer_transform_matrix_get(const struct Depsgraph *depsgraph,
+ struct Object *obact,
+ struct bGPDlayer *gpl,
+ float diff_mat[4][4]);
-void BKE_gpencil_update_layer_parent(const struct Depsgraph *depsgraph, struct Object *ob);
+void BKE_gpencil_update_layer_transforms(const struct Depsgraph *depsgraph, struct Object *ob);
int BKE_gpencil_material_find_index_by_name_prefix(struct Object *ob, const char *name_prefix);
diff --git a/source/blender/blenkernel/BKE_gpencil_curve.h b/source/blender/blenkernel/BKE_gpencil_curve.h
index 2d42bb36949..9cbe67af9c1 100644
--- a/source/blender/blenkernel/BKE_gpencil_curve.h
+++ b/source/blender/blenkernel/BKE_gpencil_curve.h
@@ -50,8 +50,12 @@ struct bGPDcurve *BKE_gpencil_stroke_editcurve_generate(struct bGPDstroke *gps,
void BKE_gpencil_stroke_editcurve_update(struct bGPdata *gpd,
struct bGPDlayer *gpl,
struct bGPDstroke *gps);
-void BKE_gpencil_editcurve_stroke_sync_selection(struct bGPDstroke *gps, struct bGPDcurve *gpc);
-void BKE_gpencil_stroke_editcurve_sync_selection(struct bGPDstroke *gps, struct bGPDcurve *gpc);
+void BKE_gpencil_editcurve_stroke_sync_selection(struct bGPdata *gpd,
+ struct bGPDstroke *gps,
+ struct bGPDcurve *gpc);
+void BKE_gpencil_stroke_editcurve_sync_selection(struct bGPdata *gpd,
+ struct bGPDstroke *gps,
+ struct bGPDcurve *gpc);
void BKE_gpencil_strokes_selected_update_editcurve(struct bGPdata *gpd);
void BKE_gpencil_strokes_selected_sync_selection_editcurve(struct bGPdata *gpd);
void BKE_gpencil_stroke_update_geometry_from_editcurve(struct bGPDstroke *gps,
diff --git a/source/blender/blenkernel/BKE_gpencil_geom.h b/source/blender/blenkernel/BKE_gpencil_geom.h
index 1c86df73d3c..89a794f2df3 100644
--- a/source/blender/blenkernel/BKE_gpencil_geom.h
+++ b/source/blender/blenkernel/BKE_gpencil_geom.h
@@ -149,6 +149,11 @@ void BKE_gpencil_stroke_join(struct bGPDstroke *gps_a,
struct bGPDstroke *gps_b,
const bool leave_gaps,
const bool fit_thickness);
+void BKE_gpencil_stroke_copy_to_keyframes(struct bGPdata *gpd,
+ struct bGPDlayer *gpl,
+ struct bGPDframe *gpf,
+ struct bGPDstroke *gps,
+ const bool tail);
bool BKE_gpencil_convert_mesh(struct Main *bmain,
struct Depsgraph *depsgraph,
diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index 61ccf3d60f6..c066c161f46 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -248,7 +248,7 @@ typedef struct GpencilModifierTypeInfo {
#define GPENCIL_MODIFIER_TYPE_PANEL_PREFIX "MOD_PT_gpencil_"
-/* Initialize modifier's global data (type info and some common global storages). */
+/* Initialize modifier's global data (type info and some common global storage). */
void BKE_gpencil_modifier_init(void);
void BKE_gpencil_modifierType_panel_id(GpencilModifierType type, char *r_idname);
diff --git a/source/blender/blenkernel/BKE_idtype.h b/source/blender/blenkernel/BKE_idtype.h
index 1298e3c2bbf..edfc96f3059 100644
--- a/source/blender/blenkernel/BKE_idtype.h
+++ b/source/blender/blenkernel/BKE_idtype.h
@@ -106,6 +106,8 @@ typedef void (*IDTypeBlendReadUndoPreserve)(struct BlendLibReader *reader,
struct ID *id_new,
struct ID *id_old);
+typedef void (*IDTypeLibOverrideApplyPost)(struct ID *id_dst, struct ID *id_src);
+
typedef struct IDTypeInfo {
/* ********** General IDType data. ********** */
@@ -207,6 +209,13 @@ typedef struct IDTypeInfo {
* \note Called from #setup_app_data when undoing or redoing a memfile step.
*/
IDTypeBlendReadUndoPreserve blend_read_undo_preserve;
+
+ /**
+ * Called after library override operations have been applied.
+ *
+ * \note Currently needed for some update operation on point caches.
+ */
+ IDTypeLibOverrideApplyPost lib_override_apply_post;
} IDTypeInfo;
/* ********** Declaration of each IDTypeInfo. ********** */
diff --git a/source/blender/blenkernel/BKE_keyconfig.h b/source/blender/blenkernel/BKE_keyconfig.h
index ab42d5742ea..1cacbf61976 100644
--- a/source/blender/blenkernel/BKE_keyconfig.h
+++ b/source/blender/blenkernel/BKE_keyconfig.h
@@ -43,10 +43,10 @@ typedef struct wmKeyConfigPrefType_Runtime {
typedef struct wmKeyConfigPrefType_Runtime wmKeyConfigPrefType_Runtime;
#endif
-/* KeyConfig preferenes (UserDef). */
+/* KeyConfig preferences (UserDef). */
struct wmKeyConfigPref *BKE_keyconfig_pref_ensure(struct UserDef *userdef, const char *kc_idname);
-/* KeyConfig preferenes (RNA). */
+/* KeyConfig preferences (RNA). */
struct wmKeyConfigPrefType_Runtime *BKE_keyconfig_pref_type_find(const char *idname, bool quiet);
void BKE_keyconfig_pref_type_add(struct wmKeyConfigPrefType_Runtime *kpt_rt);
void BKE_keyconfig_pref_type_remove(const struct wmKeyConfigPrefType_Runtime *kpt_rt);
diff --git a/source/blender/blenkernel/BKE_lib_id.h b/source/blender/blenkernel/BKE_lib_id.h
index cfd1db1317c..5a8d36b94ec 100644
--- a/source/blender/blenkernel/BKE_lib_id.h
+++ b/source/blender/blenkernel/BKE_lib_id.h
@@ -219,7 +219,7 @@ void id_fake_user_set(struct ID *id);
void id_fake_user_clear(struct ID *id);
void BKE_id_clear_newpoin(struct ID *id);
-/** Flags to control make local code behaviour. */
+/** Flags to control make local code behavior. */
enum {
/** Making that ID local is part of making local a whole library. */
LIB_ID_MAKELOCAL_FULL_LIBRARY = 1 << 0,
diff --git a/source/blender/blenkernel/BKE_lib_override.h b/source/blender/blenkernel/BKE_lib_override.h
index c9a9c26e222..5fd451dc986 100644
--- a/source/blender/blenkernel/BKE_lib_override.h
+++ b/source/blender/blenkernel/BKE_lib_override.h
@@ -65,15 +65,6 @@ struct ID *BKE_lib_override_library_create_from_id(struct Main *bmain,
struct ID *reference_id,
const bool do_tagged_remap);
bool BKE_lib_override_library_create_from_tag(struct Main *bmain);
-void BKE_lib_override_library_dependencies_tag(struct Main *bmain,
- struct ID *id_root,
- const uint tag,
- const bool do_create_main_relashionships);
-void BKE_lib_override_library_override_group_tag(struct Main *bmain,
- struct ID *id_root,
- const uint tag,
- const uint missing_tag,
- const bool do_create_main_relashionships);
bool BKE_lib_override_library_create(struct Main *bmain,
struct Scene *scene,
struct ViewLayer *view_layer,
diff --git a/source/blender/blenkernel/BKE_lib_query.h b/source/blender/blenkernel/BKE_lib_query.h
index b6abe0bf18c..bdda5bb0372 100644
--- a/source/blender/blenkernel/BKE_lib_query.h
+++ b/source/blender/blenkernel/BKE_lib_query.h
@@ -77,7 +77,7 @@ enum {
IDWALK_CB_USER = (1 << 8),
/**
* This ID usage is not refcounted, but at least one user should be generated by it (to avoid
- * e.g. loosing the used ID on save/reload).
+ * e.g. losing the used ID on save/reload).
* Callback is responsible to deal accordingly with #ID.us if needed.
*/
IDWALK_CB_USER_ONE = (1 << 9),
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index 8106607572b..b6116b32ca5 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -60,22 +60,52 @@ typedef struct BlendThumbnail {
} BlendThumbnail;
/* Structs caching relations between data-blocks in a given Main. */
+typedef struct MainIDRelationsEntryItem {
+ struct MainIDRelationsEntryItem *next;
+
+ union {
+ /* For `from_ids` list, a user of the hashed ID. */
+ struct ID *from;
+ /* For `to_ids` list, an ID used by the hashed ID. */
+ struct ID **to;
+ } id_pointer;
+ /* Session uuid of the `id_pointer`. */
+ uint session_uuid;
+
+ int usage_flag; /* Using IDWALK_ enums, defined in BKE_lib_query.h */
+} MainIDRelationsEntryItem;
+
typedef struct MainIDRelationsEntry {
- struct MainIDRelationsEntry *next;
- /* WARNING! for user_to_used,
- * that pointer is really an ID** one, but for used_to_user, it’s only an ID* one! */
- struct ID **id_pointer;
- int usage_flag; /* Using IDWALK_ enums, in BKE_lib_query.h */
+ /* Linked list of IDs using that ID. */
+ struct MainIDRelationsEntryItem *from_ids;
+ /* Linked list of IDs used by that ID. */
+ struct MainIDRelationsEntryItem *to_ids;
+
+ /* Session uuid of the ID matching that entry. */
+ uint session_uuid;
+
+ /* Runtime tags, users should ensure those are reset after usage. */
+ uint tags;
} MainIDRelationsEntry;
+/* MainIDRelationsEntry.tags */
+typedef enum MainIDRelationsEntryTags {
+ /* Generic tag marking the entry as to be processed. */
+ MAINIDRELATIONS_ENTRY_TAGS_DOIT = 1 << 0,
+ /* Generic tag marking the entry as processed. */
+ MAINIDRELATIONS_ENTRY_TAGS_PROCESSED = 1 << 1,
+} MainIDRelationsEntryTags;
+
typedef struct MainIDRelations {
- struct GHash *id_user_to_used;
- struct GHash *id_used_to_user;
+ /* Mapping from an ID pointer to all of its parents (IDs using it) and children (IDs it uses).
+ * Values are `MainIDRelationsEntry` pointers. */
+ struct GHash *relations_from_pointers;
+ /* Note: we could add more mappings when needed (e.g. from session uuid?). */
short flag;
/* Private... */
- struct BLI_mempool *entry_pool;
+ struct BLI_mempool *entry_items_pool;
} MainIDRelations;
enum {
@@ -172,7 +202,9 @@ void BKE_main_unlock(struct Main *bmain);
void BKE_main_relations_create(struct Main *bmain, const short flag);
void BKE_main_relations_free(struct Main *bmain);
-void BKE_main_relations_ID_remove(struct Main *bmain, struct ID *id);
+void BKE_main_relations_tag_set(struct Main *bmain,
+ const MainIDRelationsEntryTags tag,
+ const bool value);
struct GSet *BKE_main_gset_create(struct Main *bmain, struct GSet *gset);
diff --git a/source/blender/blenkernel/BKE_mask.h b/source/blender/blenkernel/BKE_mask.h
index 29072742f81..8e2f6e6f10c 100644
--- a/source/blender/blenkernel/BKE_mask.h
+++ b/source/blender/blenkernel/BKE_mask.h
@@ -269,18 +269,18 @@ int BKE_mask_spline_differentiate_calc_total(const struct MaskSpline *spline,
const unsigned int resol);
float (*BKE_mask_spline_differentiate_with_resolution(struct MaskSpline *spline,
- unsigned int *tot_diff_point,
- const unsigned int resol))[2];
+ const unsigned int resol,
+ unsigned int *r_tot_diff_point))[2];
void BKE_mask_spline_feather_collapse_inner_loops(struct MaskSpline *spline,
float (*feather_points)[2],
const unsigned int tot_feather_point);
float (*BKE_mask_spline_differentiate(
- struct MaskSpline *spline, int width, int height, unsigned int *tot_diff_point))[2];
+ struct MaskSpline *spline, int width, int height, unsigned int *r_tot_diff_point))[2];
float (*BKE_mask_spline_feather_differentiated_points_with_resolution(
struct MaskSpline *spline,
- unsigned int *tot_feather_point,
const unsigned int resol,
- const bool do_feather_isect))[2];
+ const bool do_feather_isect,
+ unsigned int *r_tot_feather_point))[2];
/* *** mask point functions which involve evaluation *** */
float (*BKE_mask_spline_feather_points(struct MaskSpline *spline, int *tot_feather_point))[2];
@@ -289,7 +289,7 @@ float *BKE_mask_point_segment_diff(struct MaskSpline *spline,
struct MaskSplinePoint *point,
int width,
int height,
- unsigned int *tot_diff_point);
+ unsigned int *r_tot_diff_point);
float *BKE_mask_point_segment_feather_diff(struct MaskSpline *spline,
struct MaskSplinePoint *point,
diff --git a/source/blender/blenkernel/BKE_mesh_boolean_convert.h b/source/blender/blenkernel/BKE_mesh_boolean_convert.h
new file mode 100644
index 00000000000..be5cbb305fa
--- /dev/null
+++ b/source/blender/blenkernel/BKE_mesh_boolean_convert.h
@@ -0,0 +1,38 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2019 Blender Foundation.
+ * All rights reserved.
+ */
+
+#pragma once
+
+/** \file
+ * \ingroup bke
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Mesh *BKE_mesh_boolean(const Mesh **meshes,
+ const float (*obmats[])[4][4],
+ const int meshes_len,
+ const bool use_self,
+ const int boolean_mode);
+
+#ifdef __cplusplus
+}
+#endif \ No newline at end of file
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 685a8ed98e2..ab2ecbe2507 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -399,7 +399,7 @@ typedef struct ModifierTypeInfo {
/* Used to find a modifier's panel type. */
#define MODIFIER_TYPE_PANEL_PREFIX "MOD_PT_"
-/* Initialize modifier's global data (type info and some common global storages). */
+/* Initialize modifier's global data (type info and some common global storage). */
void BKE_modifier_init(void);
const ModifierTypeInfo *BKE_modifier_get_info(ModifierType type);
@@ -453,7 +453,7 @@ void BKE_modifiers_foreach_tex_link(struct Object *ob, TexWalkFunc walk, void *u
struct ModifierData *BKE_modifiers_findby_type(struct Object *ob, ModifierType type);
struct ModifierData *BKE_modifiers_findby_name(struct Object *ob, const char *name);
void BKE_modifiers_clear_errors(struct Object *ob);
-int BKE_modifiers_get_cage_index(struct Scene *scene,
+int BKE_modifiers_get_cage_index(const struct Scene *scene,
struct Object *ob,
int *r_lastPossibleCageIndex,
bool is_virtual);
@@ -469,8 +469,8 @@ struct Object *BKE_modifiers_is_deformed_by_lattice(struct Object *ob);
struct Object *BKE_modifiers_is_deformed_by_curve(struct Object *ob);
bool BKE_modifiers_uses_multires(struct Object *ob);
bool BKE_modifiers_uses_armature(struct Object *ob, struct bArmature *arm);
-bool BKE_modifiers_uses_subsurf_facedots(struct Scene *scene, struct Object *ob);
-bool BKE_modifiers_is_correctable_deformed(struct Scene *scene, struct Object *ob);
+bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, struct Object *ob);
+bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, struct Object *ob);
void BKE_modifier_free_temporary_data(struct ModifierData *md);
typedef struct CDMaskLink {
@@ -484,14 +484,14 @@ typedef struct CDMaskLink {
* pointed to by md for correct evaluation, assuming the data indicated by
* final_datamask is required at the end of the stack.
*/
-struct CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene,
+struct CDMaskLink *BKE_modifier_calc_data_masks(const struct Scene *scene,
struct Object *ob,
struct ModifierData *md,
struct CustomData_MeshMasks *final_datamask,
int required_mode,
ModifierData *previewmd,
const struct CustomData_MeshMasks *previewmask);
-struct ModifierData *BKE_modifier_get_last_preview(struct Scene *scene,
+struct ModifierData *BKE_modifier_get_last_preview(const struct Scene *scene,
struct ModifierData *md,
int required_mode);
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 79bc00766fd..8652adecaf9 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -419,7 +419,7 @@ struct GHashIterator *ntreeTypeGetIterator(void);
GHashIterator *__node_tree_type_iter__ = ntreeTypeGetIterator(); \
for (; !BLI_ghashIterator_done(__node_tree_type_iter__); \
BLI_ghashIterator_step(__node_tree_type_iter__)) { \
- bNodeTreeType *ntype = BLI_ghashIterator_getValue(__node_tree_type_iter__);
+ bNodeTreeType *ntype = (bNodeTreeType *)BLI_ghashIterator_getValue(__node_tree_type_iter__);
#define NODE_TREE_TYPES_END \
} \
@@ -453,7 +453,9 @@ void ntreeUpdateTree(struct Main *main, struct bNodeTree *ntree);
void ntreeUpdateAllNew(struct Main *main);
void ntreeUpdateAllUsers(struct Main *main, struct ID *id);
-void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
+void ntreeGetDependencyList(struct bNodeTree *ntree,
+ struct bNode ***r_deplist,
+ int *r_deplist_len);
/* XXX old trees handle output flags automatically based on special output
* node types and last active selection.
@@ -463,8 +465,8 @@ void ntreeSetOutput(struct bNodeTree *ntree);
void ntreeFreeCache(struct bNodeTree *ntree);
-bool ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode);
-bool ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock);
+bool ntreeNodeExists(const struct bNodeTree *ntree, const struct bNode *testnode);
+bool ntreeOutputExists(const struct bNode *node, const struct bNodeSocket *testsock);
void ntreeNodeFlagSet(const bNodeTree *ntree, const int flag, const bool enable);
struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
void ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
@@ -501,7 +503,7 @@ struct bNodeSocket *ntreeInsertSocketInterfaceFromSocket(struct bNodeTree *ntree
struct bNodeSocket *from_sock);
void ntreeRemoveSocketInterface(struct bNodeTree *ntree, struct bNodeSocket *sock);
-struct StructRNA *ntreeInterfaceTypeGet(struct bNodeTree *ntree, int create);
+struct StructRNA *ntreeInterfaceTypeGet(struct bNodeTree *ntree, bool create);
void ntreeInterfaceTypeFree(struct bNodeTree *ntree);
void ntreeInterfaceTypeUpdate(struct bNodeTree *ntree);
@@ -523,7 +525,7 @@ struct GHashIterator *nodeTypeGetIterator(void);
GHashIterator *__node_type_iter__ = nodeTypeGetIterator(); \
for (; !BLI_ghashIterator_done(__node_type_iter__); \
BLI_ghashIterator_step(__node_type_iter__)) { \
- bNodeType *ntype = BLI_ghashIterator_getValue(__node_type_iter__);
+ bNodeType *ntype = (bNodeType *)BLI_ghashIterator_getValue(__node_type_iter__);
#define NODE_TYPES_END \
} \
@@ -545,7 +547,8 @@ const char *nodeStaticSocketInterfaceType(int type, int subtype);
GHashIterator *__node_socket_type_iter__ = nodeSocketTypeGetIterator(); \
for (; !BLI_ghashIterator_done(__node_socket_type_iter__); \
BLI_ghashIterator_step(__node_socket_type_iter__)) { \
- bNodeSocketType *stype = BLI_ghashIterator_getValue(__node_socket_type_iter__);
+ bNodeSocketType *stype = (bNodeSocketType *)BLI_ghashIterator_getValue( \
+ __node_socket_type_iter__);
#define NODE_SOCKET_TYPES_END \
} \
@@ -624,12 +627,12 @@ struct bNodeLink *nodeAddLink(struct bNodeTree *ntree,
struct bNodeSocket *tosock);
void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
-bool nodeLinkIsHidden(struct bNodeLink *link);
+bool nodeLinkIsHidden(const struct bNodeLink *link);
void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
-void nodeToView(struct bNode *node, float x, float y, float *rx, float *ry);
-void nodeFromView(struct bNode *node, float x, float y, float *rx, float *ry);
-bool nodeAttachNodeCheck(struct bNode *node, struct bNode *parent);
+void nodeToView(const struct bNode *node, float x, float y, float *rx, float *ry);
+void nodeFromView(const struct bNode *node, float x, float y, float *rx, float *ry);
+bool nodeAttachNodeCheck(const struct bNode *node, const struct bNode *parent);
void nodeAttachNode(struct bNode *node, struct bNode *parent);
void nodeDetachNode(struct bNode *node);
@@ -661,9 +664,9 @@ void nodeChainIterBackwards(const bNodeTree *ntree,
void nodeParentsIter(bNode *node, bool (*callback)(bNode *, void *), void *userdata);
struct bNodeLink *nodeFindLink(struct bNodeTree *ntree,
- struct bNodeSocket *from,
- struct bNodeSocket *to);
-int nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
+ const struct bNodeSocket *from,
+ const struct bNodeSocket *to);
+int nodeCountSocketLinks(const struct bNodeTree *ntree, const struct bNodeSocket *sock);
void nodeSetSelected(struct bNode *node, bool select);
void nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
@@ -678,14 +681,14 @@ void nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
bool nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
void nodeUpdateInternalLinks(struct bNodeTree *ntree, struct bNode *node);
-int nodeSocketIsHidden(struct bNodeSocket *sock);
+int nodeSocketIsHidden(const struct bNodeSocket *sock);
void ntreeTagUsedSockets(struct bNodeTree *ntree);
void nodeSetSocketAvailability(struct bNodeSocket *sock, bool is_available);
-int nodeSocketLinkLimit(struct bNodeSocket *sock);
+int nodeSocketLinkLimit(const struct bNodeSocket *sock);
/* Node Clipboard */
-void BKE_node_clipboard_init(struct bNodeTree *ntree);
+void BKE_node_clipboard_init(const struct bNodeTree *ntree);
void BKE_node_clipboard_clear(void);
void BKE_node_clipboard_free(void);
bool BKE_node_clipboard_validate(void);
@@ -706,8 +709,8 @@ extern const bNodeInstanceKey NODE_INSTANCE_KEY_BASE;
extern const bNodeInstanceKey NODE_INSTANCE_KEY_NONE;
bNodeInstanceKey BKE_node_instance_key(bNodeInstanceKey parent_key,
- struct bNodeTree *ntree,
- struct bNode *node);
+ 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);
@@ -767,7 +770,7 @@ BLI_INLINE bool BKE_node_instance_hash_iterator_done(bNodeInstanceHashIterator *
/* Node Previews */
-int BKE_node_preview_used(struct bNode *node);
+bool BKE_node_preview_used(const struct bNode *node);
bNodePreview *BKE_node_preview_verify(
struct bNodeInstanceHash *previews, bNodeInstanceKey key, int xsize, int ysize, bool create);
bNodePreview *BKE_node_preview_copy(struct bNodePreview *preview);
@@ -1361,6 +1364,15 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
#define GEO_NODE_ALIGN_ROTATION_TO_VECTOR 1018
#define GEO_NODE_POINT_TRANSLATE 1019
#define GEO_NODE_POINT_SCALE 1020
+#define GEO_NODE_ATTRIBUTE_SAMPLE_TEXTURE 1021
+#define GEO_NODE_POINTS_TO_VOLUME 1022
+#define GEO_NODE_COLLECTION_INFO 1023
+#define GEO_NODE_IS_VIEWPORT 1024
+#define GEO_NODE_ATTRIBUTE_PROXIMITY 1025
+#define GEO_NODE_VOLUME_TO_MESH 1026
+#define GEO_NODE_ATTRIBUTE_COMBINE_XYZ 1027
+#define GEO_NODE_ATTRIBUTE_SEPARATE_XYZ 1028
+#define GEO_NODE_SUBDIVISION_SURFACE_SIMPLE 1029
/** \} */
@@ -1376,6 +1388,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
#define FN_NODE_OBJECT_TRANSFORMS 1205
#define FN_NODE_RANDOM_FLOAT 1206
#define FN_NODE_INPUT_VECTOR 1207
+#define FN_NODE_INPUT_STRING 1208
/** \} */
diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh
new file mode 100644
index 00000000000..2084382aac5
--- /dev/null
+++ b/source/blender/blenkernel/BKE_node_ui_storage.hh
@@ -0,0 +1,91 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#include "BLI_hash.hh"
+#include "BLI_map.hh"
+#include "BLI_session_uuid.h"
+
+#include "DNA_ID.h"
+#include "DNA_modifier_types.h"
+#include "DNA_session_uuid_types.h"
+
+struct ModifierData;
+struct Object;
+struct bNode;
+struct bNodeTree;
+
+/**
+ * Contains the context necessary to determine when to display settings for a certain node tree
+ * that may be used for multiple modifiers and objects. The object name and modifier session UUID
+ * are used instead of pointers because they are re-allocated between evaluations.
+ *
+ * \note This does not yet handle the context of nested node trees.
+ */
+class NodeTreeEvaluationContext {
+ private:
+ std::string object_name_;
+ SessionUUID modifier_session_uuid_;
+
+ public:
+ NodeTreeEvaluationContext(const Object &object, const ModifierData &modifier)
+ {
+ object_name_ = reinterpret_cast<const ID &>(object).name;
+ modifier_session_uuid_ = modifier.session_uuid;
+ }
+
+ uint64_t hash() const
+ {
+ const uint64_t hash1 = blender::DefaultHash<std::string>{}(object_name_);
+ const uint64_t hash2 = BLI_session_uuid_hash_uint64(&modifier_session_uuid_);
+ return hash1 ^ (hash2 * 33); /* Copied from DefaultHash for std::pair. */
+ }
+
+ bool operator==(const NodeTreeEvaluationContext &other) const
+ {
+ return other.object_name_ == object_name_ &&
+ BLI_session_uuid_is_equal(&other.modifier_session_uuid_, &modifier_session_uuid_);
+ }
+};
+
+enum class NodeWarningType {
+ Error,
+ Warning,
+ Info,
+};
+
+struct NodeWarning {
+ NodeWarningType type;
+ std::string message;
+};
+
+struct NodeUIStorage {
+ blender::Vector<NodeWarning> warnings;
+};
+
+struct NodeTreeUIStorage {
+ blender::Map<NodeTreeEvaluationContext, blender::Map<std::string, NodeUIStorage>> context_map;
+};
+
+void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree,
+ const NodeTreeEvaluationContext &context);
+
+void BKE_nodetree_error_message_add(bNodeTree &ntree,
+ const NodeTreeEvaluationContext &context,
+ const bNode &node,
+ const NodeWarningType type,
+ std::string message);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 904db053717..12c40e891c9 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -32,6 +32,7 @@ extern "C" {
struct Base;
struct BoundBox;
+struct Curve;
struct Depsgraph;
struct GpencilModifierData;
struct HookGpencilModifierData;
@@ -424,6 +425,21 @@ struct Mesh *BKE_object_to_mesh(struct Depsgraph *depsgraph,
void BKE_object_to_mesh_clear(struct Object *object);
+/* This is an utility function for Python's object.to_curve().
+ * The result is owned by the object.
+ *
+ * The curve will be freed when object is re-evaluated or is destroyed. It is possible to force
+ * clear memory used by this curve by calling BKE_object_to_curve_clear().
+ *
+ * If apply_modifiers is true and the object is a curve one, then spline deform modifiers are
+ * applied on the curve control points.
+ */
+struct Curve *BKE_object_to_curve(struct Object *object,
+ struct Depsgraph *depsgraph,
+ bool apply_modifiers);
+
+void BKE_object_to_curve_clear(struct Object *object);
+
void BKE_object_check_uuids_unique_and_report(const struct Object *object);
void BKE_object_modifiers_lib_link_common(void *userData,
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index 0a35658464a..4369f332c35 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -365,7 +365,7 @@ typedef struct SculptBoundaryEditInfo {
/* How many steps were needed to reach this vertex from the boundary. */
int num_propagation_steps;
- /* Stregth that is used to deform this vertex. */
+ /* Strength that is used to deform this vertex. */
float strength_factor;
} SculptBoundaryEditInfo;
@@ -530,7 +530,7 @@ typedef struct SculptSession {
float gesture_initial_normal[3];
bool gesture_initial_hit;
- /* TODO(jbakker): Replace rv3d adn v3d with ViewContext */
+ /* TODO(jbakker): Replace rv3d and v3d with ViewContext */
struct RegionView3D *rv3d;
struct View3D *v3d;
struct Scene *scene;
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 7b5df98d148..32c888b058f 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -67,6 +67,13 @@ struct wmWindowManager;
#define BKE_ST_MAXNAME 64
+typedef struct wmSpaceTypeListenerParams {
+ struct wmWindow *window;
+ struct ScrArea *area;
+ struct wmNotifier *notifier;
+ const struct Scene *scene;
+} wmSpaceTypeListenerParams;
+
typedef struct SpaceType {
struct SpaceType *next, *prev;
@@ -85,10 +92,7 @@ typedef struct SpaceType {
/* exit is called when the area is hidden or removed */
void (*exit)(struct wmWindowManager *wm, struct ScrArea *area);
/* Listeners can react to bContext changes */
- void (*listener)(struct wmWindow *win,
- struct ScrArea *area,
- struct wmNotifier *wmn,
- struct Scene *scene);
+ void (*listener)(const wmSpaceTypeListenerParams *params);
/* called when the mouse moves out of the area */
void (*deactivate)(struct ScrArea *area);
@@ -134,6 +138,24 @@ typedef struct SpaceType {
/* region types are also defined using spacetypes_init, via a callback */
+typedef struct wmRegionListenerParams {
+ struct wmWindow *window;
+ struct ScrArea *area; /* Can be NULL when the region is not part of an area. */
+ struct ARegion *region;
+ struct wmNotifier *notifier;
+ const struct Scene *scene;
+} wmRegionListenerParams;
+
+typedef struct wmRegionMessageSubscribeParams {
+ const struct bContext *context;
+ struct wmMsgBus *message_bus;
+ struct WorkSpace *workspace;
+ struct Scene *scene;
+ struct bScreen *screen;
+ struct ScrArea *area;
+ struct ARegion *region;
+} wmRegionMessageSubscribeParams;
+
typedef struct ARegionType {
struct ARegionType *next, *prev;
@@ -158,19 +180,9 @@ typedef struct ARegionType {
/* snap the size of the region (can be NULL for no snapping). */
int (*snap_size)(const struct ARegion *region, int size, int axis);
/* contextual changes should be handled here */
- void (*listener)(struct wmWindow *win,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmNotifier *wmn,
- const struct Scene *scene);
+ void (*listener)(const wmRegionListenerParams *params);
/* Optional callback to generate subscriptions. */
- void (*message_subscribe)(const struct bContext *C,
- struct WorkSpace *workspace,
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus);
+ void (*message_subscribe)(const wmRegionMessageSubscribeParams *params);
void (*free)(struct ARegion *);
@@ -228,6 +240,7 @@ typedef struct PanelType {
char idname[BKE_ST_MAXNAME]; /* unique name */
char label[BKE_ST_MAXNAME]; /* for panel header */
+ char *description; /* for panel tooltip */
char translation_context[BKE_ST_MAXNAME];
char context[BKE_ST_MAXNAME]; /* for buttons window */
char category[BKE_ST_MAXNAME]; /* for category tabs */
diff --git a/source/blender/blenkernel/BKE_shader_fx.h b/source/blender/blenkernel/BKE_shader_fx.h
index 23bd62c70bc..e385f77565b 100644
--- a/source/blender/blenkernel/BKE_shader_fx.h
+++ b/source/blender/blenkernel/BKE_shader_fx.h
@@ -149,7 +149,7 @@ typedef struct ShaderFxTypeInfo {
#define SHADERFX_TYPE_PANEL_PREFIX "FX_PT_"
-/* Initialize global data (type info and some common global storages). */
+/* Initialize global data (type info and some common global storage). */
void BKE_shaderfx_init(void);
void BKE_shaderfxType_panel_id(ShaderFxType type, char *r_idname);
diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h
index d1cffd26432..4f8b21141b6 100644
--- a/source/blender/blenkernel/BKE_softbody.h
+++ b/source/blender/blenkernel/BKE_softbody.h
@@ -49,7 +49,7 @@ typedef struct BodyPoint {
/* allocates and initializes general main data */
extern struct SoftBody *sbNew(struct Scene *scene);
-/* frees internal data and softbody itself */
+/* frees internal data and soft-body itself */
extern void sbFree(struct Object *ob);
/* frees simulation data to reset simulation */
@@ -66,7 +66,7 @@ extern void sbObjectStep(struct Depsgraph *depsgraph,
/* makes totally fresh start situation, resets time */
extern void sbObjectToSoftbody(struct Object *ob);
-/* links the softbody module to a 'test for Interrupt' function */
+/* links the soft-body module to a 'test for Interrupt' function */
/* pass NULL to unlink again */
extern void sbSetInterruptCallBack(int (*f)(void));
diff --git a/source/blender/blenkernel/BKE_subdiv_ccg.h b/source/blender/blenkernel/BKE_subdiv_ccg.h
index f0ca154c4b9..b7d4ab8d8ed 100644
--- a/source/blender/blenkernel/BKE_subdiv_ccg.h
+++ b/source/blender/blenkernel/BKE_subdiv_ccg.h
@@ -293,7 +293,7 @@ bool BKE_subdiv_ccg_check_coord_valid(const SubdivCCG *subdiv_ccg, const SubdivC
* neighbor elements in total).
*
* - For the corner element a single neighboring element on every adjacent edge, single from
- * every gird.
+ * every grid.
*
* - For the boundary element two neighbor elements on the boundary (from same grid) and one
* element inside of every neighboring grid. */
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index 4dbc22ae18f..c2544c06514 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -89,6 +89,23 @@ struct MovieTrackingTrack *BKE_tracking_track_duplicate(struct MovieTrackingTrac
void BKE_tracking_track_unique_name(struct ListBase *tracksbase, struct MovieTrackingTrack *track);
void BKE_tracking_track_free(struct MovieTrackingTrack *track);
+void BKE_tracking_track_first_last_frame_get(const struct MovieTrackingTrack *track,
+ int *r_first_frame,
+ int *r_last_frame);
+
+void BKE_tracking_tracks_first_last_frame_minmax(/*const*/ struct MovieTrackingTrack **tracks,
+ const int num_tracks,
+ int *r_first_frame,
+ int *r_last_frame);
+
+int BKE_tracking_count_selected_tracks_in_list(const struct ListBase *tracks_list);
+int BKE_tracking_count_selected_tracks_in_active_object(/*const*/ struct MovieTracking *tracking);
+
+/* Get array of selected tracks from the current active object in the tracking structure.
+ * If nothing is selected then the result is nullptr and `r_num_tracks` is set to 0. */
+struct MovieTrackingTrack **BKE_tracking_selected_tracks_in_active_object(
+ struct MovieTracking *tracking, int *r_num_tracks);
+
void BKE_tracking_track_flag_set(struct MovieTrackingTrack *track, int area, int flag);
void BKE_tracking_track_flag_clear(struct MovieTrackingTrack *track, int area, int flag);
@@ -96,10 +113,15 @@ bool BKE_tracking_track_has_marker_at_frame(struct MovieTrackingTrack *track, in
bool BKE_tracking_track_has_enabled_marker_at_frame(struct MovieTrackingTrack *track, int framenr);
void BKE_tracking_track_path_clear(struct MovieTrackingTrack *track, int ref_frame, int action);
+
void BKE_tracking_tracks_join(struct MovieTracking *tracking,
struct MovieTrackingTrack *dst_track,
struct MovieTrackingTrack *src_track);
+void BKE_tracking_tracks_average(struct MovieTrackingTrack *dst_track,
+ /*const*/ struct MovieTrackingTrack **src_tracks,
+ const int num_src_tracks);
+
struct MovieTrackingTrack *BKE_tracking_track_get_named(struct MovieTracking *tracking,
struct MovieTrackingObject *object,
const char *name);
@@ -139,6 +161,17 @@ struct MovieTrackingMarker *BKE_tracking_marker_get_exact(struct MovieTrackingTr
struct MovieTrackingMarker *BKE_tracking_marker_ensure(struct MovieTrackingTrack *track,
int framenr);
+/* Get marker position, possibly interpolating interpolating gap between keyframed/tracked markers.
+ *
+ * The result marker frame number is set to the requested frame number. Its flags are 0 if the
+ * marker is interpolated, and is set to original marker flag if there were no interpolation
+ * involved.
+ *
+ * Returns truth if the result is usable. */
+bool BKE_tracking_marker_get_interpolated(struct MovieTrackingTrack *track,
+ const int framenr,
+ struct MovieTrackingMarker *r_marker);
+
void BKE_tracking_marker_pattern_minmax(const struct MovieTrackingMarker *marker,
float min[2],
float max[2]);
diff --git a/source/blender/blenkernel/BKE_undo_system.h b/source/blender/blenkernel/BKE_undo_system.h
index 0603ef85cc1..620496864f5 100644
--- a/source/blender/blenkernel/BKE_undo_system.h
+++ b/source/blender/blenkernel/BKE_undo_system.h
@@ -96,6 +96,12 @@ typedef struct UndoStep {
/* Over alloc 'type->struct_size'. */
} UndoStep;
+typedef enum eUndoStepDir {
+ STEP_REDO = 1,
+ STEP_UNDO = -1,
+ STEP_INVALID = 0,
+} eUndoStepDir;
+
typedef enum UndoPushReturn {
UNDO_PUSH_RET_FAILURE = 0,
UNDO_PUSH_RET_SUCCESS = (1 << 0),
@@ -127,7 +133,7 @@ typedef struct UndoType {
bool (*step_encode)(struct bContext *C, struct Main *bmain, UndoStep *us);
void (*step_decode)(
- struct bContext *C, struct Main *bmain, UndoStep *us, int dir, bool is_final);
+ struct bContext *C, struct Main *bmain, UndoStep *us, const eUndoStepDir dir, bool is_final);
/**
* \note When freeing all steps,
@@ -203,23 +209,32 @@ UndoStep *BKE_undosys_step_find_by_name_with_type(UndoStack *ustack,
UndoStep *BKE_undosys_step_find_by_type(UndoStack *ustack, const UndoType *ut);
UndoStep *BKE_undosys_step_find_by_name(UndoStack *ustack, const char *name);
+eUndoStepDir BKE_undosys_step_calc_direction(const UndoStack *ustack,
+ const UndoStep *us_target,
+ const UndoStep *us_reference);
+
+bool BKE_undosys_step_load_data_ex(UndoStack *ustack,
+ struct bContext *C,
+ UndoStep *us_target,
+ UndoStep *us_reference,
+ const bool use_skip);
+bool BKE_undosys_step_load_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
+void BKE_undosys_step_load_from_index(UndoStack *ustack, struct bContext *C, const int index);
+
bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack,
struct bContext *C,
UndoStep *us,
bool use_skip);
-bool BKE_undosys_step_undo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us);
+bool BKE_undosys_step_undo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
bool BKE_undosys_step_undo(UndoStack *ustack, struct bContext *C);
bool BKE_undosys_step_redo_with_data_ex(UndoStack *ustack,
struct bContext *C,
UndoStep *us,
bool use_skip);
-bool BKE_undosys_step_redo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us);
+bool BKE_undosys_step_redo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
bool BKE_undosys_step_redo(UndoStack *ustack, struct bContext *C);
-bool BKE_undosys_step_load_data(UndoStack *ustack, struct bContext *C, UndoStep *us);
-
-void BKE_undosys_step_undo_from_index(UndoStack *ustack, struct bContext *C, int index);
UndoStep *BKE_undosys_step_same_type_next(UndoStep *us);
UndoStep *BKE_undosys_step_same_type_prev(UndoStep *us);
diff --git a/source/blender/blenkernel/BKE_volume.h b/source/blender/blenkernel/BKE_volume.h
index 12c37ec56e0..53626dbeb1b 100644
--- a/source/blender/blenkernel/BKE_volume.h
+++ b/source/blender/blenkernel/BKE_volume.h
@@ -170,7 +170,7 @@ openvdb::GridBase::Ptr BKE_volume_grid_openvdb_for_write(const struct Volume *vo
struct VolumeGrid *grid,
const bool clear);
-VolumeGridType BKE_volume_grid_type_openvdb(const openvdb::GridBase::Ptr &grid);
+VolumeGridType BKE_volume_grid_type_openvdb(const openvdb::GridBase &grid);
template<typename OpType>
auto BKE_volume_grid_type_operation(const VolumeGridType grid_type, OpType &&op)
diff --git a/source/blender/blenkernel/BKE_volume_to_mesh.hh b/source/blender/blenkernel/BKE_volume_to_mesh.hh
new file mode 100644
index 00000000000..1ec8a8e84cd
--- /dev/null
+++ b/source/blender/blenkernel/BKE_volume_to_mesh.hh
@@ -0,0 +1,43 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "DNA_modifier_types.h"
+
+#ifdef WITH_OPENVDB
+# include <openvdb/openvdb.h>
+#endif
+
+struct Mesh;
+struct VolumeGrid;
+
+namespace blender::bke {
+
+struct VolumeToMeshResolution {
+ VolumeToMeshResolutionMode mode;
+ union {
+ float voxel_size;
+ float voxel_amount;
+ } settings;
+};
+
+#ifdef WITH_OPENVDB
+struct Mesh *volume_to_mesh(const openvdb::GridBase &grid,
+ const VolumeToMeshResolution &resolution,
+ const float threshold,
+ const float adaptivity);
+#endif
+
+} // namespace blender::bke
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 9aa2baef53c..1e7986eedd9 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -78,9 +78,10 @@ set(SRC
intern/armature.c
intern/armature_deform.c
intern/armature_update.c
- intern/asset.c
+ intern/asset.cc
intern/attribute.c
intern/attribute_access.cc
+ intern/attribute_math.cc
intern/autoexec.c
intern/blender.c
intern/blender_copybuffer.c
@@ -106,6 +107,7 @@ set(SRC
intern/cryptomatte.cc
intern/curve.c
intern/curve_bevel.c
+ intern/curve_convert.c
intern/curve_decimate.c
intern/curve_deform.c
intern/curveprofile.c
@@ -129,6 +131,7 @@ set(SRC
intern/font.c
intern/freestyle.c
intern/geometry_set.cc
+ intern/geometry_set_instances.cc
intern/gpencil.c
intern/gpencil_curve.c
intern/gpencil_geom.c
@@ -169,6 +172,7 @@ set(SRC
intern/mball.c
intern/mball_tessellate.c
intern/mesh.c
+ intern/mesh_boolean_convert.cc
intern/mesh_convert.c
intern/mesh_evaluate.c
intern/mesh_fair.cc
@@ -197,7 +201,8 @@ set(SRC
intern/multires_unsubdivide.c
intern/multires_versioning.c
intern/nla.c
- intern/node.c
+ intern/node.cc
+ intern/node_ui_storage.cc
intern/object.c
intern/object_deform.c
intern/object_dupli.c
@@ -259,6 +264,7 @@ set(SRC
intern/unit.c
intern/volume.cc
intern/volume_render.cc
+ intern/volume_to_mesh.cc
intern/workspace.c
intern/world.c
intern/writeavi.c
@@ -275,6 +281,7 @@ set(SRC
BKE_asset.h
BKE_attribute.h
BKE_attribute_access.hh
+ BKE_attribute_math.hh
BKE_autoexec.h
BKE_blender.h
BKE_blender_copybuffer.h
@@ -324,6 +331,7 @@ set(SRC
BKE_freestyle.h
BKE_geometry_set.h
BKE_geometry_set.hh
+ BKE_geometry_set_instances.hh
BKE_global.h
BKE_gpencil.h
BKE_gpencil_curve.h
@@ -356,6 +364,7 @@ set(SRC
BKE_mball.h
BKE_mball_tessellate.h
BKE_mesh.h
+ BKE_mesh_boolean_convert.h
BKE_mesh_fair.h
BKE_mesh_iterators.h
BKE_mesh_mapping.h
@@ -412,6 +421,7 @@ set(SRC
BKE_unit.h
BKE_volume.h
BKE_volume_render.h
+ BKE_volume_to_mesh.hh
BKE_workspace.h
BKE_world.h
BKE_writeavi.h
@@ -682,7 +692,7 @@ endif()
if(WITH_OPENVDB)
list(APPEND INC
- ../../../intern/openvdb
+ ../../../intern/openvdb
)
list(APPEND INC_SYS
${OPENVDB_INCLUDE_DIRS}
@@ -696,10 +706,10 @@ endif()
if(WITH_QUADRIFLOW)
list(APPEND INC
- ../../../intern/quadriflow
+ ../../../intern/quadriflow
)
list(APPEND LIB
- bf_intern_quadriflow
+ bf_intern_quadriflow
)
add_definitions(-DWITH_QUADRIFLOW)
endif()
@@ -720,6 +730,14 @@ if(WITH_TBB)
)
endif()
+if(WITH_GMP)
+ add_definitions(-DWITH_GMP)
+
+ list(APPEND INC_SYS
+ ${GMP_INCLUDE_DIRS}
+ )
+ endif()
+
# # Warnings as errors, this is too strict!
# if(MSVC)
# string(APPEND CMAKE_C_FLAGS " /WX")
diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc
index ecc41e3f0df..4aa7cfae009 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.cc
+++ b/source/blender/blenkernel/intern/DerivedMesh.cc
@@ -51,6 +51,7 @@
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_geometry_set.hh"
+#include "BKE_geometry_set_instances.hh"
#include "BKE_key.h"
#include "BKE_layer.h"
#include "BKE_lib_id.h"
@@ -883,6 +884,33 @@ void BKE_mesh_wrapper_deferred_finalize(Mesh *me_eval,
}
/**
+ * Some modifiers don't work on geometry sets directly, but expect a single mesh as input.
+ * Therefore, we convert data from the geometry set into a single mesh, so that those
+ * modifiers can work on it as well.
+ */
+static Mesh *prepare_geometry_set_for_mesh_modifier(Mesh *mesh, GeometrySet &r_geometry_set)
+{
+ if (!r_geometry_set.has_instances() && !r_geometry_set.has_pointcloud()) {
+ return mesh;
+ }
+
+ {
+ /* Add the mesh to the geometry set. */
+ MeshComponent &mesh_component = r_geometry_set.get_component_for_write<MeshComponent>();
+ mesh_component.replace_mesh_but_keep_vertex_group_names(mesh, GeometryOwnershipType::Editable);
+ }
+ {
+ /* Combine mesh and all instances into a single mesh that can be passed to the modifier. */
+ GeometrySet new_geometry_set = blender::bke::geometry_set_realize_mesh_for_modifier(
+ r_geometry_set);
+ MeshComponent &mesh_component = new_geometry_set.get_component_for_write<MeshComponent>();
+ Mesh *new_mesh = mesh_component.release();
+ r_geometry_set = new_geometry_set;
+ return new_mesh;
+ }
+}
+
+/**
* Modifies the given mesh and geometry set. The mesh is not passed as part of the mesh component
* in the \a geometry_set input, it is only passed in \a input_mesh and returned in the return
* value.
@@ -898,7 +926,14 @@ static Mesh *modifier_modify_mesh_and_geometry_set(ModifierData *md,
Mesh *mesh_output = nullptr;
const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type);
if (mti->modifyGeometrySet == nullptr) {
- mesh_output = BKE_modifier_modify_mesh(md, &mectx, input_mesh);
+ Mesh *new_input_mesh = prepare_geometry_set_for_mesh_modifier(input_mesh, geometry_set);
+ mesh_output = BKE_modifier_modify_mesh(md, &mectx, new_input_mesh);
+
+ /* The caller is responsible for freeing `input_mesh` and `mesh_output`. The intermediate
+ * `new_input_mesh` has to be freed here. */
+ if (!ELEM(new_input_mesh, input_mesh, mesh_output)) {
+ BKE_id_free(nullptr, new_input_mesh);
+ }
}
else {
/* For performance reasons, this should be called by the modifier and/or nodes themselves at
@@ -1155,6 +1190,14 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph,
/* No existing verts to deform, need to build them. */
if (!deformed_verts) {
if (mesh_final) {
+ Mesh *mesh_final_new = prepare_geometry_set_for_mesh_modifier(mesh_final,
+ geometry_set_final);
+ if (mesh_final_new != mesh_final) {
+ BLI_assert(mesh_final != mesh_input);
+ BKE_id_free(nullptr, mesh_final);
+ mesh_final = mesh_final_new;
+ }
+
/* Deforming a mesh, read the vertex locations
* out of the mesh and deform them. Once done with this
* run of deformers verts will be written back. */
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index ccb077d6b82..94680dc5c0c 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -54,6 +54,7 @@
#include "BKE_constraint.h"
#include "BKE_deform.h"
#include "BKE_fcurve.h"
+#include "BKE_icons.h"
#include "BKE_idprop.h"
#include "BKE_idtype.h"
#include "BKE_lib_id.h"
@@ -101,10 +102,7 @@ static CLG_LogRef LOG = {"bke.action"};
*
* \param flag: Copying options (see BKE_lib_id.h's LIB_ID_COPY_... flags for more).
*/
-static void action_copy_data(Main *UNUSED(bmain),
- ID *id_dst,
- const ID *id_src,
- const int UNUSED(flag))
+static void action_copy_data(Main *UNUSED(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;
@@ -145,6 +143,13 @@ static void action_copy_data(Main *UNUSED(bmain),
}
}
}
+
+ if (flag & LIB_ID_COPY_NO_PREVIEW) {
+ action_dst->preview = NULL;
+ }
+ else {
+ BKE_previewimg_id_copy(&action_dst->id, &action_src->id);
+ }
}
/** Free (or release) any data used by this action (does not free the action itself). */
@@ -161,6 +166,8 @@ static void action_free_data(struct ID *id)
/* Free pose-references (aka local markers). */
BLI_freelistN(&action->markers);
+
+ BKE_previewimg_free(&action->preview);
}
static void action_foreach_id(ID *id, LibraryForeachIDData *data)
@@ -192,6 +199,8 @@ static void action_blend_write(BlendWriter *writer, ID *id, const void *id_addre
LISTBASE_FOREACH (TimeMarker *, marker, &act->markers) {
BLO_write_struct(writer, TimeMarker, marker);
}
+
+ BKE_previewimg_blend_write(writer, act->preview);
}
}
@@ -218,6 +227,9 @@ static void action_blend_read_data(BlendDataReader *reader, ID *id)
BLO_read_data_address(reader, &agrp->channels.first);
BLO_read_data_address(reader, &agrp->channels.last);
}
+
+ BLO_read_data_address(reader, &act->preview);
+ BKE_previewimg_blend_read(reader, act->preview);
}
static void blend_read_lib_constraint_channels(BlendLibReader *reader, ID *id, ListBase *chanbase)
@@ -298,6 +310,8 @@ IDTypeInfo IDType_ID_AC = {
.blend_read_expand = action_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* ***************** Library data level operations on action ************** */
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 20956d6eb18..4d490f8f76a 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -362,6 +362,20 @@ void BKE_keyingsets_blend_read_expand(BlendExpander *expander, ListBase *list)
/* ***************************************** */
/* Evaluation Data-Setting Backend */
+static bool is_fcurve_evaluatable(FCurve *fcu)
+{
+ if (fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) {
+ return false;
+ }
+ if (fcu->grp != NULL && (fcu->grp->flag & AGRP_MUTED)) {
+ return false;
+ }
+ if (BKE_fcurve_is_empty(fcu)) {
+ return false;
+ }
+ return true;
+}
+
bool BKE_animsys_store_rna_setting(PointerRNA *ptr,
/* typically 'fcu->rna_path', 'fcu->array_index' */
const char *rna_path,
@@ -594,18 +608,11 @@ static void animsys_evaluate_fcurves(PointerRNA *ptr,
{
/* Calculate then execute each curve. */
LISTBASE_FOREACH (FCurve *, fcu, list) {
- /* Check if this F-Curve doesn't belong to a muted group. */
- if ((fcu->grp != NULL) && (fcu->grp->flag & AGRP_MUTED)) {
- continue;
- }
- /* Check if this curve should be skipped. */
- if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED))) {
- continue;
- }
- /* Skip empty curves, as if muted. */
- if (BKE_fcurve_is_empty(fcu)) {
+
+ if (!is_fcurve_evaluatable(fcu)) {
continue;
}
+
PathResolvedRNA anim_rna;
if (BKE_animsys_store_rna_setting(ptr, fcu->rna_path, fcu->array_index, &anim_rna)) {
const float curval = calculate_fcurve(&anim_rna, fcu, anim_eval_context);
@@ -979,6 +986,19 @@ NlaEvalStrip *nlastrips_ctime_get_strip(ListBase *list,
return nes;
}
+static NlaEvalStrip *nlastrips_ctime_get_strip_single(
+ ListBase *dst_list,
+ NlaStrip *single_strip,
+ const AnimationEvalContext *anim_eval_context,
+ const bool flush_to_original)
+{
+ ListBase single_tracks_list;
+ single_tracks_list.first = single_tracks_list.last = single_strip;
+
+ return nlastrips_ctime_get_strip(
+ dst_list, &single_tracks_list, -1, anim_eval_context, flush_to_original);
+}
+
/* ---------------------- */
/* Initialize a valid mask, allocating memory if necessary. */
@@ -1030,6 +1050,7 @@ static NlaEvalChannelSnapshot *nlaevalchan_snapshot_new(NlaEvalChannel *nec)
nec_snapshot->channel = nec;
nec_snapshot->length = length;
+ nlavalidmask_init(&nec_snapshot->blend_domain, length);
return nec_snapshot;
}
@@ -1039,6 +1060,7 @@ static void nlaevalchan_snapshot_free(NlaEvalChannelSnapshot *nec_snapshot)
{
BLI_assert(!nec_snapshot->is_base);
+ nlavalidmask_free(&nec_snapshot->blend_domain);
MEM_freeN(nec_snapshot);
}
@@ -1152,11 +1174,7 @@ static void nlaeval_snapshot_free_data(NlaEvalSnapshot *snapshot)
/* Free memory owned by this evaluation channel. */
static void nlaevalchan_free_data(NlaEvalChannel *nec)
{
- nlavalidmask_free(&nec->valid);
-
- if (nec->blend_snapshot != NULL) {
- nlaevalchan_snapshot_free(nec->blend_snapshot);
- }
+ nlavalidmask_free(&nec->domain);
}
/* Initialize a full NLA evaluation state structure. */
@@ -1353,7 +1371,7 @@ static NlaEvalChannel *nlaevalchan_verify_key(NlaEvalData *nlaeval,
nec->mix_mode = nlaevalchan_detect_mix_mode(key, length);
- nlavalidmask_init(&nec->valid, length);
+ nlavalidmask_init(&nec->domain, length);
nec->base_snapshot.channel = nec;
nec->base_snapshot.length = length;
@@ -1578,7 +1596,7 @@ static bool nla_combine_get_inverted_strip_value(const int mix_mode,
if (IS_EQF(base_value, 0.0f)) {
base_value = 1.0f;
}
- /* Divison by zero. */
+ /* Division by zero. */
if (IS_EQF(lower_value, 0.0f)) {
/* Resolve 0/0 to 1. */
if (IS_EQF(blended_value, 0.0f)) {
@@ -1641,149 +1659,6 @@ static bool nla_combine_quaternion_get_inverted_strip_values(const float lower_v
return true;
}
-/* Data about the current blend mode. */
-typedef struct NlaBlendData {
- NlaEvalSnapshot *snapshot;
- int mode;
- float influence;
-
- NlaEvalChannel *blend_queue;
-} NlaBlendData;
-
-/* Queue the channel for deferred blending. */
-static NlaEvalChannelSnapshot *nlaevalchan_queue_blend(NlaBlendData *blend, NlaEvalChannel *nec)
-{
- if (!nec->in_blend) {
- if (nec->blend_snapshot == NULL) {
- nec->blend_snapshot = nlaevalchan_snapshot_new(nec);
- }
-
- nec->in_blend = true;
- nlaevalchan_snapshot_copy(nec->blend_snapshot, &nec->base_snapshot);
-
- nec->next_blend = blend->blend_queue;
- blend->blend_queue = nec;
- }
-
- return nec->blend_snapshot;
-}
-
-/* Accumulate (i.e. blend) the given value on to the channel it affects. */
-static bool nlaeval_blend_value(NlaBlendData *blend,
- NlaEvalChannel *nec,
- int array_index,
- float value)
-{
- if (nec == NULL) {
- return false;
- }
-
- if (!nlaevalchan_validate_index_ex(nec, array_index)) {
- return false;
- }
-
- if (nec->mix_mode == NEC_MIX_QUATERNION) {
- /* For quaternion properties, always output all sub-channels. */
- BLI_bitmap_set_all(nec->valid.ptr, true, 4);
- }
- else {
- BLI_BITMAP_ENABLE(nec->valid.ptr, array_index);
- }
-
- NlaEvalChannelSnapshot *nec_snapshot = nlaeval_snapshot_ensure_channel(blend->snapshot, nec);
- float *p_value = &nec_snapshot->values[array_index];
-
- if (blend->mode == NLASTRIP_MODE_COMBINE) {
- /* Quaternion blending is deferred until all sub-channel values are known. */
- if (nec->mix_mode == NEC_MIX_QUATERNION) {
- NlaEvalChannelSnapshot *blend_snapshot = nlaevalchan_queue_blend(blend, nec);
-
- blend_snapshot->values[array_index] = value;
- }
- else {
- float base_value = nec->base_snapshot.values[array_index];
-
- *p_value = nla_combine_value(nec->mix_mode, base_value, *p_value, value, blend->influence);
- }
- }
- else {
- *p_value = nla_blend_value(blend->mode, *p_value, value, blend->influence);
- }
-
- return true;
-}
-
-/* Finish deferred quaternion blending. */
-static void nlaeval_blend_flush(NlaBlendData *blend)
-{
- NlaEvalChannel *nec;
-
- while ((nec = blend->blend_queue)) {
- blend->blend_queue = nec->next_blend;
- nec->in_blend = false;
-
- NlaEvalChannelSnapshot *nec_snapshot = nlaeval_snapshot_ensure_channel(blend->snapshot, nec);
- NlaEvalChannelSnapshot *blend_snapshot = nec->blend_snapshot;
-
- if (nec->mix_mode == NEC_MIX_QUATERNION) {
- nla_combine_quaternion(
- nec_snapshot->values, blend_snapshot->values, blend->influence, nec_snapshot->values);
- }
- else {
- BLI_assert(!"mix quaternion");
- }
- }
-}
-
-/* Blend the specified snapshots into the target, and free the input snapshots. */
-static void nlaeval_snapshot_mix_and_free(NlaEvalData *nlaeval,
- NlaEvalSnapshot *out,
- NlaEvalSnapshot *in1,
- NlaEvalSnapshot *in2,
- float alpha)
-{
- BLI_assert(in1->base == out && in2->base == out);
-
- nlaeval_snapshot_ensure_size(out, nlaeval->num_channels);
-
- for (int i = 0; i < nlaeval->num_channels; i++) {
- NlaEvalChannelSnapshot *c_in1 = nlaeval_snapshot_get(in1, i);
- NlaEvalChannelSnapshot *c_in2 = nlaeval_snapshot_get(in2, i);
-
- if (c_in1 || c_in2) {
- NlaEvalChannelSnapshot *c_out = out->channels[i];
-
- /* Steal the entry from one of the input snapshots. */
- if (c_out == NULL) {
- if (c_in1 != NULL) {
- c_out = c_in1;
- in1->channels[i] = NULL;
- }
- else {
- c_out = c_in2;
- in2->channels[i] = NULL;
- }
- }
-
- if (c_in1 == NULL) {
- c_in1 = nlaeval_snapshot_find_channel(in1->base, c_out->channel);
- }
- if (c_in2 == NULL) {
- c_in2 = nlaeval_snapshot_find_channel(in2->base, c_out->channel);
- }
-
- out->channels[i] = c_out;
-
- for (int j = 0; j < c_out->length; j++) {
- c_out->values[j] = c_in1->values[j] * (1.0f - alpha) + c_in2->values[j] * alpha;
- }
- }
- }
-
- nlaeval_snapshot_free_data(in1);
- nlaeval_snapshot_free_data(in2);
-}
-
/* ---------------------- */
/* F-Modifier stack joining/separation utilities -
* should we generalize these for BLI_listbase.h interface? */
@@ -1845,6 +1720,58 @@ static void nlaeval_fmodifiers_split_stacks(ListBase *list1, ListBase *list2)
/* ---------------------- */
+/** Fills \a r_snapshot with the \a action's evaluated fcurve values with modifiers applied. */
+static void nlasnapshot_from_action(PointerRNA *ptr,
+ NlaEvalData *channels,
+ ListBase *modifiers,
+ bAction *action,
+ const float evaltime,
+ NlaEvalSnapshot *r_snapshot)
+{
+ FCurve *fcu;
+
+ action_idcode_patch_check(ptr->owner_id, action);
+
+ /* Evaluate modifiers which modify time to evaluate the base curves at. */
+ FModifiersStackStorage storage;
+ storage.modifier_count = BLI_listbase_count(modifiers);
+ storage.size_per_modifier = evaluate_fmodifiers_storage_size_per_modifier(modifiers);
+ storage.buffer = alloca(storage.modifier_count * storage.size_per_modifier);
+
+ const float modified_evaltime = evaluate_time_fmodifiers(
+ &storage, modifiers, NULL, 0.0f, evaltime);
+
+ for (fcu = action->curves.first; fcu; fcu = fcu->next) {
+ if (!is_fcurve_evaluatable(fcu)) {
+ continue;
+ }
+
+ NlaEvalChannel *nec = nlaevalchan_verify(ptr, channels, fcu->rna_path);
+
+ /* Invalid path or property cannot be animated. */
+ if (nec == NULL) {
+ continue;
+ }
+
+ if (!nlaevalchan_validate_index_ex(nec, fcu->array_index)) {
+ continue;
+ }
+
+ NlaEvalChannelSnapshot *necs = nlaeval_snapshot_ensure_channel(r_snapshot, nec);
+
+ float value = evaluate_fcurve(fcu, modified_evaltime);
+ evaluate_value_fmodifiers(&storage, modifiers, fcu, &value, evaltime);
+ necs->values[fcu->array_index] = value;
+
+ if (nec->mix_mode == NEC_MIX_QUATERNION) {
+ BLI_bitmap_set_all(necs->blend_domain.ptr, true, 4);
+ }
+ else {
+ BLI_BITMAP_ENABLE(necs->blend_domain.ptr, fcu->array_index);
+ }
+ }
+}
+
/* evaluate action-clip strip */
static void nlastrip_evaluate_actionclip(PointerRNA *ptr,
NlaEvalData *channels,
@@ -1852,10 +1779,8 @@ static void nlastrip_evaluate_actionclip(PointerRNA *ptr,
NlaEvalStrip *nes,
NlaEvalSnapshot *snapshot)
{
- ListBase tmp_modifiers = {NULL, NULL};
+
NlaStrip *strip = nes->strip;
- FCurve *fcu;
- float evaltime;
/* sanity checks for action */
if (strip == NULL) {
@@ -1867,62 +1792,20 @@ static void nlastrip_evaluate_actionclip(PointerRNA *ptr,
return;
}
- action_idcode_patch_check(ptr->owner_id, strip->act);
+ ListBase tmp_modifiers = {NULL, NULL};
/* join this strip's modifiers to the parent's modifiers (own modifiers first) */
nlaeval_fmodifiers_join_stacks(&tmp_modifiers, &strip->modifiers, modifiers);
- /* evaluate strip's modifiers which modify time to evaluate the base curves at */
- FModifiersStackStorage storage;
- storage.modifier_count = BLI_listbase_count(&tmp_modifiers);
- storage.size_per_modifier = evaluate_fmodifiers_storage_size_per_modifier(&tmp_modifiers);
- storage.buffer = alloca(storage.modifier_count * storage.size_per_modifier);
-
- evaltime = evaluate_time_fmodifiers(&storage, &tmp_modifiers, NULL, 0.0f, strip->strip_time);
-
- NlaBlendData blend = {
- .snapshot = snapshot,
- .mode = strip->blendmode,
- .influence = strip->influence,
- };
-
- /* Evaluate all the F-Curves in the action,
- * saving the relevant pointers to data that will need to be used. */
- for (fcu = strip->act->curves.first; fcu; fcu = fcu->next) {
- float value = 0.0f;
-
- /* check if this curve should be skipped */
- if (fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) {
- continue;
- }
- if ((fcu->grp) && (fcu->grp->flag & AGRP_MUTED)) {
- continue;
- }
- if (BKE_fcurve_is_empty(fcu)) {
- continue;
- }
-
- /* evaluate the F-Curve's value for the time given in the strip
- * NOTE: we use the modified time here, since strip's F-Curve Modifiers
- * are applied on top of this.
- */
- value = evaluate_fcurve(fcu, evaltime);
-
- /* apply strip's F-Curve Modifiers on this value
- * NOTE: we apply the strip's original evaluation time not the modified one
- * (as per standard F-Curve eval)
- */
- evaluate_value_fmodifiers(&storage, &tmp_modifiers, fcu, &value, strip->strip_time);
-
- /* Get an NLA evaluation channel to work with,
- * and accumulate the evaluated value with the value(s)
- * stored in this channel if it has been used already. */
- NlaEvalChannel *nec = nlaevalchan_verify(ptr, channels, fcu->rna_path);
+ NlaEvalSnapshot strip_snapshot;
+ nlaeval_snapshot_init(&strip_snapshot, channels, NULL);
- nlaeval_blend_value(&blend, nec, fcu->array_index, value);
- }
+ nlasnapshot_from_action(
+ ptr, channels, &tmp_modifiers, strip->act, strip->strip_time, &strip_snapshot);
+ nlasnapshot_blend(
+ channels, snapshot, &strip_snapshot, strip->blendmode, strip->influence, snapshot);
- nlaeval_blend_flush(&blend);
+ nlaeval_snapshot_free_data(&strip_snapshot);
/* unlink this strip's modifiers from the parent's modifiers again */
nlaeval_fmodifiers_split_stacks(&strip->modifiers, modifiers);
@@ -1988,8 +1871,15 @@ static void nlastrip_evaluate_transition(PointerRNA *ptr,
nlastrip_evaluate(
ptr, channels, &tmp_modifiers, &tmp_nes, &snapshot2, anim_eval_context, flush_to_original);
- /* accumulate temp-buffer and full-buffer, using the 'real' strip */
- nlaeval_snapshot_mix_and_free(channels, snapshot, &snapshot1, &snapshot2, nes->strip_time);
+ /** Replace \a snapshot2 NULL channels with base or default values so all channels blend. */
+ nlasnapshot_ensure_channels(channels, &snapshot2);
+ /** Mark all \a snapshot2 channel's values to blend. */
+ nlasnapshot_enable_all_blend_domain(&snapshot2);
+ nlasnapshot_blend(
+ channels, &snapshot1, &snapshot2, NLASTRIP_MODE_REPLACE, nes->strip_time, snapshot);
+
+ nlaeval_snapshot_free_data(&snapshot1);
+ nlaeval_snapshot_free_data(&snapshot2);
/* unlink this strip's modifiers from the parent's modifiers again */
nlaeval_fmodifiers_split_stacks(&nes->strip->modifiers, modifiers);
@@ -2099,12 +1989,21 @@ void nladata_flush_channels(PointerRNA *ptr,
/* for each channel with accumulated values, write its value on the property it affects */
LISTBASE_FOREACH (NlaEvalChannel *, nec, &channels->channels) {
+ /**
+ * The bitmask is set for all channels touched by NLA due to the domain() function.
+ * Channels touched by current set of evaluated strips will have a snapshot channel directly
+ * from the evaluation snapshot.
+ *
+ * This function falls back to the default value if the snapshot channel doesn't exist.
+ * Thus channels, touched by NLA but not by the current set of evaluated strips, will be
+ * reset to default. If channel not touched by NLA then it's value is unchanged.
+ */
NlaEvalChannelSnapshot *nec_snapshot = nlaeval_snapshot_find_channel(snapshot, nec);
PathResolvedRNA rna = {nec->key.ptr, nec->key.prop, -1};
for (int i = 0; i < nec_snapshot->length; i++) {
- if (BLI_BITMAP_TEST(nec->valid.ptr, i)) {
+ if (BLI_BITMAP_TEST(nec->domain.ptr, i)) {
float value = nec_snapshot->values[i];
if (nec->is_array) {
rna.prop_index = i;
@@ -2131,13 +2030,7 @@ static void nla_eval_domain_action(PointerRNA *ptr,
LISTBASE_FOREACH (FCurve *, fcu, &act->curves) {
/* check if this curve should be skipped */
- if (fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) {
- continue;
- }
- if ((fcu->grp) && (fcu->grp->flag & AGRP_MUTED)) {
- continue;
- }
- if (BKE_fcurve_is_empty(fcu)) {
+ if (!is_fcurve_evaluatable(fcu)) {
continue;
}
@@ -2146,14 +2039,14 @@ static void nla_eval_domain_action(PointerRNA *ptr,
if (nec != NULL) {
/* For quaternion properties, enable all sub-channels. */
if (nec->mix_mode == NEC_MIX_QUATERNION) {
- BLI_bitmap_set_all(nec->valid.ptr, true, 4);
+ BLI_bitmap_set_all(nec->domain.ptr, true, 4);
continue;
}
int idx = nlaevalchan_validate_index(nec, fcu->array_index);
if (idx >= 0) {
- BLI_BITMAP_ENABLE(nec->valid.ptr, idx);
+ BLI_BITMAP_ENABLE(nec->domain.ptr, idx);
}
}
}
@@ -2212,190 +2105,345 @@ static void animsys_evaluate_nla_domain(PointerRNA *ptr, NlaEvalData *channels,
/* ---------------------- */
+/** Tweaked strip is evaluated differently from other strips. Adjacent strips are ignored
+ * and includes a workaround for when user is not editing in place. */
+static void animsys_create_tweak_strip(const AnimData *adt,
+ const bool keyframing_to_strip,
+ NlaStrip *r_tweak_strip)
+
+{
+ /* Copy active strip so we can modify how it evaluates without affecting user data. */
+ memcpy(r_tweak_strip, adt->actstrip, sizeof(NlaStrip));
+ r_tweak_strip->next = r_tweak_strip->prev = NULL;
+
+ /* If tweaked strip is syncing action length, then evaluate using action length. */
+ if (r_tweak_strip->flag & NLASTRIP_FLAG_SYNC_LENGTH) {
+ BKE_nlastrip_recalculate_bounds_sync_action(r_tweak_strip);
+ }
+
+ /* Strips with a user-defined time curve don't get properly remapped for editing
+ * at the moment, so mapping them just for display may be confusing. */
+ const bool is_inplace_tweak = !(adt->flag & ADT_NLA_EDIT_NOMAP) &&
+ !(adt->actstrip->flag & NLASTRIP_FLAG_USR_TIME);
+
+ if (!is_inplace_tweak) {
+ /* Use Hold due to no proper remapping yet (the note above). */
+ r_tweak_strip->extendmode = NLASTRIP_EXTEND_HOLD;
+
+ /* Disable range. */
+ r_tweak_strip->flag |= NLASTRIP_FLAG_NO_TIME_MAP;
+ }
+
+ /** Controls whether able to keyframe outside range of tweaked strip. */
+ if (keyframing_to_strip) {
+ r_tweak_strip->extendmode = (is_inplace_tweak &&
+ !(r_tweak_strip->flag & NLASTRIP_FLAG_SYNC_LENGTH)) ?
+ NLASTRIP_EXTEND_NOTHING :
+ NLASTRIP_EXTEND_HOLD;
+ }
+}
+
+/** Action track and strip are associated with the non-pushed action. */
+static void animsys_create_action_track_strip(const AnimData *adt,
+ const bool keyframing_to_strip,
+ NlaStrip *r_action_strip)
+{
+ memset(r_action_strip, 0, sizeof(NlaStrip));
+
+ bAction *action = adt->action;
+
+ if ((adt->flag & ADT_NLA_EDIT_ON)) {
+ action = adt->tmpact;
+ }
+
+ /* Set settings of dummy NLA strip from AnimData settings. */
+ r_action_strip->act = action;
+
+ /* Action range is calculated taking F-Modifiers into account
+ * (which making new strips doesn't do due to the troublesome nature of that). */
+ calc_action_range(r_action_strip->act, &r_action_strip->actstart, &r_action_strip->actend, 1);
+ r_action_strip->start = r_action_strip->actstart;
+ r_action_strip->end = (IS_EQF(r_action_strip->actstart, r_action_strip->actend)) ?
+ (r_action_strip->actstart + 1.0f) :
+ (r_action_strip->actend);
+
+ r_action_strip->blendmode = adt->act_blendmode;
+ r_action_strip->extendmode = adt->act_extendmode;
+ r_action_strip->influence = adt->act_influence;
+
+ /* NOTE: must set this, or else the default setting overrides,
+ * and this setting doesn't work. */
+ r_action_strip->flag |= NLASTRIP_FLAG_USR_INFLUENCE;
+
+ /* Unless extendmode is Nothing (might be useful for flattening NLA evaluation), disable range.
+ * Extendmode Nothing and Hold will behave as normal. Hold Forward will behave just like Hold.
+ */
+ if (r_action_strip->extendmode != NLASTRIP_EXTEND_NOTHING) {
+ r_action_strip->flag |= NLASTRIP_FLAG_NO_TIME_MAP;
+ }
+
+ const bool tweaking = (adt->flag & ADT_NLA_EDIT_ON) != 0;
+ const bool soloing = (adt->flag & ADT_NLA_SOLO_TRACK) != 0;
+ const bool actionstrip_evaluated = r_action_strip->act && !soloing && !tweaking;
+ if (!actionstrip_evaluated) {
+ r_action_strip->flag |= NLASTRIP_FLAG_MUTED;
+ }
+
+ /** If we're keyframing, then we must allow keyframing outside fcurve bounds. */
+ if (keyframing_to_strip) {
+ r_action_strip->extendmode = NLASTRIP_EXTEND_HOLD;
+ }
+}
+
+static bool is_nlatrack_evaluatable(const AnimData *adt, const NlaTrack *nlt)
+{
+ /* Skip disabled tracks unless it contains the tweaked strip. */
+ const bool contains_tweak_strip = (adt->flag & ADT_NLA_EDIT_ON) &&
+ (nlt->index == adt->act_track->index);
+ if ((nlt->flag & NLATRACK_DISABLED) && !contains_tweak_strip) {
+ return false;
+ }
+
+ /* Solo and muting are mutually exclusive. */
+ if (adt->flag & ADT_NLA_SOLO_TRACK) {
+ /* Skip if there is a solo track, but this isn't it. */
+ if ((nlt->flag & NLATRACK_SOLO) == 0) {
+ return false;
+ }
+ }
+ else {
+ /* Skip track if muted. */
+ if (nlt->flag & NLATRACK_MUTED) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/** Check for special case of non-pushed action being evaluated with no NLA influence (off and no
+ * strips evaluated) nor NLA interference (ensure NLA not soloing). */
+static bool is_action_track_evaluated_without_nla(const AnimData *adt,
+ const bool any_strip_evaluated)
+{
+ if (adt->action == NULL) {
+ return false;
+ }
+
+ if (any_strip_evaluated) {
+ return false;
+ }
+
+ /** NLA settings interference. */
+ if ((adt->flag & (ADT_NLA_SOLO_TRACK | ADT_NLA_EDIT_ON)) != 0) {
+ return false;
+ }
+
+ /** Allow action track to evaluate as if there isn't any NLA data. */
+ return true;
+}
+
/**
- * NLA Evaluation function - values are calculated and stored in temporary "NlaEvalChannels"
+ * XXX(Wayde Moss): #BKE_nlatrack_find_tweaked() exists within nla.c, but it doesn't appear to
+ * work as expected. From #animsys_evaluate_nla_for_flush(), it returns NULL in tweak mode. I'm not
+ * sure why. Preferably, it would be as simple as checking for `(adt->act_Track == nlt)` but that
+ * doesn't work either, neither does comparing indices.
*
+ * This function is a temporary work around. The first disabled track is always the tweaked track.
+ */
+static NlaTrack *nlatrack_find_tweaked(const AnimData *adt)
+{
+ NlaTrack *nlt;
+
+ if (adt == NULL) {
+ return NULL;
+ }
+
+ /* Since the track itself gets disabled, we want the first disabled. */
+ for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) {
+ if (nlt->flag & NLATRACK_DISABLED) {
+ return nlt;
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * NLA Evaluation function - values are calculated and stored in temporary "NlaEvalChannels"
* \param[out] echannels: Evaluation channels with calculated values
- * \param[out] r_context: If not NULL,
- * data about the currently edited strip is stored here and excluded from value calculation.
- * \return false if NLA evaluation isn't actually applicable.
*/
-static bool animsys_evaluate_nla(NlaEvalData *echannels,
- PointerRNA *ptr,
- AnimData *adt,
- const AnimationEvalContext *anim_eval_context,
- const bool flush_to_original,
- NlaKeyframingContext *r_context)
+static bool animsys_evaluate_nla_for_flush(NlaEvalData *echannels,
+ PointerRNA *ptr,
+ const AnimData *adt,
+ const AnimationEvalContext *anim_eval_context,
+ const bool flush_to_original)
{
NlaTrack *nlt;
short track_index = 0;
bool has_strips = false;
-
ListBase estrips = {NULL, NULL};
NlaEvalStrip *nes;
- NlaStrip dummy_strip_buf;
- /* dummy strip for active action */
- NlaStrip *dummy_strip = r_context ? &r_context->strip : &dummy_strip_buf;
+ NlaStrip tweak_strip;
- memset(dummy_strip, 0, sizeof(*dummy_strip));
+ NlaTrack *tweaked_track = nlatrack_find_tweaked(adt);
- /* 1. get the stack of strips to evaluate at current time (influence calculated here) */
+ /* Get the stack of strips to evaluate at current time (influence calculated here). */
for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next, track_index++) {
- /* stop here if tweaking is on and this strip is the tweaking track
- * (it will be the first one that's 'disabled')... */
- if ((adt->flag & ADT_NLA_EDIT_ON) && (nlt->flag & NLATRACK_DISABLED)) {
- break;
+
+ if (!is_nlatrack_evaluatable(adt, nlt)) {
+ continue;
}
- /* solo and muting are mutually exclusive... */
- if (adt->flag & ADT_NLA_SOLO_TRACK) {
- /* skip if there is a solo track, but this isn't it */
- if ((nlt->flag & NLATRACK_SOLO) == 0) {
- continue;
- }
- /* else - mute doesn't matter */
+ if (nlt->strips.first) {
+ has_strips = true;
+ }
+
+ /** Append strip to evaluate for this track. */
+ if (nlt == tweaked_track) {
+ /** Tweaked strip is evaluated differently. */
+ animsys_create_tweak_strip(adt, false, &tweak_strip);
+ nes = nlastrips_ctime_get_strip_single(
+ &estrips, &tweak_strip, anim_eval_context, flush_to_original);
}
else {
- /* no solo tracks - skip track if muted */
- if (nlt->flag & NLATRACK_MUTED) {
- continue;
- }
+ nes = nlastrips_ctime_get_strip(
+ &estrips, &nlt->strips, track_index, anim_eval_context, flush_to_original);
+ }
+ if (nes) {
+ nes->track = nlt;
+ }
+ }
+
+ if (is_action_track_evaluated_without_nla(adt, has_strips)) {
+ BLI_freelistN(&estrips);
+ return false;
+ }
+
+ NlaStrip action_strip = {0};
+ animsys_create_action_track_strip(adt, false, &action_strip);
+ nlastrips_ctime_get_strip_single(&estrips, &action_strip, anim_eval_context, flush_to_original);
+
+ /* Per strip, evaluate and accumulate on top of existing channels. */
+ for (nes = estrips.first; nes; nes = nes->next) {
+ nlastrip_evaluate(ptr,
+ echannels,
+ NULL,
+ nes,
+ &echannels->eval_snapshot,
+ anim_eval_context,
+ flush_to_original);
+ }
+
+ /* Free temporary evaluation data that's not used elsewhere. */
+ BLI_freelistN(&estrips);
+ return true;
+}
+
+/** Lower blended values are calculated and accumulated into r_context->lower_eval_data. */
+static void animsys_evaluate_nla_for_keyframing(PointerRNA *ptr,
+ const AnimData *adt,
+ const AnimationEvalContext *anim_eval_context,
+ NlaKeyframingContext *r_context)
+{
+ if (!r_context) {
+ return;
+ }
+
+ /* Early out. If NLA track is soloing and tweaked action isn't it, then don't allow keyframe
+ * insertion. */
+ if (adt->flag & ADT_NLA_SOLO_TRACK) {
+ if (!(adt->act_track && (adt->act_track->flag & NLATRACK_SOLO))) {
+ r_context->eval_strip = NULL;
+ return;
+ }
+ }
+
+ NlaTrack *nlt;
+ short track_index = 0;
+ bool has_strips = false;
+
+ ListBase lower_estrips = {NULL, NULL};
+ NlaEvalStrip *nes;
+
+ NlaTrack *tweaked_track = nlatrack_find_tweaked(adt);
+
+ /* Get the lower stack of strips to evaluate at current time (influence calculated here). */
+ for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next, track_index++) {
+
+ if (!is_nlatrack_evaluatable(adt, nlt)) {
+ continue;
+ }
+
+ /* Tweaked strip effect should not be stored in any snapshot. */
+ if (nlt == tweaked_track) {
+ break;
}
- /* if this track has strips (but maybe they won't be suitable), set has_strips
- * - used for mainly for still allowing normal action evaluation...
- */
if (nlt->strips.first) {
has_strips = true;
}
- /* otherwise, get strip to evaluate for this channel */
+ /* Get strip to evaluate for this channel. */
nes = nlastrips_ctime_get_strip(
- &estrips, &nlt->strips, track_index, anim_eval_context, flush_to_original);
+ &lower_estrips, &nlt->strips, track_index, anim_eval_context, false);
if (nes) {
nes->track = nlt;
}
}
- /* add 'active' Action (may be tweaking track) as last strip to evaluate in NLA stack
- * - only do this if we're not exclusively evaluating the 'solo' NLA-track
- * - however, if the 'solo' track houses the current 'tweaking' strip,
- * then we should allow this to play, otherwise nothing happens
+ /** Note: Although we early out, we can still keyframe to the non-pushed action since the
+ * keyframe remap function detects (r_context->strip.act == NULL) and will keyframe without
+ * remapping.
*/
- if ((adt->action) && ((adt->flag & ADT_NLA_SOLO_TRACK) == 0 || (adt->flag & ADT_NLA_EDIT_ON))) {
- /* if there are strips, evaluate action as per NLA rules */
- if ((has_strips) || (adt->actstrip)) {
- /* make dummy NLA strip, and add that to the stack */
- ListBase dummy_trackslist;
-
- dummy_trackslist.first = dummy_trackslist.last = dummy_strip;
-
- /* Strips with a user-defined time curve don't get properly remapped for editing
- * at the moment, so mapping them just for display may be confusing. */
- bool is_inplace_tweak = (nlt) && !(adt->flag & ADT_NLA_EDIT_NOMAP) &&
- !(adt->actstrip->flag & NLASTRIP_FLAG_USR_TIME);
-
- if (is_inplace_tweak) {
- /* edit active action in-place according to its active strip, so copy the data */
- memcpy(dummy_strip, adt->actstrip, sizeof(NlaStrip));
- /* Prevents nla eval from considering active strip's adj strips.
- * For user, this means entering tweak mode on a strip ignores evaluating adjacent strips
- * in the same track. */
- dummy_strip->next = dummy_strip->prev = NULL;
-
- /* If tweaked strip is syncing action length, then evaluate using action length. */
- if (dummy_strip->flag & NLASTRIP_FLAG_SYNC_LENGTH) {
- BKE_nlastrip_recalculate_bounds_sync_action(dummy_strip);
- }
- }
- else {
- /* set settings of dummy NLA strip from AnimData settings */
- dummy_strip->act = adt->action;
-
- /* action range is calculated taking F-Modifiers into account
- * (which making new strips doesn't do due to the troublesome nature of that) */
- calc_action_range(dummy_strip->act, &dummy_strip->actstart, &dummy_strip->actend, 1);
- dummy_strip->start = dummy_strip->actstart;
- dummy_strip->end = (IS_EQF(dummy_strip->actstart, dummy_strip->actend)) ?
- (dummy_strip->actstart + 1.0f) :
- (dummy_strip->actend);
-
- /* Always use the blend mode of the strip in tweak mode, even if not in-place. */
- if (nlt && adt->actstrip) {
- dummy_strip->blendmode = adt->actstrip->blendmode;
- dummy_strip->extendmode = NLASTRIP_EXTEND_HOLD;
- }
- else {
- dummy_strip->blendmode = adt->act_blendmode;
- dummy_strip->extendmode = adt->act_extendmode;
- }
+ if (is_action_track_evaluated_without_nla(adt, has_strips)) {
+ BLI_freelistN(&lower_estrips);
+ return;
+ }
- /* Unless extend-mode is Nothing (might be useful for flattening NLA evaluation),
- * disable range. */
- if (dummy_strip->extendmode != NLASTRIP_EXTEND_NOTHING) {
- dummy_strip->flag |= NLASTRIP_FLAG_NO_TIME_MAP;
- }
+ /* Write r_context->eval_strip. */
+ if (adt->flag & ADT_NLA_EDIT_ON) {
- dummy_strip->influence = adt->act_influence;
+ NlaStrip *tweak_strip = &r_context->strip;
+ animsys_create_tweak_strip(adt, true, tweak_strip);
+ r_context->eval_strip = nlastrips_ctime_get_strip_single(
+ NULL, tweak_strip, anim_eval_context, false);
+ }
+ else {
- /* NOTE: must set this, or else the default setting overrides,
- * and this setting doesn't work. */
- dummy_strip->flag |= NLASTRIP_FLAG_USR_INFLUENCE;
- }
+ NlaStrip *action_strip = &r_context->strip;
+ animsys_create_action_track_strip(adt, true, action_strip);
+ r_context->eval_strip = nlastrips_ctime_get_strip_single(
+ NULL, action_strip, anim_eval_context, false);
+ }
- /* add this to our list of evaluation strips */
- if (r_context == NULL) {
- nlastrips_ctime_get_strip(
- &estrips, &dummy_trackslist, -1, anim_eval_context, flush_to_original);
- }
- /* If computing the context for keyframing, store data there instead of the list. */
- else {
- /* The extend mode here effectively controls
- * whether it is possible to key-frame beyond the ends.*/
- dummy_strip->extendmode = (is_inplace_tweak &&
- !(dummy_strip->flag & NLASTRIP_FLAG_SYNC_LENGTH)) ?
- NLASTRIP_EXTEND_NOTHING :
- NLASTRIP_EXTEND_HOLD;
-
- r_context->eval_strip = nes = nlastrips_ctime_get_strip(
- NULL, &dummy_trackslist, -1, anim_eval_context, flush_to_original);
-
- /* These setting combinations require no data from strips below, so exit immediately. */
- if ((nes == NULL) ||
- (dummy_strip->blendmode == NLASTRIP_MODE_REPLACE && dummy_strip->influence == 1.0f)) {
- BLI_freelistN(&estrips);
- return true;
- }
- }
- }
- else {
- /* special case - evaluate as if there isn't any NLA data */
- BLI_freelistN(&estrips);
- return false;
- }
+ /* If NULL, then keyframing will fail. No need to do any more processing. */
+ if (!r_context->eval_strip) {
+ BLI_freelistN(&lower_estrips);
+ return;
}
- /* only continue if there are strips to evaluate */
- if (BLI_listbase_is_empty(&estrips)) {
- return true;
+ /* If tweak strip is full REPLACE, then lower strips not needed. */
+ if (r_context->strip.blendmode == NLASTRIP_MODE_REPLACE &&
+ IS_EQF(r_context->strip.influence, 1.0f)) {
+ BLI_freelistN(&lower_estrips);
+ return;
}
- /* 2. for each strip, evaluate then accumulate on top of existing channels,
- * but don't set values yet. */
- for (nes = estrips.first; nes; nes = nes->next) {
+ /* For each strip, evaluate then accumulate on top of existing channels. */
+ for (nes = lower_estrips.first; nes; nes = nes->next) {
nlastrip_evaluate(ptr,
- echannels,
+ &r_context->lower_eval_data,
NULL,
nes,
- &echannels->eval_snapshot,
+ &r_context->lower_eval_data.eval_snapshot,
anim_eval_context,
- flush_to_original);
+ false);
}
- /* 3. free temporary evaluation data that's not used elsewhere */
- BLI_freelistN(&estrips);
- return true;
+ /* Free temporary evaluation data that's not used elsewhere. */
+ BLI_freelistN(&lower_estrips);
}
/* NLA Evaluation function (mostly for use through do_animdata)
@@ -2412,7 +2460,7 @@ static void animsys_calculate_nla(PointerRNA *ptr,
nlaeval_init(&echannels);
/* evaluate the NLA stack, obtaining a set of values to flush */
- if (animsys_evaluate_nla(&echannels, ptr, adt, anim_eval_context, flush_to_original, NULL)) {
+ if (animsys_evaluate_nla_for_flush(&echannels, ptr, adt, anim_eval_context, flush_to_original)) {
/* reset any channels touched by currently inactive actions to default value */
animsys_evaluate_nla_domain(ptr, &echannels, adt);
@@ -2435,6 +2483,106 @@ static void animsys_calculate_nla(PointerRNA *ptr,
/* ---------------------- */
+void nlasnapshot_enable_all_blend_domain(NlaEvalSnapshot *snapshot)
+{
+ for (int i = 0; i < snapshot->size; i++) {
+ NlaEvalChannelSnapshot *necs = nlaeval_snapshot_get(snapshot, i);
+ if (necs == NULL) {
+ continue;
+ }
+
+ BLI_bitmap_set_all(necs->blend_domain.ptr, true, necs->length);
+ }
+}
+
+void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapshot)
+{
+ LISTBASE_FOREACH (NlaEvalChannel *, nec, &eval_data->channels) {
+ nlaeval_snapshot_ensure_channel(snapshot, nec);
+ }
+}
+
+/** Blends the \a lower_snapshot with the \a upper_snapshot into \a r_blended_snapshot according
+ * to the given \a upper_blendmode and \a upper_influence.
+ *
+ * For \a upper_snapshot, blending limited to values in the \a blend_domain. For Replace blendmode,
+ * this allows the upper snapshot to have a location XYZ channel where only a subset of values are
+ * blended.
+ */
+void nlasnapshot_blend(NlaEvalData *eval_data,
+ NlaEvalSnapshot *lower_snapshot,
+ NlaEvalSnapshot *upper_snapshot,
+ const short upper_blendmode,
+ const float upper_influence,
+ NlaEvalSnapshot *r_blended_snapshot)
+{
+ nlaeval_snapshot_ensure_size(r_blended_snapshot, eval_data->num_channels);
+
+ const bool zero_upper_influence = IS_EQF(upper_influence, 0.0f);
+
+ LISTBASE_FOREACH (NlaEvalChannel *, nec, &eval_data->channels) {
+ const int length = nec->base_snapshot.length;
+
+ NlaEvalChannelSnapshot *upper_necs = nlaeval_snapshot_get(upper_snapshot, nec->index);
+ NlaEvalChannelSnapshot *lower_necs = nlaeval_snapshot_get(lower_snapshot, nec->index);
+ if (upper_necs == NULL && lower_necs == NULL) {
+ continue;
+ }
+
+ /** Blend with lower_snapshot's base or default. */
+ if (lower_necs == NULL) {
+ lower_necs = nlaeval_snapshot_find_channel(lower_snapshot->base, nec);
+ }
+
+ NlaEvalChannelSnapshot *result_necs = nlaeval_snapshot_ensure_channel(r_blended_snapshot, nec);
+
+ /** Always copy \a lower_snapshot to result, irrelevant of whether \a upper_snapshot has a
+ * corresponding channel. This only matters when \a lower_snapshot not the same as
+ * \a r_blended_snapshot. */
+ memcpy(result_necs->values, lower_necs->values, length * sizeof(float));
+ if (upper_necs == NULL || zero_upper_influence) {
+ continue;
+ }
+
+ if (upper_blendmode == NLASTRIP_MODE_COMBINE) {
+ const int mix_mode = nec->mix_mode;
+ if (mix_mode == NEC_MIX_QUATERNION) {
+ if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, 0)) {
+ continue;
+ }
+
+ nla_combine_quaternion(
+ lower_necs->values, upper_necs->values, upper_influence, result_necs->values);
+ }
+ else {
+ for (int j = 0; j < length; j++) {
+ if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, j)) {
+ continue;
+ }
+
+ result_necs->values[j] = nla_combine_value(mix_mode,
+ nec->base_snapshot.values[j],
+ lower_necs->values[j],
+ upper_necs->values[j],
+ upper_influence);
+ }
+ }
+ }
+ else {
+ for (int j = 0; j < length; j++) {
+ if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, j)) {
+ continue;
+ }
+
+ result_necs->values[j] = nla_blend_value(
+ upper_blendmode, lower_necs->values[j], upper_necs->values[j], upper_influence);
+ }
+ }
+ }
+}
+
+/* ---------------------- */
+
/**
* Prepare data necessary to compute correct keyframe values for NLA strips
* with non-Replace mode or influence different from 1.
@@ -2448,8 +2596,7 @@ NlaKeyframingContext *BKE_animsys_get_nla_keyframing_context(
struct ListBase *cache,
struct PointerRNA *ptr,
struct AnimData *adt,
- const AnimationEvalContext *anim_eval_context,
- const bool flush_to_original)
+ const AnimationEvalContext *anim_eval_context)
{
/* No remapping needed if NLA is off or no action. */
if ((adt == NULL) || (adt->action == NULL) || (adt->nla_tracks.first == NULL) ||
@@ -2472,8 +2619,7 @@ NlaKeyframingContext *BKE_animsys_get_nla_keyframing_context(
ctx->adt = adt;
nlaeval_init(&ctx->lower_eval_data);
- animsys_evaluate_nla(
- &ctx->lower_eval_data, ptr, adt, anim_eval_context, flush_to_original, ctx);
+ animsys_evaluate_nla_for_keyframing(ptr, adt, anim_eval_context, ctx);
BLI_assert(ELEM(ctx->strip.act, NULL, adt->action));
BLI_addtail(cache, ctx);
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 4c9fb4b191a..a59ead84aca 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -331,6 +331,8 @@ IDTypeInfo IDType_ID_AR = {
.blend_read_expand = armature_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/** \} */
@@ -1889,9 +1891,8 @@ void BKE_armature_mat_pose_to_bone_ex(struct Depsgraph *depsgraph,
* bone loc/sca/rot is ignored, scene and frame are not used. */
BKE_pose_where_is_bone(depsgraph, NULL, ob, &work_pchan, 0.0f, false);
- /* find the matrix, need to remove the bone transforms first so this is
- * calculated as a matrix to set rather than a difference ontop of what's
- * already there. */
+ /* Find the matrix, need to remove the bone transforms first so this is calculated
+ * as a matrix to set rather than a difference on top of what's already there. */
unit_m4(outmat);
BKE_pchan_apply_mat4(&work_pchan, outmat, false);
@@ -1943,7 +1944,7 @@ void BKE_pchan_rot_to_mat3(const bPoseChannel *pchan, float r_mat[3][3])
float quat[4];
/* NOTE: we now don't normalize the stored values anymore,
- * since this was kindof evil in some cases but if this proves to be too problematic,
+ * since this was kind of evil in some cases but if this proves to be too problematic,
* switch back to the old system of operating directly on the stored copy. */
normalize_qt_qt(quat, pchan->quat);
quat_to_mat3(r_mat, quat);
diff --git a/source/blender/blenkernel/intern/armature_update.c b/source/blender/blenkernel/intern/armature_update.c
index 8c666597276..8f74b8ff054 100644
--- a/source/blender/blenkernel/intern/armature_update.c
+++ b/source/blender/blenkernel/intern/armature_update.c
@@ -428,8 +428,8 @@ static void splineik_evaluate_bone(
if (fabsf(scaleFac) != 0.0f) {
scale = 1.0f / fabsf(scaleFac);
- /* we need to clamp this within sensible values */
- /* NOTE: these should be fine for now, but should get sanitised in future */
+ /* We need to clamp this within sensible values. */
+ /* NOTE: these should be fine for now, but should get sanitized in future. */
CLAMP(scale, 0.0001f, 100000.0f);
}
else {
@@ -483,7 +483,7 @@ static void splineik_evaluate_bone(
final_scale = 1.0f;
}
- /* apply the scaling (assuming normalised scale) */
+ /* Apply the scaling (assuming normalized scale). */
mul_v3_fl(poseMat[0], final_scale);
mul_v3_fl(poseMat[2], final_scale);
break;
diff --git a/source/blender/blenkernel/intern/asset.c b/source/blender/blenkernel/intern/asset.cc
index 7ccb0aa2b57..b5a7f5e37a6 100644
--- a/source/blender/blenkernel/intern/asset.c
+++ b/source/blender/blenkernel/intern/asset.cc
@@ -18,7 +18,11 @@
* \ingroup bke
*/
-#include <string.h>
+#include <cstring>
+
+#include "DNA_ID.h"
+#include "DNA_asset_types.h"
+#include "DNA_defaults.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
@@ -29,17 +33,13 @@
#include "BKE_icons.h"
#include "BKE_idprop.h"
-#include "DNA_ID.h"
-#include "DNA_asset_types.h"
-#include "DNA_defaults.h"
-
#include "BLO_read_write.h"
#include "MEM_guardedalloc.h"
AssetMetaData *BKE_asset_metadata_create(void)
{
- AssetMetaData *asset_data = MEM_callocN(sizeof(*asset_data), __func__);
+ AssetMetaData *asset_data = (AssetMetaData *)MEM_callocN(sizeof(*asset_data), __func__);
memcpy(asset_data, DNA_struct_default_get(AssetMetaData), sizeof(*asset_data));
return asset_data;
}
@@ -57,7 +57,7 @@ void BKE_asset_metadata_free(AssetMetaData **asset_data)
static AssetTag *asset_metadata_tag_add(AssetMetaData *asset_data, const char *const name)
{
- AssetTag *tag = MEM_callocN(sizeof(*tag), __func__);
+ AssetTag *tag = (AssetTag *)MEM_callocN(sizeof(*tag), __func__);
BLI_strncpy(tag->name, name, sizeof(tag->name));
BLI_addtail(&asset_data->tags, tag);
@@ -81,12 +81,12 @@ AssetTag *BKE_asset_metadata_tag_add(AssetMetaData *asset_data, const char *name
struct AssetTagEnsureResult BKE_asset_metadata_tag_ensure(AssetMetaData *asset_data,
const char *name)
{
- struct AssetTagEnsureResult result = {.tag = NULL};
+ struct AssetTagEnsureResult result = {nullptr};
if (!name[0]) {
return result;
}
- AssetTag *tag = BLI_findstring(&asset_data->tags, name, offsetof(AssetTag, name));
+ AssetTag *tag = (AssetTag *)BLI_findstring(&asset_data->tags, name, offsetof(AssetTag, name));
if (tag) {
result.tag = tag;
diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc
index e1e8d06b9ec..2146dc805d1 100644
--- a/source/blender/blenkernel/intern/attribute_access.cc
+++ b/source/blender/blenkernel/intern/attribute_access.cc
@@ -17,6 +17,7 @@
#include <utility>
#include "BKE_attribute_access.hh"
+#include "BKE_attribute_math.hh"
#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_geometry_set.hh"
@@ -323,29 +324,47 @@ template<typename T> class ArrayReadAttribute final : public ReadAttribute {
}
};
-template<typename StructT, typename ElemT, typename GetFuncT, typename SetFuncT>
+template<typename T> class OwnedArrayReadAttribute final : public ReadAttribute {
+ private:
+ Array<T> data_;
+
+ public:
+ OwnedArrayReadAttribute(AttributeDomain domain, Array<T> data)
+ : ReadAttribute(domain, CPPType::get<T>(), data.size()), data_(std::move(data))
+ {
+ }
+
+ void get_internal(const int64_t index, void *r_value) const override
+ {
+ new (r_value) T(data_[index]);
+ }
+
+ void initialize_span() const override
+ {
+ /* The data will not be modified, so this const_cast is fine. */
+ array_buffer_ = const_cast<T *>(data_.data());
+ array_is_temporary_ = false;
+ }
+};
+
+template<typename StructT,
+ typename ElemT,
+ ElemT (*GetFunc)(const StructT &),
+ void (*SetFunc)(StructT &, const ElemT &)>
class DerivedArrayWriteAttribute final : public WriteAttribute {
private:
MutableSpan<StructT> data_;
- GetFuncT get_function_;
- SetFuncT set_function_;
public:
- DerivedArrayWriteAttribute(AttributeDomain domain,
- MutableSpan<StructT> data,
- GetFuncT get_function,
- SetFuncT set_function)
- : WriteAttribute(domain, CPPType::get<ElemT>(), data.size()),
- data_(data),
- get_function_(std::move(get_function)),
- set_function_(std::move(set_function))
+ DerivedArrayWriteAttribute(AttributeDomain domain, MutableSpan<StructT> data)
+ : WriteAttribute(domain, CPPType::get<ElemT>(), data.size()), data_(data)
{
}
void get_internal(const int64_t index, void *r_value) const override
{
const StructT &struct_value = data_[index];
- const ElemT value = get_function_(struct_value);
+ const ElemT value = GetFunc(struct_value);
new (r_value) ElemT(value);
}
@@ -353,28 +372,25 @@ class DerivedArrayWriteAttribute final : public WriteAttribute {
{
StructT &struct_value = data_[index];
const ElemT &typed_value = *reinterpret_cast<const ElemT *>(value);
- set_function_(struct_value, typed_value);
+ SetFunc(struct_value, typed_value);
}
};
-template<typename StructT, typename ElemT, typename GetFuncT>
+template<typename StructT, typename ElemT, ElemT (*GetFunc)(const StructT &)>
class DerivedArrayReadAttribute final : public ReadAttribute {
private:
Span<StructT> data_;
- GetFuncT get_function_;
public:
- DerivedArrayReadAttribute(AttributeDomain domain, Span<StructT> data, GetFuncT get_function)
- : ReadAttribute(domain, CPPType::get<ElemT>(), data.size()),
- data_(data),
- get_function_(std::move(get_function))
+ DerivedArrayReadAttribute(AttributeDomain domain, Span<StructT> data)
+ : ReadAttribute(domain, CPPType::get<ElemT>(), data.size()), data_(data)
{
}
void get_internal(const int64_t index, void *r_value) const override
{
const StructT &struct_value = data_[index];
- const ElemT value = get_function_(struct_value);
+ const ElemT value = GetFunc(struct_value);
new (r_value) ElemT(value);
}
};
@@ -492,133 +508,1075 @@ CustomDataType cpp_type_to_custom_data_type(const blender::fn::CPPType &type)
return static_cast<CustomDataType>(-1);
}
-} // namespace blender::bke
+static int attribute_data_type_complexity(const CustomDataType data_type)
+{
+ switch (data_type) {
+ case CD_PROP_BOOL:
+ return 0;
+ case CD_PROP_INT32:
+ return 1;
+ case CD_PROP_FLOAT:
+ return 2;
+ case CD_PROP_FLOAT2:
+ return 3;
+ case CD_PROP_FLOAT3:
+ return 4;
+ case CD_PROP_COLOR:
+ return 5;
+#if 0 /* These attribute types are not supported yet. */
+ case CD_MLOOPCOL:
+ return 3;
+ case CD_PROP_STRING:
+ return 6;
+#endif
+ default:
+ /* Only accept "generic" custom data types used by the attribute system. */
+ BLI_assert(false);
+ return 0;
+ }
+}
-/* -------------------------------------------------------------------- */
-/** \name Utilities for Accessing Attributes
- * \{ */
+CustomDataType attribute_data_type_highest_complexity(Span<CustomDataType> data_types)
+{
+ int highest_complexity = INT_MIN;
+ CustomDataType most_complex_type = CD_PROP_COLOR;
+
+ for (const CustomDataType data_type : data_types) {
+ const int complexity = attribute_data_type_complexity(data_type);
+ if (complexity > highest_complexity) {
+ highest_complexity = complexity;
+ most_complex_type = data_type;
+ }
+ }
+
+ return most_complex_type;
+}
-static ReadAttributePtr read_attribute_from_custom_data(const CustomData &custom_data,
- const int size,
- const StringRef attribute_name,
- const AttributeDomain domain)
+/**
+ * \note Generally the order should mirror the order of the domains
+ * established in each component's ComponentAttributeProviders.
+ */
+static int attribute_domain_priority(const AttributeDomain domain)
{
- using namespace blender;
- using namespace blender::bke;
- for (const CustomDataLayer &layer : Span(custom_data.layers, custom_data.totlayer)) {
- if (layer.name != nullptr && layer.name == attribute_name) {
- switch (layer.type) {
+ switch (domain) {
+#if 0
+ case ATTR_DOMAIN_CURVE:
+ return 0;
+#endif
+ case ATTR_DOMAIN_POLYGON:
+ return 1;
+ case ATTR_DOMAIN_EDGE:
+ return 2;
+ case ATTR_DOMAIN_POINT:
+ return 3;
+ case ATTR_DOMAIN_CORNER:
+ return 4;
+ default:
+ /* Domain not supported in nodes yet. */
+ BLI_assert(false);
+ return 0;
+ }
+}
+
+/**
+ * Domains with a higher "information density" have a higher priority, in order
+ * to choose a domain that will not lose data through domain conversion.
+ */
+AttributeDomain attribute_domain_highest_priority(Span<AttributeDomain> domains)
+{
+ int highest_priority = INT_MIN;
+ AttributeDomain highest_priority_domain = ATTR_DOMAIN_CORNER;
+
+ for (const AttributeDomain domain : domains) {
+ const int priority = attribute_domain_priority(domain);
+ if (priority > highest_priority) {
+ highest_priority = priority;
+ highest_priority_domain = domain;
+ }
+ }
+
+ return highest_priority_domain;
+}
+
+/**
+ * A #BuiltinAttributeProvider is responsible for exactly one attribute on a geometry component.
+ * The attribute is identified by its name and has a fixed domain and type. Builtin attributes do
+ * not follow the same loose rules as other attributes, because they are mapped to internal
+ * "legacy" data structures. For example, some builtin attributes cannot be deleted. */
+class BuiltinAttributeProvider {
+ public:
+ /* Some utility enums to avoid hard to read booleans in function calls. */
+ enum CreatableEnum {
+ Creatable,
+ NonCreatable,
+ };
+ enum WritableEnum {
+ Writable,
+ Readonly,
+ };
+ enum DeletableEnum {
+ Deletable,
+ NonDeletable,
+ };
+
+ protected:
+ const std::string name_;
+ const AttributeDomain domain_;
+ const CustomDataType data_type_;
+ const CreatableEnum createable_;
+ const WritableEnum writable_;
+ const DeletableEnum deletable_;
+
+ public:
+ BuiltinAttributeProvider(std::string name,
+ const AttributeDomain domain,
+ const CustomDataType data_type,
+ const CreatableEnum createable,
+ const WritableEnum writable,
+ const DeletableEnum deletable)
+ : name_(std::move(name)),
+ domain_(domain),
+ data_type_(data_type),
+ createable_(createable),
+ writable_(writable),
+ deletable_(deletable)
+ {
+ }
+
+ virtual ReadAttributePtr try_get_for_read(const GeometryComponent &component) const = 0;
+ virtual WriteAttributePtr try_get_for_write(GeometryComponent &component) const = 0;
+ virtual bool try_delete(GeometryComponent &component) const = 0;
+ virtual bool try_create(GeometryComponent &UNUSED(component)) const = 0;
+ virtual bool exists(const GeometryComponent &component) const = 0;
+
+ StringRefNull name() const
+ {
+ return name_;
+ }
+
+ AttributeDomain domain() const
+ {
+ return domain_;
+ }
+
+ CustomDataType data_type() const
+ {
+ return data_type_;
+ }
+};
+
+/**
+ * A #DynamicAttributesProvider manages a set of named attributes on a geometry component. Each
+ * attribute has a name, domain and type.
+ */
+class DynamicAttributesProvider {
+ public:
+ virtual ReadAttributePtr try_get_for_read(const GeometryComponent &component,
+ const StringRef attribute_name) const = 0;
+ virtual WriteAttributePtr try_get_for_write(GeometryComponent &component,
+ const StringRef attribute_name) const = 0;
+ virtual bool try_delete(GeometryComponent &component, const StringRef attribute_name) const = 0;
+ virtual bool try_create(GeometryComponent &UNUSED(component),
+ const StringRef UNUSED(attribute_name),
+ const AttributeDomain UNUSED(domain),
+ const CustomDataType UNUSED(data_type)) const
+ {
+ /* Some providers should not create new attributes. */
+ return false;
+ };
+
+ virtual bool foreach_attribute(const GeometryComponent &component,
+ const AttributeForeachCallback callback) const = 0;
+ virtual void supported_domains(Vector<AttributeDomain> &r_domains) const = 0;
+};
+
+/**
+ * Utility to group together multiple functions that are used to access custom data on geometry
+ * components in a generic way.
+ */
+struct CustomDataAccessInfo {
+ using CustomDataGetter = CustomData *(*)(GeometryComponent &component);
+ using ConstCustomDataGetter = const CustomData *(*)(const GeometryComponent &component);
+ using UpdateCustomDataPointers = void (*)(GeometryComponent &component);
+
+ CustomDataGetter get_custom_data;
+ ConstCustomDataGetter get_const_custom_data;
+ UpdateCustomDataPointers update_custom_data_pointers;
+};
+
+/**
+ * This provider is used to provide access to builtin attributes. It supports making internal types
+ * available as different types. For example, the vertex position attribute is stored as part of
+ * the #MVert struct, but is exposed as float3 attribute.
+ */
+class BuiltinCustomDataLayerProvider final : public BuiltinAttributeProvider {
+ using AsReadAttribute = ReadAttributePtr (*)(const void *data, const int domain_size);
+ using AsWriteAttribute = WriteAttributePtr (*)(void *data, const int domain_size);
+ using UpdateOnWrite = void (*)(GeometryComponent &component);
+ const CustomDataType stored_type_;
+ const CustomDataAccessInfo custom_data_access_;
+ const AsReadAttribute as_read_attribute_;
+ const AsWriteAttribute as_write_attribute_;
+ const UpdateOnWrite update_on_write_;
+
+ public:
+ BuiltinCustomDataLayerProvider(std::string attribute_name,
+ const AttributeDomain domain,
+ const CustomDataType attribute_type,
+ const CustomDataType stored_type,
+ const CreatableEnum creatable,
+ const WritableEnum writable,
+ const DeletableEnum deletable,
+ const CustomDataAccessInfo custom_data_access,
+ const AsReadAttribute as_read_attribute,
+ const AsWriteAttribute as_write_attribute,
+ const UpdateOnWrite update_on_write)
+ : BuiltinAttributeProvider(
+ std::move(attribute_name), domain, attribute_type, creatable, writable, deletable),
+ stored_type_(stored_type),
+ custom_data_access_(custom_data_access),
+ as_read_attribute_(as_read_attribute),
+ as_write_attribute_(as_write_attribute),
+ update_on_write_(update_on_write)
+ {
+ }
+
+ ReadAttributePtr try_get_for_read(const GeometryComponent &component) const final
+ {
+ const CustomData *custom_data = custom_data_access_.get_const_custom_data(component);
+ if (custom_data == nullptr) {
+ return {};
+ }
+ const int domain_size = component.attribute_domain_size(domain_);
+ const void *data = CustomData_get_layer(custom_data, stored_type_);
+ if (data == nullptr) {
+ return {};
+ }
+ return as_read_attribute_(data, domain_size);
+ }
+
+ WriteAttributePtr try_get_for_write(GeometryComponent &component) const final
+ {
+ if (writable_ != Writable) {
+ return {};
+ }
+ CustomData *custom_data = custom_data_access_.get_custom_data(component);
+ if (custom_data == nullptr) {
+ return {};
+ }
+ const int domain_size = component.attribute_domain_size(domain_);
+ void *data = CustomData_get_layer(custom_data, stored_type_);
+ if (data == nullptr) {
+ return {};
+ }
+ void *new_data = CustomData_duplicate_referenced_layer(custom_data, stored_type_, domain_size);
+ if (data != new_data) {
+ custom_data_access_.update_custom_data_pointers(component);
+ data = new_data;
+ }
+ if (update_on_write_ != nullptr) {
+ update_on_write_(component);
+ }
+ return as_write_attribute_(data, domain_size);
+ }
+
+ bool try_delete(GeometryComponent &component) const final
+ {
+ if (deletable_ != Deletable) {
+ return false;
+ }
+ CustomData *custom_data = custom_data_access_.get_custom_data(component);
+ if (custom_data == nullptr) {
+ return {};
+ }
+
+ const int domain_size = component.attribute_domain_size(domain_);
+ const int layer_index = CustomData_get_layer_index(custom_data, stored_type_);
+ const bool delete_success = CustomData_free_layer(
+ custom_data, stored_type_, domain_size, layer_index);
+ if (delete_success) {
+ custom_data_access_.update_custom_data_pointers(component);
+ }
+ return delete_success;
+ }
+
+ bool try_create(GeometryComponent &component) const final
+ {
+ if (createable_ != Creatable) {
+ return false;
+ }
+ CustomData *custom_data = custom_data_access_.get_custom_data(component);
+ if (custom_data == nullptr) {
+ return false;
+ }
+ if (CustomData_get_layer(custom_data, stored_type_) != nullptr) {
+ /* Exists already. */
+ return false;
+ }
+ const int domain_size = component.attribute_domain_size(domain_);
+ const void *data = CustomData_add_layer(
+ custom_data, stored_type_, CD_DEFAULT, nullptr, domain_size);
+ const bool success = data != nullptr;
+ if (success) {
+ custom_data_access_.update_custom_data_pointers(component);
+ }
+ return success;
+ }
+
+ bool exists(const GeometryComponent &component) const final
+ {
+ const CustomData *custom_data = custom_data_access_.get_const_custom_data(component);
+ if (custom_data == nullptr) {
+ return false;
+ }
+ const void *data = CustomData_get_layer(custom_data, stored_type_);
+ return data != nullptr;
+ }
+};
+
+/**
+ * This is the attribute provider for most user generated attributes.
+ */
+class CustomDataAttributeProvider final : public DynamicAttributesProvider {
+ private:
+ static constexpr uint64_t supported_types_mask = CD_MASK_PROP_FLOAT | CD_MASK_PROP_FLOAT2 |
+ CD_MASK_PROP_FLOAT3 | CD_MASK_PROP_INT32 |
+ CD_MASK_PROP_COLOR | CD_MASK_PROP_BOOL;
+ const AttributeDomain domain_;
+ const CustomDataAccessInfo custom_data_access_;
+
+ public:
+ CustomDataAttributeProvider(const AttributeDomain domain,
+ const CustomDataAccessInfo custom_data_access)
+ : domain_(domain), custom_data_access_(custom_data_access)
+ {
+ }
+
+ ReadAttributePtr try_get_for_read(const GeometryComponent &component,
+ const StringRef attribute_name) const final
+ {
+ const CustomData *custom_data = custom_data_access_.get_const_custom_data(component);
+ if (custom_data == nullptr) {
+ return {};
+ }
+ const int domain_size = component.attribute_domain_size(domain_);
+ for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) {
+ if (layer.name != attribute_name) {
+ continue;
+ }
+ const CustomDataType data_type = (CustomDataType)layer.type;
+ switch (data_type) {
case CD_PROP_FLOAT:
- return std::make_unique<ArrayReadAttribute<float>>(
- domain, Span(static_cast<float *>(layer.data), size));
+ return this->layer_to_read_attribute<float>(layer, domain_size);
case CD_PROP_FLOAT2:
- return std::make_unique<ArrayReadAttribute<float2>>(
- domain, Span(static_cast<float2 *>(layer.data), size));
+ return this->layer_to_read_attribute<float2>(layer, domain_size);
case CD_PROP_FLOAT3:
- return std::make_unique<ArrayReadAttribute<float3>>(
- domain, Span(static_cast<float3 *>(layer.data), size));
+ return this->layer_to_read_attribute<float3>(layer, domain_size);
case CD_PROP_INT32:
- return std::make_unique<ArrayReadAttribute<int>>(
- domain, Span(static_cast<int *>(layer.data), size));
+ return this->layer_to_read_attribute<int>(layer, domain_size);
case CD_PROP_COLOR:
- return std::make_unique<ArrayReadAttribute<Color4f>>(
- domain, Span(static_cast<Color4f *>(layer.data), size));
+ return this->layer_to_read_attribute<Color4f>(layer, domain_size);
case CD_PROP_BOOL:
- return std::make_unique<ArrayReadAttribute<bool>>(
- domain, Span(static_cast<bool *>(layer.data), size));
+ return this->layer_to_read_attribute<bool>(layer, domain_size);
+ default:
+ break;
}
}
+ return {};
}
- return {};
-}
-static WriteAttributePtr write_attribute_from_custom_data(
- CustomData &custom_data,
- const int size,
- const StringRef attribute_name,
- const AttributeDomain domain,
- const std::function<void()> &update_customdata_pointers)
-{
-
- using namespace blender;
- using namespace blender::bke;
- for (const CustomDataLayer &layer : Span(custom_data.layers, custom_data.totlayer)) {
- if (layer.name != nullptr && layer.name == attribute_name) {
- const void *data_before = layer.data;
- /* The data layer might be shared with someone else. Since the caller wants to modify it, we
- * copy it first. */
- CustomData_duplicate_referenced_layer_named(&custom_data, layer.type, layer.name, size);
- if (data_before != layer.data) {
- update_customdata_pointers();
+ WriteAttributePtr try_get_for_write(GeometryComponent &component,
+ const StringRef attribute_name) const final
+ {
+ CustomData *custom_data = custom_data_access_.get_custom_data(component);
+ if (custom_data == nullptr) {
+ return {};
+ }
+ const int domain_size = component.attribute_domain_size(domain_);
+ for (CustomDataLayer &layer : MutableSpan(custom_data->layers, custom_data->totlayer)) {
+ if (layer.name != attribute_name) {
+ continue;
}
- switch (layer.type) {
+ CustomData_duplicate_referenced_layer_named(
+ custom_data, layer.type, layer.name, domain_size);
+ const CustomDataType data_type = (CustomDataType)layer.type;
+ switch (data_type) {
case CD_PROP_FLOAT:
- return std::make_unique<ArrayWriteAttribute<float>>(
- domain, MutableSpan(static_cast<float *>(layer.data), size));
+ return this->layer_to_write_attribute<float>(layer, domain_size);
case CD_PROP_FLOAT2:
- return std::make_unique<ArrayWriteAttribute<float2>>(
- domain, MutableSpan(static_cast<float2 *>(layer.data), size));
+ return this->layer_to_write_attribute<float2>(layer, domain_size);
case CD_PROP_FLOAT3:
- return std::make_unique<ArrayWriteAttribute<float3>>(
- domain, MutableSpan(static_cast<float3 *>(layer.data), size));
+ return this->layer_to_write_attribute<float3>(layer, domain_size);
case CD_PROP_INT32:
- return std::make_unique<ArrayWriteAttribute<int>>(
- domain, MutableSpan(static_cast<int *>(layer.data), size));
+ return this->layer_to_write_attribute<int>(layer, domain_size);
case CD_PROP_COLOR:
- return std::make_unique<ArrayWriteAttribute<Color4f>>(
- domain, MutableSpan(static_cast<Color4f *>(layer.data), size));
+ return this->layer_to_write_attribute<Color4f>(layer, domain_size);
case CD_PROP_BOOL:
- return std::make_unique<ArrayWriteAttribute<bool>>(
- domain, MutableSpan(static_cast<bool *>(layer.data), size));
+ return this->layer_to_write_attribute<bool>(layer, domain_size);
+ default:
+ break;
}
}
+ return {};
}
- return {};
+
+ bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final
+ {
+ CustomData *custom_data = custom_data_access_.get_custom_data(component);
+ if (custom_data == nullptr) {
+ return false;
+ }
+ const int domain_size = component.attribute_domain_size(domain_);
+ for (const int i : IndexRange(custom_data->totlayer)) {
+ const CustomDataLayer &layer = custom_data->layers[i];
+ if (this->type_is_supported((CustomDataType)layer.type) && layer.name == attribute_name) {
+ CustomData_free_layer(custom_data, layer.type, domain_size, i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool try_create(GeometryComponent &component,
+ const StringRef attribute_name,
+ const AttributeDomain domain,
+ const CustomDataType data_type) const final
+ {
+ if (domain_ != domain) {
+ return false;
+ }
+ if (!this->type_is_supported(data_type)) {
+ return false;
+ }
+ CustomData *custom_data = custom_data_access_.get_custom_data(component);
+ if (custom_data == nullptr) {
+ return false;
+ }
+ for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) {
+ if (layer.name == attribute_name) {
+ return false;
+ }
+ }
+ const int domain_size = component.attribute_domain_size(domain_);
+ char attribute_name_c[MAX_NAME];
+ attribute_name.copy(attribute_name_c);
+ CustomData_add_layer_named(
+ custom_data, data_type, CD_DEFAULT, nullptr, domain_size, attribute_name_c);
+ return true;
+ }
+
+ bool foreach_attribute(const GeometryComponent &component,
+ const AttributeForeachCallback callback) const final
+ {
+ const CustomData *custom_data = custom_data_access_.get_const_custom_data(component);
+ if (custom_data == nullptr) {
+ return true;
+ }
+ for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) {
+ const CustomDataType data_type = (CustomDataType)layer.type;
+ if (this->type_is_supported(data_type)) {
+ AttributeMetaData meta_data{domain_, data_type};
+ if (!callback(layer.name, meta_data)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ void supported_domains(Vector<AttributeDomain> &r_domains) const final
+ {
+ r_domains.append_non_duplicates(domain_);
+ }
+
+ private:
+ template<typename T>
+ ReadAttributePtr layer_to_read_attribute(const CustomDataLayer &layer,
+ const int domain_size) const
+ {
+ return std::make_unique<ArrayReadAttribute<T>>(
+ domain_, Span(static_cast<const T *>(layer.data), domain_size));
+ }
+
+ template<typename T>
+ WriteAttributePtr layer_to_write_attribute(CustomDataLayer &layer, const int domain_size) const
+ {
+ return std::make_unique<ArrayWriteAttribute<T>>(
+ domain_, MutableSpan(static_cast<T *>(layer.data), domain_size));
+ }
+
+ bool type_is_supported(CustomDataType data_type) const
+ {
+ return ((1ULL << data_type) & supported_types_mask) != 0;
+ }
+};
+
+static Mesh *get_mesh_from_component_for_write(GeometryComponent &component)
+{
+ BLI_assert(component.type() == GeometryComponentType::Mesh);
+ MeshComponent &mesh_component = static_cast<MeshComponent &>(component);
+ return mesh_component.get_for_write();
}
-/* Returns true when the layer was found and is deleted. */
-static bool delete_named_custom_data_layer(CustomData &custom_data,
- const StringRef attribute_name,
- const int size)
+static const Mesh *get_mesh_from_component_for_read(const GeometryComponent &component)
{
- for (const int index : blender::IndexRange(custom_data.totlayer)) {
- const CustomDataLayer &layer = custom_data.layers[index];
- if (layer.name == attribute_name) {
- CustomData_free_layer(&custom_data, layer.type, size, index);
+ BLI_assert(component.type() == GeometryComponentType::Mesh);
+ const MeshComponent &mesh_component = static_cast<const MeshComponent &>(component);
+ return mesh_component.get_for_read();
+}
+
+/**
+ * This attribute provider is used for uv maps and vertex colors.
+ */
+class NamedLegacyCustomDataProvider final : public DynamicAttributesProvider {
+ private:
+ using AsReadAttribute = ReadAttributePtr (*)(const void *data, const int domain_size);
+ using AsWriteAttribute = WriteAttributePtr (*)(void *data, const int domain_size);
+ const AttributeDomain domain_;
+ const CustomDataType attribute_type_;
+ const CustomDataType stored_type_;
+ const CustomDataAccessInfo custom_data_access_;
+ const AsReadAttribute as_read_attribute_;
+ const AsWriteAttribute as_write_attribute_;
+
+ public:
+ NamedLegacyCustomDataProvider(const AttributeDomain domain,
+ const CustomDataType attribute_type,
+ const CustomDataType stored_type,
+ const CustomDataAccessInfo custom_data_access,
+ const AsReadAttribute as_read_attribute,
+ const AsWriteAttribute as_write_attribute)
+ : domain_(domain),
+ attribute_type_(attribute_type),
+ stored_type_(stored_type),
+ custom_data_access_(custom_data_access),
+ as_read_attribute_(as_read_attribute),
+ as_write_attribute_(as_write_attribute)
+ {
+ }
+
+ ReadAttributePtr try_get_for_read(const GeometryComponent &component,
+ const StringRef attribute_name) const final
+ {
+ const CustomData *custom_data = custom_data_access_.get_const_custom_data(component);
+ if (custom_data == nullptr) {
+ return {};
+ }
+ for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) {
+ if (layer.type == stored_type_) {
+ if (layer.name == attribute_name) {
+ const int domain_size = component.attribute_domain_size(domain_);
+ return as_read_attribute_(layer.data, domain_size);
+ }
+ }
+ }
+ return {};
+ }
+
+ WriteAttributePtr try_get_for_write(GeometryComponent &component,
+ const StringRef attribute_name) const final
+ {
+ CustomData *custom_data = custom_data_access_.get_custom_data(component);
+ if (custom_data == nullptr) {
+ return {};
+ }
+ for (CustomDataLayer &layer : MutableSpan(custom_data->layers, custom_data->totlayer)) {
+ if (layer.type == stored_type_) {
+ if (layer.name == attribute_name) {
+ const int domain_size = component.attribute_domain_size(domain_);
+ void *data_old = layer.data;
+ void *data_new = CustomData_duplicate_referenced_layer_named(
+ custom_data, stored_type_, layer.name, domain_size);
+ if (data_old != data_new) {
+ custom_data_access_.update_custom_data_pointers(component);
+ }
+ return as_write_attribute_(layer.data, domain_size);
+ }
+ }
+ }
+ return {};
+ }
+
+ bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final
+ {
+ CustomData *custom_data = custom_data_access_.get_custom_data(component);
+ if (custom_data == nullptr) {
+ return false;
+ }
+ for (const int i : IndexRange(custom_data->totlayer)) {
+ const CustomDataLayer &layer = custom_data->layers[i];
+ if (layer.type == stored_type_) {
+ if (layer.name == attribute_name) {
+ const int domain_size = component.attribute_domain_size(domain_);
+ CustomData_free_layer(custom_data, stored_type_, domain_size, i);
+ custom_data_access_.update_custom_data_pointers(component);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ bool foreach_attribute(const GeometryComponent &component,
+ const AttributeForeachCallback callback) const final
+ {
+ const CustomData *custom_data = custom_data_access_.get_const_custom_data(component);
+ if (custom_data == nullptr) {
return true;
}
+ for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) {
+ if (layer.type == stored_type_) {
+ AttributeMetaData meta_data{domain_, attribute_type_};
+ if (!callback(layer.name, meta_data)) {
+ return false;
+ }
+ }
+ }
+ return true;
}
- return false;
+
+ void supported_domains(Vector<AttributeDomain> &r_domains) const final
+ {
+ r_domains.append_non_duplicates(domain_);
+ }
+};
+
+/**
+ * This provider makes vertex groups available as float attributes.
+ */
+class VertexGroupsAttributeProvider final : public DynamicAttributesProvider {
+ public:
+ ReadAttributePtr try_get_for_read(const GeometryComponent &component,
+ const StringRef attribute_name) const final
+ {
+ BLI_assert(component.type() == GeometryComponentType::Mesh);
+ const MeshComponent &mesh_component = static_cast<const MeshComponent &>(component);
+ const Mesh *mesh = mesh_component.get_for_read();
+ const int vertex_group_index = mesh_component.vertex_group_names().lookup_default_as(
+ attribute_name, -1);
+ if (vertex_group_index < 0) {
+ return {};
+ }
+ if (mesh == nullptr || mesh->dvert == nullptr) {
+ static const float default_value = 0.0f;
+ return std::make_unique<ConstantReadAttribute>(
+ ATTR_DOMAIN_POINT, mesh->totvert, CPPType::get<float>(), &default_value);
+ }
+ return std::make_unique<VertexWeightReadAttribute>(
+ mesh->dvert, mesh->totvert, vertex_group_index);
+ }
+
+ WriteAttributePtr try_get_for_write(GeometryComponent &component,
+ const StringRef attribute_name) const final
+ {
+ BLI_assert(component.type() == GeometryComponentType::Mesh);
+ MeshComponent &mesh_component = static_cast<MeshComponent &>(component);
+ Mesh *mesh = mesh_component.get_for_write();
+ if (mesh == nullptr) {
+ return {};
+ }
+ const int vertex_group_index = mesh_component.vertex_group_names().lookup_default_as(
+ attribute_name, -1);
+ if (vertex_group_index < 0) {
+ return {};
+ }
+ if (mesh->dvert == nullptr) {
+ BKE_object_defgroup_data_create(&mesh->id);
+ }
+ else {
+ /* Copy the data layer if it is shared with some other mesh. */
+ mesh->dvert = (MDeformVert *)CustomData_duplicate_referenced_layer(
+ &mesh->vdata, CD_MDEFORMVERT, mesh->totvert);
+ }
+ return std::make_unique<blender::bke::VertexWeightWriteAttribute>(
+ mesh->dvert, mesh->totvert, vertex_group_index);
+ }
+
+ bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final
+ {
+ BLI_assert(component.type() == GeometryComponentType::Mesh);
+ MeshComponent &mesh_component = static_cast<MeshComponent &>(component);
+
+ const int vertex_group_index = mesh_component.vertex_group_names().pop_default_as(
+ attribute_name, -1);
+ if (vertex_group_index < 0) {
+ return false;
+ }
+ Mesh *mesh = mesh_component.get_for_write();
+ if (mesh == nullptr) {
+ return true;
+ }
+ if (mesh->dvert == nullptr) {
+ return true;
+ }
+ for (MDeformVert &dvert : MutableSpan(mesh->dvert, mesh->totvert)) {
+ MDeformWeight *weight = BKE_defvert_find_index(&dvert, vertex_group_index);
+ BKE_defvert_remove_group(&dvert, weight);
+ }
+ return true;
+ }
+
+ bool foreach_attribute(const GeometryComponent &component,
+ const AttributeForeachCallback callback) const final
+ {
+ BLI_assert(component.type() == GeometryComponentType::Mesh);
+ const MeshComponent &mesh_component = static_cast<const MeshComponent &>(component);
+ for (const auto &item : mesh_component.vertex_group_names().items()) {
+ const StringRefNull name = item.key;
+ const int vertex_group_index = item.value;
+ if (vertex_group_index >= 0) {
+ AttributeMetaData meta_data{ATTR_DOMAIN_POINT, CD_PROP_FLOAT};
+ if (!callback(name, meta_data)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ void supported_domains(Vector<AttributeDomain> &r_domains) const final
+ {
+ r_domains.append_non_duplicates(ATTR_DOMAIN_POINT);
+ }
+};
+
+/**
+ * This is a container for multiple attribute providers that are used by one geometry component
+ * type (e.g. there is a set of attribute providers for mesh components).
+ */
+class ComponentAttributeProviders {
+ private:
+ /**
+ * Builtin attribute providers are identified by their name. Attribute names that are in this
+ * map will only be accessed using builtin attribute providers. Therefore, these providers have
+ * higher priority when an attribute name is looked up. Usually, that means that builtin
+ * providers are checked before dynamic ones.
+ */
+ Map<std::string, const BuiltinAttributeProvider *> builtin_attribute_providers_;
+ /**
+ * An ordered list of dynamic attribute providers. The order is important because that is order
+ * in which they are checked when an attribute is looked up.
+ */
+ Vector<const DynamicAttributesProvider *> dynamic_attribute_providers_;
+ /**
+ * All the domains that are supported by at least one of the providers above.
+ */
+ Vector<AttributeDomain> supported_domains_;
+
+ public:
+ ComponentAttributeProviders(Span<const BuiltinAttributeProvider *> builtin_attribute_providers,
+ Span<const DynamicAttributesProvider *> dynamic_attribute_providers)
+ : dynamic_attribute_providers_(dynamic_attribute_providers)
+ {
+ Set<AttributeDomain> domains;
+ for (const BuiltinAttributeProvider *provider : builtin_attribute_providers) {
+ /* Use #add_new to make sure that no two builtin attributes have the same name. */
+ builtin_attribute_providers_.add_new(provider->name(), provider);
+ supported_domains_.append_non_duplicates(provider->domain());
+ }
+ for (const DynamicAttributesProvider *provider : dynamic_attribute_providers) {
+ provider->supported_domains(supported_domains_);
+ }
+ }
+
+ const Map<std::string, const BuiltinAttributeProvider *> &builtin_attribute_providers() const
+ {
+ return builtin_attribute_providers_;
+ }
+
+ Span<const DynamicAttributesProvider *> dynamic_attribute_providers() const
+ {
+ return dynamic_attribute_providers_;
+ }
+
+ Span<AttributeDomain> supported_domains() const
+ {
+ return supported_domains_;
+ }
+};
+
+static float3 get_vertex_position(const MVert &vert)
+{
+ return float3(vert.co);
}
-static void get_custom_data_layer_attribute_names(const CustomData &custom_data,
- const GeometryComponent &component,
- const AttributeDomain domain,
- Set<std::string> &r_names)
+static void set_vertex_position(MVert &vert, const float3 &position)
{
- for (const CustomDataLayer &layer : blender::Span(custom_data.layers, custom_data.totlayer)) {
- if (component.attribute_domain_with_type_supported(domain,
- static_cast<CustomDataType>(layer.type))) {
- r_names.add(layer.name);
- }
+ copy_v3_v3(vert.co, position);
+}
+
+static ReadAttributePtr make_vertex_position_read_attribute(const void *data,
+ const int domain_size)
+{
+ return std::make_unique<DerivedArrayReadAttribute<MVert, float3, get_vertex_position>>(
+ ATTR_DOMAIN_POINT, Span<MVert>((const MVert *)data, domain_size));
+}
+
+static WriteAttributePtr make_vertex_position_write_attribute(void *data, const int domain_size)
+{
+ return std::make_unique<
+ DerivedArrayWriteAttribute<MVert, float3, get_vertex_position, set_vertex_position>>(
+ ATTR_DOMAIN_POINT, MutableSpan<MVert>((MVert *)data, domain_size));
+}
+
+static void tag_normals_dirty_when_writing_position(GeometryComponent &component)
+{
+ Mesh *mesh = get_mesh_from_component_for_write(component);
+ if (mesh != nullptr) {
+ mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
}
}
-/** \} */
+static int get_material_index(const MPoly &mpoly)
+{
+ return static_cast<int>(mpoly.mat_nr);
+}
+
+static void set_material_index(MPoly &mpoly, const int &index)
+{
+ mpoly.mat_nr = static_cast<short>(std::clamp(index, 0, SHRT_MAX));
+}
+
+static ReadAttributePtr make_material_index_read_attribute(const void *data, const int domain_size)
+{
+ return std::make_unique<DerivedArrayReadAttribute<MPoly, int, get_material_index>>(
+ ATTR_DOMAIN_POLYGON, Span<MPoly>((const MPoly *)data, domain_size));
+}
+
+static WriteAttributePtr make_material_index_write_attribute(void *data, const int domain_size)
+{
+ return std::make_unique<
+ DerivedArrayWriteAttribute<MPoly, int, get_material_index, set_material_index>>(
+ ATTR_DOMAIN_POLYGON, MutableSpan<MPoly>((MPoly *)data, domain_size));
+}
+
+static float2 get_loop_uv(const MLoopUV &uv)
+{
+ return float2(uv.uv);
+}
+
+static void set_loop_uv(MLoopUV &uv, const float2 &co)
+{
+ copy_v2_v2(uv.uv, co);
+}
+
+static ReadAttributePtr make_uvs_read_attribute(const void *data, const int domain_size)
+{
+ return std::make_unique<DerivedArrayReadAttribute<MLoopUV, float2, get_loop_uv>>(
+ ATTR_DOMAIN_CORNER, Span((const MLoopUV *)data, domain_size));
+}
+
+static WriteAttributePtr make_uvs_write_attribute(void *data, const int domain_size)
+{
+ return std::make_unique<DerivedArrayWriteAttribute<MLoopUV, float2, get_loop_uv, set_loop_uv>>(
+ ATTR_DOMAIN_CORNER, MutableSpan((MLoopUV *)data, domain_size));
+}
+
+static Color4f get_loop_color(const MLoopCol &col)
+{
+ Color4f value;
+ rgba_uchar_to_float(value, &col.r);
+ return value;
+}
+
+static void set_loop_color(MLoopCol &col, const Color4f &value)
+{
+ rgba_float_to_uchar(&col.r, value);
+}
+
+static ReadAttributePtr make_vertex_color_read_attribute(const void *data, const int domain_size)
+{
+ return std::make_unique<DerivedArrayReadAttribute<MLoopCol, Color4f, get_loop_color>>(
+ ATTR_DOMAIN_CORNER, Span((const MLoopCol *)data, domain_size));
+}
+
+static WriteAttributePtr make_vertex_color_write_attribute(void *data, const int domain_size)
+{
+ return std::make_unique<
+ DerivedArrayWriteAttribute<MLoopCol, Color4f, get_loop_color, set_loop_color>>(
+ ATTR_DOMAIN_CORNER, MutableSpan((MLoopCol *)data, domain_size));
+}
+
+template<typename T, AttributeDomain Domain>
+static ReadAttributePtr make_array_read_attribute(const void *data, const int domain_size)
+{
+ return std::make_unique<ArrayReadAttribute<T>>(Domain, Span<T>((const T *)data, domain_size));
+}
+
+template<typename T, AttributeDomain Domain>
+static WriteAttributePtr make_array_write_attribute(void *data, const int domain_size)
+{
+ return std::make_unique<ArrayWriteAttribute<T>>(Domain, MutableSpan<T>((T *)data, domain_size));
+}
+
+/**
+ * In this function all the attribute providers for a mesh component are created. Most data in this
+ * function is statically allocated, because it does not change over time.
+ */
+static ComponentAttributeProviders create_attribute_providers_for_mesh()
+{
+ static auto update_custom_data_pointers = [](GeometryComponent &component) {
+ Mesh *mesh = get_mesh_from_component_for_write(component);
+ if (mesh != nullptr) {
+ BKE_mesh_update_customdata_pointers(mesh, false);
+ }
+ };
+
+#define MAKE_MUTABLE_CUSTOM_DATA_GETTER(NAME) \
+ [](GeometryComponent &component) -> CustomData * { \
+ Mesh *mesh = get_mesh_from_component_for_write(component); \
+ return mesh ? &mesh->NAME : nullptr; \
+ }
+#define MAKE_CONST_CUSTOM_DATA_GETTER(NAME) \
+ [](const GeometryComponent &component) -> const CustomData * { \
+ const Mesh *mesh = get_mesh_from_component_for_read(component); \
+ return mesh ? &mesh->NAME : nullptr; \
+ }
+
+ static CustomDataAccessInfo corner_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(ldata),
+ MAKE_CONST_CUSTOM_DATA_GETTER(ldata),
+ update_custom_data_pointers};
+ static CustomDataAccessInfo point_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(vdata),
+ MAKE_CONST_CUSTOM_DATA_GETTER(vdata),
+ update_custom_data_pointers};
+ static CustomDataAccessInfo edge_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(edata),
+ MAKE_CONST_CUSTOM_DATA_GETTER(edata),
+ update_custom_data_pointers};
+ static CustomDataAccessInfo polygon_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(pdata),
+ MAKE_CONST_CUSTOM_DATA_GETTER(pdata),
+ update_custom_data_pointers};
+
+#undef MAKE_CONST_CUSTOM_DATA_GETTER
+#undef MAKE_MUTABLE_CUSTOM_DATA_GETTER
+
+ static BuiltinCustomDataLayerProvider position("position",
+ ATTR_DOMAIN_POINT,
+ CD_PROP_FLOAT3,
+ CD_MVERT,
+ BuiltinAttributeProvider::NonCreatable,
+ BuiltinAttributeProvider::Writable,
+ BuiltinAttributeProvider::NonDeletable,
+ point_access,
+ make_vertex_position_read_attribute,
+ make_vertex_position_write_attribute,
+ tag_normals_dirty_when_writing_position);
+
+ static BuiltinCustomDataLayerProvider material_index("material_index",
+ ATTR_DOMAIN_POLYGON,
+ CD_PROP_INT32,
+ CD_MPOLY,
+ BuiltinAttributeProvider::NonCreatable,
+ BuiltinAttributeProvider::Writable,
+ BuiltinAttributeProvider::NonDeletable,
+ polygon_access,
+ make_material_index_read_attribute,
+ make_material_index_write_attribute,
+ nullptr);
+
+ static NamedLegacyCustomDataProvider uvs(ATTR_DOMAIN_CORNER,
+ CD_PROP_FLOAT2,
+ CD_MLOOPUV,
+ corner_access,
+ make_uvs_read_attribute,
+ make_uvs_write_attribute);
+
+ static NamedLegacyCustomDataProvider vertex_colors(ATTR_DOMAIN_CORNER,
+ CD_PROP_COLOR,
+ CD_MLOOPCOL,
+ corner_access,
+ make_vertex_color_read_attribute,
+ make_vertex_color_write_attribute);
+
+ static VertexGroupsAttributeProvider vertex_groups;
+ static CustomDataAttributeProvider corner_custom_data(ATTR_DOMAIN_CORNER, corner_access);
+ static CustomDataAttributeProvider point_custom_data(ATTR_DOMAIN_POINT, point_access);
+ static CustomDataAttributeProvider edge_custom_data(ATTR_DOMAIN_EDGE, edge_access);
+ static CustomDataAttributeProvider polygon_custom_data(ATTR_DOMAIN_POLYGON, polygon_access);
+
+ return ComponentAttributeProviders({&position, &material_index},
+ {&uvs,
+ &vertex_colors,
+ &corner_custom_data,
+ &vertex_groups,
+ &point_custom_data,
+ &edge_custom_data,
+ &polygon_custom_data});
+}
+
+/**
+ * In this function all the attribute providers for a point cloud component are created. Most data
+ * in this function is statically allocated, because it does not change over time.
+ */
+static ComponentAttributeProviders create_attribute_providers_for_point_cloud()
+{
+ static auto update_custom_data_pointers = [](GeometryComponent &component) {
+ PointCloudComponent &pointcloud_component = static_cast<PointCloudComponent &>(component);
+ PointCloud *pointcloud = pointcloud_component.get_for_write();
+ if (pointcloud != nullptr) {
+ BKE_pointcloud_update_customdata_pointers(pointcloud);
+ }
+ };
+ static CustomDataAccessInfo point_access = {
+ [](GeometryComponent &component) -> CustomData * {
+ PointCloudComponent &pointcloud_component = static_cast<PointCloudComponent &>(component);
+ PointCloud *pointcloud = pointcloud_component.get_for_write();
+ return pointcloud ? &pointcloud->pdata : nullptr;
+ },
+ [](const GeometryComponent &component) -> const CustomData * {
+ const PointCloudComponent &pointcloud_component = static_cast<const PointCloudComponent &>(
+ component);
+ const PointCloud *pointcloud = pointcloud_component.get_for_read();
+ return pointcloud ? &pointcloud->pdata : nullptr;
+ },
+ update_custom_data_pointers};
+
+ static BuiltinCustomDataLayerProvider position(
+ "position",
+ ATTR_DOMAIN_POINT,
+ CD_PROP_FLOAT3,
+ CD_PROP_FLOAT3,
+ BuiltinAttributeProvider::NonCreatable,
+ BuiltinAttributeProvider::Writable,
+ BuiltinAttributeProvider::NonDeletable,
+ point_access,
+ make_array_read_attribute<float3, ATTR_DOMAIN_POINT>,
+ make_array_write_attribute<float3, ATTR_DOMAIN_POINT>,
+ nullptr);
+ static BuiltinCustomDataLayerProvider radius(
+ "radius",
+ ATTR_DOMAIN_POINT,
+ CD_PROP_FLOAT,
+ CD_PROP_FLOAT,
+ BuiltinAttributeProvider::Creatable,
+ BuiltinAttributeProvider::Writable,
+ BuiltinAttributeProvider::Deletable,
+ point_access,
+ make_array_read_attribute<float, ATTR_DOMAIN_POINT>,
+ make_array_write_attribute<float, ATTR_DOMAIN_POINT>,
+ nullptr);
+ static CustomDataAttributeProvider point_custom_data(ATTR_DOMAIN_POINT, point_access);
+ return ComponentAttributeProviders({&position, &radius}, {&point_custom_data});
+}
+
+} // namespace blender::bke
/* -------------------------------------------------------------------- */
/** \name Geometry Component
* \{ */
-bool GeometryComponent::attribute_domain_supported(const AttributeDomain UNUSED(domain)) const
+const blender::bke::ComponentAttributeProviders *GeometryComponent::get_attribute_providers() const
{
- return false;
+ return nullptr;
}
-bool GeometryComponent::attribute_domain_with_type_supported(
- const AttributeDomain UNUSED(domain), const CustomDataType UNUSED(data_type)) const
+bool GeometryComponent::attribute_domain_supported(const AttributeDomain domain) const
{
- return false;
+ using namespace blender::bke;
+ const ComponentAttributeProviders *providers = this->get_attribute_providers();
+ if (providers == nullptr) {
+ return false;
+ }
+ return providers->supported_domains().contains(domain);
}
int GeometryComponent::attribute_domain_size(const AttributeDomain UNUSED(domain)) const
@@ -627,47 +1585,155 @@ int GeometryComponent::attribute_domain_size(const AttributeDomain UNUSED(domain
return 0;
}
-bool GeometryComponent::attribute_is_builtin(const StringRef UNUSED(attribute_name)) const
-{
- return true;
-}
-
ReadAttributePtr GeometryComponent::attribute_try_get_for_read(
- const StringRef UNUSED(attribute_name)) const
+ const StringRef attribute_name) const
{
+ using namespace blender::bke;
+ const ComponentAttributeProviders *providers = this->get_attribute_providers();
+ if (providers == nullptr) {
+ return {};
+ }
+ const BuiltinAttributeProvider *builtin_provider =
+ providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr);
+ if (builtin_provider != nullptr) {
+ return builtin_provider->try_get_for_read(*this);
+ }
+ for (const DynamicAttributesProvider *dynamic_provider :
+ providers->dynamic_attribute_providers()) {
+ ReadAttributePtr attribute = dynamic_provider->try_get_for_read(*this, attribute_name);
+ if (attribute) {
+ return attribute;
+ }
+ }
return {};
}
-ReadAttributePtr GeometryComponent::attribute_try_adapt_domain(ReadAttributePtr attribute,
- const AttributeDomain domain) const
+ReadAttributePtr GeometryComponent::attribute_try_adapt_domain(
+ ReadAttributePtr attribute, const AttributeDomain new_domain) const
{
- if (attribute && attribute->domain() == domain) {
+ if (attribute && attribute->domain() == new_domain) {
return attribute;
}
return {};
}
-WriteAttributePtr GeometryComponent::attribute_try_get_for_write(
- const StringRef UNUSED(attribute_name))
+WriteAttributePtr GeometryComponent::attribute_try_get_for_write(const StringRef attribute_name)
{
+ using namespace blender::bke;
+ const ComponentAttributeProviders *providers = this->get_attribute_providers();
+ if (providers == nullptr) {
+ return {};
+ }
+ const BuiltinAttributeProvider *builtin_provider =
+ providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr);
+ if (builtin_provider != nullptr) {
+ return builtin_provider->try_get_for_write(*this);
+ }
+ for (const DynamicAttributesProvider *dynamic_provider :
+ providers->dynamic_attribute_providers()) {
+ WriteAttributePtr attribute = dynamic_provider->try_get_for_write(*this, attribute_name);
+ if (attribute) {
+ return attribute;
+ }
+ }
return {};
}
-bool GeometryComponent::attribute_try_delete(const StringRef UNUSED(attribute_name))
+bool GeometryComponent::attribute_try_delete(const StringRef attribute_name)
{
- return false;
+ using namespace blender::bke;
+ const ComponentAttributeProviders *providers = this->get_attribute_providers();
+ if (providers == nullptr) {
+ return {};
+ }
+ const BuiltinAttributeProvider *builtin_provider =
+ providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr);
+ if (builtin_provider != nullptr) {
+ return builtin_provider->try_delete(*this);
+ }
+ bool success = false;
+ for (const DynamicAttributesProvider *dynamic_provider :
+ providers->dynamic_attribute_providers()) {
+ success = dynamic_provider->try_delete(*this, attribute_name) || success;
+ }
+ return success;
}
-bool GeometryComponent::attribute_try_create(const StringRef UNUSED(attribute_name),
- const AttributeDomain UNUSED(domain),
- const CustomDataType UNUSED(data_type))
+bool GeometryComponent::attribute_try_create(const StringRef attribute_name,
+ const AttributeDomain domain,
+ const CustomDataType data_type)
{
+ using namespace blender::bke;
+ if (attribute_name.is_empty()) {
+ return false;
+ }
+ const ComponentAttributeProviders *providers = this->get_attribute_providers();
+ if (providers == nullptr) {
+ return false;
+ }
+ const BuiltinAttributeProvider *builtin_provider =
+ providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr);
+ if (builtin_provider != nullptr) {
+ if (builtin_provider->domain() != domain) {
+ return false;
+ }
+ if (builtin_provider->data_type() != data_type) {
+ return false;
+ }
+ return builtin_provider->try_create(*this);
+ }
+ for (const DynamicAttributesProvider *dynamic_provider :
+ providers->dynamic_attribute_providers()) {
+ if (dynamic_provider->try_create(*this, attribute_name, domain, data_type)) {
+ return true;
+ }
+ }
return false;
}
Set<std::string> GeometryComponent::attribute_names() const
{
- return {};
+ Set<std::string> attributes;
+ this->attribute_foreach([&](StringRefNull name, const AttributeMetaData &UNUSED(meta_data)) {
+ attributes.add(name);
+ return true;
+ });
+ return attributes;
+}
+
+void GeometryComponent::attribute_foreach(const AttributeForeachCallback callback) const
+{
+ using namespace blender::bke;
+ const ComponentAttributeProviders *providers = this->get_attribute_providers();
+ if (providers == nullptr) {
+ return;
+ }
+
+ /* Keep track handled attribute names to make sure that we do not return the same name twice. */
+ Set<std::string> handled_attribute_names;
+
+ for (const BuiltinAttributeProvider *provider :
+ providers->builtin_attribute_providers().values()) {
+ if (provider->exists(*this)) {
+ AttributeMetaData meta_data{provider->domain(), provider->data_type()};
+ if (!callback(provider->name(), meta_data)) {
+ return;
+ }
+ handled_attribute_names.add_new(provider->name());
+ }
+ }
+ for (const DynamicAttributesProvider *provider : providers->dynamic_attribute_providers()) {
+ const bool continue_loop = provider->foreach_attribute(
+ *this, [&](StringRefNull name, const AttributeMetaData &meta_data) {
+ if (handled_attribute_names.add(name)) {
+ return callback(name, meta_data);
+ }
+ return true;
+ });
+ if (!continue_loop) {
+ return;
+ }
+ }
}
bool GeometryComponent::attribute_exists(const blender::StringRef attribute_name) const
@@ -701,10 +1767,6 @@ ReadAttributePtr GeometryComponent::attribute_try_get_for_read(
const AttributeDomain domain,
const CustomDataType data_type) const
{
- if (!this->attribute_domain_with_type_supported(domain, data_type)) {
- return {};
- }
-
ReadAttributePtr attribute = this->attribute_try_get_for_read(attribute_name);
if (!attribute) {
return {};
@@ -756,8 +1818,6 @@ ReadAttributePtr GeometryComponent::attribute_get_for_read(const StringRef attri
const CustomDataType data_type,
const void *default_value) const
{
- BLI_assert(this->attribute_domain_with_type_supported(domain, data_type));
-
ReadAttributePtr attribute = this->attribute_try_get_for_read(attribute_name, domain, data_type);
if (attribute) {
return attribute;
@@ -817,8 +1877,6 @@ OutputAttributePtr GeometryComponent::attribute_try_get_for_output(const StringR
const CustomDataType data_type,
const void *default_value)
{
- BLI_assert(this->attribute_domain_with_type_supported(domain, data_type));
-
const blender::fn::CPPType *cpp_type = blender::bke::custom_data_type_to_cpp_type(data_type);
BLI_assert(cpp_type != nullptr);
@@ -946,21 +2004,12 @@ void OutputAttributePtr::apply_span_and_save()
/** \name Point Cloud Component
* \{ */
-bool PointCloudComponent::attribute_domain_supported(const AttributeDomain domain) const
-{
- return domain == ATTR_DOMAIN_POINT;
-}
-
-bool PointCloudComponent::attribute_domain_with_type_supported(
- const AttributeDomain domain, const CustomDataType data_type) const
+const blender::bke::ComponentAttributeProviders *PointCloudComponent::get_attribute_providers()
+ const
{
- return domain == ATTR_DOMAIN_POINT && ELEM(data_type,
- CD_PROP_BOOL,
- CD_PROP_FLOAT,
- CD_PROP_FLOAT2,
- CD_PROP_FLOAT3,
- CD_PROP_INT32,
- CD_PROP_COLOR);
+ static blender::bke::ComponentAttributeProviders providers =
+ blender::bke::create_attribute_providers_for_point_cloud();
+ return &providers;
}
int PointCloudComponent::attribute_domain_size(const AttributeDomain domain) const
@@ -973,119 +2022,17 @@ int PointCloudComponent::attribute_domain_size(const AttributeDomain domain) con
return pointcloud_->totpoint;
}
-bool PointCloudComponent::attribute_is_builtin(const StringRef attribute_name) const
-{
- return attribute_name == "position";
-}
-
-ReadAttributePtr PointCloudComponent::attribute_try_get_for_read(
- const StringRef attribute_name) const
-{
- if (pointcloud_ == nullptr) {
- return {};
- }
-
- return read_attribute_from_custom_data(
- pointcloud_->pdata, pointcloud_->totpoint, attribute_name, ATTR_DOMAIN_POINT);
-}
-
-WriteAttributePtr PointCloudComponent::attribute_try_get_for_write(const StringRef attribute_name)
-{
- PointCloud *pointcloud = this->get_for_write();
- if (pointcloud == nullptr) {
- return {};
- }
-
- return write_attribute_from_custom_data(
- pointcloud->pdata, pointcloud->totpoint, attribute_name, ATTR_DOMAIN_POINT, [&]() {
- BKE_pointcloud_update_customdata_pointers(pointcloud);
- });
-}
-
-bool PointCloudComponent::attribute_try_delete(const StringRef attribute_name)
-{
- if (this->attribute_is_builtin(attribute_name)) {
- return false;
- }
- PointCloud *pointcloud = this->get_for_write();
- if (pointcloud == nullptr) {
- return false;
- }
- delete_named_custom_data_layer(pointcloud->pdata, attribute_name, pointcloud->totpoint);
- return true;
-}
-
-static bool custom_data_has_layer_with_name(const CustomData &custom_data, const StringRef name)
-{
- for (const CustomDataLayer &layer : blender::Span(custom_data.layers, custom_data.totlayer)) {
- if (layer.name == name) {
- return true;
- }
- }
- return false;
-}
-
-bool PointCloudComponent::attribute_try_create(const StringRef attribute_name,
- const AttributeDomain domain,
- const CustomDataType data_type)
-{
- if (this->attribute_is_builtin(attribute_name)) {
- return false;
- }
- if (!this->attribute_domain_with_type_supported(domain, data_type)) {
- return false;
- }
- PointCloud *pointcloud = this->get_for_write();
- if (pointcloud == nullptr) {
- return false;
- }
- if (custom_data_has_layer_with_name(pointcloud->pdata, attribute_name)) {
- return false;
- }
-
- char attribute_name_c[MAX_NAME];
- attribute_name.copy(attribute_name_c);
- CustomData_add_layer_named(
- &pointcloud->pdata, data_type, CD_DEFAULT, nullptr, pointcloud_->totpoint, attribute_name_c);
- return true;
-}
-
-Set<std::string> PointCloudComponent::attribute_names() const
-{
- if (pointcloud_ == nullptr) {
- return {};
- }
-
- Set<std::string> names;
- get_custom_data_layer_attribute_names(pointcloud_->pdata, *this, ATTR_DOMAIN_POINT, names);
- return names;
-}
-
/** \} */
/* -------------------------------------------------------------------- */
/** \name Mesh Component
* \{ */
-bool MeshComponent::attribute_domain_supported(const AttributeDomain domain) const
+const blender::bke::ComponentAttributeProviders *MeshComponent::get_attribute_providers() const
{
- return ELEM(
- domain, ATTR_DOMAIN_CORNER, ATTR_DOMAIN_POINT, ATTR_DOMAIN_EDGE, ATTR_DOMAIN_POLYGON);
-}
-
-bool MeshComponent::attribute_domain_with_type_supported(const AttributeDomain domain,
- const CustomDataType data_type) const
-{
- if (!this->attribute_domain_supported(domain)) {
- return false;
- }
- return ELEM(data_type,
- CD_PROP_BOOL,
- CD_PROP_FLOAT,
- CD_PROP_FLOAT2,
- CD_PROP_FLOAT3,
- CD_PROP_INT32,
- CD_PROP_COLOR);
+ static blender::bke::ComponentAttributeProviders providers =
+ blender::bke::create_attribute_providers_for_mesh();
+ return &providers;
}
int MeshComponent::attribute_domain_size(const AttributeDomain domain) const
@@ -1110,228 +2057,115 @@ int MeshComponent::attribute_domain_size(const AttributeDomain domain) const
return 0;
}
-bool MeshComponent::attribute_is_builtin(const StringRef attribute_name) const
-{
- return attribute_name == "position";
-}
+namespace blender::bke {
-ReadAttributePtr MeshComponent::attribute_try_get_for_read(const StringRef attribute_name) const
+template<typename T>
+static void adapt_mesh_domain_corner_to_point_impl(const Mesh &mesh,
+ const TypedReadAttribute<T> &attribute,
+ MutableSpan<T> r_values)
{
- if (mesh_ == nullptr) {
- return {};
- }
-
- if (attribute_name == "position") {
- auto get_vertex_position = [](const MVert &vert) { return float3(vert.co); };
- return std::make_unique<
- blender::bke::DerivedArrayReadAttribute<MVert, float3, decltype(get_vertex_position)>>(
- ATTR_DOMAIN_POINT, blender::Span(mesh_->mvert, mesh_->totvert), get_vertex_position);
- }
-
- ReadAttributePtr corner_attribute = read_attribute_from_custom_data(
- mesh_->ldata, mesh_->totloop, attribute_name, ATTR_DOMAIN_CORNER);
- if (corner_attribute) {
- return corner_attribute;
- }
-
- const int vertex_group_index = vertex_group_names_.lookup_default(attribute_name, -1);
- if (vertex_group_index >= 0) {
- return std::make_unique<blender::bke::VertexWeightReadAttribute>(
- mesh_->dvert, mesh_->totvert, vertex_group_index);
- }
+ BLI_assert(r_values.size() == mesh.totvert);
+ attribute_math::DefaultMixer<T> mixer(r_values);
- ReadAttributePtr vertex_attribute = read_attribute_from_custom_data(
- mesh_->vdata, mesh_->totvert, attribute_name, ATTR_DOMAIN_POINT);
- if (vertex_attribute) {
- return vertex_attribute;
+ for (const int loop_index : IndexRange(mesh.totloop)) {
+ const T value = attribute[loop_index];
+ const MLoop &loop = mesh.mloop[loop_index];
+ const int point_index = loop.v;
+ mixer.mix_in(point_index, value);
}
-
- ReadAttributePtr edge_attribute = read_attribute_from_custom_data(
- mesh_->edata, mesh_->totedge, attribute_name, ATTR_DOMAIN_EDGE);
- if (edge_attribute) {
- return edge_attribute;
- }
-
- ReadAttributePtr polygon_attribute = read_attribute_from_custom_data(
- mesh_->pdata, mesh_->totpoly, attribute_name, ATTR_DOMAIN_POLYGON);
- if (polygon_attribute) {
- return polygon_attribute;
- }
-
- return {};
+ mixer.finalize();
}
-WriteAttributePtr MeshComponent::attribute_try_get_for_write(const StringRef attribute_name)
+static ReadAttributePtr adapt_mesh_domain_corner_to_point(const Mesh &mesh,
+ ReadAttributePtr attribute)
{
- Mesh *mesh = this->get_for_write();
- if (mesh == nullptr) {
- return {};
- }
-
- const std::function<void()> update_mesh_pointers = [&]() {
- BKE_mesh_update_customdata_pointers(mesh, false);
- };
-
- if (attribute_name == "position") {
- CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MVERT, mesh->totvert);
- update_mesh_pointers();
-
- auto get_vertex_position = [](const MVert &vert) { return float3(vert.co); };
- auto set_vertex_position = [](MVert &vert, const float3 &co) { copy_v3_v3(vert.co, co); };
- return std::make_unique<
- blender::bke::DerivedArrayWriteAttribute<MVert,
- float3,
- decltype(get_vertex_position),
- decltype(set_vertex_position)>>(
- ATTR_DOMAIN_POINT,
- blender::MutableSpan(mesh_->mvert, mesh_->totvert),
- get_vertex_position,
- set_vertex_position);
- }
-
- WriteAttributePtr corner_attribute = write_attribute_from_custom_data(
- mesh_->ldata, mesh_->totloop, attribute_name, ATTR_DOMAIN_CORNER, update_mesh_pointers);
- if (corner_attribute) {
- return corner_attribute;
- }
-
- const int vertex_group_index = vertex_group_names_.lookup_default_as(attribute_name, -1);
- if (vertex_group_index >= 0) {
- if (mesh_->dvert == nullptr) {
- BKE_object_defgroup_data_create(&mesh_->id);
- }
- else {
- /* Copy the data layer if it is shared with some other mesh. */
- mesh_->dvert = (MDeformVert *)CustomData_duplicate_referenced_layer(
- &mesh_->vdata, CD_MDEFORMVERT, mesh_->totvert);
+ ReadAttributePtr new_attribute;
+ const CustomDataType data_type = attribute->custom_data_type();
+ attribute_math::convert_to_static_type(data_type, [&](auto dummy) {
+ using T = decltype(dummy);
+ if constexpr (!std::is_void_v<attribute_math::DefaultMixer<T>>) {
+ /* We compute all interpolated values at once, because for this interpolation, one has to
+ * iterate over all loops anyway. */
+ Array<T> values(mesh.totvert);
+ adapt_mesh_domain_corner_to_point_impl<T>(mesh, *attribute, values);
+ new_attribute = std::make_unique<OwnedArrayReadAttribute<T>>(ATTR_DOMAIN_POINT,
+ std::move(values));
}
- return std::make_unique<blender::bke::VertexWeightWriteAttribute>(
- mesh_->dvert, mesh_->totvert, vertex_group_index);
- }
-
- WriteAttributePtr vertex_attribute = write_attribute_from_custom_data(
- mesh_->vdata, mesh_->totvert, attribute_name, ATTR_DOMAIN_POINT, update_mesh_pointers);
- if (vertex_attribute) {
- return vertex_attribute;
- }
-
- WriteAttributePtr edge_attribute = write_attribute_from_custom_data(
- mesh_->edata, mesh_->totedge, attribute_name, ATTR_DOMAIN_EDGE, update_mesh_pointers);
- if (edge_attribute) {
- return edge_attribute;
- }
-
- WriteAttributePtr polygon_attribute = write_attribute_from_custom_data(
- mesh_->pdata, mesh_->totpoly, attribute_name, ATTR_DOMAIN_POLYGON, update_mesh_pointers);
- if (polygon_attribute) {
- return polygon_attribute;
- }
-
- return {};
+ });
+ return new_attribute;
}
-bool MeshComponent::attribute_try_delete(const StringRef attribute_name)
+template<typename T>
+static void adapt_mesh_domain_point_to_corner_impl(const Mesh &mesh,
+ const TypedReadAttribute<T> &attribute,
+ MutableSpan<T> r_values)
{
- if (this->attribute_is_builtin(attribute_name)) {
- return false;
- }
- Mesh *mesh = this->get_for_write();
- if (mesh == nullptr) {
- return false;
- }
-
- delete_named_custom_data_layer(mesh_->ldata, attribute_name, mesh_->totloop);
- delete_named_custom_data_layer(mesh_->vdata, attribute_name, mesh_->totvert);
- delete_named_custom_data_layer(mesh_->edata, attribute_name, mesh_->totedge);
- delete_named_custom_data_layer(mesh_->pdata, attribute_name, mesh_->totpoly);
+ BLI_assert(r_values.size() == mesh.totloop);
- const int vertex_group_index = vertex_group_names_.lookup_default_as(attribute_name, -1);
- if (vertex_group_index != -1) {
- for (MDeformVert &dvert : blender::MutableSpan(mesh_->dvert, mesh_->totvert)) {
- MDeformWeight *weight = BKE_defvert_find_index(&dvert, vertex_group_index);
- BKE_defvert_remove_group(&dvert, weight);
- }
- vertex_group_names_.remove_as(attribute_name);
+ for (const int loop_index : IndexRange(mesh.totloop)) {
+ const int vertex_index = mesh.mloop[loop_index].v;
+ r_values[loop_index] = attribute[vertex_index];
}
+}
- return true;
+static ReadAttributePtr adapt_mesh_domain_point_to_corner(const Mesh &mesh,
+ ReadAttributePtr attribute)
+{
+ ReadAttributePtr new_attribute;
+ const CustomDataType data_type = attribute->custom_data_type();
+ attribute_math::convert_to_static_type(data_type, [&](auto dummy) {
+ using T = decltype(dummy);
+ /* It is not strictly necessary to compute the value for all corners here. Instead one could
+ * lazily lookup the mesh topology when a specific index accessed. This can be more efficient
+ * when an algorithm only accesses very few of the corner values. However, for the algorithms
+ * we currently have, precomputing the array is fine. Also, it is easier to implement. */
+ Array<T> values(mesh.totloop);
+ adapt_mesh_domain_point_to_corner_impl<T>(mesh, *attribute, values);
+ new_attribute = std::make_unique<OwnedArrayReadAttribute<T>>(ATTR_DOMAIN_CORNER,
+ std::move(values));
+ });
+ return new_attribute;
}
-bool MeshComponent::attribute_try_create(const StringRef attribute_name,
- const AttributeDomain domain,
- const CustomDataType data_type)
+} // namespace blender::bke
+
+ReadAttributePtr MeshComponent::attribute_try_adapt_domain(ReadAttributePtr attribute,
+ const AttributeDomain new_domain) const
{
- if (this->attribute_is_builtin(attribute_name)) {
- return false;
+ if (!attribute) {
+ return {};
}
- if (!this->attribute_domain_with_type_supported(domain, data_type)) {
- return false;
+ if (attribute->size() == 0) {
+ return {};
}
- Mesh *mesh = this->get_for_write();
- if (mesh == nullptr) {
- return false;
+ const AttributeDomain old_domain = attribute->domain();
+ if (old_domain == new_domain) {
+ return attribute;
}
- char attribute_name_c[MAX_NAME];
- attribute_name.copy(attribute_name_c);
-
- switch (domain) {
+ switch (old_domain) {
case ATTR_DOMAIN_CORNER: {
- if (custom_data_has_layer_with_name(mesh->ldata, attribute_name)) {
- return false;
+ switch (new_domain) {
+ case ATTR_DOMAIN_POINT:
+ return blender::bke::adapt_mesh_domain_corner_to_point(*mesh_, std::move(attribute));
+ default:
+ break;
}
- CustomData_add_layer_named(
- &mesh->ldata, data_type, CD_DEFAULT, nullptr, mesh->totloop, attribute_name_c);
- return true;
+ break;
}
case ATTR_DOMAIN_POINT: {
- if (custom_data_has_layer_with_name(mesh->vdata, attribute_name)) {
- return false;
- }
- if (vertex_group_names_.contains_as(attribute_name)) {
- return false;
+ switch (new_domain) {
+ case ATTR_DOMAIN_CORNER:
+ return blender::bke::adapt_mesh_domain_point_to_corner(*mesh_, std::move(attribute));
+ default:
+ break;
}
- CustomData_add_layer_named(
- &mesh->vdata, data_type, CD_DEFAULT, nullptr, mesh->totvert, attribute_name_c);
- return true;
- }
- case ATTR_DOMAIN_EDGE: {
- if (custom_data_has_layer_with_name(mesh->edata, attribute_name)) {
- return false;
- }
- CustomData_add_layer_named(
- &mesh->edata, data_type, CD_DEFAULT, nullptr, mesh->totedge, attribute_name_c);
- return true;
- }
- case ATTR_DOMAIN_POLYGON: {
- if (custom_data_has_layer_with_name(mesh->pdata, attribute_name)) {
- return false;
- }
- CustomData_add_layer_named(
- &mesh->pdata, data_type, CD_DEFAULT, nullptr, mesh->totpoly, attribute_name_c);
- return true;
}
default:
- return false;
- }
-}
-
-Set<std::string> MeshComponent::attribute_names() const
-{
- if (mesh_ == nullptr) {
- return {};
+ break;
}
- Set<std::string> names;
- names.add("position");
- for (StringRef name : vertex_group_names_.keys()) {
- names.add(name);
- }
- get_custom_data_layer_attribute_names(mesh_->pdata, *this, ATTR_DOMAIN_CORNER, names);
- get_custom_data_layer_attribute_names(mesh_->vdata, *this, ATTR_DOMAIN_POINT, names);
- get_custom_data_layer_attribute_names(mesh_->edata, *this, ATTR_DOMAIN_EDGE, names);
- get_custom_data_layer_attribute_names(mesh_->pdata, *this, ATTR_DOMAIN_POLYGON, names);
- return names;
+ return {};
}
/** \} */
diff --git a/source/blender/blenkernel/intern/attribute_math.cc b/source/blender/blenkernel/intern/attribute_math.cc
new file mode 100644
index 00000000000..4ff3a6ceff5
--- /dev/null
+++ b/source/blender/blenkernel/intern/attribute_math.cc
@@ -0,0 +1,58 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "BKE_attribute_math.hh"
+
+namespace blender::attribute_math {
+
+Color4fMixer::Color4fMixer(MutableSpan<Color4f> output_buffer, Color4f default_color)
+ : buffer_(output_buffer),
+ default_color_(default_color),
+ total_weights_(output_buffer.size(), 0.0f)
+{
+ buffer_.fill(Color4f(0, 0, 0, 0));
+}
+
+void Color4fMixer::mix_in(const int64_t index, const Color4f &color, const float weight)
+{
+ BLI_assert(weight >= 0.0f);
+ Color4f &output_color = buffer_[index];
+ output_color.r += color.r * weight;
+ output_color.g += color.g * weight;
+ output_color.b += color.b * weight;
+ output_color.a += color.a * weight;
+ total_weights_[index] += weight;
+}
+
+void Color4fMixer::finalize()
+{
+ for (const int64_t i : buffer_.index_range()) {
+ const float weight = total_weights_[i];
+ Color4f &output_color = buffer_[i];
+ if (weight > 0.0f) {
+ const float weight_inv = 1.0f / weight;
+ output_color.r *= weight_inv;
+ output_color.g *= weight_inv;
+ output_color.b *= weight_inv;
+ output_color.a *= weight_inv;
+ }
+ else {
+ output_color = default_color_;
+ }
+ }
+}
+
+} // namespace blender::attribute_math
diff --git a/source/blender/blenkernel/intern/blender_undo.c b/source/blender/blenkernel/intern/blender_undo.c
index 9e061b1ac69..d826aaf24e3 100644
--- a/source/blender/blenkernel/intern/blender_undo.c
+++ b/source/blender/blenkernel/intern/blender_undo.c
@@ -48,6 +48,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_undo_system.h"
#include "BLO_readfile.h"
#include "BLO_undofile.h"
@@ -62,7 +63,7 @@
#define UNDO_DISK 0
bool BKE_memfile_undo_decode(MemFileUndoData *mfu,
- const int undo_direction,
+ const eUndoStepDir undo_direction,
const bool use_old_bmain_data,
bContext *C)
{
@@ -80,7 +81,7 @@ bool BKE_memfile_undo_decode(MemFileUndoData *mfu,
}
else {
struct BlendFileReadParams params = {0};
- params.undo_direction = undo_direction > 0 ? 1 : -1;
+ params.undo_direction = undo_direction;
if (!use_old_bmain_data) {
params.skip_flags |= BLO_READ_SKIP_UNDO_OLD_MAIN;
}
diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c
index 0855db1a943..32710c4fa60 100644
--- a/source/blender/blenkernel/intern/blendfile.c
+++ b/source/blender/blenkernel/intern/blendfile.c
@@ -57,6 +57,7 @@
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_studiolight.h"
+#include "BKE_undo_system.h"
#include "BKE_workspace.h"
#include "BLO_readfile.h"
@@ -148,7 +149,7 @@ static void setup_app_data(bContext *C,
LOAD_UNDO,
} mode;
- if (params->undo_direction != 0) {
+ if (params->undo_direction != STEP_INVALID) {
BLI_assert(bfd->curscene != NULL);
mode = LOAD_UNDO;
}
@@ -647,6 +648,10 @@ UserDef *BKE_blendfile_userdef_from_defaults(void)
BKE_studiolight_default(userdef->light_param, userdef->light_ambient);
BKE_preferences_asset_library_default_add(userdef);
+ /* Enable asset browser features by default for alpha testing.
+ * BLO_sanitize_experimental_features_userpref_blend() will disable it again for non-alpha
+ * builds. */
+ userdef->experimental.use_asset_browser = true;
return userdef;
}
diff --git a/source/blender/blenkernel/intern/bpath.c b/source/blender/blenkernel/intern/bpath.c
index 762ced7dc5f..2ad0ac950d0 100644
--- a/source/blender/blenkernel/intern/bpath.c
+++ b/source/blender/blenkernel/intern/bpath.c
@@ -23,7 +23,7 @@
* - passing output paths to the visitor?, like render out.
* - passing sequence strips with many images.
* - passing directory paths - visitors don't know which path is a dir or a file.
- * */
+ */
#include <sys/stat.h>
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 9a954a89cad..59ff59b82e0 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -375,7 +375,7 @@ static int brush_undo_preserve_cb(LibraryIDLinkCallbackData *cb_data)
static void brush_undo_preserve(BlendLibReader *reader, ID *id_new, ID *id_old)
{
- /* Whole Brush is preserved accross undo's. */
+ /* Whole Brush is preserved across undo-steps. */
BKE_lib_id_swap(NULL, id_new, id_old);
/* `id_new` now has content from `id_old`, we need to ensure those old ID pointers are valid.
@@ -410,6 +410,8 @@ IDTypeInfo IDType_ID_BR = {
.blend_read_expand = brush_blend_read_expand,
.blend_read_undo_preserve = brush_undo_preserve,
+
+ .lib_override_apply_post = NULL,
};
static RNG *brush_rng;
@@ -973,12 +975,12 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type)
break;
}
case GP_BRUSH_PRESET_FILL_AREA: {
- brush->size = 20.0f;
+ brush->size = 5.0f;
brush->gpencil_settings->fill_leak = 3;
brush->gpencil_settings->fill_threshold = 0.1f;
brush->gpencil_settings->fill_simplylvl = 1;
- brush->gpencil_settings->fill_factor = 1;
+ brush->gpencil_settings->fill_factor = 1.0f;
brush->gpencil_settings->draw_strength = 1.0f;
brush->gpencil_settings->hardeness = 1.0f;
@@ -987,6 +989,8 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type)
brush->gpencil_settings->draw_smoothlvl = 1;
brush->gpencil_settings->draw_subdivide = 1;
+ brush->gpencil_settings->flag |= GP_BRUSH_FILL_SHOW_EXTENDLINES;
+
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_FILL;
brush->gpencil_tool = GPAINT_TOOL_FILL;
brush->gpencil_settings->vertex_mode = GPPAINT_MODE_FILL;
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index fd5cb33f02d..790fb128c7c 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -27,6 +27,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_pointcloud_types.h"
#include "BLI_linklist.h"
#include "BLI_math.h"
@@ -1717,3 +1718,41 @@ void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data)
memset(data, 0, sizeof(*data));
}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Point Cloud BVH Building
+ * \{ */
+
+BVHTree *BKE_bvhtree_from_pointcloud_get(BVHTreeFromPointCloud *data,
+ const PointCloud *pointcloud,
+ const int tree_type)
+{
+ BVHTree *tree = BLI_bvhtree_new(pointcloud->totpoint, 0.0f, tree_type, 6);
+ if (!tree) {
+ return NULL;
+ }
+
+ for (int i = 0; i < pointcloud->totpoint; i++) {
+ BLI_bvhtree_insert(tree, i, pointcloud->co[i], 1);
+ }
+ BLI_assert(BLI_bvhtree_get_len(tree) == pointcloud->totpoint);
+ BLI_bvhtree_balance(tree);
+
+ data->coords = pointcloud->co;
+ data->tree = tree;
+ data->nearest_callback = NULL;
+
+ return tree;
+}
+
+void free_bvhtree_from_pointcloud(BVHTreeFromPointCloud *data)
+{
+ if (data->tree) {
+ BLI_bvhtree_free(data->tree);
+ }
+ memset(data, 0, sizeof(*data));
+}
+
+/** \} */
diff --git a/source/blender/blenkernel/intern/cachefile.c b/source/blender/blenkernel/intern/cachefile.c
index d6c31809a2e..1e2139522f1 100644
--- a/source/blender/blenkernel/intern/cachefile.c
+++ b/source/blender/blenkernel/intern/cachefile.c
@@ -142,6 +142,8 @@ IDTypeInfo IDType_ID_CF = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* TODO: make this per cache file to avoid global locks. */
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 0ca22e34973..b0e3743add1 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -203,6 +203,8 @@ IDTypeInfo IDType_ID_CA = {
.blend_read_expand = camera_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/** \} */
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index c2d6d5c7594..09bd397cc78 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -285,7 +285,7 @@ static int do_step_cloth(
mul_m4_v3(ob->obmat, verts->xconst);
}
- effectors = BKE_effectors_create(depsgraph, ob, NULL, clmd->sim_parms->effector_weights);
+ effectors = BKE_effectors_create(depsgraph, ob, NULL, clmd->sim_parms->effector_weights, false);
if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH) {
cloth_update_verts(ob, clmd, result);
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 58ce7227398..dd0572f9b12 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -362,6 +362,8 @@ IDTypeInfo IDType_ID_GR = {
.blend_read_expand = collection_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/** \} */
@@ -1907,7 +1909,7 @@ bool BKE_collection_move(Main *bmain,
/** \name Iterators
* \{ */
-/* scene collection iteractor */
+/* Scene collection iterator. */
typedef struct CollectionsIteratorData {
Scene *scene;
@@ -1939,27 +1941,28 @@ static void scene_collections_build_array(Collection *collection, void *data)
(*array)++;
}
-static void scene_collections_array(Scene *scene, Collection ***collections_array, int *tot)
+static void scene_collections_array(Scene *scene,
+ Collection ***r_collections_array,
+ int *r_collections_array_len)
{
- Collection *collection;
- Collection **array;
-
- *collections_array = NULL;
- *tot = 0;
+ *r_collections_array = NULL;
+ *r_collections_array_len = 0;
if (scene == NULL) {
return;
}
- collection = scene->master_collection;
+ Collection *collection = scene->master_collection;
BLI_assert(collection != NULL);
- scene_collection_callback(collection, scene_collections_count, tot);
+ scene_collection_callback(collection, scene_collections_count, r_collections_array_len);
- if (*tot == 0) {
+ if (*r_collections_array_len == 0) {
return;
}
- *collections_array = array = MEM_mallocN(sizeof(Collection *) * (*tot), "CollectionArray");
+ Collection **array = MEM_mallocN(sizeof(Collection *) * (*r_collections_array_len),
+ "CollectionArray");
+ *r_collections_array = array;
scene_collection_callback(collection, scene_collections_build_array, &array);
}
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 0bf27a50a32..d04a27adec8 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -4693,7 +4693,7 @@ static void pivotcon_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *ta
copy_m3_m4(rotMat, cob->matrix);
normalize_m3(rotMat);
- /* correct the pivot by the rotation axis otherwise the pivot translates when it shouldnt */
+ /* correct the pivot by the rotation axis otherwise the pivot translates when it shouldn't */
mat3_normalized_to_axis_angle(axis, &angle, rotMat);
if (angle) {
float dvec[3];
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 65accc66084..6bc385ecd31 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -318,7 +318,7 @@ static eContextResult ctx_data_get(bContext *C, const char *member, bContextData
*
* Values in order of importance
* (0, -1, 1) - Where 1 is highest priority
- * */
+ */
if (done != 1 && recursion < 1 && C->wm.store) {
C->data.recursion = 1;
diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc
index ef7f5963bee..db83547fe36 100644
--- a/source/blender/blenkernel/intern/cryptomatte.cc
+++ b/source/blender/blenkernel/intern/cryptomatte.cc
@@ -47,7 +47,7 @@
#include <string>
#include <string_view>
-enum CryptomatteLayerState {
+enum class CryptomatteLayerState {
EMPTY,
FILLED,
CLOSED,
@@ -182,7 +182,7 @@ uint32_t BKE_cryptomatte_asset_hash(CryptomatteSession *session, const Object *o
* https://github.com/Psyop/Cryptomatte/blob/master/specification/cryptomatte_specification.pdf.
*
* The conversion uses as many 32 bit floating point values as possible to minimize hash
- * collisions. Unfortunately not all 32 bits can be as NaN and Inf can be problematic.
+ * collisions. Unfortunately not all 32 bits can be used as NaN and Inf can be problematic.
*
* Note that this conversion assumes to be running on a L-endian system. */
float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash)
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index ebce28c4e23..f4485b2565e 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -327,6 +327,8 @@ IDTypeInfo IDType_ID_CU = {
.blend_read_expand = curve_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
static int cu_isectLL(const float v1[3],
@@ -2373,7 +2375,7 @@ static void make_bevel_list_3D_minimum_twist(BevList *bl)
* 0,1,2,3,4 --> 1,2,3,4,0
*
* this is why we compare last with second last
- * */
+ */
float vec_1[3] = {0, 1, 0}, vec_2[3] = {0, 1, 0}, angle, ang_fac, cross_tmp[3];
BevPoint *bevp_first;
@@ -4335,14 +4337,17 @@ void BKE_nurbList_handles_autocalc(ListBase *editnurb, uint8_t flag)
}
}
+/**
+ * \param code:
+ * - 1 (#HD_AUTO): set auto-handle.
+ * - 2 (#HD_VECT): set vector-handle.
+ * - 3 (#HD_ALIGN) it toggle, vector-handles become #HD_FREE.
+ *
+ * - 5: Set align, like 3 but no toggle.
+ * - 6: Clear align (setting #HD_FREE), like 3 but no toggle.
+ */
void BKE_nurbList_handles_set(ListBase *editnurb, const char code)
{
- /* code==1: set autohandle */
- /* code==2: set vectorhandle */
- /* code==3 (HD_ALIGN) it toggle, vectorhandles become HD_FREE */
- /* code==4: sets icu flag to become IPO_AUTO_HORIZ, horizontal extremes on auto-handles */
- /* code==5: Set align, like 3 but no toggle */
- /* code==6: Clear align, like 3 but no toggle */
BezTriple *bezt;
int a;
diff --git a/source/blender/blenkernel/intern/curve_convert.c b/source/blender/blenkernel/intern/curve_convert.c
new file mode 100644
index 00000000000..988ddb3bbc0
--- /dev/null
+++ b/source/blender/blenkernel/intern/curve_convert.c
@@ -0,0 +1,81 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bke
+ */
+
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_vfont_types.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_curve.h"
+#include "BKE_displist.h"
+#include "BKE_font.h"
+#include "BKE_lib_id.h"
+#include "BKE_modifier.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
+static Curve *curve_from_font_object(Object *object, Depsgraph *depsgraph)
+{
+ Curve *curve = (Curve *)object->data;
+ Curve *new_curve = (Curve *)BKE_id_copy_ex(NULL, &curve->id, NULL, LIB_ID_COPY_LOCALIZE);
+
+ Object *evaluated_object = DEG_get_evaluated_object(depsgraph, object);
+ BKE_vfont_to_curve_nubase(evaluated_object, FO_EDIT, &new_curve->nurb);
+
+ new_curve->type = OB_CURVE;
+
+ new_curve->flag &= ~CU_3D;
+ BKE_curve_curve_dimension_update(new_curve);
+
+ return new_curve;
+}
+
+static Curve *curve_from_curve_object(Object *object, Depsgraph *depsgraph, bool apply_modifiers)
+{
+ Object *evaluated_object = DEG_get_evaluated_object(depsgraph, object);
+ Curve *curve = (Curve *)evaluated_object->data;
+ Curve *new_curve = (Curve *)BKE_id_copy_ex(NULL, &curve->id, NULL, LIB_ID_COPY_LOCALIZE);
+
+ if (apply_modifiers) {
+ BKE_curve_calc_modifiers_pre(depsgraph,
+ DEG_get_input_scene(depsgraph),
+ evaluated_object,
+ BKE_curve_nurbs_get(curve),
+ &new_curve->nurb,
+ DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
+ }
+
+ return new_curve;
+}
+
+Curve *BKE_curve_new_from_object(Object *object, Depsgraph *depsgraph, bool apply_modifiers)
+{
+ if (!ELEM(object->type, OB_FONT, OB_CURVE)) {
+ return NULL;
+ }
+
+ if (object->type == OB_FONT) {
+ return curve_from_font_object(object, depsgraph);
+ }
+
+ return curve_from_curve_object(object, depsgraph, apply_modifiers);
+}
diff --git a/source/blender/blenkernel/intern/curve_deform.c b/source/blender/blenkernel/intern/curve_deform.c
index 4725be6d302..63da7c1dd11 100644
--- a/source/blender/blenkernel/intern/curve_deform.c
+++ b/source/blender/blenkernel/intern/curve_deform.c
@@ -233,7 +233,7 @@ static bool calc_curve_deform(
* Now for Neg Up XYZ, the colors are all dark, and ordered clockwise - Campbell
*
* note: moved functions into quat_apply_track/vec_apply_track
- * */
+ */
copy_qt_qt(quat, new_quat);
copy_v3_v3(cent, co);
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 1121df0d568..d8d9675b42b 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -212,9 +212,9 @@ static void layerFree_mdeformvert(void *data, int count, int size)
/* copy just zeros in this case */
static void layerCopy_bmesh_elem_py_ptr(const void *UNUSED(source), void *dest, int count)
{
- int i, size = sizeof(void *);
+ const int size = sizeof(void *);
- for (i = 0; i < count; i++) {
+ for (int i = 0; i < count; i++) {
void **ptr = POINTER_OFFSET(dest, i * size);
*ptr = NULL;
}
@@ -253,15 +253,14 @@ static void layerInterp_mdeformvert(const void **sources,
MDeformVert *dvert = dest;
struct MDeformWeight_Link *dest_dwlink = NULL;
struct MDeformWeight_Link *node;
- int i, j, totweight;
/* build a list of unique def_nrs for dest */
- totweight = 0;
- for (i = 0; i < count; i++) {
+ int totweight = 0;
+ for (int i = 0; i < count; i++) {
const MDeformVert *source = sources[i];
float interp_weight = weights[i];
- for (j = 0; j < source->totweight; j++) {
+ for (int j = 0; j < source->totweight; j++) {
MDeformWeight *dw = &source->dw[j];
float weight = dw->weight * interp_weight;
@@ -311,7 +310,8 @@ static void layerInterp_mdeformvert(const void **sources,
if (totweight) {
dvert->totweight = totweight;
- for (i = 0, node = dest_dwlink; node; node = node->next, i++) {
+ int i = 0;
+ for (node = dest_dwlink; node; node = node->next, i++) {
if (node->dw.weight > 1.0f) {
node->dw.weight = 1.0f;
}
@@ -416,18 +416,16 @@ static void layerInterp_tface(
const void **sources, const float *weights, const float *sub_weights, int count, void *dest)
{
MTFace *tf = dest;
- int i, j, k;
float uv[4][2] = {{0.0f}};
- const float *sub_weight;
- sub_weight = sub_weights;
- for (i = 0; i < count; i++) {
+ const float *sub_weight = sub_weights;
+ for (int i = 0; i < count; i++) {
const float interp_weight = weights[i];
const MTFace *src = sources[i];
- for (j = 0; j < 4; j++) {
+ for (int j = 0; j < 4; j++) {
if (sub_weights) {
- for (k = 0; k < 4; k++, sub_weight++) {
+ for (int k = 0; k < 4; k++, sub_weight++) {
madd_v2_v2fl(uv[j], src->uv[k], (*sub_weight) * interp_weight);
}
}
@@ -446,9 +444,8 @@ static void layerSwap_tface(void *data, const int *corner_indices)
{
MTFace *tf = data;
float uv[4][2];
- int j;
- for (j = 0; j < 4; j++) {
+ for (int j = 0; j < 4; j++) {
const int source_index = corner_indices[j];
copy_v2_v2(uv[j], tf->uv[source_index]);
}
@@ -476,6 +473,21 @@ static void layerCopy_propFloat(const void *source, void *dest, int count)
memcpy(dest, source, sizeof(MFloatProperty) * count);
}
+static void layerInterp_propFloat(const void **sources,
+ const float *weights,
+ const float *UNUSED(sub_weights),
+ int count,
+ void *dest)
+{
+ float result = 0.0f;
+ for (int i = 0; i < count; i++) {
+ const float interp_weight = weights[i];
+ const float src = *(const float *)sources[i];
+ result += src * interp_weight;
+ }
+ *(float *)dest = result;
+}
+
static bool layerValidate_propFloat(void *data, const uint totitems, const bool do_fixes)
{
MFloatProperty *fp = data;
@@ -517,18 +529,16 @@ static void layerInterp_origspace_face(
const void **sources, const float *weights, const float *sub_weights, int count, void *dest)
{
OrigSpaceFace *osf = dest;
- int i, j, k;
float uv[4][2] = {{0.0f}};
- const float *sub_weight;
- sub_weight = sub_weights;
- for (i = 0; i < count; i++) {
+ const float *sub_weight = sub_weights;
+ for (int i = 0; i < count; i++) {
const float interp_weight = weights[i];
const OrigSpaceFace *src = sources[i];
- for (j = 0; j < 4; j++) {
+ for (int j = 0; j < 4; j++) {
if (sub_weights) {
- for (k = 0; k < 4; k++, sub_weight++) {
+ for (int k = 0; k < 4; k++, sub_weight++) {
madd_v2_v2fl(uv[j], src->uv[k], (*sub_weight) * interp_weight);
}
}
@@ -546,9 +556,8 @@ static void layerSwap_origspace_face(void *data, const int *corner_indices)
{
OrigSpaceFace *osf = data;
float uv[4][2];
- int j;
- for (j = 0; j < 4; j++) {
+ for (int j = 0; j < 4; j++) {
copy_v2_v2(uv[j], osf->uv[corner_indices[j]]);
}
memcpy(osf->uv, uv, sizeof(osf->uv));
@@ -567,13 +576,11 @@ static void layerDefault_origspace_face(void *data, int count)
static void layerSwap_mdisps(void *data, const int *ci)
{
MDisps *s = data;
- float(*d)[3] = NULL;
- int corners, cornersize, S;
if (s->disps) {
int nverts = (ci[1] == 3) ? 4 : 3; /* silly way to know vertex count of face */
- corners = multires_mdisp_corners(s);
- cornersize = s->totdisp / corners;
+ int corners = multires_mdisp_corners(s);
+ int cornersize = s->totdisp / corners;
if (corners != nverts) {
/* happens when face changed vertex count in edit mode
@@ -585,9 +592,9 @@ static void layerSwap_mdisps(void *data, const int *ci)
return;
}
- d = MEM_calloc_arrayN(s->totdisp, sizeof(float[3]), "mdisps swap");
+ float(*d)[3] = MEM_calloc_arrayN(s->totdisp, sizeof(float[3]), "mdisps swap");
- for (S = 0; S < corners; S++) {
+ for (int S = 0; S < corners; S++) {
memcpy(d + cornersize * S, s->disps + cornersize * ci[S], sizeof(float[3]) * cornersize);
}
@@ -1128,9 +1135,8 @@ static void layerSwap_mcol(void *data, const int *corner_indices)
{
MCol *mcol = data;
MCol col[4];
- int j;
- for (j = 0; j < 4; j++) {
+ for (int j = 0; j < 4; j++) {
col[j] = mcol[corner_indices[j]];
}
@@ -1562,7 +1568,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
N_("Float"),
layerCopy_propFloat,
NULL,
- NULL,
+ layerInterp_propFloat,
NULL,
NULL,
layerValidate_propFloat},
@@ -2064,13 +2070,13 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
void CustomData_update_typemap(CustomData *data)
{
- int i, lasttype = -1;
+ int lasttype = -1;
- for (i = 0; i < CD_NUMTYPES; i++) {
+ for (int i = 0; i < CD_NUMTYPES; i++) {
data->typemap[i] = -1;
}
- for (i = 0; i < data->totlayer; i++) {
+ for (int i = 0; i < data->totlayer; i++) {
const int type = data->layers[i].type;
if (type != lasttype) {
data->typemap[type] = i;
@@ -2097,18 +2103,16 @@ bool CustomData_merge(const struct CustomData *source,
{
/*const LayerTypeInfo *typeInfo;*/
CustomDataLayer *layer, *newlayer;
- void *data;
- int i, type, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0,
- flag = 0;
+ int lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0;
int number = 0, maxnumber = -1;
bool changed = false;
- for (i = 0; i < source->totlayer; i++) {
+ for (int i = 0; i < source->totlayer; i++) {
layer = &source->layers[i];
/*typeInfo = layerType_getInfo(layer->type);*/ /*UNUSED*/
- type = layer->type;
- flag = layer->flag;
+ int type = layer->type;
+ int flag = layer->flag;
if (type != lasttype) {
number = 0;
@@ -2136,6 +2140,7 @@ bool CustomData_merge(const struct CustomData *source,
continue;
}
+ void *data;
switch (alloctype) {
case CD_ASSIGN:
case CD_REFERENCE:
@@ -2518,8 +2523,7 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
/* Passing a layer-data to copy from with an alloctype that won't copy is
* most likely a bug */
- BLI_assert(!layerdata || (alloctype == CD_ASSIGN) || (alloctype == CD_DUPLICATE) ||
- (alloctype == CD_REFERENCE));
+ BLI_assert(!layerdata || ELEM(alloctype, CD_ASSIGN, CD_DUPLICATE, CD_REFERENCE));
if (!typeInfo->defaultname && CustomData_has_layer(data, type)) {
return &data->layers[CustomData_get_layer_index(data, type)];
@@ -2616,10 +2620,9 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
void *CustomData_add_layer(
CustomData *data, int type, eCDAllocType alloctype, void *layerdata, int totelem)
{
- CustomDataLayer *layer;
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
- layer = customData_add_layer__internal(
+ CustomDataLayer *layer = customData_add_layer__internal(
data, type, alloctype, layerdata, totelem, typeInfo->defaultname);
CustomData_update_typemap(data);
@@ -2638,9 +2641,8 @@ void *CustomData_add_layer_named(CustomData *data,
int totelem,
const char *name)
{
- CustomDataLayer *layer;
-
- layer = customData_add_layer__internal(data, type, alloctype, layerdata, totelem, name);
+ CustomDataLayer *layer = customData_add_layer__internal(
+ data, type, alloctype, layerdata, totelem, name);
CustomData_update_typemap(data);
if (layer) {
@@ -2828,12 +2830,10 @@ bool CustomData_is_referenced_layer(struct CustomData *data, int type)
void CustomData_free_temporary(CustomData *data, int totelem)
{
- CustomDataLayer *layer;
int i, j;
bool changed = false;
-
for (i = 0, j = 0; i < data->totlayer; i++) {
- layer = &data->layers[i];
+ CustomDataLayer *layer = &data->layers[i];
if (i != j) {
data->layers[j] = data->layers[i];
@@ -2881,20 +2881,20 @@ void CustomData_copy_elements(int type, void *src_data_ofs, void *dst_data_ofs,
}
}
-static void CustomData_copy_data_layer(const CustomData *source,
- CustomData *dest,
- int src_i,
- int dst_i,
- int src_index,
- int dst_index,
- int count)
+void CustomData_copy_data_layer(const CustomData *source,
+ CustomData *dest,
+ int src_layer_index,
+ int dst_layer_index,
+ int src_index,
+ int dst_index,
+ int count)
{
const LayerTypeInfo *typeInfo;
- const void *src_data = source->layers[src_i].data;
- void *dst_data = dest->layers[dst_i].data;
+ const void *src_data = source->layers[src_layer_index].data;
+ void *dst_data = dest->layers[dst_layer_index].data;
- typeInfo = layerType_getInfo(source->layers[src_i].type);
+ typeInfo = layerType_getInfo(source->layers[src_layer_index].type);
const size_t src_offset = (size_t)src_index * typeInfo->size;
const size_t dst_offset = (size_t)dst_index * typeInfo->size;
@@ -2903,7 +2903,7 @@ static void CustomData_copy_data_layer(const CustomData *source,
if (count && !(src_data == NULL && dst_data == NULL)) {
CLOG_WARN(&LOG,
"null data for %s type (%p --> %p), skipping",
- layerType_getName(source->layers[src_i].type),
+ layerType_getName(source->layers[src_layer_index].type),
(void *)src_data,
(void *)dst_data);
}
@@ -3681,10 +3681,8 @@ void CustomData_bmesh_free_block_data_exclude_by_type(CustomData *data,
static void CustomData_bmesh_set_default_n(CustomData *data, void **block, int n)
{
- const LayerTypeInfo *typeInfo;
int offset = data->layers[n].offset;
-
- typeInfo = layerType_getInfo(data->layers[n].type);
+ const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[n].type);
if (typeInfo->set_default) {
typeInfo->set_default(POINTER_OFFSET(*block, offset), 1);
@@ -4050,7 +4048,6 @@ void CustomData_bmesh_interp(CustomData *data,
return;
}
- int i, j;
void *source_buf[SOURCE_BUF_SIZE];
const void **sources = (const void **)source_buf;
@@ -4071,11 +4068,11 @@ void CustomData_bmesh_interp(CustomData *data,
}
/* interpolates a layer at a time */
- for (i = 0; i < data->totlayer; i++) {
+ for (int i = 0; i < data->totlayer; i++) {
CustomDataLayer *layer = &data->layers[i];
const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
if (typeInfo->interp) {
- for (j = 0; j < count; j++) {
+ for (int j = 0; j < count; j++) {
sources[j] = POINTER_OFFSET(src_blocks[j], layer->offset);
}
CustomData_bmesh_interp_n(
@@ -4465,7 +4462,6 @@ bool CustomData_layer_validate(CustomDataLayer *layer, const uint totitems, cons
void CustomData_layers__print(CustomData *data)
{
-
printf("{\n");
int i;
@@ -4520,10 +4516,7 @@ void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int
{
CustomDataExternal *external = data->external;
CustomDataLayer *layer;
- CDataFile *cdf;
- CDataFileLayer *blay;
char filename[FILE_MAX];
- const LayerTypeInfo *typeInfo;
int update = 0;
if (!external) {
@@ -4532,7 +4525,7 @@ void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int
for (int i = 0; i < data->totlayer; i++) {
layer = &data->layers[i];
- typeInfo = layerType_getInfo(layer->type);
+ const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
if (!(mask & CD_TYPE_AS_MASK(layer->type))) {
/* pass */
@@ -4551,7 +4544,7 @@ void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int
customdata_external_filename(filename, id, external);
- cdf = cdf_create(CDF_TYPE_MESH);
+ CDataFile *cdf = cdf_create(CDF_TYPE_MESH);
if (!cdf_read_open(cdf, filename)) {
cdf_free(cdf);
CLOG_ERROR(&LOG, "Failed to read %s layer from %s.", layerType_getName(layer->type), filename);
@@ -4560,7 +4553,7 @@ void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int
for (int i = 0; i < data->totlayer; i++) {
layer = &data->layers[i];
- typeInfo = layerType_getInfo(layer->type);
+ const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
if (!(mask & CD_TYPE_AS_MASK(layer->type))) {
/* pass */
@@ -4569,7 +4562,7 @@ void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int
/* pass */
}
else if ((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->read) {
- blay = cdf_layer_find(cdf, layer->type, layer->name);
+ CDataFileLayer *blay = cdf_layer_find(cdf, layer->type, layer->name);
if (blay) {
if (cdf_read_layer(cdf, blay)) {
@@ -4596,10 +4589,6 @@ void CustomData_external_write(
CustomData *data, ID *id, CustomDataMask mask, int totelem, int free)
{
CustomDataExternal *external = data->external;
- CustomDataLayer *layer;
- CDataFile *cdf;
- CDataFileLayer *blay;
- const LayerTypeInfo *typeInfo;
int update = 0;
char filename[FILE_MAX];
@@ -4609,8 +4598,8 @@ void CustomData_external_write(
/* test if there is anything to write */
for (int i = 0; i < data->totlayer; i++) {
- layer = &data->layers[i];
- typeInfo = layerType_getInfo(layer->type);
+ CustomDataLayer *layer = &data->layers[i];
+ const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
if (!(mask & CD_TYPE_AS_MASK(layer->type))) {
/* pass */
@@ -4628,11 +4617,11 @@ void CustomData_external_write(
CustomData_external_read(data, id, mask, totelem);
customdata_external_filename(filename, id, external);
- cdf = cdf_create(CDF_TYPE_MESH);
+ CDataFile *cdf = cdf_create(CDF_TYPE_MESH);
for (int i = 0; i < data->totlayer; i++) {
- layer = &data->layers[i];
- typeInfo = layerType_getInfo(layer->type);
+ CustomDataLayer *layer = &data->layers[i];
+ const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
if ((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->filesize) {
if (layer->flag & CD_FLAG_IN_MEMORY) {
@@ -4654,11 +4643,11 @@ void CustomData_external_write(
int i;
for (i = 0; i < data->totlayer; i++) {
- layer = &data->layers[i];
- typeInfo = layerType_getInfo(layer->type);
+ CustomDataLayer *layer = &data->layers[i];
+ const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
if ((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->write) {
- blay = cdf_layer_find(cdf, layer->type, layer->name);
+ CDataFileLayer *blay = cdf_layer_find(cdf, layer->type, layer->name);
if (cdf_write_layer(cdf, blay)) {
if (typeInfo->write(cdf, layer->data, totelem)) {
@@ -4682,8 +4671,8 @@ void CustomData_external_write(
}
for (i = 0; i < data->totlayer; i++) {
- layer = &data->layers[i];
- typeInfo = layerType_getInfo(layer->type);
+ CustomDataLayer *layer = &data->layers[i];
+ const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
if ((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->write) {
if (free) {
@@ -4703,15 +4692,13 @@ void CustomData_external_add(
CustomData *data, ID *UNUSED(id), int type, int UNUSED(totelem), const char *filename)
{
CustomDataExternal *external = data->external;
- CustomDataLayer *layer;
- int layer_index;
- layer_index = CustomData_get_active_layer_index(data, type);
+ int layer_index = CustomData_get_active_layer_index(data, type);
if (layer_index == -1) {
return;
}
- layer = &data->layers[layer_index];
+ CustomDataLayer *layer = &data->layers[layer_index];
if (layer->flag & CD_FLAG_EXTERNAL) {
return;
@@ -4835,8 +4822,6 @@ static void customdata_data_transfer_interp_generic(const CustomDataTransferLaye
cd_interp interp_cd = NULL;
cd_copy copy_cd = NULL;
- void *tmp_dst;
-
if (!sources) {
/* Not supported here, abort. */
return;
@@ -4853,7 +4838,7 @@ static void customdata_data_transfer_interp_generic(const CustomDataTransferLaye
copy_cd = type_info->copy;
}
- tmp_dst = MEM_mallocN(data_size, __func__);
+ void *tmp_dst = MEM_mallocN(data_size, __func__);
if (count > 1 && !interp_cd) {
if (data_flag) {
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 375792a02c2..c860e57520d 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -292,164 +292,139 @@ bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, i
/* ICC with the optimization -02 causes crashes. */
# pragma intel optimization_level 1
#endif
-static void curve_to_displist(Curve *cu,
- ListBase *nubase,
- ListBase *dispbase,
- const bool for_render)
+
+static void curve_to_displist(const Curve *cu,
+ const ListBase *nubase,
+ const bool for_render,
+ ListBase *r_dispbase)
{
- DispList *dl;
- BezTriple *bezt, *prevbezt;
- BPoint *bp;
- float *data;
- int a, len, resolu;
const bool editmode = (!for_render && (cu->editnurb || cu->editfont));
LISTBASE_FOREACH (Nurb *, nu, nubase) {
if (nu->hide != 0 && editmode) {
continue;
}
-
- if (for_render && cu->resolu_ren != 0) {
- resolu = cu->resolu_ren;
- }
- else {
- resolu = nu->resolu;
- }
-
if (!BKE_nurb_check_valid_u(nu)) {
- /* pass */
+ continue;
}
- else if (nu->type == CU_BEZIER) {
- /* count */
- len = 0;
- a = nu->pntsu - 1;
- if (nu->flagu & CU_NURB_CYCLIC) {
- a++;
- }
- prevbezt = nu->bezt;
- bezt = prevbezt + 1;
- while (a--) {
- if (a == 0 && (nu->flagu & CU_NURB_CYCLIC)) {
- bezt = nu->bezt;
- }
+ const int resolution = (for_render && cu->resolu_ren != 0) ? cu->resolu_ren : nu->resolu;
+ const bool is_cyclic = nu->flagu & CU_NURB_CYCLIC;
+ const BezTriple *bezt_first = &nu->bezt[0];
+ const BezTriple *bezt_last = &nu->bezt[nu->pntsu - 1];
+ if (nu->type == CU_BEZIER) {
+ int samples_len = 0;
+ for (int i = 1; i < nu->pntsu; i++) {
+ const BezTriple *prevbezt = &nu->bezt[i - 1];
+ const BezTriple *bezt = &nu->bezt[i];
if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) {
- len++;
+ samples_len++;
}
else {
- len += resolu;
+ samples_len += resolution;
}
-
- if (a == 0 && (nu->flagu & CU_NURB_CYCLIC) == 0) {
- len++;
+ }
+ if (is_cyclic) {
+ /* If the curve is cyclic, sample the last edge between the last and first points. */
+ if (bezt_first->h1 == HD_VECT && bezt_last->h2 == HD_VECT) {
+ samples_len++;
}
-
- prevbezt = bezt;
- bezt++;
+ else {
+ samples_len += resolution;
+ }
+ }
+ else {
+ /* Otherwise, we only need one additional sample to complete the last edge. */
+ samples_len++;
}
- dl = MEM_callocN(sizeof(DispList), "makeDispListbez");
- /* len+1 because of 'forward_diff_bezier' function */
- dl->verts = MEM_mallocN((len + 1) * sizeof(float[3]), "dlverts");
- BLI_addtail(dispbase, dl);
+ /* Check that there are more than two points so the curve doesn't loop back on itself. This
+ * needs to be separate from `is_cyclic` because cyclic sampling can work with two points
+ * and resolution > 1. */
+ const bool use_cyclic_sample = is_cyclic && (samples_len != 2);
+
+ DispList *dl = MEM_callocN(sizeof(DispList), __func__);
+ /* Add one to the length because of 'BKE_curve_forward_diff_bezier'. */
+ dl->verts = MEM_mallocN(sizeof(float[3]) * (samples_len + 1), "dlverts");
+ BLI_addtail(r_dispbase, dl);
dl->parts = 1;
- dl->nr = len;
+ dl->nr = samples_len;
dl->col = nu->mat_nr;
dl->charidx = nu->charidx;
- data = dl->verts;
-
- /* check that (len != 2) so we don't immediately loop back on ourselves */
- if (nu->flagu & CU_NURB_CYCLIC && (dl->nr != 2)) {
- dl->type = DL_POLY;
- a = nu->pntsu;
- }
- else {
- dl->type = DL_SEGM;
- a = nu->pntsu - 1;
- }
-
- prevbezt = nu->bezt;
- bezt = prevbezt + 1;
+ dl->type = use_cyclic_sample ? DL_POLY : DL_SEGM;
- while (a--) {
- if (a == 0 && dl->type == DL_POLY) {
- bezt = nu->bezt;
- }
+ float *data = dl->verts;
+ for (int i = 1; i < nu->pntsu; i++) {
+ const BezTriple *prevbezt = &nu->bezt[i - 1];
+ const BezTriple *bezt = &nu->bezt[i];
if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) {
copy_v3_v3(data, prevbezt->vec[1]);
data += 3;
}
else {
- int j;
- for (j = 0; j < 3; j++) {
+ for (int j = 0; j < 3; j++) {
BKE_curve_forward_diff_bezier(prevbezt->vec[1][j],
prevbezt->vec[2][j],
bezt->vec[0][j],
bezt->vec[1][j],
data + j,
- resolu,
+ resolution,
sizeof(float[3]));
}
-
- data += 3 * resolu;
+ data += 3 * resolution;
}
-
- if (a == 0 && dl->type == DL_SEGM) {
- copy_v3_v3(data, bezt->vec[1]);
+ }
+ if (is_cyclic) {
+ if (bezt_first->h1 == HD_VECT && bezt_last->h2 == HD_VECT) {
+ copy_v3_v3(data, bezt_last->vec[1]);
}
-
- prevbezt = bezt;
- bezt++;
+ else {
+ for (int j = 0; j < 3; j++) {
+ BKE_curve_forward_diff_bezier(bezt_last->vec[1][j],
+ bezt_last->vec[2][j],
+ bezt_first->vec[0][j],
+ bezt_first->vec[1][j],
+ data + j,
+ resolution,
+ sizeof(float[3]));
+ }
+ }
+ }
+ else {
+ copy_v3_v3(data, bezt_last->vec[1]);
}
}
else if (nu->type == CU_NURBS) {
- len = (resolu * SEGMENTSU(nu));
-
- dl = MEM_callocN(sizeof(DispList), "makeDispListsurf");
+ const int len = (resolution * SEGMENTSU(nu));
+ DispList *dl = MEM_callocN(sizeof(DispList), __func__);
dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts");
- BLI_addtail(dispbase, dl);
+ BLI_addtail(r_dispbase, dl);
dl->parts = 1;
-
dl->nr = len;
dl->col = nu->mat_nr;
dl->charidx = nu->charidx;
+ dl->type = is_cyclic ? DL_POLY : DL_SEGM;
- data = dl->verts;
- if (nu->flagu & CU_NURB_CYCLIC) {
- dl->type = DL_POLY;
- }
- else {
- dl->type = DL_SEGM;
- }
- BKE_nurb_makeCurve(nu, data, NULL, NULL, NULL, resolu, sizeof(float[3]));
+ BKE_nurb_makeCurve(nu, dl->verts, NULL, NULL, NULL, resolution, sizeof(float[3]));
}
else if (nu->type == CU_POLY) {
- len = nu->pntsu;
- dl = MEM_callocN(sizeof(DispList), "makeDispListpoly");
+ const int len = nu->pntsu;
+ DispList *dl = MEM_callocN(sizeof(DispList), __func__);
dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts");
- BLI_addtail(dispbase, dl);
+ BLI_addtail(r_dispbase, dl);
dl->parts = 1;
dl->nr = len;
dl->col = nu->mat_nr;
dl->charidx = nu->charidx;
+ dl->type = (is_cyclic && (dl->nr != 2)) ? DL_POLY : DL_SEGM;
- data = dl->verts;
- if ((nu->flagu & CU_NURB_CYCLIC) && (dl->nr != 2)) {
- dl->type = DL_POLY;
- }
- else {
- dl->type = DL_SEGM;
- }
-
- a = len;
- bp = nu->bp;
- while (a--) {
- copy_v3_v3(data, bp->vec);
- bp++;
- data += 3;
+ float(*coords)[3] = (float(*)[3])dl->verts;
+ for (int i = 0; i < len; i++) {
+ const BPoint *bp = &nu->bp[i];
+ copy_v3_v3(coords[i], bp->vec);
}
}
}
@@ -461,22 +436,11 @@ static void curve_to_displist(Curve *cu,
* This is also used to initialize #DispList.nors (one normal per display list).
* \param flipnormal: Flip the normal (same as passing \a normal_proj negated)
*/
-void BKE_displist_fill(ListBase *dispbase,
+void BKE_displist_fill(const ListBase *dispbase,
ListBase *to,
const float normal_proj[3],
- const bool flipnormal)
+ const bool flip_normal)
{
- ScanFillContext sf_ctx;
- ScanFillVert *sf_vert, *sf_vert_new, *sf_vert_last;
- ScanFillFace *sf_tri;
- MemArena *sf_arena;
- DispList *dlnew = NULL;
- float *f1;
- int colnr = 0, charidx = 0, cont = 1, tot, a, *index, nextcol = 0;
- int totvert;
- const int scanfill_flag = BLI_SCANFILL_CALC_REMOVE_DOUBLES | BLI_SCANFILL_CALC_POLYS |
- BLI_SCANFILL_CALC_HOLES;
-
if (dispbase == NULL) {
return;
}
@@ -484,44 +448,48 @@ void BKE_displist_fill(ListBase *dispbase,
return;
}
- sf_arena = BLI_memarena_new(BLI_SCANFILL_ARENA_SIZE, __func__);
+ const int scanfill_flag = BLI_SCANFILL_CALC_REMOVE_DOUBLES | BLI_SCANFILL_CALC_POLYS |
+ BLI_SCANFILL_CALC_HOLES;
+
+ MemArena *sf_arena = BLI_memarena_new(BLI_SCANFILL_ARENA_SIZE, __func__);
- while (cont) {
- int dl_flag_accum = 0;
- cont = 0;
- totvert = 0;
- nextcol = 0;
+ short colnr = 0;
+ int charidx = 0;
+ bool should_continue = true;
+ while (should_continue) {
+ should_continue = false;
+ bool nextcol = false;
+ ScanFillContext sf_ctx;
BLI_scanfill_begin_arena(&sf_ctx, sf_arena);
- LISTBASE_FOREACH (DispList *, dl, dispbase) {
+ int totvert = 0;
+ short dl_flag_accum = 0;
+ short dl_rt_accum = 0;
+ LISTBASE_FOREACH (const DispList *, dl, dispbase) {
if (dl->type == DL_POLY) {
if (charidx < dl->charidx) {
- cont = 1;
+ should_continue = true;
}
else if (charidx == dl->charidx) { /* character with needed index */
if (colnr == dl->col) {
sf_ctx.poly_nr++;
- /* make editverts and edges */
- f1 = dl->verts;
- a = dl->nr;
- sf_vert = sf_vert_new = NULL;
-
- while (a--) {
+ /* Make verts and edges. */
+ ScanFillVert *sf_vert = NULL;
+ ScanFillVert *sf_vert_last = NULL;
+ ScanFillVert *sf_vert_new = NULL;
+ for (int i = 0; i < dl->nr; i++) {
sf_vert_last = sf_vert;
-
- sf_vert = BLI_scanfill_vert_add(&sf_ctx, f1);
+ sf_vert = BLI_scanfill_vert_add(&sf_ctx, &dl->verts[3 * i]);
totvert++;
-
if (sf_vert_last == NULL) {
sf_vert_new = sf_vert;
}
else {
BLI_scanfill_edge_add(&sf_ctx, sf_vert_last, sf_vert);
}
- f1 += 3;
}
if (sf_vert != NULL && sf_vert_new != NULL) {
@@ -530,66 +498,42 @@ void BKE_displist_fill(ListBase *dispbase,
}
else if (colnr < dl->col) {
/* got poly with next material at current char */
- cont = 1;
- nextcol = 1;
+ should_continue = true;
+ nextcol = true;
}
}
dl_flag_accum |= dl->flag;
+ dl_rt_accum |= dl->rt;
}
}
- /* XXX (obedit && obedit->actcol) ? (obedit->actcol - 1) : 0)) { */
- if (totvert && (tot = BLI_scanfill_calc_ex(&sf_ctx, scanfill_flag, normal_proj))) {
- if (tot) {
- dlnew = MEM_callocN(sizeof(DispList), "filldisplist");
- dlnew->type = DL_INDEX3;
- dlnew->flag = (dl_flag_accum & (DL_BACK_CURVE | DL_FRONT_CURVE));
- dlnew->col = colnr;
- dlnew->nr = totvert;
- dlnew->parts = tot;
-
- dlnew->index = MEM_mallocN(sizeof(int[3]) * tot, "dlindex");
- dlnew->verts = MEM_mallocN(sizeof(float[3]) * totvert, "dlverts");
-
- if (normal_proj != NULL) {
- /* Use a single normal for #DL_INDEX3.
- * Counter intuitively, the normal must always be the flipped projection vector. */
- dlnew->nors = MEM_mallocN(sizeof(float[3]), "dlnors");
- if (flipnormal) {
- copy_v3_v3(dlnew->nors, normal_proj);
- }
- else {
- negate_v3_v3(dlnew->nors, normal_proj);
- }
- }
-
- /* vert data */
- f1 = dlnew->verts;
- totvert = 0;
-
- for (sf_vert = sf_ctx.fillvertbase.first; sf_vert; sf_vert = sf_vert->next) {
- copy_v3_v3(f1, sf_vert->co);
- f1 += 3;
-
- /* index number */
- sf_vert->tmp.i = totvert;
- totvert++;
- }
-
- /* index data */
-
- index = dlnew->index;
- for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri = sf_tri->next) {
- index[0] = sf_tri->v1->tmp.i;
- index[1] = sf_tri->v2->tmp.i;
- index[2] = sf_tri->v3->tmp.i;
-
- if (flipnormal) {
- SWAP(int, index[0], index[2]);
- }
+ const int triangles_len = BLI_scanfill_calc_ex(&sf_ctx, scanfill_flag, normal_proj);
+ if (totvert != 0 && triangles_len != 0) {
+ DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisplist");
+ dlnew->type = DL_INDEX3;
+ dlnew->flag = (dl_flag_accum & (DL_BACK_CURVE | DL_FRONT_CURVE));
+ dlnew->rt = (dl_rt_accum & CU_SMOOTH);
+ dlnew->col = colnr;
+ dlnew->nr = totvert;
+ dlnew->parts = triangles_len;
+
+ dlnew->index = MEM_mallocN(sizeof(int[3]) * triangles_len, "dlindex");
+ dlnew->verts = MEM_mallocN(sizeof(float[3]) * totvert, "dlverts");
+
+ /* vert data */
+ int i;
+ LISTBASE_FOREACH_INDEX (ScanFillVert *, sf_vert, &sf_ctx.fillvertbase, i) {
+ copy_v3_v3(&dlnew->verts[3 * i], sf_vert->co);
+ sf_vert->tmp.i = i; /* Index number. */
+ }
- index += 3;
- }
+ /* index data */
+ int *index = dlnew->index;
+ LISTBASE_FOREACH (ScanFillFace *, sf_tri, &sf_ctx.fillfacebase) {
+ index[0] = sf_tri->v1->tmp.i;
+ index[1] = flip_normal ? sf_tri->v3->tmp.i : sf_tri->v2->tmp.i;
+ index[2] = flip_normal ? sf_tri->v2->tmp.i : sf_tri->v3->tmp.i;
+ index += 3;
}
BLI_addhead(to, dlnew);
@@ -608,27 +552,21 @@ void BKE_displist_fill(ListBase *dispbase,
}
BLI_memarena_free(sf_arena);
-
/* do not free polys, needed for wireframe display */
}
-static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
+static void bevels_to_filledpoly(const Curve *cu, ListBase *dispbase)
{
- const float z_up[3] = {0.0f, 0.0f, -1.0f};
- ListBase front, back;
- float *fp, *fp1;
- int a, dpoly;
+ ListBase front = {NULL, NULL};
+ ListBase back = {NULL, NULL};
- BLI_listbase_clear(&front);
- BLI_listbase_clear(&back);
-
- LISTBASE_FOREACH (DispList *, dl, dispbase) {
+ LISTBASE_FOREACH (const DispList *, dl, dispbase) {
if (dl->type == DL_SURF) {
if ((dl->flag & DL_CYCL_V) && (dl->flag & DL_CYCL_U) == 0) {
if ((cu->flag & CU_BACK) && (dl->flag & DL_BACK_CURVE)) {
- DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisp");
+ DispList *dlnew = MEM_callocN(sizeof(DispList), __func__);
BLI_addtail(&front, dlnew);
- dlnew->verts = fp1 = MEM_mallocN(sizeof(float[3]) * dl->parts, "filldisp1");
+ dlnew->verts = MEM_mallocN(sizeof(float[3]) * dl->parts, __func__);
dlnew->nr = dl->parts;
dlnew->parts = 1;
dlnew->type = DL_POLY;
@@ -636,20 +574,18 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
dlnew->col = dl->col;
dlnew->charidx = dl->charidx;
- fp = dl->verts;
- dpoly = 3 * dl->nr;
-
- a = dl->parts;
- while (a--) {
- copy_v3_v3(fp1, fp);
- fp1 += 3;
- fp += dpoly;
+ const float *old_verts = dl->verts;
+ float *new_verts = dlnew->verts;
+ for (int i = 0; i < dl->parts; i++) {
+ copy_v3_v3(new_verts, old_verts);
+ new_verts += 3;
+ old_verts += 3 * dl->nr;
}
}
if ((cu->flag & CU_FRONT) && (dl->flag & DL_FRONT_CURVE)) {
- DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisp");
+ DispList *dlnew = MEM_callocN(sizeof(DispList), __func__);
BLI_addtail(&back, dlnew);
- dlnew->verts = fp1 = MEM_mallocN(sizeof(float[3]) * dl->parts, "filldisp1");
+ dlnew->verts = MEM_mallocN(sizeof(float[3]) * dl->parts, __func__);
dlnew->nr = dl->parts;
dlnew->parts = 1;
dlnew->type = DL_POLY;
@@ -657,20 +593,19 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
dlnew->col = dl->col;
dlnew->charidx = dl->charidx;
- fp = dl->verts + 3 * (dl->nr - 1);
- dpoly = 3 * dl->nr;
-
- a = dl->parts;
- while (a--) {
- copy_v3_v3(fp1, fp);
- fp1 += 3;
- fp += dpoly;
+ const float *old_verts = dl->verts + 3 * (dl->nr - 1);
+ float *new_verts = dlnew->verts;
+ for (int i = 0; i < dl->parts; i++) {
+ copy_v3_v3(new_verts, old_verts);
+ new_verts += 3;
+ old_verts += 3 * dl->nr;
}
}
}
}
}
+ const float z_up[3] = {0.0f, 0.0f, -1.0f};
BKE_displist_fill(&front, dispbase, z_up, true);
BKE_displist_fill(&back, dispbase, z_up, false);
@@ -835,8 +770,12 @@ static ModifierData *curve_get_tessellate_point(Scene *scene,
}
/* Return true if any modifier was applied. */
-static bool curve_calc_modifiers_pre(
- Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *nurb, const bool for_render)
+bool BKE_curve_calc_modifiers_pre(Depsgraph *depsgraph,
+ Scene *scene,
+ Object *ob,
+ ListBase *source_nurb,
+ ListBase *target_nurb,
+ const bool for_render)
{
VirtualModifierData virtualModifierData;
ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
@@ -875,13 +814,13 @@ static bool curve_calc_modifiers_pre(
keyVerts = BKE_key_evaluate_object(ob, &numElems);
if (keyVerts) {
- BLI_assert(BKE_keyblock_curve_element_count(nurb) == numElems);
+ BLI_assert(BKE_keyblock_curve_element_count(source_nurb) == numElems);
/* split coords from key data, the latter also includes
* tilts, which is passed through in the modifier stack.
* this is also the reason curves do not use a virtual
* shape key modifier yet. */
- deformedVerts = BKE_curve_nurbs_key_vert_coords_alloc(nurb, keyVerts, &numVerts);
+ deformedVerts = BKE_curve_nurbs_key_vert_coords_alloc(source_nurb, keyVerts, &numVerts);
}
}
@@ -897,7 +836,7 @@ static bool curve_calc_modifiers_pre(
}
if (!deformedVerts) {
- deformedVerts = BKE_curve_nurbs_vert_coords_alloc(nurb, &numVerts);
+ deformedVerts = BKE_curve_nurbs_vert_coords_alloc(source_nurb, &numVerts);
}
mti->deformVerts(md, &mectx, NULL, deformedVerts, numVerts);
@@ -910,11 +849,11 @@ static bool curve_calc_modifiers_pre(
}
if (deformedVerts) {
- BKE_curve_nurbs_vert_coords_apply(nurb, deformedVerts, false);
+ BKE_curve_nurbs_vert_coords_apply(target_nurb, deformedVerts, false);
MEM_freeN(deformedVerts);
}
if (keyVerts) { /* these are not passed through modifier stack */
- BKE_curve_nurbs_key_vert_tilts_apply(nurb, keyVerts);
+ BKE_curve_nurbs_key_vert_tilts_apply(target_nurb, keyVerts);
}
if (keyVerts) {
@@ -1129,7 +1068,7 @@ static void curve_calc_modifiers_post(Depsgraph *depsgraph,
*
* The right solution would be to COW the Curve data block at the input of the modifier
* stack just like what the mesh modifier does.
- * */
+ */
modified = BKE_mesh_new_nomain_from_curve_displist(ob, dispbase);
}
@@ -1216,7 +1155,8 @@ void BKE_displist_make_surf(Depsgraph *depsgraph,
}
if (!for_orco) {
- force_mesh_conversion = curve_calc_modifiers_pre(depsgraph, scene, ob, &nubase, for_render);
+ force_mesh_conversion = BKE_curve_calc_modifiers_pre(
+ depsgraph, scene, ob, &nubase, &nubase, for_render);
}
LISTBASE_FOREACH (Nurb *, nu, &nubase) {
@@ -1566,7 +1506,8 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph,
}
if (!for_orco) {
- force_mesh_conversion = curve_calc_modifiers_pre(depsgraph, scene, ob, &nubase, for_render);
+ force_mesh_conversion = BKE_curve_calc_modifiers_pre(
+ depsgraph, scene, ob, &nubase, &nubase, for_render);
}
BKE_curve_bevelList_make(ob, &nubase, for_render);
@@ -1576,7 +1517,7 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph,
/* no bevel or extrude, and no width correction? */
if (!dlbev.first && cu->width == 1.0f) {
- curve_to_displist(cu, &nubase, dispbase, for_render);
+ curve_to_displist(cu, &nubase, for_render, dispbase);
}
else {
const float widfac = cu->width - 1.0f;
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index 811a27c9f3f..4a25b0e9d98 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -3419,7 +3419,7 @@ void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface,
break;
}
- /* Set output format, png in case exr isn't supported */
+ /* Set output format, PNG in case EXR isn't supported. */
#ifdef WITH_OPENEXR
if (format == R_IMF_IMTYPE_OPENEXR) { /* OpenEXR 32-bit float */
ibuf->ftype = IMB_FTYPE_OPENEXR;
@@ -5156,7 +5156,8 @@ static int dynamicPaint_prepareEffectStep(struct Depsgraph *depsgraph,
/* Init force data if required */
if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) {
- ListBase *effectors = BKE_effectors_create(depsgraph, ob, NULL, surface->effector_weights);
+ ListBase *effectors = BKE_effectors_create(
+ depsgraph, ob, NULL, surface->effector_weights, false);
/* allocate memory for force data (dir vector + strength) */
*force = MEM_mallocN(sizeof(float[4]) * sData->total_points, "PaintEffectForces");
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 13e9bb1bf24..4104b6080c5 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -270,11 +270,71 @@ void BKE_effector_relations_free(ListBase *lb)
}
}
+/* Check that the force field isn't disabled via its flags. */
+static bool is_effector_enabled(PartDeflect *pd, bool use_rotation)
+{
+ switch (pd->forcefield) {
+ case PFIELD_BOID:
+ case PFIELD_GUIDE:
+ return true;
+
+ case PFIELD_TEXTURE:
+ return (pd->flag & PFIELD_DO_LOCATION) != 0 && pd->tex != NULL;
+
+ default:
+ if (use_rotation) {
+ return (pd->flag & (PFIELD_DO_LOCATION | PFIELD_DO_ROTATION)) != 0;
+ }
+ else {
+ return (pd->flag & PFIELD_DO_LOCATION) != 0;
+ }
+ }
+}
+
+/* Check that the force field won't have zero effect due to strength settings. */
+static bool is_effector_nonzero_strength(PartDeflect *pd)
+{
+ if (pd->f_strength != 0.0f) {
+ return true;
+ }
+
+ if (pd->forcefield == PFIELD_TEXTURE) {
+ return false;
+ }
+
+ if (pd->f_noise > 0.0f || pd->f_flow != 0.0f) {
+ return true;
+ }
+
+ switch (pd->forcefield) {
+ case PFIELD_BOID:
+ case PFIELD_GUIDE:
+ return true;
+
+ case PFIELD_VORTEX:
+ return pd->shape != PFIELD_SHAPE_POINT;
+
+ case PFIELD_DRAG:
+ return pd->f_damp != 0.0f;
+
+ default:
+ return false;
+ }
+}
+
+/* Check if the force field will affect its user. */
+static bool is_effector_relevant(PartDeflect *pd, EffectorWeights *weights, bool use_rotation)
+{
+ return (weights->weight[pd->forcefield] != 0.0f) && is_effector_enabled(pd, use_rotation) &&
+ is_effector_nonzero_strength(pd);
+}
+
/* Create effective list of effectors from relations built beforehand. */
ListBase *BKE_effectors_create(Depsgraph *depsgraph,
Object *ob_src,
ParticleSystem *psys_src,
- EffectorWeights *weights)
+ EffectorWeights *weights,
+ bool use_rotation)
{
Scene *scene = DEG_get_evaluated_scene(depsgraph);
ListBase *relations = DEG_get_effector_relations(depsgraph, weights->group);
@@ -299,7 +359,8 @@ ListBase *BKE_effectors_create(Depsgraph *depsgraph,
}
PartDeflect *pd = (relation->pd == relation->psys->part->pd) ? part->pd : part->pd2;
- if (weights->weight[pd->forcefield] == 0.0f) {
+
+ if (!is_effector_relevant(pd, weights, use_rotation)) {
continue;
}
@@ -310,7 +371,7 @@ ListBase *BKE_effectors_create(Depsgraph *depsgraph,
if (ob == ob_src) {
continue;
}
- if (weights->weight[ob->pd->forcefield] == 0.0f) {
+ if (!is_effector_relevant(ob->pd, weights, use_rotation)) {
continue;
}
if (ob->pd->shape == PFIELD_SHAPE_POINTS && BKE_object_get_evaluated_mesh(ob) == NULL) {
@@ -903,7 +964,9 @@ static void do_texture_effector(EffectorCache *eff,
madd_v3_v3fl(force, efd->nor, fac);
}
- add_v3_v3(total_force, force);
+ if (eff->pd->flag & PFIELD_DO_LOCATION) {
+ add_v3_v3(total_force, force);
+ }
}
static void do_physical_effector(EffectorCache *eff,
EffectorData *efd,
@@ -918,6 +981,7 @@ static void do_physical_effector(EffectorCache *eff,
float strength = pd->f_strength;
float damp = pd->f_damp;
float noise_factor = pd->f_noise;
+ float flow_falloff = efd->falloff;
if (noise_factor > 0.0f) {
strength += wind_func(rng, noise_factor);
@@ -1027,6 +1091,7 @@ static void do_physical_effector(EffectorCache *eff,
break;
case PFIELD_FLUIDFLOW:
zero_v3(force);
+ flow_falloff = 0;
#ifdef WITH_FLUID
if (pd->f_source) {
float density;
@@ -1036,8 +1101,7 @@ static void do_physical_effector(EffectorCache *eff,
influence *= density;
}
mul_v3_fl(force, influence);
- /* apply flow */
- madd_v3_v3fl(total_force, point->vel, -pd->f_flow * influence);
+ flow_falloff = influence;
}
}
#endif
@@ -1047,9 +1111,8 @@ static void do_physical_effector(EffectorCache *eff,
if (pd->flag & PFIELD_DO_LOCATION) {
madd_v3_v3fl(total_force, force, 1.0f / point->vel_to_sec);
- if (ELEM(pd->forcefield, PFIELD_HARMONIC, PFIELD_DRAG, PFIELD_FLUIDFLOW) == 0 &&
- pd->f_flow != 0.0f) {
- madd_v3_v3fl(total_force, point->vel, -pd->f_flow * efd->falloff);
+ if (!ELEM(pd->forcefield, PFIELD_HARMONIC, PFIELD_DRAG) && pd->f_flow != 0.0f) {
+ madd_v3_v3fl(total_force, point->vel, -pd->f_flow * flow_falloff);
}
}
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index ce710e2f7d4..8e1fa9732ea 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -1110,7 +1110,7 @@ void fcurve_samples_to_keyframes(FCurve *fcu, const int start, const int end)
if (fcu->fpt == NULL) {
/* No data to unbake. */
- CLOG_ERROR(&LOG, "Error: Curve containts no baked keyframes");
+ CLOG_ERROR(&LOG, "Error: Curve contains no baked keyframes");
return;
}
diff --git a/source/blender/blenkernel/intern/fluid.c b/source/blender/blenkernel/intern/fluid.c
index 59248e5f9f8..7fe009d51ca 100644
--- a/source/blender/blenkernel/intern/fluid.c
+++ b/source/blender/blenkernel/intern/fluid.c
@@ -3225,7 +3225,7 @@ static void update_effectors(
ListBase *effectors;
/* make sure smoke flow influence is 0.0f */
fds->effector_weights->weight[PFIELD_FLUIDFLOW] = 0.0f;
- effectors = BKE_effectors_create(depsgraph, ob, NULL, fds->effector_weights);
+ effectors = BKE_effectors_create(depsgraph, ob, NULL, fds->effector_weights, false);
if (effectors) {
/* Precalculate wind forces. */
diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c
index d0018a556ba..8d1e6b26d4d 100644
--- a/source/blender/blenkernel/intern/fmodifier.c
+++ b/source/blender/blenkernel/intern/fmodifier.c
@@ -32,6 +32,7 @@
#include "CLG_log.h"
#include "DNA_anim_types.h"
+#include "DNA_screen_types.h"
#include "BLT_translation.h"
@@ -1133,7 +1134,7 @@ FModifier *add_fmodifier(ListBase *modifiers, int type, FCurve *owner_fcu)
/* add modifier itself */
fcm = MEM_callocN(sizeof(FModifier), "F-Curve Modifier");
fcm->type = type;
- fcm->flag = FMODIFIER_FLAG_EXPANDED;
+ fcm->ui_expand_flag = UI_PANEL_DATA_EXPAND_ROOT; /* Expand the main panel, not the sub-panels. */
fcm->curve = owner_fcu;
fcm->influence = 1.0f;
BLI_addtail(modifiers, fcm);
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index df1dbaa905f..25a0259abe3 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -176,6 +176,8 @@ IDTypeInfo IDType_ID_VF = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/***************************** VFont *******************************/
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index 6db15c9393d..0274dfdbd1c 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -14,12 +14,19 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include "BLI_map.hh"
+
+#include "BKE_attribute.h"
+#include "BKE_attribute_access.hh"
#include "BKE_geometry_set.hh"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
#include "BKE_mesh_wrapper.h"
+#include "BKE_modifier.h"
#include "BKE_pointcloud.h"
+#include "BKE_volume.h"
+#include "DNA_collection_types.h"
#include "DNA_object_types.h"
#include "BLI_rand.hh"
@@ -28,6 +35,7 @@
using blender::float3;
using blender::float4x4;
+using blender::Map;
using blender::MutableSpan;
using blender::Span;
using blender::StringRef;
@@ -54,6 +62,8 @@ GeometryComponent *GeometryComponent::create(GeometryComponentType component_typ
return new PointCloudComponent();
case GeometryComponentType::Instances:
return new InstancesComponent();
+ case GeometryComponentType::Volume:
+ return new VolumeComponent();
}
BLI_assert(false);
return nullptr;
@@ -150,6 +160,18 @@ void GeometrySet::add(const GeometryComponent &component)
components_.add_new(component.type(), std::move(component_ptr));
}
+/**
+ * Get all geometry components in this geometry set for read-only access.
+ */
+Vector<const GeometryComponent *> GeometrySet::get_components_for_read() const
+{
+ Vector<const GeometryComponent *> components;
+ for (const GeometryComponentPtr &ptr : components_.values()) {
+ components.append(ptr.get());
+ }
+ return components;
+}
+
void GeometrySet::compute_boundbox_without_instances(float3 *r_min, float3 *r_max) const
{
const PointCloud *pointcloud = this->get_pointcloud_for_read();
@@ -204,6 +226,13 @@ const PointCloud *GeometrySet::get_pointcloud_for_read() const
return (component == nullptr) ? nullptr : component->get_for_read();
}
+/* Returns a read-only volume or null. */
+const Volume *GeometrySet::get_volume_for_read() const
+{
+ const VolumeComponent *component = this->get_component_for_read<VolumeComponent>();
+ return (component == nullptr) ? nullptr : component->get_for_read();
+}
+
/* Returns true when the geometry set has a point cloud component that has a point cloud. */
bool GeometrySet::has_pointcloud() const
{
@@ -218,6 +247,13 @@ bool GeometrySet::has_instances() const
return component != nullptr && component->instances_amount() >= 1;
}
+/* Returns true when the geometry set has a volume component that has a volume. */
+bool GeometrySet::has_volume() const
+{
+ const VolumeComponent *component = this->get_component_for_read<VolumeComponent>();
+ return component != nullptr && component->has_volume();
+}
+
/* Create a new geometry set that only contains the given mesh. */
GeometrySet GeometrySet::create_with_mesh(Mesh *mesh, GeometryOwnershipType ownership)
{
@@ -265,6 +301,13 @@ PointCloud *GeometrySet::get_pointcloud_for_write()
return component.get_for_write();
}
+/* Returns a mutable volume or null. No ownership is transferred. */
+Volume *GeometrySet::get_volume_for_write()
+{
+ VolumeComponent &component = this->get_component_for_write<VolumeComponent>();
+ return component.get_for_write();
+}
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -355,6 +398,17 @@ void MeshComponent::copy_vertex_group_names_from_object(const Object &object)
}
}
+const blender::Map<std::string, int> &MeshComponent::vertex_group_names() const
+{
+ return vertex_group_names_;
+}
+
+/* This is only exposed for the internal attribute API. */
+blender::Map<std::string, int> &MeshComponent::vertex_group_names()
+{
+ return vertex_group_names_;
+}
+
/* Get the mesh from this component. This method can be used by multiple threads at the same
* time. Therefore, the returned mesh should not be modified. No ownership is transferred. */
const Mesh *MeshComponent::get_for_read() const
@@ -609,6 +663,85 @@ blender::Span<int> InstancesComponent::almost_unique_ids() const
/** \} */
/* -------------------------------------------------------------------- */
+/** \name Volume Component
+ * \{ */
+
+VolumeComponent::VolumeComponent() : GeometryComponent(GeometryComponentType::Volume)
+{
+}
+
+VolumeComponent::~VolumeComponent()
+{
+ this->clear();
+}
+
+GeometryComponent *VolumeComponent::copy() const
+{
+ VolumeComponent *new_component = new VolumeComponent();
+ if (volume_ != nullptr) {
+ new_component->volume_ = BKE_volume_copy_for_eval(volume_, false);
+ new_component->ownership_ = GeometryOwnershipType::Owned;
+ }
+ return new_component;
+}
+
+void VolumeComponent::clear()
+{
+ BLI_assert(this->is_mutable());
+ if (volume_ != nullptr) {
+ if (ownership_ == GeometryOwnershipType::Owned) {
+ BKE_id_free(nullptr, volume_);
+ }
+ volume_ = nullptr;
+ }
+}
+
+bool VolumeComponent::has_volume() const
+{
+ return volume_ != nullptr;
+}
+
+/* Clear the component and replace it with the new volume. */
+void VolumeComponent::replace(Volume *volume, GeometryOwnershipType ownership)
+{
+ BLI_assert(this->is_mutable());
+ this->clear();
+ volume_ = volume;
+ ownership_ = ownership;
+}
+
+/* Return the volume and clear the component. The caller takes over responsibility for freeing the
+ * volume (if the component was responsible before). */
+Volume *VolumeComponent::release()
+{
+ BLI_assert(this->is_mutable());
+ Volume *volume = volume_;
+ volume_ = nullptr;
+ return volume;
+}
+
+/* Get the volume from this component. This method can be used by multiple threads at the same
+ * time. Therefore, the returned volume should not be modified. No ownership is transferred. */
+const Volume *VolumeComponent::get_for_read() const
+{
+ return volume_;
+}
+
+/* Get the volume from this component. This method can only be used when the component is mutable,
+ * i.e. it is not shared. The returned volume can be modified. No ownership is transferred. */
+Volume *VolumeComponent::get_for_write()
+{
+ BLI_assert(this->is_mutable());
+ if (ownership_ == GeometryOwnershipType::ReadOnly) {
+ volume_ = BKE_volume_copy_for_eval(volume_, false);
+ ownership_ = GeometryOwnershipType::Owned;
+ }
+ return volume_;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
/** \name C API
* \{ */
diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc
new file mode 100644
index 00000000000..1a260c5d48e
--- /dev/null
+++ b/source/blender/blenkernel/intern/geometry_set_instances.cc
@@ -0,0 +1,451 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "BKE_geometry_set_instances.hh"
+#include "BKE_mesh.h"
+#include "BKE_mesh_wrapper.h"
+#include "BKE_modifier.h"
+#include "BKE_pointcloud.h"
+
+#include "DNA_collection_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_pointcloud_types.h"
+
+namespace blender::bke {
+
+static void geometry_set_collect_recursive(const GeometrySet &geometry_set,
+ const float4x4 &transform,
+ Vector<GeometryInstanceGroup> &r_sets);
+
+static void geometry_set_collect_recursive_collection(const Collection &collection,
+ const float4x4 &transform,
+ Vector<GeometryInstanceGroup> &r_sets);
+
+/**
+ * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances.
+ */
+static GeometrySet object_get_geometry_set_for_read(const Object &object)
+{
+ /* Objects evaluated with a nodes modifier will have a geometry set already. */
+ if (object.runtime.geometry_set_eval != nullptr) {
+ return *object.runtime.geometry_set_eval;
+ }
+
+ /* Otherwise, construct a new geometry set with the component based on the object type. */
+ GeometrySet new_geometry_set;
+
+ if (object.type == OB_MESH) {
+ Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(
+ &const_cast<Object &>(object), false);
+
+ if (mesh != nullptr) {
+ BKE_mesh_wrapper_ensure_mdata(mesh);
+
+ MeshComponent &mesh_component = new_geometry_set.get_component_for_write<MeshComponent>();
+ mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly);
+ mesh_component.copy_vertex_group_names_from_object(object);
+ }
+ }
+
+ /* TODO: Cover the case of point-clouds without modifiers-- they may not be covered by the
+ * #geometry_set_eval case above. */
+
+ /* TODO: Add volume support. */
+
+ /* Return by value since there is not always an existing geometry set owned elsewhere to use. */
+ return new_geometry_set;
+}
+
+static void geometry_set_collect_recursive_collection_instance(
+ const Collection &collection, const float4x4 &transform, Vector<GeometryInstanceGroup> &r_sets)
+{
+ float4x4 offset_matrix;
+ unit_m4(offset_matrix.values);
+ sub_v3_v3(offset_matrix.values[3], collection.instance_offset);
+ const float4x4 instance_transform = transform * offset_matrix;
+ geometry_set_collect_recursive_collection(collection, instance_transform, r_sets);
+}
+
+static void geometry_set_collect_recursive_object(const Object &object,
+ const float4x4 &transform,
+ Vector<GeometryInstanceGroup> &r_sets)
+{
+ GeometrySet instance_geometry_set = object_get_geometry_set_for_read(object);
+ geometry_set_collect_recursive(instance_geometry_set, transform, r_sets);
+
+ if (object.type == OB_EMPTY) {
+ const Collection *collection_instance = object.instance_collection;
+ if (collection_instance != nullptr) {
+ geometry_set_collect_recursive_collection_instance(*collection_instance, transform, r_sets);
+ }
+ }
+}
+
+static void geometry_set_collect_recursive_collection(const Collection &collection,
+ const float4x4 &transform,
+ Vector<GeometryInstanceGroup> &r_sets)
+{
+ LISTBASE_FOREACH (const CollectionObject *, collection_object, &collection.gobject) {
+ BLI_assert(collection_object->ob != nullptr);
+ const Object &object = *collection_object->ob;
+ const float4x4 object_transform = transform * object.obmat;
+ geometry_set_collect_recursive_object(object, object_transform, r_sets);
+ }
+ LISTBASE_FOREACH (const CollectionChild *, collection_child, &collection.children) {
+ BLI_assert(collection_child->collection != nullptr);
+ const Collection &collection = *collection_child->collection;
+ geometry_set_collect_recursive_collection(collection, transform, r_sets);
+ }
+}
+
+static void geometry_set_collect_recursive(const GeometrySet &geometry_set,
+ const float4x4 &transform,
+ Vector<GeometryInstanceGroup> &r_sets)
+{
+ r_sets.append({geometry_set, {transform}});
+
+ if (geometry_set.has_instances()) {
+ const InstancesComponent &instances_component =
+ *geometry_set.get_component_for_read<InstancesComponent>();
+
+ Span<float4x4> transforms = instances_component.transforms();
+ Span<InstancedData> instances = instances_component.instanced_data();
+ for (const int i : instances.index_range()) {
+ const InstancedData &data = instances[i];
+ const float4x4 instance_transform = transform * transforms[i];
+
+ if (data.type == INSTANCE_DATA_TYPE_OBJECT) {
+ BLI_assert(data.data.object != nullptr);
+ const Object &object = *data.data.object;
+ geometry_set_collect_recursive_object(object, instance_transform, r_sets);
+ }
+ else if (data.type == INSTANCE_DATA_TYPE_COLLECTION) {
+ BLI_assert(data.data.collection != nullptr);
+ const Collection &collection = *data.data.collection;
+ geometry_set_collect_recursive_collection_instance(collection, instance_transform, r_sets);
+ }
+ }
+ }
+}
+
+/**
+ * Return flattened vector of the geometry component's recursive instances. I.e. all collection
+ * instances and object instances will be expanded into the instances of their geometry components.
+ * Even the instances in those geometry components' will be included.
+ *
+ * \note For convenience (to avoid duplication in the caller), the returned vector also contains
+ * the argument geometry set.
+ *
+ * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances.
+ */
+Vector<GeometryInstanceGroup> geometry_set_gather_instances(const GeometrySet &geometry_set)
+{
+ Vector<GeometryInstanceGroup> result_vector;
+
+ float4x4 unit_transform;
+ unit_m4(unit_transform.values);
+
+ geometry_set_collect_recursive(geometry_set, unit_transform, result_vector);
+
+ return result_vector;
+}
+
+void gather_attribute_info(Map<std::string, AttributeKind> &attributes,
+ Span<GeometryComponentType> component_types,
+ Span<GeometryInstanceGroup> set_groups,
+ const Set<std::string> &ignored_attributes)
+{
+ for (const GeometryInstanceGroup &set_group : set_groups) {
+ const GeometrySet &set = set_group.geometry_set;
+ for (const GeometryComponentType component_type : component_types) {
+ if (!set.has(component_type)) {
+ continue;
+ }
+ const GeometryComponent &component = *set.get_component_for_read(component_type);
+
+ component.attribute_foreach([&](StringRefNull name, const AttributeMetaData &meta_data) {
+ if (ignored_attributes.contains(name)) {
+ return true;
+ }
+ auto add_info = [&](AttributeKind *attribute_kind) {
+ attribute_kind->domain = meta_data.domain;
+ attribute_kind->data_type = meta_data.data_type;
+ };
+ auto modify_info = [&](AttributeKind *attribute_kind) {
+ attribute_kind->domain = meta_data.domain; /* TODO: Use highest priority domain. */
+ attribute_kind->data_type = bke::attribute_data_type_highest_complexity(
+ {attribute_kind->data_type, meta_data.data_type});
+ };
+
+ attributes.add_or_modify(name, add_info, modify_info);
+ return true;
+ });
+ }
+ }
+}
+
+static Mesh *join_mesh_topology_and_builtin_attributes(Span<GeometryInstanceGroup> set_groups,
+ const bool convert_points_to_vertices)
+{
+ int totverts = 0;
+ int totloops = 0;
+ int totedges = 0;
+ int totpolys = 0;
+ int64_t cd_dirty_vert = 0;
+ int64_t cd_dirty_poly = 0;
+ int64_t cd_dirty_edge = 0;
+ int64_t cd_dirty_loop = 0;
+ for (const GeometryInstanceGroup &set_group : set_groups) {
+ const GeometrySet &set = set_group.geometry_set;
+ const int tot_transforms = set_group.transforms.size();
+ if (set.has_mesh()) {
+ const Mesh &mesh = *set.get_mesh_for_read();
+ totverts += mesh.totvert * tot_transforms;
+ totloops += mesh.totloop * tot_transforms;
+ totedges += mesh.totedge * tot_transforms;
+ totpolys += mesh.totpoly * tot_transforms;
+ cd_dirty_vert |= mesh.runtime.cd_dirty_vert;
+ cd_dirty_poly |= mesh.runtime.cd_dirty_poly;
+ cd_dirty_edge |= mesh.runtime.cd_dirty_edge;
+ cd_dirty_loop |= mesh.runtime.cd_dirty_loop;
+ }
+ if (convert_points_to_vertices && set.has_pointcloud()) {
+ const PointCloud &pointcloud = *set.get_pointcloud_for_read();
+ totverts += pointcloud.totpoint * tot_transforms;
+ }
+ }
+
+ Mesh *new_mesh = BKE_mesh_new_nomain(totverts, totedges, 0, totloops, totpolys);
+ /* Copy settings from the first input geometry set with a mesh. */
+ for (const GeometryInstanceGroup &set_group : set_groups) {
+ const GeometrySet &set = set_group.geometry_set;
+ if (set.has_mesh()) {
+ const Mesh &mesh = *set.get_mesh_for_read();
+ BKE_mesh_copy_settings(new_mesh, &mesh);
+ break;
+ }
+ }
+ new_mesh->runtime.cd_dirty_vert = cd_dirty_vert;
+ new_mesh->runtime.cd_dirty_poly = cd_dirty_poly;
+ new_mesh->runtime.cd_dirty_edge = cd_dirty_edge;
+ new_mesh->runtime.cd_dirty_loop = cd_dirty_loop;
+
+ int vert_offset = 0;
+ int loop_offset = 0;
+ int edge_offset = 0;
+ int poly_offset = 0;
+ for (const GeometryInstanceGroup &set_group : set_groups) {
+ const GeometrySet &set = set_group.geometry_set;
+ if (set.has_mesh()) {
+ const Mesh &mesh = *set.get_mesh_for_read();
+ for (const float4x4 &transform : set_group.transforms) {
+ for (const int i : IndexRange(mesh.totvert)) {
+ const MVert &old_vert = mesh.mvert[i];
+ MVert &new_vert = new_mesh->mvert[vert_offset + i];
+
+ new_vert = old_vert;
+
+ const float3 new_position = transform * float3(old_vert.co);
+ copy_v3_v3(new_vert.co, new_position);
+ }
+ for (const int i : IndexRange(mesh.totedge)) {
+ const MEdge &old_edge = mesh.medge[i];
+ MEdge &new_edge = new_mesh->medge[edge_offset + i];
+ new_edge = old_edge;
+ new_edge.v1 += vert_offset;
+ new_edge.v2 += vert_offset;
+ }
+ for (const int i : IndexRange(mesh.totloop)) {
+ const MLoop &old_loop = mesh.mloop[i];
+ MLoop &new_loop = new_mesh->mloop[loop_offset + i];
+ new_loop = old_loop;
+ new_loop.v += vert_offset;
+ new_loop.e += edge_offset;
+ }
+ for (const int i : IndexRange(mesh.totpoly)) {
+ const MPoly &old_poly = mesh.mpoly[i];
+ MPoly &new_poly = new_mesh->mpoly[poly_offset + i];
+ new_poly = old_poly;
+ new_poly.loopstart += loop_offset;
+ }
+
+ vert_offset += mesh.totvert;
+ loop_offset += mesh.totloop;
+ edge_offset += mesh.totedge;
+ poly_offset += mesh.totpoly;
+ }
+ }
+ if (convert_points_to_vertices && set.has_pointcloud()) {
+ const PointCloud &pointcloud = *set.get_pointcloud_for_read();
+ for (const float4x4 &transform : set_group.transforms) {
+ for (const int i : IndexRange(pointcloud.totpoint)) {
+ MVert &new_vert = new_mesh->mvert[vert_offset + i];
+ const float3 old_position = pointcloud.co[i];
+ const float3 new_position = transform * old_position;
+ copy_v3_v3(new_vert.co, new_position);
+ }
+ vert_offset += pointcloud.totpoint;
+ }
+ }
+ }
+
+ return new_mesh;
+}
+
+static void join_attributes(Span<GeometryInstanceGroup> set_groups,
+ Span<GeometryComponentType> component_types,
+ const Map<std::string, AttributeKind> &attribute_info,
+ GeometryComponent &result)
+{
+ for (Map<std::string, AttributeKind>::Item entry : attribute_info.items()) {
+ StringRef name = entry.key;
+ const AttributeDomain domain_output = entry.value.domain;
+ const CustomDataType data_type_output = entry.value.data_type;
+ const CPPType *cpp_type = bke::custom_data_type_to_cpp_type(data_type_output);
+ BLI_assert(cpp_type != nullptr);
+
+ result.attribute_try_create(entry.key, domain_output, data_type_output);
+ WriteAttributePtr write_attribute = result.attribute_try_get_for_write(name);
+ if (!write_attribute || &write_attribute->cpp_type() != cpp_type ||
+ write_attribute->domain() != domain_output) {
+ continue;
+ }
+ fn::GMutableSpan dst_span = write_attribute->get_span_for_write_only();
+
+ int offset = 0;
+ for (const GeometryInstanceGroup &set_group : set_groups) {
+ const GeometrySet &set = set_group.geometry_set;
+ for (const GeometryComponentType component_type : component_types) {
+ if (set.has(component_type)) {
+ const GeometryComponent &component = *set.get_component_for_read(component_type);
+ const int domain_size = component.attribute_domain_size(domain_output);
+ if (domain_size == 0) {
+ continue; /* Domain size is 0, so no need to increment the offset. */
+ }
+ ReadAttributePtr source_attribute = component.attribute_try_get_for_read(
+ name, domain_output, data_type_output);
+
+ if (source_attribute) {
+ fn::GSpan src_span = source_attribute->get_span();
+ const void *src_buffer = src_span.data();
+ for (const int UNUSED(i) : set_group.transforms.index_range()) {
+ void *dst_buffer = dst_span[offset];
+ cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size);
+ offset += domain_size;
+ }
+ }
+ else {
+ offset += domain_size * set_group.transforms.size();
+ }
+ }
+ }
+ }
+
+ write_attribute->apply_span();
+ }
+}
+
+static void join_instance_groups_mesh(Span<GeometryInstanceGroup> set_groups,
+ bool convert_points_to_vertices,
+ GeometrySet &result)
+{
+ Mesh *new_mesh = join_mesh_topology_and_builtin_attributes(set_groups,
+ convert_points_to_vertices);
+
+ MeshComponent &dst_component = result.get_component_for_write<MeshComponent>();
+ dst_component.replace(new_mesh);
+
+ Vector<GeometryComponentType> component_types;
+ component_types.append(GeometryComponentType::Mesh);
+ if (convert_points_to_vertices) {
+ component_types.append(GeometryComponentType::PointCloud);
+ }
+
+ /* Don't copy attributes that are stored directly in the mesh data structs. */
+ Map<std::string, AttributeKind> attributes;
+ gather_attribute_info(attributes, component_types, set_groups, {"position", "material_index"});
+ join_attributes(
+ set_groups, component_types, attributes, static_cast<GeometryComponent &>(dst_component));
+}
+
+static void join_instance_groups_pointcloud(Span<GeometryInstanceGroup> set_groups,
+ GeometrySet &result)
+{
+ int totpoint = 0;
+ for (const GeometryInstanceGroup &set_group : set_groups) {
+ const GeometrySet &set = set_group.geometry_set;
+ if (set.has<PointCloudComponent>()) {
+ const PointCloudComponent &component = *set.get_component_for_read<PointCloudComponent>();
+ totpoint += component.attribute_domain_size(ATTR_DOMAIN_POINT);
+ }
+ }
+
+ PointCloudComponent &dst_component = result.get_component_for_write<PointCloudComponent>();
+ PointCloud *pointcloud = BKE_pointcloud_new_nomain(totpoint);
+ dst_component.replace(pointcloud);
+ Map<std::string, AttributeKind> attributes;
+ gather_attribute_info(attributes, {GeometryComponentType::PointCloud}, set_groups, {});
+ join_attributes(set_groups,
+ {GeometryComponentType::PointCloud},
+ attributes,
+ static_cast<GeometryComponent &>(dst_component));
+}
+
+static void join_instance_groups_volume(Span<GeometryInstanceGroup> set_groups,
+ GeometrySet &result)
+{
+ /* Not yet supported. Joining volume grids with the same name requires resampling of at least
+ * one of the grids. The cell size of the resulting volume has to be determined somehow. */
+ VolumeComponent &dst_component = result.get_component_for_write<VolumeComponent>();
+ UNUSED_VARS(set_groups, dst_component);
+}
+
+GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set)
+{
+ if (!geometry_set.has_instances() && !geometry_set.has_pointcloud()) {
+ return geometry_set;
+ }
+
+ GeometrySet new_geometry_set = geometry_set;
+ Vector<GeometryInstanceGroup> set_groups = geometry_set_gather_instances(geometry_set);
+ join_instance_groups_mesh(set_groups, true, new_geometry_set);
+ /* Remove all instances, even though some might contain other non-mesh data. We can't really
+ * keep only non-mesh instances in general. */
+ new_geometry_set.remove<InstancesComponent>();
+ /* If there was a point cloud, it is now part of the mesh. */
+ new_geometry_set.remove<PointCloudComponent>();
+ return new_geometry_set;
+}
+
+GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set)
+{
+ if (!geometry_set.has_instances()) {
+ return geometry_set;
+ }
+
+ GeometrySet new_geometry_set;
+
+ Vector<GeometryInstanceGroup> set_groups = geometry_set_gather_instances(geometry_set);
+ join_instance_groups_mesh(set_groups, false, new_geometry_set);
+ join_instance_groups_pointcloud(set_groups, new_geometry_set);
+ join_instance_groups_volume(set_groups, new_geometry_set);
+
+ return new_geometry_set;
+}
+
+} // namespace blender::bke
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index f68a390db64..28477e9dc30 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -93,7 +93,33 @@ static void greasepencil_copy_data(Main *UNUSED(bmain),
/* make a copy of source layer and its data */
/* TODO here too could add unused flags... */
- bGPDlayer *gpl_dst = BKE_gpencil_layer_duplicate(gpl_src);
+ bGPDlayer *gpl_dst = BKE_gpencil_layer_duplicate(gpl_src, true, true);
+
+ /* Apply local layer transform to all frames. Calc the active frame is not enough
+ * because onion skin can use more frames. This is more slow but required here. */
+ if (gpl_dst->actframe != NULL) {
+ bool transformed = ((!is_zero_v3(gpl_dst->location)) || (!is_zero_v3(gpl_dst->rotation)) ||
+ (!is_one_v3(gpl_dst->scale)));
+ if (transformed) {
+ loc_eul_size_to_mat4(
+ gpl_dst->layer_mat, gpl_dst->location, gpl_dst->rotation, gpl_dst->scale);
+ bool do_onion = ((gpl_dst->onion_flag & GP_LAYER_ONIONSKIN) != 0);
+ bGPDframe *init_gpf = (do_onion) ? gpl_dst->frames.first : gpl_dst->actframe;
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
+ bGPDspoint *pt;
+ int i;
+ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
+ mul_m4_v3(gpl_dst->layer_mat, &pt->x);
+ }
+ }
+ /* if not onion, exit loop. */
+ if (!do_onion) {
+ break;
+ }
+ }
+ }
+ }
BLI_addtail(&gpd_dst->layers, gpl_dst);
}
@@ -303,6 +329,8 @@ IDTypeInfo IDType_ID_GD = {
.blend_read_expand = greasepencil_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* ************************************************** */
@@ -581,7 +609,7 @@ bGPDframe *BKE_gpencil_frame_addcopy(bGPDlayer *gpl, int cframe)
}
/* Create a copy of the frame */
- new_frame = BKE_gpencil_frame_duplicate(gpl->actframe);
+ new_frame = BKE_gpencil_frame_duplicate(gpl->actframe, true);
/* Find frame to insert it before */
LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
@@ -686,6 +714,14 @@ bGPDlayer *BKE_gpencil_layer_addnew(bGPdata *gpd, const char *name, bool setacti
/* Enable always affected by scene lights. */
gpl->flag |= GP_LAYER_USE_LIGHTS;
+
+ /* Init transform. */
+ zero_v3(gpl->location);
+ zero_v3(gpl->rotation);
+ copy_v3_fl(gpl->scale, 1.0f);
+ loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale);
+ invert_m4_m4(gpl->layer_invmat, gpl->layer_mat);
+
/* make this one the active one */
if (setactive) {
BKE_gpencil_layer_active_set(gpd, gpl);
@@ -815,6 +851,7 @@ bGPDstroke *BKE_gpencil_stroke_new(int mat_idx, int totpoints, short thickness)
gps->mat_nr = mat_idx;
+ gps->dvert = NULL;
gps->editcurve = NULL;
return gps;
@@ -957,7 +994,7 @@ bGPDstroke *BKE_gpencil_stroke_duplicate(bGPDstroke *gps_src,
* \param gpf_src: Source grease pencil frame
* \return Pointer to new frame
*/
-bGPDframe *BKE_gpencil_frame_duplicate(const bGPDframe *gpf_src)
+bGPDframe *BKE_gpencil_frame_duplicate(const bGPDframe *gpf_src, const bool dup_strokes)
{
bGPDstroke *gps_dst = NULL;
bGPDframe *gpf_dst;
@@ -971,12 +1008,14 @@ bGPDframe *BKE_gpencil_frame_duplicate(const bGPDframe *gpf_src)
gpf_dst = MEM_dupallocN(gpf_src);
gpf_dst->prev = gpf_dst->next = NULL;
- /* copy strokes */
+ /* Copy strokes. */
BLI_listbase_clear(&gpf_dst->strokes);
- LISTBASE_FOREACH (bGPDstroke *, gps_src, &gpf_src->strokes) {
- /* make copy of source stroke */
- gps_dst = BKE_gpencil_stroke_duplicate(gps_src, true, true);
- BLI_addtail(&gpf_dst->strokes, gps_dst);
+ if (dup_strokes) {
+ LISTBASE_FOREACH (bGPDstroke *, gps_src, &gpf_src->strokes) {
+ /* make copy of source stroke */
+ gps_dst = BKE_gpencil_stroke_duplicate(gps_src, true, true);
+ BLI_addtail(&gpf_dst->strokes, gps_dst);
+ }
}
/* return new frame */
@@ -1010,7 +1049,9 @@ void BKE_gpencil_frame_copy_strokes(bGPDframe *gpf_src, struct bGPDframe *gpf_ds
* \param gpl_src: Source grease pencil layer
* \return Pointer to new layer
*/
-bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src)
+bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src,
+ const bool dup_frames,
+ const bool dup_strokes)
{
const bGPDframe *gpf_src;
bGPDframe *gpf_dst;
@@ -1035,14 +1076,16 @@ bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src)
/* copy frames */
BLI_listbase_clear(&gpl_dst->frames);
- for (gpf_src = gpl_src->frames.first; gpf_src; gpf_src = gpf_src->next) {
- /* make a copy of source frame */
- gpf_dst = BKE_gpencil_frame_duplicate(gpf_src);
- BLI_addtail(&gpl_dst->frames, gpf_dst);
-
- /* if source frame was the current layer's 'active' frame, reassign that too */
- if (gpf_src == gpl_dst->actframe) {
- gpl_dst->actframe = gpf_dst;
+ if (dup_frames) {
+ for (gpf_src = gpl_src->frames.first; gpf_src; gpf_src = gpf_src->next) {
+ /* make a copy of source frame */
+ gpf_dst = BKE_gpencil_frame_duplicate(gpf_src, dup_strokes);
+ BLI_addtail(&gpl_dst->frames, gpf_dst);
+
+ /* if source frame was the current layer's 'active' frame, reassign that too */
+ if (gpf_src == gpl_dst->actframe) {
+ gpl_dst->actframe = gpf_dst;
+ }
}
}
@@ -1091,7 +1134,7 @@ bGPdata *BKE_gpencil_data_duplicate(Main *bmain, const bGPdata *gpd_src, bool in
* Ensure selection status of stroke is in sync with its points.
* \param gps: Grease pencil stroke
*/
-void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps)
+void BKE_gpencil_stroke_sync_selection(bGPdata *gpd, bGPDstroke *gps)
{
bGPDspoint *pt;
int i;
@@ -1105,6 +1148,7 @@ void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps)
* so initially, we must deselect
*/
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
if (pt->flag & GP_SPOINT_SELECT) {
@@ -1112,9 +1156,13 @@ void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps)
break;
}
}
+
+ if (gps->flag & GP_STROKE_SELECT) {
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
+ }
}
-void BKE_gpencil_curve_sync_selection(bGPDstroke *gps)
+void BKE_gpencil_curve_sync_selection(bGPdata *gpd, bGPDstroke *gps)
{
bGPDcurve *gpc = gps->editcurve;
if (gpc == NULL) {
@@ -1122,6 +1170,7 @@ void BKE_gpencil_curve_sync_selection(bGPDstroke *gps)
}
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
gpc->flag &= ~GP_CURVE_SELECT;
bool is_selected = false;
@@ -1144,9 +1193,23 @@ void BKE_gpencil_curve_sync_selection(bGPDstroke *gps)
if (is_selected) {
gpc->flag |= GP_CURVE_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
}
}
+/* Assign unique stroke ID for selection. */
+void BKE_gpencil_stroke_select_index_set(bGPdata *gpd, bGPDstroke *gps)
+{
+ gpd->select_last_index++;
+ gps->select_index = gpd->select_last_index;
+}
+
+/* Reset unique stroke ID for selection. */
+void BKE_gpencil_stroke_select_index_reset(bGPDstroke *gps)
+{
+ gps->select_index = 0;
+}
+
/* ************************************************** */
/* GP Frame API */
@@ -2469,6 +2532,11 @@ bool BKE_gpencil_from_image(
pt->flag |= GP_SPOINT_SELECT;
}
}
+
+ if (gps->flag & GP_STROKE_SELECT) {
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
+ }
+
BKE_gpencil_stroke_geometry_update(gpd, gps);
}
}
@@ -2519,7 +2587,7 @@ void BKE_gpencil_visible_stroke_iter(ViewLayer *view_layer,
int cfra)
{
bGPdata *gpd = (bGPdata *)ob->data;
- const bool is_multiedit = GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = ((GPENCIL_MULTIEDIT_SESSIONS_ON(gpd)) && (!GPENCIL_PLAY_ON(gpd)));
const bool is_onion = do_onion && ((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0);
const bool is_drawing = (gpd->runtime.sbuffer_used > 0);
@@ -2541,6 +2609,11 @@ void BKE_gpencil_visible_stroke_iter(ViewLayer *view_layer,
continue;
}
+ /* If scale to 0 the layer must be invisible. */
+ if (is_zero_v3(gpl->scale)) {
+ continue;
+ }
+
/* Hide the layer if it's defined a view layer filter. This is used to
* generate renders, putting only selected GP layers for each View Layer.
* This is used only in final render and never in Viewport. */
@@ -2557,8 +2630,17 @@ void BKE_gpencil_visible_stroke_iter(ViewLayer *view_layer,
sta_gpf = end_gpf = NULL;
/* Check the whole range and tag the editable frames. */
LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
- if (gpf == act_gpf || (gpf->flag & GP_FRAME_SELECT)) {
+ if (act_gpf != NULL && (gpf == act_gpf || (gpf->flag & GP_FRAME_SELECT))) {
gpf->runtime.onion_id = 0;
+ if (do_onion) {
+ if (gpf->framenum < act_gpf->framenum) {
+ gpf->runtime.onion_id = -1;
+ }
+ else {
+ gpf->runtime.onion_id = 1;
+ }
+ }
+
if (sta_gpf == NULL) {
sta_gpf = gpf;
}
@@ -2759,10 +2841,10 @@ void BKE_gpencil_update_orig_pointers(const Object *ob_orig, const Object *ob_ev
* \param gpl: Grease pencil layer
* \param diff_mat: Result parent matrix
*/
-void BKE_gpencil_parent_matrix_get(const Depsgraph *depsgraph,
- Object *obact,
- bGPDlayer *gpl,
- float diff_mat[4][4])
+void BKE_gpencil_layer_transform_matrix_get(const Depsgraph *depsgraph,
+ Object *obact,
+ bGPDlayer *gpl,
+ float diff_mat[4][4])
{
Object *ob_eval = depsgraph != NULL ? DEG_get_evaluated_object(depsgraph, obact) : obact;
Object *obparent = gpl->parent;
@@ -2771,11 +2853,10 @@ void BKE_gpencil_parent_matrix_get(const Depsgraph *depsgraph,
/* if not layer parented, try with object parented */
if (obparent_eval == NULL) {
- if (ob_eval != NULL) {
- if (ob_eval->type == OB_GPENCIL) {
- copy_m4_m4(diff_mat, ob_eval->obmat);
- return;
- }
+ if ((ob_eval != NULL) && (ob_eval->type == OB_GPENCIL)) {
+ copy_m4_m4(diff_mat, ob_eval->obmat);
+ mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_mat);
+ return;
}
/* not gpencil object */
unit_m4(diff_mat);
@@ -2785,6 +2866,7 @@ void BKE_gpencil_parent_matrix_get(const Depsgraph *depsgraph,
if (ELEM(gpl->partype, PAROBJECT, PARSKEL)) {
mul_m4_m4m4(diff_mat, obparent_eval->obmat, gpl->inverse);
add_v3_v3(diff_mat[3], ob_eval->obmat[3]);
+ mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_mat);
return;
}
if (gpl->partype == PARBONE) {
@@ -2800,6 +2882,7 @@ void BKE_gpencil_parent_matrix_get(const Depsgraph *depsgraph,
mul_m4_m4m4(diff_mat, obparent_eval->obmat, gpl->inverse);
add_v3_v3(diff_mat[3], ob_eval->obmat[3]);
}
+ mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_mat);
return;
}
@@ -2807,11 +2890,11 @@ void BKE_gpencil_parent_matrix_get(const Depsgraph *depsgraph,
}
/**
- * Update parent matrix.
+ * Update parent matrix and local transforms.
* \param depsgraph: Depsgraph
* \param ob: Grease pencil object
*/
-void BKE_gpencil_update_layer_parent(const Depsgraph *depsgraph, Object *ob)
+void BKE_gpencil_update_layer_transforms(const Depsgraph *depsgraph, Object *ob)
{
if (ob->type != OB_GPENCIL) {
return;
@@ -2820,31 +2903,50 @@ void BKE_gpencil_update_layer_parent(const Depsgraph *depsgraph, Object *ob)
bGPdata *gpd = (bGPdata *)ob->data;
float cur_mat[4][4];
+ bool changed = false;
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
- if ((gpl->parent != NULL) && (gpl->actframe != NULL)) {
- Object *ob_parent = DEG_get_evaluated_object(depsgraph, gpl->parent);
- /* calculate new matrix */
- if (ELEM(gpl->partype, PAROBJECT, PARSKEL)) {
- copy_m4_m4(cur_mat, ob_parent->obmat);
- }
- else if (gpl->partype == PARBONE) {
- bPoseChannel *pchan = BKE_pose_channel_find_name(ob_parent->pose, gpl->parsubstr);
- if (pchan != NULL) {
- copy_m4_m4(cur_mat, ob->imat);
- mul_m4_m4m4(cur_mat, ob_parent->obmat, pchan->pose_mat);
+ unit_m4(cur_mat);
+ if (gpl->actframe != NULL) {
+ if (gpl->parent != NULL) {
+ Object *ob_parent = DEG_get_evaluated_object(depsgraph, gpl->parent);
+ /* calculate new matrix */
+ if (ELEM(gpl->partype, PAROBJECT, PARSKEL)) {
+ copy_m4_m4(cur_mat, ob_parent->obmat);
}
- else {
- unit_m4(cur_mat);
+ else if (gpl->partype == PARBONE) {
+ bPoseChannel *pchan = BKE_pose_channel_find_name(ob_parent->pose, gpl->parsubstr);
+ if (pchan != NULL) {
+ copy_m4_m4(cur_mat, ob->imat);
+ mul_m4_m4m4(cur_mat, ob_parent->obmat, pchan->pose_mat);
+ }
+ else {
+ unit_m4(cur_mat);
+ }
}
+ changed = !equals_m4m4(gpl->inverse, cur_mat);
}
+
+ /* Calc local layer transform. */
+ bool transformed = ((!is_zero_v3(gpl->location)) || (!is_zero_v3(gpl->rotation)) ||
+ (!is_one_v3(gpl->scale)));
+ if (transformed) {
+ loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale);
+ }
+
/* only redo if any change */
- if (!equals_m4m4(gpl->inverse, cur_mat)) {
+ if (changed || transformed) {
LISTBASE_FOREACH (bGPDstroke *, gps, &gpl->actframe->strokes) {
bGPDspoint *pt;
int i;
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
- mul_m4_v3(gpl->inverse, &pt->x);
- mul_m4_v3(cur_mat, &pt->x);
+ if (changed) {
+ mul_m4_v3(gpl->inverse, &pt->x);
+ mul_m4_v3(cur_mat, &pt->x);
+ }
+
+ if (transformed) {
+ mul_m4_v3(gpl->layer_mat, &pt->x);
+ }
}
}
}
@@ -2872,4 +2974,26 @@ int BKE_gpencil_material_find_index_by_name_prefix(Object *ob, const char *name_
return -1;
}
+/* Create a hash with the list of selected frame number. */
+void BKE_gpencil_frame_selected_hash(bGPdata *gpd, struct GHash *r_list)
+{
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd);
+
+ LISTBASE_FOREACH (bGPDlayer *, gpl_iter, &gpd->layers) {
+ if ((gpl != NULL) && (!is_multiedit) && (gpl != gpl_iter)) {
+ continue;
+ }
+
+ LISTBASE_FOREACH (bGPDframe *, gpf, &gpl_iter->frames) {
+ if (((gpf == gpl->actframe) && (!is_multiedit)) ||
+ ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
+ if (!BLI_ghash_lookup(r_list, POINTER_FROM_INT(gpf->framenum))) {
+ BLI_ghash_insert(r_list, POINTER_FROM_INT(gpf->framenum), gpf);
+ }
+ }
+ }
+ }
+}
+
/** \} */
diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c
index be14d74de7a..88d3e917a7a 100644
--- a/source/blender/blenkernel/intern/gpencil_curve.c
+++ b/source/blender/blenkernel/intern/gpencil_curve.c
@@ -781,7 +781,9 @@ void BKE_gpencil_stroke_editcurve_update(bGPdata *gpd, bGPDlayer *gpl, bGPDstrok
/**
* Sync the selection from stroke to editcurve
*/
-void BKE_gpencil_editcurve_stroke_sync_selection(bGPDstroke *gps, bGPDcurve *gpc)
+void BKE_gpencil_editcurve_stroke_sync_selection(bGPdata *UNUSED(gpd),
+ bGPDstroke *gps,
+ bGPDcurve *gpc)
{
if (gps->flag & GP_STROKE_SELECT) {
gpc->flag |= GP_CURVE_SELECT;
@@ -808,10 +810,11 @@ void BKE_gpencil_editcurve_stroke_sync_selection(bGPDstroke *gps, bGPDcurve *gpc
/**
* Sync the selection from editcurve to stroke
*/
-void BKE_gpencil_stroke_editcurve_sync_selection(bGPDstroke *gps, bGPDcurve *gpc)
+void BKE_gpencil_stroke_editcurve_sync_selection(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gpc)
{
if (gpc->flag & GP_CURVE_SELECT) {
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
for (int i = 0; i < gpc->tot_curve_points - 1; i++) {
bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
@@ -865,6 +868,7 @@ void BKE_gpencil_stroke_editcurve_sync_selection(bGPDstroke *gps, bGPDcurve *gpc
}
else {
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
pt->flag &= ~GP_SPOINT_SELECT;
@@ -1089,6 +1093,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps,
/* deselect */
pt->flag &= ~GP_SPOINT_SELECT;
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
return;
}
@@ -1131,6 +1136,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps,
pt->flag &= ~GP_SPOINT_SELECT;
}
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
/* free temp data */
MEM_freeN(points);
@@ -1375,7 +1381,7 @@ void BKE_gpencil_strokes_selected_update_editcurve(bGPdata *gpd)
BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps);
}
/* Update the selection from the stroke to the curve. */
- BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve);
+ BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve);
gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
BKE_gpencil_stroke_geometry_update(gpd, gps);
@@ -1400,7 +1406,7 @@ void BKE_gpencil_strokes_selected_sync_selection_editcurve(bGPdata *gpd)
bGPDcurve *gpc = gps->editcurve;
if (gpc != NULL) {
/* Update the selection of every stroke that has an editcurve */
- BKE_gpencil_stroke_editcurve_sync_selection(gps, gpc);
+ BKE_gpencil_stroke_editcurve_sync_selection(gpd, gps, gpc);
}
}
}
diff --git a/source/blender/blenkernel/intern/gpencil_geom.c b/source/blender/blenkernel/intern/gpencil_geom.c
index 981f5d50353..8c4882854d1 100644
--- a/source/blender/blenkernel/intern/gpencil_geom.c
+++ b/source/blender/blenkernel/intern/gpencil_geom.c
@@ -1684,11 +1684,12 @@ void BKE_gpencil_stroke_normal(const bGPDstroke *gps, float r_normal[3])
/* Stroke Simplify ------------------------------------- */
-/** Reduce a series of points to a simplified version, but
+/**
+ * Reduce a series of points to a simplified version, but
* maintains the general shape of the series
*
* Ramer - Douglas - Peucker algorithm
- * by http ://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
+ * by http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
* \param gpd: Grease pencil data-block
* \param gps: Grease pencil stroke
* \param epsilon: Epsilon value to define precision of the algorithm
@@ -3227,6 +3228,45 @@ void BKE_gpencil_stroke_join(bGPDstroke *gps_a,
}
}
+/* Copy the stroke of the frame to all frames selected (except current). */
+void BKE_gpencil_stroke_copy_to_keyframes(
+ bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps, const bool tail)
+{
+ GHash *frame_list = BLI_ghash_int_new_ex(__func__, 64);
+ BKE_gpencil_frame_selected_hash(gpd, frame_list);
+
+ GHashIterator gh_iter;
+ GHASH_ITER (gh_iter, frame_list) {
+ int cfra = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
+
+ if (gpf->framenum != cfra) {
+ bGPDframe *gpf_new = BKE_gpencil_layer_frame_find(gpl, cfra);
+ if (gpf_new == NULL) {
+ gpf_new = BKE_gpencil_frame_addnew(gpl, cfra);
+ }
+
+ if (gpf_new == NULL) {
+ continue;
+ }
+
+ bGPDstroke *gps_new = BKE_gpencil_stroke_duplicate(gps, true, true);
+ if (gps_new == NULL) {
+ continue;
+ }
+
+ if (tail) {
+ BLI_addhead(&gpf_new->strokes, gps_new);
+ }
+ else {
+ BLI_addtail(&gpf_new->strokes, gps_new);
+ }
+ }
+ }
+
+ /* Free hash table. */
+ BLI_ghash_free(frame_list, NULL, NULL);
+}
+
/* Stroke Uniform Subdivide ------------------------------------- */
typedef struct tSamplePoint {
@@ -3404,6 +3444,7 @@ void BKE_gpencil_stroke_uniform_subdivide(bGPdata *gpd,
if (select) {
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
}
/* Free the sample points. Important to use the mutable loop here because we are erasing the list
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index 1be2cba31b5..6f1896f055a 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -656,10 +656,12 @@ static void gpencil_copy_activeframe_to_eval(
LISTBASE_FOREACH (bGPDlayer *, gpl_orig, &gpd_orig->layers) {
if (gpl_eval != NULL) {
- int remap_cfra = gpencil_remap_time_get(depsgraph, scene, ob, gpl_orig);
+ bGPDframe *gpf_orig = gpl_orig->actframe;
- bGPDframe *gpf_orig = BKE_gpencil_layer_frame_get(
- gpl_orig, remap_cfra, GP_GETFRAME_USE_PREV);
+ int remap_cfra = gpencil_remap_time_get(depsgraph, scene, ob, gpl_orig);
+ if (gpf_orig && gpf_orig->framenum != remap_cfra) {
+ gpf_orig = BKE_gpencil_layer_frame_get(gpl_orig, remap_cfra, GP_GETFRAME_USE_PREV);
+ }
if (gpf_orig != NULL) {
int gpf_index = BLI_findindex(&gpl_orig->frames, gpf_orig);
@@ -701,13 +703,18 @@ void BKE_gpencil_prepare_eval_data(Depsgraph *depsgraph, Scene *scene, Object *o
Object *ob_orig = (Object *)DEG_get_original_id(&ob->id);
bGPdata *gpd_orig = (bGPdata *)ob_orig->data;
- /* Need check if some layer is parented. */
+ /* Need check if some layer is parented or transformed. */
bool do_parent = false;
+ bool do_transform = false;
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd_orig->layers) {
if (gpl->parent != NULL) {
do_parent = true;
break;
}
+ if ((!is_zero_v3(gpl->location)) || (!is_zero_v3(gpl->rotation)) || (!is_one_v3(gpl->scale))) {
+ do_transform = true;
+ break;
+ }
}
const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd_eval);
@@ -715,7 +722,7 @@ void BKE_gpencil_prepare_eval_data(Depsgraph *depsgraph, Scene *scene, Object *o
const bool do_modifiers = (bool)((!is_multiedit) && (!is_curve_edit) &&
(ob->greasepencil_modifiers.first != NULL) &&
(!GPENCIL_SIMPLIFY_MODIF(scene)));
- if ((!do_modifiers) && (!do_parent)) {
+ if ((!do_modifiers) && (!do_parent) && (!do_transform)) {
return;
}
DEG_debug_print_eval(depsgraph, __func__, gpd_eval->id.name, gpd_eval);
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index a44b054e366..f76e5a73478 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -197,6 +197,8 @@ IDTypeInfo IDType_ID_HA = {
.blend_read_expand = hair_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
static void hair_random(Hair *hair)
diff --git a/source/blender/blenkernel/intern/icons.cc b/source/blender/blenkernel/intern/icons.cc
index cba1726a1b9..afb009b66cd 100644
--- a/source/blender/blenkernel/intern/icons.cc
+++ b/source/blender/blenkernel/intern/icons.cc
@@ -374,6 +374,7 @@ PreviewImage **BKE_previewimg_id_get_p(const ID *id)
ID_PRV_CASE(ID_GR, Collection);
ID_PRV_CASE(ID_SCE, Scene);
ID_PRV_CASE(ID_SCR, bScreen);
+ ID_PRV_CASE(ID_AC, bAction);
#undef ID_PRV_CASE
default:
break;
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index b0991f1d343..6b164e6bc50 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -92,11 +92,9 @@ IDProperty *IDP_NewIDPArray(const char *name)
IDProperty *IDP_CopyIDPArray(const IDProperty *array, const int flag)
{
/* don't use MEM_dupallocN because this may be part of an array */
- IDProperty *narray, *tmp;
-
BLI_assert(array->type == IDP_IDPARRAY);
- narray = MEM_mallocN(sizeof(IDProperty), __func__);
+ IDProperty *narray = MEM_mallocN(sizeof(IDProperty), __func__);
*narray = *array;
narray->data.pointer = MEM_dupallocN(array->data.pointer);
@@ -107,7 +105,7 @@ IDProperty *IDP_CopyIDPArray(const IDProperty *array, const int flag)
* then free it. this makes for more maintainable
* code than simply re-implementing the copy functions
* in this loop.*/
- tmp = IDP_CopyProperty_ex(GETPROP(narray, i), flag);
+ IDProperty *tmp = IDP_CopyProperty_ex(GETPROP(narray, i), flag);
memcpy(GETPROP(narray, i), tmp, sizeof(IDProperty));
MEM_freeN(tmp);
}
@@ -131,15 +129,13 @@ static void IDP_FreeIDPArray(IDProperty *prop, const bool do_id_user)
/* shallow copies item */
void IDP_SetIndexArray(IDProperty *prop, int index, IDProperty *item)
{
- IDProperty *old;
-
BLI_assert(prop->type == IDP_IDPARRAY);
if (index >= prop->len || index < 0) {
return;
}
- old = GETPROP(prop, index);
+ IDProperty *old = GETPROP(prop, index);
if (item != old) {
IDP_FreePropertyContent(old);
@@ -164,8 +160,6 @@ void IDP_AppendArray(IDProperty *prop, IDProperty *item)
void IDP_ResizeIDPArray(IDProperty *prop, int newlen)
{
- int newsize;
-
BLI_assert(prop->type == IDP_IDPARRAY);
/* first check if the array buffer size has room */
@@ -200,7 +194,7 @@ void IDP_ResizeIDPArray(IDProperty *prop, int newlen)
* system realloc().
* The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
*/
- newsize = newlen;
+ int newsize = newlen;
newsize = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;
prop->data.pointer = MEM_recallocN(prop->data.pointer, sizeof(IDProperty) * (size_t)newsize);
prop->len = newlen;
@@ -218,9 +212,8 @@ static void idp_resize_group_array(IDProperty *prop, int newlen, void *newarr)
/* bigger */
IDProperty **array = newarr;
IDPropertyTemplate val;
- int a;
- for (a = prop->len; a < newlen; a++) {
+ for (int a = prop->len; a < newlen; a++) {
val.i = 0; /* silence MSVC warning about uninitialized var when debugging */
array[a] = IDP_New(IDP_GROUP, &val, "IDP_ResizeArray group");
}
@@ -228,9 +221,8 @@ static void idp_resize_group_array(IDProperty *prop, int newlen, void *newarr)
else {
/* smaller */
IDProperty **array = prop->data.pointer;
- int a;
- for (a = newlen; a < prop->len; a++) {
+ for (int a = newlen; a < prop->len; a++) {
IDP_FreeProperty(array[a]);
}
}
@@ -239,7 +231,6 @@ static void idp_resize_group_array(IDProperty *prop, int newlen, void *newarr)
/*this function works for strings too!*/
void IDP_ResizeArray(IDProperty *prop, int newlen)
{
- int newsize;
const bool is_grow = newlen >= prop->len;
/* first check if the array buffer size has room */
@@ -257,7 +248,7 @@ void IDP_ResizeArray(IDProperty *prop, int newlen)
* system realloc().
* The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
*/
- newsize = newlen;
+ int newsize = newlen;
newsize = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;
if (is_grow == false) {
@@ -362,10 +353,8 @@ IDProperty *IDP_NewString(const char *st, const char *name, int maxlen)
static IDProperty *IDP_CopyString(const IDProperty *prop, const int flag)
{
- IDProperty *newp;
-
BLI_assert(prop->type == IDP_STRING);
- newp = idp_generic_copy(prop, flag);
+ IDProperty *newp = idp_generic_copy(prop, flag);
if (prop->data.pointer) {
newp->data.pointer = MEM_dupallocN(prop->data.pointer);
@@ -379,10 +368,8 @@ static IDProperty *IDP_CopyString(const IDProperty *prop, const int flag)
void IDP_AssignString(IDProperty *prop, const char *st, int maxlen)
{
- int stlen;
-
BLI_assert(prop->type == IDP_STRING);
- stlen = (int)strlen(st);
+ int stlen = (int)strlen(st);
if (maxlen > 0 && maxlen < stlen) {
stlen = maxlen;
}
@@ -400,11 +387,9 @@ void IDP_AssignString(IDProperty *prop, const char *st, int maxlen)
void IDP_ConcatStringC(IDProperty *prop, const char *st)
{
- int newlen;
-
BLI_assert(prop->type == IDP_STRING);
- newlen = prop->len + (int)strlen(st);
+ int newlen = prop->len + (int)strlen(st);
/* we have to remember that prop->len includes the null byte for strings.
* so there's no need to add +1 to the resize function.*/
IDP_ResizeArray(prop, newlen);
@@ -413,13 +398,11 @@ void IDP_ConcatStringC(IDProperty *prop, const char *st)
void IDP_ConcatString(IDProperty *str1, IDProperty *append)
{
- int newlen;
-
BLI_assert(append->type == IDP_STRING);
/* since ->len for strings includes the NULL byte, we have to subtract one or
* we'll get an extra null byte after each concatenation operation.*/
- newlen = str1->len + append->len - 1;
+ int newlen = str1->len + append->len - 1;
IDP_ResizeArray(str1, newlen);
strcat(str1->data.pointer, append->data.pointer);
}
@@ -440,10 +423,8 @@ void IDP_FreeString(IDProperty *prop)
static IDProperty *IDP_CopyID(const IDProperty *prop, const int flag)
{
- IDProperty *newp;
-
BLI_assert(prop->type == IDP_ID);
- newp = idp_generic_copy(prop, flag);
+ IDProperty *newp = idp_generic_copy(prop, flag);
newp->data.pointer = prop->data.pointer;
if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
@@ -479,14 +460,12 @@ void IDP_AssignID(IDProperty *prop, ID *id, const int flag)
*/
static IDProperty *IDP_CopyGroup(const IDProperty *prop, const int flag)
{
- IDProperty *newp, *link;
-
BLI_assert(prop->type == IDP_GROUP);
- newp = idp_generic_copy(prop, flag);
+ IDProperty *newp = idp_generic_copy(prop, flag);
newp->len = prop->len;
newp->subtype = prop->subtype;
- for (link = prop->data.group.first; link; link = link->next) {
+ LISTBASE_FOREACH (IDProperty *, link, &prop->data.group) {
BLI_addtail(&newp->data.group, IDP_CopyProperty_ex(link, flag));
}
@@ -497,13 +476,11 @@ static IDProperty *IDP_CopyGroup(const IDProperty *prop, const int flag)
* When values name and types match, copy the values, else ignore */
void IDP_SyncGroupValues(IDProperty *dest, const IDProperty *src)
{
- IDProperty *other, *prop;
-
BLI_assert(dest->type == IDP_GROUP);
BLI_assert(src->type == IDP_GROUP);
- for (prop = src->data.group.first; prop; prop = prop->next) {
- other = BLI_findstring(&dest->data.group, prop->name, offsetof(IDProperty, name));
+ LISTBASE_FOREACH (IDProperty *, prop, &src->data.group) {
+ IDProperty *other = BLI_findstring(&dest->data.group, prop->name, offsetof(IDProperty, name));
if (other && prop->type == other->type) {
switch (prop->type) {
case IDP_INT:
@@ -526,12 +503,9 @@ void IDP_SyncGroupValues(IDProperty *dest, const IDProperty *src)
void IDP_SyncGroupTypes(IDProperty *dest, const IDProperty *src, const bool do_arraylen)
{
- IDProperty *prop_dst, *prop_dst_next;
- const IDProperty *prop_src;
-
- for (prop_dst = dest->data.group.first; prop_dst; prop_dst = prop_dst_next) {
- prop_dst_next = prop_dst->next;
- if ((prop_src = IDP_GetPropertyFromGroup((IDProperty *)src, prop_dst->name))) {
+ LISTBASE_FOREACH_MUTABLE (IDProperty *, prop_dst, &src->data.group) {
+ const IDProperty *prop_src = IDP_GetPropertyFromGroup((IDProperty *)src, prop_dst->name);
+ if (prop_src != NULL) {
/* check of we should replace? */
if ((prop_dst->type != prop_src->type || prop_dst->subtype != prop_src->subtype) ||
(do_arraylen && ELEM(prop_dst->type, IDP_ARRAY, IDP_IDPARRAY) &&
@@ -554,12 +528,11 @@ void IDP_SyncGroupTypes(IDProperty *dest, const IDProperty *src, const bool do_a
*/
void IDP_ReplaceGroupInGroup(IDProperty *dest, const IDProperty *src)
{
- IDProperty *loop, *prop;
-
BLI_assert(dest->type == IDP_GROUP);
BLI_assert(src->type == IDP_GROUP);
- for (prop = src->data.group.first; prop; prop = prop->next) {
+ LISTBASE_FOREACH (IDProperty *, prop, &src->data.group) {
+ IDProperty *loop;
for (loop = dest->data.group.first; loop; loop = loop->next) {
if (STREQ(loop->name, prop->name)) {
BLI_insertlinkreplace(&dest->data.group, loop, IDP_CopyProperty(prop));
@@ -612,13 +585,11 @@ void IDP_MergeGroup_ex(IDProperty *dest,
const bool do_overwrite,
const int flag)
{
- IDProperty *prop;
-
BLI_assert(dest->type == IDP_GROUP);
BLI_assert(src->type == IDP_GROUP);
if (do_overwrite) {
- for (prop = src->data.group.first; prop; prop = prop->next) {
+ LISTBASE_FOREACH (IDProperty *, prop, &src->data.group) {
if (prop->type == IDP_GROUP) {
IDProperty *prop_exist = IDP_GetPropertyFromGroup(dest, prop->name);
@@ -633,7 +604,7 @@ void IDP_MergeGroup_ex(IDProperty *dest,
}
}
else {
- for (prop = src->data.group.first; prop; prop = prop->next) {
+ LISTBASE_FOREACH (IDProperty *, prop, &src->data.group) {
IDProperty *prop_exist = IDP_GetPropertyFromGroup(dest, prop->name);
if (prop_exist != NULL) {
if (prop->type == IDP_GROUP) {
@@ -741,10 +712,9 @@ IDProperty *IDP_GetPropertyTypeFromGroup(const IDProperty *prop, const char *nam
* direct data. */
static void IDP_FreeGroup(IDProperty *prop, const bool do_id_user)
{
- IDProperty *loop;
-
BLI_assert(prop->type == IDP_GROUP);
- for (loop = prop->data.group.first; loop; loop = loop->next) {
+
+ LISTBASE_FOREACH (IDProperty *, loop, &prop->data.group) {
IDP_FreePropertyContent_ex(loop, do_id_user);
}
BLI_freelistN(&prop->data.group);
@@ -863,14 +833,12 @@ bool IDP_EqualsProperties_ex(IDProperty *prop1, IDProperty *prop2, const bool is
}
return false;
case IDP_GROUP: {
- IDProperty *link1, *link2;
-
if (is_strict && prop1->len != prop2->len) {
return false;
}
- for (link1 = prop1->data.group.first; link1; link1 = link1->next) {
- link2 = IDP_GetPropertyFromGroup(prop2, link1->name);
+ LISTBASE_FOREACH (IDProperty *, link1, &prop1->data.group) {
+ IDProperty *link2 = IDP_GetPropertyFromGroup(prop2, link1->name);
if (!IDP_EqualsProperties_ex(link1, link2, is_strict)) {
return false;
@@ -1158,11 +1126,10 @@ static void IDP_WriteIDPArray(const IDProperty *prop, BlendWriter *writer)
/*REMEMBER to set totalen to len in the linking code!!*/
if (prop->data.pointer) {
const IDProperty *array = prop->data.pointer;
- int a;
BLO_write_struct_array(writer, IDProperty, prop->len, array);
- for (a = 0; a < prop->len; a++) {
+ for (int a = 0; a < prop->len; a++) {
IDP_WriteProperty_OnlyData(&array[a], writer);
}
}
@@ -1176,9 +1143,7 @@ static void IDP_WriteString(const IDProperty *prop, BlendWriter *writer)
static void IDP_WriteGroup(const IDProperty *prop, BlendWriter *writer)
{
- IDProperty *loop;
-
- for (loop = prop->data.group.first; loop; loop = loop->next) {
+ LISTBASE_FOREACH (IDProperty *, loop, &prop->data.group) {
IDP_BlendWrite(writer, loop);
}
}
@@ -1212,13 +1177,11 @@ static void IDP_DirectLinkProperty(IDProperty *prop, BlendDataReader *reader);
static void IDP_DirectLinkIDPArray(IDProperty *prop, BlendDataReader *reader)
{
- IDProperty *array;
-
/* since we didn't save the extra buffer, set totallen to len */
prop->totallen = prop->len;
BLO_read_data_address(reader, &prop->data.pointer);
- array = (IDProperty *)prop->data.pointer;
+ IDProperty *array = (IDProperty *)prop->data.pointer;
/* note!, idp-arrays didn't exist in 2.4x, so the pointer will be cleared
* there's not really anything we can do to correct this, at least don't crash */
@@ -1234,14 +1197,12 @@ static void IDP_DirectLinkIDPArray(IDProperty *prop, BlendDataReader *reader)
static void IDP_DirectLinkArray(IDProperty *prop, BlendDataReader *reader)
{
- IDProperty **array;
-
/* since we didn't save the extra buffer, set totallen to len */
prop->totallen = prop->len;
if (prop->subtype == IDP_GROUP) {
BLO_read_pointer_array(reader, &prop->data.pointer);
- array = prop->data.pointer;
+ IDProperty **array = prop->data.pointer;
for (int i = 0; i < prop->len; i++) {
IDP_DirectLinkProperty(array[i], reader);
@@ -1266,12 +1227,11 @@ static void IDP_DirectLinkString(IDProperty *prop, BlendDataReader *reader)
static void IDP_DirectLinkGroup(IDProperty *prop, BlendDataReader *reader)
{
ListBase *lb = &prop->data.group;
- IDProperty *loop;
BLO_read_list(reader, lb);
/*Link child id properties now*/
- for (loop = prop->data.group.first; loop; loop = loop->next) {
+ LISTBASE_FOREACH (IDProperty *, loop, &prop->data.group) {
IDP_DirectLinkProperty(loop, reader);
}
}
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index ab57d14d2cf..10f15519ea4 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -338,6 +338,8 @@ IDTypeInfo IDType_ID_IM = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* prototypes */
diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c
index 2ee4505acf0..8847b88d6f2 100644
--- a/source/blender/blenkernel/intern/image_gpu.c
+++ b/source/blender/blenkernel/intern/image_gpu.c
@@ -647,7 +647,7 @@ static void gpu_texture_update_scaled(GPUTexture *tex,
}
void *data = (ibuf->rect_float) ? (void *)(ibuf->rect_float) : (void *)(ibuf->rect);
- eGPUDataFormat data_format = (ibuf->rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE;
+ eGPUDataFormat data_format = (ibuf->rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE;
GPU_texture_update_sub(tex, data_format, data, x, y, layer, w, h, 1);
@@ -673,7 +673,7 @@ static void gpu_texture_update_unscaled(GPUTexture *tex,
}
void *data = (rect_float) ? (void *)(rect_float + tex_offset) : (void *)(rect + tex_offset);
- eGPUDataFormat data_format = (rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE;
+ eGPUDataFormat data_format = (rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE;
/* Partial update without scaling. Stride and offset are used to copy only a
* subset of a possible larger buffer than what we are updating. */
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 1ab6e61e20e..d43a0cb3813 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -200,6 +200,8 @@ IDTypeInfo IDType_ID_IP = {
.blend_read_expand = ipo_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* *************************************************** */
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 433d64a5927..540337b84b3 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -223,6 +223,8 @@ IDTypeInfo IDType_ID_KE = {
.blend_read_expand = shapekey_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
#define KEY_MODE_DUMMY 0 /* use where mode isn't checked for */
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 84ffd8c636b..625d2353e3e 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -205,6 +205,8 @@ IDTypeInfo IDType_ID_LT = {
.blend_read_expand = lattice_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
int BKE_lattice_index_from_uvw(Lattice *lt, const int u, const int v, const int w)
diff --git a/source/blender/blenkernel/intern/lattice_deform.c b/source/blender/blenkernel/intern/lattice_deform.c
index 81c2f492f7e..2651042939f 100644
--- a/source/blender/blenkernel/intern/lattice_deform.c
+++ b/source/blender/blenkernel/intern/lattice_deform.c
@@ -31,6 +31,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_simd.h"
#include "BLI_task.h"
#include "BLI_utildefines.h"
@@ -49,10 +50,6 @@
#include "BKE_deform.h"
-#ifdef __SSE2__
-# include <emmintrin.h>
-#endif
-
/* -------------------------------------------------------------------- */
/** \name Lattice Deform API
* \{ */
@@ -171,7 +168,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data,
/* vgroup influence */
float co_prev[4] = {0}, weight_blend = 0.0f;
copy_v3_v3(co_prev, co);
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 co_vec = _mm_loadu_ps(co_prev);
#endif
@@ -232,7 +229,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data,
u = v * tu[uu - ui + 1];
idx_u = CLAMPIS(uu, 0, idx_u_max);
const int idx = idx_w + idx_v + idx_u;
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
{
__m128 weight_vec = _mm_set1_ps(u);
/* We need to address special case for last item to avoid accessing invalid memory. */
@@ -256,7 +253,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data,
}
}
}
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
{
copy_v3_v3(co, (float *)&co_vec);
}
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index 13f76b46570..54c2f5f5565 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -112,6 +112,8 @@ IDTypeInfo IDType_ID_LINK_PLACEHOLDER = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* GS reads the memory pointed at in a specific ordering.
@@ -1793,32 +1795,31 @@ static void library_make_local_copying_check(ID *id,
return; /* Already checked, nothing else to do. */
}
- MainIDRelationsEntry *entry = BLI_ghash_lookup(id_relations->id_used_to_user, id);
+ MainIDRelationsEntry *entry = BLI_ghash_lookup(id_relations->relations_from_pointers, id);
BLI_gset_insert(loop_tags, id);
- for (; entry != NULL; entry = entry->next) {
-
- /* Used_to_user stores ID pointer, not pointer to ID pointer. */
- ID *par_id = (ID *)entry->id_pointer;
-
+ for (MainIDRelationsEntryItem *from_id_entry = entry->from_ids; from_id_entry != NULL;
+ from_id_entry = from_id_entry->next) {
/* Our oh-so-beloved 'from' pointers... Those should always be ignored here, since the actual
* relation we want to check is in the other way around. */
- if (entry->usage_flag & IDWALK_CB_LOOPBACK) {
+ if (from_id_entry->usage_flag & IDWALK_CB_LOOPBACK) {
continue;
}
+ ID *from_id = from_id_entry->id_pointer.from;
+
/* Shape-keys are considered 'private' to their owner ID here, and never tagged
* (since they cannot be linked), so we have to switch effective parent to their owner.
*/
- if (GS(par_id->name) == ID_KE) {
- par_id = ((Key *)par_id)->from;
+ if (GS(from_id->name) == ID_KE) {
+ from_id = ((Key *)from_id)->from;
}
- if (par_id->lib == NULL) {
+ if (from_id->lib == NULL) {
/* Local user, early out to avoid some gset querying... */
continue;
}
- if (!BLI_gset_haskey(done_ids, par_id)) {
- if (BLI_gset_haskey(loop_tags, par_id)) {
+ if (!BLI_gset_haskey(done_ids, from_id)) {
+ if (BLI_gset_haskey(loop_tags, from_id)) {
/* We are in a 'dependency loop' of IDs, this does not say us anything, skip it.
* Note that this is the situation that can lead to archipelagoes of linked data-blocks
* (since all of them have non-local users, they would all be duplicated,
@@ -1827,10 +1828,10 @@ static void library_make_local_copying_check(ID *id,
continue;
}
/* Else, recursively check that user ID. */
- library_make_local_copying_check(par_id, loop_tags, id_relations, done_ids);
+ library_make_local_copying_check(from_id, loop_tags, id_relations, done_ids);
}
- if (par_id->tag & LIB_TAG_DOIT) {
+ if (from_id->tag & LIB_TAG_DOIT) {
/* This user will be fully local in future, so far so good,
* nothing to do here but check next user. */
}
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index e4094c48368..602c560cedd 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -368,183 +368,249 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain)
return success;
}
-static bool lib_override_hierarchy_recursive_tag(Main *bmain,
- ID *id,
- const uint tag,
- const uint missing_tag,
- Library *override_group_lib_reference)
+typedef struct LibOverrideGroupTagData {
+ Main *bmain;
+ ID *id_root;
+ uint tag;
+ uint missing_tag;
+} LibOverrideGroupTagData;
+
+/* Tag all IDs in dependency relationships within an override hierarchy/group.
+ *
+ * Requires existing `Main.relations`.
+ *
+ * Note: this is typically called to complete `lib_override_linked_group_tag()`.
+ */
+static bool lib_override_hierarchy_dependencies_recursive_tag(LibOverrideGroupTagData *data)
{
- void **entry_vp = BLI_ghash_lookup_p(bmain->relations->id_user_to_used, id);
- if (entry_vp == NULL) {
- /* Already processed. */
- return (id->tag & tag) != 0;
- }
+ Main *bmain = data->bmain;
+ ID *id = data->id_root;
- /* Note: in case some reference ID is missing from linked data (and therefore its override uses
- * a placeholder as reference), use `missing_tag` instead of `tag` for this override. */
- if (override_group_lib_reference != NULL && ID_IS_OVERRIDE_LIBRARY_REAL(id) &&
- id->override_library->reference->lib == override_group_lib_reference) {
- if (id->override_library->reference->tag & LIB_TAG_MISSING) {
- id->tag |= missing_tag;
- }
- else {
- id->tag |= tag;
- }
- }
+ MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers, id);
+ BLI_assert(entry != NULL);
+ if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) {
+ /* This ID has already been processed. */
+ return (*(uint *)&id->tag & data->tag) != 0;
+ }
/* This way we won't process again that ID, should we encounter it again through another
- * relationship hierarchy.
- * Note that this does not free any memory from relations, so we can still use the entries.
- */
- BKE_main_relations_ID_remove(bmain, id);
+ * relationship hierarchy. */
+ entry->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED;
- for (MainIDRelationsEntry *entry = *entry_vp; entry != NULL; entry = entry->next) {
- if ((entry->usage_flag & IDWALK_CB_LOOPBACK) != 0) {
+ for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL;
+ to_id_entry = to_id_entry->next) {
+ if ((to_id_entry->usage_flag & IDWALK_CB_LOOPBACK) != 0) {
/* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers) as
* actual dependencies. */
continue;
}
/* We only consider IDs from the same library. */
- if (entry->id_pointer != NULL && (*entry->id_pointer)->lib == id->lib) {
- if (lib_override_hierarchy_recursive_tag(
- bmain, *entry->id_pointer, tag, missing_tag, override_group_lib_reference) &&
- override_group_lib_reference == NULL) {
- id->tag |= tag;
+ ID *to_id = *to_id_entry->id_pointer.to;
+ if (to_id != NULL && to_id->lib == id->lib) {
+ LibOverrideGroupTagData sub_data = *data;
+ sub_data.id_root = to_id;
+ if (lib_override_hierarchy_dependencies_recursive_tag(&sub_data)) {
+ id->tag |= data->tag;
}
}
}
- return (id->tag & tag) != 0;
+ return (*(uint *)&id->tag & data->tag) != 0;
}
-/**
- * Tag all IDs in given \a bmain that are being used by given \a id_root ID or its dependencies,
- * recursively.
- * It detects and tag only chains of dependencies marked at both ends by given tag.
- *
- * This will include all local IDs, and all IDs from the same library as the \a id_root.
- *
- * \param id_root: The root of the hierarchy of dependencies to be tagged.
- * \param do_create_main_relashionships: Whether main relations needs to be created or already
- * exist (in any case, they will be freed by this function).
- */
-void BKE_lib_override_library_dependencies_tag(Main *bmain,
- ID *id_root,
- const uint tag,
- const bool do_create_main_relashionships)
+static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *data)
{
- if (do_create_main_relashionships) {
- BKE_main_relations_create(bmain, 0);
+ Main *bmain = data->bmain;
+ ID *id_owner = data->id_root;
+ BLI_assert(ID_IS_LINKED(id_owner));
+ const uint tag = data->tag;
+ const uint missing_tag = data->missing_tag;
+
+ MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers,
+ id_owner);
+ BLI_assert(entry != NULL);
+
+ if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) {
+ /* This ID has already been processed. */
+ return;
}
+ /* This way we won't process again that ID, should we encounter it again through another
+ * relationship hierarchy. */
+ entry->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED;
+
+ for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL;
+ to_id_entry = to_id_entry->next) {
+ if ((to_id_entry->usage_flag &
+ (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK | IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE)) != 0) {
+ /* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers), nor
+ * override references or embedded ID pointers, as actual dependencies. */
+ continue;
+ }
- /* We tag all intermediary data-blocks in-between two overridden ones (e.g. if a shape-key
- * has a driver using an armature object's bone, we need to override the shape-key/obdata,
- * the objects using them, etc.) */
- lib_override_hierarchy_recursive_tag(bmain, id_root, tag, 0, NULL);
+ ID *to_id = *to_id_entry->id_pointer.to;
+ if (ELEM(to_id, NULL, id_owner)) {
+ continue;
+ }
+ /* We only consider IDs from the same library. */
+ if (to_id->lib != id_owner->lib) {
+ continue;
+ }
+ BLI_assert(ID_IS_LINKED(to_id));
+
+ /* We tag all collections and objects for override. And we also tag all other data-blocks which
+ * would use one of those.
+ * Note: missing IDs (aka placeholders) are never overridden. */
+ if (ELEM(GS(to_id->name), ID_OB, ID_GR)) {
+ if ((to_id->tag & LIB_TAG_MISSING)) {
+ to_id->tag |= missing_tag;
+ }
+ else {
+ to_id->tag |= tag;
+ }
+ }
- BKE_main_relations_free(bmain);
+ /* Recursively process the dependencies. */
+ LibOverrideGroupTagData sub_data = *data;
+ sub_data.id_root = to_id;
+ lib_override_linked_group_tag_recursive(&sub_data);
+ }
}
-/**
- * Tag all IDs in given \a bmain that are part of the same \a id_root liboverride ID group.
- * That is, all other liboverride IDs (in)directly used by \a is_root one, and sharing the same
- * library for their reference IDs.
+/* This will tag at least all 'boundary' linked IDs for a potential override group.
+ *
+ * Requires existing `Main.relations`.
*
- * \param id_root: The root of the hierarchy of liboverride dependencies to be tagged.
- * \param do_create_main_relashionships: Whether main relations needs to be created or already
- * exist (in any case, they will be freed by this function).
+ * Note that you will then need to call #lib_override_hierarchy_dependencies_recursive_tag to
+ * complete tagging of all dependencies within the override group.
+ *
+ * We currently only consider Collections and Objects (that are not used as bone shapes) as valid
+ * boundary IDs to define an override group.
*/
-void BKE_lib_override_library_override_group_tag(Main *bmain,
- ID *id_root,
- const uint tag,
- const uint missing_tag,
- const bool do_create_main_relashionships)
+static void lib_override_linked_group_tag(LibOverrideGroupTagData *data)
{
- if (do_create_main_relashionships) {
- BKE_main_relations_create(bmain, 0);
+ Main *bmain = data->bmain;
+ ID *id_root = data->id_root;
+
+ if ((id_root->tag & LIB_TAG_MISSING)) {
+ id_root->tag |= data->missing_tag;
+ }
+ else {
+ id_root->tag |= data->tag;
}
- /* We tag all liboverride data-blocks from the same library as reference one,
- * being used by the root ID. */
- lib_override_hierarchy_recursive_tag(
- bmain, id_root, tag, missing_tag, id_root->override_library->reference->lib);
+ if (ELEM(GS(id_root->name), ID_OB, ID_GR)) {
+ /* Tag all collections and objects. */
+ lib_override_linked_group_tag_recursive(data);
- BKE_main_relations_free(bmain);
+ /* Then, we remove (untag) bone shape objects, you shall never want to directly/explicitly
+ * override those. */
+ LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
+ if (ob->type == OB_ARMATURE && ob->pose != NULL && (ob->id.tag & data->tag)) {
+ for (bPoseChannel *pchan = ob->pose->chanbase.first; pchan != NULL; pchan = pchan->next) {
+ if (pchan->custom != NULL) {
+ pchan->custom->id.tag &= ~(data->tag | data->missing_tag);
+ }
+ }
+ }
+ }
+ }
}
-static int lib_override_library_make_tag_ids_cb(LibraryIDLinkCallbackData *cb_data)
+static void lib_override_local_group_tag_recursive(LibOverrideGroupTagData *data)
{
- if (cb_data->cb_flag & (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK)) {
- return IDWALK_RET_STOP_RECURSION;
+ Main *bmain = data->bmain;
+ ID *id_owner = data->id_root;
+ BLI_assert(ID_IS_OVERRIDE_LIBRARY(id_owner));
+ const uint tag = data->tag;
+ const uint missing_tag = data->missing_tag;
+
+ MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers,
+ id_owner);
+ BLI_assert(entry != NULL);
+
+ if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) {
+ /* This ID has already been processed. */
+ return;
}
+ /* This way we won't process again that ID, should we encounter it again through another
+ * relationship hierarchy. */
+ entry->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED;
+
+ for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL;
+ to_id_entry = to_id_entry->next) {
+ if ((to_id_entry->usage_flag &
+ (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK | IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE)) != 0) {
+ /* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers), nor
+ * override references or embedded ID pointers, as actual dependencies. */
+ continue;
+ }
- ID *id_root = cb_data->user_data;
- Library *library_root = id_root->lib;
- ID *id = *cb_data->id_pointer;
- ID *id_owner = cb_data->id_owner;
-
- BLI_assert(id_owner == cb_data->id_self);
+ ID *to_id = *to_id_entry->id_pointer.to;
+ if (ELEM(to_id, NULL, id_owner)) {
+ continue;
+ }
+ if (!ID_IS_OVERRIDE_LIBRARY(to_id) || ID_IS_LINKED(to_id)) {
+ continue;
+ }
- if (ELEM(id, NULL, id_owner)) {
- return IDWALK_RET_NOP;
- }
+ /* Do not tag 'virtual' overrides (shape keys here, as we already rejected embedded case
+ * above). */
+ if (ID_IS_OVERRIDE_LIBRARY_REAL(to_id)) {
+ Library *reference_lib = NULL;
+ if (GS(id_owner->name) == ID_KE) {
+ reference_lib = ((Key *)id_owner)->from->override_library->reference->lib;
+ }
+ else {
+ reference_lib = id_owner->override_library->reference->lib;
+ }
+ if (to_id->override_library->reference->lib != reference_lib) {
+ /* We do not override data-blocks from other libraries, nor do we process them. */
+ continue;
+ }
- BLI_assert(id->lib != NULL);
- BLI_assert(id_owner->lib == library_root);
+ if (to_id->override_library->reference->tag & LIB_TAG_MISSING) {
+ to_id->tag |= missing_tag;
+ }
+ else {
+ to_id->tag |= tag;
+ }
+ }
- if (id->tag & LIB_TAG_DOIT) {
- /* Already processed and tagged, nothing else to do here. */
- return IDWALK_RET_STOP_RECURSION;
+ /* Recursively process the dependencies. */
+ LibOverrideGroupTagData sub_data = *data;
+ sub_data.id_root = to_id;
+ lib_override_local_group_tag_recursive(&sub_data);
}
+}
- if (id->lib != library_root) {
- /* We do not override data-blocks from other libraries, nor do we process them. */
- return IDWALK_RET_STOP_RECURSION;
- }
+/* This will tag all override IDs of an override group defined by the given `id_root`. */
+static void lib_override_local_group_tag(LibOverrideGroupTagData *data)
+{
+ ID *id_root = data->id_root;
+ BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root) && !ID_IS_LINKED(id_root));
- /* We tag all collections and objects for override. And we also tag all other data-blocks which
- * would use one of those.
- * Note: missing IDs (aka placeholders) are never overridden. */
- if (ELEM(GS(id->name), ID_OB, ID_GR) && !(id->tag & LIB_TAG_MISSING)) {
- id->tag |= LIB_TAG_DOIT;
+ if ((id_root->override_library->reference->tag & LIB_TAG_MISSING)) {
+ id_root->tag |= data->missing_tag;
+ }
+ else {
+ id_root->tag |= data->tag;
}
- return IDWALK_RET_NOP;
+ /* Tag all local overrides in id_root's group. */
+ lib_override_local_group_tag_recursive(data);
}
static bool lib_override_library_create_do(Main *bmain, ID *id_root)
{
- id_root->tag |= LIB_TAG_DOIT;
-
BKE_main_relations_create(bmain, 0);
+ LibOverrideGroupTagData data = {
+ .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING};
+ lib_override_linked_group_tag(&data);
- if (ELEM(GS(id_root->name), ID_OB, ID_GR)) {
- /* Tag all collections and objects. */
- BKE_library_foreach_ID_link(bmain,
- id_root,
- lib_override_library_make_tag_ids_cb,
- id_root,
- IDWALK_READONLY | IDWALK_RECURSE);
-
- /* Then, we remove (untag) bone shape objects, you shall never want to override those
- * (hopefully). */
- LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
- if (ob->type == OB_ARMATURE && ob->pose != NULL && (ob->id.tag & LIB_TAG_DOIT)) {
- for (bPoseChannel *pchan = ob->pose->chanbase.first; pchan != NULL; pchan = pchan->next) {
- if (pchan->custom != NULL) {
- pchan->custom->id.tag &= ~LIB_TAG_DOIT;
- }
- }
- }
- }
- }
+ BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false);
+ lib_override_hierarchy_dependencies_recursive_tag(&data);
- /* Now tag all non-object/collection IDs 'in-between' two tagged ones, as those are part of an
- * override chain and therefore also need to be overridden.
- * One very common cases are e.g. drivers on geometry or materials of an overridden object, that
- * are using another overridden object as parameter. */
- /* Note that this call will also free the main relations data we created above. */
- BKE_lib_override_library_dependencies_tag(bmain, id_root, LIB_TAG_DOIT, false);
+ BKE_main_relations_free(bmain);
return BKE_lib_override_library_create_from_tag(bmain);
}
@@ -737,14 +803,21 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_
{
BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root));
- /* Tag all collections and objects, as well as other IDs using them. */
- id_root->tag |= LIB_TAG_DOIT;
ID *id_root_reference = id_root->override_library->reference;
- /* Make a mapping 'linked reference IDs' -> 'Local override IDs' of existing overrides, and tag
- * linked reference ones to be overridden again. */
- BKE_lib_override_library_override_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING, true);
+ BKE_main_relations_create(bmain, 0);
+ LibOverrideGroupTagData data = {
+ .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING};
+ lib_override_local_group_tag(&data);
+
+ BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false);
+ data.id_root = id_root_reference;
+ lib_override_linked_group_tag(&data);
+ BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false);
+ lib_override_hierarchy_dependencies_recursive_tag(&data);
+
+ /* Make a mapping 'linked reference IDs' -> 'Local override IDs' of existing overrides. */
GHash *linkedref_to_old_override = BLI_ghash_new(
BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
ID *id;
@@ -755,17 +828,45 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_
* same linked ID in a same hierarchy. */
if (!BLI_ghash_haskey(linkedref_to_old_override, id->override_library->reference)) {
BLI_ghash_insert(linkedref_to_old_override, id->override_library->reference, id);
- id->override_library->reference->tag |= LIB_TAG_DOIT;
+ if ((id->override_library->reference->tag & LIB_TAG_DOIT) == 0) {
+ /* We have an override, but now it does not seem to be necessary to override that ID
+ * anymore. Check if there are some actual overrides from the user, otherwise assume
+ * that we can get rid of this local override. */
+ LISTBASE_FOREACH (IDOverrideLibraryProperty *, op, &id->override_library->properties) {
+ if (op->rna_prop_type != PROP_POINTER) {
+ id->override_library->reference->tag |= LIB_TAG_DOIT;
+ break;
+ }
+
+ bool do_break = false;
+ LISTBASE_FOREACH (IDOverrideLibraryPropertyOperation *, opop, &op->operations) {
+ if ((opop->flag & IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE) == 0) {
+ id->override_library->reference->tag |= LIB_TAG_DOIT;
+ do_break = true;
+ break;
+ }
+ }
+ if (do_break) {
+ break;
+ }
+ }
+ }
}
}
}
FOREACH_MAIN_ID_END;
+ /* Code above may have added some tags, we need to update this too. */
+ BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false);
+ lib_override_hierarchy_dependencies_recursive_tag(&data);
+
+ BKE_main_relations_free(bmain);
+
/* Make new override from linked data. */
/* Note that this call also remaps all pointers of tagged IDs from old override IDs to new
* override IDs (including within the old overrides themselves, since those are tagged too
* above). */
- const bool success = lib_override_library_create_do(bmain, id_root_reference);
+ const bool success = BKE_lib_override_library_create_from_tag(bmain);
if (!success) {
return success;
@@ -828,6 +929,23 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_
RNA_id_pointer_create(id_override_old, &rnaptr_src);
RNA_id_pointer_create(id_override_new, &rnaptr_dst);
+ /* We remove any operation tagged with `IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE`,
+ * that way the potentially new pointer will be properly kept, when old one is still valid
+ * too (typical case: assigning new ID to some usage, while old one remains used elsewhere
+ * in the override hierarchy). */
+ LISTBASE_FOREACH_MUTABLE (
+ IDOverrideLibraryProperty *, op, &id_override_new->override_library->properties) {
+ LISTBASE_FOREACH_MUTABLE (IDOverrideLibraryPropertyOperation *, opop, &op->operations) {
+ if (opop->flag & IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE) {
+ lib_override_library_property_operation_clear(opop);
+ BLI_freelinkN(&op->operations, opop);
+ }
+ }
+ if (BLI_listbase_is_empty(&op->operations)) {
+ BKE_lib_override_library_property_delete(id_override_new->override_library, op);
+ }
+ }
+
RNA_struct_override_apply(
bmain, &rnaptr_dst, &rnaptr_src, NULL, id_override_new->override_library);
}
@@ -896,11 +1014,13 @@ void BKE_lib_override_library_delete(Main *bmain, ID *id_root)
{
BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root));
- /* Tag all collections and objects, as well as other IDs using them. */
- id_root->tag |= LIB_TAG_DOIT;
-
/* Tag all library overrides in the chains of dependencies from the given root one. */
- BKE_lib_override_library_override_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_DOIT, true);
+ BKE_main_relations_create(bmain, 0);
+ LibOverrideGroupTagData data = {
+ .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING};
+ lib_override_local_group_tag(&data);
+
+ BKE_main_relations_free(bmain);
ID *id;
FOREACH_MAIN_ID_BEGIN (bmain, id) {
@@ -1558,24 +1678,26 @@ static bool lib_override_library_id_reset_do(Main *bmain, ID *id_root)
&ptr_root_lib);
bool prop_exists = RNA_path_resolve_property(&ptr_root, op->rna_path, &ptr, &prop);
- BLI_assert(prop_exists);
- prop_exists = RNA_path_resolve_property(&ptr_root_lib, op->rna_path, &ptr_lib, &prop_lib);
-
if (prop_exists) {
- BLI_assert(ELEM(RNA_property_type(prop), PROP_POINTER, PROP_COLLECTION));
- BLI_assert(RNA_property_type(prop) == RNA_property_type(prop_lib));
- if (is_collection) {
- ptr.type = RNA_property_pointer_type(&ptr, prop);
- ptr_lib.type = RNA_property_pointer_type(&ptr_lib, prop_lib);
- }
- else {
- ptr = RNA_property_pointer_get(&ptr, prop);
- ptr_lib = RNA_property_pointer_get(&ptr_lib, prop_lib);
- }
- if (ptr.owner_id != NULL && ptr_lib.owner_id != NULL) {
- BLI_assert(ptr.type == ptr_lib.type);
- do_op_delete = !(RNA_struct_is_ID(ptr.type) && ptr.owner_id->override_library != NULL &&
- ptr.owner_id->override_library->reference == ptr_lib.owner_id);
+ prop_exists = RNA_path_resolve_property(&ptr_root_lib, op->rna_path, &ptr_lib, &prop_lib);
+
+ if (prop_exists) {
+ BLI_assert(ELEM(RNA_property_type(prop), PROP_POINTER, PROP_COLLECTION));
+ BLI_assert(RNA_property_type(prop) == RNA_property_type(prop_lib));
+ if (is_collection) {
+ ptr.type = RNA_property_pointer_type(&ptr, prop);
+ ptr_lib.type = RNA_property_pointer_type(&ptr_lib, prop_lib);
+ }
+ else {
+ ptr = RNA_property_pointer_get(&ptr, prop);
+ ptr_lib = RNA_property_pointer_get(&ptr_lib, prop_lib);
+ }
+ if (ptr.owner_id != NULL && ptr_lib.owner_id != NULL) {
+ BLI_assert(ptr.type == ptr_lib.type);
+ do_op_delete = !(RNA_struct_is_ID(ptr.type) &&
+ ptr.owner_id->override_library != NULL &&
+ ptr.owner_id->override_library->reference == ptr_lib.owner_id);
+ }
}
}
}
@@ -1619,31 +1741,37 @@ static void lib_override_library_id_hierarchy_recursive_reset(Main *bmain, ID *i
return;
}
- void **entry_pp = BLI_ghash_lookup(bmain->relations->id_user_to_used, id_root);
- if (entry_pp == NULL) {
- /* Already processed. */
+ void **entry_vp = BLI_ghash_lookup_p(bmain->relations->relations_from_pointers, id_root);
+ if (entry_vp == NULL) {
+ /* This ID is not used by nor using any other ID. */
+ lib_override_library_id_reset_do(bmain, id_root);
+ return;
+ }
+
+ MainIDRelationsEntry *entry = *entry_vp;
+ if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) {
+ /* This ID has already been processed. */
return;
}
lib_override_library_id_reset_do(bmain, id_root);
/* This way we won't process again that ID, should we encounter it again through another
- * relationship hierarchy.
- * Note that this does not free any memory from relations, so we can still use the entries.
- */
- BKE_main_relations_ID_remove(bmain, id_root);
+ * relationship hierarchy. */
+ entry->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED;
- for (MainIDRelationsEntry *entry = *entry_pp; entry != NULL; entry = entry->next) {
- if ((entry->usage_flag & IDWALK_CB_LOOPBACK) != 0) {
+ for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL;
+ to_id_entry = to_id_entry->next) {
+ if ((to_id_entry->usage_flag & IDWALK_CB_LOOPBACK) != 0) {
/* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers) as
* actual dependencies. */
continue;
}
/* We only consider IDs from the same library. */
- if (entry->id_pointer != NULL) {
- ID *id_entry = *entry->id_pointer;
- if (id_entry->override_library != NULL) {
- lib_override_library_id_hierarchy_recursive_reset(bmain, id_entry);
+ if (*to_id_entry->id_pointer.to != NULL) {
+ ID *to_id = *to_id_entry->id_pointer.to;
+ if (to_id->override_library != NULL) {
+ lib_override_library_id_hierarchy_recursive_reset(bmain, to_id);
}
}
}
@@ -1922,7 +2050,9 @@ ID *BKE_lib_override_library_operations_store_start(Main *bmain,
ID *local)
{
if (ID_IS_OVERRIDE_LIBRARY_TEMPLATE(local) || ID_IS_OVERRIDE_LIBRARY_VIRTUAL(local)) {
- /* This is actually purely local data with an override template, nothing to do here! */
+ /* This is actually purely local data with an override template, or one of those embedded IDs
+ * (root node trees, master collections or shapekeys) that cannot have their own override.
+ * Nothing to do here! */
return NULL;
}
diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c
index e687e94073d..1fd51544ba7 100644
--- a/source/blender/blenkernel/intern/lib_query.c
+++ b/source/blender/blenkernel/intern/lib_query.c
@@ -237,9 +237,12 @@ static void library_foreach_ID_link(Main *bmain,
* but we might as well use it (Main->relations is always assumed valid,
* it's responsibility of code creating it to free it,
* especially if/when it starts modifying Main database). */
- MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->id_user_to_used, id);
- for (; entry != NULL; entry = entry->next) {
- BKE_lib_query_foreachid_process(&data, entry->id_pointer, entry->usage_flag);
+ MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers,
+ id);
+ for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL;
+ to_id_entry = to_id_entry->next) {
+ BKE_lib_query_foreachid_process(
+ &data, to_id_entry->id_pointer.to, to_id_entry->usage_flag);
}
continue;
}
@@ -413,13 +416,14 @@ bool BKE_library_id_can_use_idtype(ID *id_owner, const short id_type_used)
return ELEM(id_type_used, ID_MA);
case ID_SIM:
return ELEM(id_type_used, ID_OB, ID_IM);
+ case ID_WM:
+ return ELEM(id_type_used, ID_SCE, ID_WS);
case ID_IM:
case ID_VF:
case ID_TXT:
case ID_SO:
case ID_AR:
case ID_AC:
- case ID_WM:
case ID_PAL:
case ID_PC:
case ID_CF:
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 6a560d51362..d2f1196d804 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -84,6 +84,8 @@ IDTypeInfo IDType_ID_LI = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
void BKE_library_filepath_set(Main *bmain, Library *lib, const char *filepath)
diff --git a/source/blender/blenkernel/intern/light.c b/source/blender/blenkernel/intern/light.c
index a47a0c043ff..4a2afb7f5e6 100644
--- a/source/blender/blenkernel/intern/light.c
+++ b/source/blender/blenkernel/intern/light.c
@@ -209,6 +209,8 @@ IDTypeInfo IDType_ID_LA = {
.blend_read_expand = light_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
Light *BKE_light_add(Main *bmain, const char *name)
diff --git a/source/blender/blenkernel/intern/lightprobe.c b/source/blender/blenkernel/intern/lightprobe.c
index 0553c070fdf..4ef3b8c3237 100644
--- a/source/blender/blenkernel/intern/lightprobe.c
+++ b/source/blender/blenkernel/intern/lightprobe.c
@@ -107,6 +107,8 @@ IDTypeInfo IDType_ID_LP = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
void BKE_lightprobe_type_set(LightProbe *probe, const short lightprobe_type)
diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c
index 8542959d4b0..283e2a94732 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -767,6 +767,8 @@ IDTypeInfo IDType_ID_LS = {
.blend_read_expand = linestyle_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
static const char *modifier_name[LS_MODIFIER_NUM] = {
diff --git a/source/blender/blenkernel/intern/main.c b/source/blender/blenkernel/intern/main.c
index 4b577ccec2c..6f94b3355fa 100644
--- a/source/blender/blenkernel/intern/main.c
+++ b/source/blender/blenkernel/intern/main.c
@@ -211,35 +211,51 @@ void BKE_main_unlock(struct Main *bmain)
static int main_relations_create_idlink_cb(LibraryIDLinkCallbackData *cb_data)
{
- MainIDRelations *rel = cb_data->user_data;
+ MainIDRelations *bmain_relations = cb_data->user_data;
ID *id_self = cb_data->id_self;
ID **id_pointer = cb_data->id_pointer;
const int cb_flag = cb_data->cb_flag;
if (*id_pointer) {
- MainIDRelationsEntry *entry, **entry_p;
-
- entry = BLI_mempool_alloc(rel->entry_pool);
- if (BLI_ghash_ensure_p(rel->id_user_to_used, id_self, (void ***)&entry_p)) {
- entry->next = *entry_p;
- }
- else {
- entry->next = NULL;
+ MainIDRelationsEntry **entry_p;
+
+ /* Add `id_pointer` as child of `id_self`. */
+ {
+ if (!BLI_ghash_ensure_p(
+ bmain_relations->relations_from_pointers, id_self, (void ***)&entry_p)) {
+ *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
+ (*entry_p)->session_uuid = id_self->session_uuid;
+ }
+ else {
+ BLI_assert((*entry_p)->session_uuid == id_self->session_uuid);
+ }
+ MainIDRelationsEntryItem *to_id_entry = BLI_mempool_alloc(bmain_relations->entry_items_pool);
+ to_id_entry->next = (*entry_p)->to_ids;
+ to_id_entry->id_pointer.to = id_pointer;
+ to_id_entry->session_uuid = (*id_pointer != NULL) ? (*id_pointer)->session_uuid :
+ MAIN_ID_SESSION_UUID_UNSET;
+ to_id_entry->usage_flag = cb_flag;
+ (*entry_p)->to_ids = to_id_entry;
}
- entry->id_pointer = id_pointer;
- entry->usage_flag = cb_flag;
- *entry_p = entry;
- entry = BLI_mempool_alloc(rel->entry_pool);
- if (BLI_ghash_ensure_p(rel->id_used_to_user, *id_pointer, (void ***)&entry_p)) {
- entry->next = *entry_p;
- }
- else {
- entry->next = NULL;
+ /* Add `id_self` as parent of `id_pointer`. */
+ if (*id_pointer != NULL) {
+ if (!BLI_ghash_ensure_p(
+ bmain_relations->relations_from_pointers, *id_pointer, (void ***)&entry_p)) {
+ *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
+ (*entry_p)->session_uuid = (*id_pointer)->session_uuid;
+ }
+ else {
+ BLI_assert((*entry_p)->session_uuid == (*id_pointer)->session_uuid);
+ }
+ MainIDRelationsEntryItem *from_id_entry = BLI_mempool_alloc(
+ bmain_relations->entry_items_pool);
+ from_id_entry->next = (*entry_p)->from_ids;
+ from_id_entry->id_pointer.from = id_self;
+ from_id_entry->session_uuid = id_self->session_uuid;
+ from_id_entry->usage_flag = cb_flag;
+ (*entry_p)->from_ids = from_id_entry;
}
- entry->id_pointer = (ID **)id_self;
- entry->usage_flag = cb_flag;
- *entry_p = entry;
}
return IDWALK_RET_NOP;
@@ -253,61 +269,68 @@ void BKE_main_relations_create(Main *bmain, const short flag)
}
bmain->relations = MEM_mallocN(sizeof(*bmain->relations), __func__);
- bmain->relations->id_used_to_user = BLI_ghash_new(
+ bmain->relations->relations_from_pointers = BLI_ghash_new(
BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
- bmain->relations->id_user_to_used = BLI_ghash_new(
- BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
- bmain->relations->entry_pool = BLI_mempool_create(
- sizeof(MainIDRelationsEntry), 128, 128, BLI_MEMPOOL_NOP);
+ bmain->relations->entry_items_pool = BLI_mempool_create(
+ sizeof(MainIDRelationsEntryItem), 128, 128, BLI_MEMPOOL_NOP);
+
+ bmain->relations->flag = flag;
ID *id;
FOREACH_MAIN_ID_BEGIN (bmain, id) {
const int idwalk_flag = IDWALK_READONLY |
((flag & MAINIDRELATIONS_INCLUDE_UI) != 0 ? IDWALK_INCLUDE_UI : 0);
+
+ /* Ensure all IDs do have an entry, even if they are not connected to any other. */
+ MainIDRelationsEntry **entry_p;
+ if (!BLI_ghash_ensure_p(bmain->relations->relations_from_pointers, id, (void ***)&entry_p)) {
+ *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
+ (*entry_p)->session_uuid = id->session_uuid;
+ }
+ else {
+ BLI_assert((*entry_p)->session_uuid == id->session_uuid);
+ }
+
BKE_library_foreach_ID_link(
NULL, id, main_relations_create_idlink_cb, bmain->relations, idwalk_flag);
}
FOREACH_MAIN_ID_END;
-
- bmain->relations->flag = flag;
}
void BKE_main_relations_free(Main *bmain)
{
- if (bmain->relations) {
- if (bmain->relations->id_used_to_user) {
- BLI_ghash_free(bmain->relations->id_used_to_user, NULL, NULL);
- }
- if (bmain->relations->id_user_to_used) {
- BLI_ghash_free(bmain->relations->id_user_to_used, NULL, NULL);
+ if (bmain->relations != NULL) {
+ if (bmain->relations->relations_from_pointers != NULL) {
+ BLI_ghash_free(bmain->relations->relations_from_pointers, NULL, MEM_freeN);
}
- BLI_mempool_destroy(bmain->relations->entry_pool);
+ BLI_mempool_destroy(bmain->relations->entry_items_pool);
MEM_freeN(bmain->relations);
bmain->relations = NULL;
}
}
-/**
- * Remove an ID from the relations (the two entries for that ID, not the ID from entries in other
- * IDs' relationships).
- *
- * Does not free any allocated memory.
- * Allows to use those relations as a way to mark an ID as already processed, without requiring any
- * additional tagging or GSet.
- * Obviously, relations should be freed after use then, since this will make them fully invalid.
- */
-void BKE_main_relations_ID_remove(Main *bmain, ID *id)
+/** Set or clear given `tag` in all relation entries of given `bmain`. */
+void BKE_main_relations_tag_set(struct Main *bmain,
+ const MainIDRelationsEntryTags tag,
+ const bool value)
{
- if (bmain->relations) {
- /* Note: we do not free the entries from the mempool, those will be dealt with when finally
- * freeing the whole relations. */
- if (bmain->relations->id_used_to_user) {
- BLI_ghash_remove(bmain->relations->id_used_to_user, id, NULL, NULL);
+ if (bmain->relations == NULL) {
+ return;
+ }
+
+ GHashIterator *gh_iter;
+ for (gh_iter = BLI_ghashIterator_new(bmain->relations->relations_from_pointers);
+ !BLI_ghashIterator_done(gh_iter);
+ BLI_ghashIterator_step(gh_iter)) {
+ MainIDRelationsEntry *entry = BLI_ghashIterator_getValue(gh_iter);
+ if (value) {
+ entry->tags |= tag;
}
- if (bmain->relations->id_user_to_used) {
- BLI_ghash_remove(bmain->relations->id_user_to_used, id, NULL, NULL);
+ else {
+ entry->tags &= ~tag;
}
}
+ BLI_ghashIterator_free(gh_iter);
}
/**
diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c
index 04fec1e57c4..83d9449934c 100644
--- a/source/blender/blenkernel/intern/mask.c
+++ b/source/blender/blenkernel/intern/mask.c
@@ -270,6 +270,8 @@ IDTypeInfo IDType_ID_MSK = {
.blend_read_expand = mask_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
static struct {
diff --git a/source/blender/blenkernel/intern/mask_evaluate.c b/source/blender/blenkernel/intern/mask_evaluate.c
index 595fd0c9550..69f60ca0384 100644
--- a/source/blender/blenkernel/intern/mask_evaluate.c
+++ b/source/blender/blenkernel/intern/mask_evaluate.c
@@ -128,8 +128,8 @@ int BKE_mask_spline_differentiate_calc_total(const MaskSpline *spline, const uns
}
float (*BKE_mask_spline_differentiate_with_resolution(MaskSpline *spline,
- unsigned int *tot_diff_point,
- const unsigned int resol))[2]
+ const unsigned int resol,
+ unsigned int *r_tot_diff_point))[2]
{
MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
@@ -140,12 +140,12 @@ float (*BKE_mask_spline_differentiate_with_resolution(MaskSpline *spline,
if (spline->tot_point <= 1) {
/* nothing to differentiate */
- *tot_diff_point = 0;
+ *r_tot_diff_point = 0;
return NULL;
}
/* len+1 because of 'forward_diff_bezier' function */
- *tot_diff_point = tot;
+ *r_tot_diff_point = tot;
diff_points = fp = MEM_mallocN((tot + 1) * sizeof(*diff_points), "mask spline vets");
a = spline->tot_point - 1;
@@ -192,11 +192,11 @@ float (*BKE_mask_spline_differentiate_with_resolution(MaskSpline *spline,
}
float (*BKE_mask_spline_differentiate(
- MaskSpline *spline, int width, int height, unsigned int *tot_diff_point))[2]
+ MaskSpline *spline, int width, int height, unsigned int *r_tot_diff_point))[2]
{
uint resol = BKE_mask_spline_resolution(spline, width, height);
- return BKE_mask_spline_differentiate_with_resolution(spline, tot_diff_point, resol);
+ return BKE_mask_spline_differentiate_with_resolution(spline, resol, r_tot_diff_point);
}
/* ** feather points self-intersection collapse routine ** */
@@ -507,9 +507,9 @@ void BKE_mask_spline_feather_collapse_inner_loops(MaskSpline *spline,
/** only called from #BKE_mask_spline_feather_differentiated_points_with_resolution() ! */
static float (*mask_spline_feather_differentiated_points_with_resolution__even(
MaskSpline *spline,
- unsigned int *tot_feather_point,
const unsigned int resol,
- const bool do_feather_isect))[2]
+ const bool do_feather_isect,
+ unsigned int *r_tot_feather_point))[2]
{
MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
MaskSplinePoint *point_curr, *point_prev;
@@ -569,7 +569,7 @@ static float (*mask_spline_feather_differentiated_points_with_resolution__even(
point_curr++;
}
- *tot_feather_point = tot;
+ *r_tot_feather_point = tot;
if ((spline->flag & MASK_SPLINE_NOINTERSECT) && do_feather_isect) {
BKE_mask_spline_feather_collapse_inner_loops(spline, feather, tot);
@@ -581,9 +581,9 @@ static float (*mask_spline_feather_differentiated_points_with_resolution__even(
/** only called from #BKE_mask_spline_feather_differentiated_points_with_resolution() ! */
static float (*mask_spline_feather_differentiated_points_with_resolution__double(
MaskSpline *spline,
- unsigned int *tot_feather_point,
const unsigned int resol,
- const bool do_feather_isect))[2]
+ const bool do_feather_isect,
+ unsigned int *r_tot_feather_point))[2]
{
MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
@@ -594,12 +594,12 @@ static float (*mask_spline_feather_differentiated_points_with_resolution__double
if (spline->tot_point <= 1) {
/* nothing to differentiate */
- *tot_feather_point = 0;
+ *r_tot_feather_point = 0;
return NULL;
}
/* len+1 because of 'forward_diff_bezier' function */
- *tot_feather_point = tot;
+ *r_tot_feather_point = tot;
feather = fp = MEM_mallocN((tot + 1) * sizeof(*feather), "mask spline vets");
a = spline->tot_point - 1;
@@ -665,7 +665,7 @@ static float (*mask_spline_feather_differentiated_points_with_resolution__double
len_feather = len_v2v2(bezt_prev->vec[1], bezt_curr->vec[1]);
- /* scale by chane in length */
+ /* scale by change in length */
len_scalar = len_feather / len_base;
dist_ensure_v2_v2fl(bezt_prev->vec[2],
bezt_prev->vec[1],
@@ -724,24 +724,24 @@ static float (*mask_spline_feather_differentiated_points_with_resolution__double
* values align with #BKE_mask_spline_differentiate_with_resolution
* when \a resol arguments match.
*/
-float (
- *BKE_mask_spline_feather_differentiated_points_with_resolution(MaskSpline *spline,
- unsigned int *tot_feather_point,
- const unsigned int resol,
- const bool do_feather_isect))[2]
+float (*BKE_mask_spline_feather_differentiated_points_with_resolution(
+ MaskSpline *spline,
+ const unsigned int resol,
+ const bool do_feather_isect,
+ unsigned int *r_tot_feather_point))[2]
{
switch (spline->offset_mode) {
case MASK_SPLINE_OFFSET_EVEN:
return mask_spline_feather_differentiated_points_with_resolution__even(
- spline, tot_feather_point, resol, do_feather_isect);
+ spline, resol, do_feather_isect, r_tot_feather_point);
case MASK_SPLINE_OFFSET_SMOOTH:
default:
return mask_spline_feather_differentiated_points_with_resolution__double(
- spline, tot_feather_point, resol, do_feather_isect);
+ spline, resol, do_feather_isect, r_tot_feather_point);
}
}
-float (*BKE_mask_spline_feather_points(MaskSpline *spline, int *tot_feather_point))[2]
+float (*BKE_mask_spline_feather_points(MaskSpline *spline, int *r_tot_feather_point))[2]
{
MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
@@ -783,7 +783,7 @@ float (*BKE_mask_spline_feather_points(MaskSpline *spline, int *tot_feather_poin
}
}
- *tot_feather_point = tot;
+ *r_tot_feather_point = tot;
return feather;
}
@@ -793,7 +793,7 @@ float *BKE_mask_point_segment_feather_diff(MaskSpline *spline,
MaskSplinePoint *point,
int width,
int height,
- unsigned int *tot_feather_point)
+ unsigned int *r_tot_feather_point)
{
float *feather, *fp;
unsigned int resol = BKE_mask_spline_feather_resolution(spline, width, height);
@@ -812,7 +812,7 @@ float *BKE_mask_point_segment_feather_diff(MaskSpline *spline,
fp[1] = co[1] + n[1] * weight;
}
- *tot_feather_point = resol;
+ *r_tot_feather_point = resol;
return feather;
}
@@ -821,7 +821,7 @@ float *BKE_mask_point_segment_diff(MaskSpline *spline,
MaskSplinePoint *point,
int width,
int height,
- unsigned int *tot_diff_point)
+ unsigned int *r_tot_diff_point)
{
MaskSplinePoint *points_array = BKE_mask_spline_point_array_from_point(spline, point);
@@ -837,7 +837,7 @@ float *BKE_mask_point_segment_diff(MaskSpline *spline,
}
/* resol+1 because of 'forward_diff_bezier' function */
- *tot_diff_point = resol + 1;
+ *r_tot_diff_point = resol + 1;
diff_points = fp = MEM_callocN(sizeof(float[2]) * (resol + 1), "mask segment vets");
for (j = 0; j < 2; j++) {
diff --git a/source/blender/blenkernel/intern/mask_rasterize.c b/source/blender/blenkernel/intern/mask_rasterize.c
index 583ee8f2857..d29a6e75954 100644
--- a/source/blender/blenkernel/intern/mask_rasterize.c
+++ b/source/blender/blenkernel/intern/mask_rasterize.c
@@ -646,11 +646,11 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle,
const unsigned int resol_b = BKE_mask_spline_feather_resolution(spline, width, height) / 4;
const unsigned int resol = CLAMPIS(MAX2(resol_a, resol_b), 4, 512);
- diff_points = BKE_mask_spline_differentiate_with_resolution(spline, &tot_diff_point, resol);
+ diff_points = BKE_mask_spline_differentiate_with_resolution(spline, resol, &tot_diff_point);
if (do_feather) {
diff_feather_points = BKE_mask_spline_feather_differentiated_points_with_resolution(
- spline, &tot_diff_feather_points, resol, false);
+ spline, resol, false, &tot_diff_feather_points);
BLI_assert(diff_feather_points);
}
else {
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index e892a3f4d53..70906065347 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -274,6 +274,8 @@ IDTypeInfo IDType_ID_MA = {
.blend_read_expand = material_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
void BKE_gpencil_material_attr_init(Material *ma)
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 65ec91c57cf..849c7ef57fb 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -204,6 +204,8 @@ IDTypeInfo IDType_ID_MB = {
.blend_read_expand = metaball_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* Functions */
diff --git a/source/blender/blenkernel/intern/mball_tessellate.c b/source/blender/blenkernel/intern/mball_tessellate.c
index 051c7e56ef9..1550401cc9c 100644
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@ -263,7 +263,7 @@ static void build_bvh_spatial(PROCESS *process,
* BASED AT CODE (but mostly rewritten) :
* C code from the article
* "An Implicit Surface Polygonizer"
- * by Jules Bloomenthal, jbloom@beauty.gmu.edu
+ * by Jules Bloomenthal <jbloom@beauty.gmu.edu>
* in "Graphics Gems IV", Academic Press, 1994
*
* Authored by Jules Bloomenthal, Xerox PARC.
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 950885d2114..c15484f8e72 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -364,6 +364,8 @@ IDTypeInfo IDType_ID_ME = {
.blend_read_expand = mesh_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
enum {
@@ -939,7 +941,7 @@ Mesh *BKE_mesh_new_nomain_from_template_ex(const Mesh *me_src,
Mesh *me_dst = BKE_id_new_nomain(ID_ME, NULL);
- me_dst->mselect = MEM_dupallocN(me_dst->mselect);
+ me_dst->mselect = MEM_dupallocN(me_src->mselect);
me_dst->totvert = verts_len;
me_dst->totedge = edges_len;
@@ -1217,7 +1219,7 @@ int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
}
/* Check corrupt cases, bow-tie geometry,
- * cant handle these because edge data wont exist so just return 0. */
+ * can't handle these because edge data won't exist so just return 0. */
if (nr == 3) {
if (
/* real edges */
diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc
new file mode 100644
index 00000000000..02c99d2c5da
--- /dev/null
+++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc
@@ -0,0 +1,835 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup bke
+ */
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_customdata.h"
+#include "BKE_material.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_boolean_convert.h"
+
+#include "BLI_alloca.h"
+#include "BLI_float2.hh"
+#include "BLI_math.h"
+#include "BLI_mesh_boolean.hh"
+#include "BLI_mesh_intersect.hh"
+#include "BLI_span.hh"
+
+namespace blender::meshintersect {
+
+#ifdef WITH_GMP
+
+constexpr int estimated_max_facelen = 100; /* Used for initial size of some Vectors. */
+
+/* Snap entries that are near 0 or 1 or -1 to those values.
+ * Sometimes Blender's rotation matrices for multiples of 90 degrees have
+ * tiny numbers where there should be zeros. That messes makes some things
+ * every so slightly non-coplanar when users expect coplanarity,
+ * so this is a hack to clean up such matrices.
+ * Would be better to change the transformation code itself.
+ */
+static void clean_obmat(float cleaned[4][4], const float mat[4][4])
+{
+ const float fuzz = 1e-6f;
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 4; j++) {
+ float f = mat[i][j];
+ if (fabsf(f) <= fuzz) {
+ f = 0.0f;
+ }
+ else if (fabsf(f - 1.0f) <= fuzz) {
+ f = 1.0f;
+ }
+ else if (fabsf(f + 1.0f) <= fuzz) {
+ f = -1.0f;
+ }
+ cleaned[i][j] = f;
+ }
+ }
+}
+
+/* Need to wrap this in a class to use it in an Array. */
+class TransMat {
+ public:
+ float mat[4][4];
+};
+
+/* `MeshesToIMeshInfo` keeps track of information used when combining a number
+ * of `Mesh`es into a single `IMesh` for doing boolean on.
+ * Mostly this means keeping track of the index offsets for various mesh elements. */
+class MeshesToIMeshInfo {
+ public:
+ /* The input meshes, */
+ Span<const Mesh *> meshes;
+ /* Numbering the vertices of the meshes in order of meshes,
+ * at what offset does the vertex range for mesh[i] start? */
+ Array<int> mesh_vert_offset;
+ /* Similarly for edges of meshes. */
+ Array<int> mesh_edge_offset;
+ /* Similarly for polys of meshes. */
+ Array<int> mesh_poly_offset;
+ /* For each Mesh vertex in all the meshes (with concatenated indexing),
+ * what is the IMesh Vert* allocated for it in the intput IMesh? */
+ Array<const Vert *> mesh_to_imesh_vert;
+ /* Similarly for each Mesh poly. */
+ Array<Face *> mesh_to_imesh_face;
+ /* Transformation matrix to transform a coordinate in the corresponding
+ * Mesh to the local space of the first Mesh. */
+ Array<TransMat> to_obj0;
+ /* Total number of input mesh vertices. */
+ int tot_meshes_verts;
+ /* Total number of input mesh edges. */
+ int tot_meshes_edges;
+ /* Total number of input mesh polys. */
+ int tot_meshes_polys;
+
+ int input_mesh_for_imesh_vert(int imesh_v) const;
+ int input_mesh_for_imesh_edge(int imesh_e) const;
+ int input_mesh_for_imesh_face(int imesh_f) const;
+ const MPoly *input_mpoly_for_orig_index(int orig_index,
+ const Mesh **r_orig_mesh,
+ int *r_orig_mesh_index,
+ int *r_index_in_orig_mesh) const;
+ const MVert *input_mvert_for_orig_index(int orig_index,
+ const Mesh **r_orig_mesh,
+ int *r_index_in_orig_mesh) const;
+ const MEdge *input_medge_for_orig_index(int orig_index,
+ const Mesh **r_orig_mesh,
+ int *r_index_in_orig_mesh) const;
+};
+
+/* Given an index `imesh_v` in the `IMesh`, return the index of the
+ * input `Mesh` that contained the `MVert` that it came from. */
+int MeshesToIMeshInfo::input_mesh_for_imesh_vert(int imesh_v) const
+{
+ int n = static_cast<int>(mesh_vert_offset.size());
+ for (int i = 0; i < n - 1; ++i) {
+ if (imesh_v < mesh_vert_offset[i + 1]) {
+ return i;
+ }
+ }
+ return n - 1;
+}
+
+/* Given an index `imesh_e` used as an original index in the `IMesh`,
+ * return the index of the input `Mesh` that contained the `MVert` that it came from. */
+int MeshesToIMeshInfo::input_mesh_for_imesh_edge(int imesh_e) const
+{
+ int n = static_cast<int>(mesh_edge_offset.size());
+ for (int i = 0; i < n - 1; ++i) {
+ if (imesh_e < mesh_edge_offset[i + 1]) {
+ return i;
+ }
+ }
+ return n - 1;
+}
+
+/* Given an index `imesh_f` in the `IMesh`, return the index of the
+ * input `Mesh` that contained the `MPoly` that it came from. */
+int MeshesToIMeshInfo::input_mesh_for_imesh_face(int imesh_f) const
+{
+ int n = static_cast<int>(mesh_poly_offset.size());
+ for (int i = 0; i < n - 1; ++i) {
+ if (imesh_f < mesh_poly_offset[i + 1]) {
+ return i;
+ }
+ }
+ return n - 1;
+}
+
+/* Given an index of an original face in the `IMesh`, find out the input
+ * `Mesh` that it came from and return it in `*r_orig_mesh`,
+ * and also return the index of that `Mesh` in `*r_orig_mesh_index`.
+ * Finally, return the index of the corresponding `MPoly` in that `Mesh`
+ * in `*r_index_in_orig_mesh`. */
+const MPoly *MeshesToIMeshInfo::input_mpoly_for_orig_index(int orig_index,
+ const Mesh **r_orig_mesh,
+ int *r_orig_mesh_index,
+ int *r_index_in_orig_mesh) const
+{
+ int orig_mesh_index = input_mesh_for_imesh_face(orig_index);
+ BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size());
+ const Mesh *me = meshes[orig_mesh_index];
+ int index_in_mesh = orig_index - mesh_poly_offset[orig_mesh_index];
+ BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totpoly);
+ const MPoly *mp = &me->mpoly[index_in_mesh];
+ if (r_orig_mesh) {
+ *r_orig_mesh = me;
+ }
+ if (r_orig_mesh_index) {
+ *r_orig_mesh_index = orig_mesh_index;
+ }
+ if (r_index_in_orig_mesh) {
+ *r_index_in_orig_mesh = index_in_mesh;
+ }
+ return mp;
+}
+
+/* Given an index of an original vertex in the `IMesh`, find out the input
+ * `Mesh` that it came from and return it in `*r_orig_mesh`.
+ * Also find the index of the `MVert` in that `Mesh` and return it in
+ * `*r_index_in_orig_mesh`. */
+const MVert *MeshesToIMeshInfo::input_mvert_for_orig_index(int orig_index,
+ const Mesh **r_orig_mesh,
+ int *r_index_in_orig_mesh) const
+{
+ int orig_mesh_index = input_mesh_for_imesh_vert(orig_index);
+ BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size());
+ const Mesh *me = meshes[orig_mesh_index];
+ int index_in_mesh = orig_index - mesh_vert_offset[orig_mesh_index];
+ BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totvert);
+ const MVert *mv = &me->mvert[index_in_mesh];
+ if (r_orig_mesh) {
+ *r_orig_mesh = me;
+ }
+ if (r_index_in_orig_mesh) {
+ *r_index_in_orig_mesh = index_in_mesh;
+ }
+ return mv;
+}
+
+/* Similarly for edges. */
+const MEdge *MeshesToIMeshInfo::input_medge_for_orig_index(int orig_index,
+ const Mesh **r_orig_mesh,
+ int *r_index_in_orig_mesh) const
+{
+ int orig_mesh_index = input_mesh_for_imesh_edge(orig_index);
+ BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size());
+ const Mesh *me = meshes[orig_mesh_index];
+ int index_in_mesh = orig_index - mesh_edge_offset[orig_mesh_index];
+ BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totedge);
+ const MEdge *medge = &me->medge[index_in_mesh];
+ if (r_orig_mesh) {
+ *r_orig_mesh = me;
+ }
+ if (r_index_in_orig_mesh) {
+ *r_index_in_orig_mesh = index_in_mesh;
+ }
+ return medge;
+}
+
+/** Convert all of the meshes in `meshes` to an `IMesh` and return that.
+ * All of the coordinates are transformed into the local space of the
+ * first Mesh. To do this transformation, we also need the transformation
+ * obmats corresponding to the Meshes, so they are in the `obmats` argument.
+ * The 'original' indexes in the IMesh are the indexes you get by
+ * a scheme that offsets each MVert, MEdge, and MPoly index by the sum of the
+ * vertices, edges, and polys in the preceding Meshes in the mesh span.
+ * The `*r_info class` is filled in with information needed to make the
+ * correspondence between the Mesh MVerts/MPolys and the IMesh Verts/Faces.
+ * All allocation of memory for the IMesh comes from `arena`.
+ */
+static IMesh meshes_to_imesh(Span<const Mesh *> meshes,
+ const float (*obmats[])[4][4],
+ IMeshArena &arena,
+ MeshesToIMeshInfo *r_info)
+{
+ int nmeshes = meshes.size();
+ BLI_assert(nmeshes > 0);
+ r_info->meshes = meshes;
+ r_info->tot_meshes_verts = 0;
+ r_info->tot_meshes_polys = 0;
+ int &totvert = r_info->tot_meshes_verts;
+ int &totedge = r_info->tot_meshes_edges;
+ int &totpoly = r_info->tot_meshes_polys;
+ for (const Mesh *me : meshes) {
+ totvert += me->totvert;
+ totedge += me->totedge;
+ totpoly += me->totpoly;
+ }
+
+ /* Estimate the number of vertices and faces in the boolean output,
+ * so that the memory arena can reserve some space. It is OK if these
+ * estimates are wrong. */
+ const int estimate_num_outv = 3 * totvert;
+ const int estimate_num_outf = 4 * totpoly;
+ arena.reserve(estimate_num_outv, estimate_num_outf);
+ r_info->mesh_to_imesh_vert = Array<const Vert *>(totvert);
+ r_info->mesh_to_imesh_face = Array<Face *>(totpoly);
+ r_info->mesh_vert_offset = Array<int>(nmeshes);
+ r_info->mesh_edge_offset = Array<int>(nmeshes);
+ r_info->mesh_poly_offset = Array<int>(nmeshes);
+ r_info->to_obj0 = Array<TransMat>(nmeshes);
+ int v = 0;
+ int e = 0;
+ int f = 0;
+
+ /* Put these Vectors here, with a size unlikely to need resizing,
+ * so that the loop to make new Faces will likely not need to allocate
+ * over and over. */
+ Vector<const Vert *, estimated_max_facelen> face_vert;
+ Vector<int, estimated_max_facelen> face_edge_orig;
+
+ /* To convert the coordinates of objects 1, 2, etc. into the local space
+ * of object 0, we multiply each object's `obmat` by the inverse of
+ * object 0's `obmat`. Exact Boolean works better if these matrices
+ * are 'cleaned' -- see the comment for the `clean_obmat` function, above. */
+ float obj0_mat[4][4];
+ float inv_obj0_mat[4][4];
+ if (obmats[0] == nullptr) {
+ unit_m4(obj0_mat);
+ unit_m4(inv_obj0_mat);
+ }
+ else {
+ clean_obmat(obj0_mat, *obmats[0]);
+ invert_m4_m4(inv_obj0_mat, obj0_mat);
+ }
+
+ /* For each input `Mesh`, make `Vert`s and `Face`s for the corresponding
+ * `MVert`s and `MPoly`s, and keep track of the original indices (using the
+ * concatenating offset scheme) inside the `Vert`s and `Face`s.
+ * When making `Face`s, we also put in the original indices for `MEdge`s that
+ * make up the `MPoly`s using the same scheme. */
+ for (int mi : meshes.index_range()) {
+ float objn_to_obj0_mat[4][4];
+ const Mesh *me = meshes[mi];
+ if (mi == 0) {
+ r_info->mesh_vert_offset[mi] = 0;
+ r_info->mesh_edge_offset[mi] = 0;
+ r_info->mesh_poly_offset[mi] = 0;
+ unit_m4(r_info->to_obj0[0].mat);
+ }
+ else {
+ r_info->mesh_vert_offset[mi] = v;
+ r_info->mesh_edge_offset[mi] = e;
+ r_info->mesh_poly_offset[mi] = f;
+ /* Get matrix that transforms a coordinate in objects[mi]'s local space
+ * to object[0]'s local space.*/
+ float objn_mat[4][4];
+ if (obmats[mi] == nullptr) {
+ unit_m4(objn_mat);
+ }
+ else {
+ clean_obmat(objn_mat, *obmats[mi]);
+ }
+ mul_m4_m4m4(objn_to_obj0_mat, inv_obj0_mat, objn_mat);
+ copy_m4_m4(r_info->to_obj0[mi].mat, objn_to_obj0_mat);
+ }
+ for (int vi = 0; vi < me->totvert; ++vi) {
+ float co[3];
+ copy_v3_v3(co, me->mvert[vi].co);
+ if (mi > 0) {
+ mul_m4_v3(objn_to_obj0_mat, co);
+ }
+ r_info->mesh_to_imesh_vert[v] = arena.add_or_find_vert(mpq3(co[0], co[1], co[2]), v);
+ ++v;
+ }
+ for (const MPoly &poly : Span(me->mpoly, me->totpoly)) {
+ int flen = poly.totloop;
+ face_vert.clear();
+ face_edge_orig.clear();
+ const MLoop *l = &me->mloop[poly.loopstart];
+ for (int i = 0; i < flen; ++i) {
+ int mverti = r_info->mesh_vert_offset[mi] + l->v;
+ const Vert *fv = r_info->mesh_to_imesh_vert[mverti];
+ face_vert.append(fv);
+ face_edge_orig.append(e + l->e);
+ ++l;
+ }
+ r_info->mesh_to_imesh_face[f] = arena.add_face(face_vert, f, face_edge_orig);
+ ++f;
+ }
+ e += me->totedge;
+ }
+ return IMesh(r_info->mesh_to_imesh_face);
+}
+
+/* Copy vertex attributes, including customdata, from `orig_mv` to `mv`.
+ * `mv` is in `dest_mesh` with index `mv_index`.
+ * The `orig_mv` vertex came from Mesh `orig_me` and had index `index_in_orig_me` there. */
+static void copy_vert_attributes(Mesh *dest_mesh,
+ MVert *mv,
+ const MVert *orig_mv,
+ const Mesh *orig_me,
+ int mv_index,
+ int index_in_orig_me)
+{
+ mv->bweight = orig_mv->bweight;
+ mv->flag = orig_mv->flag;
+
+ /* For all layers in the orig mesh, copy the layer information. */
+ CustomData *target_cd = &dest_mesh->vdata;
+ const CustomData *source_cd = &orig_me->vdata;
+ for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) {
+ int ty = source_cd->layers[source_layer_i].type;
+ /* The (first) CD_MVERT layer is the same as dest_mesh->vdata, so we've
+ * already set the coordinate to the right value. */
+ if (ty == CD_MVERT) {
+ continue;
+ }
+ const char *name = source_cd->layers[source_layer_i].name;
+ int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name);
+ /* Not all layers were merged in target: some are marked CD_FLAG_NOCOPY
+ * and some are not in the CD_MASK_MESH.vdata. */
+ if (target_layer_i != -1) {
+ CustomData_copy_data_layer(
+ source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, mv_index, 1);
+ }
+ }
+}
+
+/* Similar to copy_vert_attributes but for poly attributes. */
+static void copy_poly_attributes(Mesh *dest_mesh,
+ MPoly *mp,
+ const MPoly *orig_mp,
+ const Mesh *orig_me,
+ int mp_index,
+ int index_in_orig_me)
+{
+ mp->mat_nr = orig_mp->mat_nr;
+ if (mp->mat_nr >= dest_mesh->totcol) {
+ mp->mat_nr = 0;
+ }
+ mp->flag = orig_mp->flag;
+ CustomData *target_cd = &dest_mesh->pdata;
+ const CustomData *source_cd = &orig_me->pdata;
+ for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) {
+ int ty = source_cd->layers[source_layer_i].type;
+ if (ty == CD_MPOLY) {
+ continue;
+ }
+ const char *name = source_cd->layers[source_layer_i].name;
+ int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name);
+ if (target_layer_i != -1) {
+ CustomData_copy_data_layer(
+ source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, mp_index, 1);
+ }
+ }
+}
+
+/* Similar to copy_vert_attributes but for edge attributes. */
+static void copy_edge_attributes(Mesh *dest_mesh,
+ MEdge *medge,
+ const MEdge *orig_medge,
+ const Mesh *orig_me,
+ int medge_index,
+ int index_in_orig_me)
+{
+ medge->bweight = orig_medge->bweight;
+ medge->crease = orig_medge->crease;
+ medge->flag = orig_medge->flag;
+ CustomData *target_cd = &dest_mesh->edata;
+ const CustomData *source_cd = &orig_me->edata;
+ for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) {
+ int ty = source_cd->layers[source_layer_i].type;
+ if (ty == CD_MEDGE) {
+ continue;
+ }
+ const char *name = source_cd->layers[source_layer_i].name;
+ int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name);
+ if (target_layer_i != -1) {
+ CustomData_copy_data_layer(
+ source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, medge_index, 1);
+ }
+ }
+}
+
+/* For Imesh face `f`, with corresponding output Mesh poly `mp`,
+ * where the original Mesh poly is `orig_mp`, coming from the Mesh
+ * `orig_me`, which has index `orig_me_index` in `mim`:
+ * fill in the `orig_loops` Array with corresponding indices of MLoops from `orig_me`
+ * where they have the same start and end vertices; for cases where that is
+ * not true, put -1 in the `orig_loops` slot.
+ * For now, we only try to do this if `mp` and `orig_mp` have the same size.
+ * Return the number of non-null MLoops filled in.
+ */
+static int fill_orig_loops(const Face *f,
+ const MPoly *orig_mp,
+ const Mesh *orig_me,
+ int orig_me_index,
+ MeshesToIMeshInfo &mim,
+ Array<int> &orig_loops)
+{
+ orig_loops.fill(-1);
+ int orig_mplen = orig_mp->totloop;
+ if (f->size() != orig_mplen) {
+ return 0;
+ }
+ BLI_assert(orig_loops.size() == orig_mplen);
+ /* We'll look for the case where the first vertex in f has an original vertex
+ * that is the same as one in orig_me (after correcting for offset in mim meshes).
+ * Then see that loop and any subsequent ones have the same start and end vertex.
+ * This may miss some cases of partial alignment, but that's OK since discovering
+ * aligned loops is only an optimization to avoid some reinterpolation.
+ */
+ int first_orig_v = f->vert[0]->orig;
+ if (first_orig_v == NO_INDEX) {
+ return 0;
+ }
+ /* It is possible that the original vert was merged with another in another mesh. */
+ if (orig_me_index != mim.input_mesh_for_imesh_vert(first_orig_v)) {
+ return 0;
+ }
+ int orig_me_vert_offset = mim.mesh_vert_offset[orig_me_index];
+ int first_orig_v_in_orig_me = first_orig_v - orig_me_vert_offset;
+ BLI_assert(0 <= first_orig_v_in_orig_me && first_orig_v_in_orig_me < orig_me->totvert);
+ /* Assume all vertices in an mpoly are unique. */
+ int offset = -1;
+ for (int i = 0; i < orig_mplen; ++i) {
+ int loop_i = i + orig_mp->loopstart;
+ if (orig_me->mloop[loop_i].v == first_orig_v_in_orig_me) {
+ offset = i;
+ break;
+ }
+ }
+ if (offset == -1) {
+ return 0;
+ }
+ int num_orig_loops_found = 0;
+ for (int mp_loop_index = 0; mp_loop_index < orig_mplen; ++mp_loop_index) {
+ int orig_mp_loop_index = (mp_loop_index + offset) % orig_mplen;
+ MLoop *l = &orig_me->mloop[orig_mp->loopstart + orig_mp_loop_index];
+ int fv_orig = f->vert[mp_loop_index]->orig;
+ if (fv_orig != NO_INDEX) {
+ fv_orig -= orig_me_vert_offset;
+ if (fv_orig < 0 || fv_orig >= orig_me->totvert) {
+ fv_orig = NO_INDEX;
+ }
+ }
+ if (l->v == fv_orig) {
+ MLoop *lnext = &orig_me->mloop[orig_mp->loopstart + ((orig_mp_loop_index + 1) % orig_mplen)];
+ int fvnext_orig = f->vert[(mp_loop_index + 1) % orig_mplen]->orig;
+ if (fvnext_orig != NO_INDEX) {
+ fvnext_orig -= orig_me_vert_offset;
+ if (fvnext_orig < 0 || fvnext_orig >= orig_me->totvert) {
+ fvnext_orig = NO_INDEX;
+ }
+ }
+ if (lnext->v == fvnext_orig) {
+ orig_loops[mp_loop_index] = orig_mp->loopstart + orig_mp_loop_index;
+ ++num_orig_loops_found;
+ }
+ }
+ }
+ return num_orig_loops_found;
+}
+
+/* Fill `cos_2d` with the 2d coordinates found by projection MPoly `mp` along
+ * its normal. Also fill in r_axis_mat with the matrix that does that projection.
+ * But before projecting, also transform the 3d coordinate by multiplying by trans_mat.
+ * `cos_2d` should have room for `mp->totloop` entries. */
+static void get_poly2d_cos(const Mesh *me,
+ const MPoly *mp,
+ float (*cos_2d)[2],
+ const TransMat &trans_mat,
+ float r_axis_mat[3][3])
+{
+ int n = mp->totloop;
+
+ /* Project coordinates to 2d in cos_2d, using normal as projection axis. */
+ float axis_dominant[3];
+ BKE_mesh_calc_poly_normal(mp, &me->mloop[mp->loopstart], me->mvert, axis_dominant);
+ axis_dominant_v3_to_m3(r_axis_mat, axis_dominant);
+ MLoop *ml = &me->mloop[mp->loopstart];
+ const MVert *mverts = me->mvert;
+ for (int i = 0; i < n; ++i) {
+ float co[3];
+ copy_v3_v3(co, mverts[ml->v].co);
+ mul_m4_v3(trans_mat.mat, co);
+ mul_v2_m3v3(cos_2d[i], r_axis_mat, co);
+ ++ml;
+ }
+}
+
+/* For the loops of `mp`, see if the face is unchanged from `orig_mp`, and if so,
+ * copy the Loop attributes from corresponding loops to corresponding loops.
+ * Otherwise, interpolate the Loop attributes in the face `orig_mp`. */
+static void copy_or_interp_loop_attributes(Mesh *dest_mesh,
+ const Face *f,
+ MPoly *mp,
+ const MPoly *orig_mp,
+ const Mesh *orig_me,
+ int orig_me_index,
+ MeshesToIMeshInfo &mim)
+{
+ Array<int> orig_loops(mp->totloop);
+ int norig = fill_orig_loops(f, orig_mp, orig_me, orig_me_index, mim, orig_loops);
+ /* We may need these arrays if we have to interpolate Loop attributes rather than just copy.
+ * Right now, trying Array<float[2]> complains, so declare cos_2d a different way. */
+ float(*cos_2d)[2];
+ Array<float> weights;
+ Array<const void *> src_blocks_ofs;
+ float axis_mat[3][3];
+ if (norig != mp->totloop) {
+ /* We will need to interpolate. Make `cos_2d` hold 2d-projected coordinates of `orig_mp`,
+ * which are transformed into object 0's local space before projecting.
+ * At this point we cannot yet calculate the interpolation weights, as they depend on
+ * the coordinate where interpolation is to happen, but we can allocate the needed arrays,
+ * so they don't have to be allocated per-layer. */
+ cos_2d = (float(*)[2])BLI_array_alloca(cos_2d, orig_mp->totloop);
+ weights = Array<float>(orig_mp->totloop);
+ src_blocks_ofs = Array<const void *>(orig_mp->totloop);
+ get_poly2d_cos(orig_me, orig_mp, cos_2d, mim.to_obj0[orig_me_index], axis_mat);
+ }
+ CustomData *target_cd = &dest_mesh->ldata;
+ for (int i = 0; i < mp->totloop; ++i) {
+ int loop_index = mp->loopstart + i;
+ int orig_loop_index = norig > 0 ? orig_loops[i] : -1;
+ const CustomData *source_cd = &orig_me->ldata;
+ if (orig_loop_index == -1) {
+ /* Will need interpolation weights for this loop's vertex's coordinates.
+ * The coordinate needs to be projected into 2d, just like the interpolating polygon's
+ * coordinates were. The `dest_mesh` coordinates are already in object 0 local space. */
+ float co[2];
+ mul_v2_m3v3(co, axis_mat, dest_mesh->mvert[dest_mesh->mloop[loop_index].v].co);
+ interp_weights_poly_v2(weights.data(), cos_2d, orig_mp->totloop, co);
+ }
+ for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) {
+ int ty = source_cd->layers[source_layer_i].type;
+ if (ty == CD_MLOOP) {
+ continue;
+ }
+ const char *name = source_cd->layers[source_layer_i].name;
+ int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name);
+ if (target_layer_i == -1) {
+ continue;
+ }
+ if (orig_loop_index != -1) {
+ CustomData_copy_data_layer(
+ source_cd, target_cd, source_layer_i, target_layer_i, orig_loop_index, loop_index, 1);
+ }
+ else {
+ /* Note: although CustomData_bmesh_interp_n function has bmesh in its name, nothing about
+ * it is BMesh-specific. We can't use CustomData_interp because it assumes that
+ * all source layers exist in the dest.
+ * A non bmesh version could have the benefit of not copying data into src_blocks_ofs -
+ * using the contiguous data instead. TODO: add to the custom data API. */
+ int target_layer_type_index = CustomData_get_named_layer(target_cd, ty, name);
+ int source_layer_type_index = source_layer_i - source_cd->typemap[ty];
+ BLI_assert(target_layer_type_index != -1 && source_layer_type_index >= 0);
+ for (int j = 0; j < orig_mp->totloop; ++j) {
+ src_blocks_ofs[j] = CustomData_get_n(
+ source_cd, ty, orig_mp->loopstart + j, source_layer_type_index);
+ }
+ void *dst_block_ofs = CustomData_get_n(target_cd, ty, loop_index, target_layer_type_index);
+ CustomData_bmesh_interp_n(target_cd,
+ src_blocks_ofs.data(),
+ weights.data(),
+ nullptr,
+ orig_mp->totloop,
+ dst_block_ofs,
+ target_layer_i);
+ }
+ }
+ }
+}
+
+/** Make sure that there are custom data layers in the target mesh
+ * corresponding to all target layers in all of the operands after the first.
+ * (The target should already have layers for those in the first operand mesh).
+ * Edges done separately -- will have to be done later, after edges are made.
+ */
+static void merge_vertex_loop_poly_customdata_layers(Mesh *target, MeshesToIMeshInfo &mim)
+{
+ for (int mesh_index = 1; mesh_index < mim.meshes.size(); ++mesh_index) {
+ const Mesh *me = mim.meshes[mesh_index];
+ if (me->totvert) {
+ CustomData_merge(
+ &me->vdata, &target->vdata, CD_MASK_MESH.vmask, CD_DEFAULT, target->totvert);
+ }
+ if (me->totloop) {
+ CustomData_merge(
+ &me->ldata, &target->ldata, CD_MASK_MESH.lmask, CD_DEFAULT, target->totloop);
+ }
+ if (me->totpoly) {
+ CustomData_merge(
+ &me->pdata, &target->pdata, CD_MASK_MESH.pmask, CD_DEFAULT, target->totpoly);
+ }
+ }
+}
+
+static void merge_edge_customdata_layers(Mesh *target, MeshesToIMeshInfo &mim)
+{
+ for (int mesh_index = 1; mesh_index < mim.meshes.size(); ++mesh_index) {
+ const Mesh *me = mim.meshes[mesh_index];
+ if (me->totedge) {
+ CustomData_merge(
+ &me->edata, &target->edata, CD_MASK_MESH.emask, CD_DEFAULT, target->totedge);
+ }
+ }
+}
+
+/** Convert the output IMesh im to a Blender Mesh,
+ * using the information in mim to get all the attributes right.
+ */
+static Mesh *imesh_to_mesh(IMesh *im, MeshesToIMeshInfo &mim)
+{
+ constexpr int dbg_level = 0;
+
+ im->populate_vert();
+ int out_totvert = im->vert_size();
+ int out_totpoly = im->face_size();
+ int out_totloop = 0;
+ for (const Face *f : im->faces()) {
+ out_totloop += f->size();
+ }
+ /* Will calculate edges later. */
+ Mesh *result = BKE_mesh_new_nomain_from_template(
+ mim.meshes[0], out_totvert, 0, 0, out_totloop, out_totpoly);
+
+ merge_vertex_loop_poly_customdata_layers(result, mim);
+ /* Set the vertex coordinate values and other data. */
+ for (int vi : im->vert_index_range()) {
+ const Vert *v = im->vert(vi);
+ MVert *mv = &result->mvert[vi];
+ copy_v3fl_v3db(mv->co, v->co);
+ if (v->orig != NO_INDEX) {
+ const Mesh *orig_me;
+ int index_in_orig_me;
+ const MVert *orig_mv = mim.input_mvert_for_orig_index(v->orig, &orig_me, &index_in_orig_me);
+ copy_vert_attributes(result, mv, orig_mv, orig_me, vi, index_in_orig_me);
+ }
+ }
+
+ /* Set the loopstart and totloop for each output poly,
+ * and set the vertices in the appropriate loops. */
+ int cur_loop_index = 0;
+ MLoop *l = result->mloop;
+ for (int fi : im->face_index_range()) {
+ const Face *f = im->face(fi);
+ const Mesh *orig_me;
+ int index_in_orig_me;
+ int orig_me_index;
+ const MPoly *orig_mp = mim.input_mpoly_for_orig_index(
+ f->orig, &orig_me, &orig_me_index, &index_in_orig_me);
+ MPoly *mp = &result->mpoly[fi];
+ mp->totloop = f->size();
+ mp->loopstart = cur_loop_index;
+ for (int j : f->index_range()) {
+ const Vert *vf = f->vert[j];
+ const int vfi = im->lookup_vert(vf);
+ l->v = vfi;
+ ++l;
+ ++cur_loop_index;
+ }
+ copy_poly_attributes(result, mp, orig_mp, orig_me, fi, index_in_orig_me);
+ copy_or_interp_loop_attributes(result, f, mp, orig_mp, orig_me, orig_me_index, mim);
+ }
+
+ /* BKE_mesh_calc_edges will calculate and populate all the
+ * MEdges from the MPolys. */
+ BKE_mesh_calc_edges(result, false, false);
+ merge_edge_customdata_layers(result, mim);
+
+ /* Now that the MEdges are populated, we can copy over the required attributes and custom layers.
+ */
+ for (int fi : im->face_index_range()) {
+ const Face *f = im->face(fi);
+ MPoly *mp = &result->mpoly[fi];
+ for (int j : f->index_range()) {
+ if (f->edge_orig[j] != NO_INDEX) {
+ const Mesh *orig_me;
+ int index_in_orig_me;
+ const MEdge *orig_medge = mim.input_medge_for_orig_index(
+ f->edge_orig[j], &orig_me, &index_in_orig_me);
+ int e_index = result->mloop[mp->loopstart + j].e;
+ MEdge *medge = &result->medge[e_index];
+ copy_edge_attributes(result, medge, orig_medge, orig_me, e_index, index_in_orig_me);
+ }
+ }
+ }
+
+ BKE_mesh_calc_normals(result);
+ if (dbg_level > 0) {
+ BKE_mesh_validate(result, true, true);
+ }
+ return result;
+}
+
+/* Do Exact Boolean directly, without a round trip through BMesh.
+ * The Mesh operands are in `meshes`, with corresponding transfprms in in `obmats`. */
+static Mesh *direct_mesh_boolean(const Mesh **meshes,
+ const float (*obmats[])[4][4],
+ const int meshes_len,
+ const bool use_self,
+ const BoolOpType boolean_mode)
+{
+ const int dbg_level = 0;
+ if (meshes_len <= 0) {
+ return nullptr;
+ }
+ if (dbg_level > 0) {
+ std::cout << "\nDIRECT_MESH_INTERSECT, nmeshes = " << meshes_len << "\n";
+ }
+ Span<const Mesh *> mesh_span(meshes, meshes_len);
+ MeshesToIMeshInfo mim;
+ IMeshArena arena;
+ IMesh m_in = meshes_to_imesh(mesh_span, obmats, arena, &mim);
+ std::function<int(int)> shape_fn = [&mim](int f) {
+ for (int mi = 0; mi < mim.mesh_poly_offset.size() - 1; ++mi) {
+ if (f < mim.mesh_poly_offset[mi + 1]) {
+ return mi;
+ }
+ }
+ return static_cast<int>(mim.mesh_poly_offset.size()) - 1;
+ };
+ IMesh m_out = boolean_mesh(m_in, boolean_mode, meshes_len, shape_fn, use_self, nullptr, &arena);
+ if (dbg_level > 1) {
+ std::cout << m_out;
+ write_obj_mesh(m_out, "m_out");
+ }
+
+ return imesh_to_mesh(&m_out, mim);
+}
+
+#endif // WITH_GMP
+} // namespace blender::meshintersect
+
+extern "C" {
+
+#ifdef WITH_GMP
+/* Do a mesh boolean directly on meshes (without going back and forth to BMesh).
+ * The \a meshes argument is an array of \a meshes_len of Mesh pointers.
+ * The \a obmats argument is an array of \a meshes_len of pointers to the obmat
+ * matrices that transform local coordinates to global ones. It is allowed
+ * for the pointers to be nullptr, meaning the transformation is the identity. */
+Mesh *BKE_mesh_boolean(const Mesh **meshes,
+ const float (*obmats[])[4][4],
+ const int meshes_len,
+ const bool use_self,
+ const int boolean_mode)
+{
+ return blender::meshintersect::direct_mesh_boolean(
+ meshes,
+ obmats,
+ meshes_len,
+ use_self,
+ static_cast<blender::meshintersect::BoolOpType>(boolean_mode));
+}
+
+#else
+Mesh *BKE_mesh_boolean(const Mesh **UNUSED(meshes),
+ const float (*obmats[])[4][4],
+ const int UNUSED(meshes_len),
+ const bool UNUSED(use_self),
+ const int UNUSED(boolean_mode))
+{
+ UNUSED_VARS(obmats);
+ return NULL;
+}
+
+#endif
+
+} // extern "C" \ No newline at end of file
diff --git a/source/blender/blenkernel/intern/mesh_fair.cc b/source/blender/blenkernel/intern/mesh_fair.cc
index 75dd396d10a..ac6dd96ed90 100644
--- a/source/blender/blenkernel/intern/mesh_fair.cc
+++ b/source/blender/blenkernel/intern/mesh_fair.cc
@@ -475,7 +475,7 @@ static void prefair_and_fair_vertices(FairingContext *fairing_context,
/* Fair. */
VoronoiVertexWeight *voronoi_vertex_weights = new VoronoiVertexWeight(fairing_context);
- /* TODO: Implemente cotangent loop weights. */
+ /* TODO: Implement cotangent loop weights. */
fairing_context->fair_vertices(
affected_vertices, depth, voronoi_vertex_weights, uniform_loop_weights);
diff --git a/source/blender/blenkernel/intern/mesh_merge.c b/source/blender/blenkernel/intern/mesh_merge.c
index e118c1b6f6e..e3b5e5ea434 100644
--- a/source/blender/blenkernel/intern/mesh_merge.c
+++ b/source/blender/blenkernel/intern/mesh_merge.c
@@ -377,8 +377,8 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
BLI_gset_insert(poly_gset, mpgh);
}
- /* Can we optimise by reusing an old pmap ? How do we know an old pmap is stale ? */
- /* When called by MOD_array.c, the cddm has just been created, so it has no valid pmap. */
+ /* Can we optimize by reusing an old `pmap`? How do we know an old `pmap` is stale? */
+ /* When called by `MOD_array.c` the `cddm` has just been created, so it has no valid `pmap`. */
BKE_mesh_vert_poly_map_create(
&poly_map, &poly_map_mem, mesh->mpoly, mesh->mloop, totvert, totpoly, totloop);
} /* done preparing for fast poly compare */
@@ -411,9 +411,10 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
continue;
}
if (merge_mode == MESH_MERGE_VERTS_DUMP_IF_EQUAL) {
- /* Additional condition for face dump: target vertices must make up an identical face */
- /* The test has 2 steps: (1) first step is fast ghash lookup, but not failproof */
- /* (2) second step is thorough but more costly poly compare */
+ /* Additional condition for face dump: target vertices must make up an identical face.
+ * The test has 2 steps:
+ * 1) first step is fast `ghash` lookup, but not fail-proof.
+ * 2) second step is thorough but more costly poly compare. */
int i_poly, v_target;
bool found = false;
PolyKey pkey;
diff --git a/source/blender/blenkernel/intern/mesh_validate.cc b/source/blender/blenkernel/intern/mesh_validate.cc
index 0aaca33124a..0b0aeb50d37 100644
--- a/source/blender/blenkernel/intern/mesh_validate.cc
+++ b/source/blender/blenkernel/intern/mesh_validate.cc
@@ -263,6 +263,6 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool keep_existing_edges, const bool select
mesh->totedge = new_totedge;
mesh->medge = new_edges.data();
- /* Explicitely clear edge maps, because that way it can be parallelized. */
+ /* Explicitly clear edge maps, because that way it can be parallelized. */
clear_hash_tables(edge_maps);
}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index a2a0bd84234..34b7c4234ec 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -464,7 +464,7 @@ void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *_for
* then is NULL)
* also used for some mesh tools to give warnings
*/
-int BKE_modifiers_get_cage_index(struct Scene *scene,
+int BKE_modifiers_get_cage_index(const Scene *scene,
Object *ob,
int *r_lastPossibleCageIndex,
bool is_virtual)
@@ -587,7 +587,7 @@ bool BKE_modifier_is_nonlocal_in_liboverride(const Object *ob, const ModifierDat
(md == NULL || (md->flag & eModifierFlag_OverrideLibrary_Local) == 0));
}
-CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene,
+CDMaskLink *BKE_modifier_calc_data_masks(const struct Scene *scene,
Object *ob,
ModifierData *md,
CustomData_MeshMasks *final_datamask,
@@ -655,7 +655,7 @@ CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene,
return dataMasks;
}
-ModifierData *BKE_modifier_get_last_preview(struct Scene *scene,
+ModifierData *BKE_modifier_get_last_preview(const struct Scene *scene,
ModifierData *md,
int required_mode)
{
@@ -878,7 +878,7 @@ bool BKE_modifiers_uses_armature(Object *ob, bArmature *arm)
return false;
}
-bool BKE_modifiers_uses_subsurf_facedots(struct Scene *scene, Object *ob)
+bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, Object *ob)
{
/* Search (backward) in the modifier stack to find if we have a subsurf modifier (enabled) before
* the last modifier displayed on cage (or if the subsurf is the last). */
@@ -919,7 +919,7 @@ bool BKE_modifier_is_correctable_deformed(ModifierData *md)
return mti->deformMatricesEM != NULL;
}
-bool BKE_modifiers_is_correctable_deformed(struct Scene *scene, Object *ob)
+bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, Object *ob)
{
VirtualModifierData virtualModifierData;
ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index e82ed62ed5b..0265e1c8b2c 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -362,6 +362,8 @@ IDTypeInfo IDType_ID_MC = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/*********************** movieclip buffer loaders *************************/
@@ -1726,76 +1728,78 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip
scopes->track = NULL;
scopes->track_locked = true;
- if (clip) {
- MovieTrackingTrack *act_track = BKE_tracking_track_get_active(&clip->tracking);
-
- if (act_track) {
- MovieTrackingTrack *track = act_track;
- int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, user->framenr);
- MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
-
- scopes->marker = marker;
- scopes->track = track;
-
- if (marker->flag & MARKER_DISABLED) {
- scopes->track_disabled = true;
- }
- else {
- ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user);
+ scopes->scene_framenr = user->framenr;
+ scopes->ok = true;
- scopes->track_disabled = false;
+ if (clip == NULL) {
+ return;
+ }
- if (ibuf && (ibuf->rect || ibuf->rect_float)) {
- MovieTrackingMarker undist_marker = *marker;
+ MovieTrackingTrack *track = BKE_tracking_track_get_active(&clip->tracking);
+ if (track == NULL) {
+ return;
+ }
- if (user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT) {
- int width, height;
- float aspy = 1.0f / clip->tracking.camera.pixel_aspect;
+ const int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, user->framenr);
+ MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
- BKE_movieclip_get_size(clip, user, &width, &height);
+ scopes->marker = marker;
+ scopes->track = track;
- undist_marker.pos[0] *= width;
- undist_marker.pos[1] *= height * aspy;
+ if (marker->flag & MARKER_DISABLED) {
+ scopes->track_disabled = true;
+ }
+ else {
+ ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user);
- BKE_tracking_undistort_v2(
- &clip->tracking, width, height, undist_marker.pos, undist_marker.pos);
+ scopes->track_disabled = false;
- undist_marker.pos[0] /= width;
- undist_marker.pos[1] /= height * aspy;
- }
+ if (ibuf && (ibuf->rect || ibuf->rect_float)) {
+ MovieTrackingMarker undist_marker = *marker;
- scopes->track_search = BKE_tracking_get_search_imbuf(
- ibuf, track, &undist_marker, true, true);
+ if (user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT) {
+ int width, height;
+ float aspy = 1.0f / clip->tracking.camera.pixel_aspect;
- scopes->undist_marker = undist_marker;
+ BKE_movieclip_get_size(clip, user, &width, &height);
- scopes->frame_width = ibuf->x;
- scopes->frame_height = ibuf->y;
+ undist_marker.pos[0] *= width;
+ undist_marker.pos[1] *= height * aspy;
- scopes->use_track_mask = (track->flag & TRACK_PREVIEW_ALPHA) != 0;
- }
+ BKE_tracking_undistort_v2(
+ &clip->tracking, width, height, undist_marker.pos, undist_marker.pos);
- IMB_freeImBuf(ibuf);
+ undist_marker.pos[0] /= width;
+ undist_marker.pos[1] /= height * aspy;
}
- if ((track->flag & TRACK_LOCKED) == 0) {
- float pat_min[2], pat_max[2];
+ scopes->track_search = BKE_tracking_get_search_imbuf(
+ ibuf, track, &undist_marker, true, true);
- scopes->track_locked = false;
+ scopes->undist_marker = undist_marker;
- /* XXX: would work fine with non-transformed patterns, but would likely fail
- * with transformed patterns, but that would be easier to debug when
- * we'll have real pattern sampling (at least to test) */
- BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
+ scopes->frame_width = ibuf->x;
+ scopes->frame_height = ibuf->y;
- scopes->slide_scale[0] = pat_max[0] - pat_min[0];
- scopes->slide_scale[1] = pat_max[1] - pat_min[1];
- }
+ scopes->use_track_mask = (track->flag & TRACK_PREVIEW_ALPHA) != 0;
}
+
+ IMB_freeImBuf(ibuf);
}
- scopes->framenr = user->framenr;
- scopes->ok = true;
+ if ((track->flag & TRACK_LOCKED) == 0) {
+ float pat_min[2], pat_max[2];
+
+ scopes->track_locked = false;
+
+ /* XXX: would work fine with non-transformed patterns, but would likely fail
+ * with transformed patterns, but that would be easier to debug when
+ * we'll have real pattern sampling (at least to test) */
+ BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
+
+ scopes->slide_scale[0] = pat_max[0] - pat_min[0];
+ scopes->slide_scale[1] = pat_max[1] - pat_min[1];
+ }
}
static void movieclip_build_proxy_ibuf(
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 441da8b134a..45ac20ef154 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -781,7 +781,7 @@ static DerivedMesh *subsurf_dm_create_local(Scene *scene,
smd.levels = smd.renderLevels = lvl;
smd.quality = 3;
if (!is_plain_uv) {
- smd.uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_CORNERS;
+ smd.uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES;
}
else {
smd.uv_smooth = SUBSURF_UV_SMOOTH_NONE;
diff --git a/source/blender/blenkernel/intern/multires_unsubdivide.c b/source/blender/blenkernel/intern/multires_unsubdivide.c
index e3d670f7c39..02b9bb852d6 100644
--- a/source/blender/blenkernel/intern/multires_unsubdivide.c
+++ b/source/blender/blenkernel/intern/multires_unsubdivide.c
@@ -201,8 +201,8 @@ static void unsubdivide_face_center_vertex_tag(BMesh *bm, BMVert *initial_vertex
/* Repeat a similar operation for all vertices in the queue. */
/* In this case, add to the queue the vertices connected by 2 steps using the diagonals in any
- * direction. If a solution exists and intial_vertex was a pole, this is guaranteed that will tag
- * all the (0,0) vertices of the grids, and nothing else. */
+ * direction. If a solution exists and `initial_vertex` was a pole, this is guaranteed that will
+ * tag all the (0,0) vertices of the grids, and nothing else. */
/* If it was not a pole, it may or may not find a solution, even if the solution exists. */
while (!BLI_gsqueue_is_empty(queue)) {
BMVert *from_v;
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.cc
index 76885eadaae..b96adce7cca 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.cc
@@ -25,10 +25,10 @@
#include "MEM_guardedalloc.h"
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
+#include <climits>
+#include <cstddef>
+#include <cstdlib>
+#include <cstring>
/* Allow using deprecated functionality for .blend file I/O. */
#define DNA_DEPRECATED_ALLOW
@@ -49,6 +49,7 @@
#include "BLI_ghash.h"
#include "BLI_listbase.h"
+#include "BLI_map.hh"
#include "BLI_math.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
@@ -68,6 +69,7 @@
#include "BKE_lib_query.h"
#include "BKE_main.h"
#include "BKE_node.h"
+#include "BKE_node_ui_storage.hh"
#include "BLI_ghash.h"
#include "BLI_threads.h"
@@ -109,7 +111,7 @@ static void node_socket_interface_free(bNodeTree *UNUSED(ntree),
static void ntree_init_data(ID *id)
{
bNodeTree *ntree = (bNodeTree *)id;
- ntree_set_typeinfo(ntree, NULL);
+ ntree_set_typeinfo(ntree, nullptr);
}
static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag)
@@ -121,7 +123,7 @@ static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c
const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT;
/* in case a running nodetree is copied */
- ntree_dst->execdata = NULL;
+ ntree_dst->execdata = nullptr;
BLI_listbase_clear(&ntree_dst->nodes);
BLI_listbase_clear(&ntree_dst->links);
@@ -133,17 +135,17 @@ static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c
bNode *new_node = BKE_node_copy_ex(ntree_dst, node_src, flag_subdata, true);
BLI_ghash_insert(new_pointers, (void *)node_src, new_node);
/* Store mapping to inputs. */
- bNodeSocket *new_input_sock = new_node->inputs.first;
- const bNodeSocket *input_sock_src = node_src->inputs.first;
- while (new_input_sock != NULL) {
+ bNodeSocket *new_input_sock = (bNodeSocket *)new_node->inputs.first;
+ const bNodeSocket *input_sock_src = (const bNodeSocket *)node_src->inputs.first;
+ while (new_input_sock != nullptr) {
BLI_ghash_insert(new_pointers, (void *)input_sock_src, new_input_sock);
new_input_sock = new_input_sock->next;
input_sock_src = input_sock_src->next;
}
/* Store mapping to outputs. */
- bNodeSocket *new_output_sock = new_node->outputs.first;
- const bNodeSocket *output_sock_src = node_src->outputs.first;
- while (new_output_sock != NULL) {
+ bNodeSocket *new_output_sock = (bNodeSocket *)new_node->outputs.first;
+ const bNodeSocket *output_sock_src = (const bNodeSocket *)node_src->outputs.first;
+ while (new_output_sock != nullptr) {
BLI_ghash_insert(new_pointers, (void *)output_sock_src, new_output_sock);
new_output_sock = new_output_sock->next;
output_sock_src = output_sock_src->next;
@@ -153,10 +155,13 @@ static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c
/* copy links */
BLI_duplicatelist(&ntree_dst->links, &ntree_src->links);
LISTBASE_FOREACH (bNodeLink *, link_dst, &ntree_dst->links) {
- link_dst->fromnode = BLI_ghash_lookup_default(new_pointers, link_dst->fromnode, NULL);
- link_dst->fromsock = BLI_ghash_lookup_default(new_pointers, link_dst->fromsock, NULL);
- link_dst->tonode = BLI_ghash_lookup_default(new_pointers, link_dst->tonode, NULL);
- link_dst->tosock = BLI_ghash_lookup_default(new_pointers, link_dst->tosock, NULL);
+ link_dst->fromnode = (bNode *)BLI_ghash_lookup_default(
+ new_pointers, link_dst->fromnode, nullptr);
+ link_dst->fromsock = (bNodeSocket *)BLI_ghash_lookup_default(
+ new_pointers, link_dst->fromsock, nullptr);
+ link_dst->tonode = (bNode *)BLI_ghash_lookup_default(new_pointers, link_dst->tonode, nullptr);
+ link_dst->tosock = (bNodeSocket *)BLI_ghash_lookup_default(
+ new_pointers, link_dst->tosock, nullptr);
/* update the link socket's pointer */
if (link_dst->tosock) {
link_dst->tosock->link = link_dst;
@@ -166,14 +171,18 @@ static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c
/* copy interface sockets */
BLI_duplicatelist(&ntree_dst->inputs, &ntree_src->inputs);
bNodeSocket *sock_dst, *sock_src;
- for (sock_dst = ntree_dst->inputs.first, sock_src = ntree_src->inputs.first; sock_dst != NULL;
- sock_dst = sock_dst->next, sock_src = sock_src->next) {
+ for (sock_dst = (bNodeSocket *)ntree_dst->inputs.first,
+ sock_src = (bNodeSocket *)ntree_src->inputs.first;
+ sock_dst != nullptr;
+ sock_dst = (bNodeSocket *)sock_dst->next, sock_src = (bNodeSocket *)sock_src->next) {
node_socket_copy(sock_dst, sock_src, flag_subdata);
}
BLI_duplicatelist(&ntree_dst->outputs, &ntree_src->outputs);
- for (sock_dst = ntree_dst->outputs.first, sock_src = ntree_src->outputs.first; sock_dst != NULL;
- sock_dst = sock_dst->next, sock_src = sock_src->next) {
+ for (sock_dst = (bNodeSocket *)ntree_dst->outputs.first,
+ sock_src = (bNodeSocket *)ntree_src->outputs.first;
+ sock_dst != nullptr;
+ sock_dst = (bNodeSocket *)sock_dst->next, sock_src = (bNodeSocket *)sock_src->next) {
node_socket_copy(sock_dst, sock_src, flag_subdata);
}
@@ -185,26 +194,33 @@ static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c
NODE_INSTANCE_HASH_ITER (iter, ntree_src->previews) {
bNodeInstanceKey key = BKE_node_instance_hash_iterator_get_key(&iter);
- bNodePreview *preview = BKE_node_instance_hash_iterator_get_value(&iter);
+ bNodePreview *preview = (bNodePreview *)BKE_node_instance_hash_iterator_get_value(&iter);
BKE_node_instance_hash_insert(ntree_dst->previews, key, BKE_node_preview_copy(preview));
}
}
else {
- ntree_dst->previews = NULL;
+ ntree_dst->previews = nullptr;
}
/* update node->parent pointers */
- for (bNode *node_dst = ntree_dst->nodes.first, *node_src = ntree_src->nodes.first; node_dst;
- node_dst = node_dst->next, node_src = node_src->next) {
+ for (bNode *node_dst = (bNode *)ntree_dst->nodes.first,
+ *node_src = (bNode *)ntree_src->nodes.first;
+ node_dst;
+ node_dst = (bNode *)node_dst->next, node_src = (bNode *)node_src->next) {
if (node_dst->parent) {
- node_dst->parent = BLI_ghash_lookup_default(new_pointers, node_dst->parent, NULL);
+ node_dst->parent = (bNode *)BLI_ghash_lookup_default(
+ new_pointers, node_dst->parent, nullptr);
}
}
- BLI_ghash_free(new_pointers, NULL, NULL);
+ BLI_ghash_free(new_pointers, nullptr, nullptr);
/* node tree will generate its own interface type */
- ntree_dst->interface_type = NULL;
+ ntree_dst->interface_type = nullptr;
+
+ /* Don't copy error messages in the runtime struct.
+ * They should be filled during execution anyway. */
+ ntree_dst->ui_storage = nullptr;
}
static void ntree_free_data(ID *id)
@@ -223,7 +239,7 @@ static void ntree_free_data(ID *id)
break;
case NTREE_TEXTURE:
ntreeTexEndExecTree(ntree->execdata);
- ntree->execdata = NULL;
+ ntree->execdata = nullptr;
break;
}
}
@@ -258,6 +274,8 @@ static void ntree_free_data(ID *id)
if (ntree->id.tag & LIB_TAG_LOCALIZED) {
BKE_libblock_free_data(&ntree->id, true);
}
+
+ delete ntree->ui_storage;
}
static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock)
@@ -267,17 +285,18 @@ static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket
switch ((eNodeSocketDatatype)sock->type) {
case SOCK_OBJECT: {
- bNodeSocketValueObject *default_value = sock->default_value;
+ bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value;
BKE_LIB_FOREACHID_PROCESS(data, default_value->value, IDWALK_CB_USER);
break;
}
case SOCK_IMAGE: {
- bNodeSocketValueImage *default_value = sock->default_value;
+ bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value;
BKE_LIB_FOREACHID_PROCESS(data, default_value->value, IDWALK_CB_USER);
break;
}
case SOCK_COLLECTION: {
- bNodeSocketValueCollection *default_value = sock->default_value;
+ bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *)
+ sock->default_value;
BKE_LIB_FOREACHID_PROCESS(data, default_value->value, IDWALK_CB_USER);
break;
}
@@ -327,11 +346,10 @@ static void node_foreach_cache(ID *id,
void *user_data)
{
bNodeTree *nodetree = (bNodeTree *)id;
- IDCacheKey key = {
- .id_session_uuid = id->session_uuid,
- .offset_in_ID = offsetof(bNodeTree, previews),
- .cache_v = nodetree->previews,
- };
+ IDCacheKey key = {0};
+ key.id_session_uuid = id->session_uuid;
+ key.offset_in_ID = offsetof(bNodeTree, previews);
+ key.cache_v = nodetree->previews;
/* TODO, see also `direct_link_nodetree()` in readfile.c. */
#if 0
@@ -351,7 +369,7 @@ static void node_foreach_cache(ID *id,
static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *sock)
{
- if (sock->default_value == NULL) {
+ if (sock->default_value == nullptr) {
return;
}
@@ -448,7 +466,7 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
/* could be handlerized at some point, now only 1 exception still */
if ((ntree->type == NTREE_SHADER) &&
ELEM(node->type, SH_NODE_CURVE_VEC, SH_NODE_CURVE_RGB)) {
- BKE_curvemapping_blend_write(writer, node->storage);
+ BKE_curvemapping_blend_write(writer, (const CurveMapping *)node->storage);
}
else if (ntree->type == NTREE_SHADER && (node->type == SH_NODE_SCRIPT)) {
NodeShaderScript *nss = (NodeShaderScript *)node->storage;
@@ -462,11 +480,11 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
CMP_NODE_CURVE_VEC,
CMP_NODE_CURVE_RGB,
CMP_NODE_HUECORRECT)) {
- BKE_curvemapping_blend_write(writer, node->storage);
+ BKE_curvemapping_blend_write(writer, (const CurveMapping *)node->storage);
}
else if ((ntree->type == NTREE_TEXTURE) &&
(node->type == TEX_NODE_CURVE_RGB || node->type == TEX_NODE_CURVE_TIME)) {
- BKE_curvemapping_blend_write(writer, node->storage);
+ BKE_curvemapping_blend_write(writer, (const CurveMapping *)node->storage);
}
else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_MOVIEDISTORTION)) {
/* pass */
@@ -474,7 +492,7 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_GLARE)) {
/* Simple forward compatibility for fix for T50736.
* Not ideal (there is no ideal solution here), but should do for now. */
- NodeGlare *ndg = node->storage;
+ NodeGlare *ndg = (NodeGlare *)node->storage;
/* Not in undo case. */
if (!BLO_write_is_undo(writer)) {
switch (ndg->type) {
@@ -505,6 +523,13 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
MEM_SAFE_FREE(nc->matte_id);
}
+ else if (node->type == FN_NODE_INPUT_STRING) {
+ NodeInputString *storage = (NodeInputString *)node->storage;
+ if (storage->string) {
+ BLO_write_string(writer, storage->string);
+ }
+ BLO_write_struct_by_name(writer, node->typeinfo->storagename, storage);
+ }
else if (node->typeinfo != &NodeTypeUndefined) {
BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
}
@@ -543,10 +568,11 @@ static void ntree_blend_write(BlendWriter *writer, ID *id, const void *id_addres
/* Clean up, important in undo case to reduce false detection of changed datablocks. */
ntree->init = 0; /* to set callbacks and force setting types */
ntree->is_updating = false;
- ntree->typeinfo = NULL;
- ntree->interface_type = NULL;
- ntree->progress = NULL;
- ntree->execdata = NULL;
+ ntree->typeinfo = nullptr;
+ ntree->interface_type = nullptr;
+ ntree->progress = nullptr;
+ ntree->execdata = nullptr;
+ ntree->ui_storage = nullptr;
BLO_write_id_struct(writer, bNodeTree, id_address, &ntree->id);
@@ -560,10 +586,11 @@ static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock)
IDP_BlendDataRead(reader, &sock->prop);
BLO_read_data_address(reader, &sock->link);
- sock->typeinfo = NULL;
+ sock->typeinfo = nullptr;
BLO_read_data_address(reader, &sock->storage);
BLO_read_data_address(reader, &sock->default_value);
- sock->cache = NULL;
+ sock->total_inputs = 0; /* Clear runtime data set before drawing. */
+ sock->cache = nullptr;
}
/* ntree itself has been read! */
@@ -572,18 +599,19 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
/* note: writing and reading goes in sync, for speed */
ntree->init = 0; /* to set callbacks and force setting types */
ntree->is_updating = false;
- ntree->typeinfo = NULL;
- ntree->interface_type = NULL;
+ ntree->typeinfo = nullptr;
+ ntree->interface_type = nullptr;
- ntree->progress = NULL;
- ntree->execdata = NULL;
+ ntree->progress = nullptr;
+ ntree->execdata = nullptr;
+ ntree->ui_storage = nullptr;
BLO_read_data_address(reader, &ntree->adt);
BKE_animdata_blend_read_data(reader, ntree->adt);
BLO_read_list(reader, &ntree->nodes);
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
- node->typeinfo = NULL;
+ node->typeinfo = nullptr;
BLO_read_list(reader, &node->inputs);
BLO_read_list(reader, &node->outputs);
@@ -618,7 +646,7 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
case CMP_NODE_HUECORRECT:
case TEX_NODE_CURVE_RGB:
case TEX_NODE_CURVE_TIME: {
- BKE_curvemapping_blend_read(reader, node->storage);
+ BKE_curvemapping_blend_read(reader, (CurveMapping *)node->storage);
break;
}
case SH_NODE_SCRIPT: {
@@ -634,22 +662,22 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
case SH_NODE_TEX_IMAGE: {
NodeTexImage *tex = (NodeTexImage *)node->storage;
tex->iuser.ok = 1;
- tex->iuser.scene = NULL;
+ tex->iuser.scene = nullptr;
break;
}
case SH_NODE_TEX_ENVIRONMENT: {
NodeTexEnvironment *tex = (NodeTexEnvironment *)node->storage;
tex->iuser.ok = 1;
- tex->iuser.scene = NULL;
+ tex->iuser.scene = nullptr;
break;
}
case CMP_NODE_IMAGE:
case CMP_NODE_R_LAYERS:
case CMP_NODE_VIEWER:
case CMP_NODE_SPLITVIEWER: {
- ImageUser *iuser = node->storage;
+ ImageUser *iuser = (ImageUser *)node->storage;
iuser->ok = 1;
- iuser->scene = NULL;
+ iuser->scene = nullptr;
break;
}
case CMP_NODE_CRYPTOMATTE: {
@@ -659,9 +687,14 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
break;
}
case TEX_NODE_IMAGE: {
- ImageUser *iuser = node->storage;
+ ImageUser *iuser = (ImageUser *)node->storage;
iuser->ok = 1;
- iuser->scene = NULL;
+ iuser->scene = nullptr;
+ break;
+ }
+ case FN_NODE_INPUT_STRING: {
+ NodeInputString *storage = (NodeInputString *)node->storage;
+ BLO_read_data_address(reader, &storage->string);
break;
}
default:
@@ -701,7 +734,7 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
}
/* TODO, should be dealt by new generic cache handling of IDs... */
- ntree->previews = NULL;
+ ntree->previews = nullptr;
/* type verification is in lib-link */
}
@@ -718,17 +751,18 @@ static void lib_link_node_socket(BlendLibReader *reader, Library *lib, bNodeSock
switch ((eNodeSocketDatatype)sock->type) {
case SOCK_OBJECT: {
- bNodeSocketValueObject *default_value = sock->default_value;
+ bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value;
BLO_read_id_address(reader, lib, &default_value->value);
break;
}
case SOCK_IMAGE: {
- bNodeSocketValueImage *default_value = sock->default_value;
+ bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value;
BLO_read_id_address(reader, lib, &default_value->value);
break;
}
case SOCK_COLLECTION: {
- bNodeSocketValueImage *default_value = sock->default_value;
+ bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *)
+ sock->default_value;
BLO_read_id_address(reader, lib, &default_value->value);
break;
}
@@ -777,7 +811,7 @@ void ntreeBlendReadLib(struct BlendLibReader *reader, struct bNodeTree *ntree)
* first versioning that can change types still without functions that
* update the typeinfo pointers. Versioning after lib linking needs
* these top be valid. */
- ntreeSetTypes(NULL, ntree);
+ ntreeSetTypes(nullptr, ntree);
/* For nodes with static socket layout, add/remove sockets as needed
* to match the static layout. */
@@ -798,21 +832,22 @@ static void expand_node_socket(BlendExpander *expander, bNodeSocket *sock)
{
IDP_BlendReadExpand(expander, sock->prop);
- if (sock->default_value != NULL) {
+ if (sock->default_value != nullptr) {
switch ((eNodeSocketDatatype)sock->type) {
case SOCK_OBJECT: {
- bNodeSocketValueObject *default_value = sock->default_value;
+ bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value;
BLO_expand(expander, default_value->value);
break;
}
case SOCK_IMAGE: {
- bNodeSocketValueImage *default_value = sock->default_value;
+ bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value;
BLO_expand(expander, default_value->value);
break;
}
case SOCK_COLLECTION: {
- bNodeSocketValueCollection *default_value = sock->default_value;
+ bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *)
+ sock->default_value;
BLO_expand(expander, default_value->value);
break;
}
@@ -866,28 +901,30 @@ static void ntree_blend_read_expand(BlendExpander *expander, ID *id)
}
IDTypeInfo IDType_ID_NT = {
- .id_code = ID_NT,
- .id_filter = FILTER_ID_NT,
- .main_listbase_index = INDEX_ID_NT,
- .struct_size = sizeof(bNodeTree),
- .name = "NodeTree",
- .name_plural = "node_groups",
- .translation_context = BLT_I18NCONTEXT_ID_NODETREE,
- .flags = 0,
-
- .init_data = ntree_init_data,
- .copy_data = ntree_copy_data,
- .free_data = ntree_free_data,
- .make_local = NULL,
- .foreach_id = node_foreach_id,
- .foreach_cache = node_foreach_cache,
-
- .blend_write = ntree_blend_write,
- .blend_read_data = ntree_blend_read_data,
- .blend_read_lib = ntree_blend_read_lib,
- .blend_read_expand = ntree_blend_read_expand,
-
- .blend_read_undo_preserve = NULL,
+ /* id_code */ ID_NT,
+ /* id_filter */ FILTER_ID_NT,
+ /* main_listbase_index */ INDEX_ID_NT,
+ /* struct_size */ sizeof(bNodeTree),
+ /* name */ "NodeTree",
+ /* name_plural */ "node_groups",
+ /* translation_context */ BLT_I18NCONTEXT_ID_NODETREE,
+ /* flags */ 0,
+
+ /* init_data */ ntree_init_data,
+ /* copy_data */ ntree_copy_data,
+ /* free_data */ ntree_free_data,
+ /* make_local */ nullptr,
+ /* foreach_id */ node_foreach_id,
+ /* foreach_cache */ node_foreach_cache,
+
+ /* blend_write */ ntree_blend_write,
+ /* blend_read_data */ ntree_blend_read_data,
+ /* blend_read_lib */ ntree_blend_read_lib,
+ /* blend_read_expand */ ntree_blend_read_expand,
+
+ /* blend_read_undo_preserve */ nullptr,
+
+ /* lib_override_apply_post */ nullptr,
};
static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype)
@@ -947,11 +984,11 @@ static void node_init(const struct bContext *C, bNodeTree *ntree, bNode *node)
node_add_sockets_from_type(ntree, node, ntype);
- if (ntype->initfunc != NULL) {
+ if (ntype->initfunc != nullptr) {
ntype->initfunc(ntree, node);
}
- if (ntree->typeinfo->node_add_init != NULL) {
+ if (ntree->typeinfo->node_add_init != nullptr) {
ntree->typeinfo->node_add_init(ntree, node);
}
@@ -964,10 +1001,10 @@ static void node_init(const struct bContext *C, bNodeTree *ntree, bNode *node)
PointerRNA ptr;
RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr);
- /* XXX Warning: context can be NULL in case nodes are added in do_versions.
+ /* XXX Warning: context can be nullptr in case nodes are added in do_versions.
* Delayed init is not supported for nodes with context-based initfunc_api atm.
*/
- BLI_assert(C != NULL);
+ BLI_assert(C != nullptr);
ntype->initfunc_api(C, &ptr);
}
@@ -997,7 +1034,7 @@ static void node_set_typeinfo(const struct bContext *C,
/* for nodes saved in older versions storage can get lost, make undefined then */
if (node->flag & NODE_INIT) {
if (typeinfo && typeinfo->storagename[0] && !node->storage) {
- typeinfo = NULL;
+ typeinfo = nullptr;
}
}
@@ -1027,7 +1064,7 @@ static void node_socket_set_typeinfo(bNodeTree *ntree,
/* deprecated integer type */
sock->type = typeinfo->type;
- if (sock->default_value == NULL) {
+ if (sock->default_value == nullptr) {
/* initialize the default_value pointer used by standard socket types */
node_socket_init_default_value(sock);
}
@@ -1055,24 +1092,24 @@ static void update_typeinfo(Main *bmain,
ntree->init |= NTREE_TYPE_INIT;
if (treetype && STREQ(ntree->idname, treetype->idname)) {
- ntree_set_typeinfo(ntree, unregister ? NULL : treetype);
+ ntree_set_typeinfo(ntree, unregister ? nullptr : treetype);
}
/* initialize nodes */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
if (nodetype && STREQ(node->idname, nodetype->idname)) {
- node_set_typeinfo(C, ntree, node, unregister ? NULL : nodetype);
+ node_set_typeinfo(C, ntree, node, unregister ? nullptr : nodetype);
}
/* initialize node sockets */
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
if (socktype && STREQ(sock->idname, socktype->idname)) {
- node_socket_set_typeinfo(ntree, sock, unregister ? NULL : socktype);
+ node_socket_set_typeinfo(ntree, sock, unregister ? nullptr : socktype);
}
}
LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
if (socktype && STREQ(sock->idname, socktype->idname)) {
- node_socket_set_typeinfo(ntree, sock, unregister ? NULL : socktype);
+ node_socket_set_typeinfo(ntree, sock, unregister ? nullptr : socktype);
}
}
}
@@ -1080,12 +1117,12 @@ static void update_typeinfo(Main *bmain,
/* initialize tree sockets */
LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->inputs) {
if (socktype && STREQ(sock->idname, socktype->idname)) {
- node_socket_set_typeinfo(ntree, sock, unregister ? NULL : socktype);
+ node_socket_set_typeinfo(ntree, sock, unregister ? nullptr : socktype);
}
}
LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->outputs) {
if (socktype && STREQ(sock->idname, socktype->idname)) {
- node_socket_set_typeinfo(ntree, sock, unregister ? NULL : socktype);
+ node_socket_set_typeinfo(ntree, sock, unregister ? nullptr : socktype);
}
}
}
@@ -1123,22 +1160,20 @@ void ntreeSetTypes(const struct bContext *C, bNodeTree *ntree)
}
}
-static GHash *nodetreetypes_hash = NULL;
-static GHash *nodetypes_hash = NULL;
-static GHash *nodesockettypes_hash = NULL;
+static GHash *nodetreetypes_hash = nullptr;
+static GHash *nodetypes_hash = nullptr;
+static GHash *nodesockettypes_hash = nullptr;
bNodeTreeType *ntreeTypeFind(const char *idname)
{
- bNodeTreeType *nt;
-
if (idname[0]) {
- nt = BLI_ghash_lookup(nodetreetypes_hash, idname);
+ bNodeTreeType *nt = (bNodeTreeType *)BLI_ghash_lookup(nodetreetypes_hash, idname);
if (nt) {
return nt;
}
}
- return NULL;
+ return nullptr;
}
void ntreeTypeAdd(bNodeTreeType *nt)
@@ -1147,23 +1182,23 @@ void ntreeTypeAdd(bNodeTreeType *nt)
/* XXX pass Main to register function? */
/* Probably not. It is pretty much expected we want to update G_MAIN here I think -
* or we'd want to update *all* active Mains, which we cannot do anyway currently. */
- update_typeinfo(G_MAIN, NULL, nt, NULL, NULL, false);
+ update_typeinfo(G_MAIN, nullptr, nt, nullptr, nullptr, false);
}
/* callback for hash value free function */
static void ntree_free_type(void *treetype_v)
{
- bNodeTreeType *treetype = treetype_v;
+ bNodeTreeType *treetype = (bNodeTreeType *)treetype_v;
/* XXX pass Main to unregister function? */
/* Probably not. It is pretty much expected we want to update G_MAIN here I think -
* or we'd want to update *all* active Mains, which we cannot do anyway currently. */
- update_typeinfo(G_MAIN, NULL, treetype, NULL, NULL, true);
+ update_typeinfo(G_MAIN, nullptr, treetype, nullptr, nullptr, true);
MEM_freeN(treetype);
}
void ntreeTypeFreeLink(const bNodeTreeType *nt)
{
- BLI_ghash_remove(nodetreetypes_hash, nt->idname, NULL, ntree_free_type);
+ BLI_ghash_remove(nodetreetypes_hash, nt->idname, nullptr, ntree_free_type);
}
bool ntreeIsRegistered(bNodeTree *ntree)
@@ -1179,13 +1214,13 @@ GHashIterator *ntreeTypeGetIterator(void)
bNodeType *nodeTypeFind(const char *idname)
{
if (idname[0]) {
- bNodeType *nt = BLI_ghash_lookup(nodetypes_hash, idname);
+ bNodeType *nt = (bNodeType *)BLI_ghash_lookup(nodetypes_hash, idname);
if (nt) {
return nt;
}
}
- return NULL;
+ return nullptr;
}
static void free_dynamic_typeinfo(bNodeType *ntype)
@@ -1203,18 +1238,18 @@ static void free_dynamic_typeinfo(bNodeType *ntype)
/* callback for hash value free function */
static void node_free_type(void *nodetype_v)
{
- bNodeType *nodetype = nodetype_v;
+ bNodeType *nodetype = (bNodeType *)nodetype_v;
/* XXX pass Main to unregister function? */
/* Probably not. It is pretty much expected we want to update G_MAIN here I think -
* or we'd want to update *all* active Mains, which we cannot do anyway currently. */
- update_typeinfo(G_MAIN, NULL, NULL, nodetype, NULL, true);
+ update_typeinfo(G_MAIN, nullptr, nullptr, nodetype, nullptr, true);
/* XXX deprecated */
if (nodetype->type == NODE_DYNAMIC) {
free_dynamic_typeinfo(nodetype);
}
- /* Can be NULL when the type is not dynamically allocated. */
+ /* Can be null when the type is not dynamically allocated. */
if (nodetype->free_self) {
nodetype->free_self(nodetype);
}
@@ -1224,18 +1259,18 @@ void nodeRegisterType(bNodeType *nt)
{
/* debug only: basic verification of registered types */
BLI_assert(nt->idname[0] != '\0');
- BLI_assert(nt->poll != NULL);
+ BLI_assert(nt->poll != nullptr);
BLI_ghash_insert(nodetypes_hash, nt->idname, nt);
/* XXX pass Main to register function? */
/* Probably not. It is pretty much expected we want to update G_MAIN here I think -
* or we'd want to update *all* active Mains, which we cannot do anyway currently. */
- update_typeinfo(G_MAIN, NULL, NULL, nt, NULL, false);
+ update_typeinfo(G_MAIN, nullptr, nullptr, nt, nullptr, false);
}
void nodeUnregisterType(bNodeType *nt)
{
- BLI_ghash_remove(nodetypes_hash, nt->idname, NULL, node_free_type);
+ BLI_ghash_remove(nodetypes_hash, nt->idname, nullptr, node_free_type);
}
bool nodeTypeUndefined(bNode *node)
@@ -1253,23 +1288,23 @@ GHashIterator *nodeTypeGetIterator(void)
bNodeSocketType *nodeSocketTypeFind(const char *idname)
{
if (idname[0]) {
- bNodeSocketType *st = BLI_ghash_lookup(nodesockettypes_hash, idname);
+ bNodeSocketType *st = (bNodeSocketType *)BLI_ghash_lookup(nodesockettypes_hash, idname);
if (st) {
return st;
}
}
- return NULL;
+ return nullptr;
}
/* callback for hash value free function */
static void node_free_socket_type(void *socktype_v)
{
- bNodeSocketType *socktype = socktype_v;
+ bNodeSocketType *socktype = (bNodeSocketType *)socktype_v;
/* XXX pass Main to unregister function? */
/* Probably not. It is pretty much expected we want to update G_MAIN here I think -
* or we'd want to update *all* active Mains, which we cannot do anyway currently. */
- update_typeinfo(G_MAIN, NULL, NULL, NULL, socktype, true);
+ update_typeinfo(G_MAIN, nullptr, nullptr, nullptr, socktype, true);
socktype->free_self(socktype);
}
@@ -1280,12 +1315,12 @@ void nodeRegisterSocketType(bNodeSocketType *st)
/* XXX pass Main to register function? */
/* Probably not. It is pretty much expected we want to update G_MAIN here I think -
* or we'd want to update *all* active Mains, which we cannot do anyway currently. */
- update_typeinfo(G_MAIN, NULL, NULL, NULL, st, false);
+ update_typeinfo(G_MAIN, nullptr, nullptr, nullptr, st, false);
}
void nodeUnregisterSocketType(bNodeSocketType *st)
{
- BLI_ghash_remove(nodesockettypes_hash, st->idname, NULL, node_free_socket_type);
+ BLI_ghash_remove(nodesockettypes_hash, st->idname, nullptr, node_free_socket_type);
}
bool nodeSocketIsRegistered(bNodeSocket *sock)
@@ -1306,13 +1341,13 @@ struct bNodeSocket *nodeFindSocket(const bNode *node, int in_out, const char *id
return sock;
}
}
- return NULL;
+ return nullptr;
}
/* find unique socket identifier */
static bool unique_identifier_check(void *arg, const char *identifier)
{
- struct ListBase *lb = arg;
+ const ListBase *lb = (const ListBase *)arg;
LISTBASE_FOREACH (bNodeSocket *, sock, lb) {
if (STREQ(sock->identifier, identifier)) {
return true;
@@ -1343,14 +1378,14 @@ static bNodeSocket *make_socket(bNodeTree *ntree,
BLI_uniquename_cb(
unique_identifier_check, lb, "socket", '.', auto_identifier, sizeof(auto_identifier));
- bNodeSocket *sock = MEM_callocN(sizeof(bNodeSocket), "sock");
+ bNodeSocket *sock = (bNodeSocket *)MEM_callocN(sizeof(bNodeSocket), "sock");
sock->in_out = in_out;
BLI_strncpy(sock->identifier, auto_identifier, NODE_MAXSTR);
sock->limit = (in_out == SOCK_IN ? 1 : 0xFFF);
BLI_strncpy(sock->name, name, NODE_MAXSTR);
- sock->storage = NULL;
+ sock->storage = nullptr;
sock->flag |= SOCK_COLLAPSED;
sock->type = SOCK_CUSTOM; /* int type undefined by default */
@@ -1364,17 +1399,18 @@ static void socket_id_user_increment(bNodeSocket *sock)
{
switch ((eNodeSocketDatatype)sock->type) {
case SOCK_OBJECT: {
- bNodeSocketValueObject *default_value = sock->default_value;
+ bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value;
id_us_plus((ID *)default_value->value);
break;
}
case SOCK_IMAGE: {
- bNodeSocketValueImage *default_value = sock->default_value;
+ bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value;
id_us_plus((ID *)default_value->value);
break;
}
case SOCK_COLLECTION: {
- bNodeSocketValueCollection *default_value = sock->default_value;
+ bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *)
+ sock->default_value;
id_us_plus((ID *)default_value->value);
break;
}
@@ -1396,18 +1432,25 @@ static void socket_id_user_decrement(bNodeSocket *sock)
{
switch ((eNodeSocketDatatype)sock->type) {
case SOCK_OBJECT: {
- bNodeSocketValueObject *default_value = sock->default_value;
- id_us_min(&default_value->value->id);
+ bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value;
+ if (default_value->value != nullptr) {
+ id_us_min(&default_value->value->id);
+ }
break;
}
case SOCK_IMAGE: {
- bNodeSocketValueImage *default_value = sock->default_value;
- id_us_min(&default_value->value->id);
+ bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value;
+ if (default_value->value != nullptr) {
+ id_us_min(&default_value->value->id);
+ }
break;
}
case SOCK_COLLECTION: {
- bNodeSocketValueCollection *default_value = sock->default_value;
- id_us_min(&default_value->value->id);
+ bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *)
+ sock->default_value;
+ if (default_value->value != nullptr) {
+ id_us_min(&default_value->value->id);
+ }
break;
}
case SOCK_FLOAT:
@@ -1437,7 +1480,7 @@ void nodeModifySocketType(
if (sock->default_value) {
socket_id_user_decrement(sock);
MEM_freeN(sock->default_value);
- sock->default_value = NULL;
+ sock->default_value = nullptr;
}
sock->type = type;
@@ -1552,7 +1595,7 @@ const char *nodeStaticSocketType(int type, int subtype)
case SOCK_COLLECTION:
return "NodeSocketCollection";
}
- return NULL;
+ return nullptr;
}
const char *nodeStaticSocketInterfaceType(int type, int subtype)
@@ -1621,7 +1664,7 @@ const char *nodeStaticSocketInterfaceType(int type, int subtype)
case SOCK_COLLECTION:
return "NodeSocketInterfaceCollection";
}
- return NULL;
+ return nullptr;
}
bNodeSocket *nodeAddStaticSocket(bNodeTree *ntree,
@@ -1636,7 +1679,7 @@ bNodeSocket *nodeAddStaticSocket(bNodeTree *ntree,
if (!idname) {
CLOG_ERROR(&LOG, "static node socket type %d undefined", type);
- return NULL;
+ return nullptr;
}
bNodeSocket *sock = nodeAddSocket(ntree, node, in_out, idname, identifier, name);
@@ -1657,7 +1700,7 @@ bNodeSocket *nodeInsertStaticSocket(bNodeTree *ntree,
if (!idname) {
CLOG_ERROR(&LOG, "static node socket type %d undefined", type);
- return NULL;
+ return nullptr;
}
bNodeSocket *sock = nodeInsertSocket(ntree, node, in_out, idname, next_sock, identifier, name);
@@ -1727,23 +1770,23 @@ void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
/* finds a node based on its name */
bNode *nodeFindNodebyName(bNodeTree *ntree, const char *name)
{
- return BLI_findstring(&ntree->nodes, name, offsetof(bNode, name));
+ return (bNode *)BLI_findstring(&ntree->nodes, name, offsetof(bNode, name));
}
/* Finds a node based on given socket and returns true on success. */
bool nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **r_node, int *r_sockindex)
{
- *r_node = NULL;
+ *r_node = nullptr;
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
ListBase *sockets = (sock->in_out == SOCK_IN) ? &node->inputs : &node->outputs;
int index = 0;
LISTBASE_FOREACH (bNodeSocket *, tsock, sockets) {
if (sock == tsock) {
- if (r_node != NULL) {
+ if (r_node != nullptr) {
*r_node = node;
}
- if (r_sockindex != NULL) {
+ if (r_sockindex != nullptr) {
*r_sockindex = index;
}
return true;
@@ -1762,7 +1805,7 @@ bNode *nodeFindRootParent(bNode *node)
if (node->parent) {
return nodeFindRootParent(node->parent);
}
- return node->type == NODE_FRAME ? node : NULL;
+ return node->type == NODE_FRAME ? node : nullptr;
}
/**
@@ -1821,7 +1864,7 @@ static void iter_backwards_ex(const bNodeTree *ntree,
{
LISTBASE_FOREACH (bNodeSocket *, sock, &node_start->inputs) {
bNodeLink *link = sock->link;
- if (link == NULL) {
+ if (link == nullptr) {
continue;
}
if ((link->flag & NODE_LINK_VALID) == 0) {
@@ -1901,7 +1944,7 @@ void nodeUniqueName(bNodeTree *ntree, bNode *node)
bNode *nodeAddNode(const struct bContext *C, bNodeTree *ntree, const char *idname)
{
- bNode *node = MEM_callocN(sizeof(bNode), "new node");
+ bNode *node = (bNode *)MEM_callocN(sizeof(bNode), "new node");
BLI_addtail(&ntree->nodes, node);
BLI_strncpy(node->idname, idname, sizeof(node->idname));
@@ -1914,7 +1957,7 @@ bNode *nodeAddNode(const struct bContext *C, bNodeTree *ntree, const char *idnam
bNode *nodeAddStaticNode(const struct bContext *C, bNodeTree *ntree, int type)
{
- const char *idname = NULL;
+ const char *idname = nullptr;
NODE_TYPES_BEGIN (ntype) {
/* do an extra poll here, because some int types are used
@@ -1928,7 +1971,7 @@ bNode *nodeAddStaticNode(const struct bContext *C, bNodeTree *ntree, int type)
NODE_TYPES_END;
if (!idname) {
CLOG_ERROR(&LOG, "static node type %d undefined", type);
- return NULL;
+ return nullptr;
}
return nodeAddNode(C, ntree, idname);
}
@@ -1951,7 +1994,7 @@ static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src,
/* XXX some compositor node (e.g. image, render layers) still store
* some persistent buffer data here, need to clear this to avoid dangling pointers.
*/
- sock_dst->cache = NULL;
+ sock_dst->cache = nullptr;
}
/* keep socket listorder identical, for copying links */
@@ -1962,7 +2005,7 @@ bNode *BKE_node_copy_ex(bNodeTree *ntree,
const int flag,
const bool unique_name)
{
- bNode *node_dst = MEM_callocN(sizeof(bNode), "dupli node");
+ bNode *node_dst = (bNode *)MEM_callocN(sizeof(bNode), "dupli node");
bNodeSocket *sock_dst, *sock_src;
bNodeLink *link_dst, *link_src;
@@ -1977,14 +2020,18 @@ bNode *BKE_node_copy_ex(bNodeTree *ntree,
}
BLI_duplicatelist(&node_dst->inputs, &node_src->inputs);
- for (sock_dst = node_dst->inputs.first, sock_src = node_src->inputs.first; sock_dst != NULL;
- sock_dst = sock_dst->next, sock_src = sock_src->next) {
+ for (sock_dst = (bNodeSocket *)node_dst->inputs.first,
+ sock_src = (bNodeSocket *)node_src->inputs.first;
+ sock_dst != nullptr;
+ sock_dst = (bNodeSocket *)sock_dst->next, sock_src = (bNodeSocket *)sock_src->next) {
node_socket_copy(sock_dst, sock_src, flag);
}
BLI_duplicatelist(&node_dst->outputs, &node_src->outputs);
- for (sock_dst = node_dst->outputs.first, sock_src = node_src->outputs.first; sock_dst != NULL;
- sock_dst = sock_dst->next, sock_src = sock_src->next) {
+ for (sock_dst = (bNodeSocket *)node_dst->outputs.first,
+ sock_src = (bNodeSocket *)node_src->outputs.first;
+ sock_dst != nullptr;
+ sock_dst = (bNodeSocket *)sock_dst->next, sock_src = (bNodeSocket *)sock_src->next) {
node_socket_copy(sock_dst, sock_src, flag);
}
@@ -1993,9 +2040,10 @@ bNode *BKE_node_copy_ex(bNodeTree *ntree,
}
BLI_duplicatelist(&node_dst->internal_links, &node_src->internal_links);
- for (link_dst = node_dst->internal_links.first, link_src = node_src->internal_links.first;
- link_dst != NULL;
- link_dst = link_dst->next, link_src = link_src->next) {
+ for (link_dst = (bNodeLink *)node_dst->internal_links.first,
+ link_src = (bNodeLink *)node_src->internal_links.first;
+ link_dst != nullptr;
+ link_dst = (bNodeLink *)link_dst->next, link_src = (bNodeLink *)link_src->next) {
/* This is a bit annoying to do index lookups in a list, but is likely to be faster than
* trying to create a hash-map. At least for usual nodes, which only have so much sockets
* and internal links. */
@@ -2005,8 +2053,8 @@ bNode *BKE_node_copy_ex(bNodeTree *ntree,
BLI_assert(to_sock_index != -1);
link_dst->fromnode = node_dst;
link_dst->tonode = node_dst;
- link_dst->fromsock = BLI_findlink(&node_dst->inputs, from_sock_index);
- link_dst->tosock = BLI_findlink(&node_dst->outputs, to_sock_index);
+ link_dst->fromsock = (bNodeSocket *)BLI_findlink(&node_dst->inputs, from_sock_index);
+ link_dst->tosock = (bNodeSocket *)BLI_findlink(&node_dst->outputs, to_sock_index);
}
if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
@@ -2017,7 +2065,7 @@ bNode *BKE_node_copy_ex(bNodeTree *ntree,
node_src->typeinfo->copyfunc(ntree, node_dst, node_src);
}
- node_dst->new_node = NULL;
+ node_dst->new_node = nullptr;
/* Only call copy function when a copy is made for the main database, not
* for cases like the dependency graph and localization. */
@@ -2040,17 +2088,17 @@ static void node_set_new_pointers(bNode *node_src, bNode *new_node)
/* Store mapping to the node itself. */
node_src->new_node = new_node;
/* Store mapping to inputs. */
- bNodeSocket *new_input_sock = new_node->inputs.first;
- bNodeSocket *input_sock_src = node_src->inputs.first;
- while (new_input_sock != NULL) {
+ bNodeSocket *new_input_sock = (bNodeSocket *)new_node->inputs.first;
+ bNodeSocket *input_sock_src = (bNodeSocket *)node_src->inputs.first;
+ while (new_input_sock != nullptr) {
input_sock_src->new_sock = new_input_sock;
new_input_sock = new_input_sock->next;
input_sock_src = input_sock_src->next;
}
/* Store mapping to outputs. */
- bNodeSocket *new_output_sock = new_node->outputs.first;
- bNodeSocket *output_sock_src = node_src->outputs.first;
- while (new_output_sock != NULL) {
+ bNodeSocket *new_output_sock = (bNodeSocket *)new_node->outputs.first;
+ bNodeSocket *output_sock_src = (bNodeSocket *)node_src->outputs.first;
+ while (new_output_sock != nullptr) {
output_sock_src->new_sock = new_output_sock;
new_output_sock = new_output_sock->next;
output_sock_src = output_sock_src->next;
@@ -2069,9 +2117,9 @@ bNodeTree *ntreeCopyTree_ex_new_pointers(const bNodeTree *ntree,
const bool do_id_user)
{
bNodeTree *new_ntree = ntreeCopyTree_ex(ntree, bmain, do_id_user);
- bNode *new_node = new_ntree->nodes.first;
- bNode *node_src = ntree->nodes.first;
- while (new_node != NULL) {
+ bNode *new_node = (bNode *)new_ntree->nodes.first;
+ bNode *node_src = (bNode *)ntree->nodes.first;
+ while (new_node != nullptr) {
node_set_new_pointers(node_src, new_node);
new_node = new_node->next;
node_src = node_src->next;
@@ -2083,14 +2131,14 @@ bNodeTree *ntreeCopyTree_ex_new_pointers(const bNodeTree *ntree,
bNodeLink *nodeAddLink(
bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
{
- bNodeLink *link = NULL;
+ bNodeLink *link = nullptr;
/* test valid input */
BLI_assert(fromnode);
BLI_assert(tonode);
if (fromsock->in_out == SOCK_OUT && tosock->in_out == SOCK_IN) {
- link = MEM_callocN(sizeof(bNodeLink), "link");
+ link = (bNodeLink *)MEM_callocN(sizeof(bNodeLink), "link");
if (ntree) {
BLI_addtail(&ntree->links, link);
}
@@ -2101,7 +2149,7 @@ bNodeLink *nodeAddLink(
}
else if (fromsock->in_out == SOCK_IN && tosock->in_out == SOCK_OUT) {
/* OK but flip */
- link = MEM_callocN(sizeof(bNodeLink), "link");
+ link = (bNodeLink *)MEM_callocN(sizeof(bNodeLink), "link");
if (ntree) {
BLI_addtail(&ntree->links, link);
}
@@ -2126,7 +2174,7 @@ void nodeRemLink(bNodeTree *ntree, bNodeLink *link)
}
if (link->tosock) {
- link->tosock->link = NULL;
+ link->tosock->link = nullptr;
}
MEM_freeN(link);
@@ -2137,10 +2185,7 @@ void nodeRemLink(bNodeTree *ntree, bNodeLink *link)
void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
{
- bNodeLink *link, *next;
-
- for (link = ntree->links.first; link; link = next) {
- next = link->next;
+ LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) {
if (link->fromsock == sock || link->tosock == sock) {
nodeRemLink(ntree, link);
}
@@ -2149,7 +2194,7 @@ void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
ntree->update |= NTREE_UPDATE_LINKS;
}
-bool nodeLinkIsHidden(bNodeLink *link)
+bool nodeLinkIsHidden(const bNodeLink *link)
{
return nodeSocketIsHidden(link->fromsock) || nodeSocketIsHidden(link->tosock);
}
@@ -2200,7 +2245,7 @@ void nodeInternalRelink(bNodeTree *ntree, bNode *node)
}
}
-void nodeToView(bNode *node, float x, float y, float *rx, float *ry)
+void nodeToView(const bNode *node, float x, float y, float *rx, float *ry)
{
if (node->parent) {
nodeToView(node->parent, x + node->locx, y + node->locy, rx, ry);
@@ -2211,7 +2256,7 @@ void nodeToView(bNode *node, float x, float y, float *rx, float *ry)
}
}
-void nodeFromView(bNode *node, float x, float y, float *rx, float *ry)
+void nodeFromView(const bNode *node, float x, float y, float *rx, float *ry)
{
if (node->parent) {
nodeFromView(node->parent, x, y, rx, ry);
@@ -2224,10 +2269,10 @@ void nodeFromView(bNode *node, float x, float y, float *rx, float *ry)
}
}
-bool nodeAttachNodeCheck(bNode *node, bNode *parent)
+bool nodeAttachNodeCheck(const bNode *node, const bNode *parent)
{
- for (bNode *parent_recurse = node; parent_recurse; parent_recurse = parent_recurse->parent) {
- if (parent_recurse == parent) {
+ for (const bNode *parent_iter = node; parent_iter; parent_iter = parent_iter->parent) {
+ if (parent_iter == parent) {
return true;
}
}
@@ -2258,7 +2303,7 @@ void nodeDetachNode(struct bNode *node)
nodeToView(node, 0.0f, 0.0f, &locx, &locy);
node->locx = locx;
node->locy = locy;
- node->parent = NULL;
+ node->parent = nullptr;
}
}
@@ -2307,7 +2352,7 @@ void nodePositionRelative(bNode *from_node,
void nodePositionPropagate(bNode *node)
{
LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) {
- if (nsock->link != NULL) {
+ if (nsock->link != nullptr) {
bNodeLink *link = nsock->link;
nodePositionRelative(link->fromnode, link->tonode, link->fromsock, link->tosock);
nodePositionPropagate(link->fromnode);
@@ -2317,17 +2362,15 @@ void nodePositionPropagate(bNode *node)
bNodeTree *ntreeAddTree(Main *bmain, const char *name, const char *idname)
{
- bNodeTree *ntree;
-
/* trees are created as local trees for compositor, material or texture nodes,
* node groups and other tree types are created as library data.
*/
- const bool is_embedded = (bmain == NULL);
+ const bool is_embedded = (bmain == nullptr);
int flag = 0;
if (is_embedded) {
flag |= LIB_ID_CREATE_NO_MAIN;
}
- ntree = BKE_libblock_alloc(bmain, ID_NT, name, flag);
+ bNodeTree *ntree = (bNodeTree *)BKE_libblock_alloc(bmain, ID_NT, name, flag);
if (is_embedded) {
ntree->id.flag |= LIB_EMBEDDED_DATA;
}
@@ -2347,7 +2390,7 @@ bNodeTree *ntreeCopyTree_ex(const bNodeTree *ntree, Main *bmain, const bool do_i
{
const int flag = do_id_user ? 0 : LIB_ID_CREATE_NO_USER_REFCOUNT | LIB_ID_CREATE_NO_MAIN;
- bNodeTree *ntree_copy = (bNodeTree *)BKE_id_copy_ex(bmain, (ID *)ntree, NULL, flag);
+ bNodeTree *ntree_copy = (bNodeTree *)BKE_id_copy_ex(bmain, (ID *)ntree, nullptr, flag);
return ntree_copy;
}
bNodeTree *ntreeCopyTree(Main *bmain, const bNodeTree *ntree)
@@ -2362,7 +2405,7 @@ bNodeTree *ntreeCopyTree(Main *bmain, const bNodeTree *ntree)
* using BKE_node_preview_init_tree to set up previews for a whole node tree in advance.
* This should be left more to the individual node tree implementations.
*/
-int BKE_node_preview_used(bNode *node)
+bool BKE_node_preview_used(const bNode *node)
{
/* XXX check for closed nodes? */
return (node->typeinfo->flag & NODE_PREVIEW) != 0;
@@ -2371,14 +2414,14 @@ int BKE_node_preview_used(bNode *node)
bNodePreview *BKE_node_preview_verify(
bNodeInstanceHash *previews, bNodeInstanceKey key, int xsize, int ysize, bool create)
{
- bNodePreview *preview = BKE_node_instance_hash_lookup(previews, key);
+ bNodePreview *preview = (bNodePreview *)BKE_node_instance_hash_lookup(previews, key);
if (!preview) {
if (create) {
- preview = MEM_callocN(sizeof(bNodePreview), "node preview");
+ preview = (bNodePreview *)MEM_callocN(sizeof(bNodePreview), "node preview");
BKE_node_instance_hash_insert(previews, key, preview);
}
else {
- return NULL;
+ return nullptr;
}
}
@@ -2391,12 +2434,13 @@ bNodePreview *BKE_node_preview_verify(
if (preview->rect) {
if (preview->xsize != xsize || preview->ysize != ysize) {
MEM_freeN(preview->rect);
- preview->rect = NULL;
+ preview->rect = nullptr;
}
}
- if (preview->rect == NULL) {
- preview->rect = MEM_callocN(4 * xsize + xsize * ysize * sizeof(char[4]), "node preview rect");
+ if (preview->rect == nullptr) {
+ preview->rect = (unsigned char *)MEM_callocN(4 * xsize + xsize * ysize * sizeof(char[4]),
+ "node preview rect");
preview->xsize = xsize;
preview->ysize = ysize;
}
@@ -2407,9 +2451,9 @@ bNodePreview *BKE_node_preview_verify(
bNodePreview *BKE_node_preview_copy(bNodePreview *preview)
{
- bNodePreview *new_preview = MEM_dupallocN(preview);
+ bNodePreview *new_preview = (bNodePreview *)MEM_dupallocN(preview);
if (preview->rect) {
- new_preview->rect = MEM_dupallocN(preview->rect);
+ new_preview->rect = (unsigned char *)MEM_dupallocN(preview->rect);
}
return new_preview;
}
@@ -2498,7 +2542,7 @@ void BKE_node_preview_free_tree(bNodeTree *ntree)
if (ntree->previews) {
BKE_node_instance_hash_free(ntree->previews, (bNodeInstanceValueFP)BKE_node_preview_free);
- ntree->previews = NULL;
+ ntree->previews = nullptr;
}
}
@@ -2517,7 +2561,7 @@ void BKE_node_preview_clear_tree(bNodeTree *ntree)
bNodeInstanceHashIterator iter;
NODE_INSTANCE_HASH_ITER (iter, ntree->previews) {
- bNodePreview *preview = BKE_node_instance_hash_iterator_get_value(&iter);
+ bNodePreview *preview = (bNodePreview *)BKE_node_instance_hash_iterator_get_value(&iter);
BKE_node_preview_clear(preview);
}
}
@@ -2547,8 +2591,8 @@ void BKE_node_preview_sync_tree(bNodeTree *to_ntree, bNodeTree *from_ntree)
bNodeInstanceHashIterator iter;
NODE_INSTANCE_HASH_ITER (iter, from_previews) {
bNodeInstanceKey key = BKE_node_instance_hash_iterator_get_key(&iter);
- bNodePreview *from = BKE_node_instance_hash_iterator_get_value(&iter);
- bNodePreview *to = BKE_node_instance_hash_lookup(to_previews, key);
+ bNodePreview *from = (bNodePreview *)BKE_node_instance_hash_iterator_get_value(&iter);
+ bNodePreview *to = (bNodePreview *)BKE_node_instance_hash_lookup(to_previews, key);
if (from && to) {
node_preview_sync(to, from);
@@ -2566,7 +2610,7 @@ void BKE_node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree, boo
/* transfer previews */
to_ntree->previews = from_ntree->previews;
- from_ntree->previews = NULL;
+ from_ntree->previews = nullptr;
/* clean up, in case any to_ntree nodes have been removed */
BKE_node_preview_remove_unused(to_ntree);
@@ -2576,7 +2620,7 @@ void BKE_node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree, boo
bNodeInstanceHashIterator iter;
NODE_INSTANCE_HASH_ITER (iter, from_ntree->previews) {
bNodeInstanceKey key = BKE_node_instance_hash_iterator_get_key(&iter);
- bNodePreview *preview = BKE_node_instance_hash_iterator_get_value(&iter);
+ bNodePreview *preview = (bNodePreview *)BKE_node_instance_hash_iterator_get_value(&iter);
/* replace existing previews */
BKE_node_instance_hash_remove(
@@ -2584,10 +2628,10 @@ void BKE_node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree, boo
BKE_node_instance_hash_insert(to_ntree->previews, key, preview);
}
- /* Note: NULL free function here,
+ /* Note: null free function here,
* because pointers have already been moved over to to_ntree->previews! */
- BKE_node_instance_hash_free(from_ntree->previews, NULL);
- from_ntree->previews = NULL;
+ BKE_node_instance_hash_free(from_ntree->previews, nullptr);
+ from_ntree->previews = nullptr;
}
}
}
@@ -2633,7 +2677,7 @@ void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
lb = &node->inputs;
}
else {
- lb = NULL;
+ lb = nullptr;
}
if (lb) {
@@ -2677,7 +2721,7 @@ static void node_free_node(bNodeTree *ntree, bNode *node)
/* texture node has bad habit of keeping exec data around */
if (ntree->type == NTREE_TEXTURE && ntree->execdata) {
ntreeTexEndExecTree(ntree->execdata);
- ntree->execdata = NULL;
+ ntree->execdata = nullptr;
}
}
@@ -2754,7 +2798,7 @@ void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
BLI_snprintf(prefix, sizeof(prefix), "nodes[\"%s\"]", propname_esc);
if (BKE_animdata_fix_paths_remove((ID *)ntree, prefix)) {
- if (bmain != NULL) {
+ if (bmain != nullptr) {
DEG_relations_tag_update(bmain);
}
}
@@ -2826,7 +2870,7 @@ void ntreeFreeLocalTree(bNodeTree *ntree)
void ntreeFreeCache(bNodeTree *ntree)
{
- if (ntree == NULL) {
+ if (ntree == nullptr) {
return;
}
@@ -2925,7 +2969,7 @@ bNodeTree **BKE_ntree_ptr_from_id(ID *id)
case ID_SIM:
return &((Simulation *)id)->nodetree;
default:
- return NULL;
+ return nullptr;
}
}
@@ -2933,10 +2977,10 @@ bNodeTree **BKE_ntree_ptr_from_id(ID *id)
bNodeTree *ntreeFromID(ID *id)
{
bNodeTree **nodetree = BKE_ntree_ptr_from_id(id);
- return (nodetree != NULL) ? *nodetree : NULL;
+ return (nodetree != nullptr) ? *nodetree : nullptr;
}
-/* Finds and returns the datablock that privately owns the given tree, or NULL. */
+/* Finds and returns the datablock that privately owns the given tree, or null. */
ID *BKE_node_tree_find_owner_ID(Main *bmain, struct bNodeTree *ntree)
{
ListBase *lists[] = {&bmain->materials,
@@ -2946,9 +2990,9 @@ ID *BKE_node_tree_find_owner_ID(Main *bmain, struct bNodeTree *ntree)
&bmain->scenes,
&bmain->linestyles,
&bmain->simulations,
- NULL};
+ nullptr};
- for (int i = 0; lists[i] != NULL; i++) {
+ for (int i = 0; lists[i] != nullptr; i++) {
LISTBASE_FOREACH (ID *, id, lists[i]) {
if (ntreeFromID(id) == ntree) {
return id;
@@ -2956,12 +3000,12 @@ ID *BKE_node_tree_find_owner_ID(Main *bmain, struct bNodeTree *ntree)
}
}
- return NULL;
+ return nullptr;
}
-bool ntreeNodeExists(bNodeTree *ntree, bNode *testnode)
+bool ntreeNodeExists(const bNodeTree *ntree, const bNode *testnode)
{
- LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ LISTBASE_FOREACH (const bNode *, node, &ntree->nodes) {
if (node == testnode) {
return true;
}
@@ -2969,9 +3013,9 @@ bool ntreeNodeExists(bNodeTree *ntree, bNode *testnode)
return false;
}
-bool ntreeOutputExists(bNode *node, bNodeSocket *testsock)
+bool ntreeOutputExists(const bNode *node, const bNodeSocket *testsock)
{
- LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
+ LISTBASE_FOREACH (const bNodeSocket *, sock, &node->outputs) {
if (sock == testsock) {
return true;
}
@@ -2999,7 +3043,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
* Note: previews are not copied here.
*/
bNodeTree *ltree = (bNodeTree *)BKE_id_copy_ex(
- NULL, &ntree->id, NULL, (LIB_ID_COPY_LOCALIZE | LIB_ID_COPY_NO_ANIMDATA));
+ nullptr, &ntree->id, nullptr, (LIB_ID_COPY_LOCALIZE | LIB_ID_COPY_NO_ANIMDATA));
ltree->id.tag |= LIB_TAG_LOCALIZED;
@@ -3012,9 +3056,9 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
/* ensures only a single output node is enabled */
ntreeSetOutput(ntree);
- bNode *node_src = ntree->nodes.first;
- bNode *node_local = ltree->nodes.first;
- while (node_src != NULL) {
+ bNode *node_src = (bNode *)ntree->nodes.first;
+ bNode *node_local = (bNode *)ltree->nodes.first;
+ while (node_src != nullptr) {
node_local->original = node_src;
node_src = node_src->next;
node_local = node_local->next;
@@ -3027,7 +3071,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
return ltree;
}
- return NULL;
+ return nullptr;
}
/* sync local composite with real tree */
@@ -3066,11 +3110,11 @@ static bNodeSocket *make_socket_interface(bNodeTree *ntree,
bNodeSocketType *stype = nodeSocketTypeFind(idname);
int own_index = ntree->cur_index++;
- if (stype == NULL) {
- return NULL;
+ if (stype == nullptr) {
+ return nullptr;
}
- bNodeSocket *sock = MEM_callocN(sizeof(bNodeSocket), "socket template");
+ bNodeSocket *sock = (bNodeSocket *)MEM_callocN(sizeof(bNodeSocket), "socket template");
BLI_strncpy(sock->idname, stype->idname, sizeof(sock->idname));
node_socket_set_typeinfo(ntree, sock, stype);
sock->in_out = in_out;
@@ -3089,7 +3133,7 @@ static bNodeSocket *make_socket_interface(bNodeTree *ntree,
sock->limit = (in_out == SOCK_IN ? 1 : 0xFFF);
BLI_strncpy(sock->name, name, NODE_MAXSTR);
- sock->storage = NULL;
+ sock->storage = nullptr;
sock->flag |= SOCK_COLLAPSED;
return sock;
@@ -3103,7 +3147,7 @@ bNodeSocket *ntreeFindSocketInterface(bNodeTree *ntree, int in_out, const char *
return iosock;
}
}
- return NULL;
+ return nullptr;
}
bNodeSocket *ntreeAddSocketInterface(bNodeTree *ntree,
@@ -3190,7 +3234,7 @@ static void ntree_interface_identifier_base(bNodeTree *ntree, char *base)
/* check if the identifier is already in use */
static bool ntree_interface_unique_identifier_check(void *UNUSED(data), const char *identifier)
{
- return (RNA_struct_find(identifier) != NULL);
+ return (RNA_struct_find(identifier) != nullptr);
}
/* generates the actual unique identifier and ui name and description */
@@ -3206,7 +3250,8 @@ static void ntree_interface_identifier(bNodeTree *ntree,
* On top of the sanitized id string add a number suffix if necessary to avoid duplicates.
*/
identifier[0] = '\0';
- BLI_uniquename_cb(ntree_interface_unique_identifier_check, NULL, base, '_', identifier, maxlen);
+ BLI_uniquename_cb(
+ ntree_interface_unique_identifier_check, nullptr, base, '_', identifier, maxlen);
sprintf(name, "Node Tree %s Interface", ntree->id.name + 2);
sprintf(description, "Interface properties of node group %s", ntree->id.name + 2);
@@ -3246,7 +3291,7 @@ static void ntree_interface_type_create(bNodeTree *ntree)
}
}
-StructRNA *ntreeInterfaceTypeGet(bNodeTree *ntree, int create)
+StructRNA *ntreeInterfaceTypeGet(bNodeTree *ntree, bool create)
{
if (ntree->interface_type) {
/* strings are generated from base string + ID name, sizes are sufficient */
@@ -3284,7 +3329,7 @@ void ntreeInterfaceTypeFree(bNodeTree *ntree)
{
if (ntree->interface_type) {
RNA_struct_free(&BLENDER_RNA, ntree->interface_type);
- ntree->interface_type = NULL;
+ ntree->interface_type = nullptr;
}
}
@@ -3310,12 +3355,12 @@ bNode *ntreeFindType(const bNodeTree *ntree, int type)
}
}
}
- return NULL;
+ return nullptr;
}
bool ntreeHasType(const bNodeTree *ntree, int type)
{
- return ntreeFindType(ntree, type) != NULL;
+ return ntreeFindType(ntree, type) != nullptr;
}
bool ntreeHasTree(const bNodeTree *ntree, const bNodeTree *lookup)
@@ -3333,7 +3378,7 @@ bool ntreeHasTree(const bNodeTree *ntree, const bNodeTree *lookup)
return false;
}
-bNodeLink *nodeFindLink(bNodeTree *ntree, bNodeSocket *from, bNodeSocket *to)
+bNodeLink *nodeFindLink(bNodeTree *ntree, const bNodeSocket *from, const bNodeSocket *to)
{
LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
if (link->fromsock == from && link->tosock == to) {
@@ -3343,13 +3388,13 @@ bNodeLink *nodeFindLink(bNodeTree *ntree, bNodeSocket *from, bNodeSocket *to)
return link;
}
}
- return NULL;
+ return nullptr;
}
-int nodeCountSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
+int nodeCountSocketLinks(const bNodeTree *ntree, const bNodeSocket *sock)
{
int tot = 0;
- LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
+ LISTBASE_FOREACH (const bNodeLink *, link, &ntree->links) {
if (link->fromsock == sock || link->tosock == sock) {
tot++;
}
@@ -3359,8 +3404,8 @@ int nodeCountSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
bNode *nodeGetActive(bNodeTree *ntree)
{
- if (ntree == NULL) {
- return NULL;
+ if (ntree == nullptr) {
+ return nullptr;
}
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
@@ -3368,7 +3413,7 @@ bNode *nodeGetActive(bNodeTree *ntree)
return node;
}
}
- return NULL;
+ return nullptr;
}
static bNode *node_get_active_id_recursive(bNodeInstanceKey active_key,
@@ -3400,7 +3445,7 @@ static bNode *node_get_active_id_recursive(bNodeInstanceKey active_key,
}
}
}
- return NULL;
+ return nullptr;
}
/* two active flags, ID nodes have special flag for buttons display */
@@ -3410,14 +3455,14 @@ bNode *nodeGetActiveID(bNodeTree *ntree, short idtype)
return node_get_active_id_recursive(
ntree->active_viewer_key, NODE_INSTANCE_KEY_BASE, ntree, idtype);
}
- return NULL;
+ return nullptr;
}
bool nodeSetActiveID(bNodeTree *ntree, short idtype, ID *id)
{
bool ok = false;
- if (ntree == NULL) {
+ if (ntree == nullptr) {
return ok;
}
@@ -3435,11 +3480,11 @@ bool nodeSetActiveID(bNodeTree *ntree, short idtype, ID *id)
/* update all groups linked from here
* if active ID node has been found already,
- * just pass NULL so other matching nodes are deactivated.
+ * just pass null so other matching nodes are deactivated.
*/
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
if (node->type == NODE_GROUP) {
- ok |= nodeSetActiveID((bNodeTree *)node->id, idtype, (ok == false ? id : NULL));
+ ok |= nodeSetActiveID((bNodeTree *)node->id, idtype, (ok == false ? id : nullptr));
}
}
@@ -3449,7 +3494,7 @@ bool nodeSetActiveID(bNodeTree *ntree, short idtype, ID *id)
/* two active flags, ID nodes have special flag for buttons display */
void nodeClearActiveID(bNodeTree *ntree, short idtype)
{
- if (ntree == NULL) {
+ if (ntree == nullptr) {
return;
}
@@ -3480,7 +3525,7 @@ void nodeSetSelected(bNode *node, bool select)
void nodeClearActive(bNodeTree *ntree)
{
- if (ntree == NULL) {
+ if (ntree == nullptr) {
return;
}
@@ -3515,7 +3560,7 @@ void nodeSetActive(bNodeTree *ntree, bNode *node)
}
}
-int nodeSocketIsHidden(bNodeSocket *sock)
+int nodeSocketIsHidden(const bNodeSocket *sock)
{
return ((sock->flag & (SOCK_HIDDEN | SOCK_UNAVAIL)) != 0);
}
@@ -3530,10 +3575,13 @@ void nodeSetSocketAvailability(bNodeSocket *sock, bool is_available)
}
}
-int nodeSocketLinkLimit(struct bNodeSocket *sock)
+int nodeSocketLinkLimit(const bNodeSocket *sock)
{
bNodeSocketType *stype = sock->typeinfo;
- if (stype != NULL && stype->use_link_limits_of_type) {
+ if (sock->flag & SOCK_MULTI_INPUT) {
+ return 4095;
+ }
+ if (stype != nullptr && stype->use_link_limits_of_type) {
int limit = (sock->in_out == SOCK_IN) ? stype->input_link_limit : stype->output_link_limit;
return limit;
}
@@ -3553,15 +3601,15 @@ int nodeSocketLinkLimit(struct bNodeSocket *sock)
* Currently its only used for ID's, but nodes may one day
* reference other pointers which need validation.
*/
-typedef struct bNodeClipboardExtraInfo {
+struct bNodeClipboardExtraInfo {
struct bNodeClipboardExtraInfo *next, *prev;
ID *id;
char id_name[MAX_ID_NAME];
char library_name[FILE_MAX];
-} bNodeClipboardExtraInfo;
+};
#endif /* USE_NODE_CB_VALIDATE */
-typedef struct bNodeClipboard {
+struct bNodeClipboard {
ListBase nodes;
#ifdef USE_NODE_CB_VALIDATE
@@ -3570,11 +3618,11 @@ typedef struct bNodeClipboard {
ListBase links;
int type;
-} bNodeClipboard;
+};
-static bNodeClipboard node_clipboard = {{NULL}};
+static bNodeClipboard node_clipboard = {{nullptr}};
-void BKE_node_clipboard_init(struct bNodeTree *ntree)
+void BKE_node_clipboard_init(const struct bNodeTree *ntree)
{
node_clipboard.type = ntree->type;
}
@@ -3582,12 +3630,12 @@ void BKE_node_clipboard_init(struct bNodeTree *ntree)
void BKE_node_clipboard_clear(void)
{
LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &node_clipboard.links) {
- nodeRemLink(NULL, link);
+ nodeRemLink(nullptr, link);
}
BLI_listbase_clear(&node_clipboard.links);
LISTBASE_FOREACH_MUTABLE (bNode *, node, &node_clipboard.nodes) {
- node_free_node(NULL, node);
+ node_free_node(nullptr, node);
}
BLI_listbase_clear(&node_clipboard.nodes);
@@ -3609,8 +3657,10 @@ bool BKE_node_clipboard_validate(void)
BLI_assert(BLI_listbase_count(&node_clipboard.nodes) ==
BLI_listbase_count(&node_clipboard.nodes_extra_info));
- for (node = node_clipboard.nodes.first, node_info = node_clipboard.nodes_extra_info.first; node;
- node = node->next, node_info = node_info->next) {
+ for (node = (bNode *)node_clipboard.nodes.first,
+ node_info = (bNodeClipboardExtraInfo *)node_clipboard.nodes_extra_info.first;
+ node;
+ node = (bNode *)node->next, node_info = (bNodeClipboardExtraInfo *)node_info->next) {
/* validate the node against the stored node info */
/* re-assign each loop since we may clear,
@@ -3621,13 +3671,13 @@ bool BKE_node_clipboard_validate(void)
if (node->id) {
/* We want to search into current blend file, so using G_MAIN is valid here too. */
ListBase *lb = which_libbase(G_MAIN, GS(node_info->id_name));
- BLI_assert(lb != NULL);
+ BLI_assert(lb != nullptr);
if (BLI_findindex(lb, node_info->id) == -1) {
- /* may assign NULL */
- node->id = BLI_findstring(lb, node_info->id_name + 2, offsetof(ID, name) + 2);
+ /* May assign null. */
+ node->id = (ID *)BLI_findstring(lb, node_info->id_name + 2, offsetof(ID, name) + 2);
- if (node->id == NULL) {
+ if (node->id == nullptr) {
ok = false;
}
}
@@ -3642,8 +3692,8 @@ void BKE_node_clipboard_add_node(bNode *node)
{
#ifdef USE_NODE_CB_VALIDATE
/* add extra info */
- bNodeClipboardExtraInfo *node_info = MEM_mallocN(sizeof(bNodeClipboardExtraInfo),
- "bNodeClipboardExtraInfo");
+ bNodeClipboardExtraInfo *node_info = (bNodeClipboardExtraInfo *)MEM_mallocN(
+ sizeof(bNodeClipboardExtraInfo), __func__);
node_info->id = node->id;
if (node->id) {
@@ -3718,11 +3768,11 @@ static bNodeInstanceKey node_hash_int_str(bNodeInstanceKey hash, const char *str
return hash;
}
-bNodeInstanceKey BKE_node_instance_key(bNodeInstanceKey parent_key, bNodeTree *ntree, bNode *node)
+bNodeInstanceKey BKE_node_instance_key(bNodeInstanceKey parent_key,
+ const bNodeTree *ntree,
+ const bNode *node)
{
- bNodeInstanceKey key;
-
- key = node_hash_int_str(parent_key, ntree->id.name + 2);
+ bNodeInstanceKey key = node_hash_int_str(parent_key, ntree->id.name + 2);
if (node) {
key = node_hash_int_str(key, node->name);
@@ -3746,7 +3796,7 @@ static bool node_instance_hash_key_cmp(const void *a, const void *b)
bNodeInstanceHash *BKE_node_instance_hash_new(const char *info)
{
- bNodeInstanceHash *hash = MEM_mallocN(sizeof(bNodeInstanceHash), info);
+ bNodeInstanceHash *hash = (bNodeInstanceHash *)MEM_mallocN(sizeof(bNodeInstanceHash), info);
hash->ghash = BLI_ghash_new(
node_instance_hash_key, node_instance_hash_key_cmp, "node instance hash ghash");
return hash;
@@ -3754,13 +3804,13 @@ bNodeInstanceHash *BKE_node_instance_hash_new(const char *info)
void BKE_node_instance_hash_free(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp)
{
- BLI_ghash_free(hash->ghash, NULL, (GHashValFreeFP)valfreefp);
+ BLI_ghash_free(hash->ghash, nullptr, (GHashValFreeFP)valfreefp);
MEM_freeN(hash);
}
void BKE_node_instance_hash_insert(bNodeInstanceHash *hash, bNodeInstanceKey key, void *value)
{
- bNodeInstanceHashEntry *entry = value;
+ bNodeInstanceHashEntry *entry = (bNodeInstanceHashEntry *)value;
entry->key = key;
entry->tag = 0;
BLI_ghash_insert(hash->ghash, &entry->key, value);
@@ -3775,17 +3825,17 @@ int BKE_node_instance_hash_remove(bNodeInstanceHash *hash,
bNodeInstanceKey key,
bNodeInstanceValueFP valfreefp)
{
- return BLI_ghash_remove(hash->ghash, &key, NULL, (GHashValFreeFP)valfreefp);
+ return BLI_ghash_remove(hash->ghash, &key, nullptr, (GHashValFreeFP)valfreefp);
}
void BKE_node_instance_hash_clear(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp)
{
- BLI_ghash_clear(hash->ghash, NULL, (GHashValFreeFP)valfreefp);
+ BLI_ghash_clear(hash->ghash, nullptr, (GHashValFreeFP)valfreefp);
}
void *BKE_node_instance_hash_pop(bNodeInstanceHash *hash, bNodeInstanceKey key)
{
- return BLI_ghash_popkey(hash->ghash, &key, NULL);
+ return BLI_ghash_popkey(hash->ghash, &key, nullptr);
}
int BKE_node_instance_hash_haskey(bNodeInstanceHash *hash, bNodeInstanceKey key)
@@ -3803,7 +3853,8 @@ void BKE_node_instance_hash_clear_tags(bNodeInstanceHash *hash)
bNodeInstanceHashIterator iter;
NODE_INSTANCE_HASH_ITER (iter, hash) {
- bNodeInstanceHashEntry *value = BKE_node_instance_hash_iterator_get_value(&iter);
+ bNodeInstanceHashEntry *value = (bNodeInstanceHashEntry *)
+ BKE_node_instance_hash_iterator_get_value(&iter);
value->tag = 0;
}
@@ -3811,13 +3862,14 @@ void BKE_node_instance_hash_clear_tags(bNodeInstanceHash *hash)
void BKE_node_instance_hash_tag(bNodeInstanceHash *UNUSED(hash), void *value)
{
- bNodeInstanceHashEntry *entry = value;
+ bNodeInstanceHashEntry *entry = (bNodeInstanceHashEntry *)value;
entry->tag = 1;
}
bool BKE_node_instance_hash_tag_key(bNodeInstanceHash *hash, bNodeInstanceKey key)
{
- bNodeInstanceHashEntry *entry = BKE_node_instance_hash_lookup(hash, key);
+ bNodeInstanceHashEntry *entry = (bNodeInstanceHashEntry *)BKE_node_instance_hash_lookup(hash,
+ key);
if (entry) {
entry->tag = 1;
@@ -3833,13 +3885,14 @@ void BKE_node_instance_hash_remove_untagged(bNodeInstanceHash *hash,
/* NOTE: Hash must not be mutated during iterating!
* Store tagged entries in a separate list and remove items afterward.
*/
- bNodeInstanceKey *untagged = MEM_mallocN(sizeof(bNodeInstanceKey) *
- BKE_node_instance_hash_size(hash),
- "temporary node instance key list");
+ bNodeInstanceKey *untagged = (bNodeInstanceKey *)MEM_mallocN(
+ sizeof(bNodeInstanceKey) * BKE_node_instance_hash_size(hash),
+ "temporary node instance key list");
bNodeInstanceHashIterator iter;
int num_untagged = 0;
NODE_INSTANCE_HASH_ITER (iter, hash) {
- bNodeInstanceHashEntry *value = BKE_node_instance_hash_iterator_get_value(&iter);
+ bNodeInstanceHashEntry *value = (bNodeInstanceHashEntry *)
+ BKE_node_instance_hash_iterator_get_value(&iter);
if (!value->tag) {
untagged[num_untagged++] = BKE_node_instance_hash_iterator_get_key(&iter);
@@ -3893,22 +3946,23 @@ static int node_get_deplist_recurs(bNodeTree *ntree, bNode *node, bNode ***nsort
return level;
}
-void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes)
+void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***r_deplist, int *r_deplist_len)
{
- *totnodes = 0;
+ *r_deplist_len = 0;
/* first clear data */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
node->done = false;
- (*totnodes)++;
+ (*r_deplist_len)++;
}
- if (*totnodes == 0) {
- *deplist = NULL;
+ if (*r_deplist_len == 0) {
+ *r_deplist = nullptr;
return;
}
bNode **nsort;
- nsort = *deplist = MEM_callocN((*totnodes) * sizeof(bNode *), "sorted node array");
+ nsort = *r_deplist = (bNode **)MEM_callocN((*r_deplist_len) * sizeof(bNode *),
+ "sorted node array");
/* recursive check */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
@@ -3929,7 +3983,7 @@ static void ntree_update_node_level(bNodeTree *ntree)
/* recursive check */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
if (node->done == 0) {
- node->level = node_get_deplist_recurs(ntree, node, NULL);
+ node->level = node_get_deplist_recurs(ntree, node, nullptr);
}
}
}
@@ -3957,7 +4011,7 @@ static void ntree_update_link_pointers(bNodeTree *ntree)
/* first clear data */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
- sock->link = NULL;
+ sock->link = nullptr;
}
}
@@ -3996,7 +4050,7 @@ void ntreeUpdateAllNew(Main *main)
}
}
- ntreeUpdateTree(NULL, ntree);
+ ntreeUpdateTree(nullptr, ntree);
}
}
FOREACH_NODETREE_END;
@@ -4004,7 +4058,7 @@ void ntreeUpdateAllNew(Main *main)
void ntreeUpdateAllUsers(Main *main, ID *id)
{
- if (id == NULL) {
+ if (id == nullptr) {
return;
}
@@ -4023,7 +4077,7 @@ void ntreeUpdateAllUsers(Main *main, ID *id)
}
if (need_update) {
- ntreeUpdateTree(NULL, ntree);
+ ntreeUpdateTree(nullptr, ntree);
}
}
FOREACH_NODETREE_END;
@@ -4133,7 +4187,7 @@ bool nodeUpdateID(bNodeTree *ntree, ID *id)
{
bool changed = false;
- if (ELEM(NULL, id, ntree)) {
+ if (ELEM(nullptr, id, ntree)) {
return changed;
}
@@ -4237,7 +4291,7 @@ void node_type_base(bNodeType *ntype, int type, const char *name, short nclass,
case ID: \
BLI_strncpy(ntype->idname, #Category #StructName, sizeof(ntype->idname)); \
ntype->rna_ext.srna = RNA_struct_find(#Category #StructName); \
- BLI_assert(ntype->rna_ext.srna != NULL); \
+ BLI_assert(ntype->rna_ext.srna != nullptr); \
RNA_struct_blender_type_set(ntype->rna_ext.srna, ntype); \
break;
@@ -4271,15 +4325,16 @@ void node_type_base_custom(
node_type_base_defaults(ntype);
}
+struct SocketTemplateIdentifierCallbackData {
+ bNodeSocketTemplate *list;
+ bNodeSocketTemplate *ntemp;
+};
+
static bool unique_socket_template_identifier_check(void *arg, const char *name)
{
- bNodeSocketTemplate *ntemp;
- struct {
- bNodeSocketTemplate *list;
- bNodeSocketTemplate *ntemp;
- } *data = arg;
+ SocketTemplateIdentifierCallbackData *data = (SocketTemplateIdentifierCallbackData *)arg;
- for (ntemp = data->list; ntemp->type >= 0; ntemp++) {
+ for (bNodeSocketTemplate *ntemp = data->list; ntemp->type >= 0; ntemp++) {
if (ntemp != data->ntemp) {
if (STREQ(ntemp->identifier, name)) {
return true;
@@ -4295,10 +4350,7 @@ static void unique_socket_template_identifier(bNodeSocketTemplate *list,
const char defname[],
char delim)
{
- struct {
- bNodeSocketTemplate *list;
- bNodeSocketTemplate *ntemp;
- } data;
+ SocketTemplateIdentifierCallbackData data;
data.list = list;
data.ntemp = ntemp;
@@ -4448,7 +4500,7 @@ static bool node_undefined_poll(bNodeType *UNUSED(ntype), bNodeTree *UNUSED(node
}
/* register fallback types used for undefined tree, nodes, sockets */
-static void register_undefined_types(void)
+static void register_undefined_types()
{
/* Note: these types are not registered in the type hashes,
* they are just used as placeholders in case the actual types are not registered.
@@ -4473,7 +4525,7 @@ static void register_undefined_types(void)
NodeSocketTypeUndefined.output_link_limit = 0xFFF;
}
-static void registerCompositNodes(void)
+static void registerCompositNodes()
{
register_node_type_cmp_group();
@@ -4577,7 +4629,7 @@ static void registerCompositNodes(void)
register_node_type_cmp_cornerpin();
}
-static void registerShaderNodes(void)
+static void registerShaderNodes()
{
register_node_type_sh_group();
@@ -4674,7 +4726,7 @@ static void registerShaderNodes(void)
register_node_type_sh_tex_white_noise();
}
-static void registerTextureNodes(void)
+static void registerTextureNodes()
{
register_node_type_tex_group();
@@ -4724,43 +4776,53 @@ static void registerTextureNodes(void)
register_node_type_tex_proc_distnoise();
}
-static void registerGeometryNodes(void)
+static void registerGeometryNodes()
{
register_node_type_geo_group();
+ register_node_type_geo_align_rotation_to_vector();
+ register_node_type_geo_attribute_color_ramp();
+ register_node_type_geo_attribute_combine_xyz();
register_node_type_geo_attribute_compare();
register_node_type_geo_attribute_fill();
+ register_node_type_geo_attribute_math();
+ register_node_type_geo_attribute_mix();
+ register_node_type_geo_attribute_proximity();
+ register_node_type_geo_attribute_randomize();
+ register_node_type_geo_attribute_separate_xyz();
register_node_type_geo_attribute_vector_math();
- register_node_type_geo_triangulate();
- register_node_type_geo_edge_split();
- register_node_type_geo_transform();
- register_node_type_geo_subdivision_surface();
register_node_type_geo_boolean();
+ register_node_type_geo_collection_info();
+ register_node_type_geo_edge_split();
+ register_node_type_geo_is_viewport();
+ register_node_type_geo_join_geometry();
+ register_node_type_geo_object_info();
register_node_type_geo_point_distribute();
register_node_type_geo_point_instance();
- register_node_type_geo_point_separate();
+ register_node_type_geo_point_rotate();
register_node_type_geo_point_scale();
+ register_node_type_geo_point_separate();
register_node_type_geo_point_translate();
- register_node_type_geo_object_info();
- register_node_type_geo_attribute_randomize();
- register_node_type_geo_attribute_math();
- register_node_type_geo_join_geometry();
- register_node_type_geo_attribute_mix();
- register_node_type_geo_attribute_color_ramp();
- register_node_type_geo_point_rotate();
- register_node_type_geo_align_rotation_to_vector();
+ register_node_type_geo_points_to_volume();
+ register_node_type_geo_sample_texture();
+ register_node_type_geo_subdivision_surface();
+ register_node_type_geo_subdivision_surface_simple();
+ register_node_type_geo_transform();
+ register_node_type_geo_triangulate();
+ register_node_type_geo_volume_to_mesh();
}
-static void registerFunctionNodes(void)
+static void registerFunctionNodes()
{
register_node_type_fn_boolean_math();
+ register_node_type_fn_combine_strings();
register_node_type_fn_float_compare();
- register_node_type_fn_switch();
register_node_type_fn_group_instance_id();
- register_node_type_fn_combine_strings();
+ register_node_type_fn_input_string();
+ register_node_type_fn_input_vector();
register_node_type_fn_object_transforms();
register_node_type_fn_random_float();
- register_node_type_fn_input_vector();
+ register_node_type_fn_switch();
}
void BKE_node_system_init(void)
@@ -4800,8 +4862,8 @@ void BKE_node_system_exit(void)
}
NODE_TYPES_END;
- BLI_ghash_free(nodetypes_hash, NULL, node_free_type);
- nodetypes_hash = NULL;
+ BLI_ghash_free(nodetypes_hash, nullptr, node_free_type);
+ nodetypes_hash = nullptr;
}
if (nodesockettypes_hash) {
@@ -4815,8 +4877,8 @@ void BKE_node_system_exit(void)
}
NODE_SOCKET_TYPES_END;
- BLI_ghash_free(nodesockettypes_hash, NULL, node_free_socket_type);
- nodesockettypes_hash = NULL;
+ BLI_ghash_free(nodesockettypes_hash, nullptr, node_free_socket_type);
+ nodesockettypes_hash = nullptr;
}
if (nodetreetypes_hash) {
@@ -4827,8 +4889,8 @@ void BKE_node_system_exit(void)
}
NODE_TREE_TYPES_END;
- BLI_ghash_free(nodetreetypes_hash, NULL, ntree_free_type);
- nodetreetypes_hash = NULL;
+ BLI_ghash_free(nodetreetypes_hash, nullptr, ntree_free_type);
+ nodetreetypes_hash = nullptr;
}
}
@@ -4837,58 +4899,58 @@ void BKE_node_system_exit(void)
void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain)
{
- ntreeiter->ngroup = bmain->nodetrees.first;
- ntreeiter->scene = bmain->scenes.first;
- ntreeiter->mat = bmain->materials.first;
- ntreeiter->tex = bmain->textures.first;
- ntreeiter->light = bmain->lights.first;
- ntreeiter->world = bmain->worlds.first;
- ntreeiter->linestyle = bmain->linestyles.first;
- ntreeiter->simulation = bmain->simulations.first;
+ ntreeiter->ngroup = (bNodeTree *)bmain->nodetrees.first;
+ ntreeiter->scene = (Scene *)bmain->scenes.first;
+ ntreeiter->mat = (Material *)bmain->materials.first;
+ ntreeiter->tex = (Tex *)bmain->textures.first;
+ ntreeiter->light = (Light *)bmain->lights.first;
+ ntreeiter->world = (World *)bmain->worlds.first;
+ ntreeiter->linestyle = (FreestyleLineStyle *)bmain->linestyles.first;
+ ntreeiter->simulation = (Simulation *)bmain->simulations.first;
}
bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
bNodeTree **r_nodetree,
struct ID **r_id)
{
if (ntreeiter->ngroup) {
- *r_nodetree = ntreeiter->ngroup;
+ *r_nodetree = (bNodeTree *)ntreeiter->ngroup;
*r_id = (ID *)ntreeiter->ngroup;
- ntreeiter->ngroup = ntreeiter->ngroup->id.next;
+ ntreeiter->ngroup = (bNodeTree *)ntreeiter->ngroup->id.next;
}
else if (ntreeiter->scene) {
- *r_nodetree = ntreeiter->scene->nodetree;
+ *r_nodetree = (bNodeTree *)ntreeiter->scene->nodetree;
*r_id = (ID *)ntreeiter->scene;
- ntreeiter->scene = ntreeiter->scene->id.next;
+ ntreeiter->scene = (Scene *)ntreeiter->scene->id.next;
}
else if (ntreeiter->mat) {
- *r_nodetree = ntreeiter->mat->nodetree;
+ *r_nodetree = (bNodeTree *)ntreeiter->mat->nodetree;
*r_id = (ID *)ntreeiter->mat;
- ntreeiter->mat = ntreeiter->mat->id.next;
+ ntreeiter->mat = (Material *)ntreeiter->mat->id.next;
}
else if (ntreeiter->tex) {
- *r_nodetree = ntreeiter->tex->nodetree;
+ *r_nodetree = (bNodeTree *)ntreeiter->tex->nodetree;
*r_id = (ID *)ntreeiter->tex;
- ntreeiter->tex = ntreeiter->tex->id.next;
+ ntreeiter->tex = (Tex *)ntreeiter->tex->id.next;
}
else if (ntreeiter->light) {
- *r_nodetree = ntreeiter->light->nodetree;
+ *r_nodetree = (bNodeTree *)ntreeiter->light->nodetree;
*r_id = (ID *)ntreeiter->light;
- ntreeiter->light = ntreeiter->light->id.next;
+ ntreeiter->light = (Light *)ntreeiter->light->id.next;
}
else if (ntreeiter->world) {
- *r_nodetree = ntreeiter->world->nodetree;
+ *r_nodetree = (bNodeTree *)ntreeiter->world->nodetree;
*r_id = (ID *)ntreeiter->world;
- ntreeiter->world = ntreeiter->world->id.next;
+ ntreeiter->world = (World *)ntreeiter->world->id.next;
}
else if (ntreeiter->linestyle) {
- *r_nodetree = ntreeiter->linestyle->nodetree;
+ *r_nodetree = (bNodeTree *)ntreeiter->linestyle->nodetree;
*r_id = (ID *)ntreeiter->linestyle;
- ntreeiter->linestyle = ntreeiter->linestyle->id.next;
+ ntreeiter->linestyle = (FreestyleLineStyle *)ntreeiter->linestyle->id.next;
}
else if (ntreeiter->simulation) {
- *r_nodetree = ntreeiter->simulation->nodetree;
+ *r_nodetree = (bNodeTree *)ntreeiter->simulation->nodetree;
*r_id = (ID *)ntreeiter->simulation;
- ntreeiter->simulation = ntreeiter->simulation->id.next;
+ ntreeiter->simulation = (Simulation *)ntreeiter->simulation->id.next;
}
else {
return false;
@@ -4914,10 +4976,3 @@ void BKE_nodetree_remove_layer_n(bNodeTree *ntree, Scene *scene, const int layer
}
}
}
-
-void BKE_nodetree_shading_params_eval(struct Depsgraph *depsgraph,
- bNodeTree *ntree_dst,
- const bNodeTree *ntree_src)
-{
- DEG_debug_print_eval(depsgraph, __func__, ntree_src->id.name, ntree_dst);
-}
diff --git a/source/blender/blenkernel/intern/node_ui_storage.cc b/source/blender/blenkernel/intern/node_ui_storage.cc
new file mode 100644
index 00000000000..7bf8895262d
--- /dev/null
+++ b/source/blender/blenkernel/intern/node_ui_storage.cc
@@ -0,0 +1,112 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "CLG_log.h"
+
+#include "BLI_map.hh"
+#include "BLI_string_ref.hh"
+#include "BLI_vector.hh"
+
+#include "DNA_node_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_node_ui_storage.hh"
+
+static CLG_LogRef LOG = {"bke.node_ui_storage"};
+
+using blender::Map;
+using blender::StringRef;
+using blender::Vector;
+
+static void ui_storage_ensure(bNodeTree &ntree)
+{
+ if (ntree.ui_storage == nullptr) {
+ ntree.ui_storage = new NodeTreeUIStorage();
+ }
+}
+
+/**
+ * Removes only the UI data associated with a particular evaluation context. The same node tree
+ * can be used for execution in multiple places, but the entire UI storage can't be removed when
+ * one execution starts, or all of the data associated with the node tree would be lost.
+ */
+void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree,
+ const NodeTreeEvaluationContext &context)
+{
+ NodeTreeUIStorage *ui_storage = ntree.ui_storage;
+ if (ui_storage != nullptr) {
+ ui_storage->context_map.remove(context);
+ }
+}
+
+static void node_error_message_log(bNodeTree &ntree,
+ const bNode &node,
+ const StringRef message,
+ const NodeWarningType type)
+{
+ switch (type) {
+ case NodeWarningType::Error:
+ CLOG_ERROR(&LOG,
+ "Node Tree: \"%s\", Node: \"%s\", %s",
+ ntree.id.name + 2,
+ node.name,
+ message.data());
+ break;
+ case NodeWarningType::Warning:
+ CLOG_WARN(&LOG,
+ "Node Tree: \"%s\", Node: \"%s\", %s",
+ ntree.id.name + 2,
+ node.name,
+ message.data());
+ break;
+ case NodeWarningType::Info:
+ CLOG_INFO(&LOG,
+ 2,
+ "Node Tree: \"%s\", Node: \"%s\", %s",
+ ntree.id.name + 2,
+ node.name,
+ message.data());
+ break;
+ }
+}
+
+static NodeUIStorage &find_node_ui_storage(bNodeTree &ntree,
+ const NodeTreeEvaluationContext &context,
+ const bNode &node)
+{
+ ui_storage_ensure(ntree);
+ NodeTreeUIStorage &ui_storage = *ntree.ui_storage;
+
+ Map<std::string, NodeUIStorage> &node_tree_ui_storage =
+ ui_storage.context_map.lookup_or_add_default(context);
+
+ NodeUIStorage &node_ui_storage = node_tree_ui_storage.lookup_or_add_default_as(
+ StringRef(node.name));
+
+ return node_ui_storage;
+}
+
+void BKE_nodetree_error_message_add(bNodeTree &ntree,
+ const NodeTreeEvaluationContext &context,
+ const bNode &node,
+ const NodeWarningType type,
+ std::string message)
+{
+ node_error_message_log(ntree, node, message, type);
+
+ NodeUIStorage &node_ui_storage = find_node_ui_storage(ntree, context, node);
+ node_ui_storage.warnings.append({type, std::move(message)});
+}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 70af46569a8..04071282a52 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1118,6 +1118,20 @@ static void object_blend_read_expand(BlendExpander *expander, ID *id)
}
}
+static void object_lib_override_apply_post(ID *id_dst, ID *UNUSED(id_src))
+{
+ Object *object = (Object *)id_dst;
+
+ ListBase pidlist;
+ BKE_ptcache_ids_from_object(&pidlist, object, NULL, 0);
+ LISTBASE_FOREACH (PTCacheID *, pid, &pidlist) {
+ LISTBASE_FOREACH (PointCache *, point_cache, pid->ptcaches) {
+ point_cache->flag |= PTCACHE_FLAG_INFO_DIRTY;
+ }
+ }
+ BLI_freelistN(&pidlist);
+}
+
IDTypeInfo IDType_ID_OB = {
.id_code = ID_OB,
.id_filter = FILTER_ID_OB,
@@ -1141,6 +1155,8 @@ IDTypeInfo IDType_ID_OB = {
.blend_read_expand = object_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = object_lib_override_apply_post,
};
void BKE_object_workob_clear(Object *workob)
@@ -1506,11 +1522,11 @@ bool BKE_object_copy_gpencil_modifier(struct Object *ob_dst, GpencilModifierData
/**
* Copy the whole stack of modifiers from one object into another.
*
- * \warning **Does not** clear modifier stack and related data (particle systems, softbody,
+ * \warning **Does not** clear modifier stack and related data (particle systems, soft-body,
* etc.) in `ob_dst`, if needed calling code must do it.
*
- * @param do_copy_all If true, even modifiers that should not suport copying (like Hook one) will
- * be duplicated.
+ * \param do_copy_all: If true, even modifiers that should not support copying (like Hook one)
+ * will be duplicated.
*/
bool BKE_object_modifier_stack_copy(Object *ob_dst,
const Object *ob_src,
@@ -1726,6 +1742,7 @@ void BKE_object_free_derived_caches(Object *ob)
}
BKE_object_to_mesh_clear(ob);
+ BKE_object_to_curve_clear(ob);
BKE_object_free_curve_cache(ob);
/* Clear grease pencil data. */
@@ -3528,9 +3545,6 @@ static void solve_parenting(
}
}
-/**
- * \note scene is the active scene while actual_scene is the scene the object resides in.
- */
static void object_where_is_calc_ex(Depsgraph *depsgraph,
Scene *scene,
Object *ob,
@@ -5044,6 +5058,7 @@ void BKE_object_runtime_reset_on_copy(Object *object, const int UNUSED(flag))
runtime->mesh_deform_eval = NULL;
runtime->curve_cache = NULL;
runtime->object_as_temp_mesh = NULL;
+ runtime->object_as_temp_curve = NULL;
runtime->geometry_set_eval = NULL;
}
@@ -5602,6 +5617,24 @@ void BKE_object_to_mesh_clear(Object *object)
object->runtime.object_as_temp_mesh = NULL;
}
+Curve *BKE_object_to_curve(Object *object, Depsgraph *depsgraph, bool apply_modifiers)
+{
+ BKE_object_to_curve_clear(object);
+
+ Curve *curve = BKE_curve_new_from_object(object, depsgraph, apply_modifiers);
+ object->runtime.object_as_temp_curve = curve;
+ return curve;
+}
+
+void BKE_object_to_curve_clear(Object *object)
+{
+ if (object->runtime.object_as_temp_curve == NULL) {
+ return;
+ }
+ BKE_id_free(NULL, object->runtime.object_as_temp_curve);
+ object->runtime.object_as_temp_curve = NULL;
+}
+
void BKE_object_check_uuids_unique_and_report(const Object *object)
{
BKE_pose_check_uuids_unique_and_report(object->pose);
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index 1d79f871fa2..69442b7646c 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -225,7 +225,7 @@ void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *o
case OB_GPENCIL: {
BKE_gpencil_prepare_eval_data(depsgraph, scene, ob);
BKE_gpencil_modifiers_calc(depsgraph, scene, ob);
- BKE_gpencil_update_layer_parent(depsgraph, ob);
+ BKE_gpencil_update_layer_transforms(depsgraph, ob);
break;
}
case OB_HAIR:
diff --git a/source/blender/blenkernel/intern/ocean.c b/source/blender/blenkernel/intern/ocean.c
index 1d62a1cce2a..d2f4d0702ed 100644
--- a/source/blender/blenkernel/intern/ocean.c
+++ b/source/blender/blenkernel/intern/ocean.c
@@ -140,7 +140,7 @@ static void compute_eigenstuff(struct OceanResult *ocr, float jxx, float jzz, fl
* instead of Complex.h
* in fftw.h "fftw_complex" typedefed as double[2]
* below you can see functions are needed to work with such complex numbers.
- * */
+ */
static void init_complex(fftw_complex cmpl, float real, float image)
{
cmpl[0] = real;
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 7c65f118cf4..3c770a85b2a 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -127,7 +127,7 @@ static void palette_blend_read_data(BlendDataReader *reader, ID *id)
static void palette_undo_preserve(BlendLibReader *UNUSED(reader), ID *id_new, ID *id_old)
{
- /* Whole Palette is preserved accross undo's, and it has no extra pointer, simple. */
+ /* Whole Palette is preserved across undo-steps, and it has no extra pointer, simple. */
/* Note: We do not care about potential internal references to self here, Palette has none. */
/* Note: We do not swap IDProperties, as dealing with potential ID pointers in those would be
* fairly delicate. */
@@ -158,6 +158,8 @@ IDTypeInfo IDType_ID_PAL = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = palette_undo_preserve,
+
+ .lib_override_apply_post = NULL,
};
static void paint_curve_copy_data(Main *UNUSED(bmain),
@@ -221,6 +223,8 @@ IDTypeInfo IDType_ID_PC = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
const char PAINT_CURSOR_SCULPT[3] = {255, 100, 100};
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 335913c9b8e..21d1e070389 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -511,6 +511,8 @@ IDTypeInfo IDType_ID_PA = {
.blend_read_expand = particle_settings_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
unsigned int PSYS_FRAND_SEED_OFFSET[PSYS_FRAND_COUNT];
@@ -2302,7 +2304,7 @@ void psys_particle_on_emitter(ParticleSystemModifierData *psmd,
}
return;
}
- /* we cant use the num_dmcache */
+ /* we can't use the num_dmcache */
psys_particle_on_dm(
psmd->mesh_final, from, index, index_dmcache, fuv, foffset, vec, nor, utan, vtan, orco);
}
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 55d4043f96c..c727a144c87 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -1400,8 +1400,9 @@ void psys_update_particle_tree(ParticleSystem *psys, float cfra)
static void psys_update_effectors(ParticleSimulationData *sim)
{
BKE_effectors_free(sim->psys->effectors);
+ bool use_rotation = (sim->psys->part->flag & PART_ROT_DYN) != 0;
sim->psys->effectors = BKE_effectors_create(
- sim->depsgraph, sim->ob, sim->psys, sim->psys->part->effector_weights);
+ sim->depsgraph, sim->ob, sim->psys, sim->psys->part->effector_weights, use_rotation);
precalc_guides(sim, sim->psys->effectors);
}
diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc
index 7bd14e80333..b9ff2a1179d 100644
--- a/source/blender/blenkernel/intern/pointcloud.cc
+++ b/source/blender/blenkernel/intern/pointcloud.cc
@@ -190,6 +190,8 @@ IDTypeInfo IDType_ID_PT = {
/* blend_read_expand */ pointcloud_blend_read_expand,
/* blend_read_undo_preserve */ nullptr,
+
+ /* lib_override_apply_post */ nullptr,
};
static void pointcloud_random(PointCloud *pointcloud)
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 586aeb274a5..19078446009 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1720,7 +1720,7 @@ static void rigidbody_update_sim_ob(
ListBase *effectors;
/* get effectors present in the group specified by effector_weights */
- effectors = BKE_effectors_create(depsgraph, ob, NULL, effector_weights);
+ effectors = BKE_effectors_create(depsgraph, ob, NULL, effector_weights, false);
if (effectors) {
float eff_force[3] = {0.0f, 0.0f, 0.0f};
float eff_loc[3], eff_vel[3];
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index b19b0e684b2..c7279dbc815 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -167,8 +167,6 @@ static void scene_init_data(ID *id)
&gp_primitive_curve->clipr,
CURVE_PRESET_BELL,
CURVEMAP_SLOPE_POSITIVE);
- /* Grease pencil interpolate. */
- scene->toolsettings->gp_interpolate.step = 1;
scene->unit.system = USER_UNIT_METRIC;
scene->unit.scale_length = 1.0f;
@@ -475,7 +473,7 @@ static void scene_foreach_rigidbodyworldSceneLooper(struct RigidBodyWorld *UNUSE
/**
* This code is shared by both the regular `foreach_id` looper, and the code trying to restore or
- * preserve ID pointers like brushes across undoes.
+ * preserve ID pointers like brushes across undo-steps.
*/
typedef enum eSceneForeachUndoPreserveProcess {
/* Undo when preserving tool-settings from old scene, we also want to try to preserve that ID
@@ -1689,6 +1687,19 @@ static void scene_undo_preserve(BlendLibReader *reader, ID *id_new, ID *id_old)
}
}
+static void scene_lib_override_apply_post(ID *id_dst, ID *UNUSED(id_src))
+{
+ Scene *scene = (Scene *)id_dst;
+
+ if (scene->rigidbody_world != NULL) {
+ PTCacheID pid;
+ BKE_ptcache_id_from_rigidbody(&pid, NULL, scene->rigidbody_world);
+ LISTBASE_FOREACH (PointCache *, point_cache, pid.ptcaches) {
+ point_cache->flag |= PTCACHE_FLAG_INFO_DIRTY;
+ }
+ }
+}
+
IDTypeInfo IDType_ID_SCE = {
.id_code = ID_SCE,
.id_filter = FILTER_ID_SCE,
@@ -1714,6 +1725,8 @@ IDTypeInfo IDType_ID_SCE = {
.blend_read_expand = scene_blend_read_expand,
.blend_read_undo_preserve = scene_undo_preserve,
+
+ .lib_override_apply_post = scene_lib_override_apply_post,
};
const char *RE_engine_id_BLENDER_EEVEE = "BLENDER_EEVEE";
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 52c41c9fd05..80a83aecea8 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -315,6 +315,8 @@ IDTypeInfo IDType_ID_SCR = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* ************ Spacetype/regiontype handling ************** */
@@ -1599,8 +1601,7 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area)
BLO_read_list(reader, &snode->treepath);
snode->edittree = NULL;
- snode->iofsd = NULL;
- BLI_listbase_clear(&snode->linkdrag);
+ snode->runtime = NULL;
}
else if (sl->spacetype == SPACE_TEXT) {
SpaceText *st = (SpaceText *)sl;
diff --git a/source/blender/blenkernel/intern/simulation.cc b/source/blender/blenkernel/intern/simulation.cc
index 14e6ce63023..4e0a08455e6 100644
--- a/source/blender/blenkernel/intern/simulation.cc
+++ b/source/blender/blenkernel/intern/simulation.cc
@@ -173,6 +173,8 @@ IDTypeInfo IDType_ID_SIM = {
/* blend_read_expand */ simulation_blend_read_expand,
/* blend_read_undo_preserve */ nullptr,
+
+ /* lib_override_apply_post */ nullptr,
};
void *BKE_simulation_add(Main *bmain, const char *name)
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 736acd76dfd..de88e8a941c 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -1539,7 +1539,8 @@ static void sb_sfesf_threads_run(struct Depsgraph *depsgraph,
* or even be UI option sb->spawn_cf_threads_nopts */
int lowsprings = 100;
- ListBase *effectors = BKE_effectors_create(depsgraph, ob, NULL, ob->soft->effector_weights);
+ ListBase *effectors = BKE_effectors_create(
+ depsgraph, ob, NULL, ob->soft->effector_weights, false);
/* figure the number of threads while preventing pretty pointless threading overhead */
totthread = BKE_scene_num_threads(scene);
@@ -2300,7 +2301,7 @@ static void softbody_calc_forces(
}
/* after spring scan because it uses Effoctors too */
- ListBase *effectors = BKE_effectors_create(depsgraph, ob, NULL, sb->effector_weights);
+ ListBase *effectors = BKE_effectors_create(depsgraph, ob, NULL, sb->effector_weights, false);
if (do_deflector) {
float defforce[3];
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 78729fb9261..0c917434bd1 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -221,6 +221,8 @@ IDTypeInfo IDType_ID_SO = {
.blend_read_expand = sound_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
#ifdef WITH_AUDASPACE
diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c
index fabf0bb8971..9caeaf05e6a 100644
--- a/source/blender/blenkernel/intern/speaker.c
+++ b/source/blender/blenkernel/intern/speaker.c
@@ -114,6 +114,8 @@ IDTypeInfo IDType_ID_SPK = {
.blend_read_expand = speaker_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
void *BKE_speaker_add(Main *bmain, const char *name)
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 9ef2e818293..9bf215515f7 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -258,6 +258,8 @@ IDTypeInfo IDType_ID_TXT = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/** \} */
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 4c2e4a82acb..ce84bfcd95a 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -226,6 +226,8 @@ IDTypeInfo IDType_ID_TE = {
.blend_read_expand = texture_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* Utils for all IDs using those texture slots. */
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index e5f9d59270e..d124922acd1 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -587,15 +587,15 @@ MovieTrackingTrack *BKE_tracking_track_add(MovieTracking *tracking,
{
const MovieTrackingSettings *settings = &tracking->settings;
+ MovieTrackingTrack *track = BKE_tracking_track_add_empty(tracking, tracksbase);
+ MovieTrackingMarker marker;
+
const float half_pattern_px = settings->default_pattern_size / 2.0f;
const float half_search_px = settings->default_search_size / 2.0f;
const float pattern_size[2] = {half_pattern_px / width, half_pattern_px / height};
const float search_size[2] = {half_search_px / width, half_search_px / height};
- MovieTrackingTrack *track = BKE_tracking_track_add_empty(tracking, tracksbase);
-
- MovieTrackingMarker marker;
memset(&marker, 0, sizeof(marker));
marker.pos[0] = x;
marker.pos[1] = y;
@@ -665,6 +665,86 @@ void BKE_tracking_track_free(MovieTrackingTrack *track)
}
}
+/* Get frame numbers of the very first and last markers.
+ * There is no check on whether the marker is enabled or not. */
+void BKE_tracking_track_first_last_frame_get(const MovieTrackingTrack *track,
+ int *r_first_frame,
+ int *r_last_frame)
+{
+ BLI_assert(track->markersnr > 0);
+ const int last_marker_index = track->markersnr - 1;
+ *r_first_frame = track->markers[0].framenr;
+ *r_last_frame = track->markers[last_marker_index].framenr;
+}
+
+/* Find the minimum starting frame and maximum ending frame within given set of
+ * tracks.
+ */
+void BKE_tracking_tracks_first_last_frame_minmax(/*const*/ MovieTrackingTrack **tracks,
+ const int num_tracks,
+ int *r_first_frame,
+ int *r_last_frame)
+{
+ *r_first_frame = INT_MAX;
+ *r_last_frame = INT_MIN;
+ for (int i = 0; i < num_tracks; ++i) {
+ const struct MovieTrackingTrack *track = tracks[i];
+ int track_first_frame, track_last_frame;
+ BKE_tracking_track_first_last_frame_get(track, &track_first_frame, &track_last_frame);
+ *r_first_frame = min_ii(*r_first_frame, track_first_frame);
+ *r_last_frame = max_ii(*r_last_frame, track_last_frame);
+ }
+}
+
+int BKE_tracking_count_selected_tracks_in_list(const ListBase *tracks_list)
+{
+ int num_selected_tracks = 0;
+ LISTBASE_FOREACH (const MovieTrackingTrack *, track, tracks_list) {
+ if (TRACK_SELECTED(track)) {
+ ++num_selected_tracks;
+ }
+ }
+ return num_selected_tracks;
+}
+
+int BKE_tracking_count_selected_tracks_in_active_object(/*const*/ MovieTracking *tracking)
+{
+ ListBase *tracks_list = BKE_tracking_get_active_tracks(tracking);
+ return BKE_tracking_count_selected_tracks_in_list(tracks_list);
+}
+
+MovieTrackingTrack **BKE_tracking_selected_tracks_in_active_object(MovieTracking *tracking,
+ int *r_num_tracks)
+{
+ *r_num_tracks = 0;
+
+ ListBase *tracks_list = BKE_tracking_get_active_tracks(tracking);
+ if (tracks_list == NULL) {
+ return NULL;
+ }
+
+ /* Initialize input. */
+ const int num_selected_tracks = BKE_tracking_count_selected_tracks_in_active_object(tracking);
+ if (num_selected_tracks == 0) {
+ return NULL;
+ }
+
+ MovieTrackingTrack **source_tracks = MEM_malloc_arrayN(
+ num_selected_tracks, sizeof(MovieTrackingTrack *), "selected tracks array");
+ int source_track_index = 0;
+ LISTBASE_FOREACH (MovieTrackingTrack *, track, tracks_list) {
+ if (!TRACK_SELECTED(track)) {
+ continue;
+ }
+ source_tracks[source_track_index] = track;
+ ++source_track_index;
+ }
+
+ *r_num_tracks = num_selected_tracks;
+
+ return source_tracks;
+}
+
/* Set flag for all specified track's areas.
*
* area - which part of marker should be selected. see TRACK_AREA_* constants.
@@ -918,6 +998,124 @@ void BKE_tracking_tracks_join(MovieTracking *tracking,
BKE_tracking_dopesheet_tag_update(tracking);
}
+static void accumulate_marker(MovieTrackingMarker *dst_marker,
+ const MovieTrackingMarker *src_marker)
+{
+ BLI_assert(dst_marker->framenr == src_marker->framenr);
+
+ if (src_marker->flag & MARKER_DISABLED) {
+ return;
+ }
+
+ add_v2_v2(dst_marker->pos, src_marker->pos);
+ for (int corner = 0; corner < 4; ++corner) {
+ add_v2_v2(dst_marker->pattern_corners[corner], src_marker->pattern_corners[corner]);
+ }
+ add_v2_v2(dst_marker->search_min, src_marker->search_min);
+ add_v2_v2(dst_marker->search_max, src_marker->search_max);
+
+ BLI_assert(is_finite_v2(src_marker->search_min));
+ BLI_assert(is_finite_v2(src_marker->search_max));
+
+ dst_marker->flag &= ~MARKER_DISABLED;
+ if ((src_marker->flag & MARKER_TRACKED) == 0) {
+ dst_marker->flag &= ~MARKER_TRACKED;
+ }
+}
+
+static void multiply_marker(MovieTrackingMarker *marker, const float multiplier)
+{
+ mul_v2_fl(marker->pos, multiplier);
+ for (int corner = 0; corner < 4; ++corner) {
+ mul_v2_fl(marker->pattern_corners[corner], multiplier);
+ }
+ mul_v2_fl(marker->search_min, multiplier);
+ mul_v2_fl(marker->search_max, multiplier);
+}
+
+/* Helper function for BKE_tracking_tracks_average which takes care of averaging fields of
+ * markers (position, patterns, ...). */
+static void tracking_average_markers(MovieTrackingTrack *dst_track,
+ /*const*/ MovieTrackingTrack **src_tracks,
+ const int num_src_tracks)
+{
+ /* Get global range of frames within which averaging would happen. */
+ int first_frame, last_frame;
+ BKE_tracking_tracks_first_last_frame_minmax(
+ src_tracks, num_src_tracks, &first_frame, &last_frame);
+ if (last_frame < first_frame) {
+ return;
+ }
+ const int num_frames = last_frame - first_frame + 1;
+
+ /* Allocate temporary array where averaging will happen into. */
+ MovieTrackingMarker *accumulator = MEM_calloc_arrayN(
+ num_frames, sizeof(MovieTrackingMarker), "tracks average accumulator");
+ int *counters = MEM_calloc_arrayN(num_frames, sizeof(int), "tracks accumulator counters");
+ for (int frame = first_frame; frame <= last_frame; ++frame) {
+ const int frame_index = frame - first_frame;
+ accumulator[frame_index].framenr = frame;
+ accumulator[frame_index].flag |= (MARKER_DISABLED | MARKER_TRACKED);
+ }
+
+ /* Accumulate track markers. */
+ for (int track_index = 0; track_index < num_src_tracks; ++track_index) {
+ /*const*/ MovieTrackingTrack *track = src_tracks[track_index];
+ for (int frame = first_frame; frame <= last_frame; ++frame) {
+ MovieTrackingMarker interpolated_marker;
+ if (!BKE_tracking_marker_get_interpolated(track, frame, &interpolated_marker)) {
+ continue;
+ }
+ const int frame_index = frame - first_frame;
+ accumulate_marker(&accumulator[frame_index], &interpolated_marker);
+ ++counters[frame_index];
+ }
+ }
+
+ /* Average and store the result. */
+ for (int frame = first_frame; frame <= last_frame; ++frame) {
+ /* Average. */
+ const int frame_index = frame - first_frame;
+ if (!counters[frame_index]) {
+ continue;
+ }
+ const float multiplier = 1.0f / (float)counters[frame_index];
+ multiply_marker(&accumulator[frame_index], multiplier);
+ /* Store the result. */
+ BKE_tracking_marker_insert(dst_track, &accumulator[frame_index]);
+ }
+
+ /* Free memory. */
+ MEM_freeN(accumulator);
+ MEM_freeN(counters);
+}
+
+/* Helper function for BKE_tracking_tracks_average which takes care of averaging fields of
+ * tracks (track for example, offset). */
+static void tracking_average_tracks(MovieTrackingTrack *dst_track,
+ /*const*/ MovieTrackingTrack **src_tracks,
+ const int num_src_tracks)
+{
+ /* TODO(sergey): Consider averaging weight, stabilization weight, maybe even bundle position. */
+ zero_v2(dst_track->offset);
+ for (int track_index = 0; track_index < num_src_tracks; track_index++) {
+ add_v2_v2(dst_track->offset, src_tracks[track_index]->offset);
+ }
+ mul_v2_fl(dst_track->offset, 1.0f / num_src_tracks);
+}
+
+void BKE_tracking_tracks_average(MovieTrackingTrack *dst_track,
+ /*const*/ MovieTrackingTrack **src_tracks,
+ const int num_src_tracks)
+{
+ if (num_src_tracks == 0) {
+ return;
+ }
+
+ tracking_average_markers(dst_track, src_tracks, num_src_tracks);
+ tracking_average_tracks(dst_track, src_tracks, num_src_tracks);
+}
+
MovieTrackingTrack *BKE_tracking_track_get_named(MovieTracking *tracking,
MovieTrackingObject *object,
const char *name)
@@ -1224,8 +1422,6 @@ MovieTrackingMarker *BKE_tracking_marker_insert(MovieTrackingTrack *track,
/* put new marker */
track->markers[a + 1] = *marker;
- track->last_marker = a + 1;
-
return &track->markers[a + 1];
}
@@ -1314,51 +1510,47 @@ void BKE_tracking_marker_clamp(MovieTrackingMarker *marker, int event)
}
}
+/**
+ * Get marker closest to the given frame number.
+ *
+ * If there is maker with exact frame number it returned.
+ * Otherwise, marker with highest frame number but lower than the requested
+ * frame is returned if such marker exists. Otherwise, the marker with lowest
+ * frame number greater than the requested frame number is returned.
+ *
+ * This function has complexity of `O(log number_of_markers)`.
+ */
MovieTrackingMarker *BKE_tracking_marker_get(MovieTrackingTrack *track, int framenr)
{
- int a = track->markersnr - 1;
+ const int num_markers = track->markersnr;
- if (!track->markersnr) {
+ if (num_markers == 0) {
+ BLI_assert(!"Detected degenerated track, should never happen.");
return NULL;
}
- /* approximate pre-first framenr marker with first marker */
- if (framenr < track->markers[0].framenr) {
- return &track->markers[0];
- }
+ int left_boundary = 0;
+ int right_boundary = num_markers;
+ while (left_boundary < right_boundary) {
+ const int median_index = (left_boundary + right_boundary) / 2;
+ MovieTrackingMarker *marker = &track->markers[median_index];
- if (track->last_marker < track->markersnr) {
- a = track->last_marker;
- }
-
- if (track->markers[a].framenr <= framenr) {
- while (a < track->markersnr && track->markers[a].framenr <= framenr) {
- if (track->markers[a].framenr == framenr) {
- track->last_marker = a;
-
- return &track->markers[a];
- }
- a++;
+ if (marker->framenr == framenr) {
+ return marker;
}
- /* if there's no marker for exact position, use nearest marker from left side */
- return &track->markers[a - 1];
- }
-
- while (a >= 0 && track->markers[a].framenr >= framenr) {
- if (track->markers[a].framenr == framenr) {
- track->last_marker = a;
-
- return &track->markers[a];
+ if (marker->framenr < framenr) {
+ left_boundary = median_index + 1;
+ }
+ else {
+ BLI_assert(marker->framenr > framenr);
+ right_boundary = median_index - 1;
}
-
- a--;
}
- /* if there's no marker for exact position, use nearest marker from left side */
- return &track->markers[a];
+ const int closest_index = clamp_i(right_boundary, 0, num_markers - 1);
- return NULL;
+ return &track->markers[closest_index];
}
MovieTrackingMarker *BKE_tracking_marker_get_exact(MovieTrackingTrack *track, int framenr)
@@ -1389,6 +1581,84 @@ MovieTrackingMarker *BKE_tracking_marker_ensure(MovieTrackingTrack *track, int f
return marker;
}
+static const MovieTrackingMarker *get_usable_marker_for_interpolation(
+ struct MovieTrackingTrack *track,
+ const MovieTrackingMarker *anchor_marker,
+ const int direction)
+{
+ BLI_assert(direction == -1 || direction == 1);
+
+ const MovieTrackingMarker *last_marker = track->markers + track->markersnr - 1;
+ const MovieTrackingMarker *current_marker = anchor_marker;
+
+ while (current_marker >= track->markers && current_marker <= last_marker) {
+ if ((current_marker->flag & MARKER_DISABLED) == 0) {
+ return current_marker;
+ }
+ current_marker += direction;
+ }
+
+ return NULL;
+}
+
+bool BKE_tracking_marker_get_interpolated(struct MovieTrackingTrack *track,
+ const int framenr,
+ struct MovieTrackingMarker *r_marker)
+{
+ const MovieTrackingMarker *closest_marker = BKE_tracking_marker_get(track, framenr);
+ if (closest_marker == NULL) {
+ return false;
+ }
+ if (closest_marker->framenr == framenr && (closest_marker->flag & MARKER_DISABLED) == 0) {
+ *r_marker = *closest_marker;
+ return true;
+ }
+
+ const MovieTrackingMarker *left_marker = get_usable_marker_for_interpolation(
+ track, closest_marker, -1);
+ if (left_marker == NULL) {
+ return false;
+ }
+
+ const MovieTrackingMarker *right_marker = get_usable_marker_for_interpolation(
+ track, closest_marker + 1, 1);
+ if (right_marker == NULL) {
+ return false;
+ }
+
+ if (left_marker == right_marker) {
+ *r_marker = *left_marker;
+ return true;
+ }
+
+ const float factor = (float)(framenr - left_marker->framenr) /
+ (right_marker->framenr - left_marker->framenr);
+
+ interp_v2_v2v2(r_marker->pos, left_marker->pos, right_marker->pos, factor);
+
+ for (int i = 0; i < 4; i++) {
+ interp_v2_v2v2(r_marker->pattern_corners[i],
+ left_marker->pattern_corners[i],
+ right_marker->pattern_corners[i],
+ factor);
+ }
+
+ interp_v2_v2v2(r_marker->search_min, left_marker->search_min, right_marker->search_min, factor);
+ interp_v2_v2v2(r_marker->search_max, left_marker->search_max, right_marker->search_max, factor);
+
+ r_marker->framenr = framenr;
+ r_marker->flag = 0;
+
+ if (framenr == left_marker->framenr) {
+ r_marker->flag = left_marker->flag;
+ }
+ else if (framenr == right_marker->framenr) {
+ r_marker->flag = right_marker->flag;
+ }
+
+ return true;
+}
+
void BKE_tracking_marker_pattern_minmax(const MovieTrackingMarker *marker,
float min[2],
float max[2])
@@ -1683,7 +1953,6 @@ MovieTrackingPlaneMarker *BKE_tracking_plane_marker_insert(MovieTrackingPlaneTra
/* Put new marker to an array. */
plane_track->markers[a + 1] = *plane_marker;
- plane_track->last_marker = a + 1;
return &plane_track->markers[a + 1];
}
diff --git a/source/blender/blenkernel/intern/tracking_stabilize.c b/source/blender/blenkernel/intern/tracking_stabilize.c
index 6f58416924f..46589a578a8 100644
--- a/source/blender/blenkernel/intern/tracking_stabilize.c
+++ b/source/blender/blenkernel/intern/tracking_stabilize.c
@@ -311,11 +311,7 @@ static void retrieve_next_lower_usable_frame(
* translation stabilization, which has an enabled tracking marker at this very
* frame. We search both for the next lower and next higher position, to allow
* the caller to interpolate gaps and to extrapolate at the ends of the
- * definition range.
- *
- * NOTE: Regarding performance note that the individual tracks will cache the
- * last search position.
- */
+ * definition range. */
static void find_next_working_frames(StabContext *ctx,
int framenr,
int *next_lower,
diff --git a/source/blender/blenkernel/intern/tracking_test.cc b/source/blender/blenkernel/intern/tracking_test.cc
index 6afcf6872eb..a3845dcad8f 100644
--- a/source/blender/blenkernel/intern/tracking_test.cc
+++ b/source/blender/blenkernel/intern/tracking_test.cc
@@ -5,15 +5,23 @@
#include "DNA_tracking_types.h"
#include "BKE_tracking.h"
+#include "BLI_float2.hh"
+
+namespace blender {
namespace {
class TrackingTest : public ::testing::Test {
protected:
- MovieTrackingMarker *addMarkerToTrack(MovieTrackingTrack *track, int frame_number)
+ MovieTrackingMarker *addMarkerToTrack(MovieTrackingTrack *track,
+ int frame_number,
+ const float2 &position = float2(0.0f, 0.0f),
+ int flag = 0)
{
MovieTrackingMarker marker = {{0.0f}};
+ copy_v2_v2(marker.pos, position);
marker.framenr = frame_number;
+ marker.flag = flag;
return BKE_tracking_marker_insert(track, &marker);
}
};
@@ -22,24 +30,58 @@ class TrackingTest : public ::testing::Test {
TEST_F(TrackingTest, BKE_tracking_marker_get)
{
- MovieTrackingTrack track = {nullptr};
+ {
+ MovieTrackingTrack track = {nullptr};
- addMarkerToTrack(&track, 1);
- addMarkerToTrack(&track, 10);
+ addMarkerToTrack(&track, 10);
- {
- const MovieTrackingMarker *marker = BKE_tracking_marker_get(&track, 1);
- EXPECT_NE(marker, nullptr);
- EXPECT_EQ(marker->framenr, 1);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 0), &track.markers[0]);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 10), &track.markers[0]);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 20), &track.markers[0]);
+
+ BKE_tracking_track_free(&track);
}
{
- const MovieTrackingMarker *marker = BKE_tracking_marker_get(&track, 5);
- EXPECT_NE(marker, nullptr);
- EXPECT_EQ(marker->framenr, 1);
+ MovieTrackingTrack track = {nullptr};
+
+ addMarkerToTrack(&track, 1);
+ addMarkerToTrack(&track, 10);
+
+ {
+ const MovieTrackingMarker *marker = BKE_tracking_marker_get(&track, 1);
+ EXPECT_NE(marker, nullptr);
+ EXPECT_EQ(marker->framenr, 1);
+ }
+
+ {
+ const MovieTrackingMarker *marker = BKE_tracking_marker_get(&track, 5);
+ EXPECT_NE(marker, nullptr);
+ EXPECT_EQ(marker->framenr, 1);
+ }
+
+ BKE_tracking_track_free(&track);
}
- BKE_tracking_track_free(&track);
+ {
+ {
+ MovieTrackingTrack track = {nullptr};
+
+ addMarkerToTrack(&track, 1);
+ addMarkerToTrack(&track, 2);
+ addMarkerToTrack(&track, 10);
+
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 0), &track.markers[0]);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 1), &track.markers[0]);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 2), &track.markers[1]);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 3), &track.markers[1]);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 9), &track.markers[1]);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 10), &track.markers[2]);
+ EXPECT_EQ(BKE_tracking_marker_get(&track, 11), &track.markers[2]);
+
+ BKE_tracking_track_free(&track);
+ }
+ }
}
TEST_F(TrackingTest, BKE_tracking_marker_get_exact)
@@ -62,3 +104,107 @@ TEST_F(TrackingTest, BKE_tracking_marker_get_exact)
BKE_tracking_track_free(&track);
}
+
+TEST_F(TrackingTest, BKE_tracking_marker_get_interpolated)
+{
+ /* Simple case, no disabled markers in a way. */
+ {
+ MovieTrackingTrack track = {nullptr};
+
+ addMarkerToTrack(&track, 1, float2(1.0f, 5.0f));
+ addMarkerToTrack(&track, 10, float2(2.0f, 1.0f));
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 1, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.framenr, 1);
+ EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.0f, 5.0f), 1e-6f);
+ }
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 10, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.framenr, 10);
+ EXPECT_V2_NEAR(interpolated_marker.pos, float2(2.0f, 1.0f), 1e-6f);
+ }
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 4, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.framenr, 4);
+ EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.3333333f, 3.6666666f), 1e-6f);
+ }
+
+ BKE_tracking_track_free(&track);
+ }
+
+ /* More comprehensive test, which resembles real-life tracking scenario better. */
+ {
+ MovieTrackingTrack track = {nullptr};
+
+ addMarkerToTrack(&track, 1, float2(1.0f, 5.0f));
+ addMarkerToTrack(&track, 2, float2(0.0f, 0.0f), MARKER_DISABLED);
+ addMarkerToTrack(&track, 9, float2(0.0f, 0.0f), MARKER_DISABLED);
+ addMarkerToTrack(&track, 10, float2(2.0f, 1.0f));
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 1, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.framenr, 1);
+ EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.0f, 5.0f), 1e-6f);
+ }
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 10, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.framenr, 10);
+ EXPECT_V2_NEAR(interpolated_marker.pos, float2(2.0f, 1.0f), 1e-6f);
+ }
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 4, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.framenr, 4);
+ EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.3333333f, 3.6666666f), 1e-6f);
+ }
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 9, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.framenr, 9);
+ EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.888888f, 1.4444444f), 1e-6f);
+ }
+
+ BKE_tracking_track_free(&track);
+ }
+
+ /* Tracked/keyframed flag check. */
+ {
+ MovieTrackingTrack track = {nullptr};
+
+ addMarkerToTrack(&track, 1, float2(1.0f, 5.0f), MARKER_TRACKED);
+ addMarkerToTrack(&track, 10, float2(2.0f, 1.0f), MARKER_TRACKED);
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 1, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.flag, MARKER_TRACKED);
+ }
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 10, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.flag, MARKER_TRACKED);
+ }
+
+ {
+ MovieTrackingMarker interpolated_marker;
+ EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 4, &interpolated_marker));
+ EXPECT_EQ(interpolated_marker.flag, 0);
+ }
+
+ BKE_tracking_track_free(&track);
+ }
+}
+
+} // namespace blender
diff --git a/source/blender/blenkernel/intern/tracking_util.c b/source/blender/blenkernel/intern/tracking_util.c
index ad2713b9977..ea0d92cf78e 100644
--- a/source/blender/blenkernel/intern/tracking_util.c
+++ b/source/blender/blenkernel/intern/tracking_util.c
@@ -60,7 +60,9 @@
# define CACHE_PRINTF(...)
#endif
-/*********************** Tracks map *************************/
+/* -------------------------------------------------------------------- */
+/** \name Tracks Map
+ * \{ */
TracksMap *tracks_map_new(const char *object_name,
bool is_camera,
@@ -242,7 +244,11 @@ void tracks_map_free(TracksMap *map, void (*customdata_free)(void *customdata))
MEM_freeN(map);
}
-/*********************** Space transformation functions *************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Space Transformation Functions
+ * \{ */
/* Three coordinate frames: Frame, Search, and Marker
* Two units: Pixels, Unified
@@ -399,7 +405,11 @@ void tracking_set_marker_coords_from_tracking(int frame_width,
marker->pos[1] += marker_unified[1];
}
-/*********************** General purpose utility functions *************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name General Purpose Utility Functions
+ * \{ */
/* Place a disabled marker before or after specified ref_marker.
*
@@ -613,7 +623,11 @@ MovieTrackingMarker *tracking_get_keyframed_marker(MovieTrackingTrack *track,
return marker_keyed;
}
-/*********************** Frame accessr *************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Frame Accessor
+ * \{ */
static ImBuf *accessor_get_preprocessed_ibuf(TrackingImageAccessor *accessor,
int clip_index,
@@ -936,3 +950,5 @@ void tracking_image_accessor_destroy(TrackingImageAccessor *accessor)
MEM_freeN(accessor->tracks);
MEM_freeN(accessor);
}
+
+/** \} */
diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c
index e78576206de..bb871e84c7b 100644
--- a/source/blender/blenkernel/intern/undo_system.c
+++ b/source/blender/blenkernel/intern/undo_system.c
@@ -176,8 +176,12 @@ static bool undosys_step_encode(bContext *C, Main *bmain, UndoStack *ustack, Und
return ok;
}
-static void undosys_step_decode(
- bContext *C, Main *bmain, UndoStack *ustack, UndoStep *us, int dir, bool is_final)
+static void undosys_step_decode(bContext *C,
+ Main *bmain,
+ UndoStack *ustack,
+ UndoStep *us,
+ const eUndoStepDir dir,
+ bool is_final)
{
CLOG_INFO(&LOG, 2, "addr=%p, name='%s', type='%s'", us, us->name, us->type->name);
@@ -251,42 +255,10 @@ static void undosys_stack_validate(UndoStack *ustack, bool expect_non_empty)
BLI_assert(!BLI_listbase_is_empty(&ustack->steps));
}
}
-
-/* Return whether `us_item` is before (-1), after (1) or same as (0) `us_anchor` step. */
-static int undosys_stack_order(const UndoStack *ustack,
- const UndoStep *us_anchor,
- const UndoStep *us_item)
-{
- const int index_anchor = BLI_findindex(&ustack->steps, us_anchor);
- const int index_item = BLI_findindex(&ustack->steps, us_item);
- BLI_assert(index_anchor >= 0);
- BLI_assert(index_item >= 0);
-
- return (index_item == index_anchor) ? 0 : (index_item < index_anchor) ? -1 : 1;
-}
-
-# define ASSERT_VALID_UNDO_STEP(_ustack, _us_undo) \
- { \
- const UndoStep *_us_anchor = (_ustack)->step_active; \
- BLI_assert(_us_anchor == NULL || \
- (undosys_stack_order((_ustack), _us_anchor, (_us_undo)) <= 0)); \
- } \
- (void)0
-
-# define ASSERT_VALID_REDO_STEP(_ustack, _us_redo) \
- { \
- const UndoStep *_us_anchor = (_ustack)->step_active; \
- BLI_assert(_us_anchor == NULL || \
- (undosys_stack_order((_ustack), _us_anchor, (_us_redo)) >= 0)); \
- } \
- (void)0
-
#else
static void undosys_stack_validate(UndoStack *UNUSED(ustack), bool UNUSED(expect_non_empty))
{
}
-# define ASSERT_VALID_UNDO_STEP(_ustack, _us_undo)
-# define ASSERT_VALID_REDO_STEP(_ustack, _us_redo)
#endif
UndoStack *BKE_undosys_stack_create(void)
@@ -315,7 +287,7 @@ void BKE_undosys_stack_clear(UndoStack *ustack)
void BKE_undosys_stack_clear_active(UndoStack *ustack)
{
- /* Remove active and all following undos. */
+ /* Remove active and all following undo-steps. */
UndoStep *us = ustack->step_active;
if (us) {
@@ -545,7 +517,7 @@ UndoPushReturn BKE_undosys_step_push_with_type(UndoStack *ustack,
retval |= UNDO_PUSH_RET_OVERRIDE_CHANGED;
}
- /* Remove all undos after (also when 'ustack->step_active == NULL'). */
+ /* Remove all undo-steps after (also when 'ustack->step_active == NULL'). */
while (ustack->steps.last != ustack->step_active) {
UndoStep *us_iter = ustack->steps.last;
undosys_step_free_and_unlink(ustack, us_iter);
@@ -586,7 +558,7 @@ UndoPushReturn BKE_undosys_step_push_with_type(UndoStack *ustack,
BLI_strncpy(us->name, name, sizeof(us->name));
}
us->type = ut;
- /* True by default, code needs to explicitely set it to false if necessary. */
+ /* True by default, code needs to explicitly set it to false if necessary. */
us->use_old_bmain_data = true;
/* Initialized, not added yet. */
@@ -701,37 +673,91 @@ UndoStep *BKE_undosys_step_find_by_type(UndoStack *ustack, const UndoType *ut)
return NULL;
}
-bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack,
- bContext *C,
- UndoStep *us,
- bool use_skip)
+/**
+ * Return direction of the undo/redo from `us_reference` (or `ustack->step_active` if NULL), and
+ * `us_target`.
+ *
+ * \note If `us_reference` and `us_target` are the same, we consider this is an undo.
+ *
+ * \return -1 for undo, 1 for redo, 0 in case of error.
+ */
+eUndoStepDir BKE_undosys_step_calc_direction(const UndoStack *ustack,
+ const UndoStep *us_target,
+ const UndoStep *us_reference)
+{
+ if (us_reference == NULL) {
+ us_reference = ustack->step_active;
+ }
+
+ BLI_assert(us_reference != NULL);
+
+ /* Note that we use heuristics to make this lookup as fast as possible in most common cases,
+ * assuming that:
+ * - Most cases are just undo or redo of one step from active one.
+ * - Otherwise, it is typically faster to check future steps since active one is usually close
+ * to the end of the list, rather than its start. */
+ /* NOTE: in case target step is the active one, we assume we are in an undo case... */
+ if (ELEM(us_target, us_reference, us_reference->prev)) {
+ return STEP_UNDO;
+ }
+ if (us_target == us_reference->next) {
+ return STEP_REDO;
+ }
+
+ /* Search forward, and then backward. */
+ for (UndoStep *us_iter = us_reference->next; us_iter != NULL; us_iter = us_iter->next) {
+ if (us_iter == us_target) {
+ return STEP_REDO;
+ }
+ }
+ for (UndoStep *us_iter = us_reference->prev; us_iter != NULL; us_iter = us_iter->prev) {
+ if (us_iter == us_target) {
+ return STEP_UNDO;
+ }
+ }
+
+ BLI_assert(!"Target undo step not found, this should not happen and may indicate an undo stack corruption");
+ return STEP_INVALID;
+}
+
+/**
+ * Undo/Redo until the given `us_target` step becomes the active (currently loaded) one.
+ *
+ * \note Unless `us_target` is a 'skipped' one and `use_skip` is true, `us_target` will become the
+ * active step.
+ *
+ * \note In case `use_skip` is true, the final target will always be **beyond** the given one (if
+ * the given one has to be skipped).
+ *
+ * \param us_reference If NULL, will be set to current active step in the undo stack. Otherwise, it
+ * is assumed to match the current state, and will be used as basis for the
+ * undo/redo process (i.e. all steps in-between `us_reference` and `us_target`
+ * will be processed).
+ */
+bool BKE_undosys_step_load_data_ex(UndoStack *ustack,
+ bContext *C,
+ UndoStep *us_target,
+ UndoStep *us_reference,
+ const bool use_skip)
{
UNDO_NESTED_ASSERT(false);
- if (us == NULL) {
- CLOG_ERROR(&LOG, "called with a NULL step");
+ if (us_target == NULL) {
+ CLOG_ERROR(&LOG, "called with a NULL target step");
return false;
}
undosys_stack_validate(ustack, true);
- /* We expect to get next-from-actual-target step here (i.e. active step in case we only undo
- * once)?
- * FIXME: this is very confusing now that we may have to undo several steps anyway, this function
- * should just get the target final step, not assume that it is getting the active one by default
- * (or the step after the target one when undoing more than one step). */
- UndoStep *us_target = us->prev;
- if (us_target == NULL) {
- CLOG_ERROR(&LOG, "could not find a valid target step");
+ if (us_reference == NULL) {
+ us_reference = ustack->step_active;
+ }
+ if (us_reference == NULL) {
+ CLOG_ERROR(&LOG, "could not find a valid initial active target step as reference");
return false;
}
- ASSERT_VALID_UNDO_STEP(ustack, us_target);
- /* This will be active once complete. */
- UndoStep *us_active = us_target;
- if (use_skip) {
- while (us_active && us_active->skip) {
- us_active = us_active->prev;
- }
- }
+ /* This considers we are in undo case if both `us_target` and `us_reference` are the same. */
+ const eUndoStepDir undo_dir = BKE_undosys_step_calc_direction(ustack, us_target, us_reference);
+ BLI_assert(undo_dir != STEP_INVALID);
/* This will be the active step once the undo process is complete.
*
@@ -740,7 +766,7 @@ bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack,
UndoStep *us_target_active = us_target;
if (use_skip) {
while (us_target_active != NULL && us_target_active->skip) {
- us_target_active = us_target_active->prev;
+ us_target_active = (undo_dir == -1) ? us_target_active->prev : us_target_active->next;
}
}
if (us_target_active == NULL) {
@@ -748,42 +774,47 @@ bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack,
return false;
}
- CLOG_INFO(
- &LOG, 1, "addr=%p, name='%s', type='%s'", us_target, us_target->name, us_target->type->name);
+ CLOG_INFO(&LOG,
+ 1,
+ "addr=%p, name='%s', type='%s', undo_dir=%d",
+ us_target,
+ us_target->name,
+ us_target->type->name,
+ undo_dir);
- /* Undo steps until we reach original given target, if we do have a current active step.
+ /* Undo/Redo steps until we reach given target step (or beyond if it has to be skipped), from
+ * given reference step.
*
* NOTE: Unlike with redo case, where we can expect current active step to fully reflect current
* data status, in undo case we also do reload the active step.
* FIXME: this feels weak, and should probably not be actually needed? Or should also be done in
* redo case? */
- if (ustack->step_active != NULL) {
- for (UndoStep *us_iter = ustack->step_active; us_iter != us_target; us_iter = us_iter->prev) {
- BLI_assert(us_iter != NULL);
- undosys_step_decode(C, G_MAIN, ustack, us_iter, -1, false);
- ustack->step_active = us_iter;
- }
- }
+ bool is_processing_extra_skipped_steps = false;
+ for (UndoStep *us_iter = (undo_dir == -1) ? us_reference : us_reference->next; us_iter != NULL;
+ us_iter = (undo_dir == -1) ? us_iter->prev : us_iter->next) {
+ BLI_assert(us_iter != NULL);
- /* Undo target step, and all potential extra ones if some steps have to be 'skipped'. */
- for (UndoStep *us_iter = us_target; us_iter != NULL; us_iter = us_iter->prev) {
const bool is_final = (us_iter == us_target_active);
- if (!is_final) {
+ if (!is_final && is_processing_extra_skipped_steps) {
BLI_assert(us_iter->skip == true);
CLOG_INFO(&LOG,
2,
- "undo continue with skip addr=%p, name='%s', type='%s'",
+ "undo/redo continue with skip addr=%p, name='%s', type='%s'",
us_iter,
us_iter->name,
us_iter->type->name);
}
- undosys_step_decode(C, G_MAIN, ustack, us_iter, -1, is_final);
+ undosys_step_decode(C, G_MAIN, ustack, us_iter, undo_dir, is_final);
ustack->step_active = us_iter;
+ if (us_iter == us_target) {
+ is_processing_extra_skipped_steps = true;
+ }
+
if (is_final) {
- /* Undo process is finished and successful. */
+ /* Undo/Redo process is finished and successful. */
return true;
}
}
@@ -793,139 +824,117 @@ bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack,
return false;
}
-bool BKE_undosys_step_undo_with_data(UndoStack *ustack, bContext *C, UndoStep *us)
-{
- return BKE_undosys_step_undo_with_data_ex(ustack, C, us, true);
-}
-
-bool BKE_undosys_step_undo(UndoStack *ustack, bContext *C)
+/**
+ * Undo/Redo until the given `us_target` step becomes the active (currently loaded) one.
+ */
+bool BKE_undosys_step_load_data(UndoStack *ustack, bContext *C, UndoStep *us_target)
{
- return BKE_undosys_step_undo_with_data(ustack, C, ustack->step_active);
+ /* Note that here we do not skip 'skipped' steps by default. */
+ return BKE_undosys_step_load_data_ex(ustack, C, us_target, NULL, false);
}
-void BKE_undosys_step_undo_from_index(UndoStack *ustack, bContext *C, int index)
+/**
+ * Undo/Redo until the step matching given `index` in the undo stack becomes the active (currently
+ * loaded) one.
+ */
+void BKE_undosys_step_load_from_index(UndoStack *ustack, bContext *C, const int index)
{
- UndoStep *us = BLI_findlink(&ustack->steps, index);
- BLI_assert(us->skip == false);
- BKE_undosys_step_load_data(ustack, C, us);
+ UndoStep *us_target = BLI_findlink(&ustack->steps, index);
+ BLI_assert(us_target->skip == false);
+ BKE_undosys_step_load_data(ustack, C, us_target);
}
-bool BKE_undosys_step_redo_with_data_ex(UndoStack *ustack,
+/**
+ * Undo until `us_target` step becomes the active (currently loaded) one.
+ *
+ * \warning This function assumes that the given target step is _before_ current active one.
+ *
+ * \note Unless `us_target` is a 'skipped' one and `use_skip` is true, `us_target` will become the
+ * active step.
+ *
+ * \note In case `use_skip` is true, the final target will always be **before** the given one (if
+ * the given one has to be skipped).
+ */
+bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack,
bContext *C,
- UndoStep *us,
+ UndoStep *us_target,
bool use_skip)
{
- UNDO_NESTED_ASSERT(false);
- if (us == NULL) {
- CLOG_ERROR(&LOG, "called with a NULL step");
- return false;
- }
- undosys_stack_validate(ustack, true);
+ /* In case there is no active step, we consider we just load given step, so reference must be
+ * itself (due to weird 'load current active step in undo case' thing, see comments in
+ * #BKE_undosys_step_load_data_ex). */
+ UndoStep *us_reference = ustack->step_active != NULL ? ustack->step_active : us_target;
- /* We expect to get previous-from-actual-target step here (i.e. active step in case we only redo
- * once)?
- * FIXME: this is very confusing now that we may have to redo several steps anyway, this function
- * should just get the target final step, not assume that it is getting the active one by default
- * (or the step before the target one when redoing more than one step). */
- UndoStep *us_target = us->next;
- if (us_target == NULL) {
- CLOG_ERROR(&LOG, "could not find a valid target step");
- return false;
- }
- ASSERT_VALID_REDO_STEP(ustack, us_target);
+ BLI_assert(BKE_undosys_step_calc_direction(ustack, us_target, us_reference) == -1);
- /* This will be the active step once the redo process is complete.
- *
- * In case we do skip 'skipped' steps, the final active step may be several steps forward the one
- * passed as parameter. */
- UndoStep *us_target_active = us_target;
- if (use_skip) {
- while (us_target_active != NULL && us_target_active->skip) {
- us_target_active = us_target_active->next;
- }
- }
- if (us_target_active == NULL) {
- CLOG_ERROR(&LOG, "could not find a valid final active target step");
- return false;
- }
+ return BKE_undosys_step_load_data_ex(ustack, C, us_target, us_reference, use_skip);
+}
- CLOG_INFO(
- &LOG, 1, "addr=%p, name='%s', type='%s'", us_target, us_target->name, us_target->type->name);
+/**
+ * Undo until `us_target` step becomes the active (currently loaded) one.
+ *
+ * \note See #BKE_undosys_step_undo_with_data_ex for details.
+ */
+bool BKE_undosys_step_undo_with_data(UndoStack *ustack, bContext *C, UndoStep *us_target)
+{
+ return BKE_undosys_step_undo_with_data_ex(ustack, C, us_target, true);
+}
- /* Redo steps until we reach original given target, if we do have a current active step. */
+/**
+ * Undo one step from current active (currently loaded) one.
+ */
+bool BKE_undosys_step_undo(UndoStack *ustack, bContext *C)
+{
if (ustack->step_active != NULL) {
- for (UndoStep *us_iter = ustack->step_active->next; us_iter != us_target;
- us_iter = us_iter->next) {
- BLI_assert(us_iter != NULL);
- undosys_step_decode(C, G_MAIN, ustack, us_iter, 1, false);
- ustack->step_active = us_iter;
- }
+ return BKE_undosys_step_undo_with_data(ustack, C, ustack->step_active->prev);
}
-
- /* Redo target step, and all potential extra ones if some steps have to be 'skipped'. */
- for (UndoStep *us_iter = us_target; us_iter != NULL; us_iter = us_iter->next) {
- const bool is_final = (us_iter == us_target_active);
-
- if (!is_final) {
- BLI_assert(us_iter->skip == true);
- CLOG_INFO(&LOG,
- 2,
- "redo continue with skip addr=%p, name='%s', type='%s'",
- us_iter,
- us_iter->name,
- us_iter->type->name);
- }
-
- undosys_step_decode(C, G_MAIN, ustack, us_iter, 1, is_final);
- ustack->step_active = us_iter;
-
- if (is_final) {
- /* Redo process is finished and successful. */
- return true;
- }
- }
-
- BLI_assert(
- !"This should never be reached, either undo stack is corrupted, or code above is buggy");
return false;
}
-bool BKE_undosys_step_redo_with_data(UndoStack *ustack, bContext *C, UndoStep *us)
+/**
+ * Redo until `us_target` step becomes the active (currently loaded) one.
+ *
+ * \warning This function assumes that the given target step is _after_ current active one.
+ *
+ * \note Unless `us_target` is a 'skipped' one and `use_skip` is true, `us_target` will become the
+ * active step.
+ *
+ * \note In case `use_skip` is true, the final target will always be **after** the given one (if
+ * the given one has to be skipped).
+ */
+bool BKE_undosys_step_redo_with_data_ex(UndoStack *ustack,
+ bContext *C,
+ UndoStep *us_target,
+ bool use_skip)
{
- return BKE_undosys_step_redo_with_data_ex(ustack, C, us, true);
+ /* In case there is no active step, we consider we just load given step, so reference must be
+ * the previous one. */
+ UndoStep *us_reference = ustack->step_active != NULL ? ustack->step_active : us_target->prev;
+
+ BLI_assert(BKE_undosys_step_calc_direction(ustack, us_target, us_reference) == 1);
+
+ return BKE_undosys_step_load_data_ex(ustack, C, us_target, us_reference, use_skip);
}
-bool BKE_undosys_step_redo(UndoStack *ustack, bContext *C)
+/**
+ * Redo until `us_target` step becomes the active (currently loaded) one.
+ *
+ * \note See #BKE_undosys_step_redo_with_data_ex for details.
+ */
+bool BKE_undosys_step_redo_with_data(UndoStack *ustack, bContext *C, UndoStep *us_target)
{
- return BKE_undosys_step_redo_with_data(ustack, C, ustack->step_active);
+ return BKE_undosys_step_redo_with_data_ex(ustack, C, us_target, true);
}
-bool BKE_undosys_step_load_data(UndoStack *ustack, bContext *C, UndoStep *us)
+/**
+ * Redo one step from current active one.
+ */
+bool BKE_undosys_step_redo(UndoStack *ustack, bContext *C)
{
- UNDO_NESTED_ASSERT(false);
- const int index_active = BLI_findindex(&ustack->steps, ustack->step_active);
- const int index_target = BLI_findindex(&ustack->steps, us);
- BLI_assert(!ELEM(-1, index_active, index_target));
- bool ok = true;
-
- if (index_target < index_active) {
- uint i = index_active - index_target;
- while (i-- && ok) {
- ok = BKE_undosys_step_undo_with_data_ex(ustack, C, ustack->step_active, false);
- }
- }
- else if (index_target > index_active) {
- uint i = index_target - index_active;
- while (i-- && ok) {
- ok = BKE_undosys_step_redo_with_data_ex(ustack, C, ustack->step_active, false);
- }
- }
-
- if (ok) {
- BLI_assert(ustack->step_active == us);
+ if (ustack->step_active != NULL) {
+ return BKE_undosys_step_redo_with_data(ustack, C, ustack->step_active->next);
}
-
- return ok;
+ return false;
}
/**
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index b55f80c6473..9ae1c754846 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -333,7 +333,7 @@ static struct bUnitCollection buPowerCollection = {buPowerDef, 3, 0, UNIT_COLLEC
/* Temperature */
static struct bUnitDef buMetricTempDef[] = {
{"kelvin", "kelvin", "K", NULL, "Kelvin", "KELVIN", 1.0f, 0.0, B_UNIT_DEF_NONE}, /* Base unit. */
- {"celsius", "celsius", "°C", "C", "Celsius", "CELCIUS", 1.0f, 273.15, B_UNIT_DEF_NONE},
+ {"celsius", "celsius", "°C", "C", "Celsius", "CELSIUS", 1.0f, 273.15, B_UNIT_DEF_NONE},
NULL_UNIT,
};
static struct bUnitCollection buMetricTempCollection = {buMetricTempDef, 0, 0, UNIT_COLLECTION_LENGTH(buMetricTempDef)};
@@ -1167,8 +1167,7 @@ bool BKE_unit_replace_string(
/* Replace # with add sign when there is no operator between it and the next number.
*
* "1*1# 3*100# * 3" -> "1*1+ 3*100 * 3"
- *
- * */
+ */
{
char *str_found = str;
const char *ch = str;
diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc
index 9e7a3736141..edf40ab3861 100644
--- a/source/blender/blenkernel/intern/volume.cc
+++ b/source/blender/blenkernel/intern/volume.cc
@@ -128,7 +128,7 @@ static struct VolumeFileCache {
std::lock_guard<std::mutex> lock(mutex);
return simplified_grids.lookup_or_add_cb(simplify_level, [&]() {
const float resolution_factor = 1.0f / (1 << simplify_level);
- const VolumeGridType grid_type = BKE_volume_grid_type_openvdb(grid);
+ const VolumeGridType grid_type = BKE_volume_grid_type_openvdb(*grid);
return BKE_volume_grid_create_with_changed_resolution(grid_type, *grid, resolution_factor);
});
}
@@ -145,7 +145,7 @@ static struct VolumeFileCache {
/* Has the grid tree been loaded? */
bool is_loaded;
- /* Error message if an error occured during loading. */
+ /* Error message if an error occurred while loading. */
std::string error_msg;
/* User counting. */
int num_metadata_users;
@@ -523,6 +523,8 @@ static void volume_copy_data(Main *UNUSED(bmain),
volume_dst->runtime.grids = OBJECT_GUARDED_NEW(VolumeGridVector, grids_src);
}
#endif
+
+ volume_dst->batch_cache = nullptr;
}
static void volume_free_data(ID *id)
@@ -642,6 +644,8 @@ IDTypeInfo IDType_ID_VO = {
/* blend_read_expand */ volume_blend_read_expand,
/* blend_read_undo_preserve */ nullptr,
+
+ /* lib_override_apply_post */ nullptr,
};
void BKE_volume_init_grids(Volume *volume)
@@ -1233,39 +1237,39 @@ const char *BKE_volume_grid_name(const VolumeGrid *volume_grid)
}
#ifdef WITH_OPENVDB
-VolumeGridType BKE_volume_grid_type_openvdb(const openvdb::GridBase::Ptr &grid)
+VolumeGridType BKE_volume_grid_type_openvdb(const openvdb::GridBase &grid)
{
- if (grid->isType<openvdb::FloatGrid>()) {
+ if (grid.isType<openvdb::FloatGrid>()) {
return VOLUME_GRID_FLOAT;
}
- if (grid->isType<openvdb::Vec3fGrid>()) {
+ if (grid.isType<openvdb::Vec3fGrid>()) {
return VOLUME_GRID_VECTOR_FLOAT;
}
- if (grid->isType<openvdb::BoolGrid>()) {
+ if (grid.isType<openvdb::BoolGrid>()) {
return VOLUME_GRID_BOOLEAN;
}
- if (grid->isType<openvdb::DoubleGrid>()) {
+ if (grid.isType<openvdb::DoubleGrid>()) {
return VOLUME_GRID_DOUBLE;
}
- if (grid->isType<openvdb::Int32Grid>()) {
+ if (grid.isType<openvdb::Int32Grid>()) {
return VOLUME_GRID_INT;
}
- if (grid->isType<openvdb::Int64Grid>()) {
+ if (grid.isType<openvdb::Int64Grid>()) {
return VOLUME_GRID_INT64;
}
- if (grid->isType<openvdb::Vec3IGrid>()) {
+ if (grid.isType<openvdb::Vec3IGrid>()) {
return VOLUME_GRID_VECTOR_INT;
}
- if (grid->isType<openvdb::Vec3dGrid>()) {
+ if (grid.isType<openvdb::Vec3dGrid>()) {
return VOLUME_GRID_VECTOR_DOUBLE;
}
- if (grid->isType<openvdb::StringGrid>()) {
+ if (grid.isType<openvdb::StringGrid>()) {
return VOLUME_GRID_STRING;
}
- if (grid->isType<openvdb::MaskGrid>()) {
+ if (grid.isType<openvdb::MaskGrid>()) {
return VOLUME_GRID_MASK;
}
- if (grid->isType<openvdb::points::PointDataGrid>()) {
+ if (grid.isType<openvdb::points::PointDataGrid>()) {
return VOLUME_GRID_POINTS;
}
return VOLUME_GRID_UNKNOWN;
@@ -1276,7 +1280,7 @@ VolumeGridType BKE_volume_grid_type(const VolumeGrid *volume_grid)
{
#ifdef WITH_OPENVDB
const openvdb::GridBase::Ptr grid = volume_grid->grid();
- return BKE_volume_grid_type_openvdb(grid);
+ return BKE_volume_grid_type_openvdb(*grid);
#else
UNUSED_VARS(volume_grid);
#endif
diff --git a/source/blender/blenkernel/intern/volume_to_mesh.cc b/source/blender/blenkernel/intern/volume_to_mesh.cc
new file mode 100644
index 00000000000..7ab67516242
--- /dev/null
+++ b/source/blender/blenkernel/intern/volume_to_mesh.cc
@@ -0,0 +1,183 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <vector>
+
+#include "BLI_float3.hh"
+#include "BLI_span.hh"
+#include "BLI_utildefines.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_volume_types.h"
+
+#include "BKE_mesh.h"
+#include "BKE_volume.h"
+
+#ifdef WITH_OPENVDB
+# include <openvdb/tools/GridTransformer.h>
+# include <openvdb/tools/VolumeToMesh.h>
+#endif
+
+#include "BKE_volume_to_mesh.hh"
+
+namespace blender::bke {
+
+#ifdef WITH_OPENVDB
+
+struct VolumeToMeshOp {
+ const openvdb::GridBase &base_grid;
+ const VolumeToMeshResolution resolution;
+ const float threshold;
+ const float adaptivity;
+ std::vector<openvdb::Vec3s> verts;
+ std::vector<openvdb::Vec3I> tris;
+ std::vector<openvdb::Vec4I> quads;
+
+ template<typename GridType> bool operator()()
+ {
+ if constexpr (std::is_scalar_v<typename GridType::ValueType>) {
+ this->generate_mesh_data<GridType>();
+ return true;
+ }
+ return false;
+ }
+
+ template<typename GridType> void generate_mesh_data()
+ {
+ const GridType &grid = static_cast<const GridType &>(base_grid);
+
+ if (this->resolution.mode == VOLUME_TO_MESH_RESOLUTION_MODE_GRID) {
+ this->grid_to_mesh(grid);
+ return;
+ }
+
+ const float resolution_factor = this->compute_resolution_factor(base_grid);
+ typename GridType::Ptr temp_grid = this->create_grid_with_changed_resolution(
+ grid, resolution_factor);
+ this->grid_to_mesh(*temp_grid);
+ }
+
+ template<typename GridType>
+ typename GridType::Ptr create_grid_with_changed_resolution(const GridType &old_grid,
+ const float resolution_factor)
+ {
+ BLI_assert(resolution_factor > 0.0f);
+
+ openvdb::Mat4R xform;
+ xform.setToScale(openvdb::Vec3d(resolution_factor));
+ openvdb::tools::GridTransformer transformer{xform};
+
+ typename GridType::Ptr new_grid = GridType::create();
+ transformer.transformGrid<openvdb::tools::BoxSampler>(old_grid, *new_grid);
+ new_grid->transform() = old_grid.transform();
+ new_grid->transform().preScale(1.0f / resolution_factor);
+ return new_grid;
+ }
+
+ float compute_resolution_factor(const openvdb::GridBase &grid) const
+ {
+ const openvdb::Vec3s voxel_size{grid.voxelSize()};
+ const float current_voxel_size = std::max({voxel_size[0], voxel_size[1], voxel_size[2]});
+ const float desired_voxel_size = this->compute_desired_voxel_size(grid);
+ return current_voxel_size / desired_voxel_size;
+ }
+
+ float compute_desired_voxel_size(const openvdb::GridBase &grid) const
+ {
+ if (this->resolution.mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE) {
+ return this->resolution.settings.voxel_size;
+ }
+ const openvdb::CoordBBox coord_bbox = base_grid.evalActiveVoxelBoundingBox();
+ const openvdb::BBoxd bbox = grid.transform().indexToWorld(coord_bbox);
+ const float max_extent = bbox.extents()[bbox.maxExtent()];
+ const float voxel_size = max_extent / this->resolution.settings.voxel_amount;
+ return voxel_size;
+ }
+
+ template<typename GridType> void grid_to_mesh(const GridType &grid)
+ {
+ openvdb::tools::volumeToMesh(
+ grid, this->verts, this->tris, this->quads, this->threshold, this->adaptivity);
+
+ /* Better align generated mesh with volume (see T85312). */
+ openvdb::Vec3s offset = grid.voxelSize() / 2.0f;
+ for (openvdb::Vec3s &position : this->verts) {
+ position += offset;
+ }
+ }
+};
+
+static Mesh *new_mesh_from_openvdb_data(Span<openvdb::Vec3s> verts,
+ Span<openvdb::Vec3I> tris,
+ Span<openvdb::Vec4I> quads)
+{
+ const int tot_loops = 3 * tris.size() + 4 * quads.size();
+ const int tot_polys = tris.size() + quads.size();
+
+ Mesh *mesh = BKE_mesh_new_nomain(verts.size(), 0, 0, tot_loops, tot_polys);
+
+ /* Write vertices. */
+ for (const int i : verts.index_range()) {
+ const blender::float3 co = blender::float3(verts[i].asV());
+ copy_v3_v3(mesh->mvert[i].co, co);
+ }
+
+ /* Write triangles. */
+ for (const int i : tris.index_range()) {
+ mesh->mpoly[i].loopstart = 3 * i;
+ mesh->mpoly[i].totloop = 3;
+ for (int j = 0; j < 3; j++) {
+ /* Reverse vertex order to get correct normals. */
+ mesh->mloop[3 * i + j].v = tris[i][2 - j];
+ }
+ }
+
+ /* Write quads. */
+ const int poly_offset = tris.size();
+ const int loop_offset = tris.size() * 3;
+ for (const int i : quads.index_range()) {
+ mesh->mpoly[poly_offset + i].loopstart = loop_offset + 4 * i;
+ mesh->mpoly[poly_offset + i].totloop = 4;
+ for (int j = 0; j < 4; j++) {
+ /* Reverse vertex order to get correct normals. */
+ mesh->mloop[loop_offset + 4 * i + j].v = quads[i][3 - j];
+ }
+ }
+
+ BKE_mesh_calc_edges(mesh, false, false);
+ BKE_mesh_calc_normals(mesh);
+ return mesh;
+}
+
+Mesh *volume_to_mesh(const openvdb::GridBase &grid,
+ const VolumeToMeshResolution &resolution,
+ const float threshold,
+ const float adaptivity)
+{
+ const VolumeGridType grid_type = BKE_volume_grid_type_openvdb(grid);
+
+ VolumeToMeshOp to_mesh_op{grid, resolution, threshold, adaptivity};
+ if (!BKE_volume_grid_type_operation(grid_type, to_mesh_op)) {
+ return nullptr;
+ }
+
+ return new_mesh_from_openvdb_data(to_mesh_op.verts, to_mesh_op.tris, to_mesh_op.quads);
+}
+
+#endif /* WITH_OPENVDB */
+
+} // namespace blender::bke
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 291116556c3..5a101cf009b 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -192,6 +192,8 @@ IDTypeInfo IDType_ID_WS = {
.blend_read_expand = workspace_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
/* -------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 8fe7653fc25..a2ce37a5d90 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -206,6 +206,8 @@ IDTypeInfo IDType_ID_WO = {
.blend_read_expand = world_blend_read_expand,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
World *BKE_world_add(Main *bmain, const char *name)
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index e6adad765c3..0991d804882 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -37,6 +37,7 @@
# endif
# include "BLI_math_base.h"
+# include "BLI_threads.h"
# include "BLI_utildefines.h"
# include "BKE_global.h"
@@ -566,8 +567,8 @@ static AVStream *alloc_video_stream(FFMpegContext *context,
/* Set up the codec context */
c = st->codec;
- c->thread_count = 0;
- c->thread_type = FF_THREAD_FRAME;
+ c->thread_count = BLI_system_thread_count();
+ c->thread_type = FF_THREAD_SLICE;
c->codec_id = codec_id;
c->codec_type = AVMEDIA_TYPE_VIDEO;
@@ -780,8 +781,8 @@ static AVStream *alloc_audio_stream(FFMpegContext *context,
st->id = 1;
c = st->codec;
- c->thread_count = 0;
- c->thread_type = FF_THREAD_FRAME;
+ c->thread_count = BLI_system_thread_count();
+ c->thread_type = FF_THREAD_SLICE;
c->codec_id = codec_id;
c->codec_type = AVMEDIA_TYPE_AUDIO;
diff --git a/source/blender/blenkernel/nla_private.h b/source/blender/blenkernel/nla_private.h
index 7257be66b79..706bcac4f17 100644
--- a/source/blender/blenkernel/nla_private.h
+++ b/source/blender/blenkernel/nla_private.h
@@ -79,6 +79,9 @@ typedef struct NlaValidMask {
typedef struct NlaEvalChannelSnapshot {
struct NlaEvalChannel *channel;
+ /** For an upper snapshot channel, marks values that should be blended. */
+ NlaValidMask blend_domain;
+
int length; /* Number of values in the property. */
bool is_base; /* Base snapshot of the channel. */
@@ -106,14 +109,10 @@ typedef struct NlaEvalChannel {
int index;
bool is_array;
- bool in_blend;
char mix_mode;
- struct NlaEvalChannel *next_blend;
- NlaEvalChannelSnapshot *blend_snapshot;
-
- /* Mask of array items controlled by NLA. */
- NlaValidMask valid;
+ /* Associated with the RNA property's value(s), marks which elements are affected by NLA. */
+ NlaValidMask domain;
/* Base set of values. */
NlaEvalChannelSnapshot base_snapshot;
@@ -186,6 +185,17 @@ void nladata_flush_channels(PointerRNA *ptr,
NlaEvalSnapshot *snapshot,
const bool flush_to_original);
+void nlasnapshot_enable_all_blend_domain(NlaEvalSnapshot *snapshot);
+
+void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapshot);
+
+void nlasnapshot_blend(NlaEvalData *eval_data,
+ NlaEvalSnapshot *lower_snapshot,
+ NlaEvalSnapshot *upper_snapshot,
+ const short upper_blendmode,
+ const float upper_influence,
+ NlaEvalSnapshot *r_blended_snapshot);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/tracking_private.h b/source/blender/blenkernel/tracking_private.h
index c8e7fea6601..35c5221efa3 100644
--- a/source/blender/blenkernel/tracking_private.h
+++ b/source/blender/blenkernel/tracking_private.h
@@ -125,7 +125,7 @@ float *tracking_track_get_mask_for_region(int frame_width,
const float region_max[2],
MovieTrackingTrack *track);
-/*********************** Frame accessr *************************/
+/*********************** Frame Accessor *************************/
struct libmv_FrameAccessor;
diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h
index 74a491898b6..df80e720363 100644
--- a/source/blender/blenlib/BLI_fileops.h
+++ b/source/blender/blenlib/BLI_fileops.h
@@ -20,7 +20,7 @@
/** \file
* \ingroup bli
* \brief File and directory operations.
- * */
+ */
#pragma once
@@ -88,10 +88,10 @@ typedef enum eFileAttributes {
FILE_ATTR_TEMPORARY = 1 << 7, /* Used for temporary storage. */
FILE_ATTR_SPARSE_FILE = 1 << 8, /* Sparse File. */
FILE_ATTR_OFFLINE = 1 << 9, /* Data is not immediately available. */
- FILE_ATTR_ALIAS = 1 << 10, /* Mac Alias or Windows Lnk. File-based redirection. */
- FILE_ATTR_REPARSE_POINT = 1 << 11, /* File has associated reparse point. */
+ FILE_ATTR_ALIAS = 1 << 10, /* Mac Alias or Windows LNK. File-based redirection. */
+ FILE_ATTR_REPARSE_POINT = 1 << 11, /* File has associated re-parse point. */
FILE_ATTR_SYMLINK = 1 << 12, /* Reference to another file. */
- FILE_ATTR_JUNCTION_POINT = 1 << 13, /* Folder Symlink. */
+ FILE_ATTR_JUNCTION_POINT = 1 << 13, /* Folder Symbolic-link. */
FILE_ATTR_MOUNT_POINT = 1 << 14, /* Volume mounted as a folder. */
FILE_ATTR_HARDLINK = 1 << 15, /* Duplicated directory entry. */
} eFileAttributes;
diff --git a/source/blender/blenlib/BLI_float2.hh b/source/blender/blenlib/BLI_float2.hh
index 2a5320e4c35..84dd0e358a2 100644
--- a/source/blender/blenlib/BLI_float2.hh
+++ b/source/blender/blenlib/BLI_float2.hh
@@ -29,6 +29,14 @@ struct float2 {
{
}
+ explicit float2(float value) : x(value), y(value)
+ {
+ }
+
+ explicit float2(int value) : x(value), y(value)
+ {
+ }
+
float2(float x, float y) : x(x), y(y)
{
}
@@ -52,6 +60,11 @@ struct float2 {
return len_v2(*this);
}
+ float length_squared() const
+ {
+ return len_squared_v2(*this);
+ }
+
float2 &operator+=(const float2 &other)
{
x += other.x;
diff --git a/source/blender/blenlib/BLI_fnmatch.h b/source/blender/blenlib/BLI_fnmatch.h
index d09a14621d8..2d0c13bc423 100644
--- a/source/blender/blenlib/BLI_fnmatch.h
+++ b/source/blender/blenlib/BLI_fnmatch.h
@@ -16,7 +16,7 @@
* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
*
* NOTE: The canonical source of this file is maintained with the GNU C Library.
- * Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+ * Bugs can be reported to <bug-glibc@prep.ai.mit.edu>.
*/
#pragma once
diff --git a/source/blender/blenlib/BLI_function_ref.hh b/source/blender/blenlib/BLI_function_ref.hh
new file mode 100644
index 00000000000..86f761bbded
--- /dev/null
+++ b/source/blender/blenlib/BLI_function_ref.hh
@@ -0,0 +1,154 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#include <type_traits>
+#include <utility>
+
+#include "BLI_utildefines.h"
+
+/** \file
+ * \ingroup bli
+ *
+ * A `FunctionRef<Signature>` is a non-owning reference to some callable object with a specific
+ * signature. It can be used to pass some callback to another function.
+ *
+ * A `FunctionRef` is small and cheap to copy. Therefore it should generally be passed by value.
+ *
+ * Example signatures:
+ * FunctionRef<void()> - A function without parameters and void return type.
+ * FunctionRef<int(float)> - A function with a float paramter and an int return value.
+ * FunctionRef<int(int, int)> - A function with two int parameters and an int return value.
+ *
+ * There are multiple ways to achieve that, so here is a comparison of the different approaches:
+ * 1. Pass function pointer and user data (as void *) separately:
+ * - The only method that is compatible with C interfaces.
+ * - Is cumbersome to work with in many cases, because one has to keep track of two parameters.
+ * - Not type safe at all, because of the void pointer.
+ * - It requires workarounds when one wants to pass a lambda into a function.
+ * 2. Using `std::function`:
+ * - It works well with most callables and is easy to use.
+ * - Owns the callable, so it can be returned from a function more safely than other methods.
+ * - Requires that the callable is copyable.
+ * - Requires an allocation when the callable is too large (typically > 16 bytes).
+ * 3. Using a template for the callable type:
+ * - Most efficient solution at runtime, because compiler knows the exact callable at the place
+ * where it is called.
+ * - Works well with all callables.
+ * - Requires the function to be in a header file.
+ * - It's difficult to constrain the signature of the function.
+ * 4. Using `FunctionRef`:
+ * - Second most efficient solution at runtime.
+ * - It's easy to constrain the signature of the callable.
+ * - Does not require the function to be in a header file.
+ * - Works well with all callables.
+ * - It's a non-owning reference, so it *cannot* be stored safely in general.
+ *
+ * The fact that this is a non-owning reference makes `FunctionRef` very well suited for some use
+ * cases, but one has to be a bit more careful when using it to make sure that the referenced
+ * callable is not destructed.
+ *
+ * In particular, one must not construct a `FunctionRef` variable from a lambda directly as shown
+ * below. This is because the lambda object goes out of scope after the line finished executing and
+ * will be destructed. Calling the reference afterwards invokes undefined behavior.
+ *
+ * Don't:
+ * FunctionRef<int()> ref = []() { return 0; };
+ * Do:
+ * auto f = []() { return 0; };
+ * FuntionRef<int()> ref = f;
+ *
+ * It is fine to pass a lambda directly to a function:
+ *
+ * void some_function(FunctionRef<int()> f);
+ * some_function([]() { return 0; });
+ *
+ */
+
+namespace blender {
+
+template<typename Function> class FunctionRef;
+
+template<typename Ret, typename... Params> class FunctionRef<Ret(Params...)> {
+ private:
+ /**
+ * A function pointer that knows how to call the referenced callable with the given parameters.
+ */
+ Ret (*callback_)(intptr_t callable, Params... params) = nullptr;
+
+ /**
+ * A pointer to the referenced callable object. This can be a C function, a lambda object or any
+ * other callable.
+ *
+ * The value does not need to be initialized because it is not used unless callback_ is set as
+ * well, in which case it will be initialized as well.
+ *
+ * Use `intptr_t` to avoid warnings when casting to function pointers.
+ */
+ intptr_t callable_;
+
+ template<typename Callable> static Ret callback_fn(intptr_t callable, Params... params)
+ {
+ return (*reinterpret_cast<Callable *>(callable))(std::forward<Params>(params)...);
+ }
+
+ public:
+ FunctionRef() = default;
+
+ /**
+ * A `FunctionRef` itself is a callable as well. However, we don't want that this
+ * constructor is called when `Callable` is a `FunctionRef`. If we would allow this, it
+ * would be easy to accidentally create a `FunctionRef` that internally calls another
+ * `FunctionRef`. Usually, when assigning a `FunctionRef` to another, we want that both
+ * contain a reference to the same underlying callable afterwards.
+ *
+ * It is still possible to reference another `FunctionRef` by first wrapping it in
+ * another lambda.
+ */
+ template<typename Callable,
+ std::enable_if_t<!std::is_same_v<std::remove_cv_t<std::remove_reference_t<Callable>>,
+ FunctionRef>> * = nullptr>
+ FunctionRef(Callable &&callable)
+ : callback_(callback_fn<typename std::remove_reference_t<Callable>>),
+ callable_(reinterpret_cast<intptr_t>(&callable))
+ {
+ }
+
+ /**
+ * Call the referenced function and forward all parameters to it.
+ *
+ * This invokes undefined behavior if the `FunctionRef` does not reference a function currently.
+ */
+ Ret operator()(Params... params) const
+ {
+ BLI_assert(callback_ != nullptr);
+ return callback_(callable_, std::forward<Params>(params)...);
+ }
+
+ /**
+ * Returns true, when the `FunctionRef` references a function currently.
+ * If this returns false, the `FunctionRef` must not be called.
+ */
+ operator bool() const
+ {
+ /* Just checking `callback_` is enough to determine if the `FunctionRef` is in a state that it
+ * can be called in. */
+ return callback_ != nullptr;
+ }
+};
+
+} // namespace blender
diff --git a/source/blender/blenlib/BLI_hash.h b/source/blender/blenlib/BLI_hash.h
index d687e805323..cfd39ea3cf8 100644
--- a/source/blender/blenlib/BLI_hash.h
+++ b/source/blender/blenlib/BLI_hash.h
@@ -90,6 +90,16 @@ BLI_INLINE unsigned int BLI_hash_string(const char *str)
return i;
}
+BLI_INLINE float BLI_hash_int_2d_to_float(uint32_t kx, uint32_t ky)
+{
+ return (float)BLI_hash_int_2d(kx, ky) / (float)0xFFFFFFFFu;
+}
+
+BLI_INLINE float BLI_hash_int_3d_to_float(uint32_t kx, uint32_t ky, uint32_t kz)
+{
+ return (float)BLI_hash_int_3d(kx, ky, kz) / (float)0xFFFFFFFFu;
+}
+
BLI_INLINE unsigned int BLI_hash_int(unsigned int k)
{
return BLI_hash_int_2d(k, 0);
diff --git a/source/blender/blenlib/BLI_math.h b/source/blender/blenlib/BLI_math.h
index 51833d081d0..f6075367ac5 100644
--- a/source/blender/blenlib/BLI_math.h
+++ b/source/blender/blenlib/BLI_math.h
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h
index 0ec65999006..c862290b262 100644
--- a/source/blender/blenlib/BLI_math_base.h
+++ b/source/blender/blenlib/BLI_math_base.h
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_bits.h b/source/blender/blenlib/BLI_math_bits.h
index b007dd7cfed..e881f1a0e4e 100644
--- a/source/blender/blenlib/BLI_math_bits.h
+++ b/source/blender/blenlib/BLI_math_bits.h
@@ -12,8 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h
index 9e613270538..26d2f1fcb29 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_color_blend.h b/source/blender/blenlib/BLI_math_color_blend.h
index d5e4eedb1a6..2aff629def8 100644
--- a/source/blender/blenlib/BLI_math_color_blend.h
+++ b/source/blender/blenlib/BLI_math_color_blend.h
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index c0a9ea91e75..d767c2924d1 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
#pragma once
@@ -826,6 +825,11 @@ MINLINE float shell_v2v2_mid_normalized_to_dist(const float a[2], const float b[
float cubic_tangent_factor_circle_v3(const float tan_l[3], const float tan_r[3]);
+/********************************** Geodesics *********************************/
+
+float geodesic_distance_propagate_across_triangle(
+ const float v0[3], const float v1[3], const float v2[3], const float dist1, const float dist2);
+
/**************************** Inline Definitions ******************************/
#if BLI_MATH_DO_INLINE
diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h
index 506386f8d25..70f56d15164 100644
--- a/source/blender/blenlib/BLI_math_inline.h
+++ b/source/blender/blenlib/BLI_math_inline.h
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index d971f48c4cf..eac7f25f11a 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -17,7 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h
index 15d4dc21f8d..fe995b2e46e 100644
--- a/source/blender/blenlib/BLI_math_rotation.h
+++ b/source/blender/blenlib/BLI_math_rotation.h
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
#pragma once
@@ -178,7 +177,7 @@ typedef enum eEulerRotationOrders {
EULER_ORDER_YZX,
EULER_ORDER_ZXY,
EULER_ORDER_ZYX,
- /* there are 6 more entries with dulpicate entries included */
+ /* There are 6 more entries with duplicate entries included. */
} eEulerRotationOrders;
void eulO_to_quat(float quat[4], const float eul[3], const short order);
diff --git a/source/blender/blenlib/BLI_math_solvers.h b/source/blender/blenlib/BLI_math_solvers.h
index 9b2d1eedec7..13481e27e2a 100644
--- a/source/blender/blenlib/BLI_math_solvers.h
+++ b/source/blender/blenlib/BLI_math_solvers.h
@@ -15,7 +15,7 @@
*
* The Original Code is Copyright (C) 2015 by Blender Foundation
* All rights reserved.
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_statistics.h b/source/blender/blenlib/BLI_math_statistics.h
index ad6cb1a3c1e..6e818f5c8df 100644
--- a/source/blender/blenlib/BLI_math_statistics.h
+++ b/source/blender/blenlib/BLI_math_statistics.h
@@ -15,7 +15,7 @@
*
* The Original Code is Copyright (C) 2015 by Blender Foundation
* All rights reserved.
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index 16585e34419..bb1e1a1c38d 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
#pragma once
diff --git a/source/blender/blenlib/BLI_mesh_intersect.hh b/source/blender/blenlib/BLI_mesh_intersect.hh
index ddda3edf2ff..a7996939bb1 100644
--- a/source/blender/blenlib/BLI_mesh_intersect.hh
+++ b/source/blender/blenlib/BLI_mesh_intersect.hh
@@ -95,7 +95,7 @@ struct Plane {
/* Test equality on the exact fields. */
bool operator==(const Plane &other) const;
- /* Hash onthe exact fields. */
+ /* Hash on the exact fields. */
uint64_t hash() const;
void make_canonical();
@@ -144,7 +144,7 @@ struct Face : NonCopyable {
/* Test equality of verts, in same positions. */
bool operator==(const Face &other) const;
- /* Test equaliy faces allowing cyclic shifts. */
+ /* Test equality faces allowing cyclic shifts. */
bool cyclic_equal(const Face &other) const;
FacePos next_pos(FacePos p) const
diff --git a/source/blender/blenlib/BLI_mmap.h b/source/blender/blenlib/BLI_mmap.h
new file mode 100644
index 00000000000..4920152c9d1
--- /dev/null
+++ b/source/blender/blenlib/BLI_mmap.h
@@ -0,0 +1,56 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
+ * All rights reserved.
+ */
+
+#pragma once
+
+/** \file
+ * \ingroup bli
+ */
+
+#include "BLI_compiler_attrs.h"
+#include "BLI_utildefines.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Memory-mapped file IO that implements all the OS-specific details and error handling. */
+
+struct BLI_mmap_file;
+
+typedef struct BLI_mmap_file BLI_mmap_file;
+
+/* Prepares an opened file for memory-mapped IO.
+ * May return NULL if the operation fails.
+ * Note that this seeks to the end of the file to determine its length. */
+BLI_mmap_file *BLI_mmap_open(int fd) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
+
+/* Reads length bytes from file at the given offset into dest.
+ * Returns whether the operation was successful (may fail when reading beyond the file
+ * end or when IO errors occur). */
+bool BLI_mmap_read(BLI_mmap_file *file, void *dest, size_t offset, size_t length)
+ ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
+
+void *BLI_mmap_get_pointer(BLI_mmap_file *file) ATTR_WARN_UNUSED_RESULT;
+
+void BLI_mmap_free(BLI_mmap_file *file) ATTR_NONNULL(1);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/source/blender/blenlib/BLI_simd.h b/source/blender/blenlib/BLI_simd.h
new file mode 100644
index 00000000000..2ebbd7a2250
--- /dev/null
+++ b/source/blender/blenlib/BLI_simd.h
@@ -0,0 +1,36 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+/** \file
+ * \ingroup bli
+ *
+ * SIMD instruction support.
+ */
+
+#if defined(__ARM_NEON) && defined(WITH_SSE2NEON)
+/* SSE/SSE2 emulation on ARM Neon. Match SSE precision. */
+# define SSE2NEON_PRECISE_MINMAX 1
+# define SSE2NEON_PRECISE_DIV 1
+# define SSE2NEON_PRECISE_SQRT 1
+# include <sse2neon.h>
+# define BLI_HAVE_SSE2
+#elif defined(__SSE2__)
+/* Native SSE2 on Intel/AMD. */
+# include <emmintrin.h>
+# define BLI_HAVE_SSE2
+#endif
diff --git a/source/blender/blenlib/BLI_span.hh b/source/blender/blenlib/BLI_span.hh
index 8011b2f9abc..5f55efe3f63 100644
--- a/source/blender/blenlib/BLI_span.hh
+++ b/source/blender/blenlib/BLI_span.hh
@@ -142,15 +142,15 @@ template<typename T> class Span {
}
/**
- * Returns a contiguous part of the array. This invokes undefined behavior when the slice does
- * not stay within the bounds of the array.
+ * Returns a contiguous part of the array. This invokes undefined behavior when the start or size
+ * is negative.
*/
constexpr Span slice(int64_t start, int64_t size) const
{
BLI_assert(start >= 0);
BLI_assert(size >= 0);
- BLI_assert(start + size <= this->size() || size == 0);
- return Span(data_ + start, size);
+ const int64_t new_size = std::max<int64_t>(0, std::min(size, size_ - start));
+ return Span(data_ + start, new_size);
}
constexpr Span slice(IndexRange range) const
@@ -160,46 +160,46 @@ template<typename T> class Span {
/**
* Returns a new Span with n elements removed from the beginning. This invokes undefined
- * behavior when the array is too small.
+ * behavior when n is negative.
*/
constexpr Span drop_front(int64_t n) const
{
BLI_assert(n >= 0);
- BLI_assert(n <= this->size());
- return this->slice(n, this->size() - n);
+ const int64_t new_size = std::max<int64_t>(0, size_ - n);
+ return Span(data_ + n, new_size);
}
/**
* Returns a new Span with n elements removed from the beginning. This invokes undefined
- * behavior when the array is too small.
+ * behavior when n is negative.
*/
constexpr Span drop_back(int64_t n) const
{
BLI_assert(n >= 0);
- BLI_assert(n <= this->size());
- return this->slice(0, this->size() - n);
+ const int64_t new_size = std::max<int64_t>(0, size_ - n);
+ return Span(data_, new_size);
}
/**
* Returns a new Span that only contains the first n elements. This invokes undefined
- * behavior when the array is too small.
+ * behavior when n is negative.
*/
constexpr Span take_front(int64_t n) const
{
BLI_assert(n >= 0);
- BLI_assert(n <= this->size());
- return this->slice(0, n);
+ const int64_t new_size = std::min<int64_t>(size_, n);
+ return Span(data_, new_size);
}
/**
* Returns a new Span that only contains the last n elements. This invokes undefined
- * behavior when the array is too small.
+ * behavior when n is negative.
*/
constexpr Span take_back(int64_t n) const
{
BLI_assert(n >= 0);
- BLI_assert(n <= this->size());
- return this->slice(this->size() - n, n);
+ const int64_t new_size = std::min<int64_t>(size_, n);
+ return Span(data_ + size_ - new_size, new_size);
}
/**
@@ -481,6 +481,14 @@ template<typename T> class MutableSpan {
}
/**
+ * Returns true if the size is zero.
+ */
+ constexpr bool is_empty() const
+ {
+ return size_ == 0;
+ }
+
+ /**
* Replace all elements in the referenced array with the given value.
*/
constexpr void fill(const T &value)
@@ -534,53 +542,59 @@ template<typename T> class MutableSpan {
}
/**
- * Returns a contiguous part of the array. This invokes undefined behavior when the slice would
- * go out of bounds.
+ * Returns a contiguous part of the array. This invokes undefined behavior when the start or size
+ * is negative.
*/
- constexpr MutableSpan slice(const int64_t start, const int64_t length) const
+ constexpr MutableSpan slice(const int64_t start, const int64_t size) const
{
- BLI_assert(start + length <= this->size());
- return MutableSpan(data_ + start, length);
+ BLI_assert(start >= 0);
+ BLI_assert(size >= 0);
+ const int64_t new_size = std::max<int64_t>(0, std::min(size, size_ - start));
+ return MutableSpan(data_ + start, new_size);
}
/**
* Returns a new MutableSpan with n elements removed from the beginning. This invokes
- * undefined behavior when the array is too small.
+ * undefined behavior when n is negative.
*/
constexpr MutableSpan drop_front(const int64_t n) const
{
- BLI_assert(n <= this->size());
- return this->slice(n, this->size() - n);
+ BLI_assert(n >= 0);
+ const int64_t new_size = std::max<int64_t>(0, size_ - n);
+ return MutableSpan(data_ + n, new_size);
}
/**
* Returns a new MutableSpan with n elements removed from the end. This invokes undefined
- * behavior when the array is too small.
+ * behavior when n is negative.
*/
constexpr MutableSpan drop_back(const int64_t n) const
{
- BLI_assert(n <= this->size());
- return this->slice(0, this->size() - n);
+ BLI_assert(n >= 0);
+ const int64_t new_size = std::max<int64_t>(0, size_ - n);
+ return MutableSpan(data_, new_size);
}
/**
* Returns a new MutableSpan that only contains the first n elements. This invokes undefined
- * behavior when the array is too small.
+ * behavior when n is negative.
*/
constexpr MutableSpan take_front(const int64_t n) const
{
- BLI_assert(n <= this->size());
- return this->slice(0, n);
+ BLI_assert(n >= 0);
+ const int64_t new_size = std::min<int64_t>(size_, n);
+ return MutableSpan(data_, new_size);
}
/**
* Return a new MutableSpan that only contains the last n elements. This invokes undefined
- * behavior when the array is too small.
+ * behavior when n is negative.
*/
constexpr MutableSpan take_back(const int64_t n) const
{
- BLI_assert(n <= this->size());
- return this->slice(this->size() - n, n);
+ BLI_assert(n >= 0);
+ const int64_t new_size = std::min<int64_t>(size_, n);
+ return MutableSpan(data_ + size_ - new_size, new_size);
}
/**
diff --git a/source/blender/blenlib/BLI_string_ref.hh b/source/blender/blenlib/BLI_string_ref.hh
index a2562c6100a..0cff8fa7fb4 100644
--- a/source/blender/blenlib/BLI_string_ref.hh
+++ b/source/blender/blenlib/BLI_string_ref.hh
@@ -321,37 +321,36 @@ class StringRef : public StringRefBase {
}
/**
- * Returns a new StringRef that does not contain the first n chars.
- *
- * This is similar to std::string_view::remove_prefix.
+ * Returns a new StringRef that does not contain the first n chars. This invokes undefined
+ * behavior when n is negative.
*/
constexpr StringRef drop_prefix(const int64_t n) const
{
BLI_assert(n >= 0);
- BLI_assert(n <= size_);
- return StringRef(data_ + n, size_ - n);
+ const int64_t clamped_n = std::min(n, size_);
+ const int64_t new_size = size_ - clamped_n;
+ return StringRef(data_ + clamped_n, new_size);
}
/**
* Return a new StringRef with the given prefix being skipped. This invokes undefined behavior if
* the string does not begin with the given prefix.
*/
- constexpr StringRef drop_prefix(StringRef prefix) const
+ constexpr StringRef drop_known_prefix(StringRef prefix) const
{
BLI_assert(this->startswith(prefix));
return this->drop_prefix(prefix.size());
}
/**
- * Return a new StringRef that does not contain the last n chars.
- *
- * This is similar to std::string_view::remove_suffix.
+ * Return a new StringRef that does not contain the last n chars. This invokes undefined behavior
+ * when n is negative.
*/
constexpr StringRef drop_suffix(const int64_t n) const
{
BLI_assert(n >= 0);
- BLI_assert(n <= size_);
- return StringRef(data_, size_ - n);
+ const int64_t new_size = std::max<int64_t>(0, size_ - n);
+ return StringRef(data_, new_size);
}
/**
@@ -460,7 +459,8 @@ constexpr inline bool StringRefBase::endswith(StringRef suffix) const
}
/**
- * Return a new #StringRef containing only a sub-string of the original string.
+ * Return a new #StringRef containing only a sub-string of the original string. This invokes
+ * undefined if the start or max_size is negative.
*/
constexpr inline StringRef StringRefBase::substr(const int64_t start,
const int64_t max_size = INT64_MAX) const
diff --git a/source/blender/blenlib/BLI_sys_types.h b/source/blender/blenlib/BLI_sys_types.h
index ff1f6af9573..2740e3740f2 100644
--- a/source/blender/blenlib/BLI_sys_types.h
+++ b/source/blender/blenlib/BLI_sys_types.h
@@ -40,7 +40,7 @@ extern "C" {
#if defined(__linux__) || defined(__GNU__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
defined(__FreeBSD_kernel__) || defined(__HAIKU__)
-/* Linux-i386, Linux-Alpha, Linux-ppc */
+/* Linux-i386, Linux-Alpha, Linux-PPC */
# include <stdint.h>
/* XXX */
diff --git a/source/blender/blenlib/BLI_system.h b/source/blender/blenlib/BLI_system.h
index 8dd0706e1e2..0d5b2e6e2df 100644
--- a/source/blender/blenlib/BLI_system.h
+++ b/source/blender/blenlib/BLI_system.h
@@ -49,7 +49,7 @@ void BLI_hostname_get(char *buffer, size_t bufsize);
size_t BLI_system_memory_max_in_megabytes(void);
int BLI_system_memory_max_in_megabytes_int(void);
-/* getpid */
+/* For `getpid`. */
#ifdef WIN32
# define BLI_SYSTEM_PID_H <process.h>
diff --git a/source/blender/blenlib/BLI_task.hh b/source/blender/blenlib/BLI_task.hh
index 0da03d84793..8e963c958b2 100644
--- a/source/blender/blenlib/BLI_task.hh
+++ b/source/blender/blenlib/BLI_task.hh
@@ -22,15 +22,15 @@
#ifdef WITH_TBB
/* Quiet top level deprecation message, unrelated to API usage here. */
-# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1
-
# if defined(WIN32) && !defined(NOMINMAX)
/* TBB includes Windows.h which will define min/max macros causing issues
* when we try to use std::min and std::max later on. */
# define NOMINMAX
# define TBB_MIN_MAX_CLEANUP
# endif
-# include <tbb/tbb.h>
+# include <tbb/blocked_range.h>
+# include <tbb/parallel_for.h>
+# include <tbb/parallel_for_each.h>
# ifdef WIN32
/* We cannot keep this defined, since other parts of the code deal with this on their own, leading
* to multiple define warnings unless we un-define this, however we can only undefine this if we
diff --git a/source/blender/blenlib/BLI_voronoi_2d.h b/source/blender/blenlib/BLI_voronoi_2d.h
index 92c7d367b48..0e27229352f 100644
--- a/source/blender/blenlib/BLI_voronoi_2d.h
+++ b/source/blender/blenlib/BLI_voronoi_2d.h
@@ -50,7 +50,7 @@ typedef struct VoronoiEdge {
/* point on Voronoi place on the right side of edge */
float right[2];
- /* directional coeffitients satisfying equation y = f * x + g (edge lies on this line) */
+ /* Directional coefficients satisfying equation `y = f * x + g` (edge lies on this line). */
float f, g;
/* some edges consist of two parts,
diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h
index dc4d6d8fce4..f771d26baab 100644
--- a/source/blender/blenlib/BLI_winstuff.h
+++ b/source/blender/blenlib/BLI_winstuff.h
@@ -64,7 +64,7 @@ extern "C" {
# define S_ISDIR(x) (((x)&_S_IFDIR) == _S_IFDIR)
#endif
-/* defines for using ISO C++ conformant names */
+/* Defines for using ISO C++ conferment names. */
#if !defined(_MSC_VER) || _MSC_VER < 1900
# define snprintf _snprintf
#endif
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 45a1054fb53..5a851b7b2cb 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -54,6 +54,7 @@ set(SRC
intern/BLI_memblock.c
intern/BLI_memiter.c
intern/BLI_mempool.c
+ intern/BLI_mmap.c
intern/BLI_timer.c
intern/DLRB_tree.c
intern/array_store.c
@@ -191,6 +192,7 @@ set(SRC
BLI_float3.hh
BLI_float4x4.hh
BLI_fnmatch.h
+ BLI_function_ref.hh
BLI_ghash.h
BLI_gsqueue.h
BLI_hash.h
@@ -243,6 +245,7 @@ set(SRC
BLI_mempool.h
BLI_mesh_boolean.hh
BLI_mesh_intersect.hh
+ BLI_mmap.h
BLI_mpq2.hh
BLI_mpq3.hh
BLI_multi_value_map.hh
@@ -386,6 +389,7 @@ if(WITH_GTESTS)
tests/BLI_disjoint_set_test.cc
tests/BLI_edgehash_test.cc
tests/BLI_expr_pylike_eval_test.cc
+ tests/BLI_function_ref_test.cc
tests/BLI_ghash_test.cc
tests/BLI_hash_mm2a_test.cc
tests/BLI_heap_simple_test.cc
diff --git a/source/blender/blenlib/intern/BLI_filelist.c b/source/blender/blenlib/intern/BLI_filelist.c
index fe3ec368379..cc01693422c 100644
--- a/source/blender/blenlib/intern/BLI_filelist.c
+++ b/source/blender/blenlib/intern/BLI_filelist.c
@@ -369,7 +369,7 @@ void BLI_filelist_entry_datetime_to_string(const struct stat *st,
int yesterday_yday = 0;
if (r_is_today || r_is_yesterday) {
- /* Localtime() has only one buffer so need to get data out before called again. */
+ /* `localtime()` has only one buffer so need to get data out before called again. */
const time_t ts_now = time(NULL);
struct tm *today = localtime(&ts_now);
diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c
index 0f90ad3a490..a0e94e00634 100644
--- a/source/blender/blenlib/intern/BLI_kdopbvh.c
+++ b/source/blender/blenlib/intern/BLI_kdopbvh.c
@@ -94,7 +94,7 @@ struct BVHTree {
BVHNode *nodearray; /* pre-alloc branch nodes */
BVHNode **nodechild; /* pre-alloc children for nodes */
float *nodebv; /* pre-alloc bounding-volumes for nodes */
- float epsilon; /* epslion is used for inflation of the k-dop */
+ float epsilon; /* Epsilon is used for inflation of the K-DOP. */
int totleaf; /* leafs */
int totbranch;
axis_t start_axis, stop_axis; /* bvhtree_kdop_axes array indices according to axis */
@@ -365,7 +365,7 @@ static void create_kdop_hull(
int k;
axis_t axis_iter;
- /* don't init boudings for the moving case */
+ /* Don't initialize bounds for the moving case */
if (!moving) {
node_minmax_init(tree, node);
}
@@ -573,9 +573,9 @@ typedef struct BVHBuildHelper {
int tree_type;
int totleafs;
- /** Min number of leafs that are archievable from a node at depth N */
+ /** Min number of leafs that are achievable from a node at depth `N`. */
int leafs_per_child[32];
- /** Number of nodes at depth N (tree_type^N) */
+ /** Number of nodes at depth `N (tree_type^N)`. */
int branches_on_level[32];
/** Number of leafs that are placed on the level that is not 100% filled */
@@ -1312,7 +1312,7 @@ BVHTreeOverlap *BLI_bvhtree_overlap_ex(
bool use_threading = (flag & BVH_OVERLAP_USE_THREADING) != 0 &&
(tree1->totleaf > KDOPBVH_THREAD_LEAF_THRESHOLD);
- /* `RETURN_PAIRS` was not implemented without `max_interations`. */
+ /* 'RETURN_PAIRS' was not implemented without 'max_interactions'. */
BLI_assert(overlap_pairs || max_interactions);
const int root_node_len = BLI_bvhtree_overlap_thread_num(tree1);
diff --git a/source/blender/blenlib/intern/BLI_mmap.c b/source/blender/blenlib/intern/BLI_mmap.c
new file mode 100644
index 00000000000..2fd162de22c
--- /dev/null
+++ b/source/blender/blenlib/intern/BLI_mmap.c
@@ -0,0 +1,237 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup bli
+ */
+
+#include "BLI_mmap.h"
+#include "BLI_fileops.h"
+#include "BLI_listbase.h"
+#include "MEM_guardedalloc.h"
+
+#include <string.h>
+
+#ifndef WIN32
+# include <signal.h>
+# include <stdlib.h>
+# include <sys/mman.h> // for mmap
+# include <unistd.h> // for read close
+#else
+# include "BLI_winstuff.h"
+# include <io.h> // for open close read
+#endif
+
+struct BLI_mmap_file {
+ /* The address to which the file was mapped. */
+ char *memory;
+
+ /* The length of the file (and therefore the mapped region). */
+ size_t length;
+
+ /* Platform-specific handle for the mapping. */
+ void *handle;
+
+ /* Flag to indicate IO errors. Needs to be volatile since it's being set from
+ * within the signal handler, which is not part of the normal execution flow. */
+ volatile bool io_error;
+};
+
+#ifndef WIN32
+/* When using memory-mapped files, any IO errors will result in a SIGBUS signal.
+ * Therefore, we need to catch that signal and stop reading the file in question.
+ * To do so, we keep a list of all current FileDatas that use memory-mapped files,
+ * and if a SIGBUS is caught, we check if the failed address is inside one of the
+ * mapped regions.
+ * If it is, we set a flag to indicate a failed read and remap the memory in
+ * question to a zero-backed region in order to avoid additional signals.
+ * The code that actually reads the memory area has to check whether the flag was
+ * set after it's done reading.
+ * If the error occurred outside of a memory-mapped region, we call the previous
+ * handler if one was configured and abort the process otherwise.
+ */
+
+struct error_handler_data {
+ ListBase open_mmaps;
+ char configured;
+ void (*next_handler)(int, siginfo_t *, void *);
+} error_handler = {0};
+
+static void sigbus_handler(int sig, siginfo_t *siginfo, void *ptr)
+{
+ /* We only handle SIGBUS here for now. */
+ BLI_assert(sig == SIGBUS);
+
+ char *error_addr = (char *)siginfo->si_addr;
+ /* Find the file that this error belongs to. */
+ LISTBASE_FOREACH (LinkData *, link, &error_handler.open_mmaps) {
+ BLI_mmap_file *file = link->data;
+
+ /* Is the address where the error occurred in this file's mapped range? */
+ if (error_addr >= file->memory && error_addr < file->memory + file->length) {
+ file->io_error = true;
+
+ /* Replace the mapped memory with zeroes. */
+ const void *mapped_memory = mmap(
+ file->memory, file->length, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+ if (mapped_memory == MAP_FAILED) {
+ fprintf(stderr, "SIGBUS handler: Error replacing mapped file with zeros\n");
+ }
+
+ return;
+ }
+ }
+
+ /* Fall back to other handler if there was one. */
+ if (error_handler.next_handler) {
+ error_handler.next_handler(sig, siginfo, ptr);
+ }
+ else {
+ fprintf(stderr, "Unhandled SIGBUS caught\n");
+ abort();
+ }
+}
+
+/* Ensures that the error handler is set up and ready. */
+static bool sigbus_handler_setup(void)
+{
+ if (!error_handler.configured) {
+ struct sigaction newact = {0}, oldact = {0};
+
+ newact.sa_sigaction = sigbus_handler;
+ newact.sa_flags = SA_SIGINFO;
+
+ if (sigaction(SIGBUS, &newact, &oldact)) {
+ return false;
+ }
+
+ /* Remember the previously configured handler to fall back to it if the error
+ * does not belong to any of the mapped files. */
+ error_handler.next_handler = oldact.sa_sigaction;
+ error_handler.configured = 1;
+ }
+
+ return true;
+}
+
+/* Adds a file to the list that the error handler checks. */
+static void sigbus_handler_add(BLI_mmap_file *file)
+{
+ BLI_addtail(&error_handler.open_mmaps, BLI_genericNodeN(file));
+}
+
+/* Removes a file from the list that the error handler checks. */
+static void sigbus_handler_remove(BLI_mmap_file *file)
+{
+ LinkData *link = BLI_findptr(&error_handler.open_mmaps, file, offsetof(LinkData, data));
+ BLI_freelinkN(&error_handler.open_mmaps, link);
+}
+#endif
+
+BLI_mmap_file *BLI_mmap_open(int fd)
+{
+ void *memory, *handle = NULL;
+ size_t length = BLI_lseek(fd, 0, SEEK_END);
+
+#ifndef WIN32
+ /* Ensure that the SIGBUS handler is configured. */
+ if (!sigbus_handler_setup()) {
+ return NULL;
+ }
+
+ /* Map the given file to memory. */
+ memory = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0);
+ if (memory == MAP_FAILED) {
+ return NULL;
+ }
+#else
+ /* Convert the POSIX-style file descriptor to a Windows handle. */
+ void *file_handle = (void *)_get_osfhandle(fd);
+ /* Memory mapping on Windows is a two-step process - first we create a mapping,
+ * then we create a view into that mapping.
+ * In our case, one view that spans the entire file is enough. */
+ handle = CreateFileMapping(file_handle, NULL, PAGE_READONLY, 0, 0, NULL);
+ if (handle == NULL) {
+ return NULL;
+ }
+ memory = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, 0);
+ if (memory == NULL) {
+ CloseHandle(handle);
+ return NULL;
+ }
+#endif
+
+ /* Now that the mapping was successful, allocate memory and set up the BLI_mmap_file. */
+ BLI_mmap_file *file = MEM_callocN(sizeof(BLI_mmap_file), __func__);
+ file->memory = memory;
+ file->handle = handle;
+ file->length = length;
+
+#ifndef WIN32
+ /* Register the file with the error handler. */
+ sigbus_handler_add(file);
+#endif
+
+ return file;
+}
+
+bool BLI_mmap_read(BLI_mmap_file *file, void *dest, size_t offset, size_t length)
+{
+ /* If a previous read has already failed or we try to read past the end,
+ * don't even attempt to read any further. */
+ if (file->io_error || (offset + length > file->length)) {
+ return false;
+ }
+
+#ifndef WIN32
+ /* If an error occurs in this call, sigbus_handler will be called and will set
+ * file->io_error to true. */
+ memcpy(dest, file->memory + offset, length);
+#else
+ /* On Windows, we use exception handling to be notified of errors. */
+ __try {
+ memcpy(dest, file->memory + offset, length);
+ }
+ __except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ? EXCEPTION_EXECUTE_HANDLER :
+ EXCEPTION_CONTINUE_SEARCH) {
+ file->io_error = true;
+ return false;
+ }
+#endif
+
+ return !file->io_error;
+}
+
+void *BLI_mmap_get_pointer(BLI_mmap_file *file)
+{
+ return file->memory;
+}
+
+void BLI_mmap_free(BLI_mmap_file *file)
+{
+#ifndef WIN32
+ munmap((void *)file->memory, file->length);
+ sigbus_handler_remove(file);
+#else
+ UnmapViewOfFile(file->memory);
+ CloseHandle(file->handle);
+#endif
+
+ MEM_freeN(file);
+}
diff --git a/source/blender/blenlib/intern/array_store.c b/source/blender/blenlib/intern/array_store.c
index 847cb42186a..cc1d6df10f5 100644
--- a/source/blender/blenlib/intern/array_store.c
+++ b/source/blender/blenlib/intern/array_store.c
@@ -533,7 +533,7 @@ static void bchunk_list_calc_trim_len(const BArrayInfo *info,
data_trim_len = data_trim_len - data_last_chunk_len;
if (data_last_chunk_len) {
if (data_last_chunk_len < info->chunk_byte_size_min) {
- /* may be zero and thats OK */
+ /* May be zero and that's OK. */
data_trim_len -= info->chunk_byte_size;
data_last_chunk_len += info->chunk_byte_size;
}
@@ -1012,7 +1012,6 @@ static const BChunkRef *table_lookup(const BArrayInfo *info,
/* -------------------------------------------------------------------- */
/** \name Main Data De-Duplication Function
- *
* \{ */
/**
diff --git a/source/blender/blenlib/intern/bitmap_draw_2d.c b/source/blender/blenlib/intern/bitmap_draw_2d.c
index 33250105c79..9d3b66d72d7 100644
--- a/source/blender/blenlib/intern/bitmap_draw_2d.c
+++ b/source/blender/blenlib/intern/bitmap_draw_2d.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/boxpack_2d.c b/source/blender/blenlib/intern/boxpack_2d.c
index 9840dc77148..84b3f728884 100644
--- a/source/blender/blenlib/intern/boxpack_2d.c
+++ b/source/blender/blenlib/intern/boxpack_2d.c
@@ -385,7 +385,7 @@ void BLI_box_pack_2d(BoxPack *boxarray, const uint len, float *r_tot_x, float *r
box++; /* next box, needed for the loop below */
/* ...done packing the first box */
- /* Main boxpacking loop */
+ /* Main box-packing loop */
for (box_index = 1; box_index < len; box_index++, box++) {
/* These floats are used for sorting re-sorting */
@@ -414,8 +414,7 @@ void BLI_box_pack_2d(BoxPack *boxarray, const uint len, float *r_tot_x, float *r
/* This vert has a free quadrant
* Test if we can place the box here
- * vert->free & quad_flags[j] - Checks
- * */
+ * `vert->free & quad_flags[j]` - Checks. */
for (j = 0; (j < 4) && isect; j++) {
if (vert->free & quad_flag(j)) {
diff --git a/source/blender/blenlib/intern/convexhull_2d.c b/source/blender/blenlib/intern/convexhull_2d.c
index a3d24787d27..cb4ef54bfb7 100644
--- a/source/blender/blenlib/intern/convexhull_2d.c
+++ b/source/blender/blenlib/intern/convexhull_2d.c
@@ -28,7 +28,7 @@
#include "BLI_strict_flags.h"
#include "BLI_utildefines.h"
-/* Copyright 2001, softSurfer (www.softsurfer.com)
+/* Copyright 2001, softSurfer (http://www.softsurfer.com)
* This code may be freely used and modified for any purpose
* providing that this copyright notice is included with it.
* SoftSurfer makes no warranty for this code, and cannot be held
diff --git a/source/blender/blenlib/intern/delaunay_2d.cc b/source/blender/blenlib/intern/delaunay_2d.cc
index f0b65a55816..06a749ab921 100644
--- a/source/blender/blenlib/intern/delaunay_2d.cc
+++ b/source/blender/blenlib/intern/delaunay_2d.cc
@@ -561,14 +561,14 @@ template<typename T> void cdt_draw(const std::string &label, const CDTArrangemen
const vec2<double> &uco = u->co.approx;
const vec2<double> &vco = v->co.approx;
int strokew = e->input_ids == nullptr ? thin_line : thick_line;
- f << "<line fill=\"none\" stroke=\"black\" stroke-width=\"" << strokew << "\" x1=\""
+ f << R"(<line fill="none" stroke="black" stroke-width=")" << strokew << "\" x1=\""
<< SX(uco[0]) << "\" y1=\"" << SY(uco[1]) << "\" x2=\"" << SX(vco[0]) << "\" y2=\""
<< SY(vco[1]) << "\">\n";
f << " <title>" << vertname(u) << vertname(v) << "</title>\n";
f << "</line>\n";
if (draw_edge_labels) {
f << "<text x=\"" << SX((uco[0] + vco[0]) / 2) << "\" y=\"" << SY((uco[1] + vco[1]) / 2)
- << "\" font-size=\"small\">";
+ << R"(" font-size="small">)";
f << vertname(u) << vertname(v) << sename(&e->symedges[0]) << sename(&e->symedges[1])
<< "</text>\n";
}
@@ -576,13 +576,13 @@ template<typename T> void cdt_draw(const std::string &label, const CDTArrangemen
int i = 0;
for (const CDTVert<T> *v : cdt.verts) {
- f << "<circle fill=\"black\" cx=\"" << SX(v->co.approx[0]) << "\" cy=\"" << SY(v->co.approx[1])
+ f << R"(<circle fill="black" cx=")" << SX(v->co.approx[0]) << "\" cy=\"" << SY(v->co.approx[1])
<< "\" r=\"" << vert_radius << "\">\n";
f << " <title>[" << i << "]" << v->co.approx << "</title>\n";
f << "</circle>\n";
if (draw_vert_labels) {
f << "<text x=\"" << SX(v->co.approx[0]) + vert_radius << "\" y=\""
- << SY(v->co.approx[1]) - vert_radius << "\" font-size=\"small\">[" << i << "]</text>\n";
+ << SY(v->co.approx[1]) - vert_radius << R"(" font-size="small">[)" << i << "]</text>\n";
}
++i;
}
@@ -754,7 +754,7 @@ template<> CDTVert<double>::CDTVert(const vec2<double> &pt)
{
this->co.exact = pt;
this->co.approx = pt;
- this->co.abs_approx = pt; /* Not used, so does't matter. */
+ this->co.abs_approx = pt; /* Not used, so doesn't matter. */
this->input_ids = nullptr;
this->symedge = nullptr;
this->index = -1;
@@ -1411,12 +1411,12 @@ void dc_tri(CDTArrangement<T> *cdt,
/* Guibas-Stolfi Divide-and_Conquer algorithm. */
template<typename T> void dc_triangulate(CDTArrangement<T> *cdt, Array<SiteInfo<T>> &sites)
{
- /* Compress sites in place to eliminted verts that merge to others. */
+ /* Compress sites in place to eliminated verts that merge to others. */
int i = 0;
int j = 0;
int nsites = sites.size();
while (j < nsites) {
- /* Invariante: sites[0..i-1] have non-merged verts from 0..(j-1) in them. */
+ /* Invariant: `sites[0..i-1]` have non-merged verts from `0..(j-1)` in them. */
sites[i] = sites[j++];
if (sites[i].v->merge_to_index < 0) {
i++;
@@ -1500,7 +1500,7 @@ template<typename T> static void re_delaunay_triangulate(CDTArrangement<T> *cdt,
cse = ss;
}
}
- /* Add diagonals necessary to make abc a triangle. */
+ /* Add diagonals necessary to make `abc` a triangle. */
CDTEdge<T> *ebc = nullptr;
CDTEdge<T> *eca = nullptr;
if (!exists_edge(b, c)) {
diff --git a/source/blender/blenlib/intern/dot_export.cc b/source/blender/blenlib/intern/dot_export.cc
index eb15a51366e..93075a23c07 100644
--- a/source/blender/blenlib/intern/dot_export.cc
+++ b/source/blender/blenlib/intern/dot_export.cc
@@ -221,7 +221,7 @@ void Attributes::export__as_bracket_list(std::stringstream &ss) const
ss << "[";
attributes_.foreach_item([&](StringRef key, StringRef value) {
if (StringRef(value).startswith("<")) {
- /* Don't draw the quotes, this is an html-like value. */
+ /* Don't draw the quotes, this is an HTML-like value. */
ss << key << "=" << value << ", ";
}
else {
@@ -275,10 +275,10 @@ NodeWithSocketsRef::NodeWithSocketsRef(Node &node,
{
std::stringstream ss;
- ss << "<<table border=\"0\" cellspacing=\"3\">";
+ ss << R"(<<table border="0" cellspacing="3">)";
/* Header */
- ss << "<tr><td colspan=\"3\" align=\"center\"><b>";
+ ss << R"(<tr><td colspan="3" align="center"><b>)";
ss << ((name.size() == 0) ? "No Name" : name);
ss << "</b></td></tr>";
@@ -291,7 +291,7 @@ NodeWithSocketsRef::NodeWithSocketsRef(Node &node,
if (name.size() == 0) {
name = "No Name";
}
- ss << "<td align=\"left\" port=\"in" << i << "\">";
+ ss << R"(<td align="left" port="in)" << i << "\">";
ss << name;
ss << "</td>";
}
@@ -304,7 +304,7 @@ NodeWithSocketsRef::NodeWithSocketsRef(Node &node,
if (name.size() == 0) {
name = "No Name";
}
- ss << "<td align=\"right\" port=\"out" << i << "\">";
+ ss << R"(<td align="right" port="out)" << i << "\">";
ss << name;
ss << "</td>";
}
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index bb218995c83..106bd5bc793 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -158,7 +158,7 @@ char *BLI_file_ungzip_to_mem(const char *from_file, int *r_size)
return mem;
}
-#define CHUNK 256 * 1024
+#define CHUNK (256 * 1024)
/* gzip byte array from memory and write it to file at certain position.
* return size of gzip stream.
diff --git a/source/blender/blenlib/intern/freetypefont.c b/source/blender/blenlib/intern/freetypefont.c
index 301d9dc2296..e755a8e75b5 100644
--- a/source/blender/blenlib/intern/freetypefont.c
+++ b/source/blender/blenlib/intern/freetypefont.c
@@ -307,7 +307,7 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
/* Extract the first 256 character from TTF */
lcode = charcode = FT_Get_First_Char(face, &glyph_index);
- /* No charmap found from the ttf so we need to figure it out */
+ /* No `charmap` found from the TTF so we need to figure it out. */
if (glyph_index == 0) {
FT_CharMap found = NULL;
FT_CharMap charmap;
diff --git a/source/blender/blenlib/intern/gsqueue.c b/source/blender/blenlib/intern/gsqueue.c
index 118d19418d4..ae34074e804 100644
--- a/source/blender/blenlib/intern/gsqueue.c
+++ b/source/blender/blenlib/intern/gsqueue.c
@@ -41,7 +41,7 @@ struct QueueChunk {
struct _GSQueue {
struct QueueChunk *chunk_first; /* first active chunk to pop from */
- struct QueueChunk *chunk_last; /* flast active chunk to push onto */
+ struct QueueChunk *chunk_last; /* last active chunk to push onto */
struct QueueChunk *chunk_free; /* free chunks to reuse */
size_t chunk_first_index; /* index into 'chunk_first' */
size_t chunk_last_index; /* index into 'chunk_last' */
diff --git a/source/blender/blenlib/intern/jitter_2d.c b/source/blender/blenlib/intern/jitter_2d.c
index c92aeddb27d..068cb3d2f70 100644
--- a/source/blender/blenlib/intern/jitter_2d.c
+++ b/source/blender/blenlib/intern/jitter_2d.c
@@ -179,7 +179,7 @@ void BLI_jitter_init(float (*jitarr)[2], int num)
MEM_freeN(jit2);
- /* finally, move jittertab to be centered around (0, 0) */
+ /* Finally, move jitter to be centered around (0, 0). */
for (i = 0; i < num; i++) {
jitarr[i][0] -= 0.5f;
jitarr[i][1] -= 0.5f;
diff --git a/source/blender/blenlib/intern/kdtree_impl.h b/source/blender/blenlib/intern/kdtree_impl.h
index 26b2228cdbc..c92dc2e95a3 100644
--- a/source/blender/blenlib/intern/kdtree_impl.h
+++ b/source/blender/blenlib/intern/kdtree_impl.h
@@ -158,7 +158,7 @@ static uint kdtree_balance(KDTreeNode *nodes, uint nodes_len, uint axis, const u
return 0 + ofs;
}
- /* quicksort style sorting around median */
+ /* Quick-sort style sorting around median. */
left = 0;
right = nodes_len - 1;
median = nodes_len / 2;
diff --git a/source/blender/blenlib/intern/list_sort_impl.h b/source/blender/blenlib/intern/list_sort_impl.h
index 46738803ee8..8f979ba5b0b 100644
--- a/source/blender/blenlib/intern/list_sort_impl.h
+++ b/source/blender/blenlib/intern/list_sort_impl.h
@@ -205,7 +205,7 @@ BLI_INLINE list_node *sweep_up(struct SortInfo *si, list_node *list, unsigned in
* The 'ranks' array essentially captures the recursion stack of a mergesort.
* The merge tree is built in a bottom-up manner. The control loop for
* updating the 'ranks' array is analogous to incrementing a binary integer,
- * and the `O(n)` time for counting upto n translates to `O(n)` merges when
+ * and the `O(n)` time for counting `upto` n translates to `O(n)` merges when
* inserting `rank-0` lists.
* When we plug in the sizes of the lists involved in those merges,
* we get the `O(n log n)` time for the sort.
diff --git a/source/blender/blenlib/intern/math_base.c b/source/blender/blenlib/intern/math_base.c
index 2bf06371740..1137c4114a5 100644
--- a/source/blender/blenlib/intern/math_base.c
+++ b/source/blender/blenlib/intern/math_base.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c
index 1dc7c21f1d4..39945960e68 100644
--- a/source/blender/blenlib/intern/math_base_inline.c
+++ b/source/blender/blenlib/intern/math_base_inline.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
@@ -32,11 +31,8 @@
#include <stdio.h>
#include <stdlib.h>
-#ifdef __SSE2__
-# include <emmintrin.h>
-#endif
-
#include "BLI_math_base.h"
+#include "BLI_simd.h"
#ifdef __cplusplus
extern "C" {
@@ -380,7 +376,7 @@ MINLINE float fractf(float a)
return a - floorf(a);
}
-/* Adapted from godotengine math_funcs.h. */
+/* Adapted from godot-engine math_funcs.h. */
MINLINE float wrapf(float value, float max, float min)
{
float range = max - min;
@@ -686,10 +682,10 @@ MINLINE int integer_digits_i(const int i)
/* Internal helpers for SSE2 implementation.
*
- * NOTE: Are to be called ONLY from inside `#ifdef __SSE2__` !!!
+ * NOTE: Are to be called ONLY from inside `#ifdef BLI_HAVE_SSE2` !!!
*/
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
/* Calculate initial guess for arg^exp based on float representation
* This method gives a constant bias, which can be easily compensated by
@@ -717,7 +713,7 @@ MALWAYS_INLINE __m128 _bli_math_improve_5throot_solution(const __m128 old_result
__m128 approx2 = _mm_mul_ps(old_result, old_result);
__m128 approx4 = _mm_mul_ps(approx2, approx2);
__m128 t = _mm_div_ps(x, approx4);
- __m128 summ = _mm_add_ps(_mm_mul_ps(_mm_set1_ps(4.0f), old_result), t); /* fma */
+ __m128 summ = _mm_add_ps(_mm_mul_ps(_mm_set1_ps(4.0f), old_result), t); /* FMA. */
return _mm_mul_ps(summ, _mm_set1_ps(1.0f / 5.0f));
}
@@ -770,7 +766,7 @@ MALWAYS_INLINE __m128 _bli_math_blend_sse(const __m128 mask, const __m128 a, con
return _mm_or_ps(_mm_and_ps(mask, a), _mm_andnot_ps(mask, b));
}
-#endif /* __SSE2__ */
+#endif /* BLI_HAVE_SSE2 */
/* Low level conversion functions */
MINLINE unsigned char unit_float_to_uchar_clamp(float val)
diff --git a/source/blender/blenlib/intern/math_bits_inline.c b/source/blender/blenlib/intern/math_bits_inline.c
index ba18bb73850..1b381dccbfd 100644
--- a/source/blender/blenlib/intern/math_bits_inline.c
+++ b/source/blender/blenlib/intern/math_bits_inline.c
@@ -12,8 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/math_boolean.cc b/source/blender/blenlib/intern/math_boolean.cc
index a345bc1d0af..6d4806a3fbc 100644
--- a/source/blender/blenlib/intern/math_boolean.cc
+++ b/source/blender/blenlib/intern/math_boolean.cc
@@ -160,7 +160,7 @@ static RobustInitCaller init_caller;
* Carnegie Mellon University
* 5000 Forbes Avenue
* Pittsburgh, Pennsylvania 15213-3891
- * jrs@cs.cmu.edu
+ * <jrs@cs.cmu.edu>
*
* This file contains C implementation of algorithms for exact addition
* and multiplication of floating-point numbers, and predicates for
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 31ee81de40e..8fd2802a547 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/math_color_blend_inline.c b/source/blender/blenlib/intern/math_color_blend_inline.c
index 7ad4f0d9585..53257cc9285 100644
--- a/source/blender/blenlib/intern/math_color_blend_inline.c
+++ b/source/blender/blenlib/intern/math_color_blend_inline.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/math_color_inline.c b/source/blender/blenlib/intern/math_color_inline.c
index 1264620cf36..4c50c1c7af8 100644
--- a/source/blender/blenlib/intern/math_color_inline.c
+++ b/source/blender/blenlib/intern/math_color_inline.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
@@ -35,14 +34,14 @@
/******************************** Color Space ********************************/
-# ifdef __SSE2__
+# ifdef BLI_HAVE_SSE2
MALWAYS_INLINE __m128 srgb_to_linearrgb_v4_simd(const __m128 c)
{
__m128 cmp = _mm_cmplt_ps(c, _mm_set1_ps(0.04045f));
__m128 lt = _mm_max_ps(_mm_mul_ps(c, _mm_set1_ps(1.0f / 12.92f)), _mm_set1_ps(0.0f));
__m128 gtebase = _mm_mul_ps(_mm_add_ps(c, _mm_set1_ps(0.055f)),
- _mm_set1_ps(1.0f / 1.055f)); /* fma */
+ _mm_set1_ps(1.0f / 1.055f)); /* FMA. */
__m128 gte = _bli_math_fastpow24(gtebase);
return _bli_math_blend_sse(cmp, lt, gte);
}
@@ -76,7 +75,7 @@ MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3])
srgb[2] = r[2];
}
-# else /* __SSE2__ */
+# else /* BLI_HAVE_SSE2 */
MINLINE void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3])
{
@@ -91,7 +90,7 @@ MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3])
srgb[1] = linearrgb_to_srgb(linear[1]);
srgb[2] = linearrgb_to_srgb(linear[2]);
}
-# endif /* __SSE2__ */
+# endif /* BLI_HAVE_SSE2 */
MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4])
{
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 3cc4d03d547..b7e94e6c512 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
@@ -1439,12 +1438,12 @@ int isect_line_sphere_v3(const float l1[3],
/* adapted for use in blender by Campbell Barton - 2011
*
* atelier iebele abel - 2001
- * atelier@iebele.nl
+ * <atelier@iebele.nl>
* http://www.iebele.nl
*
* sphere_line_intersection function adapted from:
* http://astronomy.swin.edu.au/pbourke/geometry/sphereline
- * Paul Bourke pbourke@swin.edu.au
+ * Paul Bourke <pbourke@swin.edu.au>
*/
const float ldir[3] = {
@@ -3887,7 +3886,7 @@ void interp_weights_quad_v3(float w[4],
* - 0 if the point is outside of triangle.
* - 1 if the point is inside triangle.
* - 2 if it's on the edge.
- * */
+ */
int barycentric_inside_triangle_v2(const float w[3])
{
if (IN_RANGE(w[0], 0.0f, 1.0f) && IN_RANGE(w[1], 0.0f, 1.0f) && IN_RANGE(w[2], 0.0f, 1.0f)) {
@@ -5234,7 +5233,7 @@ void map_to_sphere(float *r_u, float *r_v, const float x, const float y, const f
len = sqrtf(x * x + y * y + z * z);
if (len > 0.0f) {
if (UNLIKELY(x == 0.0f && y == 0.0f)) {
- *r_u = 0.0f; /* othwise domain error */
+ *r_u = 0.0f; /* Otherwise domain error. */
}
else {
*r_u = (1.0f - atan2f(x, y) / (float)M_PI) / 2.0f;
@@ -5837,7 +5836,7 @@ bool form_factor_visible_quad(const float p[3],
return true;
}
-/* altivec optimization, this works, but is unused */
+/* `AltiVec` optimization, this works, but is unused. */
#if 0
# include <Accelerate/Accelerate.h>
@@ -5908,7 +5907,7 @@ static float ff_quad_form_factor(float *p, float *n, float *q0, float *q1, float
#if 0
-# include <xmmintrin.h>
+# include "BLI_simd.h"
static __m128 sse_approx_acos(__m128 x)
{
@@ -6126,7 +6125,7 @@ bool is_quad_convex_v3(const float v1[3], const float v2[3], const float v3[3],
bool is_quad_convex_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2])
{
- /* linetests, the 2 diagonals have to instersect to be convex */
+ /* Line-tests, the 2 diagonals have to intersect to be convex. */
return (isect_seg_seg_v2(v1, v3, v2, v4) > 0);
}
@@ -6234,7 +6233,7 @@ float cubic_tangent_factor_circle_v3(const float tan_l[3], const float tan_r[3])
return (1.0f / 3.0f) * 0.75f;
}
if (tan_dot < -1.0f + eps) {
- /* parallele tangents (half-circle) */
+ /* Parallel tangents (half-circle). */
return (1.0f / 2.0f);
}
@@ -6246,3 +6245,56 @@ float cubic_tangent_factor_circle_v3(const float tan_l[3], const float tan_r[3])
const float angle_cos = cosf(angle);
return ((1.0f - angle_cos) / (angle_sin * 2.0f)) / angle_sin;
}
+
+/**
+ * Utility for computing approximate geodesic distances on triangle meshes.
+ *
+ * Given triangle with vertex coordinates v0, v1, v2, and known geodesic distances
+ * dist1 and dist2 at v1 and v2, estimate a geodesic distance at vertex v0.
+ *
+ * From "Dart Throwing on Surfaces", EGSR 2009. Section 7, Geodesic Dart Throwing.
+ */
+float geodesic_distance_propagate_across_triangle(
+ const float v0[3], const float v1[3], const float v2[3], const float dist1, const float dist2)
+{
+ /* Vectors along triangle edges. */
+ float v10[3], v12[3];
+ sub_v3_v3v3(v10, v0, v1);
+ sub_v3_v3v3(v12, v2, v1);
+
+ if (dist1 != 0.0f && dist2 != 0.0f) {
+ /* Local coordinate system in the triangle plane. */
+ float u[3], v[3], n[3];
+ const float d12 = normalize_v3_v3(u, v12);
+
+ if (d12 * d12 > 0.0f) {
+ cross_v3_v3v3(n, v12, v10);
+ normalize_v3(n);
+ cross_v3_v3v3(v, n, u);
+
+ /* v0 in local coordinates */
+ const float v0_[2] = {dot_v3v3(v10, u), fabsf(dot_v3v3(v10, v))};
+
+ /* Compute virtual source point in local coordinates, that we estimate the geodesic
+ * distance is being computed from. See figure 9 in the paper for the derivation. */
+ const float a = 0.5f * (1.0f + (dist1 * dist1 - dist2 * dist2) / (d12 * d12));
+ const float hh = dist1 * dist1 - a * a * d12 * d12;
+
+ if (hh > 0.0f) {
+ const float h = sqrtf(hh);
+ const float S_[2] = {a * d12, -h};
+
+ /* Only valid if the line between the source point and v0 crosses
+ * the edge between v1 and v2. */
+ const float x_intercept = S_[0] + h * (v0_[0] - S_[0]) / (v0_[1] + h);
+ if (x_intercept >= 0.0f && x_intercept <= d12) {
+ return len_v2v2(S_, v0_);
+ }
+ }
+ }
+ }
+
+ /* Fall back to Dijsktra approximation in trivial case, or if no valid source
+ * point found that connects to v0 across the triangle. */
+ return min_ff(dist1 + len_v3(v10), dist2 + len_v3v3(v0, v2));
+}
diff --git a/source/blender/blenlib/intern/math_geom_inline.c b/source/blender/blenlib/intern/math_geom_inline.c
index db317f5e81d..23c351026f2 100644
--- a/source/blender/blenlib/intern/math_geom_inline.c
+++ b/source/blender/blenlib/intern/math_geom_inline.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/math_interp.c b/source/blender/blenlib/intern/math_interp.c
index 3cec3db9806..163a3ab5fe3 100644
--- a/source/blender/blenlib/intern/math_interp.c
+++ b/source/blender/blenlib/intern/math_interp.c
@@ -139,10 +139,10 @@ BLI_INLINE void bicubic_interpolation(const unsigned char *byte_buffer,
y1 = j + m;
CLAMP(y1, 0, height - 1);
- /* normally we could do this */
- /* w = P(n-a) * P(b-m); */
- /* except that would call P() 16 times per pixel therefor pow() 64 times,
- * better precalc these */
+ /* Normally we could do this:
+ * `w = P(n-a) * P(b-m);`
+ * except that would call `P()` 16 times per pixel therefor `pow()` 64 times,
+ * better pre-calculate these. */
w = wx * wy[m + 1];
if (float_output) {
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 6b5efc3f8c4..b460d75d77f 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -277,7 +277,7 @@ void mul_m4_m4m4_uniq(float R[4][4], const float A[4][4], const float B[4][4])
BLI_assert(!ELEM(R, A, B));
/* matrix product: R[j][k] = A[j][i] . B[i][k] */
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 A0 = _mm_loadu_ps(A[0]);
__m128 A1 = _mm_loadu_ps(A[1]);
__m128 A2 = _mm_loadu_ps(A[2]);
diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index 19828e69638..57fe99ce019 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -594,7 +594,7 @@ float quat_split_swing_and_twist(const float q_in[4], int axis, float r_swing[4]
BLI_assert(fabsf(r_swing[axis + 1]) < BLI_ASSERT_UNIT_EPSILON);
}
- /* Output twist last just in case q ovelaps r_twist. */
+ /* Output twist last just in case q overlaps r_twist. */
if (r_twist) {
r_twist[0] = cos_t;
zero_v3(r_twist + 1);
@@ -1581,7 +1581,7 @@ void quat_to_compatible_eul(float eul[3], const float oldrot[3], const float qua
* was adapted from
* ANSI C code from the article
* "Euler Angle Conversion"
- * by Ken Shoemake, shoemake@graphics.cis.upenn.edu
+ * by Ken Shoemake <shoemake@graphics.cis.upenn.edu>
* in "Graphics Gems IV", Academic Press, 1994
* for use in Blender
*/
diff --git a/source/blender/blenlib/intern/math_solvers.c b/source/blender/blenlib/intern/math_solvers.c
index e366d834fc4..85900dc32a6 100644
--- a/source/blender/blenlib/intern/math_solvers.c
+++ b/source/blender/blenlib/intern/math_solvers.c
@@ -15,7 +15,7 @@
*
* The Original Code is Copyright (C) 2015 by Blender Foundation.
* All rights reserved.
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/math_statistics.c b/source/blender/blenlib/intern/math_statistics.c
index 18affbed708..b90ac99dbfe 100644
--- a/source/blender/blenlib/intern/math_statistics.c
+++ b/source/blender/blenlib/intern/math_statistics.c
@@ -15,7 +15,7 @@
*
* The Original Code is Copyright (C) 2015 by Blender Foundation.
* All rights reserved.
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/math_vec.cc b/source/blender/blenlib/intern/math_vec.cc
index 84fa6c69d17..1d138d0b0f4 100644
--- a/source/blender/blenlib/intern/math_vec.cc
+++ b/source/blender/blenlib/intern/math_vec.cc
@@ -104,7 +104,7 @@ mpq2::isect_result mpq2::isect_seg_seg(const mpq2 &v1,
}
else {
ans.lambda = ((v1[1] - v3[1]) * (v4[0] - v3[0]) - (v1[0] - v3[0]) * (v4[1] - v3[1])) / div;
- /* Avoid dividing mu by div: it is expensive in multiprecision. */
+ /* Avoid dividing mu by div: it is expensive in multi-precision. */
mpq_class mudiv = ((v1[1] - v3[1]) * (v2[0] - v1[0]) - (v1[0] - v3[0]) * (v2[1] - v1[1]));
if (ans.lambda >= 0 && ans.lambda <= 1 &&
((div > 0 && mudiv >= 0 && mudiv <= div) || (div < 0 && mudiv <= 0 && mudiv >= div))) {
diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c
index da16fb4a9fb..a21e0c8f092 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index f17b7535258..ead354c2d87 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -17,8 +17,7 @@
* All rights reserved.
*
* The Original Code is: some of this file.
- *
- * */
+ */
/** \file
* \ingroup bli
diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc
index 88d90a7816f..fffa37b935b 100644
--- a/source/blender/blenlib/intern/mesh_boolean.cc
+++ b/source/blender/blenlib/intern/mesh_boolean.cc
@@ -27,10 +27,14 @@
# include "BLI_array.hh"
# include "BLI_assert.h"
# include "BLI_delaunay_2d.h"
+# include "BLI_double3.hh"
+# include "BLI_float3.hh"
# include "BLI_hash.hh"
+# include "BLI_kdopbvh.h"
# include "BLI_map.hh"
# include "BLI_math.h"
# include "BLI_math_boolean.hh"
+# include "BLI_math_geom.h"
# include "BLI_math_mpq.hh"
# include "BLI_mesh_intersect.hh"
# include "BLI_mpq3.hh"
@@ -45,6 +49,7 @@
# include "BLI_mesh_boolean.hh"
// # define PERFDEBUG
+
namespace blender::meshintersect {
/**
@@ -2328,159 +2333,216 @@ static const char *bool_optype_name(BoolOpType op)
}
}
-static mpq3 calc_point_inside_tri(const Face &tri)
+static double3 calc_point_inside_tri_db(const Face &tri)
{
const Vert *v0 = tri.vert[0];
const Vert *v1 = tri.vert[1];
const Vert *v2 = tri.vert[2];
- mpq3 ans = v0->co_exact / 3 + v1->co_exact / 3 + v2->co_exact / 3;
+ double3 ans = v0->co / 3 + v1->co / 3 + v2->co / 3;
return ans;
}
+class InsideShapeTestData {
+ public:
+ const IMesh &tm;
+ std::function<int(int)> shape_fn;
+ int nshapes;
+ /* A per-shape vector of parity of hits of that shape. */
+ Array<int> hit_parity;
+
+ InsideShapeTestData(const IMesh &tm, std::function<int(int)> shape_fn, int nshapes)
+ : tm(tm), shape_fn(shape_fn), nshapes(nshapes)
+ {
+ }
+};
-/**
- * Return the Generalized Winding Number of point \a testp with respect to the
- * volume implied by the faces for which shape_fn returns the value shape.
- * See "Robust Inside-Outside Segmentation using Generalized Winding Numbers"
- * by Jacobson, Kavan, and Sorkine-Hornung.
- * This is like a winding number in that if it is positive, the point
- * is inside the volume. But it is tolerant of not-completely-watertight
- * volumes, still doing a passable job of classifying inside/outside
- * as we intuitively understand that to mean.
- *
- * TOOD: speed up this calculation using the hierarchical algorithm in that paper.
- */
-static double generalized_winding_number(const IMesh &tm,
- std::function<int(int)> shape_fn,
- const double3 &testp,
- int shape)
+static void inside_shape_callback(void *userdata,
+ int index,
+ const BVHTreeRay *ray,
+ BVHTreeRayHit *UNUSED(hit))
{
- constexpr int dbg_level = 0;
+ const int dbg_level = 0;
if (dbg_level > 0) {
- std::cout << "GENERALIZED_WINDING_NUMBER testp = " << testp << ", shape = " << shape << "\n";
+ std::cout << "inside_shape_callback, index = " << index << "\n";
}
- double gwn = 0;
- for (int t : tm.face_index_range()) {
- const Face *f = tm.face(t);
- const Face &tri = *f;
- if (shape_fn(tri.orig) == shape) {
- if (dbg_level > 0) {
- std::cout << "accumulate for tri t = " << t << " = " << f << "\n";
- }
- const Vert *v0 = tri.vert[0];
- const Vert *v1 = tri.vert[1];
- const Vert *v2 = tri.vert[2];
- double3 a = v0->co - testp;
- double3 b = v1->co - testp;
- double3 c = v2->co - testp;
- /* Calculate the solid angle of abc relative to origin.
- * See "The Solid Angle of a Plane Triangle" by Oosterom and Strackee
- * for the derivation of the formula. */
- double alen = a.length();
- double blen = b.length();
- double clen = c.length();
- double3 bxc = double3::cross_high_precision(b, c);
- double num = double3::dot(a, bxc);
- double denom = alen * blen * clen + double3::dot(a, b) * clen + double3::dot(a, c) * blen +
- double3::dot(b, c) * alen;
- if (denom == 0.0) {
- if (dbg_level > 0) {
- std::cout << "denom == 0, skipping this tri\n";
- }
- continue;
- }
- double x = atan2(num, denom);
- double fgwn = 2.0 * x;
- if (dbg_level > 0) {
- std::cout << "tri contributes " << fgwn << "\n";
- }
- gwn += fgwn;
- }
+ InsideShapeTestData *data = static_cast<InsideShapeTestData *>(userdata);
+ const Face &tri = *data->tm.face(index);
+ int shape = data->shape_fn(tri.orig);
+ if (shape == -1) {
+ return;
+ }
+ float dist;
+ float fv0[3];
+ float fv1[3];
+ float fv2[3];
+ for (int i = 0; i < 3; ++i) {
+ fv0[i] = float(tri.vert[0]->co[i]);
+ fv1[i] = float(tri.vert[1]->co[i]);
+ fv2[i] = float(tri.vert[2]->co[i]);
}
- gwn = gwn / (M_PI * 4.0);
if (dbg_level > 0) {
- std::cout << "final gwn = " << gwn << "\n";
+ std::cout << " fv0=(" << fv0[0] << "," << fv0[1] << "," << fv0[2] << ")\n";
+ std::cout << " fv1=(" << fv1[0] << "," << fv1[1] << "," << fv1[2] << ")\n";
+ std::cout << " fv2=(" << fv2[0] << "," << fv2[1] << "," << fv2[2] << ")\n";
+ }
+ if (isect_ray_tri_epsilon_v3(
+ ray->origin, ray->direction, fv0, fv1, fv2, &dist, nullptr, FLT_EPSILON)) {
+ /* Count parity as +1 if ray is in the same direction as tri's normal,
+ * and -1 if the directions are opposite. */
+ double3 o_db{double(ray->origin[0]), double(ray->origin[1]), double(ray->origin[2])};
+ int parity = orient3d(tri.vert[0]->co, tri.vert[1]->co, tri.vert[2]->co, o_db);
+ if (dbg_level > 0) {
+ std::cout << "origin at " << o_db << ", parity = " << parity << "\n";
+ }
+ data->hit_parity[shape] += parity;
}
- return gwn;
}
/**
- * Return true if point \a testp is inside the volume implied by the
- * faces for which the shape_fn returns the value shape.
- * If \a high_confidence is true then we want a higher degree
- * of "insideness" than if it is false.
+ * Test the triangle with index \a t_index to see which shapes it is inside,
+ * and fill in \a in_shape with a confidence value between 0 and 1 that says
+ * how likely we think it is that it is inside.
+ * This is done by casting some rays from just on the positive side of a test
+ * face in various directions and summing the parity of crossing faces of each face.
+ *
+ * \param tree: Contains all the triangles of \a tm and can be used for fast ray-casting.
*/
-static bool point_is_inside_shape(const IMesh &tm,
- std::function<int(int)> shape_fn,
- const double3 &testp,
- int shape,
- bool high_confidence)
+static void test_tri_inside_shapes(const IMesh &tm,
+ std::function<int(int)> shape_fn,
+ int nshapes,
+ int test_t_index,
+ BVHTree *tree,
+ Array<float> &in_shape)
{
- double gwn = generalized_winding_number(tm, shape_fn, testp, shape);
- /* Due to floating point error, an outside point should get a value
- * of zero for gwn, but may have a very slightly positive value instead.
- * It is not important to get this epsilon very small, because practical
- * cases of interest will have gwn at least 0.2 if it is not zero. */
- if (high_confidence) {
- return (gwn > 0.9);
+ const int dbg_level = 0;
+ if (dbg_level > 0) {
+ std::cout << "test_point_inside_shapes, t_index = " << test_t_index << "\n";
+ }
+ Face &tri_test = *tm.face(test_t_index);
+ int shape = shape_fn(tri_test.orig);
+ if (shape == -1) {
+ in_shape.fill(0.0f);
+ return;
+ }
+ double3 test_point = calc_point_inside_tri_db(tri_test);
+ /* Offset the test point a tiny bit in the tri_test normal direction. */
+ tri_test.populate_plane(false);
+ double3 norm = tri_test.plane->norm.normalized();
+ const double offset_amount = 1e-5;
+ double3 offset_test_point = test_point + offset_amount * norm;
+ if (dbg_level > 0) {
+ std::cout << "test tri is in shape " << shape << "\n";
+ std::cout << "test point = " << test_point << "\n";
+ std::cout << "offset_test_point = " << offset_test_point << "\n";
+ }
+ /* Try six test rays almost along orthogonal axes.
+ * Perturb their directions slightly to make it less likely to hit a seam.
+ * Ray-cast assumes they have unit length, so use r1 near 1 and
+ * ra near 0.5, and rb near .01, but normalized so `sqrt(r1^2 + ra^2 + rb^2) == 1`. */
+ constexpr int num_rays = 6;
+ constexpr float r1 = 0.9987025295199663f;
+ constexpr float ra = 0.04993512647599832f;
+ constexpr float rb = 0.009987025295199663f;
+ const float test_rays[num_rays][3] = {
+ {r1, ra, rb}, {-r1, -ra, -rb}, {rb, r1, ra}, {-rb, -r1, -ra}, {ra, rb, r1}, {-ra, -rb, -r1}};
+ InsideShapeTestData data(tm, shape_fn, nshapes);
+ data.hit_parity = Array<int>(nshapes, 0);
+ Array<int> count_insides(nshapes, 0);
+ const float co[3] = {
+ float(offset_test_point[0]), float(offset_test_point[1]), float(offset_test_point[2])};
+ for (int i = 0; i < num_rays; ++i) {
+ if (dbg_level > 0) {
+ std::cout << "shoot ray " << i << "(" << test_rays[i][0] << "," << test_rays[i][1] << ","
+ << test_rays[i][2] << ")\n";
+ }
+ BLI_bvhtree_ray_cast_all(tree, co, test_rays[i], 0.0f, FLT_MAX, inside_shape_callback, &data);
+ if (dbg_level > 0) {
+ std::cout << "ray " << i << " result:";
+ for (int j = 0; j < nshapes; ++j) {
+ std::cout << " " << data.hit_parity[j];
+ }
+ std::cout << "\n";
+ }
+ for (int j = 0; j < nshapes; ++j) {
+ if (j != shape && data.hit_parity[j] > 0) {
+ ++count_insides[j];
+ }
+ }
+ data.hit_parity.fill(0);
+ }
+ for (int j = 0; j < nshapes; ++j) {
+ if (j == shape) {
+ in_shape[j] = 1.0f; /* Let's say a shape is always inside itself. */
+ }
+ else {
+ in_shape[j] = float(count_insides[j]) / float(num_rays);
+ }
+ if (dbg_level > 0) {
+ std::cout << "shape " << j << " inside = " << in_shape[j] << "\n";
+ }
}
-
- return (gwn > 0.01);
}
/**
- * Use the Generalized Winding Number method for deciding if a patch of the
+ * Use the RayCast method for deciding if a triangle of the
* mesh is supposed to be included or excluded in the boolean result,
* and return the mesh that is the boolean result.
+ * The reason this is done on a triangle-by-triangle basis is that
+ * when the input is not PWN, some patches can be both inside and outside
+ * some shapes (e.g., a plane cutting through Suzanne's open eyes).
*/
-static IMesh gwn_boolean(const IMesh &tm,
- BoolOpType op,
- int nshapes,
- std::function<int(int)> shape_fn,
- const PatchesInfo &pinfo,
- IMeshArena *arena)
+static IMesh raycast_boolean(const IMesh &tm,
+ BoolOpType op,
+ int nshapes,
+ std::function<int(int)> shape_fn,
+ IMeshArena *arena)
{
constexpr int dbg_level = 0;
if (dbg_level > 0) {
- std::cout << "GWN_BOOLEAN\n";
+ std::cout << "RAYCAST_BOOLEAN\n";
}
IMesh ans;
+
+ /* Build a BVH tree of tm's triangles.
+ * We could possibly reuse the BVH tree(s) build in TriOverlaps in
+ * the mesh intersect function. A future TODO. */
+ BVHTree *tree = BLI_bvhtree_new(tm.face_size(), FLT_EPSILON, 8, 8);
+ for (int i : tm.face_index_range()) {
+ const Face *f = tm.face(i);
+ float t_cos[9];
+ for (int j = 0; j < 3; ++j) {
+ const Vert *v = f->vert[j];
+ for (int k = 0; k < 3; ++k) {
+ t_cos[3 * j + k] = float(v->co[k]);
+ }
+ }
+ BLI_bvhtree_insert(tree, i, t_cos, 3);
+ }
+ BLI_bvhtree_balance(tree);
+
Vector<Face *> out_faces;
out_faces.reserve(tm.face_size());
+ Array<float> in_shape(nshapes, 0);
Array<int> winding(nshapes, 0);
- for (int p : pinfo.index_range()) {
- const Patch &patch = pinfo.patch(p);
- /* For test triangle, choose one in the middle of patch list
- * as the ones near the beginning may be very near other patches. */
- int test_t_index = patch.tri(patch.tot_tri() / 2);
- Face &tri_test = *tm.face(test_t_index);
- /* Assume all triangles in a patch are in the same shape. */
- int shape = shape_fn(tri_test.orig);
+ for (int t : tm.face_index_range()) {
+ Face &tri = *tm.face(t);
+ int shape = shape_fn(tri.orig);
if (dbg_level > 0) {
- std::cout << "process patch " << p << " = " << patch << "\n";
- std::cout << "test tri = " << test_t_index << " = " << &tri_test << "\n";
+ std::cout << "process triangle " << t << " = " << &tri << "\n";
std::cout << "shape = " << shape << "\n";
}
- if (shape == -1) {
- continue;
- }
- mpq3 test_point = calc_point_inside_tri(tri_test);
- double3 test_point_db(test_point[0].get_d(), test_point[1].get_d(), test_point[2].get_d());
- if (dbg_level > 0) {
- std::cout << "test point = " << test_point_db << "\n";
- }
+ test_tri_inside_shapes(tm, shape_fn, nshapes, t, tree, in_shape);
for (int other_shape = 0; other_shape < nshapes; ++other_shape) {
if (other_shape == shape) {
continue;
}
- /* The point_is_inside_shape function has to approximate if the other
- * shape is not PWN. For most operations, even a hint of being inside
+ /* The in_shape array has a confidence value for "insideness".
+ * For most operations, even a hint of being inside
* gives good results, but when shape is a cutter in a Difference
* operation, we want to be pretty sure that the point is inside other_shape.
* E.g., T75827.
*/
bool need_high_confidence = (op == BoolOpType::Difference) && (shape != 0);
- bool inside = point_is_inside_shape(
- tm, shape_fn, test_point_db, other_shape, need_high_confidence);
+ bool inside = in_shape[other_shape] >= (need_high_confidence ? 0.5f : 0.1f);
if (dbg_level > 0) {
std::cout << "test point is " << (inside ? "inside" : "outside") << " other_shape "
<< other_shape << "\n";
@@ -2503,29 +2565,26 @@ static IMesh gwn_boolean(const IMesh &tm,
std::cout << winding[i] << " ";
}
std::cout << "\niv0=" << in_output_volume_0 << ", iv1=" << in_output_volume_1 << "\n";
- std::cout << "result for patch " << p << ": remove=" << do_remove << ", flip=" << do_flip
+ std::cout << "result for tri " << t << ": remove=" << do_remove << ", flip=" << do_flip
<< "\n";
}
if (!do_remove) {
- for (int t : patch.tris()) {
- Face *f = tm.face(t);
- if (!do_flip) {
- out_faces.append(f);
- }
- else {
- Face &tri = *f;
- /* We need flipped version of f. */
- Array<const Vert *> flipped_vs = {tri[0], tri[2], tri[1]};
- Array<int> flipped_e_origs = {tri.edge_orig[2], tri.edge_orig[1], tri.edge_orig[0]};
- Array<bool> flipped_is_intersect = {
- tri.is_intersect[2], tri.is_intersect[1], tri.is_intersect[0]};
- Face *flipped_f = arena->add_face(
- flipped_vs, f->orig, flipped_e_origs, flipped_is_intersect);
- out_faces.append(flipped_f);
- }
+ if (!do_flip) {
+ out_faces.append(&tri);
+ }
+ else {
+ /* We need flipped version of tri. */
+ Array<const Vert *> flipped_vs = {tri[0], tri[2], tri[1]};
+ Array<int> flipped_e_origs = {tri.edge_orig[2], tri.edge_orig[1], tri.edge_orig[0]};
+ Array<bool> flipped_is_intersect = {
+ tri.is_intersect[2], tri.is_intersect[1], tri.is_intersect[0]};
+ Face *flipped_f = arena->add_face(
+ flipped_vs, tri.orig, flipped_e_origs, flipped_is_intersect);
+ out_faces.append(flipped_f);
}
}
}
+ BLI_bvhtree_free(tree);
ans.set_faces(out_faces);
return ans;
}
@@ -2546,6 +2605,27 @@ static int find_cdt_edge(const CDT_result<mpq_class> &cdt_out, int v1, int v2)
return -1;
}
+/* Return the original edge id for the cdt output edge e_out, given that
+ * the only input to CDT was face f. Pick the first, if there are several. */
+static int orig_edge_for_cdt_edge(const CDT_result<mpq_class> &cdt_out,
+ int cdt_e_out,
+ const Face *f)
+{
+ for (int cdt_e_orig : cdt_out.edge_orig[cdt_e_out]) {
+ if (cdt_e_orig != NO_INDEX) {
+ BLI_assert(cdt_e_orig >= cdt_out.face_edge_offset);
+ int a = cdt_e_orig / cdt_out.face_edge_offset;
+ int b = cdt_e_orig % cdt_out.face_edge_offset;
+ /* It is the bth position within cdt input face a - 1. There is only one face, f. */
+ BLI_assert(a == 1);
+ UNUSED_VARS_NDEBUG(a);
+ BLI_assert(b < f->size());
+ return f->edge_orig[b];
+ }
+ }
+ return NO_INDEX;
+}
+
/**
* Tessellate face f into triangles and return an array of `const Face *`
* giving that triangulation.
@@ -2601,13 +2681,7 @@ static Array<Face *> triangulate_poly(Face *f, IMeshArena *arena)
for (int i = 0; i < 3; ++i) {
int e_out = find_cdt_edge(cdt_out, i_v_out[i], i_v_out[(i + 1) % 3]);
BLI_assert(e_out != -1);
- eo[i] = NO_INDEX;
- for (int orig : cdt_out.edge_orig[e_out]) {
- if (orig != NO_INDEX) {
- eo[i] = orig;
- break;
- }
- }
+ eo[i] = orig_edge_for_cdt_edge(cdt_out, e_out, f);
}
if (rev) {
ans[t] = arena->add_face(
@@ -3109,6 +3183,14 @@ static Vector<Face *> merge_tris_for_face(Vector<int> tris,
return ans;
}
+static bool approx_in_line(const double3 &a, const double3 &b, const double3 &c)
+{
+ double3 vec1 = b - a;
+ double3 vec2 = c - b;
+ double cos_ang = double3::dot(vec1.normalized(), vec2.normalized());
+ return fabs(cos_ang - 1.0) < 1e-4;
+}
+
/**
* Return an array, paralleling imesh_out.vert, saying which vertices can be dissolved.
* A vertex v can be dissolved if (a) it is not an input vertex; (b) it has valence 2;
@@ -3161,8 +3243,11 @@ static Array<bool> find_dissolve_verts(IMesh &imesh_out, int *r_count_dissolve)
const std::pair<const Vert *, const Vert *> &nbrs = neighbors[v_out];
if (nbrs.first != nullptr) {
BLI_assert(nbrs.second != nullptr);
- dissolve[v_out] = true;
- ++count;
+ const Vert *v_v_out = imesh_out.vert(v_out);
+ if (approx_in_line(nbrs.first->co, v_v_out->co, nbrs.second->co)) {
+ dissolve[v_out] = true;
+ ++count;
+ }
}
}
}
@@ -3339,30 +3424,27 @@ IMesh boolean_trimesh(IMesh &tm_in,
double topo_time = PIL_check_seconds_timer();
std::cout << " topology built, time = " << topo_time - intersect_time << "\n";
# endif
- PatchesInfo pinfo = find_patches(tm_si, tm_si_topo);
+ bool pwn = is_pwn(tm_si, tm_si_topo);
# ifdef PERFDEBUG
- double patch_time = PIL_check_seconds_timer();
- std::cout << " patches found, time = " << patch_time - topo_time << "\n";
+ double pwn_time = PIL_check_seconds_timer();
+ std::cout << " pwn checked, time = " << pwn_time - topo_time << "\n";
# endif
IMesh tm_out;
- if (!is_pwn(tm_si, tm_si_topo)) {
-# ifdef PERFDEBUG
- double pwn_check_time = PIL_check_seconds_timer();
- std::cout << " pwn checked (not pwn), time = " << pwn_check_time - patch_time << "\n";
-# endif
+ if (!pwn) {
if (dbg_level > 0) {
- std::cout << "Input is not PWN, using gwn method\n";
+ std::cout << "Input is not PWN, using raycast method\n";
}
- tm_out = gwn_boolean(tm_si, op, nshapes, shape_fn, pinfo, arena);
+ tm_out = raycast_boolean(tm_si, op, nshapes, shape_fn, arena);
# ifdef PERFDEBUG
- double gwn_time = PIL_check_seconds_timer();
- std::cout << " gwn, time = " << gwn_time - pwn_check_time << "\n";
+ double raycast_time = PIL_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 pwn_time = PIL_check_seconds_timer();
- std::cout << " pwn checked (ok), time = " << pwn_time - patch_time << "\n";
+ double patch_time = PIL_check_seconds_timer();
+ std::cout << " patches found, time = " << patch_time - pwn_time << "\n";
# endif
CellsInfo cinfo = find_cells(tm_si, tm_si_topo, pinfo);
if (dbg_level > 0) {
diff --git a/source/blender/blenlib/intern/mesh_intersect.cc b/source/blender/blenlib/intern/mesh_intersect.cc
index 85a6ab42013..b2b8dd4e900 100644
--- a/source/blender/blenlib/intern/mesh_intersect.cc
+++ b/source/blender/blenlib/intern/mesh_intersect.cc
@@ -1055,25 +1055,22 @@ static std::ostream &operator<<(std::ostream &os, const CoplanarClusterInfo &cli
enum ITT_value_kind { INONE, IPOINT, ISEGMENT, ICOPLANAR };
struct ITT_value {
- mpq3 p1; /* Only relevant for IPOINT and ISEGMENT kind. */
- mpq3 p2; /* Only relevant for ISEGMENT kind. */
- int t_source; /* Index of the source triangle that intersected the target one. */
- enum ITT_value_kind kind;
+ mpq3 p1; /* Only relevant for IPOINT and ISEGMENT kind. */
+ mpq3 p2; /* Only relevant for ISEGMENT kind. */
+ int t_source = -1; /* Index of the source triangle that intersected the target one. */
+ enum ITT_value_kind kind = INONE;
- ITT_value() : t_source(-1), kind(INONE)
- {
- }
- ITT_value(ITT_value_kind k) : t_source(-1), kind(k)
+ ITT_value() = default;
+ explicit ITT_value(ITT_value_kind k) : kind(k)
{
}
ITT_value(ITT_value_kind k, int tsrc) : t_source(tsrc), kind(k)
{
}
- ITT_value(ITT_value_kind k, const mpq3 &p1) : p1(p1), t_source(-1), kind(k)
+ ITT_value(ITT_value_kind k, const mpq3 &p1) : p1(p1), kind(k)
{
}
- ITT_value(ITT_value_kind k, const mpq3 &p1, const mpq3 &p2)
- : p1(p1), p2(p2), t_source(-1), kind(k)
+ ITT_value(ITT_value_kind k, const mpq3 &p1, const mpq3 &p2) : p1(p1), p2(p2), kind(k)
{
}
ITT_value(const ITT_value &other)
@@ -1385,7 +1382,7 @@ static ITT_value itt_canon2(const mpq3 &p1,
return ITT_value(ISEGMENT, intersect_1, intersect_2);
}
-/* Helper function for intersect_tri_tri. Args have been canonicalized for triangle 1. */
+/* Helper function for intersect_tri_tri. Arguments have been canonicalized for triangle 1. */
static ITT_value itt_canon1(const mpq3 &p1,
const mpq3 &q1,
@@ -2026,7 +2023,7 @@ class TriOverlaps {
if (dbg_level > 0) {
std::cout << "TriOverlaps construction\n";
}
- /* Tree type is 8 => octtree; axis = 6 => using XYZ axes only. */
+ /* Tree type is 8 => octree; axis = 6 => using XYZ axes only. */
tree_ = BLI_bvhtree_new(tm.face_size(), FLT_EPSILON, 8, 6);
/* In the common case of a binary boolean and no self intersection in
* each shape, we will use two trees and simple bounding box overlap. */
@@ -2378,7 +2375,7 @@ static CDT_data calc_cluster_subdivided(const CoplanarClusterInfo &clinfo,
}
}
}
- /* Use CDT to subdivide the cluster triangles and the points and segs in itts. */
+ /* Use CDT to subdivide the cluster triangles and the points and segments in itts. */
CDT_data cd_data = prepare_cdt_input_for_cluster(tm, clinfo, c, itts);
do_cdt(cd_data);
return cd_data;
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index b770a267eee..996a1622239 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -36,6 +36,10 @@ static float noise3_perlin(const float vec[3]);
/* UNUSED */
// #define HASHVEC(x, y, z) hashvectf + 3 * hash[(hash[(hash[(z) & 255] + (y)) & 255] + (x)) & 255]
+/* -------------------------------------------------------------------- */
+/** \name Static Data
+ * \{ */
+
/* needed for voronoi */
#define HASHPNT(x, y, z) hashpntf + 3 * hash[(hash[(hash[(z)&255] + (y)) & 255] + (x)) & 255]
static const float hashpntf[768] = {
@@ -263,9 +267,11 @@ static const float hashvectf[768] = {
0.64801, -0.100586, 0.114716, 0.044525, -0.992371, 0.966003, 0.244873, -0.082764,
};
-/**************************/
-/* IMPROVED PERLIN NOISE */
-/**************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Improved Perlin Noise Implementation (New)
+ * \{ */
BLI_INLINE float lerp(float t, float a, float b)
{
@@ -328,9 +334,11 @@ static float newPerlinU(float x, float y, float z)
return (0.5f + 0.5f * newPerlin(x, y, z));
}
-/**************************/
-/* END OF IMPROVED PERLIN */
-/**************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Improved Perlin Noise Implementation (Original)
+ * \{ */
/* Was BLI_noise_hnoise(), removed noisesize, so other functions can call it without scaling. */
static float orgBlenderNoise(float x, float y, float z)
@@ -855,9 +863,11 @@ float BLI_noise_hnoisep(float noisesize, float x, float y, float z)
return noise3_perlin(vec);
}
-/******************/
-/* VORONOI/WORLEY */
-/******************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Voronoi/Worley Implementation
+ * \{ */
/* distance metrics for voronoi, e parameter only used in Minkowski */
/* Camberra omitted, didn't seem useful */
@@ -1105,13 +1115,11 @@ static float voronoi_CrS(float x, float y, float z)
return (2.0f * t - 1.0f);
}
-/***************/
-/* voronoi end */
-/***************/
+/** \} */
-/*************/
-/* CELLNOISE */
-/*************/
+/* -------------------------------------------------------------------- */
+/** \name Cell-Noise Implementation
+ * \{ */
/* returns unsigned cellnoise */
static float BLI_cellNoiseU(float x, float y, float z)
@@ -1152,9 +1160,11 @@ void BLI_noise_cell_v3(float x, float y, float z, float ca[3])
ca[2] = p[2];
}
-/*****************/
-/* end cellnoise */
-/*****************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Public API's
+ * \{ */
/* newnoise: generic noise function for use with different noisebases */
float BLI_noise_generic_noise(
@@ -1747,6 +1757,4 @@ float BLI_noise_mg_variable_lacunarity(
return noisefunc2(x + rv[0], y + rv[1], z + rv[2]); /* distorted-domain noise */
}
-/****************/
-/* musgrave end */
-/****************/
+/** \} */
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 5636ffafb6a..b076d0f09c1 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -459,7 +459,7 @@ static wchar_t *next_slash(wchar_t *path)
return slash;
}
-/* adds a slash if the unc path points sto a share */
+/* Adds a slash if the UNC path points to a share. */
static void BLI_path_add_slash_to_share(wchar_t *uncpath)
{
wchar_t *slash_after_server = next_slash(uncpath + 2);
@@ -1279,7 +1279,7 @@ void BLI_setenv(const char *env, const char *val)
uputenv(env, val);
#else
- /* linux/osx/bsd */
+ /* Linux/macOS/BSD */
if (val) {
setenv(env, val, 1);
}
@@ -1375,7 +1375,7 @@ void BLI_make_file_string(const char *relabase, char *string, const char *dir, c
}
}
else {
- return; /* string is NULL, probably shouldnt happen but return anyway */
+ return; /* string is NULL, probably shouldn't happen but return anyway */
}
/* Resolve relative references */
@@ -1650,7 +1650,7 @@ bool BLI_path_filename_ensure(char *filepath, size_t maxlen, const char *filenam
* - Wont create any directories.
* - Doesn't use CWD, or deal with relative paths.
* - Only fill's in \a dir and \a file when they are non NULL.
- * */
+ */
void BLI_split_dirfile(
const char *string, char *dir, char *file, const size_t dirlen, const size_t filelen)
{
diff --git a/source/blender/blenlib/intern/polyfill_2d.c b/source/blender/blenlib/intern/polyfill_2d.c
index fe9fa514e08..dadef979b09 100644
--- a/source/blender/blenlib/intern/polyfill_2d.c
+++ b/source/blender/blenlib/intern/polyfill_2d.c
@@ -253,7 +253,7 @@ static uint kdtree2d_balance_recursive(
return 0 + ofs;
}
- /* quicksort style sorting around median */
+ /* Quick-sort style sorting around median. */
neg = 0;
pos = totnode - 1;
median = totnode / 2;
@@ -284,7 +284,7 @@ static uint kdtree2d_balance_recursive(
}
}
- /* set node and sort subnodes */
+ /* Set node and sort sub-nodes. */
node = &nodes[median];
node->axis = axis;
axis = !axis;
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 2a520516418..8c9a229860e 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -526,10 +526,10 @@ static unsigned int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int fl
if (eve->poly_nr == nr) {
if (eve->f != SF_VERT_ZERO_LEN) {
verts++;
- eve->f = SF_VERT_NEW; /* flag for connectedges later on */
+ eve->f = SF_VERT_NEW; /* Flag for connect edges later on. */
sc->vert = eve;
sc->edge_first = sc->edge_last = NULL;
- /* Note, debug print only will work for curve polyfill, union is in use for mesh */
+ /* Note, debug print only will work for curve poly-fill, union is in use for mesh. */
/* if (even->tmp.v == NULL) eve->tmp.u = verts; */
sc++;
}
@@ -609,7 +609,7 @@ static unsigned int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int fl
sc = scdata;
for (a = 0; a < verts; a++) {
/* printf("VERTEX %d index %d\n", a, sc->vert->tmp.u); */
- /* set connectflags */
+ /* Set connect-flags. */
for (ed1 = sc->edge_first; ed1; ed1 = eed_next) {
eed_next = ed1->next;
if (ed1->v1->edge_tot == 1 || ed1->v2->edge_tot == 1) {
diff --git a/source/blender/blenlib/intern/scanfill_utils.c b/source/blender/blenlib/intern/scanfill_utils.c
index b49239547c2..ec0f8659395 100644
--- a/source/blender/blenlib/intern/scanfill_utils.c
+++ b/source/blender/blenlib/intern/scanfill_utils.c
@@ -244,7 +244,7 @@ static bool scanfill_preprocess_self_isect(ScanFillContext *sf_ctx,
continue;
}
- /* maintain coorect terminating edge */
+ /* Maintain correct terminating edge. */
if (pi->edge_last == eed) {
pi->edge_last = NULL;
}
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index d1e133318ba..bb00755e901 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -30,7 +30,7 @@
#include <sys/stat.h>
#if defined(__NetBSD__) || defined(__DragonFly__) || defined(__HAIKU__)
-/* Other modern unix os's should probably use this also */
+/* Other modern unix OS's should probably use this also. */
# include <sys/statvfs.h>
# define USE_STATFS_STATVFS
#endif
@@ -113,7 +113,7 @@ double BLI_dir_free_space(const char *dir)
char tmp[4];
tmp[0] = '\\';
- tmp[1] = 0; /* Just a failsafe */
+ tmp[1] = 0; /* Just a fail-safe. */
if (ELEM(dir[0] == '/', '\\')) {
tmp[0] = '\\';
tmp[1] = 0;
diff --git a/source/blender/blenlib/intern/string_search.cc b/source/blender/blenlib/intern/string_search.cc
index a45909f92d8..a09aa7a4bc2 100644
--- a/source/blender/blenlib/intern/string_search.cc
+++ b/source/blender/blenlib/intern/string_search.cc
@@ -447,7 +447,7 @@ int BLI_string_search_query(StringSearch *search, const char *query, void ***r_d
for (const int score : result_indices_by_score.keys()) {
found_scores.append(score);
}
- std::sort(found_scores.begin(), found_scores.end(), std::greater<int>());
+ std::sort(found_scores.begin(), found_scores.end(), std::greater<>());
/* Add results to output vector in correct order. First come the results with the best match
* score. Results with the same score are in the order they have been added to the search. */
diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c
index a637a5f24e6..7aa5930b4ad 100644
--- a/source/blender/blenlib/intern/string_utf8.c
+++ b/source/blender/blenlib/intern/string_utf8.c
@@ -225,8 +225,7 @@ int BLI_utf8_invalid_strip(char *str, size_t length)
return tot;
}
-/* compatible with BLI_strncpy, but esnure no partial utf8 chars */
-
+/** Compatible with #BLI_strncpy, but ensure no partial UTF8 chars. */
#define BLI_STR_UTF8_CPY(dst, src, maxncpy) \
{ \
size_t utf8_size; \
diff --git a/source/blender/blenlib/intern/system.c b/source/blender/blenlib/intern/system.c
index 8e3d489fbb3..f4110c65a6d 100644
--- a/source/blender/blenlib/intern/system.c
+++ b/source/blender/blenlib/intern/system.c
@@ -71,7 +71,7 @@ int BLI_cpu_support_sse2(void)
#endif
}
-/* Windows stackwalk lives in system_win32.c */
+/* Windows stack-walk lives in system_win32.c */
#if !defined(_MSC_VER)
/**
* Write a backtrace into a file for systems which support it.
@@ -128,6 +128,7 @@ static void __cpuid(
: "a"(selector)
: "ebx");
# else
+ (void)selector;
data[0] = data[1] = data[2] = data[3] = 0;
# endif
}
diff --git a/source/blender/blenlib/intern/system_win32.c b/source/blender/blenlib/intern/system_win32.c
index be2195d679d..7572936592e 100644
--- a/source/blender/blenlib/intern/system_win32.c
+++ b/source/blender/blenlib/intern/system_win32.c
@@ -386,7 +386,6 @@ void BLI_system_backtrace(FILE *fp)
bli_windows_system_backtrace_threads(fp);
}
bli_windows_system_backtrace_modules(fp);
- fputc(0, fp); /* Give our selves a nice zero terminator for later on */
}
void BLI_windows_handle_exception(EXCEPTION_POINTERS *exception)
diff --git a/source/blender/blenlib/intern/task_graph.cc b/source/blender/blenlib/intern/task_graph.cc
index 4f112c5b2c8..32450c16630 100644
--- a/source/blender/blenlib/intern/task_graph.cc
+++ b/source/blender/blenlib/intern/task_graph.cc
@@ -28,10 +28,7 @@
#include <vector>
#ifdef WITH_TBB
-/* Quiet top level deprecation message, unrelated to API usage here. */
-# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1
# include <tbb/flow_graph.h>
-# include <tbb/tbb.h>
#endif
/* Task Graph */
@@ -70,7 +67,7 @@ struct TaskNode {
#ifdef WITH_TBB
tbb_node(task_graph->tbb_graph,
tbb::flow::unlimited,
- std::bind(&TaskNode::run, this, std::placeholders::_1)),
+ [&](const tbb::flow::continue_msg input) { run(input); }),
#endif
run_func(run_func),
task_data(task_data),
diff --git a/source/blender/blenlib/intern/task_pool.cc b/source/blender/blenlib/intern/task_pool.cc
index 10f15f8749c..00ba659a9c8 100644
--- a/source/blender/blenlib/intern/task_pool.cc
+++ b/source/blender/blenlib/intern/task_pool.cc
@@ -34,9 +34,9 @@
#include "BLI_threads.h"
#ifdef WITH_TBB
-/* Quiet top level deprecation message, unrelated to API usage here. */
-# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1
-# include <tbb/tbb.h>
+# include <tbb/blocked_range.h>
+# include <tbb/task_arena.h>
+# include <tbb/task_group.h>
#endif
/* Task
diff --git a/source/blender/blenlib/intern/task_range.cc b/source/blender/blenlib/intern/task_range.cc
index c2498de1af8..a27241e91dd 100644
--- a/source/blender/blenlib/intern/task_range.cc
+++ b/source/blender/blenlib/intern/task_range.cc
@@ -32,9 +32,10 @@
#include "atomic_ops.h"
#ifdef WITH_TBB
-/* Quiet top level deprecation message, unrelated to API usage here. */
-# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1
-# include <tbb/tbb.h>
+# include <tbb/blocked_range.h>
+# include <tbb/enumerable_thread_specific.h>
+# include <tbb/parallel_for.h>
+# include <tbb/parallel_reduce.h>
#endif
#ifdef WITH_TBB
diff --git a/source/blender/blenlib/intern/task_scheduler.cc b/source/blender/blenlib/intern/task_scheduler.cc
index b0245da0385..b22334a5676 100644
--- a/source/blender/blenlib/intern/task_scheduler.cc
+++ b/source/blender/blenlib/intern/task_scheduler.cc
@@ -26,10 +26,10 @@
#include "BLI_threads.h"
#ifdef WITH_TBB
-/* Quiet top level deprecation message, unrelated to API usage here. */
-# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1
-# include <tbb/tbb.h>
+/* Need to include at least one header to get the version define. */
+# include <tbb/blocked_range.h>
# if TBB_INTERFACE_VERSION_MAJOR >= 10
+# include <tbb/global_control.h>
# define WITH_TBB_GLOBAL_CONTROL
# endif
#endif
diff --git a/source/blender/blenlib/intern/threads.cc b/source/blender/blenlib/intern/threads.cc
index 0b88cf53442..35097013439 100644
--- a/source/blender/blenlib/intern/threads.cc
+++ b/source/blender/blenlib/intern/threads.cc
@@ -289,9 +289,8 @@ void BLI_threadpool_clear(ListBase *threadbase)
void BLI_threadpool_end(ListBase *threadbase)
{
- /* only needed if there's actually some stuff to end
- * this way we don't end up decrementing thread_levels on an empty threadbase
- * */
+ /* Only needed if there's actually some stuff to end
+ * this way we don't end up decrementing thread_levels on an empty `threadbase`. */
if (threadbase == nullptr || BLI_listbase_is_empty(threadbase)) {
return;
}
@@ -469,7 +468,7 @@ void BLI_spin_lock(SpinLock *spin)
#elif defined(_MSC_VER)
while (InterlockedExchangeAcquire(spin, 1)) {
while (*spin) {
- /* Spin-lock hint for processors with hyperthreading. */
+ /* Spin-lock hint for processors with hyper-threading. */
YieldProcessor();
}
}
diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c
index 00fef29587c..329c4d48fe8 100644
--- a/source/blender/blenlib/intern/uvproject.c
+++ b/source/blender/blenlib/intern/uvproject.c
@@ -132,8 +132,8 @@ void BLI_uvproject_from_view(float target[2],
target[1] = (y + target[1]) / winy;
}
-/* 'rotmat' can be obedit->obmat when uv project is used.
- * 'winx' and 'winy' can be from scene->r.xsch/ysch */
+/* 'rotmat' can be `obedit->obmat` when uv project is used.
+ * 'winx' and 'winy' can be from `scene->r.xsch/ysch` */
ProjCameraInfo *BLI_uvproject_camera_info(Object *ob, float (*rotmat)[4], float winx, float winy)
{
ProjCameraInfo uci;
diff --git a/source/blender/blenlib/intern/voxel.c b/source/blender/blenlib/intern/voxel.c
index eac01a0e2aa..c0c895654e3 100644
--- a/source/blender/blenlib/intern/voxel.c
+++ b/source/blender/blenlib/intern/voxel.c
@@ -54,12 +54,14 @@ BLI_INLINE int FLOORI(float x)
return ((x >= 0.0f) || (float)r == x) ? r : (r - 1);
}
-/* clamp function, cannot use the CLAMPIS macro,
+/**
+ * clamp function, cannot use the CLAMPIS macro,
* it sometimes returns unwanted results apparently related to
- * gcc optimization flag -fstrict-overflow which is enabled at -O2
+ * gcc optimization flag `-fstrict-overflow` which is enabled at `-O2`
*
* this causes the test (x + 2) < 0 with int x == 2147483647 to return false (x being an integer,
- * x + 2 should wrap around to -2147483647 so the test < 0 should return true, which it doesn't) */
+ * x + 2 should wrap around to -2147483647 so the test < 0 should return true, which it doesn't).
+ */
BLI_INLINE int64_t _clamp(int a, int b, int c)
{
return (a < b) ? b : ((a > c) ? c : a);
diff --git a/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc b/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc
index 487afc095f9..d00e8bf55fd 100644
--- a/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc
+++ b/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc
@@ -1661,10 +1661,10 @@ void rand_delaunay_test(int test_kind,
}
}
for (int i = 0; i < size; ++i) {
- /* Horizontal edges: connect p(i,0) to p(i,size-1). */
+ /* Horizontal edges: connect `p(i,0)` to `p(i,size-1)`. */
in.edge[i].first = i * size;
in.edge[i].second = i * size + size - 1;
- /* Vertical edges: conntect p(0,i) to p(size-1,i). */
+ /* Vertical edges: connect `p(0,i)` to `p(size-1,i)`. */
in.edge[size + i].first = i;
in.edge[size + i].second = (size - 1) * size + i;
}
@@ -1695,7 +1695,7 @@ void rand_delaunay_test(int test_kind,
in.vert[ib][1] = T(sin(angle2));
in.vert[ic][0] = T((param * cos(angle3)));
in.vert[ic][1] = T((param * sin(angle3)));
- /* Put the coordinates in ccw order. */
+ /* Put the coordinates in CCW order. */
in.face[i].append(ia);
int orient = orient2d(in.vert[ia], in.vert[ib], in.vert[ic]);
if (orient >= 0) {
diff --git a/source/blender/blenlib/tests/BLI_function_ref_test.cc b/source/blender/blenlib/tests/BLI_function_ref_test.cc
new file mode 100644
index 00000000000..cdcbccc72e8
--- /dev/null
+++ b/source/blender/blenlib/tests/BLI_function_ref_test.cc
@@ -0,0 +1,102 @@
+/* Apache License, Version 2.0 */
+
+#include "BLI_function_ref.hh"
+
+#include "testing/testing.h"
+
+namespace blender::tests {
+
+static int perform_binary_operation(int a, int b, FunctionRef<int(int, int)> operation)
+{
+ return operation(a, b);
+}
+
+TEST(function_ref, StatelessLambda)
+{
+ const int result = perform_binary_operation(4, 6, [](int a, int b) { return a - b; });
+ EXPECT_EQ(result, -2);
+}
+
+TEST(function_ref, StatefullLambda)
+{
+ const int factor = 10;
+ const int result = perform_binary_operation(
+ 2, 3, [&](int a, int b) { return factor * (a + b); });
+ EXPECT_EQ(result, 50);
+}
+
+static int add_two_numbers(int a, int b)
+{
+ return a + b;
+}
+
+TEST(function_ref, StandaloneFunction)
+{
+ const int result = perform_binary_operation(10, 5, add_two_numbers);
+ EXPECT_EQ(result, 15);
+}
+
+TEST(function_ref, ConstantFunction)
+{
+ auto f = []() { return 42; };
+ FunctionRef<int()> ref = f;
+ EXPECT_EQ(ref(), 42);
+}
+
+TEST(function_ref, MutableStatefullLambda)
+{
+ int counter = 0;
+ auto f = [&]() mutable { return counter++; };
+ FunctionRef<int()> ref = f;
+ EXPECT_EQ(ref(), 0);
+ EXPECT_EQ(ref(), 1);
+ EXPECT_EQ(ref(), 2);
+}
+
+TEST(function_ref, Null)
+{
+ FunctionRef<int()> ref;
+ EXPECT_FALSE(ref);
+
+ auto f = []() { return 1; };
+ ref = f;
+ EXPECT_TRUE(ref);
+
+ ref = {};
+ EXPECT_FALSE(ref);
+}
+
+TEST(function_ref, CopyDoesNotReferenceFunctionRef)
+{
+ auto f1 = []() { return 1; };
+ auto f2 = []() { return 2; };
+ FunctionRef<int()> x = f1;
+ FunctionRef<int()> y = x;
+ x = f2;
+ EXPECT_EQ(y(), 1);
+}
+
+TEST(function_ref, CopyDoesNotReferenceFunctionRef2)
+{
+ auto f = []() { return 1; };
+ FunctionRef<int()> x;
+ FunctionRef<int()> y = f;
+ FunctionRef<int()> z = static_cast<const FunctionRef<int()> &&>(y);
+ x = z;
+ y = {};
+ EXPECT_EQ(x(), 1);
+}
+
+TEST(function_ref, ReferenceAnotherFunctionRef)
+{
+ auto f1 = []() { return 1; };
+ auto f2 = []() { return 2; };
+ FunctionRef<int()> x = f1;
+ auto f3 = [&]() { return x(); };
+ FunctionRef<int()> y = f3;
+ EXPECT_EQ(y(), 1);
+ x = f2;
+ EXPECT_EQ(y(), 2);
+}
+
+} // namespace blender::tests
diff --git a/source/blender/blenlib/tests/BLI_polyfill_2d_test.cc b/source/blender/blenlib/tests/BLI_polyfill_2d_test.cc
index 3c9d12c7178..8bf5dd0bc9b 100644
--- a/source/blender/blenlib/tests/BLI_polyfill_2d_test.cc
+++ b/source/blender/blenlib/tests/BLI_polyfill_2d_test.cc
@@ -291,7 +291,7 @@ static void test_polyfill_template_main(const char *id,
(void)0
/* -------------------------------------------------------------------- */
-/* visualisation functions (not needed for testing) */
+/* visualization functions (not needed for testing) */
#ifdef USE_OBJ_PREVIEW
static void polyfill_to_obj(const char *id,
@@ -491,7 +491,7 @@ TEST(polyfill2d, Spiral)
TEST_POLYFILL_TEMPLATE_STATIC(poly, false);
}
-/* Test case from http:# www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml */
+/* Test case from http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml */
TEST(polyfill2d, TestFlipCode)
{
const float poly[][2] = {
@@ -561,7 +561,7 @@ TEST(polyfill2d, SelfOverlap)
TEST_POLYFILL_TEMPLATE_STATIC(poly, true);
}
-/* Test case from http:# www.davdata.nl/math/polygons.html */
+/* Test case from http://www.davdata.nl/math/polygons.html */
TEST(polyfill2d, TestDavData)
{
const float poly[][2] = {
@@ -573,7 +573,7 @@ TEST(polyfill2d, TestDavData)
TEST_POLYFILL_TEMPLATE_STATIC(poly, false);
}
-/* Issue 815, http:# code.google.com/p/libgdx/issues/detail?id=815 */
+/* Issue 815, http://code.google.com/p/libgdx/issues/detail?id=815 */
TEST(polyfill2d, Issue815)
{
const float poly[][2] = {
@@ -589,7 +589,7 @@ TEST(polyfill2d, Issue815)
TEST_POLYFILL_TEMPLATE_STATIC(poly, false);
}
-/* Issue 207, comment #1, http:# code.google.com/p/libgdx/issues/detail?id=207#c1 */
+/* Issue 207, comment #1, http://code.google.com/p/libgdx/issues/detail?id=207#c1 */
TEST(polyfill2d, Issue207_1)
{
const float poly[][2] = {
@@ -608,8 +608,8 @@ TEST(polyfill2d, Issue207_1)
TEST_POLYFILL_TEMPLATE_STATIC(poly, true);
}
-/* Issue 207, comment #11, http:# code.google.com/p/libgdx/issues/detail?id=207#c11 */
-/* Also on issue 1081, http:# code.google.com/p/libgdx/issues/detail?id=1081 */
+/* Issue 207, comment #11, http://code.google.com/p/libgdx/issues/detail?id=207#c11 */
+/* Also on issue 1081, http://code.google.com/p/libgdx/issues/detail?id=1081 */
TEST(polyfill2d, Issue207_11)
{
const float poly[][2] = {
@@ -628,7 +628,7 @@ TEST(polyfill2d, Issue207_11)
TEST_POLYFILL_TEMPLATE_STATIC(poly, false);
}
-/* Issue 1407, http:# code.google.com/p/libgdx/issues/detail?id=1407 */
+/* Issue 1407, http://code.google.com/p/libgdx/issues/detail?id=1407 */
TEST(polyfill2d, Issue1407)
{
const float poly[][2] = {
@@ -640,7 +640,7 @@ TEST(polyfill2d, Issue1407)
TEST_POLYFILL_TEMPLATE_STATIC(poly, false);
}
-/* Issue 1407, http:# code.google.com/p/libgdx/issues/detail?id=1407, */
+/* Issue 1407, http://code.google.com/p/libgdx/issues/detail?id=1407, */
/* with an additional point to show what is happening. */
TEST(polyfill2d, Issue1407_pt)
{
diff --git a/source/blender/blenlib/tests/BLI_span_test.cc b/source/blender/blenlib/tests/BLI_span_test.cc
index d1c9f312b97..002c97b0c7d 100644
--- a/source/blender/blenlib/tests/BLI_span_test.cc
+++ b/source/blender/blenlib/tests/BLI_span_test.cc
@@ -62,6 +62,15 @@ TEST(span, DropFront)
EXPECT_EQ(slice[2], 7);
}
+TEST(span, DropFrontLargeN)
+{
+ Vector<int> a = {1, 2, 3, 4, 5};
+ Span<int> slice1 = Span<int>(a).drop_front(100);
+ MutableSpan<int> slice2 = MutableSpan<int>(a).drop_front(100);
+ EXPECT_TRUE(slice1.is_empty());
+ EXPECT_TRUE(slice2.is_empty());
+}
+
TEST(span, DropFrontAll)
{
Vector<int> a = {4, 5, 6, 7};
@@ -78,6 +87,15 @@ TEST(span, TakeFront)
EXPECT_EQ(slice[1], 5);
}
+TEST(span, TakeFrontLargeN)
+{
+ Vector<int> a = {4, 5, 6, 7};
+ Span<int> slice1 = Span<int>(a).take_front(100);
+ MutableSpan<int> slice2 = MutableSpan<int>(a).take_front(100);
+ EXPECT_EQ(slice1.size(), 4);
+ EXPECT_EQ(slice2.size(), 4);
+}
+
TEST(span, TakeBack)
{
Vector<int> a = {5, 6, 7, 8};
@@ -87,6 +105,15 @@ TEST(span, TakeBack)
EXPECT_EQ(slice[1], 8);
}
+TEST(span, TakeBackLargeN)
+{
+ Vector<int> a = {3, 4, 5, 6};
+ Span<int> slice1 = Span<int>(a).take_back(100);
+ MutableSpan<int> slice2 = MutableSpan<int>(a).take_back(100);
+ EXPECT_EQ(slice1.size(), 4);
+ EXPECT_EQ(slice2.size(), 4);
+}
+
TEST(span, Slice)
{
Vector<int> a = {4, 5, 6, 7};
@@ -112,6 +139,19 @@ TEST(span, SliceRange)
EXPECT_EQ(slice[1], 4);
}
+TEST(span, SliceLargeN)
+{
+ Vector<int> a = {1, 2, 3, 4, 5};
+ Span<int> slice1 = Span<int>(a).slice(3, 100);
+ MutableSpan<int> slice2 = MutableSpan<int>(a).slice(3, 100);
+ EXPECT_EQ(slice1.size(), 2);
+ EXPECT_EQ(slice2.size(), 2);
+ EXPECT_EQ(slice1[0], 4);
+ EXPECT_EQ(slice2[0], 4);
+ EXPECT_EQ(slice1[1], 5);
+ EXPECT_EQ(slice2[1], 5);
+}
+
TEST(span, Contains)
{
Vector<int> a = {4, 5, 6, 7};
@@ -337,7 +377,7 @@ TEST(span, MutableReverseIterator)
EXPECT_EQ_ARRAY(src.data(), Span({14, 15, 16, 17}).data(), 4);
}
-TEST(span, constexpr_)
+TEST(span, Constexpr)
{
static constexpr std::array<int, 3> src = {3, 2, 1};
constexpr Span<int> span(src);
diff --git a/source/blender/blenlib/tests/BLI_string_ref_test.cc b/source/blender/blenlib/tests/BLI_string_ref_test.cc
index 401a7bc1118..fb8b894bfd5 100644
--- a/source/blender/blenlib/tests/BLI_string_ref_test.cc
+++ b/source/blender/blenlib/tests/BLI_string_ref_test.cc
@@ -246,10 +246,18 @@ TEST(string_ref, DropPrefixN)
EXPECT_EQ(ref3, "");
}
-TEST(string_ref, DropPrefix)
+TEST(string_ref, DropPrefixLargeN)
{
StringRef ref("test");
- StringRef ref2 = ref.drop_prefix("tes");
+ StringRef ref2 = ref.drop_prefix(100);
+ EXPECT_EQ(ref2.size(), 0);
+ EXPECT_EQ(ref2, "");
+}
+
+TEST(string_ref, DropKnownPrefix)
+{
+ StringRef ref("test");
+ StringRef ref2 = ref.drop_known_prefix("tes");
EXPECT_EQ(ref2.size(), 1);
EXPECT_EQ(ref2, "t");
}
@@ -262,6 +270,14 @@ TEST(string_ref, DropSuffix)
EXPECT_EQ(ref2, "tes");
}
+TEST(string_ref, DropSuffixLargeN)
+{
+ StringRef ref("test");
+ StringRef ref2 = ref.drop_suffix(100);
+ EXPECT_EQ(ref2.size(), 0);
+ EXPECT_EQ(ref2, "");
+}
+
TEST(string_ref, Substr)
{
StringRef ref("hello world");
@@ -298,7 +314,7 @@ TEST(string_ref, ToStringView)
EXPECT_EQ(view, "hello");
}
-TEST(string_ref, constexpr_)
+TEST(string_ref, Constexpr)
{
constexpr StringRef sref("World");
BLI_STATIC_ASSERT(sref[2] == 'r', "");
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 1d7c5d8a1d3..c7f02de21ea 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -84,8 +84,8 @@ struct BlendFileReadParams {
uint skip_flags : 3; /* eBLOReadSkip */
uint is_startup : 1;
- /** Whether we are reading the memfile for an undo (< 0) or a redo (> 0). */
- int undo_direction : 2;
+ /** Whether we are reading the memfile for an undo or a redo. */
+ int undo_direction; /* eUndoStepDir */
};
/* skip reading some data-block types (may want to skip screen data too). */
@@ -129,11 +129,13 @@ BlendHandle *BLO_blendhandle_from_memory(const void *mem, int memsize);
struct LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh,
int ofblocktype,
- int *tot_names);
+
+ const bool use_assets_only,
+ int *r_tot_names);
struct LinkNode *BLO_blendhandle_get_datablock_info(BlendHandle *bh,
int ofblocktype,
- int *tot_info_items);
-struct LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *tot_prev);
+ int *r_tot_info_items);
+struct LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *r_tot_prev);
struct LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh);
void BLO_blendhandle_close(BlendHandle *bh);
diff --git a/source/blender/blenloader/intern/blend_validate.c b/source/blender/blenloader/intern/blend_validate.c
index c281e2fa643..7261db5d3a6 100644
--- a/source/blender/blenloader/intern/blend_validate.c
+++ b/source/blender/blenloader/intern/blend_validate.c
@@ -23,7 +23,7 @@
* \note Does not *fix* anything, only reports found errors.
*/
-#include <string.h> /* for strrchr strncmp strstr */
+#include <string.h> /* for #strrchr #strncmp #strstr */
#include "BLI_utildefines.h"
@@ -112,7 +112,7 @@ bool BLO_main_validate_libraries(Main *bmain, ReportList *reports)
}
int totnames = 0;
- LinkNode *names = BLO_blendhandle_get_datablock_names(bh, GS(id->name), &totnames);
+ LinkNode *names = BLO_blendhandle_get_datablock_names(bh, GS(id->name), false, &totnames);
for (; id != NULL; id = id->next) {
if (id->lib == NULL) {
is_valid = false;
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index 296480fc2e4..19033ba9bf1 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -135,9 +135,13 @@ void BLO_blendhandle_print_sizes(BlendHandle *bh, void *fp)
* \param bh: The blendhandle to access.
* \param ofblocktype: The type of names to get.
* \param tot_names: The length of the returned list.
+ * \param use_assets_only: Only list IDs marked as assets.
* \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, int *tot_names)
+LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh,
+ int ofblocktype,
+ const bool use_assets_only,
+ int *r_tot_names)
{
FileData *fd = (FileData *)bh;
LinkNode *names = NULL;
@@ -147,6 +151,9 @@ LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, int ofblocktype,
for (bhead = blo_bhead_first(fd); bhead; bhead = blo_bhead_next(fd, bhead)) {
if (bhead->code == ofblocktype) {
const char *idname = blo_bhead_id_name(fd, bhead);
+ if (use_assets_only && blo_bhead_id_asset_data_address(fd, bhead) == NULL) {
+ continue;
+ }
BLI_linklist_prepend(&names, BLI_strdup(idname + 2));
tot++;
@@ -156,7 +163,7 @@ LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, int ofblocktype,
}
}
- *tot_names = tot;
+ *r_tot_names = tot;
return names;
}
@@ -170,7 +177,9 @@ LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, int ofblocktype,
* \return A BLI_linklist of BLODataBlockInfo *. The links and #BLODataBlockInfo.asset_data should
* be freed with MEM_freeN.
*/
-LinkNode *BLO_blendhandle_get_datablock_info(BlendHandle *bh, int ofblocktype, int *tot_info_items)
+LinkNode *BLO_blendhandle_get_datablock_info(BlendHandle *bh,
+ int ofblocktype,
+ int *r_tot_info_items)
{
FileData *fd = (FileData *)bh;
LinkNode *infos = NULL;
@@ -201,7 +210,7 @@ LinkNode *BLO_blendhandle_get_datablock_info(BlendHandle *bh, int ofblocktype, i
}
}
- *tot_info_items = tot;
+ *r_tot_info_items = tot;
return infos;
}
@@ -211,10 +220,10 @@ LinkNode *BLO_blendhandle_get_datablock_info(BlendHandle *bh, int ofblocktype, i
*
* \param bh: The blendhandle to access.
* \param ofblocktype: The type of names to get.
- * \param tot_prev: The length of the returned list.
+ * \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 *tot_prev)
+LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *r_tot_prev)
{
FileData *fd = (FileData *)bh;
LinkNode *previews = NULL;
@@ -236,6 +245,7 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *to
case ID_OB: /* fall through */
case ID_GR: /* fall through */
case ID_SCE: /* fall through */
+ case ID_AC: /* fall through */
new_prv = MEM_callocN(sizeof(PreviewImage), "newpreview");
BLI_linklist_prepend(&previews, new_prv);
tot++;
@@ -294,7 +304,7 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *to
}
}
- *tot_prev = tot;
+ *r_tot_prev = tot;
return previews;
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index b61abd4ed06..6528e1cdf79 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -68,6 +68,7 @@
#include "BLI_math.h"
#include "BLI_memarena.h"
#include "BLI_mempool.h"
+#include "BLI_mmap.h"
#include "BLI_threads.h"
#include "BLT_translation.h"
@@ -93,6 +94,7 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
+#include "BKE_undo_system.h"
#include "BKE_workspace.h"
#include "DRW_engine.h"
@@ -1179,6 +1181,53 @@ static ssize_t fd_read_from_memory(FileData *filedata,
return readsize;
}
+/* Memory-mapped file reading.
+ * By using mmap(), we can map a file so that it can be treated like normal memory,
+ * meaning that we can just read from it with memcpy() etc.
+ * This avoids system call overhead and can significantly speed up file loading.
+ */
+
+static ssize_t fd_read_from_mmap(FileData *filedata,
+ void *buffer,
+ size_t size,
+ bool *UNUSED(r_is_memchunck_identical))
+{
+ /* don't read more bytes than there are available in the buffer */
+ size_t readsize = MIN2(size, (size_t)(filedata->buffersize - filedata->file_offset));
+
+ if (!BLI_mmap_read(filedata->mmap_file, buffer, filedata->file_offset, readsize)) {
+ return 0;
+ }
+
+ filedata->file_offset += readsize;
+
+ return readsize;
+}
+
+static off64_t fd_seek_from_mmap(FileData *filedata, off64_t offset, int whence)
+{
+ off64_t new_pos;
+ if (whence == SEEK_CUR) {
+ new_pos = filedata->file_offset + offset;
+ }
+ else if (whence == SEEK_SET) {
+ new_pos = offset;
+ }
+ else if (whence == SEEK_END) {
+ new_pos = filedata->buffersize + offset;
+ }
+ else {
+ return -1;
+ }
+
+ if (new_pos < 0 || new_pos > filedata->buffersize) {
+ return -1;
+ }
+
+ filedata->file_offset = new_pos;
+ return filedata->file_offset;
+}
+
/* MemFile reading. */
static ssize_t fd_read_from_memfile(FileData *filedata,
@@ -1246,12 +1295,12 @@ static ssize_t fd_read_from_memfile(FileData *filedata,
seek += readsize;
if (r_is_memchunck_identical != NULL) {
/* `is_identical` of current chunk represents whether it changed compared to previous undo
- * step. this is fine in redo case (filedata->undo_direction > 0), but not in undo case,
- * where we need an extra flag defined when saving the next (future) step after the one we
- * want to restore, as we are supposed to 'come from' that future undo step, and not the
- * one before current one. */
- *r_is_memchunck_identical &= filedata->undo_direction > 0 ? chunk->is_identical :
- chunk->is_identical_future;
+ * step. this is fine in redo case, but not in undo case, where we need an extra flag
+ * defined when saving the next (future) step after the one we want to restore, as we are
+ * supposed to 'come from' that future undo step, and not the one before current one. */
+ *r_is_memchunck_identical &= filedata->undo_direction == STEP_REDO ?
+ chunk->is_identical :
+ chunk->is_identical_future;
}
} while (totread < size);
@@ -1306,6 +1355,8 @@ static FileData *blo_filedata_from_file_descriptor(const char *filepath,
{
FileDataReadFn *read_fn = NULL;
FileDataSeekFn *seek_fn = NULL; /* Optional. */
+ size_t buffersize = 0;
+ BLI_mmap_file *mmap_file = NULL;
gzFile gzfile = (gzFile)Z_NULL;
@@ -1322,14 +1373,21 @@ static FileData *blo_filedata_from_file_descriptor(const char *filepath,
return NULL;
}
- BLI_lseek(file, 0, SEEK_SET);
-
/* Regular file. */
if (memcmp(header, "BLENDER", sizeof(header)) == 0) {
read_fn = fd_read_data_from_file;
seek_fn = fd_seek_data_from_file;
+
+ mmap_file = BLI_mmap_open(file);
+ if (mmap_file != NULL) {
+ read_fn = fd_read_from_mmap;
+ seek_fn = fd_seek_from_mmap;
+ buffersize = BLI_lseek(file, 0, SEEK_END);
+ }
}
+ BLI_lseek(file, 0, SEEK_SET);
+
/* Gzip file. */
errno = 0;
if ((read_fn == NULL) &&
@@ -1363,6 +1421,8 @@ static FileData *blo_filedata_from_file_descriptor(const char *filepath,
fd->read = read_fn;
fd->seek = seek_fn;
+ fd->mmap_file = mmap_file;
+ fd->buffersize = buffersize;
return fd;
}
@@ -1531,6 +1591,11 @@ void blo_filedata_free(FileData *fd)
fd->buffer = NULL;
}
+ if (fd->mmap_file) {
+ BLI_mmap_free(fd->mmap_file);
+ fd->mmap_file = NULL;
+ }
+
/* Free all BHeadN data blocks */
#ifndef NDEBUG
BLI_freelistN(&fd->bhead_list);
@@ -1718,25 +1783,25 @@ BlendThumbnail *BLO_thumbnail_from_file(const char *filepath)
/** \name Old/New Pointer Map
* \{ */
-/* only direct databocks */
+/* Only direct data-blocks. */
static void *newdataadr(FileData *fd, const void *adr)
{
return oldnewmap_lookup_and_inc(fd->datamap, adr, true);
}
-/* only direct databocks */
+/* Only direct data-blocks. */
static void *newdataadr_no_us(FileData *fd, const void *adr)
{
return oldnewmap_lookup_and_inc(fd->datamap, adr, false);
}
-/* direct datablocks with global linking */
+/* Direct datablocks with global linking. */
void *blo_read_get_new_globaldata_address(FileData *fd, const void *adr)
{
return oldnewmap_lookup_and_inc(fd->globmap, adr, true);
}
-/* used to restore packed data after undo */
+/* Used to restore packed data after undo. */
static void *newpackedadr(FileData *fd, const void *adr)
{
if (fd->packedmap && adr) {
@@ -2336,11 +2401,12 @@ static int direct_link_id_restore_recalc(const FileData *fd,
/* Tags that were set between the target state and the current state,
* that we need to perform again. */
- if (fd->undo_direction < 0) {
+ if (fd->undo_direction == STEP_UNDO) {
/* Undo: tags from target to the current state. */
recalc |= id_current->recalc_up_to_undo_push;
}
else {
+ BLI_assert(fd->undo_direction == STEP_REDO);
/* Redo: tags from current to the target state. */
recalc |= id_target->recalc_up_to_undo_push;
}
@@ -2674,7 +2740,7 @@ static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, View
v3d->localvd->camera = scene->camera;
- /* Localview can become invalid during undo/redo steps,
+ /* Local-view can become invalid during undo/redo steps,
* so we exit it when no could be found. */
for (base = view_layer->object_bases.first; base; base = base->next) {
if (base->local_view_bits & v3d->local_view_uuid) {
@@ -2686,7 +2752,7 @@ static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, View
v3d->localvd = NULL;
v3d->local_view_uuid = 0;
- /* Regionbase storage is different depending if the space is active. */
+ /* Region-base storage is different depending if the space is active. */
ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
&sl->regionbase;
LISTBASE_FOREACH (ARegion *, region, regionbase) {
@@ -3852,6 +3918,26 @@ static void lib_link_all(FileData *fd, Main *bmain)
}
FOREACH_MAIN_ID_END;
+#ifndef NDEBUG
+ /* Double check we do not have any 'need link' tag remaining, this should never be the case once
+ * this function has run. */
+ FOREACH_MAIN_ID_BEGIN (bmain, id) {
+ BLI_assert((id->tag & LIB_TAG_NEED_LINK) == 0);
+ }
+ FOREACH_MAIN_ID_END;
+#endif
+}
+
+/**
+ * Checks to perform after `lib_link_all`.
+ * Those operations cannot perform properly in a split bmain case, since some data from other
+ * bmain's (aka libraries) may not have been processed yet.
+ */
+static void after_liblink_merged_bmain_process(Main *bmain)
+{
+ /* We only expect a merged Main here, not a split one. */
+ BLI_assert((bmain->prev == NULL) && (bmain->next == NULL));
+
/* Check for possible cycles in scenes' 'set' background property. */
lib_link_scenes_check_set(bmain);
@@ -3862,15 +3948,6 @@ static void lib_link_all(FileData *fd, Main *bmain)
/* We have to rebuild that runtime information *after* all data-blocks have been properly linked.
*/
BKE_main_collections_parent_relations_rebuild(bmain);
-
-#ifndef NDEBUG
- /* Double check we do not have any 'need link' tag remaining, this should never be the case once
- * this function has run. */
- FOREACH_MAIN_ID_BEGIN (bmain, id) {
- BLI_assert((id->tag & LIB_TAG_NEED_LINK) == 0);
- }
- FOREACH_MAIN_ID_END;
-#endif
}
/** \} */
@@ -4093,6 +4170,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
blo_join_main(&mainlist);
lib_link_all(fd, bfd->main);
+ after_liblink_merged_bmain_process(bfd->main);
/* Skip in undo case. */
if (fd->memfile == NULL) {
@@ -5041,6 +5119,7 @@ static void library_link_end(Main *mainl,
mainl = NULL; /* blo_join_main free's mainl, cant use anymore */
lib_link_all(*fd, mainvar);
+ after_liblink_merged_bmain_process(mainvar);
/* Some versioning code does expect some proper userrefcounting, e.g. in conversion from
* groups to collections... We could optimize out that first call when we are reading a
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index c724cc32051..425932498f1 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -33,6 +33,7 @@
#include "DNA_windowmanager_types.h" /* for ReportType */
#include "zlib.h"
+struct BLI_mmap_file;
struct BLOCacheStorage;
struct IDNameLib_Map;
struct Key;
@@ -83,13 +84,14 @@ typedef struct FileData {
/** Regular file reading. */
int filedes;
- /** Variables needed for reading from memory / stream. */
+ /** Variables needed for reading from memory / stream / memory-mapped files. */
const char *buffer;
+ struct BLI_mmap_file *mmap_file;
/** Variables needed for reading from memfile (undo). */
struct MemFile *memfile;
/** Whether we are undoing (< 0) or redoing (> 0), used to choose which 'unchanged' flag to use
* to detect unchanged data from memfile. */
- short undo_direction;
+ int undo_direction; /* eUndoStepDir */
/** Variables needed for reading from file. */
gzFile gzfiledes;
diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c
index 23f46e15f51..983fdce15f1 100644
--- a/source/blender/blenloader/intern/versioning_250.c
+++ b/source/blender/blenloader/intern/versioning_250.c
@@ -412,7 +412,7 @@ static void do_versions_windowmanager_2_50(bScreen *screen)
area_add_window_regions(area, area->spacedata.first, &area->regionbase);
- /* space imageselect is deprecated */
+ /* Space image-select is deprecated. */
for (sl = area->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_IMASEL) {
sl->spacetype = SPACE_EMPTY; /* spacedata then matches */
diff --git a/source/blender/blenloader/intern/versioning_260.c b/source/blender/blenloader/intern/versioning_260.c
index 767f24cf175..7c5eefa60f7 100644
--- a/source/blender/blenloader/intern/versioning_260.c
+++ b/source/blender/blenloader/intern/versioning_260.c
@@ -75,7 +75,7 @@
# include "BKE_writeffmpeg.h"
#endif
-#include "IMB_imbuf.h" /* for proxy / timecode versioning stuff */
+#include "IMB_imbuf.h" /* for proxy / time-code versioning stuff. */
#include "NOD_common.h"
#include "NOD_texture.h"
@@ -339,7 +339,7 @@ static void do_versions_nodetree_multi_file_output_format_2_62_1(Scene *sce, bNo
NodeImageMultiFile *nimf = node->storage;
bNodeSocket *sock;
- /* CMP_NODE_OUTPUT_MULTI_FILE has been redeclared as CMP_NODE_OUTPUT_FILE */
+ /* CMP_NODE_OUTPUT_MULTI_FILE has been re-declared as CMP_NODE_OUTPUT_FILE */
node->type = CMP_NODE_OUTPUT_FILE;
/* initialize the node-wide image format from render data, if available */
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index df9268f0da1..d86ddc5b646 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -1190,7 +1190,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
}
- /* Remove old deprecated region from filebrowsers */
+ /* Remove old deprecated region from file-browsers. */
else if (sl->spacetype == SPACE_FILE) {
LISTBASE_FOREACH (ARegion *, region, regionbase) {
if (region->regiontype == RGN_TYPE_CHANNELS) {
@@ -1429,7 +1429,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
if (clip->tracking.stabilization.scale == 0.0f) {
/* ensure init.
- * Was previously used for autoscale only,
+ * Was previously used for auto-scale only,
* now used always (as "target scale") */
clip->tracking.stabilization.scale = 1.0f;
}
@@ -1657,7 +1657,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain)
if (!DNA_struct_elem_find(fd->filesdna, "Brush", "float", "falloff_angle")) {
for (Brush *br = bmain->brushes.first; br; br = br->id.next) {
br->falloff_angle = DEG2RADF(80);
- /* These flags are used for new feautres. They are not related to falloff_angle */
+ /* These flags are used for new features. They are not related to `falloff_angle`. */
br->flag &= ~(BRUSH_INVERT_TO_SCRAPE_FILL | BRUSH_ORIGINAL_PLANE |
BRUSH_GRAB_ACTIVE_VERTEX | BRUSH_SCENE_SPACING | BRUSH_FRONTFACE_FALLOFF);
}
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 7dc2c9e86ee..ef2e196094e 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -1390,7 +1390,7 @@ void do_versions_after_linking_280(Main *bmain, ReportList *UNUSED(reports))
}
}
- /* Cleanup deprecated flag from particlesettings data-blocks. */
+ /* Cleanup deprecated flag from particle-settings data-blocks. */
for (ParticleSettings *part = bmain->particles.first; part; part = part->id.next) {
part->draw &= ~PART_DRAW_EMITTER;
}
@@ -2110,7 +2110,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
for (Tex *tex = bmain->textures.first; tex; tex = tex->id.next) {
- /* Removed envmap, pointdensity, voxeldata, ocean textures. */
+ /* Removed environment map, point-density, voxel-data, ocean textures. */
if (ELEM(tex->type, 10, 14, 15, 16)) {
tex->type = 0;
}
@@ -4303,7 +4303,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
- /* Elatic deform brush */
+ /* Elastic deform brush */
for (Brush *br = bmain->brushes.first; br; br = br->id.next) {
if (br->ob_mode & OB_MODE_SCULPT && br->elastic_deform_volume_preservation == 0.0f) {
br->elastic_deform_volume_preservation = 0.5f;
@@ -4912,7 +4912,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
- /* Boundary Edges Automasking. */
+ /* Boundary Edges Auto-masking. */
if (!DNA_struct_elem_find(
fd->filesdna, "Brush", "int", "automasking_boundary_edges_propagation_steps")) {
for (Brush *br = bmain->brushes.first; br; br = br->id.next) {
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index d43c948cadb..29041f4ae9d 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -482,7 +482,7 @@ void do_versions_after_linking_290(Main *bmain, ReportList *UNUSED(reports))
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
bGPDframe *gpf = gpl->frames.first;
if (gpf && gpf->framenum > scene->r.sfra) {
- bGPDframe *gpf_dup = BKE_gpencil_frame_duplicate(gpf);
+ bGPDframe *gpf_dup = BKE_gpencil_frame_duplicate(gpf, true);
gpf_dup->framenum = scene->r.sfra;
BLI_addhead(&gpl->frames, gpf_dup);
}
@@ -506,7 +506,7 @@ void do_versions_after_linking_290(Main *bmain, ReportList *UNUSED(reports))
/**
* Make sure Emission Alpha fcurve and drivers is properly mapped after the Emission Strength
* got introduced.
- * */
+ */
/**
* Effectively we are replacing the (animation of) node socket input 18 with 19.
@@ -517,7 +517,7 @@ void do_versions_after_linking_290(Main *bmain, ReportList *UNUSED(reports))
*
* The for loop for the input ids is at the top level otherwise we lose the animation
* keyframe data.
- * */
+ */
for (int input_id = 21; input_id >= 18; input_id--) {
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
if (ntree->type == NTREE_SHADER) {
@@ -665,7 +665,7 @@ static void do_versions_291_fcurve_handles_limit(FCurve *fcu)
{
uint i = 1;
for (BezTriple *bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) {
- /* Only adjust bezier keyframes. */
+ /* Only adjust bezier key-frames. */
if (bezt->ipo != BEZT_IPO_BEZ) {
continue;
}
@@ -742,6 +742,23 @@ static void version_node_socket_name(bNodeTree *ntree,
}
}
+static void version_node_join_geometry_for_multi_input_socket(bNodeTree *ntree)
+{
+ LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) {
+ if (link->tonode->type == GEO_NODE_JOIN_GEOMETRY && !(link->tosock->flag & SOCK_MULTI_INPUT)) {
+ link->tosock = link->tonode->inputs.first;
+ }
+ }
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ if (node->type == GEO_NODE_JOIN_GEOMETRY) {
+ bNodeSocket *socket = node->inputs.first;
+ socket->flag |= SOCK_MULTI_INPUT;
+ socket->limit = 4095;
+ nodeRemoveSocket(ntree, node, socket->next);
+ }
+ }
+}
+
/* NOLINTNEXTLINE: readability-function-size */
void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
{
@@ -1044,14 +1061,6 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
- /* Set the minimum sequence interpolate for grease pencil. */
- if (!DNA_struct_elem_find(fd->filesdna, "GP_Interpolate_Settings", "int", "step")) {
- LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
- ToolSettings *ts = scene->toolsettings;
- ts->gp_interpolate.step = 1;
- }
- }
-
/* Hair and PointCloud attributes. */
for (Hair *hair = bmain->hairs.first; hair != NULL; hair = hair->id.next) {
do_versions_point_attributes(&hair->pdata);
@@ -1104,10 +1113,10 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
if (!MAIN_VERSION_ATLEAST(bmain, 291, 5)) {
- /* Fix fcurves to allow for new bezier handles behaviour (T75881 and D8752). */
+ /* Fix fcurves to allow for new bezier handles behavior (T75881 and D8752). */
for (bAction *act = bmain->actions.first; act; act = act->id.next) {
for (FCurve *fcu = act->curves.first; fcu; fcu = fcu->next) {
- /* Only need to fix Bezier curves with at least 2 keyframes. */
+ /* Only need to fix Bezier curves with at least 2 key-frames. */
if (fcu->totvert < 2 || fcu->bezt == NULL) {
continue;
}
@@ -1555,7 +1564,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
FOREACH_NODETREE_END;
}
- if (!MAIN_VERSION_ATLEAST(bmain, 292, 13)) {
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 1)) {
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
if (ntree->type == NTREE_GEOMETRY) {
version_node_socket_name(ntree, GEO_NODE_BOOLEAN, "Geometry A", "Geometry 1");
@@ -1580,7 +1589,8 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
- if (!MAIN_VERSION_ATLEAST(bmain, 292, 14)) {
+ if ((!MAIN_VERSION_ATLEAST(bmain, 292, 14)) ||
+ ((bmain->versionfile == 293) && (!MAIN_VERSION_ATLEAST(bmain, 293, 1)))) {
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
if (ntree->type != NTREE_GEOMETRY) {
continue;
@@ -1597,18 +1607,119 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
FOREACH_NODETREE_END;
}
- if (!MAIN_VERSION_ATLEAST(bmain, 292, 15)) {
- /* UV/Image Max resolution images in image editor. */
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 1)) {
+ /* Grease pencil layer transform matrix. */
+ if (!DNA_struct_elem_find(fd->filesdna, "bGPDlayer", "float", "location[0]")) {
+ LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+ zero_v3(gpl->location);
+ zero_v3(gpl->rotation);
+ copy_v3_fl(gpl->scale, 1.0f);
+ loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale);
+ invert_m4_m4(gpl->layer_invmat, gpl->layer_mat);
+ }
+ }
+ }
+ /* Fix Fill factor for grease pencil fill brushes. */
+ LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
+ if ((brush->gpencil_settings) && (brush->gpencil_settings->fill_factor == 0.0f)) {
+ brush->gpencil_settings->fill_factor = 1.0f;
+ }
+ }
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 3)) {
+ FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
+ if (ntree->type != NTREE_GEOMETRY) {
+ continue;
+ }
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ if (node->type == GEO_NODE_POINT_INSTANCE && node->storage == NULL) {
+ NodeGeometryPointInstance *data = (NodeGeometryPointInstance *)MEM_callocN(
+ sizeof(NodeGeometryPointInstance), __func__);
+ data->instance_type = node->custom1;
+ data->flag = (node->custom2 ? 0 : GEO_NODE_POINT_INSTANCE_WHOLE_COLLECTION);
+ node->storage = data;
+ }
+ }
+ }
+ FOREACH_NODETREE_END;
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 4)) {
+ /* Add support for all operations to the "Attribute Math" node. */
+ FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
+ if (ntree->type == NTREE_GEOMETRY) {
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ if (node->type == GEO_NODE_ATTRIBUTE_MATH) {
+ NodeAttributeMath *data = (NodeAttributeMath *)node->storage;
+ data->input_type_c = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
+ }
+ }
+ }
+ }
+ FOREACH_NODETREE_END;
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 5)) {
+ /* Change Nishita sky model Altitude unit. */
+ FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
+ if (ntree->type == NTREE_SHADER) {
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ if (node->type == SH_NODE_TEX_SKY && node->storage) {
+ NodeTexSky *tex = (NodeTexSky *)node->storage;
+ tex->altitude *= 1000.0f;
+ }
+ }
+ }
+ }
+ FOREACH_NODETREE_END;
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 6)) {
LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) {
+ /* UV/Image Max resolution images in image editor. */
if (space->spacetype == SPACE_IMAGE) {
SpaceImage *sima = (SpaceImage *)space;
sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION;
}
+ /* Enable Outliner render visibility column. */
+ else if (space->spacetype == SPACE_OUTLINER) {
+ SpaceOutliner *space_outliner = (SpaceOutliner *)space;
+ space_outliner->show_restrict_flags |= SO_RESTRICT_RENDER;
+ }
+ }
+ }
+ }
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 7)) {
+ FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
+ if (ntree->type == NTREE_GEOMETRY) {
+ version_node_join_geometry_for_multi_input_socket(ntree);
+ }
+ }
+ FOREACH_NODETREE_END;
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 8)) {
+ FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
+ if (ntree->type != NTREE_GEOMETRY) {
+ continue;
+ }
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ if (node->type == GEO_NODE_ATTRIBUTE_RANDOMIZE && node->storage == NULL) {
+ NodeAttributeRandomize *data = (NodeAttributeRandomize *)MEM_callocN(
+ sizeof(NodeAttributeRandomize), __func__);
+ data->data_type = node->custom1;
+ data->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE;
+ node->storage = data;
}
}
}
+ FOREACH_NODETREE_END;
}
/**
@@ -1621,6 +1732,27 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
* \note Keep this message at the bottom of the function.
*/
{
+ if (!DNA_struct_elem_find(fd->filesdna, "SceneEEVEE", "float", "bokeh_overblur")) {
+ LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
+ scene->eevee.bokeh_neighbor_max = 10.0f;
+ scene->eevee.bokeh_denoise_fac = 0.75f;
+ scene->eevee.bokeh_overblur = 5.0f;
+ }
+ }
+
+ /* Add subpanels for FModifiers, which requires a field to store expansion. */
+ if (!DNA_struct_elem_find(fd->filesdna, "FModifier", "short", "ui_expand_flag")) {
+ LISTBASE_FOREACH (bAction *, act, &bmain->actions) {
+ LISTBASE_FOREACH (FCurve *, fcu, &act->curves) {
+ LISTBASE_FOREACH (FModifier *, fcm, &fcu->modifiers) {
+ SET_FLAG_FROM_TEST(fcm->ui_expand_flag,
+ fcm->flag & FMODIFIER_FLAG_EXPANDED,
+ UI_PANEL_DATA_EXPAND_ROOT);
+ }
+ }
+ }
+ }
+
/* Keep this block, even when empty. */
}
}
diff --git a/source/blender/blenloader/intern/versioning_cycles.c b/source/blender/blenloader/intern/versioning_cycles.c
index 631abe10ddc..816b90491aa 100644
--- a/source/blender/blenloader/intern/versioning_cycles.c
+++ b/source/blender/blenloader/intern/versioning_cycles.c
@@ -1420,7 +1420,7 @@ void do_versions_after_linking_cycles(Main *bmain)
}
if (!MAIN_VERSION_ATLEAST(bmain, 280, 64)) {
- /* Unfiy Cycles and Eevee settings. */
+ /* Unify Cycles and Eevee settings. */
Scene *scene = bmain->scenes.first;
const char *engine = (scene) ? scene->r.engine : "CYCLES";
diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c
index 198f65b9794..52efeb1e822 100644
--- a/source/blender/blenloader/intern/versioning_defaults.c
+++ b/source/blender/blenloader/intern/versioning_defaults.c
@@ -330,7 +330,7 @@ static void blo_update_defaults_scene(Main *bmain, Scene *scene)
/* Enable Soft Shadows by default. */
scene->eevee.flag |= SCE_EEVEE_SHADOW_SOFT;
- /* Be sure curfalloff and primitive are initializated */
+ /* Be sure `curfalloff` and primitive are initialized. */
ToolSettings *ts = scene->toolsettings;
if (ts->gp_sculpt.cur_falloff == NULL) {
ts->gp_sculpt.cur_falloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c
index dc8f7a0305a..e43f8153bd1 100644
--- a/source/blender/blenloader/intern/versioning_legacy.c
+++ b/source/blender/blenloader/intern/versioning_legacy.c
@@ -1316,13 +1316,13 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain)
}
}
- /* btw. armature_rebuild_pose is further only called on leave editmode */
+ /* Note: #BKE_pose_rebuild is further only called on leave edit-mode. */
if (ob->type == OB_ARMATURE) {
if (ob->pose) {
BKE_pose_tag_recalc(bmain, ob->pose);
}
- /* cannot call stuff now (pointers!), done in setup_app_data */
+ /* Cannot call stuff now (pointers!), done in #setup_app_data. */
ob->id.recalc |= ID_RECALC_ALL;
/* new generic xray option */
@@ -2378,7 +2378,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain)
Object *ob;
bActionStrip *strip;
- /* nla-strips - scale */
+ /* NLA-strips - scale. */
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
for (strip = ob->nlastrips.first; strip; strip = strip->next) {
float length, actlength, repeat;
diff --git a/source/blender/blenloader/intern/versioning_userdef.c b/source/blender/blenloader/intern/versioning_userdef.c
index 322830282e9..3d39181cd32 100644
--- a/source/blender/blenloader/intern/versioning_userdef.c
+++ b/source/blender/blenloader/intern/versioning_userdef.c
@@ -273,6 +273,15 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
{
/* Keep this block, even when empty. */
FROM_DEFAULT_V4_UCHAR(space_properties.active);
+
+ FROM_DEFAULT_V4_UCHAR(space_info.info_error);
+ FROM_DEFAULT_V4_UCHAR(space_info.info_warning);
+ FROM_DEFAULT_V4_UCHAR(space_info.info_info);
+ FROM_DEFAULT_V4_UCHAR(space_info.info_debug);
+ FROM_DEFAULT_V4_UCHAR(space_info.info_debug_text);
+ FROM_DEFAULT_V4_UCHAR(space_info.info_property);
+ FROM_DEFAULT_V4_UCHAR(space_info.info_error);
+ FROM_DEFAULT_V4_UCHAR(space_info.info_operator);
}
#undef FROM_DEFAULT_V4_UCHAR
@@ -827,6 +836,13 @@ void blo_do_versions_userdef(UserDef *userdef)
}
}
+ if (!USER_VERSION_ATLEAST(293, 2)) {
+ /* Enable asset browser features by default for alpha testing.
+ * BLO_sanitize_experimental_features_userpref_blend() will disable it again for non-alpha
+ * builds. */
+ userdef->experimental.use_asset_browser = true;
+ }
+
/**
* Versioning code until next subversion bump goes here.
*
@@ -838,6 +854,9 @@ void blo_do_versions_userdef(UserDef *userdef)
*/
{
/* Keep this block, even when empty. */
+ if (userdef->gizmo_size_navigate_v3d == 0) {
+ userdef->gizmo_size_navigate_v3d = 80;
+ }
}
LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
diff --git a/source/blender/blentranslation/intern/blt_lang.c b/source/blender/blentranslation/intern/blt_lang.c
index bd0352d3e80..97a1a83792a 100644
--- a/source/blender/blentranslation/intern/blt_lang.c
+++ b/source/blender/blentranslation/intern/blt_lang.c
@@ -48,10 +48,6 @@
#include "MEM_guardedalloc.h"
-/* Cached IME support flags */
-static bool ime_is_lang_supported = false;
-static void blt_lang_check_ime_supported(void);
-
#ifdef WITH_INTERNATIONAL
# include "BLI_fileops.h"
@@ -205,7 +201,7 @@ void BLT_lang_init(void)
const char *const messagepath = BKE_appdir_folder_id(BLENDER_DATAFILES, "locale");
#endif
- /* Make sure LANG is correct and wouldn't cause #std::rumtime_error. */
+ /* Make sure LANG is correct and wouldn't cause #std::runtime_error. */
#ifndef _WIN32
/* TODO(sergey): This code only ensures LANG is set properly, so later when
* Cycles will try to use file system API from boost there will be no runtime
@@ -286,7 +282,6 @@ void BLT_lang_set(const char *str)
#else
(void)str;
#endif
- blt_lang_check_ime_supported();
IMB_thumb_clear_translations();
}
@@ -380,24 +375,13 @@ void BLT_lang_locale_explode(const char *locale,
}
}
-/**
- * Test if the translation context allows IME input - used to
- * avoid weird character drawing if IME inputs non-ascii chars.
- */
-static void blt_lang_check_ime_supported(void)
-{
-#ifdef WITH_INPUT_IME
- const char *uilng = BLT_lang_get();
- ime_is_lang_supported = STR_ELEM(uilng, "zh_CN", "zh_TW", "ja_JP");
-#else
- ime_is_lang_supported = false;
-#endif
-}
-
+/* Note that "lang" here is the _output_ display language. We used to restrict
+ * IME for keyboard _input_ language because our multilingual font was only used
+ * when some output languages were selected. That font is used all the time now. */
bool BLT_lang_is_ime_supported(void)
{
#ifdef WITH_INPUT_IME
- return ime_is_lang_supported;
+ return true;
#else
return false;
#endif
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index 9899d67c008..7cbad1ed069 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -238,7 +238,6 @@ typedef struct BMesh {
uint use_toolflags : 1;
int toolflag_index;
- struct BMOperator *currentop;
CustomData vdata, edata, ldata, pdata;
@@ -374,7 +373,8 @@ enum {
BM_ELEM_DRAW = (1 << 5), /* edge display */
/* spare tag, assumed dirty, use define in each function to name based on use */
- // _BM_ELEM_TAG_ALT = (1 << 6), // UNUSED
+ BM_ELEM_TAG_ALT = (1 << 6),
+
/**
* For low level internal API tagging,
* since tools may want to tag verts and not have functions clobber them.
diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c
index b913bdd12e4..cf907862120 100644
--- a/source/blender/bmesh/intern/bmesh_core.c
+++ b/source/blender/bmesh/intern/bmesh_core.c
@@ -2158,7 +2158,7 @@ BMFace *bmesh_kernel_join_face_kill_edge(BMesh *bm, BMFace *f1, BMFace *f2, BMEd
l_f1->next->prev = l_f2->prev;
l_f2->prev->next = l_f1->next;
- /* if l_f1 was baseloop, make l_f1->next the base. */
+ /* If `l_f1` was base-loop, make `l_f1->next` the base. */
if (BM_FACE_FIRST_LOOP(f1) == l_f1) {
BM_FACE_FIRST_LOOP(f1) = l_f1->next;
}
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.c b/source/blender/bmesh/intern/bmesh_edgeloop.c
index ec97ea51047..51a6ada6c42 100644
--- a/source/blender/bmesh/intern/bmesh_edgeloop.c
+++ b/source/blender/bmesh/intern/bmesh_edgeloop.c
@@ -450,7 +450,7 @@ void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops, const boo
}
mul_v3_fl(cent, 1.0f / (float)tot);
- /* find far outest loop */
+ /* Find the furthest out loop. */
{
BMEdgeLoopStore *el_store_best = NULL;
float len_best_sq = -1.0f;
diff --git a/source/blender/bmesh/intern/bmesh_error.h b/source/blender/bmesh/intern/bmesh_error.h
index 1837ad8dd71..41d02e334fb 100644
--- a/source/blender/bmesh/intern/bmesh_error.h
+++ b/source/blender/bmesh/intern/bmesh_error.h
@@ -25,7 +25,7 @@
/*----------- bmop error system ----------*/
/* pushes an error onto the bmesh error stack.
- * if msg is null, then the default message for the errorcode is used.*/
+ * if msg is null, then the default message for the `errcode` is used. */
void BMO_error_raise(BMesh *bm, BMOperator *owner, int errcode, const char *msg);
/* gets the topmost error from the stack.
@@ -33,7 +33,7 @@ void BMO_error_raise(BMesh *bm, BMOperator *owner, int errcode, const char *msg)
int BMO_error_get(BMesh *bm, const char **msg, BMOperator **op);
bool BMO_error_occurred(BMesh *bm);
-/* same as geterror, only pops the error off the stack as well */
+/* Same as #BMO_error_get, only pops the error off the stack as well. */
int BMO_error_pop(BMesh *bm, const char **msg, BMOperator **op);
void BMO_error_clear(BMesh *bm);
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index a15408d43be..6857a1f3929 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -342,8 +342,12 @@ static void mdisp_axis_from_quad(const float v1[3],
normalize_v3(r_axis_y);
}
-/* tl is loop to project onto, l is loop whose internal displacement, co, is being
- * projected. x and y are location in loop's mdisps grid of point co. */
+/**
+ * \param l_src: is loop whose internal displacement.
+ * \param l_dst: is loop to project onto.
+ * \param p: The point being projected.
+ * \param r_axis_x, r_axis_y: The location in loop's #CD_MDISPS grid of point `p`.
+ */
static bool mdisp_in_mdispquad(BMLoop *l_src,
BMLoop *l_dst,
const float l_dst_f_center[3],
diff --git a/source/blender/bmesh/intern/bmesh_iterators.c b/source/blender/bmesh/intern/bmesh_iterators.c
index 44e3ef6e6ee..c81d4f9b67c 100644
--- a/source/blender/bmesh/intern/bmesh_iterators.c
+++ b/source/blender/bmesh/intern/bmesh_iterators.c
@@ -177,7 +177,7 @@ void *BM_iter_as_arrayN(BMesh *bm,
BLI_assert(stack_array_size == 0 || (stack_array_size && stack_array));
- /* we can't rely on coun't being set */
+ /* We can't rely on #BMIter.count being set. */
switch (itype) {
case BM_VERTS_OF_MESH:
iter.count = bm->totvert;
diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c
index 4fe6e6aee58..9cd1a2fd4ec 100644
--- a/source/blender/bmesh/intern/bmesh_marking.c
+++ b/source/blender/bmesh/intern/bmesh_marking.c
@@ -888,7 +888,7 @@ void BM_editselection_plane(BMEditSelection *ese, float r_plane[3])
sub_v3_v3v3(r_plane, vec, eve->co);
}
else {
- /* make a fake plane that's at rightangles to the normal
+ /* make a fake plane that's at right-angles to the normal
* we can't make a crossvec from a vec that's the same as the vec
* unlikely but possible, so make sure if the normal is (0, 0, 1)
* that vec isn't the same or in the same direction even. */
diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c
index 4c72b802396..8e5ed9c3bf0 100644
--- a/source/blender/bmesh/intern/bmesh_mods.c
+++ b/source/blender/bmesh/intern/bmesh_mods.c
@@ -802,7 +802,7 @@ void BM_edge_calc_rotate(BMEdge *e, const bool ccw, BMLoop **r_l1, BMLoop **r_l2
/* we know this will work */
BM_edge_face_pair(e, &fa, &fb);
- /* so we can use ccw variable correctly,
+ /* so we can use `ccw` variable correctly,
* otherwise we could use the edges verts direct */
BM_edge_ordered_verts(e, &v1, &v2);
@@ -886,7 +886,7 @@ bool BM_edge_rotate_check_degenerate(BMEdge *e, BMLoop *l1, BMLoop *l2)
/* verts from the loops passed */
BMVert *v1, *v2;
- /* these are the opposite verts - the verts that _would_ be used if 'ccw' was inverted*/
+ /* These are the opposite verts - the verts that _would_ be used if `ccw` was inverted. */
BMVert *v1_alt, *v2_alt;
/* this should have already run */
@@ -1070,7 +1070,7 @@ BMEdge *BM_edge_rotate(BMesh *bm, BMEdge *e, const bool ccw, const short check_f
BM_face_normal_flip(bm, fb);
if (ccw) {
- /* needed otherwise ccw toggles direction */
+ /* Needed otherwise `ccw` toggles direction */
e_new->l = e_new->l->radial_next;
}
}
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index d8cdff1a4cc..bccac006e8e 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -54,7 +54,8 @@
#include "DNA_modifier_types.h"
-/* The formatting of these bmesh operators is parsed by
+/**
+ * The formatting of these bmesh operators is parsed by
* 'doc/python_api/rst_from_bmesh_opdefines.py'
* for use in python docs, so reStructuredText may be used
* rather than doxygen syntax.
@@ -65,8 +66,7 @@
* """
* Region Extend.
*
- * paragraph1, Extends bleh bleh bleh.
- * Bleh Bleh bleh.
+ * paragraph1, Extends on the title above.
*
* Another paragraph.
*
@@ -731,7 +731,7 @@ static BMOpDefine bmo_edgenet_fill_def = {
*
* - One single loop; an edge is added to connect the ends
* - Two loops; two edges are added to connect the endpoints (based on the
- * shortest distance between each endpont).
+ * shortest distance between each endpoint).
*/
static BMOpDefine bmo_edgenet_prepare_def = {
"edgenet_prepare",
@@ -1268,7 +1268,7 @@ static BMOpDefine bmo_subdivide_edges_def = {
{"quad_corner_type", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_subdivide_edges_quad_corner_type}, /* quad corner type */
{"use_grid_fill", BMO_OP_SLOT_BOOL}, /* fill in fully-selected faces with a grid */
{"use_single_edge", BMO_OP_SLOT_BOOL}, /* tessellate the case of one edge selected in a quad or triangle */
- {"use_only_quads", BMO_OP_SLOT_BOOL}, /* only subdivide quads (for loopcut) */
+ {"use_only_quads", BMO_OP_SLOT_BOOL}, /* Only subdivide quads (for loop-cut). */
{"use_sphere", BMO_OP_SLOT_BOOL}, /* for making new primitives only */
{"use_smooth_even", BMO_OP_SLOT_BOOL}, /* maintain even offset when smoothing */
{{'\0'}},
@@ -1394,7 +1394,7 @@ static BMOpDefine bmo_duplicate_def = {
/* slots_out */
{{"geom_orig.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
- /* facemap maps from source faces to dupe
+ /* face_map maps from source faces to dupe
* faces, and from dupe faces to source faces */
{"vert_map.out", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_ELEM}},
{"edge_map.out", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_ELEM}},
diff --git a/source/blender/bmesh/intern/bmesh_operators.h b/source/blender/bmesh/intern/bmesh_operators.h
index 2f7d91c78c4..2d9e244e54d 100644
--- a/source/blender/bmesh/intern/bmesh_operators.h
+++ b/source/blender/bmesh/intern/bmesh_operators.h
@@ -24,7 +24,7 @@
/*--------defines/enumerations for specific operators-------*/
-/*quad innervert values*/
+/* Quad `innervert` values. */
enum {
SUBD_CORNER_INNERVERT,
SUBD_CORNER_PATH,
diff --git a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
index 1d000b3b232..dcf9717465c 100644
--- a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
+++ b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
@@ -1566,7 +1566,7 @@ bool BM_face_split_edgenet_connect_islands(BMesh *bm,
for (uint g_index = 1; g_index < group_arr_len; g_index++) {
struct EdgeGroupIsland *g = group_arr[g_index];
- /* the range of verts this group uses in 'verts_arr' (not uncluding the last index) */
+ /* The range of verts this group uses in 'verts_arr' (not including the last index). */
vert_range[0] = vert_range[1];
vert_range[1] += g->vert_len;
diff --git a/source/blender/bmesh/intern/bmesh_structure.c b/source/blender/bmesh/intern/bmesh_structure.c
index ef4a9c9de1c..cfdce0b749b 100644
--- a/source/blender/bmesh/intern/bmesh_structure.c
+++ b/source/blender/bmesh/intern/bmesh_structure.c
@@ -143,7 +143,7 @@ void bmesh_disk_vert_replace(BMEdge *e, BMVert *v_dst, BMVert *v_src)
*
* The loop cycle keeps track of a faces vertices and edges. It should be noted that the
* direction of a loop cycle is either CW or CCW depending on the face normal, and is
- * not oriented to the faces editedges.
+ * not oriented to the faces edit-edges.
*
* Functions relating to this cycle:
* - bmesh_cycle_XXX family of functions.
@@ -537,7 +537,7 @@ int bmesh_radial_length(const BMLoop *l)
do {
if (UNLIKELY(!l_iter)) {
- /* radial cycle is broken (not a circulat loop) */
+ /* Radial cycle is broken (not a circular loop). */
BMESH_ASSERT(0);
return 0;
}
diff --git a/source/blender/bmesh/intern/bmesh_walkers.h b/source/blender/bmesh/intern/bmesh_walkers.h
index a973e12a4c7..22ee8809a19 100644
--- a/source/blender/bmesh/intern/bmesh_walkers.h
+++ b/source/blender/bmesh/intern/bmesh_walkers.h
@@ -122,7 +122,7 @@ enum {
BMW_CONNECTED_VERTEX,
/* end of array index enum vals */
- /* do not intitialze function pointers and struct size in BMW_init */
+ /* Do not initialize function pointers and struct size in #BMW_init. */
BMW_CUSTOM,
BMW_MAXWALKERS,
};
diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c
index c23551ecca7..647a22baaeb 100644
--- a/source/blender/bmesh/intern/bmesh_walkers_impl.c
+++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c
@@ -29,7 +29,7 @@
#include "bmesh.h"
#include "intern/bmesh_walkers_private.h"
-/* pop into stack memory (common operation) */
+/* Pop into stack memory (common operation). */
#define BMW_state_remove_r(walker, owalk) \
{ \
memcpy(owalk, BMW_current_state(walker), sizeof(*(owalk))); \
@@ -86,7 +86,7 @@ static bool bmw_mask_check_face(BMWalker *walker, BMFace *f)
static bool bmw_edge_is_wire(const BMWalker *walker, const BMEdge *e)
{
if (walker->flag & BMW_FLAG_TEST_HIDDEN) {
- /* check if this is a wire edge, ignoring hidden faces */
+ /* Check if this is a wire edge, ignoring hidden faces. */
if (BM_edge_is_wire(e)) {
return true;
}
@@ -137,8 +137,7 @@ static void bmw_VertShellWalker_begin(BMWalker *walker, void *data)
switch (h->htype) {
case BM_VERT: {
- /* starting the walk at a vert, add all the edges
- * to the worklist */
+ /* Starting the walk at a vert, add all the edges to the work-list. */
v = (BMVert *)h;
BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
bmw_VertShellWalker_visitEdge(walker, e);
@@ -147,8 +146,7 @@ static void bmw_VertShellWalker_begin(BMWalker *walker, void *data)
}
case BM_EDGE: {
- /* starting the walk at an edge, add the single edge
- * to the worklist */
+ /* Starting the walk at an edge, add the single edge to the work-list. */
e = (BMEdge *)h;
bmw_VertShellWalker_visitEdge(walker, e);
break;
@@ -201,7 +199,7 @@ static void *bmw_VertShellWalker_step(BMWalker *walker)
BMW_state_remove(walker);
- /* find the next edge whose other vertex has not been visite */
+ /* Find the next edge whose other vertex has not been visited. */
curedge = shellWalk.curedge;
do {
if (!BLI_gset_haskey(walker->visit_set, curedge)) {
@@ -212,11 +210,11 @@ static void *bmw_VertShellWalker_step(BMWalker *walker)
v_old = BM_edge_other_vert(curedge, shellWalk.base);
- /* push a new state onto the stac */
+ /* Push a new state onto the stack. */
newState = BMW_state_add(walker);
BLI_gset_insert(walker->visit_set, curedge);
- /* populate the new stat */
+ /* Populate the new state. */
newState->base = v_old;
newState->curedge = curedge;
@@ -266,8 +264,7 @@ static void bmw_LoopShellWalker_begin(BMWalker *walker, void *data)
switch (h->htype) {
case BM_LOOP: {
- /* starting the walk at a vert, add all the edges
- * to the worklist */
+ /* Starting the walk at a vert, add all the edges to the work-list. */
BMLoop *l = (BMLoop *)h;
bmw_LoopShellWalker_visitLoop(walker, l);
break;
@@ -292,7 +289,7 @@ static void bmw_LoopShellWalker_begin(BMWalker *walker, void *data)
case BM_FACE: {
BMFace *f = (BMFace *)h;
BMLoop *l = BM_FACE_FIRST_LOOP(f);
- /* walker will handle other loops within the face */
+ /* Walker will handle other loops within the face. */
bmw_LoopShellWalker_visitLoop(walker, l);
break;
}
@@ -312,7 +309,7 @@ static void bmw_LoopShellWalker_step_impl(BMWalker *walker, BMLoop *l)
BMEdge *e_edj_pair[2];
int i;
- /* seems paranoid, but one caller also walks edges */
+ /* Seems paranoid, but one caller also walks edges. */
BLI_assert(l->head.htype == BM_LOOP);
bmw_LoopShellWalker_visitLoop(walker, l->next);
@@ -409,7 +406,7 @@ static void bmw_LoopShellWireWalker_visitVert(BMWalker *walker, BMVert *v, const
bmw_LoopShellWalker_visitEdgeWire(walker, e);
- /* check if we step onto a non-wire vertex */
+ /* Check if we step onto a non-wire vertex. */
v_other = BM_edge_other_vert(e, v);
BM_ITER_ELEM (l, &iter, v_other, BM_LOOPS_OF_VERT) {
@@ -463,7 +460,7 @@ static void bmw_LoopShellWireWalker_begin(BMWalker *walker, void *data)
break;
}
case BM_FACE: {
- /* wire verts will be walked over */
+ /* Wire verts will be walked over. */
break;
}
default:
@@ -581,12 +578,12 @@ static void bmw_ConnectedVertexWalker_visitVertex(BMWalker *walker, BMVert *v)
BMwConnectedVertexWalker *vwalk;
if (BLI_gset_haskey(walker->visit_set, v)) {
- /* already visited */
+ /* Already visited. */
return;
}
if (!bmw_mask_check_vert(walker, v)) {
- /* not flagged for walk */
+ /* Not flagged for walk. */
return;
}
@@ -670,10 +667,9 @@ static void *bmw_IslandboundWalker_step(BMWalker *walker)
BMEdge *e;
BMFace *f;
BMLoop *l;
- /* int found = 0; */
memcpy(&owalk, BMW_current_state(walker), sizeof(owalk));
- /* normally we'd remove here, but delay until after error checking */
+ /* Normally we'd remove here, but delay until after error checking. */
iwalk = &owalk;
l = iwalk->curloop;
@@ -681,7 +677,7 @@ static void *bmw_IslandboundWalker_step(BMWalker *walker)
v = BM_edge_other_vert(e, iwalk->lastv);
- /* pop off current state */
+ /* Pop off current state. */
BMW_state_remove(walker);
f = l->f;
@@ -699,7 +695,7 @@ static void *bmw_IslandboundWalker_step(BMWalker *walker)
}
}
else {
- /* treat non-manifold edges as boundaries */
+ /* Treat non-manifold edges as boundaries. */
f = l->f;
e = l->e;
break;
@@ -717,9 +713,16 @@ static void *bmw_IslandboundWalker_step(BMWalker *walker)
iwalk = BMW_state_add(walker);
iwalk->base = owalk.base;
- // if (!BMO_face_flag_test(walker->bm, l->f, walker->restrictflag))
- // iwalk->curloop = l->radial_next;
- iwalk->curloop = l; // else iwalk->curloop = l;
+#if 0
+ if (!BMO_face_flag_test(walker->bm, l->f, walker->restrictflag)) {
+ iwalk->curloop = l->radial_next;
+ }
+ else {
+ iwalk->curloop = l;
+ }
+#else
+ iwalk->curloop = l;
+#endif
iwalk->lastv = v;
return owalk.curloop;
@@ -763,7 +766,7 @@ static void *bmw_IslandWalker_step_ex(BMWalker *walker, bool only_manifold)
l_iter = l_first = BM_FACE_FIRST_LOOP(iwalk->cur);
do {
- /* could skip loop here too, but don't add unless we need it */
+ /* Could skip loop here too, but don't add unless we need it. */
if (!bmw_mask_check_edge(walker, l_iter->e)) {
continue;
}
@@ -772,7 +775,7 @@ static void *bmw_IslandWalker_step_ex(BMWalker *walker, bool only_manifold)
if (only_manifold && (l_iter->radial_next != l_iter)) {
int face_count = 1;
- /* check other faces (not this one), ensure only one other can be walked onto. */
+ /* Check other faces (not this one), ensure only one other Can be walked onto. */
l_radial_iter = l_iter->radial_next;
do {
if (bmw_mask_check_face(walker, l_radial_iter->f)) {
@@ -796,7 +799,7 @@ static void *bmw_IslandWalker_step_ex(BMWalker *walker, bool only_manifold)
continue;
}
- /* saves checking BLI_gset_haskey below (manifold edges there's a 50% chance) */
+ /* Saves checking #BLI_gset_haskey below (manifold edges there's a 50% chance). */
if (f == iwalk->cur) {
continue;
}
@@ -947,12 +950,12 @@ static void bmw_EdgeLoopWalker_begin(BMWalker *walker, void *data)
}
if (f_best) {
- /* only use hub selection for 5+ sides else this could
+ /* Only use hub selection for 5+ sides else this could
* conflict with normal edge loop selection. */
lwalk->f_hub = f_best->len > 4 ? f_best : NULL;
}
else {
- /* edge doesn't have any faces connected to it */
+ /* Edge doesn't have any faces connected to it. */
lwalk->f_hub = NULL;
}
}
@@ -960,7 +963,7 @@ static void bmw_EdgeLoopWalker_begin(BMWalker *walker, void *data)
lwalk->f_hub = NULL;
}
- /* rewind */
+ /* Rewind. */
while ((owalk_pt = BMW_current_state(walker))) {
owalk = *((BMwEdgeLoopWalker *)owalk_pt);
BMW_walk(walker);
@@ -1007,7 +1010,7 @@ static void *bmw_EdgeLoopWalker_step(BMWalker *walker)
nexte = BM_edge_exists(v, l->v);
if (bmw_mask_check_edge(walker, nexte) && !BLI_gset_haskey(walker->visit_set, nexte) &&
- /* never step onto a boundary edge, this gives odd-results */
+ /* Never step onto a boundary edge, this gives odd-results. */
(BM_edge_is_boundary(nexte) == false)) {
lwalk = BMW_state_add(walker);
lwalk->cur = nexte;
@@ -1024,7 +1027,7 @@ static void *bmw_EdgeLoopWalker_step(BMWalker *walker)
else if (l == NULL) { /* WIRE EDGE */
BMIter eiter;
- /* match trunk: mark all connected wire edges */
+ /* Match trunk: mark all connected wire edges. */
for (int i = 0; i < 2; i++) {
v = i ? e->v2 : e->v1;
@@ -1051,9 +1054,8 @@ static void *bmw_EdgeLoopWalker_step(BMWalker *walker)
vert_edge_tot = BM_vert_edge_count_nonwire(v);
- /* Typical loopiong over edges in the middle of a mesh */
- /* However, why use 2 here at all?
- * I guess for internal ngon loops it can be useful. Antony R. */
+ /* Typical looping over edges in the middle of a mesh.
+ * Why use 2 here at all? - for internal ngon loops it can be useful. */
if (ELEM(vert_edge_tot, 4, 2)) {
int i_opposite = vert_edge_tot / 2;
int i = 0;
@@ -1094,15 +1096,15 @@ static void *bmw_EdgeLoopWalker_step(BMWalker *walker)
vert_edge_tot = BM_vert_edge_count_nonwire(v);
- /* check if we should step, this is fairly involved */
+ /* Check if we should step, this is fairly involved. */
if (
- /* walk over boundary of faces but stop at corners */
+ /* Walk over boundary of faces but stop at corners. */
(owalk.is_single == false && vert_edge_tot > 2) ||
- /* initial edge was a boundary, so is this edge and vertex is only a part of this face
- * this lets us walk over the boundary of an ngon which is handy */
+ /* Initial edge was a boundary, so is this edge and vertex is only a part of this face
+ * this lets us walk over the boundary of an ngon which is handy. */
(owalk.is_single == true && vert_edge_tot == 2 && BM_edge_is_boundary(e))) {
- /* find next boundary edge in the fan */
+ /* Find next boundary edge in the fan. */
do {
l = BM_loop_other_edge_loop(l, v);
if (BM_edge_is_manifold(l->e)) {
@@ -1148,14 +1150,16 @@ static void *bmw_EdgeLoopWalker_step(BMWalker *walker)
*
* Starts at a tool-flagged face and walks over the face loop
* Conditions for starting and stepping the face loop have been
- * tuned in an attempt to match the face loops built by EditMesh
+ * tuned in an attempt to match the face loops built by edit-mesh
* \{ */
-/* Check whether the face loop should includes the face specified
- * by the given BMLoop */
+/**
+ * Check whether the face loop should includes the face specified
+ * by the given #BMLoop.
+ */
static bool bmw_FaceLoopWalker_include_face(BMWalker *walker, BMLoop *l)
{
- /* face must have degree 4 */
+ /* Face must have degree 4. */
if (l->f->len != 4) {
return false;
}
@@ -1164,7 +1168,7 @@ static bool bmw_FaceLoopWalker_include_face(BMWalker *walker, BMLoop *l)
return false;
}
- /* the face must not have been already visited */
+ /* The face must not have been already visited. */
if (BLI_gset_haskey(walker->visit_set, l->f) && BLI_gset_haskey(walker->visit_set_alt, l->e)) {
return false;
}
@@ -1172,23 +1176,22 @@ static bool bmw_FaceLoopWalker_include_face(BMWalker *walker, BMLoop *l)
return true;
}
-/* Check whether the face loop can start from the given edge */
+/* Check whether the face loop can start from the given edge. */
static bool bmw_FaceLoopWalker_edge_begins_loop(BMWalker *walker, BMEdge *e)
{
- /* There is no face loop starting from a wire edge */
+ /* There is no face loop starting from a wire edge. */
if (BM_edge_is_wire(e)) {
return false;
}
- /* Don't start a loop from a boundary edge if it cannot
- * be extended to cover any faces */
+ /* Don't start a loop from a boundary edge if it cannot be extended to cover any faces. */
if (BM_edge_is_boundary(e)) {
if (!bmw_FaceLoopWalker_include_face(walker, e->l)) {
return false;
}
}
- /* Don't start a face loop from non-manifold edges */
+ /* Don't start a face loop from non-manifold edges. */
if (!BM_edge_is_manifold(e)) {
return false;
}
@@ -1212,7 +1215,7 @@ static void bmw_FaceLoopWalker_begin(BMWalker *walker, void *data)
lwalk->no_calc = false;
BLI_gset_insert(walker->visit_set, lwalk->l->f);
- /* rewind */
+ /* Rewind. */
while ((owalk_pt = BMW_current_state(walker))) {
owalk = *((BMwFaceLoopWalker *)owalk_pt);
BMW_walk(walker);
@@ -1277,7 +1280,7 @@ static void *bmw_FaceLoopWalker_step(BMWalker *walker)
lwalk->no_calc = false;
}
- /* both may already exist */
+ /* Both may already exist. */
BLI_gset_add(walker->visit_set_alt, l->e);
BLI_gset_add(walker->visit_set, l->f);
}
@@ -1312,7 +1315,7 @@ static void bmw_EdgeringWalker_begin(BMWalker *walker, void *data)
BLI_gset_insert(walker->visit_set, lwalk->l->e);
- /* rewind */
+ /* Rewind. */
while ((owalk_pt = BMW_current_state(walker))) {
owalk = *((BMwEdgeringWalker *)owalk_pt);
BMW_walk(walker);
@@ -1370,10 +1373,10 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker)
e = l->e;
if (!EDGE_CHECK(e)) {
- /* walker won't traverse to a non-manifold edge, but may
+ /* Walker won't traverse to a non-manifold edge, but may
* be started on one, and should not traverse *away* from
* a non-manifold edge (non-manifold edges are never in an
- * edge ring with manifold edges */
+ * edge ring with manifold edges. */
return e;
}
@@ -1394,7 +1397,7 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker)
i -= 2;
}
}
- /* only walk to manifold edge */
+ /* Only walk to manifold edge. */
if ((l->f->len % 2 == 0) && EDGE_CHECK(l->e) && !BLI_gset_haskey(walker->visit_set, l->e))
#else
@@ -1404,7 +1407,7 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker)
if ((l->f->len != 4) || !EDGE_CHECK(l->e) || !bmw_mask_check_face(walker, l->f)) {
l = owalk.l->next->next;
}
- /* only walk to manifold edge */
+ /* Only walk to manifold edge. */
if ((l->f->len == 4) && EDGE_CHECK(l->e) && !BLI_gset_haskey(walker->visit_set, l->e))
#endif
{
@@ -1547,8 +1550,8 @@ static void *bmw_UVEdgeWalker_step(BMWalker *walker)
return l;
}
- /* go over loops around l->v and nl->v and see which ones share l and nl's
- * mloopuv's coordinates. in addition, push on l->next if necessary */
+ /* Go over loops around `l->v` and `l->next->v` and see which ones share `l` and `l->next`
+ * UV's coordinates. in addition, push on `l->next` if necessary. */
for (i = 0; i < 2; i++) {
BMIter liter;
BMLoop *l_pivot, *l_radial;
@@ -1600,7 +1603,7 @@ static BMWalker bmw_VertShellWalker_Type = {
bmw_VertShellWalker_yield,
sizeof(BMwShellWalker),
BMW_BREADTH_FIRST,
- BM_EDGE, /* valid restrict masks */
+ BM_EDGE, /* Valid restrict masks. */
};
static BMWalker bmw_LoopShellWalker_Type = {
@@ -1610,7 +1613,7 @@ static BMWalker bmw_LoopShellWalker_Type = {
bmw_LoopShellWalker_yield,
sizeof(BMwLoopShellWalker),
BMW_BREADTH_FIRST,
- BM_EDGE, /* valid restrict masks */
+ BM_EDGE, /* Valid restrict masks. */
};
static BMWalker bmw_LoopShellWireWalker_Type = {
@@ -1620,7 +1623,7 @@ static BMWalker bmw_LoopShellWireWalker_Type = {
bmw_LoopShellWireWalker_yield,
sizeof(BMwLoopShellWireWalker),
BMW_BREADTH_FIRST,
- BM_EDGE, /* valid restrict masks */
+ BM_EDGE, /* Valid restrict masks. */
};
static BMWalker bmw_FaceShellWalker_Type = {
@@ -1630,7 +1633,7 @@ static BMWalker bmw_FaceShellWalker_Type = {
bmw_FaceShellWalker_yield,
sizeof(BMwShellWalker),
BMW_BREADTH_FIRST,
- BM_EDGE, /* valid restrict masks */
+ BM_EDGE, /* Valid restrict masks. */
};
static BMWalker bmw_IslandboundWalker_Type = {
@@ -1640,7 +1643,7 @@ static BMWalker bmw_IslandboundWalker_Type = {
bmw_IslandboundWalker_yield,
sizeof(BMwIslandboundWalker),
BMW_DEPTH_FIRST,
- BM_FACE, /* valid restrict masks */
+ BM_FACE, /* Valid restrict masks. */
};
static BMWalker bmw_IslandWalker_Type = {
@@ -1650,17 +1653,17 @@ static BMWalker bmw_IslandWalker_Type = {
bmw_IslandWalker_yield,
sizeof(BMwIslandWalker),
BMW_BREADTH_FIRST,
- BM_EDGE | BM_FACE, /* valid restrict masks */
+ BM_EDGE | BM_FACE, /* Valid restrict masks. */
};
static BMWalker bmw_IslandManifoldWalker_Type = {
BM_FACE,
bmw_IslandWalker_begin,
- bmw_IslandManifoldWalker_step, /* only difference with BMW_ISLAND */
+ bmw_IslandManifoldWalker_step, /* Only difference with #BMW_ISLAND. */
bmw_IslandWalker_yield,
sizeof(BMwIslandWalker),
BMW_BREADTH_FIRST,
- BM_EDGE | BM_FACE, /* valid restrict masks */
+ BM_EDGE | BM_FACE, /* Valid restrict masks. */
};
static BMWalker bmw_EdgeLoopWalker_Type = {
@@ -1671,7 +1674,7 @@ static BMWalker bmw_EdgeLoopWalker_Type = {
sizeof(BMwEdgeLoopWalker),
BMW_DEPTH_FIRST,
0,
- /* valid restrict masks */ /* could add flags here but so far none are used */
+ /* Valid restrict masks. */ /* Could add flags here but so far none are used. */
};
static BMWalker bmw_FaceLoopWalker_Type = {
@@ -1682,7 +1685,7 @@ static BMWalker bmw_FaceLoopWalker_Type = {
sizeof(BMwFaceLoopWalker),
BMW_DEPTH_FIRST,
0,
- /* valid restrict masks */ /* could add flags here but so far none are used */
+ /* Valid restrict masks. */ /* Could add flags here but so far none are used. */
};
static BMWalker bmw_EdgeringWalker_Type = {
@@ -1692,7 +1695,7 @@ static BMWalker bmw_EdgeringWalker_Type = {
bmw_EdgeringWalker_yield,
sizeof(BMwEdgeringWalker),
BMW_DEPTH_FIRST,
- BM_EDGE, /* valid restrict masks */
+ BM_EDGE, /* Valid restrict masks. */
};
static BMWalker bmw_EdgeboundaryWalker_Type = {
@@ -1712,7 +1715,7 @@ static BMWalker bmw_UVEdgeWalker_Type = {
bmw_UVEdgeWalker_yield,
sizeof(BMwUVEdgeWalker),
BMW_DEPTH_FIRST,
- BM_EDGE, /* valid restrict masks */
+ BM_EDGE, /* Valid restrict masks. */
};
static BMWalker bmw_ConnectedVertexWalker_Type = {
@@ -1722,23 +1725,23 @@ static BMWalker bmw_ConnectedVertexWalker_Type = {
bmw_ConnectedVertexWalker_yield,
sizeof(BMwConnectedVertexWalker),
BMW_BREADTH_FIRST,
- BM_VERT, /* valid restrict masks */
+ BM_VERT, /* Valid restrict masks. */
};
BMWalker *bm_walker_types[] = {
- &bmw_VertShellWalker_Type, /* BMW_VERT_SHELL */
- &bmw_LoopShellWalker_Type, /* BMW_LOOP_SHELL */
- &bmw_LoopShellWireWalker_Type, /* BMW_LOOP_SHELL_WIRE */
- &bmw_FaceShellWalker_Type, /* BMW_FACE_SHELL */
- &bmw_EdgeLoopWalker_Type, /* BMW_EDGELOOP */
- &bmw_FaceLoopWalker_Type, /* BMW_FACELOOP */
- &bmw_EdgeringWalker_Type, /* BMW_EDGERING */
- &bmw_EdgeboundaryWalker_Type, /* BMW_EDGEBOUNDARY */
- &bmw_UVEdgeWalker_Type, /* BMW_LOOPDATA_ISLAND */
- &bmw_IslandboundWalker_Type, /* BMW_ISLANDBOUND */
- &bmw_IslandWalker_Type, /* BMW_ISLAND */
- &bmw_IslandManifoldWalker_Type, /* BMW_ISLAND_MANIFOLD */
- &bmw_ConnectedVertexWalker_Type, /* BMW_CONNECTED_VERTEX */
+ &bmw_VertShellWalker_Type, /* #BMW_VERT_SHELL */
+ &bmw_LoopShellWalker_Type, /* #BMW_LOOP_SHELL */
+ &bmw_LoopShellWireWalker_Type, /* #BMW_LOOP_SHELL_WIRE */
+ &bmw_FaceShellWalker_Type, /* #BMW_FACE_SHELL */
+ &bmw_EdgeLoopWalker_Type, /* #BMW_EDGELOOP */
+ &bmw_FaceLoopWalker_Type, /* #BMW_FACELOOP */
+ &bmw_EdgeringWalker_Type, /* #BMW_EDGERING */
+ &bmw_EdgeboundaryWalker_Type, /* #BMW_EDGEBOUNDARY */
+ &bmw_UVEdgeWalker_Type, /* #BMW_LOOPDATA_ISLAND */
+ &bmw_IslandboundWalker_Type, /* #BMW_ISLANDBOUND */
+ &bmw_IslandWalker_Type, /* #BMW_ISLAND */
+ &bmw_IslandManifoldWalker_Type, /* #BMW_ISLAND_MANIFOLD */
+ &bmw_ConnectedVertexWalker_Type, /* #BMW_CONNECTED_VERTEX */
};
const int bm_totwalkers = ARRAY_SIZE(bm_walker_types);
diff --git a/source/blender/bmesh/operators/bmo_dissolve.c b/source/blender/bmesh/operators/bmo_dissolve.c
index 8c2e820df63..da2603ad8cd 100644
--- a/source/blender/bmesh/operators/bmo_dissolve.c
+++ b/source/blender/bmesh/operators/bmo_dissolve.c
@@ -55,7 +55,7 @@ static bool UNUSED_FUNCTION(check_hole_in_region)(BMesh *bm, BMFace *f)
BMLoop *l2, *l3;
BMFace *f2;
- /* checks if there are any unmarked boundary edges in the face regio */
+ /* Checks if there are any unmarked boundary edges in the face region. */
BMW_init(&regwalker,
bm,
@@ -159,7 +159,7 @@ void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
}
BLI_array_clear(faces);
- faces = NULL; /* forces different allocatio */
+ faces = NULL; /* Forces different allocation. */
BMW_init(&regwalker,
bm,
diff --git a/source/blender/bmesh/operators/bmo_dupe.c b/source/blender/bmesh/operators/bmo_dupe.c
index 6e968d58631..c128872be07 100644
--- a/source/blender/bmesh/operators/bmo_dupe.c
+++ b/source/blender/bmesh/operators/bmo_dupe.c
@@ -109,7 +109,7 @@ static BMEdge *bmo_edge_copy(BMOperator *op,
BMO_slot_map_elem_insert(op, slot_edgemap_out, e_src, e_dst);
BMO_slot_map_elem_insert(op, slot_edgemap_out, e_dst, e_src);
- /* add to new/old edge map if necassary */
+ /* Add to new/old edge map if necessary. */
if (rlen < 2) {
/* not sure what non-manifold cases of greater than three
* radial should do. */
diff --git a/source/blender/bmesh/operators/bmo_fill_grid.c b/source/blender/bmesh/operators/bmo_fill_grid.c
index 3aad37b3b02..df15778558b 100644
--- a/source/blender/bmesh/operators/bmo_fill_grid.c
+++ b/source/blender/bmesh/operators/bmo_fill_grid.c
@@ -326,8 +326,8 @@ static void bm_grid_fill_array(BMesh *bm,
v = BM_vert_create(bm, co, NULL, BM_CREATE_NOP);
v_grid[(y * xtot) + x] = v;
- /* interpolate only along one axis, this could be changed
- * but from user pov gives predictable results since these are selected loop */
+ /* Interpolate only along one axis, this could be changed
+ * but from user POV gives predictable results since these are selected loop. */
if (use_vert_interp) {
const float *w = weight_table[XY(x, y)];
diff --git a/source/blender/bmesh/operators/bmo_inset.c b/source/blender/bmesh/operators/bmo_inset.c
index 009c4f1f2c5..3869a0678e2 100644
--- a/source/blender/bmesh/operators/bmo_inset.c
+++ b/source/blender/bmesh/operators/bmo_inset.c
@@ -967,7 +967,7 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
is_mid = false;
}
- /* distable gives odd results at times, see T39288. */
+ /* Disable since this gives odd results at times, see T39288. */
#if 0
else if (compare_v3v3(f_a->no, f_b->no, 0.001f) == false) {
/* epsilon increased to fix T32329. */
diff --git a/source/blender/bmesh/operators/bmo_join_triangles.c b/source/blender/bmesh/operators/bmo_join_triangles.c
index 1da4be57568..086114f64e9 100644
--- a/source/blender/bmesh/operators/bmo_join_triangles.c
+++ b/source/blender/bmesh/operators/bmo_join_triangles.c
@@ -66,7 +66,7 @@ static float quad_calc_error(const float v1[3],
error += diff;
}
- /* Colinearity */
+ /* Co-linearity */
{
float edge_vecs[4][3];
float diff;
diff --git a/source/blender/bmesh/operators/bmo_normals.c b/source/blender/bmesh/operators/bmo_normals.c
index 8e7bfbb649d..3311ffefb0d 100644
--- a/source/blender/bmesh/operators/bmo_normals.c
+++ b/source/blender/bmesh/operators/bmo_normals.c
@@ -29,7 +29,7 @@
#include "intern/bmesh_operators_private.h" /* own include */
-/********* righthand faces implementation ****** */
+/********* Right-hand faces implementation ****** */
#define FACE_FLAG (1 << 0)
#define FACE_FLIP (1 << 1)
diff --git a/source/blender/bmesh/operators/bmo_primitive.c b/source/blender/bmesh/operators/bmo_primitive.c
index d661859c8e3..7d980299771 100644
--- a/source/blender/bmesh/operators/bmo_primitive.c
+++ b/source/blender/bmesh/operators/bmo_primitive.c
@@ -55,21 +55,21 @@ static const short icoface[20][3] = {
};
static const float icouvs[60][2] = {
- {0.818181f, 0.000000f}, {0.727272f, 0.157461f}, {0.909090f, 0.157461f}, {0.727272f, 0.157461f},
- {0.636363f, 0.000000f}, {0.545454f, 0.157461f}, {0.090909f, 0.000000f}, {0.000000f, 0.157461f},
- {0.181818f, 0.157461f}, {0.272727f, 0.000000f}, {0.181818f, 0.157461f}, {0.363636f, 0.157461f},
- {0.454545f, 0.000000f}, {0.363636f, 0.157461f}, {0.545454f, 0.157461f}, {0.727272f, 0.157461f},
- {0.545454f, 0.157461f}, {0.636363f, 0.314921f}, {0.909090f, 0.157461f}, {0.727272f, 0.157461f},
- {0.818181f, 0.314921f}, {0.181818f, 0.157461f}, {0.000000f, 0.157461f}, {0.090909f, 0.314921f},
- {0.363636f, 0.157461f}, {0.181818f, 0.157461f}, {0.272727f, 0.314921f}, {0.545454f, 0.157461f},
- {0.363636f, 0.157461f}, {0.454545f, 0.314921f}, {0.727272f, 0.157461f}, {0.636363f, 0.314921f},
- {0.818181f, 0.314921f}, {0.909090f, 0.157461f}, {0.818181f, 0.314921f}, {1.000000f, 0.314921f},
- {0.181818f, 0.157461f}, {0.090909f, 0.314921f}, {0.272727f, 0.314921f}, {0.363636f, 0.157461f},
- {0.272727f, 0.314921f}, {0.454545f, 0.314921f}, {0.545454f, 0.157461f}, {0.454545f, 0.314921f},
- {0.636363f, 0.314921f}, {0.818181f, 0.314921f}, {0.636363f, 0.314921f}, {0.727272f, 0.472382f},
- {1.000000f, 0.314921f}, {0.818181f, 0.314921f}, {0.909090f, 0.472382f}, {0.272727f, 0.314921f},
- {0.090909f, 0.314921f}, {0.181818f, 0.472382f}, {0.454545f, 0.314921f}, {0.272727f, 0.314921f},
- {0.363636f, 0.472382f}, {0.636363f, 0.314921f}, {0.454545f, 0.314921f}, {0.545454f, 0.472382f},
+ {0.181819f, 0.000000f}, {0.272728f, 0.157461f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f},
+ {0.363637f, 0.000000f}, {0.454546f, 0.157461f}, {0.909091f, 0.000000f}, {1.000000f, 0.157461f},
+ {0.818182f, 0.157461f}, {0.727273f, 0.000000f}, {0.818182f, 0.157461f}, {0.636364f, 0.157461f},
+ {0.545455f, 0.000000f}, {0.636364f, 0.157461f}, {0.454546f, 0.157461f}, {0.272728f, 0.157461f},
+ {0.454546f, 0.157461f}, {0.363637f, 0.314921f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f},
+ {0.181819f, 0.314921f}, {0.818182f, 0.157461f}, {1.000000f, 0.157461f}, {0.909091f, 0.314921f},
+ {0.636364f, 0.157461f}, {0.818182f, 0.157461f}, {0.727273f, 0.314921f}, {0.454546f, 0.157461f},
+ {0.636364f, 0.157461f}, {0.545455f, 0.314921f}, {0.272728f, 0.157461f}, {0.363637f, 0.314921f},
+ {0.181819f, 0.314921f}, {0.090910f, 0.157461f}, {0.181819f, 0.314921f}, {0.000000f, 0.314921f},
+ {0.818182f, 0.157461f}, {0.909091f, 0.314921f}, {0.727273f, 0.314921f}, {0.636364f, 0.157461f},
+ {0.727273f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.157461f}, {0.545455f, 0.314921f},
+ {0.363637f, 0.314921f}, {0.181819f, 0.314921f}, {0.363637f, 0.314921f}, {0.272728f, 0.472382f},
+ {0.000000f, 0.314921f}, {0.181819f, 0.314921f}, {0.090910f, 0.472382f}, {0.727273f, 0.314921f},
+ {0.909091f, 0.314921f}, {0.818182f, 0.472382f}, {0.545455f, 0.314921f}, {0.727273f, 0.314921f},
+ {0.636364f, 0.472382f}, {0.363637f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.472382f},
};
static const int monkeyo = 4;
@@ -962,7 +962,7 @@ void bmo_create_uvsphere_exec(BMesh *bm, BMOperator *op)
BM_mesh_calc_uvs_sphere(bm, FACE_MARK, cd_loop_uv_offset);
}
- /* and now do imat */
+ /* Now apply the inverse matrix. */
BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_vert_flag_test(bm, eve, VERT_MARK)) {
mul_m4_v3(mat, eve->co);
@@ -1585,9 +1585,9 @@ void BM_mesh_calc_uvs_cone(BMesh *bm,
float inv_mat[4][4];
int loop_index;
- /* Transform the upvector like we did the cone itself, without location. */
+ /* Transform the up-vector like we did the cone itself, without location. */
mul_mat3_m4_v3(mat, local_up);
- /* Remove global scaling... */
+ /* Remove global scaling. */
normalize_v3(local_up);
invert_m4_m4(inv_mat, mat);
diff --git a/source/blender/bmesh/operators/bmo_removedoubles.c b/source/blender/bmesh/operators/bmo_removedoubles.c
index 02f17ea5d4a..361b10520da 100644
--- a/source/blender/bmesh/operators/bmo_removedoubles.c
+++ b/source/blender/bmesh/operators/bmo_removedoubles.c
@@ -387,7 +387,7 @@ void bmo_average_vert_facedata_exec(BMesh *bm, BMOperator *op)
BMOIter siter;
BMIter iter;
BMVert *v;
- BMLoop *l /* , *firstl = NULL */;
+ BMLoop *l;
CDBlockBytes min, max;
int i;
diff --git a/source/blender/bmesh/operators/bmo_subdivide.c b/source/blender/bmesh/operators/bmo_subdivide.c
index 8b2f9478aab..be996e6ffe4 100644
--- a/source/blender/bmesh/operators/bmo_subdivide.c
+++ b/source/blender/bmesh/operators/bmo_subdivide.c
@@ -51,13 +51,13 @@ typedef struct SubDParams {
BMOpSlot *slot_custom_patterns; /* BMO_slot_get(params->op->slots_in, "custom_patterns"); */
float fractal_ofs[3];
- /* rumtime storage for shape key */
+ /* Runtime storage for shape key. */
struct {
int cd_vert_shape_offset;
int cd_vert_shape_offset_tmp;
int totlayer;
- /* shapekey holding displaced vertex coordinates for current geometry */
+ /* Shape-key holding displaced vertex coordinates for current geometry. */
int tmpkey;
} shape_info;
@@ -1094,7 +1094,7 @@ void bmo_subdivide_edges_exec(BMesh *bm, BMOperator *op)
}
}
- /* obvously don't test for other patterns matching */
+ /* Obviously don't test for other patterns matching. */
continue;
}
diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c
index cd12a260f82..a17724895f1 100644
--- a/source/blender/bmesh/tools/bmesh_bevel.c
+++ b/source/blender/bmesh/tools/bmesh_bevel.c
@@ -58,9 +58,9 @@
#define BEVEL_EPSILON_ANG DEG2RADF(2.0f)
#define BEVEL_SMALL_ANG DEG2RADF(10.0f)
/** Difference in dot products that corresponds to 10 degree difference between vectors. */
-#define BEVEL_SMALL_ANG_DOT 1 - cosf(BEVEL_SMALL_ANG)
+#define BEVEL_SMALL_ANG_DOT (1.0f - cosf(BEVEL_SMALL_ANG))
/** Difference in dot products that corresponds to 2.0 degree difference between vectors. */
-#define BEVEL_EPSILON_ANG_DOT 1 - cosf(BEVEL_EPSILON_ANG)
+#define BEVEL_EPSILON_ANG_DOT (1.0f - cosf(BEVEL_EPSILON_ANG))
#define BEVEL_MAX_ADJUST_PCT 10.0f
#define BEVEL_MAX_AUTO_ADJUST_PCT 300.0f
#define BEVEL_MATCH_SPEC_WEIGHT 0.2
@@ -235,7 +235,7 @@ typedef struct BoundVert {
/** Is this boundvert the side of the custom profile's start. */
bool is_profile_start;
char _pad[3];
- /** Length of seam starting from current boundvert to next boundvert with ccw ordering. */
+ /** Length of seam starting from current boundvert to next boundvert with CCW ordering. */
int seam_len;
/** Same as seam_len but defines length of sharp edges. */
int sharp_len;
@@ -807,6 +807,9 @@ static bool contig_ldata_across_edge(BMesh *bm, BMEdge *e, BMFace *f1, BMFace *f
}
BMVert *v1 = lef1->v;
BMVert *v2 = lef2->v;
+ if (v1 == v2) {
+ return false;
+ }
BLI_assert((v1 == e->v1 && v2 == e->v2) || (v1 == e->v2 && v2 == e->v1));
UNUSED_VARS_NDEBUG(v1, v2);
BMLoop *lv1f1 = lef1;
@@ -1958,7 +1961,7 @@ static bool make_unit_square_map(const float va[3],
/**
* Like make_unit_square_map, but this one makes a matrix that transforms the
* (1,1,1) corner of a unit cube into an arbitrary corner with corner vert d
- * and verts around it a, b, c (in ccw order, viewed from d normal dir).
+ * and verts around it a, b, c (in CCW order, viewed from d normal dir).
* The matrix mat is calculated to map:
* (1,0,0) -> va
* (0,1,0) -> vb
@@ -1966,9 +1969,9 @@ static bool make_unit_square_map(const float va[3],
* (1,1,1) -> vd
* We want M to make M*A=B where A has the left side above, as columns
* and B has the right side as columns - both extended into homogeneous coords.
- * So M = B*(Ainverse). Doing Ainverse by hand gives the code below.
- * The cols of M are 1/2{va-vb+vc-vd}, 1/2{-va+vb-vc+vd}, 1/2{-va-vb+vc+vd},
- * and 1/2{va+vb+vc-vd}
+ * So `M = B*(Ainverse)`. Doing `Ainverse` by hand gives the code below.
+ * The cols of M are `1/2{va-vb+vc-vd}`, `1/2{-va+vb-vc+vd}`, `1/2{-va-vb+vc+vd}`,
+ * and `1/2{va+vb+vc-vd}`
* and Blender matrices have cols at m[i][*].
*/
static void make_unit_cube_map(
@@ -3433,7 +3436,7 @@ static EdgeHalf *next_edgehalf_bev(BevelParams *bp,
}
normalize_v3(dir_new_edge);
- /* Use this edge if it is the most parallel to the orignial so far. */
+ /* Use this edge if it is the most parallel to the original so far. */
float new_dot = dot_v3v3(dir_new_edge, dir_start_edge);
if (new_dot > best_dot) {
second_best_dot = best_dot; /* For remembering if the choice was too close. */
@@ -4674,7 +4677,7 @@ static VMesh *pipe_adj_vmesh(BevelParams *bp, BevVert *bv, BoundVert *vpipe)
f = (float)k / (float)ns; /* Ring runs along the pipe, so segment is used here. */
}
- /* Place the vertex by interpolatin between the two profile points using the factor. */
+ /* Place the vertex by interpolating between the two profile points using the factor. */
interp_v3_v3v3(mesh_vert(vm, i, j, k)->co, profile_point_pipe1, profile_point_pipe2, f);
}
else {
@@ -6375,7 +6378,7 @@ static bool bev_rebuild_polygon(BMesh *bm, BevelParams *bp, BMFace *f)
go_ccw = (e->fnext != f);
}
else {
- go_ccw = true; /* Going ccw around bv to trace this corner. */
+ go_ccw = true; /* Going CCW around bv to trace this corner. */
}
}
else if (eprev->prev == e) {
@@ -6385,7 +6388,7 @@ static bool bev_rebuild_polygon(BMesh *bm, BevelParams *bp, BMFace *f)
/* Edges in face are non-contiguous in our ordering around bv.
* Which way should we go when going from eprev to e? */
if (count_ccw_edges_between(eprev, e) < count_ccw_edges_between(e, eprev)) {
- /* Go counterclockewise from eprev to e. */
+ /* Go counter-clockwise from eprev to e. */
go_ccw = true;
}
else {
@@ -6419,7 +6422,7 @@ static bool bev_rebuild_polygon(BMesh *bm, BevelParams *bp, BMFace *f)
BLI_array_append(ee, bme);
}
while (v != vend) {
- /* Check for special case: multisegment 3rd face opposite a beveled edge with no vmesh. */
+ /* Check for special case: multi-segment 3rd face opposite a beveled edge with no vmesh. */
bool corner3special = (vm->mesh_kind == M_NONE && v->ebev != e && v->ebev != eprev);
if (go_ccw) {
int i = v->index;
@@ -7227,17 +7230,17 @@ static void set_profile_spacing(BevelParams *bp, ProfileSpacing *pro_spacing, bo
* B
* </pre>
*
- * where edges are A, B, and C, following a face around vertices a, b, c, d.
- * th1 is angle abc and th2 is angle bcd;
- * and the argument EdgeHalf eb is B, going from b to c.
+ * where edges are A, B, and C, following a face around vertices `a, b, c, d`.
+ * `th1` is angle `abc` and th2 is angle `bcd`;
+ * and the argument `EdgeHalf eb` is B, going from b to c.
* In general case, edge offset specs for A, B, C have
- * the form ka*t, kb*t, kc*t where ka, kb, kc are some factors
+ * the form `ka*t`, `kb*t`, `kc*t` where `ka`, `kb`, `kc` are some factors
* (may be 0) and t is the current bp->offset.
* We want to calculate t at which the clone of B parallel
* to it collapses. This can be calculated using trig.
* Another case of geometry collision that can happen is
- * When B slides along A because A is unbeveled.
- * Then it might collide with a. Similarly for B sliding along C.
+ * When B slides along A because A is un-beveled.
+ * Then it might collide with a. Similarly for B sliding along C.
*/
static float geometry_collide_offset(BevelParams *bp, EdgeHalf *eb)
{
@@ -7566,7 +7569,7 @@ void BM_mesh_bevel(BMesh *bm,
}
}
- /* Perhaps clamp offset to avoid geometry colliisions. */
+ /* Perhaps clamp offset to avoid geometry collisions. */
if (limit_offset) {
bevel_limit_offset(&bp, bm);
diff --git a/source/blender/bmesh/tools/bmesh_decimate_collapse.c b/source/blender/bmesh/tools/bmesh_decimate_collapse.c
index 60c49587387..92ca8e38737 100644
--- a/source/blender/bmesh/tools/bmesh_decimate_collapse.c
+++ b/source/blender/bmesh/tools/bmesh_decimate_collapse.c
@@ -294,8 +294,7 @@ static void bm_decim_build_edge_cost_single(BMEdge *e,
/* subtract existing cost to further differentiate edges from one another
*
* keep topology cost below 0.0 so their values don't interfere with quadric cost,
- * (and they get handled first).
- * */
+ * (and they get handled first). */
if (vweights == NULL) {
cost = bm_decim_build_edge_cost_single_squared__topology(e) - cost;
}
@@ -1319,9 +1318,9 @@ void BM_mesh_decimate_collapse(BMesh *bm,
UNUSED_VARS(do_triangulate);
#endif
- /* alloc vars */
+ /* Allocate variables. */
vquadrics = MEM_callocN(sizeof(Quadric) * bm->totvert, __func__);
- /* since some edges may be degenerate, we might be over allocing a little here */
+ /* Since some edges may be degenerate, we might be over allocating a little here. */
eheap = BLI_heap_new_ex(bm->totedge);
eheap_table = MEM_mallocN(sizeof(HeapNode *) * bm->totedge, __func__);
tot_edge_orig = bm->totedge;
diff --git a/source/blender/bmesh/tools/bmesh_decimate_dissolve.c b/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
index 94a578fe1d7..2254b46f860 100644
--- a/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
+++ b/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
@@ -188,7 +188,7 @@ static void mul_v2_m3v3_center(float r[2],
static bool bm_loop_collapse_is_degenerate(BMLoop *l_ear)
{
- /* calculate relative to the centeral vertex for higher precision */
+ /* Calculate relative to the central vertex for higher precision. */
const float *center = l_ear->v->co;
float tri_2d[3][2];
diff --git a/source/blender/bmesh/tools/bmesh_edgenet.c b/source/blender/bmesh/tools/bmesh_edgenet.c
index 1ab37ec0684..51af4d24e52 100644
--- a/source/blender/bmesh/tools/bmesh_edgenet.c
+++ b/source/blender/bmesh/tools/bmesh_edgenet.c
@@ -295,7 +295,7 @@ static LinkNode *bm_edgenet_path_calc(BMEdge *e,
vn_1->flag = vn_2->flag = (f_index == -1) ? VNINFO_FLAG_IS_MIXFACE : 0;
- /* prime the searchlist */
+ /* Prime the search-list. */
BLI_linklist_prepend_pool(&v_ls_prev, e->v1, path_pool);
BLI_linklist_prepend_pool(&v_ls_prev, e->v2, path_pool);
diff --git a/source/blender/bmesh/tools/bmesh_intersect.c b/source/blender/bmesh/tools/bmesh_intersect.c
index db05abe0e48..81b016e9601 100644
--- a/source/blender/bmesh/tools/bmesh_intersect.c
+++ b/source/blender/bmesh/tools/bmesh_intersect.c
@@ -1036,7 +1036,7 @@ bool BM_mesh_intersect(BMesh *bm,
#endif
if (boolean_mode != BMESH_ISECT_BOOLEAN_NONE) {
- /* keep original geometrty for raycast callbacks */
+ /* Keep original geometry for ray-cast callbacks. */
float **cos;
int i, j;
@@ -1546,7 +1546,7 @@ bool BM_mesh_intersect(BMesh *bm,
bool do_remove, do_flip;
{
- /* for now assyme this is an OK face to test with (not degenerate!) */
+ /* For now assume this is an OK face to test with (not degenerate!) */
BMFace *f = ftable[groups_array[fg]];
float co[3];
int hits;
diff --git a/source/blender/bmesh/tools/bmesh_intersect_edges.c b/source/blender/bmesh/tools/bmesh_intersect_edges.c
index 5e266fdac0e..1e9adea2615 100644
--- a/source/blender/bmesh/tools/bmesh_intersect_edges.c
+++ b/source/blender/bmesh/tools/bmesh_intersect_edges.c
@@ -39,7 +39,7 @@
#define KDOP_TREE_TYPE 4
#define KDOP_AXIS_LEN 14
-#define BLI_STACK_PAIR_LEN 2 * KDOP_TREE_TYPE
+#define BLI_STACK_PAIR_LEN (2 * KDOP_TREE_TYPE)
/* -------------------------------------------------------------------- */
/** \name Weld Linked Wire Edges into Linked Faces
diff --git a/source/blender/compositor/COM_compositor.h b/source/blender/compositor/COM_compositor.h
index 79c1ebcfe9f..ba66d7f0dfe 100644
--- a/source/blender/compositor/COM_compositor.h
+++ b/source/blender/compositor/COM_compositor.h
@@ -268,8 +268,8 @@ extern "C" {
* 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 worklist for OpenCLDevice's
- * otherwise the chunk will be added to the worklist of CPUDevices.
+ * 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 workpackage to its device.
*
@@ -298,7 +298,7 @@ extern "C" {
/**
* \brief The main method that is used to execute the compositor tree.
- * It can be executed during editing (blenkernel/node.c) or rendering
+ * It can be executed during editing (blenkernel/node.cc) or rendering
* (renderer/pipeline.c)
*
* \param rd: [struct RenderData]
@@ -339,9 +339,9 @@ extern "C" {
*/
/* clang-format off */
-void COM_execute(RenderData *rd,
+void COM_execute(RenderData *render_data,
Scene *scene,
- bNodeTree *editingtree,
+ bNodeTree *node_tree,
int rendering,
const ColorManagedViewSettings *viewSettings,
const ColorManagedDisplaySettings *displaySettings,
diff --git a/source/blender/compositor/intern/COM_ChunkOrder.cpp b/source/blender/compositor/intern/COM_ChunkOrder.cpp
index 7c9e5013c5d..3baa50da487 100644
--- a/source/blender/compositor/intern/COM_ChunkOrder.cpp
+++ b/source/blender/compositor/intern/COM_ChunkOrder.cpp
@@ -21,27 +21,26 @@
ChunkOrder::ChunkOrder()
{
- this->m_distance = 0.0;
- this->m_number = 0;
- this->m_x = 0;
- this->m_y = 0;
+ distance = 0.0;
+ number = 0;
+ x = 0;
+ y = 0;
}
-void ChunkOrder::determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots)
+void ChunkOrder::update_distance(ChunkOrderHotspot **hotspots, unsigned int len_hotspots)
{
- unsigned int index;
- double distance = FLT_MAX;
- for (index = 0; index < numberOfHotspots; index++) {
+ double new_distance = FLT_MAX;
+ for (int index = 0; index < len_hotspots; index++) {
ChunkOrderHotspot *hotspot = hotspots[index];
- double ndistance = hotspot->determineDistance(this->m_x, this->m_y);
- if (ndistance < distance) {
- distance = ndistance;
+ double distance_to_hotspot = hotspot->calc_distance(x, y);
+ if (distance_to_hotspot < new_distance) {
+ new_distance = distance_to_hotspot;
}
}
- this->m_distance = distance;
+ this->distance = new_distance;
}
bool operator<(const ChunkOrder &a, const ChunkOrder &b)
{
- return a.m_distance < b.m_distance;
+ return a.distance < b.distance;
}
diff --git a/source/blender/compositor/intern/COM_ChunkOrder.h b/source/blender/compositor/intern/COM_ChunkOrder.h
index 32d8c07de83..993622b346c 100644
--- a/source/blender/compositor/intern/COM_ChunkOrder.h
+++ b/source/blender/compositor/intern/COM_ChunkOrder.h
@@ -18,37 +18,24 @@
#pragma once
+#ifdef WITH_CXX_GUARDEDALLOC
+# include "MEM_guardedalloc.h"
+#endif
+
#include "COM_ChunkOrderHotspot.h"
-class ChunkOrder {
- private:
- unsigned int m_number;
- int m_x;
- int m_y;
- double m_distance;
+struct ChunkOrder {
+ unsigned int number;
+ int x;
+ int y;
+ double distance;
- public:
ChunkOrder();
- void determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots);
+
friend bool operator<(const ChunkOrder &a, const ChunkOrder &b);
- void setChunkNumber(unsigned int chunknumber)
- {
- this->m_number = chunknumber;
- }
- void setX(int x)
- {
- this->m_x = x;
- }
- void setY(int y)
- {
- this->m_y = y;
- }
- unsigned int getChunkNumber()
- {
- return this->m_number;
- }
- double getDistance()
- {
- return this->m_distance;
- }
+ void update_distance(ChunkOrderHotspot **hotspots, unsigned int len_hotspots);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+ MEM_CXX_CLASS_ALLOC_FUNCS("COM:ChunkOrderHotspot")
+#endif
};
diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp
index b111fba44b7..bbc98d086a6 100644
--- a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp
+++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp
@@ -21,16 +21,16 @@
ChunkOrderHotspot::ChunkOrderHotspot(int x, int y, float addition)
{
- this->m_x = x;
- this->m_y = y;
- this->m_addition = addition;
+ x = x;
+ y = y;
+ addition = addition;
}
-double ChunkOrderHotspot::determineDistance(int x, int y)
+double ChunkOrderHotspot::calc_distance(int x, int y)
{
- int dx = x - this->m_x;
- int dy = y - this->m_y;
+ int dx = x - x;
+ int dy = y - y;
double result = sqrt((double)(dx * dx + dy * dy));
- result += (double)this->m_addition;
+ result += (double)addition;
return result;
}
diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.h b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h
index afacf5fc672..af0cf897673 100644
--- a/source/blender/compositor/intern/COM_ChunkOrderHotspot.h
+++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h
@@ -22,15 +22,15 @@
# include "MEM_guardedalloc.h"
#endif
-class ChunkOrderHotspot {
- private:
- int m_x;
- int m_y;
- float m_addition;
+struct ChunkOrderHotspot {
+ int x;
+ int y;
+ float addition;
public:
ChunkOrderHotspot(int x, int y, float addition);
- double determineDistance(int x, int y);
+
+ double calc_distance(int x, int y);
#ifdef WITH_CXX_GUARDEDALLOC
MEM_CXX_CLASS_ALLOC_FUNCS("COM:ChunkOrderHotspot")
diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp
index b026d2e60d9..9c21c91c370 100644
--- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp
+++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp
@@ -251,15 +251,15 @@ void ExecutionGroup::execute(ExecutionSystem *graph)
sizeof(ChunkOrder) * this->m_numberOfChunks, __func__);
for (index = 0; index < this->m_numberOfChunks; index++) {
determineChunkRect(&rect, index);
- chunkOrders[index].setChunkNumber(index);
- chunkOrders[index].setX(rect.xmin - this->m_viewerBorder.xmin);
- chunkOrders[index].setY(rect.ymin - this->m_viewerBorder.ymin);
- chunkOrders[index].determineDistance(hotspots, 1);
+ chunkOrders[index].number = index;
+ chunkOrders[index].x = rect.xmin - this->m_viewerBorder.xmin;
+ chunkOrders[index].y = rect.ymin - this->m_viewerBorder.ymin;
+ chunkOrders[index].update_distance(hotspots, 1);
}
std::sort(&chunkOrders[0], &chunkOrders[this->m_numberOfChunks - 1]);
for (index = 0; index < this->m_numberOfChunks; index++) {
- chunkOrder[index] = chunkOrders[index].getChunkNumber();
+ chunkOrder[index] = chunkOrders[index].number;
}
delete hotspots[0];
@@ -290,16 +290,16 @@ void ExecutionGroup::execute(ExecutionSystem *graph)
sizeof(ChunkOrder) * this->m_numberOfChunks, __func__);
for (index = 0; index < this->m_numberOfChunks; index++) {
determineChunkRect(&rect, index);
- chunkOrders[index].setChunkNumber(index);
- chunkOrders[index].setX(rect.xmin - this->m_viewerBorder.xmin);
- chunkOrders[index].setY(rect.ymin - this->m_viewerBorder.ymin);
- chunkOrders[index].determineDistance(hotspots, 9);
+ chunkOrders[index].number = index;
+ chunkOrders[index].x = rect.xmin - this->m_viewerBorder.xmin;
+ chunkOrders[index].y = rect.ymin - this->m_viewerBorder.ymin;
+ chunkOrders[index].update_distance(hotspots, 9);
}
std::sort(&chunkOrders[0], &chunkOrders[this->m_numberOfChunks]);
for (index = 0; index < this->m_numberOfChunks; index++) {
- chunkOrder[index] = chunkOrders[index].getChunkNumber();
+ chunkOrder[index] = chunkOrders[index].number;
}
delete hotspots[0];
diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cpp b/source/blender/compositor/intern/COM_ExecutionSystem.cpp
index 34682aae2fd..4c0c7d2103e 100644
--- a/source/blender/compositor/intern/COM_ExecutionSystem.cpp
+++ b/source/blender/compositor/intern/COM_ExecutionSystem.cpp
@@ -59,7 +59,7 @@ ExecutionSystem::ExecutionSystem(RenderData *rd,
this->m_context.setQuality((CompositorQuality)editingtree->edit_quality);
}
this->m_context.setRendering(rendering);
- this->m_context.setHasActiveOpenCLDevices(WorkScheduler::hasGPUDevices() &&
+ this->m_context.setHasActiveOpenCLDevices(WorkScheduler::has_gpu_devices() &&
(editingtree->flag & NTREE_COM_OPENCL));
this->m_context.setRenderData(rd);
diff --git a/source/blender/compositor/intern/COM_MetaData.h b/source/blender/compositor/intern/COM_MetaData.h
index 22988b0b7ee..c1e34df2791 100644
--- a/source/blender/compositor/intern/COM_MetaData.h
+++ b/source/blender/compositor/intern/COM_MetaData.h
@@ -25,8 +25,8 @@
#include "MEM_guardedalloc.h"
/* Forward declarations. */
-struct StampData;
struct RenderResult;
+struct StampData;
/* Cryptomatte includes hash in its meta data keys. The hash is generated from the render
* layer/pass name. Compositing happens without the knowledge of the original layer and pass. The
diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp
index f726caa3d66..9ca704afdea 100644
--- a/source/blender/compositor/intern/COM_WorkScheduler.cpp
+++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp
@@ -44,38 +44,42 @@
# error COM_CURRENT_THREADING_MODEL No threading model selected
#endif
-/** \brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created */
-static vector<CPUDevice *> g_cpudevices;
static ThreadLocal(CPUDevice *) g_thread_device;
+static struct {
+ /** \brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created
+ */
+ vector<CPUDevice *> cpu_devices;
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
-/** \brief list of all thread for every CPUDevice in cpudevices a thread exists. */
-static ListBase g_cputhreads;
-static bool g_cpuInitialized = false;
-/** \brief all scheduled work for the cpu */
-static ThreadQueue *g_cpuqueue;
-static ThreadQueue *g_gpuqueue;
+ /** \brief list of all thread for every CPUDevice in cpudevices a thread exists. */
+ ListBase cpu_threads;
+ bool cpu_initialized = false;
+ /** \brief all scheduled work for the cpu */
+ ThreadQueue *cpu_queue;
+ ThreadQueue *gpu_queue;
# ifdef COM_OPENCL_ENABLED
-static cl_context g_context;
-static cl_program g_program;
-/** \brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is
- * created. */
-static vector<OpenCLDevice *> g_gpudevices;
-/** \brief list of all thread for every GPUDevice in cpudevices a thread exists. */
-static ListBase g_gputhreads;
-/** \brief all scheduled work for the GPU. */
-static bool g_openclActive = false;
-static bool g_openclInitialized = false;
+ cl_context opencl_context;
+ cl_program opencl_program;
+ /** \brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is
+ * created. */
+ vector<OpenCLDevice *> gpu_devices;
+ /** \brief list of all thread for every GPUDevice in cpudevices a thread exists. */
+ ListBase gpu_threads;
+ /** \brief all scheduled work for the GPU. */
+ bool opencl_active = false;
+ bool opencl_initialized = false;
# endif
#endif
+} g_work_scheduler;
+
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
void *WorkScheduler::thread_execute_cpu(void *data)
{
CPUDevice *device = (CPUDevice *)data;
WorkPackage *work;
BLI_thread_local_set(g_thread_device, device);
- while ((work = (WorkPackage *)BLI_thread_queue_pop(g_cpuqueue))) {
+ while ((work = (WorkPackage *)BLI_thread_queue_pop(g_work_scheduler.cpu_queue))) {
device->execute(work);
delete work;
}
@@ -88,7 +92,7 @@ void *WorkScheduler::thread_execute_gpu(void *data)
Device *device = (Device *)data;
WorkPackage *work;
- while ((work = (WorkPackage *)BLI_thread_queue_pop(g_gpuqueue))) {
+ while ((work = (WorkPackage *)BLI_thread_queue_pop(g_work_scheduler.gpu_queue))) {
device->execute(work);
delete work;
}
@@ -106,14 +110,14 @@ void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber)
delete package;
#elif COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
# ifdef COM_OPENCL_ENABLED
- if (group->isOpenCL() && g_openclActive) {
- BLI_thread_queue_push(g_gpuqueue, package);
+ if (group->isOpenCL() && g_work_scheduler.opencl_active) {
+ BLI_thread_queue_push(g_work_scheduler.gpu_queue, package);
}
else {
- BLI_thread_queue_push(g_cpuqueue, package);
+ BLI_thread_queue_push(g_work_scheduler.cpu_queue, package);
}
# else
- BLI_thread_queue_push(g_cpuqueue, package);
+ BLI_thread_queue_push(g_work_scheduler.cpu_queue, package);
# endif
#endif
}
@@ -122,24 +126,26 @@ void WorkScheduler::start(CompositorContext &context)
{
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
unsigned int index;
- g_cpuqueue = BLI_thread_queue_init();
- BLI_threadpool_init(&g_cputhreads, thread_execute_cpu, g_cpudevices.size());
- for (index = 0; index < g_cpudevices.size(); index++) {
- Device *device = g_cpudevices[index];
- BLI_threadpool_insert(&g_cputhreads, device);
+ g_work_scheduler.cpu_queue = BLI_thread_queue_init();
+ BLI_threadpool_init(
+ &g_work_scheduler.cpu_threads, thread_execute_cpu, g_work_scheduler.cpu_devices.size());
+ for (index = 0; index < g_work_scheduler.cpu_devices.size(); index++) {
+ Device *device = g_work_scheduler.cpu_devices[index];
+ BLI_threadpool_insert(&g_work_scheduler.cpu_threads, device);
}
# ifdef COM_OPENCL_ENABLED
if (context.getHasActiveOpenCLDevices()) {
- g_gpuqueue = BLI_thread_queue_init();
- BLI_threadpool_init(&g_gputhreads, thread_execute_gpu, g_gpudevices.size());
- for (index = 0; index < g_gpudevices.size(); index++) {
- Device *device = g_gpudevices[index];
- BLI_threadpool_insert(&g_gputhreads, device);
+ g_work_scheduler.gpu_queue = BLI_thread_queue_init();
+ BLI_threadpool_init(
+ &g_work_scheduler.gpu_threads, thread_execute_gpu, g_work_scheduler.gpu_devices.size());
+ for (index = 0; index < g_work_scheduler.gpu_devices.size(); index++) {
+ Device *device = g_work_scheduler.gpu_devices[index];
+ BLI_threadpool_insert(&g_work_scheduler.gpu_threads, device);
}
- g_openclActive = true;
+ g_work_scheduler.opencl_active = true;
}
else {
- g_openclActive = false;
+ g_work_scheduler.opencl_active = false;
}
# endif
#endif
@@ -148,12 +154,12 @@ void WorkScheduler::finish()
{
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
# ifdef COM_OPENCL_ENABLED
- if (g_openclActive) {
- BLI_thread_queue_wait_finish(g_gpuqueue);
- BLI_thread_queue_wait_finish(g_cpuqueue);
+ if (g_work_scheduler.opencl_active) {
+ BLI_thread_queue_wait_finish(g_work_scheduler.gpu_queue);
+ BLI_thread_queue_wait_finish(g_work_scheduler.cpu_queue);
}
else {
- BLI_thread_queue_wait_finish(g_cpuqueue);
+ BLI_thread_queue_wait_finish(g_work_scheduler.cpu_queue);
}
# else
BLI_thread_queue_wait_finish(cpuqueue);
@@ -163,26 +169,26 @@ void WorkScheduler::finish()
void WorkScheduler::stop()
{
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
- BLI_thread_queue_nowait(g_cpuqueue);
- BLI_threadpool_end(&g_cputhreads);
- BLI_thread_queue_free(g_cpuqueue);
- g_cpuqueue = nullptr;
+ BLI_thread_queue_nowait(g_work_scheduler.cpu_queue);
+ BLI_threadpool_end(&g_work_scheduler.cpu_threads);
+ BLI_thread_queue_free(g_work_scheduler.cpu_queue);
+ g_work_scheduler.cpu_queue = nullptr;
# ifdef COM_OPENCL_ENABLED
- if (g_openclActive) {
- BLI_thread_queue_nowait(g_gpuqueue);
- BLI_threadpool_end(&g_gputhreads);
- BLI_thread_queue_free(g_gpuqueue);
- g_gpuqueue = nullptr;
+ if (g_work_scheduler.opencl_active) {
+ BLI_thread_queue_nowait(g_work_scheduler.gpu_queue);
+ BLI_threadpool_end(&g_work_scheduler.gpu_threads);
+ BLI_thread_queue_free(g_work_scheduler.gpu_queue);
+ g_work_scheduler.gpu_queue = nullptr;
}
# endif
#endif
}
-bool WorkScheduler::hasGPUDevices()
+bool WorkScheduler::has_gpu_devices()
{
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
# ifdef COM_OPENCL_ENABLED
- return !g_gpudevices.empty();
+ return !g_work_scheduler.gpu_devices.empty();
# else
return 0;
# endif
@@ -205,37 +211,37 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads)
{
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
/* deinitialize if number of threads doesn't match */
- if (g_cpudevices.size() != num_cpu_threads) {
+ if (g_work_scheduler.cpu_devices.size() != num_cpu_threads) {
Device *device;
- while (!g_cpudevices.empty()) {
- device = g_cpudevices.back();
- g_cpudevices.pop_back();
+ while (!g_work_scheduler.cpu_devices.empty()) {
+ device = g_work_scheduler.cpu_devices.back();
+ g_work_scheduler.cpu_devices.pop_back();
device->deinitialize();
delete device;
}
- if (g_cpuInitialized) {
+ if (g_work_scheduler.cpu_initialized) {
BLI_thread_local_delete(g_thread_device);
}
- g_cpuInitialized = false;
+ g_work_scheduler.cpu_initialized = false;
}
/* initialize CPU threads */
- if (!g_cpuInitialized) {
+ if (!g_work_scheduler.cpu_initialized) {
for (int index = 0; index < num_cpu_threads; index++) {
CPUDevice *device = new CPUDevice(index);
device->initialize();
- g_cpudevices.push_back(device);
+ g_work_scheduler.cpu_devices.push_back(device);
}
BLI_thread_local_create(g_thread_device);
- g_cpuInitialized = true;
+ g_work_scheduler.cpu_initialized = true;
}
# ifdef COM_OPENCL_ENABLED
/* deinitialize OpenCL GPU's */
- if (use_opencl && !g_openclInitialized) {
- g_context = nullptr;
- g_program = nullptr;
+ if (use_opencl && !g_work_scheduler.opencl_initialized) {
+ g_work_scheduler.opencl_context = nullptr;
+ g_work_scheduler.opencl_program = nullptr;
/* This will check for errors and skip if already initialized. */
if (clewInit() != CLEW_SUCCESS) {
@@ -270,26 +276,40 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads)
sizeof(cl_device_id) * numberOfDevices, __func__);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numberOfDevices, cldevices, nullptr);
- g_context = clCreateContext(
+ g_work_scheduler.opencl_context = clCreateContext(
nullptr, numberOfDevices, cldevices, clContextError, nullptr, &error);
if (error != CL_SUCCESS) {
printf("CLERROR[%d]: %s\n", error, clewErrorString(error));
}
const char *cl_str[2] = {datatoc_COM_OpenCLKernels_cl, nullptr};
- g_program = clCreateProgramWithSource(g_context, 1, cl_str, nullptr, &error);
- error = clBuildProgram(g_program, numberOfDevices, cldevices, nullptr, nullptr, nullptr);
+ g_work_scheduler.opencl_program = clCreateProgramWithSource(
+ g_work_scheduler.opencl_context, 1, cl_str, nullptr, &error);
+ error = clBuildProgram(g_work_scheduler.opencl_program,
+ numberOfDevices,
+ cldevices,
+ nullptr,
+ nullptr,
+ nullptr);
if (error != CL_SUCCESS) {
cl_int error2;
size_t ret_val_size = 0;
printf("CLERROR[%d]: %s\n", error, clewErrorString(error));
- error2 = clGetProgramBuildInfo(
- g_program, cldevices[0], CL_PROGRAM_BUILD_LOG, 0, nullptr, &ret_val_size);
+ error2 = clGetProgramBuildInfo(g_work_scheduler.opencl_program,
+ cldevices[0],
+ CL_PROGRAM_BUILD_LOG,
+ 0,
+ nullptr,
+ &ret_val_size);
if (error2 != CL_SUCCESS) {
printf("CLERROR[%d]: %s\n", error, clewErrorString(error));
}
char *build_log = (char *)MEM_mallocN(sizeof(char) * ret_val_size + 1, __func__);
- error2 = clGetProgramBuildInfo(
- g_program, cldevices[0], CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, nullptr);
+ error2 = clGetProgramBuildInfo(g_work_scheduler.opencl_program,
+ cldevices[0],
+ CL_PROGRAM_BUILD_LOG,
+ ret_val_size,
+ build_log,
+ nullptr);
if (error2 != CL_SUCCESS) {
printf("CLERROR[%d]: %s\n", error, clewErrorString(error));
}
@@ -307,9 +327,12 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads)
if (error2 != CL_SUCCESS) {
printf("CLERROR[%d]: %s\n", error2, clewErrorString(error2));
}
- OpenCLDevice *clDevice = new OpenCLDevice(g_context, device, g_program, vendorID);
+ OpenCLDevice *clDevice = new OpenCLDevice(g_work_scheduler.opencl_context,
+ device,
+ g_work_scheduler.opencl_program,
+ vendorID);
clDevice->initialize();
- g_gpudevices.push_back(clDevice);
+ g_work_scheduler.gpu_devices.push_back(clDevice);
}
}
MEM_freeN(cldevices);
@@ -317,7 +340,7 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads)
MEM_freeN(platforms);
}
- g_openclInitialized = true;
+ g_work_scheduler.opencl_initialized = true;
}
# endif
#endif
@@ -327,38 +350,38 @@ void WorkScheduler::deinitialize()
{
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
/* deinitialize CPU threads */
- if (g_cpuInitialized) {
+ if (g_work_scheduler.cpu_initialized) {
Device *device;
- while (!g_cpudevices.empty()) {
- device = g_cpudevices.back();
- g_cpudevices.pop_back();
+ while (!g_work_scheduler.cpu_devices.empty()) {
+ device = g_work_scheduler.cpu_devices.back();
+ g_work_scheduler.cpu_devices.pop_back();
device->deinitialize();
delete device;
}
BLI_thread_local_delete(g_thread_device);
- g_cpuInitialized = false;
+ g_work_scheduler.cpu_initialized = false;
}
# ifdef COM_OPENCL_ENABLED
/* deinitialize OpenCL GPU's */
- if (g_openclInitialized) {
+ if (g_work_scheduler.opencl_initialized) {
Device *device;
- while (!g_gpudevices.empty()) {
- device = g_gpudevices.back();
- g_gpudevices.pop_back();
+ while (!g_work_scheduler.gpu_devices.empty()) {
+ device = g_work_scheduler.gpu_devices.back();
+ g_work_scheduler.gpu_devices.pop_back();
device->deinitialize();
delete device;
}
- if (g_program) {
- clReleaseProgram(g_program);
- g_program = nullptr;
+ if (g_work_scheduler.opencl_program) {
+ clReleaseProgram(g_work_scheduler.opencl_program);
+ g_work_scheduler.opencl_program = nullptr;
}
- if (g_context) {
- clReleaseContext(g_context);
- g_context = nullptr;
+ if (g_work_scheduler.opencl_context) {
+ clReleaseContext(g_work_scheduler.opencl_context);
+ g_work_scheduler.opencl_context = nullptr;
}
- g_openclInitialized = false;
+ g_work_scheduler.opencl_initialized = false;
}
# endif
#endif
diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h
index 2424d1bdb72..ebddaa01ce1 100644
--- a/source/blender/compositor/intern/COM_WorkScheduler.h
+++ b/source/blender/compositor/intern/COM_WorkScheduler.h
@@ -29,15 +29,10 @@
/** \brief the workscheduler
* \ingroup execution
*/
-class WorkScheduler {
+struct WorkScheduler {
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
/**
- * \brief are we being stopped.
- */
- static bool isStopping();
-
- /**
* \brief main thread loop for cpudevices
* inside this loop new work is queried and being executed
*/
@@ -107,7 +102,7 @@ class WorkScheduler {
* A node can generate a different operation tree when OpenCLDevices exists.
* \see CompositorContext.getHasActiveOpenCLDevices
*/
- static bool hasGPUDevices();
+ static bool has_gpu_devices();
static int current_thread_id();
diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp
index bccdd026ead..68e4f80f91f 100644
--- a/source/blender/compositor/intern/COM_compositor.cpp
+++ b/source/blender/compositor/intern/COM_compositor.cpp
@@ -29,92 +29,98 @@
#include "COM_compositor.h"
#include "clew.h"
-static ThreadMutex s_compositorMutex;
-static bool is_compositorMutex_init = false;
+static struct {
+ bool is_initialized = false;
+ ThreadMutex mutex;
+} g_compositor;
+
+/* Make sure node tree has previews.
+ * Don't create previews in advance, this is done when adding preview operations.
+ * Reserved preview size is determined by render output for now. */
+static void compositor_init_node_previews(const RenderData *render_data, bNodeTree *node_tree)
+{
+ /* We fit the aspect into COM_PREVIEW_SIZE x COM_PREVIEW_SIZE image to avoid
+ * insane preview resolution, which might even overflow preview dimensions. */
+ const float aspect = render_data->xsch > 0 ?
+ (float)render_data->ysch / (float)render_data->xsch :
+ 1.0f;
+ int preview_width, preview_height;
+ if (aspect < 1.0f) {
+ preview_width = COM_PREVIEW_SIZE;
+ preview_height = (int)(COM_PREVIEW_SIZE * aspect);
+ }
+ else {
+ preview_width = (int)(COM_PREVIEW_SIZE / aspect);
+ preview_height = COM_PREVIEW_SIZE;
+ }
+ BKE_node_preview_init_tree(node_tree, preview_width, preview_height, false);
+}
-void COM_execute(RenderData *rd,
+static void compositor_reset_node_tree_status(bNodeTree *node_tree)
+{
+ node_tree->progress(node_tree->prh, 0.0);
+ node_tree->stats_draw(node_tree->sdh, IFACE_("Compositing"));
+}
+
+void COM_execute(RenderData *render_data,
Scene *scene,
- bNodeTree *editingtree,
+ bNodeTree *node_tree,
int rendering,
const ColorManagedViewSettings *viewSettings,
const ColorManagedDisplaySettings *displaySettings,
const char *viewName)
{
- /* initialize mutex, TODO this mutex init is actually not thread safe and
+ /* Initialize mutex, TODO this mutex init is actually not thread safe and
* should be done somewhere as part of blender startup, all the other
- * initializations can be done lazily */
- if (is_compositorMutex_init == false) {
- BLI_mutex_init(&s_compositorMutex);
- is_compositorMutex_init = true;
+ * initializations can be done lazily. */
+ if (!g_compositor.is_initialized) {
+ BLI_mutex_init(&g_compositor.mutex);
+ g_compositor.is_initialized = true;
}
- BLI_mutex_lock(&s_compositorMutex);
+ BLI_mutex_lock(&g_compositor.mutex);
- if (editingtree->test_break(editingtree->tbh)) {
- // during editing multiple calls to this method can be triggered.
- // make sure one the last one will be doing the work.
- BLI_mutex_unlock(&s_compositorMutex);
+ if (node_tree->test_break(node_tree->tbh)) {
+ /* During editing multiple compositor executions can be triggered.
+ * Make sure this is the most recent one. */
+ BLI_mutex_unlock(&g_compositor.mutex);
return;
}
- /* Make sure node tree has previews.
- * Don't create previews in advance, this is done when adding preview operations.
- * Reserved preview size is determined by render output for now.
- *
- * We fit the aspect into COM_PREVIEW_SIZE x COM_PREVIEW_SIZE image to avoid
- * insane preview resolution, which might even overflow preview dimensions.
- */
- const float aspect = rd->xsch > 0 ? (float)rd->ysch / (float)rd->xsch : 1.0f;
- int preview_width, preview_height;
- if (aspect < 1.0f) {
- preview_width = COM_PREVIEW_SIZE;
- preview_height = (int)(COM_PREVIEW_SIZE * aspect);
- }
- else {
- preview_width = (int)(COM_PREVIEW_SIZE / aspect);
- preview_height = COM_PREVIEW_SIZE;
- }
- BKE_node_preview_init_tree(editingtree, preview_width, preview_height, false);
-
- /* initialize workscheduler, will check if already done. TODO deinitialize somewhere */
- bool use_opencl = (editingtree->flag & NTREE_COM_OPENCL) != 0;
- WorkScheduler::initialize(use_opencl, BKE_render_num_threads(rd));
+ compositor_init_node_previews(render_data, node_tree);
+ compositor_reset_node_tree_status(node_tree);
- /* set progress bar to 0% and status to init compositing */
- editingtree->progress(editingtree->prh, 0.0);
- editingtree->stats_draw(editingtree->sdh, IFACE_("Compositing"));
+ /* Initialize workscheduler. */
+ const bool use_opencl = (node_tree->flag & NTREE_COM_OPENCL) != 0;
+ WorkScheduler::initialize(use_opencl, BKE_render_num_threads(render_data));
- bool twopass = (editingtree->flag & NTREE_TWO_PASS) && !rendering;
- /* initialize execution system */
+ /* Execute. */
+ const bool twopass = (node_tree->flag & NTREE_TWO_PASS) && !rendering;
if (twopass) {
- ExecutionSystem *system = new ExecutionSystem(
- rd, scene, editingtree, rendering, twopass, viewSettings, displaySettings, viewName);
- system->execute();
- delete system;
-
- if (editingtree->test_break(editingtree->tbh)) {
- // during editing multiple calls to this method can be triggered.
- // make sure one the last one will be doing the work.
- BLI_mutex_unlock(&s_compositorMutex);
+ ExecutionSystem fast_pass(
+ render_data, scene, node_tree, rendering, true, viewSettings, displaySettings, viewName);
+ fast_pass.execute();
+
+ if (node_tree->test_break(node_tree->tbh)) {
+ BLI_mutex_unlock(&g_compositor.mutex);
return;
}
}
- ExecutionSystem *system = new ExecutionSystem(
- rd, scene, editingtree, rendering, false, viewSettings, displaySettings, viewName);
- system->execute();
- delete system;
+ ExecutionSystem system(
+ render_data, scene, node_tree, rendering, false, viewSettings, displaySettings, viewName);
+ system.execute();
- BLI_mutex_unlock(&s_compositorMutex);
+ BLI_mutex_unlock(&g_compositor.mutex);
}
void COM_deinitialize()
{
- if (is_compositorMutex_init) {
- BLI_mutex_lock(&s_compositorMutex);
+ if (g_compositor.is_initialized) {
+ BLI_mutex_lock(&g_compositor.mutex);
WorkScheduler::deinitialize();
- is_compositorMutex_init = false;
- BLI_mutex_unlock(&s_compositorMutex);
- BLI_mutex_end(&s_compositorMutex);
+ g_compositor.is_initialized = false;
+ BLI_mutex_unlock(&g_compositor.mutex);
+ BLI_mutex_end(&g_compositor.mutex);
}
}
diff --git a/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp b/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp
index 3c2bf0aad07..92b334fddb9 100644
--- a/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp
+++ b/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp
@@ -32,9 +32,9 @@ void ColorCorrectionNode::convertToOperations(NodeConverter &converter,
ColorCorrectionOperation *operation = new ColorCorrectionOperation();
operation->setData((NodeColorCorrection *)editorNode->storage);
- operation->setRedChannelEnabled((editorNode->custom1 & 1) > 0);
- operation->setGreenChannelEnabled((editorNode->custom1 & 2) > 0);
- operation->setBlueChannelEnabled((editorNode->custom1 & 4) > 0);
+ operation->setRedChannelEnabled((editorNode->custom1 & 1) != 0);
+ operation->setGreenChannelEnabled((editorNode->custom1 & 2) != 0);
+ operation->setBlueChannelEnabled((editorNode->custom1 & 4) != 0);
converter.addOperation(operation);
converter.mapInputSocket(getInputSocket(0), operation->getInputSocket(0));
diff --git a/source/blender/compositor/nodes/COM_KeyingNode.cpp b/source/blender/compositor/nodes/COM_KeyingNode.cpp
index 4e81a412c29..9b493d3f332 100644
--- a/source/blender/compositor/nodes/COM_KeyingNode.cpp
+++ b/source/blender/compositor/nodes/COM_KeyingNode.cpp
@@ -239,10 +239,10 @@ void KeyingNode::convertToOperations(NodeConverter &converter,
converter.mapInputSocket(inputScreen, keyingOperation->getInputSocket(1));
if (keying_data->blur_pre) {
- /* chroma preblur operation for input of keying operation */
- NodeOperationOutput *preBluredImage = setupPreBlur(
+ /* Chroma pre-blur operation for input of keying operation. */
+ NodeOperationOutput *preBlurredImage = setupPreBlur(
converter, inputImage, keying_data->blur_pre);
- converter.addLink(preBluredImage, keyingOperation->getInputSocket(0));
+ converter.addLink(preBlurredImage, keyingOperation->getInputSocket(0));
}
else {
converter.mapInputSocket(inputImage, keyingOperation->getInputSocket(0));
diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp
index 3fe154c397e..612a71037f7 100644
--- a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp
+++ b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp
@@ -88,7 +88,7 @@ float *BlurBaseOperation::make_gausstab(float rad, int size)
return gausstab;
}
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 *BlurBaseOperation::convert_gausstab_sse(const float *gausstab, int size)
{
int n = 2 * size + 1;
diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.h b/source/blender/compositor/operations/COM_BlurBaseOperation.h
index c452b2e4ea1..56dacc96710 100644
--- a/source/blender/compositor/operations/COM_BlurBaseOperation.h
+++ b/source/blender/compositor/operations/COM_BlurBaseOperation.h
@@ -23,16 +23,14 @@
#define MAX_GAUSSTAB_RADIUS 30000
-#ifdef __SSE2__
-# include <emmintrin.h>
-#endif
+#include "BLI_simd.h"
class BlurBaseOperation : public NodeOperation, public QualityStepHelper {
private:
protected:
BlurBaseOperation(DataType data_type);
float *make_gausstab(float rad, int size);
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 *convert_gausstab_sse(const float *gausstab, int size);
#endif
float *make_dist_fac_inverse(float rad, int size, int falloff);
diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.h b/source/blender/compositor/operations/COM_BokehImageOperation.h
index 01ffa026152..2d775bdf738 100644
--- a/source/blender/compositor/operations/COM_BokehImageOperation.h
+++ b/source/blender/compositor/operations/COM_BokehImageOperation.h
@@ -55,7 +55,7 @@ class BokehImageOperation : public NodeOperation {
NodeBokehImage *m_data;
/**
- * \brief precalced center of the image
+ * \brief precalculate center of the image
*/
float m_center[2];
@@ -87,7 +87,7 @@ class BokehImageOperation : public NodeOperation {
/**
* \brief determine the coordinate of a flap corner.
*
- * \param r: result in bokehimage space are stored [x,y]
+ * \param r: result in bokeh-image space are stored [x,y]
* \param flapNumber: the flap number to calculate
* \param distance: the lens distance is used to simulate lens shifts
*/
diff --git a/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp b/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp
index 29e18047578..52de0198a00 100644
--- a/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp
+++ b/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp
@@ -61,11 +61,10 @@ void ChromaMatteOperation::executePixelSampled(float output[4],
this->m_inputImageProgram->readSampled(inImage, x, y, sampler);
/* Store matte(alpha) value in [0] to go with
- * COM_SetAlphaMultiplyOperation and the Value output.
- */
+ * #COM_SetAlphaMultiplyOperation and the Value output. */
- /* Algorithm from book "Video Demistified," does not include the spill reduction part */
- /* find theta, the angle that the color space should be rotated based on key */
+ /* 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 */
// inImage[0] = (inImage[0] * 2.0f) - 1.0f; // UNUSED
diff --git a/source/blender/compositor/operations/COM_CryptomatteOperation.cpp b/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
index 07466cdeccd..ccd291697cf 100644
--- a/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
+++ b/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
@@ -49,7 +49,7 @@ void CryptomatteOperation::executePixel(float output[4], int x, int y, void *dat
for (size_t i = 0; i < inputs.size(); i++) {
inputs[i]->read(input, x, y, data);
if (i == 0) {
- /* Write the frontmost object as false color for picking. */
+ /* Write the front-most object as false color for picking. */
output[0] = input[0];
uint32_t m3hash;
::memcpy(&m3hash, &input[0], sizeof(uint32_t));
diff --git a/source/blender/compositor/operations/COM_DenoiseOperation.cpp b/source/blender/compositor/operations/COM_DenoiseOperation.cpp
index bc33e5f75c4..d08f238c4c1 100644
--- a/source/blender/compositor/operations/COM_DenoiseOperation.cpp
+++ b/source/blender/compositor/operations/COM_DenoiseOperation.cpp
@@ -94,7 +94,11 @@ void DenoiseOperation::generateDenoise(float *data,
return;
}
#ifdef WITH_OPENIMAGEDENOISE
- if (BLI_cpu_support_sse41()) {
+ /* Always supported through Accelerate framework BNNS on macOS. */
+# ifndef __APPLE__
+ if (BLI_cpu_support_sse41())
+# endif
+ {
oidn::DeviceRef device = oidn::newDevice();
device.commit();
diff --git a/source/blender/compositor/operations/COM_DotproductOperation.cpp b/source/blender/compositor/operations/COM_DotproductOperation.cpp
index 750e4308d11..5914be21453 100644
--- a/source/blender/compositor/operations/COM_DotproductOperation.cpp
+++ b/source/blender/compositor/operations/COM_DotproductOperation.cpp
@@ -39,7 +39,7 @@ void DotproductOperation::deinitExecution()
this->m_input2Operation = nullptr;
}
-/** \todo: current implementation is the inverse of a dotproduct. not 'logically' correct
+/** \todo current implementation is the inverse of a dot-product. not 'logically' correct
*/
void DotproductOperation::executePixelSampled(float output[4],
float x,
diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp
index fbbd373ba09..b548a684ba5 100644
--- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp
+++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp
@@ -1256,7 +1256,7 @@ void DoubleEdgeMaskOperation::doDoubleEdgeMask(float *imask, float *omask, float
*
* Each version has slightly different criteria for detecting an edge pixel.
*/
- if (this->m_adjecentOnly) { // if "adjacent only" inner edge mode is turned on
+ if (this->m_adjacentOnly) { // if "adjacent only" inner edge mode is turned on
if (this->m_keepInside) { // if "keep inside" buffer edge mode is turned on
do_adjacentKeepBorders(t, rw, limask, lomask, lres, res, rsize);
}
@@ -1313,7 +1313,7 @@ DoubleEdgeMaskOperation::DoubleEdgeMaskOperation()
this->addOutputSocket(COM_DT_VALUE);
this->m_inputInnerMask = nullptr;
this->m_inputOuterMask = nullptr;
- this->m_adjecentOnly = false;
+ this->m_adjacentOnly = false;
this->m_keepInside = false;
this->setComplex(true);
}
diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h
index e53aa7eb8aa..813f5009815 100644
--- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h
+++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h
@@ -27,7 +27,7 @@ class DoubleEdgeMaskOperation : public NodeOperation {
*/
SocketReader *m_inputOuterMask;
SocketReader *m_inputInnerMask;
- bool m_adjecentOnly;
+ bool m_adjacentOnly;
bool m_keepInside;
float *m_cachedInstance;
@@ -56,9 +56,9 @@ class DoubleEdgeMaskOperation : public NodeOperation {
ReadBufferOperation *readOperation,
rcti *output);
- void setAdjecentOnly(bool adjecentOnly)
+ void setAdjecentOnly(bool adjacentOnly)
{
- this->m_adjecentOnly = adjecentOnly;
+ this->m_adjacentOnly = adjacentOnly;
}
void setKeepInside(bool keepInside)
{
diff --git a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp
index c47d3b52beb..4d3efec7c85 100644
--- a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp
@@ -42,7 +42,8 @@ void *GaussianAlphaXBlurOperation::initializeTileData(rcti * /*rect*/)
void GaussianAlphaXBlurOperation::initExecution()
{
- /* BlurBaseOperation::initExecution(); */ /* until we suppoer size input - comment this */
+ /* Until we support size input - comment this. */
+ // BlurBaseOperation::initExecution();
initMutex();
diff --git a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp
index 7a0dff73941..a722a879b8d 100644
--- a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp
@@ -42,7 +42,8 @@ void *GaussianAlphaYBlurOperation::initializeTileData(rcti * /*rect*/)
void GaussianAlphaYBlurOperation::initExecution()
{
- /* BlurBaseOperation::initExecution(); */ /* until we suppoer size input - comment this */
+ /* Until we support size input - comment this. */
+ // BlurBaseOperation::initExecution();
initMutex();
diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp
index e08d30e5ddf..90333f7dd79 100644
--- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp
@@ -26,7 +26,7 @@
GaussianXBlurOperation::GaussianXBlurOperation() : BlurBaseOperation(COM_DT_COLOR)
{
this->m_gausstab = nullptr;
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
this->m_gausstab_sse = nullptr;
#endif
this->m_filtersize = 0;
@@ -55,7 +55,7 @@ void GaussianXBlurOperation::initExecution()
/* TODO(sergey): De-duplicate with the case below and Y blur. */
this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize);
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize);
#endif
}
@@ -70,7 +70,7 @@ void GaussianXBlurOperation::updateGauss()
m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS);
this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize);
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize);
#endif
}
@@ -95,7 +95,7 @@ void GaussianXBlurOperation::executePixel(float output[4], int x, int y, void *d
int offsetadd = getOffsetAdd();
int bufferindex = ((xmin - bufferstartx) * 4) + ((ymin - bufferstarty) * 4 * bufferwidth);
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 accum_r = _mm_load_ps(color_accum);
for (int nx = xmin, index = (xmin - x) + this->m_filtersize; nx < xmax;
nx += step, index += step) {
@@ -162,7 +162,7 @@ void GaussianXBlurOperation::deinitExecution()
MEM_freeN(this->m_gausstab);
this->m_gausstab = nullptr;
}
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
if (this->m_gausstab_sse) {
MEM_freeN(this->m_gausstab_sse);
this->m_gausstab_sse = nullptr;
diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h
index 9348c05f906..b2bcd79e716 100644
--- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h
+++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h
@@ -24,7 +24,7 @@
class GaussianXBlurOperation : public BlurBaseOperation {
private:
float *m_gausstab;
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 *m_gausstab_sse;
#endif
int m_filtersize;
diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp
index 7710b065ccd..c5b3cf24239 100644
--- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp
@@ -26,7 +26,7 @@
GaussianYBlurOperation::GaussianYBlurOperation() : BlurBaseOperation(COM_DT_COLOR)
{
this->m_gausstab = nullptr;
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
this->m_gausstab_sse = nullptr;
#endif
this->m_filtersize = 0;
@@ -54,7 +54,7 @@ void GaussianYBlurOperation::initExecution()
m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS);
this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize);
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize);
#endif
}
@@ -69,7 +69,7 @@ void GaussianYBlurOperation::updateGauss()
m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS);
this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize);
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize);
#endif
}
@@ -94,7 +94,7 @@ void GaussianYBlurOperation::executePixel(float output[4], int x, int y, void *d
int step = getStep();
const int bufferIndexx = ((xmin - bufferstartx) * 4);
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 accum_r = _mm_load_ps(color_accum);
for (int ny = ymin; ny < ymax; ny += step) {
index = (ny - y) + this->m_filtersize;
@@ -162,7 +162,7 @@ void GaussianYBlurOperation::deinitExecution()
MEM_freeN(this->m_gausstab);
this->m_gausstab = nullptr;
}
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
if (this->m_gausstab_sse) {
MEM_freeN(this->m_gausstab_sse);
this->m_gausstab_sse = nullptr;
diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h
index 7ab4ecb5506..d921780876a 100644
--- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h
+++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h
@@ -24,7 +24,7 @@
class GaussianYBlurOperation : public BlurBaseOperation {
private:
float *m_gausstab;
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 *m_gausstab_sse;
#endif
int m_filtersize;
diff --git a/source/blender/compositor/operations/COM_MixOperation.cpp b/source/blender/compositor/operations/COM_MixOperation.cpp
index 948e69bf8eb..76a66727a75 100644
--- a/source/blender/compositor/operations/COM_MixOperation.cpp
+++ b/source/blender/compositor/operations/COM_MixOperation.cpp
@@ -705,7 +705,7 @@ void MixMultiplyOperation::executePixelSampled(float output[4],
clampIfNeeded(output);
}
-/* ******** Mix Ovelray Operation ******** */
+/* ******** Mix Overlay Operation ******** */
MixOverlayOperation::MixOverlayOperation()
{
diff --git a/source/blender/compositor/operations/COM_TonemapOperation.h b/source/blender/compositor/operations/COM_TonemapOperation.h
index 3870593b423..cb8816b93b3 100644
--- a/source/blender/compositor/operations/COM_TonemapOperation.h
+++ b/source/blender/compositor/operations/COM_TonemapOperation.h
@@ -22,7 +22,7 @@
#include "DNA_node_types.h"
/**
- * \brief temporarily storage during execution of Tonemap
+ * \brief temporarily storage during execution of Tone-map
* \ingroup operation
*/
typedef struct AvgLogLum {
diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp
index f7b908deaf4..d6894dfc8ad 100644
--- a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp
@@ -589,7 +589,7 @@ void zbuf_accumulate_vecblur(NodeBlurData *nbd,
printf("Found uninitialized speed in vector buffer... fixed.\n");
}
- /* min speed? then copy speedbuffer to recalculate speed vectors */
+ /* Min speed? then copy speed-buffer to recalculate speed vectors. */
if (nbd->minspeed) {
float minspeed = (float)nbd->minspeed;
float minspeedsq = minspeed * minspeed;
@@ -619,7 +619,7 @@ void zbuf_accumulate_vecblur(NodeBlurData *nbd,
SWAP(float *, minvecbufrect, vecbufrect);
}
- /* make vertex buffer with averaged speed and zvalues */
+ /* Make vertex buffer with averaged speed and Z-values. */
rectvz = (float *)MEM_callocN(sizeof(float[4]) * (xsize + 1) * (ysize + 1), "vertices");
dvz = rectvz;
for (y = 0; y <= ysize; y++) {
@@ -728,7 +728,8 @@ void zbuf_accumulate_vecblur(NodeBlurData *nbd,
antialias_tagbuf(xsize, ysize, rectmove);
- /* has to become static, the init-jit calls a random-seed, screwing up texture noise node */
+ /* Has to become static, the jitter initialization calls a random-seed,
+ * screwing up texture noise node. */
if (firsttime) {
firsttime = 0;
BLI_jitter_init(jit, 256);
diff --git a/source/blender/datatoc/CMakeLists.txt b/source/blender/datatoc/CMakeLists.txt
index 27dc01f1750..8411a1a468e 100644
--- a/source/blender/datatoc/CMakeLists.txt
+++ b/source/blender/datatoc/CMakeLists.txt
@@ -53,7 +53,7 @@ if(NOT WITH_HEADLESS)
include_directories(${PNG_INCLUDE_DIRS})
if(NOT APPLE)
- # APPLE plaform uses full paths for linking libraries.
+ # APPLE platform uses full paths for linking libraries.
link_directories(${PNG_LIBPATH} ${ZLIB_LIBPATH})
endif()
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index c3304cd80ff..d8dc66883a0 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -178,7 +178,7 @@ IDNode *DepsgraphNodeBuilder::add_id_node(ID *id)
if (id_node->components.is_empty() && 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(
- function_bind(deg_evaluate_copy_on_write, _1, id_node),
+ [id_node](::Depsgraph *depsgraph) { deg_evaluate_copy_on_write(depsgraph, id_node); },
OperationCode::COPY_ON_WRITE,
"",
-1);
@@ -696,7 +696,9 @@ void DepsgraphNodeBuilder::build_object(int base_index,
add_operation_node(&object->id,
NodeType::SYNCHRONIZATION,
OperationCode::SYNCHRONIZE_TO_ORIGINAL,
- function_bind(BKE_object_sync_to_original, _1, object_cow));
+ [object_cow](::Depsgraph *depsgraph) {
+ BKE_object_sync_to_original(depsgraph, object_cow);
+ });
}
void DepsgraphNodeBuilder::build_object_from_layer(int base_index,
@@ -725,16 +727,15 @@ void DepsgraphNodeBuilder::build_object_flags(int base_index,
Object *object_cow = get_cow_datablock(object);
const bool is_from_set = (linked_state == DEG_ID_LINKED_VIA_SET);
/* TODO(sergey): Is this really best component to be used? */
- add_operation_node(&object->id,
- NodeType::OBJECT_FROM_LAYER,
- OperationCode::OBJECT_BASE_FLAGS,
- function_bind(BKE_object_eval_eval_base_flags,
- _1,
- scene_cow,
- view_layer_index_,
- object_cow,
- base_index,
- is_from_set));
+ add_operation_node(
+ &object->id,
+ NodeType::OBJECT_FROM_LAYER,
+ OperationCode::OBJECT_BASE_FLAGS,
+ [view_layer_index = view_layer_index_, scene_cow, object_cow, base_index, is_from_set](
+ ::Depsgraph *depsgraph) {
+ BKE_object_eval_eval_base_flags(
+ depsgraph, scene_cow, view_layer_index, object_cow, base_index, is_from_set);
+ });
}
void DepsgraphNodeBuilder::build_object_proxy_from(Object *object, bool is_object_visible)
@@ -853,34 +854,38 @@ void DepsgraphNodeBuilder::build_object_transform(Object *object)
op_node = add_operation_node(&object->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_INIT);
op_node->set_as_entry();
/* Local transforms (from transform channels - loc/rot/scale + deltas). */
- add_operation_node(&object->id,
- NodeType::TRANSFORM,
- OperationCode::TRANSFORM_LOCAL,
- function_bind(BKE_object_eval_local_transform, _1, ob_cow));
+ add_operation_node(
+ &object->id,
+ NodeType::TRANSFORM,
+ OperationCode::TRANSFORM_LOCAL,
+ [ob_cow](::Depsgraph *depsgraph) { BKE_object_eval_local_transform(depsgraph, ob_cow); });
/* Object parent. */
if (object->parent != nullptr) {
- add_operation_node(&object->id,
- NodeType::TRANSFORM,
- OperationCode::TRANSFORM_PARENT,
- function_bind(BKE_object_eval_parent, _1, ob_cow));
+ add_operation_node(
+ &object->id,
+ NodeType::TRANSFORM,
+ OperationCode::TRANSFORM_PARENT,
+ [ob_cow](::Depsgraph *depsgraph) { BKE_object_eval_parent(depsgraph, ob_cow); });
}
/* Object constraints. */
if (object->constraints.first != nullptr) {
build_object_constraints(object);
}
/* Rest of transformation update. */
- add_operation_node(&object->id,
- NodeType::TRANSFORM,
- OperationCode::TRANSFORM_EVAL,
- function_bind(BKE_object_eval_uber_transform, _1, ob_cow));
+ add_operation_node(
+ &object->id,
+ NodeType::TRANSFORM,
+ OperationCode::TRANSFORM_EVAL,
+ [ob_cow](::Depsgraph *depsgraph) { BKE_object_eval_uber_transform(depsgraph, ob_cow); });
/* Operation to take of rigid body simulation. soft bodies and other friends
* in the context of point cache invalidation. */
add_operation_node(&object->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_SIMULATION_INIT);
/* Object transform is done. */
- op_node = add_operation_node(&object->id,
- NodeType::TRANSFORM,
- OperationCode::TRANSFORM_FINAL,
- function_bind(BKE_object_eval_transform_final, _1, ob_cow));
+ op_node = add_operation_node(
+ &object->id,
+ NodeType::TRANSFORM,
+ OperationCode::TRANSFORM_FINAL,
+ [ob_cow](::Depsgraph *depsgraph) { BKE_object_eval_transform_final(depsgraph, ob_cow); });
op_node->set_as_exit();
}
@@ -904,12 +909,14 @@ void DepsgraphNodeBuilder::build_object_transform(Object *object)
void DepsgraphNodeBuilder::build_object_constraints(Object *object)
{
/* create node for constraint stack */
- add_operation_node(
- &object->id,
- NodeType::TRANSFORM,
- OperationCode::TRANSFORM_CONSTRAINTS,
- function_bind(
- BKE_object_eval_constraints, _1, get_cow_datablock(scene_), get_cow_datablock(object)));
+ Scene *scene_cow = get_cow_datablock(scene_);
+ Object *object_cow = get_cow_datablock(object);
+ add_operation_node(&object->id,
+ NodeType::TRANSFORM,
+ OperationCode::TRANSFORM_CONSTRAINTS,
+ [scene_cow, object_cow](::Depsgraph *depsgraph) {
+ BKE_object_eval_constraints(depsgraph, scene_cow, object_cow);
+ });
}
void DepsgraphNodeBuilder::build_object_pointcache(Object *object)
@@ -922,7 +929,9 @@ void DepsgraphNodeBuilder::build_object_pointcache(Object *object)
add_operation_node(&object->id,
NodeType::POINT_CACHE,
OperationCode::POINT_CACHE_RESET,
- function_bind(BKE_object_eval_ptcache_reset, _1, scene_cow, object_cow));
+ [scene_cow, object_cow](::Depsgraph *depsgraph) {
+ BKE_object_eval_ptcache_reset(depsgraph, scene_cow, object_cow);
+ });
}
/**
@@ -950,10 +959,10 @@ void DepsgraphNodeBuilder::build_animdata(ID *id)
operation_node = add_operation_node(id, NodeType::ANIMATION, OperationCode::ANIMATION_ENTRY);
operation_node->set_as_entry();
/* All the evaluation nodes. */
- add_operation_node(id,
- NodeType::ANIMATION,
- OperationCode::ANIMATION_EVAL,
- function_bind(BKE_animsys_eval_animdata, _1, id_cow));
+ add_operation_node(
+ id, NodeType::ANIMATION, OperationCode::ANIMATION_EVAL, [id_cow](::Depsgraph *depsgraph) {
+ BKE_animsys_eval_animdata(depsgraph, id_cow);
+ });
/* Explicit exit operation. */
operation_node = add_operation_node(id, NodeType::ANIMATION, OperationCode::ANIMATION_EXIT);
operation_node->set_as_exit();
@@ -989,10 +998,11 @@ void DepsgraphNodeBuilder::build_animation_images(ID *id)
{
if (BKE_image_user_id_has_animation(id)) {
ID *id_cow = get_cow_id(id);
- add_operation_node(id,
- NodeType::IMAGE_ANIMATION,
- OperationCode::IMAGE_ANIMATION,
- function_bind(BKE_image_user_id_eval_animation, _1, id_cow));
+ add_operation_node(
+ id,
+ NodeType::IMAGE_ANIMATION,
+ OperationCode::IMAGE_ANIMATION,
+ [id_cow](::Depsgraph *depsgraph) { BKE_image_user_id_eval_animation(depsgraph, id_cow); });
}
}
@@ -1020,12 +1030,15 @@ void DepsgraphNodeBuilder::build_driver(ID *id, FCurve *fcurve, int driver_index
* 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. */
- ensure_operation_node(id,
- NodeType::PARAMETERS,
- OperationCode::DRIVER,
- function_bind(BKE_animsys_eval_driver, _1, id_cow, driver_index, fcurve),
- fcurve->rna_path ? fcurve->rna_path : "",
- fcurve->array_index);
+ ensure_operation_node(
+ id,
+ NodeType::PARAMETERS,
+ OperationCode::DRIVER,
+ [id_cow, driver_index, fcurve](::Depsgraph *depsgraph) {
+ BKE_animsys_eval_driver(depsgraph, id_cow, driver_index, fcurve);
+ },
+ fcurve->rna_path ? fcurve->rna_path : "",
+ fcurve->array_index);
build_driver_variables(id, fcurve);
}
@@ -1103,10 +1116,11 @@ void DepsgraphNodeBuilder::build_world(World *world)
add_id_node(&world->id);
World *world_cow = get_cow_datablock(world);
/* Shading update. */
- add_operation_node(&world->id,
- NodeType::SHADING,
- OperationCode::WORLD_UPDATE,
- function_bind(BKE_world_eval, _1, world_cow));
+ add_operation_node(
+ &world->id,
+ NodeType::SHADING,
+ OperationCode::WORLD_UPDATE,
+ [world_cow](::Depsgraph *depsgraph) { BKE_world_eval(depsgraph, world_cow); });
build_idproperties(world->id.properties);
/* Animation. */
build_animdata(&world->id);
@@ -1142,16 +1156,19 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
* instead? */
/* Init/rebuild operation. */
- add_operation_node(&scene->id,
- NodeType::TRANSFORM,
- OperationCode::RIGIDBODY_REBUILD,
- function_bind(BKE_rigidbody_rebuild_sim, _1, scene_cow));
- /* Do-sim operation. */
- OperationNode *sim_node = add_operation_node(
+ add_operation_node(
&scene->id,
NodeType::TRANSFORM,
- OperationCode::RIGIDBODY_SIM,
- function_bind(BKE_rigidbody_eval_simulation, _1, scene_cow));
+ OperationCode::RIGIDBODY_REBUILD,
+ [scene_cow](::Depsgraph *depsgraph) { BKE_rigidbody_rebuild_sim(depsgraph, scene_cow); });
+ /* Do-sim operation. */
+ OperationNode *sim_node = add_operation_node(&scene->id,
+ NodeType::TRANSFORM,
+ OperationCode::RIGIDBODY_SIM,
+ [scene_cow](::Depsgraph *depsgraph) {
+ BKE_rigidbody_eval_simulation(depsgraph,
+ scene_cow);
+ });
sim_node->set_as_entry();
sim_node->set_as_exit();
sim_node->owner->entry_operation = sim_node;
@@ -1173,12 +1190,13 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
/* Create operation for flushing results. */
/* Object's transform component - where the rigidbody operation
* lives. */
- add_operation_node(
- &object->id,
- NodeType::TRANSFORM,
- OperationCode::RIGIDBODY_TRANSFORM_COPY,
- function_bind(
- BKE_rigidbody_object_sync_transforms, _1, scene_cow, get_cow_datablock(object)));
+ Object *object_cow = get_cow_datablock(object);
+ add_operation_node(&object->id,
+ NodeType::TRANSFORM,
+ OperationCode::RIGIDBODY_TRANSFORM_COPY,
+ [scene_cow, object_cow](::Depsgraph *depsgraph) {
+ BKE_rigidbody_object_sync_transforms(depsgraph, scene_cow, object_cow);
+ });
}
FOREACH_COLLECTION_OBJECT_RECURSIVE_END;
}
@@ -1219,9 +1237,10 @@ void DepsgraphNodeBuilder::build_particle_systems(Object *object, bool is_object
Object *ob_cow = get_cow_datablock(object);
OperationNode *op_node;
- op_node = add_operation_node(psys_comp,
- OperationCode::PARTICLE_SYSTEM_INIT,
- function_bind(BKE_particle_system_eval_init, _1, ob_cow));
+ op_node = add_operation_node(
+ psys_comp, OperationCode::PARTICLE_SYSTEM_INIT, [ob_cow](::Depsgraph *depsgraph) {
+ BKE_particle_system_eval_init(depsgraph, ob_cow);
+ });
op_node->set_as_entry();
/* Build all particle systems. */
LISTBASE_FOREACH (ParticleSystem *, psys, &object->particlesystem) {
@@ -1278,7 +1297,9 @@ void DepsgraphNodeBuilder::build_particle_settings(ParticleSettings *particle_se
add_operation_node(&particle_settings->id,
NodeType::PARTICLE_SETTINGS,
OperationCode::PARTICLE_SETTINGS_RESET,
- function_bind(BKE_particle_settings_eval_reset, _1, particle_settings_cow));
+ [particle_settings_cow](::Depsgraph *depsgraph) {
+ BKE_particle_settings_eval_reset(depsgraph, particle_settings_cow);
+ });
op_node = add_operation_node(
&particle_settings->id, NodeType::PARTICLE_SETTINGS, OperationCode::PARTICLE_SETTINGS_EVAL);
op_node->set_as_exit();
@@ -1323,11 +1344,12 @@ void DepsgraphNodeBuilder::build_object_data_geometry(Object *object, bool is_ob
op_node = add_operation_node(&object->id, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL_INIT);
op_node->set_as_entry();
/* Geometry evaluation. */
- op_node = add_operation_node(
- &object->id,
- NodeType::GEOMETRY,
- OperationCode::GEOMETRY_EVAL,
- function_bind(BKE_object_eval_uber_data, _1, scene_cow, object_cow));
+ op_node = add_operation_node(&object->id,
+ NodeType::GEOMETRY,
+ OperationCode::GEOMETRY_EVAL,
+ [scene_cow, object_cow](::Depsgraph *depsgraph) {
+ BKE_object_eval_uber_data(depsgraph, scene_cow, object_cow);
+ });
op_node->set_as_exit();
/* Materials. */
build_materials(object->mat, object->totcol);
@@ -1337,10 +1359,11 @@ void DepsgraphNodeBuilder::build_object_data_geometry(Object *object, bool is_ob
build_object_data_geometry_datablock((ID *)object->data, is_object_visible);
build_dimensions(object);
/* Batch cache. */
- add_operation_node(&object->id,
- NodeType::BATCH_CACHE,
- OperationCode::GEOMETRY_SELECT_UPDATE,
- function_bind(BKE_object_select_update, _1, object_cow));
+ add_operation_node(
+ &object->id,
+ NodeType::BATCH_CACHE,
+ OperationCode::GEOMETRY_SELECT_UPDATE,
+ [object_cow](::Depsgraph *depsgraph) { BKE_object_select_update(depsgraph, object_cow); });
}
void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool is_object_visible)
@@ -1368,7 +1391,9 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
op_node = add_operation_node(obdata,
NodeType::GEOMETRY,
OperationCode::GEOMETRY_EVAL,
- function_bind(BKE_mesh_eval_geometry, _1, (Mesh *)obdata_cow));
+ [obdata_cow](::Depsgraph *depsgraph) {
+ BKE_mesh_eval_geometry(depsgraph, (Mesh *)obdata_cow);
+ });
op_node->set_as_entry();
break;
}
@@ -1378,11 +1403,12 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
break;
}
case ID_CU: {
- op_node = add_operation_node(
- obdata,
- NodeType::GEOMETRY,
- OperationCode::GEOMETRY_EVAL,
- function_bind(BKE_curve_eval_geometry, _1, (Curve *)obdata_cow));
+ op_node = add_operation_node(obdata,
+ NodeType::GEOMETRY,
+ OperationCode::GEOMETRY_EVAL,
+ [obdata_cow](::Depsgraph *depsgraph) {
+ BKE_curve_eval_geometry(depsgraph, (Curve *)obdata_cow);
+ });
op_node->set_as_entry();
/* Make sure objects used for bevel.taper are in the graph.
* NOTE: This objects might be not linked to the scene. */
@@ -1399,22 +1425,25 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
break;
}
case ID_LT: {
- op_node = add_operation_node(
- obdata,
- NodeType::GEOMETRY,
- OperationCode::GEOMETRY_EVAL,
- function_bind(BKE_lattice_eval_geometry, _1, (Lattice *)obdata_cow));
+ op_node = add_operation_node(obdata,
+ NodeType::GEOMETRY,
+ OperationCode::GEOMETRY_EVAL,
+ [obdata_cow](::Depsgraph *depsgraph) {
+ BKE_lattice_eval_geometry(depsgraph, (Lattice *)obdata_cow);
+ });
op_node->set_as_entry();
break;
}
case ID_GD: {
/* GPencil evaluation operations. */
- op_node = add_operation_node(
- obdata,
- NodeType::GEOMETRY,
- OperationCode::GEOMETRY_EVAL,
- function_bind(BKE_gpencil_frame_active_set, _1, (bGPdata *)obdata_cow));
+ op_node = add_operation_node(obdata,
+ NodeType::GEOMETRY,
+ OperationCode::GEOMETRY_EVAL,
+ [obdata_cow](::Depsgraph *depsgraph) {
+ BKE_gpencil_frame_active_set(depsgraph,
+ (bGPdata *)obdata_cow);
+ });
op_node->set_as_entry();
break;
}
@@ -1430,11 +1459,12 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
}
case ID_VO: {
/* Volume frame update. */
- op_node = add_operation_node(
- obdata,
- NodeType::GEOMETRY,
- OperationCode::GEOMETRY_EVAL,
- function_bind(BKE_volume_eval_geometry, _1, (Volume *)obdata_cow));
+ op_node = add_operation_node(obdata,
+ NodeType::GEOMETRY,
+ OperationCode::GEOMETRY_EVAL,
+ [obdata_cow](::Depsgraph *depsgraph) {
+ BKE_volume_eval_geometry(depsgraph, (Volume *)obdata_cow);
+ });
op_node->set_as_entry();
break;
}
@@ -1450,7 +1480,9 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
add_operation_node(obdata,
NodeType::BATCH_CACHE,
OperationCode::GEOMETRY_SELECT_UPDATE,
- function_bind(BKE_object_data_select_update, _1, obdata_cow));
+ [obdata_cow](::Depsgraph *depsgraph) {
+ BKE_object_data_select_update(depsgraph, obdata_cow);
+ });
}
void DepsgraphNodeBuilder::build_armature(bArmature *armature)
@@ -1466,7 +1498,9 @@ void DepsgraphNodeBuilder::build_armature(bArmature *armature)
add_operation_node(&armature->id,
NodeType::ARMATURE,
OperationCode::ARMATURE_EVAL,
- function_bind(BKE_armature_refresh_layer_used, _1, armature_cow));
+ [armature_cow](::Depsgraph *depsgraph) {
+ BKE_armature_refresh_layer_used(depsgraph, armature_cow);
+ });
build_armature_bones(&armature->bonebase);
}
@@ -1506,7 +1540,7 @@ void DepsgraphNodeBuilder::build_light(Light *lamp)
add_operation_node(&lamp->id,
NodeType::SHADING,
OperationCode::LIGHT_UPDATE,
- function_bind(BKE_light_eval, _1, lamp_cow));
+ [lamp_cow](::Depsgraph *depsgraph) { BKE_light_eval(depsgraph, lamp_cow); });
}
void DepsgraphNodeBuilder::build_nodetree_socket(bNodeSocket *socket)
@@ -1534,7 +1568,6 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
}
/* nodetree itself */
add_id_node(&ntree->id);
- bNodeTree *ntree_cow = get_cow_datablock(ntree);
/* General parameters. */
build_parameters(&ntree->id);
build_idproperties(ntree->id.properties);
@@ -1542,12 +1575,7 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
build_animdata(&ntree->id);
/* Shading update. */
add_operation_node(&ntree->id, NodeType::SHADING, OperationCode::MATERIAL_UPDATE);
- /* NOTE: We really pass original and CoW node trees here, this is how the
- * callback works. Ideally we need to find a better way for that. */
- add_operation_node(&ntree->id,
- NodeType::SHADING_PARAMETERS,
- OperationCode::MATERIAL_UPDATE,
- function_bind(BKE_nodetree_shading_params_eval, _1, ntree_cow, ntree));
+ add_operation_node(&ntree->id, NodeType::SHADING_PARAMETERS, OperationCode::MATERIAL_UPDATE);
/* nodetree's nodes... */
LISTBASE_FOREACH (bNode *, bnode, &ntree->nodes) {
build_idproperties(bnode->prop);
@@ -1626,10 +1654,11 @@ void DepsgraphNodeBuilder::build_material(Material *material)
add_id_node(&material->id);
Material *material_cow = get_cow_datablock(material);
/* Shading update. */
- add_operation_node(&material->id,
- NodeType::SHADING,
- OperationCode::MATERIAL_UPDATE,
- function_bind(BKE_material_eval, _1, material_cow));
+ add_operation_node(
+ &material->id,
+ NodeType::SHADING,
+ OperationCode::MATERIAL_UPDATE,
+ [material_cow](::Depsgraph *depsgraph) { BKE_material_eval(depsgraph, material_cow); });
build_idproperties(material->id.properties);
/* Material animation. */
build_animdata(&material->id);
@@ -1714,7 +1743,9 @@ void DepsgraphNodeBuilder::build_cachefile(CacheFile *cache_file)
add_operation_node(cache_file_id,
NodeType::CACHE,
OperationCode::FILE_CACHE_UPDATE,
- function_bind(BKE_cachefile_eval, bmain_, _1, cache_file_cow));
+ [bmain = bmain_, cache_file_cow](::Depsgraph *depsgraph) {
+ BKE_cachefile_eval(bmain, depsgraph, cache_file_cow);
+ });
}
void DepsgraphNodeBuilder::build_mask(Mask *mask)
@@ -1729,15 +1760,16 @@ void DepsgraphNodeBuilder::build_mask(Mask *mask)
build_animdata(mask_id);
build_parameters(mask_id);
/* Animation based on mask's shapes. */
- add_operation_node(mask_id,
- NodeType::ANIMATION,
- OperationCode::MASK_ANIMATION,
- function_bind(BKE_mask_eval_animation, _1, mask_cow));
+ add_operation_node(
+ mask_id,
+ NodeType::ANIMATION,
+ OperationCode::MASK_ANIMATION,
+ [mask_cow](::Depsgraph *depsgraph) { BKE_mask_eval_animation(depsgraph, mask_cow); });
/* Final mask evaluation. */
- add_operation_node(mask_id,
- NodeType::PARAMETERS,
- OperationCode::MASK_EVAL,
- function_bind(BKE_mask_eval_update, _1, mask_cow));
+ add_operation_node(
+ mask_id, NodeType::PARAMETERS, OperationCode::MASK_EVAL, [mask_cow](::Depsgraph *depsgraph) {
+ BKE_mask_eval_update(depsgraph, mask_cow);
+ });
/* Build parents. */
LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask->masklayers) {
LISTBASE_FOREACH (MaskSpline *, spline, &mask_layer->splines) {
@@ -1781,12 +1813,16 @@ void DepsgraphNodeBuilder::build_movieclip(MovieClip *clip)
add_operation_node(clip_id,
NodeType::PARAMETERS,
OperationCode::MOVIECLIP_EVAL,
- function_bind(BKE_movieclip_eval_update, _1, bmain_, clip_cow));
+ [bmain = bmain_, clip_cow](::Depsgraph *depsgraph) {
+ BKE_movieclip_eval_update(depsgraph, bmain, clip_cow);
+ });
add_operation_node(clip_id,
NodeType::BATCH_CACHE,
OperationCode::MOVIECLIP_SELECT_UPDATE,
- function_bind(BKE_movieclip_eval_selection_update, _1, clip_cow));
+ [clip_cow](::Depsgraph *depsgraph) {
+ BKE_movieclip_eval_selection_update(depsgraph, clip_cow);
+ });
}
void DepsgraphNodeBuilder::build_lightprobe(LightProbe *probe)
@@ -1826,7 +1862,9 @@ void DepsgraphNodeBuilder::build_sound(bSound *sound)
add_operation_node(&sound->id,
NodeType::AUDIO,
OperationCode::SOUND_EVAL,
- function_bind(BKE_sound_evaluate, _1, bmain_, sound_cow));
+ [bmain = bmain_, sound_cow](::Depsgraph *depsgraph) {
+ BKE_sound_evaluate(depsgraph, bmain, sound_cow);
+ });
build_idproperties(sound->id.properties);
build_animdata(&sound->id);
build_parameters(&sound->id);
@@ -1849,7 +1887,9 @@ void DepsgraphNodeBuilder::build_simulation(Simulation *simulation)
add_operation_node(&simulation->id,
NodeType::SIMULATION,
OperationCode::SIMULATION_EVAL,
- function_bind(BKE_simulation_data_update, _1, scene_cow, simulation_cow));
+ [scene_cow, simulation_cow](::Depsgraph *depsgraph) {
+ BKE_simulation_data_update(depsgraph, scene_cow, simulation_cow);
+ });
}
void DepsgraphNodeBuilder::build_scene_sequencer(Scene *scene)
@@ -1865,7 +1905,9 @@ void DepsgraphNodeBuilder::build_scene_sequencer(Scene *scene)
add_operation_node(&scene->id,
NodeType::SEQUENCER,
OperationCode::SEQUENCES_EVAL,
- function_bind(BKE_scene_eval_sequencer_sequences, _1, scene_cow));
+ [scene_cow](::Depsgraph *depsgraph) {
+ BKE_scene_eval_sequencer_sequences(depsgraph, scene_cow);
+ });
/* Make sure data for sequences is in the graph. */
Sequence *seq;
SEQ_ALL_BEGIN (scene->ed, seq) {
@@ -1904,7 +1946,9 @@ void DepsgraphNodeBuilder::build_scene_audio(Scene *scene)
add_operation_node(&scene->id,
NodeType::AUDIO,
OperationCode::AUDIO_VOLUME,
- function_bind(BKE_scene_update_tag_audio_volume, _1, scene_cow));
+ [scene_cow](::Depsgraph *depsgraph) {
+ BKE_scene_update_tag_audio_volume(depsgraph, scene_cow);
+ });
}
void DepsgraphNodeBuilder::build_scene_speakers(Scene * /*scene*/, ViewLayer *view_layer)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
index 8ba4b4a427f..13caba67713 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
@@ -66,16 +66,18 @@ void DepsgraphNodeBuilder::build_pose_constraints(Object *object,
data.builder = this;
data.is_parent_visible = is_object_visible;
BKE_constraints_id_loop(&pchan->constraints, constraint_walk, &data);
+
/* Create node for constraint stack. */
+ Scene *scene_cow = get_cow_datablock(scene_);
+ Object *object_cow = get_cow_datablock(object);
add_operation_node(&object->id,
NodeType::BONE,
pchan->name,
OperationCode::BONE_CONSTRAINTS,
- function_bind(BKE_pose_constraints_evaluate,
- _1,
- get_cow_datablock(scene_),
- get_cow_datablock(object),
- pchan_index));
+ [scene_cow, object_cow, pchan_index](::Depsgraph *depsgraph) {
+ BKE_pose_constraints_evaluate(
+ depsgraph, scene_cow, object_cow, pchan_index);
+ });
}
/* IK Solver Eval Steps */
@@ -96,16 +98,17 @@ void DepsgraphNodeBuilder::build_ik_pose(Object *object, bPoseChannel *pchan, bC
int rootchan_index = BLI_findindex(&object->pose->chanbase, rootchan);
BLI_assert(rootchan_index != -1);
+
/* Operation node for evaluating/running IK Solver. */
+ Scene *scene_cow = get_cow_datablock(scene_);
+ Object *object_cow = get_cow_datablock(object);
add_operation_node(&object->id,
NodeType::EVAL_POSE,
rootchan->name,
OperationCode::POSE_IK_SOLVER,
- function_bind(BKE_pose_iktree_evaluate,
- _1,
- get_cow_datablock(scene_),
- get_cow_datablock(object),
- rootchan_index));
+ [scene_cow, object_cow, rootchan_index](::Depsgraph *depsgraph) {
+ BKE_pose_iktree_evaluate(depsgraph, scene_cow, object_cow, rootchan_index);
+ });
}
/* Spline IK Eval Steps */
@@ -130,15 +133,17 @@ void DepsgraphNodeBuilder::build_splineik_pose(Object *object,
* start. */
int rootchan_index = BLI_findindex(&object->pose->chanbase, rootchan);
BLI_assert(rootchan_index != -1);
+
+ Scene *scene_cow = get_cow_datablock(scene_);
+ Object *object_cow = get_cow_datablock(object);
add_operation_node(&object->id,
NodeType::EVAL_POSE,
rootchan->name,
OperationCode::POSE_SPLINE_IK_SOLVER,
- function_bind(BKE_pose_splineik_evaluate,
- _1,
- get_cow_datablock(scene_),
- get_cow_datablock(object),
- rootchan_index));
+ [scene_cow, object_cow, rootchan_index](::Depsgraph *depsgraph) {
+ BKE_pose_splineik_evaluate(
+ depsgraph, scene_cow, object_cow, rootchan_index);
+ });
}
/* Pose/Armature Bones Graph */
@@ -193,23 +198,30 @@ void DepsgraphNodeBuilder::build_rig(Object *object, bool is_object_visible)
op_node = add_operation_node(&object->id,
NodeType::EVAL_POSE,
OperationCode::POSE_INIT,
- function_bind(BKE_pose_eval_init, _1, scene_cow, object_cow));
+ [scene_cow, object_cow](::Depsgraph *depsgraph) {
+ BKE_pose_eval_init(depsgraph, scene_cow, object_cow);
+ });
op_node->set_as_entry();
op_node = add_operation_node(&object->id,
NodeType::EVAL_POSE,
OperationCode::POSE_INIT_IK,
- function_bind(BKE_pose_eval_init_ik, _1, scene_cow, object_cow));
+ [scene_cow, object_cow](::Depsgraph *depsgraph) {
+ BKE_pose_eval_init_ik(depsgraph, scene_cow, object_cow);
+ });
add_operation_node(&object->id,
NodeType::EVAL_POSE,
OperationCode::POSE_CLEANUP,
- function_bind(BKE_pose_eval_cleanup, _1, scene_cow, object_cow));
-
- op_node = add_operation_node(&object->id,
- NodeType::EVAL_POSE,
- OperationCode::POSE_DONE,
- function_bind(BKE_pose_eval_done, _1, object_cow));
+ [scene_cow, object_cow](::Depsgraph *depsgraph) {
+ BKE_pose_eval_cleanup(depsgraph, scene_cow, object_cow);
+ });
+
+ op_node = add_operation_node(
+ &object->id,
+ NodeType::EVAL_POSE,
+ OperationCode::POSE_DONE,
+ [object_cow](::Depsgraph *depsgraph) { BKE_pose_eval_done(depsgraph, object_cow); });
op_node->set_as_exit();
/* Bones. */
int pchan_index = 0;
@@ -223,7 +235,9 @@ void DepsgraphNodeBuilder::build_rig(Object *object, bool is_object_visible)
NodeType::BONE,
pchan->name,
OperationCode::BONE_POSE_PARENT,
- function_bind(BKE_pose_eval_bone, _1, scene_cow, object_cow, pchan_index));
+ [scene_cow, object_cow, pchan_index](::Depsgraph *depsgraph) {
+ BKE_pose_eval_bone(depsgraph, scene_cow, object_cow, pchan_index);
+ });
/* NOTE: Dedicated noop for easier relationship construction. */
add_operation_node(&object->id, NodeType::BONE, pchan->name, OperationCode::BONE_READY);
@@ -232,16 +246,20 @@ void DepsgraphNodeBuilder::build_rig(Object *object, bool is_object_visible)
NodeType::BONE,
pchan->name,
OperationCode::BONE_DONE,
- function_bind(BKE_pose_bone_done, _1, object_cow, pchan_index));
+ [object_cow, pchan_index](::Depsgraph *depsgraph) {
+ BKE_pose_bone_done(depsgraph, object_cow, pchan_index);
+ });
/* B-Bone shape computation - the real last step if present. */
if (check_pchan_has_bbone(object, pchan)) {
- op_node = add_operation_node(
- &object->id,
- NodeType::BONE,
- pchan->name,
- OperationCode::BONE_SEGMENTS,
- function_bind(BKE_pose_eval_bbone_segments, _1, object_cow, pchan_index));
+ op_node = add_operation_node(&object->id,
+ NodeType::BONE,
+ pchan->name,
+ OperationCode::BONE_SEGMENTS,
+ [object_cow, pchan_index](::Depsgraph *depsgraph) {
+ BKE_pose_eval_bbone_segments(
+ depsgraph, object_cow, pchan_index);
+ });
}
op_node->set_as_exit();
@@ -304,10 +322,11 @@ void DepsgraphNodeBuilder::build_proxy_rig(Object *object, bool is_object_visibl
if (object->pose->flag & POSE_CONSTRAINTS_NEED_UPDATE_FLAGS) {
BKE_pose_update_constraint_flags(object->pose);
}
- op_node = add_operation_node(&object->id,
- NodeType::EVAL_POSE,
- OperationCode::POSE_INIT,
- function_bind(BKE_pose_eval_proxy_init, _1, object_cow));
+ op_node = add_operation_node(
+ &object->id,
+ NodeType::EVAL_POSE,
+ OperationCode::POSE_INIT,
+ [object_cow](::Depsgraph *depsgraph) { BKE_pose_eval_proxy_init(depsgraph, object_cow); });
op_node->set_as_entry();
int pchan_index = 0;
@@ -318,12 +337,14 @@ void DepsgraphNodeBuilder::build_proxy_rig(Object *object, bool is_object_visibl
/* Bone is ready for solvers. */
add_operation_node(&object->id, NodeType::BONE, pchan->name, OperationCode::BONE_READY);
/* Bone is fully evaluated. */
- op_node = add_operation_node(
- &object->id,
- NodeType::BONE,
- pchan->name,
- OperationCode::BONE_DONE,
- function_bind(BKE_pose_eval_proxy_copy_bone, _1, object_cow, pchan_index));
+ op_node = add_operation_node(&object->id,
+ NodeType::BONE,
+ pchan->name,
+ OperationCode::BONE_DONE,
+ [object_cow, pchan_index](::Depsgraph *depsgraph) {
+ BKE_pose_eval_proxy_copy_bone(
+ depsgraph, object_cow, pchan_index);
+ });
op_node->set_as_exit();
/* Custom properties. */
@@ -343,11 +364,14 @@ void DepsgraphNodeBuilder::build_proxy_rig(Object *object, bool is_object_visibl
op_node = add_operation_node(&object->id,
NodeType::EVAL_POSE,
OperationCode::POSE_CLEANUP,
- function_bind(BKE_pose_eval_proxy_cleanup, _1, object_cow));
- op_node = add_operation_node(&object->id,
- NodeType::EVAL_POSE,
- OperationCode::POSE_DONE,
- function_bind(BKE_pose_eval_proxy_done, _1, object_cow));
+ [object_cow](::Depsgraph *depsgraph) {
+ BKE_pose_eval_proxy_cleanup(depsgraph, object_cow);
+ });
+ op_node = add_operation_node(
+ &object->id,
+ NodeType::EVAL_POSE,
+ OperationCode::POSE_DONE,
+ [object_cow](::Depsgraph *depsgraph) { BKE_pose_eval_proxy_done(depsgraph, object_cow); });
op_node->set_as_exit();
}
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 b1fd86f13bc..29aa05b83db 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
@@ -160,11 +160,12 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene,
build_scene_sequencer(scene);
}
/* Collections. */
- add_operation_node(
- &scene->id,
- NodeType::LAYER_COLLECTIONS,
- OperationCode::VIEW_LAYER_EVAL,
- function_bind(BKE_layer_eval_view_layer_indexed, _1, scene_cow, view_layer_index_));
+ add_operation_node(&scene->id,
+ NodeType::LAYER_COLLECTIONS,
+ OperationCode::VIEW_LAYER_EVAL,
+ [view_layer_index = view_layer_index_, scene_cow](::Depsgraph *depsgraph) {
+ BKE_layer_eval_view_layer_indexed(depsgraph, scene_cow, view_layer_index);
+ });
/* Parameters evaluation for scene relations mainly. */
build_scene_compositor(scene);
build_scene_parameters(scene);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 463efe52375..96b4da34347 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1238,7 +1238,7 @@ void DepsgraphRelationBuilder::build_constraints(ID *id,
// TODO: loc vs rot vs scale?
if (&ct->tar->id == id) {
/* Constraint targeting own object:
- * - This case is fine IFF we're dealing with a bone
+ * - 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.
* - If however it is a real self targeting case, just
@@ -1814,7 +1814,7 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
RELATION_FLAG_GODMODE);
}
- /* Final transform is whetever solver gave to us. */
+ /* Final transform is whatever the solver gave to us. */
if (object->rigidbody_object->type == RBO_TYPE_ACTIVE) {
/* We do not have to update the objects final transform after the simulation if it is
* passive or controlled by the animation system in blender.
@@ -2496,7 +2496,7 @@ void DepsgraphRelationBuilder::build_material(Material *material)
/* Animated / driven parameters (without nodetree). */
OperationKey material_key(&material->id, NodeType::SHADING, OperationCode::MATERIAL_UPDATE);
ComponentKey parameters_key(&material->id, NodeType::PARAMETERS);
- add_relation(parameters_key, material_key, "Material's paramters");
+ add_relation(parameters_key, material_key, "Material's parameters");
/* material's nodetree */
if (material->nodetree != nullptr) {
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 a0cbbbc163d..9afae0f2c22 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
@@ -184,7 +184,7 @@ static void deg_debug_graphviz_legend(DotExportContext &ctx)
std::stringstream ss;
ss << "<";
- ss << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"4\">";
+ ss << R"(<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">)";
ss << "<TR><TD COLSPAN=\"2\"><B>Legend</B></TD></TR>";
#ifdef COLOR_SCHEME_NODE_CLASS
diff --git a/source/blender/depsgraph/intern/debug/deg_debug_stats_gnuplot.cc b/source/blender/depsgraph/intern/debug/deg_debug_stats_gnuplot.cc
index 0cdd627dd44..df343a3eb28 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_stats_gnuplot.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_stats_gnuplot.cc
@@ -87,7 +87,7 @@ string gnuplotify_name(const string &name)
for (int i = 0; i < length; i++) {
const char ch = name[i];
if (ch == '_') {
- result += "\\\\\\";
+ result += R"(\\\)";
}
result += ch;
}
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index e472d82f2ee..34465c12914 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -193,6 +193,32 @@ bool deg_iterator_components_step(BLI_Iterator *iter)
}
}
+ /* The volume component. */
+ if (data->geometry_component_id == 2) {
+ data->geometry_component_id++;
+
+ /* Don't use a temporary object for this component, when the owner is a volume object. */
+ if (data->geometry_component_owner->type == OB_VOLUME) {
+ iter->current = data->geometry_component_owner;
+ return true;
+ }
+
+ const VolumeComponent *component = geometry_set->get_component_for_read<VolumeComponent>();
+ if (component != nullptr) {
+ const Volume *volume = component->get_for_read();
+
+ if (volume != nullptr) {
+ Object *temp_object = &data->temp_geometry_component_object;
+ *temp_object = *data->geometry_component_owner;
+ temp_object->type = OB_VOLUME;
+ temp_object->data = (void *)volume;
+ temp_object->runtime.select_id = data->geometry_component_owner->runtime.select_id;
+ iter->current = temp_object;
+ return true;
+ }
+ }
+ }
+
data->geometry_component_owner = nullptr;
return false;
}
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_scene.h b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_scene.h
index 007236e7890..d16f5b9b5ce 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_scene.h
+++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_scene.h
@@ -46,7 +46,7 @@ class SceneBackup {
*
* NOTE: Scene can not disappear after relations update, because otherwise the entire dependency
* graph will be gone. This means we don't need to compare original scene pointer, or worry about
- * freeing those if they cant' be restored: we just copy them over to a new scene. */
+ * freeing those if they can't be restored: we just copy them over to a new scene. */
void *sound_scene;
void *playback_handle;
void *sound_scrub_handle;
diff --git a/source/blender/depsgraph/intern/node/deg_node_id.h b/source/blender/depsgraph/intern/node/deg_node_id.h
index c4d36685bb8..e2d3b3fc36f 100644
--- a/source/blender/depsgraph/intern/node/deg_node_id.h
+++ b/source/blender/depsgraph/intern/node/deg_node_id.h
@@ -88,7 +88,7 @@ struct IDNode : public Node {
* which could be "stale" pointer. */
uint id_orig_session_uuid;
- /* Evaluated datablock.
+ /* Evaluated data-block.
* Will be covered by the copy-on-write system if the ID Type needs it. */
ID *id_cow;
@@ -107,7 +107,7 @@ struct IDNode : public Node {
eDepsNode_LinkedState_Type linked_state;
- /* Indicates the datablock is visible in the evaluated scene. */
+ /* Indicates the data-block is visible in the evaluated scene. */
bool is_directly_visible;
/* For the collection type of ID, denotes whether collection was fully
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 9b716eeeed3..dff9e302fdf 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -90,6 +90,7 @@ set(SRC
engines/eevee/eevee_lights.c
engines/eevee/eevee_lookdev.c
engines/eevee/eevee_lut.c
+ engines/eevee/eevee_lut_gen.c
engines/eevee/eevee_materials.c
engines/eevee/eevee_mist.c
engines/eevee/eevee_motion_blur.c
@@ -197,7 +198,6 @@ set(LIB
data_to_c_simple(engines/eevee/shaders/ambient_occlusion_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/background_vert.glsl SRC)
-data_to_c_simple(engines/eevee/shaders/closure_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/common_uniforms_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/common_utiltex_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lights_lib.glsl SRC)
@@ -215,10 +215,25 @@ data_to_c_simple(engines/eevee/shaders/lightprobe_grid_fill_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_vert.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lookdev_world_frag.glsl SRC)
-data_to_c_simple(engines/eevee/shaders/closure_lit_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/closure_eval_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/closure_eval_diffuse_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/closure_eval_glossy_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/closure_eval_refraction_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/closure_eval_translucent_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/closure_type_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/effect_bloom_frag.glsl SRC)
-data_to_c_simple(engines/eevee/shaders/effect_dof_vert.glsl SRC)
-data_to_c_simple(engines/eevee/shaders/effect_dof_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_bokeh_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_downsample_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_filter_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_gather_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_reduce_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_resolve_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_scatter_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_scatter_vert.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_setup_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/effect_downsample_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/effect_downsample_cube_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/effect_gtao_frag.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_cryptomatte.c b/source/blender/draw/engines/eevee/eevee_cryptomatte.c
index b47e8c5f081..13a3f1766a9 100644
--- a/source/blender/draw/engines/eevee/eevee_cryptomatte.c
+++ b/source/blender/draw/engines/eevee/eevee_cryptomatte.c
@@ -363,7 +363,7 @@ static void eevee_cryptomatte_download_buffer(EEVEE_Data *vedata, GPUFrameBuffer
download_buffer);
/* Integrate download buffer into the accum buffer.
- * The download buffer contains upto 3 floats per pixel (one float per cryptomatte layer.
+ * The download buffer contains up to 3 floats per pixel (one float per cryptomatte layer.
*
* NOTE: here we deviate from the cryptomatte standard. During integration the standard always
* sort the samples by its weight to make sure that samples with the lowest weight
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index 47068d0b843..b453df284ed 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -130,7 +130,7 @@ EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *
}
EEVEE_ObjectKey key, *key_p;
- /* Small hack to avoid another comparisson. */
+ /* Small hack to avoid another comparison. */
key.ob = (Object *)((char *)ob + hair);
DupliObject *dup = DRW_object_get_dupli(ob);
if (dup) {
diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
index 92ba526c67c..33d45d61d42 100644
--- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c
+++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
@@ -20,6 +20,13 @@
* \ingroup draw_engine
*
* Depth of field post process effect.
+ *
+ * There are 2 methods to achieve this effect.
+ * - The first uses projection matrix offsetting and sample accumulation to give reference quality
+ * depth of field. But this needs many samples to hide the under-sampling.
+ * - The second one is a post-processing based one. It follows the implementation described in
+ * the presentation "Life of a Bokeh - Siggraph 2018" from Guillaume Abadie. There are some
+ * difference with our actual implementation that prioritize quality.
*/
#include "DRW_render.h"
@@ -40,10 +47,156 @@
#include "GPU_texture.h"
#include "eevee_private.h"
+#define CAMERA_JITTER_RING_DENSITY 6
+
+static float coc_radius_from_camera_depth(bool is_ortho, EEVEE_EffectsInfo *fx, float camera_depth)
+{
+ float multiplier = fx->dof_coc_params[0];
+ float bias = fx->dof_coc_params[1];
+ if (multiplier == 0.0f || bias == 0.0f) {
+ return 0.0f;
+ }
+ if (is_ortho) {
+ return (camera_depth + multiplier / bias) * multiplier;
+ }
+ return multiplier / camera_depth - bias;
+}
+
+static float polygon_sides_length(float sides_count)
+{
+ return 2.0 * sin(M_PI / sides_count);
+}
+
+/* Returns intersection ratio between the radius edge at theta and the polygon edge.
+ * Start first corners at theta == 0. */
+static float circle_to_polygon_radius(float sides_count, float theta)
+{
+ /* From Graphics Gems from CryENGINE 3 (Siggraph 2013) by Tiago Sousa (slide 36). */
+ float side_angle = (2.0f * M_PI) / sides_count;
+ return cosf(side_angle * 0.5f) /
+ cosf(theta - side_angle * floorf((sides_count * theta + M_PI) / (2.0f * M_PI)));
+}
+
+/* Remap input angle to have homogenous spacing of points along a polygon edge.
+ * Expect theta to be in [0..2pi] range. */
+static float circle_to_polygon_angle(float sides_count, float theta)
+{
+ float side_angle = (2.0f * M_PI) / sides_count;
+ float halfside_angle = side_angle * 0.5f;
+ float side = floorf(theta / side_angle);
+ /* Length of segment from center to the middle of polygon side. */
+ float adjacent = circle_to_polygon_radius(sides_count, 0.0f);
+
+ /* This is the relative position of the sample on the polygon half side. */
+ float local_theta = theta - side * side_angle;
+ float ratio = (local_theta - halfside_angle) / halfside_angle;
+
+ float halfside_len = polygon_sides_length(sides_count) * 0.5f;
+ float opposite = ratio * halfside_len;
+
+ /* NOTE: atan(y_over_x) has output range [-M_PI_2..M_PI_2]. */
+ float final_local_theta = atanf(opposite / adjacent);
+
+ return side * side_angle + final_local_theta;
+}
+
+static int dof_jitter_total_sample_count(int ring_density, int ring_count)
+{
+ return ((ring_count * ring_count + ring_count) / 2) * ring_density + 1;
+}
+
+bool EEVEE_depth_of_field_jitter_get(EEVEE_EffectsInfo *fx,
+ float r_jitter[2],
+ float *r_focus_distance)
+{
+ if (fx->dof_jitter_radius == 0.0f) {
+ return false;
+ }
+
+ int ring_density = CAMERA_JITTER_RING_DENSITY;
+ int ring_count = fx->dof_jitter_ring_count;
+ int sample_count = dof_jitter_total_sample_count(ring_density, ring_count);
+
+ int s = fx->taa_current_sample - 1;
+
+ int ring = 0;
+ int ring_sample_count = 1;
+ int ring_sample = 1;
+
+ s = s * (ring_density - 1);
+ s = s % sample_count;
+
+ int samples_passed = 1;
+ while (s >= samples_passed) {
+ ring++;
+ ring_sample_count = ring * ring_density;
+ ring_sample = s - samples_passed;
+ ring_sample = (ring_sample + 1) % ring_sample_count;
+ samples_passed += ring_sample_count;
+ }
+
+ r_jitter[0] = (float)ring / ring_count;
+ r_jitter[1] = (float)ring_sample / ring_sample_count;
+
+ {
+ /* Bokeh shape parameterization. */
+ float r = r_jitter[0];
+ float T = r_jitter[1] * 2.0f * M_PI;
+
+ if (fx->dof_jitter_blades >= 3.0f) {
+ T = circle_to_polygon_angle(fx->dof_jitter_blades, T);
+ r *= circle_to_polygon_radius(fx->dof_jitter_blades, T);
+ }
+
+ T += fx->dof_bokeh_rotation;
+
+ r_jitter[0] = r * cosf(T);
+ r_jitter[1] = r * sinf(T);
+
+ mul_v2_v2(r_jitter, fx->dof_bokeh_aniso);
+ }
+
+ mul_v2_fl(r_jitter, fx->dof_jitter_radius);
+
+ *r_focus_distance = fx->dof_jitter_focus;
+ return true;
+}
+
+int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *effects,
+ int sample_count,
+ int *r_ring_count)
+{
+ if (effects->dof_jitter_radius == 0.0f) {
+ if (r_ring_count != NULL) {
+ *r_ring_count = 0;
+ }
+ return 1;
+ }
+
+ if (sample_count == TAA_MAX_SAMPLE) {
+ /* Special case for viewport continuous rendering. We clamp to a max sample to avoid the
+ * jittered dof never converging. */
+ sample_count = 1024;
+ }
+ /* Inversion of dof_jitter_total_sample_count. */
+ float x = 2.0f * (sample_count - 1.0f) / CAMERA_JITTER_RING_DENSITY;
+ /* Solving polynomial. We only search positive solution. */
+ float discriminant = 1.0f + 4.0f * x;
+ int ring_count = ceilf(0.5f * (sqrt(discriminant) - 1.0f));
+
+ sample_count = dof_jitter_total_sample_count(CAMERA_JITTER_RING_DENSITY, ring_count);
+
+ if (r_ring_count != NULL) {
+ *r_ring_count = ring_count;
+ }
+ return sample_count;
+}
+
int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata),
EEVEE_Data *vedata,
Object *camera)
{
+ EEVEE_TextureList *txl = vedata->txl;
EEVEE_StorageList *stl = vedata->stl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_EffectsInfo *effects = stl->effects;
@@ -57,59 +210,30 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata),
RegionView3D *rv3d = draw_ctx->rv3d;
const float *viewport_size = DRW_viewport_size_get();
- /* Retrieve Near and Far distance */
- effects->dof_near_far[0] = -cam->clip_start;
- effects->dof_near_far[1] = -cam->clip_end;
-
- int buffer_size[2] = {(int)viewport_size[0] / 2, (int)viewport_size[1] / 2};
-
- buffer_size[0] = max_ii(1, buffer_size[0]);
- buffer_size[1] = max_ii(1, buffer_size[1]);
+ effects->dof_hq_slight_focus = (scene_eval->eevee.flag & SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS) != 0;
- eGPUTextureFormat down_format = DRW_state_draw_background() ? GPU_R11F_G11F_B10F : GPU_RGBA16F;
-
- effects->dof_down_near = DRW_texture_pool_query_2d(
- buffer_size[0], buffer_size[1], down_format, &draw_engine_eevee_type);
- effects->dof_down_far = DRW_texture_pool_query_2d(
- buffer_size[0], buffer_size[1], down_format, &draw_engine_eevee_type);
- effects->dof_coc = DRW_texture_pool_query_2d(
- buffer_size[0], buffer_size[1], GPU_RG16F, &draw_engine_eevee_type);
-
- GPU_framebuffer_ensure_config(&fbl->dof_down_fb,
- {GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(effects->dof_down_near),
- GPU_ATTACHMENT_TEXTURE(effects->dof_down_far),
- GPU_ATTACHMENT_TEXTURE(effects->dof_coc)});
-
- /* Go full 32bits for rendering and reduce the color artifacts. */
- eGPUTextureFormat fb_format = DRW_state_is_image_render() ? GPU_RGBA32F : GPU_RGBA16F;
-
- effects->dof_blur = DRW_texture_pool_query_2d(
- buffer_size[0] * 2, buffer_size[1], fb_format, &draw_engine_eevee_type);
-
- GPU_framebuffer_ensure_config(&fbl->dof_scatter_fb,
- {
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(effects->dof_blur),
- });
-
- if (!DRW_state_draw_background()) {
- effects->dof_blur_alpha = DRW_texture_pool_query_2d(
- buffer_size[0] * 2, buffer_size[1], GPU_R32F, &draw_engine_eevee_type);
- GPU_framebuffer_texture_attach(fbl->dof_scatter_fb, effects->dof_blur_alpha, 1, 0);
- }
+ /* Retrieve Near and Far distance */
+ effects->dof_coc_near_dist = -cam->clip_start;
+ effects->dof_coc_far_dist = -cam->clip_end;
/* Parameters */
- /* TODO UI Options */
+ bool is_ortho = cam->type == CAM_ORTHO;
float fstop = cam->dof.aperture_fstop;
float blades = cam->dof.aperture_blades;
float rotation = cam->dof.aperture_rotation;
- float ratio = 1.0f / cam->dof.aperture_ratio;
+ float ratio = 1.0f / max_ff(cam->dof.aperture_ratio, 0.00001f);
float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
float focus_dist = BKE_camera_object_dof_distance(camera);
float focal_len = cam->lens;
- const float scale_camera = 0.001f;
+ if (is_ortho) {
+ /* (fclem) A bit of black magic here. I don't know if this is correct. */
+ fstop *= 1.3f;
+ focal_len = 1.0f;
+ sensor = cam->ortho_scale;
+ }
+
+ const float scale_camera = (is_ortho) ? 1.0 : 0.001f;
/* we want radius here for the aperture number */
float aperture = 0.5f * scale_camera * focal_len / fstop;
float focal_len_scaled = scale_camera * focal_len;
@@ -119,119 +243,803 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata),
sensor_scaled *= rv3d->viewcamtexcofac[0];
}
- effects->dof_params[1] = aperture * fabsf(focal_len_scaled / (focus_dist - focal_len_scaled));
- effects->dof_params[1] *= viewport_size[0] / sensor_scaled;
- effects->dof_params[0] = -focus_dist * effects->dof_params[1];
+ if (ratio > 1.0) {
+ /* If ratio is scaling the bokeh outwards, we scale the aperture so that the gather
+ * kernel size will encompass the maximum axis. */
+ aperture *= ratio;
+ }
+
+ effects->dof_coc_params[1] = -aperture *
+ fabsf(focal_len_scaled / (focus_dist - focal_len_scaled));
+ /* FIXME(fclem) This is broken for vertically fit sensor. */
+ effects->dof_coc_params[1] *= viewport_size[0] / sensor_scaled;
+
+ if ((scene_eval->eevee.flag & SCE_EEVEE_DOF_JITTER) != 0) {
+ effects->dof_jitter_radius = effects->dof_coc_params[1];
+ effects->dof_jitter_focus = focus_dist;
+ effects->dof_jitter_blades = blades;
+
+ int sample_count = EEVEE_temporal_sampling_sample_count_get(scene_eval, stl);
+ sample_count = EEVEE_depth_of_field_sample_count_get(
+ effects, sample_count, &effects->dof_jitter_ring_count);
+
+ if (effects->dof_jitter_ring_count == 0) {
+ effects->dof_jitter_radius = 0.0f;
+ }
+ else {
+ /* Compute a minimal overblur radius to fill the gaps between the samples.
+ * This is just the simplified form of dividing the area of the bokeh
+ * by the number of samples. */
+ float minimal_overblur = 1.0f / sqrtf(sample_count);
+ float user_overblur = scene_eval->eevee.bokeh_overblur / 100.0f;
+
+ effects->dof_coc_params[1] *= minimal_overblur + user_overblur;
+ /* Avoid dilating the shape. Over-blur only soften. */
+ effects->dof_jitter_radius -= effects->dof_coc_params[1];
+ }
+ }
+ else {
+ effects->dof_jitter_radius = 0.0f;
+ }
+
+ if (is_ortho) {
+ /* (fclem) A bit of black magic here. Needed to match cycles. */
+ effects->dof_coc_params[1] *= 0.225;
+ }
+
+ effects->dof_coc_params[0] = -focus_dist * effects->dof_coc_params[1];
- effects->dof_bokeh[0] = rotation;
- effects->dof_bokeh[1] = ratio;
- effects->dof_bokeh[2] = scene_eval->eevee.bokeh_max_size;
+ effects->dof_bokeh_blades = blades;
+ effects->dof_bokeh_rotation = rotation;
+ effects->dof_bokeh_aniso[0] = min_ff(ratio, 1.0f);
+ effects->dof_bokeh_aniso[1] = min_ff(1.0f / ratio, 1.0f);
+ effects->dof_bokeh_max_size = scene_eval->eevee.bokeh_max_size;
- /* Precompute values to save instructions in fragment shader. */
- effects->dof_bokeh_sides[0] = blades;
- effects->dof_bokeh_sides[1] = blades > 0.0f ? 2.0f * M_PI / blades : 0.0f;
- effects->dof_bokeh_sides[2] = blades / (2.0f * M_PI);
- effects->dof_bokeh_sides[3] = blades > 0.0f ? cosf(M_PI / blades) : 0.0f;
+ copy_v2_v2(effects->dof_bokeh_aniso_inv, effects->dof_bokeh_aniso);
+ invert_v2(effects->dof_bokeh_aniso_inv);
+
+ effects->dof_scatter_color_threshold = scene_eval->eevee.bokeh_threshold;
+ effects->dof_scatter_neighbor_max_color = scene_eval->eevee.bokeh_neighbor_max;
+ effects->dof_denoise_factor = clamp_f(scene_eval->eevee.bokeh_denoise_fac, 0.0f, 1.0f);
+
+ float max_abs_fg_coc, max_abs_bg_coc;
+ if (is_ortho) {
+ max_abs_fg_coc = fabsf(coc_radius_from_camera_depth(true, effects, -cam->clip_start));
+ max_abs_bg_coc = fabsf(coc_radius_from_camera_depth(true, effects, -cam->clip_end));
+ }
+ else {
+ max_abs_fg_coc = fabsf(coc_radius_from_camera_depth(false, effects, -cam->clip_start));
+ /* Background is at infinity so maximum CoC is the limit of the function at -inf. */
+ max_abs_bg_coc = fabsf(effects->dof_coc_params[1]);
+ }
+
+ float max_coc = max_ff(max_abs_bg_coc, max_abs_fg_coc);
+ /* Clamp with user defined max. */
+ effects->dof_fx_max_coc = min_ff(scene_eval->eevee.bokeh_max_size, max_coc);
+
+ if (effects->dof_fx_max_coc < 0.5f) {
+ return 0;
+ }
return EFFECT_DOF | EFFECT_POST_BUFFER;
}
+ effects->dof_jitter_radius = 0.0f;
+
/* Cleanup to release memory */
- GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_down_fb);
- GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_setup_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_flatten_tiles_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_dilate_tiles_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_reduce_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_reduce_copy_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_gather_fg_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_gather_bg_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_bg_fb);
+ DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_color);
+ DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_coc);
return 0;
}
-void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
+#define WITH_FILTERING (GPU_SAMPLER_MIPMAP | GPU_SAMPLER_FILTER)
+#define NO_FILTERING GPU_SAMPLER_MIPMAP
+#define COLOR_FORMAT fx->dof_color_format
+#define FG_TILE_FORMAT GPU_RGBA16F
+#define BG_TILE_FORMAT GPU_R11F_G11F_B10F
+
+/**
+ * Create bokeh texture.
+ **/
+static void dof_bokeh_pass_init(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_EffectsInfo *fx)
+{
+ if ((fx->dof_bokeh_aniso[0] == 1.0f) && (fx->dof_bokeh_aniso[1] == 1.0f) &&
+ (fx->dof_bokeh_blades == 0.0)) {
+ fx->dof_bokeh_gather_lut_tx = NULL;
+ fx->dof_bokeh_scatter_lut_tx = NULL;
+ fx->dof_bokeh_resolve_lut_tx = NULL;
+ return;
+ }
+
+ void *owner = (void *)&EEVEE_depth_of_field_init;
+ int res[2] = {DOF_BOKEH_LUT_SIZE, DOF_BOKEH_LUT_SIZE};
+
+ DRW_PASS_CREATE(psl->dof_bokeh, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_bokeh_get();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_bokeh);
+ DRW_shgroup_uniform_float_copy(grp, "bokehSides", fx->dof_bokeh_blades);
+ DRW_shgroup_uniform_float_copy(grp, "bokehRotation", fx->dof_bokeh_rotation);
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ fx->dof_bokeh_gather_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner);
+ fx->dof_bokeh_scatter_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner);
+ fx->dof_bokeh_resolve_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_bokeh_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_gather_lut_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_scatter_lut_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_resolve_lut_tx),
+ });
+}
+
+/**
+ * Outputs halfResColorBuffer and halfResCocBuffer.
+ **/
+static void dof_setup_pass_init(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_EffectsInfo *fx)
{
- EEVEE_PassList *psl = vedata->psl;
- EEVEE_StorageList *stl = vedata->stl;
- EEVEE_EffectsInfo *effects = stl->effects;
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
- if ((effects->enabled_effects & EFFECT_DOF) != 0) {
- /** Depth of Field algorithm
- *
- * Overview :
- * - Down-sample the color buffer into 2 buffers weighted with
- * CoC values. Also output CoC into a texture.
- * - Shoot quads for every pixel and expand it depending on the CoC.
- * Do one pass for near Dof and one pass for far Dof.
- * - Finally composite the 2 blurred buffers with the original render.
- */
- DRWShadingGroup *grp;
- struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
- const bool use_alpha = !DRW_state_draw_background();
-
- DRW_PASS_CREATE(psl->dof_down, DRW_STATE_WRITE_COLOR);
-
- grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_downsample_get(use_alpha),
- psl->dof_down);
- DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer);
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1);
- DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1);
- DRW_shgroup_call(grp, quad, NULL);
-
- DRW_PASS_CREATE(psl->dof_scatter, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL);
-
- /* This create an empty batch of N triangles to be positioned
- * by the vertex shader 0.4ms against 6ms with instancing */
- const float *viewport_size = DRW_viewport_size_get();
- const int sprite_len = ((int)viewport_size[0] / 2) *
- ((int)viewport_size[1] / 2); /* brackets matters */
- grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_scatter_get(use_alpha),
- psl->dof_scatter);
- DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", &effects->dof_down_near);
- DRW_shgroup_uniform_texture_ref(grp, "farBuffer", &effects->dof_down_far);
- DRW_shgroup_uniform_texture_ref(grp, "cocBuffer", &effects->dof_coc);
- DRW_shgroup_uniform_vec4(grp, "bokehParams", effects->dof_bokeh, 2);
+ void *owner = (void *)&EEVEE_depth_of_field_init;
+ const float *fullres = DRW_viewport_size_get();
+ int res[2] = {divide_ceil_u(fullres[0], 2), divide_ceil_u(fullres[1], 2)};
+
+ DRW_PASS_CREATE(psl->dof_setup, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_setup_get();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_setup);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->source_buffer, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "depthBuffer", &dtxl->depth, NO_FILTERING);
+ DRW_shgroup_uniform_vec4_copy(grp, "cocParams", fx->dof_coc_params);
+ DRW_shgroup_uniform_float_copy(grp, "bokehMaxSize", fx->dof_bokeh_max_size);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ fx->dof_half_res_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner);
+ fx->dof_half_res_coc_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_setup_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_half_res_color_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_half_res_coc_tx),
+ });
+}
+
+/**
+ * Outputs min & max COC in each 8x8 half res pixel tiles (so 1/16th of full resolution).
+ **/
+static void dof_flatten_tiles_pass_init(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_EffectsInfo *fx)
+{
+ void *owner = (void *)&EEVEE_depth_of_field_init;
+ const float *fullres = DRW_viewport_size_get();
+ int res[2] = {divide_ceil_u(fullres[0], DOF_TILE_DIVISOR),
+ divide_ceil_u(fullres[1], DOF_TILE_DIVISOR)};
+
+ DRW_PASS_CREATE(psl->dof_flatten_tiles, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_flatten_tiles_get();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_flatten_tiles);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "halfResCocBuffer", &fx->dof_half_res_coc_tx, NO_FILTERING);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ fx->dof_coc_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner);
+ fx->dof_coc_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_flatten_tiles_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_coc_tiles_fg_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_coc_tiles_bg_tx),
+ });
+}
+
+/**
+ * Dilates the min & max COCS to cover maximum COC values.
+ * Output format/dimensions should be the same as coc_flatten_pass as they are swapped for
+ * doing multiple dilation passes.
+ **/
+static void dof_dilate_tiles_pass_init(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_EffectsInfo *fx)
+{
+ void *owner = (void *)&EEVEE_depth_of_field_init;
+ const float *fullres = DRW_viewport_size_get();
+ int res[2] = {divide_ceil_u(fullres[0], DOF_TILE_DIVISOR),
+ divide_ceil_u(fullres[1], DOF_TILE_DIVISOR)};
+
+ DRW_PASS_CREATE(psl->dof_dilate_tiles_minmax, DRW_STATE_WRITE_COLOR);
+ DRW_PASS_CREATE(psl->dof_dilate_tiles_minabs, DRW_STATE_WRITE_COLOR);
+
+ for (int pass = 0; pass < 2; pass++) {
+ DRWPass *drw_pass = (pass == 0) ? psl->dof_dilate_tiles_minmax : psl->dof_dilate_tiles_minabs;
+ GPUShader *sh = EEVEE_shaders_depth_of_field_dilate_tiles_get(pass);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, drw_pass);
+ DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_tiles_fg_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_tiles_bg_tx);
+ DRW_shgroup_uniform_bool(grp, "dilateSlightFocus", &fx->dof_dilate_slight_focus, 1);
+ DRW_shgroup_uniform_int(grp, "ringCount", &fx->dof_dilate_ring_count, 1);
+ DRW_shgroup_uniform_int(grp, "ringWidthMultiplier", &fx->dof_dilate_ring_width_multiplier, 1);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+ }
+
+ fx->dof_coc_dilated_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner);
+ fx->dof_coc_dilated_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_dilate_tiles_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_coc_dilated_tiles_fg_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_coc_dilated_tiles_bg_tx),
+ });
+}
+
+static void dof_dilate_tiles_pass_draw(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_EffectsInfo *fx)
+{
+ for (int pass = 0; pass < 2; pass++) {
+ DRWPass *drw_pass = (pass == 0) ? psl->dof_dilate_tiles_minmax : psl->dof_dilate_tiles_minabs;
+
+ /* Error introduced by gather center jittering. */
+ const float error_multiplier = 1.0f + 1.0f / (DOF_GATHER_RING_COUNT + 0.5f);
+ int dilation_end_radius = ceilf((fx->dof_fx_max_coc * error_multiplier) / DOF_TILE_DIVISOR);
+
+ /* This algorithm produce the exact dilation radius by dividing it in multiple passes. */
+ int dilation_radius = 0;
+ while (dilation_radius < dilation_end_radius) {
+ /* Dilate slight focus only on first iteration. */
+ fx->dof_dilate_slight_focus = (dilation_radius == 0) ? 1 : 0;
- DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_len);
+ int remainder = dilation_end_radius - dilation_radius;
+ /* Do not step over any unvisited tile. */
+ int max_multiplier = dilation_radius + 1;
- DRW_PASS_CREATE(psl->dof_resolve, DRW_STATE_WRITE_COLOR);
+ int ring_count = min_ii(DOF_DILATE_RING_COUNT, ceilf(remainder / (float)max_multiplier));
+ int multiplier = min_ii(max_multiplier, floor(remainder / (float)ring_count));
- grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_resolve_get(use_alpha),
- psl->dof_resolve);
- DRW_shgroup_uniform_texture_ref(grp, "scatterBuffer", &effects->dof_blur);
- DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer);
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1);
- DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1);
- DRW_shgroup_call(grp, quad, NULL);
+ dilation_radius += ring_count * multiplier;
- if (use_alpha) {
- DRW_shgroup_uniform_texture_ref(grp, "scatterAlphaBuffer", &effects->dof_blur_alpha);
- DRW_shgroup_uniform_bool_copy(grp, "unpremult", DRW_state_is_image_render());
+ fx->dof_dilate_ring_count = ring_count;
+ fx->dof_dilate_ring_width_multiplier = multiplier;
+
+ GPU_framebuffer_bind(fbl->dof_dilate_tiles_fb);
+ DRW_draw_pass(drw_pass);
+
+ SWAP(GPUFrameBuffer *, fbl->dof_dilate_tiles_fb, fbl->dof_flatten_tiles_fb);
+ SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_bg_tx, fx->dof_coc_tiles_bg_tx);
+ SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_fg_tx, fx->dof_coc_tiles_fg_tx);
+ }
+ }
+ /* Swap again so that final textures are dof_coc_dilated_tiles_*_tx. */
+ SWAP(GPUFrameBuffer *, fbl->dof_dilate_tiles_fb, fbl->dof_flatten_tiles_fb);
+ SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_bg_tx, fx->dof_coc_tiles_bg_tx);
+ SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_fg_tx, fx->dof_coc_tiles_fg_tx);
+}
+
+/**
+ * Create mipmapped color & COC textures for gather passes.
+ **/
+static void dof_reduce_pass_init(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_TextureList *txl,
+ EEVEE_EffectsInfo *fx)
+{
+ const float *fullres = DRW_viewport_size_get();
+
+ /* Divide by 2 because dof_fx_max_coc is in fullres CoC radius and the reduce texture begins at
+ * half resolution. */
+ float max_space_between_sample = fx->dof_fx_max_coc * 0.5f / DOF_GATHER_RING_COUNT;
+
+ int mip_count = max_ii(1, log2_ceil_u(max_space_between_sample));
+
+ fx->dof_reduce_steps = mip_count - 1;
+ /* This ensure the mipmaps are aligned for the needed 4 mip levels.
+ * Starts at 2 because already at half resolution. */
+ int multiple = 2 << (mip_count - 1);
+ int res[2] = {(multiple * divide_ceil_u(fullres[0], multiple)) / 2,
+ (multiple * divide_ceil_u(fullres[1], multiple)) / 2};
+
+ int quater_res[2] = {divide_ceil_u(fullres[0], 4), divide_ceil_u(fullres[1], 4)};
+
+ /* TODO(fclem): Make this dependent of the quality of the gather pass. */
+ fx->dof_scatter_coc_threshold = 4.0f;
+
+ {
+ DRW_PASS_CREATE(psl->dof_downsample, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_downsample_get();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_downsample);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ void *owner = (void *)&EEVEE_depth_of_field_init;
+ fx->dof_downsample_tx = DRW_texture_pool_query_2d(UNPACK2(quater_res), COLOR_FORMAT, owner);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_downsample_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_downsample_tx),
+ });
+ }
+
+ {
+ DRW_PASS_CREATE(psl->dof_reduce_copy, DRW_STATE_WRITE_COLOR);
+
+ const bool is_copy_pass = true;
+ GPUShader *sh = EEVEE_shaders_depth_of_field_reduce_get(is_copy_pass);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_reduce_copy);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "downsampledBuffer", &fx->dof_downsample_tx, NO_FILTERING);
+ DRW_shgroup_uniform_float_copy(grp, "scatterColorThreshold", fx->dof_scatter_color_threshold);
+ DRW_shgroup_uniform_float_copy(
+ grp, "scatterColorNeighborMax", fx->dof_scatter_neighbor_max_color);
+ DRW_shgroup_uniform_float_copy(grp, "scatterCocThreshold", fx->dof_scatter_coc_threshold);
+ DRW_shgroup_uniform_float_copy(grp, "colorNeighborClamping", fx->dof_denoise_factor);
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ void *owner = (void *)&EEVEE_depth_of_field_init;
+ fx->dof_scatter_src_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R11F_G11F_B10F, owner);
+ }
+
+ {
+ DRW_PASS_CREATE(psl->dof_reduce, DRW_STATE_WRITE_COLOR);
+
+ const bool is_copy_pass = false;
+ GPUShader *sh = EEVEE_shaders_depth_of_field_reduce_get(is_copy_pass);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_reduce);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+ }
+
+ if (txl->dof_reduced_color) {
+ /* TODO(fclem) In the future, we need to check if mip_count did not change.
+ * For now it's ok as we always define all mip level.*/
+ if (res[0] != GPU_texture_width(txl->dof_reduced_color) ||
+ res[1] != GPU_texture_width(txl->dof_reduced_color)) {
+ DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_color);
+ DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_coc);
+ }
+ }
+
+ if (txl->dof_reduced_color == NULL) {
+ /* Color needs to be signed format here. See note in shader for explanation. */
+ /* Do not use texture pool because of needs mipmaps. */
+ txl->dof_reduced_color = GPU_texture_create_2d(
+ "dof_reduced_color", UNPACK2(res), mip_count, GPU_RGBA16F, NULL);
+ txl->dof_reduced_coc = GPU_texture_create_2d(
+ "dof_reduced_coc", UNPACK2(res), mip_count, GPU_R16F, NULL);
+
+ /* TODO(fclem) Remove once we have immutable storage or when mips are generated on creation. */
+ GPU_texture_generate_mipmap(txl->dof_reduced_color);
+ GPU_texture_generate_mipmap(txl->dof_reduced_coc);
+ }
+
+ GPU_framebuffer_ensure_config(&fbl->dof_reduce_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_color),
+ GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_coc),
+ });
+
+ GPU_framebuffer_ensure_config(&fbl->dof_reduce_copy_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_color),
+ GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_coc),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_scatter_src_tx),
+ });
+}
+
+/**
+ * Do the gather convolution. For each pixels we gather multiple pixels in its neighborhood
+ * depending on the min & max CoC tiles.
+ **/
+static void dof_gather_pass_init(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_TextureList *txl,
+ EEVEE_EffectsInfo *fx)
+{
+ void *owner = (void *)&EEVEE_depth_of_field_init;
+ const float *fullres = DRW_viewport_size_get();
+ int res[2] = {divide_ceil_u(fullres[0], 2), divide_ceil_u(fullres[1], 2)};
+ int input_size[2];
+ GPU_texture_get_mipmap_size(txl->dof_reduced_color, 0, input_size);
+ float uv_correction_fac[2] = {res[0] / (float)input_size[0], res[1] / (float)input_size[1]};
+ float output_texel_size[2] = {1.0f / res[0], 1.0f / res[1]};
+ const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL);
+
+ {
+ DRW_PASS_CREATE(psl->dof_gather_fg_holefill, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, false);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_fg_holefill);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx);
+ DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
+ DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac);
+ DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ /* Reuse textures from the setup pass. */
+ /* NOTE: We could use the texture pool do that for us but it does not track usage and it might
+ * backfire (it does in practice). */
+ fx->dof_fg_holefill_color_tx = fx->dof_half_res_color_tx;
+ fx->dof_fg_holefill_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_gather_fg_holefill_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx),
+ });
+ }
+ {
+ DRW_PASS_CREATE(psl->dof_gather_fg, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, use_bokeh_tx);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_fg);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx);
+ DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
+ DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac);
+ DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size);
+ if (use_bokeh_tx) {
+ /* Negate to flip bokeh shape. Mimics optical phenomenon. */
+ negate_v2(fx->dof_bokeh_aniso);
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso);
+ DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_gather_lut_tx);
+ /* Restore. */
+ negate_v2(fx->dof_bokeh_aniso);
+ }
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ fx->dof_fg_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner);
+ fx->dof_fg_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner);
+ /* Reuse textures from the setup pass. */
+ /* NOTE: We could use the texture pool do that for us but it does not track usage and it might
+ * backfire (it does in practice). */
+ fx->dof_fg_occlusion_tx = fx->dof_half_res_coc_tx;
+
+ /* NOTE: First target is holefill texture so we can use the median filter on it.
+ * See the filter function. */
+ GPU_framebuffer_ensure_config(&fbl->dof_gather_fg_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_occlusion_tx),
+ });
+ }
+ {
+ DRW_PASS_CREATE(psl->dof_gather_bg, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, use_bokeh_tx);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_bg);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx);
+ DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
+ DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac);
+ DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size);
+ if (use_bokeh_tx) {
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso);
+ DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_gather_lut_tx);
+ }
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ fx->dof_bg_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner);
+ fx->dof_bg_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner);
+ /* Reuse, since only used for scatter. Foreground is processed before background. */
+ fx->dof_bg_occlusion_tx = fx->dof_fg_occlusion_tx;
+
+ /* NOTE: First target is holefill texture so we can use the median filter on it.
+ * See the filter function. */
+ GPU_framebuffer_ensure_config(&fbl->dof_gather_bg_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_bg_occlusion_tx),
+ });
+ }
+}
+
+/**
+ * Filter an input buffer using a median filter to reduce noise.
+ * NOTE: We use the holefill texture as our input to reduce memory usage.
+ * Thus, the holefill pass cannot be filtered.
+ **/
+static void dof_filter_pass_init(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_EffectsInfo *fx)
+{
+ DRW_PASS_CREATE(psl->dof_filter, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_filter_get();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_filter);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "colorBuffer", &fx->dof_fg_holefill_color_tx, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(
+ grp, "weightBuffer", &fx->dof_fg_holefill_weight_tx, NO_FILTERING);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_filter_fg_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_color_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_weight_tx),
+ });
+
+ GPU_framebuffer_ensure_config(&fbl->dof_filter_bg_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_bg_color_tx),
+ GPU_ATTACHMENT_TEXTURE(fx->dof_bg_weight_tx),
+ });
+}
+
+/**
+ * Do the Scatter convolution. A sprite is emitted for every 4 pixels but is only expanded if the
+ * pixels are bright enough to be scattered.
+ **/
+static void dof_scatter_pass_init(EEVEE_FramebufferList *fbl,
+ EEVEE_PassList *psl,
+ EEVEE_TextureList *txl,
+ EEVEE_EffectsInfo *fx)
+{
+ int input_size[2], target_size[2];
+ GPU_texture_get_mipmap_size(fx->dof_half_res_color_tx, 0, input_size);
+ GPU_texture_get_mipmap_size(fx->dof_bg_color_tx, 0, target_size);
+ /* Draw a sprite for every four halfres pixels. */
+ int sprite_count = (input_size[0] / 2) * (input_size[1] / 2);
+ float target_texel_size[2] = {1.0f / target_size[0], 1.0f / target_size[1]};
+ const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL);
+
+ {
+ DRW_PASS_CREATE(psl->dof_scatter_fg, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL);
+
+ const bool is_foreground = true;
+ GPUShader *sh = EEVEE_shaders_depth_of_field_scatter_get(is_foreground, use_bokeh_tx);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_scatter_fg);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->dof_scatter_src_tx, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref(grp, "occlusionBuffer", &fx->dof_fg_occlusion_tx);
+ DRW_shgroup_uniform_vec2_copy(grp, "targetTexelSize", target_texel_size);
+ DRW_shgroup_uniform_int_copy(grp, "spritePerRow", input_size[0] / 2);
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso);
+ if (use_bokeh_tx) {
+ /* Negate to flip bokeh shape. Mimics optical phenomenon. */
+ negate_v2(fx->dof_bokeh_aniso_inv);
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv);
+ DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_scatter_lut_tx);
+ /* Restore. */
+ negate_v2(fx->dof_bokeh_aniso_inv);
+ }
+ DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_count);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_scatter_fg_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_fg_color_tx),
+ });
+ }
+ {
+ DRW_PASS_CREATE(psl->dof_scatter_bg, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL);
+
+ const bool is_foreground = false;
+ GPUShader *sh = EEVEE_shaders_depth_of_field_scatter_get(is_foreground, use_bokeh_tx);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_scatter_bg);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->dof_scatter_src_tx, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref(grp, "occlusionBuffer", &fx->dof_bg_occlusion_tx);
+ DRW_shgroup_uniform_vec2_copy(grp, "targetTexelSize", target_texel_size);
+ DRW_shgroup_uniform_int_copy(grp, "spritePerRow", input_size[0] / 2);
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso);
+ if (use_bokeh_tx) {
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv);
+ DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_scatter_lut_tx);
}
+ DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_count);
+
+ GPU_framebuffer_ensure_config(&fbl->dof_scatter_bg_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(fx->dof_bg_color_tx),
+ });
+ }
+}
+
+/**
+ * Recombine the result of the foreground and background processing. Also perform a slight out of
+ * focus blur to improve geometric continuity.
+ **/
+static void dof_recombine_pass_init(EEVEE_FramebufferList *UNUSED(fbl),
+ EEVEE_PassList *psl,
+ EEVEE_EffectsInfo *fx)
+{
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL);
+
+ DRW_PASS_CREATE(psl->dof_resolve, DRW_STATE_WRITE_COLOR);
+
+ GPUShader *sh = EEVEE_shaders_depth_of_field_resolve_get(use_bokeh_tx, fx->dof_hq_slight_focus);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_resolve);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "fullResColorBuffer", &fx->source_buffer, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref_ex(grp, "fullResDepthBuffer", &dtxl->depth, NO_FILTERING);
+ DRW_shgroup_uniform_texture_ref(grp, "bgColorBuffer", &fx->dof_bg_color_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "bgWeightBuffer", &fx->dof_bg_weight_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "bgTileBuffer", &fx->dof_coc_dilated_tiles_bg_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "fgColorBuffer", &fx->dof_fg_color_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "fgWeightBuffer", &fx->dof_fg_weight_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "holefillColorBuffer", &fx->dof_fg_holefill_color_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "holefillWeightBuffer", &fx->dof_fg_holefill_weight_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "fgTileBuffer", &fx->dof_coc_dilated_tiles_fg_tx);
+ DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
+ DRW_shgroup_uniform_vec4_copy(grp, "cocParams", fx->dof_coc_params);
+ DRW_shgroup_uniform_float_copy(grp, "bokehMaxSize", fx->dof_bokeh_max_size);
+ if (use_bokeh_tx) {
+ DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv);
+ DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_resolve_lut_tx);
+ }
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+}
+
+void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
+{
+ EEVEE_TextureList *txl = vedata->txl;
+ EEVEE_FramebufferList *fbl = vedata->fbl;
+ EEVEE_PassList *psl = vedata->psl;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_EffectsInfo *fx = stl->effects;
+
+ if ((fx->enabled_effects & EFFECT_DOF) != 0) {
+ /* GPU_RGBA16F is sufficient now that all scattered bokeh are premultiplied.
+ * GPU_R11F_G11F_B10F is not enough when lots of scattered sprites are big and offers
+ * relatively small benefits. */
+ fx->dof_color_format = GPU_RGBA16F;
+
+ dof_bokeh_pass_init(fbl, psl, fx);
+ dof_setup_pass_init(fbl, psl, fx);
+ dof_flatten_tiles_pass_init(fbl, psl, fx);
+ dof_dilate_tiles_pass_init(fbl, psl, fx);
+ dof_reduce_pass_init(fbl, psl, txl, fx);
+ dof_gather_pass_init(fbl, psl, txl, fx);
+ dof_filter_pass_init(fbl, psl, fx);
+ dof_scatter_pass_init(fbl, psl, txl, fx);
+ dof_recombine_pass_init(fbl, psl, fx);
}
}
+static void dof_recursive_reduce(void *vedata, int UNUSED(level))
+{
+ EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
+ EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl;
+ EEVEE_EffectsInfo *fx = ((EEVEE_Data *)vedata)->stl->effects;
+
+ fx->dof_reduce_input_color_tx = txl->dof_reduced_color;
+ fx->dof_reduce_input_coc_tx = txl->dof_reduced_coc;
+
+ DRW_draw_pass(psl->dof_reduce);
+}
+
void EEVEE_depth_of_field_draw(EEVEE_Data *vedata)
{
EEVEE_PassList *psl = vedata->psl;
EEVEE_TextureList *txl = vedata->txl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_StorageList *stl = vedata->stl;
- EEVEE_EffectsInfo *effects = stl->effects;
+ EEVEE_EffectsInfo *effects = stl->effects; /* TODO(fclem): Because of silly SWAP_BUFFERS. */
+ EEVEE_EffectsInfo *fx = effects;
/* Depth Of Field */
if ((effects->enabled_effects & EFFECT_DOF) != 0) {
- const float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ DRW_stats_group_start("Depth of Field");
+
+ if (fx->dof_bokeh_gather_lut_tx != NULL) {
+ GPU_framebuffer_bind(fbl->dof_bokeh_fb);
+ DRW_draw_pass(psl->dof_bokeh);
+ }
+
+ GPU_framebuffer_bind(fbl->dof_setup_fb);
+ DRW_draw_pass(psl->dof_setup);
+
+ GPU_framebuffer_bind(fbl->dof_flatten_tiles_fb);
+ DRW_draw_pass(psl->dof_flatten_tiles);
- /* Downsample */
- GPU_framebuffer_bind(fbl->dof_down_fb);
- DRW_draw_pass(psl->dof_down);
+ dof_dilate_tiles_pass_draw(fbl, psl, fx);
- /* Scatter */
- GPU_framebuffer_bind(fbl->dof_scatter_fb);
- GPU_framebuffer_clear_color(fbl->dof_scatter_fb, clear_col);
- DRW_draw_pass(psl->dof_scatter);
+ fx->dof_reduce_input_color_tx = fx->dof_half_res_color_tx;
+ fx->dof_reduce_input_coc_tx = fx->dof_half_res_coc_tx;
- /* Resolve */
- GPU_framebuffer_bind(effects->target_buffer);
+ /* First step is just a copy. */
+ GPU_framebuffer_bind(fbl->dof_downsample_fb);
+ DRW_draw_pass(psl->dof_downsample);
+
+ /* First step is just a copy. */
+ GPU_framebuffer_bind(fbl->dof_reduce_copy_fb);
+ DRW_draw_pass(psl->dof_reduce_copy);
+
+ GPU_framebuffer_recursive_downsample(
+ fbl->dof_reduce_fb, fx->dof_reduce_steps, &dof_recursive_reduce, vedata);
+
+ {
+ /* Foreground convolution. */
+ GPU_framebuffer_bind(fbl->dof_gather_fg_fb);
+ DRW_draw_pass(psl->dof_gather_fg);
+
+ GPU_framebuffer_bind(fbl->dof_filter_fg_fb);
+ DRW_draw_pass(psl->dof_filter);
+
+ GPU_framebuffer_bind(fbl->dof_scatter_fg_fb);
+ DRW_draw_pass(psl->dof_scatter_fg);
+ }
+
+ {
+ /* Background convolution. */
+ GPU_framebuffer_bind(fbl->dof_gather_bg_fb);
+ DRW_draw_pass(psl->dof_gather_bg);
+
+ GPU_framebuffer_bind(fbl->dof_filter_bg_fb);
+ DRW_draw_pass(psl->dof_filter);
+
+ GPU_framebuffer_bind(fbl->dof_scatter_bg_fb);
+ DRW_draw_pass(psl->dof_scatter_bg);
+ }
+
+ {
+ /* Hole-fill convolution. */
+ GPU_framebuffer_bind(fbl->dof_gather_fg_holefill_fb);
+ DRW_draw_pass(psl->dof_gather_fg_holefill);
+
+ /* NOTE: do not filter the hole-fill pass as we use it as out filter input buffer. */
+ }
+
+ GPU_framebuffer_bind(fx->target_buffer);
DRW_draw_pass(psl->dof_resolve);
+
SWAP_BUFFERS();
+
+ DRW_stats_group_end();
}
}
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index ca583143572..18d3e453c5d 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -102,11 +102,9 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata,
effects->enabled_effects |= EEVEE_occlusion_init(sldata, vedata);
effects->enabled_effects |= EEVEE_screen_raytrace_init(sldata, vedata);
- if ((effects->enabled_effects & EFFECT_TAA) && effects->taa_current_sample > 1) {
- /* Update matrices here because EEVEE_screen_raytrace_init can have reset the
- * taa_current_sample. (See T66811) */
- EEVEE_temporal_sampling_update_matrices(vedata);
- }
+ /* Update matrices here because EEVEE_screen_raytrace_init can have reset the
+ * taa_current_sample. (See T66811) */
+ EEVEE_temporal_sampling_update_matrices(vedata);
EEVEE_volumes_init(sldata, vedata);
EEVEE_subsurface_init(sldata, vedata);
@@ -242,7 +240,7 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
}
{
- /* Perform min/max downsample */
+ /* Perform min/max down-sample. */
DRW_PASS_CREATE(psl->maxz_downlevel_ps, downsample_write | DRW_STATE_DEPTH_ALWAYS);
grp = DRW_shgroup_create(EEVEE_shaders_effect_maxz_downlevel_sh_get(), psl->maxz_downlevel_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &txl->maxzbuffer);
@@ -519,7 +517,7 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
DRW_viewport_request_redraw();
}
- /* Record pers matrix for the next frame. */
+ /* Record perspective matrix for the next frame. */
DRW_view_persmat_get(effects->taa_view, effects->prev_persmat, false);
/* Update double buffer status if render mode. */
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index c6760de5cfa..582bfad323b 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -66,6 +66,7 @@ static void eevee_engine_init(void *ved)
stl->g_data->valid_double_buffer = (txl->color_double_buffer != NULL);
stl->g_data->valid_taa_history = (txl->taa_history != NULL);
stl->g_data->queued_shaders_count = 0;
+ stl->g_data->render_timesteps = 1;
/* Main Buffer */
DRW_texture_ensure_fullscreen_2d(&txl->color, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
@@ -319,7 +320,7 @@ static void eevee_draw_scene(void *vedata)
EEVEE_renderpasses_output_accumulate(sldata, vedata, false);
/* Transparent */
- /* TODO(fclem): should be its own Framebuffer.
+ /* TODO(fclem): should be its own Frame-buffer.
* This is needed because dualsource blending only works with 1 color buffer. */
GPU_framebuffer_texture_attach(fbl->main_color_fb, dtxl->depth, 0, 0);
GPU_framebuffer_bind(fbl->main_color_fb);
@@ -456,13 +457,17 @@ static void eevee_render_to_image(void *vedata,
}
EEVEE_PrivateData *g_data = ved->stl->g_data;
- EEVEE_render_modules_init(vedata, engine, depsgraph);
-
int initial_frame = CFRA;
float initial_subframe = SUBFRA;
float shuttertime = (do_motion_blur) ? scene->eevee.motion_blur_shutter : 0.0f;
int time_steps_tot = (do_motion_blur) ? max_ii(1, scene->eevee.motion_blur_steps) : 1;
- g_data->render_tot_samples = divide_ceil_u(scene->eevee.taa_render_samples, time_steps_tot);
+ g_data->render_timesteps = time_steps_tot;
+
+ EEVEE_render_modules_init(vedata, engine, depsgraph);
+
+ g_data->render_sample_count_per_timestep = EEVEE_temporal_sampling_sample_count_get(scene,
+ ved->stl);
+
/* Compute start time. The motion blur will cover `[time ...time + shuttertime]`. */
float time = initial_frame + initial_subframe;
switch (scene->eevee.motion_blur_position) {
@@ -553,7 +558,8 @@ static void eevee_render_to_image(void *vedata,
/* Actual drawing. */
{
- EEVEE_renderpasses_output_init(sldata, vedata, g_data->render_tot_samples * time_steps_tot);
+ EEVEE_renderpasses_output_init(
+ sldata, vedata, g_data->render_sample_count_per_timestep * time_steps_tot);
EEVEE_temporal_sampling_create_view(vedata);
EEVEE_render_draw(vedata, engine, render_layer, rect);
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 040aa8c8d9c..145fddf62a0 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -99,9 +99,9 @@ typedef struct EEVEE_LightBake {
GPUTexture *rt_color;
/** Target cube depth texture. */
GPUTexture *rt_depth;
- /** Target cube framebuffers. */
+ /** Target cube frame-buffers. */
GPUFrameBuffer *rt_fb[6];
- /** Storage framebuffer. */
+ /** Storage frame-buffer. */
GPUFrameBuffer *store_fb;
/** Cube render target resolution. */
int rt_res;
@@ -135,7 +135,7 @@ typedef struct EEVEE_LightBake {
int grid_curr;
/** The current light bounce being evaluated. */
int bounce_curr, bounce_len;
- /** Resolution of the Visibility shadowmap. */
+ /** Resolution of the Visibility shadow-map. */
float vis_res;
/** Result of previous light bounce. */
GPUTexture *grid_prev;
@@ -163,7 +163,7 @@ typedef struct EEVEE_LightBake {
/** For only handling the resources. */
bool resource_only;
bool own_resources;
- /** If the lightcache was created for baking, it's first owned by the baker. */
+ /** If the light-cache was created for baking, it's first owned by the baker. */
bool own_light_cache;
/** ms. delay the start of the baking to not slowdown interactions (TODO remove) */
int delay;
@@ -403,7 +403,7 @@ static bool eevee_lightcache_static_load(LightCache *lcache)
if (lcache->grid_tx.tex == NULL) {
lcache->grid_tx.tex = GPU_texture_create_2d_array(
"lightcache_irradiance", UNPACK3(lcache->grid_tx.tex_size), 1, IRRADIANCE_FORMAT, NULL);
- GPU_texture_update(lcache->grid_tx.tex, GPU_DATA_UNSIGNED_BYTE, lcache->grid_tx.data);
+ GPU_texture_update(lcache->grid_tx.tex, GPU_DATA_UBYTE, lcache->grid_tx.data);
if (lcache->grid_tx.tex == NULL) {
lcache->flag |= LIGHTCACHE_NOT_USABLE;
@@ -470,7 +470,7 @@ bool EEVEE_lightcache_load(LightCache *lcache)
static void eevee_lightbake_readback_irradiance(LightCache *lcache)
{
MEM_SAFE_FREE(lcache->grid_tx.data);
- lcache->grid_tx.data = GPU_texture_read(lcache->grid_tx.tex, GPU_DATA_UNSIGNED_BYTE, 0);
+ lcache->grid_tx.data = GPU_texture_read(lcache->grid_tx.tex, GPU_DATA_UBYTE, 0);
lcache->grid_tx.data_type = LIGHTCACHETEX_BYTE;
lcache->grid_tx.components = 4;
}
@@ -907,13 +907,14 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb
Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
lbake->sldata = sldata;
- /* Disable all effects BUT high bitdepth shadows. */
+ /* Disable all effects BUT high bit-depth shadows. */
scene_eval->eevee.flag &= SCE_EEVEE_SHADOW_HIGH_BITDEPTH;
scene_eval->eevee.taa_samples = 1;
scene_eval->eevee.gi_irradiance_smoothing = 0.0f;
stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
stl->g_data->background_alpha = 1.0f;
+ stl->g_data->render_timesteps = 1;
/* XXX TODO remove this. This is in order to make the init functions work. */
if (DRW_view_default_get() == NULL) {
@@ -980,7 +981,7 @@ static void eevee_lightbake_copy_irradiance(EEVEE_LightBake *lbake, LightCache *
{
DRW_TEXTURE_FREE_SAFE(lbake->grid_prev);
- /* Copy texture by reading back and reuploading it. */
+ /* Copy texture by reading back and re-uploading it. */
float *tex = GPU_texture_read(lcache->grid_tx.tex, GPU_DATA_FLOAT, 0);
lbake->grid_prev = DRW_texture_create_2d_array(lbake->irr_size[0],
lbake->irr_size[1],
@@ -1330,7 +1331,7 @@ void EEVEE_lightbake_update(void *custom_data)
EEVEE_LightBake *lbake = (EEVEE_LightBake *)custom_data;
Scene *scene_orig = lbake->scene;
- /* If a new lightcache was created, free the old one and reference the new. */
+ /* If a new light-cache was created, free the old one and reference the new. */
if (lbake->lcache && scene_orig->eevee.light_cache_data != lbake->lcache) {
if (scene_orig->eevee.light_cache_data != NULL) {
EEVEE_lightcache_free(scene_orig->eevee.light_cache_data);
@@ -1353,7 +1354,7 @@ static bool lightbake_do_sample(EEVEE_LightBake *lbake,
Depsgraph *depsgraph = lbake->depsgraph;
- /* TODO: make DRW manager instanciable (and only lock on drawing) */
+ /* TODO: make DRW manager instantiable (and only lock on drawing) */
eevee_lightbake_context_enable(lbake);
DRW_custom_pipeline(&draw_engine_eevee_type, depsgraph, render_callback, lbake);
lbake->done += 1;
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 3671bea9ac0..7688039d0a8 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -704,11 +704,11 @@ static void lightbake_planar_ensure_view(EEVEE_PlanarReflection *eplanar,
static void eevee_lightprobes_extract_from_cache(EEVEE_LightProbesInfo *pinfo, LightCache *lcache)
{
/* copy the entire cache for now (up to MAX_PROBE) */
- /* TODO Frutum cull to only add visible probes. */
+ /* TODO: frustum cull to only add visible probes. */
memcpy(pinfo->probe_data,
lcache->cube_data,
sizeof(EEVEE_LightProbe) * max_ii(1, min_ii(lcache->cube_len, MAX_PROBE)));
- /* TODO compute the max number of grid based on sample count. */
+ /* TODO: compute the max number of grid based on sample count. */
memcpy(pinfo->grid_data,
lcache->grid_data,
sizeof(EEVEE_LightGrid) * max_ii(1, min_ii(lcache->grid_len, MAX_GRID)));
@@ -1040,8 +1040,10 @@ void EEVEE_lightbake_filter_glossy(EEVEE_ViewLayerData *sldata,
pinfo->padding_size *= pinfo->texel_size;
pinfo->layer = probe_idx * 6;
pinfo->roughness = i / (float)maxlevel;
- pinfo->roughness *= pinfo->roughness; /* Disney Roughness */
- pinfo->roughness *= pinfo->roughness; /* Distribute Roughness accros lod more evenly */
+ /* Disney Roughness */
+ pinfo->roughness = square_f(pinfo->roughness);
+ /* Distribute Roughness across lod more evenly */
+ pinfo->roughness = square_f(square_f(pinfo->roughness));
CLAMP(pinfo->roughness, 1e-8f, 0.99999f); /* Avoid artifacts */
#if 1 /* Variable Sample count and bias (fast) */
diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c
index 628941f68a2..a9998b33b7e 100644
--- a/source/blender/draw/engines/eevee/eevee_lookdev.c
+++ b/source/blender/draw/engines/eevee/eevee_lookdev.c
@@ -344,7 +344,7 @@ void EEVEE_lookdev_draw(EEVEE_Data *vedata)
DRW_view_set_active(effects->lookdev_view);
- /* Find the right framebuffers to render to. */
+ /* Find the right frame-buffers to render to. */
GPUFrameBuffer *fb = (effects->target_buffer == fbl->effect_color_fb) ? fbl->main_fb :
fbl->effect_fb;
diff --git a/source/blender/draw/engines/eevee/eevee_lut.c b/source/blender/draw/engines/eevee/eevee_lut.c
index b380269db99..27ce66ebec7 100644
--- a/source/blender/draw/engines/eevee/eevee_lut.c
+++ b/source/blender/draw/engines/eevee/eevee_lut.c
@@ -2988,1033 +2988,6 @@ const float ltc_mag_ggx[64 * 64 * 2] = {
0.932164, 0.047190,
};
-const float bsdf_split_sum_ggx[64 * 64 * 2] = {
- 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f,
- 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f,
- 0.999512f, 0.000000f, 0.999023f, 0.000001f, 0.999023f, 0.000001f, 0.998535f, 0.000001f,
- 0.998047f, 0.000001f, 0.997559f, 0.000002f, 0.997070f, 0.000003f, 0.996094f, 0.000004f,
- 0.994629f, 0.000004f, 0.993652f, 0.000006f, 0.991699f, 0.000007f, 0.989746f, 0.000008f,
- 0.987305f, 0.000010f, 0.984375f, 0.000012f, 0.980957f, 0.000013f, 0.977539f, 0.000016f,
- 0.973145f, 0.000018f, 0.967773f, 0.000020f, 0.961914f, 0.000023f, 0.955566f, 0.000025f,
- 0.947754f, 0.000028f, 0.939941f, 0.000031f, 0.930664f, 0.000033f, 0.920410f, 0.000036f,
- 0.909180f, 0.000039f, 0.896973f, 0.000042f, 0.884277f, 0.000044f, 0.870117f, 0.000047f,
- 0.854980f, 0.000049f, 0.838867f, 0.000051f, 0.821777f, 0.000053f, 0.803711f, 0.000055f,
- 0.785156f, 0.000057f, 0.765625f, 0.000058f, 0.745605f, 0.000059f, 0.724609f, 0.000060f,
- 0.703613f, 0.000061f, 0.681641f, 0.000061f, 0.659668f, 0.000061f, 0.637695f, 0.000061f,
- 0.615234f, 0.000061f, 0.592773f, 0.000060f, 0.570801f, 0.000060f, 0.548340f, 0.000059f,
- 0.526855f, 0.000058f, 0.504883f, 0.000057f, 0.483887f, 0.000055f, 0.462891f, 0.000054f,
- 0.442627f, 0.000053f, 0.422607f, 0.000051f, 0.403320f, 0.000050f, 0.384766f, 0.000048f,
- 0.366455f, 0.000046f, 0.348877f, 0.000045f, 0.332031f, 0.000043f, 0.315918f, 0.000041f,
- 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f,
- 0.999512f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f,
- 0.999512f, 0.000000f, 0.999023f, 0.000001f, 0.999023f, 0.000001f, 0.998535f, 0.000002f,
- 0.998047f, 0.000003f, 0.997559f, 0.000004f, 0.997070f, 0.000005f, 0.996094f, 0.000006f,
- 0.994629f, 0.000008f, 0.993164f, 0.000010f, 0.991699f, 0.000012f, 0.989746f, 0.000015f,
- 0.987305f, 0.000018f, 0.984375f, 0.000020f, 0.980957f, 0.000024f, 0.977051f, 0.000027f,
- 0.972168f, 0.000031f, 0.967285f, 0.000035f, 0.961426f, 0.000039f, 0.954590f, 0.000043f,
- 0.947266f, 0.000048f, 0.938965f, 0.000052f, 0.929199f, 0.000057f, 0.919434f, 0.000061f,
- 0.908203f, 0.000065f, 0.895996f, 0.000069f, 0.882812f, 0.000073f, 0.868652f, 0.000077f,
- 0.853027f, 0.000080f, 0.837402f, 0.000083f, 0.820312f, 0.000086f, 0.802246f, 0.000088f,
- 0.783691f, 0.000090f, 0.764160f, 0.000092f, 0.744141f, 0.000093f, 0.723633f, 0.000093f,
- 0.702637f, 0.000094f, 0.681152f, 0.000094f, 0.659180f, 0.000093f, 0.637207f, 0.000093f,
- 0.615234f, 0.000091f, 0.593262f, 0.000090f, 0.571289f, 0.000088f, 0.549316f, 0.000087f,
- 0.527344f, 0.000085f, 0.505859f, 0.000082f, 0.485107f, 0.000080f, 0.464355f, 0.000078f,
- 0.444336f, 0.000075f, 0.424561f, 0.000072f, 0.405273f, 0.000070f, 0.386719f, 0.000067f,
- 0.368652f, 0.000065f, 0.351318f, 0.000062f, 0.334473f, 0.000059f, 0.318115f, 0.000057f,
- 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f,
- 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000001f,
- 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999023f, 0.000002f, 0.998535f, 0.000004f,
- 0.998047f, 0.000005f, 0.997559f, 0.000007f, 0.997070f, 0.000009f, 0.996094f, 0.000011f,
- 0.994629f, 0.000013f, 0.993164f, 0.000017f, 0.991211f, 0.000020f, 0.989258f, 0.000024f,
- 0.986816f, 0.000028f, 0.983887f, 0.000033f, 0.980469f, 0.000038f, 0.976562f, 0.000043f,
- 0.971680f, 0.000049f, 0.966797f, 0.000055f, 0.960449f, 0.000062f, 0.953613f, 0.000068f,
- 0.946289f, 0.000075f, 0.937500f, 0.000081f, 0.928223f, 0.000088f, 0.917969f, 0.000094f,
- 0.906738f, 0.000100f, 0.894531f, 0.000106f, 0.880859f, 0.000111f, 0.866699f, 0.000116f,
- 0.851562f, 0.000120f, 0.835449f, 0.000124f, 0.818359f, 0.000127f, 0.800781f, 0.000130f,
- 0.782227f, 0.000132f, 0.762695f, 0.000134f, 0.742676f, 0.000134f, 0.722656f, 0.000135f,
- 0.701660f, 0.000134f, 0.680176f, 0.000133f, 0.658691f, 0.000132f, 0.636719f, 0.000130f,
- 0.615234f, 0.000128f, 0.593262f, 0.000125f, 0.571289f, 0.000123f, 0.549805f, 0.000119f,
- 0.528320f, 0.000116f, 0.507324f, 0.000112f, 0.486328f, 0.000109f, 0.466064f, 0.000105f,
- 0.446045f, 0.000101f, 0.426514f, 0.000097f, 0.407471f, 0.000093f, 0.388916f, 0.000089f,
- 0.370850f, 0.000085f, 0.353516f, 0.000082f, 0.336914f, 0.000078f, 0.320557f, 0.000074f,
- 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f,
- 1.000000f, 0.000000f, 1.000000f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000002f,
- 0.999512f, 0.000002f, 0.999023f, 0.000003f, 0.999023f, 0.000005f, 0.998535f, 0.000006f,
- 0.998535f, 0.000008f, 0.997559f, 0.000011f, 0.997070f, 0.000014f, 0.996094f, 0.000017f,
- 0.994629f, 0.000020f, 0.993164f, 0.000026f, 0.991211f, 0.000030f, 0.989258f, 0.000036f,
- 0.986816f, 0.000043f, 0.983398f, 0.000050f, 0.979980f, 0.000058f, 0.976074f, 0.000066f,
- 0.971191f, 0.000074f, 0.965820f, 0.000082f, 0.959961f, 0.000093f, 0.952637f, 0.000101f,
- 0.945312f, 0.000111f, 0.936523f, 0.000120f, 0.927246f, 0.000129f, 0.916504f, 0.000137f,
- 0.905273f, 0.000145f, 0.892578f, 0.000153f, 0.879395f, 0.000160f, 0.865234f, 0.000166f,
- 0.850098f, 0.000171f, 0.833984f, 0.000176f, 0.816895f, 0.000179f, 0.799316f, 0.000182f,
- 0.780762f, 0.000184f, 0.761230f, 0.000185f, 0.741699f, 0.000185f, 0.721191f, 0.000184f,
- 0.700684f, 0.000183f, 0.679688f, 0.000181f, 0.658203f, 0.000178f, 0.636719f, 0.000175f,
- 0.615234f, 0.000171f, 0.593262f, 0.000167f, 0.571777f, 0.000162f, 0.550293f, 0.000158f,
- 0.529297f, 0.000152f, 0.508301f, 0.000147f, 0.487793f, 0.000142f, 0.467529f, 0.000136f,
- 0.447754f, 0.000131f, 0.428223f, 0.000125f, 0.409424f, 0.000120f, 0.391113f, 0.000115f,
- 0.373291f, 0.000109f, 0.355957f, 0.000104f, 0.339355f, 0.000099f, 0.323242f, 0.000094f,
- 0.999512f, 0.000002f, 0.999512f, 0.000002f, 1.000000f, 0.000002f, 0.999512f, 0.000002f,
- 1.000000f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000003f,
- 0.999512f, 0.000004f, 0.999512f, 0.000005f, 0.999023f, 0.000007f, 0.998535f, 0.000010f,
- 0.998047f, 0.000012f, 0.997559f, 0.000017f, 0.996582f, 0.000020f, 0.995605f, 0.000025f,
- 0.994629f, 0.000032f, 0.993164f, 0.000038f, 0.991211f, 0.000047f, 0.988770f, 0.000055f,
- 0.986328f, 0.000063f, 0.983398f, 0.000074f, 0.979492f, 0.000085f, 0.975586f, 0.000095f,
- 0.970703f, 0.000108f, 0.965332f, 0.000121f, 0.958984f, 0.000132f, 0.952148f, 0.000145f,
- 0.944336f, 0.000157f, 0.935547f, 0.000170f, 0.925781f, 0.000181f, 0.915039f, 0.000192f,
- 0.903809f, 0.000203f, 0.891113f, 0.000212f, 0.877930f, 0.000220f, 0.863281f, 0.000227f,
- 0.848145f, 0.000234f, 0.832031f, 0.000239f, 0.814941f, 0.000242f, 0.797363f, 0.000245f,
- 0.778809f, 0.000247f, 0.759766f, 0.000247f, 0.740234f, 0.000246f, 0.720215f, 0.000244f,
- 0.699707f, 0.000241f, 0.678711f, 0.000237f, 0.657715f, 0.000233f, 0.636230f, 0.000228f,
- 0.614746f, 0.000222f, 0.593750f, 0.000216f, 0.572266f, 0.000209f, 0.551270f, 0.000202f,
- 0.530273f, 0.000195f, 0.509277f, 0.000187f, 0.489014f, 0.000180f, 0.468994f, 0.000172f,
- 0.449463f, 0.000165f, 0.430176f, 0.000157f, 0.411377f, 0.000150f, 0.393311f, 0.000143f,
- 0.375488f, 0.000136f, 0.358398f, 0.000129f, 0.341797f, 0.000123f, 0.325684f, 0.000116f,
- 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000005f,
- 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000006f, 0.999512f, 0.000007f,
- 0.999512f, 0.000008f, 0.999512f, 0.000011f, 0.999023f, 0.000013f, 0.998535f, 0.000015f,
- 0.998047f, 0.000019f, 0.997559f, 0.000026f, 0.996582f, 0.000033f, 0.995605f, 0.000040f,
- 0.994141f, 0.000047f, 0.993164f, 0.000058f, 0.991211f, 0.000069f, 0.988770f, 0.000080f,
- 0.985840f, 0.000093f, 0.982910f, 0.000106f, 0.979004f, 0.000121f, 0.975098f, 0.000137f,
- 0.970215f, 0.000153f, 0.964355f, 0.000169f, 0.958008f, 0.000186f, 0.951172f, 0.000201f,
- 0.943359f, 0.000218f, 0.934082f, 0.000233f, 0.924316f, 0.000248f, 0.914062f, 0.000262f,
- 0.902344f, 0.000275f, 0.889648f, 0.000286f, 0.875977f, 0.000295f, 0.861816f, 0.000304f,
- 0.846680f, 0.000311f, 0.830566f, 0.000316f, 0.813477f, 0.000319f, 0.795898f, 0.000321f,
- 0.777344f, 0.000322f, 0.758301f, 0.000320f, 0.739258f, 0.000318f, 0.719238f, 0.000314f,
- 0.698730f, 0.000309f, 0.678223f, 0.000303f, 0.657227f, 0.000296f, 0.636230f, 0.000288f,
- 0.614746f, 0.000280f, 0.593750f, 0.000271f, 0.572754f, 0.000262f, 0.551758f, 0.000252f,
- 0.531250f, 0.000243f, 0.510742f, 0.000233f, 0.490479f, 0.000223f, 0.470703f, 0.000213f,
- 0.451172f, 0.000203f, 0.432129f, 0.000194f, 0.413574f, 0.000184f, 0.395508f, 0.000175f,
- 0.377930f, 0.000166f, 0.360840f, 0.000157f, 0.344238f, 0.000149f, 0.328125f, 0.000141f,
- 0.999512f, 0.000011f, 0.999512f, 0.000011f, 0.999512f, 0.000011f, 0.999512f, 0.000011f,
- 0.999512f, 0.000011f, 0.999512f, 0.000012f, 0.999512f, 0.000014f, 0.999512f, 0.000015f,
- 0.999512f, 0.000017f, 0.999023f, 0.000020f, 0.998535f, 0.000022f, 0.998535f, 0.000028f,
- 0.998047f, 0.000034f, 0.997559f, 0.000042f, 0.996582f, 0.000050f, 0.995605f, 0.000060f,
- 0.994141f, 0.000072f, 0.992676f, 0.000084f, 0.990723f, 0.000099f, 0.988281f, 0.000115f,
- 0.985840f, 0.000133f, 0.982422f, 0.000150f, 0.978516f, 0.000171f, 0.974609f, 0.000191f,
- 0.969238f, 0.000211f, 0.963867f, 0.000232f, 0.957520f, 0.000253f, 0.950195f, 0.000274f,
- 0.941895f, 0.000294f, 0.933105f, 0.000314f, 0.922852f, 0.000332f, 0.912109f, 0.000348f,
- 0.900879f, 0.000363f, 0.888184f, 0.000377f, 0.874512f, 0.000387f, 0.859863f, 0.000397f,
- 0.844727f, 0.000404f, 0.828613f, 0.000408f, 0.811523f, 0.000411f, 0.793945f, 0.000412f,
- 0.775879f, 0.000411f, 0.756836f, 0.000407f, 0.737793f, 0.000403f, 0.717773f, 0.000396f,
- 0.697754f, 0.000389f, 0.677246f, 0.000380f, 0.656738f, 0.000370f, 0.635742f, 0.000359f,
- 0.614746f, 0.000347f, 0.594238f, 0.000335f, 0.573242f, 0.000323f, 0.552734f, 0.000310f,
- 0.532227f, 0.000297f, 0.511719f, 0.000284f, 0.491943f, 0.000272f, 0.472412f, 0.000259f,
- 0.453125f, 0.000246f, 0.434082f, 0.000234f, 0.415771f, 0.000222f, 0.397705f, 0.000211f,
- 0.380127f, 0.000199f, 0.363281f, 0.000189f, 0.346680f, 0.000178f, 0.330811f, 0.000168f,
- 0.999512f, 0.000022f, 0.999512f, 0.000022f, 0.999512f, 0.000022f, 0.999512f, 0.000022f,
- 0.999512f, 0.000023f, 0.999512f, 0.000025f, 0.999512f, 0.000024f, 0.999512f, 0.000028f,
- 0.999023f, 0.000030f, 0.999023f, 0.000035f, 0.999023f, 0.000040f, 0.998535f, 0.000046f,
- 0.998047f, 0.000056f, 0.997559f, 0.000063f, 0.996094f, 0.000077f, 0.995605f, 0.000089f,
- 0.994141f, 0.000106f, 0.992188f, 0.000123f, 0.990234f, 0.000143f, 0.987793f, 0.000163f,
- 0.985352f, 0.000185f, 0.981934f, 0.000211f, 0.978027f, 0.000236f, 0.973633f, 0.000261f,
- 0.968750f, 0.000288f, 0.962891f, 0.000314f, 0.956055f, 0.000341f, 0.949219f, 0.000366f,
- 0.940918f, 0.000391f, 0.931641f, 0.000414f, 0.921875f, 0.000436f, 0.910645f, 0.000455f,
- 0.898926f, 0.000471f, 0.886230f, 0.000487f, 0.872559f, 0.000499f, 0.858398f, 0.000509f,
- 0.842773f, 0.000515f, 0.826660f, 0.000518f, 0.810059f, 0.000520f, 0.792480f, 0.000519f,
- 0.774414f, 0.000515f, 0.755371f, 0.000509f, 0.736328f, 0.000501f, 0.716797f, 0.000492f,
- 0.696777f, 0.000480f, 0.676758f, 0.000468f, 0.656250f, 0.000454f, 0.635742f, 0.000439f,
- 0.615234f, 0.000424f, 0.594238f, 0.000408f, 0.573730f, 0.000392f, 0.553223f, 0.000375f,
- 0.533203f, 0.000359f, 0.513184f, 0.000342f, 0.493408f, 0.000326f, 0.474121f, 0.000310f,
- 0.455078f, 0.000294f, 0.436279f, 0.000279f, 0.417969f, 0.000264f, 0.400146f, 0.000250f,
- 0.382812f, 0.000237f, 0.365723f, 0.000223f, 0.349365f, 0.000211f, 0.333496f, 0.000199f,
- 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000042f,
- 0.999512f, 0.000042f, 0.999512f, 0.000044f, 0.999512f, 0.000046f, 0.999512f, 0.000049f,
- 0.999512f, 0.000054f, 0.999512f, 0.000059f, 0.999023f, 0.000065f, 0.998535f, 0.000076f,
- 0.998047f, 0.000087f, 0.997070f, 0.000098f, 0.996582f, 0.000117f, 0.995117f, 0.000135f,
- 0.993652f, 0.000152f, 0.992188f, 0.000176f, 0.989746f, 0.000201f, 0.987793f, 0.000228f,
- 0.984863f, 0.000256f, 0.981445f, 0.000286f, 0.977539f, 0.000318f, 0.973145f, 0.000352f,
- 0.967773f, 0.000384f, 0.961914f, 0.000417f, 0.955566f, 0.000451f, 0.947754f, 0.000481f,
- 0.939453f, 0.000510f, 0.930176f, 0.000537f, 0.919922f, 0.000563f, 0.909180f, 0.000585f,
- 0.897461f, 0.000604f, 0.884766f, 0.000620f, 0.871094f, 0.000632f, 0.856445f, 0.000641f,
- 0.841309f, 0.000647f, 0.825195f, 0.000648f, 0.808105f, 0.000648f, 0.790527f, 0.000643f,
- 0.772949f, 0.000637f, 0.754395f, 0.000627f, 0.735352f, 0.000615f, 0.715820f, 0.000601f,
- 0.695801f, 0.000585f, 0.675781f, 0.000568f, 0.655762f, 0.000550f, 0.635742f, 0.000530f,
- 0.615234f, 0.000510f, 0.594727f, 0.000490f, 0.574707f, 0.000469f, 0.554199f, 0.000448f,
- 0.534180f, 0.000428f, 0.514648f, 0.000407f, 0.495117f, 0.000387f, 0.475830f, 0.000367f,
- 0.456787f, 0.000348f, 0.438232f, 0.000329f, 0.420166f, 0.000311f, 0.402344f, 0.000294f,
- 0.385254f, 0.000277f, 0.368408f, 0.000262f, 0.352051f, 0.000246f, 0.336182f, 0.000232f,
- 0.999512f, 0.000072f, 0.999512f, 0.000072f, 0.999512f, 0.000072f, 0.999512f, 0.000072f,
- 0.999512f, 0.000073f, 0.999512f, 0.000076f, 0.999512f, 0.000078f, 0.999512f, 0.000082f,
- 0.999023f, 0.000086f, 0.999023f, 0.000095f, 0.998535f, 0.000102f, 0.998047f, 0.000116f,
- 0.998047f, 0.000131f, 0.997070f, 0.000147f, 0.996094f, 0.000167f, 0.995117f, 0.000195f,
- 0.993652f, 0.000219f, 0.991699f, 0.000246f, 0.989746f, 0.000278f, 0.987305f, 0.000315f,
- 0.984375f, 0.000350f, 0.980957f, 0.000385f, 0.976562f, 0.000427f, 0.972168f, 0.000467f,
- 0.967285f, 0.000509f, 0.960938f, 0.000548f, 0.954102f, 0.000587f, 0.946777f, 0.000623f,
- 0.937988f, 0.000657f, 0.928711f, 0.000690f, 0.918457f, 0.000718f, 0.907715f, 0.000741f,
- 0.895508f, 0.000762f, 0.882812f, 0.000778f, 0.869141f, 0.000791f, 0.854492f, 0.000798f,
- 0.839355f, 0.000802f, 0.823242f, 0.000801f, 0.806152f, 0.000796f, 0.789062f, 0.000788f,
- 0.770996f, 0.000777f, 0.752930f, 0.000762f, 0.733887f, 0.000745f, 0.714844f, 0.000726f,
- 0.695312f, 0.000704f, 0.675293f, 0.000682f, 0.655273f, 0.000658f, 0.635254f, 0.000633f,
- 0.615234f, 0.000607f, 0.595215f, 0.000582f, 0.575195f, 0.000556f, 0.555176f, 0.000530f,
- 0.535645f, 0.000504f, 0.515625f, 0.000479f, 0.496582f, 0.000455f, 0.477539f, 0.000431f,
- 0.458984f, 0.000407f, 0.440430f, 0.000385f, 0.422363f, 0.000363f, 0.404785f, 0.000343f,
- 0.387695f, 0.000323f, 0.370850f, 0.000304f, 0.354736f, 0.000286f, 0.338867f, 0.000268f,
- 0.999512f, 0.000119f, 0.999512f, 0.000119f, 0.999512f, 0.000119f, 0.999512f, 0.000119f,
- 0.999512f, 0.000121f, 0.999512f, 0.000122f, 0.999512f, 0.000128f, 0.999512f, 0.000131f,
- 0.999512f, 0.000139f, 0.999023f, 0.000149f, 0.998535f, 0.000161f, 0.998047f, 0.000179f,
- 0.998047f, 0.000194f, 0.997070f, 0.000220f, 0.996094f, 0.000247f, 0.994629f, 0.000275f,
- 0.993652f, 0.000309f, 0.991699f, 0.000344f, 0.989746f, 0.000385f, 0.986816f, 0.000429f,
- 0.983887f, 0.000471f, 0.980469f, 0.000519f, 0.976074f, 0.000565f, 0.971680f, 0.000614f,
- 0.966309f, 0.000664f, 0.959961f, 0.000710f, 0.953125f, 0.000754f, 0.945312f, 0.000797f,
- 0.936523f, 0.000837f, 0.927246f, 0.000873f, 0.916992f, 0.000902f, 0.905762f, 0.000929f,
- 0.893555f, 0.000950f, 0.880859f, 0.000966f, 0.866699f, 0.000977f, 0.852539f, 0.000981f,
- 0.836914f, 0.000981f, 0.821289f, 0.000977f, 0.804688f, 0.000968f, 0.787109f, 0.000955f,
- 0.769531f, 0.000937f, 0.751465f, 0.000917f, 0.732422f, 0.000894f, 0.713379f, 0.000868f,
- 0.694336f, 0.000840f, 0.674805f, 0.000811f, 0.655273f, 0.000780f, 0.635254f, 0.000749f,
- 0.615723f, 0.000716f, 0.595703f, 0.000685f, 0.575684f, 0.000653f, 0.556152f, 0.000621f,
- 0.536621f, 0.000590f, 0.517090f, 0.000559f, 0.498291f, 0.000530f, 0.479492f, 0.000501f,
- 0.460938f, 0.000473f, 0.442627f, 0.000446f, 0.424805f, 0.000420f, 0.407227f, 0.000396f,
- 0.390137f, 0.000373f, 0.373535f, 0.000350f, 0.357422f, 0.000329f, 0.341553f, 0.000309f,
- 0.999512f, 0.000187f, 0.999512f, 0.000187f, 0.999512f, 0.000188f, 0.999512f, 0.000188f,
- 0.999512f, 0.000190f, 0.999512f, 0.000194f, 0.999512f, 0.000201f, 0.999023f, 0.000204f,
- 0.999023f, 0.000213f, 0.999023f, 0.000228f, 0.998535f, 0.000242f, 0.998535f, 0.000264f,
- 0.997559f, 0.000285f, 0.997070f, 0.000311f, 0.996094f, 0.000351f, 0.995117f, 0.000386f,
- 0.993164f, 0.000429f, 0.991211f, 0.000470f, 0.989258f, 0.000520f, 0.986328f, 0.000575f,
- 0.983398f, 0.000628f, 0.979492f, 0.000683f, 0.975586f, 0.000741f, 0.970703f, 0.000801f,
- 0.965332f, 0.000855f, 0.958984f, 0.000910f, 0.951660f, 0.000961f, 0.943848f, 0.001009f,
- 0.935059f, 0.001053f, 0.925781f, 0.001090f, 0.915039f, 0.001123f, 0.903809f, 0.001152f,
- 0.891602f, 0.001172f, 0.878906f, 0.001186f, 0.864746f, 0.001194f, 0.850586f, 0.001195f,
- 0.835449f, 0.001191f, 0.819336f, 0.001181f, 0.802734f, 0.001164f, 0.785645f, 0.001144f,
- 0.768066f, 0.001121f, 0.750000f, 0.001092f, 0.731445f, 0.001061f, 0.712402f, 0.001027f,
- 0.693359f, 0.000992f, 0.674316f, 0.000955f, 0.654785f, 0.000916f, 0.635254f, 0.000877f,
- 0.615723f, 0.000838f, 0.596191f, 0.000799f, 0.576660f, 0.000760f, 0.557129f, 0.000721f,
- 0.538086f, 0.000684f, 0.518555f, 0.000648f, 0.500000f, 0.000612f, 0.481445f, 0.000578f,
- 0.462891f, 0.000545f, 0.444824f, 0.000513f, 0.427246f, 0.000483f, 0.409912f, 0.000454f,
- 0.392822f, 0.000427f, 0.376221f, 0.000401f, 0.360107f, 0.000376f, 0.344482f, 0.000353f,
- 0.999512f, 0.000284f, 0.999512f, 0.000284f, 0.999512f, 0.000284f, 0.999512f, 0.000285f,
- 0.999512f, 0.000287f, 0.999512f, 0.000292f, 0.999512f, 0.000296f, 0.999023f, 0.000307f,
- 0.999023f, 0.000320f, 0.999023f, 0.000338f, 0.998535f, 0.000349f, 0.998047f, 0.000381f,
- 0.997559f, 0.000407f, 0.996582f, 0.000447f, 0.995605f, 0.000480f, 0.994629f, 0.000531f,
- 0.992676f, 0.000579f, 0.990723f, 0.000637f, 0.988770f, 0.000693f, 0.985840f, 0.000755f,
- 0.982422f, 0.000824f, 0.979004f, 0.000889f, 0.975098f, 0.000958f, 0.969727f, 0.001024f,
- 0.963867f, 0.001090f, 0.957520f, 0.001152f, 0.950684f, 0.001211f, 0.942383f, 0.001263f,
- 0.933594f, 0.001309f, 0.923828f, 0.001353f, 0.913086f, 0.001387f, 0.901855f, 0.001413f,
- 0.889648f, 0.001432f, 0.876465f, 0.001443f, 0.862793f, 0.001446f, 0.848145f, 0.001442f,
- 0.833008f, 0.001431f, 0.817383f, 0.001413f, 0.800781f, 0.001390f, 0.783691f, 0.001362f,
- 0.766113f, 0.001328f, 0.748535f, 0.001291f, 0.729980f, 0.001250f, 0.711426f, 0.001207f,
- 0.692871f, 0.001163f, 0.673828f, 0.001116f, 0.654785f, 0.001068f, 0.635254f, 0.001020f,
- 0.616211f, 0.000973f, 0.596680f, 0.000926f, 0.577637f, 0.000878f, 0.558105f, 0.000833f,
- 0.539062f, 0.000788f, 0.520508f, 0.000745f, 0.501465f, 0.000702f, 0.483154f, 0.000663f,
- 0.465088f, 0.000624f, 0.447266f, 0.000587f, 0.429443f, 0.000552f, 0.412354f, 0.000518f,
- 0.395508f, 0.000486f, 0.378906f, 0.000456f, 0.363037f, 0.000427f, 0.347168f, 0.000400f,
- 0.999512f, 0.000417f, 0.999512f, 0.000417f, 0.999512f, 0.000418f, 0.999512f, 0.000419f,
- 0.999512f, 0.000422f, 0.999512f, 0.000425f, 0.999023f, 0.000434f, 0.999023f, 0.000447f,
- 0.999023f, 0.000462f, 0.999023f, 0.000480f, 0.998047f, 0.000508f, 0.998047f, 0.000538f,
- 0.997070f, 0.000576f, 0.996582f, 0.000621f, 0.995605f, 0.000669f, 0.993652f, 0.000721f,
- 0.992188f, 0.000784f, 0.990723f, 0.000849f, 0.987793f, 0.000918f, 0.985840f, 0.000996f,
- 0.982422f, 0.001071f, 0.978516f, 0.001148f, 0.973633f, 0.001225f, 0.968750f, 0.001304f,
- 0.962891f, 0.001378f, 0.956543f, 0.001447f, 0.948730f, 0.001511f, 0.940918f, 0.001568f,
- 0.931641f, 0.001617f, 0.921875f, 0.001660f, 0.911621f, 0.001697f, 0.899902f, 0.001719f,
- 0.887695f, 0.001735f, 0.874512f, 0.001740f, 0.860840f, 0.001738f, 0.846191f, 0.001725f,
- 0.831055f, 0.001706f, 0.815430f, 0.001679f, 0.798828f, 0.001646f, 0.782227f, 0.001607f,
- 0.764648f, 0.001562f, 0.747070f, 0.001514f, 0.729004f, 0.001462f, 0.710449f, 0.001409f,
- 0.691895f, 0.001352f, 0.673340f, 0.001295f, 0.654297f, 0.001237f, 0.635254f, 0.001179f,
- 0.616211f, 0.001122f, 0.597168f, 0.001065f, 0.578125f, 0.001010f, 0.559570f, 0.000955f,
- 0.540527f, 0.000902f, 0.521973f, 0.000852f, 0.503418f, 0.000803f, 0.485352f, 0.000755f,
- 0.467285f, 0.000710f, 0.449463f, 0.000668f, 0.431885f, 0.000626f, 0.414795f, 0.000587f,
- 0.398193f, 0.000551f, 0.381836f, 0.000516f, 0.365723f, 0.000483f, 0.350098f, 0.000452f,
- 0.999023f, 0.000597f, 0.999023f, 0.000597f, 0.999023f, 0.000597f, 0.999023f, 0.000598f,
- 0.999023f, 0.000602f, 0.999023f, 0.000610f, 0.999023f, 0.000618f, 0.999023f, 0.000632f,
- 0.998535f, 0.000651f, 0.998535f, 0.000675f, 0.998047f, 0.000704f, 0.997559f, 0.000742f,
- 0.997070f, 0.000787f, 0.996094f, 0.000843f, 0.995117f, 0.000902f, 0.993652f, 0.000966f,
- 0.992188f, 0.001039f, 0.990234f, 0.001117f, 0.987793f, 0.001197f, 0.984863f, 0.001286f,
- 0.981445f, 0.001372f, 0.977539f, 0.001464f, 0.972656f, 0.001553f, 0.967773f, 0.001639f,
- 0.961914f, 0.001722f, 0.955078f, 0.001798f, 0.947754f, 0.001868f, 0.938965f, 0.001928f,
- 0.930176f, 0.001982f, 0.920410f, 0.002026f, 0.909668f, 0.002056f, 0.897949f, 0.002075f,
- 0.885254f, 0.002085f, 0.872559f, 0.002083f, 0.858398f, 0.002071f, 0.844238f, 0.002048f,
- 0.828613f, 0.002018f, 0.812988f, 0.001980f, 0.796875f, 0.001934f, 0.780273f, 0.001883f,
- 0.763184f, 0.001824f, 0.745605f, 0.001763f, 0.728027f, 0.001698f, 0.709473f, 0.001632f,
- 0.691406f, 0.001563f, 0.672852f, 0.001494f, 0.654297f, 0.001422f, 0.635254f, 0.001355f,
- 0.616699f, 0.001286f, 0.598145f, 0.001218f, 0.579102f, 0.001152f, 0.560547f, 0.001089f,
- 0.541992f, 0.001027f, 0.523438f, 0.000968f, 0.505371f, 0.000911f, 0.487305f, 0.000857f,
- 0.469482f, 0.000804f, 0.451904f, 0.000755f, 0.434570f, 0.000708f, 0.417480f, 0.000663f,
- 0.400879f, 0.000621f, 0.384521f, 0.000581f, 0.368652f, 0.000544f, 0.353027f, 0.000508f,
- 0.999023f, 0.000833f, 0.999023f, 0.000833f, 0.999023f, 0.000834f, 0.999023f, 0.000835f,
- 0.999023f, 0.000840f, 0.999023f, 0.000845f, 0.998535f, 0.000861f, 0.998535f, 0.000875f,
- 0.998535f, 0.000897f, 0.998047f, 0.000928f, 0.997559f, 0.000965f, 0.997070f, 0.001007f,
- 0.996582f, 0.001061f, 0.995605f, 0.001128f, 0.994629f, 0.001195f, 0.993164f, 0.001276f,
- 0.991699f, 0.001362f, 0.989258f, 0.001453f, 0.986816f, 0.001539f, 0.983887f, 0.001645f,
- 0.980469f, 0.001747f, 0.976562f, 0.001849f, 0.971680f, 0.001945f, 0.966309f, 0.002045f,
- 0.959961f, 0.002136f, 0.953613f, 0.002218f, 0.945801f, 0.002291f, 0.937500f, 0.002357f,
- 0.928223f, 0.002407f, 0.917969f, 0.002447f, 0.907227f, 0.002472f, 0.895508f, 0.002487f,
- 0.883301f, 0.002485f, 0.870117f, 0.002474f, 0.856445f, 0.002451f, 0.841797f, 0.002417f,
- 0.826660f, 0.002373f, 0.811035f, 0.002317f, 0.794922f, 0.002258f, 0.778320f, 0.002190f,
- 0.761230f, 0.002117f, 0.744141f, 0.002041f, 0.726562f, 0.001961f, 0.708496f, 0.001880f,
- 0.690430f, 0.001796f, 0.672363f, 0.001713f, 0.654297f, 0.001630f, 0.635742f, 0.001547f,
- 0.617188f, 0.001466f, 0.598633f, 0.001387f, 0.580078f, 0.001310f, 0.561523f, 0.001235f,
- 0.543457f, 0.001164f, 0.524902f, 0.001095f, 0.507324f, 0.001029f, 0.489258f, 0.000967f,
- 0.471680f, 0.000906f, 0.454346f, 0.000850f, 0.437012f, 0.000796f, 0.420166f, 0.000745f,
- 0.403564f, 0.000698f, 0.387451f, 0.000652f, 0.371582f, 0.000609f, 0.356201f, 0.000569f,
- 0.998535f, 0.001139f, 0.998535f, 0.001139f, 0.998535f, 0.001140f, 0.998535f, 0.001142f,
- 0.998535f, 0.001147f, 0.998535f, 0.001159f, 0.998535f, 0.001168f, 0.998047f, 0.001190f,
- 0.998047f, 0.001217f, 0.997559f, 0.001254f, 0.997559f, 0.001301f, 0.997070f, 0.001356f,
- 0.996094f, 0.001416f, 0.995605f, 0.001493f, 0.994141f, 0.001574f, 0.992676f, 0.001663f,
- 0.990723f, 0.001759f, 0.988770f, 0.001867f, 0.986328f, 0.001980f, 0.982910f, 0.002087f,
- 0.979492f, 0.002199f, 0.975586f, 0.002319f, 0.970703f, 0.002422f, 0.965332f, 0.002531f,
- 0.958496f, 0.002628f, 0.952148f, 0.002714f, 0.944336f, 0.002792f, 0.935547f, 0.002851f,
- 0.926270f, 0.002903f, 0.916016f, 0.002935f, 0.904785f, 0.002954f, 0.893066f, 0.002956f,
- 0.880859f, 0.002947f, 0.867676f, 0.002920f, 0.853516f, 0.002882f, 0.839355f, 0.002831f,
- 0.824219f, 0.002769f, 0.809082f, 0.002699f, 0.792969f, 0.002619f, 0.776367f, 0.002533f,
- 0.759766f, 0.002443f, 0.742676f, 0.002350f, 0.725586f, 0.002251f, 0.708008f, 0.002151f,
- 0.689941f, 0.002052f, 0.671875f, 0.001953f, 0.653809f, 0.001854f, 0.635742f, 0.001758f,
- 0.617676f, 0.001663f, 0.599121f, 0.001572f, 0.581055f, 0.001482f, 0.562988f, 0.001395f,
- 0.544922f, 0.001313f, 0.526855f, 0.001234f, 0.508789f, 0.001158f, 0.491455f, 0.001086f,
- 0.473877f, 0.001018f, 0.456787f, 0.000954f, 0.439697f, 0.000892f, 0.422852f, 0.000834f,
- 0.406494f, 0.000780f, 0.390381f, 0.000729f, 0.374512f, 0.000680f, 0.359131f, 0.000635f,
- 0.998047f, 0.001528f, 0.998047f, 0.001528f, 0.998047f, 0.001529f, 0.998047f, 0.001532f,
- 0.998047f, 0.001539f, 0.998047f, 0.001546f, 0.998047f, 0.001562f, 0.998047f, 0.001589f,
- 0.997559f, 0.001621f, 0.997559f, 0.001668f, 0.996582f, 0.001715f, 0.996582f, 0.001777f,
- 0.995605f, 0.001859f, 0.994629f, 0.001939f, 0.993652f, 0.002035f, 0.992188f, 0.002140f,
- 0.990234f, 0.002243f, 0.987793f, 0.002369f, 0.985352f, 0.002489f, 0.981934f, 0.002621f,
- 0.978516f, 0.002750f, 0.974121f, 0.002876f, 0.969238f, 0.002991f, 0.963867f, 0.003105f,
- 0.957031f, 0.003206f, 0.950195f, 0.003300f, 0.942383f, 0.003374f, 0.933594f, 0.003431f,
- 0.923828f, 0.003473f, 0.913574f, 0.003498f, 0.902344f, 0.003506f, 0.890625f, 0.003494f,
- 0.878418f, 0.003468f, 0.865234f, 0.003426f, 0.851074f, 0.003366f, 0.836914f, 0.003296f,
- 0.822266f, 0.003216f, 0.806641f, 0.003122f, 0.791016f, 0.003023f, 0.774902f, 0.002916f,
- 0.758301f, 0.002804f, 0.741211f, 0.002689f, 0.724121f, 0.002573f, 0.707031f, 0.002453f,
- 0.689453f, 0.002335f, 0.671875f, 0.002216f, 0.653809f, 0.002102f, 0.636230f, 0.001987f,
- 0.618164f, 0.001878f, 0.600098f, 0.001771f, 0.582031f, 0.001668f, 0.564453f, 0.001569f,
- 0.546387f, 0.001475f, 0.528809f, 0.001384f, 0.511230f, 0.001297f, 0.493652f, 0.001217f,
- 0.476318f, 0.001139f, 0.459229f, 0.001065f, 0.442383f, 0.000996f, 0.425781f, 0.000930f,
- 0.409424f, 0.000869f, 0.393311f, 0.000811f, 0.377686f, 0.000757f, 0.362305f, 0.000707f,
- 0.997559f, 0.002018f, 0.997559f, 0.002018f, 0.997559f, 0.002018f, 0.997559f, 0.002022f,
- 0.997559f, 0.002028f, 0.997559f, 0.002045f, 0.997559f, 0.002066f, 0.997559f, 0.002092f,
- 0.997559f, 0.002129f, 0.996582f, 0.002176f, 0.996094f, 0.002235f, 0.995605f, 0.002312f,
- 0.995605f, 0.002407f, 0.993652f, 0.002491f, 0.992676f, 0.002605f, 0.991211f, 0.002729f,
- 0.989258f, 0.002846f, 0.987305f, 0.002987f, 0.984375f, 0.003120f, 0.980957f, 0.003263f,
- 0.977051f, 0.003403f, 0.972656f, 0.003542f, 0.967285f, 0.003666f, 0.961914f, 0.003782f,
- 0.955566f, 0.003889f, 0.947754f, 0.003967f, 0.939941f, 0.004044f, 0.931152f, 0.004097f,
- 0.921387f, 0.004131f, 0.911133f, 0.004139f, 0.899902f, 0.004131f, 0.888184f, 0.004108f,
- 0.875488f, 0.004055f, 0.862305f, 0.003990f, 0.848633f, 0.003914f, 0.834473f, 0.003819f,
- 0.819824f, 0.003712f, 0.804199f, 0.003593f, 0.788574f, 0.003469f, 0.772949f, 0.003338f,
- 0.756348f, 0.003201f, 0.739746f, 0.003063f, 0.723145f, 0.002924f, 0.706055f, 0.002781f,
- 0.688965f, 0.002644f, 0.671387f, 0.002506f, 0.653809f, 0.002371f, 0.636230f, 0.002239f,
- 0.618652f, 0.002111f, 0.601074f, 0.001989f, 0.583496f, 0.001871f, 0.565430f, 0.001759f,
- 0.547852f, 0.001650f, 0.530273f, 0.001547f, 0.513184f, 0.001449f, 0.495850f, 0.001356f,
- 0.478760f, 0.001269f, 0.461670f, 0.001185f, 0.445068f, 0.001107f, 0.428467f, 0.001035f,
- 0.412354f, 0.000965f, 0.396240f, 0.000901f, 0.380615f, 0.000840f, 0.365479f, 0.000783f,
- 0.997070f, 0.002625f, 0.997070f, 0.002625f, 0.997070f, 0.002626f, 0.997070f, 0.002630f,
- 0.997070f, 0.002640f, 0.997070f, 0.002659f, 0.997070f, 0.002676f, 0.996582f, 0.002708f,
- 0.996582f, 0.002752f, 0.996094f, 0.002813f, 0.995605f, 0.002886f, 0.995117f, 0.002956f,
- 0.994141f, 0.003071f, 0.992676f, 0.003172f, 0.991699f, 0.003292f, 0.990234f, 0.003433f,
- 0.988281f, 0.003580f, 0.985840f, 0.003727f, 0.982910f, 0.003870f, 0.979492f, 0.004028f,
- 0.975586f, 0.004177f, 0.971191f, 0.004322f, 0.966309f, 0.004456f, 0.959961f, 0.004570f,
- 0.953125f, 0.004669f, 0.945801f, 0.004757f, 0.937500f, 0.004826f, 0.928711f, 0.004864f,
- 0.918945f, 0.004883f, 0.908691f, 0.004875f, 0.897461f, 0.004845f, 0.885254f, 0.004795f,
- 0.872559f, 0.004723f, 0.859863f, 0.004631f, 0.846191f, 0.004520f, 0.832031f, 0.004398f,
- 0.817383f, 0.004261f, 0.802246f, 0.004116f, 0.786621f, 0.003963f, 0.770996f, 0.003805f,
- 0.754883f, 0.003639f, 0.738770f, 0.003475f, 0.722168f, 0.003307f, 0.705078f, 0.003143f,
- 0.688477f, 0.002981f, 0.671387f, 0.002821f, 0.653809f, 0.002665f, 0.636719f, 0.002512f,
- 0.619141f, 0.002367f, 0.602051f, 0.002226f, 0.584473f, 0.002090f, 0.566895f, 0.001963f,
- 0.549805f, 0.001840f, 0.532227f, 0.001722f, 0.515137f, 0.001613f, 0.498047f, 0.001508f,
- 0.481201f, 0.001409f, 0.464355f, 0.001316f, 0.447754f, 0.001228f, 0.431396f, 0.001145f,
- 0.415283f, 0.001069f, 0.399414f, 0.000997f, 0.383789f, 0.000929f, 0.368652f, 0.000865f,
- 0.996582f, 0.003370f, 0.996582f, 0.003370f, 0.996582f, 0.003372f, 0.996582f, 0.003378f,
- 0.996582f, 0.003389f, 0.996094f, 0.003410f, 0.996094f, 0.003435f, 0.996094f, 0.003471f,
- 0.996094f, 0.003523f, 0.995117f, 0.003588f, 0.995117f, 0.003664f, 0.994141f, 0.003754f,
- 0.993164f, 0.003864f, 0.992676f, 0.003990f, 0.990723f, 0.004128f, 0.989746f, 0.004288f,
- 0.987793f, 0.004429f, 0.984375f, 0.004601f, 0.981445f, 0.004757f, 0.978027f, 0.004925f,
- 0.974121f, 0.005089f, 0.969727f, 0.005241f, 0.964355f, 0.005375f, 0.958008f, 0.005486f,
- 0.951172f, 0.005596f, 0.943848f, 0.005665f, 0.935547f, 0.005718f, 0.925781f, 0.005737f,
- 0.916016f, 0.005733f, 0.905762f, 0.005707f, 0.894531f, 0.005650f, 0.882324f, 0.005569f,
- 0.870117f, 0.005466f, 0.856934f, 0.005341f, 0.843262f, 0.005199f, 0.829102f, 0.005043f,
- 0.814941f, 0.004871f, 0.799805f, 0.004692f, 0.784668f, 0.004505f, 0.769043f, 0.004314f,
- 0.753418f, 0.004116f, 0.737305f, 0.003922f, 0.721191f, 0.003729f, 0.704590f, 0.003536f,
- 0.687988f, 0.003347f, 0.670898f, 0.003162f, 0.654297f, 0.002983f, 0.637207f, 0.002810f,
- 0.620117f, 0.002642f, 0.603027f, 0.002481f, 0.585938f, 0.002329f, 0.568359f, 0.002182f,
- 0.551270f, 0.002045f, 0.534180f, 0.001913f, 0.517090f, 0.001788f, 0.500488f, 0.001671f,
- 0.483643f, 0.001560f, 0.467041f, 0.001456f, 0.450684f, 0.001358f, 0.434326f, 0.001266f,
- 0.418213f, 0.001181f, 0.402588f, 0.001101f, 0.386963f, 0.001025f, 0.371826f, 0.000954f,
- 0.995605f, 0.004276f, 0.995605f, 0.004276f, 0.995605f, 0.004280f, 0.995605f, 0.004284f,
- 0.995605f, 0.004299f, 0.995117f, 0.004318f, 0.995117f, 0.004349f, 0.995117f, 0.004383f,
- 0.994629f, 0.004456f, 0.994629f, 0.004524f, 0.994141f, 0.004612f, 0.993164f, 0.004704f,
- 0.992676f, 0.004848f, 0.991699f, 0.004974f, 0.990234f, 0.005142f, 0.987793f, 0.005291f,
- 0.986328f, 0.005474f, 0.982910f, 0.005638f, 0.980469f, 0.005825f, 0.976562f, 0.005989f,
- 0.972656f, 0.006157f, 0.967773f, 0.006313f, 0.961914f, 0.006443f, 0.955566f, 0.006554f,
- 0.948730f, 0.006645f, 0.940918f, 0.006702f, 0.932617f, 0.006733f, 0.923340f, 0.006733f,
- 0.913574f, 0.006699f, 0.902832f, 0.006645f, 0.891602f, 0.006550f, 0.879395f, 0.006435f,
- 0.867188f, 0.006294f, 0.854004f, 0.006130f, 0.840332f, 0.005951f, 0.826660f, 0.005756f,
- 0.812500f, 0.005543f, 0.797363f, 0.005325f, 0.782715f, 0.005100f, 0.767090f, 0.004871f,
- 0.751465f, 0.004642f, 0.735840f, 0.004414f, 0.719727f, 0.004185f, 0.703613f, 0.003960f,
- 0.687500f, 0.003744f, 0.670898f, 0.003531f, 0.654297f, 0.003326f, 0.637695f, 0.003128f,
- 0.620605f, 0.002939f, 0.604004f, 0.002756f, 0.586914f, 0.002584f, 0.569824f, 0.002420f,
- 0.553223f, 0.002264f, 0.536133f, 0.002117f, 0.519531f, 0.001978f, 0.502930f, 0.001847f,
- 0.486328f, 0.001723f, 0.469727f, 0.001607f, 0.453369f, 0.001498f, 0.437256f, 0.001395f,
- 0.421387f, 0.001300f, 0.405762f, 0.001211f, 0.390381f, 0.001127f, 0.375244f, 0.001050f,
- 0.994141f, 0.005367f, 0.994141f, 0.005367f, 0.994141f, 0.005371f, 0.994141f, 0.005375f,
- 0.994141f, 0.005394f, 0.994141f, 0.005413f, 0.994141f, 0.005447f, 0.994141f, 0.005508f,
- 0.993652f, 0.005558f, 0.993652f, 0.005650f, 0.992676f, 0.005741f, 0.991699f, 0.005848f,
- 0.991211f, 0.006004f, 0.990234f, 0.006149f, 0.988281f, 0.006317f, 0.986328f, 0.006504f,
- 0.984863f, 0.006687f, 0.981934f, 0.006866f, 0.978516f, 0.007050f, 0.974609f, 0.007233f,
- 0.970215f, 0.007393f, 0.965820f, 0.007553f, 0.959961f, 0.007675f, 0.953125f, 0.007774f,
- 0.946289f, 0.007843f, 0.938477f, 0.007889f, 0.929688f, 0.007889f, 0.920410f, 0.007858f,
- 0.910156f, 0.007793f, 0.899414f, 0.007694f, 0.888672f, 0.007565f, 0.876465f, 0.007401f,
- 0.864258f, 0.007214f, 0.851074f, 0.007008f, 0.837402f, 0.006779f, 0.823730f, 0.006535f,
- 0.809570f, 0.006279f, 0.794922f, 0.006023f, 0.780273f, 0.005753f, 0.765137f, 0.005482f,
- 0.750000f, 0.005215f, 0.734375f, 0.004944f, 0.718750f, 0.004681f, 0.703125f, 0.004425f,
- 0.687012f, 0.004173f, 0.670898f, 0.003929f, 0.654297f, 0.003700f, 0.638184f, 0.003473f,
- 0.621582f, 0.003260f, 0.604980f, 0.003056f, 0.588379f, 0.002861f, 0.571777f, 0.002676f,
- 0.555176f, 0.002502f, 0.538574f, 0.002337f, 0.521973f, 0.002180f, 0.505371f, 0.002035f,
- 0.488770f, 0.001898f, 0.472656f, 0.001769f, 0.456299f, 0.001649f, 0.440430f, 0.001534f,
- 0.424561f, 0.001430f, 0.408936f, 0.001329f, 0.393555f, 0.001238f, 0.378418f, 0.001151f,
- 0.993164f, 0.006672f, 0.993164f, 0.006672f, 0.993164f, 0.006676f, 0.993164f, 0.006687f,
- 0.993164f, 0.006699f, 0.993164f, 0.006721f, 0.992676f, 0.006760f, 0.992676f, 0.006821f,
- 0.992188f, 0.006897f, 0.991699f, 0.006973f, 0.991211f, 0.007099f, 0.990234f, 0.007206f,
- 0.990234f, 0.007366f, 0.988281f, 0.007519f, 0.986328f, 0.007706f, 0.984863f, 0.007912f,
- 0.982422f, 0.008087f, 0.979980f, 0.008286f, 0.977051f, 0.008476f, 0.972656f, 0.008667f,
- 0.968262f, 0.008827f, 0.962891f, 0.008980f, 0.957520f, 0.009079f, 0.951172f, 0.009171f,
- 0.943848f, 0.009216f, 0.935547f, 0.009224f, 0.926758f, 0.009193f, 0.917480f, 0.009125f,
- 0.906738f, 0.009010f, 0.895996f, 0.008865f, 0.885254f, 0.008682f, 0.873047f, 0.008469f,
- 0.860840f, 0.008232f, 0.847656f, 0.007973f, 0.834473f, 0.007690f, 0.820801f, 0.007397f,
- 0.807129f, 0.007092f, 0.792969f, 0.006783f, 0.778320f, 0.006462f, 0.763184f, 0.006145f,
- 0.748535f, 0.005833f, 0.733398f, 0.005524f, 0.717773f, 0.005219f, 0.702148f, 0.004925f,
- 0.686523f, 0.004639f, 0.670898f, 0.004364f, 0.654785f, 0.004097f, 0.638672f, 0.003847f,
- 0.622559f, 0.003605f, 0.605957f, 0.003376f, 0.589844f, 0.003157f, 0.573242f, 0.002951f,
- 0.556641f, 0.002756f, 0.540527f, 0.002573f, 0.523926f, 0.002399f, 0.507812f, 0.002237f,
- 0.491455f, 0.002085f, 0.475342f, 0.001943f, 0.459229f, 0.001809f, 0.443359f, 0.001684f,
- 0.427734f, 0.001567f, 0.412109f, 0.001457f, 0.396973f, 0.001356f, 0.382080f, 0.001261f,
- 0.991699f, 0.008217f, 0.991699f, 0.008217f, 0.991699f, 0.008217f, 0.991699f, 0.008232f,
- 0.991211f, 0.008240f, 0.991211f, 0.008270f, 0.991211f, 0.008324f, 0.991211f, 0.008377f,
- 0.990723f, 0.008461f, 0.990234f, 0.008553f, 0.989746f, 0.008682f, 0.988770f, 0.008820f,
- 0.987793f, 0.008972f, 0.986816f, 0.009163f, 0.985352f, 0.009338f, 0.982910f, 0.009567f,
- 0.980957f, 0.009758f, 0.977539f, 0.009956f, 0.974609f, 0.010155f, 0.970215f, 0.010330f,
- 0.965820f, 0.010483f, 0.960449f, 0.010597f, 0.954590f, 0.010696f, 0.947754f, 0.010750f,
- 0.940430f, 0.010757f, 0.932129f, 0.010735f, 0.923340f, 0.010651f, 0.913574f, 0.010536f,
- 0.903809f, 0.010376f, 0.892578f, 0.010162f, 0.881348f, 0.009926f, 0.869629f, 0.009651f,
- 0.857422f, 0.009354f, 0.844727f, 0.009026f, 0.831543f, 0.008690f, 0.817871f, 0.008331f,
- 0.804199f, 0.007973f, 0.790527f, 0.007603f, 0.775879f, 0.007233f, 0.761719f, 0.006866f,
- 0.747070f, 0.006500f, 0.731934f, 0.006145f, 0.716797f, 0.005798f, 0.701660f, 0.005466f,
- 0.686523f, 0.005138f, 0.670898f, 0.004829f, 0.655273f, 0.004532f, 0.639160f, 0.004246f,
- 0.623535f, 0.003975f, 0.607422f, 0.003719f, 0.591309f, 0.003477f, 0.575195f, 0.003246f,
- 0.558594f, 0.003029f, 0.542480f, 0.002827f, 0.526367f, 0.002634f, 0.510254f, 0.002455f,
- 0.494141f, 0.002285f, 0.478271f, 0.002129f, 0.462402f, 0.001980f, 0.446533f, 0.001843f,
- 0.430908f, 0.001715f, 0.415527f, 0.001594f, 0.400391f, 0.001483f, 0.385498f, 0.001378f,
- 0.989746f, 0.010040f, 0.989746f, 0.010040f, 0.989746f, 0.010040f, 0.989746f, 0.010048f,
- 0.989746f, 0.010071f, 0.989746f, 0.010094f, 0.989258f, 0.010147f, 0.989258f, 0.010223f,
- 0.988770f, 0.010300f, 0.988770f, 0.010406f, 0.987793f, 0.010529f, 0.986816f, 0.010696f,
- 0.986328f, 0.010857f, 0.984863f, 0.011055f, 0.982422f, 0.011238f, 0.981445f, 0.011467f,
- 0.978516f, 0.011673f, 0.975098f, 0.011871f, 0.972168f, 0.012062f, 0.967285f, 0.012215f,
- 0.962402f, 0.012352f, 0.957031f, 0.012459f, 0.951172f, 0.012535f, 0.944336f, 0.012535f,
- 0.937012f, 0.012520f, 0.928711f, 0.012428f, 0.919922f, 0.012299f, 0.910156f, 0.012115f,
- 0.899414f, 0.011879f, 0.889160f, 0.011612f, 0.877441f, 0.011299f, 0.865723f, 0.010956f,
- 0.853516f, 0.010582f, 0.841309f, 0.010193f, 0.828125f, 0.009773f, 0.814941f, 0.009361f,
- 0.801270f, 0.008926f, 0.787598f, 0.008499f, 0.773926f, 0.008064f, 0.759766f, 0.007641f,
- 0.745117f, 0.007225f, 0.730469f, 0.006817f, 0.716309f, 0.006424f, 0.701172f, 0.006042f,
- 0.686035f, 0.005676f, 0.670898f, 0.005329f, 0.655273f, 0.004993f, 0.640137f, 0.004673f,
- 0.624512f, 0.004372f, 0.608398f, 0.004086f, 0.592773f, 0.003817f, 0.576660f, 0.003561f,
- 0.561035f, 0.003323f, 0.544922f, 0.003098f, 0.528809f, 0.002884f, 0.512695f, 0.002686f,
- 0.497070f, 0.002501f, 0.481201f, 0.002327f, 0.465332f, 0.002165f, 0.449707f, 0.002014f,
- 0.434326f, 0.001873f, 0.418945f, 0.001740f, 0.403809f, 0.001617f, 0.388916f, 0.001504f,
- 0.987793f, 0.012169f, 0.987793f, 0.012169f, 0.987793f, 0.012169f, 0.987793f, 0.012184f,
- 0.987305f, 0.012207f, 0.987305f, 0.012245f, 0.987305f, 0.012291f, 0.986816f, 0.012360f,
- 0.986816f, 0.012459f, 0.986328f, 0.012573f, 0.985840f, 0.012695f, 0.984863f, 0.012878f,
- 0.983887f, 0.013046f, 0.982422f, 0.013237f, 0.980469f, 0.013466f, 0.979004f, 0.013680f,
- 0.976074f, 0.013878f, 0.972656f, 0.014069f, 0.969238f, 0.014259f, 0.964355f, 0.014397f,
- 0.959961f, 0.014488f, 0.954102f, 0.014580f, 0.947754f, 0.014595f, 0.940430f, 0.014557f,
- 0.933105f, 0.014481f, 0.925293f, 0.014328f, 0.915527f, 0.014122f, 0.906250f, 0.013870f,
- 0.895996f, 0.013565f, 0.885254f, 0.013206f, 0.873535f, 0.012817f, 0.862305f, 0.012383f,
- 0.850098f, 0.011932f, 0.837891f, 0.011452f, 0.824707f, 0.010963f, 0.812012f, 0.010460f,
- 0.798828f, 0.009964f, 0.785156f, 0.009460f, 0.771484f, 0.008965f, 0.757812f, 0.008484f,
- 0.743652f, 0.008003f, 0.729492f, 0.007542f, 0.715332f, 0.007095f, 0.700684f, 0.006668f,
- 0.686035f, 0.006256f, 0.670898f, 0.005863f, 0.655762f, 0.005489f, 0.640625f, 0.005135f,
- 0.625488f, 0.004799f, 0.609863f, 0.004478f, 0.594238f, 0.004181f, 0.578613f, 0.003901f,
- 0.562988f, 0.003635f, 0.547363f, 0.003386f, 0.531250f, 0.003153f, 0.515625f, 0.002935f,
- 0.500000f, 0.002729f, 0.484131f, 0.002539f, 0.468506f, 0.002361f, 0.453125f, 0.002195f,
- 0.437744f, 0.002041f, 0.422363f, 0.001897f, 0.407471f, 0.001763f, 0.392578f, 0.001637f,
- 0.985352f, 0.014641f, 0.985352f, 0.014641f, 0.984863f, 0.014648f, 0.984863f, 0.014656f,
- 0.984863f, 0.014679f, 0.984863f, 0.014717f, 0.984863f, 0.014771f, 0.984375f, 0.014839f,
- 0.984375f, 0.014938f, 0.983398f, 0.015060f, 0.983398f, 0.015244f, 0.981934f, 0.015388f,
- 0.980957f, 0.015587f, 0.979492f, 0.015778f, 0.977539f, 0.015976f, 0.975586f, 0.016190f,
- 0.972656f, 0.016388f, 0.969727f, 0.016571f, 0.965820f, 0.016739f, 0.961426f, 0.016861f,
- 0.956055f, 0.016922f, 0.950684f, 0.016953f, 0.943848f, 0.016922f, 0.937012f, 0.016815f,
- 0.929199f, 0.016663f, 0.920410f, 0.016434f, 0.911621f, 0.016144f, 0.901855f, 0.015793f,
- 0.891602f, 0.015411f, 0.880859f, 0.014954f, 0.869629f, 0.014473f, 0.857910f, 0.013947f,
- 0.846191f, 0.013390f, 0.833984f, 0.012825f, 0.821289f, 0.012253f, 0.809082f, 0.011665f,
- 0.795898f, 0.011086f, 0.782715f, 0.010506f, 0.769531f, 0.009933f, 0.755859f, 0.009377f,
- 0.742188f, 0.008842f, 0.728516f, 0.008316f, 0.714355f, 0.007812f, 0.700195f, 0.007336f,
- 0.685547f, 0.006874f, 0.670898f, 0.006435f, 0.656250f, 0.006020f, 0.641602f, 0.005623f,
- 0.626465f, 0.005253f, 0.611328f, 0.004902f, 0.596191f, 0.004570f, 0.580566f, 0.004261f,
- 0.564941f, 0.003967f, 0.549316f, 0.003695f, 0.533691f, 0.003437f, 0.518066f, 0.003199f,
- 0.502930f, 0.002975f, 0.487305f, 0.002766f, 0.471680f, 0.002571f, 0.456299f, 0.002388f,
- 0.441162f, 0.002220f, 0.426025f, 0.002062f, 0.411133f, 0.001916f, 0.396240f, 0.001781f,
- 0.982422f, 0.017502f, 0.982422f, 0.017502f, 0.982422f, 0.017502f, 0.982422f, 0.017517f,
- 0.981934f, 0.017532f, 0.981934f, 0.017593f, 0.981934f, 0.017639f, 0.981934f, 0.017731f,
- 0.981445f, 0.017838f, 0.980957f, 0.017960f, 0.979980f, 0.018112f, 0.979004f, 0.018295f,
- 0.978027f, 0.018478f, 0.975586f, 0.018677f, 0.974609f, 0.018860f, 0.972168f, 0.019073f,
- 0.969238f, 0.019287f, 0.965820f, 0.019455f, 0.962402f, 0.019562f, 0.958008f, 0.019653f,
- 0.952637f, 0.019653f, 0.946289f, 0.019623f, 0.939453f, 0.019516f, 0.932617f, 0.019348f,
- 0.924316f, 0.019089f, 0.916016f, 0.018784f, 0.907227f, 0.018387f, 0.897461f, 0.017944f,
- 0.887207f, 0.017426f, 0.876465f, 0.016861f, 0.865234f, 0.016266f, 0.854004f, 0.015640f,
- 0.842285f, 0.014999f, 0.830078f, 0.014320f, 0.818359f, 0.013641f, 0.805664f, 0.012962f,
- 0.792969f, 0.012291f, 0.780273f, 0.011627f, 0.767090f, 0.010979f, 0.753906f, 0.010345f,
- 0.740723f, 0.009735f, 0.727539f, 0.009155f, 0.713867f, 0.008591f, 0.699707f, 0.008049f,
- 0.685547f, 0.007534f, 0.671387f, 0.007050f, 0.656738f, 0.006588f, 0.642578f, 0.006149f,
- 0.627441f, 0.005737f, 0.612793f, 0.005352f, 0.597656f, 0.004986f, 0.582520f, 0.004642f,
- 0.567383f, 0.004322f, 0.551758f, 0.004021f, 0.536621f, 0.003744f, 0.520996f, 0.003481f,
- 0.505859f, 0.003235f, 0.490479f, 0.003006f, 0.475098f, 0.002794f, 0.459717f, 0.002596f,
- 0.444580f, 0.002411f, 0.429688f, 0.002241f, 0.414795f, 0.002081f, 0.400146f, 0.001933f,
- 0.979004f, 0.020798f, 0.979004f, 0.020798f, 0.979004f, 0.020798f, 0.979004f, 0.020813f,
- 0.979004f, 0.020844f, 0.978516f, 0.020874f, 0.978516f, 0.020935f, 0.978027f, 0.021027f,
- 0.978027f, 0.021149f, 0.977539f, 0.021286f, 0.977051f, 0.021454f, 0.975586f, 0.021622f,
- 0.974121f, 0.021820f, 0.972656f, 0.021988f, 0.970215f, 0.022186f, 0.968750f, 0.022385f,
- 0.965820f, 0.022552f, 0.961914f, 0.022675f, 0.958008f, 0.022736f, 0.953613f, 0.022751f,
- 0.948242f, 0.022736f, 0.942383f, 0.022614f, 0.935547f, 0.022415f, 0.927734f, 0.022156f,
- 0.919922f, 0.021790f, 0.911621f, 0.021362f, 0.901855f, 0.020859f, 0.892090f, 0.020279f,
- 0.882324f, 0.019638f, 0.872070f, 0.018951f, 0.860840f, 0.018234f, 0.849609f, 0.017487f,
- 0.838379f, 0.016708f, 0.826172f, 0.015930f, 0.814453f, 0.015144f, 0.802246f, 0.014359f,
- 0.790527f, 0.013588f, 0.777832f, 0.012833f, 0.765137f, 0.012100f, 0.752441f, 0.011383f,
- 0.739258f, 0.010696f, 0.726074f, 0.010040f, 0.712891f, 0.009415f, 0.699219f, 0.008812f,
- 0.685547f, 0.008240f, 0.671875f, 0.007698f, 0.657715f, 0.007191f, 0.643555f, 0.006710f,
- 0.628906f, 0.006252f, 0.614258f, 0.005829f, 0.599609f, 0.005428f, 0.584473f, 0.005051f,
- 0.569336f, 0.004704f, 0.554199f, 0.004372f, 0.539062f, 0.004063f, 0.523926f, 0.003780f,
- 0.508789f, 0.003513f, 0.493652f, 0.003263f, 0.478271f, 0.003033f, 0.463135f, 0.002817f,
- 0.448242f, 0.002615f, 0.433350f, 0.002430f, 0.418457f, 0.002256f, 0.403809f, 0.002094f,
- 0.975098f, 0.024582f, 0.975098f, 0.024567f, 0.975098f, 0.024582f, 0.975098f, 0.024597f,
- 0.975098f, 0.024628f, 0.975098f, 0.024658f, 0.975098f, 0.024734f, 0.974609f, 0.024826f,
- 0.973633f, 0.024933f, 0.973633f, 0.025055f, 0.972656f, 0.025223f, 0.972168f, 0.025421f,
- 0.970215f, 0.025589f, 0.968262f, 0.025742f, 0.966309f, 0.025925f, 0.964355f, 0.026108f,
- 0.960938f, 0.026230f, 0.957520f, 0.026321f, 0.953613f, 0.026352f, 0.948242f, 0.026260f,
- 0.943848f, 0.026154f, 0.937500f, 0.025970f, 0.930664f, 0.025650f, 0.922852f, 0.025253f,
- 0.915039f, 0.024765f, 0.906738f, 0.024200f, 0.897461f, 0.023560f, 0.887207f, 0.022827f,
- 0.877441f, 0.022064f, 0.866699f, 0.021225f, 0.855957f, 0.020370f, 0.845215f, 0.019470f,
- 0.833984f, 0.018570f, 0.822266f, 0.017654f, 0.811035f, 0.016754f, 0.799316f, 0.015854f,
- 0.787109f, 0.014984f, 0.775391f, 0.014122f, 0.763184f, 0.013298f, 0.750488f, 0.012489f,
- 0.737793f, 0.011726f, 0.725098f, 0.010986f, 0.712402f, 0.010284f, 0.699219f, 0.009621f,
- 0.685547f, 0.008987f, 0.671875f, 0.008392f, 0.658203f, 0.007828f, 0.644531f, 0.007305f,
- 0.630371f, 0.006802f, 0.615723f, 0.006336f, 0.601562f, 0.005898f, 0.586914f, 0.005489f,
- 0.571777f, 0.005104f, 0.557129f, 0.004745f, 0.541992f, 0.004414f, 0.526855f, 0.004101f,
- 0.511719f, 0.003809f, 0.496826f, 0.003538f, 0.481689f, 0.003286f, 0.466797f, 0.003052f,
- 0.451904f, 0.002832f, 0.437012f, 0.002630f, 0.422363f, 0.002441f, 0.407715f, 0.002268f,
- 0.970703f, 0.028870f, 0.970703f, 0.028870f, 0.970703f, 0.028885f, 0.970703f, 0.028900f,
- 0.970703f, 0.028915f, 0.970703f, 0.028961f, 0.970215f, 0.029022f, 0.970215f, 0.029114f,
- 0.969727f, 0.029251f, 0.968750f, 0.029373f, 0.968262f, 0.029526f, 0.966797f, 0.029678f,
- 0.966309f, 0.029877f, 0.964844f, 0.030045f, 0.962402f, 0.030167f, 0.959473f, 0.030304f,
- 0.956543f, 0.030411f, 0.953125f, 0.030411f, 0.948242f, 0.030319f, 0.943359f, 0.030197f,
- 0.938477f, 0.029968f, 0.931641f, 0.029648f, 0.924805f, 0.029221f, 0.917969f, 0.028687f,
- 0.909180f, 0.028030f, 0.900879f, 0.027313f, 0.891602f, 0.026505f, 0.881836f, 0.025620f,
- 0.871582f, 0.024673f, 0.861816f, 0.023697f, 0.851074f, 0.022659f, 0.840820f, 0.021622f,
- 0.829590f, 0.020569f, 0.818359f, 0.019516f, 0.807129f, 0.018478f, 0.795898f, 0.017456f,
- 0.784180f, 0.016464f, 0.772461f, 0.015503f, 0.760742f, 0.014572f, 0.748535f, 0.013672f,
- 0.736816f, 0.012817f, 0.724121f, 0.012001f, 0.711914f, 0.011215f, 0.698730f, 0.010483f,
- 0.686035f, 0.009789f, 0.672852f, 0.009132f, 0.659180f, 0.008514f, 0.645508f, 0.007935f,
- 0.631836f, 0.007389f, 0.617676f, 0.006878f, 0.603516f, 0.006397f, 0.588867f, 0.005951f,
- 0.574219f, 0.005531f, 0.559570f, 0.005142f, 0.544922f, 0.004776f, 0.529785f, 0.004436f,
- 0.515137f, 0.004120f, 0.500000f, 0.003828f, 0.485352f, 0.003555f, 0.470215f, 0.003302f,
- 0.455566f, 0.003065f, 0.440918f, 0.002844f, 0.426270f, 0.002642f, 0.411621f, 0.002451f,
- 0.965820f, 0.033752f, 0.965820f, 0.033752f, 0.965820f, 0.033752f, 0.965820f, 0.033783f,
- 0.965820f, 0.033783f, 0.965820f, 0.033875f, 0.965332f, 0.033905f, 0.965332f, 0.033997f,
- 0.964844f, 0.034088f, 0.963867f, 0.034241f, 0.963379f, 0.034393f, 0.962402f, 0.034546f,
- 0.960938f, 0.034698f, 0.958496f, 0.034851f, 0.957520f, 0.034973f, 0.954102f, 0.035034f,
- 0.951172f, 0.035034f, 0.947754f, 0.034943f, 0.942871f, 0.034821f, 0.937988f, 0.034576f,
- 0.932129f, 0.034180f, 0.926270f, 0.033722f, 0.918945f, 0.033142f, 0.911133f, 0.032410f,
- 0.902832f, 0.031616f, 0.894531f, 0.030685f, 0.885254f, 0.029694f, 0.876465f, 0.028641f,
- 0.866699f, 0.027512f, 0.856445f, 0.026337f, 0.846191f, 0.025146f, 0.835449f, 0.023926f,
- 0.825195f, 0.022720f, 0.814453f, 0.021515f, 0.803711f, 0.020340f, 0.792480f, 0.019165f,
- 0.781250f, 0.018051f, 0.770020f, 0.016968f, 0.758789f, 0.015915f, 0.747070f, 0.014931f,
- 0.735352f, 0.013977f, 0.723145f, 0.013069f, 0.710938f, 0.012215f, 0.698730f, 0.011398f,
- 0.686035f, 0.010635f, 0.673340f, 0.009918f, 0.660156f, 0.009239f, 0.646484f, 0.008598f,
- 0.633301f, 0.008003f, 0.619141f, 0.007446f, 0.605469f, 0.006927f, 0.591309f, 0.006439f,
- 0.576660f, 0.005985f, 0.562500f, 0.005562f, 0.547852f, 0.005165f, 0.533203f, 0.004795f,
- 0.518066f, 0.004456f, 0.503418f, 0.004135f, 0.488770f, 0.003841f, 0.474121f, 0.003565f,
- 0.459229f, 0.003311f, 0.444580f, 0.003073f, 0.430176f, 0.002853f, 0.415771f, 0.002647f,
- 0.960449f, 0.039276f, 0.960449f, 0.039276f, 0.960449f, 0.039276f, 0.960449f, 0.039307f,
- 0.960449f, 0.039337f, 0.959961f, 0.039368f, 0.959961f, 0.039429f, 0.959961f, 0.039520f,
- 0.959473f, 0.039612f, 0.958984f, 0.039764f, 0.958008f, 0.039886f, 0.956543f, 0.040009f,
- 0.955566f, 0.040131f, 0.953125f, 0.040253f, 0.951172f, 0.040314f, 0.948242f, 0.040283f,
- 0.945801f, 0.040222f, 0.940918f, 0.040039f, 0.936523f, 0.039764f, 0.931152f, 0.039368f,
- 0.926270f, 0.038879f, 0.919434f, 0.038208f, 0.913086f, 0.037445f, 0.905273f, 0.036530f,
- 0.897461f, 0.035522f, 0.888184f, 0.034393f, 0.879395f, 0.033173f, 0.870117f, 0.031891f,
- 0.860352f, 0.030563f, 0.850586f, 0.029190f, 0.840820f, 0.027802f, 0.830566f, 0.026398f,
- 0.820312f, 0.025009f, 0.810059f, 0.023636f, 0.799805f, 0.022308f, 0.789062f, 0.020996f,
- 0.778809f, 0.019730f, 0.767578f, 0.018524f, 0.756348f, 0.017365f, 0.745605f, 0.016251f,
- 0.733887f, 0.015213f, 0.722656f, 0.014206f, 0.710938f, 0.013260f, 0.698730f, 0.012367f,
- 0.686523f, 0.011536f, 0.673828f, 0.010742f, 0.661133f, 0.010002f, 0.647949f, 0.009308f,
- 0.634766f, 0.008659f, 0.621094f, 0.008057f, 0.607422f, 0.007488f, 0.593262f, 0.006958f,
- 0.579102f, 0.006466f, 0.564941f, 0.006004f, 0.550781f, 0.005577f, 0.536133f, 0.005177f,
- 0.521484f, 0.004807f, 0.506836f, 0.004463f, 0.492432f, 0.004143f, 0.477783f, 0.003847f,
- 0.463135f, 0.003571f, 0.448730f, 0.003315f, 0.434082f, 0.003077f, 0.419922f, 0.002857f,
- 0.954102f, 0.045502f, 0.954102f, 0.045502f, 0.954102f, 0.045502f, 0.954102f, 0.045532f,
- 0.954102f, 0.045563f, 0.954102f, 0.045593f, 0.953613f, 0.045654f, 0.953613f, 0.045715f,
- 0.953125f, 0.045868f, 0.952148f, 0.045990f, 0.951660f, 0.046082f, 0.950195f, 0.046143f,
- 0.948242f, 0.046265f, 0.946777f, 0.046265f, 0.943848f, 0.046265f, 0.941895f, 0.046204f,
- 0.938477f, 0.046021f, 0.935059f, 0.045685f, 0.929199f, 0.045258f, 0.925293f, 0.044708f,
- 0.919434f, 0.044006f, 0.912109f, 0.043121f, 0.905273f, 0.042145f, 0.897949f, 0.041016f,
- 0.890137f, 0.039734f, 0.881348f, 0.038391f, 0.872559f, 0.036926f, 0.863770f, 0.035431f,
- 0.854004f, 0.033813f, 0.844727f, 0.032227f, 0.835449f, 0.030640f, 0.825195f, 0.029037f,
- 0.815430f, 0.027451f, 0.806152f, 0.025909f, 0.795898f, 0.024399f, 0.785645f, 0.022934f,
- 0.775391f, 0.021530f, 0.765137f, 0.020187f, 0.754883f, 0.018890f, 0.743652f, 0.017670f,
- 0.732910f, 0.016510f, 0.721680f, 0.015411f, 0.710449f, 0.014374f, 0.698730f, 0.013405f,
- 0.686523f, 0.012482f, 0.674316f, 0.011620f, 0.662109f, 0.010811f, 0.649414f, 0.010063f,
- 0.636230f, 0.009354f, 0.623047f, 0.008698f, 0.609375f, 0.008080f, 0.595703f, 0.007507f,
- 0.582031f, 0.006973f, 0.567871f, 0.006477f, 0.553711f, 0.006016f, 0.539551f, 0.005585f,
- 0.524902f, 0.005180f, 0.510254f, 0.004810f, 0.496094f, 0.004463f, 0.481689f, 0.004147f,
- 0.467041f, 0.003847f, 0.452637f, 0.003571f, 0.438232f, 0.003315f, 0.424072f, 0.003077f,
- 0.947266f, 0.052490f, 0.947266f, 0.052490f, 0.947266f, 0.052490f, 0.947266f, 0.052521f,
- 0.947266f, 0.052551f, 0.946777f, 0.052582f, 0.946777f, 0.052612f, 0.946289f, 0.052734f,
- 0.945801f, 0.052795f, 0.945312f, 0.052887f, 0.944336f, 0.052948f, 0.942871f, 0.053040f,
- 0.941406f, 0.053009f, 0.939941f, 0.053009f, 0.937012f, 0.052917f, 0.934570f, 0.052704f,
- 0.931641f, 0.052399f, 0.926758f, 0.051971f, 0.922852f, 0.051331f, 0.917480f, 0.050568f,
- 0.911133f, 0.049622f, 0.904297f, 0.048523f, 0.898438f, 0.047272f, 0.890137f, 0.045868f,
- 0.882812f, 0.044312f, 0.874512f, 0.042694f, 0.865723f, 0.040955f, 0.856934f, 0.039154f,
- 0.847656f, 0.037354f, 0.838867f, 0.035522f, 0.829590f, 0.033661f, 0.820312f, 0.031830f,
- 0.811035f, 0.030060f, 0.801270f, 0.028305f, 0.791992f, 0.026611f, 0.782227f, 0.024994f,
- 0.772461f, 0.023422f, 0.762695f, 0.021927f, 0.752441f, 0.020508f, 0.742188f, 0.019165f,
- 0.731445f, 0.017883f, 0.721191f, 0.016678f, 0.709961f, 0.015556f, 0.698730f, 0.014488f,
- 0.687012f, 0.013489f, 0.675293f, 0.012550f, 0.663086f, 0.011673f, 0.650879f, 0.010849f,
- 0.638184f, 0.010086f, 0.625000f, 0.009369f, 0.611816f, 0.008705f, 0.598145f, 0.008087f,
- 0.584961f, 0.007511f, 0.570801f, 0.006977f, 0.556641f, 0.006474f, 0.542480f, 0.006012f,
- 0.528320f, 0.005581f, 0.514160f, 0.005180f, 0.499756f, 0.004807f, 0.485596f, 0.004459f,
- 0.471191f, 0.004139f, 0.456787f, 0.003843f, 0.442383f, 0.003569f, 0.428467f, 0.003313f,
- 0.939453f, 0.060333f, 0.939453f, 0.060333f, 0.939453f, 0.060333f, 0.939453f, 0.060333f,
- 0.939453f, 0.060394f, 0.938965f, 0.060394f, 0.938965f, 0.060455f, 0.938477f, 0.060516f,
- 0.937988f, 0.060577f, 0.937500f, 0.060638f, 0.936035f, 0.060669f, 0.935547f, 0.060669f,
- 0.933594f, 0.060608f, 0.931641f, 0.060516f, 0.929688f, 0.060272f, 0.927246f, 0.059967f,
- 0.922363f, 0.059448f, 0.918945f, 0.058868f, 0.914062f, 0.057953f, 0.908691f, 0.056946f,
- 0.902832f, 0.055786f, 0.897461f, 0.054382f, 0.890137f, 0.052826f, 0.882324f, 0.051117f,
- 0.874023f, 0.049255f, 0.866211f, 0.047302f, 0.858398f, 0.045288f, 0.849609f, 0.043213f,
- 0.840820f, 0.041107f, 0.832031f, 0.038971f, 0.823730f, 0.036896f, 0.814453f, 0.034821f,
- 0.806152f, 0.032806f, 0.796875f, 0.030853f, 0.788086f, 0.028961f, 0.778809f, 0.027161f,
- 0.769531f, 0.025421f, 0.760254f, 0.023788f, 0.750488f, 0.022217f, 0.740723f, 0.020737f,
- 0.730957f, 0.019333f, 0.720703f, 0.018021f, 0.709961f, 0.016785f, 0.698730f, 0.015625f,
- 0.687500f, 0.014549f, 0.676270f, 0.013535f, 0.664551f, 0.012573f, 0.652344f, 0.011688f,
- 0.640137f, 0.010864f, 0.627441f, 0.010086f, 0.614258f, 0.009369f, 0.601074f, 0.008698f,
- 0.587402f, 0.008080f, 0.573730f, 0.007500f, 0.560059f, 0.006962f, 0.545898f, 0.006462f,
- 0.531738f, 0.006001f, 0.517578f, 0.005569f, 0.503418f, 0.005165f, 0.489502f, 0.004795f,
- 0.475098f, 0.004452f, 0.460938f, 0.004131f, 0.446777f, 0.003838f, 0.432861f, 0.003563f,
- 0.930664f, 0.069031f, 0.930664f, 0.069031f, 0.930664f, 0.069031f, 0.930664f, 0.069031f,
- 0.930664f, 0.069092f, 0.930664f, 0.069092f, 0.930176f, 0.069214f, 0.929688f, 0.069153f,
- 0.929199f, 0.069214f, 0.929199f, 0.069275f, 0.927246f, 0.069214f, 0.926758f, 0.069153f,
- 0.925293f, 0.069031f, 0.923340f, 0.068787f, 0.920410f, 0.068420f, 0.917480f, 0.067932f,
- 0.914551f, 0.067261f, 0.911133f, 0.066345f, 0.905273f, 0.065247f, 0.900391f, 0.063965f,
- 0.894043f, 0.062469f, 0.888184f, 0.060699f, 0.880859f, 0.058807f, 0.873535f, 0.056763f,
- 0.866211f, 0.054565f, 0.858887f, 0.052277f, 0.850586f, 0.049896f, 0.841797f, 0.047485f,
- 0.833496f, 0.045105f, 0.825684f, 0.042664f, 0.817383f, 0.040283f, 0.809082f, 0.037964f,
- 0.800781f, 0.035706f, 0.792480f, 0.033539f, 0.784180f, 0.031433f, 0.775391f, 0.029449f,
- 0.766602f, 0.027542f, 0.757812f, 0.025726f, 0.748535f, 0.024017f, 0.739258f, 0.022400f,
- 0.729980f, 0.020874f, 0.719727f, 0.019440f, 0.709961f, 0.018097f, 0.699219f, 0.016830f,
- 0.688477f, 0.015656f, 0.677246f, 0.014557f, 0.665527f, 0.013527f, 0.653809f, 0.012573f,
- 0.641602f, 0.011681f, 0.629395f, 0.010841f, 0.616699f, 0.010071f, 0.603516f, 0.009346f,
- 0.590332f, 0.008682f, 0.577148f, 0.008057f, 0.563477f, 0.007481f, 0.549316f, 0.006943f,
- 0.535645f, 0.006443f, 0.521484f, 0.005978f, 0.507324f, 0.005550f, 0.493408f, 0.005150f,
- 0.479248f, 0.004780f, 0.465332f, 0.004436f, 0.451172f, 0.004124f, 0.437256f, 0.003828f,
- 0.920898f, 0.078735f, 0.920898f, 0.078735f, 0.920898f, 0.078735f, 0.920898f, 0.078735f,
- 0.920898f, 0.078796f, 0.920898f, 0.078796f, 0.920410f, 0.078796f, 0.919922f, 0.078857f,
- 0.919922f, 0.078857f, 0.918945f, 0.078796f, 0.917480f, 0.078735f, 0.916992f, 0.078613f,
- 0.915039f, 0.078308f, 0.913086f, 0.077942f, 0.910645f, 0.077454f, 0.908691f, 0.076660f,
- 0.905273f, 0.075745f, 0.899902f, 0.074585f, 0.895996f, 0.073181f, 0.889648f, 0.071533f,
- 0.883789f, 0.069641f, 0.877930f, 0.067566f, 0.872070f, 0.065247f, 0.864258f, 0.062805f,
- 0.856934f, 0.060242f, 0.849121f, 0.057556f, 0.841797f, 0.054810f, 0.833984f, 0.052063f,
- 0.827148f, 0.049316f, 0.818848f, 0.046570f, 0.811035f, 0.043915f, 0.803223f, 0.041290f,
- 0.795898f, 0.038788f, 0.788086f, 0.036377f, 0.779785f, 0.034058f, 0.771973f, 0.031830f,
- 0.763672f, 0.029755f, 0.755371f, 0.027771f, 0.747070f, 0.025894f, 0.738281f, 0.024139f,
- 0.729004f, 0.022476f, 0.719238f, 0.020935f, 0.709473f, 0.019470f, 0.699707f, 0.018097f,
- 0.688965f, 0.016830f, 0.678223f, 0.015640f, 0.666992f, 0.014534f, 0.655762f, 0.013496f,
- 0.643555f, 0.012535f, 0.631348f, 0.011642f, 0.619141f, 0.010803f, 0.606445f, 0.010033f,
- 0.593262f, 0.009308f, 0.580078f, 0.008644f, 0.566406f, 0.008018f, 0.553223f, 0.007446f,
- 0.539062f, 0.006908f, 0.525391f, 0.006413f, 0.511230f, 0.005951f, 0.497559f, 0.005527f,
- 0.483643f, 0.005131f, 0.469482f, 0.004765f, 0.455566f, 0.004421f, 0.441650f, 0.004108f,
- 0.910156f, 0.089539f, 0.910156f, 0.089539f, 0.910156f, 0.089539f, 0.910156f, 0.089539f,
- 0.910156f, 0.089539f, 0.909668f, 0.089539f, 0.909668f, 0.089539f, 0.909180f, 0.089539f,
- 0.908691f, 0.089478f, 0.907715f, 0.089417f, 0.907227f, 0.089233f, 0.905762f, 0.088989f,
- 0.904297f, 0.088562f, 0.902832f, 0.088013f, 0.900391f, 0.087280f, 0.896973f, 0.086243f,
- 0.895020f, 0.085083f, 0.889160f, 0.083557f, 0.884766f, 0.081787f, 0.878906f, 0.079712f,
- 0.874512f, 0.077393f, 0.867676f, 0.074951f, 0.860840f, 0.072205f, 0.854492f, 0.069275f,
- 0.848145f, 0.066223f, 0.840820f, 0.063171f, 0.833008f, 0.060059f, 0.826172f, 0.056885f,
- 0.819336f, 0.053741f, 0.812012f, 0.050690f, 0.804688f, 0.047699f, 0.797852f, 0.044800f,
- 0.790527f, 0.042023f, 0.783691f, 0.039337f, 0.776367f, 0.036804f, 0.768555f, 0.034393f,
- 0.761230f, 0.032074f, 0.753418f, 0.029922f, 0.745117f, 0.027893f, 0.736816f, 0.025970f,
- 0.728516f, 0.024170f, 0.719238f, 0.022491f, 0.709961f, 0.020905f, 0.700195f, 0.019440f,
- 0.689941f, 0.018066f, 0.679688f, 0.016785f, 0.668457f, 0.015587f, 0.657227f, 0.014473f,
- 0.645996f, 0.013443f, 0.633789f, 0.012474f, 0.621582f, 0.011581f, 0.609375f, 0.010750f,
- 0.596191f, 0.009972f, 0.583496f, 0.009262f, 0.569824f, 0.008591f, 0.556641f, 0.007973f,
- 0.542969f, 0.007404f, 0.529297f, 0.006874f, 0.515625f, 0.006378f, 0.501465f, 0.005920f,
- 0.487793f, 0.005501f, 0.474121f, 0.005108f, 0.460205f, 0.004742f, 0.446289f, 0.004406f,
- 0.898438f, 0.101440f, 0.898438f, 0.101440f, 0.898438f, 0.101440f, 0.898438f, 0.101440f,
- 0.897949f, 0.101440f, 0.897949f, 0.101440f, 0.897461f, 0.101440f, 0.896973f, 0.101379f,
- 0.896973f, 0.101318f, 0.895996f, 0.101135f, 0.895508f, 0.100830f, 0.894043f, 0.100464f,
- 0.893066f, 0.099854f, 0.890625f, 0.099121f, 0.888184f, 0.098083f, 0.885254f, 0.096802f,
- 0.882324f, 0.095215f, 0.878418f, 0.093323f, 0.872559f, 0.091125f, 0.869629f, 0.088623f,
- 0.862793f, 0.085815f, 0.855957f, 0.082764f, 0.850098f, 0.079590f, 0.844727f, 0.076172f,
- 0.837402f, 0.072693f, 0.831055f, 0.069092f, 0.824219f, 0.065491f, 0.817871f, 0.061981f,
- 0.811035f, 0.058472f, 0.804688f, 0.055023f, 0.797852f, 0.051697f, 0.791992f, 0.048492f,
- 0.785645f, 0.045410f, 0.778809f, 0.042480f, 0.771973f, 0.039673f, 0.765625f, 0.037018f,
- 0.758789f, 0.034515f, 0.750977f, 0.032166f, 0.743652f, 0.029968f, 0.735840f, 0.027878f,
- 0.727539f, 0.025940f, 0.718750f, 0.024124f, 0.709961f, 0.022430f, 0.700684f, 0.020844f,
- 0.690918f, 0.019363f, 0.680664f, 0.017975f, 0.670410f, 0.016693f, 0.659180f, 0.015495f,
- 0.647949f, 0.014389f, 0.636230f, 0.013359f, 0.624512f, 0.012398f, 0.611816f, 0.011505f,
- 0.599609f, 0.010681f, 0.586426f, 0.009911f, 0.573730f, 0.009201f, 0.560547f, 0.008537f,
- 0.546875f, 0.007927f, 0.533203f, 0.007355f, 0.519531f, 0.006828f, 0.505859f, 0.006340f,
- 0.492432f, 0.005890f, 0.478516f, 0.005470f, 0.464844f, 0.005077f, 0.450928f, 0.004719f,
- 0.885254f, 0.114624f, 0.885254f, 0.114624f, 0.885254f, 0.114624f, 0.885254f, 0.114624f,
- 0.884766f, 0.114624f, 0.884766f, 0.114563f, 0.884766f, 0.114502f, 0.884277f, 0.114380f,
- 0.883789f, 0.114258f, 0.883301f, 0.114014f, 0.882324f, 0.113525f, 0.881348f, 0.112976f,
- 0.879395f, 0.112183f, 0.877441f, 0.111145f, 0.875977f, 0.109802f, 0.872559f, 0.108215f,
- 0.869141f, 0.106201f, 0.865723f, 0.103821f, 0.860352f, 0.101196f, 0.854492f, 0.098145f,
- 0.850586f, 0.094849f, 0.845215f, 0.091187f, 0.838379f, 0.087463f, 0.833496f, 0.083496f,
- 0.826660f, 0.079468f, 0.820801f, 0.075378f, 0.814453f, 0.071289f, 0.809082f, 0.067322f,
- 0.803711f, 0.063354f, 0.797363f, 0.059540f, 0.791992f, 0.055878f, 0.786133f, 0.052338f,
- 0.780762f, 0.048950f, 0.774414f, 0.045746f, 0.768555f, 0.042664f, 0.762207f, 0.039795f,
- 0.755859f, 0.037079f, 0.749023f, 0.034546f, 0.741699f, 0.032135f, 0.734863f, 0.029892f,
- 0.727051f, 0.027802f, 0.718750f, 0.025833f, 0.710449f, 0.024002f, 0.701172f, 0.022293f,
- 0.691895f, 0.020706f, 0.682129f, 0.019226f, 0.671875f, 0.017853f, 0.661133f, 0.016571f,
- 0.650391f, 0.015381f, 0.639160f, 0.014282f, 0.626953f, 0.013252f, 0.615234f, 0.012299f,
- 0.602539f, 0.011414f, 0.590332f, 0.010597f, 0.577148f, 0.009834f, 0.563965f, 0.009132f,
- 0.550781f, 0.008476f, 0.537598f, 0.007866f, 0.523926f, 0.007309f, 0.510254f, 0.006786f,
- 0.496826f, 0.006306f, 0.483154f, 0.005856f, 0.469482f, 0.005440f, 0.455811f, 0.005054f,
- 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870605f, 0.129028f,
- 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870117f, 0.128906f, 0.870117f, 0.128784f,
- 0.869629f, 0.128540f, 0.869141f, 0.128052f, 0.868164f, 0.127563f, 0.867188f, 0.126709f,
- 0.865723f, 0.125732f, 0.863281f, 0.124329f, 0.862305f, 0.122742f, 0.858887f, 0.120544f,
- 0.854980f, 0.118103f, 0.850098f, 0.115173f, 0.847168f, 0.111938f, 0.843750f, 0.108276f,
- 0.836426f, 0.104309f, 0.832031f, 0.100159f, 0.827148f, 0.095764f, 0.821289f, 0.091187f,
- 0.815918f, 0.086609f, 0.810547f, 0.081970f, 0.806152f, 0.077393f, 0.800781f, 0.072937f,
- 0.795410f, 0.068542f, 0.790039f, 0.064270f, 0.785645f, 0.060242f, 0.780762f, 0.056335f,
- 0.775391f, 0.052643f, 0.770020f, 0.049133f, 0.765137f, 0.045807f, 0.759766f, 0.042694f,
- 0.753906f, 0.039734f, 0.747559f, 0.036987f, 0.740723f, 0.034393f, 0.733887f, 0.031982f,
- 0.726562f, 0.029739f, 0.719238f, 0.027618f, 0.710449f, 0.025650f, 0.702148f, 0.023834f,
- 0.692871f, 0.022125f, 0.683594f, 0.020538f, 0.673828f, 0.019058f, 0.663574f, 0.017685f,
- 0.652832f, 0.016418f, 0.641602f, 0.015244f, 0.629883f, 0.014153f, 0.618164f, 0.013138f,
- 0.605957f, 0.012192f, 0.593750f, 0.011314f, 0.581055f, 0.010506f, 0.567871f, 0.009750f,
- 0.555176f, 0.009056f, 0.541504f, 0.008408f, 0.528320f, 0.007809f, 0.514648f, 0.007252f,
- 0.501465f, 0.006741f, 0.487793f, 0.006260f, 0.474365f, 0.005817f, 0.460938f, 0.005409f,
- 0.854492f, 0.145020f, 0.854492f, 0.145020f, 0.854492f, 0.145020f, 0.854492f, 0.145020f,
- 0.854492f, 0.144897f, 0.854492f, 0.144897f, 0.854004f, 0.144653f, 0.854492f, 0.144531f,
- 0.854004f, 0.144165f, 0.853027f, 0.143555f, 0.852051f, 0.142822f, 0.851074f, 0.141724f,
- 0.850586f, 0.140503f, 0.848145f, 0.138672f, 0.846191f, 0.136475f, 0.843262f, 0.133911f,
- 0.839844f, 0.130859f, 0.835449f, 0.127319f, 0.832031f, 0.123474f, 0.828613f, 0.119141f,
- 0.823242f, 0.114502f, 0.819824f, 0.109558f, 0.813477f, 0.104431f, 0.809570f, 0.099304f,
- 0.804199f, 0.094055f, 0.799316f, 0.088867f, 0.794922f, 0.083740f, 0.791992f, 0.078735f,
- 0.786621f, 0.073914f, 0.783203f, 0.069214f, 0.779297f, 0.064758f, 0.774902f, 0.060516f,
- 0.770508f, 0.056488f, 0.765625f, 0.052673f, 0.761230f, 0.049072f, 0.756348f, 0.045715f,
- 0.750977f, 0.042511f, 0.745605f, 0.039551f, 0.739746f, 0.036774f, 0.733398f, 0.034180f,
- 0.726562f, 0.031738f, 0.719238f, 0.029495f, 0.711426f, 0.027390f, 0.703125f, 0.025421f,
- 0.694336f, 0.023605f, 0.685059f, 0.021912f, 0.675781f, 0.020340f, 0.665527f, 0.018875f,
- 0.655273f, 0.017517f, 0.644043f, 0.016251f, 0.632812f, 0.015091f, 0.621582f, 0.014008f,
- 0.609375f, 0.013000f, 0.597168f, 0.012070f, 0.584473f, 0.011200f, 0.571777f, 0.010406f,
- 0.559082f, 0.009659f, 0.545898f, 0.008972f, 0.532715f, 0.008339f, 0.519531f, 0.007748f,
- 0.505859f, 0.007198f, 0.492676f, 0.006691f, 0.479248f, 0.006218f, 0.465820f, 0.005783f,
- 0.837402f, 0.162476f, 0.837402f, 0.162476f, 0.837402f, 0.162476f, 0.837402f, 0.162354f,
- 0.837402f, 0.162354f, 0.836914f, 0.162231f, 0.836914f, 0.161987f, 0.836426f, 0.161743f,
- 0.836426f, 0.161133f, 0.835449f, 0.160522f, 0.835449f, 0.159546f, 0.834473f, 0.158203f,
- 0.833496f, 0.156372f, 0.831055f, 0.154175f, 0.830078f, 0.151489f, 0.826660f, 0.148315f,
- 0.823242f, 0.144531f, 0.821289f, 0.140381f, 0.817383f, 0.135620f, 0.812012f, 0.130615f,
- 0.810547f, 0.125122f, 0.805176f, 0.119507f, 0.800293f, 0.113647f, 0.797852f, 0.107788f,
- 0.792480f, 0.101868f, 0.788574f, 0.096008f, 0.785156f, 0.090332f, 0.782715f, 0.084839f,
- 0.779297f, 0.079468f, 0.774902f, 0.074341f, 0.772461f, 0.069458f, 0.769531f, 0.064819f,
- 0.765137f, 0.060486f, 0.761719f, 0.056366f, 0.758301f, 0.052490f, 0.753418f, 0.048828f,
- 0.749023f, 0.045410f, 0.743652f, 0.042206f, 0.738770f, 0.039215f, 0.732422f, 0.036438f,
- 0.726074f, 0.033844f, 0.719238f, 0.031433f, 0.711914f, 0.029190f, 0.704102f, 0.027100f,
- 0.695801f, 0.025146f, 0.687012f, 0.023346f, 0.677734f, 0.021667f, 0.667969f, 0.020111f,
- 0.657715f, 0.018646f, 0.646973f, 0.017319f, 0.636230f, 0.016068f, 0.624512f, 0.014923f,
- 0.612793f, 0.013855f, 0.601074f, 0.012863f, 0.588379f, 0.011948f, 0.576172f, 0.011093f,
- 0.563477f, 0.010300f, 0.550293f, 0.009567f, 0.537109f, 0.008896f, 0.523926f, 0.008263f,
- 0.510742f, 0.007687f, 0.497559f, 0.007145f, 0.484375f, 0.006645f, 0.470947f, 0.006180f,
- 0.818359f, 0.181519f, 0.818359f, 0.181519f, 0.818359f, 0.181519f, 0.817871f, 0.181519f,
- 0.817871f, 0.181396f, 0.817871f, 0.181274f, 0.817871f, 0.181030f, 0.817871f, 0.180542f,
- 0.817871f, 0.179932f, 0.817383f, 0.178955f, 0.816406f, 0.177612f, 0.815918f, 0.175903f,
- 0.814941f, 0.173584f, 0.812500f, 0.170898f, 0.811035f, 0.167603f, 0.808594f, 0.163696f,
- 0.805664f, 0.159180f, 0.802246f, 0.154175f, 0.799805f, 0.148560f, 0.796875f, 0.142700f,
- 0.792480f, 0.136353f, 0.789551f, 0.129883f, 0.787598f, 0.123230f, 0.782227f, 0.116577f,
- 0.780273f, 0.109985f, 0.777344f, 0.103516f, 0.774414f, 0.097168f, 0.771973f, 0.091125f,
- 0.770508f, 0.085205f, 0.767578f, 0.079651f, 0.765625f, 0.074341f, 0.763184f, 0.069336f,
- 0.760254f, 0.064636f, 0.757812f, 0.060181f, 0.754395f, 0.056000f, 0.750977f, 0.052063f,
- 0.747559f, 0.048431f, 0.742188f, 0.044983f, 0.737793f, 0.041779f, 0.732422f, 0.038818f,
- 0.726074f, 0.036041f, 0.719727f, 0.033447f, 0.712891f, 0.031052f, 0.705566f, 0.028824f,
- 0.697266f, 0.026749f, 0.688965f, 0.024826f, 0.679688f, 0.023041f, 0.670410f, 0.021393f,
- 0.660645f, 0.019852f, 0.649902f, 0.018433f, 0.639160f, 0.017105f, 0.627930f, 0.015869f,
- 0.616211f, 0.014748f, 0.604492f, 0.013687f, 0.592773f, 0.012718f, 0.580078f, 0.011818f,
- 0.567871f, 0.010979f, 0.554688f, 0.010201f, 0.541992f, 0.009483f, 0.528809f, 0.008812f,
- 0.515625f, 0.008194f, 0.502441f, 0.007626f, 0.489502f, 0.007088f, 0.476318f, 0.006599f,
- 0.797363f, 0.202393f, 0.797363f, 0.202393f, 0.797363f, 0.202393f, 0.797363f, 0.202393f,
- 0.797363f, 0.202148f, 0.797363f, 0.202026f, 0.797363f, 0.201660f, 0.797363f, 0.201050f,
- 0.796875f, 0.200195f, 0.796875f, 0.198975f, 0.796387f, 0.197266f, 0.795898f, 0.195068f,
- 0.794922f, 0.192261f, 0.792969f, 0.188843f, 0.792480f, 0.184937f, 0.789551f, 0.180298f,
- 0.787598f, 0.174927f, 0.785645f, 0.168823f, 0.782715f, 0.162231f, 0.779297f, 0.155273f,
- 0.775879f, 0.148071f, 0.775391f, 0.140747f, 0.772461f, 0.133179f, 0.770508f, 0.125732f,
- 0.767578f, 0.118347f, 0.766113f, 0.111206f, 0.764648f, 0.104248f, 0.763184f, 0.097595f,
- 0.762695f, 0.091187f, 0.761719f, 0.085144f, 0.759277f, 0.079407f, 0.758301f, 0.073975f,
- 0.755859f, 0.068909f, 0.754395f, 0.064087f, 0.751465f, 0.059631f, 0.748535f, 0.055450f,
- 0.745117f, 0.051514f, 0.741211f, 0.047852f, 0.737305f, 0.044434f, 0.731934f, 0.041260f,
- 0.726562f, 0.038300f, 0.720215f, 0.035553f, 0.713867f, 0.032990f, 0.706543f, 0.030624f,
- 0.699219f, 0.028427f, 0.690918f, 0.026382f, 0.682129f, 0.024475f, 0.672852f, 0.022720f,
- 0.663086f, 0.021088f, 0.652832f, 0.019577f, 0.642578f, 0.018173f, 0.631348f, 0.016876f,
- 0.620117f, 0.015671f, 0.608398f, 0.014565f, 0.596680f, 0.013535f, 0.584473f, 0.012573f,
- 0.572266f, 0.011681f, 0.559570f, 0.010857f, 0.546875f, 0.010101f, 0.533691f, 0.009392f,
- 0.520996f, 0.008736f, 0.507812f, 0.008125f, 0.494629f, 0.007565f, 0.481689f, 0.007042f,
- 0.774414f, 0.225098f, 0.774414f, 0.225098f, 0.774414f, 0.225098f, 0.774414f, 0.225098f,
- 0.774414f, 0.224854f, 0.774902f, 0.224609f, 0.774414f, 0.224121f, 0.774414f, 0.223389f,
- 0.774414f, 0.222290f, 0.773926f, 0.220581f, 0.773926f, 0.218628f, 0.773926f, 0.215942f,
- 0.773438f, 0.212524f, 0.772461f, 0.208374f, 0.771484f, 0.203491f, 0.770508f, 0.197754f,
- 0.769043f, 0.191284f, 0.766113f, 0.184204f, 0.763672f, 0.176514f, 0.760742f, 0.168457f,
- 0.760742f, 0.160278f, 0.757812f, 0.151855f, 0.757812f, 0.143433f, 0.756836f, 0.135132f,
- 0.754395f, 0.126953f, 0.755371f, 0.119141f, 0.755371f, 0.111511f, 0.754395f, 0.104309f,
- 0.753418f, 0.097351f, 0.754395f, 0.090820f, 0.753906f, 0.084595f, 0.752441f, 0.078796f,
- 0.751465f, 0.073303f, 0.750000f, 0.068176f, 0.748535f, 0.063354f, 0.746094f, 0.058899f,
- 0.743164f, 0.054718f, 0.740234f, 0.050812f, 0.736816f, 0.047150f, 0.731934f, 0.043793f,
- 0.727051f, 0.040649f, 0.721191f, 0.037720f, 0.714844f, 0.035004f, 0.708008f, 0.032501f,
- 0.700684f, 0.030167f, 0.692871f, 0.027985f, 0.684570f, 0.025986f, 0.675781f, 0.024124f,
- 0.666016f, 0.022385f, 0.656250f, 0.020782f, 0.645996f, 0.019302f, 0.635254f, 0.017929f,
- 0.624023f, 0.016647f, 0.612793f, 0.015480f, 0.601074f, 0.014381f, 0.588867f, 0.013367f,
- 0.576660f, 0.012428f, 0.563965f, 0.011559f, 0.551270f, 0.010750f, 0.539062f, 0.010002f,
- 0.525879f, 0.009308f, 0.513184f, 0.008659f, 0.500000f, 0.008064f, 0.487061f, 0.007511f,
- 0.750000f, 0.249878f, 0.749512f, 0.249878f, 0.750000f, 0.249878f, 0.750000f, 0.249756f,
- 0.750000f, 0.249512f, 0.750000f, 0.249146f, 0.750000f, 0.248413f, 0.750488f, 0.247559f,
- 0.750488f, 0.246094f, 0.750488f, 0.244141f, 0.750488f, 0.241577f, 0.750488f, 0.238281f,
- 0.748535f, 0.234009f, 0.749512f, 0.229004f, 0.749023f, 0.223022f, 0.747070f, 0.216309f,
- 0.745117f, 0.208496f, 0.743164f, 0.200195f, 0.744629f, 0.191406f, 0.741211f, 0.182251f,
- 0.741699f, 0.172852f, 0.740234f, 0.163330f, 0.742676f, 0.154053f, 0.741211f, 0.144775f,
- 0.743652f, 0.135864f, 0.744629f, 0.127197f, 0.743164f, 0.118958f, 0.744629f, 0.111145f,
- 0.745605f, 0.103638f, 0.746582f, 0.096558f, 0.748047f, 0.089966f, 0.747559f, 0.083679f,
- 0.747559f, 0.077820f, 0.746582f, 0.072327f, 0.745605f, 0.067261f, 0.744629f, 0.062469f,
- 0.742676f, 0.058014f, 0.739746f, 0.053864f, 0.735840f, 0.049988f, 0.731934f, 0.046417f,
- 0.727539f, 0.043091f, 0.722168f, 0.039978f, 0.716309f, 0.037079f, 0.709473f, 0.034424f,
- 0.702637f, 0.031952f, 0.695312f, 0.029663f, 0.687012f, 0.027542f, 0.678223f, 0.025558f,
- 0.668945f, 0.023743f, 0.659180f, 0.022049f, 0.649414f, 0.020477f, 0.638672f, 0.019028f,
- 0.627930f, 0.017670f, 0.616699f, 0.016434f, 0.604980f, 0.015274f, 0.593262f, 0.014198f,
- 0.581055f, 0.013206f, 0.568848f, 0.012283f, 0.556641f, 0.011429f, 0.543945f, 0.010643f,
- 0.531250f, 0.009903f, 0.518066f, 0.009224f, 0.505371f, 0.008591f, 0.492676f, 0.008003f,
- 0.723145f, 0.276611f, 0.723145f, 0.276611f, 0.723145f, 0.276611f, 0.723145f, 0.276611f,
- 0.723145f, 0.276123f, 0.723145f, 0.275635f, 0.723145f, 0.274902f, 0.723633f, 0.273682f,
- 0.723633f, 0.271973f, 0.724121f, 0.269531f, 0.724609f, 0.266113f, 0.725098f, 0.262207f,
- 0.725098f, 0.257080f, 0.724609f, 0.250732f, 0.722656f, 0.243652f, 0.725586f, 0.235474f,
- 0.724121f, 0.226685f, 0.723145f, 0.216919f, 0.722656f, 0.206787f, 0.720703f, 0.196289f,
- 0.723145f, 0.185791f, 0.723633f, 0.175171f, 0.724121f, 0.164795f, 0.728027f, 0.154663f,
- 0.730469f, 0.144897f, 0.731934f, 0.135498f, 0.734863f, 0.126587f, 0.737305f, 0.118103f,
- 0.739258f, 0.110107f, 0.739746f, 0.102478f, 0.741699f, 0.095398f, 0.743164f, 0.088745f,
- 0.743652f, 0.082520f, 0.743652f, 0.076660f, 0.743652f, 0.071228f, 0.742676f, 0.066101f,
- 0.741211f, 0.061401f, 0.739258f, 0.057007f, 0.735840f, 0.052887f, 0.732422f, 0.049103f,
- 0.728516f, 0.045563f, 0.723145f, 0.042297f, 0.717773f, 0.039246f, 0.711914f, 0.036438f,
- 0.704590f, 0.033813f, 0.697754f, 0.031403f, 0.689453f, 0.029160f, 0.681152f, 0.027069f,
- 0.671875f, 0.025146f, 0.662598f, 0.023346f, 0.652832f, 0.021698f, 0.642578f, 0.020157f,
- 0.631836f, 0.018738f, 0.621094f, 0.017426f, 0.609375f, 0.016205f, 0.597656f, 0.015076f,
- 0.585938f, 0.014023f, 0.573730f, 0.013054f, 0.561523f, 0.012146f, 0.548828f, 0.011314f,
- 0.536621f, 0.010536f, 0.523926f, 0.009811f, 0.511230f, 0.009148f, 0.498291f, 0.008530f,
- 0.693848f, 0.305664f, 0.693848f, 0.305664f, 0.693848f, 0.305664f, 0.693848f, 0.305664f,
- 0.693848f, 0.305176f, 0.694336f, 0.304443f, 0.694824f, 0.303467f, 0.695312f, 0.302002f,
- 0.695312f, 0.299561f, 0.696289f, 0.296631f, 0.696777f, 0.292725f, 0.696777f, 0.287598f,
- 0.697754f, 0.281250f, 0.698242f, 0.273926f, 0.698730f, 0.265137f, 0.697266f, 0.255615f,
- 0.699707f, 0.245239f, 0.699707f, 0.234131f, 0.700195f, 0.222412f, 0.702637f, 0.210693f,
- 0.705078f, 0.198853f, 0.708496f, 0.187134f, 0.708984f, 0.175781f, 0.715332f, 0.164673f,
- 0.718750f, 0.154053f, 0.722168f, 0.143921f, 0.724121f, 0.134277f, 0.727539f, 0.125244f,
- 0.731934f, 0.116638f, 0.733398f, 0.108582f, 0.736816f, 0.101013f, 0.738281f, 0.093872f,
- 0.740234f, 0.087219f, 0.741699f, 0.081055f, 0.741211f, 0.075256f, 0.741211f, 0.069885f,
- 0.740723f, 0.064880f, 0.738281f, 0.060211f, 0.736328f, 0.055908f, 0.732910f, 0.051849f,
- 0.729004f, 0.048157f, 0.724609f, 0.044678f, 0.719727f, 0.041473f, 0.713379f, 0.038483f,
- 0.707031f, 0.035736f, 0.699707f, 0.033173f, 0.692383f, 0.030823f, 0.684082f, 0.028625f,
- 0.675293f, 0.026596f, 0.666016f, 0.024704f, 0.656738f, 0.022964f, 0.646484f, 0.021347f,
- 0.636230f, 0.019852f, 0.625488f, 0.018463f, 0.614258f, 0.017181f, 0.602539f, 0.015976f,
- 0.590820f, 0.014877f, 0.578613f, 0.013855f, 0.566895f, 0.012901f, 0.554688f, 0.012024f,
- 0.541992f, 0.011200f, 0.529297f, 0.010437f, 0.516602f, 0.009735f, 0.503906f, 0.009079f,
- 0.662598f, 0.337158f, 0.662598f, 0.337158f, 0.662598f, 0.337158f, 0.662598f, 0.336914f,
- 0.662598f, 0.336670f, 0.663086f, 0.335938f, 0.663086f, 0.334473f, 0.664062f, 0.332520f,
- 0.665039f, 0.329834f, 0.666016f, 0.325928f, 0.665527f, 0.320801f, 0.667969f, 0.314697f,
- 0.667480f, 0.306885f, 0.669922f, 0.298096f, 0.669434f, 0.287842f, 0.671387f, 0.276367f,
- 0.675781f, 0.264404f, 0.675781f, 0.251465f, 0.677734f, 0.238403f, 0.681152f, 0.225342f,
- 0.686035f, 0.212036f, 0.690430f, 0.199219f, 0.694824f, 0.186768f, 0.700684f, 0.174805f,
- 0.702637f, 0.163330f, 0.708008f, 0.152466f, 0.714844f, 0.142212f, 0.718750f, 0.132446f,
- 0.724609f, 0.123291f, 0.728516f, 0.114685f, 0.731445f, 0.106628f, 0.734375f, 0.099121f,
- 0.736816f, 0.092102f, 0.738770f, 0.085510f, 0.740723f, 0.079407f, 0.740234f, 0.073730f,
- 0.739258f, 0.068420f, 0.738770f, 0.063538f, 0.736328f, 0.058960f, 0.734375f, 0.054718f,
- 0.730469f, 0.050781f, 0.726562f, 0.047150f, 0.721191f, 0.043762f, 0.715332f, 0.040619f,
- 0.709473f, 0.037720f, 0.702637f, 0.035034f, 0.695312f, 0.032532f, 0.687500f, 0.030243f,
- 0.678711f, 0.028107f, 0.669922f, 0.026123f, 0.660645f, 0.024277f, 0.650391f, 0.022583f,
- 0.640137f, 0.021011f, 0.629395f, 0.019547f, 0.618652f, 0.018188f, 0.607422f, 0.016937f,
- 0.595703f, 0.015778f, 0.583984f, 0.014694f, 0.572266f, 0.013695f, 0.560059f, 0.012764f,
- 0.547852f, 0.011902f, 0.535156f, 0.011101f, 0.522461f, 0.010353f, 0.510254f, 0.009666f,
- 0.628418f, 0.371338f, 0.628418f, 0.371338f, 0.628418f, 0.371094f, 0.628418f, 0.371094f,
- 0.628418f, 0.370361f, 0.629395f, 0.369385f, 0.629883f, 0.367920f, 0.630859f, 0.365234f,
- 0.631836f, 0.361816f, 0.633301f, 0.357178f, 0.634766f, 0.350830f, 0.635742f, 0.343262f,
- 0.638184f, 0.333984f, 0.640137f, 0.322998f, 0.641113f, 0.311035f, 0.645508f, 0.297852f,
- 0.647949f, 0.283691f, 0.652344f, 0.269043f, 0.657227f, 0.254395f, 0.662598f, 0.239868f,
- 0.669922f, 0.225464f, 0.673340f, 0.211426f, 0.680664f, 0.197876f, 0.685547f, 0.184937f,
- 0.693359f, 0.172729f, 0.700684f, 0.161011f, 0.705566f, 0.150146f, 0.711426f, 0.139771f,
- 0.718750f, 0.130005f, 0.722168f, 0.120911f, 0.727051f, 0.112427f, 0.732422f, 0.104431f,
- 0.733887f, 0.097046f, 0.737305f, 0.090088f, 0.738770f, 0.083618f, 0.740234f, 0.077637f,
- 0.739258f, 0.072083f, 0.738281f, 0.066895f, 0.736816f, 0.062073f, 0.734375f, 0.057648f,
- 0.731934f, 0.053497f, 0.728027f, 0.049683f, 0.723145f, 0.046112f, 0.717773f, 0.042816f,
- 0.712402f, 0.039764f, 0.705566f, 0.036957f, 0.698242f, 0.034332f, 0.690430f, 0.031891f,
- 0.682617f, 0.029663f, 0.673340f, 0.027573f, 0.664551f, 0.025650f, 0.654785f, 0.023865f,
- 0.644531f, 0.022202f, 0.634277f, 0.020676f, 0.623535f, 0.019257f, 0.612305f, 0.017929f,
- 0.601074f, 0.016708f, 0.589355f, 0.015579f, 0.577637f, 0.014526f, 0.565430f, 0.013550f,
- 0.553223f, 0.012642f, 0.541016f, 0.011787f, 0.528809f, 0.011009f, 0.516113f, 0.010277f,
- 0.591309f, 0.407959f, 0.591797f, 0.407959f, 0.591797f, 0.407959f, 0.591797f, 0.407471f,
- 0.592285f, 0.406982f, 0.592773f, 0.405762f, 0.593750f, 0.403564f, 0.594727f, 0.400391f,
- 0.596680f, 0.396240f, 0.598145f, 0.390137f, 0.600098f, 0.382568f, 0.602539f, 0.373047f,
- 0.604980f, 0.361816f, 0.606934f, 0.348877f, 0.611816f, 0.334473f, 0.616699f, 0.319336f,
- 0.620605f, 0.302979f, 0.627930f, 0.286865f, 0.634277f, 0.270508f, 0.638672f, 0.254150f,
- 0.647949f, 0.238525f, 0.654297f, 0.223389f, 0.663086f, 0.208862f, 0.673828f, 0.195068f,
- 0.680176f, 0.182007f, 0.689941f, 0.169678f, 0.696289f, 0.157959f, 0.705078f, 0.147095f,
- 0.713867f, 0.136841f, 0.719727f, 0.127197f, 0.724121f, 0.118225f, 0.729980f, 0.109863f,
- 0.731934f, 0.101990f, 0.735840f, 0.094727f, 0.737305f, 0.087952f, 0.738770f, 0.081604f,
- 0.740234f, 0.075745f, 0.739258f, 0.070312f, 0.738281f, 0.065247f, 0.735840f, 0.060608f,
- 0.733398f, 0.056274f, 0.729492f, 0.052246f, 0.725098f, 0.048523f, 0.720703f, 0.045074f,
- 0.714355f, 0.041870f, 0.708496f, 0.038910f, 0.701660f, 0.036163f, 0.693848f, 0.033630f,
- 0.686035f, 0.031281f, 0.677734f, 0.029099f, 0.668457f, 0.027069f, 0.659180f, 0.025192f,
- 0.648926f, 0.023453f, 0.639160f, 0.021851f, 0.628418f, 0.020355f, 0.617676f, 0.018967f,
- 0.605957f, 0.017685f, 0.594727f, 0.016495f, 0.583008f, 0.015388f, 0.571289f, 0.014366f,
- 0.559570f, 0.013412f, 0.546875f, 0.012520f, 0.534668f, 0.011696f, 0.522461f, 0.010925f,
- 0.551758f, 0.447754f, 0.551758f, 0.447754f, 0.552246f, 0.447510f, 0.552246f, 0.447266f,
- 0.552734f, 0.446289f, 0.553223f, 0.444580f, 0.555176f, 0.441895f, 0.556152f, 0.438232f,
- 0.558594f, 0.432617f, 0.561035f, 0.425049f, 0.563477f, 0.415527f, 0.566406f, 0.404053f,
- 0.570312f, 0.390381f, 0.575195f, 0.375000f, 0.578613f, 0.358154f, 0.584473f, 0.340332f,
- 0.593750f, 0.322266f, 0.600098f, 0.303955f, 0.611328f, 0.286133f, 0.617676f, 0.268555f,
- 0.629395f, 0.251709f, 0.640625f, 0.235352f, 0.649902f, 0.219849f, 0.661621f, 0.205078f,
- 0.671387f, 0.191284f, 0.678711f, 0.178223f, 0.688965f, 0.166016f, 0.699707f, 0.154419f,
- 0.707031f, 0.143555f, 0.714844f, 0.133545f, 0.719727f, 0.124084f, 0.726074f, 0.115295f,
- 0.731445f, 0.107056f, 0.734863f, 0.099365f, 0.737305f, 0.092285f, 0.739258f, 0.085632f,
- 0.740234f, 0.079529f, 0.739746f, 0.073792f, 0.739258f, 0.068542f, 0.737793f, 0.063599f,
- 0.734863f, 0.059082f, 0.731934f, 0.054871f, 0.727539f, 0.050964f, 0.723633f, 0.047394f,
- 0.717773f, 0.044006f, 0.711426f, 0.040924f, 0.705078f, 0.038055f, 0.697754f, 0.035400f,
- 0.689941f, 0.032928f, 0.681641f, 0.030655f, 0.672852f, 0.028534f, 0.663574f, 0.026581f,
- 0.653809f, 0.024750f, 0.644043f, 0.023071f, 0.633301f, 0.021515f, 0.622559f, 0.020050f,
- 0.611328f, 0.018707f, 0.600098f, 0.017456f, 0.588867f, 0.016296f, 0.577148f, 0.015221f,
- 0.565430f, 0.014221f, 0.553223f, 0.013290f, 0.541504f, 0.012421f, 0.528809f, 0.011620f,
- 0.509277f, 0.490234f, 0.509277f, 0.490234f, 0.509277f, 0.489990f, 0.509766f, 0.489502f,
- 0.510254f, 0.488525f, 0.511230f, 0.486328f, 0.512695f, 0.482910f, 0.514160f, 0.478027f,
- 0.517578f, 0.470947f, 0.520996f, 0.461670f, 0.523926f, 0.449707f, 0.528809f, 0.435303f,
- 0.534180f, 0.418945f, 0.540527f, 0.400635f, 0.548340f, 0.381348f, 0.554688f, 0.361328f,
- 0.566895f, 0.340820f, 0.577637f, 0.320801f, 0.588867f, 0.301270f, 0.601074f, 0.282471f,
- 0.610352f, 0.264404f, 0.624023f, 0.247070f, 0.637207f, 0.230591f, 0.649414f, 0.215210f,
- 0.662109f, 0.200562f, 0.672852f, 0.186768f, 0.685547f, 0.173828f, 0.693359f, 0.161743f,
- 0.702148f, 0.150391f, 0.711426f, 0.139771f, 0.720703f, 0.129883f, 0.726074f, 0.120667f,
- 0.730469f, 0.112061f, 0.733887f, 0.104065f, 0.738281f, 0.096619f, 0.739258f, 0.089722f,
- 0.740234f, 0.083252f, 0.741699f, 0.077332f, 0.740723f, 0.071777f, 0.739258f, 0.066711f,
- 0.736816f, 0.061951f, 0.734375f, 0.057556f, 0.730469f, 0.053497f, 0.726074f, 0.049713f,
- 0.720703f, 0.046234f, 0.714844f, 0.042999f, 0.708496f, 0.039978f, 0.701172f, 0.037231f,
- 0.693848f, 0.034637f, 0.685547f, 0.032257f, 0.677246f, 0.030060f, 0.667969f, 0.028000f,
- 0.658691f, 0.026108f, 0.648926f, 0.024338f, 0.638672f, 0.022705f, 0.627930f, 0.021194f,
- 0.617188f, 0.019775f, 0.605957f, 0.018463f, 0.594727f, 0.017258f, 0.583008f, 0.016129f,
- 0.571289f, 0.015076f, 0.559570f, 0.014099f, 0.547852f, 0.013191f, 0.535645f, 0.012337f,
- 0.463623f, 0.536133f, 0.463623f, 0.536133f, 0.463867f, 0.535645f, 0.464111f, 0.535156f,
- 0.465088f, 0.533691f, 0.466064f, 0.530762f, 0.468506f, 0.526367f, 0.471191f, 0.520020f,
- 0.474609f, 0.511230f, 0.478516f, 0.499268f, 0.483643f, 0.484375f, 0.489990f, 0.466797f,
- 0.495361f, 0.447266f, 0.502441f, 0.425537f, 0.515137f, 0.403564f, 0.526855f, 0.380859f,
- 0.540039f, 0.358887f, 0.553711f, 0.336914f, 0.564453f, 0.315918f, 0.587891f, 0.295898f,
- 0.600098f, 0.276611f, 0.610840f, 0.258545f, 0.624512f, 0.241211f, 0.641113f, 0.225098f,
- 0.657715f, 0.209717f, 0.668457f, 0.195312f, 0.678223f, 0.181763f, 0.687988f, 0.169067f,
- 0.701172f, 0.157104f, 0.707031f, 0.146118f, 0.715332f, 0.135620f, 0.723145f, 0.125977f,
- 0.728516f, 0.117126f, 0.734375f, 0.108704f, 0.736328f, 0.100952f, 0.739746f, 0.093750f,
- 0.741699f, 0.087036f, 0.742188f, 0.080872f, 0.741699f, 0.075134f, 0.741211f, 0.069763f,
- 0.739258f, 0.064819f, 0.736816f, 0.060272f, 0.733398f, 0.056030f, 0.729004f, 0.052124f,
- 0.724121f, 0.048492f, 0.718750f, 0.045105f, 0.712402f, 0.041992f, 0.705078f, 0.039093f,
- 0.698242f, 0.036407f, 0.689941f, 0.033905f, 0.681641f, 0.031616f, 0.672852f, 0.029480f,
- 0.663574f, 0.027512f, 0.653809f, 0.025665f, 0.644043f, 0.023956f, 0.633301f, 0.022369f,
- 0.622559f, 0.020889f, 0.611816f, 0.019516f, 0.601074f, 0.018250f, 0.589355f, 0.017059f,
- 0.578125f, 0.015961f, 0.565918f, 0.014946f, 0.554199f, 0.013992f, 0.542480f, 0.013107f,
- 0.414551f, 0.584961f, 0.414551f, 0.584961f, 0.414795f, 0.584961f, 0.415039f, 0.583984f,
- 0.416260f, 0.582031f, 0.418457f, 0.578613f, 0.420166f, 0.572754f, 0.424072f, 0.563965f,
- 0.428467f, 0.552246f, 0.433838f, 0.537109f, 0.441162f, 0.518066f, 0.448730f, 0.497070f,
- 0.458984f, 0.473633f, 0.467773f, 0.449219f, 0.480713f, 0.424072f, 0.497559f, 0.399414f,
- 0.511719f, 0.375244f, 0.529297f, 0.352051f, 0.543945f, 0.329834f, 0.566895f, 0.308838f,
- 0.581543f, 0.288574f, 0.598633f, 0.269531f, 0.619629f, 0.251465f, 0.635742f, 0.234497f,
- 0.646973f, 0.218506f, 0.659668f, 0.203369f, 0.674805f, 0.189331f, 0.684570f, 0.176025f,
- 0.695801f, 0.163696f, 0.707031f, 0.152222f, 0.718750f, 0.141357f, 0.723145f, 0.131348f,
- 0.729004f, 0.122009f, 0.734375f, 0.113342f, 0.738281f, 0.105286f, 0.741211f, 0.097778f,
- 0.743164f, 0.090820f, 0.744629f, 0.084412f, 0.744629f, 0.078430f, 0.743652f, 0.072876f,
- 0.742676f, 0.067749f, 0.739746f, 0.062988f, 0.735840f, 0.058624f, 0.731934f, 0.054535f,
- 0.727539f, 0.050751f, 0.721680f, 0.047241f, 0.715820f, 0.044006f, 0.709473f, 0.040985f,
- 0.702148f, 0.038208f, 0.694824f, 0.035614f, 0.686523f, 0.033234f, 0.677734f, 0.031006f,
- 0.668457f, 0.028946f, 0.659180f, 0.027023f, 0.649414f, 0.025238f, 0.639160f, 0.023590f,
- 0.628906f, 0.022049f, 0.618164f, 0.020630f, 0.606934f, 0.019287f, 0.595703f, 0.018051f,
- 0.584473f, 0.016907f, 0.572754f, 0.015839f, 0.561035f, 0.014839f, 0.549316f, 0.013908f,
- 0.361816f, 0.637695f, 0.361816f, 0.637695f, 0.362061f, 0.637207f, 0.362793f, 0.636230f,
- 0.364258f, 0.633301f, 0.366455f, 0.628906f, 0.369873f, 0.621094f, 0.374512f, 0.609375f,
- 0.378906f, 0.593750f, 0.387451f, 0.573730f, 0.396484f, 0.550293f, 0.407471f, 0.524414f,
- 0.419189f, 0.497314f, 0.433594f, 0.469971f, 0.453613f, 0.442627f, 0.473633f, 0.416016f,
- 0.488037f, 0.390381f, 0.509277f, 0.365967f, 0.528809f, 0.343262f, 0.549805f, 0.320801f,
- 0.574707f, 0.299805f, 0.590332f, 0.280029f, 0.609375f, 0.261475f, 0.631836f, 0.243774f,
- 0.641602f, 0.227173f, 0.659668f, 0.211426f, 0.671387f, 0.196777f, 0.685059f, 0.183105f,
- 0.698730f, 0.170166f, 0.705078f, 0.158203f, 0.715820f, 0.146973f, 0.723145f, 0.136597f,
- 0.730469f, 0.126831f, 0.737793f, 0.117920f, 0.740723f, 0.109558f, 0.741699f, 0.101807f,
- 0.745117f, 0.094604f, 0.747559f, 0.087891f, 0.747070f, 0.081726f, 0.747070f, 0.075989f,
- 0.744141f, 0.070679f, 0.742676f, 0.065796f, 0.739258f, 0.061218f, 0.735840f, 0.056976f,
- 0.730957f, 0.053070f, 0.725586f, 0.049438f, 0.719727f, 0.046082f, 0.713867f, 0.042938f,
- 0.706543f, 0.040070f, 0.699219f, 0.037384f, 0.690918f, 0.034882f, 0.682617f, 0.032562f,
- 0.673828f, 0.030426f, 0.664551f, 0.028442f, 0.654785f, 0.026581f, 0.645020f, 0.024857f,
- 0.634766f, 0.023254f, 0.624023f, 0.021774f, 0.613281f, 0.020386f, 0.602051f, 0.019089f,
- 0.590820f, 0.017899f, 0.579590f, 0.016769f, 0.567871f, 0.015732f, 0.556641f, 0.014755f,
- 0.305420f, 0.694336f, 0.305420f, 0.694336f, 0.305664f, 0.693848f, 0.306641f, 0.691895f,
- 0.308105f, 0.687988f, 0.311279f, 0.681152f, 0.316162f, 0.669922f, 0.321777f, 0.654297f,
- 0.330078f, 0.632812f, 0.344238f, 0.606934f, 0.353027f, 0.578125f, 0.367432f, 0.547852f,
- 0.385498f, 0.517578f, 0.405273f, 0.487793f, 0.422852f, 0.458496f, 0.448730f, 0.431152f,
- 0.473633f, 0.404541f, 0.493896f, 0.379639f, 0.519531f, 0.355469f, 0.539551f, 0.332520f,
- 0.563477f, 0.310791f, 0.583008f, 0.290283f, 0.604004f, 0.270752f, 0.626953f, 0.252686f,
- 0.642090f, 0.235352f, 0.657715f, 0.218994f, 0.672852f, 0.203857f, 0.686523f, 0.189575f,
- 0.699219f, 0.176270f, 0.707031f, 0.163818f, 0.717285f, 0.152344f, 0.723633f, 0.141602f,
- 0.730469f, 0.131592f, 0.739258f, 0.122375f, 0.741699f, 0.113708f, 0.745605f, 0.105713f,
- 0.747559f, 0.098267f, 0.748047f, 0.091370f, 0.749023f, 0.085022f, 0.748535f, 0.079102f,
- 0.747070f, 0.073608f, 0.746582f, 0.068542f, 0.742188f, 0.063843f, 0.739258f, 0.059448f,
- 0.734375f, 0.055420f, 0.730469f, 0.051666f, 0.724609f, 0.048187f, 0.717773f, 0.044952f,
- 0.710938f, 0.041962f, 0.704102f, 0.039154f, 0.695801f, 0.036591f, 0.687988f, 0.034180f,
- 0.679199f, 0.031952f, 0.670410f, 0.029892f, 0.660645f, 0.027969f, 0.650879f, 0.026184f,
- 0.640625f, 0.024521f, 0.630371f, 0.022964f, 0.619629f, 0.021515f, 0.608887f, 0.020172f,
- 0.598145f, 0.018921f, 0.586914f, 0.017761f, 0.575195f, 0.016663f, 0.563965f, 0.015656f,
- 0.244995f, 0.754395f, 0.245117f, 0.754395f, 0.245483f, 0.753418f, 0.246704f, 0.750977f,
- 0.249634f, 0.745117f, 0.253662f, 0.734863f, 0.260010f, 0.717773f, 0.268555f, 0.694336f,
- 0.277344f, 0.665527f, 0.292480f, 0.632812f, 0.309814f, 0.599121f, 0.331787f, 0.565918f,
- 0.352539f, 0.533203f, 0.376465f, 0.501953f, 0.405518f, 0.472412f, 0.433838f, 0.444336f,
- 0.456787f, 0.417236f, 0.488281f, 0.391357f, 0.510254f, 0.366211f, 0.540039f, 0.343018f,
- 0.564941f, 0.320557f, 0.579590f, 0.299561f, 0.606445f, 0.279541f, 0.627441f, 0.260498f,
- 0.638184f, 0.242676f, 0.666504f, 0.226074f, 0.670898f, 0.210327f, 0.687988f, 0.195801f,
- 0.700684f, 0.182129f, 0.706055f, 0.169312f, 0.718262f, 0.157471f, 0.727539f, 0.146362f,
- 0.735840f, 0.136108f, 0.738770f, 0.126587f, 0.743164f, 0.117737f, 0.746582f, 0.109497f,
- 0.751953f, 0.101868f, 0.751953f, 0.094788f, 0.753906f, 0.088257f, 0.752930f, 0.082153f,
- 0.750977f, 0.076538f, 0.749512f, 0.071289f, 0.745605f, 0.066406f, 0.742188f, 0.061951f,
- 0.738281f, 0.057770f, 0.734375f, 0.053894f, 0.729004f, 0.050293f, 0.722656f, 0.046967f,
- 0.715332f, 0.043854f, 0.708496f, 0.040985f, 0.701172f, 0.038330f, 0.693359f, 0.035828f,
- 0.684570f, 0.033539f, 0.676270f, 0.031403f, 0.666992f, 0.029404f, 0.657227f, 0.027542f,
- 0.646973f, 0.025818f, 0.636719f, 0.024200f, 0.626465f, 0.022705f, 0.615723f, 0.021301f,
- 0.604980f, 0.020004f, 0.593750f, 0.018784f, 0.582520f, 0.017654f, 0.571289f, 0.016586f,
- 0.180542f, 0.818848f, 0.180664f, 0.818848f, 0.181274f, 0.817383f, 0.183350f, 0.812988f,
- 0.187134f, 0.802734f, 0.193237f, 0.784180f, 0.201416f, 0.757324f, 0.214355f, 0.723145f,
- 0.231445f, 0.685547f, 0.248901f, 0.648438f, 0.272217f, 0.611816f, 0.302979f, 0.577148f,
- 0.329834f, 0.544922f, 0.364258f, 0.514160f, 0.394043f, 0.484619f, 0.425781f, 0.456055f,
- 0.456543f, 0.428467f, 0.481934f, 0.402344f, 0.512207f, 0.376709f, 0.540039f, 0.352783f,
- 0.566406f, 0.329346f, 0.579102f, 0.307617f, 0.607910f, 0.286865f, 0.627930f, 0.267822f,
- 0.645996f, 0.249512f, 0.661621f, 0.232178f, 0.677734f, 0.216309f, 0.691406f, 0.201172f,
- 0.702637f, 0.187256f, 0.711426f, 0.174194f, 0.721680f, 0.161987f, 0.730957f, 0.150879f,
- 0.736328f, 0.140259f, 0.742188f, 0.130493f, 0.746582f, 0.121582f, 0.750488f, 0.113159f,
- 0.751953f, 0.105347f, 0.752930f, 0.098083f, 0.756836f, 0.091370f, 0.755859f, 0.085144f,
- 0.755371f, 0.079346f, 0.752441f, 0.073975f, 0.750488f, 0.069031f, 0.746582f, 0.064392f,
- 0.743652f, 0.060120f, 0.737793f, 0.056152f, 0.733398f, 0.052460f, 0.727051f, 0.049011f,
- 0.720215f, 0.045837f, 0.713867f, 0.042847f, 0.706543f, 0.040100f, 0.699219f, 0.037537f,
- 0.690430f, 0.035156f, 0.682129f, 0.032928f, 0.672852f, 0.030884f, 0.663086f, 0.028961f,
- 0.653809f, 0.027161f, 0.644043f, 0.025497f, 0.633301f, 0.023941f, 0.622559f, 0.022491f,
- 0.612305f, 0.021133f, 0.601074f, 0.019867f, 0.590332f, 0.018692f, 0.579102f, 0.017578f,
- 0.111816f, 0.888184f, 0.112000f, 0.887207f, 0.112976f, 0.883789f, 0.115845f, 0.873047f,
- 0.122864f, 0.849609f, 0.133301f, 0.813477f, 0.147217f, 0.770996f, 0.167236f, 0.728027f,
- 0.196411f, 0.688965f, 0.222290f, 0.653320f, 0.258057f, 0.619629f, 0.293457f, 0.587402f,
- 0.328613f, 0.556152f, 0.361328f, 0.524902f, 0.392578f, 0.495850f, 0.430420f, 0.466064f,
- 0.459961f, 0.437744f, 0.482422f, 0.410889f, 0.511230f, 0.385010f, 0.536621f, 0.359863f,
- 0.568848f, 0.336182f, 0.592773f, 0.313721f, 0.614258f, 0.293213f, 0.626953f, 0.273193f,
- 0.646484f, 0.254639f, 0.657227f, 0.237427f, 0.683105f, 0.221191f, 0.693359f, 0.205933f,
- 0.698242f, 0.191772f, 0.709473f, 0.178589f, 0.724609f, 0.166260f, 0.733398f, 0.154907f,
- 0.739746f, 0.144165f, 0.745605f, 0.134399f, 0.750977f, 0.125122f, 0.753906f, 0.116577f,
- 0.754883f, 0.108704f, 0.758301f, 0.101257f, 0.759766f, 0.094482f, 0.757812f, 0.088074f,
- 0.759766f, 0.082092f, 0.758301f, 0.076660f, 0.756348f, 0.071594f, 0.752441f, 0.066833f,
- 0.748047f, 0.062469f, 0.741699f, 0.058380f, 0.736816f, 0.054596f, 0.732910f, 0.051086f,
- 0.726074f, 0.047791f, 0.719727f, 0.044769f, 0.711914f, 0.041901f, 0.704590f, 0.039276f,
- 0.696289f, 0.036804f, 0.688477f, 0.034546f, 0.678711f, 0.032410f, 0.669922f, 0.030411f,
- 0.660156f, 0.028564f, 0.650391f, 0.026840f, 0.640625f, 0.025223f, 0.630371f, 0.023727f,
- 0.619629f, 0.022324f, 0.608887f, 0.020996f, 0.597656f, 0.019775f, 0.586914f, 0.018631f,
- 0.038452f, 0.960938f, 0.039124f, 0.957520f, 0.042480f, 0.933594f, 0.051575f, 0.879395f,
- 0.069275f, 0.824219f, 0.091064f, 0.785156f, 0.126343f, 0.753906f, 0.154419f, 0.725586f,
- 0.192139f, 0.695312f, 0.234375f, 0.663086f, 0.273438f, 0.630371f, 0.305908f, 0.597656f,
- 0.338379f, 0.565430f, 0.379150f, 0.532227f, 0.413818f, 0.501465f, 0.444336f, 0.471191f,
- 0.471436f, 0.442383f, 0.504395f, 0.414795f, 0.531250f, 0.388672f, 0.547363f, 0.364014f,
- 0.579590f, 0.340088f, 0.603516f, 0.317627f, 0.622559f, 0.297119f, 0.635742f, 0.276855f,
- 0.669434f, 0.258301f, 0.670410f, 0.241089f, 0.685547f, 0.224854f, 0.699219f, 0.209717f,
- 0.712402f, 0.195190f, 0.720703f, 0.182373f, 0.729980f, 0.169678f, 0.746582f, 0.158325f,
- 0.744629f, 0.147705f, 0.748535f, 0.137695f, 0.760254f, 0.128296f, 0.757812f, 0.119629f,
- 0.761230f, 0.111755f, 0.762207f, 0.104248f, 0.764160f, 0.097290f, 0.763184f, 0.090881f,
- 0.762207f, 0.084900f, 0.760742f, 0.079285f, 0.759766f, 0.074097f, 0.755859f, 0.069275f,
- 0.752930f, 0.064758f, 0.747559f, 0.060669f, 0.742676f, 0.056793f, 0.737305f, 0.053131f,
- 0.731445f, 0.049774f, 0.725586f, 0.046661f, 0.718262f, 0.043732f, 0.710449f, 0.041077f,
- 0.702637f, 0.038544f, 0.694336f, 0.036163f, 0.685547f, 0.033966f, 0.676758f, 0.031921f,
- 0.667480f, 0.030014f, 0.657715f, 0.028229f, 0.647461f, 0.026566f, 0.637207f, 0.025009f,
- 0.626953f, 0.023544f, 0.616699f, 0.022186f, 0.605957f, 0.020920f, 0.594727f, 0.019730f,
-};
-
const float ltc_disk_integral[64 * 64] = {
0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
@@ -4530,16456 +3503,6 @@ const float ltc_disk_integral[64 * 64] = {
0.888889f, 0.904762f, 0.920635f, 0.936508f, 0.952381f, 0.968254f, 0.984127f, 1.000000f,
};
-const float btdf_split_sum_ggx[32][64 * 64] = {
- {
- 0.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.039917f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.999512f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.999512f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f,
- 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f,
- 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- },
- {
- 0.000122f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000122f, 0.004147f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.897949f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000732f, 0.996094f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002439f,
- 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000366f, 0.078308f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 1.000000f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.000122f, 0.000122f, 0.001098f, 0.992188f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f,
- 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.005001f, 0.998535f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f,
- 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.902344f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.002928f,
- 0.997070f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 1.000000f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000732f, 0.301758f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.002562f, 0.996094f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.433594f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.004021f, 0.996582f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001098f, 0.949219f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000610f,
- 0.012039f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.002073f, 0.993652f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000854f, 0.725586f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000610f, 0.011856f, 0.998047f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.002905f, 0.995117f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001098f, 0.978027f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000732f,
- 0.314941f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000731f, 0.017670f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000366f, 0.005852f, 0.997559f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.003050f, 0.996094f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001957f, 0.993652f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001586f, 0.990234f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001220f, 0.986816f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.001220f,
- 0.984375f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f,
- 0.001098f, 0.985352f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.001220f, 0.989258f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.000122f, 0.000122f, 0.001341f, 0.993652f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.001586f, 0.996094f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.002802f, 0.997559f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000117f, 0.000122f, 0.000122f, 0.000243f, 0.006088f, 0.998535f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.026321f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.892578f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000975f,
- 0.993652f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.002317f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.017944f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.000122f, 0.000731f, 0.983887f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f,
- 0.000122f, 0.000122f, 0.001653f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.026108f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000732f, 0.995605f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.003777f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000365f, 0.991211f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002195f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000364f, 0.993164f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002672f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000360f, 0.998047f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.017075f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000731f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.997070f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.006874f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.000480f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.996582f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000067f, 0.005440f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000365f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000121f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.995605f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995117f,
- },
- {
- 0.003168f, 0.995605f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000976f, 0.053314f, 0.994629f, 0.998535f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000122f, 0.000122f, 0.000732f, 0.003660f, 0.653809f, 0.995117f, 0.998047f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.001463f, 0.010452f, 0.947266f, 0.995605f,
- 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000853f, 0.002928f, 0.037750f,
- 0.980957f, 0.996582f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000610f, 0.001342f,
- 0.006100f, 0.314453f, 0.989746f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f,
- 0.001091f, 0.002317f, 0.015839f, 0.910645f, 0.993652f, 0.997559f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000366f, 0.000732f, 0.001463f, 0.005302f, 0.068909f, 0.977539f, 0.995605f, 0.998047f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000244f, 0.000732f, 0.001098f, 0.002560f, 0.011551f, 0.658691f, 0.989746f,
- 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000732f, 0.001585f, 0.004868f, 0.041077f,
- 0.958984f, 0.994141f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000732f, 0.001215f, 0.002802f,
- 0.010834f, 0.441895f, 0.987305f, 0.996094f, 0.998535f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000488f, 0.000850f,
- 0.001586f, 0.004753f, 0.039154f, 0.948242f, 0.993652f, 0.997559f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f,
- 0.000732f, 0.001220f, 0.003159f, 0.012032f, 0.480713f, 0.985840f, 0.996094f, 0.998047f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000240f, 0.000731f, 0.001097f, 0.001950f, 0.005966f, 0.054413f, 0.957520f, 0.994141f,
- 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000486f, 0.000732f, 0.001534f, 0.003536f, 0.016937f, 0.726562f,
- 0.988281f, 0.996582f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000732f, 0.001098f, 0.002192f, 0.008278f,
- 0.125244f, 0.974121f, 0.994629f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000731f, 0.000947f, 0.001828f,
- 0.005314f, 0.031677f, 0.916016f, 0.991699f, 0.997070f, 0.998535f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f,
- 0.001339f, 0.003294f, 0.014389f, 0.562012f, 0.985840f, 0.996094f, 0.998047f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f,
- 0.000732f, 0.001098f, 0.002310f, 0.008163f, 0.123779f, 0.973633f, 0.994629f, 0.997559f,
- 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000365f, 0.000732f, 0.001097f, 0.002071f, 0.005669f, 0.041199f, 0.937988f, 0.992676f,
- 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000366f, 0.000728f, 0.000732f, 0.001585f, 0.004143f, 0.020813f, 0.813965f,
- 0.989746f, 0.996582f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f, 0.001220f, 0.003292f, 0.012581f,
- 0.446533f, 0.984863f, 0.996094f, 0.998047f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000471f, 0.000732f, 0.001220f, 0.002796f,
- 0.009338f, 0.161865f, 0.977051f, 0.995117f, 0.997559f, 0.998535f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000732f, 0.001098f,
- 0.002285f, 0.006870f, 0.074097f, 0.965820f, 0.994141f, 0.997559f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000731f,
- 0.001086f, 0.001945f, 0.005238f, 0.043732f, 0.947754f, 0.993652f, 0.997559f, 0.998535f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f,
- 0.000730f, 0.000893f, 0.001826f, 0.004871f, 0.030411f, 0.922852f, 0.992188f, 0.997559f,
- 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000243f, 0.000609f, 0.000732f, 0.001407f, 0.004375f, 0.023758f, 0.892090f, 0.992188f,
- 0.997070f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000605f, 0.000732f, 0.001579f, 0.003941f, 0.020767f, 0.862793f,
- 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000238f, 0.000483f, 0.000732f, 0.001449f, 0.003654f, 0.018951f,
- 0.847656f, 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000233f, 0.000485f, 0.000732f, 0.001308f, 0.003353f,
- 0.018997f, 0.855469f, 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000118f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, 0.000732f, 0.001292f,
- 0.003649f, 0.019791f, 0.881836f, 0.992188f, 0.997559f, 0.998535f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000432f, 0.000732f,
- 0.001220f, 0.003635f, 0.021912f, 0.916992f, 0.993652f, 0.997559f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f,
- 0.000732f, 0.001245f, 0.004002f, 0.028107f, 0.946289f, 0.994141f, 0.998047f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000085f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000475f, 0.000732f, 0.001611f, 0.004581f, 0.040466f, 0.966309f, 0.995605f, 0.998535f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000487f, 0.000732f, 0.001703f, 0.005589f, 0.073486f, 0.979980f, 0.996094f,
- 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000475f, 0.000732f, 0.001706f, 0.006809f, 0.198730f, 0.987305f,
- 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f, 0.002071f, 0.009590f, 0.647949f,
- 0.992188f, 0.997559f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000710f, 0.001093f, 0.002541f, 0.015533f,
- 0.922852f, 0.995117f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000728f, 0.001218f, 0.003387f,
- 0.034454f, 0.975586f, 0.996582f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000731f, 0.001219f,
- 0.004959f, 0.161865f, 0.989746f, 0.998047f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000731f,
- 0.001767f, 0.009331f, 0.849121f, 0.994629f, 0.998535f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f,
- 0.000732f, 0.002644f, 0.024231f, 0.977051f, 0.997559f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000685f, 0.001217f, 0.004139f, 0.195435f, 0.992676f, 0.998535f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000362f, 0.000731f, 0.001570f, 0.010086f, 0.944824f, 0.997070f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000365f, 0.000745f, 0.002781f, 0.051758f, 0.990723f, 0.998535f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000599f, 0.001176f, 0.006641f, 0.899414f, 0.997070f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000731f, 0.002066f, 0.032654f, 0.991211f, 0.998535f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000448f, 0.001088f, 0.005440f, 0.918457f, 0.997070f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000725f, 0.001822f, 0.038452f, 0.994141f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000329f, 0.000848f, 0.005672f, 0.972168f,
- 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000581f, 0.001982f, 0.155273f,
- 0.997070f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000330f, 0.000848f, 0.009247f,
- 0.992676f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000589f, 0.002625f,
- 0.958496f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001199f,
- 0.083374f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000716f,
- 0.007244f, 0.996582f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f,
- 0.002277f, 0.991211f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000070f, 0.000121f, 0.000122f, 0.000122f,
- 0.000854f, 0.950684f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000121f, 0.000122f,
- 0.000475f, 0.067139f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000122f,
- 0.000002f, 0.005859f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f,
- 0.000014f, 0.001376f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000121f, 0.000572f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000077f, 0.000002f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000103f, 0.992188f, 0.991699f, 0.991699f, 0.992188f, 0.992188f, 0.991699f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.940430f, 0.940430f, 0.940918f, 0.940918f, 0.940430f, 0.940430f,
- },
- {
- 0.014023f, 0.979492f, 0.994629f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000488f, 0.004757f, 0.163330f, 0.975098f, 0.993164f, 0.996582f, 0.997559f, 0.998535f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000610f, 0.002928f, 0.017166f, 0.563965f, 0.978027f, 0.992676f, 0.996094f,
- 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000364f, 0.000732f, 0.002192f, 0.006573f, 0.044952f, 0.830566f, 0.980957f,
- 0.992676f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000366f, 0.000854f, 0.001586f, 0.004253f, 0.014313f, 0.130371f,
- 0.919922f, 0.984375f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000488f, 0.000854f, 0.001342f, 0.003025f, 0.007305f,
- 0.028870f, 0.407715f, 0.954590f, 0.987305f, 0.993652f, 0.996094f, 0.997070f, 0.998047f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000609f, 0.000842f, 0.000976f, 0.002193f,
- 0.005112f, 0.012505f, 0.066589f, 0.768066f, 0.970703f, 0.989746f, 0.994629f, 0.996582f,
- 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000244f, 0.000599f, 0.000609f, 0.000976f,
- 0.001829f, 0.003046f, 0.007256f, 0.023499f, 0.194946f, 0.908691f, 0.979980f, 0.991699f,
- 0.995117f, 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000488f, 0.000609f,
- 0.000976f, 0.001583f, 0.002647f, 0.004726f, 0.012169f, 0.050537f, 0.568359f, 0.954102f,
- 0.985840f, 0.993164f, 0.995605f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000488f,
- 0.000610f, 0.000975f, 0.001211f, 0.001946f, 0.003532f, 0.007793f, 0.022446f, 0.139648f,
- 0.856445f, 0.974121f, 0.989746f, 0.994141f, 0.996094f, 0.997559f, 0.998047f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f,
- 0.000310f, 0.000609f, 0.000807f, 0.001098f, 0.001822f, 0.002794f, 0.005699f, 0.012878f,
- 0.047821f, 0.469238f, 0.941406f, 0.982910f, 0.991699f, 0.995117f, 0.996582f, 0.997559f,
- 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000244f, 0.000244f, 0.000609f, 0.000732f, 0.001098f, 0.001461f, 0.002274f, 0.004025f,
- 0.008247f, 0.023254f, 0.135254f, 0.833984f, 0.969727f, 0.987793f, 0.993652f, 0.995605f,
- 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000207f, 0.000244f, 0.000609f, 0.000610f, 0.001096f, 0.001098f, 0.002071f,
- 0.003370f, 0.006172f, 0.014442f, 0.052795f, 0.486572f, 0.940430f, 0.981934f, 0.991699f,
- 0.994629f, 0.996582f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000485f, 0.000610f, 0.001080f, 0.001098f,
- 0.001742f, 0.002668f, 0.004692f, 0.010147f, 0.028076f, 0.168701f, 0.854004f, 0.970703f,
- 0.988770f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000487f, 0.000610f, 0.000731f,
- 0.001098f, 0.001413f, 0.002411f, 0.003895f, 0.007072f, 0.017242f, 0.069580f, 0.605957f,
- 0.948730f, 0.983398f, 0.992188f, 0.995117f, 0.996582f, 0.997559f, 0.998047f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000244f, 0.000609f,
- 0.000610f, 0.001094f, 0.001337f, 0.001828f, 0.003275f, 0.005814f, 0.012054f, 0.036987f,
- 0.270752f, 0.899414f, 0.975586f, 0.989746f, 0.993652f, 0.996094f, 0.997070f, 0.998047f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000365f,
- 0.000597f, 0.000610f, 0.000970f, 0.001098f, 0.001815f, 0.002771f, 0.005009f, 0.008888f,
- 0.023804f, 0.115845f, 0.775879f, 0.962891f, 0.986328f, 0.993164f, 0.995605f, 0.997070f,
- 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000244f, 0.000536f, 0.000731f, 0.000937f, 0.001203f, 0.001581f, 0.002186f, 0.004005f,
- 0.007061f, 0.016830f, 0.061218f, 0.522949f, 0.940430f, 0.981934f, 0.991211f, 0.994629f,
- 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000363f, 0.000487f, 0.000731f, 0.000732f, 0.001097f, 0.001339f, 0.002071f,
- 0.003498f, 0.005947f, 0.012390f, 0.037964f, 0.268799f, 0.896973f, 0.975586f, 0.989258f,
- 0.994141f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000244f, 0.000366f, 0.000609f, 0.000610f, 0.001094f, 0.001215f,
- 0.002056f, 0.003183f, 0.004742f, 0.009880f, 0.026337f, 0.139526f, 0.813477f, 0.966309f,
- 0.986816f, 0.993164f, 0.996094f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000163f, 0.000363f, 0.000600f, 0.000731f, 0.001088f,
- 0.001216f, 0.001616f, 0.002640f, 0.004402f, 0.008156f, 0.019669f, 0.083191f, 0.664062f,
- 0.953125f, 0.984375f, 0.992188f, 0.995117f, 0.997070f, 0.998047f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000244f, 0.000523f, 0.000731f,
- 0.000732f, 0.001097f, 0.001690f, 0.002169f, 0.003998f, 0.006939f, 0.015808f, 0.055634f,
- 0.471191f, 0.935059f, 0.980957f, 0.991211f, 0.995117f, 0.996582f, 0.997559f, 0.998047f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000336f, 0.000486f,
- 0.000731f, 0.000732f, 0.001097f, 0.001558f, 0.002069f, 0.003525f, 0.006058f, 0.013062f,
- 0.040894f, 0.306396f, 0.910156f, 0.978027f, 0.990234f, 0.994141f, 0.996582f, 0.997559f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000113f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000360f,
- 0.000515f, 0.000731f, 0.000731f, 0.001094f, 0.001219f, 0.002148f, 0.003159f, 0.005577f,
- 0.011360f, 0.031952f, 0.203979f, 0.874512f, 0.973633f, 0.989258f, 0.994141f, 0.996582f,
- 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000325f, 0.000366f, 0.000731f, 0.000731f, 0.001093f, 0.001219f, 0.001820f, 0.002916f,
- 0.005291f, 0.009758f, 0.026352f, 0.145020f, 0.832520f, 0.969238f, 0.988281f, 0.993652f,
- 0.996094f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000244f, 0.000440f, 0.000605f, 0.000731f, 0.001086f, 0.001097f, 0.001646f,
- 0.002670f, 0.004230f, 0.008835f, 0.022415f, 0.112183f, 0.786133f, 0.966309f, 0.987793f,
- 0.993652f, 0.996094f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000272f, 0.000358f, 0.000565f, 0.000731f, 0.000790f, 0.001210f,
- 0.001573f, 0.002434f, 0.004360f, 0.008102f, 0.020660f, 0.092896f, 0.741699f, 0.962891f,
- 0.987305f, 0.993164f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000364f, 0.000723f, 0.000731f, 0.000731f,
- 0.001216f, 0.001698f, 0.002510f, 0.003998f, 0.007484f, 0.018463f, 0.082336f, 0.709961f,
- 0.961426f, 0.986816f, 0.993652f, 0.996094f, 0.997559f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000362f, 0.000704f, 0.000730f,
- 0.000845f, 0.001096f, 0.001513f, 0.002302f, 0.003941f, 0.007168f, 0.017746f, 0.076782f,
- 0.693848f, 0.961426f, 0.987305f, 0.993652f, 0.996094f, 0.997559f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000364f, 0.000579f,
- 0.000728f, 0.000731f, 0.001096f, 0.001491f, 0.002069f, 0.003899f, 0.007195f, 0.017059f,
- 0.075439f, 0.701172f, 0.962402f, 0.987793f, 0.993652f, 0.996094f, 0.997559f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000357f,
- 0.000482f, 0.000730f, 0.000731f, 0.001094f, 0.001334f, 0.002230f, 0.003708f, 0.007217f,
- 0.017410f, 0.079163f, 0.730469f, 0.965820f, 0.988281f, 0.994141f, 0.996582f, 0.998047f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f,
- 0.000243f, 0.000365f, 0.000729f, 0.000731f, 0.001095f, 0.001330f, 0.002066f, 0.003637f,
- 0.007118f, 0.018112f, 0.087708f, 0.775391f, 0.969238f, 0.989258f, 0.994629f, 0.997070f,
- 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000073f, 0.000121f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000323f, 0.000390f, 0.000729f, 0.000731f, 0.001094f, 0.001332f, 0.002275f,
- 0.003782f, 0.007252f, 0.019379f, 0.105042f, 0.827637f, 0.973145f, 0.990723f, 0.994629f,
- 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000114f, 0.000121f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000240f, 0.000369f, 0.000729f, 0.000731f, 0.001093f, 0.001330f,
- 0.002209f, 0.003937f, 0.007896f, 0.021805f, 0.137207f, 0.876953f, 0.979004f, 0.991699f,
- 0.995605f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000272f, 0.000479f, 0.000727f, 0.000731f, 0.001085f,
- 0.001331f, 0.002291f, 0.004105f, 0.008446f, 0.025024f, 0.202271f, 0.916504f, 0.982910f,
- 0.993164f, 0.996094f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000360f, 0.000469f, 0.000681f, 0.000731f,
- 0.001092f, 0.001331f, 0.002184f, 0.004227f, 0.009521f, 0.030899f, 0.335205f, 0.945312f,
- 0.986816f, 0.993652f, 0.996582f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000116f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000429f, 0.000726f,
- 0.000731f, 0.001091f, 0.001649f, 0.002464f, 0.004810f, 0.010895f, 0.041931f, 0.563477f,
- 0.963867f, 0.989746f, 0.995117f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000101f, 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000288f, 0.000481f,
- 0.000720f, 0.000731f, 0.001093f, 0.001571f, 0.002735f, 0.005405f, 0.013199f, 0.064880f,
- 0.786133f, 0.976562f, 0.992188f, 0.995605f, 0.997559f, 0.998535f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000121f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000240f,
- 0.000481f, 0.000727f, 0.000731f, 0.001093f, 0.001655f, 0.003132f, 0.005909f, 0.017181f,
- 0.123169f, 0.904297f, 0.984375f, 0.993652f, 0.996582f, 0.998047f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000120f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000264f, 0.000392f, 0.000727f, 0.000835f, 0.001196f, 0.001765f, 0.003252f, 0.007343f,
- 0.024521f, 0.304199f, 0.954102f, 0.989258f, 0.995605f, 0.997559f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000034f, 0.000119f,
- 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000235f, 0.000375f, 0.000728f, 0.000822f, 0.001095f, 0.002024f, 0.003952f,
- 0.009193f, 0.040894f, 0.694824f, 0.975586f, 0.992676f, 0.996582f, 0.998047f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000112f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000307f, 0.000475f, 0.000728f, 0.000943f, 0.001216f, 0.002283f,
- 0.004829f, 0.013008f, 0.092224f, 0.908203f, 0.986328f, 0.995117f, 0.997559f, 0.998535f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000073f, 0.000118f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000240f, 0.000576f, 0.000728f, 0.001073f, 0.001569f,
- 0.002668f, 0.005947f, 0.020889f, 0.331543f, 0.965820f, 0.992188f, 0.996582f, 0.998047f,
- 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000100f, 0.000120f, 0.000121f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000362f, 0.000630f, 0.000729f, 0.001087f,
- 0.001567f, 0.003241f, 0.008240f, 0.043793f, 0.824219f, 0.984375f, 0.994629f, 0.997559f,
- 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000075f, 0.000119f, 0.000121f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000363f, 0.000689f, 0.000730f,
- 0.001185f, 0.002022f, 0.004108f, 0.013702f, 0.161011f, 0.957031f, 0.991699f, 0.996582f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000105f, 0.000120f,
- 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000156f, 0.000372f, 0.000689f,
- 0.000730f, 0.001198f, 0.002651f, 0.006214f, 0.028854f, 0.750000f, 0.984375f, 0.995605f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000102f,
- 0.000118f, 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000472f,
- 0.000724f, 0.000966f, 0.001658f, 0.003397f, 0.010582f, 0.116028f, 0.959473f, 0.993164f,
- 0.997559f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000111f, 0.000119f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f,
- 0.000479f, 0.000726f, 0.001163f, 0.002157f, 0.004829f, 0.024338f, 0.776855f, 0.987793f,
- 0.996582f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000097f, 0.000117f, 0.000120f, 0.000121f, 0.000121f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000219f, 0.000580f, 0.000728f, 0.001203f, 0.002872f, 0.009109f, 0.130371f, 0.972168f,
- 0.995117f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000118f, 0.000121f, 0.000121f,
- 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000333f, 0.000681f, 0.000940f, 0.001629f, 0.004120f, 0.025467f, 0.890625f,
- 0.991699f, 0.997559f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000083f, 0.000116f, 0.000120f,
- 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000353f, 0.000722f, 0.000961f, 0.002403f, 0.009354f, 0.295166f,
- 0.985840f, 0.997070f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000105f,
- 0.000118f, 0.000120f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000130f, 0.000427f, 0.000605f, 0.001345f, 0.004620f, 0.041229f,
- 0.966797f, 0.996094f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000074f, 0.000114f, 0.000119f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000089f, 0.000562f, 0.000942f, 0.002352f, 0.012459f,
- 0.854004f, 0.994141f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000103f, 0.000117f, 0.000120f, 0.000121f, 0.000121f, 0.000121f,
- 0.000122f, 0.000122f, 0.000007f, 0.000002f, 0.000231f, 0.000596f, 0.001180f, 0.005474f,
- 0.211426f, 0.991211f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000118f, 0.000120f, 0.000121f,
- 0.000121f, 0.000122f, 0.000029f, 0.000004f, 0.000001f, 0.000348f, 0.000896f, 0.002764f,
- 0.032562f, 0.984375f, 0.998535f, 0.998535f, 0.999023f, 0.998535f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000089f, 0.000116f, 0.000119f,
- 0.000121f, 0.000121f, 0.000121f, 0.000013f, 0.000003f, 0.000075f, 0.000586f, 0.001508f,
- 0.010292f, 0.963379f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000107f,
- 0.000118f, 0.000120f, 0.000121f, 0.000116f, 0.000008f, 0.000002f, 0.000233f, 0.000857f,
- 0.004566f, 0.834961f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000083f, 0.000114f, 0.000119f, 0.000120f, 0.000060f, 0.000005f, 0.000001f, 0.000557f,
- 0.002064f, 0.182373f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000103f, 0.000117f, 0.000120f, 0.000024f, 0.000003f, 0.000168f,
- 0.000968f, 0.026428f, 0.996582f, 0.997070f, 0.996582f, 0.996582f, 0.996582f, 0.997070f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000047f, 0.000110f, 0.000118f, 0.000017f, 0.000002f,
- 0.000513f, 0.006870f, 0.995605f, 0.995605f, 0.995117f, 0.995117f, 0.995117f, 0.995117f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000096f, 0.000115f, 0.000011f,
- 0.000042f, 0.001919f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992676f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000044f, 0.000109f,
- 0.000008f, 0.000314f, 0.985840f, 0.985840f, 0.985840f, 0.985840f, 0.986328f, 0.985840f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000089f, 0.000060f, 0.964355f, 0.964355f, 0.963867f, 0.963867f, 0.963379f, 0.964355f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000022f, 0.818848f, 0.819824f, 0.819336f, 0.819824f, 0.819824f, 0.819824f,
- },
- {
- 0.038849f, 0.941406f, 0.984375f, 0.992188f, 0.994141f, 0.996094f, 0.996582f, 0.997070f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f,
- 0.001582f, 0.014984f, 0.262451f, 0.930664f, 0.979980f, 0.989258f, 0.993164f, 0.995117f,
- 0.996094f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f,
- 0.000244f, 0.002317f, 0.009003f, 0.047180f, 0.524902f, 0.936523f, 0.978027f, 0.988281f,
- 0.992188f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f,
- 0.000122f, 0.001098f, 0.002560f, 0.006824f, 0.020493f, 0.108826f, 0.715820f, 0.946289f,
- 0.978516f, 0.988281f, 0.992188f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000607f, 0.001098f, 0.002310f, 0.005646f, 0.012825f, 0.040131f, 0.231201f,
- 0.825195f, 0.954590f, 0.979980f, 0.988281f, 0.992188f, 0.994141f, 0.995117f, 0.996582f,
- 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000244f, 0.000609f, 0.001341f, 0.002310f, 0.004208f, 0.008865f, 0.021591f,
- 0.074585f, 0.439209f, 0.885742f, 0.962402f, 0.981934f, 0.989258f, 0.992676f, 0.994141f,
- 0.995605f, 0.996582f, 0.997070f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f,
- 0.000000f, 0.000122f, 0.000483f, 0.000610f, 0.001460f, 0.002192f, 0.003994f, 0.007030f,
- 0.013847f, 0.036316f, 0.146362f, 0.661621f, 0.921875f, 0.969238f, 0.983398f, 0.989746f,
- 0.993164f, 0.994141f, 0.995605f, 0.996582f, 0.996582f, 0.997559f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000243f, 0.000604f, 0.000730f, 0.001307f, 0.001944f, 0.003017f,
- 0.004997f, 0.009834f, 0.021606f, 0.063416f, 0.295410f, 0.808594f, 0.944336f, 0.974609f,
- 0.985352f, 0.990234f, 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f,
- 0.000000f, 0.000000f, 0.000119f, 0.000366f, 0.000495f, 0.000731f, 0.001217f, 0.001823f,
- 0.002796f, 0.004398f, 0.007656f, 0.015366f, 0.035828f, 0.119263f, 0.531738f, 0.886230f,
- 0.958496f, 0.979004f, 0.986816f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.997070f,
- 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000244f, 0.000366f, 0.000607f, 0.000731f, 0.001211f,
- 0.001650f, 0.002441f, 0.003975f, 0.006207f, 0.011536f, 0.023315f, 0.060822f, 0.242798f,
- 0.744141f, 0.927734f, 0.969238f, 0.982422f, 0.989258f, 0.992188f, 0.994141f, 0.995605f,
- 0.996094f, 0.996582f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000211f, 0.000455f, 0.000486f, 0.000853f,
- 0.001081f, 0.001810f, 0.002426f, 0.003759f, 0.005501f, 0.009094f, 0.016876f, 0.037109f,
- 0.114075f, 0.475586f, 0.862305f, 0.951172f, 0.975586f, 0.985840f, 0.990234f, 0.992676f,
- 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000364f, 0.000366f, 0.000464f,
- 0.000731f, 0.001093f, 0.001577f, 0.002235f, 0.002798f, 0.004841f, 0.007637f, 0.013008f,
- 0.025635f, 0.063965f, 0.238403f, 0.720215f, 0.919434f, 0.965820f, 0.981445f, 0.987793f,
- 0.991211f, 0.993652f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f,
- 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.000609f,
- 0.000712f, 0.000974f, 0.000976f, 0.001507f, 0.002031f, 0.002680f, 0.004066f, 0.006294f,
- 0.010284f, 0.018326f, 0.040924f, 0.124146f, 0.485596f, 0.859375f, 0.949707f, 0.975586f,
- 0.984375f, 0.989746f, 0.992676f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997070f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000113f, 0.000487f,
- 0.000488f, 0.000610f, 0.000961f, 0.000976f, 0.001337f, 0.001705f, 0.002663f, 0.003521f,
- 0.005417f, 0.008408f, 0.014809f, 0.028793f, 0.073120f, 0.270996f, 0.741699f, 0.922363f,
- 0.965332f, 0.980957f, 0.987793f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.997070f,
- 0.997070f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000244f, 0.000224f,
- 0.000486f, 0.000609f, 0.000610f, 0.000973f, 0.000975f, 0.001306f, 0.001703f, 0.002350f,
- 0.003239f, 0.004848f, 0.007122f, 0.011955f, 0.021820f, 0.048859f, 0.152710f, 0.554199f,
- 0.875977f, 0.953125f, 0.976562f, 0.985352f, 0.990234f, 0.993164f, 0.994629f, 0.995605f,
- 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000234f,
- 0.000244f, 0.000485f, 0.000488f, 0.000610f, 0.000969f, 0.000975f, 0.001335f, 0.001693f,
- 0.001991f, 0.002811f, 0.004097f, 0.006397f, 0.009903f, 0.017303f, 0.035034f, 0.094421f,
- 0.354736f, 0.795898f, 0.933594f, 0.969238f, 0.981934f, 0.988281f, 0.991699f, 0.993652f,
- 0.995117f, 0.996094f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000244f, 0.000244f, 0.000480f, 0.000608f, 0.000488f, 0.000922f, 0.000975f, 0.000976f,
- 0.001339f, 0.001827f, 0.002674f, 0.003891f, 0.005688f, 0.008324f, 0.014320f, 0.026917f,
- 0.064392f, 0.216431f, 0.668945f, 0.904785f, 0.959961f, 0.978516f, 0.986816f, 0.990723f,
- 0.993652f, 0.994141f, 0.996094f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000188f, 0.000220f, 0.000480f, 0.000608f, 0.000609f, 0.000876f, 0.000975f,
- 0.000976f, 0.001454f, 0.002068f, 0.002649f, 0.003481f, 0.004757f, 0.007801f, 0.012230f,
- 0.021698f, 0.046814f, 0.138306f, 0.506348f, 0.859375f, 0.947754f, 0.974121f, 0.984375f,
- 0.989746f, 0.992188f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f,
- 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000446f, 0.000487f, 0.000609f, 0.000731f,
- 0.000973f, 0.000975f, 0.001310f, 0.001823f, 0.002304f, 0.002869f, 0.004890f, 0.006813f,
- 0.010475f, 0.017731f, 0.036163f, 0.095337f, 0.353516f, 0.792480f, 0.932129f, 0.968262f,
- 0.982422f, 0.988770f, 0.992188f, 0.993652f, 0.995605f, 0.996094f, 0.997070f, 0.997559f,
- 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000241f, 0.000362f, 0.000487f, 0.000609f,
- 0.000609f, 0.000973f, 0.001213f, 0.001419f, 0.001807f, 0.002068f, 0.002794f, 0.004070f,
- 0.005917f, 0.009140f, 0.015129f, 0.029053f, 0.070068f, 0.242554f, 0.700684f, 0.911621f,
- 0.961914f, 0.979492f, 0.987305f, 0.991211f, 0.993164f, 0.995117f, 0.995605f, 0.997070f,
- 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000243f, 0.000483f, 0.000603f,
- 0.000609f, 0.000730f, 0.001076f, 0.000975f, 0.001327f, 0.001598f, 0.002056f, 0.002848f,
- 0.003519f, 0.005589f, 0.008041f, 0.013321f, 0.024155f, 0.054718f, 0.171875f, 0.590332f,
- 0.885742f, 0.955566f, 0.977051f, 0.985840f, 0.990723f, 0.993164f, 0.994629f, 0.995605f,
- 0.997070f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000192f, 0.000122f, 0.000244f, 0.000483f,
- 0.000606f, 0.000608f, 0.000731f, 0.000953f, 0.001095f, 0.001258f, 0.001575f, 0.002066f,
- 0.002594f, 0.003857f, 0.004734f, 0.007683f, 0.011642f, 0.021179f, 0.044464f, 0.127930f,
- 0.476807f, 0.850586f, 0.947266f, 0.974121f, 0.984375f, 0.989746f, 0.992676f, 0.994141f,
- 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000229f, 0.000239f, 0.000244f,
- 0.000343f, 0.000483f, 0.000608f, 0.000609f, 0.000857f, 0.000973f, 0.001097f, 0.001571f,
- 0.002041f, 0.002399f, 0.002922f, 0.004471f, 0.006836f, 0.010643f, 0.018661f, 0.037354f,
- 0.100037f, 0.378418f, 0.810547f, 0.937988f, 0.971191f, 0.983887f, 0.989258f, 0.992188f,
- 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000161f,
- 0.000230f, 0.000244f, 0.000486f, 0.000607f, 0.000609f, 0.000819f, 0.000972f, 0.000975f,
- 0.001431f, 0.001945f, 0.002283f, 0.003031f, 0.004238f, 0.006424f, 0.009995f, 0.016068f,
- 0.032104f, 0.081360f, 0.302246f, 0.765625f, 0.928223f, 0.968750f, 0.982422f, 0.988770f,
- 0.992676f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000240f, 0.000240f, 0.000244f, 0.000450f, 0.000607f, 0.000609f, 0.000731f, 0.001084f,
- 0.000974f, 0.001341f, 0.001910f, 0.002254f, 0.003216f, 0.004017f, 0.005692f, 0.008980f,
- 0.014832f, 0.028854f, 0.069641f, 0.248657f, 0.719238f, 0.918945f, 0.965820f, 0.981445f,
- 0.988770f, 0.992188f, 0.994629f, 0.995605f, 0.996094f, 0.997070f, 0.997559f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000243f, 0.000360f, 0.000461f, 0.000607f, 0.000608f, 0.000731f,
- 0.001086f, 0.001202f, 0.001307f, 0.001592f, 0.002066f, 0.003134f, 0.003990f, 0.005611f,
- 0.008133f, 0.013680f, 0.025986f, 0.061462f, 0.211670f, 0.676758f, 0.910156f, 0.963867f,
- 0.980957f, 0.988281f, 0.991699f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.998047f,
- 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000240f, 0.000243f, 0.000482f, 0.000604f, 0.000608f,
- 0.000730f, 0.001040f, 0.001188f, 0.001287f, 0.001574f, 0.002064f, 0.002613f, 0.003721f,
- 0.005428f, 0.008018f, 0.013161f, 0.024200f, 0.055573f, 0.186401f, 0.642578f, 0.904785f,
- 0.962402f, 0.980469f, 0.987793f, 0.991699f, 0.994141f, 0.995605f, 0.996582f, 0.997070f,
- 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000480f, 0.000602f,
- 0.000721f, 0.000705f, 0.000907f, 0.001094f, 0.001096f, 0.001493f, 0.002058f, 0.002607f,
- 0.003639f, 0.004826f, 0.007595f, 0.012413f, 0.022171f, 0.051697f, 0.171143f, 0.619629f,
- 0.899414f, 0.961426f, 0.980957f, 0.987793f, 0.992188f, 0.994629f, 0.995605f, 0.996582f,
- 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000172f, 0.000232f, 0.000243f, 0.000244f,
- 0.000576f, 0.000711f, 0.000608f, 0.000767f, 0.001089f, 0.001213f, 0.001509f, 0.002029f,
- 0.002684f, 0.003550f, 0.005161f, 0.007107f, 0.011871f, 0.021545f, 0.049347f, 0.163086f,
- 0.609863f, 0.900391f, 0.962891f, 0.980957f, 0.988281f, 0.992676f, 0.994629f, 0.996094f,
- 0.996582f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000210f, 0.000122f, 0.000337f,
- 0.000290f, 0.000594f, 0.000726f, 0.000730f, 0.000731f, 0.001090f, 0.001212f, 0.001506f,
- 0.002029f, 0.002335f, 0.003489f, 0.005077f, 0.007000f, 0.011398f, 0.021027f, 0.048218f,
- 0.161133f, 0.614258f, 0.903809f, 0.963379f, 0.981934f, 0.988770f, 0.992188f, 0.994629f,
- 0.996094f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000281f, 0.000440f, 0.000683f, 0.000726f, 0.000730f, 0.000731f, 0.001087f, 0.001095f,
- 0.001485f, 0.001793f, 0.002214f, 0.002991f, 0.004951f, 0.006912f, 0.011162f, 0.020905f,
- 0.048187f, 0.165527f, 0.633789f, 0.910156f, 0.965820f, 0.982422f, 0.989746f, 0.993164f,
- 0.995117f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000241f, 0.000243f, 0.000480f, 0.000725f, 0.000697f, 0.000731f, 0.001007f,
- 0.001094f, 0.001360f, 0.001795f, 0.002161f, 0.003244f, 0.004871f, 0.006966f, 0.011330f,
- 0.020706f, 0.049591f, 0.178345f, 0.667969f, 0.918457f, 0.968262f, 0.983887f, 0.990234f,
- 0.993652f, 0.995605f, 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000086f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000243f, 0.000243f, 0.000465f, 0.000592f, 0.000729f, 0.000730f,
- 0.001079f, 0.001093f, 0.001332f, 0.001885f, 0.002129f, 0.003254f, 0.004818f, 0.006889f,
- 0.011429f, 0.021957f, 0.052521f, 0.201294f, 0.714355f, 0.929199f, 0.972168f, 0.985352f,
- 0.991211f, 0.994141f, 0.995605f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000115f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000184f, 0.000241f, 0.000347f, 0.000453f, 0.000579f, 0.000728f,
- 0.000729f, 0.001034f, 0.001093f, 0.001292f, 0.001857f, 0.002131f, 0.003296f, 0.004826f,
- 0.006958f, 0.011726f, 0.023071f, 0.057983f, 0.239258f, 0.767578f, 0.939453f, 0.976074f,
- 0.987305f, 0.992676f, 0.994629f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000088f, 0.000119f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000191f, 0.000242f, 0.000425f, 0.000558f,
- 0.000723f, 0.000730f, 0.001058f, 0.001092f, 0.001297f, 0.001653f, 0.002352f, 0.003124f,
- 0.004860f, 0.007072f, 0.012131f, 0.024551f, 0.066406f, 0.300537f, 0.820312f, 0.951172f,
- 0.979492f, 0.988281f, 0.993164f, 0.995117f, 0.996582f, 0.997070f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000121f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000227f, 0.000239f, 0.000341f, 0.000359f,
- 0.000587f, 0.000605f, 0.000729f, 0.001040f, 0.001185f, 0.001275f, 0.001849f, 0.002390f,
- 0.003399f, 0.005001f, 0.007404f, 0.012871f, 0.027237f, 0.079529f, 0.395264f, 0.868164f,
- 0.960938f, 0.982910f, 0.990234f, 0.993164f, 0.995605f, 0.997070f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000120f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000211f, 0.000239f, 0.000307f,
- 0.000394f, 0.000704f, 0.000711f, 0.000728f, 0.001001f, 0.001088f, 0.001204f, 0.001713f,
- 0.002367f, 0.003151f, 0.004639f, 0.007820f, 0.014084f, 0.030609f, 0.102722f, 0.527344f,
- 0.906250f, 0.969727f, 0.985840f, 0.991699f, 0.994629f, 0.996094f, 0.997559f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000115f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000196f,
- 0.000332f, 0.000363f, 0.000686f, 0.000719f, 0.000723f, 0.000963f, 0.001089f, 0.001290f,
- 0.001849f, 0.002394f, 0.003458f, 0.004833f, 0.008301f, 0.015579f, 0.036926f, 0.143188f,
- 0.676270f, 0.934570f, 0.976562f, 0.988281f, 0.992676f, 0.995605f, 0.996582f, 0.998047f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000102f, 0.000120f,
- 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000311f, 0.000345f, 0.000479f, 0.000723f, 0.000728f, 0.000934f, 0.001085f,
- 0.001282f, 0.001821f, 0.002399f, 0.003355f, 0.005524f, 0.008881f, 0.017807f, 0.047058f,
- 0.222046f, 0.803223f, 0.954102f, 0.981445f, 0.990723f, 0.994141f, 0.996582f, 0.997559f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000090f,
- 0.000116f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000201f, 0.000239f, 0.000358f, 0.000618f, 0.000719f, 0.000727f, 0.000863f,
- 0.001087f, 0.001350f, 0.001945f, 0.002689f, 0.003731f, 0.005817f, 0.010033f, 0.021332f,
- 0.064514f, 0.374512f, 0.885254f, 0.969238f, 0.986328f, 0.992676f, 0.995605f, 0.996582f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000086f, 0.000117f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000164f, 0.000238f, 0.000353f, 0.000596f, 0.000591f, 0.000727f,
- 0.000901f, 0.001085f, 0.001266f, 0.001767f, 0.002663f, 0.003914f, 0.006153f, 0.011612f,
- 0.026871f, 0.100525f, 0.605957f, 0.934082f, 0.978027f, 0.989746f, 0.994141f, 0.996094f,
- 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000107f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000195f, 0.000323f, 0.000339f, 0.000461f, 0.000706f,
- 0.000726f, 0.000845f, 0.001086f, 0.001298f, 0.001843f, 0.003027f, 0.004387f, 0.007011f,
- 0.013832f, 0.036530f, 0.183228f, 0.805664f, 0.959961f, 0.984863f, 0.991699f, 0.995605f,
- 0.997070f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000120f, 0.000120f, 0.000121f,
- 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000336f, 0.000464f,
- 0.000708f, 0.000726f, 0.000965f, 0.001083f, 0.001458f, 0.002180f, 0.003096f, 0.004425f,
- 0.008377f, 0.017639f, 0.056610f, 0.390869f, 0.909180f, 0.975586f, 0.989746f, 0.994141f,
- 0.996582f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000113f, 0.000120f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000135f, 0.000336f,
- 0.000467f, 0.000713f, 0.000725f, 0.000959f, 0.001191f, 0.001287f, 0.001939f, 0.003231f,
- 0.005306f, 0.009888f, 0.024414f, 0.105835f, 0.709961f, 0.955078f, 0.984863f, 0.993164f,
- 0.996094f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000061f, 0.000089f,
- 0.000118f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000309f,
- 0.000299f, 0.000460f, 0.000710f, 0.000724f, 0.000997f, 0.001073f, 0.001410f, 0.002117f,
- 0.003506f, 0.006031f, 0.012863f, 0.038391f, 0.260742f, 0.892090f, 0.975098f, 0.990723f,
- 0.995117f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000085f, 0.000110f, 0.000118f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000317f, 0.000499f, 0.000706f, 0.000599f, 0.000851f, 0.001069f, 0.001633f,
- 0.002367f, 0.003918f, 0.007580f, 0.017929f, 0.074646f, 0.645508f, 0.956055f, 0.986328f,
- 0.994141f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000099f, 0.000113f, 0.000119f, 0.000119f, 0.000120f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000160f, 0.000326f, 0.000308f, 0.000578f, 0.000602f, 0.000921f, 0.001071f,
- 0.001807f, 0.002783f, 0.004620f, 0.010017f, 0.029465f, 0.211792f, 0.896484f, 0.979004f,
- 0.992188f, 0.996094f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000027f, 0.000103f, 0.000114f, 0.000118f, 0.000120f,
- 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000090f, 0.000212f, 0.000309f, 0.000586f, 0.000602f, 0.000937f,
- 0.001147f, 0.002031f, 0.003237f, 0.006134f, 0.014969f, 0.063171f, 0.665527f, 0.964355f,
- 0.989258f, 0.995117f, 0.999023f, 0.998535f, 0.999023f, 0.999023f, 0.998535f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000018f, 0.000103f, 0.000113f,
- 0.000117f, 0.000119f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000004f, 0.000002f, 0.000199f, 0.000390f, 0.000586f, 0.000665f,
- 0.000946f, 0.001365f, 0.002207f, 0.003767f, 0.008308f, 0.025955f, 0.227661f, 0.924316f,
- 0.984863f, 0.994141f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000098f, 0.000109f, 0.000117f, 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000011f, 0.000005f, 0.000003f, 0.000002f, 0.000193f, 0.000388f, 0.000586f,
- 0.000659f, 0.000952f, 0.001580f, 0.002762f, 0.005363f, 0.013153f, 0.066589f, 0.781738f,
- 0.977051f, 0.993164f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000075f, 0.000112f, 0.000116f, 0.000118f, 0.000119f, 0.000120f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f,
- 0.000088f, 0.000026f, 0.000010f, 0.000005f, 0.000003f, 0.000002f, 0.000186f, 0.000407f,
- 0.000586f, 0.000760f, 0.000986f, 0.001796f, 0.003275f, 0.007565f, 0.026794f, 0.363281f,
- 0.959473f, 0.990723f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000010f, 0.000090f, 0.000110f, 0.000115f, 0.000117f,
- 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000077f, 0.000023f, 0.000011f, 0.000005f, 0.000003f, 0.000002f, 0.000158f,
- 0.000407f, 0.000587f, 0.000826f, 0.001264f, 0.002174f, 0.004894f, 0.013359f, 0.098511f,
- 0.911133f, 0.987793f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000084f, 0.000107f,
- 0.000114f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000093f, 0.000024f, 0.000011f, 0.000005f, 0.000003f, 0.000002f,
- 0.000220f, 0.000476f, 0.000585f, 0.000913f, 0.001374f, 0.002951f, 0.007511f, 0.034973f,
- 0.736328f, 0.982910f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000056f, 0.000102f, 0.000112f, 0.000116f, 0.000117f, 0.000119f, 0.000120f, 0.000120f,
- 0.000121f, 0.000121f, 0.000121f, 0.000075f, 0.000025f, 0.000010f, 0.000005f, 0.000003f,
- 0.000034f, 0.000222f, 0.000491f, 0.000589f, 0.001020f, 0.001881f, 0.004669f, 0.015717f,
- 0.298340f, 0.974609f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000048f, 0.000095f, 0.000106f, 0.000114f, 0.000117f, 0.000118f,
- 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000089f, 0.000029f, 0.000012f, 0.000006f,
- 0.000003f, 0.000002f, 0.000223f, 0.000525f, 0.000687f, 0.001122f, 0.002672f, 0.008255f,
- 0.079590f, 0.954590f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000077f, 0.000104f, 0.000112f,
- 0.000115f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000109f, 0.000031f, 0.000013f,
- 0.000006f, 0.000003f, 0.000002f, 0.000254f, 0.000550f, 0.000846f, 0.001545f, 0.004223f,
- 0.027771f, 0.901855f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000037f,
- 0.000090f, 0.000107f, 0.000113f, 0.000116f, 0.000118f, 0.000119f, 0.000120f, 0.000041f,
- 0.000015f, 0.000007f, 0.000004f, 0.000002f, 0.000271f, 0.000563f, 0.000786f, 0.002211f,
- 0.012207f, 0.711426f, 0.994629f, 0.994629f, 0.995117f, 0.994629f, 0.994629f, 0.994629f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000028f, 0.000083f, 0.000102f, 0.000110f, 0.000114f, 0.000117f, 0.000118f,
- 0.000052f, 0.000019f, 0.000008f, 0.000004f, 0.000002f, 0.000314f, 0.000444f, 0.001049f,
- 0.005669f, 0.266846f, 0.993164f, 0.993652f, 0.993164f, 0.993652f, 0.993164f, 0.993164f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000048f, 0.000089f, 0.000106f, 0.000112f,
- 0.000115f, 0.000077f, 0.000026f, 0.000010f, 0.000005f, 0.000079f, 0.000425f, 0.000405f,
- 0.002468f, 0.064209f, 0.990234f, 0.990723f, 0.990234f, 0.990234f, 0.990234f, 0.991211f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000020f, 0.000075f,
- 0.000098f, 0.000108f, 0.000113f, 0.000044f, 0.000016f, 0.000006f, 0.000027f, 0.000270f,
- 0.000825f, 0.018448f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000049f, 0.000085f, 0.000102f, 0.000070f, 0.000022f, 0.000008f, 0.000133f,
- 0.000295f, 0.005318f, 0.978516f, 0.979004f, 0.977539f, 0.977539f, 0.978027f, 0.978516f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000066f, 0.000092f, 0.000036f, 0.000011f,
- 0.000135f, 0.000925f, 0.959473f, 0.959961f, 0.959961f, 0.959473f, 0.959961f, 0.959473f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000027f, 0.000065f,
- 0.000016f, 0.000109f, 0.907715f, 0.907227f, 0.907715f, 0.907227f, 0.907715f, 0.907715f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000017f, 0.711914f, 0.712402f, 0.711426f, 0.711426f, 0.711914f, 0.712402f,
- },
- {
- 0.076172f, 0.877441f, 0.964355f, 0.980957f, 0.987305f, 0.990723f, 0.992676f, 0.993652f,
- 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.003897f, 0.033173f, 0.320557f, 0.863770f, 0.953613f, 0.975586f, 0.984863f, 0.988770f,
- 0.991211f, 0.992676f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f,
- 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000975f, 0.005951f, 0.020935f, 0.093140f, 0.501465f, 0.873047f, 0.950684f, 0.973145f,
- 0.981934f, 0.986816f, 0.990234f, 0.992188f, 0.993164f, 0.994629f, 0.995605f, 0.996094f,
- 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f,
- 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000610f, 0.002430f, 0.006081f, 0.015915f, 0.045593f, 0.179810f, 0.635254f, 0.889648f,
- 0.951172f, 0.972168f, 0.981445f, 0.986328f, 0.989746f, 0.991699f, 0.993652f, 0.994629f,
- 0.995117f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.001219f, 0.002796f, 0.006172f, 0.012848f, 0.028458f, 0.081177f, 0.301758f,
- 0.733398f, 0.905273f, 0.953613f, 0.972168f, 0.981445f, 0.986328f, 0.989258f, 0.991699f,
- 0.993652f, 0.994141f, 0.995117f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f,
- 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000731f, 0.001706f, 0.003166f, 0.005470f, 0.010406f, 0.020813f, 0.047089f,
- 0.136719f, 0.449951f, 0.803223f, 0.919434f, 0.957520f, 0.973633f, 0.981934f, 0.986328f,
- 0.989746f, 0.991699f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f,
- 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000366f, 0.001214f, 0.001894f, 0.003159f, 0.005108f, 0.008720f, 0.015839f,
- 0.031586f, 0.074951f, 0.224121f, 0.596680f, 0.851074f, 0.932617f, 0.962402f, 0.975586f,
- 0.982910f, 0.987305f, 0.989746f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f,
- 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000366f, 0.000731f, 0.000976f, 0.001827f, 0.002987f, 0.004757f, 0.007988f,
- 0.013023f, 0.023544f, 0.048431f, 0.120239f, 0.352783f, 0.717285f, 0.887207f, 0.943848f,
- 0.966309f, 0.978027f, 0.983887f, 0.987305f, 0.990234f, 0.992188f, 0.993652f, 0.994629f,
- 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.998047f, 0.998047f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000434f, 0.000488f, 0.000704f, 0.001218f, 0.002190f, 0.002783f, 0.004723f,
- 0.006878f, 0.011040f, 0.018372f, 0.034241f, 0.073242f, 0.194336f, 0.510742f, 0.803711f,
- 0.912598f, 0.952637f, 0.970703f, 0.979004f, 0.984863f, 0.988281f, 0.991211f, 0.992676f,
- 0.994141f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f,
- 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000243f, 0.000488f, 0.000488f, 0.000916f, 0.001219f, 0.002308f, 0.002914f,
- 0.004124f, 0.006523f, 0.009537f, 0.014793f, 0.025833f, 0.050446f, 0.116089f, 0.312744f,
- 0.661133f, 0.860840f, 0.931641f, 0.960449f, 0.974121f, 0.981445f, 0.986328f, 0.989258f,
- 0.991211f, 0.992676f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f,
- 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000121f, 0.000356f, 0.000488f, 0.000609f, 0.000944f, 0.001339f, 0.002296f,
- 0.002964f, 0.003880f, 0.005676f, 0.008476f, 0.012909f, 0.020874f, 0.036926f, 0.075500f,
- 0.187988f, 0.474854f, 0.774414f, 0.900391f, 0.946289f, 0.966309f, 0.978027f, 0.983887f,
- 0.987793f, 0.990234f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f, 0.996094f,
- 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000244f, 0.000483f, 0.000488f, 0.000731f, 0.001070f, 0.001551f,
- 0.002024f, 0.002520f, 0.003990f, 0.004738f, 0.007584f, 0.010834f, 0.016800f, 0.028763f,
- 0.054535f, 0.120728f, 0.309082f, 0.642090f, 0.848145f, 0.926270f, 0.957031f, 0.971191f,
- 0.980469f, 0.985352f, 0.988770f, 0.990723f, 0.992188f, 0.993652f, 0.994629f, 0.995605f,
- 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000242f, 0.000485f, 0.000608f, 0.000731f, 0.001091f,
- 0.001339f, 0.001943f, 0.002602f, 0.003466f, 0.004845f, 0.006649f, 0.009529f, 0.014824f,
- 0.023407f, 0.041351f, 0.083496f, 0.199951f, 0.482422f, 0.770996f, 0.896484f, 0.944336f,
- 0.965332f, 0.976562f, 0.982910f, 0.986816f, 0.990234f, 0.991699f, 0.993164f, 0.994141f,
- 0.995117f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f,
- 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000121f, 0.000243f, 0.000243f, 0.000602f, 0.000609f, 0.000799f,
- 0.001088f, 0.001459f, 0.001822f, 0.002432f, 0.003033f, 0.004375f, 0.006042f, 0.008560f,
- 0.012810f, 0.019791f, 0.032715f, 0.061584f, 0.135254f, 0.335693f, 0.660156f, 0.853027f,
- 0.926758f, 0.956543f, 0.972168f, 0.980469f, 0.984863f, 0.988281f, 0.991211f, 0.992676f,
- 0.993652f, 0.994141f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000243f, 0.000366f, 0.000605f, 0.000730f,
- 0.000731f, 0.001201f, 0.001458f, 0.001804f, 0.002428f, 0.003593f, 0.004234f, 0.005745f,
- 0.007755f, 0.011139f, 0.016754f, 0.027054f, 0.047424f, 0.097107f, 0.231323f, 0.525879f,
- 0.791016f, 0.902832f, 0.945801f, 0.966797f, 0.977051f, 0.982910f, 0.987793f, 0.990234f,
- 0.991699f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f,
- 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000365f, 0.000244f, 0.000602f,
- 0.000721f, 0.000730f, 0.000852f, 0.001451f, 0.001842f, 0.002518f, 0.002993f, 0.004097f,
- 0.005253f, 0.007099f, 0.009865f, 0.014908f, 0.022827f, 0.038879f, 0.072815f, 0.163940f,
- 0.396484f, 0.707031f, 0.869141f, 0.932129f, 0.960449f, 0.973145f, 0.980957f, 0.986328f,
- 0.988770f, 0.991211f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f,
- 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000361f, 0.000242f, 0.000244f,
- 0.000602f, 0.000728f, 0.000853f, 0.001260f, 0.001569f, 0.001704f, 0.002287f, 0.003103f,
- 0.003857f, 0.004848f, 0.006680f, 0.009003f, 0.012978f, 0.019897f, 0.032135f, 0.057983f,
- 0.121033f, 0.291504f, 0.604980f, 0.827148f, 0.915039f, 0.953125f, 0.969238f, 0.978516f,
- 0.984375f, 0.988281f, 0.991211f, 0.992188f, 0.993652f, 0.994141f, 0.995117f, 0.995605f,
- 0.996582f, 0.996582f, 0.997070f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000241f, 0.000241f, 0.000365f,
- 0.000365f, 0.000589f, 0.000852f, 0.000852f, 0.001246f, 0.001562f, 0.001812f, 0.002241f,
- 0.002794f, 0.003633f, 0.004669f, 0.006069f, 0.008202f, 0.011772f, 0.016891f, 0.027618f,
- 0.047089f, 0.093506f, 0.216309f, 0.495605f, 0.771484f, 0.894531f, 0.942383f, 0.965332f,
- 0.976074f, 0.982910f, 0.987305f, 0.989746f, 0.991699f, 0.993164f, 0.994629f, 0.995117f,
- 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000364f,
- 0.000242f, 0.000487f, 0.000737f, 0.000730f, 0.000974f, 0.001083f, 0.001520f, 0.001701f,
- 0.001938f, 0.002768f, 0.003658f, 0.004227f, 0.005741f, 0.007671f, 0.010796f, 0.015511f,
- 0.023529f, 0.040009f, 0.074158f, 0.165405f, 0.395264f, 0.703613f, 0.868164f, 0.932129f,
- 0.959473f, 0.973633f, 0.980957f, 0.985840f, 0.988770f, 0.991699f, 0.992676f, 0.994141f,
- 0.995117f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f,
- 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000100f, 0.000000f, 0.000241f,
- 0.000224f, 0.000487f, 0.000488f, 0.000710f, 0.000972f, 0.000848f, 0.001181f, 0.001333f,
- 0.001910f, 0.001830f, 0.002661f, 0.003298f, 0.004154f, 0.005386f, 0.007271f, 0.009735f,
- 0.013908f, 0.021149f, 0.034149f, 0.062042f, 0.130371f, 0.313477f, 0.627930f, 0.837402f,
- 0.919922f, 0.954590f, 0.970215f, 0.979492f, 0.985352f, 0.988770f, 0.991211f, 0.992676f,
- 0.993652f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000049f,
- 0.000242f, 0.000483f, 0.000606f, 0.000487f, 0.000695f, 0.000970f, 0.000974f, 0.001136f,
- 0.001328f, 0.001694f, 0.002028f, 0.002617f, 0.002953f, 0.003847f, 0.004951f, 0.006653f,
- 0.009193f, 0.012672f, 0.018661f, 0.029968f, 0.052673f, 0.106689f, 0.250977f, 0.549805f,
- 0.801758f, 0.907227f, 0.948242f, 0.967773f, 0.978027f, 0.984375f, 0.987793f, 0.990723f,
- 0.992188f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000166f, 0.000243f, 0.000485f, 0.000487f, 0.000487f, 0.000945f, 0.000834f, 0.000974f,
- 0.000974f, 0.001300f, 0.001810f, 0.002058f, 0.002573f, 0.002703f, 0.003761f, 0.004887f,
- 0.006393f, 0.008514f, 0.011818f, 0.016937f, 0.026672f, 0.046051f, 0.089478f, 0.204712f,
- 0.476807f, 0.762207f, 0.891602f, 0.942383f, 0.965820f, 0.976562f, 0.983398f, 0.987793f,
- 0.990234f, 0.992188f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f,
- 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000224f, 0.000358f, 0.000477f, 0.000486f, 0.000487f, 0.000580f, 0.000841f,
- 0.000973f, 0.001079f, 0.001255f, 0.001649f, 0.002045f, 0.002241f, 0.002995f, 0.003841f,
- 0.004826f, 0.005920f, 0.007866f, 0.010925f, 0.015930f, 0.024109f, 0.040619f, 0.077454f,
- 0.171509f, 0.412354f, 0.720215f, 0.876953f, 0.936035f, 0.962402f, 0.975098f, 0.982422f,
- 0.987305f, 0.990234f, 0.992188f, 0.993164f, 0.994629f, 0.995117f, 0.996094f, 0.996582f,
- 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000165f, 0.000205f, 0.000411f, 0.000480f, 0.000486f, 0.000608f, 0.000688f,
- 0.000966f, 0.000968f, 0.000974f, 0.001421f, 0.001489f, 0.001695f, 0.002090f, 0.002886f,
- 0.003326f, 0.004608f, 0.005604f, 0.007317f, 0.010414f, 0.014862f, 0.022232f, 0.036469f,
- 0.067810f, 0.146973f, 0.359375f, 0.680664f, 0.861816f, 0.931152f, 0.959961f, 0.974609f,
- 0.981934f, 0.986816f, 0.989746f, 0.991699f, 0.993652f, 0.994629f, 0.995605f, 0.996094f,
- 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000453f, 0.000539f, 0.000486f, 0.000487f,
- 0.000487f, 0.000957f, 0.000969f, 0.001202f, 0.001139f, 0.001393f, 0.001986f, 0.002045f,
- 0.002863f, 0.003216f, 0.004128f, 0.005417f, 0.007378f, 0.009689f, 0.013466f, 0.020432f,
- 0.033722f, 0.060883f, 0.129395f, 0.318115f, 0.642090f, 0.847656f, 0.926270f, 0.958008f,
- 0.973145f, 0.981934f, 0.986328f, 0.989746f, 0.992188f, 0.993164f, 0.994629f, 0.995605f,
- 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000380f, 0.000482f, 0.000606f,
- 0.000607f, 0.000608f, 0.000829f, 0.000970f, 0.000972f, 0.001070f, 0.001402f, 0.001812f,
- 0.002138f, 0.002619f, 0.003246f, 0.004082f, 0.005318f, 0.006699f, 0.009262f, 0.012764f,
- 0.019318f, 0.031052f, 0.055878f, 0.116821f, 0.286621f, 0.610352f, 0.835938f, 0.922852f,
- 0.956543f, 0.973145f, 0.981445f, 0.986328f, 0.989746f, 0.991699f, 0.993652f, 0.995117f,
- 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000350f, 0.000480f,
- 0.000605f, 0.000596f, 0.000608f, 0.000890f, 0.000963f, 0.000972f, 0.000974f, 0.001316f,
- 0.001798f, 0.002058f, 0.002560f, 0.002811f, 0.003983f, 0.005108f, 0.006489f, 0.008888f,
- 0.012314f, 0.018021f, 0.029495f, 0.051941f, 0.107422f, 0.263428f, 0.585449f, 0.827148f,
- 0.919434f, 0.956055f, 0.971680f, 0.981445f, 0.986816f, 0.989746f, 0.992188f, 0.994141f,
- 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f, 0.000176f, 0.000462f,
- 0.000483f, 0.000604f, 0.000607f, 0.000638f, 0.000922f, 0.000965f, 0.000971f, 0.001235f,
- 0.001376f, 0.001769f, 0.002041f, 0.002575f, 0.003130f, 0.003487f, 0.004936f, 0.006264f,
- 0.008415f, 0.012047f, 0.017517f, 0.027786f, 0.049164f, 0.101257f, 0.249512f, 0.568848f,
- 0.821777f, 0.918945f, 0.956055f, 0.972168f, 0.981445f, 0.986816f, 0.990234f, 0.992188f,
- 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f, 0.000122f, 0.000242f,
- 0.000352f, 0.000560f, 0.000602f, 0.000604f, 0.000606f, 0.000767f, 0.001046f, 0.001089f,
- 0.000973f, 0.001327f, 0.001583f, 0.002033f, 0.002272f, 0.002657f, 0.003563f, 0.004589f,
- 0.006138f, 0.008194f, 0.011299f, 0.016861f, 0.026718f, 0.047119f, 0.097656f, 0.240967f,
- 0.562500f, 0.821289f, 0.919922f, 0.957031f, 0.973145f, 0.981934f, 0.987305f, 0.990234f,
- 0.992676f, 0.994141f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000241f, 0.000314f, 0.000459f, 0.000600f, 0.000605f, 0.000598f, 0.000804f, 0.000958f,
- 0.001084f, 0.001104f, 0.001389f, 0.001709f, 0.002041f, 0.002211f, 0.002645f, 0.003635f,
- 0.004467f, 0.005718f, 0.008072f, 0.011185f, 0.016846f, 0.026184f, 0.046112f, 0.094971f,
- 0.239014f, 0.565430f, 0.825684f, 0.922363f, 0.958496f, 0.973633f, 0.983398f, 0.987793f,
- 0.990723f, 0.992676f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.997559f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f,
- 0.000122f, 0.000173f, 0.000246f, 0.000387f, 0.000480f, 0.000604f, 0.000604f, 0.000701f,
- 0.000951f, 0.000968f, 0.001184f, 0.001315f, 0.001597f, 0.001899f, 0.002268f, 0.002813f,
- 0.003716f, 0.004372f, 0.005886f, 0.007759f, 0.010918f, 0.015915f, 0.025726f, 0.045685f,
- 0.095459f, 0.243774f, 0.579102f, 0.833984f, 0.926270f, 0.960449f, 0.976074f, 0.983887f,
- 0.988770f, 0.991211f, 0.993164f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000238f, 0.000237f, 0.000242f, 0.000463f, 0.000585f, 0.000587f, 0.000718f,
- 0.000607f, 0.000885f, 0.001081f, 0.001087f, 0.001299f, 0.001553f, 0.001982f, 0.002104f,
- 0.002777f, 0.003494f, 0.004406f, 0.005798f, 0.007645f, 0.010750f, 0.016159f, 0.025467f,
- 0.045959f, 0.097778f, 0.256104f, 0.603516f, 0.847168f, 0.931152f, 0.963379f, 0.977539f,
- 0.985352f, 0.989258f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.996582f, 0.997559f,
- 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000231f, 0.000122f, 0.000242f, 0.000242f, 0.000400f, 0.000525f, 0.000495f,
- 0.000605f, 0.000607f, 0.000898f, 0.001075f, 0.001191f, 0.001133f, 0.001420f, 0.001794f,
- 0.002041f, 0.002733f, 0.003548f, 0.004448f, 0.005585f, 0.007656f, 0.010735f, 0.015671f,
- 0.025589f, 0.047363f, 0.102783f, 0.276855f, 0.637695f, 0.862793f, 0.938477f, 0.966797f,
- 0.979004f, 0.985840f, 0.990234f, 0.992676f, 0.994141f, 0.995117f, 0.996582f, 0.997070f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000226f, 0.000242f, 0.000470f, 0.000469f,
- 0.000547f, 0.000711f, 0.000723f, 0.000829f, 0.001024f, 0.001188f, 0.001081f, 0.001415f,
- 0.001765f, 0.002048f, 0.002708f, 0.003252f, 0.004448f, 0.005711f, 0.007557f, 0.010780f,
- 0.016220f, 0.026398f, 0.048950f, 0.111267f, 0.309082f, 0.680664f, 0.880371f, 0.945801f,
- 0.970703f, 0.980957f, 0.986816f, 0.990723f, 0.993164f, 0.994629f, 0.995605f, 0.996582f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000204f, 0.000239f, 0.000242f, 0.000283f,
- 0.000479f, 0.000594f, 0.000603f, 0.000606f, 0.000779f, 0.001068f, 0.001084f, 0.001118f,
- 0.001515f, 0.001926f, 0.002098f, 0.002674f, 0.002975f, 0.004040f, 0.005478f, 0.007488f,
- 0.010651f, 0.016327f, 0.027222f, 0.052460f, 0.123718f, 0.355713f, 0.729980f, 0.899902f,
- 0.952637f, 0.973145f, 0.983887f, 0.988770f, 0.991699f, 0.994141f, 0.995117f, 0.996094f,
- 0.997070f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000122f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000236f, 0.000207f, 0.000240f,
- 0.000435f, 0.000534f, 0.000594f, 0.000602f, 0.000722f, 0.000727f, 0.000947f, 0.001081f,
- 0.001090f, 0.001471f, 0.001829f, 0.002010f, 0.002478f, 0.002956f, 0.004051f, 0.005753f,
- 0.007717f, 0.011040f, 0.017105f, 0.028748f, 0.057159f, 0.142944f, 0.421387f, 0.780762f,
- 0.916992f, 0.960449f, 0.976562f, 0.985352f, 0.989746f, 0.992676f, 0.994629f, 0.996094f,
- 0.997070f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000232f,
- 0.000230f, 0.000382f, 0.000472f, 0.000576f, 0.000715f, 0.000721f, 0.000727f, 0.001046f,
- 0.001078f, 0.001186f, 0.001434f, 0.001674f, 0.002066f, 0.002546f, 0.003407f, 0.004181f,
- 0.005634f, 0.007542f, 0.011330f, 0.017609f, 0.031189f, 0.064392f, 0.172729f, 0.506836f,
- 0.828125f, 0.933105f, 0.966309f, 0.980469f, 0.987305f, 0.991211f, 0.993652f, 0.995117f,
- 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000232f, 0.000234f, 0.000352f, 0.000461f, 0.000535f, 0.000594f, 0.000722f, 0.000725f,
- 0.000921f, 0.001116f, 0.001192f, 0.001416f, 0.001637f, 0.001911f, 0.002380f, 0.002949f,
- 0.003948f, 0.005589f, 0.007942f, 0.011650f, 0.018631f, 0.034302f, 0.075867f, 0.219238f,
- 0.607422f, 0.870605f, 0.946777f, 0.972656f, 0.983887f, 0.989258f, 0.992676f, 0.995117f,
- 0.996094f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000239f, 0.000302f, 0.000396f, 0.000564f, 0.000674f, 0.000617f,
- 0.000722f, 0.001003f, 0.001068f, 0.001084f, 0.001302f, 0.001598f, 0.001929f, 0.002375f,
- 0.002935f, 0.004349f, 0.005714f, 0.007957f, 0.012306f, 0.020493f, 0.039001f, 0.092590f,
- 0.293213f, 0.711426f, 0.905762f, 0.958984f, 0.978027f, 0.986328f, 0.990723f, 0.994141f,
- 0.995605f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000232f, 0.000227f, 0.000240f, 0.000282f, 0.000542f, 0.000703f,
- 0.000718f, 0.000724f, 0.000833f, 0.001069f, 0.001184f, 0.001346f, 0.001464f, 0.001898f,
- 0.002649f, 0.003164f, 0.004467f, 0.005863f, 0.008400f, 0.013199f, 0.022614f, 0.046051f,
- 0.120605f, 0.406738f, 0.801270f, 0.931641f, 0.968262f, 0.982422f, 0.988770f, 0.992676f,
- 0.994629f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000219f, 0.000237f, 0.000235f, 0.000241f, 0.000480f,
- 0.000584f, 0.000715f, 0.000723f, 0.000775f, 0.001061f, 0.000959f, 0.001139f, 0.001526f,
- 0.001770f, 0.002546f, 0.003151f, 0.004250f, 0.006195f, 0.009071f, 0.014595f, 0.026413f,
- 0.056763f, 0.169067f, 0.557617f, 0.869141f, 0.951172f, 0.976074f, 0.986328f, 0.990723f,
- 0.994141f, 0.995605f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000216f, 0.000228f, 0.000285f, 0.000339f,
- 0.000454f, 0.000572f, 0.000595f, 0.000721f, 0.000604f, 0.000930f, 0.000958f, 0.001171f,
- 0.001431f, 0.001888f, 0.002663f, 0.003256f, 0.004402f, 0.006527f, 0.009964f, 0.016281f,
- 0.031189f, 0.074524f, 0.258301f, 0.714355f, 0.916016f, 0.965332f, 0.982422f, 0.989746f,
- 0.992676f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000063f, 0.000120f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000184f, 0.000228f,
- 0.000340f, 0.000396f, 0.000668f, 0.000571f, 0.000478f, 0.000602f, 0.000919f, 0.000956f,
- 0.001061f, 0.001497f, 0.001888f, 0.002565f, 0.003523f, 0.004578f, 0.006935f, 0.010765f,
- 0.018417f, 0.038635f, 0.107727f, 0.416260f, 0.832520f, 0.946289f, 0.975586f, 0.986328f,
- 0.991699f, 0.994629f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000045f, 0.000118f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000234f, 0.000294f, 0.000220f, 0.000486f, 0.000579f, 0.000588f, 0.000669f, 0.000878f,
- 0.001038f, 0.001135f, 0.001451f, 0.001820f, 0.002529f, 0.003551f, 0.005199f, 0.007542f,
- 0.012230f, 0.022369f, 0.051910f, 0.174927f, 0.630859f, 0.905273f, 0.965332f, 0.982910f,
- 0.990234f, 0.993652f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000091f, 0.000117f, 0.000120f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000171f, 0.000151f, 0.000166f, 0.000195f, 0.000342f, 0.000452f, 0.000594f, 0.000599f,
- 0.000862f, 0.001019f, 0.001135f, 0.001465f, 0.002031f, 0.002676f, 0.003714f, 0.005497f,
- 0.008286f, 0.014320f, 0.028854f, 0.077332f, 0.322754f, 0.809082f, 0.946289f, 0.977051f,
- 0.987793f, 0.993164f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998535f, 0.998047f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000079f, 0.000105f, 0.000120f,
- 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000008f, 0.000006f, 0.000098f, 0.000137f, 0.000233f, 0.000324f, 0.000566f, 0.000589f,
- 0.000618f, 0.000874f, 0.000941f, 0.001108f, 0.001621f, 0.001880f, 0.002726f, 0.003788f,
- 0.005840f, 0.009583f, 0.017563f, 0.039368f, 0.133545f, 0.582520f, 0.906738f, 0.968262f,
- 0.984863f, 0.992188f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000069f, 0.000114f,
- 0.000117f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000021f,
- 0.000013f, 0.000009f, 0.000006f, 0.000004f, 0.000090f, 0.000206f, 0.000305f, 0.000538f,
- 0.000585f, 0.000596f, 0.000869f, 0.000941f, 0.001149f, 0.001516f, 0.002150f, 0.002729f,
- 0.004475f, 0.006660f, 0.011360f, 0.022690f, 0.061401f, 0.281494f, 0.813965f, 0.952148f,
- 0.980957f, 0.990723f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f,
- 0.000085f, 0.000114f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000077f, 0.000041f,
- 0.000022f, 0.000013f, 0.000009f, 0.000006f, 0.000066f, 0.000107f, 0.000223f, 0.000250f,
- 0.000532f, 0.000576f, 0.000593f, 0.000784f, 0.000937f, 0.001126f, 0.001523f, 0.002306f,
- 0.003193f, 0.004574f, 0.007717f, 0.014191f, 0.032410f, 0.116577f, 0.595215f, 0.921875f,
- 0.974609f, 0.988770f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000056f, 0.000112f, 0.000114f, 0.000118f, 0.000119f, 0.000120f,
- 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000074f,
- 0.000038f, 0.000021f, 0.000013f, 0.000009f, 0.000006f, 0.000004f, 0.000003f, 0.000179f,
- 0.000258f, 0.000367f, 0.000469f, 0.000583f, 0.000770f, 0.000932f, 0.001131f, 0.001758f,
- 0.002483f, 0.003517f, 0.005432f, 0.009232f, 0.019302f, 0.054504f, 0.293457f, 0.853516f,
- 0.964844f, 0.986816f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000015f, 0.000084f, 0.000107f, 0.000113f, 0.000117f,
- 0.000118f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000076f, 0.000042f, 0.000023f, 0.000015f, 0.000009f, 0.000007f, 0.000005f, 0.000004f,
- 0.000147f, 0.000238f, 0.000457f, 0.000545f, 0.000586f, 0.000821f, 0.000936f, 0.001139f,
- 0.001849f, 0.002665f, 0.003687f, 0.006367f, 0.011810f, 0.028931f, 0.120605f, 0.687988f,
- 0.947754f, 0.982910f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000082f, 0.000095f,
- 0.000111f, 0.000115f, 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000083f, 0.000042f, 0.000026f, 0.000015f, 0.000010f, 0.000007f, 0.000005f,
- 0.000013f, 0.000086f, 0.000185f, 0.000309f, 0.000552f, 0.000577f, 0.000796f, 0.000925f,
- 0.001251f, 0.001838f, 0.002878f, 0.004509f, 0.007572f, 0.016617f, 0.054932f, 0.391602f,
- 0.912109f, 0.978516f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996094f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000095f, 0.000106f, 0.000112f, 0.000113f, 0.000115f, 0.000118f, 0.000118f,
- 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000099f, 0.000048f, 0.000027f, 0.000017f, 0.000011f, 0.000008f,
- 0.000006f, 0.000004f, 0.000089f, 0.000182f, 0.000347f, 0.000495f, 0.000570f, 0.000777f,
- 0.000922f, 0.001316f, 0.001831f, 0.003004f, 0.005028f, 0.010078f, 0.028183f, 0.161865f,
- 0.833496f, 0.972168f, 0.995117f, 0.995605f, 0.995605f, 0.995117f, 0.995117f, 0.995605f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000074f, 0.000093f, 0.000107f, 0.000111f, 0.000115f,
- 0.000116f, 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000057f, 0.000032f, 0.000021f, 0.000013f,
- 0.000008f, 0.000006f, 0.000005f, 0.000034f, 0.000159f, 0.000267f, 0.000514f, 0.000566f,
- 0.000714f, 0.000888f, 0.001348f, 0.001995f, 0.003302f, 0.006447f, 0.015945f, 0.069153f,
- 0.646484f, 0.960449f, 0.994629f, 0.995117f, 0.994629f, 0.995117f, 0.994629f, 0.995117f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000095f,
- 0.000102f, 0.000109f, 0.000114f, 0.000115f, 0.000116f, 0.000118f, 0.000118f, 0.000119f,
- 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000077f, 0.000044f, 0.000025f,
- 0.000015f, 0.000011f, 0.000007f, 0.000005f, 0.000004f, 0.000106f, 0.000244f, 0.000476f,
- 0.000561f, 0.000622f, 0.000893f, 0.001266f, 0.001968f, 0.003990f, 0.009476f, 0.033234f,
- 0.342529f, 0.940918f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, 0.993652f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000046f, 0.000079f, 0.000093f, 0.000104f, 0.000110f, 0.000111f, 0.000113f, 0.000116f,
- 0.000117f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000092f, 0.000050f,
- 0.000029f, 0.000019f, 0.000012f, 0.000009f, 0.000006f, 0.000004f, 0.000061f, 0.000188f,
- 0.000324f, 0.000456f, 0.000525f, 0.000657f, 0.001371f, 0.002445f, 0.005634f, 0.017563f,
- 0.135986f, 0.902832f, 0.992188f, 0.992188f, 0.992676f, 0.992188f, 0.992676f, 0.992188f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000038f, 0.000075f, 0.000092f, 0.000100f, 0.000105f,
- 0.000111f, 0.000112f, 0.000114f, 0.000116f, 0.000117f, 0.000117f, 0.000118f, 0.000118f,
- 0.000074f, 0.000041f, 0.000024f, 0.000016f, 0.000010f, 0.000007f, 0.000005f, 0.000033f,
- 0.000167f, 0.000423f, 0.000410f, 0.000413f, 0.000575f, 0.001446f, 0.003387f, 0.009644f,
- 0.056183f, 0.817383f, 0.990234f, 0.990234f, 0.990234f, 0.990723f, 0.990234f, 0.990723f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000011f, 0.000067f,
- 0.000084f, 0.000096f, 0.000103f, 0.000108f, 0.000110f, 0.000113f, 0.000115f, 0.000115f,
- 0.000116f, 0.000104f, 0.000057f, 0.000035f, 0.000021f, 0.000013f, 0.000009f, 0.000006f,
- 0.000054f, 0.000161f, 0.000317f, 0.000332f, 0.000393f, 0.000723f, 0.001760f, 0.005203f,
- 0.025345f, 0.617676f, 0.987793f, 0.987793f, 0.987793f, 0.988281f, 0.988281f, 0.988281f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000017f, 0.000052f, 0.000075f, 0.000091f, 0.000097f, 0.000105f, 0.000108f,
- 0.000111f, 0.000113f, 0.000114f, 0.000085f, 0.000050f, 0.000031f, 0.000018f, 0.000012f,
- 0.000008f, 0.000005f, 0.000095f, 0.000314f, 0.000306f, 0.000363f, 0.000813f, 0.002583f,
- 0.011734f, 0.308105f, 0.983887f, 0.984375f, 0.984375f, 0.984375f, 0.983887f, 0.983887f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000037f, 0.000065f, 0.000083f,
- 0.000093f, 0.000099f, 0.000105f, 0.000108f, 0.000110f, 0.000082f, 0.000045f, 0.000027f,
- 0.000017f, 0.000011f, 0.000007f, 0.000114f, 0.000245f, 0.000209f, 0.000379f, 0.001151f,
- 0.005260f, 0.107971f, 0.977539f, 0.979004f, 0.978027f, 0.978027f, 0.978027f, 0.978027f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000007f, 0.000045f, 0.000069f, 0.000084f, 0.000093f, 0.000099f, 0.000104f, 0.000076f,
- 0.000044f, 0.000026f, 0.000016f, 0.000010f, 0.000012f, 0.000152f, 0.000179f, 0.000373f,
- 0.001760f, 0.035522f, 0.969238f, 0.968750f, 0.968750f, 0.968750f, 0.968750f, 0.968750f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000050f, 0.000070f, 0.000082f,
- 0.000092f, 0.000075f, 0.000044f, 0.000026f, 0.000015f, 0.000009f, 0.000121f, 0.000117f,
- 0.000611f, 0.010231f, 0.951172f, 0.951172f, 0.951172f, 0.951172f, 0.950684f, 0.951660f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000020f, 0.000047f, 0.000069f, 0.000077f, 0.000042f, 0.000024f, 0.000013f, 0.000078f,
- 0.000130f, 0.001914f, 0.915039f, 0.915527f, 0.915039f, 0.915527f, 0.916016f, 0.915039f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000017f, 0.000047f, 0.000040f, 0.000019f,
- 0.000035f, 0.000188f, 0.833984f, 0.833496f, 0.833496f, 0.834473f, 0.834473f, 0.833984f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000014f, 0.000007f, 0.642578f, 0.643555f, 0.643066f, 0.643555f, 0.642578f, 0.642578f,
- },
- {
- 0.113464f, 0.797852f, 0.930176f, 0.961914f, 0.974609f, 0.980469f, 0.984863f, 0.987793f,
- 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995117f,
- 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f,
- 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.007183f, 0.058716f, 0.349609f, 0.784668f, 0.912598f, 0.952148f, 0.968262f, 0.977539f,
- 0.981934f, 0.985352f, 0.988281f, 0.990234f, 0.991211f, 0.992188f, 0.993652f, 0.993652f,
- 0.994141f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f,
- 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.002432f, 0.011818f, 0.039581f, 0.143677f, 0.482910f, 0.800293f, 0.908691f, 0.947266f,
- 0.964844f, 0.974609f, 0.980469f, 0.984375f, 0.987305f, 0.989258f, 0.990723f, 0.991699f,
- 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f,
- 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f,
- 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.001096f, 0.005062f, 0.012482f, 0.030151f, 0.079956f, 0.239014f, 0.581055f, 0.819824f,
- 0.909180f, 0.946289f, 0.963379f, 0.973145f, 0.979492f, 0.983398f, 0.986328f, 0.988281f,
- 0.990234f, 0.991699f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.996094f,
- 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000610f, 0.002434f, 0.005779f, 0.012207f, 0.023972f, 0.052765f, 0.129883f, 0.342773f,
- 0.660156f, 0.841309f, 0.914062f, 0.947266f, 0.963379f, 0.973145f, 0.979004f, 0.982910f,
- 0.985840f, 0.987793f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.994629f,
- 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f,
- 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000397f, 0.001559f, 0.003397f, 0.006058f, 0.011177f, 0.020355f, 0.039307f, 0.083130f,
- 0.196777f, 0.452148f, 0.724121f, 0.862305f, 0.920410f, 0.949219f, 0.964355f, 0.973145f,
- 0.979004f, 0.982910f, 0.985840f, 0.988770f, 0.989258f, 0.991211f, 0.992188f, 0.993164f,
- 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f,
- 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000366f, 0.001097f, 0.002163f, 0.003523f, 0.006268f, 0.010941f, 0.017487f, 0.030930f,
- 0.058411f, 0.122925f, 0.281738f, 0.556152f, 0.776367f, 0.881348f, 0.928223f, 0.951660f,
- 0.966309f, 0.973633f, 0.979492f, 0.983398f, 0.986328f, 0.988281f, 0.989746f, 0.991211f,
- 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f,
- 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000728f, 0.001340f, 0.002533f, 0.003813f, 0.006081f, 0.009750f, 0.015419f,
- 0.025177f, 0.044067f, 0.084473f, 0.179077f, 0.384033f, 0.649902f, 0.818848f, 0.897949f,
- 0.935547f, 0.956055f, 0.967285f, 0.975098f, 0.980957f, 0.983887f, 0.986328f, 0.988281f,
- 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f,
- 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000609f, 0.000854f, 0.001898f, 0.002781f, 0.004246f, 0.006218f, 0.008835f,
- 0.013504f, 0.021362f, 0.035400f, 0.062347f, 0.121460f, 0.255127f, 0.495361f, 0.726562f,
- 0.852539f, 0.912598f, 0.943359f, 0.959473f, 0.969238f, 0.976562f, 0.981445f, 0.984375f,
- 0.987305f, 0.988770f, 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f,
- 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000244f, 0.000731f, 0.001295f, 0.002159f, 0.003092f, 0.004051f, 0.005836f,
- 0.008560f, 0.011925f, 0.018585f, 0.029373f, 0.048950f, 0.088013f, 0.174194f, 0.354980f,
- 0.604492f, 0.788086f, 0.880371f, 0.925293f, 0.950195f, 0.963867f, 0.972168f, 0.978027f,
- 0.982422f, 0.985840f, 0.987793f, 0.990234f, 0.991699f, 0.992188f, 0.993164f, 0.994141f,
- 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f,
- 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000114f, 0.000244f, 0.000709f, 0.001089f, 0.001580f, 0.002100f, 0.002848f, 0.004028f,
- 0.005646f, 0.008232f, 0.011276f, 0.016647f, 0.024948f, 0.039215f, 0.067566f, 0.125244f,
- 0.249878f, 0.471436f, 0.698242f, 0.834961f, 0.902344f, 0.937012f, 0.955078f, 0.967773f,
- 0.974609f, 0.979492f, 0.983887f, 0.987305f, 0.988770f, 0.990723f, 0.991699f, 0.992676f,
- 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f,
- 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000244f, 0.000480f, 0.001081f, 0.001216f, 0.001684f, 0.002287f, 0.003113f,
- 0.004246f, 0.005711f, 0.007412f, 0.010658f, 0.014900f, 0.021408f, 0.033173f, 0.053711f,
- 0.094299f, 0.179688f, 0.351807f, 0.591309f, 0.774902f, 0.871582f, 0.919922f, 0.946289f,
- 0.961426f, 0.971191f, 0.977051f, 0.981934f, 0.984863f, 0.987305f, 0.989258f, 0.991211f,
- 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f,
- 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000364f, 0.000366f, 0.000729f, 0.001195f, 0.001218f, 0.001693f, 0.002209f,
- 0.003038f, 0.004192f, 0.005249f, 0.006981f, 0.009926f, 0.013405f, 0.019165f, 0.028473f,
- 0.044250f, 0.073975f, 0.134521f, 0.260010f, 0.476562f, 0.696289f, 0.830566f, 0.898438f,
- 0.933594f, 0.954102f, 0.966309f, 0.974609f, 0.979492f, 0.982910f, 0.986328f, 0.988281f,
- 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f,
- 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000226f, 0.000365f, 0.000488f, 0.000731f, 0.001090f, 0.001245f, 0.002028f,
- 0.002169f, 0.003023f, 0.003952f, 0.005043f, 0.006790f, 0.009026f, 0.012276f, 0.016754f,
- 0.024628f, 0.037384f, 0.060120f, 0.104431f, 0.196045f, 0.372803f, 0.604980f, 0.779785f,
- 0.872070f, 0.919922f, 0.945312f, 0.960938f, 0.970703f, 0.977539f, 0.980957f, 0.984863f,
- 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f,
- 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000364f, 0.000487f, 0.000488f, 0.000608f, 0.001092f, 0.001323f,
- 0.001909f, 0.002028f, 0.002829f, 0.003754f, 0.004940f, 0.006329f, 0.008850f, 0.011353f,
- 0.015572f, 0.022110f, 0.032196f, 0.050293f, 0.083984f, 0.151978f, 0.288574f, 0.507812f,
- 0.715332f, 0.839844f, 0.902832f, 0.936035f, 0.955566f, 0.966797f, 0.974609f, 0.979492f,
- 0.983887f, 0.986816f, 0.988281f, 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994141f,
- 0.994629f, 0.995605f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000341f, 0.000486f, 0.000487f, 0.000591f, 0.000846f, 0.001213f,
- 0.001407f, 0.002018f, 0.002306f, 0.003119f, 0.003736f, 0.004700f, 0.005936f, 0.007858f,
- 0.010498f, 0.013939f, 0.019913f, 0.028564f, 0.043060f, 0.069275f, 0.120972f, 0.225830f,
- 0.416748f, 0.642090f, 0.798828f, 0.881836f, 0.924805f, 0.948730f, 0.962891f, 0.971191f,
- 0.978516f, 0.982422f, 0.985352f, 0.987793f, 0.989746f, 0.991211f, 0.992676f, 0.993164f,
- 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.996582f, 0.997070f,
- 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000121f, 0.000122f, 0.000475f, 0.000486f, 0.000487f, 0.000714f, 0.000913f,
- 0.001296f, 0.001350f, 0.001884f, 0.002163f, 0.002871f, 0.003702f, 0.004578f, 0.005573f,
- 0.007278f, 0.009819f, 0.013039f, 0.017883f, 0.025589f, 0.037445f, 0.058655f, 0.099243f,
- 0.180542f, 0.338867f, 0.563965f, 0.751465f, 0.857422f, 0.912109f, 0.941406f, 0.958496f,
- 0.968262f, 0.976074f, 0.980957f, 0.984375f, 0.986816f, 0.989258f, 0.990723f, 0.992188f,
- 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f,
- 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000242f, 0.000417f, 0.000607f, 0.000602f, 0.000644f,
- 0.001016f, 0.001223f, 0.001337f, 0.002010f, 0.002087f, 0.002752f, 0.003380f, 0.004486f,
- 0.005760f, 0.007523f, 0.009048f, 0.012169f, 0.016312f, 0.022949f, 0.033295f, 0.050812f,
- 0.082886f, 0.146851f, 0.275635f, 0.486572f, 0.696777f, 0.828613f, 0.896484f, 0.933594f,
- 0.953613f, 0.965820f, 0.973633f, 0.979980f, 0.983887f, 0.986328f, 0.988770f, 0.990723f,
- 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f,
- 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000262f, 0.000463f, 0.000603f, 0.000665f,
- 0.000716f, 0.001069f, 0.001322f, 0.001538f, 0.001895f, 0.002293f, 0.003120f, 0.003323f,
- 0.004166f, 0.005638f, 0.006828f, 0.008942f, 0.011368f, 0.015465f, 0.021057f, 0.029663f,
- 0.044861f, 0.070923f, 0.123169f, 0.228149f, 0.416504f, 0.640137f, 0.797363f, 0.880859f,
- 0.924805f, 0.948730f, 0.963379f, 0.971680f, 0.978516f, 0.982422f, 0.985840f, 0.988281f,
- 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.996094f,
- 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000120f, 0.000172f, 0.000243f, 0.000365f, 0.000475f, 0.000607f,
- 0.000608f, 0.000609f, 0.001013f, 0.001424f, 0.001456f, 0.001904f, 0.002411f, 0.002903f,
- 0.003145f, 0.004314f, 0.004944f, 0.006607f, 0.008156f, 0.010719f, 0.014297f, 0.018906f,
- 0.027069f, 0.040070f, 0.062103f, 0.104858f, 0.191162f, 0.355469f, 0.581543f, 0.762695f,
- 0.863281f, 0.915039f, 0.943848f, 0.960449f, 0.970703f, 0.977051f, 0.981445f, 0.985840f,
- 0.987793f, 0.989746f, 0.991211f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f,
- 0.996094f, 0.996094f, 0.997070f, 0.997070f, 0.998047f, 0.997559f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000096f, 0.000239f, 0.000241f, 0.000336f, 0.000482f,
- 0.000719f, 0.000729f, 0.000831f, 0.001049f, 0.001552f, 0.001576f, 0.001710f, 0.002373f,
- 0.002846f, 0.003254f, 0.004051f, 0.005035f, 0.006405f, 0.007706f, 0.009987f, 0.013092f,
- 0.017715f, 0.024872f, 0.035980f, 0.055328f, 0.091248f, 0.163330f, 0.305664f, 0.524902f,
- 0.726562f, 0.845215f, 0.906250f, 0.938965f, 0.957031f, 0.969238f, 0.976074f, 0.981445f,
- 0.984863f, 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.995117f,
- 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000120f, 0.000351f, 0.000364f, 0.000421f,
- 0.000480f, 0.000606f, 0.000728f, 0.000852f, 0.001175f, 0.001535f, 0.001673f, 0.001671f,
- 0.002277f, 0.002743f, 0.003220f, 0.003922f, 0.004868f, 0.005951f, 0.007488f, 0.009430f,
- 0.012527f, 0.016266f, 0.022964f, 0.033142f, 0.049805f, 0.080688f, 0.141846f, 0.265625f,
- 0.473145f, 0.688477f, 0.825684f, 0.897949f, 0.934082f, 0.954102f, 0.966797f, 0.975098f,
- 0.980469f, 0.984375f, 0.987305f, 0.989258f, 0.991211f, 0.992676f, 0.993164f, 0.993652f,
- 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000058f, 0.000235f, 0.000360f, 0.000243f,
- 0.000440f, 0.000583f, 0.000847f, 0.000851f, 0.000852f, 0.001189f, 0.001411f, 0.001645f,
- 0.001898f, 0.002417f, 0.002617f, 0.003435f, 0.003695f, 0.004616f, 0.005733f, 0.007278f,
- 0.009216f, 0.012016f, 0.015701f, 0.021561f, 0.030396f, 0.045746f, 0.073120f, 0.125732f,
- 0.233521f, 0.428223f, 0.653320f, 0.807617f, 0.887695f, 0.929688f, 0.951660f, 0.965820f,
- 0.974121f, 0.980469f, 0.984375f, 0.986816f, 0.989746f, 0.991211f, 0.992676f, 0.993164f,
- 0.994141f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f,
- 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000237f, 0.000237f, 0.000362f,
- 0.000365f, 0.000558f, 0.000814f, 0.000727f, 0.000729f, 0.000935f, 0.001189f, 0.001403f,
- 0.001569f, 0.001989f, 0.002216f, 0.002533f, 0.003307f, 0.003906f, 0.004463f, 0.005646f,
- 0.006908f, 0.008980f, 0.011230f, 0.014755f, 0.020020f, 0.028320f, 0.041931f, 0.065979f,
- 0.113098f, 0.209229f, 0.389648f, 0.620605f, 0.789551f, 0.879395f, 0.924805f, 0.950684f,
- 0.964844f, 0.974121f, 0.979980f, 0.983398f, 0.987305f, 0.989258f, 0.991211f, 0.992676f,
- 0.993652f, 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f,
- 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000121f,
- 0.000241f, 0.000486f, 0.000575f, 0.000707f, 0.000726f, 0.000971f, 0.000849f, 0.000966f,
- 0.001350f, 0.001660f, 0.001678f, 0.002224f, 0.002483f, 0.003197f, 0.003611f, 0.004200f,
- 0.005318f, 0.006744f, 0.008476f, 0.010506f, 0.014145f, 0.019089f, 0.026627f, 0.039001f,
- 0.061096f, 0.103333f, 0.189819f, 0.358887f, 0.591309f, 0.773438f, 0.872559f, 0.922363f,
- 0.948730f, 0.963867f, 0.973145f, 0.979492f, 0.983887f, 0.986816f, 0.989258f, 0.991211f,
- 0.992188f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f,
- 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000175f, 0.000361f,
- 0.000481f, 0.000485f, 0.000364f, 0.000562f, 0.000703f, 0.000827f, 0.000842f, 0.000972f,
- 0.001172f, 0.001321f, 0.001675f, 0.001684f, 0.002153f, 0.002455f, 0.003122f, 0.003391f,
- 0.004177f, 0.005314f, 0.006325f, 0.007896f, 0.010368f, 0.013527f, 0.018082f, 0.025162f,
- 0.037140f, 0.057343f, 0.095886f, 0.175659f, 0.334473f, 0.567871f, 0.760742f, 0.866699f,
- 0.919922f, 0.947754f, 0.963379f, 0.972656f, 0.979492f, 0.984375f, 0.987305f, 0.989258f,
- 0.991211f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.997070f,
- 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000325f,
- 0.000311f, 0.000243f, 0.000484f, 0.000486f, 0.000536f, 0.000698f, 0.000723f, 0.000844f,
- 0.000972f, 0.001081f, 0.001312f, 0.001658f, 0.001914f, 0.001932f, 0.002390f, 0.003017f,
- 0.003668f, 0.004353f, 0.005199f, 0.006336f, 0.007812f, 0.009972f, 0.012802f, 0.017029f,
- 0.024200f, 0.035034f, 0.053833f, 0.090027f, 0.164185f, 0.316162f, 0.549805f, 0.751465f,
- 0.863281f, 0.918457f, 0.947266f, 0.963379f, 0.974121f, 0.979492f, 0.984375f, 0.987793f,
- 0.989746f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.997070f,
- 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f,
- 0.000231f, 0.000453f, 0.000480f, 0.000484f, 0.000485f, 0.000486f, 0.000917f, 0.000963f,
- 0.000969f, 0.000970f, 0.001043f, 0.001288f, 0.001523f, 0.001684f, 0.001885f, 0.002464f,
- 0.002531f, 0.003565f, 0.004124f, 0.004745f, 0.006077f, 0.007580f, 0.009605f, 0.012634f,
- 0.016953f, 0.023346f, 0.033386f, 0.051697f, 0.085632f, 0.156250f, 0.303955f, 0.537598f,
- 0.746582f, 0.860840f, 0.918457f, 0.947754f, 0.963867f, 0.973633f, 0.979980f, 0.984863f,
- 0.987793f, 0.990234f, 0.991699f, 0.993652f, 0.994141f, 0.995117f, 0.996094f, 0.996582f,
- 0.997070f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000235f, 0.000239f, 0.000359f, 0.000484f, 0.000485f, 0.000486f, 0.000628f,
- 0.000957f, 0.000967f, 0.000969f, 0.001065f, 0.001288f, 0.001602f, 0.001850f, 0.001995f,
- 0.002409f, 0.002523f, 0.003462f, 0.003838f, 0.004993f, 0.005917f, 0.007233f, 0.009338f,
- 0.012230f, 0.015610f, 0.022415f, 0.032288f, 0.049805f, 0.082947f, 0.151489f, 0.296631f,
- 0.532715f, 0.745117f, 0.862793f, 0.919434f, 0.948242f, 0.964844f, 0.974609f, 0.980957f,
- 0.985352f, 0.988281f, 0.990723f, 0.992676f, 0.994141f, 0.994629f, 0.995605f, 0.996094f,
- 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000187f, 0.000437f, 0.000473f, 0.000483f, 0.000485f, 0.000606f,
- 0.000583f, 0.000711f, 0.000772f, 0.000968f, 0.001107f, 0.001287f, 0.001434f, 0.001662f,
- 0.001984f, 0.002449f, 0.002634f, 0.003145f, 0.003777f, 0.004410f, 0.005722f, 0.007114f,
- 0.008926f, 0.011696f, 0.016006f, 0.021683f, 0.031342f, 0.048309f, 0.080750f, 0.149170f,
- 0.294678f, 0.534668f, 0.749512f, 0.866211f, 0.922363f, 0.950684f, 0.966309f, 0.975586f,
- 0.981934f, 0.985840f, 0.989258f, 0.991699f, 0.992676f, 0.994141f, 0.994629f, 0.996094f,
- 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000247f, 0.000238f, 0.000407f, 0.000482f, 0.000484f,
- 0.000604f, 0.000869f, 0.000909f, 0.000721f, 0.000955f, 0.001000f, 0.001241f, 0.001342f,
- 0.001655f, 0.001721f, 0.002329f, 0.002623f, 0.003086f, 0.003677f, 0.004349f, 0.005600f,
- 0.006962f, 0.008835f, 0.011581f, 0.015274f, 0.021286f, 0.030884f, 0.047760f, 0.079895f,
- 0.148926f, 0.298584f, 0.543945f, 0.758301f, 0.872559f, 0.925781f, 0.953125f, 0.967773f,
- 0.977051f, 0.982910f, 0.986816f, 0.989258f, 0.991211f, 0.993164f, 0.994629f, 0.995605f,
- 0.996094f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000237f, 0.000410f, 0.000472f, 0.000481f,
- 0.000483f, 0.000485f, 0.000687f, 0.000913f, 0.000956f, 0.000966f, 0.000997f, 0.001341f,
- 0.001415f, 0.001813f, 0.002029f, 0.002043f, 0.002594f, 0.003210f, 0.003641f, 0.004734f,
- 0.005356f, 0.006882f, 0.008675f, 0.011360f, 0.014816f, 0.020920f, 0.030380f, 0.047485f,
- 0.080200f, 0.151733f, 0.308105f, 0.561523f, 0.772949f, 0.881348f, 0.931152f, 0.956055f,
- 0.969727f, 0.978516f, 0.983887f, 0.987793f, 0.990234f, 0.992188f, 0.993652f, 0.994629f,
- 0.995605f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000254f, 0.000345f, 0.000468f,
- 0.000585f, 0.000482f, 0.000603f, 0.000485f, 0.000862f, 0.000928f, 0.000965f, 0.001174f,
- 0.001162f, 0.001405f, 0.001761f, 0.002016f, 0.002182f, 0.002733f, 0.002831f, 0.003504f,
- 0.004456f, 0.005440f, 0.006775f, 0.008553f, 0.011055f, 0.014694f, 0.020859f, 0.030334f,
- 0.047852f, 0.081970f, 0.157593f, 0.325439f, 0.586914f, 0.790527f, 0.890137f, 0.936523f,
- 0.959473f, 0.973145f, 0.980469f, 0.985352f, 0.988770f, 0.990723f, 0.992676f, 0.994141f,
- 0.995117f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000237f, 0.000340f,
- 0.000457f, 0.000580f, 0.000481f, 0.000601f, 0.000605f, 0.000742f, 0.000951f, 0.000953f,
- 0.001131f, 0.001257f, 0.001396f, 0.001730f, 0.001936f, 0.002102f, 0.002682f, 0.002762f,
- 0.003733f, 0.004425f, 0.005344f, 0.006516f, 0.008354f, 0.010971f, 0.014793f, 0.020859f,
- 0.030640f, 0.048859f, 0.085144f, 0.167358f, 0.350586f, 0.620117f, 0.811035f, 0.900391f,
- 0.942383f, 0.963379f, 0.975098f, 0.981934f, 0.986816f, 0.989746f, 0.992188f, 0.993164f,
- 0.994629f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000131f,
- 0.000301f, 0.000430f, 0.000470f, 0.000593f, 0.000571f, 0.000587f, 0.000693f, 0.000906f,
- 0.000959f, 0.000965f, 0.001094f, 0.001364f, 0.001522f, 0.001783f, 0.002094f, 0.002615f,
- 0.003038f, 0.003365f, 0.004307f, 0.005135f, 0.006493f, 0.008347f, 0.011055f, 0.014824f,
- 0.020844f, 0.031204f, 0.050507f, 0.090027f, 0.182129f, 0.385498f, 0.659668f, 0.834473f,
- 0.913086f, 0.949219f, 0.967285f, 0.978027f, 0.983887f, 0.987793f, 0.991211f, 0.992188f,
- 0.994141f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000189f, 0.000122f, 0.000122f,
- 0.000241f, 0.000295f, 0.000425f, 0.000457f, 0.000592f, 0.000481f, 0.000603f, 0.000697f,
- 0.000926f, 0.000943f, 0.000960f, 0.001022f, 0.001435f, 0.001632f, 0.001658f, 0.002024f,
- 0.002468f, 0.003010f, 0.003210f, 0.004124f, 0.005219f, 0.006351f, 0.008163f, 0.010933f,
- 0.015030f, 0.021271f, 0.032257f, 0.053009f, 0.097534f, 0.203003f, 0.432373f, 0.704102f,
- 0.858887f, 0.924805f, 0.955566f, 0.970703f, 0.979492f, 0.985840f, 0.989258f, 0.991699f,
- 0.993164f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000214f,
- 0.000201f, 0.000239f, 0.000241f, 0.000383f, 0.000461f, 0.000474f, 0.000479f, 0.000598f,
- 0.000736f, 0.000905f, 0.000947f, 0.001072f, 0.001180f, 0.001376f, 0.001572f, 0.001752f,
- 0.001900f, 0.002258f, 0.002792f, 0.003487f, 0.004055f, 0.005161f, 0.006424f, 0.008209f,
- 0.010933f, 0.015030f, 0.021942f, 0.033630f, 0.056671f, 0.107666f, 0.233276f, 0.492188f,
- 0.752441f, 0.881836f, 0.937012f, 0.961914f, 0.975098f, 0.982910f, 0.987305f, 0.990234f,
- 0.992676f, 0.994629f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998535f, 0.998535f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000132f,
- 0.000224f, 0.000129f, 0.000237f, 0.000240f, 0.000337f, 0.000430f, 0.000468f, 0.000579f,
- 0.000593f, 0.000602f, 0.000881f, 0.000936f, 0.000956f, 0.000963f, 0.001282f, 0.001519f,
- 0.001607f, 0.001852f, 0.002150f, 0.002737f, 0.003508f, 0.003990f, 0.005077f, 0.006516f,
- 0.008179f, 0.011185f, 0.015511f, 0.022446f, 0.035614f, 0.061859f, 0.122681f, 0.275879f,
- 0.563965f, 0.798828f, 0.903809f, 0.946777f, 0.967773f, 0.978516f, 0.984863f, 0.988770f,
- 0.991699f, 0.993652f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000149f, 0.000122f, 0.000207f, 0.000371f, 0.000430f, 0.000573f,
- 0.000591f, 0.000598f, 0.000597f, 0.000804f, 0.000901f, 0.000948f, 0.001053f, 0.001083f,
- 0.001376f, 0.001584f, 0.001878f, 0.002331f, 0.002529f, 0.003376f, 0.003944f, 0.005230f,
- 0.006504f, 0.008537f, 0.011459f, 0.015747f, 0.024002f, 0.038361f, 0.069458f, 0.144409f,
- 0.336914f, 0.644043f, 0.841797f, 0.922363f, 0.957520f, 0.972656f, 0.981934f, 0.987305f,
- 0.990234f, 0.993164f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000230f, 0.000234f, 0.000235f, 0.000268f, 0.000400f,
- 0.000448f, 0.000585f, 0.000590f, 0.000599f, 0.000641f, 0.000788f, 0.000930f, 0.000968f,
- 0.001107f, 0.001251f, 0.001656f, 0.001701f, 0.002047f, 0.002691f, 0.003437f, 0.003998f,
- 0.004829f, 0.006329f, 0.008492f, 0.011757f, 0.016525f, 0.025345f, 0.042297f, 0.080200f,
- 0.177490f, 0.420654f, 0.724121f, 0.878906f, 0.938965f, 0.964355f, 0.977539f, 0.984863f,
- 0.989746f, 0.992188f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000214f, 0.000235f, 0.000228f, 0.000240f,
- 0.000429f, 0.000439f, 0.000574f, 0.000654f, 0.000583f, 0.000493f, 0.000788f, 0.000813f,
- 0.000947f, 0.001062f, 0.001225f, 0.001569f, 0.001721f, 0.002048f, 0.002844f, 0.002979f,
- 0.003902f, 0.004997f, 0.006454f, 0.008698f, 0.012192f, 0.018143f, 0.027634f, 0.047913f,
- 0.095886f, 0.228394f, 0.526855f, 0.796875f, 0.910156f, 0.953125f, 0.973145f, 0.982422f,
- 0.987793f, 0.991699f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000236f,
- 0.000232f, 0.000299f, 0.000446f, 0.000417f, 0.000466f, 0.000580f, 0.000508f, 0.000710f,
- 0.000800f, 0.000940f, 0.000954f, 0.001228f, 0.001496f, 0.001631f, 0.002043f, 0.002798f,
- 0.003359f, 0.004139f, 0.004951f, 0.006680f, 0.008995f, 0.012764f, 0.018860f, 0.030823f,
- 0.056061f, 0.120911f, 0.307617f, 0.645508f, 0.855957f, 0.934082f, 0.964355f, 0.978516f,
- 0.985840f, 0.990234f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000226f,
- 0.000122f, 0.000226f, 0.000373f, 0.000272f, 0.000325f, 0.000460f, 0.000471f, 0.000477f,
- 0.000673f, 0.000877f, 0.000929f, 0.000951f, 0.001129f, 0.001446f, 0.001614f, 0.002096f,
- 0.002619f, 0.002939f, 0.003941f, 0.005363f, 0.006844f, 0.009491f, 0.013596f, 0.020905f,
- 0.035370f, 0.068420f, 0.161743f, 0.426270f, 0.755859f, 0.900879f, 0.952148f, 0.973145f,
- 0.983398f, 0.989746f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000111f, 0.000236f, 0.000297f, 0.000368f, 0.000449f, 0.000467f,
- 0.000588f, 0.000641f, 0.000813f, 0.000924f, 0.001035f, 0.001124f, 0.001348f, 0.001764f,
- 0.001922f, 0.002439f, 0.003160f, 0.004005f, 0.005280f, 0.007107f, 0.010109f, 0.014748f,
- 0.023148f, 0.041595f, 0.088440f, 0.232910f, 0.578125f, 0.841797f, 0.933594f, 0.965820f,
- 0.980469f, 0.987305f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000014f, 0.000011f, 0.000116f, 0.000148f, 0.000128f, 0.000369f, 0.000418f,
- 0.000563f, 0.000470f, 0.000592f, 0.000776f, 0.000901f, 0.000937f, 0.001112f, 0.001348f,
- 0.001743f, 0.001904f, 0.002470f, 0.003187f, 0.003986f, 0.005360f, 0.007557f, 0.010674f,
- 0.016068f, 0.026871f, 0.051666f, 0.122925f, 0.356445f, 0.729492f, 0.901855f, 0.955078f,
- 0.976074f, 0.985840f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, 0.996094f, 0.996582f,
- 0.000122f, 0.000122f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000028f, 0.000019f, 0.000014f, 0.000011f, 0.000033f, 0.000118f, 0.000247f, 0.000305f,
- 0.000412f, 0.000447f, 0.000576f, 0.000587f, 0.000693f, 0.000850f, 0.000949f, 0.001083f,
- 0.001319f, 0.001557f, 0.001957f, 0.002424f, 0.003340f, 0.004417f, 0.005688f, 0.007774f,
- 0.011497f, 0.017731f, 0.032257f, 0.068604f, 0.189575f, 0.541992f, 0.843262f, 0.938477f,
- 0.970703f, 0.983887f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f,
- 0.000121f, 0.000118f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000067f,
- 0.000042f, 0.000028f, 0.000020f, 0.000015f, 0.000066f, 0.000009f, 0.000101f, 0.000118f,
- 0.000260f, 0.000358f, 0.000520f, 0.000456f, 0.000563f, 0.000711f, 0.000872f, 0.000980f,
- 0.001059f, 0.001309f, 0.001699f, 0.002066f, 0.002708f, 0.003248f, 0.004166f, 0.005836f,
- 0.008224f, 0.012619f, 0.021484f, 0.041260f, 0.101074f, 0.323486f, 0.733887f, 0.912109f,
- 0.962402f, 0.980957f, 0.995117f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f,
- 0.000000f, 0.000000f, 0.000119f, 0.000119f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000105f,
- 0.000067f, 0.000042f, 0.000029f, 0.000022f, 0.000015f, 0.000011f, 0.000040f, 0.000033f,
- 0.000153f, 0.000204f, 0.000313f, 0.000501f, 0.000554f, 0.000575f, 0.000585f, 0.000778f,
- 0.000925f, 0.000980f, 0.001245f, 0.001634f, 0.001989f, 0.002413f, 0.003433f, 0.004028f,
- 0.005989f, 0.008911f, 0.014374f, 0.026443f, 0.057495f, 0.170166f, 0.549805f, 0.864746f,
- 0.951172f, 0.977051f, 0.994629f, 0.994629f, 0.994629f, 0.994629f, 0.995605f, 0.994629f,
- 0.000000f, 0.000046f, 0.000088f, 0.000118f, 0.000120f, 0.000120f, 0.000120f, 0.000120f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000108f, 0.000069f, 0.000047f, 0.000030f, 0.000022f, 0.000016f, 0.000012f, 0.000052f,
- 0.000081f, 0.000100f, 0.000184f, 0.000226f, 0.000400f, 0.000467f, 0.000452f, 0.000597f,
- 0.000807f, 0.000895f, 0.000942f, 0.001219f, 0.001611f, 0.002022f, 0.002352f, 0.003222f,
- 0.004177f, 0.006481f, 0.009850f, 0.017517f, 0.034668f, 0.090637f, 0.331055f, 0.776367f,
- 0.932129f, 0.972656f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994629f,
- 0.000000f, 0.000000f, 0.000000f, 0.000107f, 0.000115f, 0.000112f, 0.000119f, 0.000118f,
- 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000117f, 0.000072f, 0.000049f, 0.000032f, 0.000023f, 0.000017f, 0.000013f,
- 0.000011f, 0.000008f, 0.000075f, 0.000151f, 0.000207f, 0.000305f, 0.000509f, 0.000499f,
- 0.000560f, 0.000704f, 0.000863f, 0.000917f, 0.001220f, 0.001505f, 0.001740f, 0.002174f,
- 0.003153f, 0.004559f, 0.007095f, 0.011826f, 0.022247f, 0.051147f, 0.173462f, 0.618652f,
- 0.902344f, 0.966309f, 0.993164f, 0.993652f, 0.992676f, 0.992676f, 0.993164f, 0.993164f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000060f, 0.000102f, 0.000113f,
- 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000078f, 0.000052f, 0.000038f, 0.000027f, 0.000019f,
- 0.000015f, 0.000011f, 0.000054f, 0.000007f, 0.000085f, 0.000108f, 0.000258f, 0.000466f,
- 0.000533f, 0.000560f, 0.000662f, 0.000849f, 0.000856f, 0.000965f, 0.001180f, 0.001678f,
- 0.002075f, 0.003193f, 0.005016f, 0.008095f, 0.014343f, 0.030899f, 0.090820f, 0.401367f,
- 0.848145f, 0.956543f, 0.992188f, 0.992188f, 0.992188f, 0.992676f, 0.991699f, 0.992188f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000059f, 0.000096f,
- 0.000107f, 0.000112f, 0.000115f, 0.000116f, 0.000117f, 0.000118f, 0.000118f, 0.000119f,
- 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000088f, 0.000059f, 0.000041f, 0.000031f,
- 0.000022f, 0.000017f, 0.000013f, 0.000010f, 0.000056f, 0.000091f, 0.000183f, 0.000201f,
- 0.000309f, 0.000506f, 0.000547f, 0.000525f, 0.000629f, 0.000613f, 0.000817f, 0.001012f,
- 0.001640f, 0.002420f, 0.003588f, 0.005520f, 0.009453f, 0.019119f, 0.050415f, 0.214722f,
- 0.751465f, 0.943848f, 0.990723f, 0.990723f, 0.991211f, 0.991211f, 0.991211f, 0.991211f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000055f, 0.000095f, 0.000103f, 0.000105f, 0.000112f, 0.000114f, 0.000115f,
- 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f,
- 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000105f, 0.000069f, 0.000048f,
- 0.000035f, 0.000025f, 0.000019f, 0.000015f, 0.000011f, 0.000014f, 0.000008f, 0.000071f,
- 0.000193f, 0.000311f, 0.000315f, 0.000524f, 0.000483f, 0.000558f, 0.000591f, 0.000705f,
- 0.000950f, 0.001389f, 0.002428f, 0.003494f, 0.006321f, 0.012306f, 0.029480f, 0.108948f,
- 0.581543f, 0.924316f, 0.989746f, 0.989746f, 0.989258f, 0.989746f, 0.989258f, 0.989746f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000069f, 0.000096f, 0.000103f, 0.000107f,
- 0.000109f, 0.000112f, 0.000113f, 0.000115f, 0.000115f, 0.000116f, 0.000117f, 0.000117f,
- 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000084f,
- 0.000061f, 0.000042f, 0.000031f, 0.000023f, 0.000018f, 0.000014f, 0.000011f, 0.000009f,
- 0.000095f, 0.000127f, 0.000223f, 0.000402f, 0.000432f, 0.000399f, 0.000494f, 0.000535f,
- 0.000557f, 0.000933f, 0.001474f, 0.002300f, 0.004192f, 0.007919f, 0.017838f, 0.057068f,
- 0.360840f, 0.890625f, 0.986816f, 0.987793f, 0.987305f, 0.987305f, 0.987793f, 0.987305f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000035f, 0.000041f,
- 0.000088f, 0.000098f, 0.000103f, 0.000106f, 0.000110f, 0.000110f, 0.000113f, 0.000113f,
- 0.000115f, 0.000116f, 0.000116f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000118f,
- 0.000111f, 0.000074f, 0.000053f, 0.000038f, 0.000029f, 0.000022f, 0.000016f, 0.000013f,
- 0.000010f, 0.000008f, 0.000073f, 0.000152f, 0.000296f, 0.000369f, 0.000365f, 0.000437f,
- 0.000507f, 0.000661f, 0.000876f, 0.001451f, 0.002531f, 0.004898f, 0.010384f, 0.031113f,
- 0.183838f, 0.833008f, 0.984375f, 0.984863f, 0.984863f, 0.984375f, 0.984863f, 0.984863f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000024f, 0.000044f, 0.000073f, 0.000087f, 0.000097f, 0.000102f, 0.000105f,
- 0.000108f, 0.000110f, 0.000111f, 0.000113f, 0.000114f, 0.000114f, 0.000115f, 0.000115f,
- 0.000116f, 0.000116f, 0.000101f, 0.000070f, 0.000052f, 0.000037f, 0.000027f, 0.000021f,
- 0.000016f, 0.000013f, 0.000010f, 0.000008f, 0.000083f, 0.000183f, 0.000352f, 0.000355f,
- 0.000362f, 0.000365f, 0.000528f, 0.000790f, 0.001469f, 0.003029f, 0.005970f, 0.017242f,
- 0.089050f, 0.728516f, 0.980957f, 0.981445f, 0.981445f, 0.980957f, 0.980957f, 0.981445f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000033f, 0.000041f, 0.000073f,
- 0.000083f, 0.000088f, 0.000097f, 0.000102f, 0.000105f, 0.000108f, 0.000108f, 0.000111f,
- 0.000112f, 0.000113f, 0.000113f, 0.000114f, 0.000097f, 0.000068f, 0.000049f, 0.000038f,
- 0.000028f, 0.000021f, 0.000016f, 0.000013f, 0.000010f, 0.000056f, 0.000151f, 0.000243f,
- 0.000264f, 0.000221f, 0.000328f, 0.000449f, 0.000850f, 0.001612f, 0.003340f, 0.009361f,
- 0.043121f, 0.548340f, 0.976074f, 0.976562f, 0.975586f, 0.976074f, 0.976074f, 0.976562f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000019f, 0.000052f, 0.000065f, 0.000077f, 0.000088f, 0.000094f, 0.000098f,
- 0.000100f, 0.000104f, 0.000106f, 0.000108f, 0.000109f, 0.000110f, 0.000095f, 0.000069f,
- 0.000052f, 0.000037f, 0.000028f, 0.000021f, 0.000017f, 0.000013f, 0.000025f, 0.000063f,
- 0.000195f, 0.000233f, 0.000205f, 0.000264f, 0.000401f, 0.000789f, 0.001532f, 0.004520f,
- 0.020844f, 0.321289f, 0.969238f, 0.968750f, 0.969238f, 0.968750f, 0.969238f, 0.969238f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000018f, 0.000039f, 0.000053f,
- 0.000066f, 0.000079f, 0.000086f, 0.000090f, 0.000096f, 0.000100f, 0.000102f, 0.000105f,
- 0.000098f, 0.000074f, 0.000053f, 0.000041f, 0.000031f, 0.000023f, 0.000017f, 0.000013f,
- 0.000028f, 0.000139f, 0.000189f, 0.000179f, 0.000219f, 0.000333f, 0.000840f, 0.002119f,
- 0.009193f, 0.144775f, 0.958496f, 0.958496f, 0.958008f, 0.958496f, 0.958008f, 0.958008f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000025f, 0.000040f, 0.000052f, 0.000067f, 0.000077f, 0.000082f,
- 0.000089f, 0.000093f, 0.000097f, 0.000079f, 0.000059f, 0.000044f, 0.000033f, 0.000024f,
- 0.000018f, 0.000014f, 0.000034f, 0.000084f, 0.000157f, 0.000199f, 0.000309f, 0.000817f,
- 0.003424f, 0.054901f, 0.940918f, 0.940918f, 0.940918f, 0.940918f, 0.941406f, 0.940430f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000021f,
- 0.000040f, 0.000054f, 0.000063f, 0.000072f, 0.000078f, 0.000085f, 0.000065f, 0.000049f,
- 0.000036f, 0.000026f, 0.000019f, 0.000014f, 0.000042f, 0.000114f, 0.000122f, 0.000276f,
- 0.001024f, 0.016357f, 0.912109f, 0.912598f, 0.911621f, 0.912598f, 0.911621f, 0.913086f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000016f, 0.000032f, 0.000045f, 0.000056f,
- 0.000065f, 0.000054f, 0.000039f, 0.000028f, 0.000019f, 0.000013f, 0.000049f, 0.000079f,
- 0.000226f, 0.003199f, 0.860840f, 0.859863f, 0.860352f, 0.860840f, 0.860840f, 0.860352f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000004f, 0.000021f, 0.000035f, 0.000040f, 0.000027f, 0.000018f, 0.000013f,
- 0.000033f, 0.000333f, 0.764160f, 0.765137f, 0.764648f, 0.764648f, 0.764648f, 0.765137f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f,
- 0.000011f, 0.000009f, 0.600586f, 0.602051f, 0.602051f, 0.601562f, 0.601074f, 0.601074f,
- },
- {
- 0.142456f, 0.713867f, 0.883789f, 0.933105f, 0.953613f, 0.964844f, 0.972168f, 0.977539f,
- 0.980957f, 0.983398f, 0.985352f, 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991699f,
- 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f,
- 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.012886f, 0.087646f, 0.360840f, 0.709473f, 0.859863f, 0.916992f, 0.943848f, 0.958496f,
- 0.967773f, 0.973633f, 0.978516f, 0.980957f, 0.984375f, 0.986328f, 0.987793f, 0.988770f,
- 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.994629f,
- 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f,
- 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.003895f, 0.020126f, 0.063599f, 0.188721f, 0.464844f, 0.727539f, 0.853027f, 0.909668f,
- 0.938477f, 0.954590f, 0.965332f, 0.971680f, 0.976562f, 0.979980f, 0.982910f, 0.985840f,
- 0.986816f, 0.988770f, 0.990234f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f,
- 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f,
- 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f,
- 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.002062f, 0.008438f, 0.021774f, 0.049713f, 0.117676f, 0.279541f, 0.541016f, 0.751465f,
- 0.855469f, 0.909180f, 0.936035f, 0.952637f, 0.963379f, 0.970703f, 0.975098f, 0.979492f,
- 0.982910f, 0.984863f, 0.986328f, 0.987793f, 0.989258f, 0.990234f, 0.990723f, 0.992188f,
- 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, 0.996094f,
- 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.001335f, 0.004597f, 0.010628f, 0.020844f, 0.040283f, 0.082764f, 0.177612f, 0.366211f,
- 0.605469f, 0.773926f, 0.863281f, 0.910156f, 0.936035f, 0.952148f, 0.962402f, 0.969727f,
- 0.975098f, 0.979004f, 0.982422f, 0.984863f, 0.986328f, 0.988281f, 0.988770f, 0.989746f,
- 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f,
- 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.996582f, 0.997070f, 0.997559f,
- 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f,
- 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000851f, 0.002769f, 0.006130f, 0.010994f, 0.019394f, 0.034943f, 0.063293f, 0.122253f,
- 0.244019f, 0.448242f, 0.660156f, 0.798828f, 0.872559f, 0.914062f, 0.937988f, 0.954102f,
- 0.961914f, 0.970215f, 0.974609f, 0.978516f, 0.981934f, 0.984375f, 0.986328f, 0.987793f,
- 0.988770f, 0.989746f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f,
- 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f,
- 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000466f, 0.001933f, 0.003809f, 0.007095f, 0.011353f, 0.018204f, 0.030029f, 0.050568f,
- 0.090759f, 0.170898f, 0.318848f, 0.526367f, 0.708496f, 0.820801f, 0.884277f, 0.918457f,
- 0.940918f, 0.954102f, 0.963867f, 0.970215f, 0.975098f, 0.978516f, 0.981934f, 0.984863f,
- 0.986328f, 0.988281f, 0.988770f, 0.990234f, 0.991211f, 0.991699f, 0.993164f, 0.993652f,
- 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f,
- 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000487f, 0.001685f, 0.002766f, 0.004467f, 0.007305f, 0.011215f, 0.017136f, 0.026489f,
- 0.042419f, 0.071716f, 0.125244f, 0.228271f, 0.399658f, 0.599609f, 0.751953f, 0.842773f,
- 0.894531f, 0.924805f, 0.943359f, 0.955566f, 0.965820f, 0.971191f, 0.976562f, 0.979980f,
- 0.981934f, 0.984863f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992188f,
- 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f,
- 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000965f, 0.002024f, 0.003202f, 0.005009f, 0.007050f, 0.011070f, 0.015869f,
- 0.023987f, 0.036835f, 0.058563f, 0.097168f, 0.169800f, 0.297852f, 0.484131f, 0.664062f,
- 0.789062f, 0.861816f, 0.905273f, 0.930176f, 0.947266f, 0.958984f, 0.967285f, 0.972168f,
- 0.976562f, 0.980469f, 0.982910f, 0.984863f, 0.986816f, 0.988770f, 0.989746f, 0.990723f,
- 0.992188f, 0.992188f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.995605f,
- 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f,
- 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000974f, 0.001576f, 0.002403f, 0.003510f, 0.005344f, 0.007332f, 0.010567f,
- 0.015099f, 0.022064f, 0.032104f, 0.048706f, 0.078003f, 0.130249f, 0.224243f, 0.378174f,
- 0.566406f, 0.720703f, 0.820312f, 0.879883f, 0.915039f, 0.936523f, 0.951660f, 0.961426f,
- 0.968262f, 0.974121f, 0.978027f, 0.980957f, 0.983887f, 0.985840f, 0.987793f, 0.989258f,
- 0.990234f, 0.991211f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f,
- 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f,
- 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000240f, 0.000609f, 0.001096f, 0.001580f, 0.002674f, 0.004131f, 0.005245f, 0.007660f,
- 0.010757f, 0.014221f, 0.019775f, 0.028381f, 0.041870f, 0.064697f, 0.103638f, 0.173706f,
- 0.293945f, 0.466553f, 0.642090f, 0.769531f, 0.849121f, 0.895996f, 0.924316f, 0.942871f,
- 0.956055f, 0.963867f, 0.970703f, 0.975098f, 0.979004f, 0.981934f, 0.984863f, 0.986328f,
- 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f,
- 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f,
- 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000000f, 0.000608f, 0.001062f, 0.001268f, 0.002001f, 0.003099f, 0.003937f, 0.005379f,
- 0.007595f, 0.010078f, 0.013176f, 0.018524f, 0.025787f, 0.036896f, 0.054932f, 0.085327f,
- 0.137573f, 0.229980f, 0.376953f, 0.555664f, 0.708984f, 0.810547f, 0.873047f, 0.909180f,
- 0.933594f, 0.948730f, 0.959961f, 0.967285f, 0.973145f, 0.977539f, 0.980469f, 0.983398f,
- 0.985840f, 0.986816f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.993652f,
- 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996094f, 0.996582f,
- 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000606f, 0.000609f, 0.001317f, 0.001564f, 0.002674f, 0.003273f, 0.004402f,
- 0.005630f, 0.007141f, 0.009514f, 0.012398f, 0.016678f, 0.023331f, 0.032776f, 0.047363f,
- 0.071594f, 0.112610f, 0.183960f, 0.303711f, 0.470215f, 0.639648f, 0.766113f, 0.844727f,
- 0.892090f, 0.921875f, 0.941895f, 0.954590f, 0.963379f, 0.970215f, 0.975098f, 0.979004f,
- 0.981934f, 0.984863f, 0.986328f, 0.987793f, 0.989746f, 0.991211f, 0.991699f, 0.992676f,
- 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f,
- 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000244f, 0.000727f, 0.000803f, 0.001575f, 0.002035f, 0.002821f, 0.003527f,
- 0.004475f, 0.005421f, 0.007023f, 0.009491f, 0.011879f, 0.015976f, 0.021530f, 0.029587f,
- 0.041809f, 0.061737f, 0.094360f, 0.150146f, 0.246460f, 0.393066f, 0.566406f, 0.712891f,
- 0.812500f, 0.872070f, 0.909180f, 0.933105f, 0.948242f, 0.959961f, 0.967773f, 0.972656f,
- 0.977539f, 0.980957f, 0.982910f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.991211f,
- 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.996094f,
- 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000244f, 0.000244f, 0.000471f, 0.000727f, 0.000967f, 0.001572f, 0.002161f, 0.002680f,
- 0.003246f, 0.004337f, 0.005241f, 0.006950f, 0.009087f, 0.011497f, 0.015038f, 0.019913f,
- 0.026688f, 0.037537f, 0.054352f, 0.080383f, 0.125122f, 0.202515f, 0.327148f, 0.493652f,
- 0.656250f, 0.774414f, 0.849609f, 0.895508f, 0.923828f, 0.942383f, 0.954590f, 0.963867f,
- 0.971191f, 0.975586f, 0.979004f, 0.982422f, 0.984863f, 0.987305f, 0.988281f, 0.989746f,
- 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f,
- 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f,
- 0.000121f, 0.000244f, 0.000244f, 0.000715f, 0.001089f, 0.001278f, 0.001781f, 0.002275f,
- 0.002548f, 0.003334f, 0.004150f, 0.005314f, 0.006824f, 0.008430f, 0.011200f, 0.014145f,
- 0.018631f, 0.024750f, 0.033905f, 0.047760f, 0.069885f, 0.106445f, 0.169312f, 0.273682f,
- 0.426270f, 0.596191f, 0.732422f, 0.823242f, 0.879883f, 0.914062f, 0.936035f, 0.950684f,
- 0.960938f, 0.968750f, 0.973633f, 0.978516f, 0.981934f, 0.984375f, 0.986328f, 0.988281f,
- 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f,
- 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.998047f, 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999023f,
- 0.000241f, 0.000244f, 0.000365f, 0.000600f, 0.000961f, 0.000972f, 0.001621f, 0.001697f,
- 0.002274f, 0.002684f, 0.003359f, 0.004238f, 0.005573f, 0.006691f, 0.008057f, 0.010529f,
- 0.013832f, 0.017593f, 0.022812f, 0.031174f, 0.042786f, 0.061462f, 0.092407f, 0.143799f,
- 0.231201f, 0.366943f, 0.535645f, 0.688477f, 0.794922f, 0.861816f, 0.902832f, 0.928711f,
- 0.945801f, 0.957520f, 0.966797f, 0.972656f, 0.976562f, 0.980469f, 0.983398f, 0.985840f,
- 0.987793f, 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f,
- 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.997070f, 0.997070f, 0.997559f, 0.997559f,
- 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000243f, 0.000365f, 0.000365f, 0.000798f, 0.000968f, 0.001249f, 0.001528f,
- 0.001798f, 0.002457f, 0.002798f, 0.003494f, 0.004353f, 0.005306f, 0.006363f, 0.008141f,
- 0.010147f, 0.012596f, 0.016006f, 0.021423f, 0.028503f, 0.039185f, 0.055420f, 0.081116f,
- 0.124390f, 0.198120f, 0.316895f, 0.478516f, 0.641113f, 0.763672f, 0.842773f, 0.891113f,
- 0.921387f, 0.941406f, 0.954590f, 0.963867f, 0.970215f, 0.975586f, 0.979492f, 0.982910f,
- 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.993652f,
- 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000238f, 0.000365f, 0.000365f, 0.000598f, 0.000820f, 0.001200f, 0.001279f,
- 0.001631f, 0.001736f, 0.002172f, 0.002874f, 0.003576f, 0.004391f, 0.005096f, 0.006176f,
- 0.007545f, 0.009674f, 0.012505f, 0.015945f, 0.020187f, 0.026550f, 0.035706f, 0.049835f,
- 0.072510f, 0.109253f, 0.171631f, 0.275391f, 0.426514f, 0.594238f, 0.730469f, 0.822754f,
- 0.877930f, 0.913574f, 0.936523f, 0.951172f, 0.961426f, 0.969727f, 0.974609f, 0.978027f,
- 0.982422f, 0.984863f, 0.986816f, 0.988770f, 0.989746f, 0.991699f, 0.992188f, 0.993164f,
- 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.996094f, 0.996094f, 0.997070f, 0.997559f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000364f, 0.000486f, 0.000487f, 0.000562f, 0.000822f, 0.000967f,
- 0.001213f, 0.001871f, 0.001803f, 0.002485f, 0.002796f, 0.003410f, 0.004242f, 0.005070f,
- 0.006153f, 0.007698f, 0.009262f, 0.011635f, 0.014709f, 0.019104f, 0.024521f, 0.033295f,
- 0.045746f, 0.065674f, 0.096741f, 0.150635f, 0.241455f, 0.380127f, 0.548828f, 0.698242f,
- 0.802246f, 0.867188f, 0.906738f, 0.931152f, 0.948242f, 0.959473f, 0.967285f, 0.973633f,
- 0.978516f, 0.981445f, 0.984375f, 0.986328f, 0.988281f, 0.989258f, 0.990723f, 0.992188f,
- 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.996582f,
- 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000350f, 0.000483f, 0.000486f, 0.000604f, 0.000743f, 0.001093f,
- 0.001187f, 0.001297f, 0.001601f, 0.001921f, 0.002501f, 0.002922f, 0.003296f, 0.004200f,
- 0.005211f, 0.006054f, 0.007603f, 0.008904f, 0.011169f, 0.014091f, 0.017685f, 0.023331f,
- 0.030991f, 0.042358f, 0.059326f, 0.087646f, 0.134521f, 0.213867f, 0.341309f, 0.506348f,
- 0.665039f, 0.780762f, 0.854492f, 0.899414f, 0.927246f, 0.945312f, 0.957520f, 0.966309f,
- 0.973145f, 0.977539f, 0.981445f, 0.984375f, 0.986328f, 0.988770f, 0.989746f, 0.991211f,
- 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f,
- 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000120f, 0.000360f, 0.000485f, 0.000486f, 0.000487f, 0.000604f,
- 0.000947f, 0.001201f, 0.001374f, 0.001715f, 0.002127f, 0.002239f, 0.002876f, 0.003426f,
- 0.004063f, 0.005276f, 0.005810f, 0.006744f, 0.008713f, 0.010597f, 0.013680f, 0.016754f,
- 0.021744f, 0.028778f, 0.039093f, 0.054901f, 0.079956f, 0.121399f, 0.191895f, 0.307861f,
- 0.468262f, 0.633301f, 0.760742f, 0.842285f, 0.892090f, 0.923340f, 0.942383f, 0.956543f,
- 0.965332f, 0.972168f, 0.977539f, 0.980469f, 0.983887f, 0.985840f, 0.988281f, 0.989746f,
- 0.990723f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996582f,
- 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000121f, 0.000219f, 0.000474f, 0.000484f, 0.000486f, 0.000487f,
- 0.000720f, 0.001108f, 0.001199f, 0.001209f, 0.001689f, 0.002253f, 0.002489f, 0.002916f,
- 0.003714f, 0.004040f, 0.005054f, 0.006001f, 0.006737f, 0.008713f, 0.010376f, 0.012665f,
- 0.016251f, 0.020615f, 0.027145f, 0.036499f, 0.050720f, 0.073181f, 0.110474f, 0.174072f,
- 0.280518f, 0.434570f, 0.604980f, 0.742188f, 0.830566f, 0.885742f, 0.918945f, 0.940918f,
- 0.954102f, 0.964355f, 0.971680f, 0.977051f, 0.980957f, 0.984375f, 0.986816f, 0.988281f,
- 0.989746f, 0.990723f, 0.992188f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f,
- 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000000f, 0.000120f, 0.000239f, 0.000319f, 0.000475f, 0.000484f, 0.000485f,
- 0.000618f, 0.000844f, 0.001094f, 0.001201f, 0.001570f, 0.001782f, 0.002010f, 0.002407f,
- 0.003046f, 0.003099f, 0.004208f, 0.004700f, 0.005882f, 0.006878f, 0.007980f, 0.009949f,
- 0.012344f, 0.015358f, 0.019821f, 0.026047f, 0.034271f, 0.047455f, 0.067993f, 0.102112f,
- 0.160034f, 0.258057f, 0.406494f, 0.578613f, 0.723633f, 0.820312f, 0.880371f, 0.916016f,
- 0.938965f, 0.953125f, 0.963867f, 0.971191f, 0.976562f, 0.980469f, 0.983887f, 0.985840f,
- 0.988770f, 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, 0.995605f,
- 0.996094f, 0.996582f, 0.999023f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000242f, 0.000455f, 0.000481f, 0.000583f,
- 0.000601f, 0.000804f, 0.000912f, 0.001247f, 0.001319f, 0.001571f, 0.001793f, 0.002337f,
- 0.002464f, 0.003099f, 0.003164f, 0.003809f, 0.004627f, 0.005764f, 0.006397f, 0.008118f,
- 0.009605f, 0.011917f, 0.015083f, 0.018692f, 0.024384f, 0.032806f, 0.044983f, 0.063477f,
- 0.095337f, 0.148560f, 0.240112f, 0.382324f, 0.556641f, 0.708984f, 0.812500f, 0.875488f,
- 0.913574f, 0.937500f, 0.953125f, 0.963867f, 0.971191f, 0.977051f, 0.980957f, 0.983887f,
- 0.986816f, 0.988281f, 0.990234f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995605f,
- 0.995605f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000240f, 0.000242f, 0.000524f, 0.000597f,
- 0.000604f, 0.000606f, 0.000674f, 0.001040f, 0.001238f, 0.001427f, 0.001637f, 0.001670f,
- 0.002104f, 0.002432f, 0.002775f, 0.003416f, 0.003860f, 0.004482f, 0.005573f, 0.006374f,
- 0.007828f, 0.009384f, 0.011635f, 0.014175f, 0.018219f, 0.023224f, 0.031052f, 0.042603f,
- 0.060730f, 0.089661f, 0.139526f, 0.225464f, 0.363525f, 0.538574f, 0.696289f, 0.806152f,
- 0.872559f, 0.912109f, 0.937012f, 0.952637f, 0.963867f, 0.971191f, 0.976562f, 0.981445f,
- 0.984863f, 0.987305f, 0.988770f, 0.990723f, 0.992188f, 0.993164f, 0.994141f, 0.994629f,
- 0.995117f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000192f, 0.000240f, 0.000242f, 0.000535f,
- 0.000478f, 0.000600f, 0.000843f, 0.000925f, 0.001027f, 0.001236f, 0.001502f, 0.001490f,
- 0.001658f, 0.002256f, 0.002430f, 0.002880f, 0.003056f, 0.003983f, 0.004292f, 0.005333f,
- 0.006264f, 0.007393f, 0.009064f, 0.011131f, 0.013741f, 0.017242f, 0.022690f, 0.029922f,
- 0.040680f, 0.057831f, 0.085022f, 0.132446f, 0.214844f, 0.349121f, 0.524414f, 0.688477f,
- 0.801758f, 0.871094f, 0.912109f, 0.937500f, 0.953125f, 0.964355f, 0.971680f, 0.977539f,
- 0.981445f, 0.985352f, 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993652f, 0.994629f,
- 0.995117f, 0.995605f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000232f, 0.000233f, 0.000363f,
- 0.000457f, 0.000714f, 0.000724f, 0.000727f, 0.000847f, 0.000992f, 0.001177f, 0.001525f,
- 0.001560f, 0.001740f, 0.002090f, 0.002329f, 0.002718f, 0.003372f, 0.003902f, 0.004307f,
- 0.005184f, 0.005886f, 0.007446f, 0.008667f, 0.010574f, 0.013588f, 0.016556f, 0.021744f,
- 0.028854f, 0.039124f, 0.055176f, 0.081726f, 0.127075f, 0.206421f, 0.338867f, 0.515625f,
- 0.683105f, 0.800293f, 0.870605f, 0.912598f, 0.937500f, 0.954590f, 0.965332f, 0.973145f,
- 0.978516f, 0.982422f, 0.985840f, 0.988281f, 0.989746f, 0.991211f, 0.992676f, 0.993652f,
- 0.994141f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000103f, 0.000120f, 0.000240f, 0.000240f,
- 0.000484f, 0.000574f, 0.000596f, 0.000837f, 0.000820f, 0.000859f, 0.000985f, 0.001070f,
- 0.001509f, 0.001554f, 0.001785f, 0.002214f, 0.002476f, 0.002754f, 0.002991f, 0.003487f,
- 0.004303f, 0.005074f, 0.005920f, 0.007126f, 0.008743f, 0.010361f, 0.013023f, 0.016403f,
- 0.021011f, 0.027817f, 0.037811f, 0.053375f, 0.079041f, 0.123291f, 0.201172f, 0.333252f,
- 0.511719f, 0.682129f, 0.801270f, 0.872070f, 0.914062f, 0.939941f, 0.955078f, 0.966309f,
- 0.973633f, 0.979004f, 0.982910f, 0.986328f, 0.988770f, 0.990234f, 0.991699f, 0.992676f,
- 0.993652f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000079f, 0.000053f, 0.000118f, 0.000418f,
- 0.000358f, 0.000363f, 0.000678f, 0.000708f, 0.000825f, 0.000838f, 0.000878f, 0.001146f,
- 0.000978f, 0.001483f, 0.001541f, 0.001769f, 0.001812f, 0.002434f, 0.002699f, 0.003225f,
- 0.003298f, 0.004002f, 0.004948f, 0.005932f, 0.007084f, 0.008461f, 0.010414f, 0.012665f,
- 0.015915f, 0.020615f, 0.027023f, 0.036743f, 0.051941f, 0.077332f, 0.120789f, 0.198608f,
- 0.331543f, 0.512695f, 0.686523f, 0.805664f, 0.875488f, 0.917480f, 0.941406f, 0.957031f,
- 0.968262f, 0.975098f, 0.980469f, 0.983887f, 0.986816f, 0.989258f, 0.990723f, 0.992188f,
- 0.993164f, 0.994629f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998535f, 0.998535f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000109f, 0.000232f, 0.000349f,
- 0.000478f, 0.000483f, 0.000483f, 0.000609f, 0.000795f, 0.000835f, 0.000806f, 0.000726f,
- 0.001022f, 0.001222f, 0.001442f, 0.001536f, 0.001650f, 0.001714f, 0.002377f, 0.002588f,
- 0.003159f, 0.003643f, 0.004036f, 0.004929f, 0.005718f, 0.006813f, 0.008072f, 0.009880f,
- 0.012527f, 0.015854f, 0.020035f, 0.026352f, 0.035950f, 0.051178f, 0.076416f, 0.119751f,
- 0.198730f, 0.334229f, 0.519531f, 0.694824f, 0.812988f, 0.880859f, 0.920898f, 0.944336f,
- 0.958984f, 0.969727f, 0.976562f, 0.980957f, 0.984863f, 0.987793f, 0.989746f, 0.991211f,
- 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000068f, 0.000265f,
- 0.000361f, 0.000478f, 0.000480f, 0.000479f, 0.000568f, 0.000693f, 0.000714f, 0.000806f,
- 0.000843f, 0.000919f, 0.001222f, 0.001376f, 0.001531f, 0.001554f, 0.001987f, 0.002342f,
- 0.002558f, 0.002798f, 0.003132f, 0.004021f, 0.004864f, 0.005455f, 0.006664f, 0.008110f,
- 0.009613f, 0.011955f, 0.015335f, 0.019608f, 0.025879f, 0.035522f, 0.050629f, 0.075623f,
- 0.120239f, 0.201416f, 0.342041f, 0.533203f, 0.707031f, 0.821777f, 0.887695f, 0.925293f,
- 0.946777f, 0.961914f, 0.971680f, 0.977539f, 0.982422f, 0.985352f, 0.988281f, 0.989746f,
- 0.992188f, 0.993164f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f,
- 0.000322f, 0.000241f, 0.000478f, 0.000480f, 0.000480f, 0.000510f, 0.000695f, 0.000710f,
- 0.000958f, 0.000765f, 0.001075f, 0.001116f, 0.001318f, 0.001606f, 0.001546f, 0.001916f,
- 0.002306f, 0.002499f, 0.002905f, 0.003202f, 0.003914f, 0.004498f, 0.005459f, 0.006611f,
- 0.007687f, 0.009331f, 0.011757f, 0.014923f, 0.019241f, 0.025833f, 0.035492f, 0.050507f,
- 0.076233f, 0.122131f, 0.207153f, 0.355225f, 0.551758f, 0.724609f, 0.833496f, 0.894531f,
- 0.930664f, 0.951660f, 0.964844f, 0.973145f, 0.979492f, 0.983887f, 0.986816f, 0.989258f,
- 0.991211f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000351f, 0.000458f, 0.000476f, 0.000480f, 0.000482f, 0.000528f, 0.000650f,
- 0.000704f, 0.000956f, 0.000828f, 0.000963f, 0.001111f, 0.001265f, 0.001474f, 0.001806f,
- 0.001872f, 0.002308f, 0.002445f, 0.002701f, 0.003229f, 0.003851f, 0.004375f, 0.005356f,
- 0.006317f, 0.007458f, 0.009300f, 0.011574f, 0.014725f, 0.019165f, 0.025696f, 0.035461f,
- 0.050812f, 0.077637f, 0.125977f, 0.216797f, 0.374756f, 0.576660f, 0.745117f, 0.848145f,
- 0.904785f, 0.936523f, 0.956055f, 0.967773f, 0.975586f, 0.980957f, 0.984863f, 0.987793f,
- 0.990234f, 0.992188f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000292f, 0.000224f, 0.000452f, 0.000453f, 0.000479f, 0.000480f, 0.000517f,
- 0.000614f, 0.000902f, 0.000712f, 0.000959f, 0.000978f, 0.001100f, 0.001276f, 0.001461f,
- 0.001524f, 0.001651f, 0.002041f, 0.002350f, 0.002853f, 0.003433f, 0.003622f, 0.004166f,
- 0.005043f, 0.006187f, 0.007534f, 0.009209f, 0.011551f, 0.014908f, 0.019012f, 0.025406f,
- 0.035461f, 0.051575f, 0.079651f, 0.131714f, 0.230957f, 0.401367f, 0.607910f, 0.769531f,
- 0.863281f, 0.914062f, 0.942871f, 0.959961f, 0.970703f, 0.978027f, 0.982910f, 0.986816f,
- 0.988770f, 0.991699f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000238f, 0.000355f, 0.000449f, 0.000462f, 0.000474f, 0.000477f,
- 0.000482f, 0.000846f, 0.000726f, 0.000706f, 0.000953f, 0.000889f, 0.001012f, 0.001259f,
- 0.001390f, 0.001755f, 0.001658f, 0.002060f, 0.002369f, 0.002539f, 0.003170f, 0.003460f,
- 0.004131f, 0.004993f, 0.006008f, 0.007431f, 0.009109f, 0.011444f, 0.014252f, 0.019058f,
- 0.025574f, 0.036011f, 0.053162f, 0.083435f, 0.140381f, 0.250488f, 0.436035f, 0.645996f,
- 0.795898f, 0.880371f, 0.924316f, 0.949219f, 0.963867f, 0.973145f, 0.980469f, 0.984863f,
- 0.988281f, 0.990723f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997070f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000239f, 0.000306f, 0.000440f, 0.000437f, 0.000474f,
- 0.000478f, 0.000481f, 0.000523f, 0.000664f, 0.000731f, 0.000802f, 0.000935f, 0.001022f,
- 0.001173f, 0.001314f, 0.001504f, 0.001831f, 0.001984f, 0.002317f, 0.002472f, 0.003199f,
- 0.003370f, 0.004189f, 0.004868f, 0.005924f, 0.007320f, 0.008926f, 0.011421f, 0.014595f,
- 0.019119f, 0.026260f, 0.036987f, 0.055176f, 0.088440f, 0.152466f, 0.277832f, 0.479980f,
- 0.686523f, 0.823242f, 0.895508f, 0.933105f, 0.955566f, 0.969238f, 0.976562f, 0.982422f,
- 0.986816f, 0.989746f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000280f, 0.000417f, 0.000448f,
- 0.000468f, 0.000476f, 0.000479f, 0.000490f, 0.000845f, 0.000688f, 0.000740f, 0.000945f,
- 0.000998f, 0.001148f, 0.001266f, 0.001414f, 0.001475f, 0.001667f, 0.002262f, 0.002537f,
- 0.003019f, 0.003288f, 0.004223f, 0.004768f, 0.005890f, 0.007259f, 0.009026f, 0.011360f,
- 0.014297f, 0.019272f, 0.026474f, 0.038116f, 0.058197f, 0.095032f, 0.168945f, 0.313965f,
- 0.533203f, 0.731445f, 0.850098f, 0.911133f, 0.942871f, 0.961914f, 0.972656f, 0.979980f,
- 0.984863f, 0.988770f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f,
- 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000187f, 0.000233f, 0.000141f, 0.000271f, 0.000341f,
- 0.000380f, 0.000465f, 0.000473f, 0.000590f, 0.000605f, 0.000798f, 0.000847f, 0.000934f,
- 0.000946f, 0.000836f, 0.001009f, 0.001142f, 0.001430f, 0.001495f, 0.001850f, 0.002111f,
- 0.002541f, 0.003035f, 0.003300f, 0.004139f, 0.004913f, 0.005718f, 0.007141f, 0.008934f,
- 0.011475f, 0.014832f, 0.019653f, 0.027573f, 0.039917f, 0.062225f, 0.104919f, 0.192017f,
- 0.362305f, 0.594238f, 0.775879f, 0.875977f, 0.925293f, 0.952148f, 0.967773f, 0.977051f,
- 0.983398f, 0.988281f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996582f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f, 0.000243f,
- 0.000238f, 0.000424f, 0.000453f, 0.000467f, 0.000475f, 0.000581f, 0.000689f, 0.000795f,
- 0.000634f, 0.000823f, 0.001014f, 0.000900f, 0.001083f, 0.001485f, 0.001731f, 0.001851f,
- 0.002056f, 0.002373f, 0.002621f, 0.003445f, 0.004082f, 0.004578f, 0.005821f, 0.007217f,
- 0.008881f, 0.011330f, 0.014778f, 0.020416f, 0.028473f, 0.042419f, 0.067993f, 0.118286f,
- 0.225342f, 0.425293f, 0.661621f, 0.818848f, 0.899902f, 0.939453f, 0.960449f, 0.973145f,
- 0.980957f, 0.985840f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000224f, 0.000122f,
- 0.000231f, 0.000245f, 0.000411f, 0.000520f, 0.000463f, 0.000470f, 0.000587f, 0.000361f,
- 0.000712f, 0.000694f, 0.000815f, 0.000978f, 0.001055f, 0.001105f, 0.001390f, 0.001438f,
- 0.001705f, 0.001984f, 0.002333f, 0.002546f, 0.003408f, 0.003876f, 0.004627f, 0.005783f,
- 0.007198f, 0.008995f, 0.011383f, 0.015396f, 0.020828f, 0.030029f, 0.045654f, 0.075439f,
- 0.137451f, 0.271973f, 0.503418f, 0.728516f, 0.857910f, 0.920410f, 0.951172f, 0.968262f,
- 0.977539f, 0.984375f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000173f, 0.000150f, 0.000278f, 0.000376f, 0.000427f, 0.000470f, 0.000352f, 0.000356f,
- 0.000475f, 0.000441f, 0.000709f, 0.000774f, 0.000970f, 0.001013f, 0.000998f, 0.001193f,
- 0.001397f, 0.001677f, 0.001957f, 0.002268f, 0.002529f, 0.003353f, 0.003874f, 0.004555f,
- 0.005692f, 0.007160f, 0.008987f, 0.011543f, 0.015732f, 0.021896f, 0.032135f, 0.050140f,
- 0.086548f, 0.165894f, 0.337646f, 0.593750f, 0.791504f, 0.892090f, 0.938477f, 0.961914f,
- 0.974609f, 0.982422f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995605f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000187f, 0.000130f, 0.000231f, 0.000315f, 0.000298f, 0.000332f, 0.000343f,
- 0.000465f, 0.000472f, 0.000579f, 0.000717f, 0.000839f, 0.000932f, 0.000817f, 0.001086f,
- 0.001090f, 0.001545f, 0.001735f, 0.001837f, 0.002485f, 0.002493f, 0.003288f, 0.003828f,
- 0.004520f, 0.005833f, 0.007156f, 0.009193f, 0.012123f, 0.015839f, 0.022934f, 0.034760f,
- 0.056488f, 0.102600f, 0.208862f, 0.427734f, 0.687988f, 0.846191f, 0.919434f, 0.952637f,
- 0.969727f, 0.979980f, 0.993652f, 0.994629f, 0.994141f, 0.994629f, 0.994629f, 0.994629f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000133f, 0.000141f, 0.000234f, 0.000300f, 0.000397f,
- 0.000436f, 0.000456f, 0.000465f, 0.000534f, 0.000663f, 0.000810f, 0.000796f, 0.000812f,
- 0.001062f, 0.001237f, 0.001428f, 0.001565f, 0.001818f, 0.002182f, 0.002783f, 0.002943f,
- 0.003773f, 0.004715f, 0.005482f, 0.007195f, 0.009285f, 0.012207f, 0.016922f, 0.024567f,
- 0.038483f, 0.066101f, 0.127563f, 0.274170f, 0.540527f, 0.774414f, 0.891113f, 0.940430f,
- 0.965332f, 0.977539f, 0.993652f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994141f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000124f, 0.000116f, 0.000119f, 0.000125f, 0.000121f, 0.000197f,
- 0.000323f, 0.000418f, 0.000446f, 0.000433f, 0.000467f, 0.000612f, 0.000710f, 0.000783f,
- 0.000911f, 0.000817f, 0.001161f, 0.001343f, 0.001514f, 0.001707f, 0.002081f, 0.002386f,
- 0.002882f, 0.003609f, 0.004627f, 0.005478f, 0.007011f, 0.009384f, 0.012695f, 0.017960f,
- 0.026901f, 0.044067f, 0.080078f, 0.167114f, 0.374023f, 0.664062f, 0.845703f, 0.923340f,
- 0.957031f, 0.974121f, 0.992676f, 0.993652f, 0.993164f, 0.993652f, 0.993652f, 0.993164f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000121f, 0.000121f, 0.000052f, 0.000039f, 0.000029f, 0.000054f, 0.000045f, 0.000118f,
- 0.000128f, 0.000231f, 0.000387f, 0.000429f, 0.000446f, 0.000544f, 0.000539f, 0.000648f,
- 0.000749f, 0.000790f, 0.000978f, 0.001102f, 0.001195f, 0.001501f, 0.001761f, 0.001978f,
- 0.002661f, 0.003170f, 0.003519f, 0.004509f, 0.005344f, 0.007004f, 0.009361f, 0.013229f,
- 0.019196f, 0.030258f, 0.052002f, 0.102661f, 0.234131f, 0.511230f, 0.774902f, 0.898438f,
- 0.947754f, 0.970215f, 0.992188f, 0.992676f, 0.993164f, 0.992676f, 0.992188f, 0.992188f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000070f, 0.000052f, 0.000038f, 0.000030f, 0.000023f, 0.000060f,
- 0.000116f, 0.000121f, 0.000252f, 0.000337f, 0.000306f, 0.000435f, 0.000450f, 0.000562f,
- 0.000584f, 0.000722f, 0.000858f, 0.000888f, 0.000969f, 0.001230f, 0.001429f, 0.001576f,
- 0.001827f, 0.002361f, 0.002863f, 0.003267f, 0.004047f, 0.005394f, 0.007256f, 0.009781f,
- 0.013855f, 0.021439f, 0.035034f, 0.065063f, 0.141724f, 0.346680f, 0.665527f, 0.859375f,
- 0.934570f, 0.965820f, 0.991699f, 0.991699f, 0.991699f, 0.992188f, 0.991699f, 0.991699f,
- 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000122f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000099f, 0.000069f, 0.000051f, 0.000039f, 0.000030f, 0.000023f,
- 0.000024f, 0.000115f, 0.000103f, 0.000224f, 0.000204f, 0.000339f, 0.000407f, 0.000437f,
- 0.000452f, 0.000489f, 0.000663f, 0.000821f, 0.000922f, 0.001004f, 0.001086f, 0.001279f,
- 0.001554f, 0.001651f, 0.001997f, 0.002390f, 0.003136f, 0.004223f, 0.005508f, 0.007339f,
- 0.010094f, 0.014854f, 0.024048f, 0.042664f, 0.087036f, 0.213867f, 0.516113f, 0.799805f,
- 0.915527f, 0.958984f, 0.990723f, 0.991211f, 0.990723f, 0.990723f, 0.990723f, 0.991211f,
- 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000096f, 0.000073f, 0.000053f, 0.000040f, 0.000031f,
- 0.000025f, 0.000020f, 0.000017f, 0.000105f, 0.000110f, 0.000135f, 0.000235f, 0.000380f,
- 0.000462f, 0.000513f, 0.000556f, 0.000638f, 0.000804f, 0.000868f, 0.000897f, 0.001002f,
- 0.001079f, 0.001246f, 0.001596f, 0.002153f, 0.002213f, 0.003094f, 0.004158f, 0.005306f,
- 0.007458f, 0.010887f, 0.017166f, 0.028748f, 0.055176f, 0.128174f, 0.350586f, 0.703613f,
- 0.888184f, 0.951172f, 0.988770f, 0.989746f, 0.989746f, 0.989746f, 0.989746f, 0.989746f,
- 0.000122f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000101f, 0.000073f, 0.000057f, 0.000043f,
- 0.000033f, 0.000027f, 0.000021f, 0.000018f, 0.000105f, 0.000112f, 0.000111f, 0.000161f,
- 0.000320f, 0.000390f, 0.000421f, 0.000438f, 0.000559f, 0.000665f, 0.000735f, 0.000719f,
- 0.000704f, 0.000887f, 0.001223f, 0.001384f, 0.001867f, 0.002462f, 0.003216f, 0.004032f,
- 0.005367f, 0.007988f, 0.012054f, 0.019943f, 0.035919f, 0.078064f, 0.215332f, 0.566895f,
- 0.845703f, 0.939941f, 0.987793f, 0.988281f, 0.987793f, 0.987793f, 0.988281f, 0.988281f,
- 0.000000f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000103f, 0.000077f, 0.000061f,
- 0.000046f, 0.000037f, 0.000030f, 0.000023f, 0.000019f, 0.000016f, 0.000039f, 0.000094f,
- 0.000181f, 0.000205f, 0.000350f, 0.000392f, 0.000423f, 0.000510f, 0.000619f, 0.000672f,
- 0.000705f, 0.000632f, 0.000807f, 0.001038f, 0.001278f, 0.001894f, 0.002245f, 0.002758f,
- 0.003883f, 0.005863f, 0.008636f, 0.013672f, 0.023880f, 0.048828f, 0.127441f, 0.400879f,
- 0.779297f, 0.925781f, 0.985840f, 0.986328f, 0.986328f, 0.985840f, 0.986328f, 0.986328f,
- 0.000000f, 0.000100f, 0.000108f, 0.000118f, 0.000119f, 0.000118f, 0.000119f, 0.000119f,
- 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000111f, 0.000086f,
- 0.000066f, 0.000051f, 0.000041f, 0.000032f, 0.000026f, 0.000021f, 0.000018f, 0.000015f,
- 0.000086f, 0.000131f, 0.000190f, 0.000293f, 0.000419f, 0.000481f, 0.000477f, 0.000438f,
- 0.000542f, 0.000564f, 0.000599f, 0.000700f, 0.000916f, 0.001122f, 0.001589f, 0.001997f,
- 0.002678f, 0.004017f, 0.005814f, 0.009361f, 0.015808f, 0.031250f, 0.075989f, 0.250732f,
- 0.676758f, 0.904297f, 0.983887f, 0.983887f, 0.983887f, 0.984375f, 0.984375f, 0.983887f,
- 0.000000f, 0.000000f, 0.000077f, 0.000112f, 0.000104f, 0.000115f, 0.000115f, 0.000117f,
- 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000119f, 0.000118f,
- 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f,
- 0.000097f, 0.000076f, 0.000060f, 0.000046f, 0.000037f, 0.000030f, 0.000024f, 0.000020f,
- 0.000045f, 0.000063f, 0.000091f, 0.000140f, 0.000202f, 0.000333f, 0.000305f, 0.000399f,
- 0.000462f, 0.000452f, 0.000535f, 0.000531f, 0.000631f, 0.000866f, 0.000858f, 0.001307f,
- 0.001844f, 0.002823f, 0.004070f, 0.006264f, 0.010536f, 0.020035f, 0.045990f, 0.145996f,
- 0.532227f, 0.874023f, 0.980957f, 0.981445f, 0.980957f, 0.981445f, 0.980957f, 0.981445f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000091f, 0.000103f, 0.000105f, 0.000106f,
- 0.000111f, 0.000113f, 0.000115f, 0.000114f, 0.000116f, 0.000116f, 0.000117f, 0.000117f,
- 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000118f,
- 0.000118f, 0.000112f, 0.000084f, 0.000069f, 0.000055f, 0.000043f, 0.000036f, 0.000028f,
- 0.000024f, 0.000020f, 0.000028f, 0.000039f, 0.000083f, 0.000141f, 0.000211f, 0.000262f,
- 0.000413f, 0.000305f, 0.000370f, 0.000358f, 0.000489f, 0.000564f, 0.000599f, 0.000893f,
- 0.001084f, 0.001696f, 0.002697f, 0.004074f, 0.006836f, 0.012878f, 0.028122f, 0.083496f,
- 0.364014f, 0.826660f, 0.976562f, 0.977539f, 0.977051f, 0.977539f, 0.978027f, 0.977051f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000015f, 0.000086f,
- 0.000077f, 0.000103f, 0.000100f, 0.000109f, 0.000110f, 0.000111f, 0.000112f, 0.000112f,
- 0.000114f, 0.000114f, 0.000115f, 0.000115f, 0.000116f, 0.000115f, 0.000116f, 0.000116f,
- 0.000117f, 0.000117f, 0.000117f, 0.000100f, 0.000079f, 0.000066f, 0.000053f, 0.000041f,
- 0.000035f, 0.000028f, 0.000023f, 0.000019f, 0.000017f, 0.000034f, 0.000113f, 0.000174f,
- 0.000257f, 0.000325f, 0.000356f, 0.000324f, 0.000409f, 0.000454f, 0.000474f, 0.000659f,
- 0.000778f, 0.001243f, 0.001575f, 0.002472f, 0.004105f, 0.007957f, 0.016800f, 0.047852f,
- 0.217529f, 0.755371f, 0.972656f, 0.973145f, 0.973145f, 0.973145f, 0.973145f, 0.973145f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000028f, 0.000049f, 0.000085f, 0.000081f, 0.000096f, 0.000101f, 0.000104f,
- 0.000106f, 0.000108f, 0.000109f, 0.000110f, 0.000111f, 0.000112f, 0.000113f, 0.000113f,
- 0.000114f, 0.000114f, 0.000114f, 0.000115f, 0.000115f, 0.000096f, 0.000078f, 0.000064f,
- 0.000051f, 0.000043f, 0.000035f, 0.000029f, 0.000024f, 0.000020f, 0.000026f, 0.000055f,
- 0.000087f, 0.000135f, 0.000248f, 0.000261f, 0.000274f, 0.000258f, 0.000296f, 0.000359f,
- 0.000474f, 0.000627f, 0.001012f, 0.001484f, 0.002630f, 0.004536f, 0.010277f, 0.027405f,
- 0.119507f, 0.645996f, 0.966797f, 0.967285f, 0.967285f, 0.967285f, 0.966797f, 0.966797f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000021f, 0.000065f, 0.000074f,
- 0.000077f, 0.000091f, 0.000091f, 0.000099f, 0.000098f, 0.000103f, 0.000103f, 0.000106f,
- 0.000107f, 0.000108f, 0.000109f, 0.000110f, 0.000111f, 0.000111f, 0.000112f, 0.000096f,
- 0.000079f, 0.000064f, 0.000053f, 0.000043f, 0.000036f, 0.000030f, 0.000024f, 0.000021f,
- 0.000018f, 0.000028f, 0.000072f, 0.000125f, 0.000233f, 0.000243f, 0.000220f, 0.000258f,
- 0.000320f, 0.000353f, 0.000630f, 0.000932f, 0.001324f, 0.002357f, 0.005402f, 0.014534f,
- 0.062561f, 0.493164f, 0.958008f, 0.958008f, 0.958984f, 0.958496f, 0.958496f, 0.958008f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000011f, 0.000035f, 0.000041f, 0.000064f, 0.000074f, 0.000081f, 0.000082f, 0.000090f,
- 0.000092f, 0.000096f, 0.000099f, 0.000100f, 0.000102f, 0.000104f, 0.000105f, 0.000106f,
- 0.000107f, 0.000099f, 0.000082f, 0.000067f, 0.000055f, 0.000047f, 0.000038f, 0.000031f,
- 0.000026f, 0.000022f, 0.000018f, 0.000037f, 0.000071f, 0.000111f, 0.000190f, 0.000204f,
- 0.000153f, 0.000245f, 0.000299f, 0.000482f, 0.000790f, 0.001330f, 0.002619f, 0.007282f,
- 0.031097f, 0.318115f, 0.946289f, 0.946777f, 0.946777f, 0.946777f, 0.946777f, 0.946777f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000008f, 0.000029f, 0.000044f,
- 0.000055f, 0.000063f, 0.000073f, 0.000075f, 0.000081f, 0.000087f, 0.000090f, 0.000092f,
- 0.000094f, 0.000097f, 0.000099f, 0.000100f, 0.000087f, 0.000071f, 0.000059f, 0.000049f,
- 0.000040f, 0.000034f, 0.000028f, 0.000024f, 0.000020f, 0.000016f, 0.000072f, 0.000114f,
- 0.000169f, 0.000147f, 0.000181f, 0.000246f, 0.000367f, 0.000626f, 0.001325f, 0.003117f,
- 0.013741f, 0.167480f, 0.929688f, 0.929688f, 0.929688f, 0.930176f, 0.930664f, 0.930176f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000019f, 0.000030f, 0.000044f, 0.000049f, 0.000062f,
- 0.000068f, 0.000072f, 0.000078f, 0.000081f, 0.000084f, 0.000087f, 0.000090f, 0.000079f,
- 0.000065f, 0.000054f, 0.000044f, 0.000037f, 0.000030f, 0.000025f, 0.000021f, 0.000017f,
- 0.000052f, 0.000100f, 0.000132f, 0.000130f, 0.000164f, 0.000297f, 0.000552f, 0.001273f,
- 0.005009f, 0.071594f, 0.903809f, 0.905273f, 0.904297f, 0.904785f, 0.904785f, 0.904785f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000013f, 0.000028f, 0.000036f, 0.000045f, 0.000053f, 0.000060f, 0.000066f,
- 0.000071f, 0.000075f, 0.000071f, 0.000058f, 0.000049f, 0.000040f, 0.000033f, 0.000027f,
- 0.000022f, 0.000018f, 0.000032f, 0.000078f, 0.000090f, 0.000123f, 0.000175f, 0.000441f,
- 0.001637f, 0.022537f, 0.865234f, 0.865234f, 0.865723f, 0.865723f, 0.865234f, 0.864746f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f,
- 0.000017f, 0.000027f, 0.000036f, 0.000042f, 0.000050f, 0.000056f, 0.000052f, 0.000043f,
- 0.000035f, 0.000028f, 0.000022f, 0.000018f, 0.000049f, 0.000055f, 0.000047f, 0.000108f,
- 0.000342f, 0.004566f, 0.802734f, 0.803711f, 0.803711f, 0.803711f, 0.803711f, 0.803711f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000013f,
- 0.000022f, 0.000030f, 0.000033f, 0.000027f, 0.000021f, 0.000015f, 0.000011f, 0.000031f,
- 0.000045f, 0.000449f, 0.708496f, 0.707520f, 0.708984f, 0.708496f, 0.707520f, 0.708008f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000011f,
- 0.000006f, 0.000007f, 0.575195f, 0.575195f, 0.575195f, 0.575195f, 0.575195f, 0.575195f,
- },
- {
- 0.158813f, 0.632812f, 0.824219f, 0.891602f, 0.924805f, 0.942383f, 0.954102f, 0.962402f,
- 0.968262f, 0.972656f, 0.976074f, 0.978516f, 0.980957f, 0.982910f, 0.984375f, 0.985840f,
- 0.986816f, 0.988770f, 0.989746f, 0.989746f, 0.990234f, 0.991211f, 0.992188f, 0.992676f,
- 0.993652f, 0.993652f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.995605f,
- 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.019775f, 0.115845f, 0.361084f, 0.642578f, 0.798340f, 0.872559f, 0.911133f, 0.933594f,
- 0.947266f, 0.957031f, 0.964355f, 0.968750f, 0.973145f, 0.976562f, 0.979492f, 0.981934f,
- 0.983398f, 0.984863f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.990234f, 0.991211f,
- 0.991699f, 0.992676f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995117f,
- 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f,
- 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.006638f, 0.031082f, 0.089661f, 0.222168f, 0.448242f, 0.663086f, 0.794434f, 0.864258f,
- 0.903320f, 0.926758f, 0.942383f, 0.953613f, 0.961426f, 0.966797f, 0.972168f, 0.975586f,
- 0.978027f, 0.980469f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989258f,
- 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.994141f,
- 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.996582f,
- 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.003246f, 0.013367f, 0.032806f, 0.072754f, 0.152954f, 0.304199f, 0.509766f, 0.687500f,
- 0.797852f, 0.862305f, 0.900391f, 0.923828f, 0.940430f, 0.950684f, 0.959473f, 0.965820f,
- 0.970703f, 0.974121f, 0.977051f, 0.979492f, 0.981934f, 0.983887f, 0.985840f, 0.987305f,
- 0.987793f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.992188f, 0.993164f,
- 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f,
- 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f,
- 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.002029f, 0.007267f, 0.016678f, 0.032288f, 0.061462f, 0.115051f, 0.215088f, 0.376709f,
- 0.562988f, 0.712891f, 0.807617f, 0.865234f, 0.901367f, 0.923828f, 0.939453f, 0.950684f,
- 0.958984f, 0.965332f, 0.970215f, 0.974609f, 0.977051f, 0.979980f, 0.981934f, 0.983887f,
- 0.984863f, 0.986328f, 0.988281f, 0.988770f, 0.989746f, 0.990723f, 0.990723f, 0.991699f,
- 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.996094f,
- 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.001274f, 0.004623f, 0.009880f, 0.017792f, 0.030869f, 0.052673f, 0.091431f, 0.160645f,
- 0.277832f, 0.442383f, 0.610352f, 0.737793f, 0.819824f, 0.870605f, 0.902832f, 0.924805f,
- 0.939941f, 0.950195f, 0.958496f, 0.964844f, 0.970215f, 0.973633f, 0.977051f, 0.979980f,
- 0.981934f, 0.983398f, 0.984863f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990723f,
- 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995117f,
- 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f,
- 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000943f, 0.003231f, 0.006317f, 0.011040f, 0.018051f, 0.029190f, 0.046936f, 0.075867f,
- 0.125488f, 0.210449f, 0.341797f, 0.503906f, 0.652344f, 0.761230f, 0.832031f, 0.877441f,
- 0.906738f, 0.927734f, 0.940918f, 0.951172f, 0.959473f, 0.965820f, 0.970703f, 0.974121f,
- 0.977051f, 0.979492f, 0.981934f, 0.983398f, 0.985352f, 0.987305f, 0.988281f, 0.989258f,
- 0.990234f, 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.994141f, 0.994629f,
- 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f,
- 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998535f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000731f, 0.001970f, 0.004425f, 0.007351f, 0.011627f, 0.017975f, 0.027161f, 0.041779f,
- 0.064270f, 0.101685f, 0.164917f, 0.265137f, 0.406494f, 0.561035f, 0.692383f, 0.785156f,
- 0.845703f, 0.884766f, 0.911621f, 0.930176f, 0.942871f, 0.953125f, 0.959961f, 0.965332f,
- 0.970703f, 0.974121f, 0.977539f, 0.979492f, 0.982422f, 0.983887f, 0.985840f, 0.987305f,
- 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f,
- 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f,
- 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000487f, 0.001872f, 0.003445f, 0.005367f, 0.008400f, 0.012405f, 0.017822f, 0.025345f,
- 0.037964f, 0.056244f, 0.085327f, 0.132935f, 0.210327f, 0.325928f, 0.471924f, 0.615723f,
- 0.729004f, 0.807617f, 0.859375f, 0.894043f, 0.916504f, 0.934570f, 0.945801f, 0.955078f,
- 0.961426f, 0.967285f, 0.972168f, 0.975586f, 0.978516f, 0.980957f, 0.982422f, 0.984863f,
- 0.985840f, 0.986816f, 0.988770f, 0.989258f, 0.990723f, 0.991699f, 0.992188f, 0.992676f,
- 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f,
- 0.996094f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.000363f, 0.001300f, 0.002499f, 0.003784f, 0.006153f, 0.008896f, 0.012367f, 0.017227f,
- 0.024185f, 0.034241f, 0.049591f, 0.072754f, 0.111023f, 0.170776f, 0.263184f, 0.391113f,
- 0.535645f, 0.665527f, 0.761719f, 0.828613f, 0.871582f, 0.902344f, 0.922852f, 0.937988f,
- 0.949219f, 0.957031f, 0.963867f, 0.968750f, 0.972656f, 0.976074f, 0.979004f, 0.981445f,
- 0.983887f, 0.984863f, 0.986328f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.991699f,
- 0.992676f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f,
- 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f,
- 0.000365f, 0.000972f, 0.001874f, 0.003323f, 0.004669f, 0.006599f, 0.008919f, 0.012360f,
- 0.016785f, 0.022720f, 0.031616f, 0.044647f, 0.064026f, 0.094055f, 0.141235f, 0.215332f,
- 0.323486f, 0.459229f, 0.597168f, 0.710449f, 0.791992f, 0.847656f, 0.885254f, 0.910645f,
- 0.929199f, 0.941895f, 0.952148f, 0.960449f, 0.965332f, 0.970703f, 0.974121f, 0.977539f,
- 0.979980f, 0.981934f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.989746f, 0.990723f,
- 0.991211f, 0.992188f, 0.993164f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f,
- 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.998047f, 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999023f,
- 0.000244f, 0.000764f, 0.001375f, 0.002415f, 0.003582f, 0.004963f, 0.006973f, 0.008751f,
- 0.011726f, 0.016113f, 0.021683f, 0.029129f, 0.040283f, 0.057098f, 0.081421f, 0.119019f,
- 0.178955f, 0.268311f, 0.390625f, 0.528809f, 0.654785f, 0.751465f, 0.820312f, 0.866211f,
- 0.896973f, 0.919434f, 0.935547f, 0.946777f, 0.956055f, 0.962402f, 0.968262f, 0.972168f,
- 0.975098f, 0.979004f, 0.981445f, 0.983398f, 0.985352f, 0.986816f, 0.987793f, 0.989258f,
- 0.990723f, 0.991211f, 0.992188f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f,
- 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000122f, 0.000606f, 0.001439f, 0.002058f, 0.002743f, 0.004169f, 0.005035f, 0.006775f,
- 0.009010f, 0.012085f, 0.015717f, 0.020813f, 0.027573f, 0.037170f, 0.050812f, 0.071472f,
- 0.102905f, 0.151489f, 0.225708f, 0.332031f, 0.463623f, 0.596191f, 0.707031f, 0.787598f,
- 0.844238f, 0.881348f, 0.908691f, 0.927246f, 0.940918f, 0.951660f, 0.958984f, 0.965820f,
- 0.970215f, 0.974121f, 0.977539f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987305f,
- 0.988281f, 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f,
- 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000118f, 0.000846f, 0.001303f, 0.001593f, 0.002180f, 0.003050f, 0.004353f, 0.005577f,
- 0.006954f, 0.009331f, 0.011826f, 0.015007f, 0.019653f, 0.025391f, 0.034119f, 0.046112f,
- 0.063660f, 0.090210f, 0.130737f, 0.192139f, 0.283203f, 0.404053f, 0.537598f, 0.658691f,
- 0.753418f, 0.818848f, 0.865234f, 0.896973f, 0.918945f, 0.934570f, 0.946289f, 0.955566f,
- 0.962402f, 0.967285f, 0.972168f, 0.976074f, 0.979004f, 0.981445f, 0.983398f, 0.985840f,
- 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992676f, 0.993164f, 0.993652f,
- 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000117f, 0.000487f, 0.000957f, 0.001514f, 0.002008f, 0.002619f, 0.003424f, 0.004551f,
- 0.005836f, 0.007381f, 0.009155f, 0.011459f, 0.014366f, 0.018646f, 0.024017f, 0.031281f,
- 0.042664f, 0.057068f, 0.080139f, 0.113586f, 0.165894f, 0.243164f, 0.352051f, 0.481934f,
- 0.610840f, 0.716309f, 0.793945f, 0.847168f, 0.884766f, 0.910645f, 0.928223f, 0.942383f,
- 0.952637f, 0.959961f, 0.965332f, 0.970703f, 0.975098f, 0.978027f, 0.980957f, 0.983398f,
- 0.984863f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992188f, 0.992676f,
- 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f,
- 0.997559f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000608f, 0.000952f, 0.001111f, 0.001660f, 0.002102f, 0.002817f, 0.003517f,
- 0.004742f, 0.005585f, 0.007080f, 0.008980f, 0.011078f, 0.014191f, 0.017838f, 0.022614f,
- 0.029404f, 0.038940f, 0.052551f, 0.071533f, 0.100769f, 0.145020f, 0.211548f, 0.307373f,
- 0.430176f, 0.561523f, 0.676758f, 0.764648f, 0.828613f, 0.872070f, 0.900879f, 0.921875f,
- 0.937012f, 0.948730f, 0.957520f, 0.964355f, 0.969238f, 0.973633f, 0.977539f, 0.979980f,
- 0.982422f, 0.984863f, 0.986328f, 0.987793f, 0.988770f, 0.990234f, 0.991211f, 0.991699f,
- 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996582f,
- 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000244f, 0.000576f, 0.000727f, 0.001083f, 0.001186f, 0.001810f, 0.002558f, 0.002968f,
- 0.003725f, 0.004913f, 0.005955f, 0.007011f, 0.008759f, 0.010918f, 0.013718f, 0.016953f,
- 0.021423f, 0.027832f, 0.035980f, 0.047913f, 0.064941f, 0.090332f, 0.128174f, 0.185791f,
- 0.270264f, 0.384033f, 0.514160f, 0.638184f, 0.736328f, 0.807617f, 0.856934f, 0.891602f,
- 0.915039f, 0.932617f, 0.945801f, 0.954102f, 0.962402f, 0.968262f, 0.972168f, 0.976562f,
- 0.979492f, 0.981445f, 0.983887f, 0.985840f, 0.987305f, 0.988281f, 0.990234f, 0.990723f,
- 0.992188f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f,
- 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000000f, 0.000244f, 0.000708f, 0.000903f, 0.001129f, 0.001511f, 0.002031f, 0.002565f,
- 0.003189f, 0.004112f, 0.004696f, 0.005989f, 0.006954f, 0.008865f, 0.010826f, 0.013031f,
- 0.016312f, 0.020493f, 0.026154f, 0.033966f, 0.044159f, 0.059845f, 0.081665f, 0.114929f,
- 0.164917f, 0.239624f, 0.343750f, 0.469971f, 0.598145f, 0.706055f, 0.786133f, 0.842773f,
- 0.881348f, 0.908203f, 0.927246f, 0.941895f, 0.952148f, 0.959961f, 0.966797f, 0.971191f,
- 0.976074f, 0.978516f, 0.981445f, 0.983887f, 0.985352f, 0.987305f, 0.988281f, 0.989258f,
- 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995605f, 0.996094f,
- 0.996094f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000122f, 0.000244f, 0.000482f, 0.000674f, 0.001029f, 0.001440f, 0.001746f, 0.002153f,
- 0.002804f, 0.003206f, 0.003859f, 0.004948f, 0.005722f, 0.007206f, 0.008568f, 0.010498f,
- 0.012413f, 0.015793f, 0.019989f, 0.024826f, 0.031799f, 0.041382f, 0.054932f, 0.074768f,
- 0.103882f, 0.147949f, 0.213867f, 0.308838f, 0.429932f, 0.560059f, 0.675781f, 0.765625f,
- 0.827148f, 0.871582f, 0.901367f, 0.923340f, 0.937988f, 0.949707f, 0.958496f, 0.965820f,
- 0.969727f, 0.974609f, 0.978027f, 0.980469f, 0.983398f, 0.985840f, 0.986816f, 0.988281f,
- 0.989258f, 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f,
- 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000244f, 0.000244f, 0.000363f, 0.000604f, 0.000834f, 0.001020f, 0.001548f, 0.001970f,
- 0.002262f, 0.002548f, 0.003157f, 0.003914f, 0.004681f, 0.005962f, 0.006943f, 0.008263f,
- 0.010277f, 0.012589f, 0.015144f, 0.018951f, 0.023788f, 0.030014f, 0.039001f, 0.051056f,
- 0.069092f, 0.094666f, 0.133911f, 0.192993f, 0.279053f, 0.394287f, 0.524414f, 0.646484f,
- 0.743652f, 0.812988f, 0.861328f, 0.895020f, 0.917969f, 0.935547f, 0.947754f, 0.957520f,
- 0.963867f, 0.969238f, 0.974121f, 0.978027f, 0.980469f, 0.983398f, 0.984863f, 0.987305f,
- 0.988281f, 0.989258f, 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f,
- 0.995117f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000118f, 0.000244f, 0.000244f, 0.000584f, 0.000837f, 0.000847f, 0.001295f, 0.001681f,
- 0.002018f, 0.002348f, 0.003014f, 0.003157f, 0.004124f, 0.004547f, 0.005432f, 0.006607f,
- 0.008163f, 0.010071f, 0.011925f, 0.014786f, 0.017990f, 0.022659f, 0.028824f, 0.036621f,
- 0.047882f, 0.063477f, 0.087158f, 0.122559f, 0.175781f, 0.254639f, 0.363037f, 0.492188f,
- 0.618652f, 0.722168f, 0.799805f, 0.852051f, 0.889648f, 0.914551f, 0.932129f, 0.944824f,
- 0.955078f, 0.962891f, 0.968262f, 0.973633f, 0.977051f, 0.980469f, 0.982910f, 0.984863f,
- 0.987305f, 0.988281f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f,
- 0.995117f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000242f, 0.000243f, 0.000243f, 0.000481f, 0.000742f, 0.000843f, 0.000969f, 0.001348f,
- 0.001726f, 0.001791f, 0.002348f, 0.002853f, 0.003452f, 0.003735f, 0.004757f, 0.005516f,
- 0.006744f, 0.008102f, 0.009621f, 0.011948f, 0.014320f, 0.017365f, 0.021698f, 0.027298f,
- 0.034546f, 0.044891f, 0.059875f, 0.081055f, 0.112915f, 0.161255f, 0.234009f, 0.335693f,
- 0.462646f, 0.592285f, 0.702637f, 0.785645f, 0.843750f, 0.883301f, 0.911133f, 0.929688f,
- 0.944336f, 0.954590f, 0.961914f, 0.967773f, 0.973633f, 0.977539f, 0.980469f, 0.982910f,
- 0.985352f, 0.986816f, 0.988770f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993652f,
- 0.994629f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000100f, 0.000216f, 0.000243f, 0.000365f, 0.000517f, 0.000836f, 0.000964f, 0.001148f,
- 0.001472f, 0.001674f, 0.001785f, 0.002438f, 0.002815f, 0.003490f, 0.004070f, 0.004837f,
- 0.005608f, 0.006630f, 0.008095f, 0.009483f, 0.011551f, 0.013847f, 0.016953f, 0.020584f,
- 0.025879f, 0.033051f, 0.042664f, 0.055817f, 0.075500f, 0.105103f, 0.149536f, 0.216553f,
- 0.312988f, 0.436768f, 0.568359f, 0.685059f, 0.773926f, 0.835449f, 0.878418f, 0.907227f,
- 0.927734f, 0.943359f, 0.953125f, 0.962402f, 0.967285f, 0.973145f, 0.977051f, 0.980469f,
- 0.983887f, 0.985352f, 0.987305f, 0.989258f, 0.990234f, 0.991699f, 0.992188f, 0.993164f,
- 0.994141f, 0.994629f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000150f, 0.000242f, 0.000364f, 0.000441f, 0.000627f, 0.000916f, 0.000959f,
- 0.000968f, 0.001463f, 0.001671f, 0.002222f, 0.002577f, 0.002714f, 0.003479f, 0.004208f,
- 0.004723f, 0.005669f, 0.006886f, 0.007637f, 0.009315f, 0.011154f, 0.013596f, 0.016205f,
- 0.019821f, 0.024963f, 0.031250f, 0.040375f, 0.053009f, 0.071167f, 0.098511f, 0.139648f,
- 0.202271f, 0.293457f, 0.414307f, 0.548340f, 0.669434f, 0.762695f, 0.829590f, 0.874512f,
- 0.904785f, 0.926758f, 0.941895f, 0.953613f, 0.961914f, 0.968262f, 0.973633f, 0.977539f,
- 0.980957f, 0.983398f, 0.985352f, 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.992188f,
- 0.993164f, 0.994629f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000000f, 0.000231f, 0.000232f, 0.000363f, 0.000486f, 0.000503f, 0.000724f, 0.001104f,
- 0.001080f, 0.001271f, 0.001509f, 0.001976f, 0.002247f, 0.002476f, 0.002895f, 0.003553f,
- 0.004192f, 0.004871f, 0.005623f, 0.006332f, 0.007584f, 0.008957f, 0.010849f, 0.012917f,
- 0.015396f, 0.019226f, 0.023941f, 0.030060f, 0.038513f, 0.050385f, 0.067627f, 0.093140f,
- 0.131714f, 0.190674f, 0.278076f, 0.395752f, 0.530273f, 0.655762f, 0.753906f, 0.823242f,
- 0.870605f, 0.903320f, 0.925781f, 0.941406f, 0.953125f, 0.961914f, 0.969238f, 0.974121f,
- 0.978027f, 0.980957f, 0.983887f, 0.985840f, 0.988281f, 0.989258f, 0.990723f, 0.991699f,
- 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000000f, 0.000009f, 0.000116f, 0.000360f, 0.000484f, 0.000485f, 0.000536f, 0.000827f,
- 0.000935f, 0.001077f, 0.001204f, 0.001561f, 0.001974f, 0.002136f, 0.002777f, 0.002964f,
- 0.003517f, 0.004192f, 0.004711f, 0.005505f, 0.006283f, 0.007408f, 0.008713f, 0.010674f,
- 0.012375f, 0.015099f, 0.018677f, 0.022797f, 0.028732f, 0.036835f, 0.047974f, 0.064270f,
- 0.088318f, 0.124634f, 0.180664f, 0.264893f, 0.380615f, 0.516113f, 0.645020f, 0.747559f,
- 0.819824f, 0.870117f, 0.902344f, 0.925293f, 0.941406f, 0.953613f, 0.962402f, 0.969238f,
- 0.974121f, 0.978027f, 0.981934f, 0.984375f, 0.986328f, 0.988281f, 0.989746f, 0.990723f,
- 0.992676f, 0.993164f, 0.997559f, 0.998047f, 0.998047f, 0.997559f, 0.998047f, 0.998047f,
- 0.000000f, 0.000000f, 0.000074f, 0.000337f, 0.000481f, 0.000484f, 0.000485f, 0.000556f,
- 0.000823f, 0.001143f, 0.001187f, 0.001391f, 0.001781f, 0.002155f, 0.002327f, 0.002760f,
- 0.003008f, 0.003433f, 0.004101f, 0.004681f, 0.005417f, 0.006443f, 0.007393f, 0.008560f,
- 0.010345f, 0.012177f, 0.014496f, 0.018127f, 0.022125f, 0.027740f, 0.035736f, 0.046173f,
- 0.061920f, 0.084717f, 0.119324f, 0.173218f, 0.254883f, 0.368652f, 0.505371f, 0.637207f,
- 0.742676f, 0.818359f, 0.868164f, 0.902832f, 0.925781f, 0.942383f, 0.953613f, 0.963379f,
- 0.970215f, 0.975098f, 0.979004f, 0.982422f, 0.984863f, 0.986328f, 0.988770f, 0.990723f,
- 0.991699f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000188f, 0.000358f, 0.000481f, 0.000484f, 0.000484f,
- 0.000704f, 0.000852f, 0.001165f, 0.001316f, 0.001500f, 0.001685f, 0.001933f, 0.002079f,
- 0.002720f, 0.003136f, 0.003727f, 0.003723f, 0.004513f, 0.005207f, 0.006275f, 0.007236f,
- 0.008453f, 0.010056f, 0.011848f, 0.014191f, 0.017212f, 0.021652f, 0.026978f, 0.034241f,
- 0.044678f, 0.058990f, 0.081421f, 0.114929f, 0.167236f, 0.247070f, 0.360596f, 0.498291f,
- 0.632812f, 0.741211f, 0.818359f, 0.869629f, 0.903809f, 0.927734f, 0.943848f, 0.955566f,
- 0.964355f, 0.970703f, 0.976074f, 0.979492f, 0.982422f, 0.985840f, 0.987793f, 0.989258f,
- 0.990723f, 0.992188f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000121f, 0.000120f, 0.000288f, 0.000357f, 0.000479f, 0.000483f,
- 0.000535f, 0.000711f, 0.000862f, 0.001256f, 0.001351f, 0.001502f, 0.001719f, 0.002146f,
- 0.002037f, 0.002653f, 0.003248f, 0.003222f, 0.003820f, 0.004456f, 0.005173f, 0.006008f,
- 0.007072f, 0.008247f, 0.009758f, 0.011826f, 0.013771f, 0.016861f, 0.020935f, 0.025986f,
- 0.032928f, 0.043030f, 0.057587f, 0.078918f, 0.111755f, 0.162964f, 0.241943f, 0.355713f,
- 0.495117f, 0.632324f, 0.742676f, 0.819336f, 0.871582f, 0.905762f, 0.929688f, 0.945312f,
- 0.957031f, 0.965332f, 0.972168f, 0.976562f, 0.980957f, 0.983887f, 0.986328f, 0.988281f,
- 0.990234f, 0.991699f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000200f, 0.000412f, 0.000471f, 0.000599f,
- 0.000598f, 0.000596f, 0.000805f, 0.001099f, 0.001334f, 0.001417f, 0.001456f, 0.001723f,
- 0.002102f, 0.002283f, 0.002579f, 0.003208f, 0.003233f, 0.003740f, 0.004574f, 0.005287f,
- 0.006012f, 0.006870f, 0.008018f, 0.009354f, 0.011208f, 0.013542f, 0.016495f, 0.020370f,
- 0.025284f, 0.032410f, 0.041901f, 0.056183f, 0.077087f, 0.109558f, 0.160278f, 0.239380f,
- 0.354492f, 0.496094f, 0.635254f, 0.747070f, 0.823730f, 0.875488f, 0.908691f, 0.931641f,
- 0.947266f, 0.958008f, 0.966309f, 0.972656f, 0.978027f, 0.981445f, 0.984863f, 0.986816f,
- 0.989258f, 0.990723f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000237f, 0.000239f, 0.000430f, 0.000465f,
- 0.000599f, 0.000724f, 0.000716f, 0.000815f, 0.000981f, 0.001334f, 0.001299f, 0.001545f,
- 0.001617f, 0.001935f, 0.002110f, 0.002501f, 0.002823f, 0.003408f, 0.003790f, 0.004467f,
- 0.005112f, 0.005848f, 0.006718f, 0.007942f, 0.009514f, 0.011093f, 0.013092f, 0.015945f,
- 0.019608f, 0.024689f, 0.031494f, 0.041046f, 0.054901f, 0.075989f, 0.108032f, 0.158936f,
- 0.239014f, 0.356201f, 0.500488f, 0.642090f, 0.753418f, 0.830566f, 0.880859f, 0.912598f,
- 0.935059f, 0.950195f, 0.960449f, 0.968262f, 0.975098f, 0.979980f, 0.982910f, 0.985352f,
- 0.987793f, 0.990234f, 0.996582f, 0.997070f, 0.997070f, 0.996582f, 0.997070f, 0.996582f,
- 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000120f, 0.000121f, 0.000312f, 0.000407f,
- 0.000707f, 0.000597f, 0.000648f, 0.000720f, 0.000941f, 0.001008f, 0.001229f, 0.001289f,
- 0.001423f, 0.001726f, 0.002060f, 0.002211f, 0.002506f, 0.002985f, 0.003036f, 0.003683f,
- 0.004066f, 0.004833f, 0.005592f, 0.006611f, 0.007675f, 0.008965f, 0.010811f, 0.012833f,
- 0.015854f, 0.019485f, 0.024429f, 0.031036f, 0.040466f, 0.054108f, 0.074890f, 0.107727f,
- 0.159180f, 0.241699f, 0.362549f, 0.510742f, 0.653809f, 0.763184f, 0.837891f, 0.887207f,
- 0.917480f, 0.938477f, 0.953613f, 0.962891f, 0.970703f, 0.976562f, 0.980469f, 0.984375f,
- 0.986816f, 0.988770f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f,
- 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000118f, 0.000120f, 0.000129f, 0.000434f,
- 0.000536f, 0.000613f, 0.000716f, 0.000799f, 0.000720f, 0.000768f, 0.001024f, 0.001202f,
- 0.001501f, 0.001530f, 0.001568f, 0.001897f, 0.002190f, 0.002502f, 0.002893f, 0.003105f,
- 0.003551f, 0.004021f, 0.004791f, 0.005405f, 0.006313f, 0.007309f, 0.008720f, 0.010712f,
- 0.012657f, 0.015472f, 0.018982f, 0.023697f, 0.030579f, 0.040009f, 0.054138f, 0.075012f,
- 0.107849f, 0.161377f, 0.247070f, 0.373047f, 0.525391f, 0.667969f, 0.776855f, 0.847656f,
- 0.894043f, 0.923340f, 0.942871f, 0.956543f, 0.965820f, 0.973145f, 0.978027f, 0.982422f,
- 0.985352f, 0.987793f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, 0.996094f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000081f, 0.000116f, 0.000227f, 0.000360f,
- 0.000366f, 0.000642f, 0.000691f, 0.000711f, 0.000806f, 0.000721f, 0.000925f, 0.000947f,
- 0.001155f, 0.001478f, 0.001554f, 0.001612f, 0.001929f, 0.002354f, 0.002291f, 0.002712f,
- 0.003029f, 0.003441f, 0.003876f, 0.004452f, 0.005276f, 0.006256f, 0.007149f, 0.008568f,
- 0.010040f, 0.012566f, 0.015160f, 0.018677f, 0.023376f, 0.030411f, 0.039642f, 0.053986f,
- 0.075134f, 0.109436f, 0.165527f, 0.255127f, 0.387695f, 0.544434f, 0.686523f, 0.791016f,
- 0.858398f, 0.901367f, 0.928711f, 0.947266f, 0.959961f, 0.968262f, 0.975098f, 0.980469f,
- 0.983887f, 0.987305f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000088f, 0.000085f, 0.000338f, 0.000351f,
- 0.000359f, 0.000480f, 0.000539f, 0.000698f, 0.000798f, 0.000793f, 0.000834f, 0.000891f,
- 0.000941f, 0.001143f, 0.001422f, 0.001512f, 0.001833f, 0.001955f, 0.002144f, 0.002426f,
- 0.002716f, 0.003262f, 0.003572f, 0.003860f, 0.004456f, 0.005173f, 0.006191f, 0.006939f,
- 0.008545f, 0.010162f, 0.012375f, 0.014969f, 0.018555f, 0.023376f, 0.029953f, 0.039673f,
- 0.054077f, 0.076477f, 0.112000f, 0.171509f, 0.268066f, 0.408203f, 0.569336f, 0.709961f,
- 0.808105f, 0.872070f, 0.910645f, 0.935059f, 0.951660f, 0.963379f, 0.971680f, 0.977539f,
- 0.982422f, 0.985840f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000116f, 0.000340f,
- 0.000353f, 0.000349f, 0.000480f, 0.000576f, 0.000668f, 0.000700f, 0.000818f, 0.000833f,
- 0.000787f, 0.001125f, 0.001110f, 0.001407f, 0.001489f, 0.001563f, 0.001804f, 0.002073f,
- 0.002285f, 0.002409f, 0.002985f, 0.003052f, 0.003853f, 0.004433f, 0.005100f, 0.006046f,
- 0.007046f, 0.008156f, 0.009827f, 0.012138f, 0.014740f, 0.018311f, 0.023071f, 0.029770f,
- 0.040009f, 0.054810f, 0.078003f, 0.116150f, 0.180176f, 0.284668f, 0.434570f, 0.599121f,
- 0.735352f, 0.827637f, 0.885254f, 0.919922f, 0.941895f, 0.957031f, 0.967285f, 0.975098f,
- 0.979980f, 0.984375f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995605f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000235f,
- 0.000320f, 0.000351f, 0.000353f, 0.000478f, 0.000602f, 0.000651f, 0.000793f, 0.000706f,
- 0.000816f, 0.000814f, 0.000898f, 0.001062f, 0.001259f, 0.001441f, 0.001564f, 0.001772f,
- 0.001743f, 0.002134f, 0.002512f, 0.002668f, 0.003193f, 0.003746f, 0.004341f, 0.004902f,
- 0.005909f, 0.006920f, 0.008125f, 0.009605f, 0.011711f, 0.014549f, 0.018280f, 0.023163f,
- 0.030334f, 0.040375f, 0.055939f, 0.080566f, 0.122070f, 0.192383f, 0.307373f, 0.467773f,
- 0.634277f, 0.763184f, 0.846191f, 0.897461f, 0.928711f, 0.948730f, 0.962402f, 0.971680f,
- 0.978516f, 0.982422f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995117f, 0.995117f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000185f, 0.000190f,
- 0.000272f, 0.000281f, 0.000464f, 0.000466f, 0.000476f, 0.000521f, 0.000654f, 0.000680f,
- 0.000699f, 0.000815f, 0.000814f, 0.000890f, 0.001110f, 0.001283f, 0.001311f, 0.001590f,
- 0.001727f, 0.001801f, 0.002020f, 0.002312f, 0.002897f, 0.003267f, 0.003592f, 0.004143f,
- 0.004810f, 0.005844f, 0.006618f, 0.008018f, 0.009697f, 0.011597f, 0.014374f, 0.018127f,
- 0.023056f, 0.030258f, 0.041107f, 0.057373f, 0.084045f, 0.129517f, 0.208618f, 0.337646f,
- 0.508789f, 0.673828f, 0.793457f, 0.866211f, 0.911133f, 0.938965f, 0.955566f, 0.967285f,
- 0.975586f, 0.980469f, 0.994141f, 0.994141f, 0.994629f, 0.994629f, 0.994629f, 0.994141f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000226f, 0.000431f, 0.000456f, 0.000467f, 0.000352f, 0.000496f, 0.000588f,
- 0.000891f, 0.000771f, 0.000803f, 0.000947f, 0.000972f, 0.001078f, 0.001033f, 0.001279f,
- 0.001436f, 0.001483f, 0.001831f, 0.002033f, 0.002264f, 0.002710f, 0.002996f, 0.003582f,
- 0.004032f, 0.004665f, 0.005592f, 0.006527f, 0.007820f, 0.009323f, 0.011581f, 0.014328f,
- 0.018219f, 0.023239f, 0.030777f, 0.042084f, 0.059448f, 0.089233f, 0.140869f, 0.230713f,
- 0.375977f, 0.556641f, 0.715332f, 0.822266f, 0.885742f, 0.924316f, 0.947266f, 0.962402f,
- 0.972656f, 0.978516f, 0.993164f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, 0.994141f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000283f, 0.000229f, 0.000425f, 0.000303f, 0.000336f, 0.000469f, 0.000474f,
- 0.000728f, 0.000663f, 0.000883f, 0.000695f, 0.000679f, 0.000858f, 0.000919f, 0.000980f,
- 0.001218f, 0.001330f, 0.001665f, 0.001637f, 0.002054f, 0.002335f, 0.002508f, 0.002880f,
- 0.003323f, 0.004055f, 0.004730f, 0.005463f, 0.006485f, 0.007740f, 0.009293f, 0.011566f,
- 0.014175f, 0.017944f, 0.023346f, 0.031433f, 0.043304f, 0.063232f, 0.096313f, 0.155518f,
- 0.260498f, 0.424561f, 0.611328f, 0.758789f, 0.852051f, 0.904785f, 0.937012f, 0.955566f,
- 0.968262f, 0.977051f, 0.992676f, 0.992676f, 0.993164f, 0.993652f, 0.993164f, 0.993652f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000256f, 0.000216f, 0.000406f, 0.000426f, 0.000457f, 0.000453f,
- 0.000472f, 0.000651f, 0.000593f, 0.000876f, 0.000571f, 0.000590f, 0.000819f, 0.000809f,
- 0.001000f, 0.001224f, 0.001293f, 0.001637f, 0.001790f, 0.001863f, 0.002298f, 0.002550f,
- 0.002995f, 0.003201f, 0.003933f, 0.004677f, 0.005360f, 0.006447f, 0.007763f, 0.009377f,
- 0.011330f, 0.014420f, 0.017944f, 0.023560f, 0.032196f, 0.045380f, 0.067383f, 0.105469f,
- 0.175659f, 0.301025f, 0.484375f, 0.669922f, 0.801270f, 0.879395f, 0.922852f, 0.948242f,
- 0.963379f, 0.974121f, 0.992188f, 0.992188f, 0.992188f, 0.993164f, 0.992188f, 0.993164f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000230f, 0.000206f, 0.000355f, 0.000335f, 0.000305f,
- 0.000461f, 0.000565f, 0.000474f, 0.000429f, 0.000520f, 0.000758f, 0.000777f, 0.000668f,
- 0.000821f, 0.001013f, 0.001089f, 0.001325f, 0.001570f, 0.001787f, 0.001707f, 0.002037f,
- 0.002457f, 0.002892f, 0.003359f, 0.003881f, 0.004616f, 0.005203f, 0.006336f, 0.007477f,
- 0.009048f, 0.011345f, 0.014015f, 0.018356f, 0.024307f, 0.033661f, 0.048279f, 0.073303f,
- 0.118774f, 0.204102f, 0.354492f, 0.554688f, 0.729492f, 0.840332f, 0.902832f, 0.937988f,
- 0.958008f, 0.971191f, 0.991699f, 0.992188f, 0.992188f, 0.991699f, 0.992188f, 0.991699f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000248f, 0.000213f, 0.000344f,
- 0.000437f, 0.000351f, 0.000352f, 0.000359f, 0.000389f, 0.000482f, 0.000676f, 0.000560f,
- 0.000806f, 0.000813f, 0.000927f, 0.001230f, 0.001392f, 0.001526f, 0.001627f, 0.001629f,
- 0.002047f, 0.002321f, 0.002661f, 0.003317f, 0.003752f, 0.004406f, 0.005119f, 0.005936f,
- 0.007156f, 0.009003f, 0.010941f, 0.013985f, 0.018539f, 0.025131f, 0.035248f, 0.051880f,
- 0.081543f, 0.137207f, 0.244507f, 0.424561f, 0.632812f, 0.787598f, 0.876465f, 0.924805f,
- 0.951172f, 0.966797f, 0.990723f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000171f, 0.000276f,
- 0.000278f, 0.000288f, 0.000329f, 0.000365f, 0.000459f, 0.000483f, 0.000626f, 0.000716f,
- 0.000767f, 0.000793f, 0.000800f, 0.000897f, 0.000976f, 0.001156f, 0.001322f, 0.001427f,
- 0.001799f, 0.001997f, 0.002256f, 0.002773f, 0.002806f, 0.003515f, 0.004040f, 0.004910f,
- 0.005730f, 0.007046f, 0.008858f, 0.011124f, 0.014374f, 0.018982f, 0.026123f, 0.037659f,
- 0.057129f, 0.093445f, 0.164062f, 0.301514f, 0.511230f, 0.712402f, 0.838867f, 0.906738f,
- 0.942383f, 0.961914f, 0.989746f, 0.990234f, 0.989746f, 0.990234f, 0.989746f, 0.990234f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000173f, 0.000140f,
- 0.000138f, 0.000232f, 0.000291f, 0.000318f, 0.000338f, 0.000346f, 0.000422f, 0.000368f,
- 0.000680f, 0.000722f, 0.000765f, 0.000766f, 0.000803f, 0.001069f, 0.001103f, 0.001185f,
- 0.001611f, 0.001593f, 0.001939f, 0.002211f, 0.002569f, 0.003008f, 0.003239f, 0.003952f,
- 0.004681f, 0.005630f, 0.007008f, 0.008720f, 0.011200f, 0.014587f, 0.019653f, 0.027527f,
- 0.040955f, 0.064514f, 0.110413f, 0.204224f, 0.381104f, 0.609863f, 0.785645f, 0.881836f,
- 0.931152f, 0.956543f, 0.988770f, 0.989258f, 0.989258f, 0.989258f, 0.989258f, 0.988770f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000123f, 0.000121f, 0.000090f,
- 0.000102f, 0.000063f, 0.000156f, 0.000248f, 0.000333f, 0.000321f, 0.000431f, 0.000392f,
- 0.000349f, 0.000434f, 0.000674f, 0.000741f, 0.000776f, 0.000936f, 0.000888f, 0.001049f,
- 0.001179f, 0.001326f, 0.001686f, 0.001732f, 0.002050f, 0.002150f, 0.002453f, 0.003016f,
- 0.003601f, 0.004444f, 0.005692f, 0.006741f, 0.008324f, 0.011093f, 0.014709f, 0.020752f,
- 0.029800f, 0.045654f, 0.074951f, 0.136108f, 0.264893f, 0.486816f, 0.710938f, 0.848145f,
- 0.916992f, 0.950684f, 0.987305f, 0.987793f, 0.987793f, 0.988281f, 0.987793f, 0.987793f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000100f,
- 0.000049f, 0.000039f, 0.000125f, 0.000121f, 0.000184f, 0.000280f, 0.000366f, 0.000392f,
- 0.000333f, 0.000341f, 0.000477f, 0.000597f, 0.000607f, 0.000747f, 0.000767f, 0.000961f,
- 0.000936f, 0.001056f, 0.001306f, 0.001388f, 0.001633f, 0.001836f, 0.001997f, 0.002348f,
- 0.002878f, 0.003332f, 0.004131f, 0.005165f, 0.006519f, 0.008568f, 0.011444f, 0.015419f,
- 0.021881f, 0.032532f, 0.052032f, 0.091187f, 0.177246f, 0.357910f, 0.610352f, 0.800781f,
- 0.897461f, 0.942871f, 0.985352f, 0.986328f, 0.986816f, 0.986328f, 0.986328f, 0.986328f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000099f, 0.000076f,
- 0.000060f, 0.000108f, 0.000040f, 0.000127f, 0.000127f, 0.000121f, 0.000200f, 0.000265f,
- 0.000360f, 0.000316f, 0.000428f, 0.000455f, 0.000456f, 0.000583f, 0.000682f, 0.000750f,
- 0.000773f, 0.000824f, 0.000937f, 0.001220f, 0.001262f, 0.001384f, 0.001622f, 0.001862f,
- 0.002157f, 0.002817f, 0.003414f, 0.004082f, 0.004993f, 0.006561f, 0.008560f, 0.011696f,
- 0.016022f, 0.023529f, 0.036469f, 0.062286f, 0.117126f, 0.245605f, 0.487549f, 0.732910f,
- 0.870605f, 0.933105f, 0.983887f, 0.984863f, 0.984863f, 0.984863f, 0.984375f, 0.984863f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000096f,
- 0.000075f, 0.000061f, 0.000083f, 0.000096f, 0.000034f, 0.000101f, 0.000121f, 0.000137f,
- 0.000211f, 0.000324f, 0.000381f, 0.000373f, 0.000420f, 0.000472f, 0.000494f, 0.000690f,
- 0.000793f, 0.000768f, 0.000853f, 0.000867f, 0.000978f, 0.001003f, 0.001145f, 0.001416f,
- 0.001888f, 0.002125f, 0.002491f, 0.003004f, 0.003864f, 0.005028f, 0.006500f, 0.008682f,
- 0.011856f, 0.016922f, 0.025757f, 0.042603f, 0.078247f, 0.161743f, 0.358398f, 0.641602f,
- 0.833496f, 0.920410f, 0.981934f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, 0.982910f,
- 0.000122f, 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f,
- 0.000097f, 0.000078f, 0.000062f, 0.000051f, 0.000043f, 0.000072f, 0.000030f, 0.000060f,
- 0.000109f, 0.000206f, 0.000216f, 0.000333f, 0.000347f, 0.000395f, 0.000415f, 0.000458f,
- 0.000568f, 0.000664f, 0.000709f, 0.000598f, 0.000781f, 0.000628f, 0.001053f, 0.001046f,
- 0.001179f, 0.001579f, 0.001649f, 0.002386f, 0.002857f, 0.003727f, 0.004894f, 0.006363f,
- 0.008789f, 0.012314f, 0.018616f, 0.029709f, 0.052429f, 0.105652f, 0.244385f, 0.524414f,
- 0.782715f, 0.904785f, 0.979492f, 0.980957f, 0.979980f, 0.979980f, 0.980469f, 0.980469f,
- 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000097f, 0.000079f, 0.000065f, 0.000054f, 0.000045f, 0.000073f, 0.000032f,
- 0.000089f, 0.000038f, 0.000134f, 0.000138f, 0.000211f, 0.000333f, 0.000370f, 0.000400f,
- 0.000420f, 0.000496f, 0.000566f, 0.000494f, 0.000584f, 0.000714f, 0.000708f, 0.000843f,
- 0.001056f, 0.001019f, 0.001327f, 0.001812f, 0.001908f, 0.002798f, 0.003479f, 0.004578f,
- 0.006195f, 0.008881f, 0.012901f, 0.020599f, 0.035339f, 0.069214f, 0.159058f, 0.394531f,
- 0.709961f, 0.882812f, 0.977051f, 0.978027f, 0.977539f, 0.976562f, 0.977051f, 0.977539f,
- 0.000000f, 0.000121f, 0.000120f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f,
- 0.000119f, 0.000120f, 0.000102f, 0.000084f, 0.000071f, 0.000059f, 0.000048f, 0.000041f,
- 0.000035f, 0.000062f, 0.000026f, 0.000098f, 0.000103f, 0.000136f, 0.000230f, 0.000327f,
- 0.000356f, 0.000338f, 0.000387f, 0.000499f, 0.000577f, 0.000627f, 0.000669f, 0.000611f,
- 0.000699f, 0.000904f, 0.000893f, 0.001340f, 0.001666f, 0.002068f, 0.002377f, 0.003105f,
- 0.004345f, 0.006218f, 0.009178f, 0.013962f, 0.024170f, 0.045441f, 0.101868f, 0.271973f,
- 0.612305f, 0.853027f, 0.973145f, 0.974121f, 0.973633f, 0.974121f, 0.973633f, 0.974121f,
- 0.000121f, 0.000120f, 0.000119f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000119f,
- 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f,
- 0.000119f, 0.000119f, 0.000119f, 0.000108f, 0.000091f, 0.000075f, 0.000063f, 0.000053f,
- 0.000045f, 0.000039f, 0.000034f, 0.000040f, 0.000090f, 0.000068f, 0.000104f, 0.000127f,
- 0.000220f, 0.000302f, 0.000412f, 0.000316f, 0.000444f, 0.000495f, 0.000428f, 0.000510f,
- 0.000463f, 0.000614f, 0.000726f, 0.000719f, 0.001164f, 0.001533f, 0.001707f, 0.002079f,
- 0.002848f, 0.004189f, 0.006142f, 0.009491f, 0.016113f, 0.029343f, 0.064758f, 0.175415f,
- 0.490723f, 0.812012f, 0.968750f, 0.969727f, 0.969238f, 0.969727f, 0.969727f, 0.969727f,
- 0.000000f, 0.000117f, 0.000117f, 0.000115f, 0.000118f, 0.000118f, 0.000117f, 0.000117f,
- 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000117f,
- 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000100f, 0.000082f, 0.000070f,
- 0.000060f, 0.000051f, 0.000043f, 0.000038f, 0.000033f, 0.000053f, 0.000027f, 0.000089f,
- 0.000105f, 0.000137f, 0.000227f, 0.000277f, 0.000293f, 0.000284f, 0.000300f, 0.000420f,
- 0.000367f, 0.000473f, 0.000467f, 0.000555f, 0.000625f, 0.000870f, 0.001177f, 0.001563f,
- 0.001982f, 0.002714f, 0.004051f, 0.006134f, 0.010384f, 0.018967f, 0.040314f, 0.108887f,
- 0.358643f, 0.755859f, 0.962891f, 0.963867f, 0.964355f, 0.963867f, 0.963379f, 0.963379f,
- 0.000000f, 0.000000f, 0.000098f, 0.000103f, 0.000111f, 0.000112f, 0.000112f, 0.000114f,
- 0.000113f, 0.000115f, 0.000114f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, 0.000115f,
- 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000109f, 0.000094f,
- 0.000078f, 0.000067f, 0.000058f, 0.000050f, 0.000043f, 0.000038f, 0.000033f, 0.000054f,
- 0.000025f, 0.000078f, 0.000091f, 0.000173f, 0.000203f, 0.000252f, 0.000331f, 0.000277f,
- 0.000264f, 0.000407f, 0.000342f, 0.000444f, 0.000470f, 0.000542f, 0.000773f, 0.001081f,
- 0.001245f, 0.001682f, 0.002602f, 0.003744f, 0.006248f, 0.011566f, 0.025040f, 0.065491f,
- 0.236938f, 0.678223f, 0.956055f, 0.956543f, 0.956543f, 0.956543f, 0.957031f, 0.957031f,
- 0.000000f, 0.000000f, 0.000021f, 0.000080f, 0.000072f, 0.000089f, 0.000100f, 0.000099f,
- 0.000105f, 0.000107f, 0.000107f, 0.000110f, 0.000109f, 0.000110f, 0.000111f, 0.000111f,
- 0.000112f, 0.000112f, 0.000112f, 0.000113f, 0.000113f, 0.000113f, 0.000113f, 0.000113f,
- 0.000105f, 0.000090f, 0.000078f, 0.000067f, 0.000057f, 0.000050f, 0.000043f, 0.000038f,
- 0.000033f, 0.000029f, 0.000025f, 0.000055f, 0.000091f, 0.000130f, 0.000225f, 0.000275f,
- 0.000254f, 0.000290f, 0.000259f, 0.000378f, 0.000333f, 0.000362f, 0.000458f, 0.000587f,
- 0.000876f, 0.001062f, 0.001382f, 0.002398f, 0.003763f, 0.006603f, 0.014496f, 0.038300f,
- 0.143677f, 0.573730f, 0.946777f, 0.947266f, 0.947266f, 0.947266f, 0.948242f, 0.947266f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000036f, 0.000072f,
- 0.000082f, 0.000080f, 0.000094f, 0.000096f, 0.000099f, 0.000098f, 0.000103f, 0.000103f,
- 0.000103f, 0.000106f, 0.000105f, 0.000107f, 0.000107f, 0.000108f, 0.000108f, 0.000109f,
- 0.000109f, 0.000109f, 0.000105f, 0.000090f, 0.000078f, 0.000067f, 0.000059f, 0.000051f,
- 0.000045f, 0.000039f, 0.000034f, 0.000030f, 0.000026f, 0.000045f, 0.000086f, 0.000108f,
- 0.000143f, 0.000212f, 0.000227f, 0.000204f, 0.000231f, 0.000263f, 0.000315f, 0.000354f,
- 0.000481f, 0.000702f, 0.000888f, 0.001257f, 0.002018f, 0.003738f, 0.007675f, 0.021317f,
- 0.080933f, 0.444336f, 0.934082f, 0.935059f, 0.935059f, 0.935059f, 0.935059f, 0.935059f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000024f, 0.000038f, 0.000059f, 0.000063f, 0.000076f, 0.000080f, 0.000085f,
- 0.000089f, 0.000091f, 0.000092f, 0.000095f, 0.000097f, 0.000099f, 0.000098f, 0.000101f,
- 0.000101f, 0.000102f, 0.000103f, 0.000104f, 0.000104f, 0.000091f, 0.000080f, 0.000069f,
- 0.000062f, 0.000053f, 0.000046f, 0.000041f, 0.000035f, 0.000032f, 0.000027f, 0.000039f,
- 0.000052f, 0.000103f, 0.000139f, 0.000178f, 0.000190f, 0.000178f, 0.000185f, 0.000247f,
- 0.000274f, 0.000368f, 0.000528f, 0.000637f, 0.001027f, 0.001937f, 0.003853f, 0.010445f,
- 0.041718f, 0.304199f, 0.917480f, 0.917480f, 0.917969f, 0.917480f, 0.918457f, 0.917969f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000023f, 0.000037f,
- 0.000048f, 0.000048f, 0.000063f, 0.000063f, 0.000074f, 0.000077f, 0.000080f, 0.000083f,
- 0.000086f, 0.000088f, 0.000090f, 0.000091f, 0.000092f, 0.000094f, 0.000095f, 0.000096f,
- 0.000084f, 0.000073f, 0.000064f, 0.000057f, 0.000049f, 0.000043f, 0.000037f, 0.000033f,
- 0.000029f, 0.000025f, 0.000060f, 0.000061f, 0.000087f, 0.000118f, 0.000156f, 0.000131f,
- 0.000175f, 0.000226f, 0.000230f, 0.000373f, 0.000507f, 0.000992f, 0.001814f, 0.004639f,
- 0.018799f, 0.176758f, 0.894043f, 0.894531f, 0.895508f, 0.895020f, 0.895020f, 0.895996f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000019f, 0.000028f, 0.000034f, 0.000043f,
- 0.000052f, 0.000057f, 0.000062f, 0.000067f, 0.000070f, 0.000074f, 0.000075f, 0.000079f,
- 0.000081f, 0.000083f, 0.000085f, 0.000076f, 0.000068f, 0.000059f, 0.000051f, 0.000046f,
- 0.000040f, 0.000035f, 0.000030f, 0.000026f, 0.000028f, 0.000038f, 0.000072f, 0.000100f,
- 0.000120f, 0.000107f, 0.000152f, 0.000156f, 0.000254f, 0.000436f, 0.000722f, 0.001875f,
- 0.007088f, 0.083069f, 0.863281f, 0.862305f, 0.863281f, 0.862305f, 0.863281f, 0.862793f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000005f, 0.000015f, 0.000022f, 0.000030f, 0.000037f, 0.000042f,
- 0.000048f, 0.000053f, 0.000058f, 0.000060f, 0.000064f, 0.000067f, 0.000069f, 0.000061f,
- 0.000053f, 0.000047f, 0.000041f, 0.000036f, 0.000031f, 0.000027f, 0.000023f, 0.000020f,
- 0.000036f, 0.000063f, 0.000082f, 0.000081f, 0.000104f, 0.000149f, 0.000263f, 0.000616f,
- 0.002337f, 0.028168f, 0.816406f, 0.816895f, 0.816895f, 0.816895f, 0.817383f, 0.816895f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000003f, 0.000011f, 0.000019f, 0.000026f, 0.000031f, 0.000036f,
- 0.000041f, 0.000045f, 0.000050f, 0.000047f, 0.000041f, 0.000036f, 0.000031f, 0.000027f,
- 0.000023f, 0.000019f, 0.000028f, 0.000029f, 0.000053f, 0.000052f, 0.000072f, 0.000165f,
- 0.000511f, 0.006050f, 0.751465f, 0.752441f, 0.752930f, 0.752441f, 0.752441f, 0.752930f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000011f, 0.000017f, 0.000021f, 0.000027f,
- 0.000028f, 0.000024f, 0.000020f, 0.000017f, 0.000013f, 0.000020f, 0.000021f, 0.000029f,
- 0.000057f, 0.000588f, 0.665039f, 0.664551f, 0.665527f, 0.665039f, 0.665039f, 0.665039f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000009f, 0.000006f,
- 0.000004f, 0.000007f, 0.557129f, 0.558105f, 0.557617f, 0.557617f, 0.558594f, 0.558105f,
- },
- {
- 0.163818f, 0.558105f, 0.755859f, 0.841797f, 0.886230f, 0.912109f, 0.929199f, 0.941406f,
- 0.950195f, 0.957031f, 0.961914f, 0.966309f, 0.970215f, 0.972656f, 0.975586f, 0.978027f,
- 0.979492f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f,
- 0.989258f, 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.993164f, 0.993652f,
- 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995117f, 0.995605f, 0.996094f,
- 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f,
- 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.027023f, 0.138184f, 0.353760f, 0.583984f, 0.735352f, 0.819336f, 0.868652f, 0.898926f,
- 0.918945f, 0.933594f, 0.943848f, 0.952148f, 0.958984f, 0.963867f, 0.967773f, 0.971680f,
- 0.974121f, 0.976562f, 0.978516f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986328f,
- 0.986816f, 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.990723f, 0.991699f, 0.992676f,
- 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.994141f, 0.995117f, 0.995117f, 0.995605f,
- 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.009819f, 0.044250f, 0.113525f, 0.244995f, 0.430420f, 0.608887f, 0.733887f, 0.810547f,
- 0.860352f, 0.892578f, 0.913086f, 0.929688f, 0.940918f, 0.949219f, 0.956055f, 0.961426f,
- 0.966309f, 0.970215f, 0.972656f, 0.975586f, 0.977539f, 0.979980f, 0.980957f, 0.983398f,
- 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.988281f, 0.989746f, 0.989746f, 0.991211f,
- 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f,
- 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997559f,
- 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.004848f, 0.020447f, 0.046814f, 0.096313f, 0.183228f, 0.319092f, 0.484375f, 0.631836f,
- 0.739258f, 0.810547f, 0.857422f, 0.888672f, 0.910645f, 0.925781f, 0.938965f, 0.947754f,
- 0.954590f, 0.960449f, 0.964355f, 0.968750f, 0.971191f, 0.974609f, 0.977051f, 0.979004f,
- 0.980957f, 0.982422f, 0.983887f, 0.985840f, 0.986816f, 0.987793f, 0.988770f, 0.989258f,
- 0.990234f, 0.990723f, 0.991211f, 0.991699f, 0.992676f, 0.992676f, 0.993652f, 0.993652f,
- 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f,
- 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.003096f, 0.011017f, 0.024399f, 0.046600f, 0.083191f, 0.145386f, 0.243774f, 0.379395f,
- 0.529297f, 0.656738f, 0.750977f, 0.813965f, 0.857910f, 0.887695f, 0.909668f, 0.925293f,
- 0.937500f, 0.946289f, 0.953613f, 0.959473f, 0.964355f, 0.968262f, 0.971191f, 0.974121f,
- 0.976562f, 0.979004f, 0.980957f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987793f,
- 0.988281f, 0.989258f, 0.989746f, 0.991211f, 0.991699f, 0.991699f, 0.992676f, 0.993164f,
- 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f,
- 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.001808f, 0.006992f, 0.014923f, 0.026413f, 0.044403f, 0.073120f, 0.119446f, 0.193115f,
- 0.300537f, 0.433594f, 0.568848f, 0.680664f, 0.763184f, 0.821289f, 0.860840f, 0.890137f,
- 0.909668f, 0.925293f, 0.937500f, 0.945801f, 0.953613f, 0.959473f, 0.963867f, 0.968262f,
- 0.971680f, 0.974609f, 0.977051f, 0.979004f, 0.980957f, 0.982422f, 0.983887f, 0.984863f,
- 0.986816f, 0.987305f, 0.987793f, 0.989746f, 0.989746f, 0.991211f, 0.991699f, 0.992188f,
- 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996094f,
- 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.001668f, 0.005253f, 0.010010f, 0.016602f, 0.026459f, 0.042023f, 0.065369f, 0.101868f,
- 0.158081f, 0.241455f, 0.354248f, 0.483887f, 0.606934f, 0.706055f, 0.777832f, 0.830566f,
- 0.867188f, 0.893066f, 0.912109f, 0.926270f, 0.938477f, 0.946289f, 0.953125f, 0.959473f,
- 0.964355f, 0.968750f, 0.971680f, 0.975098f, 0.977051f, 0.979492f, 0.980957f, 0.982910f,
- 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990234f, 0.991211f,
- 0.992188f, 0.993164f, 0.993164f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995605f,
- 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f,
- 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f,
- 0.001086f, 0.003477f, 0.006756f, 0.011604f, 0.018066f, 0.027222f, 0.039978f, 0.059448f,
- 0.088257f, 0.132690f, 0.198120f, 0.291504f, 0.408447f, 0.531250f, 0.641602f, 0.728516f,
- 0.793457f, 0.839844f, 0.873047f, 0.896973f, 0.915527f, 0.929199f, 0.939941f, 0.948730f,
- 0.955566f, 0.960938f, 0.965332f, 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979492f,
- 0.981445f, 0.983398f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989258f, 0.989746f,
- 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.994629f,
- 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f,
- 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000982f, 0.002764f, 0.004925f, 0.008194f, 0.012703f, 0.018417f, 0.026154f, 0.037964f,
- 0.053894f, 0.078552f, 0.113770f, 0.166626f, 0.242310f, 0.343262f, 0.460449f, 0.576660f,
- 0.675293f, 0.753418f, 0.809570f, 0.851074f, 0.879883f, 0.902344f, 0.919434f, 0.931152f,
- 0.941895f, 0.950195f, 0.956055f, 0.960938f, 0.965820f, 0.969727f, 0.973145f, 0.976074f,
- 0.978027f, 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.988770f,
- 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f,
- 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000723f, 0.002268f, 0.003639f, 0.006371f, 0.009392f, 0.013046f, 0.018570f, 0.026016f,
- 0.035919f, 0.049957f, 0.070618f, 0.099609f, 0.142212f, 0.204590f, 0.290039f, 0.396973f,
- 0.512207f, 0.619141f, 0.707520f, 0.775391f, 0.825195f, 0.860352f, 0.887207f, 0.907715f,
- 0.923340f, 0.935547f, 0.944824f, 0.951660f, 0.958496f, 0.963379f, 0.967773f, 0.971191f,
- 0.974121f, 0.977051f, 0.979492f, 0.980957f, 0.982910f, 0.984375f, 0.985352f, 0.987305f,
- 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993164f,
- 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f,
- 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000364f, 0.001690f, 0.003056f, 0.004982f, 0.007217f, 0.010124f, 0.013931f, 0.018738f,
- 0.025177f, 0.034332f, 0.045990f, 0.063599f, 0.088501f, 0.124146f, 0.175781f, 0.248047f,
- 0.341797f, 0.451416f, 0.562012f, 0.659668f, 0.738281f, 0.797852f, 0.841797f, 0.872559f,
- 0.896484f, 0.914062f, 0.928711f, 0.938477f, 0.947266f, 0.954590f, 0.959473f, 0.964844f,
- 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979980f, 0.981934f, 0.983398f, 0.985352f,
- 0.986816f, 0.987793f, 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.993164f,
- 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996582f,
- 0.997070f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000365f, 0.001221f, 0.002531f, 0.003979f, 0.005829f, 0.007874f, 0.010475f, 0.013962f,
- 0.018402f, 0.024368f, 0.032257f, 0.042847f, 0.057983f, 0.079346f, 0.109375f, 0.153198f,
- 0.214233f, 0.295898f, 0.397705f, 0.506836f, 0.609863f, 0.698730f, 0.767578f, 0.817871f,
- 0.854980f, 0.883301f, 0.903809f, 0.920410f, 0.933105f, 0.942871f, 0.950195f, 0.957031f,
- 0.962402f, 0.966797f, 0.970703f, 0.973633f, 0.976562f, 0.979004f, 0.981445f, 0.982910f,
- 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989746f, 0.989746f, 0.991211f, 0.992188f,
- 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f,
- 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000343f, 0.001357f, 0.002039f, 0.003130f, 0.004398f, 0.006432f, 0.008141f, 0.010925f,
- 0.014008f, 0.018326f, 0.023331f, 0.030655f, 0.040558f, 0.053680f, 0.071960f, 0.098206f,
- 0.134644f, 0.187012f, 0.258057f, 0.349854f, 0.455566f, 0.562012f, 0.656738f, 0.734863f,
- 0.792969f, 0.836914f, 0.868652f, 0.894043f, 0.912598f, 0.926758f, 0.937988f, 0.947266f,
- 0.954590f, 0.960449f, 0.964355f, 0.968750f, 0.972656f, 0.975586f, 0.978027f, 0.980469f,
- 0.981934f, 0.983398f, 0.985840f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.990723f,
- 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f,
- 0.996582f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000244f, 0.001185f, 0.001561f, 0.002504f, 0.003990f, 0.005272f, 0.006573f, 0.008606f,
- 0.010933f, 0.013878f, 0.017715f, 0.022415f, 0.029068f, 0.038086f, 0.049774f, 0.066162f,
- 0.088257f, 0.120361f, 0.164917f, 0.227173f, 0.308838f, 0.407959f, 0.515137f, 0.615723f,
- 0.700684f, 0.767090f, 0.817383f, 0.854492f, 0.882812f, 0.904297f, 0.920898f, 0.932617f,
- 0.943359f, 0.951172f, 0.957520f, 0.962891f, 0.967773f, 0.971191f, 0.974121f, 0.977539f,
- 0.979492f, 0.981445f, 0.983887f, 0.985352f, 0.986816f, 0.988281f, 0.988770f, 0.989258f,
- 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995605f,
- 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000243f, 0.000847f, 0.001555f, 0.002224f, 0.003141f, 0.004093f, 0.005264f, 0.006817f,
- 0.008850f, 0.010948f, 0.014053f, 0.017456f, 0.022339f, 0.028351f, 0.036011f, 0.046326f,
- 0.060791f, 0.080444f, 0.107788f, 0.146851f, 0.201660f, 0.274658f, 0.366699f, 0.470215f,
- 0.574707f, 0.666016f, 0.740234f, 0.797363f, 0.839355f, 0.871094f, 0.895508f, 0.913574f,
- 0.927734f, 0.938965f, 0.947754f, 0.955566f, 0.960449f, 0.965332f, 0.969727f, 0.973145f,
- 0.976074f, 0.979004f, 0.981445f, 0.982910f, 0.984863f, 0.986328f, 0.987305f, 0.988770f,
- 0.989258f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.994629f,
- 0.995117f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000244f, 0.000767f, 0.001042f, 0.001934f, 0.002502f, 0.003588f, 0.004292f, 0.005558f,
- 0.006824f, 0.008667f, 0.010872f, 0.013802f, 0.017426f, 0.021637f, 0.027176f, 0.033936f,
- 0.043304f, 0.056549f, 0.073914f, 0.098083f, 0.132446f, 0.180664f, 0.245239f, 0.330078f,
- 0.429199f, 0.533203f, 0.631348f, 0.711914f, 0.775879f, 0.823242f, 0.860352f, 0.886230f,
- 0.907227f, 0.923340f, 0.935059f, 0.944824f, 0.952148f, 0.958984f, 0.964844f, 0.968750f,
- 0.972168f, 0.975586f, 0.978516f, 0.980957f, 0.982422f, 0.983887f, 0.985840f, 0.987305f,
- 0.988770f, 0.989746f, 0.990234f, 0.992188f, 0.992676f, 0.992676f, 0.994141f, 0.994141f,
- 0.995117f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000000f, 0.000485f, 0.001062f, 0.001658f, 0.002398f, 0.002998f, 0.003805f, 0.004723f,
- 0.006004f, 0.007084f, 0.009102f, 0.011093f, 0.013489f, 0.016876f, 0.020813f, 0.025803f,
- 0.032257f, 0.040924f, 0.052673f, 0.068298f, 0.090149f, 0.120239f, 0.162598f, 0.221313f,
- 0.298096f, 0.392822f, 0.496582f, 0.597656f, 0.684082f, 0.754883f, 0.807617f, 0.848145f,
- 0.877930f, 0.900391f, 0.917969f, 0.931641f, 0.941406f, 0.950684f, 0.957031f, 0.962402f,
- 0.967773f, 0.971680f, 0.974609f, 0.978027f, 0.980469f, 0.982422f, 0.984375f, 0.985840f,
- 0.987305f, 0.988281f, 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f,
- 0.994141f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000244f, 0.000477f, 0.000852f, 0.001439f, 0.002045f, 0.002424f, 0.003101f, 0.004093f,
- 0.004887f, 0.005989f, 0.007751f, 0.008606f, 0.011002f, 0.013420f, 0.016251f, 0.020035f,
- 0.024628f, 0.030579f, 0.039093f, 0.049255f, 0.063599f, 0.083191f, 0.109924f, 0.148071f,
- 0.200928f, 0.270996f, 0.359863f, 0.461670f, 0.564453f, 0.656738f, 0.732910f, 0.791992f,
- 0.836426f, 0.869629f, 0.894531f, 0.913086f, 0.928223f, 0.939453f, 0.949219f, 0.956055f,
- 0.961914f, 0.966797f, 0.970703f, 0.975098f, 0.977051f, 0.979492f, 0.982422f, 0.983887f,
- 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f,
- 0.993652f, 0.994629f, 0.998047f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.998535f,
- 0.000242f, 0.000650f, 0.000847f, 0.001138f, 0.001621f, 0.002239f, 0.002527f, 0.003325f,
- 0.004227f, 0.005165f, 0.006462f, 0.007389f, 0.008904f, 0.011024f, 0.013130f, 0.015915f,
- 0.019272f, 0.023819f, 0.029205f, 0.036652f, 0.046417f, 0.059418f, 0.077209f, 0.101562f,
- 0.136230f, 0.183350f, 0.248047f, 0.331055f, 0.429688f, 0.533203f, 0.630859f, 0.711426f,
- 0.776367f, 0.824219f, 0.861328f, 0.887695f, 0.908691f, 0.924805f, 0.937500f, 0.946777f,
- 0.954102f, 0.960938f, 0.966309f, 0.970215f, 0.974121f, 0.977539f, 0.979492f, 0.981934f,
- 0.983887f, 0.985840f, 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992676f,
- 0.993164f, 0.994141f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000089f, 0.000243f, 0.000827f, 0.000964f, 0.001418f, 0.001579f, 0.002296f, 0.002914f,
- 0.003632f, 0.004280f, 0.005344f, 0.006130f, 0.007545f, 0.008949f, 0.010498f, 0.012733f,
- 0.015686f, 0.018646f, 0.023010f, 0.028229f, 0.034851f, 0.044098f, 0.056122f, 0.072388f,
- 0.094788f, 0.125610f, 0.168945f, 0.228271f, 0.306396f, 0.401123f, 0.504883f, 0.604492f,
- 0.691895f, 0.760742f, 0.813477f, 0.853027f, 0.881836f, 0.904297f, 0.921387f, 0.934570f,
- 0.944824f, 0.953125f, 0.959961f, 0.964844f, 0.969727f, 0.973633f, 0.976562f, 0.979492f,
- 0.981934f, 0.983887f, 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.991211f, 0.992188f,
- 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000069f, 0.000461f, 0.000609f, 0.000933f, 0.001088f, 0.001488f, 0.001900f, 0.002378f,
- 0.003101f, 0.003687f, 0.004547f, 0.005276f, 0.006233f, 0.007282f, 0.008820f, 0.010239f,
- 0.012581f, 0.015312f, 0.018341f, 0.022095f, 0.027344f, 0.034027f, 0.041687f, 0.053467f,
- 0.067810f, 0.088440f, 0.117126f, 0.156616f, 0.211426f, 0.284180f, 0.375977f, 0.478760f,
- 0.581543f, 0.672363f, 0.746094f, 0.802734f, 0.845703f, 0.877441f, 0.900879f, 0.918457f,
- 0.933105f, 0.943848f, 0.951660f, 0.959473f, 0.964355f, 0.968750f, 0.974121f, 0.977051f,
- 0.979492f, 0.982422f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.990234f, 0.991211f,
- 0.992188f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000244f, 0.000348f, 0.000606f, 0.000737f, 0.001079f, 0.001458f, 0.001783f, 0.002192f,
- 0.002924f, 0.003231f, 0.003862f, 0.004551f, 0.005169f, 0.006367f, 0.007381f, 0.008682f,
- 0.010590f, 0.012199f, 0.014900f, 0.017761f, 0.021530f, 0.026108f, 0.032349f, 0.039642f,
- 0.050446f, 0.064392f, 0.083313f, 0.109436f, 0.145996f, 0.197021f, 0.266357f, 0.354248f,
- 0.455811f, 0.560059f, 0.654785f, 0.732910f, 0.793457f, 0.837891f, 0.873047f, 0.897461f,
- 0.917480f, 0.931641f, 0.941895f, 0.951172f, 0.958984f, 0.964844f, 0.969727f, 0.973633f,
- 0.977051f, 0.979980f, 0.981934f, 0.984375f, 0.985840f, 0.988281f, 0.989258f, 0.990234f,
- 0.991211f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000244f, 0.000520f, 0.000592f, 0.000720f, 0.000812f, 0.001174f, 0.001500f, 0.001884f,
- 0.002178f, 0.002831f, 0.003321f, 0.003885f, 0.004471f, 0.005436f, 0.006275f, 0.007584f,
- 0.008675f, 0.010521f, 0.012238f, 0.014557f, 0.017197f, 0.020874f, 0.025467f, 0.030960f,
- 0.038208f, 0.047821f, 0.061249f, 0.078552f, 0.103149f, 0.136841f, 0.184937f, 0.249878f,
- 0.334473f, 0.435059f, 0.539551f, 0.638184f, 0.720215f, 0.784668f, 0.832031f, 0.868164f,
- 0.894531f, 0.914062f, 0.929688f, 0.942383f, 0.950684f, 0.958984f, 0.964844f, 0.970215f,
- 0.974121f, 0.977539f, 0.979980f, 0.982422f, 0.984863f, 0.985840f, 0.988281f, 0.989258f,
- 0.990723f, 0.992188f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.997559f,
- 0.000000f, 0.000243f, 0.000351f, 0.000603f, 0.000708f, 0.001079f, 0.001493f, 0.001752f,
- 0.001936f, 0.002171f, 0.002911f, 0.003382f, 0.003906f, 0.004578f, 0.005222f, 0.006161f,
- 0.007362f, 0.008850f, 0.010010f, 0.011971f, 0.014145f, 0.016983f, 0.020477f, 0.024582f,
- 0.029739f, 0.036804f, 0.045837f, 0.057648f, 0.074829f, 0.097534f, 0.130127f, 0.174438f,
- 0.236572f, 0.318604f, 0.416992f, 0.523926f, 0.624023f, 0.709961f, 0.777344f, 0.827148f,
- 0.865234f, 0.893066f, 0.914062f, 0.929688f, 0.941406f, 0.951660f, 0.958496f, 0.965820f,
- 0.969238f, 0.974609f, 0.977539f, 0.980469f, 0.983398f, 0.985352f, 0.986816f, 0.988281f,
- 0.989746f, 0.990723f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000243f, 0.000244f, 0.000456f, 0.000592f, 0.000602f, 0.001025f, 0.001282f, 0.001656f,
- 0.001856f, 0.002073f, 0.002535f, 0.002768f, 0.003487f, 0.003822f, 0.004574f, 0.005589f,
- 0.006519f, 0.007336f, 0.008453f, 0.009911f, 0.011581f, 0.013985f, 0.016373f, 0.019638f,
- 0.023819f, 0.028473f, 0.035339f, 0.043945f, 0.055939f, 0.071350f, 0.093140f, 0.123474f,
- 0.165771f, 0.225342f, 0.304199f, 0.402344f, 0.509277f, 0.612305f, 0.702148f, 0.771973f,
- 0.824219f, 0.863281f, 0.891113f, 0.913086f, 0.930176f, 0.942383f, 0.951660f, 0.959473f,
- 0.965820f, 0.970215f, 0.974609f, 0.977539f, 0.980957f, 0.983887f, 0.985352f, 0.987305f,
- 0.988770f, 0.990723f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000000f, 0.000243f, 0.000276f, 0.000557f, 0.000594f, 0.000849f, 0.000845f, 0.001282f,
- 0.001520f, 0.001774f, 0.002119f, 0.002499f, 0.002840f, 0.003252f, 0.004005f, 0.004555f,
- 0.005245f, 0.006168f, 0.007233f, 0.008301f, 0.009911f, 0.011330f, 0.013748f, 0.015945f,
- 0.019089f, 0.023071f, 0.027786f, 0.034058f, 0.042542f, 0.053619f, 0.068237f, 0.089539f,
- 0.117798f, 0.158325f, 0.215698f, 0.293213f, 0.389893f, 0.498291f, 0.603027f, 0.694824f,
- 0.767090f, 0.821777f, 0.862305f, 0.891113f, 0.914062f, 0.930176f, 0.942383f, 0.952148f,
- 0.959473f, 0.965820f, 0.971680f, 0.975098f, 0.978516f, 0.981445f, 0.983887f, 0.985840f,
- 0.988281f, 0.989258f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996094f, 0.996582f,
- 0.000240f, 0.000240f, 0.000242f, 0.000365f, 0.000678f, 0.000779f, 0.000957f, 0.001003f,
- 0.001390f, 0.001656f, 0.001828f, 0.002274f, 0.002455f, 0.003210f, 0.003704f, 0.004097f,
- 0.004616f, 0.005409f, 0.006180f, 0.007092f, 0.008453f, 0.009521f, 0.011154f, 0.013397f,
- 0.015656f, 0.018509f, 0.022247f, 0.026810f, 0.032928f, 0.041046f, 0.051727f, 0.065613f,
- 0.085205f, 0.113098f, 0.152832f, 0.208496f, 0.284424f, 0.380371f, 0.489258f, 0.596680f,
- 0.690918f, 0.764648f, 0.821777f, 0.862305f, 0.892578f, 0.914551f, 0.931152f, 0.943848f,
- 0.953613f, 0.960938f, 0.967773f, 0.971680f, 0.976074f, 0.979492f, 0.982422f, 0.984863f,
- 0.986816f, 0.988281f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f,
- 0.000000f, 0.000242f, 0.000242f, 0.000364f, 0.000465f, 0.000803f, 0.000927f, 0.000956f,
- 0.001275f, 0.001335f, 0.001570f, 0.001968f, 0.002184f, 0.002726f, 0.003069f, 0.003294f,
- 0.003906f, 0.004662f, 0.005245f, 0.006027f, 0.007191f, 0.008202f, 0.009460f, 0.010735f,
- 0.012970f, 0.015404f, 0.018051f, 0.021484f, 0.026321f, 0.032135f, 0.039581f, 0.049805f,
- 0.063538f, 0.082458f, 0.109497f, 0.147827f, 0.202393f, 0.277344f, 0.373535f, 0.483887f,
- 0.593262f, 0.688477f, 0.764648f, 0.821289f, 0.863281f, 0.894043f, 0.916016f, 0.932129f,
- 0.944336f, 0.954590f, 0.962402f, 0.968262f, 0.973633f, 0.977051f, 0.980957f, 0.983398f,
- 0.985352f, 0.987793f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996582f,
- 0.000000f, 0.000239f, 0.000360f, 0.000362f, 0.000363f, 0.000475f, 0.000767f, 0.000931f,
- 0.000951f, 0.001211f, 0.001491f, 0.001634f, 0.002129f, 0.002457f, 0.002678f, 0.002995f,
- 0.003393f, 0.003922f, 0.004711f, 0.005135f, 0.005955f, 0.006935f, 0.008072f, 0.009270f,
- 0.010841f, 0.012558f, 0.014618f, 0.017502f, 0.020828f, 0.025269f, 0.030884f, 0.038269f,
- 0.048218f, 0.061554f, 0.080505f, 0.106567f, 0.144287f, 0.197998f, 0.272705f, 0.369141f,
- 0.480469f, 0.591797f, 0.690430f, 0.767090f, 0.824707f, 0.866699f, 0.896484f, 0.918457f,
- 0.934570f, 0.946777f, 0.956543f, 0.963379f, 0.969727f, 0.974609f, 0.978027f, 0.981934f,
- 0.984375f, 0.986328f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f,
- 0.000000f, 0.000208f, 0.000238f, 0.000362f, 0.000363f, 0.000555f, 0.000600f, 0.000888f,
- 0.001140f, 0.001140f, 0.001272f, 0.001661f, 0.001811f, 0.002041f, 0.002550f, 0.002636f,
- 0.002941f, 0.003492f, 0.004032f, 0.004593f, 0.005062f, 0.005875f, 0.007015f, 0.007965f,
- 0.009079f, 0.010300f, 0.012291f, 0.014229f, 0.016937f, 0.020248f, 0.024689f, 0.030151f,
- 0.037354f, 0.047028f, 0.060211f, 0.078491f, 0.104431f, 0.141602f, 0.195068f, 0.270264f,
- 0.367676f, 0.480957f, 0.594238f, 0.693848f, 0.770996f, 0.828613f, 0.869629f, 0.898438f,
- 0.921875f, 0.937012f, 0.949219f, 0.958008f, 0.964844f, 0.971680f, 0.976074f, 0.979980f,
- 0.982422f, 0.985840f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.995117f, 0.995117f,
- 0.000000f, 0.000000f, 0.000229f, 0.000358f, 0.000479f, 0.000362f, 0.000498f, 0.000634f,
- 0.000836f, 0.000927f, 0.001288f, 0.001244f, 0.001605f, 0.001732f, 0.002106f, 0.002478f,
- 0.002613f, 0.003183f, 0.003510f, 0.004021f, 0.004528f, 0.005047f, 0.005768f, 0.006859f,
- 0.007759f, 0.008865f, 0.009933f, 0.011742f, 0.013741f, 0.016678f, 0.019897f, 0.024017f,
- 0.029297f, 0.036469f, 0.045990f, 0.058990f, 0.077026f, 0.102722f, 0.140015f, 0.193604f,
- 0.269531f, 0.369141f, 0.485107f, 0.600098f, 0.700195f, 0.777344f, 0.833984f, 0.873535f,
- 0.903809f, 0.924316f, 0.940430f, 0.951172f, 0.960938f, 0.968262f, 0.973145f, 0.978027f,
- 0.980957f, 0.983887f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995117f,
- 0.000000f, 0.000000f, 0.000078f, 0.000353f, 0.000354f, 0.000360f, 0.000482f, 0.000573f,
- 0.000757f, 0.000923f, 0.001230f, 0.001266f, 0.001485f, 0.001679f, 0.001963f, 0.002161f,
- 0.002235f, 0.002739f, 0.003115f, 0.003563f, 0.003933f, 0.004436f, 0.004917f, 0.005623f,
- 0.006599f, 0.007469f, 0.008484f, 0.010101f, 0.011665f, 0.013695f, 0.016403f, 0.019531f,
- 0.023300f, 0.028870f, 0.035889f, 0.045135f, 0.058014f, 0.075928f, 0.101746f, 0.139160f,
- 0.193848f, 0.271729f, 0.374023f, 0.492920f, 0.609863f, 0.709473f, 0.786133f, 0.842285f,
- 0.880859f, 0.908691f, 0.928711f, 0.943848f, 0.954102f, 0.963867f, 0.969727f, 0.975098f,
- 0.979004f, 0.982422f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994629f,
- 0.000000f, 0.000000f, 0.000000f, 0.000330f, 0.000336f, 0.000352f, 0.000478f, 0.000481f,
- 0.000676f, 0.000822f, 0.001072f, 0.001228f, 0.001283f, 0.001417f, 0.001621f, 0.001938f,
- 0.001953f, 0.002377f, 0.002737f, 0.002914f, 0.003624f, 0.003721f, 0.004555f, 0.004845f,
- 0.005531f, 0.006325f, 0.007244f, 0.008255f, 0.009911f, 0.011467f, 0.013496f, 0.016068f,
- 0.018951f, 0.022888f, 0.028183f, 0.035126f, 0.044617f, 0.057220f, 0.075134f, 0.101501f,
- 0.139526f, 0.195679f, 0.276123f, 0.381592f, 0.503418f, 0.622070f, 0.721680f, 0.796387f,
- 0.850098f, 0.887207f, 0.914551f, 0.933594f, 0.947266f, 0.957520f, 0.966797f, 0.972656f,
- 0.977539f, 0.980957f, 0.993164f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, 0.994141f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000243f, 0.000466f, 0.000474f, 0.000475f,
- 0.000600f, 0.000740f, 0.000796f, 0.001130f, 0.001333f, 0.001339f, 0.001440f, 0.001575f,
- 0.001961f, 0.002031f, 0.002388f, 0.002563f, 0.003174f, 0.003345f, 0.003555f, 0.004143f,
- 0.004681f, 0.005333f, 0.006191f, 0.007111f, 0.008278f, 0.009666f, 0.011177f, 0.013451f,
- 0.015511f, 0.018707f, 0.022629f, 0.027847f, 0.034515f, 0.043976f, 0.056671f, 0.075012f,
- 0.101685f, 0.140869f, 0.199341f, 0.282959f, 0.393311f, 0.519043f, 0.639160f, 0.736328f,
- 0.809082f, 0.860352f, 0.896484f, 0.920898f, 0.939453f, 0.951660f, 0.961914f, 0.969238f,
- 0.975098f, 0.979492f, 0.993164f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.993652f,
- 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000120f, 0.000367f, 0.000448f, 0.000589f,
- 0.000595f, 0.000719f, 0.000707f, 0.000809f, 0.000966f, 0.001217f, 0.001369f, 0.001405f,
- 0.001579f, 0.001786f, 0.002100f, 0.002260f, 0.002600f, 0.002762f, 0.003023f, 0.003531f,
- 0.004219f, 0.004810f, 0.005409f, 0.006092f, 0.007053f, 0.008064f, 0.009163f, 0.010941f,
- 0.012733f, 0.015251f, 0.018280f, 0.022202f, 0.027573f, 0.034271f, 0.043732f, 0.056458f,
- 0.075134f, 0.102661f, 0.143433f, 0.205078f, 0.293701f, 0.409668f, 0.538574f, 0.658203f,
- 0.753418f, 0.823242f, 0.870605f, 0.905273f, 0.927734f, 0.943848f, 0.956055f, 0.964844f,
- 0.972168f, 0.977539f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.993164f, 0.992676f,
- 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000224f, 0.000231f, 0.000314f, 0.000562f,
- 0.000589f, 0.000699f, 0.000717f, 0.000776f, 0.000926f, 0.000968f, 0.001242f, 0.001360f,
- 0.001487f, 0.001564f, 0.001713f, 0.002073f, 0.002169f, 0.002380f, 0.002941f, 0.003229f,
- 0.003534f, 0.003914f, 0.004509f, 0.005127f, 0.005939f, 0.006596f, 0.007812f, 0.009354f,
- 0.010559f, 0.012581f, 0.015007f, 0.018021f, 0.022079f, 0.027191f, 0.034119f, 0.043427f,
- 0.057190f, 0.075623f, 0.104492f, 0.147949f, 0.213135f, 0.308105f, 0.430664f, 0.562500f,
- 0.681641f, 0.772949f, 0.839355f, 0.884277f, 0.913574f, 0.934570f, 0.950195f, 0.961426f,
- 0.969238f, 0.975098f, 0.991211f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992188f,
- 0.000000f, 0.000000f, 0.000000f, 0.000084f, 0.000117f, 0.000119f, 0.000367f, 0.000473f,
- 0.000555f, 0.000576f, 0.000674f, 0.000713f, 0.000816f, 0.000913f, 0.001049f, 0.001168f,
- 0.001263f, 0.001473f, 0.001580f, 0.001781f, 0.002005f, 0.002123f, 0.002316f, 0.002674f,
- 0.003094f, 0.003475f, 0.003967f, 0.004318f, 0.004833f, 0.005798f, 0.006699f, 0.007801f,
- 0.008888f, 0.010429f, 0.012268f, 0.014824f, 0.017792f, 0.021790f, 0.026978f, 0.033844f,
- 0.043518f, 0.057068f, 0.077148f, 0.107605f, 0.154053f, 0.224609f, 0.326904f, 0.456543f,
- 0.591797f, 0.708984f, 0.795410f, 0.855957f, 0.895508f, 0.923340f, 0.942383f, 0.955566f,
- 0.965332f, 0.973145f, 0.991211f, 0.991699f, 0.992188f, 0.992188f, 0.992188f, 0.991699f,
- 0.000000f, 0.000000f, 0.000000f, 0.000092f, 0.000070f, 0.000236f, 0.000119f, 0.000376f,
- 0.000433f, 0.000561f, 0.000688f, 0.000586f, 0.000742f, 0.000842f, 0.000881f, 0.000937f,
- 0.001141f, 0.001300f, 0.001434f, 0.001464f, 0.001598f, 0.001829f, 0.002062f, 0.002338f,
- 0.002583f, 0.003036f, 0.003460f, 0.003704f, 0.004383f, 0.004986f, 0.005615f, 0.006439f,
- 0.007267f, 0.008797f, 0.010330f, 0.012146f, 0.014473f, 0.017532f, 0.021622f, 0.026535f,
- 0.033539f, 0.043579f, 0.058044f, 0.079041f, 0.111572f, 0.162109f, 0.239746f, 0.350830f,
- 0.488770f, 0.625000f, 0.737305f, 0.817871f, 0.871582f, 0.908203f, 0.932129f, 0.949219f,
- 0.961914f, 0.970215f, 0.990234f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f,
- 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000100f, 0.000115f, 0.000335f, 0.000350f,
- 0.000355f, 0.000473f, 0.000633f, 0.000678f, 0.000695f, 0.000694f, 0.000812f, 0.000733f,
- 0.001109f, 0.001098f, 0.001260f, 0.001452f, 0.001377f, 0.001534f, 0.001972f, 0.001982f,
- 0.002232f, 0.002567f, 0.002764f, 0.003273f, 0.003542f, 0.004181f, 0.004738f, 0.005466f,
- 0.006268f, 0.007126f, 0.008614f, 0.010170f, 0.012093f, 0.014359f, 0.017075f, 0.021042f,
- 0.026459f, 0.033722f, 0.044159f, 0.059113f, 0.082092f, 0.117249f, 0.173218f, 0.259766f,
- 0.382080f, 0.526367f, 0.662598f, 0.768066f, 0.840332f, 0.889648f, 0.920410f, 0.940918f,
- 0.956543f, 0.966309f, 0.989746f, 0.990234f, 0.990723f, 0.990723f, 0.990723f, 0.990723f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000191f, 0.000236f, 0.000335f,
- 0.000337f, 0.000466f, 0.000399f, 0.000608f, 0.000626f, 0.000669f, 0.000696f, 0.000808f,
- 0.000859f, 0.000915f, 0.000903f, 0.001168f, 0.001245f, 0.001500f, 0.001525f, 0.001863f,
- 0.001941f, 0.002121f, 0.002399f, 0.002861f, 0.002953f, 0.003632f, 0.004105f, 0.004745f,
- 0.005333f, 0.006317f, 0.007236f, 0.008255f, 0.009857f, 0.011414f, 0.014015f, 0.016922f,
- 0.020828f, 0.026321f, 0.034149f, 0.044861f, 0.061279f, 0.085571f, 0.124878f, 0.187866f,
- 0.285645f, 0.420654f, 0.570801f, 0.703125f, 0.799805f, 0.864258f, 0.905273f, 0.932129f,
- 0.950684f, 0.963379f, 0.988770f, 0.989258f, 0.989746f, 0.989746f, 0.989746f, 0.989746f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000125f, 0.000232f,
- 0.000360f, 0.000342f, 0.000463f, 0.000388f, 0.000569f, 0.000638f, 0.000671f, 0.000791f,
- 0.000774f, 0.000943f, 0.000774f, 0.001018f, 0.001044f, 0.001245f, 0.001377f, 0.001410f,
- 0.001643f, 0.001970f, 0.002041f, 0.002316f, 0.002758f, 0.003023f, 0.003433f, 0.003859f,
- 0.004444f, 0.005180f, 0.006134f, 0.006920f, 0.008102f, 0.009354f, 0.011475f, 0.013649f,
- 0.016739f, 0.021011f, 0.026566f, 0.034454f, 0.046051f, 0.063843f, 0.090942f, 0.135498f,
- 0.207642f, 0.319580f, 0.467529f, 0.620605f, 0.745605f, 0.830566f, 0.886230f, 0.920898f,
- 0.943848f, 0.958984f, 0.987793f, 0.988281f, 0.988770f, 0.988770f, 0.988281f, 0.988770f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000188f, 0.000200f,
- 0.000332f, 0.000417f, 0.000338f, 0.000459f, 0.000349f, 0.000558f, 0.000642f, 0.000636f,
- 0.000629f, 0.000807f, 0.000695f, 0.000747f, 0.000827f, 0.001058f, 0.001182f, 0.001269f,
- 0.001422f, 0.001472f, 0.001921f, 0.002100f, 0.002337f, 0.002462f, 0.003073f, 0.003374f,
- 0.003708f, 0.004265f, 0.004826f, 0.005646f, 0.006596f, 0.007710f, 0.008926f, 0.011063f,
- 0.013580f, 0.016495f, 0.020737f, 0.026459f, 0.035126f, 0.047791f, 0.066833f, 0.097778f,
- 0.149170f, 0.233887f, 0.363037f, 0.523438f, 0.674805f, 0.788086f, 0.860352f, 0.906250f,
- 0.935547f, 0.954102f, 0.986328f, 0.987305f, 0.987305f, 0.987305f, 0.987305f, 0.987793f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000175f,
- 0.000155f, 0.000319f, 0.000241f, 0.000318f, 0.000455f, 0.000462f, 0.000496f, 0.000593f,
- 0.000516f, 0.000564f, 0.000667f, 0.000668f, 0.000715f, 0.000749f, 0.000925f, 0.001111f,
- 0.001246f, 0.001381f, 0.001443f, 0.001856f, 0.001997f, 0.002264f, 0.002363f, 0.002880f,
- 0.003212f, 0.003727f, 0.004208f, 0.004673f, 0.005394f, 0.006367f, 0.007404f, 0.009003f,
- 0.010651f, 0.013138f, 0.016312f, 0.020767f, 0.027054f, 0.036377f, 0.050262f, 0.071655f,
- 0.107361f, 0.167969f, 0.269287f, 0.418457f, 0.587402f, 0.730957f, 0.828125f, 0.888184f,
- 0.924805f, 0.948242f, 0.984863f, 0.986328f, 0.986328f, 0.985840f, 0.986328f, 0.986328f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000202f, 0.000133f, 0.000215f, 0.000263f, 0.000304f, 0.000442f, 0.000332f, 0.000365f,
- 0.000403f, 0.000549f, 0.000607f, 0.000750f, 0.000788f, 0.000802f, 0.000841f, 0.000958f,
- 0.001049f, 0.001188f, 0.001354f, 0.001318f, 0.001582f, 0.001928f, 0.002064f, 0.002321f,
- 0.002594f, 0.003042f, 0.003222f, 0.003796f, 0.004440f, 0.005112f, 0.006081f, 0.007259f,
- 0.008736f, 0.010612f, 0.013077f, 0.016464f, 0.020950f, 0.027664f, 0.037506f, 0.052795f,
- 0.077698f, 0.120361f, 0.194336f, 0.317627f, 0.486572f, 0.657227f, 0.785156f, 0.865234f,
- 0.913086f, 0.942871f, 0.983887f, 0.984863f, 0.984375f, 0.984863f, 0.984375f, 0.984863f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000122f, 0.000152f, 0.000257f, 0.000243f, 0.000288f, 0.000345f, 0.000228f,
- 0.000358f, 0.000363f, 0.000432f, 0.000494f, 0.000530f, 0.000582f, 0.000762f, 0.000771f,
- 0.000913f, 0.000978f, 0.001100f, 0.001305f, 0.001373f, 0.001706f, 0.001712f, 0.001922f,
- 0.002155f, 0.002569f, 0.002573f, 0.003094f, 0.003401f, 0.004272f, 0.004978f, 0.005829f,
- 0.006924f, 0.008453f, 0.010452f, 0.012871f, 0.016617f, 0.021072f, 0.028427f, 0.039429f,
- 0.056732f, 0.086243f, 0.138916f, 0.231812f, 0.381592f, 0.566406f, 0.726562f, 0.833496f,
- 0.896973f, 0.933594f, 0.981934f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, 0.982910f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f,
- 0.000122f, 0.000121f, 0.000127f, 0.000215f, 0.000159f, 0.000233f, 0.000284f, 0.000326f,
- 0.000339f, 0.000339f, 0.000352f, 0.000394f, 0.000623f, 0.000622f, 0.000731f, 0.000730f,
- 0.000741f, 0.000829f, 0.000914f, 0.001017f, 0.001151f, 0.001469f, 0.001263f, 0.001480f,
- 0.001740f, 0.002069f, 0.002104f, 0.002443f, 0.002831f, 0.003519f, 0.003929f, 0.004627f,
- 0.005455f, 0.006634f, 0.008316f, 0.009949f, 0.012596f, 0.016495f, 0.021729f, 0.029877f,
- 0.042084f, 0.062805f, 0.098694f, 0.165283f, 0.284668f, 0.465088f, 0.654297f, 0.793945f,
- 0.877930f, 0.924805f, 0.979980f, 0.980957f, 0.980957f, 0.981445f, 0.981445f, 0.980957f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000121f,
- 0.000121f, 0.000121f, 0.000150f, 0.000163f, 0.000069f, 0.000057f, 0.000121f, 0.000231f,
- 0.000291f, 0.000304f, 0.000334f, 0.000339f, 0.000346f, 0.000569f, 0.000648f, 0.000674f,
- 0.000649f, 0.000697f, 0.000772f, 0.000834f, 0.000972f, 0.001005f, 0.001189f, 0.001359f,
- 0.001237f, 0.001567f, 0.001794f, 0.001963f, 0.002378f, 0.002712f, 0.002867f, 0.003853f,
- 0.004330f, 0.005196f, 0.006516f, 0.008026f, 0.009888f, 0.012703f, 0.016479f, 0.022110f,
- 0.031158f, 0.045746f, 0.070557f, 0.117004f, 0.204956f, 0.360596f, 0.564453f, 0.740723f,
- 0.852051f, 0.912598f, 0.977539f, 0.979492f, 0.979492f, 0.979004f, 0.979492f, 0.979004f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000098f, 0.000082f, 0.000067f, 0.000056f, 0.000124f,
- 0.000193f, 0.000240f, 0.000258f, 0.000310f, 0.000326f, 0.000335f, 0.000341f, 0.000471f,
- 0.000613f, 0.000494f, 0.000716f, 0.000742f, 0.000804f, 0.000873f, 0.000832f, 0.001070f,
- 0.001120f, 0.001146f, 0.001225f, 0.001696f, 0.001814f, 0.002041f, 0.002419f, 0.002941f,
- 0.003433f, 0.004154f, 0.004818f, 0.006077f, 0.007652f, 0.009521f, 0.012444f, 0.017029f,
- 0.023193f, 0.033539f, 0.050690f, 0.082092f, 0.144043f, 0.265869f, 0.463379f, 0.672363f,
- 0.818848f, 0.898438f, 0.975586f, 0.976562f, 0.976562f, 0.976562f, 0.976074f, 0.976562f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000114f, 0.000096f, 0.000079f, 0.000125f, 0.000056f,
- 0.000142f, 0.000120f, 0.000195f, 0.000246f, 0.000321f, 0.000305f, 0.000319f, 0.000395f,
- 0.000442f, 0.000540f, 0.000642f, 0.000638f, 0.000696f, 0.000674f, 0.000687f, 0.000857f,
- 0.000955f, 0.001128f, 0.001224f, 0.001364f, 0.001347f, 0.001555f, 0.001910f, 0.002245f,
- 0.002714f, 0.003229f, 0.003824f, 0.004673f, 0.005676f, 0.007225f, 0.009293f, 0.012802f,
- 0.017273f, 0.024368f, 0.036682f, 0.058075f, 0.100952f, 0.188721f, 0.358154f, 0.587891f,
- 0.775879f, 0.881348f, 0.972168f, 0.972656f, 0.972656f, 0.973145f, 0.973145f, 0.973633f,
- 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000112f, 0.000093f, 0.000079f, 0.000067f,
- 0.000057f, 0.000049f, 0.000133f, 0.000137f, 0.000163f, 0.000244f, 0.000328f, 0.000366f,
- 0.000356f, 0.000415f, 0.000436f, 0.000543f, 0.000555f, 0.000638f, 0.000597f, 0.000702f,
- 0.000786f, 0.000648f, 0.000891f, 0.000804f, 0.001218f, 0.001070f, 0.001355f, 0.001731f,
- 0.002171f, 0.002352f, 0.002796f, 0.003546f, 0.004189f, 0.005558f, 0.006939f, 0.009209f,
- 0.012337f, 0.017776f, 0.026016f, 0.040833f, 0.069946f, 0.130981f, 0.262207f, 0.489258f,
- 0.719238f, 0.859375f, 0.968262f, 0.969238f, 0.969727f, 0.969727f, 0.969727f, 0.969727f,
- 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000110f, 0.000093f, 0.000080f,
- 0.000068f, 0.000094f, 0.000119f, 0.000117f, 0.000120f, 0.000123f, 0.000173f, 0.000263f,
- 0.000263f, 0.000359f, 0.000386f, 0.000390f, 0.000401f, 0.000556f, 0.000549f, 0.000573f,
- 0.000502f, 0.000707f, 0.000789f, 0.000629f, 0.000847f, 0.001003f, 0.001024f, 0.001242f,
- 0.001423f, 0.001877f, 0.002012f, 0.002571f, 0.003071f, 0.003925f, 0.005131f, 0.006767f,
- 0.009140f, 0.012672f, 0.018509f, 0.028992f, 0.048309f, 0.089233f, 0.183838f, 0.383545f,
- 0.646973f, 0.830078f, 0.963867f, 0.964844f, 0.964844f, 0.965820f, 0.965820f, 0.965820f,
- 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000113f, 0.000095f,
- 0.000083f, 0.000070f, 0.000061f, 0.000054f, 0.000048f, 0.000042f, 0.000115f, 0.000112f,
- 0.000151f, 0.000213f, 0.000309f, 0.000298f, 0.000359f, 0.000337f, 0.000382f, 0.000440f,
- 0.000576f, 0.000477f, 0.000453f, 0.000690f, 0.000687f, 0.000795f, 0.000776f, 0.000911f,
- 0.001117f, 0.001119f, 0.001352f, 0.002001f, 0.002140f, 0.002832f, 0.003609f, 0.004715f,
- 0.006302f, 0.008835f, 0.013115f, 0.020004f, 0.032867f, 0.060333f, 0.124512f, 0.281982f,
- 0.557617f, 0.794434f, 0.959473f, 0.959961f, 0.960449f, 0.960449f, 0.960449f, 0.959961f,
- 0.000122f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f,
- 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, 0.000118f, 0.000116f,
- 0.000098f, 0.000087f, 0.000076f, 0.000065f, 0.000057f, 0.000050f, 0.000045f, 0.000091f,
- 0.000074f, 0.000106f, 0.000185f, 0.000193f, 0.000228f, 0.000328f, 0.000323f, 0.000399f,
- 0.000429f, 0.000498f, 0.000552f, 0.000432f, 0.000542f, 0.000592f, 0.000599f, 0.000729f,
- 0.000734f, 0.000885f, 0.001304f, 0.001273f, 0.001756f, 0.001931f, 0.002445f, 0.003120f,
- 0.004456f, 0.006165f, 0.008751f, 0.013466f, 0.022141f, 0.040192f, 0.082397f, 0.195679f,
- 0.455322f, 0.745117f, 0.952637f, 0.953613f, 0.953613f, 0.954102f, 0.952637f, 0.953613f,
- 0.000000f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f,
- 0.000118f, 0.000118f, 0.000118f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000117f,
- 0.000117f, 0.000104f, 0.000092f, 0.000079f, 0.000071f, 0.000062f, 0.000055f, 0.000049f,
- 0.000044f, 0.000039f, 0.000099f, 0.000106f, 0.000158f, 0.000169f, 0.000241f, 0.000274f,
- 0.000293f, 0.000389f, 0.000360f, 0.000399f, 0.000387f, 0.000446f, 0.000401f, 0.000530f,
- 0.000565f, 0.000691f, 0.000722f, 0.000848f, 0.001147f, 0.001418f, 0.001677f, 0.002087f,
- 0.002972f, 0.004169f, 0.005623f, 0.008835f, 0.014404f, 0.026077f, 0.053467f, 0.129395f,
- 0.346924f, 0.685059f, 0.943848f, 0.945801f, 0.945801f, 0.945312f, 0.945801f, 0.945801f,
- 0.000000f, 0.000000f, 0.000117f, 0.000116f, 0.000117f, 0.000117f, 0.000116f, 0.000116f,
- 0.000115f, 0.000116f, 0.000115f, 0.000116f, 0.000115f, 0.000115f, 0.000115f, 0.000115f,
- 0.000115f, 0.000115f, 0.000110f, 0.000097f, 0.000086f, 0.000077f, 0.000067f, 0.000060f,
- 0.000053f, 0.000048f, 0.000043f, 0.000061f, 0.000090f, 0.000083f, 0.000139f, 0.000139f,
- 0.000216f, 0.000254f, 0.000307f, 0.000358f, 0.000269f, 0.000377f, 0.000324f, 0.000369f,
- 0.000405f, 0.000455f, 0.000524f, 0.000706f, 0.000701f, 0.001012f, 0.001206f, 0.001316f,
- 0.001663f, 0.002350f, 0.003571f, 0.005505f, 0.008873f, 0.016006f, 0.033234f, 0.081848f,
- 0.244751f, 0.605469f, 0.934082f, 0.935059f, 0.936035f, 0.935547f, 0.935547f, 0.935547f,
- 0.000105f, 0.000114f, 0.000113f, 0.000113f, 0.000111f, 0.000111f, 0.000112f, 0.000111f,
- 0.000112f, 0.000112f, 0.000112f, 0.000112f, 0.000111f, 0.000112f, 0.000112f, 0.000112f,
- 0.000112f, 0.000112f, 0.000112f, 0.000112f, 0.000105f, 0.000093f, 0.000083f, 0.000074f,
- 0.000066f, 0.000059f, 0.000053f, 0.000048f, 0.000043f, 0.000062f, 0.000052f, 0.000063f,
- 0.000092f, 0.000146f, 0.000176f, 0.000216f, 0.000227f, 0.000263f, 0.000244f, 0.000267f,
- 0.000370f, 0.000326f, 0.000360f, 0.000391f, 0.000505f, 0.000618f, 0.000726f, 0.000969f,
- 0.001117f, 0.001651f, 0.002131f, 0.003090f, 0.005188f, 0.009499f, 0.019836f, 0.049042f,
- 0.159180f, 0.509766f, 0.921875f, 0.922852f, 0.922852f, 0.922363f, 0.923340f, 0.922852f,
- 0.000000f, 0.000000f, 0.000065f, 0.000098f, 0.000096f, 0.000101f, 0.000100f, 0.000104f,
- 0.000104f, 0.000103f, 0.000106f, 0.000106f, 0.000106f, 0.000105f, 0.000107f, 0.000107f,
- 0.000106f, 0.000107f, 0.000107f, 0.000108f, 0.000107f, 0.000108f, 0.000104f, 0.000092f,
- 0.000082f, 0.000075f, 0.000067f, 0.000059f, 0.000054f, 0.000048f, 0.000044f, 0.000039f,
- 0.000037f, 0.000058f, 0.000066f, 0.000122f, 0.000137f, 0.000175f, 0.000208f, 0.000194f,
- 0.000208f, 0.000240f, 0.000270f, 0.000281f, 0.000323f, 0.000364f, 0.000479f, 0.000591f,
- 0.000712f, 0.000986f, 0.001224f, 0.001896f, 0.002996f, 0.005196f, 0.010506f, 0.027527f,
- 0.095581f, 0.399658f, 0.905762f, 0.906738f, 0.906250f, 0.905762f, 0.905762f, 0.907227f,
- 0.000000f, 0.000000f, 0.000000f, 0.000017f, 0.000030f, 0.000054f, 0.000061f, 0.000081f,
- 0.000087f, 0.000088f, 0.000089f, 0.000093f, 0.000093f, 0.000096f, 0.000096f, 0.000097f,
- 0.000098f, 0.000099f, 0.000098f, 0.000100f, 0.000100f, 0.000101f, 0.000100f, 0.000101f,
- 0.000101f, 0.000092f, 0.000082f, 0.000074f, 0.000067f, 0.000060f, 0.000054f, 0.000049f,
- 0.000045f, 0.000040f, 0.000036f, 0.000037f, 0.000059f, 0.000077f, 0.000093f, 0.000143f,
- 0.000155f, 0.000188f, 0.000178f, 0.000184f, 0.000231f, 0.000234f, 0.000272f, 0.000352f,
- 0.000420f, 0.000525f, 0.000764f, 0.001091f, 0.001653f, 0.002705f, 0.005474f, 0.013939f,
- 0.051880f, 0.283691f, 0.883789f, 0.884766f, 0.885254f, 0.885254f, 0.885742f, 0.885254f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000013f,
- 0.000032f, 0.000046f, 0.000050f, 0.000060f, 0.000065f, 0.000065f, 0.000075f, 0.000078f,
- 0.000080f, 0.000079f, 0.000084f, 0.000083f, 0.000087f, 0.000087f, 0.000089f, 0.000090f,
- 0.000091f, 0.000091f, 0.000092f, 0.000092f, 0.000083f, 0.000075f, 0.000068f, 0.000062f,
- 0.000056f, 0.000050f, 0.000046f, 0.000042f, 0.000037f, 0.000039f, 0.000044f, 0.000072f,
- 0.000068f, 0.000089f, 0.000125f, 0.000124f, 0.000126f, 0.000153f, 0.000183f, 0.000212f,
- 0.000219f, 0.000311f, 0.000363f, 0.000566f, 0.000846f, 0.001332f, 0.002522f, 0.006252f,
- 0.023834f, 0.175415f, 0.855957f, 0.856934f, 0.856934f, 0.856934f, 0.857422f, 0.856934f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000007f, 0.000024f, 0.000028f,
- 0.000040f, 0.000044f, 0.000051f, 0.000053f, 0.000060f, 0.000063f, 0.000064f, 0.000067f,
- 0.000071f, 0.000072f, 0.000074f, 0.000076f, 0.000077f, 0.000079f, 0.000079f, 0.000075f,
- 0.000068f, 0.000062f, 0.000056f, 0.000051f, 0.000046f, 0.000042f, 0.000038f, 0.000034f,
- 0.000031f, 0.000030f, 0.000045f, 0.000079f, 0.000081f, 0.000107f, 0.000114f, 0.000106f,
- 0.000144f, 0.000136f, 0.000171f, 0.000254f, 0.000377f, 0.000531f, 0.001037f, 0.002504f,
- 0.009140f, 0.088379f, 0.818848f, 0.820801f, 0.819824f, 0.820312f, 0.819336f, 0.820801f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000007f, 0.000014f, 0.000021f, 0.000028f,
- 0.000034f, 0.000036f, 0.000042f, 0.000046f, 0.000049f, 0.000052f, 0.000054f, 0.000056f,
- 0.000059f, 0.000061f, 0.000064f, 0.000061f, 0.000055f, 0.000050f, 0.000045f, 0.000041f,
- 0.000037f, 0.000033f, 0.000030f, 0.000027f, 0.000024f, 0.000033f, 0.000060f, 0.000059f,
- 0.000075f, 0.000073f, 0.000101f, 0.000089f, 0.000144f, 0.000226f, 0.000384f, 0.000847f,
- 0.003033f, 0.031860f, 0.770020f, 0.770996f, 0.772461f, 0.771973f, 0.772461f, 0.771973f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f, 0.000016f,
- 0.000021f, 0.000023f, 0.000029f, 0.000032f, 0.000036f, 0.000039f, 0.000042f, 0.000044f,
- 0.000042f, 0.000038f, 0.000035f, 0.000031f, 0.000028f, 0.000025f, 0.000022f, 0.000020f,
- 0.000017f, 0.000024f, 0.000040f, 0.000047f, 0.000053f, 0.000063f, 0.000087f, 0.000190f,
- 0.000666f, 0.007278f, 0.708496f, 0.709961f, 0.710449f, 0.710938f, 0.710938f, 0.710449f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f,
- 0.000005f, 0.000010f, 0.000014f, 0.000018f, 0.000021f, 0.000024f, 0.000024f, 0.000021f,
- 0.000018f, 0.000016f, 0.000014f, 0.000012f, 0.000008f, 0.000020f, 0.000022f, 0.000025f,
- 0.000073f, 0.000744f, 0.632324f, 0.632812f, 0.633789f, 0.633789f, 0.633301f, 0.632812f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000007f, 0.000006f, 0.000004f,
- 0.000005f, 0.000007f, 0.543945f, 0.545410f, 0.545410f, 0.545410f, 0.546387f, 0.545898f,
- },
- {
- 0.159546f, 0.492676f, 0.684570f, 0.783203f, 0.838379f, 0.873535f, 0.897949f, 0.913574f,
- 0.926270f, 0.936035f, 0.943359f, 0.950195f, 0.955566f, 0.959473f, 0.963379f, 0.966797f,
- 0.969238f, 0.972168f, 0.973633f, 0.976562f, 0.978027f, 0.979492f, 0.980957f, 0.982422f,
- 0.983887f, 0.984863f, 0.985840f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.989746f,
- 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f,
- 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997070f,
- 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f,
- 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.034119f, 0.154175f, 0.341309f, 0.532227f, 0.672363f, 0.763184f, 0.820801f, 0.858398f,
- 0.885742f, 0.904297f, 0.918945f, 0.929199f, 0.938965f, 0.945801f, 0.951660f, 0.956543f,
- 0.961426f, 0.964355f, 0.968262f, 0.970703f, 0.973145f, 0.975586f, 0.977539f, 0.979004f,
- 0.980469f, 0.981934f, 0.983398f, 0.984375f, 0.985352f, 0.986328f, 0.987305f, 0.988281f,
- 0.988770f, 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993164f,
- 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f,
- 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.013390f, 0.056915f, 0.134155f, 0.257080f, 0.412109f, 0.560547f, 0.675781f, 0.755859f,
- 0.812012f, 0.851074f, 0.877930f, 0.898926f, 0.913574f, 0.925781f, 0.935059f, 0.942871f,
- 0.949707f, 0.954590f, 0.959473f, 0.963379f, 0.966797f, 0.969238f, 0.971680f, 0.975098f,
- 0.976562f, 0.978516f, 0.979980f, 0.980957f, 0.982422f, 0.984375f, 0.985352f, 0.985840f,
- 0.987305f, 0.987793f, 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.991699f, 0.992188f,
- 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.995605f,
- 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f,
- 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.006939f, 0.027863f, 0.061951f, 0.117859f, 0.204834f, 0.324707f, 0.460205f, 0.585449f,
- 0.684570f, 0.757324f, 0.810059f, 0.847168f, 0.874023f, 0.895996f, 0.910645f, 0.922852f,
- 0.933105f, 0.940918f, 0.947754f, 0.953613f, 0.958496f, 0.961914f, 0.965820f, 0.968750f,
- 0.971680f, 0.974121f, 0.976074f, 0.978027f, 0.979492f, 0.981445f, 0.982910f, 0.983887f,
- 0.984863f, 0.986328f, 0.987305f, 0.988281f, 0.988770f, 0.989746f, 0.990234f, 0.990723f,
- 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995605f,
- 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f,
- 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f,
- 0.004211f, 0.016022f, 0.034119f, 0.061432f, 0.104797f, 0.170288f, 0.262695f, 0.377686f,
- 0.499756f, 0.608887f, 0.696777f, 0.762207f, 0.810547f, 0.847168f, 0.873535f, 0.893066f,
- 0.910156f, 0.922852f, 0.932617f, 0.939941f, 0.946777f, 0.953125f, 0.958496f, 0.961914f,
- 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.975586f, 0.977539f, 0.979492f, 0.981445f,
- 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987793f, 0.987793f, 0.989258f, 0.989746f,
- 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.992676f, 0.993652f, 0.994141f, 0.994629f,
- 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999023f,
- 0.002724f, 0.010384f, 0.020813f, 0.036285f, 0.059784f, 0.093933f, 0.145508f, 0.218018f,
- 0.313232f, 0.424072f, 0.534180f, 0.632812f, 0.709961f, 0.769531f, 0.815918f, 0.848145f,
- 0.874512f, 0.894043f, 0.909668f, 0.922363f, 0.932129f, 0.939941f, 0.946777f, 0.953125f,
- 0.958008f, 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.976562f, 0.978516f,
- 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.985352f, 0.986816f, 0.987793f, 0.988281f,
- 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.993652f, 0.994141f,
- 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.002113f, 0.007004f, 0.014091f, 0.023895f, 0.037811f, 0.057373f, 0.085632f, 0.127075f,
- 0.185425f, 0.263672f, 0.360596f, 0.465576f, 0.566895f, 0.655762f, 0.725586f, 0.779297f,
- 0.822266f, 0.853516f, 0.877441f, 0.895996f, 0.911621f, 0.923828f, 0.933105f, 0.940918f,
- 0.947754f, 0.953613f, 0.957520f, 0.962402f, 0.965820f, 0.968750f, 0.972168f, 0.974121f,
- 0.976074f, 0.978027f, 0.980469f, 0.981934f, 0.983398f, 0.984863f, 0.985352f, 0.986328f,
- 0.988281f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.992676f, 0.993164f,
- 0.993652f, 0.994629f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.001575f, 0.005211f, 0.010040f, 0.016220f, 0.025665f, 0.037415f, 0.054138f, 0.078491f,
- 0.112915f, 0.160156f, 0.225464f, 0.308594f, 0.405029f, 0.506348f, 0.599121f, 0.678711f,
- 0.743164f, 0.791016f, 0.829590f, 0.859375f, 0.881836f, 0.899414f, 0.913086f, 0.924805f,
- 0.934570f, 0.942383f, 0.948730f, 0.955078f, 0.958984f, 0.963379f, 0.966797f, 0.970215f,
- 0.972168f, 0.974609f, 0.977051f, 0.979004f, 0.980957f, 0.981934f, 0.983398f, 0.984863f,
- 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.991699f, 0.992188f,
- 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f,
- 0.996582f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.000985f, 0.004086f, 0.007362f, 0.011887f, 0.018127f, 0.026199f, 0.036804f, 0.052002f,
- 0.072754f, 0.101318f, 0.140747f, 0.195190f, 0.266113f, 0.352539f, 0.448730f, 0.543945f,
- 0.630371f, 0.702637f, 0.759277f, 0.803711f, 0.839355f, 0.865234f, 0.886719f, 0.903320f,
- 0.916504f, 0.927734f, 0.936523f, 0.944336f, 0.950195f, 0.955566f, 0.959961f, 0.964355f,
- 0.967773f, 0.970215f, 0.973145f, 0.975586f, 0.978027f, 0.979004f, 0.980957f, 0.982910f,
- 0.984375f, 0.985352f, 0.987305f, 0.987305f, 0.988770f, 0.990234f, 0.990234f, 0.991699f,
- 0.991699f, 0.993164f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f,
- 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.999023f,
- 0.000829f, 0.002878f, 0.005596f, 0.009109f, 0.013359f, 0.019089f, 0.026901f, 0.036774f,
- 0.049347f, 0.067200f, 0.091736f, 0.125854f, 0.171631f, 0.232544f, 0.308594f, 0.397461f,
- 0.491455f, 0.581055f, 0.659668f, 0.724609f, 0.775879f, 0.817383f, 0.848633f, 0.873047f,
- 0.892090f, 0.907715f, 0.920410f, 0.930664f, 0.939453f, 0.946289f, 0.951660f, 0.957520f,
- 0.960938f, 0.965820f, 0.968750f, 0.972168f, 0.974609f, 0.976562f, 0.978516f, 0.980469f,
- 0.981934f, 0.983887f, 0.984863f, 0.986328f, 0.986816f, 0.988770f, 0.989746f, 0.990234f,
- 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f,
- 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000836f, 0.002403f, 0.004837f, 0.006950f, 0.010269f, 0.014679f, 0.019699f, 0.026291f,
- 0.035431f, 0.046875f, 0.062744f, 0.084045f, 0.113403f, 0.152588f, 0.204712f, 0.271729f,
- 0.353271f, 0.443115f, 0.532715f, 0.617188f, 0.688477f, 0.748047f, 0.793945f, 0.829102f,
- 0.857422f, 0.880371f, 0.898438f, 0.912598f, 0.924316f, 0.934082f, 0.941406f, 0.948242f,
- 0.954590f, 0.959473f, 0.963379f, 0.967285f, 0.970215f, 0.973145f, 0.975586f, 0.977539f,
- 0.979980f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988281f, 0.988770f,
- 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.995117f,
- 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000698f, 0.002052f, 0.003618f, 0.005703f, 0.008430f, 0.011230f, 0.015083f, 0.019821f,
- 0.026474f, 0.034393f, 0.044922f, 0.059204f, 0.077698f, 0.102661f, 0.136963f, 0.182373f,
- 0.241089f, 0.314941f, 0.398926f, 0.489014f, 0.575195f, 0.652344f, 0.717285f, 0.769043f,
- 0.810059f, 0.842773f, 0.869141f, 0.888672f, 0.904785f, 0.917969f, 0.928711f, 0.936523f,
- 0.945312f, 0.951660f, 0.957031f, 0.961426f, 0.964844f, 0.968750f, 0.971680f, 0.974121f,
- 0.976562f, 0.979004f, 0.980469f, 0.982422f, 0.983887f, 0.985352f, 0.986816f, 0.987793f,
- 0.988770f, 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994141f,
- 0.994629f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.000244f, 0.001565f, 0.002975f, 0.004433f, 0.006596f, 0.008957f, 0.012215f, 0.015533f,
- 0.020294f, 0.026062f, 0.033722f, 0.042816f, 0.055237f, 0.071960f, 0.094543f, 0.124023f,
- 0.164185f, 0.216309f, 0.281738f, 0.360352f, 0.446533f, 0.534180f, 0.615234f, 0.686523f,
- 0.743652f, 0.790527f, 0.825684f, 0.855957f, 0.878418f, 0.895996f, 0.911133f, 0.923340f,
- 0.933105f, 0.941406f, 0.948242f, 0.953613f, 0.959473f, 0.963379f, 0.966797f, 0.970703f,
- 0.973145f, 0.976074f, 0.978516f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986328f,
- 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f,
- 0.994141f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f,
- 0.000365f, 0.001394f, 0.002546f, 0.004055f, 0.005394f, 0.007465f, 0.009674f, 0.012070f,
- 0.015556f, 0.019913f, 0.025696f, 0.032623f, 0.041046f, 0.052643f, 0.067383f, 0.087463f,
- 0.113708f, 0.148315f, 0.194946f, 0.254395f, 0.326416f, 0.408691f, 0.495117f, 0.579102f,
- 0.654297f, 0.716797f, 0.768066f, 0.809570f, 0.843262f, 0.868652f, 0.888184f, 0.904785f,
- 0.918457f, 0.929199f, 0.937500f, 0.945801f, 0.951660f, 0.957520f, 0.961914f, 0.965820f,
- 0.969238f, 0.972656f, 0.975098f, 0.978027f, 0.979492f, 0.981934f, 0.983398f, 0.984863f,
- 0.986328f, 0.987793f, 0.989258f, 0.989746f, 0.991211f, 0.991211f, 0.992188f, 0.993164f,
- 0.993652f, 0.994629f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000596f, 0.001077f, 0.001882f, 0.003033f, 0.004559f, 0.006241f, 0.007805f, 0.010002f,
- 0.012840f, 0.015900f, 0.019974f, 0.025131f, 0.031250f, 0.039337f, 0.049988f, 0.063843f,
- 0.080933f, 0.105164f, 0.135986f, 0.176880f, 0.230103f, 0.296631f, 0.374268f, 0.459961f,
- 0.544434f, 0.623535f, 0.691895f, 0.748535f, 0.792969f, 0.829102f, 0.857422f, 0.880371f,
- 0.897949f, 0.913086f, 0.924805f, 0.934570f, 0.942383f, 0.949219f, 0.955566f, 0.960938f,
- 0.964844f, 0.968750f, 0.971191f, 0.974121f, 0.977051f, 0.979004f, 0.980957f, 0.982910f,
- 0.984863f, 0.985840f, 0.987305f, 0.989258f, 0.989746f, 0.991211f, 0.991211f, 0.992676f,
- 0.993164f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.000243f, 0.001173f, 0.001889f, 0.002661f, 0.003933f, 0.005131f, 0.006496f, 0.008324f,
- 0.010574f, 0.013115f, 0.015839f, 0.019913f, 0.024445f, 0.030609f, 0.037781f, 0.047333f,
- 0.059906f, 0.075928f, 0.097229f, 0.124939f, 0.161743f, 0.209595f, 0.271240f, 0.343994f,
- 0.426758f, 0.511719f, 0.592773f, 0.666504f, 0.727051f, 0.776855f, 0.815918f, 0.847656f,
- 0.871582f, 0.892090f, 0.907715f, 0.920898f, 0.931152f, 0.940918f, 0.947754f, 0.953613f,
- 0.958496f, 0.963867f, 0.967773f, 0.970703f, 0.974121f, 0.976074f, 0.979004f, 0.980469f,
- 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.990234f, 0.990234f, 0.992188f,
- 0.992188f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.000351f, 0.000842f, 0.001560f, 0.002363f, 0.003258f, 0.004131f, 0.005272f, 0.007179f,
- 0.008682f, 0.010643f, 0.013016f, 0.016037f, 0.019516f, 0.024078f, 0.029602f, 0.036591f,
- 0.045044f, 0.056641f, 0.071350f, 0.090576f, 0.116211f, 0.149414f, 0.193237f, 0.248779f,
- 0.317871f, 0.396973f, 0.481201f, 0.564453f, 0.640137f, 0.705566f, 0.759766f, 0.802734f,
- 0.836914f, 0.863281f, 0.885742f, 0.902832f, 0.916992f, 0.927734f, 0.937012f, 0.945801f,
- 0.952637f, 0.958008f, 0.961914f, 0.966309f, 0.970703f, 0.974121f, 0.976074f, 0.978516f,
- 0.980957f, 0.982910f, 0.984863f, 0.985840f, 0.987305f, 0.988281f, 0.989746f, 0.990723f,
- 0.991211f, 0.992676f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997559f,
- 0.000000f, 0.000886f, 0.001405f, 0.001915f, 0.002651f, 0.003870f, 0.004845f, 0.006035f,
- 0.006912f, 0.008812f, 0.010887f, 0.013229f, 0.016022f, 0.019196f, 0.023590f, 0.028992f,
- 0.035248f, 0.043304f, 0.053711f, 0.066956f, 0.085083f, 0.107727f, 0.138428f, 0.178589f,
- 0.229980f, 0.293945f, 0.370117f, 0.453369f, 0.537109f, 0.616699f, 0.685059f, 0.743164f,
- 0.790039f, 0.826660f, 0.856445f, 0.878906f, 0.897949f, 0.913574f, 0.925293f, 0.935547f,
- 0.943848f, 0.951172f, 0.957031f, 0.961914f, 0.966797f, 0.970215f, 0.973145f, 0.976562f,
- 0.979004f, 0.980469f, 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.989746f,
- 0.991211f, 0.992188f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000104f, 0.000719f, 0.001065f, 0.001970f, 0.002544f, 0.003149f, 0.004230f, 0.005138f,
- 0.006119f, 0.007580f, 0.009201f, 0.010902f, 0.013260f, 0.015526f, 0.019272f, 0.022858f,
- 0.027512f, 0.033569f, 0.041199f, 0.050873f, 0.063782f, 0.079895f, 0.101135f, 0.128906f,
- 0.165771f, 0.213745f, 0.273193f, 0.345703f, 0.427002f, 0.511719f, 0.592773f, 0.666016f,
- 0.727051f, 0.776367f, 0.817871f, 0.848633f, 0.875000f, 0.894531f, 0.909668f, 0.922852f,
- 0.934082f, 0.942383f, 0.949707f, 0.956055f, 0.961914f, 0.966309f, 0.970215f, 0.973145f,
- 0.976562f, 0.978516f, 0.980957f, 0.982910f, 0.984375f, 0.986328f, 0.987305f, 0.988281f,
- 0.989746f, 0.991211f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000240f, 0.000686f, 0.001052f, 0.001375f, 0.002308f, 0.002735f, 0.003510f, 0.004269f,
- 0.005173f, 0.006649f, 0.007442f, 0.009109f, 0.011246f, 0.012886f, 0.015732f, 0.018829f,
- 0.022354f, 0.026672f, 0.032867f, 0.039764f, 0.048492f, 0.060455f, 0.075806f, 0.095276f,
- 0.121033f, 0.155273f, 0.199097f, 0.255859f, 0.324463f, 0.404053f, 0.488525f, 0.571289f,
- 0.646484f, 0.711426f, 0.765625f, 0.808105f, 0.841797f, 0.869141f, 0.890137f, 0.907227f,
- 0.920898f, 0.931641f, 0.940918f, 0.948730f, 0.955078f, 0.960449f, 0.965820f, 0.969727f,
- 0.972656f, 0.976562f, 0.978516f, 0.980957f, 0.982910f, 0.984863f, 0.986328f, 0.987793f,
- 0.989746f, 0.990723f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f,
- 0.000244f, 0.000597f, 0.000939f, 0.001369f, 0.001999f, 0.002329f, 0.003105f, 0.003786f,
- 0.004395f, 0.005413f, 0.006474f, 0.007793f, 0.009254f, 0.010971f, 0.012970f, 0.015526f,
- 0.018112f, 0.022049f, 0.026581f, 0.031586f, 0.038666f, 0.046967f, 0.057617f, 0.071777f,
- 0.089783f, 0.113953f, 0.145264f, 0.186646f, 0.239990f, 0.305908f, 0.383301f, 0.467285f,
- 0.551270f, 0.629883f, 0.697266f, 0.754883f, 0.799805f, 0.835938f, 0.864258f, 0.886719f,
- 0.905273f, 0.918945f, 0.931152f, 0.940918f, 0.948242f, 0.955078f, 0.961426f, 0.965332f,
- 0.969727f, 0.973633f, 0.976074f, 0.979004f, 0.980957f, 0.983398f, 0.984863f, 0.987305f,
- 0.988281f, 0.989258f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f,
- 0.000000f, 0.000475f, 0.000891f, 0.001390f, 0.001730f, 0.002060f, 0.002501f, 0.003109f,
- 0.003836f, 0.004837f, 0.005852f, 0.006859f, 0.007740f, 0.009216f, 0.010918f, 0.012863f,
- 0.014915f, 0.017731f, 0.021317f, 0.025482f, 0.030930f, 0.037262f, 0.044891f, 0.055115f,
- 0.068298f, 0.085510f, 0.107910f, 0.137207f, 0.176025f, 0.226929f, 0.289551f, 0.364746f,
- 0.447998f, 0.532715f, 0.613770f, 0.685547f, 0.744629f, 0.791992f, 0.830078f, 0.860352f,
- 0.884277f, 0.903320f, 0.917969f, 0.930176f, 0.939941f, 0.947754f, 0.954590f, 0.961426f,
- 0.966309f, 0.970215f, 0.973145f, 0.976562f, 0.979492f, 0.981445f, 0.983398f, 0.985352f,
- 0.987793f, 0.988281f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996094f,
- 0.000102f, 0.000243f, 0.000844f, 0.001124f, 0.001554f, 0.002077f, 0.002098f, 0.002682f,
- 0.003357f, 0.004280f, 0.005035f, 0.005764f, 0.006805f, 0.007633f, 0.009354f, 0.010872f,
- 0.012665f, 0.015099f, 0.017258f, 0.020599f, 0.024887f, 0.029495f, 0.035522f, 0.042999f,
- 0.053070f, 0.065125f, 0.081299f, 0.102661f, 0.130371f, 0.166992f, 0.215088f, 0.275635f,
- 0.348877f, 0.431641f, 0.517578f, 0.600098f, 0.672852f, 0.735352f, 0.785645f, 0.826172f,
- 0.856934f, 0.881836f, 0.900879f, 0.916992f, 0.930176f, 0.940430f, 0.947754f, 0.955078f,
- 0.960938f, 0.966309f, 0.969238f, 0.973633f, 0.977051f, 0.979492f, 0.981934f, 0.983887f,
- 0.986328f, 0.987793f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f,
- 0.000241f, 0.000242f, 0.000823f, 0.000956f, 0.001225f, 0.001549f, 0.002031f, 0.002613f,
- 0.003124f, 0.003574f, 0.004467f, 0.004955f, 0.005672f, 0.006752f, 0.007603f, 0.009186f,
- 0.010704f, 0.012741f, 0.014366f, 0.017487f, 0.020142f, 0.024002f, 0.028915f, 0.034943f,
- 0.041656f, 0.050964f, 0.062622f, 0.077881f, 0.097961f, 0.124207f, 0.158936f, 0.204590f,
- 0.263184f, 0.334961f, 0.416748f, 0.502930f, 0.587891f, 0.664062f, 0.728516f, 0.780762f,
- 0.822266f, 0.854492f, 0.879395f, 0.900879f, 0.916504f, 0.928711f, 0.940430f, 0.948730f,
- 0.955566f, 0.961914f, 0.967285f, 0.970215f, 0.974121f, 0.977539f, 0.979980f, 0.982422f,
- 0.984863f, 0.986816f, 0.994629f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f,
- 0.000000f, 0.000473f, 0.000607f, 0.000921f, 0.000957f, 0.001448f, 0.001884f, 0.002270f,
- 0.002703f, 0.002998f, 0.003862f, 0.004307f, 0.005074f, 0.005665f, 0.006737f, 0.007851f,
- 0.009216f, 0.010735f, 0.012459f, 0.014572f, 0.016998f, 0.019821f, 0.023605f, 0.027969f,
- 0.033783f, 0.040192f, 0.049286f, 0.060303f, 0.074829f, 0.093750f, 0.118774f, 0.152222f,
- 0.195801f, 0.252441f, 0.322754f, 0.404053f, 0.491943f, 0.577637f, 0.655273f, 0.722168f,
- 0.776367f, 0.820312f, 0.854004f, 0.878906f, 0.900879f, 0.916992f, 0.929688f, 0.940430f,
- 0.949707f, 0.956055f, 0.962402f, 0.967285f, 0.971191f, 0.975586f, 0.978516f, 0.980957f,
- 0.983398f, 0.985352f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995605f,
- 0.000000f, 0.000444f, 0.000605f, 0.000649f, 0.000926f, 0.001096f, 0.001624f, 0.001669f,
- 0.002373f, 0.002716f, 0.003231f, 0.003769f, 0.004395f, 0.005005f, 0.005878f, 0.006710f,
- 0.007793f, 0.008957f, 0.010712f, 0.012230f, 0.014244f, 0.016693f, 0.019531f, 0.022827f,
- 0.027100f, 0.032318f, 0.038971f, 0.047302f, 0.058105f, 0.072021f, 0.089966f, 0.114319f,
- 0.146362f, 0.188965f, 0.244019f, 0.312988f, 0.394287f, 0.482178f, 0.569824f, 0.650391f,
- 0.718262f, 0.774414f, 0.819336f, 0.853027f, 0.880371f, 0.900879f, 0.917969f, 0.930664f,
- 0.940918f, 0.950684f, 0.957031f, 0.962891f, 0.968262f, 0.972656f, 0.976562f, 0.979004f,
- 0.981934f, 0.984375f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.994629f, 0.995117f,
- 0.000000f, 0.000336f, 0.000601f, 0.000712f, 0.000810f, 0.001174f, 0.001286f, 0.001618f,
- 0.002037f, 0.002592f, 0.002920f, 0.003223f, 0.003847f, 0.004463f, 0.005119f, 0.006020f,
- 0.006783f, 0.007957f, 0.008888f, 0.010590f, 0.012230f, 0.013885f, 0.016220f, 0.019318f,
- 0.022278f, 0.026474f, 0.031403f, 0.037781f, 0.046021f, 0.055969f, 0.069397f, 0.086975f,
- 0.110413f, 0.140991f, 0.182739f, 0.236694f, 0.304932f, 0.385986f, 0.475586f, 0.563965f,
- 0.646484f, 0.716797f, 0.772461f, 0.818359f, 0.853027f, 0.880859f, 0.901855f, 0.918945f,
- 0.932129f, 0.942383f, 0.951172f, 0.958496f, 0.964355f, 0.969238f, 0.973633f, 0.977051f,
- 0.979980f, 0.982910f, 0.993652f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994629f,
- 0.000000f, 0.000244f, 0.000418f, 0.000597f, 0.000600f, 0.001085f, 0.001236f, 0.001535f,
- 0.001970f, 0.002096f, 0.002354f, 0.002834f, 0.003323f, 0.003822f, 0.004463f, 0.005146f,
- 0.005798f, 0.006859f, 0.007587f, 0.008827f, 0.009956f, 0.011833f, 0.013725f, 0.015945f,
- 0.018585f, 0.021988f, 0.025665f, 0.030807f, 0.036774f, 0.044373f, 0.054108f, 0.067383f,
- 0.084229f, 0.106812f, 0.137207f, 0.177734f, 0.230835f, 0.299072f, 0.380127f, 0.470215f,
- 0.560547f, 0.644531f, 0.715820f, 0.774414f, 0.820312f, 0.854980f, 0.882324f, 0.903809f,
- 0.921387f, 0.933594f, 0.944824f, 0.952637f, 0.960449f, 0.965820f, 0.971191f, 0.974609f,
- 0.978027f, 0.981934f, 0.993164f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994141f,
- 0.000000f, 0.000244f, 0.000411f, 0.000589f, 0.000820f, 0.000729f, 0.001086f, 0.001301f,
- 0.001677f, 0.001935f, 0.002312f, 0.002678f, 0.002846f, 0.003590f, 0.003914f, 0.004578f,
- 0.005020f, 0.005753f, 0.006706f, 0.007710f, 0.008911f, 0.010155f, 0.011528f, 0.013504f,
- 0.015747f, 0.018036f, 0.021408f, 0.024994f, 0.029816f, 0.035858f, 0.043152f, 0.053009f,
- 0.065491f, 0.082031f, 0.104065f, 0.133789f, 0.174072f, 0.226929f, 0.294434f, 0.376465f,
- 0.467773f, 0.560059f, 0.644531f, 0.717285f, 0.777344f, 0.823242f, 0.857910f, 0.885742f,
- 0.906738f, 0.922852f, 0.936523f, 0.947266f, 0.955078f, 0.961426f, 0.967285f, 0.972656f,
- 0.976562f, 0.979980f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.993652f, 0.993652f,
- 0.000000f, 0.000243f, 0.000243f, 0.000442f, 0.000695f, 0.000759f, 0.000837f, 0.001089f,
- 0.001625f, 0.001702f, 0.002045f, 0.002176f, 0.002756f, 0.003063f, 0.003687f, 0.003893f,
- 0.004456f, 0.005337f, 0.006062f, 0.006523f, 0.007572f, 0.008430f, 0.009880f, 0.011612f,
- 0.013237f, 0.015114f, 0.017487f, 0.020584f, 0.024445f, 0.028931f, 0.034729f, 0.042023f,
- 0.051788f, 0.063843f, 0.079956f, 0.102295f, 0.131592f, 0.171021f, 0.223877f, 0.292236f,
- 0.375000f, 0.468018f, 0.562012f, 0.648438f, 0.721191f, 0.781250f, 0.826660f, 0.862305f,
- 0.888672f, 0.909668f, 0.926270f, 0.938965f, 0.949707f, 0.957520f, 0.964355f, 0.969727f,
- 0.974121f, 0.978027f, 0.992676f, 0.993164f, 0.993164f, 0.992676f, 0.993164f, 0.993164f,
- 0.000000f, 0.000242f, 0.000242f, 0.000242f, 0.000564f, 0.000692f, 0.000826f, 0.001094f,
- 0.001280f, 0.001457f, 0.001673f, 0.002232f, 0.002411f, 0.002789f, 0.003174f, 0.003649f,
- 0.003859f, 0.004349f, 0.004990f, 0.005898f, 0.006622f, 0.007496f, 0.008209f, 0.009583f,
- 0.011284f, 0.013062f, 0.014763f, 0.017120f, 0.020020f, 0.023804f, 0.028412f, 0.033905f,
- 0.041016f, 0.050140f, 0.062469f, 0.078552f, 0.100159f, 0.129272f, 0.169067f, 0.222290f,
- 0.291504f, 0.376465f, 0.470703f, 0.566406f, 0.653320f, 0.728027f, 0.786621f, 0.832031f,
- 0.866699f, 0.893555f, 0.914062f, 0.929688f, 0.942383f, 0.952148f, 0.959961f, 0.966797f,
- 0.972168f, 0.976074f, 0.991211f, 0.992188f, 0.992676f, 0.992188f, 0.992676f, 0.992676f,
- 0.000241f, 0.000241f, 0.000240f, 0.000242f, 0.000486f, 0.000637f, 0.000916f, 0.000933f,
- 0.001003f, 0.001284f, 0.001584f, 0.001925f, 0.002134f, 0.002502f, 0.002731f, 0.003134f,
- 0.003435f, 0.004036f, 0.004379f, 0.005077f, 0.005688f, 0.006557f, 0.007347f, 0.007942f,
- 0.009506f, 0.010712f, 0.012527f, 0.014603f, 0.016693f, 0.019592f, 0.023285f, 0.027512f,
- 0.033173f, 0.040283f, 0.049347f, 0.061432f, 0.077271f, 0.098938f, 0.128052f, 0.168091f,
- 0.222168f, 0.292725f, 0.379150f, 0.476807f, 0.573730f, 0.662598f, 0.735840f, 0.794434f,
- 0.839844f, 0.873535f, 0.898926f, 0.918945f, 0.934082f, 0.945312f, 0.955566f, 0.962402f,
- 0.969238f, 0.974609f, 0.990723f, 0.991699f, 0.992188f, 0.992188f, 0.992188f, 0.992188f,
- 0.000000f, 0.000238f, 0.000240f, 0.000362f, 0.000362f, 0.000521f, 0.000631f, 0.000909f,
- 0.000937f, 0.001249f, 0.001373f, 0.001693f, 0.001746f, 0.002184f, 0.002436f, 0.002680f,
- 0.003094f, 0.003576f, 0.003828f, 0.004463f, 0.004990f, 0.005589f, 0.006439f, 0.006943f,
- 0.008217f, 0.009384f, 0.010719f, 0.012184f, 0.014130f, 0.016373f, 0.019241f, 0.022675f,
- 0.027161f, 0.032379f, 0.039307f, 0.048645f, 0.060455f, 0.076416f, 0.097778f, 0.127441f,
- 0.168213f, 0.223633f, 0.296387f, 0.385986f, 0.485107f, 0.583984f, 0.673340f, 0.746582f,
- 0.804199f, 0.848633f, 0.880371f, 0.905273f, 0.923828f, 0.938477f, 0.949707f, 0.958984f,
- 0.965820f, 0.972656f, 0.990234f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f,
- 0.000000f, 0.000234f, 0.000238f, 0.000236f, 0.000360f, 0.000482f, 0.000614f, 0.000786f,
- 0.000900f, 0.001056f, 0.001336f, 0.001466f, 0.001671f, 0.001907f, 0.002333f, 0.002546f,
- 0.002871f, 0.003067f, 0.003500f, 0.003813f, 0.004425f, 0.004574f, 0.005459f, 0.006092f,
- 0.006660f, 0.007660f, 0.008987f, 0.010071f, 0.011841f, 0.013847f, 0.016022f, 0.018829f,
- 0.022339f, 0.026779f, 0.031677f, 0.038910f, 0.047913f, 0.059601f, 0.075684f, 0.097290f,
- 0.127319f, 0.169189f, 0.226807f, 0.302490f, 0.394775f, 0.497314f, 0.598633f, 0.686523f,
- 0.759766f, 0.814941f, 0.857422f, 0.888672f, 0.912109f, 0.930176f, 0.943359f, 0.954102f,
- 0.962402f, 0.968750f, 0.988770f, 0.990234f, 0.990234f, 0.990234f, 0.991211f, 0.990723f,
- 0.000000f, 0.000036f, 0.000166f, 0.000357f, 0.000356f, 0.000478f, 0.000566f, 0.000638f,
- 0.000893f, 0.001146f, 0.001242f, 0.001330f, 0.001502f, 0.001773f, 0.001918f, 0.002024f,
- 0.002501f, 0.002604f, 0.003067f, 0.003334f, 0.003708f, 0.004044f, 0.004646f, 0.005268f,
- 0.006241f, 0.006931f, 0.007774f, 0.008911f, 0.010277f, 0.011475f, 0.013542f, 0.015732f,
- 0.018417f, 0.022049f, 0.026154f, 0.031189f, 0.038269f, 0.047119f, 0.059265f, 0.075256f,
- 0.097534f, 0.128906f, 0.172119f, 0.231934f, 0.311035f, 0.407715f, 0.513184f, 0.615723f,
- 0.703613f, 0.773926f, 0.827637f, 0.867188f, 0.897461f, 0.919434f, 0.936035f, 0.948730f,
- 0.958984f, 0.966309f, 0.988770f, 0.989746f, 0.989746f, 0.990234f, 0.989746f, 0.989746f,
- 0.000000f, 0.000028f, 0.000093f, 0.000334f, 0.000465f, 0.000472f, 0.000373f, 0.000685f,
- 0.000695f, 0.001027f, 0.001128f, 0.001155f, 0.001419f, 0.001435f, 0.001760f, 0.001850f,
- 0.002241f, 0.002373f, 0.002604f, 0.002821f, 0.003334f, 0.003666f, 0.004139f, 0.004627f,
- 0.005207f, 0.005886f, 0.006596f, 0.007580f, 0.008705f, 0.009911f, 0.011520f, 0.013237f,
- 0.015427f, 0.017944f, 0.021423f, 0.025497f, 0.030945f, 0.037537f, 0.046692f, 0.058624f,
- 0.075317f, 0.098267f, 0.130493f, 0.176025f, 0.239136f, 0.323242f, 0.424561f, 0.533691f,
- 0.636230f, 0.723145f, 0.790039f, 0.841797f, 0.880371f, 0.906738f, 0.926758f, 0.941406f,
- 0.953613f, 0.963379f, 0.987793f, 0.988770f, 0.988770f, 0.989258f, 0.989258f, 0.989258f,
- 0.000000f, 0.000000f, 0.000047f, 0.000321f, 0.000332f, 0.000351f, 0.000470f, 0.000596f,
- 0.000655f, 0.000727f, 0.001008f, 0.001112f, 0.001350f, 0.001379f, 0.001380f, 0.001751f,
- 0.002008f, 0.002151f, 0.002327f, 0.002548f, 0.002691f, 0.003056f, 0.003475f, 0.003925f,
- 0.004749f, 0.005161f, 0.005863f, 0.006538f, 0.007153f, 0.008453f, 0.009789f, 0.010986f,
- 0.013168f, 0.015121f, 0.017563f, 0.020966f, 0.025009f, 0.030151f, 0.037048f, 0.046570f,
- 0.058624f, 0.075623f, 0.099243f, 0.133667f, 0.181641f, 0.249756f, 0.338623f, 0.445312f,
- 0.556641f, 0.659180f, 0.744141f, 0.808594f, 0.855957f, 0.890137f, 0.916992f, 0.934570f,
- 0.949219f, 0.959473f, 0.986816f, 0.987793f, 0.987793f, 0.987793f, 0.987793f, 0.988281f,
- 0.000000f, 0.000000f, 0.000000f, 0.000244f, 0.000429f, 0.000440f, 0.000348f, 0.000592f,
- 0.000606f, 0.000755f, 0.000690f, 0.000935f, 0.001172f, 0.001257f, 0.001368f, 0.001458f,
- 0.001786f, 0.001809f, 0.002060f, 0.002274f, 0.002478f, 0.002642f, 0.002987f, 0.003435f,
- 0.003866f, 0.004337f, 0.005066f, 0.005409f, 0.006355f, 0.007111f, 0.008011f, 0.009392f,
- 0.011032f, 0.012321f, 0.014717f, 0.017319f, 0.020432f, 0.024551f, 0.029953f, 0.036835f,
- 0.045929f, 0.058716f, 0.076416f, 0.101562f, 0.137695f, 0.189453f, 0.262451f, 0.358154f,
- 0.470215f, 0.584961f, 0.686523f, 0.767578f, 0.828125f, 0.871582f, 0.903809f, 0.926270f,
- 0.941895f, 0.956055f, 0.985352f, 0.986328f, 0.986816f, 0.986816f, 0.986816f, 0.986816f,
- 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000237f, 0.000314f, 0.000570f, 0.000575f,
- 0.000583f, 0.000632f, 0.000651f, 0.000789f, 0.000947f, 0.001097f, 0.001300f, 0.001320f,
- 0.001384f, 0.001443f, 0.001641f, 0.001869f, 0.002047f, 0.002396f, 0.002634f, 0.003025f,
- 0.003412f, 0.003757f, 0.004238f, 0.004620f, 0.005463f, 0.006168f, 0.007072f, 0.008080f,
- 0.009155f, 0.010590f, 0.012306f, 0.014175f, 0.016769f, 0.020081f, 0.023972f, 0.029495f,
- 0.036560f, 0.045959f, 0.059265f, 0.078125f, 0.104797f, 0.143677f, 0.199951f, 0.279785f,
- 0.382812f, 0.500977f, 0.616699f, 0.716309f, 0.791992f, 0.847168f, 0.887207f, 0.915527f,
- 0.936523f, 0.950684f, 0.984375f, 0.985352f, 0.986328f, 0.985840f, 0.986328f, 0.985840f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000205f, 0.000239f, 0.000299f, 0.000537f,
- 0.000574f, 0.000696f, 0.000583f, 0.000740f, 0.000778f, 0.000867f, 0.001013f, 0.001257f,
- 0.001325f, 0.001277f, 0.001416f, 0.001718f, 0.001965f, 0.002079f, 0.002356f, 0.002577f,
- 0.002771f, 0.003305f, 0.003693f, 0.004028f, 0.004593f, 0.005234f, 0.005905f, 0.006802f,
- 0.007698f, 0.008553f, 0.009995f, 0.011635f, 0.013824f, 0.016174f, 0.019547f, 0.023544f,
- 0.029114f, 0.036377f, 0.046417f, 0.060211f, 0.080017f, 0.108643f, 0.151611f, 0.213379f,
- 0.301758f, 0.414062f, 0.537598f, 0.653320f, 0.748047f, 0.817871f, 0.868164f, 0.903320f,
- 0.928711f, 0.945801f, 0.982910f, 0.983887f, 0.984375f, 0.984375f, 0.984863f, 0.984375f,
- 0.000000f, 0.000000f, 0.000045f, 0.000105f, 0.000114f, 0.000340f, 0.000371f, 0.000501f,
- 0.000639f, 0.000554f, 0.000687f, 0.000675f, 0.000711f, 0.000738f, 0.000824f, 0.001092f,
- 0.001040f, 0.001185f, 0.001212f, 0.001408f, 0.001624f, 0.001813f, 0.001982f, 0.002182f,
- 0.002634f, 0.002748f, 0.003252f, 0.003540f, 0.004089f, 0.004505f, 0.005001f, 0.005657f,
- 0.006500f, 0.007195f, 0.008286f, 0.009750f, 0.011208f, 0.013420f, 0.015762f, 0.019226f,
- 0.023209f, 0.029144f, 0.036591f, 0.047150f, 0.061615f, 0.082947f, 0.114014f, 0.161621f,
- 0.231323f, 0.329834f, 0.451416f, 0.579590f, 0.692871f, 0.780273f, 0.844238f, 0.888184f,
- 0.917969f, 0.939453f, 0.981445f, 0.982422f, 0.982910f, 0.982910f, 0.982910f, 0.982910f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000208f, 0.000311f, 0.000238f, 0.000337f,
- 0.000524f, 0.000617f, 0.000533f, 0.000675f, 0.000665f, 0.000776f, 0.000840f, 0.000819f,
- 0.000902f, 0.001169f, 0.001130f, 0.001178f, 0.001382f, 0.001571f, 0.001941f, 0.001932f,
- 0.002138f, 0.002306f, 0.002586f, 0.002937f, 0.003468f, 0.003740f, 0.004292f, 0.004704f,
- 0.005444f, 0.006081f, 0.007019f, 0.008255f, 0.009521f, 0.010796f, 0.012840f, 0.015503f,
- 0.018784f, 0.023178f, 0.029129f, 0.036774f, 0.047699f, 0.063416f, 0.086548f, 0.121399f,
- 0.175293f, 0.254883f, 0.365234f, 0.496582f, 0.626953f, 0.733398f, 0.813477f, 0.869629f,
- 0.906738f, 0.933105f, 0.979980f, 0.980957f, 0.981445f, 0.981445f, 0.980957f, 0.981445f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000208f, 0.000312f, 0.000236f,
- 0.000343f, 0.000475f, 0.000496f, 0.000528f, 0.000659f, 0.000582f, 0.000685f, 0.000710f,
- 0.000761f, 0.000784f, 0.000941f, 0.001013f, 0.001117f, 0.001339f, 0.001500f, 0.001623f,
- 0.001769f, 0.002039f, 0.002298f, 0.002565f, 0.002802f, 0.003119f, 0.003471f, 0.003857f,
- 0.004658f, 0.005177f, 0.005836f, 0.006752f, 0.007324f, 0.008911f, 0.010422f, 0.012527f,
- 0.015373f, 0.018585f, 0.022964f, 0.029037f, 0.037231f, 0.049072f, 0.066345f, 0.091492f,
- 0.131470f, 0.193359f, 0.285645f, 0.409912f, 0.548828f, 0.676758f, 0.776367f, 0.845703f,
- 0.893066f, 0.924805f, 0.978027f, 0.979492f, 0.979492f, 0.979004f, 0.979492f, 0.979492f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000166f, 0.000228f, 0.000227f,
- 0.000369f, 0.000337f, 0.000368f, 0.000452f, 0.000500f, 0.000547f, 0.000543f, 0.000575f,
- 0.000623f, 0.000723f, 0.000783f, 0.000874f, 0.001141f, 0.001226f, 0.001279f, 0.001336f,
- 0.001499f, 0.001655f, 0.001922f, 0.002090f, 0.002453f, 0.002298f, 0.003139f, 0.003181f,
- 0.003674f, 0.004166f, 0.004814f, 0.005447f, 0.006348f, 0.007179f, 0.008736f, 0.010406f,
- 0.012321f, 0.014984f, 0.018219f, 0.022934f, 0.028824f, 0.037598f, 0.050476f, 0.069397f,
- 0.098694f, 0.144775f, 0.218018f, 0.325439f, 0.464111f, 0.607910f, 0.729492f, 0.817383f,
- 0.876953f, 0.915527f, 0.976562f, 0.977539f, 0.977539f, 0.977051f, 0.977051f, 0.977539f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000154f, 0.000200f,
- 0.000267f, 0.000316f, 0.000324f, 0.000449f, 0.000319f, 0.000379f, 0.000515f, 0.000519f,
- 0.000558f, 0.000628f, 0.000645f, 0.000690f, 0.000777f, 0.000940f, 0.001096f, 0.001204f,
- 0.001278f, 0.001485f, 0.001670f, 0.001929f, 0.001961f, 0.002016f, 0.002367f, 0.002785f,
- 0.003025f, 0.003248f, 0.003805f, 0.004539f, 0.004845f, 0.005733f, 0.006851f, 0.008278f,
- 0.010017f, 0.011841f, 0.014542f, 0.017807f, 0.022705f, 0.029190f, 0.038544f, 0.052612f,
- 0.073853f, 0.108093f, 0.162842f, 0.250977f, 0.377930f, 0.529785f, 0.672363f, 0.782715f,
- 0.855957f, 0.904297f, 0.973145f, 0.974121f, 0.974609f, 0.975586f, 0.974609f, 0.975098f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000158f, 0.000121f,
- 0.000190f, 0.000238f, 0.000397f, 0.000354f, 0.000364f, 0.000365f, 0.000440f, 0.000474f,
- 0.000509f, 0.000612f, 0.000611f, 0.000648f, 0.000804f, 0.000755f, 0.000943f, 0.001050f,
- 0.001221f, 0.001340f, 0.001338f, 0.001443f, 0.001635f, 0.001822f, 0.002083f, 0.002226f,
- 0.002480f, 0.002682f, 0.003185f, 0.003609f, 0.003948f, 0.005074f, 0.005558f, 0.006741f,
- 0.007904f, 0.009384f, 0.011360f, 0.014000f, 0.017883f, 0.022675f, 0.029648f, 0.039917f,
- 0.055695f, 0.080261f, 0.120728f, 0.188354f, 0.296143f, 0.443848f, 0.603027f, 0.737793f,
- 0.831055f, 0.891113f, 0.970703f, 0.971680f, 0.972168f, 0.972656f, 0.971680f, 0.972168f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f,
- 0.000121f, 0.000251f, 0.000260f, 0.000278f, 0.000315f, 0.000334f, 0.000235f, 0.000357f,
- 0.000442f, 0.000513f, 0.000504f, 0.000598f, 0.000556f, 0.000771f, 0.000831f, 0.000886f,
- 0.000977f, 0.001145f, 0.001105f, 0.001244f, 0.001281f, 0.001431f, 0.001544f, 0.001850f,
- 0.001986f, 0.002131f, 0.002537f, 0.002737f, 0.003252f, 0.003826f, 0.004555f, 0.005184f,
- 0.006199f, 0.007195f, 0.009041f, 0.011337f, 0.013878f, 0.017395f, 0.022552f, 0.030502f,
- 0.041962f, 0.059875f, 0.089111f, 0.139404f, 0.224609f, 0.357910f, 0.524902f, 0.684082f,
- 0.800781f, 0.875977f, 0.967773f, 0.968750f, 0.968262f, 0.968750f, 0.969238f, 0.969238f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000095f, 0.000081f, 0.000217f, 0.000149f, 0.000204f, 0.000212f, 0.000338f,
- 0.000345f, 0.000348f, 0.000456f, 0.000463f, 0.000495f, 0.000570f, 0.000583f, 0.000748f,
- 0.000799f, 0.000731f, 0.000965f, 0.001041f, 0.001071f, 0.001210f, 0.001318f, 0.001238f,
- 0.001410f, 0.001631f, 0.001932f, 0.002327f, 0.002577f, 0.003057f, 0.003452f, 0.003956f,
- 0.004639f, 0.005714f, 0.006817f, 0.008446f, 0.010605f, 0.013443f, 0.017319f, 0.022964f,
- 0.031021f, 0.044281f, 0.065857f, 0.102112f, 0.166504f, 0.277344f, 0.439941f, 0.617188f,
- 0.762207f, 0.856445f, 0.963379f, 0.964355f, 0.965332f, 0.964844f, 0.965332f, 0.965332f,
- 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000121f, 0.000107f, 0.000091f, 0.000161f, 0.000119f, 0.000184f, 0.000266f, 0.000284f,
- 0.000314f, 0.000319f, 0.000334f, 0.000344f, 0.000565f, 0.000455f, 0.000488f, 0.000667f,
- 0.000710f, 0.000713f, 0.000787f, 0.000755f, 0.000849f, 0.000972f, 0.001097f, 0.001286f,
- 0.001427f, 0.001556f, 0.001667f, 0.001687f, 0.002155f, 0.002369f, 0.002674f, 0.003086f,
- 0.003710f, 0.004536f, 0.005585f, 0.006783f, 0.007957f, 0.010262f, 0.013115f, 0.017212f,
- 0.023102f, 0.032715f, 0.047943f, 0.074158f, 0.121155f, 0.207520f, 0.353027f, 0.541504f,
- 0.715332f, 0.834473f, 0.959473f, 0.960449f, 0.960938f, 0.960938f, 0.960938f, 0.961426f,
- 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000120f, 0.000120f, 0.000103f, 0.000089f, 0.000077f, 0.000080f, 0.000121f, 0.000218f,
- 0.000209f, 0.000245f, 0.000303f, 0.000316f, 0.000388f, 0.000341f, 0.000549f, 0.000594f,
- 0.000604f, 0.000679f, 0.000625f, 0.000628f, 0.000795f, 0.000883f, 0.000857f, 0.000991f,
- 0.001166f, 0.000955f, 0.001194f, 0.001347f, 0.001548f, 0.001804f, 0.002048f, 0.002388f,
- 0.002911f, 0.003130f, 0.003933f, 0.004845f, 0.006031f, 0.007385f, 0.009705f, 0.012688f,
- 0.017044f, 0.023788f, 0.034882f, 0.053284f, 0.086670f, 0.151123f, 0.271484f, 0.457031f,
- 0.658203f, 0.805176f, 0.954102f, 0.955078f, 0.956055f, 0.956055f, 0.956055f, 0.955566f,
- 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f,
- 0.000120f, 0.000120f, 0.000116f, 0.000101f, 0.000088f, 0.000077f, 0.000131f, 0.000071f,
- 0.000146f, 0.000200f, 0.000237f, 0.000270f, 0.000289f, 0.000302f, 0.000311f, 0.000441f,
- 0.000396f, 0.000588f, 0.000630f, 0.000570f, 0.000575f, 0.000537f, 0.000589f, 0.000750f,
- 0.000721f, 0.001048f, 0.001122f, 0.000951f, 0.001243f, 0.001346f, 0.001703f, 0.001592f,
- 0.001880f, 0.002340f, 0.002804f, 0.003637f, 0.004356f, 0.005329f, 0.006805f, 0.009094f,
- 0.012566f, 0.017181f, 0.025040f, 0.038147f, 0.061249f, 0.107788f, 0.200195f, 0.369629f,
- 0.587891f, 0.771973f, 0.948242f, 0.949707f, 0.950195f, 0.949707f, 0.950195f, 0.950195f,
- 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f,
- 0.000120f, 0.000119f, 0.000119f, 0.000114f, 0.000101f, 0.000088f, 0.000079f, 0.000070f,
- 0.000063f, 0.000136f, 0.000136f, 0.000183f, 0.000207f, 0.000277f, 0.000271f, 0.000291f,
- 0.000369f, 0.000344f, 0.000494f, 0.000459f, 0.000515f, 0.000509f, 0.000532f, 0.000504f,
- 0.000716f, 0.000589f, 0.000691f, 0.000902f, 0.000972f, 0.000968f, 0.001067f, 0.001483f,
- 0.001780f, 0.001652f, 0.002090f, 0.002602f, 0.003113f, 0.003738f, 0.004738f, 0.006420f,
- 0.008522f, 0.012100f, 0.017334f, 0.026489f, 0.042786f, 0.074524f, 0.142578f, 0.283936f,
- 0.509277f, 0.729492f, 0.940918f, 0.941895f, 0.942383f, 0.942383f, 0.942383f, 0.942871f,
- 0.000122f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f,
- 0.000119f, 0.000118f, 0.000118f, 0.000118f, 0.000116f, 0.000102f, 0.000090f, 0.000081f,
- 0.000091f, 0.000066f, 0.000059f, 0.000110f, 0.000109f, 0.000155f, 0.000184f, 0.000227f,
- 0.000297f, 0.000333f, 0.000355f, 0.000349f, 0.000344f, 0.000421f, 0.000459f, 0.000561f,
- 0.000600f, 0.000563f, 0.000630f, 0.000563f, 0.000682f, 0.000737f, 0.000892f, 0.001037f,
- 0.001026f, 0.001163f, 0.001743f, 0.001782f, 0.002117f, 0.002573f, 0.003389f, 0.004429f,
- 0.005871f, 0.007942f, 0.011841f, 0.018066f, 0.029190f, 0.050842f, 0.098511f, 0.207397f,
- 0.422363f, 0.677734f, 0.932129f, 0.933594f, 0.933594f, 0.934082f, 0.934082f, 0.934082f,
- 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f,
- 0.000118f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000116f, 0.000104f, 0.000093f,
- 0.000084f, 0.000076f, 0.000069f, 0.000091f, 0.000057f, 0.000051f, 0.000112f, 0.000120f,
- 0.000179f, 0.000232f, 0.000225f, 0.000283f, 0.000301f, 0.000308f, 0.000353f, 0.000437f,
- 0.000395f, 0.000523f, 0.000486f, 0.000504f, 0.000469f, 0.000614f, 0.000581f, 0.000755f,
- 0.000789f, 0.001121f, 0.000981f, 0.001218f, 0.001565f, 0.001795f, 0.002296f, 0.002958f,
- 0.003866f, 0.005329f, 0.007675f, 0.011658f, 0.019043f, 0.033478f, 0.065430f, 0.144043f,
- 0.331299f, 0.613770f, 0.921387f, 0.922852f, 0.923340f, 0.923340f, 0.923340f, 0.923340f,
- 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000118f, 0.000117f, 0.000116f, 0.000116f,
- 0.000116f, 0.000116f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, 0.000114f, 0.000108f,
- 0.000097f, 0.000087f, 0.000079f, 0.000072f, 0.000065f, 0.000060f, 0.000094f, 0.000050f,
- 0.000104f, 0.000104f, 0.000121f, 0.000164f, 0.000195f, 0.000247f, 0.000265f, 0.000328f,
- 0.000290f, 0.000355f, 0.000395f, 0.000356f, 0.000361f, 0.000459f, 0.000470f, 0.000515f,
- 0.000580f, 0.000624f, 0.000751f, 0.000964f, 0.001105f, 0.001279f, 0.001413f, 0.001823f,
- 0.002441f, 0.003407f, 0.004852f, 0.007210f, 0.011803f, 0.021225f, 0.041473f, 0.095032f,
- 0.244019f, 0.537598f, 0.907715f, 0.910156f, 0.910156f, 0.909180f, 0.909668f, 0.911133f,
- 0.000120f, 0.000118f, 0.000117f, 0.000116f, 0.000114f, 0.000114f, 0.000114f, 0.000113f,
- 0.000113f, 0.000112f, 0.000112f, 0.000112f, 0.000111f, 0.000112f, 0.000111f, 0.000111f,
- 0.000111f, 0.000101f, 0.000093f, 0.000084f, 0.000077f, 0.000070f, 0.000064f, 0.000059f,
- 0.000074f, 0.000079f, 0.000059f, 0.000087f, 0.000097f, 0.000128f, 0.000185f, 0.000213f,
- 0.000265f, 0.000235f, 0.000239f, 0.000288f, 0.000299f, 0.000371f, 0.000341f, 0.000369f,
- 0.000460f, 0.000446f, 0.000490f, 0.000602f, 0.000694f, 0.000904f, 0.001012f, 0.001234f,
- 0.001544f, 0.002096f, 0.002989f, 0.004299f, 0.006840f, 0.012383f, 0.024948f, 0.059204f,
- 0.166626f, 0.452637f, 0.892578f, 0.894043f, 0.894043f, 0.894531f, 0.894531f, 0.894043f,
- 0.000115f, 0.000107f, 0.000108f, 0.000111f, 0.000108f, 0.000109f, 0.000108f, 0.000108f,
- 0.000108f, 0.000107f, 0.000108f, 0.000107f, 0.000107f, 0.000106f, 0.000107f, 0.000107f,
- 0.000106f, 0.000107f, 0.000106f, 0.000097f, 0.000090f, 0.000082f, 0.000075f, 0.000069f,
- 0.000063f, 0.000058f, 0.000053f, 0.000070f, 0.000073f, 0.000085f, 0.000077f, 0.000088f,
- 0.000136f, 0.000168f, 0.000190f, 0.000204f, 0.000199f, 0.000252f, 0.000233f, 0.000270f,
- 0.000325f, 0.000295f, 0.000348f, 0.000383f, 0.000435f, 0.000534f, 0.000581f, 0.000803f,
- 0.001004f, 0.001330f, 0.001812f, 0.002489f, 0.003944f, 0.006832f, 0.013748f, 0.033997f,
- 0.104858f, 0.356689f, 0.873047f, 0.873047f, 0.875000f, 0.874023f, 0.874023f, 0.874023f,
- 0.000000f, 0.000071f, 0.000063f, 0.000094f, 0.000092f, 0.000094f, 0.000093f, 0.000098f,
- 0.000098f, 0.000098f, 0.000098f, 0.000099f, 0.000098f, 0.000099f, 0.000099f, 0.000099f,
- 0.000099f, 0.000099f, 0.000099f, 0.000100f, 0.000100f, 0.000094f, 0.000087f, 0.000080f,
- 0.000074f, 0.000068f, 0.000062f, 0.000058f, 0.000053f, 0.000049f, 0.000059f, 0.000059f,
- 0.000045f, 0.000078f, 0.000082f, 0.000118f, 0.000155f, 0.000160f, 0.000174f, 0.000180f,
- 0.000226f, 0.000213f, 0.000248f, 0.000258f, 0.000288f, 0.000352f, 0.000396f, 0.000465f,
- 0.000566f, 0.000789f, 0.000941f, 0.001343f, 0.002199f, 0.003616f, 0.006912f, 0.017380f,
- 0.058960f, 0.259521f, 0.847656f, 0.849121f, 0.850586f, 0.850098f, 0.849121f, 0.850586f,
- 0.000000f, 0.000000f, 0.000019f, 0.000044f, 0.000048f, 0.000061f, 0.000071f, 0.000073f,
- 0.000076f, 0.000079f, 0.000079f, 0.000082f, 0.000082f, 0.000082f, 0.000085f, 0.000086f,
- 0.000087f, 0.000086f, 0.000088f, 0.000087f, 0.000089f, 0.000089f, 0.000089f, 0.000090f,
- 0.000084f, 0.000078f, 0.000072f, 0.000067f, 0.000062f, 0.000057f, 0.000052f, 0.000049f,
- 0.000045f, 0.000041f, 0.000038f, 0.000040f, 0.000062f, 0.000092f, 0.000100f, 0.000121f,
- 0.000144f, 0.000133f, 0.000137f, 0.000170f, 0.000181f, 0.000168f, 0.000215f, 0.000286f,
- 0.000327f, 0.000397f, 0.000504f, 0.000738f, 0.001039f, 0.001729f, 0.003317f, 0.007721f,
- 0.028458f, 0.166626f, 0.815430f, 0.818359f, 0.818359f, 0.817383f, 0.818848f, 0.818359f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000008f,
- 0.000016f, 0.000031f, 0.000035f, 0.000048f, 0.000050f, 0.000053f, 0.000058f, 0.000059f,
- 0.000063f, 0.000064f, 0.000067f, 0.000067f, 0.000070f, 0.000071f, 0.000072f, 0.000073f,
- 0.000075f, 0.000075f, 0.000076f, 0.000075f, 0.000069f, 0.000064f, 0.000060f, 0.000055f,
- 0.000051f, 0.000047f, 0.000043f, 0.000040f, 0.000037f, 0.000034f, 0.000040f, 0.000041f,
- 0.000054f, 0.000069f, 0.000096f, 0.000111f, 0.000109f, 0.000113f, 0.000142f, 0.000136f,
- 0.000158f, 0.000196f, 0.000237f, 0.000349f, 0.000423f, 0.000744f, 0.001380f, 0.003214f,
- 0.011124f, 0.088135f, 0.777344f, 0.779297f, 0.780273f, 0.779785f, 0.779785f, 0.779785f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000007f,
- 0.000021f, 0.000023f, 0.000031f, 0.000034f, 0.000038f, 0.000041f, 0.000043f, 0.000047f,
- 0.000049f, 0.000050f, 0.000053f, 0.000055f, 0.000056f, 0.000057f, 0.000059f, 0.000060f,
- 0.000055f, 0.000051f, 0.000048f, 0.000044f, 0.000041f, 0.000038f, 0.000035f, 0.000032f,
- 0.000029f, 0.000028f, 0.000028f, 0.000037f, 0.000044f, 0.000064f, 0.000078f, 0.000072f,
- 0.000089f, 0.000098f, 0.000104f, 0.000146f, 0.000200f, 0.000272f, 0.000479f, 0.001077f,
- 0.003733f, 0.033752f, 0.729492f, 0.730957f, 0.732422f, 0.731934f, 0.732422f, 0.732422f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f,
- 0.000006f, 0.000009f, 0.000013f, 0.000019f, 0.000021f, 0.000025f, 0.000027f, 0.000030f,
- 0.000033f, 0.000034f, 0.000037f, 0.000039f, 0.000041f, 0.000039f, 0.000036f, 0.000033f,
- 0.000031f, 0.000028f, 0.000026f, 0.000024f, 0.000021f, 0.000019f, 0.000017f, 0.000023f,
- 0.000033f, 0.000041f, 0.000043f, 0.000058f, 0.000061f, 0.000081f, 0.000121f, 0.000248f,
- 0.000821f, 0.008255f, 0.673340f, 0.674805f, 0.674316f, 0.674805f, 0.674805f, 0.673828f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000006f, 0.000010f, 0.000013f,
- 0.000015f, 0.000017f, 0.000020f, 0.000022f, 0.000021f, 0.000019f, 0.000017f, 0.000015f,
- 0.000013f, 0.000012f, 0.000010f, 0.000011f, 0.000016f, 0.000019f, 0.000019f, 0.000036f,
- 0.000090f, 0.000897f, 0.606934f, 0.609863f, 0.609375f, 0.609863f, 0.609863f, 0.610352f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000001f, 0.000003f, 0.000006f, 0.000005f, 0.000004f, 0.000003f,
- 0.000004f, 0.000008f, 0.534668f, 0.536621f, 0.537109f, 0.537109f, 0.536621f, 0.536621f,
- },
- {
- 0.149292f, 0.432373f, 0.614258f, 0.719238f, 0.784180f, 0.826660f, 0.856934f, 0.879883f,
- 0.896484f, 0.909180f, 0.919922f, 0.928711f, 0.936035f, 0.942383f, 0.947266f, 0.952148f,
- 0.956055f, 0.959473f, 0.962891f, 0.965820f, 0.968262f, 0.970703f, 0.972656f, 0.974609f,
- 0.976562f, 0.978027f, 0.979492f, 0.980469f, 0.981934f, 0.983398f, 0.984863f, 0.985352f,
- 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.989746f, 0.990234f, 0.990723f, 0.991699f,
- 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f,
- 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f,
- 0.040161f, 0.161255f, 0.324951f, 0.486572f, 0.612305f, 0.704590f, 0.767090f, 0.811523f,
- 0.844238f, 0.868652f, 0.887695f, 0.902344f, 0.913574f, 0.924316f, 0.932129f, 0.937988f,
- 0.944336f, 0.949707f, 0.954102f, 0.957520f, 0.960938f, 0.964355f, 0.966797f, 0.969727f,
- 0.971191f, 0.973633f, 0.975586f, 0.977539f, 0.979004f, 0.980469f, 0.981445f, 0.982910f,
- 0.983887f, 0.985352f, 0.985840f, 0.987305f, 0.987793f, 0.988770f, 0.989258f, 0.990234f,
- 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.995117f,
- 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f,
- 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f,
- 0.017395f, 0.068542f, 0.149292f, 0.262451f, 0.392822f, 0.518066f, 0.621582f, 0.700195f,
- 0.759766f, 0.803711f, 0.836426f, 0.862305f, 0.880859f, 0.896484f, 0.909668f, 0.919434f,
- 0.929199f, 0.935547f, 0.941895f, 0.947754f, 0.952637f, 0.956055f, 0.959961f, 0.963867f,
- 0.965820f, 0.968750f, 0.970703f, 0.973145f, 0.975098f, 0.977051f, 0.979004f, 0.979980f,
- 0.981934f, 0.983398f, 0.983887f, 0.984863f, 0.985840f, 0.986816f, 0.987793f, 0.989258f,
- 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.992676f, 0.993652f, 0.994141f,
- 0.994629f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f,
- 0.009125f, 0.035492f, 0.075806f, 0.135864f, 0.219971f, 0.324707f, 0.437012f, 0.543457f,
- 0.633789f, 0.704102f, 0.758789f, 0.802246f, 0.833496f, 0.857910f, 0.878418f, 0.894043f,
- 0.906738f, 0.917480f, 0.925781f, 0.933594f, 0.940918f, 0.946777f, 0.951172f, 0.954590f,
- 0.959473f, 0.962891f, 0.965820f, 0.968262f, 0.971191f, 0.973145f, 0.975098f, 0.976562f,
- 0.978516f, 0.979980f, 0.981445f, 0.982422f, 0.983887f, 0.985840f, 0.986328f, 0.987305f,
- 0.988281f, 0.988770f, 0.989746f, 0.990234f, 0.991699f, 0.992188f, 0.992676f, 0.993652f,
- 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997559f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.005848f, 0.021225f, 0.043640f, 0.076782f, 0.124084f, 0.189575f, 0.274414f, 0.372559f,
- 0.473633f, 0.567383f, 0.646973f, 0.711426f, 0.761230f, 0.801758f, 0.833496f, 0.857422f,
- 0.876953f, 0.893066f, 0.905273f, 0.916504f, 0.925293f, 0.932617f, 0.939941f, 0.945801f,
- 0.950684f, 0.955566f, 0.958984f, 0.962402f, 0.965820f, 0.968262f, 0.970703f, 0.972656f,
- 0.975098f, 0.977051f, 0.978516f, 0.980469f, 0.981934f, 0.982422f, 0.983887f, 0.985840f,
- 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992188f,
- 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, 0.996094f, 0.997070f,
- 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f,
- 0.003937f, 0.014107f, 0.027664f, 0.047211f, 0.075195f, 0.113953f, 0.166748f, 0.236328f,
- 0.320312f, 0.412354f, 0.504395f, 0.589844f, 0.661621f, 0.719727f, 0.768066f, 0.805664f,
- 0.834961f, 0.858398f, 0.877441f, 0.893066f, 0.906738f, 0.916992f, 0.926270f, 0.933105f,
- 0.940430f, 0.946289f, 0.951172f, 0.955566f, 0.959473f, 0.962891f, 0.965820f, 0.968262f,
- 0.970703f, 0.973145f, 0.975098f, 0.977051f, 0.979004f, 0.980469f, 0.981934f, 0.983398f,
- 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, 0.991211f,
- 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.995605f,
- 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f,
- 0.002962f, 0.009674f, 0.019348f, 0.031708f, 0.049255f, 0.072754f, 0.105164f, 0.149048f,
- 0.206665f, 0.278076f, 0.361572f, 0.448730f, 0.534668f, 0.611816f, 0.677734f, 0.730957f,
- 0.775879f, 0.809570f, 0.837891f, 0.861328f, 0.879395f, 0.894531f, 0.907227f, 0.916992f,
- 0.926270f, 0.934082f, 0.940918f, 0.946289f, 0.951172f, 0.956055f, 0.959473f, 0.962891f,
- 0.966797f, 0.969238f, 0.971191f, 0.973633f, 0.976074f, 0.977539f, 0.979492f, 0.980957f,
- 0.982422f, 0.983398f, 0.984863f, 0.986328f, 0.986816f, 0.988281f, 0.989746f, 0.989746f,
- 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.994629f, 0.995605f,
- 0.996094f, 0.997070f, 0.998535f, 0.999023f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.001900f, 0.007225f, 0.013733f, 0.022552f, 0.033661f, 0.049164f, 0.070374f, 0.097534f,
- 0.135132f, 0.183350f, 0.244507f, 0.317871f, 0.400146f, 0.483643f, 0.562988f, 0.633301f,
- 0.693848f, 0.743652f, 0.784180f, 0.816895f, 0.842773f, 0.865234f, 0.882812f, 0.896973f,
- 0.908691f, 0.919434f, 0.927734f, 0.935547f, 0.942383f, 0.947266f, 0.952637f, 0.957031f,
- 0.960938f, 0.964355f, 0.967285f, 0.969727f, 0.971680f, 0.974609f, 0.976074f, 0.978027f,
- 0.979980f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.988281f, 0.988770f,
- 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f,
- 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f,
- 0.001921f, 0.005543f, 0.010223f, 0.016312f, 0.024918f, 0.035217f, 0.049164f, 0.067017f,
- 0.091125f, 0.122986f, 0.164673f, 0.217896f, 0.282471f, 0.356934f, 0.436768f, 0.516602f,
- 0.590820f, 0.656250f, 0.711426f, 0.757812f, 0.794922f, 0.825684f, 0.850098f, 0.870605f,
- 0.885742f, 0.900879f, 0.912109f, 0.921387f, 0.929688f, 0.937500f, 0.943848f, 0.949219f,
- 0.953125f, 0.958496f, 0.961426f, 0.964844f, 0.967773f, 0.970703f, 0.973145f, 0.975098f,
- 0.977539f, 0.979004f, 0.980957f, 0.982422f, 0.983887f, 0.985352f, 0.986328f, 0.987793f,
- 0.988770f, 0.989258f, 0.990723f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f,
- 0.994629f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f,
- 0.001360f, 0.004257f, 0.007988f, 0.013092f, 0.018753f, 0.026352f, 0.035645f, 0.048096f,
- 0.064270f, 0.085449f, 0.113770f, 0.149292f, 0.195190f, 0.251953f, 0.320557f, 0.395020f,
- 0.474121f, 0.549316f, 0.618652f, 0.678223f, 0.729492f, 0.770996f, 0.805176f, 0.833496f,
- 0.855957f, 0.875977f, 0.891113f, 0.904785f, 0.915039f, 0.924316f, 0.933105f, 0.939453f,
- 0.945312f, 0.950684f, 0.955078f, 0.959473f, 0.962891f, 0.966309f, 0.969727f, 0.972168f,
- 0.974121f, 0.976562f, 0.978516f, 0.979980f, 0.981934f, 0.983398f, 0.984375f, 0.986328f,
- 0.986816f, 0.988281f, 0.989746f, 0.990234f, 0.991699f, 0.992188f, 0.992676f, 0.994141f,
- 0.994141f, 0.994629f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f,
- 0.001075f, 0.003492f, 0.006275f, 0.010223f, 0.014473f, 0.019821f, 0.026581f, 0.035492f,
- 0.046967f, 0.061829f, 0.080750f, 0.105164f, 0.136475f, 0.177246f, 0.227783f, 0.288818f,
- 0.358154f, 0.433594f, 0.509277f, 0.581543f, 0.645508f, 0.701172f, 0.747070f, 0.783691f,
- 0.817383f, 0.842773f, 0.864258f, 0.881836f, 0.896484f, 0.908691f, 0.918945f, 0.928223f,
- 0.935547f, 0.941895f, 0.948730f, 0.952637f, 0.957031f, 0.962402f, 0.964844f, 0.967773f,
- 0.970703f, 0.973633f, 0.975586f, 0.977539f, 0.979492f, 0.981445f, 0.982910f, 0.984375f,
- 0.985840f, 0.986816f, 0.988281f, 0.988770f, 0.990234f, 0.991211f, 0.992188f, 0.992676f,
- 0.993164f, 0.994141f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.997559f, 0.998047f,
- 0.000967f, 0.002928f, 0.005283f, 0.007759f, 0.011612f, 0.015823f, 0.020966f, 0.027802f,
- 0.035461f, 0.045959f, 0.059235f, 0.075928f, 0.097778f, 0.126099f, 0.162598f, 0.207153f,
- 0.261963f, 0.326416f, 0.398193f, 0.471680f, 0.543945f, 0.612305f, 0.671875f, 0.722656f,
- 0.765137f, 0.799805f, 0.828125f, 0.854004f, 0.872070f, 0.888184f, 0.902344f, 0.914062f,
- 0.923340f, 0.931641f, 0.938965f, 0.945312f, 0.950684f, 0.955566f, 0.958984f, 0.962891f,
- 0.966309f, 0.969727f, 0.972168f, 0.974609f, 0.977051f, 0.978516f, 0.980469f, 0.982422f,
- 0.984375f, 0.985352f, 0.987305f, 0.987793f, 0.988770f, 0.990234f, 0.991211f, 0.992188f,
- 0.992676f, 0.993164f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f,
- 0.000602f, 0.002605f, 0.004345f, 0.006706f, 0.009590f, 0.012650f, 0.016617f, 0.021423f,
- 0.027893f, 0.035004f, 0.044495f, 0.056610f, 0.072327f, 0.092285f, 0.116821f, 0.148926f,
- 0.189697f, 0.238892f, 0.298340f, 0.365723f, 0.437988f, 0.511230f, 0.579590f, 0.642090f,
- 0.698242f, 0.744141f, 0.781738f, 0.814453f, 0.840332f, 0.861816f, 0.880371f, 0.895996f,
- 0.907715f, 0.918945f, 0.928223f, 0.935547f, 0.942871f, 0.948730f, 0.953125f, 0.958008f,
- 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.976562f, 0.978516f, 0.979980f,
- 0.981934f, 0.983398f, 0.985352f, 0.986816f, 0.988281f, 0.988770f, 0.989746f, 0.990723f,
- 0.991699f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997070f, 0.997070f, 0.997070f,
- 0.000607f, 0.001955f, 0.003616f, 0.005772f, 0.007656f, 0.010269f, 0.013496f, 0.017273f,
- 0.022018f, 0.027466f, 0.034729f, 0.043488f, 0.054932f, 0.068359f, 0.086365f, 0.108765f,
- 0.137939f, 0.174316f, 0.219360f, 0.273926f, 0.336670f, 0.406494f, 0.478516f, 0.549316f,
- 0.614746f, 0.673340f, 0.722656f, 0.765137f, 0.800293f, 0.828125f, 0.853516f, 0.872070f,
- 0.888672f, 0.902832f, 0.914551f, 0.924316f, 0.932129f, 0.940430f, 0.946289f, 0.951660f,
- 0.956055f, 0.960449f, 0.964355f, 0.967773f, 0.970703f, 0.972656f, 0.975586f, 0.978027f,
- 0.980469f, 0.981934f, 0.983398f, 0.985352f, 0.986328f, 0.988281f, 0.988770f, 0.990234f,
- 0.990723f, 0.992188f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000600f, 0.001813f, 0.003101f, 0.004559f, 0.006580f, 0.008873f, 0.011047f, 0.014091f,
- 0.017639f, 0.022049f, 0.027557f, 0.033997f, 0.042297f, 0.052704f, 0.065369f, 0.081238f,
- 0.101929f, 0.127930f, 0.161255f, 0.202515f, 0.252686f, 0.311523f, 0.378174f, 0.449707f,
- 0.519531f, 0.587891f, 0.647949f, 0.701660f, 0.746582f, 0.784668f, 0.817383f, 0.843262f,
- 0.864746f, 0.882324f, 0.896973f, 0.910156f, 0.920898f, 0.929688f, 0.937012f, 0.943848f,
- 0.949707f, 0.955078f, 0.959473f, 0.963379f, 0.966797f, 0.970215f, 0.973145f, 0.975098f,
- 0.978027f, 0.980469f, 0.982422f, 0.983887f, 0.984863f, 0.986328f, 0.987793f, 0.988770f,
- 0.989746f, 0.991211f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.000604f, 0.001429f, 0.002676f, 0.003708f, 0.005745f, 0.006973f, 0.009270f, 0.011452f,
- 0.014503f, 0.018295f, 0.022369f, 0.027222f, 0.033417f, 0.040833f, 0.050171f, 0.062744f,
- 0.077454f, 0.095886f, 0.119995f, 0.150391f, 0.187622f, 0.234253f, 0.289307f, 0.353027f,
- 0.421631f, 0.492676f, 0.561523f, 0.625488f, 0.681152f, 0.730469f, 0.770996f, 0.806152f,
- 0.833984f, 0.857422f, 0.876465f, 0.893066f, 0.906250f, 0.916992f, 0.926758f, 0.935059f,
- 0.942871f, 0.948242f, 0.954102f, 0.958496f, 0.962891f, 0.966309f, 0.969727f, 0.972168f,
- 0.975098f, 0.977539f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f, 0.987793f,
- 0.989258f, 0.990234f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f,
- 0.000365f, 0.001367f, 0.002123f, 0.003353f, 0.004692f, 0.006054f, 0.007675f, 0.009819f,
- 0.012314f, 0.014862f, 0.018066f, 0.022064f, 0.026901f, 0.032471f, 0.039764f, 0.048584f,
- 0.060089f, 0.073730f, 0.090698f, 0.112854f, 0.140381f, 0.175415f, 0.218018f, 0.269775f,
- 0.329834f, 0.396240f, 0.467285f, 0.537598f, 0.603516f, 0.662109f, 0.712891f, 0.757324f,
- 0.793945f, 0.823730f, 0.849121f, 0.869629f, 0.887695f, 0.902344f, 0.914062f, 0.924805f,
- 0.932129f, 0.940430f, 0.947266f, 0.952148f, 0.957031f, 0.962402f, 0.966309f, 0.969238f,
- 0.972656f, 0.975586f, 0.977051f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f,
- 0.988281f, 0.988770f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f,
- 0.000356f, 0.001341f, 0.001913f, 0.002897f, 0.003983f, 0.005322f, 0.006607f, 0.008514f,
- 0.010399f, 0.012451f, 0.015282f, 0.018356f, 0.021912f, 0.026443f, 0.031982f, 0.038635f,
- 0.047150f, 0.057495f, 0.070007f, 0.086609f, 0.106689f, 0.131714f, 0.164429f, 0.203613f,
- 0.252441f, 0.310059f, 0.374512f, 0.444092f, 0.514160f, 0.582031f, 0.643066f, 0.697266f,
- 0.743652f, 0.783691f, 0.814941f, 0.842773f, 0.865234f, 0.882812f, 0.897949f, 0.910645f,
- 0.922363f, 0.931152f, 0.938965f, 0.945801f, 0.952148f, 0.957520f, 0.961426f, 0.965820f,
- 0.969727f, 0.972168f, 0.975098f, 0.977539f, 0.979980f, 0.981934f, 0.983887f, 0.985352f,
- 0.986816f, 0.988281f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f,
- 0.000243f, 0.000937f, 0.001662f, 0.002617f, 0.003527f, 0.004555f, 0.005642f, 0.007217f,
- 0.008820f, 0.010483f, 0.012383f, 0.015175f, 0.018341f, 0.022049f, 0.026245f, 0.031067f,
- 0.037903f, 0.045563f, 0.054962f, 0.066956f, 0.082092f, 0.101074f, 0.124939f, 0.154663f,
- 0.191528f, 0.237305f, 0.291992f, 0.354492f, 0.422852f, 0.492676f, 0.562012f, 0.625488f,
- 0.682617f, 0.731934f, 0.772949f, 0.807129f, 0.835449f, 0.859863f, 0.878906f, 0.895020f,
- 0.908203f, 0.920898f, 0.929199f, 0.937988f, 0.945312f, 0.951660f, 0.957031f, 0.961914f,
- 0.965332f, 0.968750f, 0.972656f, 0.975098f, 0.977539f, 0.979980f, 0.982422f, 0.983887f,
- 0.986328f, 0.987793f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f,
- 0.000362f, 0.000970f, 0.001489f, 0.002251f, 0.002892f, 0.003727f, 0.004978f, 0.006264f,
- 0.007530f, 0.009125f, 0.010551f, 0.012756f, 0.015259f, 0.018097f, 0.021637f, 0.025986f,
- 0.030594f, 0.036804f, 0.044006f, 0.053162f, 0.064148f, 0.078003f, 0.096130f, 0.118042f,
- 0.146118f, 0.181030f, 0.224487f, 0.276123f, 0.336670f, 0.403320f, 0.473633f, 0.543457f,
- 0.609375f, 0.667480f, 0.719238f, 0.763184f, 0.799316f, 0.829590f, 0.854492f, 0.875488f,
- 0.892578f, 0.906738f, 0.918945f, 0.928711f, 0.937012f, 0.944336f, 0.951172f, 0.956543f,
- 0.961426f, 0.965820f, 0.968750f, 0.972656f, 0.975098f, 0.978027f, 0.980469f, 0.982910f,
- 0.984375f, 0.985840f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995117f,
- 0.000346f, 0.000923f, 0.001273f, 0.002010f, 0.002619f, 0.003689f, 0.004452f, 0.005177f,
- 0.006290f, 0.007561f, 0.009033f, 0.010902f, 0.012970f, 0.015495f, 0.018280f, 0.021576f,
- 0.024948f, 0.030304f, 0.035400f, 0.042480f, 0.051086f, 0.061401f, 0.074890f, 0.091187f,
- 0.112427f, 0.138794f, 0.171631f, 0.212158f, 0.262451f, 0.320557f, 0.385986f, 0.456055f,
- 0.525391f, 0.593262f, 0.654297f, 0.708984f, 0.754883f, 0.792969f, 0.824707f, 0.850098f,
- 0.872070f, 0.890137f, 0.904785f, 0.917480f, 0.927734f, 0.937012f, 0.944336f, 0.951172f,
- 0.956055f, 0.961914f, 0.966309f, 0.969727f, 0.973145f, 0.976074f, 0.978516f, 0.980469f,
- 0.982910f, 0.984863f, 0.993652f, 0.995117f, 0.994629f, 0.994629f, 0.994629f, 0.994629f,
- 0.000242f, 0.000666f, 0.001081f, 0.001806f, 0.002512f, 0.003397f, 0.003866f, 0.004894f,
- 0.005566f, 0.006859f, 0.007957f, 0.009506f, 0.011009f, 0.013046f, 0.015266f, 0.018173f,
- 0.021027f, 0.024811f, 0.029526f, 0.034790f, 0.041443f, 0.049835f, 0.059265f, 0.071899f,
- 0.087769f, 0.107422f, 0.132202f, 0.163208f, 0.201782f, 0.249512f, 0.305908f, 0.370361f,
- 0.440430f, 0.511230f, 0.578613f, 0.642090f, 0.698730f, 0.746582f, 0.787109f, 0.819824f,
- 0.848145f, 0.869141f, 0.888672f, 0.903809f, 0.916992f, 0.927246f, 0.936523f, 0.943848f,
- 0.951660f, 0.957031f, 0.961426f, 0.965820f, 0.970215f, 0.973145f, 0.976074f, 0.979004f,
- 0.981445f, 0.983398f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994141f,
- 0.000242f, 0.000709f, 0.000917f, 0.001194f, 0.002018f, 0.002634f, 0.003504f, 0.003918f,
- 0.005020f, 0.005726f, 0.006935f, 0.008141f, 0.009666f, 0.011040f, 0.012848f, 0.014961f,
- 0.017624f, 0.020660f, 0.024368f, 0.028381f, 0.033905f, 0.040283f, 0.047760f, 0.057312f,
- 0.069214f, 0.083984f, 0.102539f, 0.126221f, 0.155640f, 0.193359f, 0.238892f, 0.293701f,
- 0.356689f, 0.425537f, 0.497070f, 0.568359f, 0.632812f, 0.690918f, 0.739746f, 0.782227f,
- 0.816406f, 0.845703f, 0.868652f, 0.887695f, 0.903320f, 0.916992f, 0.927734f, 0.937012f,
- 0.944824f, 0.951660f, 0.957031f, 0.962891f, 0.966797f, 0.971191f, 0.973633f, 0.976562f,
- 0.979492f, 0.981934f, 0.992676f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.994141f,
- 0.000244f, 0.000660f, 0.000918f, 0.001343f, 0.002117f, 0.002407f, 0.002779f, 0.003626f,
- 0.004246f, 0.005207f, 0.005913f, 0.007145f, 0.008163f, 0.009438f, 0.011101f, 0.012871f,
- 0.014999f, 0.017426f, 0.020096f, 0.024185f, 0.027725f, 0.032623f, 0.038910f, 0.046387f,
- 0.055298f, 0.066467f, 0.080627f, 0.098328f, 0.120972f, 0.149658f, 0.184814f, 0.229492f,
- 0.282715f, 0.344727f, 0.414062f, 0.486084f, 0.556641f, 0.624023f, 0.683594f, 0.735352f,
- 0.778320f, 0.814453f, 0.843750f, 0.867188f, 0.887207f, 0.903320f, 0.916504f, 0.928223f,
- 0.937500f, 0.945312f, 0.953125f, 0.958008f, 0.964355f, 0.967285f, 0.971680f, 0.975098f,
- 0.978516f, 0.980957f, 0.992676f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.993164f,
- 0.000200f, 0.000480f, 0.000808f, 0.001303f, 0.001680f, 0.002104f, 0.002510f, 0.002934f,
- 0.003468f, 0.004429f, 0.005539f, 0.006046f, 0.006889f, 0.008438f, 0.009415f, 0.011108f,
- 0.012787f, 0.014572f, 0.017517f, 0.020279f, 0.023483f, 0.027359f, 0.031860f, 0.037964f,
- 0.045227f, 0.053711f, 0.064148f, 0.077759f, 0.095093f, 0.116272f, 0.143311f, 0.177856f,
- 0.221191f, 0.273193f, 0.334473f, 0.403320f, 0.476318f, 0.548828f, 0.617188f, 0.677734f,
- 0.730957f, 0.775879f, 0.812500f, 0.842285f, 0.866699f, 0.887695f, 0.903809f, 0.916992f,
- 0.928711f, 0.938477f, 0.946777f, 0.953125f, 0.959473f, 0.963867f, 0.968750f, 0.972656f,
- 0.976074f, 0.979004f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.992676f, 0.993164f,
- 0.000243f, 0.000469f, 0.000878f, 0.001158f, 0.001382f, 0.001801f, 0.002220f, 0.002699f,
- 0.003273f, 0.004063f, 0.004715f, 0.005447f, 0.005917f, 0.007099f, 0.008385f, 0.009521f,
- 0.011032f, 0.012627f, 0.014870f, 0.016922f, 0.019836f, 0.023010f, 0.026642f, 0.031174f,
- 0.036926f, 0.043549f, 0.051941f, 0.062561f, 0.075317f, 0.091553f, 0.112427f, 0.138428f,
- 0.172485f, 0.213867f, 0.265381f, 0.326172f, 0.394775f, 0.467773f, 0.541504f, 0.610840f,
- 0.673340f, 0.728516f, 0.774414f, 0.812012f, 0.842773f, 0.867676f, 0.887695f, 0.904297f,
- 0.918457f, 0.929688f, 0.939453f, 0.948242f, 0.955078f, 0.959961f, 0.965820f, 0.970215f,
- 0.974121f, 0.977051f, 0.991211f, 0.993164f, 0.993164f, 0.992188f, 0.993164f, 0.992188f,
- 0.000000f, 0.000242f, 0.000799f, 0.000998f, 0.001273f, 0.001671f, 0.002069f, 0.002485f,
- 0.003212f, 0.003578f, 0.003948f, 0.004559f, 0.005524f, 0.006321f, 0.007046f, 0.008438f,
- 0.009438f, 0.010986f, 0.012390f, 0.014320f, 0.016663f, 0.019165f, 0.022476f, 0.025833f,
- 0.030487f, 0.035675f, 0.042358f, 0.050018f, 0.060211f, 0.072693f, 0.088379f, 0.108948f,
- 0.134766f, 0.166626f, 0.208008f, 0.258545f, 0.318848f, 0.387451f, 0.461670f, 0.536621f,
- 0.606934f, 0.671387f, 0.727539f, 0.773438f, 0.811523f, 0.843750f, 0.868164f, 0.889160f,
- 0.906250f, 0.920410f, 0.932617f, 0.941895f, 0.949707f, 0.956055f, 0.962402f, 0.967285f,
- 0.971680f, 0.975586f, 0.990723f, 0.991699f, 0.991699f, 0.992188f, 0.992188f, 0.991699f,
- 0.000237f, 0.000482f, 0.000772f, 0.000877f, 0.001109f, 0.001494f, 0.001991f, 0.002041f,
- 0.002537f, 0.002975f, 0.003469f, 0.004128f, 0.004841f, 0.005550f, 0.006306f, 0.007359f,
- 0.008369f, 0.009415f, 0.010788f, 0.012306f, 0.014160f, 0.016571f, 0.018921f, 0.021896f,
- 0.025497f, 0.029587f, 0.034576f, 0.041260f, 0.049011f, 0.058319f, 0.070557f, 0.086060f,
- 0.105774f, 0.130737f, 0.162720f, 0.203247f, 0.252930f, 0.313477f, 0.382568f, 0.457275f,
- 0.532715f, 0.605469f, 0.671387f, 0.728027f, 0.774902f, 0.814453f, 0.844727f, 0.870605f,
- 0.891113f, 0.909180f, 0.922852f, 0.934082f, 0.943359f, 0.951660f, 0.958008f, 0.964355f,
- 0.968750f, 0.973145f, 0.990234f, 0.990723f, 0.991699f, 0.991211f, 0.991211f, 0.991211f,
- 0.000235f, 0.000461f, 0.000484f, 0.000891f, 0.001105f, 0.001346f, 0.001634f, 0.001936f,
- 0.002438f, 0.002874f, 0.003353f, 0.003925f, 0.004189f, 0.004887f, 0.005684f, 0.006279f,
- 0.007298f, 0.008339f, 0.009384f, 0.010674f, 0.012360f, 0.013901f, 0.016113f, 0.018677f,
- 0.021469f, 0.024841f, 0.029144f, 0.033783f, 0.039948f, 0.047272f, 0.056915f, 0.068726f,
- 0.083801f, 0.102905f, 0.127563f, 0.159058f, 0.199341f, 0.248901f, 0.309570f, 0.379395f,
- 0.454834f, 0.532715f, 0.606934f, 0.672852f, 0.729980f, 0.778320f, 0.817383f, 0.849121f,
- 0.874512f, 0.895020f, 0.911621f, 0.924805f, 0.937012f, 0.946289f, 0.954102f, 0.960938f,
- 0.965820f, 0.971191f, 0.989258f, 0.990234f, 0.990723f, 0.991211f, 0.990723f, 0.990723f,
- 0.000000f, 0.000360f, 0.000477f, 0.000756f, 0.000896f, 0.001065f, 0.001570f, 0.001622f,
- 0.002064f, 0.002525f, 0.002819f, 0.003004f, 0.003700f, 0.004356f, 0.005077f, 0.005428f,
- 0.006283f, 0.007370f, 0.008339f, 0.009323f, 0.010567f, 0.012070f, 0.013672f, 0.015839f,
- 0.018066f, 0.020844f, 0.024002f, 0.028183f, 0.033051f, 0.039246f, 0.046417f, 0.055450f,
- 0.067200f, 0.082031f, 0.100586f, 0.125122f, 0.156250f, 0.196167f, 0.245972f, 0.307129f,
- 0.378174f, 0.454834f, 0.533203f, 0.608398f, 0.675781f, 0.734375f, 0.782715f, 0.821777f,
- 0.853516f, 0.878906f, 0.898926f, 0.915039f, 0.929199f, 0.939941f, 0.948730f, 0.956055f,
- 0.963379f, 0.968262f, 0.988770f, 0.989746f, 0.990234f, 0.989746f, 0.989746f, 0.990234f,
- 0.000000f, 0.000256f, 0.000467f, 0.000590f, 0.000772f, 0.001095f, 0.001356f, 0.001781f,
- 0.001984f, 0.002161f, 0.002546f, 0.002956f, 0.003338f, 0.003899f, 0.004440f, 0.004986f,
- 0.005486f, 0.006310f, 0.006969f, 0.008148f, 0.009148f, 0.010284f, 0.011902f, 0.013573f,
- 0.015465f, 0.017853f, 0.020340f, 0.023590f, 0.027298f, 0.032227f, 0.038208f, 0.045563f,
- 0.054047f, 0.065796f, 0.080322f, 0.098999f, 0.122864f, 0.153809f, 0.193970f, 0.244629f,
- 0.306396f, 0.378662f, 0.457031f, 0.536621f, 0.613770f, 0.681641f, 0.740723f, 0.788574f,
- 0.827637f, 0.858398f, 0.884277f, 0.903320f, 0.919922f, 0.932129f, 0.942871f, 0.951660f,
- 0.959961f, 0.965820f, 0.987305f, 0.988281f, 0.989258f, 0.989258f, 0.989258f, 0.989258f,
- 0.000244f, 0.000243f, 0.000583f, 0.000585f, 0.000822f, 0.001073f, 0.001159f, 0.001452f,
- 0.001525f, 0.002001f, 0.002201f, 0.002714f, 0.002932f, 0.003525f, 0.003904f, 0.004482f,
- 0.004997f, 0.005581f, 0.006233f, 0.006954f, 0.007820f, 0.008949f, 0.009941f, 0.011482f,
- 0.013168f, 0.015099f, 0.017151f, 0.020111f, 0.022949f, 0.026947f, 0.031647f, 0.037354f,
- 0.044342f, 0.053375f, 0.064331f, 0.078857f, 0.097351f, 0.121033f, 0.152588f, 0.192749f,
- 0.244263f, 0.307129f, 0.380615f, 0.461426f, 0.543457f, 0.621582f, 0.690430f, 0.748047f,
- 0.796387f, 0.834961f, 0.865723f, 0.889160f, 0.908691f, 0.924316f, 0.937500f, 0.946777f,
- 0.955078f, 0.962891f, 0.986328f, 0.987793f, 0.988770f, 0.988770f, 0.988770f, 0.988770f,
- 0.000000f, 0.000243f, 0.000308f, 0.000541f, 0.000801f, 0.000827f, 0.001057f, 0.001280f,
- 0.001460f, 0.001781f, 0.002090f, 0.002481f, 0.002756f, 0.003054f, 0.003321f, 0.003948f,
- 0.004303f, 0.004898f, 0.005306f, 0.006405f, 0.006954f, 0.007851f, 0.008537f, 0.009918f,
- 0.011208f, 0.012825f, 0.014534f, 0.016861f, 0.019379f, 0.022629f, 0.026276f, 0.030838f,
- 0.036407f, 0.043488f, 0.051819f, 0.063416f, 0.077209f, 0.095825f, 0.119812f, 0.151489f,
- 0.192749f, 0.245361f, 0.309814f, 0.385986f, 0.469238f, 0.552246f, 0.630859f, 0.699707f,
- 0.757324f, 0.805176f, 0.842773f, 0.873047f, 0.895508f, 0.914062f, 0.929688f, 0.941406f,
- 0.952148f, 0.959473f, 0.985840f, 0.986816f, 0.987305f, 0.987305f, 0.987305f, 0.987305f,
- 0.000000f, 0.000243f, 0.000242f, 0.000548f, 0.000695f, 0.000803f, 0.001053f, 0.001198f,
- 0.001363f, 0.001513f, 0.001886f, 0.002069f, 0.002447f, 0.002676f, 0.003138f, 0.003551f,
- 0.003868f, 0.004261f, 0.004936f, 0.005337f, 0.005852f, 0.006615f, 0.007519f, 0.008575f,
- 0.009705f, 0.010872f, 0.012688f, 0.014397f, 0.016479f, 0.019119f, 0.022064f, 0.025589f,
- 0.030304f, 0.035828f, 0.042603f, 0.050812f, 0.062012f, 0.076355f, 0.094971f, 0.119263f,
- 0.151367f, 0.193726f, 0.247925f, 0.314941f, 0.393311f, 0.478271f, 0.563965f, 0.642578f,
- 0.711914f, 0.769043f, 0.815430f, 0.851562f, 0.881348f, 0.902832f, 0.921387f, 0.934570f,
- 0.945801f, 0.955078f, 0.984375f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f,
- 0.000000f, 0.000234f, 0.000239f, 0.000308f, 0.000597f, 0.000690f, 0.000868f, 0.000937f,
- 0.001189f, 0.001404f, 0.001696f, 0.001854f, 0.002180f, 0.002249f, 0.002672f, 0.002979f,
- 0.003494f, 0.003761f, 0.004257f, 0.004745f, 0.005154f, 0.005821f, 0.006561f, 0.007557f,
- 0.008575f, 0.009575f, 0.010963f, 0.012238f, 0.014130f, 0.016113f, 0.018539f, 0.021545f,
- 0.025162f, 0.029404f, 0.034851f, 0.041626f, 0.050354f, 0.061218f, 0.075562f, 0.094482f,
- 0.119507f, 0.152344f, 0.196167f, 0.252197f, 0.322266f, 0.404053f, 0.490967f, 0.577637f,
- 0.658203f, 0.726074f, 0.782715f, 0.827637f, 0.861816f, 0.889648f, 0.910645f, 0.926758f,
- 0.940918f, 0.950684f, 0.983398f, 0.985352f, 0.984863f, 0.985352f, 0.985840f, 0.985352f,
- 0.000000f, 0.000240f, 0.000237f, 0.000239f, 0.000436f, 0.000648f, 0.000661f, 0.000892f,
- 0.001089f, 0.001484f, 0.001446f, 0.001586f, 0.001896f, 0.002176f, 0.002325f, 0.002634f,
- 0.003057f, 0.003315f, 0.003561f, 0.004150f, 0.004578f, 0.005180f, 0.005768f, 0.006485f,
- 0.007286f, 0.008400f, 0.009453f, 0.010429f, 0.011795f, 0.013680f, 0.015671f, 0.018005f,
- 0.020981f, 0.024521f, 0.028748f, 0.034119f, 0.040863f, 0.049622f, 0.060303f, 0.074829f,
- 0.094116f, 0.119995f, 0.154297f, 0.199341f, 0.258301f, 0.331787f, 0.416504f, 0.507812f,
- 0.595703f, 0.675781f, 0.743164f, 0.797852f, 0.840820f, 0.873535f, 0.899414f, 0.919434f,
- 0.934082f, 0.947266f, 0.982422f, 0.983887f, 0.983887f, 0.984375f, 0.984375f, 0.983887f,
- 0.000136f, 0.000115f, 0.000237f, 0.000238f, 0.000358f, 0.000452f, 0.000759f, 0.000961f,
- 0.001026f, 0.001113f, 0.001433f, 0.001564f, 0.001659f, 0.001955f, 0.002024f, 0.002384f,
- 0.002647f, 0.002974f, 0.003267f, 0.003611f, 0.003971f, 0.004498f, 0.005043f, 0.005539f,
- 0.006344f, 0.007168f, 0.007942f, 0.009010f, 0.010353f, 0.011711f, 0.013458f, 0.015213f,
- 0.017548f, 0.020279f, 0.023926f, 0.028061f, 0.033356f, 0.040283f, 0.048615f, 0.060455f,
- 0.074890f, 0.094727f, 0.121216f, 0.156860f, 0.204102f, 0.266846f, 0.344238f, 0.433105f,
- 0.526855f, 0.616699f, 0.696289f, 0.761230f, 0.813965f, 0.854492f, 0.884766f, 0.909180f,
- 0.927734f, 0.941895f, 0.980957f, 0.982422f, 0.982910f, 0.982422f, 0.982422f, 0.982910f,
- 0.000000f, 0.000103f, 0.000208f, 0.000356f, 0.000355f, 0.000400f, 0.000454f, 0.000861f,
- 0.000922f, 0.001202f, 0.001088f, 0.001401f, 0.001493f, 0.001779f, 0.001881f, 0.002180f,
- 0.002329f, 0.002483f, 0.002846f, 0.003178f, 0.003542f, 0.003914f, 0.004406f, 0.004871f,
- 0.005352f, 0.006119f, 0.006927f, 0.007904f, 0.008759f, 0.009972f, 0.011284f, 0.013046f,
- 0.014938f, 0.016998f, 0.019943f, 0.023224f, 0.027161f, 0.032776f, 0.039917f, 0.048218f,
- 0.059937f, 0.075134f, 0.095642f, 0.123169f, 0.160767f, 0.211670f, 0.278320f, 0.360352f,
- 0.454102f, 0.550293f, 0.640625f, 0.718262f, 0.781738f, 0.831055f, 0.869141f, 0.897461f,
- 0.919434f, 0.936035f, 0.979492f, 0.980957f, 0.980957f, 0.981934f, 0.981445f, 0.981445f,
- 0.000000f, 0.000192f, 0.000191f, 0.000350f, 0.000352f, 0.000354f, 0.000599f, 0.000721f,
- 0.000835f, 0.001044f, 0.000988f, 0.001141f, 0.001255f, 0.001479f, 0.001705f, 0.001815f,
- 0.001843f, 0.002151f, 0.002369f, 0.002831f, 0.003067f, 0.003431f, 0.003698f, 0.004295f,
- 0.004738f, 0.005352f, 0.005859f, 0.006615f, 0.007587f, 0.008583f, 0.009682f, 0.010735f,
- 0.012405f, 0.014381f, 0.016708f, 0.018921f, 0.022736f, 0.026947f, 0.032104f, 0.039032f,
- 0.048004f, 0.059784f, 0.075500f, 0.096924f, 0.125977f, 0.166626f, 0.221069f, 0.292969f,
- 0.380371f, 0.479004f, 0.577637f, 0.667969f, 0.743164f, 0.803711f, 0.849609f, 0.883789f,
- 0.910645f, 0.930176f, 0.977539f, 0.979492f, 0.979492f, 0.979492f, 0.979980f, 0.979492f,
- 0.000000f, 0.000000f, 0.000191f, 0.000214f, 0.000441f, 0.000465f, 0.000351f, 0.000656f,
- 0.000672f, 0.000957f, 0.000881f, 0.001092f, 0.001209f, 0.001259f, 0.001315f, 0.001583f,
- 0.001630f, 0.001834f, 0.002033f, 0.002367f, 0.002596f, 0.002924f, 0.003387f, 0.003693f,
- 0.004063f, 0.004601f, 0.004986f, 0.005676f, 0.006557f, 0.006973f, 0.007801f, 0.008781f,
- 0.010475f, 0.012100f, 0.013817f, 0.015625f, 0.018784f, 0.021927f, 0.026260f, 0.031677f,
- 0.038879f, 0.048004f, 0.059845f, 0.076233f, 0.098633f, 0.130005f, 0.173950f, 0.233032f,
- 0.311035f, 0.405518f, 0.507812f, 0.608887f, 0.698242f, 0.769531f, 0.826172f, 0.868164f,
- 0.899414f, 0.922852f, 0.976074f, 0.977539f, 0.977539f, 0.977051f, 0.978027f, 0.978027f,
- 0.000000f, 0.000000f, 0.000117f, 0.000211f, 0.000326f, 0.000573f, 0.000574f, 0.000583f,
- 0.000584f, 0.000659f, 0.000901f, 0.001014f, 0.001064f, 0.001033f, 0.001163f, 0.001234f,
- 0.001546f, 0.001585f, 0.001894f, 0.002085f, 0.002361f, 0.002504f, 0.003023f, 0.003147f,
- 0.003580f, 0.004032f, 0.004314f, 0.004936f, 0.005215f, 0.006081f, 0.006725f, 0.007927f,
- 0.008743f, 0.009918f, 0.011642f, 0.013367f, 0.015404f, 0.018219f, 0.021545f, 0.025787f,
- 0.031174f, 0.038361f, 0.047577f, 0.060425f, 0.077881f, 0.102051f, 0.135376f, 0.182861f,
- 0.249023f, 0.333984f, 0.436035f, 0.542969f, 0.644043f, 0.730469f, 0.798340f, 0.848633f,
- 0.886719f, 0.914062f, 0.973633f, 0.974609f, 0.975098f, 0.976074f, 0.975098f, 0.976074f,
- 0.000000f, 0.000000f, 0.000114f, 0.000112f, 0.000271f, 0.000510f, 0.000450f, 0.000565f,
- 0.000572f, 0.000581f, 0.000654f, 0.000825f, 0.000954f, 0.001085f, 0.001050f, 0.001087f,
- 0.001282f, 0.001547f, 0.001585f, 0.001825f, 0.002066f, 0.002182f, 0.002384f, 0.002659f,
- 0.003172f, 0.003357f, 0.003721f, 0.004238f, 0.004505f, 0.005024f, 0.005878f, 0.006512f,
- 0.007324f, 0.008293f, 0.009201f, 0.011040f, 0.012993f, 0.015007f, 0.017639f, 0.020920f,
- 0.025131f, 0.030899f, 0.038269f, 0.047760f, 0.061188f, 0.079651f, 0.105469f, 0.142944f,
- 0.195801f, 0.268799f, 0.363525f, 0.472168f, 0.582520f, 0.683594f, 0.765137f, 0.826660f,
- 0.872070f, 0.905273f, 0.972168f, 0.973633f, 0.973145f, 0.973633f, 0.973633f, 0.973633f,
- 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000224f, 0.000412f, 0.000494f, 0.000543f,
- 0.000561f, 0.000680f, 0.000665f, 0.000675f, 0.000679f, 0.000797f, 0.000926f, 0.001122f,
- 0.001132f, 0.001207f, 0.001375f, 0.001606f, 0.001838f, 0.001963f, 0.002163f, 0.002314f,
- 0.002480f, 0.002956f, 0.003189f, 0.003489f, 0.003744f, 0.004311f, 0.004749f, 0.005276f,
- 0.005867f, 0.006962f, 0.008186f, 0.008987f, 0.010498f, 0.012283f, 0.014374f, 0.017075f,
- 0.020355f, 0.024719f, 0.030640f, 0.037720f, 0.048309f, 0.062134f, 0.082336f, 0.110840f,
- 0.151978f, 0.212891f, 0.294922f, 0.399170f, 0.515137f, 0.628418f, 0.724609f, 0.799805f,
- 0.854980f, 0.894043f, 0.968750f, 0.970215f, 0.970703f, 0.971191f, 0.970703f, 0.970703f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000228f, 0.000233f, 0.000436f, 0.000457f,
- 0.000621f, 0.000546f, 0.000622f, 0.000633f, 0.000576f, 0.000644f, 0.000717f, 0.000909f,
- 0.000994f, 0.001127f, 0.001179f, 0.001267f, 0.001513f, 0.001628f, 0.001742f, 0.001974f,
- 0.002111f, 0.002403f, 0.002810f, 0.003139f, 0.003231f, 0.003466f, 0.004021f, 0.004459f,
- 0.004971f, 0.005581f, 0.006809f, 0.007568f, 0.008759f, 0.010002f, 0.011665f, 0.013847f,
- 0.016342f, 0.019714f, 0.024368f, 0.030106f, 0.037811f, 0.048706f, 0.063843f, 0.085327f,
- 0.118042f, 0.164917f, 0.234131f, 0.328125f, 0.443359f, 0.565430f, 0.677246f, 0.767578f,
- 0.833496f, 0.882812f, 0.965820f, 0.967285f, 0.967773f, 0.968262f, 0.967773f, 0.968262f,
- 0.000000f, 0.000000f, 0.000000f, 0.000214f, 0.000210f, 0.000296f, 0.000309f, 0.000386f,
- 0.000462f, 0.000482f, 0.000525f, 0.000572f, 0.000525f, 0.000558f, 0.000689f, 0.000685f,
- 0.000841f, 0.000934f, 0.001008f, 0.001182f, 0.001271f, 0.001412f, 0.001757f, 0.001787f,
- 0.001769f, 0.002110f, 0.002321f, 0.002331f, 0.002737f, 0.002951f, 0.003189f, 0.003588f,
- 0.004253f, 0.004627f, 0.005505f, 0.006119f, 0.006969f, 0.008018f, 0.009583f, 0.010971f,
- 0.013245f, 0.015915f, 0.019257f, 0.023651f, 0.030014f, 0.038086f, 0.049683f, 0.066406f,
- 0.091125f, 0.127441f, 0.182617f, 0.262939f, 0.370605f, 0.497070f, 0.623047f, 0.729004f,
- 0.810547f, 0.867188f, 0.962891f, 0.963867f, 0.964844f, 0.964844f, 0.964355f, 0.964355f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000200f, 0.000215f, 0.000229f, 0.000319f,
- 0.000330f, 0.000411f, 0.000491f, 0.000527f, 0.000547f, 0.000560f, 0.000634f, 0.000648f,
- 0.000716f, 0.000778f, 0.000855f, 0.000998f, 0.001182f, 0.001111f, 0.001274f, 0.001625f,
- 0.001584f, 0.001559f, 0.001864f, 0.002037f, 0.002296f, 0.002438f, 0.002600f, 0.002993f,
- 0.003290f, 0.003801f, 0.004467f, 0.005085f, 0.005508f, 0.006519f, 0.007645f, 0.008743f,
- 0.010757f, 0.012558f, 0.014946f, 0.018661f, 0.023422f, 0.029556f, 0.038574f, 0.050964f,
- 0.069702f, 0.097351f, 0.140015f, 0.205566f, 0.301025f, 0.424561f, 0.559082f, 0.683594f,
- 0.781250f, 0.852051f, 0.958496f, 0.960449f, 0.960938f, 0.960938f, 0.960938f, 0.960449f,
- 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000214f, 0.000251f,
- 0.000302f, 0.000365f, 0.000370f, 0.000429f, 0.000495f, 0.000521f, 0.000504f, 0.000547f,
- 0.000632f, 0.000656f, 0.000695f, 0.000795f, 0.000922f, 0.001074f, 0.001125f, 0.001192f,
- 0.001166f, 0.001303f, 0.001555f, 0.001575f, 0.001763f, 0.001970f, 0.002232f, 0.002560f,
- 0.002657f, 0.003082f, 0.003559f, 0.003799f, 0.004620f, 0.005241f, 0.006081f, 0.007103f,
- 0.008385f, 0.009796f, 0.012192f, 0.014702f, 0.018234f, 0.022934f, 0.029556f, 0.039307f,
- 0.053009f, 0.073547f, 0.106628f, 0.157715f, 0.237793f, 0.351318f, 0.490479f, 0.629883f,
- 0.746094f, 0.832031f, 0.954590f, 0.956055f, 0.956055f, 0.957031f, 0.956543f, 0.956055f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000146f, 0.000191f, 0.000200f,
- 0.000255f, 0.000232f, 0.000252f, 0.000359f, 0.000291f, 0.000342f, 0.000406f, 0.000498f,
- 0.000520f, 0.000533f, 0.000632f, 0.000605f, 0.000689f, 0.000768f, 0.000908f, 0.001013f,
- 0.001087f, 0.001030f, 0.001211f, 0.001318f, 0.001497f, 0.001609f, 0.001753f, 0.001957f,
- 0.002234f, 0.002352f, 0.002663f, 0.003040f, 0.003635f, 0.004082f, 0.004723f, 0.005516f,
- 0.006367f, 0.007675f, 0.009224f, 0.011360f, 0.013695f, 0.017868f, 0.022598f, 0.029724f,
- 0.040222f, 0.055542f, 0.080078f, 0.119202f, 0.182617f, 0.281738f, 0.417725f, 0.568848f,
- 0.705566f, 0.807129f, 0.948730f, 0.951172f, 0.951172f, 0.951172f, 0.951660f, 0.951660f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f,
- 0.000203f, 0.000186f, 0.000184f, 0.000321f, 0.000231f, 0.000337f, 0.000359f, 0.000430f,
- 0.000455f, 0.000531f, 0.000502f, 0.000517f, 0.000728f, 0.000643f, 0.000673f, 0.000816f,
- 0.000930f, 0.000991f, 0.001028f, 0.001161f, 0.001284f, 0.001369f, 0.001474f, 0.001719f,
- 0.001781f, 0.001883f, 0.002258f, 0.002518f, 0.002831f, 0.003201f, 0.003744f, 0.004349f,
- 0.005127f, 0.006130f, 0.007210f, 0.008423f, 0.010696f, 0.013405f, 0.017136f, 0.022522f,
- 0.030029f, 0.041321f, 0.059631f, 0.089050f, 0.138062f, 0.218994f, 0.343750f, 0.500488f,
- 0.657227f, 0.780762f, 0.943848f, 0.945312f, 0.945312f, 0.945801f, 0.945801f, 0.946289f,
- 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f,
- 0.000118f, 0.000137f, 0.000139f, 0.000241f, 0.000202f, 0.000304f, 0.000313f, 0.000332f,
- 0.000357f, 0.000420f, 0.000435f, 0.000463f, 0.000645f, 0.000544f, 0.000700f, 0.000717f,
- 0.000669f, 0.000834f, 0.000865f, 0.000916f, 0.001109f, 0.001193f, 0.001246f, 0.001300f,
- 0.001488f, 0.001538f, 0.001806f, 0.001929f, 0.002001f, 0.002462f, 0.002666f, 0.003260f,
- 0.003904f, 0.004364f, 0.005325f, 0.006306f, 0.008041f, 0.009720f, 0.012718f, 0.016525f,
- 0.022217f, 0.030579f, 0.043854f, 0.065247f, 0.101929f, 0.166016f, 0.273193f, 0.428223f,
- 0.600586f, 0.748047f, 0.936523f, 0.938477f, 0.938965f, 0.939453f, 0.938965f, 0.938965f,
- 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f,
- 0.000114f, 0.000102f, 0.000090f, 0.000096f, 0.000131f, 0.000245f, 0.000276f, 0.000257f,
- 0.000307f, 0.000316f, 0.000322f, 0.000373f, 0.000411f, 0.000440f, 0.000433f, 0.000650f,
- 0.000578f, 0.000704f, 0.000746f, 0.000723f, 0.000819f, 0.000756f, 0.000758f, 0.000878f,
- 0.001009f, 0.001270f, 0.001399f, 0.001530f, 0.001798f, 0.001803f, 0.002151f, 0.002317f,
- 0.002728f, 0.003222f, 0.003782f, 0.004612f, 0.005951f, 0.006985f, 0.009308f, 0.011955f,
- 0.016052f, 0.022324f, 0.031525f, 0.047272f, 0.073853f, 0.122192f, 0.209717f, 0.352783f,
- 0.537109f, 0.709473f, 0.928223f, 0.930664f, 0.931152f, 0.930664f, 0.931641f, 0.931152f,
- 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f,
- 0.000119f, 0.000111f, 0.000100f, 0.000139f, 0.000082f, 0.000154f, 0.000121f, 0.000216f,
- 0.000147f, 0.000271f, 0.000288f, 0.000298f, 0.000386f, 0.000463f, 0.000370f, 0.000485f,
- 0.000555f, 0.000530f, 0.000578f, 0.000574f, 0.000612f, 0.000712f, 0.000776f, 0.000716f,
- 0.000931f, 0.000831f, 0.000967f, 0.001154f, 0.001176f, 0.001284f, 0.001497f, 0.001884f,
- 0.002270f, 0.002415f, 0.002947f, 0.003412f, 0.004032f, 0.005066f, 0.006485f, 0.008400f,
- 0.011215f, 0.015404f, 0.022079f, 0.033264f, 0.052124f, 0.087646f, 0.155029f, 0.279297f,
- 0.465820f, 0.664062f, 0.918945f, 0.921387f, 0.921875f, 0.922363f, 0.922363f, 0.921875f,
- 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000119f,
- 0.000118f, 0.000118f, 0.000110f, 0.000100f, 0.000091f, 0.000082f, 0.000075f, 0.000095f,
- 0.000166f, 0.000113f, 0.000163f, 0.000248f, 0.000258f, 0.000277f, 0.000336f, 0.000301f,
- 0.000445f, 0.000495f, 0.000473f, 0.000505f, 0.000494f, 0.000470f, 0.000584f, 0.000752f,
- 0.000821f, 0.000814f, 0.000845f, 0.000807f, 0.000932f, 0.000996f, 0.001380f, 0.001481f,
- 0.001507f, 0.001757f, 0.002146f, 0.002443f, 0.002869f, 0.003546f, 0.004559f, 0.005878f,
- 0.007561f, 0.010475f, 0.015320f, 0.022675f, 0.036133f, 0.060883f, 0.110352f, 0.211670f,
- 0.389160f, 0.610352f, 0.908691f, 0.909180f, 0.910645f, 0.912109f, 0.909668f, 0.910156f,
- 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, 0.000117f,
- 0.000117f, 0.000117f, 0.000116f, 0.000110f, 0.000100f, 0.000099f, 0.000083f, 0.000077f,
- 0.000071f, 0.000081f, 0.000087f, 0.000166f, 0.000177f, 0.000233f, 0.000238f, 0.000273f,
- 0.000325f, 0.000357f, 0.000292f, 0.000406f, 0.000418f, 0.000440f, 0.000428f, 0.000568f,
- 0.000459f, 0.000628f, 0.000678f, 0.000688f, 0.000647f, 0.000830f, 0.000925f, 0.001111f,
- 0.001011f, 0.001420f, 0.001504f, 0.001771f, 0.001997f, 0.002495f, 0.003147f, 0.003944f,
- 0.005077f, 0.006958f, 0.010040f, 0.015053f, 0.023727f, 0.040680f, 0.075989f, 0.153076f,
- 0.312012f, 0.547363f, 0.894531f, 0.897461f, 0.897949f, 0.897949f, 0.897949f, 0.898438f,
- 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000118f, 0.000117f, 0.000116f, 0.000116f,
- 0.000115f, 0.000115f, 0.000114f, 0.000114f, 0.000111f, 0.000101f, 0.000093f, 0.000086f,
- 0.000079f, 0.000095f, 0.000095f, 0.000090f, 0.000117f, 0.000109f, 0.000158f, 0.000199f,
- 0.000207f, 0.000223f, 0.000286f, 0.000288f, 0.000267f, 0.000347f, 0.000368f, 0.000450f,
- 0.000377f, 0.000460f, 0.000504f, 0.000498f, 0.000494f, 0.000616f, 0.000632f, 0.000699f,
- 0.000755f, 0.000938f, 0.000978f, 0.001222f, 0.001355f, 0.001673f, 0.002016f, 0.002539f,
- 0.003258f, 0.004410f, 0.006332f, 0.009285f, 0.014847f, 0.025864f, 0.049042f, 0.104736f,
- 0.236572f, 0.477295f, 0.879395f, 0.881348f, 0.882324f, 0.881836f, 0.882324f, 0.882324f,
- 0.000000f, 0.000119f, 0.000118f, 0.000116f, 0.000115f, 0.000114f, 0.000114f, 0.000113f,
- 0.000112f, 0.000112f, 0.000111f, 0.000111f, 0.000110f, 0.000110f, 0.000103f, 0.000095f,
- 0.000088f, 0.000081f, 0.000076f, 0.000070f, 0.000065f, 0.000100f, 0.000104f, 0.000099f,
- 0.000120f, 0.000145f, 0.000190f, 0.000204f, 0.000213f, 0.000230f, 0.000241f, 0.000279f,
- 0.000325f, 0.000322f, 0.000328f, 0.000381f, 0.000351f, 0.000466f, 0.000452f, 0.000516f,
- 0.000591f, 0.000622f, 0.000733f, 0.000882f, 0.000895f, 0.001092f, 0.001456f, 0.001765f,
- 0.002069f, 0.002821f, 0.003851f, 0.005558f, 0.008865f, 0.015579f, 0.029999f, 0.066895f,
- 0.167480f, 0.400391f, 0.860352f, 0.862793f, 0.863281f, 0.864258f, 0.863281f, 0.863770f,
- 0.000119f, 0.000114f, 0.000113f, 0.000113f, 0.000111f, 0.000110f, 0.000109f, 0.000109f,
- 0.000108f, 0.000107f, 0.000107f, 0.000107f, 0.000106f, 0.000105f, 0.000106f, 0.000105f,
- 0.000098f, 0.000090f, 0.000084f, 0.000078f, 0.000073f, 0.000068f, 0.000063f, 0.000063f,
- 0.000066f, 0.000053f, 0.000080f, 0.000107f, 0.000126f, 0.000150f, 0.000188f, 0.000187f,
- 0.000206f, 0.000205f, 0.000235f, 0.000242f, 0.000277f, 0.000340f, 0.000323f, 0.000308f,
- 0.000417f, 0.000411f, 0.000445f, 0.000536f, 0.000622f, 0.000673f, 0.000887f, 0.000985f,
- 0.001289f, 0.001623f, 0.002337f, 0.003241f, 0.004929f, 0.008560f, 0.016739f, 0.039307f,
- 0.109619f, 0.317383f, 0.837402f, 0.840332f, 0.841309f, 0.840820f, 0.840820f, 0.841309f,
- 0.000000f, 0.000106f, 0.000099f, 0.000104f, 0.000102f, 0.000101f, 0.000100f, 0.000101f,
- 0.000101f, 0.000100f, 0.000099f, 0.000100f, 0.000099f, 0.000099f, 0.000099f, 0.000098f,
- 0.000098f, 0.000098f, 0.000093f, 0.000086f, 0.000080f, 0.000075f, 0.000070f, 0.000065f,
- 0.000061f, 0.000057f, 0.000059f, 0.000054f, 0.000061f, 0.000080f, 0.000087f, 0.000101f,
- 0.000136f, 0.000147f, 0.000163f, 0.000171f, 0.000179f, 0.000205f, 0.000223f, 0.000237f,
- 0.000281f, 0.000272f, 0.000299f, 0.000364f, 0.000373f, 0.000448f, 0.000507f, 0.000643f,
- 0.000801f, 0.001000f, 0.001276f, 0.001765f, 0.002712f, 0.004585f, 0.008492f, 0.020462f,
- 0.063721f, 0.233643f, 0.811035f, 0.813477f, 0.814453f, 0.813965f, 0.813965f, 0.814453f,
- 0.000000f, 0.000057f, 0.000085f, 0.000085f, 0.000083f, 0.000085f, 0.000087f, 0.000086f,
- 0.000087f, 0.000087f, 0.000086f, 0.000087f, 0.000087f, 0.000086f, 0.000087f, 0.000087f,
- 0.000088f, 0.000086f, 0.000088f, 0.000087f, 0.000087f, 0.000081f, 0.000076f, 0.000071f,
- 0.000067f, 0.000063f, 0.000058f, 0.000055f, 0.000051f, 0.000048f, 0.000046f, 0.000042f,
- 0.000051f, 0.000063f, 0.000081f, 0.000101f, 0.000122f, 0.000137f, 0.000147f, 0.000143f,
- 0.000157f, 0.000183f, 0.000205f, 0.000188f, 0.000196f, 0.000249f, 0.000310f, 0.000329f,
- 0.000413f, 0.000534f, 0.000679f, 0.000944f, 0.001365f, 0.002199f, 0.004150f, 0.009369f,
- 0.031677f, 0.153564f, 0.779297f, 0.781250f, 0.782227f, 0.782715f, 0.781738f, 0.781250f,
- 0.000000f, 0.000000f, 0.000000f, 0.000009f, 0.000030f, 0.000048f, 0.000051f, 0.000054f,
- 0.000055f, 0.000059f, 0.000060f, 0.000065f, 0.000065f, 0.000066f, 0.000068f, 0.000068f,
- 0.000070f, 0.000070f, 0.000071f, 0.000071f, 0.000072f, 0.000073f, 0.000073f, 0.000073f,
- 0.000071f, 0.000066f, 0.000062f, 0.000058f, 0.000055f, 0.000051f, 0.000048f, 0.000045f,
- 0.000042f, 0.000039f, 0.000044f, 0.000036f, 0.000046f, 0.000056f, 0.000067f, 0.000085f,
- 0.000099f, 0.000108f, 0.000107f, 0.000113f, 0.000139f, 0.000144f, 0.000165f, 0.000169f,
- 0.000196f, 0.000266f, 0.000311f, 0.000426f, 0.000598f, 0.000948f, 0.001744f, 0.003975f,
- 0.012856f, 0.084351f, 0.739746f, 0.743164f, 0.743652f, 0.743652f, 0.743652f, 0.743164f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000012f, 0.000012f, 0.000020f, 0.000028f, 0.000030f, 0.000033f, 0.000034f,
- 0.000041f, 0.000041f, 0.000045f, 0.000047f, 0.000048f, 0.000049f, 0.000051f, 0.000052f,
- 0.000054f, 0.000054f, 0.000056f, 0.000057f, 0.000056f, 0.000052f, 0.000049f, 0.000046f,
- 0.000043f, 0.000041f, 0.000038f, 0.000035f, 0.000033f, 0.000031f, 0.000029f, 0.000029f,
- 0.000036f, 0.000055f, 0.000048f, 0.000067f, 0.000067f, 0.000073f, 0.000075f, 0.000097f,
- 0.000085f, 0.000111f, 0.000137f, 0.000191f, 0.000233f, 0.000371f, 0.000609f, 0.001319f,
- 0.004341f, 0.033844f, 0.696289f, 0.698730f, 0.699219f, 0.698242f, 0.698730f, 0.698730f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000003f, 0.000007f, 0.000009f, 0.000012f, 0.000015f, 0.000020f,
- 0.000022f, 0.000023f, 0.000026f, 0.000029f, 0.000030f, 0.000032f, 0.000033f, 0.000035f,
- 0.000037f, 0.000037f, 0.000036f, 0.000034f, 0.000032f, 0.000030f, 0.000028f, 0.000026f,
- 0.000024f, 0.000022f, 0.000021f, 0.000019f, 0.000024f, 0.000024f, 0.000029f, 0.000037f,
- 0.000043f, 0.000046f, 0.000059f, 0.000058f, 0.000075f, 0.000095f, 0.000160f, 0.000306f,
- 0.001006f, 0.008865f, 0.643066f, 0.647461f, 0.647949f, 0.647461f, 0.647949f, 0.648438f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f,
- 0.000003f, 0.000005f, 0.000007f, 0.000010f, 0.000012f, 0.000013f, 0.000015f, 0.000017f,
- 0.000019f, 0.000020f, 0.000018f, 0.000017f, 0.000015f, 0.000014f, 0.000013f, 0.000012f,
- 0.000010f, 0.000012f, 0.000014f, 0.000018f, 0.000018f, 0.000025f, 0.000028f, 0.000045f,
- 0.000110f, 0.001030f, 0.586914f, 0.589844f, 0.590820f, 0.591309f, 0.591309f, 0.590820f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000002f, 0.000004f, 0.000005f, 0.000004f, 0.000004f, 0.000003f, 0.000003f,
- 0.000004f, 0.000009f, 0.527344f, 0.529785f, 0.529785f, 0.530273f, 0.530762f, 0.530762f,
- },
- {
- 0.135132f, 0.377441f, 0.544434f, 0.653320f, 0.724609f, 0.773926f, 0.811035f, 0.838867f,
- 0.860840f, 0.876465f, 0.891113f, 0.902832f, 0.912109f, 0.920898f, 0.928223f, 0.934082f,
- 0.938965f, 0.943848f, 0.948242f, 0.952637f, 0.955566f, 0.958984f, 0.961914f, 0.964844f,
- 0.966797f, 0.969238f, 0.971191f, 0.973145f, 0.975098f, 0.976562f, 0.978027f, 0.979492f,
- 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.985840f, 0.986328f, 0.987793f, 0.988770f,
- 0.989746f, 0.989746f, 0.990234f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f,
- 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f,
- 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f, 0.999023f, 0.999023f,
- 0.044891f, 0.163330f, 0.306885f, 0.444336f, 0.559570f, 0.645020f, 0.710938f, 0.760742f,
- 0.797852f, 0.827148f, 0.850098f, 0.868652f, 0.883789f, 0.895996f, 0.907227f, 0.916016f,
- 0.923340f, 0.930176f, 0.936523f, 0.941406f, 0.946777f, 0.950684f, 0.954102f, 0.957031f,
- 0.960938f, 0.963379f, 0.965820f, 0.968262f, 0.970703f, 0.972168f, 0.974609f, 0.976562f,
- 0.977539f, 0.979492f, 0.980469f, 0.981934f, 0.982910f, 0.984375f, 0.985840f, 0.986816f,
- 0.987793f, 0.988770f, 0.988770f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f,
- 0.993164f, 0.994141f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f,
- 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f, 0.999023f,
- 0.020325f, 0.077820f, 0.158936f, 0.260498f, 0.372314f, 0.479736f, 0.572754f, 0.648438f,
- 0.707520f, 0.754883f, 0.791016f, 0.820312f, 0.843750f, 0.862793f, 0.878906f, 0.891602f,
- 0.903320f, 0.912598f, 0.920898f, 0.928223f, 0.933594f, 0.939941f, 0.944824f, 0.949219f,
- 0.952637f, 0.956543f, 0.959961f, 0.962402f, 0.965332f, 0.967773f, 0.970215f, 0.971680f,
- 0.974121f, 0.976074f, 0.977539f, 0.979004f, 0.980957f, 0.981445f, 0.983398f, 0.984375f,
- 0.985352f, 0.986328f, 0.987793f, 0.988770f, 0.989746f, 0.990234f, 0.991211f, 0.992188f,
- 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f,
- 0.012032f, 0.042908f, 0.088196f, 0.149292f, 0.228027f, 0.319824f, 0.415527f, 0.506348f,
- 0.586914f, 0.653809f, 0.709473f, 0.752441f, 0.787598f, 0.817383f, 0.840820f, 0.860352f,
- 0.876465f, 0.889648f, 0.900879f, 0.910156f, 0.918945f, 0.926270f, 0.933105f, 0.938965f,
- 0.944336f, 0.948730f, 0.952637f, 0.956055f, 0.958984f, 0.962402f, 0.965332f, 0.967773f,
- 0.970215f, 0.972656f, 0.974609f, 0.976562f, 0.978027f, 0.979492f, 0.980957f, 0.982422f,
- 0.983887f, 0.984375f, 0.985352f, 0.986816f, 0.987793f, 0.988770f, 0.989746f, 0.990234f,
- 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996094f,
- 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f,
- 0.007637f, 0.026825f, 0.053436f, 0.090759f, 0.140137f, 0.203125f, 0.279053f, 0.363281f,
- 0.449463f, 0.529785f, 0.601562f, 0.663574f, 0.713379f, 0.756348f, 0.789551f, 0.816895f,
- 0.840332f, 0.858887f, 0.875488f, 0.887695f, 0.900391f, 0.909668f, 0.918945f, 0.926270f,
- 0.932617f, 0.938477f, 0.943848f, 0.948242f, 0.952148f, 0.955566f, 0.959473f, 0.962402f,
- 0.965332f, 0.967773f, 0.970215f, 0.972168f, 0.974121f, 0.976562f, 0.978516f, 0.979492f,
- 0.980957f, 0.981934f, 0.984375f, 0.985352f, 0.985840f, 0.987793f, 0.988281f, 0.989258f,
- 0.990723f, 0.991211f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995605f,
- 0.996094f, 0.997070f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f,
- 0.004784f, 0.018082f, 0.035400f, 0.058868f, 0.089783f, 0.130981f, 0.183716f, 0.248047f,
- 0.321289f, 0.400391f, 0.478760f, 0.552734f, 0.617188f, 0.673828f, 0.720703f, 0.759766f,
- 0.792480f, 0.818359f, 0.840820f, 0.859863f, 0.875000f, 0.888184f, 0.899902f, 0.910645f,
- 0.918945f, 0.926270f, 0.931641f, 0.938965f, 0.943848f, 0.948242f, 0.952148f, 0.957031f,
- 0.959473f, 0.962891f, 0.965332f, 0.968262f, 0.970215f, 0.972656f, 0.975098f, 0.977051f,
- 0.978516f, 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.985352f, 0.986328f, 0.987305f,
- 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f,
- 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.004044f, 0.012550f, 0.024628f, 0.040466f, 0.060760f, 0.087708f, 0.122742f, 0.167236f,
- 0.222534f, 0.287109f, 0.358643f, 0.432617f, 0.506348f, 0.573242f, 0.632812f, 0.685059f,
- 0.728516f, 0.766602f, 0.797363f, 0.822266f, 0.843750f, 0.861328f, 0.877441f, 0.890625f,
- 0.901367f, 0.910645f, 0.919434f, 0.926758f, 0.933105f, 0.940430f, 0.944824f, 0.948730f,
- 0.953125f, 0.957520f, 0.960449f, 0.963867f, 0.966309f, 0.969238f, 0.970703f, 0.973633f,
- 0.976074f, 0.977539f, 0.979004f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986816f,
- 0.986816f, 0.988281f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.993164f, 0.994141f,
- 0.994629f, 0.995117f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f,
- 0.002975f, 0.009315f, 0.017868f, 0.029129f, 0.043243f, 0.062012f, 0.084961f, 0.115540f,
- 0.154419f, 0.201660f, 0.257812f, 0.322754f, 0.391846f, 0.463135f, 0.530762f, 0.594727f,
- 0.650391f, 0.698730f, 0.739258f, 0.773926f, 0.803711f, 0.826660f, 0.847656f, 0.865723f,
- 0.879883f, 0.892090f, 0.903809f, 0.913086f, 0.921387f, 0.928223f, 0.935059f, 0.940918f,
- 0.945801f, 0.950684f, 0.954102f, 0.958008f, 0.961426f, 0.964844f, 0.967285f, 0.970215f,
- 0.972168f, 0.974609f, 0.976074f, 0.978027f, 0.979980f, 0.981934f, 0.983398f, 0.984375f,
- 0.985352f, 0.987305f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f,
- 0.993652f, 0.994629f, 0.997559f, 0.998047f, 0.998047f, 0.997559f, 0.997559f, 0.997559f,
- 0.002329f, 0.007256f, 0.013611f, 0.021790f, 0.032043f, 0.044617f, 0.061554f, 0.082336f,
- 0.108765f, 0.142578f, 0.184448f, 0.234375f, 0.292725f, 0.357422f, 0.424805f, 0.493164f,
- 0.556641f, 0.615723f, 0.666504f, 0.711914f, 0.750977f, 0.782715f, 0.809570f, 0.832520f,
- 0.853516f, 0.868652f, 0.882812f, 0.895508f, 0.905762f, 0.916016f, 0.923340f, 0.931152f,
- 0.936523f, 0.942383f, 0.947266f, 0.951172f, 0.956055f, 0.958984f, 0.962402f, 0.965820f,
- 0.968750f, 0.971191f, 0.973633f, 0.975586f, 0.977539f, 0.979980f, 0.980957f, 0.982422f,
- 0.983887f, 0.985352f, 0.985840f, 0.988281f, 0.989746f, 0.990234f, 0.991211f, 0.991699f,
- 0.993164f, 0.993652f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f,
- 0.001871f, 0.006084f, 0.010963f, 0.016953f, 0.024277f, 0.033722f, 0.046234f, 0.060669f,
- 0.079224f, 0.103638f, 0.132812f, 0.169678f, 0.214478f, 0.267090f, 0.326172f, 0.390137f,
- 0.456543f, 0.519531f, 0.581543f, 0.636230f, 0.685547f, 0.726562f, 0.762207f, 0.792969f,
- 0.818359f, 0.839844f, 0.858398f, 0.874023f, 0.887695f, 0.898926f, 0.909668f, 0.918945f,
- 0.926270f, 0.933105f, 0.938965f, 0.944336f, 0.949219f, 0.953613f, 0.958008f, 0.961426f,
- 0.964844f, 0.967773f, 0.969727f, 0.972168f, 0.974609f, 0.976074f, 0.979004f, 0.979980f,
- 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.989746f, 0.989746f, 0.990723f,
- 0.991211f, 0.992676f, 0.996582f, 0.997070f, 0.997559f, 0.997070f, 0.997070f, 0.997070f,
- 0.001322f, 0.004795f, 0.008530f, 0.013504f, 0.018921f, 0.026154f, 0.035065f, 0.045807f,
- 0.059662f, 0.076416f, 0.098267f, 0.124512f, 0.157715f, 0.197388f, 0.244873f, 0.299805f,
- 0.359619f, 0.423096f, 0.487549f, 0.549316f, 0.605957f, 0.657715f, 0.703125f, 0.741211f,
- 0.774902f, 0.802734f, 0.827148f, 0.847656f, 0.865234f, 0.879883f, 0.893066f, 0.903320f,
- 0.913086f, 0.920898f, 0.929199f, 0.935547f, 0.941406f, 0.947266f, 0.951172f, 0.956055f,
- 0.959473f, 0.962891f, 0.965332f, 0.969238f, 0.971191f, 0.974121f, 0.976562f, 0.977539f,
- 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.986328f, 0.988281f, 0.988281f, 0.989746f,
- 0.990723f, 0.991699f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.996582f,
- 0.001077f, 0.003971f, 0.006985f, 0.010750f, 0.015579f, 0.020920f, 0.027420f, 0.035522f,
- 0.045776f, 0.058228f, 0.074097f, 0.093140f, 0.117310f, 0.146851f, 0.182495f, 0.225952f,
- 0.276611f, 0.332764f, 0.394287f, 0.456543f, 0.518555f, 0.577637f, 0.630371f, 0.679199f,
- 0.720703f, 0.756836f, 0.787598f, 0.813477f, 0.836426f, 0.855469f, 0.872070f, 0.885742f,
- 0.897949f, 0.908203f, 0.917480f, 0.925293f, 0.933105f, 0.939453f, 0.944336f, 0.949219f,
- 0.954590f, 0.957520f, 0.961426f, 0.964844f, 0.968262f, 0.970703f, 0.974121f, 0.975586f,
- 0.978027f, 0.979492f, 0.981445f, 0.983398f, 0.984863f, 0.986328f, 0.987793f, 0.988770f,
- 0.989746f, 0.991211f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f,
- 0.000954f, 0.003330f, 0.005733f, 0.008904f, 0.012505f, 0.016617f, 0.022446f, 0.028351f,
- 0.036041f, 0.045807f, 0.056854f, 0.071350f, 0.088867f, 0.110596f, 0.137451f, 0.170654f,
- 0.209717f, 0.256592f, 0.309326f, 0.366943f, 0.427979f, 0.489502f, 0.549316f, 0.604980f,
- 0.655762f, 0.700195f, 0.738770f, 0.772461f, 0.801270f, 0.825195f, 0.845703f, 0.864258f,
- 0.879395f, 0.893066f, 0.903809f, 0.914062f, 0.922363f, 0.929688f, 0.936523f, 0.942871f,
- 0.947266f, 0.952148f, 0.956055f, 0.960449f, 0.963867f, 0.966797f, 0.969727f, 0.972656f,
- 0.975586f, 0.976562f, 0.979004f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986816f,
- 0.988770f, 0.989746f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f,
- 0.000949f, 0.002804f, 0.004730f, 0.007236f, 0.010384f, 0.014160f, 0.018478f, 0.023102f,
- 0.028992f, 0.036346f, 0.044647f, 0.055542f, 0.068481f, 0.085144f, 0.105286f, 0.130005f,
- 0.159668f, 0.195557f, 0.238647f, 0.287842f, 0.343018f, 0.402588f, 0.463135f, 0.522949f,
- 0.580566f, 0.632812f, 0.680664f, 0.721680f, 0.757812f, 0.788574f, 0.814453f, 0.836914f,
- 0.856934f, 0.872070f, 0.887207f, 0.899414f, 0.909668f, 0.918945f, 0.926758f, 0.933594f,
- 0.940430f, 0.946289f, 0.950684f, 0.954590f, 0.959473f, 0.963379f, 0.966797f, 0.969238f,
- 0.972168f, 0.975098f, 0.977051f, 0.979492f, 0.980957f, 0.982910f, 0.984375f, 0.986328f,
- 0.987793f, 0.988770f, 0.995117f, 0.996094f, 0.995605f, 0.996094f, 0.996094f, 0.995605f,
- 0.000828f, 0.002361f, 0.004116f, 0.006119f, 0.008797f, 0.011391f, 0.014854f, 0.018890f,
- 0.023666f, 0.029083f, 0.036011f, 0.044434f, 0.053986f, 0.066589f, 0.081543f, 0.100159f,
- 0.122314f, 0.149536f, 0.183350f, 0.222900f, 0.269043f, 0.321533f, 0.378418f, 0.438477f,
- 0.499023f, 0.556641f, 0.611328f, 0.661133f, 0.703613f, 0.742188f, 0.775391f, 0.804199f,
- 0.828613f, 0.849121f, 0.866211f, 0.881348f, 0.894043f, 0.905762f, 0.916016f, 0.924316f,
- 0.931641f, 0.938477f, 0.944336f, 0.949707f, 0.954590f, 0.958496f, 0.962402f, 0.966309f,
- 0.969238f, 0.972168f, 0.974121f, 0.977051f, 0.979004f, 0.980957f, 0.982910f, 0.984863f,
- 0.985840f, 0.987793f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f,
- 0.000606f, 0.001948f, 0.003483f, 0.005394f, 0.007290f, 0.009735f, 0.012352f, 0.015747f,
- 0.019485f, 0.023788f, 0.029358f, 0.035706f, 0.043732f, 0.053162f, 0.064331f, 0.077942f,
- 0.094971f, 0.116089f, 0.140991f, 0.172485f, 0.209473f, 0.252686f, 0.302002f, 0.356934f,
- 0.415283f, 0.475830f, 0.534180f, 0.589844f, 0.641602f, 0.687500f, 0.728516f, 0.763184f,
- 0.792969f, 0.819336f, 0.841309f, 0.860840f, 0.876953f, 0.890625f, 0.902344f, 0.913086f,
- 0.921875f, 0.930176f, 0.937012f, 0.943359f, 0.948242f, 0.954102f, 0.958008f, 0.961914f,
- 0.965820f, 0.969238f, 0.971680f, 0.974609f, 0.977051f, 0.979004f, 0.981445f, 0.983398f,
- 0.984863f, 0.986816f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.994629f,
- 0.000672f, 0.001569f, 0.002895f, 0.004528f, 0.006180f, 0.008324f, 0.010864f, 0.013161f,
- 0.016357f, 0.020096f, 0.024216f, 0.029327f, 0.035583f, 0.042664f, 0.051453f, 0.062073f,
- 0.075012f, 0.091125f, 0.110291f, 0.134155f, 0.162476f, 0.197266f, 0.238037f, 0.285156f,
- 0.337646f, 0.395020f, 0.454590f, 0.513672f, 0.570312f, 0.624023f, 0.672363f, 0.714844f,
- 0.750977f, 0.783691f, 0.811035f, 0.834473f, 0.854004f, 0.872070f, 0.886230f, 0.899414f,
- 0.911133f, 0.918945f, 0.928223f, 0.936035f, 0.942871f, 0.948242f, 0.953613f, 0.957031f,
- 0.961426f, 0.965820f, 0.968750f, 0.972168f, 0.974121f, 0.976562f, 0.979492f, 0.981445f,
- 0.983398f, 0.985352f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.994629f,
- 0.000413f, 0.001430f, 0.002577f, 0.004269f, 0.005703f, 0.007137f, 0.008888f, 0.011124f,
- 0.013885f, 0.016891f, 0.020355f, 0.024384f, 0.029221f, 0.035217f, 0.041748f, 0.049988f,
- 0.060059f, 0.072083f, 0.086914f, 0.105286f, 0.126953f, 0.154175f, 0.186523f, 0.224731f,
- 0.269287f, 0.320557f, 0.375732f, 0.434570f, 0.493896f, 0.552246f, 0.606934f, 0.655762f,
- 0.701660f, 0.740723f, 0.774902f, 0.803711f, 0.827637f, 0.848633f, 0.867188f, 0.882812f,
- 0.895996f, 0.908203f, 0.917969f, 0.926758f, 0.934570f, 0.941895f, 0.947266f, 0.952637f,
- 0.957520f, 0.960938f, 0.965820f, 0.968750f, 0.971680f, 0.974609f, 0.977051f, 0.979980f,
- 0.981934f, 0.983887f, 0.993652f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994141f,
- 0.000240f, 0.001406f, 0.002373f, 0.003283f, 0.004620f, 0.006264f, 0.007744f, 0.009552f,
- 0.011711f, 0.014069f, 0.017273f, 0.020584f, 0.024429f, 0.028946f, 0.034393f, 0.041046f,
- 0.048798f, 0.058289f, 0.070312f, 0.083618f, 0.100403f, 0.121338f, 0.146118f, 0.177002f,
- 0.213257f, 0.255371f, 0.304443f, 0.358887f, 0.416504f, 0.476562f, 0.534668f, 0.590332f,
- 0.642090f, 0.688965f, 0.729492f, 0.766113f, 0.796387f, 0.822754f, 0.844727f, 0.862305f,
- 0.880371f, 0.894043f, 0.905762f, 0.916992f, 0.926270f, 0.934082f, 0.940918f, 0.946777f,
- 0.953125f, 0.956543f, 0.961426f, 0.964844f, 0.969238f, 0.972656f, 0.974609f, 0.977539f,
- 0.979980f, 0.982422f, 0.992676f, 0.994141f, 0.993652f, 0.993652f, 0.993652f, 0.993652f,
- 0.000242f, 0.001257f, 0.001991f, 0.003138f, 0.004299f, 0.005302f, 0.006584f, 0.008308f,
- 0.010048f, 0.012283f, 0.014526f, 0.017578f, 0.020340f, 0.023972f, 0.028671f, 0.033661f,
- 0.040161f, 0.047821f, 0.056213f, 0.067261f, 0.080444f, 0.096191f, 0.115784f, 0.139771f,
- 0.168457f, 0.203125f, 0.243286f, 0.290527f, 0.343506f, 0.400879f, 0.459473f, 0.519043f,
- 0.576172f, 0.629395f, 0.678223f, 0.721191f, 0.757324f, 0.789062f, 0.816895f, 0.839844f,
- 0.859863f, 0.877930f, 0.892578f, 0.904297f, 0.915527f, 0.925293f, 0.933105f, 0.940430f,
- 0.946777f, 0.952148f, 0.957031f, 0.961914f, 0.965820f, 0.969238f, 0.973145f, 0.975586f,
- 0.978516f, 0.980469f, 0.992188f, 0.993652f, 0.993164f, 0.993164f, 0.993652f, 0.993164f,
- 0.000434f, 0.001172f, 0.001865f, 0.002825f, 0.003633f, 0.004757f, 0.005722f, 0.007175f,
- 0.009010f, 0.010651f, 0.012520f, 0.014412f, 0.017532f, 0.020599f, 0.024139f, 0.028488f,
- 0.033356f, 0.039001f, 0.046295f, 0.054749f, 0.064758f, 0.077209f, 0.092834f, 0.111084f,
- 0.134033f, 0.160767f, 0.193604f, 0.233032f, 0.278320f, 0.329590f, 0.386230f, 0.445068f,
- 0.504395f, 0.563477f, 0.617188f, 0.666504f, 0.711426f, 0.750000f, 0.783691f, 0.812500f,
- 0.836426f, 0.857422f, 0.875488f, 0.891113f, 0.903809f, 0.915039f, 0.924805f, 0.933105f,
- 0.940430f, 0.947266f, 0.953125f, 0.958496f, 0.962402f, 0.966309f, 0.969727f, 0.973145f,
- 0.976562f, 0.978516f, 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.992676f,
- 0.000358f, 0.000835f, 0.001738f, 0.002270f, 0.002996f, 0.004078f, 0.005157f, 0.006416f,
- 0.007904f, 0.009331f, 0.010826f, 0.012245f, 0.014938f, 0.017303f, 0.020233f, 0.023926f,
- 0.027954f, 0.032715f, 0.038147f, 0.045166f, 0.053070f, 0.062561f, 0.074768f, 0.089661f,
- 0.106689f, 0.128052f, 0.154175f, 0.185547f, 0.223022f, 0.266846f, 0.317383f, 0.373047f,
- 0.431152f, 0.491943f, 0.550293f, 0.606445f, 0.658203f, 0.704102f, 0.744141f, 0.779297f,
- 0.809082f, 0.833984f, 0.855957f, 0.875000f, 0.889648f, 0.903320f, 0.915039f, 0.924805f,
- 0.933594f, 0.940918f, 0.947754f, 0.954102f, 0.958984f, 0.962402f, 0.966797f, 0.970703f,
- 0.974121f, 0.977539f, 0.990723f, 0.992188f, 0.992676f, 0.992676f, 0.992188f, 0.992676f,
- 0.000428f, 0.000789f, 0.001460f, 0.002172f, 0.002695f, 0.003561f, 0.004608f, 0.005848f,
- 0.006886f, 0.007736f, 0.009560f, 0.011078f, 0.012817f, 0.015015f, 0.017563f, 0.020157f,
- 0.023666f, 0.027145f, 0.031891f, 0.037384f, 0.044189f, 0.051788f, 0.061188f, 0.072327f,
- 0.085999f, 0.102966f, 0.123413f, 0.148071f, 0.178101f, 0.214478f, 0.256836f, 0.306396f,
- 0.360840f, 0.419678f, 0.479736f, 0.540527f, 0.597656f, 0.649902f, 0.697754f, 0.738770f,
- 0.775391f, 0.805664f, 0.831543f, 0.854004f, 0.873535f, 0.889160f, 0.902832f, 0.915039f,
- 0.925293f, 0.934082f, 0.941895f, 0.948730f, 0.954102f, 0.959961f, 0.963867f, 0.968262f,
- 0.971680f, 0.975586f, 0.990723f, 0.991699f, 0.991699f, 0.991699f, 0.991699f, 0.991211f,
- 0.000237f, 0.000782f, 0.001245f, 0.001923f, 0.002417f, 0.003225f, 0.004101f, 0.005062f,
- 0.005920f, 0.007030f, 0.008102f, 0.009743f, 0.011009f, 0.013054f, 0.015190f, 0.017380f,
- 0.020126f, 0.023346f, 0.027161f, 0.031464f, 0.036316f, 0.042664f, 0.050110f, 0.058807f,
- 0.069946f, 0.083191f, 0.099121f, 0.118835f, 0.142822f, 0.171997f, 0.206665f, 0.248413f,
- 0.296143f, 0.350586f, 0.408936f, 0.469727f, 0.530762f, 0.589844f, 0.643555f, 0.691895f,
- 0.734375f, 0.772461f, 0.803223f, 0.830566f, 0.854492f, 0.873047f, 0.889648f, 0.903809f,
- 0.916016f, 0.926270f, 0.935059f, 0.943359f, 0.949219f, 0.955566f, 0.960938f, 0.965332f,
- 0.969727f, 0.973145f, 0.989746f, 0.990723f, 0.990723f, 0.990723f, 0.991211f, 0.990723f,
- 0.000243f, 0.000793f, 0.001210f, 0.001616f, 0.002260f, 0.003069f, 0.003649f, 0.004444f,
- 0.005322f, 0.006088f, 0.006954f, 0.008278f, 0.009766f, 0.011139f, 0.012970f, 0.014908f,
- 0.016968f, 0.019897f, 0.023193f, 0.026962f, 0.030792f, 0.035522f, 0.041931f, 0.048920f,
- 0.057404f, 0.067993f, 0.080383f, 0.095825f, 0.114929f, 0.137695f, 0.165771f, 0.199585f,
- 0.241089f, 0.287842f, 0.341553f, 0.400391f, 0.462402f, 0.523438f, 0.583008f, 0.638184f,
- 0.687988f, 0.732422f, 0.770020f, 0.802246f, 0.830566f, 0.854004f, 0.873047f, 0.891113f,
- 0.904785f, 0.916992f, 0.926758f, 0.936523f, 0.943848f, 0.951172f, 0.956543f, 0.961914f,
- 0.966797f, 0.971191f, 0.989258f, 0.990234f, 0.990234f, 0.990234f, 0.990234f, 0.989746f,
- 0.000000f, 0.000484f, 0.000973f, 0.001453f, 0.001999f, 0.002689f, 0.003359f, 0.003864f,
- 0.004726f, 0.005444f, 0.006516f, 0.007404f, 0.008461f, 0.009720f, 0.011261f, 0.012985f,
- 0.014908f, 0.017120f, 0.019699f, 0.022614f, 0.026093f, 0.030228f, 0.034668f, 0.040619f,
- 0.047699f, 0.055756f, 0.066284f, 0.078308f, 0.092834f, 0.111328f, 0.133423f, 0.160889f,
- 0.194214f, 0.233765f, 0.281006f, 0.334473f, 0.392822f, 0.455078f, 0.517090f, 0.578125f,
- 0.634766f, 0.686035f, 0.730957f, 0.768555f, 0.803223f, 0.831055f, 0.854492f, 0.875488f,
- 0.892090f, 0.906250f, 0.918457f, 0.929688f, 0.937988f, 0.945801f, 0.952148f, 0.958496f,
- 0.963867f, 0.968750f, 0.988281f, 0.989258f, 0.989746f, 0.989258f, 0.989746f, 0.989258f,
- 0.000241f, 0.000699f, 0.000835f, 0.001354f, 0.002066f, 0.002405f, 0.003073f, 0.003466f,
- 0.003847f, 0.004868f, 0.005798f, 0.006325f, 0.007446f, 0.008553f, 0.009789f, 0.011375f,
- 0.013031f, 0.014702f, 0.016937f, 0.019455f, 0.022171f, 0.025467f, 0.029541f, 0.034271f,
- 0.039734f, 0.046295f, 0.054291f, 0.063904f, 0.075745f, 0.089966f, 0.107727f, 0.129395f,
- 0.156250f, 0.188965f, 0.228394f, 0.274658f, 0.327637f, 0.386963f, 0.449219f, 0.512695f,
- 0.574707f, 0.632324f, 0.684570f, 0.730469f, 0.770508f, 0.804688f, 0.832520f, 0.857422f,
- 0.876953f, 0.893066f, 0.908691f, 0.920410f, 0.931152f, 0.940430f, 0.947754f, 0.954590f,
- 0.960938f, 0.965820f, 0.986816f, 0.988770f, 0.988770f, 0.988770f, 0.988770f, 0.988770f,
- 0.000122f, 0.000480f, 0.000793f, 0.001184f, 0.001847f, 0.002220f, 0.002459f, 0.003109f,
- 0.003740f, 0.004234f, 0.005127f, 0.005730f, 0.006557f, 0.007458f, 0.008469f, 0.009911f,
- 0.011162f, 0.012848f, 0.014519f, 0.016693f, 0.019135f, 0.021820f, 0.025024f, 0.028931f,
- 0.033508f, 0.038757f, 0.045135f, 0.052856f, 0.062042f, 0.073547f, 0.087646f, 0.104736f,
- 0.126099f, 0.152588f, 0.184570f, 0.223511f, 0.269775f, 0.323242f, 0.382324f, 0.445801f,
- 0.510254f, 0.573242f, 0.631348f, 0.685059f, 0.731934f, 0.772461f, 0.806641f, 0.834961f,
- 0.859375f, 0.879883f, 0.897461f, 0.911133f, 0.923828f, 0.933594f, 0.942383f, 0.950195f,
- 0.956055f, 0.962402f, 0.985840f, 0.987305f, 0.987793f, 0.987793f, 0.988281f, 0.987793f,
- 0.000244f, 0.000471f, 0.000666f, 0.001267f, 0.001592f, 0.001838f, 0.002251f, 0.002855f,
- 0.003225f, 0.003828f, 0.004372f, 0.005112f, 0.005695f, 0.006340f, 0.007534f, 0.008797f,
- 0.009895f, 0.011215f, 0.012604f, 0.014503f, 0.016602f, 0.018738f, 0.021408f, 0.024567f,
- 0.028305f, 0.032654f, 0.037872f, 0.043732f, 0.051239f, 0.060669f, 0.071716f, 0.085510f,
- 0.102356f, 0.123230f, 0.149170f, 0.180664f, 0.219849f, 0.265869f, 0.319092f, 0.379150f,
- 0.443604f, 0.508789f, 0.572754f, 0.633301f, 0.686523f, 0.734863f, 0.775391f, 0.809570f,
- 0.838379f, 0.862305f, 0.883301f, 0.900391f, 0.914551f, 0.926270f, 0.937012f, 0.944824f,
- 0.953125f, 0.959473f, 0.985352f, 0.986816f, 0.986816f, 0.986816f, 0.986816f, 0.986816f,
- 0.000242f, 0.000346f, 0.000827f, 0.001065f, 0.001428f, 0.001572f, 0.001984f, 0.002367f,
- 0.002851f, 0.003277f, 0.003786f, 0.004501f, 0.005253f, 0.005955f, 0.006573f, 0.007736f,
- 0.008659f, 0.009880f, 0.011177f, 0.012459f, 0.014153f, 0.016403f, 0.018173f, 0.020859f,
- 0.024017f, 0.027496f, 0.031708f, 0.036682f, 0.042877f, 0.050446f, 0.059174f, 0.070068f,
- 0.083374f, 0.100159f, 0.120728f, 0.145874f, 0.177612f, 0.216187f, 0.262695f, 0.316650f,
- 0.377686f, 0.443115f, 0.509766f, 0.575195f, 0.635742f, 0.691406f, 0.738281f, 0.779785f,
- 0.813965f, 0.843750f, 0.866699f, 0.887207f, 0.904297f, 0.918945f, 0.930176f, 0.940918f,
- 0.948730f, 0.956055f, 0.984375f, 0.985840f, 0.985840f, 0.985840f, 0.986328f, 0.985840f,
- 0.000242f, 0.000540f, 0.000708f, 0.000830f, 0.001143f, 0.001451f, 0.001861f, 0.002249f,
- 0.002661f, 0.003010f, 0.003435f, 0.003922f, 0.004707f, 0.005165f, 0.005787f, 0.006840f,
- 0.007374f, 0.008545f, 0.009651f, 0.011147f, 0.012581f, 0.014084f, 0.015991f, 0.017899f,
- 0.020325f, 0.023392f, 0.026978f, 0.031113f, 0.035919f, 0.042023f, 0.049103f, 0.057831f,
- 0.068420f, 0.081543f, 0.098145f, 0.118530f, 0.143921f, 0.175293f, 0.213989f, 0.260742f,
- 0.316162f, 0.377441f, 0.444336f, 0.512207f, 0.579590f, 0.641113f, 0.696289f, 0.744629f,
- 0.786621f, 0.820801f, 0.849609f, 0.872559f, 0.892578f, 0.908691f, 0.922363f, 0.934570f,
- 0.944336f, 0.951660f, 0.982910f, 0.984375f, 0.984863f, 0.984863f, 0.985352f, 0.984863f,
- 0.000106f, 0.000477f, 0.000649f, 0.000901f, 0.001110f, 0.001206f, 0.001630f, 0.002121f,
- 0.002192f, 0.002743f, 0.003128f, 0.003538f, 0.003941f, 0.004688f, 0.005276f, 0.005905f,
- 0.006546f, 0.007568f, 0.008461f, 0.009483f, 0.010674f, 0.011864f, 0.013649f, 0.015549f,
- 0.017731f, 0.020111f, 0.023010f, 0.026199f, 0.030304f, 0.035278f, 0.040833f, 0.047821f,
- 0.056580f, 0.066895f, 0.079895f, 0.096191f, 0.116760f, 0.141968f, 0.173584f, 0.212646f,
- 0.260498f, 0.316162f, 0.379883f, 0.447754f, 0.517578f, 0.584961f, 0.647949f, 0.704102f,
- 0.752930f, 0.792969f, 0.827148f, 0.855957f, 0.877930f, 0.898438f, 0.914062f, 0.928223f,
- 0.938965f, 0.948242f, 0.981445f, 0.983398f, 0.983887f, 0.983887f, 0.983887f, 0.983398f,
- 0.000208f, 0.000456f, 0.000582f, 0.000788f, 0.001016f, 0.001428f, 0.001507f, 0.001769f,
- 0.002203f, 0.002525f, 0.002718f, 0.003187f, 0.003761f, 0.004238f, 0.004635f, 0.005348f,
- 0.005901f, 0.006805f, 0.007500f, 0.008545f, 0.009270f, 0.010437f, 0.011742f, 0.013344f,
- 0.015198f, 0.017242f, 0.019516f, 0.022430f, 0.025665f, 0.029922f, 0.034180f, 0.040161f,
- 0.046936f, 0.055420f, 0.065735f, 0.078552f, 0.094666f, 0.114563f, 0.140503f, 0.172485f,
- 0.212646f, 0.260986f, 0.318359f, 0.383545f, 0.453125f, 0.524414f, 0.593750f, 0.656738f,
- 0.712891f, 0.761230f, 0.801270f, 0.835938f, 0.862305f, 0.885742f, 0.904785f, 0.919922f,
- 0.933594f, 0.943359f, 0.980469f, 0.982422f, 0.982422f, 0.981934f, 0.982422f, 0.982422f,
- 0.000170f, 0.000350f, 0.000583f, 0.000682f, 0.000845f, 0.001036f, 0.001265f, 0.001821f,
- 0.001953f, 0.002163f, 0.002525f, 0.002771f, 0.003418f, 0.003729f, 0.004040f, 0.004871f,
- 0.005188f, 0.005726f, 0.006512f, 0.007130f, 0.008087f, 0.009018f, 0.010216f, 0.011490f,
- 0.013084f, 0.014565f, 0.016891f, 0.019073f, 0.021851f, 0.025253f, 0.029022f, 0.033539f,
- 0.039124f, 0.045563f, 0.054230f, 0.064270f, 0.077271f, 0.093323f, 0.113403f, 0.139648f,
- 0.172485f, 0.213379f, 0.262939f, 0.322266f, 0.389404f, 0.461426f, 0.534180f, 0.604492f,
- 0.668457f, 0.724609f, 0.772461f, 0.812500f, 0.845703f, 0.872070f, 0.894043f, 0.911621f,
- 0.926758f, 0.938477f, 0.979004f, 0.980469f, 0.980957f, 0.980957f, 0.980957f, 0.980957f,
- 0.000000f, 0.000332f, 0.000583f, 0.000583f, 0.000848f, 0.000959f, 0.001125f, 0.001425f,
- 0.001810f, 0.001899f, 0.002300f, 0.002529f, 0.002996f, 0.003162f, 0.003607f, 0.004150f,
- 0.004761f, 0.005146f, 0.005791f, 0.006329f, 0.007099f, 0.008110f, 0.008949f, 0.009941f,
- 0.011253f, 0.012756f, 0.014565f, 0.016434f, 0.018707f, 0.021271f, 0.024475f, 0.028290f,
- 0.032745f, 0.037964f, 0.044769f, 0.052795f, 0.063416f, 0.076050f, 0.092102f, 0.113464f,
- 0.139526f, 0.172974f, 0.214600f, 0.266602f, 0.327637f, 0.397461f, 0.471191f, 0.546387f,
- 0.617188f, 0.682129f, 0.737793f, 0.784668f, 0.823730f, 0.854980f, 0.881348f, 0.902344f,
- 0.918945f, 0.933105f, 0.977539f, 0.979492f, 0.979492f, 0.979492f, 0.979492f, 0.979492f,
- 0.000000f, 0.000243f, 0.000553f, 0.000575f, 0.000591f, 0.000798f, 0.000991f, 0.001234f,
- 0.001419f, 0.001812f, 0.001935f, 0.002186f, 0.002518f, 0.002975f, 0.003202f, 0.003614f,
- 0.004047f, 0.004425f, 0.005013f, 0.005718f, 0.006172f, 0.007046f, 0.007740f, 0.008835f,
- 0.009819f, 0.011192f, 0.012444f, 0.014114f, 0.015884f, 0.018204f, 0.020844f, 0.023392f,
- 0.027420f, 0.031921f, 0.037170f, 0.043610f, 0.052032f, 0.062408f, 0.075256f, 0.091675f,
- 0.112610f, 0.140015f, 0.173950f, 0.217651f, 0.271973f, 0.335693f, 0.407715f, 0.484619f,
- 0.561035f, 0.633789f, 0.698242f, 0.752930f, 0.798828f, 0.836426f, 0.867676f, 0.891602f,
- 0.911621f, 0.926270f, 0.975098f, 0.977539f, 0.978516f, 0.977539f, 0.977539f, 0.978027f,
- 0.000121f, 0.000121f, 0.000241f, 0.000385f, 0.000684f, 0.000693f, 0.000932f, 0.001156f,
- 0.001410f, 0.001648f, 0.001893f, 0.002184f, 0.002367f, 0.002579f, 0.002872f, 0.003319f,
- 0.003653f, 0.003922f, 0.004425f, 0.004925f, 0.005436f, 0.006180f, 0.006836f, 0.007645f,
- 0.008278f, 0.009476f, 0.010788f, 0.012169f, 0.013695f, 0.015305f, 0.017319f, 0.020111f,
- 0.022858f, 0.026718f, 0.030975f, 0.036255f, 0.042938f, 0.051270f, 0.061493f, 0.074768f,
- 0.091187f, 0.112976f, 0.140747f, 0.176392f, 0.222168f, 0.278809f, 0.345703f, 0.421387f,
- 0.500488f, 0.578613f, 0.651855f, 0.715820f, 0.769531f, 0.813965f, 0.850586f, 0.878418f,
- 0.901855f, 0.920410f, 0.973633f, 0.975586f, 0.976074f, 0.976562f, 0.976562f, 0.975098f,
- 0.000240f, 0.000120f, 0.000281f, 0.000333f, 0.000498f, 0.000680f, 0.000684f, 0.001083f,
- 0.001312f, 0.001618f, 0.001606f, 0.001834f, 0.002087f, 0.002316f, 0.002735f, 0.002792f,
- 0.003084f, 0.003386f, 0.003944f, 0.004353f, 0.004761f, 0.005390f, 0.005997f, 0.006615f,
- 0.007389f, 0.008324f, 0.008987f, 0.010284f, 0.011703f, 0.013382f, 0.014717f, 0.016953f,
- 0.019424f, 0.022278f, 0.026047f, 0.030029f, 0.035492f, 0.042145f, 0.050446f, 0.060608f,
- 0.073975f, 0.091187f, 0.113831f, 0.142700f, 0.180176f, 0.228271f, 0.288086f, 0.359131f,
- 0.437988f, 0.519531f, 0.600098f, 0.673340f, 0.735352f, 0.787598f, 0.830566f, 0.865234f,
- 0.891602f, 0.913086f, 0.971680f, 0.974121f, 0.974121f, 0.974121f, 0.974121f, 0.974609f,
- 0.000000f, 0.000239f, 0.000236f, 0.000425f, 0.000487f, 0.000608f, 0.000850f, 0.001012f,
- 0.001140f, 0.001260f, 0.001410f, 0.001640f, 0.001953f, 0.002003f, 0.002342f, 0.002434f,
- 0.002686f, 0.002934f, 0.003305f, 0.003771f, 0.004169f, 0.004692f, 0.005028f, 0.005817f,
- 0.006371f, 0.007179f, 0.007919f, 0.008965f, 0.009857f, 0.011261f, 0.012703f, 0.014229f,
- 0.016312f, 0.018494f, 0.021744f, 0.025024f, 0.029633f, 0.034790f, 0.041199f, 0.049561f,
- 0.060242f, 0.073608f, 0.091675f, 0.114502f, 0.144897f, 0.185547f, 0.236328f, 0.300049f,
- 0.375732f, 0.458496f, 0.542969f, 0.624023f, 0.696289f, 0.758301f, 0.808105f, 0.847656f,
- 0.879395f, 0.903809f, 0.968750f, 0.971191f, 0.972168f, 0.971680f, 0.972168f, 0.971680f,
- 0.000000f, 0.000217f, 0.000235f, 0.000235f, 0.000321f, 0.000560f, 0.000588f, 0.000897f,
- 0.001034f, 0.001040f, 0.001246f, 0.001369f, 0.001611f, 0.001692f, 0.001942f, 0.002153f,
- 0.002337f, 0.002638f, 0.002878f, 0.003330f, 0.003672f, 0.003986f, 0.004498f, 0.004826f,
- 0.005535f, 0.006176f, 0.006561f, 0.007538f, 0.008362f, 0.009544f, 0.010612f, 0.011879f,
- 0.013794f, 0.015839f, 0.018326f, 0.020889f, 0.024567f, 0.028625f, 0.033783f, 0.040527f,
- 0.049133f, 0.059998f, 0.073608f, 0.092041f, 0.116394f, 0.148682f, 0.191528f, 0.246582f,
- 0.315186f, 0.395508f, 0.482910f, 0.570312f, 0.651367f, 0.722168f, 0.781738f, 0.828613f,
- 0.866211f, 0.895508f, 0.966797f, 0.968750f, 0.969238f, 0.969727f, 0.969238f, 0.969238f,
- 0.000000f, 0.000108f, 0.000215f, 0.000346f, 0.000352f, 0.000501f, 0.000783f, 0.000828f,
- 0.000954f, 0.000980f, 0.001130f, 0.001353f, 0.001429f, 0.001522f, 0.001690f, 0.001760f,
- 0.002172f, 0.002363f, 0.002522f, 0.002777f, 0.003202f, 0.003550f, 0.004040f, 0.004364f,
- 0.004734f, 0.005192f, 0.005909f, 0.006271f, 0.007015f, 0.007957f, 0.008774f, 0.010185f,
- 0.011681f, 0.013306f, 0.015327f, 0.017517f, 0.020264f, 0.023636f, 0.027740f, 0.033234f,
- 0.039856f, 0.048340f, 0.059387f, 0.074097f, 0.093567f, 0.118896f, 0.153931f, 0.200073f,
- 0.260254f, 0.334473f, 0.420410f, 0.511719f, 0.601562f, 0.682129f, 0.750488f, 0.807617f,
- 0.851074f, 0.884277f, 0.963867f, 0.966309f, 0.966797f, 0.966797f, 0.966797f, 0.966797f,
- 0.000000f, 0.000059f, 0.000292f, 0.000331f, 0.000344f, 0.000613f, 0.000532f, 0.000703f,
- 0.000853f, 0.000915f, 0.000936f, 0.001102f, 0.001284f, 0.001430f, 0.001417f, 0.001475f,
- 0.001791f, 0.001989f, 0.002161f, 0.002388f, 0.002775f, 0.003017f, 0.003357f, 0.003763f,
- 0.004124f, 0.004383f, 0.004917f, 0.005436f, 0.005840f, 0.006733f, 0.007511f, 0.008667f,
- 0.009567f, 0.011032f, 0.012474f, 0.014610f, 0.016739f, 0.019379f, 0.022873f, 0.027252f,
- 0.032410f, 0.039062f, 0.048065f, 0.059296f, 0.074646f, 0.094971f, 0.123108f, 0.161011f,
- 0.211426f, 0.277344f, 0.358154f, 0.450195f, 0.545410f, 0.636230f, 0.715332f, 0.781250f,
- 0.832520f, 0.872070f, 0.960449f, 0.962402f, 0.963867f, 0.963379f, 0.962891f, 0.963379f,
- 0.000000f, 0.000000f, 0.000098f, 0.000301f, 0.000315f, 0.000566f, 0.000587f, 0.000627f,
- 0.000643f, 0.000795f, 0.000974f, 0.001023f, 0.000987f, 0.001031f, 0.001245f, 0.001470f,
- 0.001637f, 0.001820f, 0.001884f, 0.002146f, 0.002357f, 0.002630f, 0.002913f, 0.003164f,
- 0.003380f, 0.003824f, 0.004189f, 0.004353f, 0.004940f, 0.005688f, 0.006409f, 0.007347f,
- 0.008018f, 0.009163f, 0.010559f, 0.012039f, 0.013695f, 0.016144f, 0.018723f, 0.022354f,
- 0.026337f, 0.031433f, 0.038818f, 0.047546f, 0.059662f, 0.075623f, 0.097473f, 0.127808f,
- 0.169556f, 0.225830f, 0.299072f, 0.387451f, 0.486084f, 0.583984f, 0.674805f, 0.751465f,
- 0.812012f, 0.859375f, 0.957031f, 0.958984f, 0.959473f, 0.959961f, 0.959961f, 0.959961f,
- 0.000000f, 0.000000f, 0.000004f, 0.000078f, 0.000408f, 0.000432f, 0.000563f, 0.000560f,
- 0.000566f, 0.000623f, 0.000782f, 0.000829f, 0.000896f, 0.000956f, 0.001056f, 0.001249f,
- 0.001414f, 0.001473f, 0.001646f, 0.001764f, 0.002066f, 0.002230f, 0.002436f, 0.002651f,
- 0.003012f, 0.003252f, 0.003414f, 0.004055f, 0.004143f, 0.004784f, 0.005356f, 0.006077f,
- 0.006870f, 0.007538f, 0.008728f, 0.009834f, 0.011322f, 0.013130f, 0.015427f, 0.017914f,
- 0.021271f, 0.025436f, 0.030960f, 0.038086f, 0.047485f, 0.060303f, 0.077087f, 0.101196f,
- 0.134521f, 0.180786f, 0.244507f, 0.326172f, 0.423584f, 0.527832f, 0.628418f, 0.716797f,
- 0.788086f, 0.843262f, 0.953125f, 0.955566f, 0.955566f, 0.956543f, 0.956055f, 0.956543f,
- 0.000000f, 0.000000f, 0.000000f, 0.000236f, 0.000320f, 0.000484f, 0.000521f, 0.000549f,
- 0.000556f, 0.000584f, 0.000574f, 0.000690f, 0.000758f, 0.000841f, 0.001003f, 0.001013f,
- 0.001169f, 0.001292f, 0.001437f, 0.001658f, 0.001830f, 0.002001f, 0.002081f, 0.002146f,
- 0.002434f, 0.002712f, 0.002964f, 0.003220f, 0.003513f, 0.003963f, 0.004410f, 0.004875f,
- 0.005608f, 0.006245f, 0.007179f, 0.008118f, 0.009201f, 0.010582f, 0.012360f, 0.014343f,
- 0.016968f, 0.020401f, 0.024628f, 0.030365f, 0.037567f, 0.047455f, 0.060913f, 0.079529f,
- 0.105774f, 0.143555f, 0.196167f, 0.268799f, 0.361084f, 0.467041f, 0.576172f, 0.676758f,
- 0.760254f, 0.825195f, 0.948242f, 0.951660f, 0.951660f, 0.951660f, 0.951660f, 0.951660f,
- 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000257f, 0.000334f, 0.000390f, 0.000496f,
- 0.000520f, 0.000539f, 0.000590f, 0.000602f, 0.000646f, 0.000725f, 0.000909f, 0.000949f,
- 0.001023f, 0.001121f, 0.001181f, 0.001308f, 0.001474f, 0.001457f, 0.001714f, 0.002007f,
- 0.001929f, 0.002039f, 0.002468f, 0.002672f, 0.003025f, 0.003317f, 0.003635f, 0.004047f,
- 0.004433f, 0.004864f, 0.005756f, 0.006493f, 0.007515f, 0.008331f, 0.009697f, 0.011383f,
- 0.014000f, 0.016235f, 0.019653f, 0.024185f, 0.029465f, 0.037109f, 0.047699f, 0.062164f,
- 0.082642f, 0.112488f, 0.155151f, 0.216919f, 0.300049f, 0.404541f, 0.520020f, 0.631836f,
- 0.728516f, 0.805664f, 0.943848f, 0.946289f, 0.946777f, 0.946777f, 0.947266f, 0.947266f,
- 0.000000f, 0.000000f, 0.000122f, 0.000088f, 0.000219f, 0.000229f, 0.000355f, 0.000414f,
- 0.000482f, 0.000545f, 0.000559f, 0.000568f, 0.000481f, 0.000668f, 0.000636f, 0.000728f,
- 0.000924f, 0.000980f, 0.001017f, 0.001109f, 0.001258f, 0.001353f, 0.001451f, 0.001564f,
- 0.001621f, 0.001740f, 0.002066f, 0.002289f, 0.002459f, 0.002621f, 0.002975f, 0.003349f,
- 0.003588f, 0.003998f, 0.004723f, 0.005116f, 0.006035f, 0.006859f, 0.007957f, 0.009064f,
- 0.010658f, 0.012711f, 0.015511f, 0.018555f, 0.023026f, 0.028854f, 0.037140f, 0.048035f,
- 0.064026f, 0.086914f, 0.121033f, 0.171387f, 0.244141f, 0.341797f, 0.458740f, 0.580078f,
- 0.691895f, 0.780762f, 0.937988f, 0.940430f, 0.941406f, 0.940918f, 0.941895f, 0.941406f,
- 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000211f, 0.000221f, 0.000225f, 0.000192f,
- 0.000352f, 0.000368f, 0.000397f, 0.000529f, 0.000510f, 0.000504f, 0.000540f, 0.000671f,
- 0.000694f, 0.000763f, 0.000902f, 0.000998f, 0.001063f, 0.001074f, 0.001128f, 0.001407f,
- 0.001370f, 0.001449f, 0.001682f, 0.001635f, 0.001976f, 0.002108f, 0.002335f, 0.002558f,
- 0.002905f, 0.003176f, 0.003637f, 0.003948f, 0.004650f, 0.005341f, 0.006237f, 0.007034f,
- 0.008415f, 0.009811f, 0.012032f, 0.014565f, 0.017731f, 0.022324f, 0.028427f, 0.036713f,
- 0.048859f, 0.066406f, 0.092957f, 0.133057f, 0.193848f, 0.281250f, 0.395508f, 0.524902f,
- 0.648926f, 0.754395f, 0.931152f, 0.934570f, 0.934570f, 0.934570f, 0.935547f, 0.935059f,
- 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000181f, 0.000196f, 0.000236f, 0.000250f,
- 0.000226f, 0.000281f, 0.000335f, 0.000457f, 0.000406f, 0.000511f, 0.000522f, 0.000593f,
- 0.000539f, 0.000663f, 0.000661f, 0.000779f, 0.000978f, 0.000855f, 0.000937f, 0.001128f,
- 0.001163f, 0.001253f, 0.001241f, 0.001531f, 0.001595f, 0.001796f, 0.001888f, 0.002226f,
- 0.002350f, 0.002609f, 0.002787f, 0.003260f, 0.003656f, 0.004303f, 0.004910f, 0.005577f,
- 0.006683f, 0.007603f, 0.009102f, 0.011017f, 0.013603f, 0.016968f, 0.021652f, 0.027939f,
- 0.037109f, 0.050262f, 0.070374f, 0.101624f, 0.150391f, 0.225220f, 0.331543f, 0.463867f,
- 0.601074f, 0.723145f, 0.923828f, 0.927246f, 0.927246f, 0.928223f, 0.927734f, 0.928223f,
- 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000174f, 0.000156f, 0.000204f,
- 0.000180f, 0.000221f, 0.000246f, 0.000346f, 0.000313f, 0.000426f, 0.000468f, 0.000482f,
- 0.000559f, 0.000582f, 0.000536f, 0.000611f, 0.000770f, 0.000666f, 0.000919f, 0.000947f,
- 0.001013f, 0.000948f, 0.001129f, 0.001169f, 0.001463f, 0.001579f, 0.001540f, 0.001555f,
- 0.001888f, 0.002007f, 0.002390f, 0.002623f, 0.002708f, 0.003235f, 0.003584f, 0.004223f,
- 0.005001f, 0.005791f, 0.006905f, 0.008118f, 0.010117f, 0.012512f, 0.015961f, 0.020798f,
- 0.027374f, 0.037628f, 0.052673f, 0.076172f, 0.114197f, 0.175659f, 0.270752f, 0.399658f,
- 0.546875f, 0.687012f, 0.915527f, 0.918457f, 0.919434f, 0.919434f, 0.919434f, 0.919434f,
- 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000139f, 0.000141f,
- 0.000152f, 0.000186f, 0.000209f, 0.000222f, 0.000297f, 0.000330f, 0.000367f, 0.000403f,
- 0.000433f, 0.000456f, 0.000457f, 0.000484f, 0.000521f, 0.000544f, 0.000594f, 0.000807f,
- 0.000790f, 0.000841f, 0.000784f, 0.001025f, 0.001112f, 0.001014f, 0.001146f, 0.001287f,
- 0.001485f, 0.001541f, 0.001740f, 0.002014f, 0.002264f, 0.002460f, 0.002825f, 0.003124f,
- 0.003683f, 0.004177f, 0.005024f, 0.006004f, 0.007454f, 0.009041f, 0.011833f, 0.014839f,
- 0.019791f, 0.027283f, 0.038361f, 0.055817f, 0.084656f, 0.133057f, 0.213013f, 0.334717f,
- 0.488770f, 0.645996f, 0.905762f, 0.909668f, 0.909668f, 0.909180f, 0.910645f, 0.908691f,
- 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000115f,
- 0.000104f, 0.000105f, 0.000203f, 0.000235f, 0.000185f, 0.000290f, 0.000201f, 0.000306f,
- 0.000259f, 0.000370f, 0.000401f, 0.000428f, 0.000596f, 0.000617f, 0.000474f, 0.000593f,
- 0.000641f, 0.000676f, 0.000682f, 0.000826f, 0.000897f, 0.000934f, 0.000972f, 0.000972f,
- 0.001213f, 0.001281f, 0.001410f, 0.001451f, 0.001562f, 0.001786f, 0.002031f, 0.002417f,
- 0.002764f, 0.003162f, 0.003763f, 0.004406f, 0.005310f, 0.006454f, 0.008156f, 0.010849f,
- 0.014305f, 0.019318f, 0.027328f, 0.039856f, 0.061310f, 0.097717f, 0.162354f, 0.270752f,
- 0.424805f, 0.599609f, 0.894043f, 0.897949f, 0.898438f, 0.898438f, 0.898926f, 0.898438f,
- 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000118f,
- 0.000112f, 0.000102f, 0.000094f, 0.000109f, 0.000131f, 0.000145f, 0.000232f, 0.000171f,
- 0.000278f, 0.000230f, 0.000347f, 0.000331f, 0.000379f, 0.000381f, 0.000512f, 0.000427f,
- 0.000541f, 0.000566f, 0.000547f, 0.000613f, 0.000706f, 0.000660f, 0.000809f, 0.000941f,
- 0.000950f, 0.001035f, 0.001069f, 0.001220f, 0.001149f, 0.001314f, 0.001603f, 0.001801f,
- 0.002062f, 0.002394f, 0.002737f, 0.003057f, 0.003771f, 0.004471f, 0.005875f, 0.007217f,
- 0.009651f, 0.013344f, 0.018829f, 0.027710f, 0.043091f, 0.069214f, 0.119141f, 0.210571f,
- 0.358398f, 0.544922f, 0.881348f, 0.883789f, 0.885254f, 0.885742f, 0.885254f, 0.885254f,
- 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000117f, 0.000116f,
- 0.000116f, 0.000110f, 0.000101f, 0.000094f, 0.000087f, 0.000157f, 0.000151f, 0.000168f,
- 0.000146f, 0.000219f, 0.000214f, 0.000261f, 0.000313f, 0.000363f, 0.000311f, 0.000415f,
- 0.000476f, 0.000448f, 0.000429f, 0.000460f, 0.000481f, 0.000560f, 0.000544f, 0.000695f,
- 0.000626f, 0.000789f, 0.000877f, 0.000894f, 0.000948f, 0.001177f, 0.001175f, 0.001366f,
- 0.001487f, 0.001738f, 0.002008f, 0.002304f, 0.002663f, 0.003250f, 0.004002f, 0.004932f,
- 0.006416f, 0.008636f, 0.012344f, 0.018127f, 0.028610f, 0.047150f, 0.083923f, 0.156860f,
- 0.291260f, 0.487305f, 0.866211f, 0.869141f, 0.870605f, 0.870117f, 0.871094f, 0.870117f,
- 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000117f, 0.000116f, 0.000115f, 0.000115f,
- 0.000114f, 0.000114f, 0.000109f, 0.000101f, 0.000094f, 0.000087f, 0.000081f, 0.000085f,
- 0.000129f, 0.000150f, 0.000176f, 0.000193f, 0.000216f, 0.000257f, 0.000241f, 0.000302f,
- 0.000259f, 0.000299f, 0.000397f, 0.000403f, 0.000384f, 0.000402f, 0.000425f, 0.000582f,
- 0.000467f, 0.000614f, 0.000660f, 0.000625f, 0.000650f, 0.000819f, 0.000790f, 0.000879f,
- 0.001001f, 0.001140f, 0.001403f, 0.001555f, 0.001844f, 0.002213f, 0.002636f, 0.003235f,
- 0.004082f, 0.005604f, 0.007896f, 0.011292f, 0.018005f, 0.030472f, 0.055786f, 0.109985f,
- 0.224976f, 0.421875f, 0.848145f, 0.852539f, 0.853027f, 0.852539f, 0.852539f, 0.853027f,
- 0.000000f, 0.000119f, 0.000118f, 0.000116f, 0.000115f, 0.000114f, 0.000113f, 0.000112f,
- 0.000111f, 0.000111f, 0.000110f, 0.000108f, 0.000101f, 0.000094f, 0.000088f, 0.000082f,
- 0.000077f, 0.000109f, 0.000068f, 0.000102f, 0.000127f, 0.000158f, 0.000177f, 0.000192f,
- 0.000207f, 0.000214f, 0.000249f, 0.000278f, 0.000296f, 0.000320f, 0.000330f, 0.000342f,
- 0.000415f, 0.000371f, 0.000389f, 0.000508f, 0.000463f, 0.000586f, 0.000606f, 0.000649f,
- 0.000724f, 0.000841f, 0.000910f, 0.001065f, 0.001236f, 0.001475f, 0.001807f, 0.002138f,
- 0.002716f, 0.003622f, 0.004921f, 0.006950f, 0.010574f, 0.018433f, 0.034607f, 0.072449f,
- 0.163818f, 0.352295f, 0.827637f, 0.831055f, 0.831543f, 0.832031f, 0.833008f, 0.832520f,
- 0.000120f, 0.000116f, 0.000114f, 0.000113f, 0.000111f, 0.000110f, 0.000109f, 0.000108f,
- 0.000107f, 0.000106f, 0.000106f, 0.000105f, 0.000104f, 0.000101f, 0.000094f, 0.000088f,
- 0.000083f, 0.000078f, 0.000073f, 0.000092f, 0.000064f, 0.000097f, 0.000073f, 0.000105f,
- 0.000125f, 0.000162f, 0.000179f, 0.000177f, 0.000191f, 0.000221f, 0.000241f, 0.000235f,
- 0.000270f, 0.000277f, 0.000287f, 0.000329f, 0.000319f, 0.000428f, 0.000417f, 0.000409f,
- 0.000524f, 0.000537f, 0.000612f, 0.000750f, 0.000770f, 0.000961f, 0.001153f, 0.001347f,
- 0.001702f, 0.002081f, 0.002903f, 0.003956f, 0.006184f, 0.010368f, 0.019592f, 0.043427f,
- 0.109924f, 0.280518f, 0.803223f, 0.806152f, 0.807617f, 0.808594f, 0.809082f, 0.808105f,
- 0.000000f, 0.000111f, 0.000106f, 0.000107f, 0.000104f, 0.000103f, 0.000101f, 0.000101f,
- 0.000101f, 0.000100f, 0.000099f, 0.000098f, 0.000097f, 0.000097f, 0.000097f, 0.000094f,
- 0.000088f, 0.000083f, 0.000078f, 0.000073f, 0.000069f, 0.000070f, 0.000061f, 0.000068f,
- 0.000059f, 0.000067f, 0.000084f, 0.000097f, 0.000128f, 0.000137f, 0.000165f, 0.000160f,
- 0.000176f, 0.000185f, 0.000217f, 0.000239f, 0.000237f, 0.000238f, 0.000272f, 0.000281f,
- 0.000314f, 0.000372f, 0.000395f, 0.000430f, 0.000504f, 0.000578f, 0.000665f, 0.000856f,
- 0.000969f, 0.001210f, 0.001594f, 0.002216f, 0.003370f, 0.005527f, 0.010170f, 0.023239f,
- 0.066101f, 0.207275f, 0.775391f, 0.779785f, 0.780273f, 0.780762f, 0.780273f, 0.780762f,
- 0.000000f, 0.000094f, 0.000097f, 0.000095f, 0.000092f, 0.000091f, 0.000091f, 0.000090f,
- 0.000089f, 0.000089f, 0.000088f, 0.000088f, 0.000087f, 0.000086f, 0.000087f, 0.000086f,
- 0.000086f, 0.000085f, 0.000081f, 0.000076f, 0.000072f, 0.000068f, 0.000064f, 0.000060f,
- 0.000057f, 0.000054f, 0.000058f, 0.000048f, 0.000048f, 0.000069f, 0.000068f, 0.000092f,
- 0.000110f, 0.000122f, 0.000133f, 0.000136f, 0.000146f, 0.000154f, 0.000175f, 0.000194f,
- 0.000204f, 0.000206f, 0.000238f, 0.000262f, 0.000266f, 0.000338f, 0.000361f, 0.000432f,
- 0.000527f, 0.000659f, 0.000848f, 0.001183f, 0.001713f, 0.002661f, 0.004921f, 0.010887f,
- 0.033936f, 0.138428f, 0.743652f, 0.747559f, 0.748047f, 0.748535f, 0.749512f, 0.749023f,
- 0.000045f, 0.000047f, 0.000059f, 0.000059f, 0.000063f, 0.000068f, 0.000068f, 0.000068f,
- 0.000067f, 0.000069f, 0.000068f, 0.000070f, 0.000070f, 0.000070f, 0.000071f, 0.000070f,
- 0.000071f, 0.000071f, 0.000071f, 0.000071f, 0.000071f, 0.000069f, 0.000065f, 0.000062f,
- 0.000058f, 0.000055f, 0.000052f, 0.000049f, 0.000046f, 0.000044f, 0.000041f, 0.000050f,
- 0.000051f, 0.000048f, 0.000061f, 0.000070f, 0.000084f, 0.000095f, 0.000107f, 0.000104f,
- 0.000111f, 0.000128f, 0.000143f, 0.000154f, 0.000157f, 0.000186f, 0.000198f, 0.000216f,
- 0.000268f, 0.000315f, 0.000414f, 0.000537f, 0.000735f, 0.001149f, 0.002075f, 0.004669f,
- 0.014175f, 0.077881f, 0.707031f, 0.710449f, 0.712402f, 0.711914f, 0.712891f, 0.712402f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000012f, 0.000013f, 0.000029f,
- 0.000028f, 0.000037f, 0.000035f, 0.000039f, 0.000043f, 0.000043f, 0.000045f, 0.000045f,
- 0.000048f, 0.000048f, 0.000050f, 0.000051f, 0.000052f, 0.000052f, 0.000053f, 0.000054f,
- 0.000054f, 0.000053f, 0.000050f, 0.000048f, 0.000045f, 0.000043f, 0.000040f, 0.000038f,
- 0.000036f, 0.000034f, 0.000032f, 0.000030f, 0.000028f, 0.000030f, 0.000038f, 0.000043f,
- 0.000057f, 0.000069f, 0.000072f, 0.000073f, 0.000082f, 0.000095f, 0.000101f, 0.000099f,
- 0.000116f, 0.000130f, 0.000184f, 0.000211f, 0.000301f, 0.000443f, 0.000737f, 0.001601f,
- 0.004978f, 0.032593f, 0.666504f, 0.669922f, 0.669922f, 0.672363f, 0.670898f, 0.670410f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f,
- 0.000012f, 0.000015f, 0.000018f, 0.000021f, 0.000022f, 0.000023f, 0.000025f, 0.000028f,
- 0.000029f, 0.000029f, 0.000031f, 0.000033f, 0.000033f, 0.000035f, 0.000035f, 0.000035f,
- 0.000033f, 0.000031f, 0.000029f, 0.000028f, 0.000026f, 0.000024f, 0.000023f, 0.000021f,
- 0.000020f, 0.000019f, 0.000022f, 0.000022f, 0.000030f, 0.000038f, 0.000042f, 0.000041f,
- 0.000052f, 0.000047f, 0.000064f, 0.000072f, 0.000078f, 0.000129f, 0.000201f, 0.000382f,
- 0.001180f, 0.009117f, 0.620605f, 0.624512f, 0.625000f, 0.625000f, 0.625000f, 0.625488f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000005f, 0.000007f, 0.000008f,
- 0.000010f, 0.000011f, 0.000012f, 0.000014f, 0.000016f, 0.000016f, 0.000018f, 0.000017f,
- 0.000016f, 0.000015f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000010f, 0.000009f,
- 0.000011f, 0.000014f, 0.000018f, 0.000018f, 0.000021f, 0.000028f, 0.000035f, 0.000053f,
- 0.000136f, 0.001152f, 0.571777f, 0.575684f, 0.575684f, 0.576172f, 0.576660f, 0.576660f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f,
- 0.000002f, 0.000004f, 0.000004f, 0.000004f, 0.000003f, 0.000003f, 0.000002f, 0.000004f,
- 0.000003f, 0.000011f, 0.520020f, 0.523926f, 0.524902f, 0.524902f, 0.524902f, 0.524902f,
- },
- {
- 0.119934f, 0.328857f, 0.480713f, 0.586914f, 0.663086f, 0.717773f, 0.759766f, 0.791504f,
- 0.818359f, 0.838867f, 0.856934f, 0.871094f, 0.883301f, 0.894043f, 0.902832f, 0.911621f,
- 0.917969f, 0.924805f, 0.930664f, 0.936035f, 0.939941f, 0.944824f, 0.948242f, 0.951660f,
- 0.954590f, 0.958008f, 0.961426f, 0.962891f, 0.966309f, 0.967285f, 0.970215f, 0.972656f,
- 0.973633f, 0.975586f, 0.977539f, 0.978516f, 0.979980f, 0.981445f, 0.982910f, 0.984375f,
- 0.985352f, 0.986328f, 0.987793f, 0.988770f, 0.989746f, 0.990234f, 0.991699f, 0.992676f,
- 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.997559f, 0.998047f,
- 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, 0.998047f,
- 0.046875f, 0.160400f, 0.286621f, 0.405518f, 0.507812f, 0.590820f, 0.656250f, 0.708008f,
- 0.748535f, 0.781250f, 0.809082f, 0.830566f, 0.848633f, 0.864258f, 0.877441f, 0.888672f,
- 0.898926f, 0.906738f, 0.915039f, 0.921387f, 0.928223f, 0.933105f, 0.937988f, 0.942871f,
- 0.946777f, 0.950684f, 0.954102f, 0.957031f, 0.959961f, 0.962402f, 0.965332f, 0.966797f,
- 0.969727f, 0.971191f, 0.973145f, 0.975098f, 0.977539f, 0.978027f, 0.980469f, 0.981934f,
- 0.982910f, 0.984375f, 0.985352f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.990723f,
- 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995605f, 0.996582f, 0.996582f,
- 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, 0.998047f,
- 0.023788f, 0.084473f, 0.163696f, 0.255615f, 0.351807f, 0.445312f, 0.527832f, 0.597656f,
- 0.656738f, 0.703613f, 0.742676f, 0.775879f, 0.802734f, 0.824707f, 0.843262f, 0.858887f,
- 0.873047f, 0.884766f, 0.895508f, 0.903809f, 0.913086f, 0.919434f, 0.925781f, 0.931641f,
- 0.937012f, 0.941406f, 0.945801f, 0.949707f, 0.953125f, 0.956543f, 0.959473f, 0.962402f,
- 0.964844f, 0.967285f, 0.969238f, 0.972168f, 0.973633f, 0.975098f, 0.977539f, 0.979492f,
- 0.980469f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.988770f,
- 0.989746f, 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996094f,
- 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.997559f,
- 0.014595f, 0.050110f, 0.097717f, 0.158569f, 0.230347f, 0.311523f, 0.394531f, 0.473145f,
- 0.544922f, 0.606934f, 0.660645f, 0.705566f, 0.743164f, 0.775391f, 0.800781f, 0.822266f,
- 0.841309f, 0.856934f, 0.870605f, 0.883301f, 0.894043f, 0.902832f, 0.911133f, 0.918945f,
- 0.925293f, 0.931152f, 0.936035f, 0.941406f, 0.945801f, 0.949707f, 0.953125f, 0.956055f,
- 0.959473f, 0.962402f, 0.964844f, 0.967285f, 0.970215f, 0.972168f, 0.974121f, 0.975098f,
- 0.977539f, 0.979004f, 0.980957f, 0.981934f, 0.983398f, 0.984375f, 0.985840f, 0.987305f,
- 0.988281f, 0.989258f, 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f,
- 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.997559f,
- 0.009178f, 0.032379f, 0.062561f, 0.102417f, 0.151611f, 0.210938f, 0.279785f, 0.352783f,
- 0.426758f, 0.496826f, 0.561035f, 0.618164f, 0.666992f, 0.708496f, 0.744141f, 0.773926f,
- 0.800781f, 0.821777f, 0.840820f, 0.856445f, 0.870117f, 0.882324f, 0.893066f, 0.901855f,
- 0.910645f, 0.918457f, 0.925293f, 0.930176f, 0.935547f, 0.941406f, 0.946289f, 0.949707f,
- 0.953125f, 0.956543f, 0.959961f, 0.962891f, 0.965332f, 0.967773f, 0.969727f, 0.972656f,
- 0.974121f, 0.976074f, 0.977539f, 0.979492f, 0.981445f, 0.982422f, 0.984375f, 0.985840f,
- 0.986328f, 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.994141f,
- 0.994629f, 0.995605f, 0.998047f, 0.998047f, 0.998047f, 0.997559f, 0.997559f, 0.997559f,
- 0.006382f, 0.022430f, 0.042908f, 0.068970f, 0.102844f, 0.144653f, 0.195557f, 0.253906f,
- 0.318848f, 0.386230f, 0.454590f, 0.518066f, 0.577148f, 0.628906f, 0.675293f, 0.714844f,
- 0.748535f, 0.777344f, 0.802246f, 0.823730f, 0.841797f, 0.856934f, 0.871094f, 0.882812f,
- 0.893555f, 0.902832f, 0.911133f, 0.918457f, 0.925293f, 0.930176f, 0.937012f, 0.940918f,
- 0.945801f, 0.950195f, 0.953613f, 0.957031f, 0.960449f, 0.963379f, 0.966309f, 0.968262f,
- 0.970703f, 0.973145f, 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.981934f, 0.983398f,
- 0.984375f, 0.985840f, 0.988281f, 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f,
- 0.993652f, 0.994629f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997070f,
- 0.004585f, 0.015961f, 0.030930f, 0.049133f, 0.072144f, 0.101013f, 0.137451f, 0.181519f,
- 0.232544f, 0.290039f, 0.352539f, 0.416748f, 0.479736f, 0.538574f, 0.592773f, 0.641602f,
- 0.684570f, 0.723145f, 0.754395f, 0.782715f, 0.805176f, 0.825195f, 0.843750f, 0.859863f,
- 0.872559f, 0.884766f, 0.895020f, 0.904297f, 0.912109f, 0.919922f, 0.926270f, 0.932129f,
- 0.937500f, 0.942383f, 0.946289f, 0.950195f, 0.955078f, 0.958008f, 0.961426f, 0.964355f,
- 0.967285f, 0.969238f, 0.971680f, 0.974121f, 0.975586f, 0.977539f, 0.979492f, 0.980957f,
- 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.988281f, 0.989746f, 0.990723f, 0.992188f,
- 0.992676f, 0.993164f, 0.997559f, 0.997559f, 0.997070f, 0.997070f, 0.997070f, 0.997070f,
- 0.003483f, 0.012291f, 0.023209f, 0.036041f, 0.052429f, 0.073486f, 0.099182f, 0.131226f,
- 0.169678f, 0.214844f, 0.266846f, 0.323242f, 0.383545f, 0.444580f, 0.503418f, 0.559082f,
- 0.609375f, 0.655762f, 0.695312f, 0.730957f, 0.760254f, 0.788086f, 0.810059f, 0.829590f,
- 0.847168f, 0.862793f, 0.875488f, 0.886719f, 0.896973f, 0.906250f, 0.914551f, 0.921387f,
- 0.927734f, 0.933594f, 0.938965f, 0.944336f, 0.948242f, 0.952148f, 0.956543f, 0.958984f,
- 0.961914f, 0.965332f, 0.968262f, 0.970703f, 0.972656f, 0.974609f, 0.977051f, 0.979004f,
- 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.989746f, 0.990234f,
- 0.991699f, 0.992676f, 0.996582f, 0.997070f, 0.997070f, 0.996582f, 0.996582f, 0.996094f,
- 0.002962f, 0.009613f, 0.017792f, 0.027481f, 0.039429f, 0.055176f, 0.073914f, 0.096985f,
- 0.125610f, 0.159180f, 0.199707f, 0.246216f, 0.297607f, 0.353760f, 0.412842f, 0.470215f,
- 0.526367f, 0.578613f, 0.626953f, 0.669434f, 0.707031f, 0.740723f, 0.769043f, 0.794922f,
- 0.814941f, 0.835449f, 0.851074f, 0.866699f, 0.879395f, 0.890137f, 0.899902f, 0.909180f,
- 0.916992f, 0.924316f, 0.929688f, 0.936035f, 0.941406f, 0.945312f, 0.950195f, 0.953613f,
- 0.957520f, 0.960938f, 0.963867f, 0.966797f, 0.969238f, 0.971680f, 0.974121f, 0.976562f,
- 0.979004f, 0.979980f, 0.981934f, 0.982910f, 0.984375f, 0.986816f, 0.987793f, 0.988770f,
- 0.990234f, 0.991699f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996094f, 0.996094f,
- 0.002077f, 0.007637f, 0.013802f, 0.021606f, 0.031006f, 0.042419f, 0.055969f, 0.073242f,
- 0.094055f, 0.119446f, 0.150513f, 0.186401f, 0.228638f, 0.276123f, 0.328857f, 0.384277f,
- 0.440674f, 0.496338f, 0.549805f, 0.598633f, 0.644043f, 0.683594f, 0.719727f, 0.750977f,
- 0.779297f, 0.802246f, 0.823730f, 0.840820f, 0.855957f, 0.871582f, 0.882324f, 0.893555f,
- 0.903809f, 0.911621f, 0.920410f, 0.926758f, 0.932617f, 0.938477f, 0.943359f, 0.947754f,
- 0.953125f, 0.955566f, 0.959473f, 0.962402f, 0.965332f, 0.968262f, 0.970703f, 0.972656f,
- 0.976074f, 0.977051f, 0.979492f, 0.981445f, 0.983398f, 0.984863f, 0.986328f, 0.987793f,
- 0.989258f, 0.990723f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.995605f,
- 0.002014f, 0.006035f, 0.011299f, 0.017410f, 0.024368f, 0.033020f, 0.043701f, 0.056458f,
- 0.072205f, 0.091431f, 0.114807f, 0.141968f, 0.174316f, 0.213257f, 0.256836f, 0.306152f,
- 0.358887f, 0.413330f, 0.468018f, 0.520996f, 0.572266f, 0.618652f, 0.661621f, 0.699707f,
- 0.732910f, 0.762695f, 0.788574f, 0.810547f, 0.830078f, 0.848145f, 0.862305f, 0.875977f,
- 0.887695f, 0.898438f, 0.907227f, 0.915527f, 0.922852f, 0.929199f, 0.936035f, 0.940918f,
- 0.946289f, 0.950684f, 0.953613f, 0.958496f, 0.960938f, 0.964355f, 0.967285f, 0.970215f,
- 0.972656f, 0.975586f, 0.977539f, 0.979492f, 0.980957f, 0.982910f, 0.984863f, 0.986328f,
- 0.987793f, 0.988770f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f,
- 0.001496f, 0.005196f, 0.009201f, 0.013985f, 0.019806f, 0.026413f, 0.034943f, 0.044647f,
- 0.056641f, 0.070923f, 0.088623f, 0.109680f, 0.135254f, 0.164795f, 0.200073f, 0.240845f,
- 0.285645f, 0.335449f, 0.387939f, 0.441650f, 0.495850f, 0.546875f, 0.595215f, 0.639160f,
- 0.679199f, 0.715820f, 0.746582f, 0.774414f, 0.798828f, 0.819824f, 0.837402f, 0.854492f,
- 0.869629f, 0.881348f, 0.893066f, 0.902832f, 0.912109f, 0.918945f, 0.926758f, 0.933105f,
- 0.938477f, 0.943359f, 0.948730f, 0.952637f, 0.956055f, 0.960449f, 0.963379f, 0.966797f,
- 0.969238f, 0.972656f, 0.975098f, 0.977051f, 0.979004f, 0.981445f, 0.982910f, 0.984375f,
- 0.986328f, 0.987305f, 0.994629f, 0.995605f, 0.995117f, 0.995117f, 0.995117f, 0.994629f,
- 0.001187f, 0.004314f, 0.007740f, 0.011337f, 0.016373f, 0.021759f, 0.028198f, 0.035889f,
- 0.045197f, 0.056580f, 0.069946f, 0.085938f, 0.105408f, 0.128784f, 0.155884f, 0.187866f,
- 0.225830f, 0.268066f, 0.315186f, 0.365479f, 0.418213f, 0.471680f, 0.522949f, 0.572754f,
- 0.617676f, 0.659668f, 0.697754f, 0.730957f, 0.760742f, 0.787109f, 0.809570f, 0.830078f,
- 0.846680f, 0.862793f, 0.875488f, 0.888184f, 0.898926f, 0.907715f, 0.916016f, 0.923340f,
- 0.930664f, 0.936523f, 0.941895f, 0.947754f, 0.951660f, 0.955566f, 0.959473f, 0.963867f,
- 0.966309f, 0.969238f, 0.972168f, 0.974121f, 0.976562f, 0.979004f, 0.980957f, 0.982910f,
- 0.984863f, 0.986816f, 0.994141f, 0.994629f, 0.994629f, 0.994629f, 0.994629f, 0.994141f,
- 0.001187f, 0.003733f, 0.006496f, 0.009918f, 0.013634f, 0.017899f, 0.023026f, 0.029343f,
- 0.036621f, 0.045227f, 0.055786f, 0.068298f, 0.083740f, 0.101135f, 0.122314f, 0.147827f,
- 0.177612f, 0.212891f, 0.252686f, 0.297119f, 0.345215f, 0.395996f, 0.448730f, 0.500488f,
- 0.550781f, 0.597656f, 0.641113f, 0.680664f, 0.716309f, 0.747559f, 0.774414f, 0.799316f,
- 0.820312f, 0.838867f, 0.855957f, 0.870117f, 0.883301f, 0.894531f, 0.904785f, 0.913086f,
- 0.920898f, 0.928223f, 0.935059f, 0.940430f, 0.945312f, 0.950684f, 0.955566f, 0.958496f,
- 0.962891f, 0.965820f, 0.968750f, 0.971680f, 0.974609f, 0.976562f, 0.978516f, 0.980957f,
- 0.982910f, 0.984863f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994629f,
- 0.000998f, 0.003178f, 0.005444f, 0.008179f, 0.011337f, 0.015091f, 0.019058f, 0.024368f,
- 0.029587f, 0.037140f, 0.045197f, 0.055115f, 0.066772f, 0.080688f, 0.097229f, 0.117371f,
- 0.140869f, 0.169312f, 0.201538f, 0.238770f, 0.280762f, 0.326660f, 0.376709f, 0.427490f,
- 0.479248f, 0.530273f, 0.578613f, 0.623535f, 0.664551f, 0.701660f, 0.733887f, 0.763672f,
- 0.790039f, 0.812500f, 0.832520f, 0.849121f, 0.865234f, 0.878906f, 0.890625f, 0.901367f,
- 0.910645f, 0.919434f, 0.926758f, 0.933105f, 0.939453f, 0.944824f, 0.949707f, 0.954590f,
- 0.958008f, 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.974121f, 0.977051f, 0.979004f,
- 0.980957f, 0.982910f, 0.993164f, 0.993164f, 0.994141f, 0.993652f, 0.993652f, 0.993164f,
- 0.000948f, 0.002638f, 0.004784f, 0.007153f, 0.009590f, 0.012505f, 0.016388f, 0.020599f,
- 0.025299f, 0.031097f, 0.037323f, 0.045197f, 0.054047f, 0.065002f, 0.078674f, 0.094055f,
- 0.112305f, 0.134399f, 0.160889f, 0.191040f, 0.226318f, 0.265869f, 0.310303f, 0.358154f,
- 0.409180f, 0.459473f, 0.510254f, 0.559082f, 0.606445f, 0.648926f, 0.687500f, 0.722168f,
- 0.753418f, 0.781250f, 0.804199f, 0.825684f, 0.843262f, 0.860840f, 0.874512f, 0.886719f,
- 0.898926f, 0.907227f, 0.916992f, 0.924805f, 0.932129f, 0.937988f, 0.943848f, 0.949219f,
- 0.954102f, 0.958496f, 0.961426f, 0.965332f, 0.968750f, 0.972168f, 0.974609f, 0.977051f,
- 0.979492f, 0.981445f, 0.992188f, 0.993164f, 0.993164f, 0.993164f, 0.993164f, 0.992676f,
- 0.000696f, 0.002352f, 0.004002f, 0.006138f, 0.008446f, 0.010826f, 0.013840f, 0.017258f,
- 0.021194f, 0.025970f, 0.031128f, 0.037140f, 0.044281f, 0.053436f, 0.063660f, 0.076050f,
- 0.090271f, 0.107727f, 0.128662f, 0.152832f, 0.182007f, 0.214111f, 0.252930f, 0.295166f,
- 0.341553f, 0.390625f, 0.442139f, 0.492676f, 0.541992f, 0.589844f, 0.633301f, 0.674316f,
- 0.710938f, 0.743652f, 0.772461f, 0.796875f, 0.819824f, 0.839355f, 0.854980f, 0.870605f,
- 0.884277f, 0.895508f, 0.906738f, 0.915527f, 0.923828f, 0.931152f, 0.937500f, 0.944336f,
- 0.949219f, 0.953613f, 0.958008f, 0.962402f, 0.965332f, 0.968750f, 0.972168f, 0.974609f,
- 0.977051f, 0.979980f, 0.991211f, 0.992676f, 0.992188f, 0.992188f, 0.992188f, 0.992676f,
- 0.000838f, 0.002033f, 0.003664f, 0.005077f, 0.007282f, 0.009415f, 0.011749f, 0.014931f,
- 0.017853f, 0.021606f, 0.025864f, 0.031219f, 0.037231f, 0.044464f, 0.052338f, 0.062500f,
- 0.073853f, 0.087463f, 0.104065f, 0.123230f, 0.146362f, 0.173340f, 0.205078f, 0.240845f,
- 0.281982f, 0.326660f, 0.374756f, 0.425049f, 0.476807f, 0.526855f, 0.574219f, 0.620117f,
- 0.662598f, 0.699219f, 0.733398f, 0.764160f, 0.791016f, 0.813965f, 0.833984f, 0.851074f,
- 0.867676f, 0.880859f, 0.893555f, 0.904785f, 0.914062f, 0.922852f, 0.930176f, 0.937012f,
- 0.942383f, 0.948242f, 0.953125f, 0.957520f, 0.962402f, 0.966309f, 0.969238f, 0.973145f,
- 0.975098f, 0.978027f, 0.991699f, 0.991699f, 0.992676f, 0.992188f, 0.991699f, 0.992188f,
- 0.000600f, 0.001687f, 0.003023f, 0.004963f, 0.006405f, 0.008163f, 0.010368f, 0.012718f,
- 0.015480f, 0.018311f, 0.022064f, 0.026169f, 0.031097f, 0.036926f, 0.043457f, 0.051392f,
- 0.060669f, 0.071350f, 0.084473f, 0.100220f, 0.118103f, 0.140259f, 0.166016f, 0.195679f,
- 0.230469f, 0.269531f, 0.313232f, 0.360596f, 0.410156f, 0.460693f, 0.511719f, 0.560547f,
- 0.607422f, 0.650879f, 0.689941f, 0.724609f, 0.756348f, 0.784180f, 0.808594f, 0.828613f,
- 0.847656f, 0.864258f, 0.879395f, 0.892090f, 0.903320f, 0.912598f, 0.921875f, 0.929688f,
- 0.936523f, 0.942871f, 0.947754f, 0.953125f, 0.957520f, 0.961914f, 0.966309f, 0.969238f,
- 0.972656f, 0.975586f, 0.990234f, 0.991211f, 0.991211f, 0.991699f, 0.991211f, 0.991211f,
- 0.000269f, 0.001538f, 0.002800f, 0.003868f, 0.005524f, 0.007179f, 0.008987f, 0.011063f,
- 0.013084f, 0.015747f, 0.019211f, 0.022324f, 0.026474f, 0.031311f, 0.036530f, 0.042969f,
- 0.050201f, 0.059174f, 0.069641f, 0.081543f, 0.096680f, 0.114075f, 0.134644f, 0.158691f,
- 0.187622f, 0.220581f, 0.258301f, 0.300781f, 0.347168f, 0.395996f, 0.447266f, 0.498291f,
- 0.547852f, 0.595215f, 0.640625f, 0.680176f, 0.717285f, 0.749512f, 0.778320f, 0.803223f,
- 0.825684f, 0.845215f, 0.862793f, 0.877441f, 0.890625f, 0.901855f, 0.912109f, 0.920898f,
- 0.929688f, 0.937012f, 0.942871f, 0.949707f, 0.954102f, 0.958496f, 0.962402f, 0.966309f,
- 0.970215f, 0.974121f, 0.989746f, 0.990234f, 0.990723f, 0.990723f, 0.990723f, 0.990234f,
- 0.000341f, 0.001337f, 0.002573f, 0.003475f, 0.004765f, 0.006329f, 0.007717f, 0.009499f,
- 0.011642f, 0.014107f, 0.016556f, 0.019470f, 0.022491f, 0.026169f, 0.030945f, 0.036011f,
- 0.042389f, 0.049042f, 0.057678f, 0.067993f, 0.079468f, 0.093384f, 0.110046f, 0.129883f,
- 0.152710f, 0.180420f, 0.212158f, 0.248291f, 0.289551f, 0.334961f, 0.383301f, 0.434570f,
- 0.485596f, 0.536133f, 0.584473f, 0.630371f, 0.671875f, 0.710449f, 0.743652f, 0.773926f,
- 0.799316f, 0.823242f, 0.843262f, 0.860352f, 0.875977f, 0.889648f, 0.901367f, 0.911621f,
- 0.921387f, 0.929688f, 0.937012f, 0.943848f, 0.950195f, 0.955078f, 0.959473f, 0.963379f,
- 0.967773f, 0.971191f, 0.988770f, 0.989746f, 0.990234f, 0.990234f, 0.990234f, 0.990234f,
- 0.000564f, 0.001324f, 0.002092f, 0.003191f, 0.004471f, 0.005348f, 0.007069f, 0.008438f,
- 0.010201f, 0.011810f, 0.014297f, 0.016586f, 0.019470f, 0.022644f, 0.026428f, 0.030579f,
- 0.035797f, 0.041718f, 0.048248f, 0.056213f, 0.065857f, 0.076782f, 0.090271f, 0.106262f,
- 0.125122f, 0.147095f, 0.173462f, 0.204224f, 0.239746f, 0.279785f, 0.323730f, 0.372314f,
- 0.422607f, 0.474121f, 0.526367f, 0.575195f, 0.621582f, 0.664062f, 0.703613f, 0.738770f,
- 0.769043f, 0.796387f, 0.820312f, 0.841797f, 0.858887f, 0.875488f, 0.889648f, 0.900879f,
- 0.912598f, 0.921875f, 0.930664f, 0.937500f, 0.944336f, 0.950195f, 0.955566f, 0.959961f,
- 0.964844f, 0.968750f, 0.987305f, 0.989258f, 0.989258f, 0.989258f, 0.989258f, 0.988770f,
- 0.000369f, 0.001128f, 0.001871f, 0.002792f, 0.003712f, 0.004723f, 0.006016f, 0.007542f,
- 0.008896f, 0.010773f, 0.012421f, 0.014381f, 0.016632f, 0.019791f, 0.022354f, 0.025955f,
- 0.030609f, 0.035065f, 0.040924f, 0.047333f, 0.055084f, 0.064209f, 0.075012f, 0.087769f,
- 0.102966f, 0.120911f, 0.142456f, 0.167358f, 0.197144f, 0.231812f, 0.270752f, 0.314209f,
- 0.362549f, 0.412598f, 0.464844f, 0.515625f, 0.566895f, 0.614258f, 0.657715f, 0.698730f,
- 0.734863f, 0.766602f, 0.794922f, 0.818848f, 0.839844f, 0.858887f, 0.875000f, 0.889648f,
- 0.901855f, 0.912598f, 0.922852f, 0.931152f, 0.938965f, 0.945312f, 0.951660f, 0.957520f,
- 0.961426f, 0.966309f, 0.986816f, 0.988281f, 0.988281f, 0.988770f, 0.988281f, 0.988281f,
- 0.000466f, 0.000900f, 0.001792f, 0.002695f, 0.003458f, 0.004204f, 0.005356f, 0.006512f,
- 0.007896f, 0.009300f, 0.010895f, 0.012459f, 0.014786f, 0.016739f, 0.019424f, 0.022461f,
- 0.026062f, 0.029831f, 0.034851f, 0.039764f, 0.046417f, 0.053711f, 0.062164f, 0.072388f,
- 0.085205f, 0.099365f, 0.117004f, 0.137573f, 0.162231f, 0.190674f, 0.224121f, 0.262451f,
- 0.305664f, 0.353027f, 0.403809f, 0.456055f, 0.508301f, 0.559082f, 0.608398f, 0.652832f,
- 0.694824f, 0.731445f, 0.764160f, 0.793945f, 0.817871f, 0.839355f, 0.858398f, 0.875488f,
- 0.890137f, 0.902832f, 0.913574f, 0.923828f, 0.932617f, 0.940918f, 0.946777f, 0.953613f,
- 0.958984f, 0.963379f, 0.985840f, 0.987305f, 0.987305f, 0.987793f, 0.987305f, 0.987305f,
- 0.000234f, 0.001040f, 0.001661f, 0.002392f, 0.003101f, 0.003681f, 0.004944f, 0.005844f,
- 0.007065f, 0.008217f, 0.009247f, 0.010925f, 0.012894f, 0.014549f, 0.017090f, 0.019455f,
- 0.022385f, 0.025650f, 0.029449f, 0.033936f, 0.039215f, 0.045135f, 0.052612f, 0.060944f,
- 0.070312f, 0.082397f, 0.096924f, 0.113525f, 0.133179f, 0.156860f, 0.184814f, 0.217773f,
- 0.255127f, 0.298340f, 0.345215f, 0.395996f, 0.448242f, 0.501953f, 0.553223f, 0.603516f,
- 0.649414f, 0.691895f, 0.729980f, 0.763184f, 0.792480f, 0.818359f, 0.841309f, 0.858887f,
- 0.877441f, 0.891113f, 0.904785f, 0.915527f, 0.925781f, 0.933594f, 0.941895f, 0.949219f,
- 0.955566f, 0.960449f, 0.984863f, 0.985840f, 0.986328f, 0.986816f, 0.986328f, 0.986816f,
- 0.000241f, 0.000808f, 0.001395f, 0.001986f, 0.002731f, 0.003429f, 0.004131f, 0.005402f,
- 0.006077f, 0.007347f, 0.008522f, 0.009544f, 0.011345f, 0.013046f, 0.014534f, 0.016953f,
- 0.019241f, 0.022339f, 0.025208f, 0.029175f, 0.033691f, 0.038300f, 0.044067f, 0.051331f,
- 0.059143f, 0.068726f, 0.080322f, 0.093567f, 0.109802f, 0.129883f, 0.152466f, 0.179810f,
- 0.211792f, 0.249390f, 0.291748f, 0.338623f, 0.389404f, 0.442139f, 0.496338f, 0.548340f,
- 0.599121f, 0.645996f, 0.689941f, 0.728516f, 0.762695f, 0.792969f, 0.818848f, 0.842285f,
- 0.862793f, 0.878906f, 0.894043f, 0.906250f, 0.917969f, 0.927734f, 0.935547f, 0.944336f,
- 0.951172f, 0.957031f, 0.983398f, 0.985352f, 0.985840f, 0.985352f, 0.985840f, 0.985352f,
- 0.000340f, 0.000735f, 0.001377f, 0.001853f, 0.002382f, 0.003159f, 0.004021f, 0.004642f,
- 0.005604f, 0.006340f, 0.007298f, 0.008591f, 0.009895f, 0.011154f, 0.012871f, 0.014580f,
- 0.016876f, 0.019180f, 0.022141f, 0.024979f, 0.028748f, 0.032745f, 0.037964f, 0.043213f,
- 0.050171f, 0.057831f, 0.066833f, 0.078247f, 0.091553f, 0.107178f, 0.125977f, 0.148315f,
- 0.175415f, 0.207153f, 0.244019f, 0.286377f, 0.333008f, 0.383789f, 0.437744f, 0.491943f,
- 0.545410f, 0.597168f, 0.645508f, 0.688965f, 0.729004f, 0.764160f, 0.794434f, 0.821289f,
- 0.843750f, 0.864258f, 0.881348f, 0.895996f, 0.909180f, 0.920898f, 0.929199f, 0.938965f,
- 0.946777f, 0.952637f, 0.982910f, 0.983887f, 0.984863f, 0.984863f, 0.984375f, 0.984863f,
- 0.000236f, 0.000605f, 0.001135f, 0.001415f, 0.002329f, 0.002747f, 0.003551f, 0.004158f,
- 0.004723f, 0.005535f, 0.006687f, 0.007534f, 0.008545f, 0.009979f, 0.011375f, 0.012993f,
- 0.014656f, 0.016754f, 0.018921f, 0.021759f, 0.024506f, 0.028183f, 0.032043f, 0.036743f,
- 0.042236f, 0.048645f, 0.056030f, 0.065125f, 0.075928f, 0.089050f, 0.104370f, 0.122681f,
- 0.145142f, 0.171509f, 0.202759f, 0.239258f, 0.281250f, 0.328369f, 0.379639f, 0.433838f,
- 0.489014f, 0.543945f, 0.596191f, 0.645020f, 0.690430f, 0.730957f, 0.766113f, 0.797852f,
- 0.824219f, 0.846680f, 0.867188f, 0.884766f, 0.899414f, 0.912109f, 0.923828f, 0.933105f,
- 0.942383f, 0.949707f, 0.980957f, 0.982910f, 0.983398f, 0.983398f, 0.983887f, 0.982910f,
- 0.000214f, 0.000710f, 0.001021f, 0.001429f, 0.001858f, 0.002607f, 0.003220f, 0.003738f,
- 0.004459f, 0.005032f, 0.005726f, 0.006748f, 0.007748f, 0.008659f, 0.010002f, 0.011368f,
- 0.012985f, 0.014656f, 0.016525f, 0.018921f, 0.021286f, 0.024231f, 0.027649f, 0.031464f,
- 0.035858f, 0.041321f, 0.047363f, 0.054840f, 0.063538f, 0.074097f, 0.086609f, 0.101990f,
- 0.120117f, 0.141846f, 0.168213f, 0.199219f, 0.235352f, 0.277344f, 0.324707f, 0.376953f,
- 0.432373f, 0.488037f, 0.543457f, 0.597168f, 0.646973f, 0.692871f, 0.732910f, 0.769531f,
- 0.801270f, 0.828125f, 0.850586f, 0.871582f, 0.888184f, 0.903809f, 0.915527f, 0.927246f,
- 0.936523f, 0.946289f, 0.979492f, 0.981445f, 0.981934f, 0.982422f, 0.981934f, 0.981934f,
- 0.000000f, 0.000468f, 0.001076f, 0.001489f, 0.002048f, 0.002413f, 0.002853f, 0.003468f,
- 0.003952f, 0.004444f, 0.005211f, 0.005917f, 0.006733f, 0.007763f, 0.008713f, 0.010262f,
- 0.011368f, 0.012733f, 0.014458f, 0.016296f, 0.018478f, 0.021072f, 0.023666f, 0.026810f,
- 0.030746f, 0.035278f, 0.040131f, 0.046295f, 0.053711f, 0.062195f, 0.072327f, 0.084717f,
- 0.099487f, 0.117371f, 0.139038f, 0.164795f, 0.195923f, 0.232422f, 0.274414f, 0.322266f,
- 0.374756f, 0.431641f, 0.488525f, 0.545410f, 0.599121f, 0.650879f, 0.697754f, 0.738770f,
- 0.774414f, 0.806641f, 0.832520f, 0.856445f, 0.875488f, 0.893555f, 0.907715f, 0.920410f,
- 0.931152f, 0.940918f, 0.978027f, 0.980469f, 0.980469f, 0.980957f, 0.980957f, 0.980957f,
- 0.000279f, 0.000497f, 0.000763f, 0.001353f, 0.001794f, 0.002079f, 0.002451f, 0.002956f,
- 0.003498f, 0.004150f, 0.004589f, 0.005310f, 0.006130f, 0.006958f, 0.007828f, 0.008888f,
- 0.009895f, 0.011124f, 0.012772f, 0.014282f, 0.016235f, 0.018127f, 0.020630f, 0.022873f,
- 0.026321f, 0.029938f, 0.034241f, 0.039368f, 0.045319f, 0.052338f, 0.060852f, 0.070801f,
- 0.082947f, 0.097595f, 0.115051f, 0.136353f, 0.162231f, 0.193481f, 0.229858f, 0.272217f,
- 0.321777f, 0.375000f, 0.432373f, 0.490479f, 0.548340f, 0.604004f, 0.655762f, 0.702637f,
- 0.743652f, 0.780273f, 0.812500f, 0.838867f, 0.862305f, 0.881348f, 0.897949f, 0.912598f,
- 0.925293f, 0.935547f, 0.976562f, 0.978516f, 0.979492f, 0.979980f, 0.979492f, 0.979004f,
- 0.000110f, 0.000473f, 0.000781f, 0.001262f, 0.001584f, 0.001890f, 0.002270f, 0.002607f,
- 0.003241f, 0.003704f, 0.004055f, 0.004795f, 0.005356f, 0.005997f, 0.006760f, 0.007896f,
- 0.008896f, 0.009918f, 0.011200f, 0.012451f, 0.013802f, 0.015556f, 0.017838f, 0.020065f,
- 0.022751f, 0.025864f, 0.029358f, 0.033600f, 0.038574f, 0.044342f, 0.050995f, 0.059296f,
- 0.069214f, 0.081116f, 0.095459f, 0.113159f, 0.133911f, 0.160400f, 0.191406f, 0.228638f,
- 0.272217f, 0.321289f, 0.375732f, 0.434326f, 0.493896f, 0.552734f, 0.609863f, 0.662109f,
- 0.709961f, 0.750977f, 0.787598f, 0.819336f, 0.846680f, 0.868164f, 0.887695f, 0.904297f,
- 0.917969f, 0.930176f, 0.975098f, 0.977539f, 0.977051f, 0.977539f, 0.977539f, 0.977539f,
- 0.000242f, 0.000464f, 0.000831f, 0.001027f, 0.001271f, 0.001722f, 0.001965f, 0.002243f,
- 0.002714f, 0.003036f, 0.003651f, 0.004025f, 0.004902f, 0.005638f, 0.006176f, 0.006943f,
- 0.007763f, 0.008789f, 0.009804f, 0.010872f, 0.012070f, 0.013695f, 0.015381f, 0.017395f,
- 0.019608f, 0.022232f, 0.025009f, 0.028885f, 0.032623f, 0.037659f, 0.043182f, 0.050018f,
- 0.058167f, 0.067810f, 0.079224f, 0.093811f, 0.111328f, 0.132324f, 0.158569f, 0.190063f,
- 0.228149f, 0.271973f, 0.322510f, 0.378906f, 0.438477f, 0.499756f, 0.560059f, 0.618164f,
- 0.671387f, 0.718750f, 0.760742f, 0.796875f, 0.826660f, 0.854492f, 0.875000f, 0.894531f,
- 0.911133f, 0.923828f, 0.973145f, 0.976074f, 0.975586f, 0.976074f, 0.976074f, 0.977051f,
- 0.000242f, 0.000552f, 0.000701f, 0.001063f, 0.001186f, 0.001462f, 0.001690f, 0.002340f,
- 0.002703f, 0.002728f, 0.003325f, 0.003828f, 0.004333f, 0.004913f, 0.005474f, 0.006077f,
- 0.006943f, 0.007607f, 0.008553f, 0.009460f, 0.010582f, 0.011871f, 0.013451f, 0.015091f,
- 0.016983f, 0.019165f, 0.021637f, 0.024673f, 0.027863f, 0.031525f, 0.036713f, 0.041962f,
- 0.048615f, 0.056396f, 0.066162f, 0.077942f, 0.092590f, 0.110046f, 0.130981f, 0.157593f,
- 0.189331f, 0.228394f, 0.273926f, 0.325684f, 0.383301f, 0.444580f, 0.507324f, 0.569824f,
- 0.627441f, 0.682129f, 0.729980f, 0.770508f, 0.807129f, 0.837402f, 0.863281f, 0.884766f,
- 0.902832f, 0.917969f, 0.971191f, 0.973633f, 0.974609f, 0.974121f, 0.974609f, 0.974609f,
- 0.000239f, 0.000239f, 0.000658f, 0.000899f, 0.001204f, 0.001252f, 0.001629f, 0.001815f,
- 0.002470f, 0.002430f, 0.003134f, 0.003321f, 0.003925f, 0.004238f, 0.004856f, 0.005341f,
- 0.006161f, 0.006615f, 0.007511f, 0.008224f, 0.009277f, 0.010445f, 0.011818f, 0.013046f,
- 0.014473f, 0.016510f, 0.018814f, 0.021057f, 0.023834f, 0.027237f, 0.030853f, 0.035675f,
- 0.040894f, 0.047241f, 0.055145f, 0.064758f, 0.076782f, 0.090942f, 0.108398f, 0.130371f,
- 0.157104f, 0.189819f, 0.229248f, 0.276367f, 0.329834f, 0.390137f, 0.453125f, 0.517578f,
- 0.580566f, 0.640625f, 0.694336f, 0.741699f, 0.782715f, 0.817871f, 0.848145f, 0.872559f,
- 0.893555f, 0.910645f, 0.969727f, 0.971191f, 0.972656f, 0.972168f, 0.972168f, 0.972168f,
- 0.000222f, 0.000463f, 0.000620f, 0.000837f, 0.000900f, 0.001048f, 0.001381f, 0.001820f,
- 0.001957f, 0.002329f, 0.002747f, 0.002964f, 0.003330f, 0.003986f, 0.004322f, 0.004677f,
- 0.005302f, 0.005760f, 0.006569f, 0.007359f, 0.008141f, 0.009293f, 0.010101f, 0.011452f,
- 0.012779f, 0.014496f, 0.016144f, 0.018097f, 0.020157f, 0.023148f, 0.026611f, 0.029785f,
- 0.034515f, 0.039856f, 0.046478f, 0.054016f, 0.063843f, 0.075378f, 0.089233f, 0.107666f,
- 0.129639f, 0.156860f, 0.190674f, 0.231445f, 0.280518f, 0.336426f, 0.398193f, 0.463379f,
- 0.530273f, 0.595215f, 0.654785f, 0.708984f, 0.755371f, 0.796875f, 0.831543f, 0.860352f,
- 0.883789f, 0.903809f, 0.966797f, 0.968750f, 0.969727f, 0.970215f, 0.970215f, 0.969727f,
- 0.000000f, 0.000345f, 0.000464f, 0.000686f, 0.000782f, 0.001030f, 0.001139f, 0.001598f,
- 0.001846f, 0.002237f, 0.002489f, 0.002684f, 0.003067f, 0.003344f, 0.003895f, 0.004158f,
- 0.004845f, 0.005131f, 0.005886f, 0.006561f, 0.007195f, 0.007912f, 0.008965f, 0.009941f,
- 0.010956f, 0.012383f, 0.013893f, 0.015602f, 0.017303f, 0.019623f, 0.022156f, 0.025452f,
- 0.028976f, 0.033722f, 0.038910f, 0.045288f, 0.052887f, 0.062561f, 0.074097f, 0.088623f,
- 0.106812f, 0.129639f, 0.157715f, 0.192261f, 0.235107f, 0.285889f, 0.344482f, 0.408691f,
- 0.476807f, 0.545410f, 0.610840f, 0.671387f, 0.725098f, 0.771484f, 0.811035f, 0.843750f,
- 0.871582f, 0.894043f, 0.964355f, 0.967285f, 0.967285f, 0.967773f, 0.967773f, 0.967773f,
- 0.000000f, 0.000320f, 0.000576f, 0.000572f, 0.000767f, 0.000945f, 0.001066f, 0.001375f,
- 0.001848f, 0.001980f, 0.002190f, 0.002399f, 0.002695f, 0.002943f, 0.003397f, 0.003664f,
- 0.004063f, 0.004566f, 0.005119f, 0.005688f, 0.006130f, 0.007057f, 0.007778f, 0.008675f,
- 0.009590f, 0.010666f, 0.011971f, 0.013443f, 0.015129f, 0.016953f, 0.018875f, 0.021576f,
- 0.024658f, 0.028488f, 0.032959f, 0.037811f, 0.043793f, 0.051819f, 0.061371f, 0.073181f,
- 0.088257f, 0.106506f, 0.129883f, 0.159180f, 0.195679f, 0.240479f, 0.293457f, 0.355225f,
- 0.422852f, 0.492432f, 0.563477f, 0.629883f, 0.690918f, 0.743652f, 0.789062f, 0.827148f,
- 0.858398f, 0.884277f, 0.961914f, 0.964844f, 0.964355f, 0.964844f, 0.964355f, 0.965332f,
- 0.000000f, 0.000242f, 0.000435f, 0.000547f, 0.000688f, 0.000803f, 0.001175f, 0.001318f,
- 0.001593f, 0.001652f, 0.001961f, 0.002209f, 0.002481f, 0.002716f, 0.002911f, 0.003210f,
- 0.003595f, 0.004005f, 0.004490f, 0.004894f, 0.005508f, 0.006107f, 0.006714f, 0.007462f,
- 0.008438f, 0.009277f, 0.010170f, 0.011436f, 0.012756f, 0.014145f, 0.016205f, 0.018433f,
- 0.020966f, 0.023819f, 0.027405f, 0.031464f, 0.036713f, 0.043152f, 0.050842f, 0.060577f,
- 0.071960f, 0.087219f, 0.106689f, 0.130371f, 0.161377f, 0.199585f, 0.246948f, 0.303467f,
- 0.367920f, 0.439697f, 0.512207f, 0.584473f, 0.651855f, 0.712402f, 0.764160f, 0.808105f,
- 0.844727f, 0.875000f, 0.958008f, 0.961426f, 0.961914f, 0.961914f, 0.962402f, 0.961914f,
- 0.000000f, 0.000237f, 0.000266f, 0.000387f, 0.000557f, 0.000691f, 0.000774f, 0.001221f,
- 0.001455f, 0.001492f, 0.001769f, 0.001896f, 0.002151f, 0.002386f, 0.002529f, 0.002911f,
- 0.003147f, 0.003523f, 0.003862f, 0.004311f, 0.004848f, 0.005260f, 0.005795f, 0.006416f,
- 0.007114f, 0.007942f, 0.008667f, 0.009666f, 0.010818f, 0.012184f, 0.013718f, 0.015541f,
- 0.017685f, 0.020126f, 0.023056f, 0.026306f, 0.030853f, 0.035797f, 0.042053f, 0.049683f,
- 0.059784f, 0.072144f, 0.086914f, 0.106873f, 0.132202f, 0.164429f, 0.205200f, 0.255615f,
- 0.315918f, 0.384521f, 0.458984f, 0.534668f, 0.607910f, 0.676758f, 0.735840f, 0.785645f,
- 0.828125f, 0.862305f, 0.955566f, 0.958008f, 0.958984f, 0.958496f, 0.958984f, 0.958984f,
- 0.000000f, 0.000119f, 0.000234f, 0.000484f, 0.000603f, 0.000758f, 0.000934f, 0.000999f,
- 0.001200f, 0.001343f, 0.001534f, 0.001725f, 0.001860f, 0.002056f, 0.002235f, 0.002445f,
- 0.002783f, 0.003115f, 0.003448f, 0.003757f, 0.004192f, 0.004723f, 0.005077f, 0.005653f,
- 0.006172f, 0.006527f, 0.007328f, 0.008247f, 0.009140f, 0.010368f, 0.011711f, 0.013351f,
- 0.014702f, 0.016937f, 0.019226f, 0.022156f, 0.025604f, 0.029877f, 0.034668f, 0.040710f,
- 0.048920f, 0.058624f, 0.071289f, 0.087219f, 0.107727f, 0.134521f, 0.168701f, 0.212769f,
- 0.267090f, 0.331543f, 0.404785f, 0.482910f, 0.561523f, 0.635742f, 0.702637f, 0.760742f,
- 0.809570f, 0.849121f, 0.951660f, 0.954590f, 0.955566f, 0.955566f, 0.956055f, 0.955566f,
- 0.000238f, 0.000218f, 0.000229f, 0.000242f, 0.000313f, 0.000859f, 0.000623f, 0.000978f,
- 0.001021f, 0.001150f, 0.001320f, 0.001431f, 0.001546f, 0.001746f, 0.001895f, 0.002106f,
- 0.002502f, 0.002630f, 0.002926f, 0.003296f, 0.003651f, 0.003918f, 0.004391f, 0.004910f,
- 0.005249f, 0.005558f, 0.006413f, 0.007114f, 0.007866f, 0.008789f, 0.009872f, 0.011093f,
- 0.012413f, 0.013939f, 0.015945f, 0.018692f, 0.021225f, 0.024643f, 0.028687f, 0.033936f,
- 0.040192f, 0.047791f, 0.058014f, 0.070923f, 0.087585f, 0.109131f, 0.137573f, 0.174683f,
- 0.222290f, 0.280762f, 0.350830f, 0.428955f, 0.511230f, 0.592285f, 0.666992f, 0.733398f,
- 0.789062f, 0.834473f, 0.947754f, 0.951172f, 0.951660f, 0.951172f, 0.951660f, 0.951172f,
- 0.000000f, 0.000205f, 0.000222f, 0.000344f, 0.000301f, 0.000775f, 0.000827f, 0.000719f,
- 0.000944f, 0.000976f, 0.001306f, 0.001249f, 0.001404f, 0.001569f, 0.001604f, 0.001819f,
- 0.002182f, 0.002354f, 0.002569f, 0.002857f, 0.003113f, 0.003426f, 0.003649f, 0.004112f,
- 0.004307f, 0.004925f, 0.005508f, 0.005802f, 0.006565f, 0.007450f, 0.008125f, 0.009079f,
- 0.010269f, 0.011665f, 0.013565f, 0.015213f, 0.017410f, 0.020203f, 0.023743f, 0.028168f,
- 0.032684f, 0.039062f, 0.047058f, 0.057404f, 0.070984f, 0.088623f, 0.111389f, 0.142090f,
- 0.182373f, 0.234253f, 0.298828f, 0.375000f, 0.458008f, 0.543945f, 0.627441f, 0.702148f,
- 0.765137f, 0.818359f, 0.942871f, 0.946289f, 0.947266f, 0.947266f, 0.946777f, 0.947266f,
- 0.000064f, 0.000095f, 0.000197f, 0.000213f, 0.000459f, 0.000491f, 0.000647f, 0.000696f,
- 0.000884f, 0.000911f, 0.001121f, 0.001115f, 0.001234f, 0.001371f, 0.001410f, 0.001743f,
- 0.001905f, 0.002016f, 0.002207f, 0.002438f, 0.002714f, 0.002939f, 0.003183f, 0.003323f,
- 0.003727f, 0.004143f, 0.004555f, 0.005276f, 0.005531f, 0.006264f, 0.006702f, 0.007572f,
- 0.008705f, 0.009712f, 0.011238f, 0.012650f, 0.014320f, 0.016815f, 0.019516f, 0.022400f,
- 0.026566f, 0.031799f, 0.038055f, 0.046417f, 0.057037f, 0.071350f, 0.089722f, 0.114868f,
- 0.148193f, 0.192749f, 0.249878f, 0.321045f, 0.404053f, 0.493408f, 0.583008f, 0.666016f,
- 0.739258f, 0.799316f, 0.937988f, 0.941406f, 0.941895f, 0.942383f, 0.942383f, 0.942383f,
- 0.000000f, 0.000007f, 0.000144f, 0.000427f, 0.000443f, 0.000566f, 0.000589f, 0.000615f,
- 0.000725f, 0.000731f, 0.000896f, 0.000953f, 0.001062f, 0.001167f, 0.001344f, 0.001345f,
- 0.001636f, 0.001774f, 0.001893f, 0.002069f, 0.002350f, 0.002457f, 0.002678f, 0.002743f,
- 0.003105f, 0.003513f, 0.003830f, 0.004227f, 0.004589f, 0.005047f, 0.005669f, 0.006176f,
- 0.007153f, 0.007896f, 0.008911f, 0.010231f, 0.011818f, 0.013618f, 0.015465f, 0.018188f,
- 0.021576f, 0.025452f, 0.030533f, 0.037048f, 0.045685f, 0.056915f, 0.071533f, 0.091675f,
- 0.118958f, 0.156006f, 0.205444f, 0.270020f, 0.349609f, 0.439941f, 0.533691f, 0.625977f,
- 0.708984f, 0.778320f, 0.931641f, 0.936035f, 0.936523f, 0.937012f, 0.937012f, 0.937012f,
- 0.000000f, 0.000000f, 0.000137f, 0.000262f, 0.000432f, 0.000437f, 0.000444f, 0.000590f,
- 0.000558f, 0.000606f, 0.000817f, 0.000877f, 0.000909f, 0.000951f, 0.001191f, 0.001244f,
- 0.001373f, 0.001506f, 0.001702f, 0.001690f, 0.001955f, 0.001940f, 0.002283f, 0.002340f,
- 0.002571f, 0.002871f, 0.003265f, 0.003475f, 0.003910f, 0.004181f, 0.004608f, 0.005112f,
- 0.005833f, 0.006416f, 0.007145f, 0.008209f, 0.009636f, 0.010750f, 0.012642f, 0.014481f,
- 0.017197f, 0.020203f, 0.024353f, 0.029694f, 0.036041f, 0.045105f, 0.056702f, 0.072388f,
- 0.094482f, 0.124329f, 0.166504f, 0.223022f, 0.295898f, 0.384766f, 0.482910f, 0.582031f,
- 0.675293f, 0.754883f, 0.926270f, 0.929688f, 0.930664f, 0.930664f, 0.931152f, 0.930664f,
- 0.000000f, 0.000000f, 0.000000f, 0.000232f, 0.000357f, 0.000411f, 0.000513f, 0.000527f,
- 0.000490f, 0.000504f, 0.000653f, 0.000750f, 0.000780f, 0.000976f, 0.000942f, 0.000967f,
- 0.001180f, 0.001252f, 0.001385f, 0.001425f, 0.001559f, 0.001801f, 0.001886f, 0.002144f,
- 0.002111f, 0.002354f, 0.002645f, 0.002827f, 0.003187f, 0.003414f, 0.003792f, 0.004360f,
- 0.004662f, 0.005146f, 0.005875f, 0.006783f, 0.007610f, 0.008797f, 0.010033f, 0.011566f,
- 0.013565f, 0.016006f, 0.019165f, 0.023163f, 0.028320f, 0.035400f, 0.044647f, 0.057129f,
- 0.074402f, 0.098572f, 0.132812f, 0.180542f, 0.245728f, 0.330078f, 0.428955f, 0.535156f,
- 0.638184f, 0.728516f, 0.919434f, 0.922852f, 0.923828f, 0.923828f, 0.923828f, 0.924316f,
- 0.000000f, 0.000000f, 0.000000f, 0.000114f, 0.000248f, 0.000359f, 0.000386f, 0.000342f,
- 0.000465f, 0.000461f, 0.000490f, 0.000609f, 0.000638f, 0.000694f, 0.000807f, 0.000923f,
- 0.000961f, 0.001074f, 0.001123f, 0.001268f, 0.001311f, 0.001494f, 0.001537f, 0.001754f,
- 0.001899f, 0.001917f, 0.002199f, 0.002241f, 0.002583f, 0.002769f, 0.003101f, 0.003441f,
- 0.003775f, 0.004200f, 0.004787f, 0.005272f, 0.006062f, 0.006702f, 0.007732f, 0.009102f,
- 0.010582f, 0.012466f, 0.014984f, 0.017990f, 0.021957f, 0.027222f, 0.034332f, 0.044128f,
- 0.057434f, 0.076538f, 0.104126f, 0.143799f, 0.199829f, 0.275879f, 0.373047f, 0.482422f,
- 0.594727f, 0.698730f, 0.910645f, 0.914551f, 0.916504f, 0.916016f, 0.916504f, 0.915527f,
- 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000221f, 0.000222f, 0.000392f, 0.000402f,
- 0.000396f, 0.000434f, 0.000476f, 0.000548f, 0.000536f, 0.000644f, 0.000642f, 0.000793f,
- 0.000795f, 0.000912f, 0.000953f, 0.000989f, 0.001164f, 0.001197f, 0.001285f, 0.001480f,
- 0.001511f, 0.001674f, 0.001703f, 0.001901f, 0.002075f, 0.002340f, 0.002499f, 0.002800f,
- 0.003019f, 0.003296f, 0.003695f, 0.004093f, 0.004780f, 0.005260f, 0.006207f, 0.006939f,
- 0.008034f, 0.009598f, 0.011353f, 0.013702f, 0.016678f, 0.020874f, 0.026062f, 0.033539f,
- 0.044006f, 0.058746f, 0.080139f, 0.111877f, 0.158447f, 0.226318f, 0.317627f, 0.428711f,
- 0.548828f, 0.665039f, 0.901367f, 0.907227f, 0.907715f, 0.908203f, 0.908203f, 0.907227f,
- 0.000000f, 0.000000f, 0.000122f, 0.000173f, 0.000191f, 0.000215f, 0.000224f, 0.000261f,
- 0.000340f, 0.000374f, 0.000380f, 0.000496f, 0.000416f, 0.000535f, 0.000592f, 0.000622f,
- 0.000701f, 0.000772f, 0.000742f, 0.000774f, 0.000990f, 0.000945f, 0.001088f, 0.001105f,
- 0.001348f, 0.001231f, 0.001460f, 0.001620f, 0.001758f, 0.001941f, 0.002008f, 0.002092f,
- 0.002430f, 0.002615f, 0.002886f, 0.003208f, 0.003519f, 0.004112f, 0.004704f, 0.005371f,
- 0.006149f, 0.007351f, 0.008659f, 0.010201f, 0.012550f, 0.015549f, 0.019577f, 0.025436f,
- 0.032928f, 0.044220f, 0.060608f, 0.084961f, 0.123474f, 0.180664f, 0.263184f, 0.372314f,
- 0.498291f, 0.626465f, 0.892578f, 0.895996f, 0.896973f, 0.896973f, 0.897949f, 0.897949f,
- 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000192f, 0.000201f, 0.000222f,
- 0.000222f, 0.000276f, 0.000295f, 0.000344f, 0.000433f, 0.000470f, 0.000485f, 0.000549f,
- 0.000555f, 0.000558f, 0.000566f, 0.000639f, 0.000678f, 0.000757f, 0.000840f, 0.000905f,
- 0.000999f, 0.000946f, 0.001018f, 0.001309f, 0.001402f, 0.001417f, 0.001624f, 0.001692f,
- 0.001869f, 0.002003f, 0.002184f, 0.002602f, 0.002851f, 0.003157f, 0.003595f, 0.004063f,
- 0.004734f, 0.005398f, 0.006275f, 0.007542f, 0.009148f, 0.011383f, 0.014275f, 0.018250f,
- 0.024063f, 0.032135f, 0.044922f, 0.063721f, 0.093811f, 0.139648f, 0.211914f, 0.314697f,
- 0.444092f, 0.584961f, 0.879883f, 0.884766f, 0.885254f, 0.885742f, 0.886230f, 0.885742f,
- 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000120f, 0.000154f, 0.000150f, 0.000160f,
- 0.000202f, 0.000217f, 0.000308f, 0.000319f, 0.000278f, 0.000392f, 0.000362f, 0.000432f,
- 0.000416f, 0.000448f, 0.000495f, 0.000526f, 0.000710f, 0.000754f, 0.000657f, 0.000755f,
- 0.000806f, 0.000919f, 0.000815f, 0.001080f, 0.001152f, 0.001207f, 0.001218f, 0.001373f,
- 0.001320f, 0.001685f, 0.001764f, 0.001819f, 0.002068f, 0.002380f, 0.002668f, 0.003033f,
- 0.003584f, 0.003979f, 0.004829f, 0.005402f, 0.006630f, 0.008080f, 0.010254f, 0.013069f,
- 0.017044f, 0.023422f, 0.031647f, 0.046417f, 0.068604f, 0.104919f, 0.165161f, 0.258789f,
- 0.387207f, 0.537598f, 0.867188f, 0.871582f, 0.872559f, 0.872559f, 0.872559f, 0.873047f,
- 0.000000f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000118f, 0.000122f, 0.000108f,
- 0.000143f, 0.000149f, 0.000184f, 0.000194f, 0.000189f, 0.000210f, 0.000321f, 0.000282f,
- 0.000376f, 0.000420f, 0.000533f, 0.000437f, 0.000467f, 0.000477f, 0.000587f, 0.000519f,
- 0.000673f, 0.000662f, 0.000679f, 0.000845f, 0.000881f, 0.000863f, 0.001016f, 0.001093f,
- 0.001176f, 0.001191f, 0.001336f, 0.001561f, 0.001573f, 0.001754f, 0.001919f, 0.002264f,
- 0.002596f, 0.002911f, 0.003372f, 0.003870f, 0.004723f, 0.005733f, 0.007092f, 0.008965f,
- 0.011650f, 0.015701f, 0.022339f, 0.032043f, 0.048370f, 0.076050f, 0.124084f, 0.204834f,
- 0.328369f, 0.485596f, 0.852539f, 0.856934f, 0.858887f, 0.858887f, 0.858887f, 0.858398f,
- 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000118f, 0.000117f, 0.000116f, 0.000114f,
- 0.000105f, 0.000110f, 0.000165f, 0.000133f, 0.000157f, 0.000240f, 0.000256f, 0.000257f,
- 0.000249f, 0.000303f, 0.000342f, 0.000346f, 0.000485f, 0.000510f, 0.000398f, 0.000493f,
- 0.000492f, 0.000524f, 0.000590f, 0.000585f, 0.000601f, 0.000740f, 0.000647f, 0.000871f,
- 0.000834f, 0.000969f, 0.001020f, 0.001190f, 0.001244f, 0.001432f, 0.001393f, 0.001702f,
- 0.001912f, 0.002171f, 0.002445f, 0.002958f, 0.003330f, 0.004025f, 0.004860f, 0.006161f,
- 0.007896f, 0.010742f, 0.014671f, 0.021378f, 0.032928f, 0.052612f, 0.089050f, 0.155884f,
- 0.268555f, 0.430664f, 0.836426f, 0.841309f, 0.841309f, 0.842285f, 0.842773f, 0.842285f,
- 0.000000f, 0.000000f, 0.000119f, 0.000117f, 0.000116f, 0.000115f, 0.000114f, 0.000114f,
- 0.000111f, 0.000103f, 0.000097f, 0.000118f, 0.000115f, 0.000130f, 0.000176f, 0.000130f,
- 0.000223f, 0.000235f, 0.000244f, 0.000252f, 0.000274f, 0.000389f, 0.000309f, 0.000430f,
- 0.000340f, 0.000399f, 0.000408f, 0.000459f, 0.000514f, 0.000501f, 0.000519f, 0.000657f,
- 0.000588f, 0.000775f, 0.000813f, 0.000789f, 0.000904f, 0.001076f, 0.001027f, 0.001170f,
- 0.001342f, 0.001425f, 0.001662f, 0.002005f, 0.002298f, 0.002699f, 0.003227f, 0.003990f,
- 0.005062f, 0.006855f, 0.009415f, 0.013504f, 0.020905f, 0.034424f, 0.060333f, 0.112000f,
- 0.210693f, 0.371094f, 0.816406f, 0.822754f, 0.822754f, 0.823242f, 0.823242f, 0.823730f,
- 0.000000f, 0.000119f, 0.000117f, 0.000116f, 0.000114f, 0.000113f, 0.000112f, 0.000111f,
- 0.000110f, 0.000109f, 0.000102f, 0.000095f, 0.000090f, 0.000084f, 0.000093f, 0.000103f,
- 0.000118f, 0.000165f, 0.000162f, 0.000190f, 0.000204f, 0.000218f, 0.000223f, 0.000237f,
- 0.000256f, 0.000272f, 0.000344f, 0.000365f, 0.000365f, 0.000396f, 0.000386f, 0.000412f,
- 0.000530f, 0.000466f, 0.000492f, 0.000615f, 0.000611f, 0.000748f, 0.000712f, 0.000795f,
- 0.000908f, 0.000971f, 0.001106f, 0.001353f, 0.001572f, 0.001822f, 0.002251f, 0.002676f,
- 0.003290f, 0.004349f, 0.005951f, 0.008316f, 0.012543f, 0.021149f, 0.038025f, 0.075500f,
- 0.156006f, 0.308838f, 0.794922f, 0.800293f, 0.800781f, 0.801270f, 0.801758f, 0.802246f,
- 0.000121f, 0.000116f, 0.000114f, 0.000113f, 0.000111f, 0.000109f, 0.000108f, 0.000107f,
- 0.000106f, 0.000104f, 0.000104f, 0.000100f, 0.000094f, 0.000088f, 0.000083f, 0.000078f,
- 0.000074f, 0.000105f, 0.000078f, 0.000122f, 0.000113f, 0.000153f, 0.000174f, 0.000175f,
- 0.000207f, 0.000216f, 0.000225f, 0.000215f, 0.000262f, 0.000308f, 0.000297f, 0.000287f,
- 0.000307f, 0.000342f, 0.000363f, 0.000411f, 0.000401f, 0.000453f, 0.000522f, 0.000555f,
- 0.000680f, 0.000701f, 0.000751f, 0.000873f, 0.000966f, 0.001181f, 0.001445f, 0.001666f,
- 0.002077f, 0.002512f, 0.003359f, 0.004856f, 0.007347f, 0.012001f, 0.022049f, 0.046417f,
- 0.107117f, 0.245361f, 0.770508f, 0.775879f, 0.776367f, 0.776855f, 0.777344f, 0.777832f,
- 0.000000f, 0.000113f, 0.000108f, 0.000107f, 0.000104f, 0.000103f, 0.000101f, 0.000100f,
- 0.000099f, 0.000098f, 0.000097f, 0.000096f, 0.000095f, 0.000091f, 0.000086f, 0.000081f,
- 0.000077f, 0.000073f, 0.000069f, 0.000079f, 0.000084f, 0.000091f, 0.000074f, 0.000100f,
- 0.000117f, 0.000140f, 0.000144f, 0.000166f, 0.000174f, 0.000178f, 0.000225f, 0.000197f,
- 0.000234f, 0.000239f, 0.000273f, 0.000289f, 0.000283f, 0.000293f, 0.000338f, 0.000386f,
- 0.000386f, 0.000432f, 0.000459f, 0.000525f, 0.000625f, 0.000691f, 0.000800f, 0.001004f,
- 0.001227f, 0.001479f, 0.001984f, 0.002745f, 0.003983f, 0.006413f, 0.011642f, 0.025269f,
- 0.066040f, 0.182495f, 0.743164f, 0.748535f, 0.749023f, 0.749512f, 0.750000f, 0.749512f,
- 0.000000f, 0.000102f, 0.000101f, 0.000098f, 0.000094f, 0.000093f, 0.000092f, 0.000090f,
- 0.000089f, 0.000088f, 0.000087f, 0.000086f, 0.000085f, 0.000084f, 0.000085f, 0.000082f,
- 0.000078f, 0.000074f, 0.000070f, 0.000066f, 0.000063f, 0.000060f, 0.000057f, 0.000056f,
- 0.000061f, 0.000060f, 0.000073f, 0.000087f, 0.000100f, 0.000105f, 0.000124f, 0.000136f,
- 0.000140f, 0.000140f, 0.000159f, 0.000179f, 0.000186f, 0.000205f, 0.000214f, 0.000229f,
- 0.000248f, 0.000267f, 0.000299f, 0.000344f, 0.000367f, 0.000422f, 0.000496f, 0.000557f,
- 0.000639f, 0.000837f, 0.001037f, 0.001419f, 0.002081f, 0.003202f, 0.005730f, 0.012199f,
- 0.034943f, 0.122925f, 0.711426f, 0.716797f, 0.718750f, 0.718262f, 0.718262f, 0.718750f,
- 0.000094f, 0.000079f, 0.000078f, 0.000074f, 0.000074f, 0.000075f, 0.000074f, 0.000073f,
- 0.000071f, 0.000072f, 0.000070f, 0.000071f, 0.000071f, 0.000070f, 0.000070f, 0.000069f,
- 0.000070f, 0.000069f, 0.000068f, 0.000065f, 0.000062f, 0.000059f, 0.000056f, 0.000053f,
- 0.000050f, 0.000048f, 0.000045f, 0.000044f, 0.000041f, 0.000050f, 0.000050f, 0.000061f,
- 0.000068f, 0.000085f, 0.000091f, 0.000101f, 0.000102f, 0.000107f, 0.000119f, 0.000129f,
- 0.000144f, 0.000151f, 0.000160f, 0.000184f, 0.000212f, 0.000213f, 0.000235f, 0.000294f,
- 0.000315f, 0.000392f, 0.000505f, 0.000637f, 0.000880f, 0.001400f, 0.002462f, 0.005333f,
- 0.015160f, 0.070312f, 0.678223f, 0.683105f, 0.684082f, 0.684570f, 0.684570f, 0.684570f,
- 0.000000f, 0.000000f, 0.000023f, 0.000034f, 0.000032f, 0.000038f, 0.000037f, 0.000044f,
- 0.000043f, 0.000047f, 0.000045f, 0.000047f, 0.000049f, 0.000049f, 0.000049f, 0.000048f,
- 0.000051f, 0.000050f, 0.000051f, 0.000051f, 0.000052f, 0.000052f, 0.000052f, 0.000049f,
- 0.000047f, 0.000045f, 0.000042f, 0.000040f, 0.000038f, 0.000036f, 0.000035f, 0.000033f,
- 0.000031f, 0.000029f, 0.000038f, 0.000037f, 0.000042f, 0.000051f, 0.000055f, 0.000067f,
- 0.000074f, 0.000073f, 0.000083f, 0.000093f, 0.000088f, 0.000102f, 0.000122f, 0.000122f,
- 0.000142f, 0.000169f, 0.000206f, 0.000265f, 0.000355f, 0.000531f, 0.000897f, 0.001822f,
- 0.005493f, 0.030579f, 0.640137f, 0.644531f, 0.647461f, 0.647949f, 0.647461f, 0.648438f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000001f, 0.000000f, 0.000008f, 0.000012f, 0.000014f, 0.000014f, 0.000019f, 0.000021f,
- 0.000022f, 0.000024f, 0.000026f, 0.000027f, 0.000027f, 0.000028f, 0.000029f, 0.000031f,
- 0.000031f, 0.000032f, 0.000032f, 0.000033f, 0.000033f, 0.000032f, 0.000030f, 0.000029f,
- 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000019f, 0.000018f,
- 0.000021f, 0.000024f, 0.000028f, 0.000033f, 0.000043f, 0.000041f, 0.000046f, 0.000053f,
- 0.000050f, 0.000059f, 0.000068f, 0.000094f, 0.000096f, 0.000140f, 0.000239f, 0.000447f,
- 0.001340f, 0.009087f, 0.600098f, 0.605957f, 0.606934f, 0.606934f, 0.607422f, 0.606934f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000002f, 0.000004f, 0.000006f, 0.000006f, 0.000009f, 0.000010f, 0.000011f, 0.000012f,
- 0.000013f, 0.000014f, 0.000015f, 0.000016f, 0.000017f, 0.000016f, 0.000015f, 0.000014f,
- 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000010f, 0.000009f, 0.000008f, 0.000012f,
- 0.000014f, 0.000018f, 0.000017f, 0.000022f, 0.000022f, 0.000026f, 0.000040f, 0.000060f,
- 0.000157f, 0.001244f, 0.557129f, 0.563477f, 0.563477f, 0.564941f, 0.564941f, 0.564941f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000002f, 0.000003f,
- 0.000003f, 0.000004f, 0.000003f, 0.000003f, 0.000003f, 0.000002f, 0.000003f, 0.000003f,
- 0.000003f, 0.000012f, 0.513672f, 0.520020f, 0.520020f, 0.520508f, 0.521484f, 0.521484f,
- },
- {
- 0.103943f, 0.284912f, 0.422119f, 0.523438f, 0.600586f, 0.659668f, 0.705078f, 0.741699f,
- 0.771484f, 0.795898f, 0.816895f, 0.834961f, 0.850586f, 0.862793f, 0.874512f, 0.884277f,
- 0.894043f, 0.901855f, 0.909180f, 0.915039f, 0.921387f, 0.926270f, 0.932129f, 0.936035f,
- 0.940430f, 0.944336f, 0.948242f, 0.951660f, 0.954590f, 0.957520f, 0.959961f, 0.962891f,
- 0.965332f, 0.967285f, 0.969727f, 0.971680f, 0.973145f, 0.975586f, 0.977051f, 0.979004f,
- 0.979980f, 0.981934f, 0.983887f, 0.984375f, 0.985840f, 0.986816f, 0.988770f, 0.989258f,
- 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996582f, 0.997559f,
- 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.998535f, 0.998047f, 0.997559f, 0.997070f,
- 0.046997f, 0.153564f, 0.264160f, 0.369385f, 0.460205f, 0.538574f, 0.602051f, 0.654785f,
- 0.697754f, 0.733398f, 0.762695f, 0.787598f, 0.809082f, 0.827637f, 0.843262f, 0.856934f,
- 0.868652f, 0.880859f, 0.889648f, 0.898438f, 0.906738f, 0.912598f, 0.918945f, 0.924805f,
- 0.929688f, 0.935059f, 0.938965f, 0.943359f, 0.947266f, 0.951172f, 0.954102f, 0.956543f,
- 0.959961f, 0.961914f, 0.964844f, 0.966797f, 0.969727f, 0.971191f, 0.974121f, 0.975098f,
- 0.977051f, 0.979492f, 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.985840f, 0.987305f,
- 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.995117f, 0.996094f,
- 0.996582f, 0.997559f, 0.999023f, 0.998535f, 0.998047f, 0.997559f, 0.997070f, 0.997070f,
- 0.025940f, 0.088501f, 0.162964f, 0.246094f, 0.331055f, 0.411865f, 0.486328f, 0.550293f,
- 0.606934f, 0.655762f, 0.695312f, 0.729980f, 0.758301f, 0.783691f, 0.804199f, 0.823730f,
- 0.838867f, 0.853027f, 0.865723f, 0.877441f, 0.887207f, 0.895996f, 0.904785f, 0.911133f,
- 0.916992f, 0.923828f, 0.928223f, 0.933594f, 0.937988f, 0.942871f, 0.946777f, 0.950195f,
- 0.953613f, 0.956543f, 0.959473f, 0.962402f, 0.964844f, 0.967285f, 0.970215f, 0.971680f,
- 0.973633f, 0.976074f, 0.977539f, 0.979492f, 0.980469f, 0.982422f, 0.984863f, 0.985352f,
- 0.986816f, 0.987793f, 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.994141f, 0.995117f,
- 0.995605f, 0.996582f, 0.998535f, 0.998047f, 0.998047f, 0.997559f, 0.997070f, 0.996582f,
- 0.016159f, 0.055176f, 0.104126f, 0.162720f, 0.229126f, 0.300781f, 0.372803f, 0.442871f,
- 0.506836f, 0.563477f, 0.613281f, 0.657715f, 0.696289f, 0.729004f, 0.757324f, 0.782227f,
- 0.802734f, 0.821289f, 0.837402f, 0.852539f, 0.865234f, 0.875977f, 0.885742f, 0.895508f,
- 0.903320f, 0.910156f, 0.917480f, 0.922852f, 0.928711f, 0.934082f, 0.937988f, 0.942871f,
- 0.947266f, 0.950195f, 0.954102f, 0.957031f, 0.959473f, 0.962402f, 0.964844f, 0.968262f,
- 0.969727f, 0.972168f, 0.974121f, 0.976562f, 0.978516f, 0.979980f, 0.981934f, 0.982910f,
- 0.983887f, 0.985840f, 0.986816f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993652f,
- 0.994141f, 0.995117f, 0.998047f, 0.997559f, 0.997559f, 0.997070f, 0.996582f, 0.996582f,
- 0.010841f, 0.036865f, 0.070007f, 0.110962f, 0.159546f, 0.214355f, 0.276367f, 0.340576f,
- 0.405029f, 0.465820f, 0.523926f, 0.576172f, 0.623535f, 0.664062f, 0.699707f, 0.731445f,
- 0.758301f, 0.782227f, 0.803223f, 0.821289f, 0.837891f, 0.852051f, 0.864258f, 0.875488f,
- 0.884766f, 0.894531f, 0.903320f, 0.910156f, 0.916992f, 0.923828f, 0.928223f, 0.933594f,
- 0.938477f, 0.943359f, 0.947266f, 0.950684f, 0.954102f, 0.957520f, 0.960449f, 0.962891f,
- 0.965820f, 0.968750f, 0.971191f, 0.973145f, 0.975586f, 0.977539f, 0.978516f, 0.980957f,
- 0.982422f, 0.984375f, 0.985352f, 0.987305f, 0.988281f, 0.989746f, 0.990723f, 0.992188f,
- 0.993164f, 0.994141f, 0.997559f, 0.997559f, 0.997070f, 0.996582f, 0.996582f, 0.996094f,
- 0.007637f, 0.026566f, 0.049896f, 0.078247f, 0.113403f, 0.154663f, 0.202637f, 0.255371f,
- 0.313232f, 0.372314f, 0.431152f, 0.488037f, 0.540039f, 0.588867f, 0.633301f, 0.670898f,
- 0.704102f, 0.734375f, 0.761230f, 0.785156f, 0.804688f, 0.822754f, 0.838867f, 0.852539f,
- 0.864746f, 0.876953f, 0.886230f, 0.895996f, 0.903320f, 0.910645f, 0.917480f, 0.923828f,
- 0.929199f, 0.935059f, 0.938965f, 0.943359f, 0.948730f, 0.952148f, 0.954590f, 0.958496f,
- 0.961426f, 0.964355f, 0.966797f, 0.969238f, 0.971680f, 0.974121f, 0.976074f, 0.978027f,
- 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.986816f, 0.987793f, 0.989258f, 0.990723f,
- 0.991699f, 0.993164f, 0.996582f, 0.996582f, 0.996094f, 0.996094f, 0.996094f, 0.995605f,
- 0.005714f, 0.019485f, 0.036194f, 0.056976f, 0.082336f, 0.113342f, 0.149048f, 0.191284f,
- 0.238770f, 0.290039f, 0.344727f, 0.400391f, 0.454590f, 0.507324f, 0.557129f, 0.602539f,
- 0.642578f, 0.679199f, 0.711426f, 0.740234f, 0.766602f, 0.788574f, 0.807617f, 0.825195f,
- 0.841309f, 0.854980f, 0.867676f, 0.877930f, 0.888184f, 0.896484f, 0.904785f, 0.912109f,
- 0.918945f, 0.925293f, 0.930176f, 0.935547f, 0.940918f, 0.944336f, 0.948730f, 0.952637f,
- 0.956055f, 0.959473f, 0.962402f, 0.965332f, 0.967773f, 0.970703f, 0.972656f, 0.975098f,
- 0.977051f, 0.979004f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.987793f, 0.989258f,
- 0.990234f, 0.991211f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.995605f, 0.995117f,
- 0.004505f, 0.014908f, 0.027634f, 0.043274f, 0.061707f, 0.084045f, 0.111694f, 0.143921f,
- 0.180542f, 0.223877f, 0.270996f, 0.320557f, 0.373291f, 0.425781f, 0.478027f, 0.526855f,
- 0.573242f, 0.615723f, 0.654785f, 0.688965f, 0.720215f, 0.747559f, 0.771973f, 0.793457f,
- 0.812500f, 0.829102f, 0.844238f, 0.858398f, 0.870117f, 0.881348f, 0.890625f, 0.898926f,
- 0.906738f, 0.914062f, 0.921387f, 0.926758f, 0.932617f, 0.937500f, 0.942383f, 0.945801f,
- 0.950684f, 0.954102f, 0.958008f, 0.960938f, 0.964355f, 0.966797f, 0.969727f, 0.972656f,
- 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.981934f, 0.984375f, 0.985840f, 0.987793f,
- 0.988281f, 0.990234f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995117f, 0.994629f,
- 0.003691f, 0.011925f, 0.021622f, 0.033203f, 0.047241f, 0.065247f, 0.085266f, 0.109558f,
- 0.138550f, 0.172363f, 0.210205f, 0.253418f, 0.299805f, 0.348877f, 0.400146f, 0.450195f,
- 0.499512f, 0.546387f, 0.589844f, 0.629883f, 0.666016f, 0.700195f, 0.728516f, 0.755371f,
- 0.778320f, 0.798828f, 0.817383f, 0.833984f, 0.848145f, 0.861816f, 0.874023f, 0.883789f,
- 0.893555f, 0.902344f, 0.910645f, 0.916992f, 0.922852f, 0.929688f, 0.934570f, 0.938965f,
- 0.944336f, 0.948730f, 0.951660f, 0.956543f, 0.959473f, 0.962891f, 0.965820f, 0.968262f,
- 0.970703f, 0.974121f, 0.976074f, 0.978516f, 0.979980f, 0.981934f, 0.983887f, 0.985840f,
- 0.987305f, 0.988281f, 0.994629f, 0.995117f, 0.995117f, 0.994629f, 0.994629f, 0.994141f,
- 0.002726f, 0.009560f, 0.017136f, 0.026871f, 0.037415f, 0.050079f, 0.066406f, 0.084717f,
- 0.107849f, 0.133423f, 0.164062f, 0.198853f, 0.238281f, 0.281250f, 0.327148f, 0.375977f,
- 0.424805f, 0.473877f, 0.521973f, 0.564941f, 0.606934f, 0.644531f, 0.679199f, 0.710449f,
- 0.738770f, 0.764160f, 0.786133f, 0.805664f, 0.824219f, 0.838867f, 0.853516f, 0.866211f,
- 0.876953f, 0.887695f, 0.896484f, 0.905762f, 0.912598f, 0.919922f, 0.925781f, 0.932129f,
- 0.937500f, 0.942383f, 0.946777f, 0.951660f, 0.955078f, 0.958984f, 0.961426f, 0.965332f,
- 0.967773f, 0.970703f, 0.972656f, 0.975586f, 0.978027f, 0.979492f, 0.981934f, 0.983887f,
- 0.984863f, 0.986816f, 0.994629f, 0.994629f, 0.994629f, 0.994141f, 0.994141f, 0.993652f,
- 0.002487f, 0.007553f, 0.013863f, 0.021439f, 0.029755f, 0.040771f, 0.052643f, 0.067444f,
- 0.084473f, 0.104980f, 0.128784f, 0.157227f, 0.189087f, 0.224609f, 0.265381f, 0.308838f,
- 0.354004f, 0.401611f, 0.450439f, 0.496582f, 0.541992f, 0.583984f, 0.623047f, 0.660645f,
- 0.693359f, 0.722168f, 0.749512f, 0.772949f, 0.793457f, 0.812988f, 0.830078f, 0.845215f,
- 0.859375f, 0.871094f, 0.882812f, 0.892090f, 0.900879f, 0.908691f, 0.916504f, 0.922852f,
- 0.930176f, 0.935547f, 0.940430f, 0.944824f, 0.949219f, 0.952637f, 0.956543f, 0.960449f,
- 0.963867f, 0.967285f, 0.970215f, 0.972656f, 0.974609f, 0.977539f, 0.979492f, 0.981934f,
- 0.983887f, 0.985352f, 0.993652f, 0.994141f, 0.994141f, 0.993652f, 0.993652f, 0.993164f,
- 0.001893f, 0.006641f, 0.011551f, 0.017319f, 0.024612f, 0.032959f, 0.042023f, 0.053772f,
- 0.067444f, 0.083435f, 0.102356f, 0.123840f, 0.150024f, 0.179688f, 0.213501f, 0.250488f,
- 0.291992f, 0.335938f, 0.381592f, 0.427246f, 0.473877f, 0.518555f, 0.563477f, 0.603027f,
- 0.640625f, 0.676270f, 0.707031f, 0.735352f, 0.760254f, 0.782715f, 0.802734f, 0.821777f,
- 0.838379f, 0.851562f, 0.865234f, 0.876953f, 0.886719f, 0.896484f, 0.905273f, 0.913086f,
- 0.921387f, 0.927734f, 0.933105f, 0.938477f, 0.942871f, 0.948242f, 0.951660f, 0.955566f,
- 0.959961f, 0.963867f, 0.966309f, 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979492f,
- 0.981934f, 0.983887f, 0.993164f, 0.993652f, 0.993164f, 0.993164f, 0.993164f, 0.992676f,
- 0.001740f, 0.005634f, 0.009407f, 0.014992f, 0.020157f, 0.026840f, 0.035156f, 0.043793f,
- 0.054718f, 0.067505f, 0.082092f, 0.099731f, 0.120239f, 0.143921f, 0.171265f, 0.202393f,
- 0.237915f, 0.276367f, 0.318848f, 0.362793f, 0.407959f, 0.454346f, 0.499023f, 0.542480f,
- 0.583984f, 0.623535f, 0.659180f, 0.691895f, 0.721680f, 0.748047f, 0.772461f, 0.793457f,
- 0.812988f, 0.829102f, 0.845215f, 0.859863f, 0.872559f, 0.883789f, 0.893555f, 0.902344f,
- 0.911133f, 0.918457f, 0.924805f, 0.930664f, 0.937012f, 0.941895f, 0.947266f, 0.951172f,
- 0.956055f, 0.959473f, 0.962402f, 0.966309f, 0.968750f, 0.972168f, 0.974609f, 0.977051f,
- 0.979492f, 0.981934f, 0.992188f, 0.992676f, 0.992676f, 0.992676f, 0.992188f, 0.992676f,
- 0.001502f, 0.004482f, 0.008278f, 0.012276f, 0.016800f, 0.022644f, 0.029129f, 0.036194f,
- 0.045197f, 0.055298f, 0.067017f, 0.080750f, 0.096863f, 0.115906f, 0.138184f, 0.163940f,
- 0.192993f, 0.225952f, 0.262695f, 0.302490f, 0.344971f, 0.389648f, 0.434814f, 0.480469f,
- 0.523926f, 0.566406f, 0.605957f, 0.643066f, 0.677246f, 0.708496f, 0.736816f, 0.761719f,
- 0.784668f, 0.804688f, 0.823242f, 0.840332f, 0.854004f, 0.867188f, 0.878906f, 0.890137f,
- 0.898438f, 0.907715f, 0.916016f, 0.922852f, 0.930176f, 0.935547f, 0.940918f, 0.946289f,
- 0.950684f, 0.955078f, 0.959473f, 0.961914f, 0.966309f, 0.969238f, 0.972168f, 0.974609f,
- 0.977539f, 0.979492f, 0.991211f, 0.992188f, 0.991699f, 0.992188f, 0.991699f, 0.991211f,
- 0.001411f, 0.003645f, 0.007160f, 0.010414f, 0.014397f, 0.018677f, 0.024338f, 0.030426f,
- 0.037384f, 0.045654f, 0.055054f, 0.066101f, 0.079529f, 0.094543f, 0.112793f, 0.133057f,
- 0.157227f, 0.183960f, 0.215210f, 0.250488f, 0.288086f, 0.329102f, 0.372314f, 0.416992f,
- 0.461914f, 0.505859f, 0.549316f, 0.589355f, 0.627930f, 0.664062f, 0.695801f, 0.725098f,
- 0.752441f, 0.775879f, 0.797363f, 0.815918f, 0.833984f, 0.849121f, 0.863281f, 0.875488f,
- 0.886230f, 0.895996f, 0.904785f, 0.914062f, 0.920898f, 0.928223f, 0.935059f, 0.940918f,
- 0.945312f, 0.950195f, 0.954102f, 0.958984f, 0.962402f, 0.966309f, 0.969238f, 0.972656f,
- 0.974609f, 0.977539f, 0.990234f, 0.992188f, 0.991211f, 0.991211f, 0.990723f, 0.991211f,
- 0.000926f, 0.003523f, 0.006207f, 0.008949f, 0.012718f, 0.016312f, 0.020447f, 0.025467f,
- 0.031128f, 0.037994f, 0.045532f, 0.054901f, 0.065430f, 0.077576f, 0.091797f, 0.109131f,
- 0.128418f, 0.151245f, 0.176636f, 0.206055f, 0.238525f, 0.275146f, 0.314697f, 0.357178f,
- 0.400391f, 0.445312f, 0.489746f, 0.531738f, 0.574219f, 0.613281f, 0.650391f, 0.683594f,
- 0.714355f, 0.742188f, 0.768066f, 0.790039f, 0.810059f, 0.828125f, 0.843262f, 0.858398f,
- 0.871582f, 0.883789f, 0.893555f, 0.903809f, 0.912598f, 0.919434f, 0.926758f, 0.933594f,
- 0.939453f, 0.944336f, 0.950195f, 0.954590f, 0.958008f, 0.962402f, 0.966309f, 0.969727f,
- 0.972656f, 0.975586f, 0.989746f, 0.990723f, 0.990723f, 0.990234f, 0.990234f, 0.990234f,
- 0.001140f, 0.003021f, 0.005527f, 0.008102f, 0.010445f, 0.013977f, 0.017349f, 0.021637f,
- 0.026535f, 0.031677f, 0.038330f, 0.045776f, 0.054382f, 0.064392f, 0.076233f, 0.089844f,
- 0.105713f, 0.123840f, 0.145020f, 0.169556f, 0.196899f, 0.229248f, 0.263672f, 0.302002f,
- 0.342529f, 0.385986f, 0.429932f, 0.473877f, 0.517578f, 0.560547f, 0.600586f, 0.638184f,
- 0.672852f, 0.704590f, 0.733398f, 0.759277f, 0.782715f, 0.803711f, 0.823242f, 0.840820f,
- 0.854980f, 0.869141f, 0.881348f, 0.892090f, 0.902344f, 0.910645f, 0.919922f, 0.927246f,
- 0.933105f, 0.938965f, 0.944824f, 0.949707f, 0.954102f, 0.959473f, 0.962891f, 0.966309f,
- 0.969727f, 0.972168f, 0.988770f, 0.990234f, 0.989746f, 0.989746f, 0.989746f, 0.989258f,
- 0.000870f, 0.002666f, 0.004578f, 0.006737f, 0.009430f, 0.012077f, 0.015381f, 0.018463f,
- 0.022293f, 0.027313f, 0.032654f, 0.038727f, 0.045746f, 0.053619f, 0.063232f, 0.074524f,
- 0.087219f, 0.102356f, 0.119324f, 0.139648f, 0.162842f, 0.189941f, 0.219482f, 0.253174f,
- 0.289795f, 0.329346f, 0.372070f, 0.415039f, 0.459717f, 0.503418f, 0.546387f, 0.587402f,
- 0.625977f, 0.661621f, 0.694336f, 0.725586f, 0.752441f, 0.776855f, 0.798828f, 0.818359f,
- 0.837402f, 0.852539f, 0.866699f, 0.878906f, 0.891113f, 0.900879f, 0.910156f, 0.918457f,
- 0.926270f, 0.932617f, 0.938965f, 0.944824f, 0.950195f, 0.955078f, 0.958984f, 0.962891f,
- 0.966797f, 0.970703f, 0.987793f, 0.988770f, 0.989258f, 0.989258f, 0.988770f, 0.988770f,
- 0.000835f, 0.002302f, 0.004078f, 0.005802f, 0.008026f, 0.010490f, 0.013153f, 0.016235f,
- 0.019485f, 0.023636f, 0.027847f, 0.033081f, 0.038849f, 0.045441f, 0.053253f, 0.062500f,
- 0.072571f, 0.085205f, 0.098999f, 0.115662f, 0.135254f, 0.156860f, 0.182373f, 0.211060f,
- 0.243042f, 0.279053f, 0.318115f, 0.359619f, 0.402832f, 0.447021f, 0.490234f, 0.533691f,
- 0.575195f, 0.615234f, 0.651855f, 0.686035f, 0.717285f, 0.746094f, 0.771484f, 0.793945f,
- 0.813965f, 0.833496f, 0.848633f, 0.864258f, 0.877930f, 0.889648f, 0.900391f, 0.909180f,
- 0.918945f, 0.926270f, 0.932129f, 0.939453f, 0.945312f, 0.950684f, 0.955566f, 0.959473f,
- 0.963867f, 0.967773f, 0.987305f, 0.988281f, 0.988281f, 0.988281f, 0.988281f, 0.987793f,
- 0.000815f, 0.001984f, 0.003475f, 0.005302f, 0.007103f, 0.009354f, 0.011528f, 0.013977f,
- 0.017197f, 0.020111f, 0.023788f, 0.027771f, 0.033447f, 0.038452f, 0.045013f, 0.052704f,
- 0.061066f, 0.071228f, 0.082886f, 0.096313f, 0.112488f, 0.130737f, 0.151245f, 0.175659f,
- 0.203125f, 0.234619f, 0.269043f, 0.306885f, 0.347656f, 0.390381f, 0.434570f, 0.478760f,
- 0.522461f, 0.564453f, 0.605957f, 0.644043f, 0.678223f, 0.710449f, 0.739746f, 0.766602f,
- 0.791016f, 0.811035f, 0.831055f, 0.847168f, 0.862793f, 0.875977f, 0.888672f, 0.899414f,
- 0.909180f, 0.917480f, 0.926270f, 0.933105f, 0.939941f, 0.945801f, 0.950684f, 0.955566f,
- 0.960938f, 0.964844f, 0.985840f, 0.987305f, 0.987793f, 0.987305f, 0.987305f, 0.987305f,
- 0.000587f, 0.002005f, 0.003122f, 0.004707f, 0.006283f, 0.007778f, 0.009972f, 0.012581f,
- 0.014435f, 0.017426f, 0.020691f, 0.024475f, 0.028519f, 0.033203f, 0.038513f, 0.044708f,
- 0.051727f, 0.060028f, 0.069763f, 0.080627f, 0.093506f, 0.109009f, 0.125977f, 0.146362f,
- 0.169678f, 0.196533f, 0.226685f, 0.259766f, 0.297119f, 0.337646f, 0.380127f, 0.424072f,
- 0.468018f, 0.512207f, 0.555176f, 0.596680f, 0.635254f, 0.671387f, 0.704590f, 0.734863f,
- 0.762207f, 0.787109f, 0.809082f, 0.828613f, 0.846191f, 0.860840f, 0.875977f, 0.888184f,
- 0.899902f, 0.908691f, 0.918457f, 0.926270f, 0.934082f, 0.940430f, 0.947266f, 0.951660f,
- 0.958008f, 0.961914f, 0.984863f, 0.986328f, 0.986816f, 0.986816f, 0.986328f, 0.986328f,
- 0.000475f, 0.001671f, 0.003019f, 0.004379f, 0.005592f, 0.006882f, 0.008682f, 0.010757f,
- 0.012856f, 0.015343f, 0.018112f, 0.021164f, 0.024353f, 0.028595f, 0.033020f, 0.038086f,
- 0.044006f, 0.050812f, 0.058594f, 0.067993f, 0.078735f, 0.091248f, 0.105530f, 0.122009f,
- 0.142212f, 0.164062f, 0.189697f, 0.219238f, 0.251953f, 0.288330f, 0.328125f, 0.369629f,
- 0.413818f, 0.458008f, 0.503418f, 0.547363f, 0.588867f, 0.628418f, 0.665039f, 0.699707f,
- 0.730469f, 0.758301f, 0.784668f, 0.807129f, 0.826660f, 0.844727f, 0.862305f, 0.875977f,
- 0.888672f, 0.900879f, 0.910156f, 0.919434f, 0.927734f, 0.935059f, 0.941406f, 0.947754f,
- 0.953125f, 0.958496f, 0.983887f, 0.985352f, 0.985352f, 0.985352f, 0.984863f, 0.985352f,
- 0.000325f, 0.001517f, 0.002554f, 0.003811f, 0.004990f, 0.006638f, 0.007706f, 0.009399f,
- 0.011177f, 0.013580f, 0.015671f, 0.018478f, 0.021393f, 0.024612f, 0.028442f, 0.032990f,
- 0.037750f, 0.043427f, 0.050354f, 0.057861f, 0.066101f, 0.076294f, 0.088684f, 0.102417f,
- 0.119080f, 0.137451f, 0.159058f, 0.183838f, 0.212524f, 0.244385f, 0.280273f, 0.319336f,
- 0.361084f, 0.405029f, 0.449707f, 0.494873f, 0.539551f, 0.582031f, 0.622559f, 0.660156f,
- 0.695801f, 0.727539f, 0.756348f, 0.782715f, 0.805664f, 0.826172f, 0.845215f, 0.861328f,
- 0.875977f, 0.889648f, 0.901367f, 0.910645f, 0.920410f, 0.928711f, 0.937012f, 0.942871f,
- 0.949219f, 0.955078f, 0.982422f, 0.983887f, 0.984375f, 0.984375f, 0.983887f, 0.983887f,
- 0.000349f, 0.001533f, 0.002413f, 0.003326f, 0.004463f, 0.005524f, 0.006954f, 0.008202f,
- 0.010025f, 0.011864f, 0.013924f, 0.015884f, 0.018478f, 0.021484f, 0.024658f, 0.028671f,
- 0.032562f, 0.037170f, 0.042969f, 0.049194f, 0.056641f, 0.065063f, 0.074951f, 0.086182f,
- 0.099731f, 0.115662f, 0.133789f, 0.154175f, 0.178589f, 0.206421f, 0.237671f, 0.272949f,
- 0.312012f, 0.352783f, 0.396973f, 0.442627f, 0.487793f, 0.532227f, 0.576660f, 0.617188f,
- 0.657227f, 0.692383f, 0.725586f, 0.754395f, 0.780762f, 0.805664f, 0.826172f, 0.845215f,
- 0.861816f, 0.876465f, 0.890137f, 0.902344f, 0.912598f, 0.921875f, 0.930176f, 0.937988f,
- 0.945312f, 0.952148f, 0.981445f, 0.982910f, 0.982910f, 0.983398f, 0.983398f, 0.983398f,
- 0.000475f, 0.001141f, 0.002058f, 0.002846f, 0.004120f, 0.005013f, 0.006207f, 0.007664f,
- 0.009193f, 0.010368f, 0.012222f, 0.014404f, 0.016403f, 0.018799f, 0.021439f, 0.024567f,
- 0.028076f, 0.032379f, 0.036652f, 0.042145f, 0.048157f, 0.055389f, 0.063660f, 0.073059f,
- 0.083740f, 0.097046f, 0.112366f, 0.129517f, 0.149780f, 0.173584f, 0.200684f, 0.231812f,
- 0.266357f, 0.304688f, 0.346680f, 0.390137f, 0.435547f, 0.481445f, 0.526367f, 0.572266f,
- 0.613770f, 0.653320f, 0.690430f, 0.723633f, 0.754395f, 0.781250f, 0.806152f, 0.826172f,
- 0.847168f, 0.862793f, 0.878906f, 0.892090f, 0.904297f, 0.914551f, 0.924316f, 0.933105f,
- 0.940430f, 0.947754f, 0.979492f, 0.981934f, 0.981934f, 0.981934f, 0.981445f, 0.981445f,
- 0.000239f, 0.000882f, 0.001744f, 0.002878f, 0.003819f, 0.004532f, 0.005550f, 0.006653f,
- 0.007942f, 0.009277f, 0.010628f, 0.012421f, 0.014397f, 0.016312f, 0.018845f, 0.021576f,
- 0.024536f, 0.027817f, 0.031860f, 0.036346f, 0.041595f, 0.047333f, 0.054138f, 0.062317f,
- 0.071350f, 0.081970f, 0.094299f, 0.109070f, 0.126221f, 0.146118f, 0.169067f, 0.195801f,
- 0.226196f, 0.260742f, 0.298584f, 0.340088f, 0.384277f, 0.429688f, 0.476807f, 0.522461f,
- 0.568359f, 0.611328f, 0.651855f, 0.689453f, 0.723633f, 0.754395f, 0.782715f, 0.807617f,
- 0.829590f, 0.848145f, 0.865723f, 0.880859f, 0.894531f, 0.906738f, 0.917969f, 0.927246f,
- 0.936035f, 0.943359f, 0.978027f, 0.979980f, 0.980469f, 0.980469f, 0.980469f, 0.980469f,
- 0.000240f, 0.000948f, 0.001495f, 0.002592f, 0.003241f, 0.004055f, 0.004856f, 0.006111f,
- 0.007133f, 0.008125f, 0.009445f, 0.011108f, 0.012474f, 0.014374f, 0.016586f, 0.018784f,
- 0.021286f, 0.024475f, 0.027481f, 0.031403f, 0.035828f, 0.040710f, 0.046204f, 0.052704f,
- 0.060577f, 0.069519f, 0.079651f, 0.092224f, 0.106506f, 0.122986f, 0.142456f, 0.165161f,
- 0.191284f, 0.221924f, 0.255615f, 0.293457f, 0.335205f, 0.379395f, 0.425537f, 0.472900f,
- 0.519531f, 0.566406f, 0.610840f, 0.652344f, 0.689941f, 0.724609f, 0.755371f, 0.784180f,
- 0.808594f, 0.831055f, 0.851562f, 0.869141f, 0.884277f, 0.897461f, 0.909668f, 0.920410f,
- 0.930176f, 0.937988f, 0.976562f, 0.979004f, 0.979492f, 0.979492f, 0.979492f, 0.979492f,
- 0.000302f, 0.000863f, 0.001315f, 0.002195f, 0.002905f, 0.003592f, 0.004784f, 0.005478f,
- 0.006199f, 0.007389f, 0.008545f, 0.009811f, 0.011185f, 0.012787f, 0.014603f, 0.016342f,
- 0.018784f, 0.021347f, 0.024033f, 0.027496f, 0.031006f, 0.034790f, 0.039856f, 0.045288f,
- 0.051636f, 0.059052f, 0.067566f, 0.078003f, 0.089905f, 0.103760f, 0.119934f, 0.139282f,
- 0.161865f, 0.187622f, 0.217407f, 0.251221f, 0.288818f, 0.330811f, 0.375244f, 0.422607f,
- 0.470703f, 0.518066f, 0.565430f, 0.609863f, 0.651855f, 0.691406f, 0.726562f, 0.758301f,
- 0.787109f, 0.812500f, 0.835449f, 0.855957f, 0.872559f, 0.887695f, 0.901367f, 0.913574f,
- 0.923828f, 0.933105f, 0.975098f, 0.977539f, 0.977539f, 0.977539f, 0.978027f, 0.977051f,
- 0.000240f, 0.000808f, 0.001537f, 0.002106f, 0.002493f, 0.003729f, 0.004036f, 0.004982f,
- 0.005539f, 0.006454f, 0.007526f, 0.008690f, 0.009987f, 0.011421f, 0.012894f, 0.014618f,
- 0.016464f, 0.018539f, 0.021118f, 0.023865f, 0.026794f, 0.030487f, 0.034241f, 0.038879f,
- 0.044067f, 0.050690f, 0.057678f, 0.066040f, 0.076111f, 0.087524f, 0.101379f, 0.117737f,
- 0.136353f, 0.158325f, 0.183594f, 0.213501f, 0.247192f, 0.284912f, 0.327393f, 0.372803f,
- 0.420410f, 0.468750f, 0.518066f, 0.565430f, 0.611328f, 0.654297f, 0.694336f, 0.729980f,
- 0.762207f, 0.791504f, 0.817383f, 0.839844f, 0.859863f, 0.876953f, 0.891602f, 0.905762f,
- 0.917480f, 0.928711f, 0.973633f, 0.975098f, 0.976562f, 0.975586f, 0.976562f, 0.976562f,
- 0.000240f, 0.000587f, 0.001223f, 0.001691f, 0.002499f, 0.003008f, 0.003643f, 0.004295f,
- 0.004795f, 0.005726f, 0.006649f, 0.007671f, 0.008766f, 0.010002f, 0.011307f, 0.012764f,
- 0.014465f, 0.016388f, 0.018387f, 0.020599f, 0.023453f, 0.026291f, 0.029572f, 0.033417f,
- 0.037964f, 0.043427f, 0.049316f, 0.056519f, 0.064819f, 0.074219f, 0.085693f, 0.099121f,
- 0.115112f, 0.133301f, 0.155273f, 0.180420f, 0.210205f, 0.244751f, 0.282715f, 0.324951f,
- 0.371338f, 0.419434f, 0.468994f, 0.518555f, 0.566895f, 0.613770f, 0.658203f, 0.698242f,
- 0.735352f, 0.766602f, 0.796875f, 0.821289f, 0.844238f, 0.863770f, 0.881836f, 0.896973f,
- 0.910156f, 0.922363f, 0.971191f, 0.974121f, 0.974609f, 0.974121f, 0.974609f, 0.974609f,
- 0.000228f, 0.000671f, 0.001122f, 0.001607f, 0.002291f, 0.002836f, 0.003319f, 0.003817f,
- 0.004509f, 0.005253f, 0.005894f, 0.006840f, 0.007820f, 0.008972f, 0.010086f, 0.011391f,
- 0.012848f, 0.014328f, 0.016266f, 0.018158f, 0.020447f, 0.022720f, 0.026031f, 0.029053f,
- 0.032593f, 0.037109f, 0.042236f, 0.048340f, 0.055115f, 0.063049f, 0.072632f, 0.083801f,
- 0.097351f, 0.112488f, 0.130493f, 0.152222f, 0.178101f, 0.208008f, 0.241943f, 0.280762f,
- 0.323730f, 0.370117f, 0.419434f, 0.470459f, 0.520996f, 0.570801f, 0.617676f, 0.663086f,
- 0.704102f, 0.740234f, 0.773438f, 0.802246f, 0.829102f, 0.850098f, 0.870117f, 0.887695f,
- 0.902832f, 0.916016f, 0.969238f, 0.972168f, 0.972168f, 0.972656f, 0.972656f, 0.972168f,
- 0.000121f, 0.000526f, 0.001092f, 0.001670f, 0.001744f, 0.002420f, 0.002945f, 0.003237f,
- 0.004013f, 0.004894f, 0.005421f, 0.005932f, 0.006996f, 0.007904f, 0.008873f, 0.009995f,
- 0.011391f, 0.012756f, 0.014053f, 0.015884f, 0.017715f, 0.019775f, 0.022324f, 0.025406f,
- 0.028290f, 0.032349f, 0.036560f, 0.041412f, 0.047058f, 0.053772f, 0.061493f, 0.070862f,
- 0.081848f, 0.094666f, 0.110229f, 0.128662f, 0.150024f, 0.175903f, 0.205566f, 0.239990f,
- 0.279785f, 0.323486f, 0.370850f, 0.421143f, 0.473633f, 0.524902f, 0.576172f, 0.625000f,
- 0.668457f, 0.710938f, 0.748535f, 0.781250f, 0.810059f, 0.835449f, 0.857910f, 0.877441f,
- 0.894531f, 0.908691f, 0.966797f, 0.970215f, 0.970703f, 0.970703f, 0.970703f, 0.970215f,
- 0.000127f, 0.000521f, 0.001083f, 0.001460f, 0.001684f, 0.002111f, 0.002563f, 0.003048f,
- 0.003618f, 0.004124f, 0.004936f, 0.005543f, 0.006340f, 0.007111f, 0.008049f, 0.008774f,
- 0.009865f, 0.011162f, 0.012360f, 0.013840f, 0.015465f, 0.017181f, 0.019531f, 0.021973f,
- 0.024582f, 0.027847f, 0.031342f, 0.035706f, 0.040100f, 0.045990f, 0.052521f, 0.060089f,
- 0.069214f, 0.080017f, 0.093079f, 0.108521f, 0.126709f, 0.148071f, 0.174072f, 0.204224f,
- 0.239502f, 0.279541f, 0.324219f, 0.373047f, 0.424805f, 0.477295f, 0.530762f, 0.583008f,
- 0.632324f, 0.677246f, 0.719727f, 0.756348f, 0.789551f, 0.819336f, 0.842773f, 0.866211f,
- 0.885742f, 0.901855f, 0.965332f, 0.967773f, 0.968262f, 0.967773f, 0.968750f, 0.968262f,
- 0.000244f, 0.000397f, 0.001001f, 0.001181f, 0.001642f, 0.001872f, 0.002460f, 0.002712f,
- 0.003061f, 0.003723f, 0.004520f, 0.005043f, 0.005547f, 0.006451f, 0.007057f, 0.007828f,
- 0.008942f, 0.009872f, 0.010857f, 0.012131f, 0.013557f, 0.015198f, 0.017059f, 0.019241f,
- 0.021454f, 0.024048f, 0.027069f, 0.030594f, 0.034332f, 0.039001f, 0.044952f, 0.050873f,
- 0.058716f, 0.067505f, 0.078369f, 0.091309f, 0.106506f, 0.124695f, 0.146484f, 0.172852f,
- 0.203369f, 0.239014f, 0.280273f, 0.326172f, 0.376465f, 0.429443f, 0.483643f, 0.538574f,
- 0.591309f, 0.641602f, 0.687500f, 0.729492f, 0.766602f, 0.800293f, 0.828613f, 0.854004f,
- 0.874512f, 0.893555f, 0.961914f, 0.965332f, 0.965820f, 0.966309f, 0.966309f, 0.965820f,
- 0.000243f, 0.000453f, 0.000888f, 0.001245f, 0.001342f, 0.001847f, 0.002060f, 0.002541f,
- 0.002991f, 0.003355f, 0.003679f, 0.004379f, 0.005177f, 0.005413f, 0.006283f, 0.007038f,
- 0.007896f, 0.008507f, 0.009552f, 0.010628f, 0.011909f, 0.013306f, 0.015038f, 0.016388f,
- 0.018433f, 0.020752f, 0.023254f, 0.026413f, 0.029617f, 0.033447f, 0.037842f, 0.043701f,
- 0.049896f, 0.057190f, 0.066101f, 0.076660f, 0.089600f, 0.104553f, 0.123230f, 0.145386f,
- 0.171387f, 0.202637f, 0.239624f, 0.281982f, 0.329346f, 0.380859f, 0.436035f, 0.491943f,
- 0.547852f, 0.602539f, 0.653809f, 0.699707f, 0.741699f, 0.778320f, 0.811035f, 0.838867f,
- 0.862793f, 0.884766f, 0.959961f, 0.963379f, 0.963379f, 0.963379f, 0.964355f, 0.963379f,
- 0.000241f, 0.000452f, 0.000798f, 0.001119f, 0.001220f, 0.001430f, 0.001902f, 0.002277f,
- 0.002737f, 0.002893f, 0.003624f, 0.003937f, 0.004436f, 0.005089f, 0.005669f, 0.006226f,
- 0.006680f, 0.007519f, 0.008568f, 0.009384f, 0.010422f, 0.011795f, 0.012840f, 0.014526f,
- 0.016235f, 0.017929f, 0.020218f, 0.022736f, 0.025146f, 0.028580f, 0.032684f, 0.036896f,
- 0.042511f, 0.048431f, 0.055634f, 0.064453f, 0.075317f, 0.088196f, 0.103333f, 0.121948f,
- 0.144287f, 0.171143f, 0.203491f, 0.241577f, 0.285156f, 0.334229f, 0.387939f, 0.444580f,
- 0.501953f, 0.559570f, 0.614746f, 0.666504f, 0.712402f, 0.755371f, 0.791504f, 0.823242f,
- 0.851074f, 0.875000f, 0.956543f, 0.959961f, 0.960938f, 0.960449f, 0.960449f, 0.960449f,
- 0.000000f, 0.000263f, 0.000693f, 0.000873f, 0.001183f, 0.001447f, 0.001476f, 0.002068f,
- 0.002171f, 0.002857f, 0.003164f, 0.003542f, 0.003778f, 0.004326f, 0.004906f, 0.005436f,
- 0.006126f, 0.006687f, 0.007229f, 0.008377f, 0.009232f, 0.010223f, 0.011436f, 0.012527f,
- 0.013832f, 0.015747f, 0.017365f, 0.019363f, 0.021667f, 0.024231f, 0.027695f, 0.031769f,
- 0.035889f, 0.041016f, 0.047028f, 0.054504f, 0.063110f, 0.073975f, 0.086487f, 0.101807f,
- 0.120972f, 0.143555f, 0.171753f, 0.204956f, 0.244263f, 0.289551f, 0.340576f, 0.396484f,
- 0.455078f, 0.514648f, 0.573730f, 0.630371f, 0.681152f, 0.729004f, 0.770020f, 0.806641f,
- 0.837402f, 0.863770f, 0.953613f, 0.956543f, 0.957520f, 0.957031f, 0.957031f, 0.958008f,
- 0.000000f, 0.000356f, 0.000641f, 0.000870f, 0.000998f, 0.001134f, 0.001495f, 0.001724f,
- 0.002436f, 0.002478f, 0.002775f, 0.003113f, 0.003435f, 0.003864f, 0.004314f, 0.004704f,
- 0.005276f, 0.005886f, 0.006599f, 0.007309f, 0.008003f, 0.008987f, 0.009987f, 0.010941f,
- 0.012192f, 0.013466f, 0.015030f, 0.016708f, 0.018906f, 0.021103f, 0.023788f, 0.026886f,
- 0.030457f, 0.034943f, 0.040009f, 0.045959f, 0.053162f, 0.061920f, 0.072144f, 0.085205f,
- 0.101257f, 0.120422f, 0.143555f, 0.172363f, 0.206909f, 0.248047f, 0.295410f, 0.349121f,
- 0.407715f, 0.468750f, 0.530762f, 0.589844f, 0.647949f, 0.699707f, 0.746094f, 0.786621f,
- 0.823242f, 0.852051f, 0.950195f, 0.953125f, 0.954102f, 0.954102f, 0.954102f, 0.954102f,
- 0.000231f, 0.000449f, 0.000516f, 0.000760f, 0.000868f, 0.001152f, 0.001403f, 0.001773f,
- 0.002165f, 0.002245f, 0.002550f, 0.002783f, 0.003277f, 0.003660f, 0.003782f, 0.004120f,
- 0.004631f, 0.005268f, 0.005795f, 0.006344f, 0.007053f, 0.007835f, 0.008598f, 0.009460f,
- 0.010689f, 0.011551f, 0.012726f, 0.014359f, 0.016052f, 0.017975f, 0.020218f, 0.022812f,
- 0.025803f, 0.029251f, 0.033386f, 0.038574f, 0.044556f, 0.051941f, 0.060577f, 0.071045f,
- 0.084106f, 0.100342f, 0.119751f, 0.144043f, 0.174194f, 0.209961f, 0.253418f, 0.303467f,
- 0.359619f, 0.420898f, 0.483887f, 0.547852f, 0.609375f, 0.667480f, 0.719727f, 0.765625f,
- 0.804688f, 0.839844f, 0.946289f, 0.949707f, 0.950195f, 0.950684f, 0.950684f, 0.950195f,
- 0.000201f, 0.000336f, 0.000452f, 0.000627f, 0.000793f, 0.000966f, 0.001134f, 0.001578f,
- 0.001790f, 0.001896f, 0.002254f, 0.002464f, 0.002825f, 0.003012f, 0.003414f, 0.003626f,
- 0.004131f, 0.004608f, 0.005058f, 0.005642f, 0.006191f, 0.006771f, 0.007378f, 0.008057f,
- 0.009132f, 0.009918f, 0.010826f, 0.012314f, 0.013794f, 0.015381f, 0.017197f, 0.019257f,
- 0.021912f, 0.024841f, 0.028259f, 0.032318f, 0.037262f, 0.043427f, 0.050537f, 0.059021f,
- 0.070007f, 0.083191f, 0.099609f, 0.120239f, 0.145508f, 0.176636f, 0.214600f, 0.260254f,
- 0.313232f, 0.372803f, 0.437012f, 0.503418f, 0.568359f, 0.631836f, 0.688965f, 0.741211f,
- 0.786621f, 0.825195f, 0.941406f, 0.946289f, 0.946289f, 0.946777f, 0.946289f, 0.947266f,
- 0.000000f, 0.000317f, 0.000445f, 0.000453f, 0.000781f, 0.000794f, 0.001183f, 0.001289f,
- 0.001479f, 0.001832f, 0.001874f, 0.002256f, 0.002270f, 0.002716f, 0.002960f, 0.003273f,
- 0.003630f, 0.003948f, 0.004467f, 0.004833f, 0.005451f, 0.005962f, 0.006367f, 0.007088f,
- 0.007717f, 0.008400f, 0.009506f, 0.010445f, 0.011658f, 0.012993f, 0.014618f, 0.016357f,
- 0.018524f, 0.021210f, 0.023712f, 0.027252f, 0.031219f, 0.036041f, 0.041962f, 0.049194f,
- 0.057892f, 0.068604f, 0.082642f, 0.099304f, 0.120728f, 0.147217f, 0.180054f, 0.221191f,
- 0.269287f, 0.325928f, 0.388916f, 0.457275f, 0.525391f, 0.593262f, 0.657715f, 0.714355f,
- 0.766113f, 0.809082f, 0.937500f, 0.940918f, 0.941895f, 0.941895f, 0.941895f, 0.942383f,
- 0.000243f, 0.000238f, 0.000411f, 0.000532f, 0.000530f, 0.000764f, 0.000853f, 0.001171f,
- 0.001417f, 0.001545f, 0.001799f, 0.001900f, 0.002094f, 0.002354f, 0.002577f, 0.002703f,
- 0.003155f, 0.003428f, 0.003809f, 0.004227f, 0.004677f, 0.004997f, 0.005386f, 0.005913f,
- 0.006741f, 0.007225f, 0.008057f, 0.008873f, 0.009819f, 0.011101f, 0.012253f, 0.013725f,
- 0.015488f, 0.017410f, 0.019791f, 0.022598f, 0.025635f, 0.030014f, 0.034973f, 0.040527f,
- 0.047729f, 0.056702f, 0.067505f, 0.081848f, 0.099609f, 0.121521f, 0.149902f, 0.185181f,
- 0.228516f, 0.280762f, 0.341553f, 0.408936f, 0.480225f, 0.552246f, 0.622070f, 0.686035f,
- 0.742188f, 0.792480f, 0.932129f, 0.935547f, 0.937012f, 0.937012f, 0.936523f, 0.937500f,
- 0.000000f, 0.000232f, 0.000330f, 0.000512f, 0.000523f, 0.000907f, 0.000953f, 0.001018f,
- 0.001234f, 0.001344f, 0.001610f, 0.001612f, 0.001845f, 0.002054f, 0.002218f, 0.002453f,
- 0.002829f, 0.003105f, 0.003300f, 0.003712f, 0.003853f, 0.004280f, 0.004631f, 0.005112f,
- 0.005665f, 0.006279f, 0.006779f, 0.007481f, 0.008362f, 0.009270f, 0.010338f, 0.011505f,
- 0.012848f, 0.014549f, 0.016403f, 0.018936f, 0.021622f, 0.024750f, 0.028900f, 0.033447f,
- 0.039185f, 0.046448f, 0.055603f, 0.067078f, 0.081238f, 0.100037f, 0.123230f, 0.153564f,
- 0.191284f, 0.238525f, 0.295166f, 0.361084f, 0.432861f, 0.507812f, 0.582520f, 0.653320f,
- 0.717285f, 0.772461f, 0.926270f, 0.931152f, 0.931152f, 0.932129f, 0.932129f, 0.932129f,
- 0.000118f, 0.000219f, 0.000227f, 0.000405f, 0.000689f, 0.000726f, 0.000910f, 0.000847f,
- 0.001072f, 0.001114f, 0.001388f, 0.001447f, 0.001656f, 0.001811f, 0.001897f, 0.002253f,
- 0.002373f, 0.002617f, 0.002796f, 0.003054f, 0.003414f, 0.003681f, 0.003929f, 0.004353f,
- 0.004902f, 0.005322f, 0.005863f, 0.006424f, 0.007000f, 0.007755f, 0.008675f, 0.009506f,
- 0.010704f, 0.012215f, 0.013557f, 0.015686f, 0.017807f, 0.020630f, 0.023376f, 0.027328f,
- 0.032013f, 0.038177f, 0.045288f, 0.054626f, 0.066284f, 0.081543f, 0.100891f, 0.125977f,
- 0.158447f, 0.199951f, 0.251465f, 0.313965f, 0.384521f, 0.461670f, 0.540527f, 0.617188f,
- 0.688965f, 0.750977f, 0.920410f, 0.924805f, 0.925781f, 0.926270f, 0.926758f, 0.925781f,
- 0.000230f, 0.000198f, 0.000217f, 0.000338f, 0.000584f, 0.000786f, 0.000699f, 0.000893f,
- 0.000954f, 0.000959f, 0.001153f, 0.001165f, 0.001375f, 0.001545f, 0.001752f, 0.001752f,
- 0.002062f, 0.002235f, 0.002399f, 0.002699f, 0.002853f, 0.002995f, 0.003372f, 0.003603f,
- 0.003944f, 0.004513f, 0.004704f, 0.005226f, 0.005878f, 0.006527f, 0.006992f, 0.007889f,
- 0.008919f, 0.010002f, 0.011124f, 0.012604f, 0.014526f, 0.016510f, 0.019104f, 0.022308f,
- 0.026077f, 0.030701f, 0.036774f, 0.044098f, 0.053558f, 0.065735f, 0.081299f, 0.101990f,
- 0.129517f, 0.164917f, 0.210938f, 0.268066f, 0.336914f, 0.413818f, 0.496094f, 0.579102f,
- 0.657227f, 0.727539f, 0.913574f, 0.917969f, 0.918945f, 0.919434f, 0.919922f, 0.919922f,
- 0.000000f, 0.000101f, 0.000214f, 0.000208f, 0.000339f, 0.000461f, 0.000577f, 0.000780f,
- 0.000777f, 0.000840f, 0.000853f, 0.001064f, 0.001198f, 0.001327f, 0.001489f, 0.001687f,
- 0.001809f, 0.001884f, 0.002008f, 0.002129f, 0.002434f, 0.002514f, 0.002949f, 0.003000f,
- 0.003351f, 0.003674f, 0.003918f, 0.004356f, 0.004875f, 0.005310f, 0.005768f, 0.006458f,
- 0.007244f, 0.008255f, 0.008949f, 0.010361f, 0.011589f, 0.013290f, 0.015335f, 0.017776f,
- 0.020828f, 0.024521f, 0.029236f, 0.035431f, 0.042694f, 0.052490f, 0.065369f, 0.082336f,
- 0.104492f, 0.134277f, 0.173828f, 0.225464f, 0.290039f, 0.365234f, 0.449707f, 0.536133f,
- 0.623047f, 0.702637f, 0.905273f, 0.911133f, 0.912598f, 0.913086f, 0.913086f, 0.913086f,
- 0.000000f, 0.000167f, 0.000167f, 0.000316f, 0.000432f, 0.000444f, 0.000608f, 0.000611f,
- 0.000678f, 0.000750f, 0.000899f, 0.000925f, 0.001043f, 0.001125f, 0.001222f, 0.001343f,
- 0.001470f, 0.001608f, 0.001679f, 0.001804f, 0.001976f, 0.002234f, 0.002361f, 0.002710f,
- 0.002748f, 0.003035f, 0.003290f, 0.003647f, 0.003990f, 0.004295f, 0.004745f, 0.005318f,
- 0.005920f, 0.006618f, 0.007347f, 0.008270f, 0.009361f, 0.010719f, 0.012291f, 0.014221f,
- 0.016693f, 0.019592f, 0.023239f, 0.027969f, 0.033752f, 0.041534f, 0.051666f, 0.065369f,
- 0.083618f, 0.108276f, 0.141357f, 0.186035f, 0.244141f, 0.316650f, 0.400635f, 0.491699f,
- 0.585938f, 0.672852f, 0.897461f, 0.903320f, 0.904297f, 0.903809f, 0.903809f, 0.904297f,
- 0.000000f, 0.000098f, 0.000145f, 0.000289f, 0.000399f, 0.000424f, 0.000429f, 0.000382f,
- 0.000529f, 0.000613f, 0.000660f, 0.000836f, 0.000907f, 0.000940f, 0.001005f, 0.001188f,
- 0.001306f, 0.001451f, 0.001420f, 0.001554f, 0.001667f, 0.001783f, 0.001955f, 0.002125f,
- 0.002357f, 0.002493f, 0.002760f, 0.002867f, 0.003298f, 0.003626f, 0.003878f, 0.004341f,
- 0.004704f, 0.005356f, 0.005905f, 0.006512f, 0.007435f, 0.008377f, 0.009598f, 0.011055f,
- 0.012978f, 0.015388f, 0.018036f, 0.021698f, 0.026337f, 0.032532f, 0.040192f, 0.050995f,
- 0.065125f, 0.085510f, 0.113037f, 0.150513f, 0.201538f, 0.268799f, 0.351318f, 0.444824f,
- 0.543457f, 0.641602f, 0.888672f, 0.894043f, 0.894531f, 0.895508f, 0.895020f, 0.895508f,
- 0.000000f, 0.000000f, 0.000032f, 0.000169f, 0.000338f, 0.000372f, 0.000468f, 0.000471f,
- 0.000460f, 0.000493f, 0.000588f, 0.000715f, 0.000762f, 0.000912f, 0.000831f, 0.001001f,
- 0.001043f, 0.001133f, 0.001242f, 0.001312f, 0.001446f, 0.001529f, 0.001647f, 0.001829f,
- 0.001982f, 0.002121f, 0.002165f, 0.002438f, 0.002628f, 0.002865f, 0.003113f, 0.003424f,
- 0.003622f, 0.004131f, 0.004639f, 0.005222f, 0.005875f, 0.006622f, 0.007496f, 0.008575f,
- 0.009987f, 0.011665f, 0.013985f, 0.016617f, 0.019913f, 0.024704f, 0.030960f, 0.039185f,
- 0.050323f, 0.066284f, 0.088196f, 0.119568f, 0.163208f, 0.223511f, 0.302002f, 0.395752f,
- 0.499756f, 0.605957f, 0.878418f, 0.883301f, 0.884766f, 0.884766f, 0.885254f, 0.885254f,
- 0.000000f, 0.000000f, 0.000000f, 0.000216f, 0.000237f, 0.000338f, 0.000387f, 0.000341f,
- 0.000435f, 0.000441f, 0.000461f, 0.000577f, 0.000544f, 0.000720f, 0.000813f, 0.000823f,
- 0.000912f, 0.000936f, 0.000994f, 0.001026f, 0.001240f, 0.001268f, 0.001365f, 0.001415f,
- 0.001590f, 0.001565f, 0.001870f, 0.001929f, 0.002123f, 0.002377f, 0.002430f, 0.002565f,
- 0.002947f, 0.003384f, 0.003662f, 0.004105f, 0.004513f, 0.005047f, 0.005741f, 0.006550f,
- 0.007549f, 0.008865f, 0.010612f, 0.012466f, 0.015350f, 0.018677f, 0.023270f, 0.029800f,
- 0.038361f, 0.050323f, 0.067932f, 0.092590f, 0.129395f, 0.181274f, 0.253418f, 0.345459f,
- 0.452637f, 0.567383f, 0.866699f, 0.872559f, 0.873047f, 0.873535f, 0.873047f, 0.873535f,
- 0.000000f, 0.000000f, 0.000121f, 0.000182f, 0.000187f, 0.000237f, 0.000264f, 0.000360f,
- 0.000360f, 0.000397f, 0.000398f, 0.000412f, 0.000432f, 0.000546f, 0.000575f, 0.000690f,
- 0.000731f, 0.000727f, 0.000807f, 0.000843f, 0.000924f, 0.001034f, 0.001093f, 0.001111f,
- 0.001251f, 0.001249f, 0.001334f, 0.001612f, 0.001717f, 0.001820f, 0.002090f, 0.002161f,
- 0.002354f, 0.002600f, 0.002787f, 0.003119f, 0.003586f, 0.003878f, 0.004452f, 0.004913f,
- 0.005772f, 0.006508f, 0.007679f, 0.009285f, 0.011086f, 0.013840f, 0.016968f, 0.021820f,
- 0.028259f, 0.037628f, 0.050812f, 0.070129f, 0.099670f, 0.143433f, 0.207031f, 0.294922f,
- 0.403076f, 0.525879f, 0.853516f, 0.859375f, 0.860840f, 0.860352f, 0.862305f, 0.861328f,
- 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000181f, 0.000198f, 0.000181f, 0.000240f,
- 0.000275f, 0.000311f, 0.000427f, 0.000447f, 0.000395f, 0.000472f, 0.000456f, 0.000557f,
- 0.000518f, 0.000562f, 0.000635f, 0.000664f, 0.000868f, 0.000887f, 0.000865f, 0.001025f,
- 0.001014f, 0.001164f, 0.001096f, 0.001317f, 0.001382f, 0.001432f, 0.001445f, 0.001765f,
- 0.001744f, 0.002100f, 0.002144f, 0.002350f, 0.002655f, 0.002947f, 0.003294f, 0.003780f,
- 0.004265f, 0.004971f, 0.005699f, 0.006786f, 0.007957f, 0.009636f, 0.011932f, 0.015823f,
- 0.020142f, 0.026749f, 0.036530f, 0.051392f, 0.073792f, 0.109375f, 0.164185f, 0.244629f,
- 0.351562f, 0.479980f, 0.839355f, 0.844727f, 0.846680f, 0.847656f, 0.847168f, 0.846680f,
- 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000162f, 0.000133f, 0.000170f, 0.000201f,
- 0.000204f, 0.000222f, 0.000258f, 0.000285f, 0.000324f, 0.000327f, 0.000422f, 0.000395f,
- 0.000431f, 0.000517f, 0.000632f, 0.000529f, 0.000589f, 0.000592f, 0.000735f, 0.000714f,
- 0.000795f, 0.000778f, 0.000823f, 0.001063f, 0.001080f, 0.001141f, 0.001154f, 0.001308f,
- 0.001439f, 0.001546f, 0.001689f, 0.001886f, 0.001978f, 0.002174f, 0.002377f, 0.002798f,
- 0.003277f, 0.003519f, 0.004181f, 0.004780f, 0.005768f, 0.006863f, 0.008644f, 0.010750f,
- 0.014030f, 0.018448f, 0.025635f, 0.036194f, 0.053223f, 0.080811f, 0.125610f, 0.196533f,
- 0.299316f, 0.430176f, 0.822754f, 0.830078f, 0.831055f, 0.831543f, 0.832031f, 0.831543f,
- 0.000000f, 0.000121f, 0.000120f, 0.000118f, 0.000117f, 0.000120f, 0.000123f, 0.000151f,
- 0.000154f, 0.000175f, 0.000254f, 0.000190f, 0.000211f, 0.000306f, 0.000335f, 0.000358f,
- 0.000394f, 0.000417f, 0.000443f, 0.000410f, 0.000565f, 0.000565f, 0.000491f, 0.000623f,
- 0.000616f, 0.000631f, 0.000738f, 0.000676f, 0.000759f, 0.000924f, 0.000895f, 0.001030f,
- 0.001064f, 0.001176f, 0.001267f, 0.001438f, 0.001518f, 0.001704f, 0.001742f, 0.002028f,
- 0.002384f, 0.002703f, 0.002972f, 0.003393f, 0.004051f, 0.004959f, 0.005993f, 0.007271f,
- 0.009277f, 0.012390f, 0.016968f, 0.024368f, 0.036560f, 0.056610f, 0.091797f, 0.151245f,
- 0.246460f, 0.379639f, 0.805664f, 0.812500f, 0.813477f, 0.813965f, 0.813965f, 0.813965f,
- 0.000000f, 0.000000f, 0.000118f, 0.000117f, 0.000116f, 0.000114f, 0.000113f, 0.000108f,
- 0.000127f, 0.000153f, 0.000133f, 0.000202f, 0.000217f, 0.000223f, 0.000242f, 0.000186f,
- 0.000280f, 0.000304f, 0.000318f, 0.000342f, 0.000338f, 0.000473f, 0.000360f, 0.000484f,
- 0.000422f, 0.000514f, 0.000527f, 0.000571f, 0.000633f, 0.000568f, 0.000639f, 0.000816f,
- 0.000789f, 0.000889f, 0.000891f, 0.000966f, 0.001125f, 0.001276f, 0.001316f, 0.001496f,
- 0.001658f, 0.001818f, 0.002047f, 0.002502f, 0.002781f, 0.003201f, 0.003914f, 0.004795f,
- 0.006096f, 0.007996f, 0.010918f, 0.015617f, 0.023697f, 0.037567f, 0.063477f, 0.111084f,
- 0.194824f, 0.324951f, 0.786133f, 0.792969f, 0.794434f, 0.793945f, 0.794922f, 0.794434f,
- 0.000000f, 0.000119f, 0.000117f, 0.000115f, 0.000113f, 0.000112f, 0.000110f, 0.000109f,
- 0.000104f, 0.000098f, 0.000099f, 0.000136f, 0.000112f, 0.000126f, 0.000175f, 0.000189f,
- 0.000196f, 0.000220f, 0.000216f, 0.000247f, 0.000258f, 0.000274f, 0.000285f, 0.000309f,
- 0.000308f, 0.000321f, 0.000381f, 0.000390f, 0.000475f, 0.000511f, 0.000485f, 0.000501f,
- 0.000641f, 0.000588f, 0.000652f, 0.000764f, 0.000808f, 0.000952f, 0.000906f, 0.001037f,
- 0.001110f, 0.001249f, 0.001411f, 0.001647f, 0.001894f, 0.002159f, 0.002687f, 0.003223f,
- 0.004036f, 0.005150f, 0.006989f, 0.009644f, 0.014420f, 0.023361f, 0.040802f, 0.076050f,
- 0.146362f, 0.269287f, 0.763184f, 0.770996f, 0.771973f, 0.771973f, 0.772461f, 0.772461f,
- 0.000121f, 0.000116f, 0.000114f, 0.000112f, 0.000109f, 0.000108f, 0.000106f, 0.000105f,
- 0.000104f, 0.000101f, 0.000095f, 0.000090f, 0.000085f, 0.000083f, 0.000104f, 0.000097f,
- 0.000094f, 0.000154f, 0.000127f, 0.000178f, 0.000197f, 0.000194f, 0.000233f, 0.000213f,
- 0.000279f, 0.000294f, 0.000293f, 0.000258f, 0.000319f, 0.000394f, 0.000344f, 0.000369f,
- 0.000394f, 0.000410f, 0.000438f, 0.000509f, 0.000514f, 0.000580f, 0.000617f, 0.000684f,
- 0.000807f, 0.000812f, 0.000914f, 0.001094f, 0.001183f, 0.001436f, 0.001639f, 0.002033f,
- 0.002523f, 0.003073f, 0.004063f, 0.005680f, 0.008560f, 0.013466f, 0.024109f, 0.047791f,
- 0.102051f, 0.213867f, 0.740234f, 0.746582f, 0.748047f, 0.748535f, 0.749023f, 0.749023f,
- 0.000000f, 0.000113f, 0.000108f, 0.000107f, 0.000104f, 0.000102f, 0.000099f, 0.000099f,
- 0.000097f, 0.000096f, 0.000095f, 0.000091f, 0.000086f, 0.000081f, 0.000077f, 0.000073f,
- 0.000085f, 0.000091f, 0.000070f, 0.000102f, 0.000117f, 0.000131f, 0.000145f, 0.000148f,
- 0.000171f, 0.000178f, 0.000178f, 0.000207f, 0.000225f, 0.000209f, 0.000285f, 0.000238f,
- 0.000260f, 0.000298f, 0.000331f, 0.000360f, 0.000371f, 0.000346f, 0.000407f, 0.000443f,
- 0.000494f, 0.000516f, 0.000578f, 0.000662f, 0.000767f, 0.000847f, 0.001004f, 0.001149f,
- 0.001451f, 0.001783f, 0.002310f, 0.003262f, 0.004593f, 0.007309f, 0.012985f, 0.026703f,
- 0.064026f, 0.158813f, 0.712891f, 0.719238f, 0.722168f, 0.721680f, 0.722168f, 0.722656f,
- 0.000000f, 0.000105f, 0.000102f, 0.000098f, 0.000094f, 0.000092f, 0.000091f, 0.000089f,
- 0.000088f, 0.000086f, 0.000085f, 0.000084f, 0.000083f, 0.000080f, 0.000076f, 0.000073f,
- 0.000069f, 0.000065f, 0.000062f, 0.000059f, 0.000068f, 0.000063f, 0.000069f, 0.000074f,
- 0.000087f, 0.000102f, 0.000112f, 0.000130f, 0.000137f, 0.000129f, 0.000143f, 0.000168f,
- 0.000180f, 0.000178f, 0.000189f, 0.000198f, 0.000222f, 0.000240f, 0.000262f, 0.000285f,
- 0.000304f, 0.000317f, 0.000339f, 0.000399f, 0.000439f, 0.000490f, 0.000570f, 0.000658f,
- 0.000781f, 0.000988f, 0.001235f, 0.001674f, 0.002407f, 0.003725f, 0.006485f, 0.013199f,
- 0.034546f, 0.107605f, 0.682129f, 0.691406f, 0.692871f, 0.691406f, 0.692871f, 0.692871f,
- 0.000105f, 0.000089f, 0.000085f, 0.000080f, 0.000078f, 0.000078f, 0.000075f, 0.000074f,
- 0.000072f, 0.000072f, 0.000070f, 0.000071f, 0.000069f, 0.000069f, 0.000069f, 0.000068f,
- 0.000066f, 0.000063f, 0.000060f, 0.000057f, 0.000054f, 0.000052f, 0.000049f, 0.000047f,
- 0.000046f, 0.000045f, 0.000048f, 0.000055f, 0.000060f, 0.000068f, 0.000083f, 0.000087f,
- 0.000092f, 0.000103f, 0.000109f, 0.000117f, 0.000130f, 0.000150f, 0.000148f, 0.000142f,
- 0.000167f, 0.000186f, 0.000210f, 0.000213f, 0.000232f, 0.000280f, 0.000292f, 0.000329f,
- 0.000391f, 0.000456f, 0.000596f, 0.000764f, 0.001065f, 0.001633f, 0.002806f, 0.005909f,
- 0.015488f, 0.062378f, 0.651367f, 0.659668f, 0.661133f, 0.661133f, 0.660645f, 0.661621f,
- 0.000034f, 0.000037f, 0.000048f, 0.000051f, 0.000047f, 0.000049f, 0.000047f, 0.000051f,
- 0.000049f, 0.000051f, 0.000049f, 0.000050f, 0.000051f, 0.000050f, 0.000050f, 0.000049f,
- 0.000051f, 0.000050f, 0.000051f, 0.000050f, 0.000049f, 0.000047f, 0.000045f, 0.000043f,
- 0.000041f, 0.000039f, 0.000037f, 0.000035f, 0.000033f, 0.000032f, 0.000030f, 0.000029f,
- 0.000034f, 0.000041f, 0.000046f, 0.000057f, 0.000063f, 0.000067f, 0.000065f, 0.000072f,
- 0.000083f, 0.000093f, 0.000096f, 0.000102f, 0.000102f, 0.000135f, 0.000134f, 0.000151f,
- 0.000184f, 0.000198f, 0.000245f, 0.000306f, 0.000425f, 0.000607f, 0.001032f, 0.002081f,
- 0.005886f, 0.027924f, 0.617188f, 0.625977f, 0.627441f, 0.627930f, 0.626953f, 0.628418f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f, 0.000014f,
- 0.000016f, 0.000014f, 0.000019f, 0.000022f, 0.000022f, 0.000022f, 0.000025f, 0.000026f,
- 0.000027f, 0.000028f, 0.000029f, 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000031f,
- 0.000032f, 0.000032f, 0.000031f, 0.000030f, 0.000028f, 0.000027f, 0.000026f, 0.000024f,
- 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000021f, 0.000022f, 0.000024f,
- 0.000027f, 0.000035f, 0.000041f, 0.000034f, 0.000041f, 0.000052f, 0.000051f, 0.000051f,
- 0.000058f, 0.000070f, 0.000074f, 0.000103f, 0.000119f, 0.000169f, 0.000277f, 0.000510f,
- 0.001495f, 0.008766f, 0.583008f, 0.590332f, 0.591797f, 0.591797f, 0.592285f, 0.592285f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f, 0.000003f, 0.000005f, 0.000006f,
- 0.000008f, 0.000009f, 0.000010f, 0.000010f, 0.000012f, 0.000012f, 0.000013f, 0.000014f,
- 0.000015f, 0.000015f, 0.000015f, 0.000015f, 0.000014f, 0.000013f, 0.000013f, 0.000012f,
- 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000014f, 0.000011f, 0.000015f,
- 0.000017f, 0.000017f, 0.000021f, 0.000020f, 0.000026f, 0.000026f, 0.000042f, 0.000069f,
- 0.000178f, 0.001302f, 0.544434f, 0.553711f, 0.554688f, 0.554688f, 0.556152f, 0.556641f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000002f, 0.000003f, 0.000003f,
- 0.000003f, 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000001f, 0.000003f, 0.000003f,
- 0.000004f, 0.000014f, 0.506836f, 0.515137f, 0.516113f, 0.516602f, 0.517090f, 0.517578f,
- },
- {
- 0.089539f, 0.244873f, 0.368164f, 0.464355f, 0.539551f, 0.599121f, 0.648438f, 0.688477f,
- 0.721680f, 0.749512f, 0.772461f, 0.793945f, 0.811523f, 0.826172f, 0.841309f, 0.854004f,
- 0.863770f, 0.874512f, 0.883301f, 0.891602f, 0.898438f, 0.906250f, 0.912109f, 0.917969f,
- 0.922852f, 0.928223f, 0.932617f, 0.937012f, 0.940918f, 0.944336f, 0.948242f, 0.951660f,
- 0.954590f, 0.957520f, 0.960449f, 0.962891f, 0.965820f, 0.967773f, 0.970215f, 0.972656f,
- 0.974609f, 0.976074f, 0.978516f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f,
- 0.987793f, 0.988770f, 0.990234f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.996582f,
- 0.997559f, 0.998535f, 0.999023f, 0.998535f, 0.997559f, 0.997070f, 0.996582f, 0.995605f,
- 0.045563f, 0.143921f, 0.242798f, 0.334717f, 0.417969f, 0.489258f, 0.550293f, 0.602051f,
- 0.646484f, 0.683594f, 0.715820f, 0.743652f, 0.767090f, 0.788086f, 0.805664f, 0.822266f,
- 0.836426f, 0.849609f, 0.861328f, 0.870117f, 0.879883f, 0.889160f, 0.896973f, 0.903320f,
- 0.909668f, 0.916016f, 0.921875f, 0.926758f, 0.931641f, 0.936523f, 0.940430f, 0.943848f,
- 0.947266f, 0.951172f, 0.954102f, 0.957520f, 0.960449f, 0.962891f, 0.965820f, 0.968262f,
- 0.970215f, 0.973145f, 0.974121f, 0.976074f, 0.979004f, 0.980469f, 0.982422f, 0.983887f,
- 0.985352f, 0.986816f, 0.988281f, 0.989746f, 0.991211f, 0.992188f, 0.994141f, 0.995117f,
- 0.996094f, 0.997070f, 0.998535f, 0.997559f, 0.997070f, 0.996582f, 0.996094f, 0.995117f,
- 0.026855f, 0.089233f, 0.159790f, 0.234619f, 0.308838f, 0.381348f, 0.447754f, 0.507812f,
- 0.561035f, 0.606934f, 0.646484f, 0.683105f, 0.712402f, 0.740234f, 0.763184f, 0.784668f,
- 0.802246f, 0.819336f, 0.833984f, 0.846680f, 0.857910f, 0.868652f, 0.878418f, 0.886719f,
- 0.895508f, 0.903320f, 0.909668f, 0.915527f, 0.920410f, 0.926270f, 0.931152f, 0.935547f,
- 0.940430f, 0.943848f, 0.947754f, 0.951172f, 0.954590f, 0.958008f, 0.960449f, 0.963379f,
- 0.966309f, 0.968750f, 0.971191f, 0.973145f, 0.975586f, 0.977051f, 0.979004f, 0.981445f,
- 0.982910f, 0.983887f, 0.985840f, 0.987305f, 0.988770f, 0.990723f, 0.992188f, 0.993164f,
- 0.994629f, 0.996094f, 0.998047f, 0.997070f, 0.996582f, 0.996094f, 0.995605f, 0.995117f,
- 0.017746f, 0.058746f, 0.108276f, 0.163818f, 0.224365f, 0.288086f, 0.351562f, 0.413086f,
- 0.470947f, 0.522949f, 0.569824f, 0.612793f, 0.650879f, 0.684570f, 0.713867f, 0.739258f,
- 0.762695f, 0.783203f, 0.800781f, 0.817871f, 0.833008f, 0.845215f, 0.857422f, 0.868164f,
- 0.877441f, 0.886230f, 0.894043f, 0.902832f, 0.908691f, 0.915039f, 0.921387f, 0.925781f,
- 0.930664f, 0.936035f, 0.939941f, 0.944336f, 0.948242f, 0.951660f, 0.955078f, 0.957520f,
- 0.961426f, 0.964355f, 0.967285f, 0.968750f, 0.971680f, 0.974121f, 0.975586f, 0.978027f,
- 0.979980f, 0.981934f, 0.983887f, 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.991211f,
- 0.992676f, 0.993652f, 0.997070f, 0.996582f, 0.996582f, 0.996094f, 0.995117f, 0.994629f,
- 0.012337f, 0.041229f, 0.075928f, 0.117065f, 0.163208f, 0.214478f, 0.270020f, 0.327148f,
- 0.383301f, 0.437500f, 0.490234f, 0.536621f, 0.581543f, 0.621094f, 0.656250f, 0.688477f,
- 0.716797f, 0.741699f, 0.763672f, 0.784668f, 0.802246f, 0.818359f, 0.832520f, 0.845703f,
- 0.857422f, 0.868164f, 0.877930f, 0.886230f, 0.895020f, 0.902344f, 0.909668f, 0.915039f,
- 0.921875f, 0.926758f, 0.931641f, 0.937012f, 0.940430f, 0.946289f, 0.949219f, 0.952637f,
- 0.956055f, 0.958984f, 0.961914f, 0.964844f, 0.967773f, 0.970215f, 0.972656f, 0.974609f,
- 0.976562f, 0.979004f, 0.980957f, 0.982910f, 0.984863f, 0.986816f, 0.987793f, 0.989746f,
- 0.990723f, 0.992676f, 0.996582f, 0.996094f, 0.995605f, 0.995117f, 0.994629f, 0.994141f,
- 0.009315f, 0.030411f, 0.055756f, 0.085632f, 0.121094f, 0.160889f, 0.206055f, 0.254150f,
- 0.305664f, 0.357422f, 0.408447f, 0.459717f, 0.506836f, 0.551270f, 0.592773f, 0.629395f,
- 0.662598f, 0.692871f, 0.719727f, 0.745117f, 0.767090f, 0.786133f, 0.804688f, 0.819336f,
- 0.834473f, 0.847168f, 0.858398f, 0.869629f, 0.879395f, 0.888672f, 0.895020f, 0.903320f,
- 0.910156f, 0.916016f, 0.922363f, 0.928223f, 0.933105f, 0.937012f, 0.941406f, 0.946289f,
- 0.950195f, 0.954102f, 0.957031f, 0.960449f, 0.963379f, 0.965820f, 0.969238f, 0.971191f,
- 0.974121f, 0.976074f, 0.978027f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987793f,
- 0.989258f, 0.990723f, 0.995605f, 0.995605f, 0.995117f, 0.994629f, 0.994629f, 0.993652f,
- 0.006634f, 0.022736f, 0.041962f, 0.064026f, 0.090759f, 0.122192f, 0.157593f, 0.197510f,
- 0.240356f, 0.287354f, 0.335693f, 0.384766f, 0.432373f, 0.479736f, 0.523438f, 0.565430f,
- 0.604004f, 0.639160f, 0.670898f, 0.699219f, 0.726562f, 0.749023f, 0.770508f, 0.790527f,
- 0.806641f, 0.822754f, 0.836426f, 0.848633f, 0.859863f, 0.871582f, 0.881348f, 0.889160f,
- 0.897949f, 0.905273f, 0.912598f, 0.918945f, 0.924316f, 0.929199f, 0.935059f, 0.938965f,
- 0.943848f, 0.947266f, 0.951660f, 0.955078f, 0.958496f, 0.961914f, 0.964844f, 0.967773f,
- 0.970703f, 0.973145f, 0.975098f, 0.977539f, 0.979492f, 0.981445f, 0.983887f, 0.985352f,
- 0.987305f, 0.989258f, 0.995117f, 0.994629f, 0.994141f, 0.994141f, 0.993652f, 0.993164f,
- 0.005428f, 0.017807f, 0.032166f, 0.049652f, 0.070007f, 0.093811f, 0.121765f, 0.153564f,
- 0.189087f, 0.228516f, 0.270752f, 0.316162f, 0.362061f, 0.408936f, 0.453857f, 0.498779f,
- 0.540527f, 0.579590f, 0.615723f, 0.649902f, 0.679688f, 0.707520f, 0.732422f, 0.755371f,
- 0.775391f, 0.794922f, 0.811035f, 0.826172f, 0.839844f, 0.852051f, 0.864258f, 0.875000f,
- 0.883301f, 0.892578f, 0.899902f, 0.907715f, 0.914062f, 0.920410f, 0.926270f, 0.931641f,
- 0.936035f, 0.940918f, 0.945312f, 0.949219f, 0.954102f, 0.957031f, 0.960938f, 0.963379f,
- 0.966797f, 0.969238f, 0.972168f, 0.974609f, 0.977051f, 0.979492f, 0.980957f, 0.983398f,
- 0.985352f, 0.987305f, 0.994141f, 0.994141f, 0.994141f, 0.993652f, 0.993164f, 0.992676f,
- 0.004223f, 0.014046f, 0.025452f, 0.039062f, 0.055115f, 0.073608f, 0.095642f, 0.120239f,
- 0.149292f, 0.182251f, 0.217529f, 0.257080f, 0.298828f, 0.342773f, 0.387207f, 0.431152f,
- 0.474609f, 0.516602f, 0.556641f, 0.593750f, 0.628418f, 0.660156f, 0.689453f, 0.715820f,
- 0.740723f, 0.762207f, 0.782227f, 0.799805f, 0.816406f, 0.830566f, 0.844727f, 0.855469f,
- 0.867188f, 0.877441f, 0.886230f, 0.895020f, 0.903809f, 0.910645f, 0.917480f, 0.923340f,
- 0.928711f, 0.934570f, 0.939453f, 0.943848f, 0.948242f, 0.952148f, 0.956055f, 0.959473f,
- 0.961914f, 0.965820f, 0.968750f, 0.971680f, 0.974121f, 0.975586f, 0.979004f, 0.980957f,
- 0.983398f, 0.985352f, 0.993652f, 0.993652f, 0.993164f, 0.993164f, 0.992676f, 0.991699f,
- 0.003532f, 0.011536f, 0.020645f, 0.031342f, 0.044098f, 0.058624f, 0.075989f, 0.096252f,
- 0.119141f, 0.145386f, 0.175049f, 0.208130f, 0.244385f, 0.283203f, 0.324463f, 0.367432f,
- 0.410400f, 0.453369f, 0.495361f, 0.534668f, 0.572266f, 0.607910f, 0.641602f, 0.672852f,
- 0.700195f, 0.725098f, 0.748047f, 0.769531f, 0.789062f, 0.806152f, 0.821777f, 0.835938f,
- 0.848633f, 0.860352f, 0.872070f, 0.881836f, 0.890625f, 0.898926f, 0.906738f, 0.913086f,
- 0.919922f, 0.925781f, 0.931641f, 0.936523f, 0.941406f, 0.946289f, 0.950684f, 0.954590f,
- 0.958008f, 0.961426f, 0.964844f, 0.968262f, 0.970703f, 0.973633f, 0.976074f, 0.978516f,
- 0.980469f, 0.982910f, 0.992676f, 0.992676f, 0.992188f, 0.992188f, 0.991699f, 0.990723f,
- 0.002850f, 0.009483f, 0.016647f, 0.025833f, 0.035889f, 0.047424f, 0.061646f, 0.076660f,
- 0.095642f, 0.117065f, 0.141113f, 0.168457f, 0.198975f, 0.233032f, 0.269775f, 0.308838f,
- 0.349854f, 0.391357f, 0.432861f, 0.474121f, 0.515625f, 0.552734f, 0.589355f, 0.622559f,
- 0.654785f, 0.683594f, 0.710938f, 0.735352f, 0.757812f, 0.777344f, 0.795898f, 0.812988f,
- 0.827637f, 0.842285f, 0.854492f, 0.866211f, 0.876953f, 0.886719f, 0.895508f, 0.902832f,
- 0.911133f, 0.917969f, 0.924316f, 0.929688f, 0.935059f, 0.940430f, 0.945312f, 0.949219f,
- 0.953125f, 0.958008f, 0.961426f, 0.964844f, 0.967285f, 0.970703f, 0.973633f, 0.975586f,
- 0.978516f, 0.981445f, 0.991699f, 0.992188f, 0.991699f, 0.991211f, 0.991211f, 0.990723f,
- 0.002628f, 0.007713f, 0.014069f, 0.021484f, 0.029709f, 0.038910f, 0.050201f, 0.063171f,
- 0.078186f, 0.094849f, 0.114563f, 0.137329f, 0.162720f, 0.190918f, 0.222656f, 0.257568f,
- 0.293945f, 0.332764f, 0.372803f, 0.414551f, 0.455078f, 0.495361f, 0.533691f, 0.571289f,
- 0.606445f, 0.639160f, 0.668457f, 0.697754f, 0.723633f, 0.746094f, 0.767090f, 0.787598f,
- 0.804199f, 0.820801f, 0.834473f, 0.848633f, 0.860352f, 0.872559f, 0.882324f, 0.891602f,
- 0.899902f, 0.907715f, 0.915039f, 0.921387f, 0.927734f, 0.934082f, 0.938965f, 0.944824f,
- 0.948730f, 0.953125f, 0.956543f, 0.960938f, 0.963867f, 0.967285f, 0.970215f, 0.973145f,
- 0.976074f, 0.978516f, 0.990234f, 0.990723f, 0.990723f, 0.991211f, 0.990234f, 0.990234f,
- 0.002131f, 0.006535f, 0.012016f, 0.017670f, 0.024780f, 0.032837f, 0.041199f, 0.051819f,
- 0.063904f, 0.077759f, 0.093689f, 0.112610f, 0.133057f, 0.156860f, 0.183472f, 0.213257f,
- 0.245605f, 0.281006f, 0.318115f, 0.357422f, 0.397217f, 0.437500f, 0.478271f, 0.516602f,
- 0.554688f, 0.589844f, 0.623535f, 0.654785f, 0.684082f, 0.710938f, 0.734375f, 0.757812f,
- 0.777832f, 0.795898f, 0.813477f, 0.828613f, 0.843262f, 0.855957f, 0.867676f, 0.878906f,
- 0.888184f, 0.897461f, 0.905273f, 0.912598f, 0.919922f, 0.926758f, 0.932129f, 0.937988f,
- 0.942871f, 0.947754f, 0.951660f, 0.955566f, 0.960449f, 0.964355f, 0.967285f, 0.970215f,
- 0.973145f, 0.976074f, 0.989746f, 0.990234f, 0.990234f, 0.990234f, 0.989746f, 0.988770f,
- 0.001566f, 0.005798f, 0.010231f, 0.015259f, 0.020920f, 0.027176f, 0.034607f, 0.043335f,
- 0.052887f, 0.064392f, 0.077576f, 0.092712f, 0.109802f, 0.129639f, 0.151611f, 0.176758f,
- 0.204346f, 0.235474f, 0.269043f, 0.304688f, 0.342529f, 0.381836f, 0.421143f, 0.460449f,
- 0.500488f, 0.538086f, 0.574219f, 0.608887f, 0.640625f, 0.670898f, 0.699219f, 0.725098f,
- 0.748535f, 0.769043f, 0.788574f, 0.807129f, 0.823242f, 0.837402f, 0.850586f, 0.863281f,
- 0.874512f, 0.885254f, 0.894043f, 0.902832f, 0.910645f, 0.917969f, 0.924805f, 0.931152f,
- 0.936523f, 0.941895f, 0.947266f, 0.951172f, 0.955566f, 0.960449f, 0.963867f, 0.966797f,
- 0.970703f, 0.973145f, 0.988281f, 0.989258f, 0.989258f, 0.989258f, 0.988770f, 0.988281f,
- 0.001427f, 0.004749f, 0.008934f, 0.012833f, 0.017670f, 0.023483f, 0.029114f, 0.036438f,
- 0.044556f, 0.054047f, 0.064453f, 0.077148f, 0.091309f, 0.107544f, 0.125854f, 0.146729f,
- 0.170776f, 0.197266f, 0.226440f, 0.257568f, 0.292236f, 0.329346f, 0.367188f, 0.405762f,
- 0.445557f, 0.484619f, 0.522949f, 0.559570f, 0.595215f, 0.627441f, 0.659180f, 0.687012f,
- 0.714355f, 0.739258f, 0.761719f, 0.781738f, 0.800781f, 0.817383f, 0.833984f, 0.847168f,
- 0.859375f, 0.872070f, 0.882324f, 0.891602f, 0.900879f, 0.909668f, 0.916504f, 0.923828f,
- 0.930176f, 0.936523f, 0.941895f, 0.946777f, 0.951172f, 0.956055f, 0.960449f, 0.963867f,
- 0.967285f, 0.970703f, 0.987305f, 0.988770f, 0.988281f, 0.987793f, 0.987793f, 0.987793f,
- 0.001357f, 0.004501f, 0.007557f, 0.011284f, 0.015236f, 0.019791f, 0.025101f, 0.030838f,
- 0.037628f, 0.045532f, 0.054596f, 0.064636f, 0.076355f, 0.089905f, 0.105042f, 0.122498f,
- 0.142334f, 0.164307f, 0.189697f, 0.217896f, 0.248413f, 0.281494f, 0.316406f, 0.354004f,
- 0.391846f, 0.430664f, 0.469971f, 0.508301f, 0.545898f, 0.582031f, 0.615723f, 0.647461f,
- 0.677734f, 0.704590f, 0.731445f, 0.754395f, 0.775391f, 0.794922f, 0.811523f, 0.829102f,
- 0.842773f, 0.856934f, 0.868652f, 0.880371f, 0.891113f, 0.899414f, 0.908203f, 0.915527f,
- 0.922852f, 0.930176f, 0.936035f, 0.941406f, 0.947266f, 0.951660f, 0.957031f, 0.960449f,
- 0.963867f, 0.968262f, 0.986328f, 0.987305f, 0.987793f, 0.987305f, 0.987305f, 0.986816f,
- 0.001239f, 0.003864f, 0.006699f, 0.009621f, 0.013008f, 0.017059f, 0.021805f, 0.026703f,
- 0.032562f, 0.039185f, 0.045807f, 0.054352f, 0.064514f, 0.075439f, 0.088257f, 0.102478f,
- 0.119263f, 0.138306f, 0.159546f, 0.183228f, 0.209961f, 0.239258f, 0.271484f, 0.305176f,
- 0.341797f, 0.379639f, 0.417480f, 0.456787f, 0.495605f, 0.532227f, 0.570801f, 0.604980f,
- 0.637207f, 0.666992f, 0.696289f, 0.722656f, 0.746582f, 0.768555f, 0.789062f, 0.808105f,
- 0.824219f, 0.839844f, 0.854492f, 0.865723f, 0.878418f, 0.888672f, 0.897461f, 0.906738f,
- 0.915039f, 0.922363f, 0.929199f, 0.935547f, 0.941895f, 0.946289f, 0.952148f, 0.956543f,
- 0.960449f, 0.964844f, 0.985352f, 0.986816f, 0.986816f, 0.986328f, 0.986328f, 0.985840f,
- 0.001151f, 0.003429f, 0.005753f, 0.008400f, 0.011391f, 0.014877f, 0.018494f, 0.022858f,
- 0.028046f, 0.033112f, 0.039642f, 0.046661f, 0.054565f, 0.064026f, 0.074280f, 0.086243f,
- 0.100403f, 0.116150f, 0.133789f, 0.154053f, 0.176636f, 0.202393f, 0.230957f, 0.261719f,
- 0.295166f, 0.330322f, 0.367432f, 0.405518f, 0.445312f, 0.483398f, 0.520996f, 0.558105f,
- 0.594238f, 0.626465f, 0.659668f, 0.688477f, 0.714844f, 0.740723f, 0.763672f, 0.784180f,
- 0.804199f, 0.821289f, 0.837402f, 0.852051f, 0.864258f, 0.876465f, 0.886719f, 0.897949f,
- 0.906250f, 0.915039f, 0.922363f, 0.929199f, 0.935547f, 0.941406f, 0.946777f, 0.952637f,
- 0.958008f, 0.961914f, 0.983887f, 0.985840f, 0.985352f, 0.985352f, 0.984863f, 0.984863f,
- 0.001000f, 0.002768f, 0.005127f, 0.007515f, 0.010155f, 0.013283f, 0.016205f, 0.019714f,
- 0.023987f, 0.028854f, 0.033905f, 0.040161f, 0.046814f, 0.054199f, 0.063110f, 0.073303f,
- 0.084839f, 0.098145f, 0.112854f, 0.129883f, 0.149292f, 0.171387f, 0.195435f, 0.222778f,
- 0.252686f, 0.285400f, 0.320312f, 0.356689f, 0.394531f, 0.433105f, 0.471924f, 0.510742f,
- 0.547852f, 0.584473f, 0.617676f, 0.650879f, 0.680664f, 0.708984f, 0.734375f, 0.759277f,
- 0.780762f, 0.799805f, 0.817383f, 0.834473f, 0.849121f, 0.862793f, 0.875488f, 0.886719f,
- 0.896484f, 0.906250f, 0.915039f, 0.923828f, 0.930176f, 0.936035f, 0.942871f, 0.948242f,
- 0.953613f, 0.958008f, 0.982910f, 0.983887f, 0.984375f, 0.983887f, 0.984375f, 0.983398f,
- 0.000799f, 0.002705f, 0.004459f, 0.006573f, 0.008842f, 0.011375f, 0.014099f, 0.017487f,
- 0.020798f, 0.024963f, 0.029465f, 0.034637f, 0.039703f, 0.046478f, 0.054047f, 0.062256f,
- 0.072388f, 0.082947f, 0.095764f, 0.110229f, 0.126099f, 0.144775f, 0.165771f, 0.189697f,
- 0.216187f, 0.244995f, 0.276123f, 0.310303f, 0.346191f, 0.384521f, 0.422607f, 0.461670f,
- 0.500000f, 0.538574f, 0.575195f, 0.609863f, 0.643555f, 0.673828f, 0.702637f, 0.730469f,
- 0.754395f, 0.777344f, 0.797363f, 0.815430f, 0.833008f, 0.848633f, 0.861328f, 0.875000f,
- 0.886719f, 0.896973f, 0.906738f, 0.915039f, 0.923340f, 0.930176f, 0.936523f, 0.943848f,
- 0.948730f, 0.954102f, 0.981445f, 0.983398f, 0.982910f, 0.983398f, 0.982910f, 0.982910f,
- 0.000774f, 0.002554f, 0.003899f, 0.005875f, 0.007759f, 0.009949f, 0.012733f, 0.015060f,
- 0.018280f, 0.021667f, 0.025574f, 0.029678f, 0.034698f, 0.040405f, 0.046570f, 0.053650f,
- 0.061462f, 0.071106f, 0.081360f, 0.093323f, 0.107300f, 0.122864f, 0.140747f, 0.160522f,
- 0.183960f, 0.209229f, 0.237305f, 0.268799f, 0.302002f, 0.337402f, 0.374023f, 0.413330f,
- 0.451904f, 0.490967f, 0.529785f, 0.567383f, 0.603027f, 0.636719f, 0.668457f, 0.698242f,
- 0.725586f, 0.750977f, 0.773926f, 0.793945f, 0.813965f, 0.831543f, 0.847656f, 0.861816f,
- 0.874512f, 0.886719f, 0.897461f, 0.906738f, 0.915527f, 0.923828f, 0.931641f, 0.937988f,
- 0.944824f, 0.949707f, 0.979980f, 0.981934f, 0.981934f, 0.981934f, 0.981934f, 0.981445f,
- 0.000657f, 0.001934f, 0.003330f, 0.005280f, 0.006748f, 0.009079f, 0.010994f, 0.013763f,
- 0.015945f, 0.019150f, 0.022003f, 0.026001f, 0.030350f, 0.034790f, 0.040253f, 0.045898f,
- 0.052795f, 0.060852f, 0.069641f, 0.079346f, 0.091187f, 0.104492f, 0.119751f, 0.136963f,
- 0.156372f, 0.178345f, 0.203247f, 0.230957f, 0.260742f, 0.294189f, 0.328613f, 0.365723f,
- 0.403564f, 0.443115f, 0.482910f, 0.521484f, 0.559570f, 0.596680f, 0.630859f, 0.664062f,
- 0.694336f, 0.722168f, 0.747559f, 0.771484f, 0.793457f, 0.813477f, 0.830078f, 0.846191f,
- 0.861816f, 0.874023f, 0.887207f, 0.898438f, 0.908691f, 0.916992f, 0.925293f, 0.933594f,
- 0.939941f, 0.946777f, 0.978516f, 0.980469f, 0.980469f, 0.980469f, 0.980469f, 0.980469f,
- 0.000818f, 0.001935f, 0.003246f, 0.004658f, 0.006229f, 0.007912f, 0.010017f, 0.012093f,
- 0.014259f, 0.016586f, 0.019653f, 0.022659f, 0.026413f, 0.030289f, 0.034790f, 0.039917f,
- 0.045441f, 0.052338f, 0.059479f, 0.068115f, 0.077759f, 0.089050f, 0.102051f, 0.116272f,
- 0.133179f, 0.152344f, 0.173340f, 0.197876f, 0.224243f, 0.254150f, 0.286621f, 0.321533f,
- 0.357666f, 0.396729f, 0.436279f, 0.475830f, 0.514648f, 0.553711f, 0.590332f, 0.626465f,
- 0.659180f, 0.689941f, 0.719238f, 0.746094f, 0.770020f, 0.792480f, 0.812500f, 0.830566f,
- 0.846680f, 0.862305f, 0.875977f, 0.888184f, 0.899414f, 0.910156f, 0.918945f, 0.927246f,
- 0.935059f, 0.941895f, 0.977051f, 0.979004f, 0.979492f, 0.979004f, 0.979492f, 0.979004f,
- 0.000583f, 0.001696f, 0.003044f, 0.004276f, 0.005394f, 0.007111f, 0.009048f, 0.010727f,
- 0.012802f, 0.014549f, 0.017319f, 0.019943f, 0.023132f, 0.026459f, 0.030212f, 0.034576f,
- 0.039612f, 0.045105f, 0.051422f, 0.058594f, 0.066833f, 0.076416f, 0.087341f, 0.099792f,
- 0.113647f, 0.130005f, 0.147827f, 0.168945f, 0.192261f, 0.218750f, 0.247803f, 0.280029f,
- 0.314209f, 0.351074f, 0.389404f, 0.429199f, 0.468750f, 0.508301f, 0.547852f, 0.585938f,
- 0.622070f, 0.655762f, 0.687988f, 0.718262f, 0.744629f, 0.769531f, 0.792480f, 0.812500f,
- 0.832520f, 0.848633f, 0.863770f, 0.877441f, 0.890137f, 0.901367f, 0.912109f, 0.921387f,
- 0.929199f, 0.937500f, 0.975586f, 0.978027f, 0.978027f, 0.977539f, 0.977539f, 0.977051f,
- 0.000463f, 0.001634f, 0.002899f, 0.003574f, 0.004932f, 0.006233f, 0.007866f, 0.009644f,
- 0.011055f, 0.012894f, 0.015518f, 0.017792f, 0.020279f, 0.023178f, 0.026657f, 0.030136f,
- 0.034271f, 0.039062f, 0.044586f, 0.050446f, 0.057739f, 0.065613f, 0.074646f, 0.084900f,
- 0.097107f, 0.111023f, 0.126099f, 0.143921f, 0.164673f, 0.187500f, 0.213257f, 0.242065f,
- 0.273926f, 0.308594f, 0.344971f, 0.383301f, 0.423340f, 0.463623f, 0.503906f, 0.543945f,
- 0.582520f, 0.619629f, 0.653809f, 0.686523f, 0.717285f, 0.744629f, 0.770020f, 0.792969f,
- 0.814453f, 0.833496f, 0.850098f, 0.866211f, 0.879395f, 0.893066f, 0.904297f, 0.914551f,
- 0.923828f, 0.932129f, 0.973145f, 0.976074f, 0.976562f, 0.976074f, 0.976074f, 0.976074f,
- 0.000472f, 0.001289f, 0.002508f, 0.003481f, 0.004459f, 0.005894f, 0.007042f, 0.008232f,
- 0.009972f, 0.011719f, 0.013435f, 0.015884f, 0.017899f, 0.020386f, 0.023422f, 0.026428f,
- 0.030411f, 0.034180f, 0.038757f, 0.043854f, 0.049652f, 0.056549f, 0.064270f, 0.073303f,
- 0.083252f, 0.095093f, 0.107910f, 0.123169f, 0.141113f, 0.160645f, 0.183472f, 0.208618f,
- 0.237305f, 0.268799f, 0.302734f, 0.339600f, 0.377930f, 0.418457f, 0.459473f, 0.500000f,
- 0.540527f, 0.579102f, 0.617188f, 0.652832f, 0.685547f, 0.716309f, 0.745117f, 0.771484f,
- 0.794922f, 0.815918f, 0.834961f, 0.853027f, 0.868652f, 0.882324f, 0.895996f, 0.907227f,
- 0.916992f, 0.927246f, 0.972168f, 0.974121f, 0.975098f, 0.973633f, 0.974609f, 0.973633f,
- 0.000238f, 0.001453f, 0.002047f, 0.002985f, 0.004227f, 0.005272f, 0.006096f, 0.007309f,
- 0.008957f, 0.010437f, 0.012184f, 0.014214f, 0.015793f, 0.018082f, 0.020538f, 0.023270f,
- 0.026505f, 0.029648f, 0.033813f, 0.038300f, 0.043457f, 0.049042f, 0.055298f, 0.062744f,
- 0.070984f, 0.081299f, 0.092590f, 0.105591f, 0.120361f, 0.137695f, 0.156982f, 0.179443f,
- 0.204346f, 0.232788f, 0.263672f, 0.297363f, 0.334229f, 0.373047f, 0.414307f, 0.455322f,
- 0.497314f, 0.538086f, 0.578613f, 0.616211f, 0.653320f, 0.686523f, 0.718262f, 0.747559f,
- 0.773438f, 0.797363f, 0.818848f, 0.838867f, 0.856934f, 0.871582f, 0.885742f, 0.898926f,
- 0.910645f, 0.920410f, 0.970215f, 0.971680f, 0.972656f, 0.972656f, 0.972168f, 0.972168f,
- 0.000376f, 0.001075f, 0.002052f, 0.002823f, 0.003603f, 0.004509f, 0.005619f, 0.007008f,
- 0.008064f, 0.009132f, 0.010849f, 0.012314f, 0.013817f, 0.015945f, 0.018188f, 0.020676f,
- 0.022995f, 0.026230f, 0.029587f, 0.033234f, 0.037598f, 0.042328f, 0.048004f, 0.054230f,
- 0.061188f, 0.069824f, 0.079468f, 0.090454f, 0.103271f, 0.117493f, 0.134644f, 0.153931f,
- 0.175293f, 0.200806f, 0.228149f, 0.259277f, 0.293945f, 0.330566f, 0.370117f, 0.410889f,
- 0.453369f, 0.495605f, 0.537109f, 0.578125f, 0.616699f, 0.653809f, 0.689453f, 0.721191f,
- 0.750000f, 0.776855f, 0.800293f, 0.822754f, 0.841309f, 0.859863f, 0.876465f, 0.890137f,
- 0.902832f, 0.914062f, 0.967773f, 0.970703f, 0.970703f, 0.970703f, 0.970703f, 0.970703f,
- 0.000237f, 0.000972f, 0.001674f, 0.002413f, 0.003336f, 0.003956f, 0.005093f, 0.006039f,
- 0.007069f, 0.008202f, 0.009613f, 0.011017f, 0.012520f, 0.014282f, 0.016068f, 0.017853f,
- 0.020508f, 0.023117f, 0.025986f, 0.029160f, 0.032898f, 0.036865f, 0.041565f, 0.046997f,
- 0.052887f, 0.060089f, 0.068176f, 0.077515f, 0.088257f, 0.100586f, 0.114929f, 0.131592f,
- 0.150635f, 0.172241f, 0.196411f, 0.224731f, 0.255859f, 0.290039f, 0.327393f, 0.367188f,
- 0.409180f, 0.451172f, 0.493896f, 0.536621f, 0.578613f, 0.618164f, 0.655762f, 0.691406f,
- 0.724121f, 0.753906f, 0.781738f, 0.805176f, 0.827637f, 0.847656f, 0.864746f, 0.880859f,
- 0.895508f, 0.907715f, 0.965332f, 0.968262f, 0.968750f, 0.969238f, 0.967773f, 0.967773f,
- 0.000450f, 0.001033f, 0.001554f, 0.002131f, 0.002939f, 0.003662f, 0.004551f, 0.005722f,
- 0.006405f, 0.007542f, 0.008484f, 0.009750f, 0.011017f, 0.012596f, 0.014046f, 0.015854f,
- 0.017975f, 0.020264f, 0.022736f, 0.025497f, 0.028671f, 0.031952f, 0.036011f, 0.040741f,
- 0.045746f, 0.051910f, 0.058868f, 0.066772f, 0.075867f, 0.086304f, 0.098328f, 0.112244f,
- 0.128784f, 0.147217f, 0.168945f, 0.193848f, 0.221558f, 0.252441f, 0.287109f, 0.324951f,
- 0.365234f, 0.407715f, 0.450684f, 0.494629f, 0.539062f, 0.580566f, 0.621094f, 0.659668f,
- 0.695801f, 0.729004f, 0.758789f, 0.786133f, 0.810547f, 0.833008f, 0.852539f, 0.870117f,
- 0.886719f, 0.900879f, 0.962891f, 0.966309f, 0.966309f, 0.966797f, 0.966797f, 0.966309f,
- 0.000304f, 0.001050f, 0.001257f, 0.002295f, 0.002689f, 0.003885f, 0.004284f, 0.004726f,
- 0.005547f, 0.006721f, 0.007595f, 0.008667f, 0.009811f, 0.011330f, 0.012642f, 0.014130f,
- 0.016098f, 0.017975f, 0.019867f, 0.022247f, 0.024811f, 0.028030f, 0.031403f, 0.035461f,
- 0.039642f, 0.044800f, 0.050720f, 0.057495f, 0.065002f, 0.073914f, 0.084290f, 0.095947f,
- 0.109985f, 0.126343f, 0.144409f, 0.166138f, 0.190918f, 0.218750f, 0.250244f, 0.285400f,
- 0.323730f, 0.364258f, 0.407471f, 0.452148f, 0.496338f, 0.540527f, 0.584473f, 0.625977f,
- 0.665039f, 0.701172f, 0.735352f, 0.765137f, 0.792480f, 0.817383f, 0.840332f, 0.859863f,
- 0.876953f, 0.893066f, 0.959961f, 0.963379f, 0.963867f, 0.964355f, 0.963867f, 0.963867f,
- 0.000228f, 0.000682f, 0.001293f, 0.001717f, 0.002352f, 0.003160f, 0.003626f, 0.004360f,
- 0.005348f, 0.005871f, 0.006870f, 0.007660f, 0.008957f, 0.010002f, 0.011299f, 0.012375f,
- 0.014099f, 0.015900f, 0.017670f, 0.019363f, 0.022034f, 0.024216f, 0.027420f, 0.030930f,
- 0.034454f, 0.038910f, 0.044006f, 0.049530f, 0.055878f, 0.063477f, 0.072083f, 0.082275f,
- 0.094177f, 0.107666f, 0.123840f, 0.142090f, 0.163452f, 0.188477f, 0.216919f, 0.248047f,
- 0.283447f, 0.322754f, 0.364990f, 0.408447f, 0.453613f, 0.500000f, 0.544922f, 0.589355f,
- 0.631348f, 0.671387f, 0.708008f, 0.742188f, 0.773438f, 0.800781f, 0.824219f, 0.846680f,
- 0.866699f, 0.884277f, 0.958008f, 0.960938f, 0.961426f, 0.962402f, 0.961914f, 0.960938f,
- 0.000239f, 0.000731f, 0.001204f, 0.001637f, 0.002144f, 0.002913f, 0.003521f, 0.003828f,
- 0.004517f, 0.005291f, 0.006203f, 0.006954f, 0.007740f, 0.008911f, 0.010239f, 0.011017f,
- 0.012413f, 0.013863f, 0.015396f, 0.017181f, 0.019196f, 0.021439f, 0.024078f, 0.026993f,
- 0.030182f, 0.033752f, 0.038055f, 0.042664f, 0.048004f, 0.054657f, 0.061920f, 0.070312f,
- 0.080688f, 0.092041f, 0.105774f, 0.121094f, 0.140015f, 0.161255f, 0.186523f, 0.214966f,
- 0.246948f, 0.283203f, 0.322998f, 0.365967f, 0.410400f, 0.457275f, 0.503906f, 0.550781f,
- 0.596191f, 0.638672f, 0.678711f, 0.716797f, 0.750488f, 0.781738f, 0.809082f, 0.833496f,
- 0.855469f, 0.874512f, 0.954590f, 0.958008f, 0.958984f, 0.958984f, 0.958984f, 0.958984f,
- 0.000226f, 0.000663f, 0.001073f, 0.001420f, 0.002163f, 0.002567f, 0.003052f, 0.003433f,
- 0.004181f, 0.004734f, 0.005516f, 0.006424f, 0.007050f, 0.008003f, 0.008659f, 0.009827f,
- 0.011086f, 0.012398f, 0.013649f, 0.015266f, 0.016891f, 0.018921f, 0.021118f, 0.023560f,
- 0.026505f, 0.029556f, 0.032715f, 0.036865f, 0.041077f, 0.046570f, 0.053314f, 0.060150f,
- 0.068787f, 0.078552f, 0.090027f, 0.103638f, 0.119690f, 0.138184f, 0.159546f, 0.184692f,
- 0.213745f, 0.245972f, 0.283203f, 0.324219f, 0.367920f, 0.414062f, 0.461914f, 0.509766f,
- 0.557129f, 0.604492f, 0.647461f, 0.688965f, 0.727051f, 0.761230f, 0.791504f, 0.819824f,
- 0.844238f, 0.865234f, 0.951660f, 0.955566f, 0.955566f, 0.956055f, 0.955078f, 0.956543f,
- 0.000156f, 0.000587f, 0.001056f, 0.001499f, 0.001647f, 0.002380f, 0.002594f, 0.003469f,
- 0.003777f, 0.004112f, 0.004925f, 0.005699f, 0.006180f, 0.007019f, 0.007957f, 0.008942f,
- 0.009560f, 0.010727f, 0.011963f, 0.013123f, 0.014885f, 0.016556f, 0.018494f, 0.020355f,
- 0.022766f, 0.025330f, 0.028320f, 0.031830f, 0.035736f, 0.040161f, 0.045532f, 0.052032f,
- 0.059113f, 0.066833f, 0.076782f, 0.088501f, 0.101868f, 0.117310f, 0.136108f, 0.157959f,
- 0.183105f, 0.212769f, 0.247070f, 0.284424f, 0.326660f, 0.371338f, 0.419189f, 0.468994f,
- 0.518066f, 0.567383f, 0.613770f, 0.658691f, 0.700684f, 0.738770f, 0.771973f, 0.803223f,
- 0.829590f, 0.854492f, 0.947266f, 0.952637f, 0.952637f, 0.952637f, 0.953125f, 0.952637f,
- 0.000155f, 0.000358f, 0.000859f, 0.001402f, 0.001830f, 0.002092f, 0.002499f, 0.002672f,
- 0.003410f, 0.003763f, 0.004375f, 0.005077f, 0.005535f, 0.006554f, 0.007004f, 0.007874f,
- 0.008537f, 0.009529f, 0.010742f, 0.011749f, 0.013016f, 0.014427f, 0.015945f, 0.017929f,
- 0.019775f, 0.022018f, 0.024460f, 0.027618f, 0.030640f, 0.034668f, 0.039154f, 0.044250f,
- 0.050293f, 0.057068f, 0.065491f, 0.074951f, 0.086487f, 0.099670f, 0.115906f, 0.134277f,
- 0.156860f, 0.182495f, 0.213135f, 0.248047f, 0.286621f, 0.329834f, 0.376709f, 0.426025f,
- 0.476562f, 0.527832f, 0.577637f, 0.626465f, 0.671387f, 0.713379f, 0.752441f, 0.784668f,
- 0.815430f, 0.841797f, 0.944336f, 0.948242f, 0.949219f, 0.949219f, 0.949219f, 0.949707f,
- 0.000233f, 0.000639f, 0.000930f, 0.001277f, 0.001579f, 0.001916f, 0.002041f, 0.002625f,
- 0.003035f, 0.003571f, 0.004124f, 0.004375f, 0.004978f, 0.005379f, 0.006348f, 0.006886f,
- 0.007526f, 0.008430f, 0.009216f, 0.010262f, 0.011436f, 0.012779f, 0.014160f, 0.015549f,
- 0.017120f, 0.019089f, 0.021164f, 0.023621f, 0.026352f, 0.029724f, 0.033447f, 0.037842f,
- 0.042603f, 0.048737f, 0.055573f, 0.063721f, 0.073364f, 0.084778f, 0.098206f, 0.114197f,
- 0.133423f, 0.155762f, 0.182739f, 0.213623f, 0.249512f, 0.289795f, 0.335205f, 0.383789f,
- 0.434814f, 0.487305f, 0.540039f, 0.591797f, 0.640137f, 0.686035f, 0.727539f, 0.765137f,
- 0.800293f, 0.830078f, 0.940430f, 0.944336f, 0.945312f, 0.946289f, 0.945801f, 0.945312f,
- 0.000217f, 0.000519f, 0.000848f, 0.001180f, 0.001366f, 0.001589f, 0.001986f, 0.002354f,
- 0.002987f, 0.003170f, 0.003576f, 0.003901f, 0.004440f, 0.004738f, 0.005543f, 0.006058f,
- 0.006508f, 0.007511f, 0.008163f, 0.009132f, 0.010078f, 0.011246f, 0.012390f, 0.013412f,
- 0.014938f, 0.016632f, 0.018433f, 0.020676f, 0.022995f, 0.025726f, 0.028702f, 0.032227f,
- 0.036377f, 0.041992f, 0.047394f, 0.053986f, 0.062195f, 0.071716f, 0.082825f, 0.096802f,
- 0.112732f, 0.132202f, 0.155273f, 0.182861f, 0.215210f, 0.252441f, 0.294678f, 0.341553f,
- 0.392090f, 0.445557f, 0.499512f, 0.553711f, 0.606445f, 0.656250f, 0.703125f, 0.745605f,
- 0.782715f, 0.816895f, 0.935547f, 0.939941f, 0.941406f, 0.941406f, 0.941406f, 0.940918f,
- 0.000242f, 0.000678f, 0.000781f, 0.000928f, 0.001200f, 0.001592f, 0.001694f, 0.002096f,
- 0.002703f, 0.002903f, 0.003170f, 0.003531f, 0.003918f, 0.004433f, 0.004955f, 0.005390f,
- 0.005939f, 0.006454f, 0.007298f, 0.007782f, 0.008759f, 0.009567f, 0.010559f, 0.011650f,
- 0.013046f, 0.014420f, 0.015793f, 0.017715f, 0.019699f, 0.021774f, 0.024460f, 0.027481f,
- 0.031082f, 0.035065f, 0.039917f, 0.045715f, 0.052246f, 0.060486f, 0.070129f, 0.081482f,
- 0.095093f, 0.111755f, 0.131714f, 0.155273f, 0.183838f, 0.217285f, 0.256348f, 0.300781f,
- 0.350342f, 0.403076f, 0.458252f, 0.514160f, 0.570312f, 0.624512f, 0.675781f, 0.722168f,
- 0.763672f, 0.800293f, 0.930664f, 0.935547f, 0.937500f, 0.937012f, 0.937500f, 0.937012f,
- 0.000239f, 0.000297f, 0.000667f, 0.000785f, 0.001044f, 0.001269f, 0.001569f, 0.001950f,
- 0.002224f, 0.002419f, 0.002810f, 0.003063f, 0.003626f, 0.003895f, 0.004261f, 0.004749f,
- 0.005066f, 0.005726f, 0.006260f, 0.007019f, 0.007771f, 0.008369f, 0.008919f, 0.009941f,
- 0.011101f, 0.012375f, 0.013519f, 0.015190f, 0.016891f, 0.018631f, 0.021011f, 0.023590f,
- 0.026581f, 0.029892f, 0.033875f, 0.038757f, 0.044281f, 0.051147f, 0.058746f, 0.068481f,
- 0.079834f, 0.094116f, 0.110779f, 0.131348f, 0.155884f, 0.185669f, 0.220825f, 0.261963f,
- 0.308594f, 0.360352f, 0.416260f, 0.473877f, 0.532715f, 0.589844f, 0.645508f, 0.696289f,
- 0.743652f, 0.784668f, 0.925781f, 0.930664f, 0.932129f, 0.932129f, 0.932129f, 0.932129f,
- 0.000226f, 0.000351f, 0.000434f, 0.000624f, 0.000887f, 0.001040f, 0.001246f, 0.001665f,
- 0.001856f, 0.002384f, 0.002420f, 0.002842f, 0.002874f, 0.003471f, 0.003735f, 0.004078f,
- 0.004639f, 0.004910f, 0.005531f, 0.006065f, 0.006664f, 0.007370f, 0.007690f, 0.008690f,
- 0.009544f, 0.010536f, 0.011795f, 0.012833f, 0.014183f, 0.015900f, 0.017899f, 0.019684f,
- 0.022430f, 0.025253f, 0.028412f, 0.032410f, 0.037201f, 0.042633f, 0.049316f, 0.057159f,
- 0.066772f, 0.078186f, 0.092590f, 0.110107f, 0.131348f, 0.156982f, 0.188232f, 0.225342f,
- 0.269043f, 0.318604f, 0.373535f, 0.431641f, 0.492188f, 0.554199f, 0.613281f, 0.668945f,
- 0.720703f, 0.766602f, 0.919922f, 0.925781f, 0.926758f, 0.926758f, 0.927246f, 0.926758f,
- 0.000000f, 0.000340f, 0.000458f, 0.000715f, 0.000823f, 0.000895f, 0.001165f, 0.001518f,
- 0.001636f, 0.001876f, 0.002190f, 0.002472f, 0.002640f, 0.002964f, 0.003340f, 0.003527f,
- 0.004005f, 0.004227f, 0.004803f, 0.005260f, 0.005878f, 0.006042f, 0.006805f, 0.007500f,
- 0.008469f, 0.009132f, 0.009949f, 0.011009f, 0.012077f, 0.013687f, 0.014938f, 0.016785f,
- 0.018997f, 0.021194f, 0.023895f, 0.027283f, 0.030945f, 0.035583f, 0.040955f, 0.047760f,
- 0.055573f, 0.065247f, 0.077209f, 0.091736f, 0.109619f, 0.131470f, 0.159058f, 0.192017f,
- 0.231812f, 0.278076f, 0.331543f, 0.389404f, 0.450928f, 0.513672f, 0.577637f, 0.638672f,
- 0.695801f, 0.746582f, 0.914062f, 0.919922f, 0.920898f, 0.921387f, 0.921387f, 0.921387f,
- 0.000146f, 0.000319f, 0.000443f, 0.000458f, 0.000704f, 0.000894f, 0.001199f, 0.001324f,
- 0.001549f, 0.001592f, 0.002081f, 0.002092f, 0.002237f, 0.002604f, 0.002815f, 0.003159f,
- 0.003510f, 0.003937f, 0.004147f, 0.004425f, 0.004814f, 0.005318f, 0.005878f, 0.006413f,
- 0.006924f, 0.007782f, 0.008408f, 0.009239f, 0.010414f, 0.011505f, 0.012642f, 0.014015f,
- 0.015884f, 0.017563f, 0.019852f, 0.022598f, 0.025650f, 0.029663f, 0.033875f, 0.039307f,
- 0.045898f, 0.053955f, 0.063782f, 0.075928f, 0.090820f, 0.109497f, 0.132690f, 0.161621f,
- 0.196777f, 0.239624f, 0.290039f, 0.346436f, 0.408203f, 0.473633f, 0.540527f, 0.605957f,
- 0.667969f, 0.725586f, 0.907715f, 0.914062f, 0.914062f, 0.915039f, 0.915039f, 0.915039f,
- 0.000121f, 0.000251f, 0.000506f, 0.000532f, 0.000665f, 0.000830f, 0.001190f, 0.001164f,
- 0.001290f, 0.001413f, 0.001755f, 0.001900f, 0.002157f, 0.002319f, 0.002422f, 0.002853f,
- 0.003042f, 0.003254f, 0.003529f, 0.003725f, 0.004288f, 0.004585f, 0.005043f, 0.005539f,
- 0.005970f, 0.006386f, 0.007126f, 0.007812f, 0.008652f, 0.009598f, 0.010651f, 0.011803f,
- 0.013130f, 0.014702f, 0.016510f, 0.018814f, 0.021011f, 0.024368f, 0.028122f, 0.032379f,
- 0.037506f, 0.044128f, 0.052277f, 0.062042f, 0.075073f, 0.090088f, 0.110107f, 0.134766f,
- 0.165405f, 0.203613f, 0.249268f, 0.303955f, 0.365234f, 0.431396f, 0.501465f, 0.571777f,
- 0.638672f, 0.702148f, 0.900879f, 0.906738f, 0.907227f, 0.908203f, 0.907227f, 0.908203f,
- 0.000241f, 0.000122f, 0.000417f, 0.000505f, 0.000741f, 0.000782f, 0.000916f, 0.001145f,
- 0.001189f, 0.001289f, 0.001331f, 0.001565f, 0.001779f, 0.002020f, 0.002171f, 0.002228f,
- 0.002623f, 0.002752f, 0.002949f, 0.003157f, 0.003515f, 0.003847f, 0.004082f, 0.004429f,
- 0.004990f, 0.005405f, 0.006008f, 0.006603f, 0.007103f, 0.007889f, 0.008789f, 0.009766f,
- 0.010605f, 0.012177f, 0.013672f, 0.015305f, 0.017487f, 0.019913f, 0.022781f, 0.026245f,
- 0.030670f, 0.035980f, 0.042389f, 0.050812f, 0.060883f, 0.073792f, 0.090088f, 0.111145f,
- 0.138062f, 0.171143f, 0.212524f, 0.262695f, 0.322266f, 0.388184f, 0.460205f, 0.533203f,
- 0.606445f, 0.676758f, 0.893066f, 0.898926f, 0.899414f, 0.899414f, 0.900879f, 0.900391f,
- 0.000000f, 0.000114f, 0.000227f, 0.000407f, 0.000532f, 0.000732f, 0.000714f, 0.000922f,
- 0.000993f, 0.001072f, 0.001190f, 0.001412f, 0.001569f, 0.001726f, 0.001959f, 0.002071f,
- 0.002159f, 0.002350f, 0.002565f, 0.002729f, 0.003090f, 0.003248f, 0.003702f, 0.003761f,
- 0.004192f, 0.004585f, 0.004925f, 0.005272f, 0.005966f, 0.006405f, 0.007275f, 0.007965f,
- 0.008850f, 0.009872f, 0.011017f, 0.012383f, 0.014275f, 0.015900f, 0.018463f, 0.021194f,
- 0.024673f, 0.028870f, 0.034271f, 0.040955f, 0.048981f, 0.059723f, 0.073059f, 0.090149f,
- 0.112549f, 0.141357f, 0.178467f, 0.223755f, 0.280029f, 0.345215f, 0.417969f, 0.494385f,
- 0.572266f, 0.648438f, 0.884277f, 0.890137f, 0.891602f, 0.891602f, 0.893066f, 0.892090f,
- 0.000000f, 0.000219f, 0.000211f, 0.000333f, 0.000559f, 0.000609f, 0.000788f, 0.000805f,
- 0.000869f, 0.000903f, 0.001101f, 0.001166f, 0.001302f, 0.001399f, 0.001456f, 0.001668f,
- 0.001853f, 0.001999f, 0.002102f, 0.002256f, 0.002447f, 0.002728f, 0.002943f, 0.003178f,
- 0.003515f, 0.003836f, 0.004074f, 0.004475f, 0.004745f, 0.005325f, 0.005970f, 0.006569f,
- 0.007248f, 0.008102f, 0.008888f, 0.010132f, 0.011169f, 0.012947f, 0.014763f, 0.016891f,
- 0.019760f, 0.023087f, 0.027176f, 0.032562f, 0.038940f, 0.047516f, 0.058167f, 0.072754f,
- 0.090698f, 0.114929f, 0.146851f, 0.187744f, 0.239258f, 0.301514f, 0.373291f, 0.452637f,
- 0.535645f, 0.617676f, 0.874512f, 0.880859f, 0.882324f, 0.883301f, 0.883301f, 0.882324f,
- 0.000204f, 0.000207f, 0.000204f, 0.000322f, 0.000435f, 0.000480f, 0.000556f, 0.000615f,
- 0.000747f, 0.000782f, 0.000844f, 0.001006f, 0.001159f, 0.001191f, 0.001231f, 0.001450f,
- 0.001585f, 0.001633f, 0.001790f, 0.001919f, 0.002117f, 0.002298f, 0.002432f, 0.002651f,
- 0.002939f, 0.003172f, 0.003399f, 0.003614f, 0.003944f, 0.004421f, 0.004704f, 0.005203f,
- 0.005886f, 0.006454f, 0.007160f, 0.008049f, 0.009041f, 0.010201f, 0.011627f, 0.013237f,
- 0.015404f, 0.018097f, 0.021469f, 0.025284f, 0.030884f, 0.036987f, 0.045990f, 0.056915f,
- 0.072083f, 0.092163f, 0.119141f, 0.154419f, 0.200928f, 0.259277f, 0.328857f, 0.409424f,
- 0.495605f, 0.584473f, 0.864258f, 0.871094f, 0.872070f, 0.873047f, 0.872559f, 0.873047f,
- 0.000000f, 0.000044f, 0.000176f, 0.000290f, 0.000410f, 0.000390f, 0.000513f, 0.000546f,
- 0.000647f, 0.000680f, 0.000827f, 0.000858f, 0.000958f, 0.001131f, 0.001102f, 0.001223f,
- 0.001367f, 0.001401f, 0.001525f, 0.001610f, 0.001826f, 0.001821f, 0.002039f, 0.002253f,
- 0.002459f, 0.002617f, 0.002708f, 0.003036f, 0.003279f, 0.003431f, 0.003805f, 0.004219f,
- 0.004471f, 0.004929f, 0.005569f, 0.006310f, 0.007107f, 0.007988f, 0.009003f, 0.010384f,
- 0.011856f, 0.014015f, 0.016418f, 0.019669f, 0.023666f, 0.028809f, 0.035583f, 0.044159f,
- 0.056458f, 0.072571f, 0.094604f, 0.124329f, 0.164917f, 0.218018f, 0.284912f, 0.364746f,
- 0.454102f, 0.549316f, 0.853027f, 0.859863f, 0.861328f, 0.861816f, 0.861816f, 0.861816f,
- 0.000000f, 0.000069f, 0.000120f, 0.000345f, 0.000371f, 0.000398f, 0.000452f, 0.000396f,
- 0.000498f, 0.000530f, 0.000596f, 0.000648f, 0.000781f, 0.000921f, 0.000995f, 0.001007f,
- 0.001101f, 0.001146f, 0.001282f, 0.001278f, 0.001471f, 0.001554f, 0.001710f, 0.001811f,
- 0.001995f, 0.001986f, 0.002314f, 0.002399f, 0.002499f, 0.002903f, 0.002975f, 0.003305f,
- 0.003605f, 0.004086f, 0.004425f, 0.005081f, 0.005402f, 0.006035f, 0.006889f, 0.007755f,
- 0.009041f, 0.010422f, 0.012672f, 0.014885f, 0.017746f, 0.021530f, 0.026733f, 0.033691f,
- 0.043060f, 0.055847f, 0.073181f, 0.097473f, 0.132324f, 0.179077f, 0.241821f, 0.320068f,
- 0.410400f, 0.510742f, 0.839844f, 0.847656f, 0.849121f, 0.849609f, 0.849121f, 0.849609f,
- 0.000000f, 0.000000f, 0.000121f, 0.000243f, 0.000321f, 0.000354f, 0.000341f, 0.000431f,
- 0.000423f, 0.000444f, 0.000473f, 0.000508f, 0.000595f, 0.000706f, 0.000737f, 0.000861f,
- 0.000869f, 0.000926f, 0.001055f, 0.001104f, 0.001199f, 0.001306f, 0.001360f, 0.001433f,
- 0.001530f, 0.001555f, 0.001673f, 0.001942f, 0.002138f, 0.002247f, 0.002562f, 0.002609f,
- 0.002911f, 0.003204f, 0.003466f, 0.003757f, 0.004192f, 0.004845f, 0.005482f, 0.006008f,
- 0.006874f, 0.007904f, 0.009171f, 0.011124f, 0.013260f, 0.015839f, 0.019821f, 0.024872f,
- 0.031982f, 0.041534f, 0.055054f, 0.075012f, 0.103516f, 0.143677f, 0.199951f, 0.273438f,
- 0.364502f, 0.469482f, 0.825684f, 0.834473f, 0.834961f, 0.835938f, 0.835938f, 0.835938f,
- 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000199f, 0.000272f, 0.000265f, 0.000363f,
- 0.000379f, 0.000388f, 0.000489f, 0.000500f, 0.000488f, 0.000569f, 0.000604f, 0.000700f,
- 0.000683f, 0.000720f, 0.000784f, 0.000844f, 0.001009f, 0.001047f, 0.001108f, 0.001258f,
- 0.001276f, 0.001388f, 0.001410f, 0.001565f, 0.001592f, 0.001814f, 0.001800f, 0.002167f,
- 0.002192f, 0.002556f, 0.002665f, 0.002905f, 0.003195f, 0.003574f, 0.004028f, 0.004513f,
- 0.005127f, 0.005859f, 0.006847f, 0.008018f, 0.009491f, 0.011452f, 0.014099f, 0.017792f,
- 0.022995f, 0.030258f, 0.040588f, 0.055878f, 0.078308f, 0.111450f, 0.160278f, 0.229248f,
- 0.318359f, 0.425781f, 0.810547f, 0.818359f, 0.820312f, 0.821777f, 0.821777f, 0.820801f,
- 0.000000f, 0.000121f, 0.000120f, 0.000172f, 0.000195f, 0.000171f, 0.000208f, 0.000272f,
- 0.000316f, 0.000333f, 0.000348f, 0.000355f, 0.000412f, 0.000410f, 0.000515f, 0.000485f,
- 0.000545f, 0.000656f, 0.000777f, 0.000659f, 0.000705f, 0.000762f, 0.000874f, 0.000927f,
- 0.000959f, 0.000978f, 0.001045f, 0.001228f, 0.001294f, 0.001398f, 0.001443f, 0.001637f,
- 0.001752f, 0.001925f, 0.002005f, 0.002230f, 0.002407f, 0.002670f, 0.002895f, 0.003267f,
- 0.003933f, 0.004280f, 0.005051f, 0.005772f, 0.006718f, 0.008141f, 0.010117f, 0.012383f,
- 0.015930f, 0.020920f, 0.028671f, 0.039673f, 0.056702f, 0.083313f, 0.124695f, 0.185791f,
- 0.270996f, 0.379639f, 0.793457f, 0.801270f, 0.803711f, 0.803711f, 0.804688f, 0.804688f,
- 0.000000f, 0.000121f, 0.000119f, 0.000144f, 0.000149f, 0.000166f, 0.000173f, 0.000167f,
- 0.000214f, 0.000245f, 0.000334f, 0.000287f, 0.000303f, 0.000391f, 0.000401f, 0.000440f,
- 0.000469f, 0.000493f, 0.000534f, 0.000513f, 0.000690f, 0.000682f, 0.000645f, 0.000712f,
- 0.000715f, 0.000747f, 0.000842f, 0.000849f, 0.000967f, 0.000995f, 0.001178f, 0.001167f,
- 0.001273f, 0.001395f, 0.001586f, 0.001748f, 0.001796f, 0.001986f, 0.002132f, 0.002476f,
- 0.002893f, 0.003294f, 0.003653f, 0.004086f, 0.004890f, 0.005821f, 0.006927f, 0.008553f,
- 0.010857f, 0.014137f, 0.019211f, 0.027084f, 0.039642f, 0.059448f, 0.092468f, 0.144775f,
- 0.224487f, 0.332764f, 0.775391f, 0.784668f, 0.786133f, 0.786133f, 0.787109f, 0.786621f,
- 0.000000f, 0.000000f, 0.000118f, 0.000116f, 0.000115f, 0.000113f, 0.000140f, 0.000140f,
- 0.000149f, 0.000220f, 0.000171f, 0.000255f, 0.000274f, 0.000292f, 0.000318f, 0.000295f,
- 0.000346f, 0.000352f, 0.000380f, 0.000406f, 0.000401f, 0.000533f, 0.000490f, 0.000551f,
- 0.000558f, 0.000648f, 0.000628f, 0.000723f, 0.000788f, 0.000749f, 0.000836f, 0.000941f,
- 0.000997f, 0.001065f, 0.001112f, 0.001207f, 0.001328f, 0.001535f, 0.001621f, 0.001840f,
- 0.002022f, 0.002163f, 0.002522f, 0.002825f, 0.003391f, 0.003830f, 0.004616f, 0.005665f,
- 0.007172f, 0.009247f, 0.012482f, 0.017532f, 0.025970f, 0.040161f, 0.064941f, 0.107422f,
- 0.178833f, 0.283447f, 0.754883f, 0.764648f, 0.766113f, 0.767090f, 0.767578f, 0.767090f,
- 0.000000f, 0.000119f, 0.000116f, 0.000114f, 0.000112f, 0.000110f, 0.000109f, 0.000117f,
- 0.000114f, 0.000117f, 0.000125f, 0.000193f, 0.000141f, 0.000196f, 0.000221f, 0.000235f,
- 0.000259f, 0.000278f, 0.000308f, 0.000316f, 0.000323f, 0.000315f, 0.000329f, 0.000351f,
- 0.000388f, 0.000422f, 0.000465f, 0.000512f, 0.000571f, 0.000568f, 0.000588f, 0.000633f,
- 0.000747f, 0.000751f, 0.000829f, 0.000958f, 0.000914f, 0.001104f, 0.001145f, 0.001255f,
- 0.001337f, 0.001499f, 0.001701f, 0.001966f, 0.002275f, 0.002609f, 0.003119f, 0.003773f,
- 0.004658f, 0.005920f, 0.007935f, 0.010948f, 0.015900f, 0.025284f, 0.042511f, 0.075012f,
- 0.135010f, 0.234619f, 0.733398f, 0.743164f, 0.744629f, 0.745117f, 0.745605f, 0.745605f,
- 0.000000f, 0.000116f, 0.000113f, 0.000111f, 0.000108f, 0.000106f, 0.000104f, 0.000103f,
- 0.000098f, 0.000092f, 0.000099f, 0.000085f, 0.000098f, 0.000105f, 0.000163f, 0.000162f,
- 0.000128f, 0.000193f, 0.000203f, 0.000214f, 0.000284f, 0.000239f, 0.000303f, 0.000268f,
- 0.000327f, 0.000326f, 0.000329f, 0.000330f, 0.000407f, 0.000486f, 0.000406f, 0.000454f,
- 0.000465f, 0.000495f, 0.000535f, 0.000592f, 0.000648f, 0.000727f, 0.000753f, 0.000807f,
- 0.000956f, 0.000992f, 0.001108f, 0.001294f, 0.001418f, 0.001703f, 0.001978f, 0.002390f,
- 0.002930f, 0.003643f, 0.004753f, 0.006519f, 0.009499f, 0.014824f, 0.025497f, 0.048065f,
- 0.095154f, 0.185425f, 0.709961f, 0.719727f, 0.721191f, 0.721191f, 0.721680f, 0.721680f,
- 0.000000f, 0.000113f, 0.000107f, 0.000106f, 0.000102f, 0.000100f, 0.000097f, 0.000096f,
- 0.000095f, 0.000092f, 0.000087f, 0.000083f, 0.000078f, 0.000098f, 0.000077f, 0.000091f,
- 0.000114f, 0.000128f, 0.000114f, 0.000147f, 0.000154f, 0.000162f, 0.000186f, 0.000174f,
- 0.000220f, 0.000233f, 0.000235f, 0.000245f, 0.000250f, 0.000253f, 0.000321f, 0.000296f,
- 0.000311f, 0.000354f, 0.000417f, 0.000419f, 0.000438f, 0.000443f, 0.000495f, 0.000513f,
- 0.000585f, 0.000634f, 0.000705f, 0.000778f, 0.000912f, 0.001002f, 0.001163f, 0.001379f,
- 0.001745f, 0.002092f, 0.002697f, 0.003721f, 0.005230f, 0.008194f, 0.013870f, 0.027359f,
- 0.061066f, 0.138062f, 0.685547f, 0.694336f, 0.696777f, 0.696289f, 0.697754f, 0.697754f,
- 0.000000f, 0.000106f, 0.000102f, 0.000097f, 0.000093f, 0.000091f, 0.000089f, 0.000087f,
- 0.000085f, 0.000084f, 0.000082f, 0.000080f, 0.000076f, 0.000072f, 0.000069f, 0.000074f,
- 0.000076f, 0.000059f, 0.000075f, 0.000062f, 0.000085f, 0.000091f, 0.000103f, 0.000111f,
- 0.000121f, 0.000135f, 0.000128f, 0.000159f, 0.000171f, 0.000160f, 0.000178f, 0.000193f,
- 0.000196f, 0.000202f, 0.000220f, 0.000230f, 0.000273f, 0.000289f, 0.000312f, 0.000330f,
- 0.000335f, 0.000397f, 0.000408f, 0.000463f, 0.000517f, 0.000577f, 0.000691f, 0.000771f,
- 0.000919f, 0.001150f, 0.001436f, 0.001955f, 0.002737f, 0.004185f, 0.007103f, 0.013863f,
- 0.033661f, 0.093628f, 0.657227f, 0.667480f, 0.668945f, 0.669434f, 0.670898f, 0.669922f,
- 0.000108f, 0.000093f, 0.000087f, 0.000082f, 0.000079f, 0.000078f, 0.000075f, 0.000073f,
- 0.000071f, 0.000070f, 0.000069f, 0.000069f, 0.000067f, 0.000066f, 0.000064f, 0.000061f,
- 0.000059f, 0.000056f, 0.000053f, 0.000051f, 0.000053f, 0.000049f, 0.000044f, 0.000047f,
- 0.000055f, 0.000058f, 0.000071f, 0.000077f, 0.000093f, 0.000094f, 0.000103f, 0.000102f,
- 0.000110f, 0.000126f, 0.000130f, 0.000138f, 0.000143f, 0.000166f, 0.000166f, 0.000178f,
- 0.000194f, 0.000217f, 0.000228f, 0.000231f, 0.000265f, 0.000330f, 0.000341f, 0.000411f,
- 0.000459f, 0.000549f, 0.000705f, 0.000867f, 0.001228f, 0.001863f, 0.003143f, 0.006283f,
- 0.015594f, 0.054993f, 0.628418f, 0.638184f, 0.640137f, 0.640137f, 0.641602f, 0.641602f,
- 0.000071f, 0.000058f, 0.000059f, 0.000058f, 0.000054f, 0.000054f, 0.000051f, 0.000053f,
- 0.000051f, 0.000052f, 0.000050f, 0.000050f, 0.000051f, 0.000050f, 0.000049f, 0.000049f,
- 0.000049f, 0.000049f, 0.000047f, 0.000045f, 0.000043f, 0.000041f, 0.000039f, 0.000038f,
- 0.000036f, 0.000034f, 0.000035f, 0.000037f, 0.000033f, 0.000034f, 0.000038f, 0.000047f,
- 0.000054f, 0.000061f, 0.000064f, 0.000068f, 0.000069f, 0.000076f, 0.000083f, 0.000092f,
- 0.000098f, 0.000103f, 0.000112f, 0.000129f, 0.000113f, 0.000139f, 0.000152f, 0.000185f,
- 0.000204f, 0.000238f, 0.000282f, 0.000365f, 0.000503f, 0.000685f, 0.001178f, 0.002274f,
- 0.006100f, 0.025162f, 0.597656f, 0.607910f, 0.610840f, 0.611816f, 0.610352f, 0.611328f,
- 0.000000f, 0.000000f, 0.000004f, 0.000012f, 0.000014f, 0.000020f, 0.000022f, 0.000023f,
- 0.000024f, 0.000022f, 0.000025f, 0.000027f, 0.000027f, 0.000026f, 0.000028f, 0.000029f,
- 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000030f, 0.000030f, 0.000030f, 0.000030f,
- 0.000029f, 0.000028f, 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000021f,
- 0.000020f, 0.000019f, 0.000018f, 0.000019f, 0.000023f, 0.000024f, 0.000027f, 0.000032f,
- 0.000038f, 0.000040f, 0.000041f, 0.000045f, 0.000054f, 0.000052f, 0.000055f, 0.000060f,
- 0.000068f, 0.000089f, 0.000089f, 0.000115f, 0.000146f, 0.000198f, 0.000318f, 0.000586f,
- 0.001614f, 0.008278f, 0.565918f, 0.576660f, 0.578125f, 0.579102f, 0.579590f, 0.580078f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f,
- 0.000003f, 0.000003f, 0.000005f, 0.000005f, 0.000006f, 0.000007f, 0.000009f, 0.000009f,
- 0.000010f, 0.000011f, 0.000012f, 0.000012f, 0.000013f, 0.000014f, 0.000014f, 0.000015f,
- 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f,
- 0.000009f, 0.000009f, 0.000008f, 0.000010f, 0.000013f, 0.000013f, 0.000013f, 0.000017f,
- 0.000017f, 0.000022f, 0.000021f, 0.000023f, 0.000031f, 0.000032f, 0.000049f, 0.000079f,
- 0.000204f, 0.001328f, 0.533203f, 0.543945f, 0.545410f, 0.546387f, 0.546875f, 0.546875f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f,
- 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f,
- 0.000004f, 0.000016f, 0.499756f, 0.510254f, 0.513184f, 0.513672f, 0.514160f, 0.514160f,
- },
- {
- 0.076172f, 0.209839f, 0.320312f, 0.408691f, 0.481689f, 0.541016f, 0.591309f, 0.633789f,
- 0.668945f, 0.699707f, 0.727051f, 0.749512f, 0.770020f, 0.788086f, 0.803711f, 0.817871f,
- 0.832520f, 0.843750f, 0.854492f, 0.864258f, 0.873535f, 0.881836f, 0.889160f, 0.895996f,
- 0.903320f, 0.909180f, 0.914551f, 0.920410f, 0.925781f, 0.929199f, 0.933594f, 0.938965f,
- 0.942383f, 0.946289f, 0.949219f, 0.953125f, 0.955566f, 0.959473f, 0.961914f, 0.964355f,
- 0.967285f, 0.970215f, 0.971680f, 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.982422f,
- 0.984375f, 0.986328f, 0.987793f, 0.989746f, 0.990723f, 0.992676f, 0.993652f, 0.995117f,
- 0.996582f, 0.998047f, 0.999023f, 0.997559f, 0.996582f, 0.995605f, 0.994629f, 0.993652f,
- 0.043396f, 0.133301f, 0.221313f, 0.303223f, 0.377441f, 0.442871f, 0.500000f, 0.550781f,
- 0.595215f, 0.632812f, 0.666992f, 0.696777f, 0.723145f, 0.745605f, 0.765137f, 0.783691f,
- 0.799805f, 0.815430f, 0.828613f, 0.839844f, 0.851562f, 0.861328f, 0.871582f, 0.879395f,
- 0.887207f, 0.894531f, 0.901855f, 0.907227f, 0.914062f, 0.919434f, 0.924316f, 0.928711f,
- 0.933594f, 0.937988f, 0.942383f, 0.945801f, 0.949219f, 0.953125f, 0.956055f, 0.959473f,
- 0.962402f, 0.964355f, 0.967773f, 0.970215f, 0.972656f, 0.975098f, 0.977051f, 0.979492f,
- 0.980957f, 0.983398f, 0.985352f, 0.986816f, 0.988281f, 0.990234f, 0.991699f, 0.993652f,
- 0.995117f, 0.996094f, 0.998047f, 0.997070f, 0.996094f, 0.995117f, 0.994141f, 0.993164f,
- 0.027832f, 0.088440f, 0.153198f, 0.221313f, 0.288086f, 0.352051f, 0.411621f, 0.466797f,
- 0.515625f, 0.561523f, 0.601074f, 0.637207f, 0.667969f, 0.695312f, 0.721680f, 0.743652f,
- 0.763184f, 0.781738f, 0.797852f, 0.812500f, 0.826172f, 0.838867f, 0.850098f, 0.859863f,
- 0.869141f, 0.877930f, 0.886230f, 0.893555f, 0.900879f, 0.907227f, 0.912598f, 0.918457f,
- 0.922852f, 0.928711f, 0.934082f, 0.938477f, 0.942383f, 0.946289f, 0.950195f, 0.953125f,
- 0.956543f, 0.959961f, 0.962402f, 0.965820f, 0.968262f, 0.970703f, 0.973145f, 0.975586f,
- 0.978027f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987793f, 0.989746f, 0.991211f,
- 0.993164f, 0.994141f, 0.997559f, 0.996582f, 0.995605f, 0.994629f, 0.993652f, 0.993164f,
- 0.018921f, 0.061493f, 0.109497f, 0.161987f, 0.217041f, 0.273438f, 0.330811f, 0.384521f,
- 0.437500f, 0.486084f, 0.530273f, 0.570312f, 0.607910f, 0.640137f, 0.670410f, 0.697266f,
- 0.722656f, 0.743652f, 0.763672f, 0.781250f, 0.797363f, 0.812012f, 0.825684f, 0.837891f,
- 0.848633f, 0.859863f, 0.869141f, 0.878418f, 0.886719f, 0.893066f, 0.900879f, 0.906738f,
- 0.913574f, 0.919434f, 0.924316f, 0.930176f, 0.934082f, 0.939453f, 0.942871f, 0.946777f,
- 0.950684f, 0.954590f, 0.958008f, 0.960449f, 0.963379f, 0.966797f, 0.969238f, 0.971680f,
- 0.974121f, 0.977051f, 0.978516f, 0.980957f, 0.983398f, 0.985352f, 0.987305f, 0.989258f,
- 0.991211f, 0.992676f, 0.996094f, 0.995605f, 0.994629f, 0.993652f, 0.993164f, 0.992188f,
- 0.013596f, 0.044495f, 0.080017f, 0.119873f, 0.164307f, 0.211670f, 0.261475f, 0.311523f,
- 0.362793f, 0.410645f, 0.458008f, 0.501953f, 0.542969f, 0.580078f, 0.614746f, 0.645996f,
- 0.674805f, 0.701172f, 0.723633f, 0.745117f, 0.765625f, 0.782227f, 0.798828f, 0.812988f,
- 0.826172f, 0.838867f, 0.849609f, 0.861328f, 0.870605f, 0.878906f, 0.887695f, 0.895020f,
- 0.901855f, 0.907715f, 0.914551f, 0.920898f, 0.925781f, 0.930664f, 0.934570f, 0.940918f,
- 0.943848f, 0.947754f, 0.951660f, 0.955566f, 0.958984f, 0.961914f, 0.964844f, 0.967773f,
- 0.970703f, 0.973145f, 0.975586f, 0.978027f, 0.979980f, 0.982422f, 0.984863f, 0.986328f,
- 0.988770f, 0.990234f, 0.995117f, 0.995117f, 0.994141f, 0.993652f, 0.992676f, 0.991699f,
- 0.010414f, 0.033203f, 0.060364f, 0.090942f, 0.125610f, 0.163818f, 0.206421f, 0.250488f,
- 0.295898f, 0.341797f, 0.388428f, 0.433350f, 0.475830f, 0.517090f, 0.555176f, 0.589844f,
- 0.622559f, 0.652344f, 0.680176f, 0.704590f, 0.729004f, 0.748535f, 0.767578f, 0.784668f,
- 0.800293f, 0.814941f, 0.828125f, 0.839844f, 0.852051f, 0.861816f, 0.871582f, 0.879883f,
- 0.888672f, 0.895996f, 0.903320f, 0.909180f, 0.916016f, 0.921387f, 0.927246f, 0.931641f,
- 0.937012f, 0.940918f, 0.946289f, 0.950195f, 0.953125f, 0.957520f, 0.960449f, 0.963867f,
- 0.966309f, 0.969238f, 0.972168f, 0.975098f, 0.976562f, 0.979492f, 0.981934f, 0.983887f,
- 0.985840f, 0.988281f, 0.994629f, 0.994141f, 0.993652f, 0.992676f, 0.991699f, 0.990723f,
- 0.007889f, 0.025772f, 0.046539f, 0.070312f, 0.097168f, 0.128540f, 0.162354f, 0.200195f,
- 0.239868f, 0.281738f, 0.325195f, 0.368896f, 0.411621f, 0.453125f, 0.493652f, 0.531738f,
- 0.566406f, 0.601074f, 0.631836f, 0.659668f, 0.687988f, 0.709961f, 0.732422f, 0.753418f,
- 0.770996f, 0.788086f, 0.804199f, 0.818359f, 0.831543f, 0.843750f, 0.854492f, 0.864746f,
- 0.873535f, 0.882812f, 0.890137f, 0.898438f, 0.905273f, 0.912598f, 0.917969f, 0.923828f,
- 0.929199f, 0.934570f, 0.938477f, 0.942871f, 0.948242f, 0.951660f, 0.955078f, 0.958496f,
- 0.961914f, 0.965332f, 0.968262f, 0.971680f, 0.973633f, 0.976562f, 0.979492f, 0.981445f,
- 0.983398f, 0.985352f, 0.993164f, 0.993164f, 0.992676f, 0.991699f, 0.991211f, 0.990234f,
- 0.006332f, 0.020325f, 0.036438f, 0.055573f, 0.077026f, 0.101562f, 0.129028f, 0.160278f,
- 0.194458f, 0.230347f, 0.268555f, 0.309326f, 0.350830f, 0.391846f, 0.432373f, 0.472412f,
- 0.509277f, 0.545410f, 0.579102f, 0.611816f, 0.640625f, 0.668945f, 0.693848f, 0.716797f,
- 0.739258f, 0.758789f, 0.775879f, 0.793945f, 0.807617f, 0.821777f, 0.834961f, 0.846680f,
- 0.857422f, 0.867676f, 0.877441f, 0.885742f, 0.893555f, 0.900391f, 0.908203f, 0.915039f,
- 0.920898f, 0.926270f, 0.931152f, 0.937012f, 0.940918f, 0.946289f, 0.949219f, 0.954102f,
- 0.958008f, 0.960938f, 0.964355f, 0.967773f, 0.970703f, 0.973145f, 0.975586f, 0.978516f,
- 0.981445f, 0.983398f, 0.992188f, 0.992188f, 0.991699f, 0.990723f, 0.990723f, 0.989746f,
- 0.005226f, 0.016647f, 0.029556f, 0.044434f, 0.061523f, 0.081543f, 0.103760f, 0.129150f,
- 0.157837f, 0.188477f, 0.221924f, 0.257812f, 0.295654f, 0.334473f, 0.374023f, 0.412842f,
- 0.451904f, 0.489990f, 0.525391f, 0.560059f, 0.593262f, 0.623047f, 0.651855f, 0.678223f,
- 0.702148f, 0.725098f, 0.745605f, 0.764160f, 0.781738f, 0.799316f, 0.812500f, 0.827148f,
- 0.838867f, 0.851074f, 0.861328f, 0.871582f, 0.880371f, 0.889648f, 0.896973f, 0.904297f,
- 0.911621f, 0.917480f, 0.923340f, 0.929688f, 0.934570f, 0.939941f, 0.943848f, 0.948242f,
- 0.951660f, 0.957031f, 0.959473f, 0.963379f, 0.966797f, 0.969727f, 0.972656f, 0.976074f,
- 0.979004f, 0.980957f, 0.991699f, 0.991211f, 0.990723f, 0.990234f, 0.989746f, 0.988770f,
- 0.004108f, 0.013542f, 0.023819f, 0.036194f, 0.050262f, 0.066223f, 0.084717f, 0.104797f,
- 0.128174f, 0.153809f, 0.182861f, 0.213989f, 0.247437f, 0.282471f, 0.319580f, 0.357422f,
- 0.395508f, 0.433350f, 0.470947f, 0.506348f, 0.542480f, 0.575684f, 0.605957f, 0.635254f,
- 0.662109f, 0.687988f, 0.711426f, 0.732910f, 0.753418f, 0.771973f, 0.789062f, 0.804688f,
- 0.819336f, 0.831543f, 0.843750f, 0.855469f, 0.866211f, 0.875488f, 0.884766f, 0.893066f,
- 0.901367f, 0.907715f, 0.914062f, 0.921387f, 0.927246f, 0.932129f, 0.937012f, 0.942383f,
- 0.946777f, 0.951660f, 0.956055f, 0.959473f, 0.962891f, 0.966309f, 0.969238f, 0.972168f,
- 0.975098f, 0.978027f, 0.989746f, 0.990234f, 0.990234f, 0.989258f, 0.989258f, 0.988281f,
- 0.003597f, 0.011330f, 0.020065f, 0.029938f, 0.041412f, 0.054504f, 0.068970f, 0.086182f,
- 0.105469f, 0.126709f, 0.151123f, 0.177612f, 0.206909f, 0.237915f, 0.271484f, 0.305664f,
- 0.342529f, 0.378906f, 0.416748f, 0.453125f, 0.489502f, 0.524414f, 0.558105f, 0.589844f,
- 0.619629f, 0.646973f, 0.673828f, 0.698242f, 0.721191f, 0.742676f, 0.761230f, 0.778809f,
- 0.796387f, 0.810547f, 0.824707f, 0.837891f, 0.850098f, 0.861328f, 0.871094f, 0.881348f,
- 0.889648f, 0.896973f, 0.904785f, 0.912109f, 0.919434f, 0.924316f, 0.931152f, 0.936523f,
- 0.941895f, 0.946289f, 0.951172f, 0.955078f, 0.959473f, 0.962402f, 0.965820f, 0.969238f,
- 0.972656f, 0.975586f, 0.988770f, 0.989258f, 0.989258f, 0.988770f, 0.987793f, 0.987305f,
- 0.002836f, 0.009857f, 0.016693f, 0.025208f, 0.034668f, 0.045288f, 0.057617f, 0.071106f,
- 0.087463f, 0.104858f, 0.125000f, 0.147461f, 0.172119f, 0.199829f, 0.229248f, 0.260742f,
- 0.294434f, 0.329102f, 0.365479f, 0.400879f, 0.437012f, 0.472656f, 0.508301f, 0.541992f,
- 0.574219f, 0.604980f, 0.634766f, 0.660645f, 0.686523f, 0.709473f, 0.731445f, 0.751953f,
- 0.770996f, 0.789062f, 0.804199f, 0.817871f, 0.832520f, 0.844727f, 0.856445f, 0.867188f,
- 0.876953f, 0.886719f, 0.895020f, 0.902832f, 0.909668f, 0.916504f, 0.923340f, 0.929688f,
- 0.935547f, 0.939941f, 0.944824f, 0.949707f, 0.954102f, 0.958496f, 0.961914f, 0.965820f,
- 0.969238f, 0.972656f, 0.987793f, 0.988281f, 0.988281f, 0.987793f, 0.986816f, 0.986328f,
- 0.002541f, 0.008118f, 0.014244f, 0.021194f, 0.029480f, 0.037811f, 0.048584f, 0.060028f,
- 0.073242f, 0.088196f, 0.104370f, 0.123047f, 0.144531f, 0.167114f, 0.193237f, 0.220947f,
- 0.250977f, 0.282227f, 0.316162f, 0.351074f, 0.386719f, 0.422119f, 0.457520f, 0.492432f,
- 0.526367f, 0.559082f, 0.590332f, 0.621094f, 0.648438f, 0.674316f, 0.698730f, 0.721191f,
- 0.742188f, 0.762207f, 0.780762f, 0.797363f, 0.812500f, 0.826172f, 0.840332f, 0.852051f,
- 0.863770f, 0.873535f, 0.883301f, 0.892090f, 0.900391f, 0.908203f, 0.915039f, 0.922363f,
- 0.928711f, 0.933594f, 0.939453f, 0.944824f, 0.950195f, 0.953125f, 0.958008f, 0.962402f,
- 0.965332f, 0.969238f, 0.986816f, 0.987305f, 0.986816f, 0.986328f, 0.985840f, 0.984863f,
- 0.002115f, 0.007030f, 0.012138f, 0.017944f, 0.024521f, 0.032318f, 0.040955f, 0.050476f,
- 0.061676f, 0.073914f, 0.087769f, 0.103271f, 0.121033f, 0.140747f, 0.162598f, 0.187256f,
- 0.213379f, 0.242065f, 0.272705f, 0.305176f, 0.338623f, 0.373047f, 0.408691f, 0.443848f,
- 0.478760f, 0.512695f, 0.545898f, 0.577637f, 0.607910f, 0.636719f, 0.663086f, 0.688965f,
- 0.712402f, 0.734863f, 0.754395f, 0.774414f, 0.791016f, 0.806641f, 0.822266f, 0.835449f,
- 0.848145f, 0.859863f, 0.870605f, 0.880371f, 0.890137f, 0.898438f, 0.906250f, 0.914551f,
- 0.921387f, 0.926758f, 0.933594f, 0.938965f, 0.944336f, 0.949219f, 0.954102f, 0.958984f,
- 0.961914f, 0.965820f, 0.985840f, 0.986328f, 0.985840f, 0.985352f, 0.985352f, 0.984375f,
- 0.001999f, 0.006226f, 0.010384f, 0.015594f, 0.021027f, 0.027435f, 0.034637f, 0.042969f,
- 0.052124f, 0.062469f, 0.074097f, 0.087646f, 0.102173f, 0.119141f, 0.137695f, 0.158203f,
- 0.181396f, 0.206543f, 0.233643f, 0.263184f, 0.295166f, 0.327148f, 0.360596f, 0.395264f,
- 0.430420f, 0.464600f, 0.499023f, 0.532227f, 0.564941f, 0.595703f, 0.625000f, 0.651855f,
- 0.679199f, 0.703613f, 0.726074f, 0.747559f, 0.766602f, 0.784668f, 0.801758f, 0.816895f,
- 0.831055f, 0.843750f, 0.856934f, 0.867188f, 0.878418f, 0.887207f, 0.896484f, 0.904785f,
- 0.913086f, 0.919922f, 0.926270f, 0.932617f, 0.938477f, 0.944336f, 0.949707f, 0.953613f,
- 0.958496f, 0.962891f, 0.983887f, 0.984863f, 0.984863f, 0.984375f, 0.983887f, 0.983398f,
- 0.001891f, 0.004959f, 0.009300f, 0.013786f, 0.018433f, 0.023560f, 0.029892f, 0.037018f,
- 0.044586f, 0.053284f, 0.062805f, 0.074341f, 0.086975f, 0.100586f, 0.116760f, 0.133789f,
- 0.154175f, 0.176025f, 0.200317f, 0.226318f, 0.254395f, 0.284424f, 0.316650f, 0.349365f,
- 0.383301f, 0.418213f, 0.452393f, 0.487061f, 0.520508f, 0.553223f, 0.584473f, 0.613770f,
- 0.643066f, 0.668945f, 0.695312f, 0.718262f, 0.740234f, 0.761230f, 0.778809f, 0.797363f,
- 0.812988f, 0.827148f, 0.840332f, 0.854004f, 0.865723f, 0.875977f, 0.886230f, 0.895020f,
- 0.904297f, 0.912598f, 0.919922f, 0.926270f, 0.932617f, 0.938965f, 0.943359f, 0.949219f,
- 0.955078f, 0.958984f, 0.982422f, 0.983887f, 0.983398f, 0.982910f, 0.982910f, 0.981934f,
- 0.001368f, 0.004715f, 0.008041f, 0.011948f, 0.016235f, 0.020889f, 0.025848f, 0.031921f,
- 0.038391f, 0.045563f, 0.054108f, 0.063477f, 0.074036f, 0.085815f, 0.099304f, 0.114563f,
- 0.131104f, 0.150146f, 0.170654f, 0.193970f, 0.219360f, 0.246338f, 0.275146f, 0.306396f,
- 0.338867f, 0.372559f, 0.406494f, 0.440918f, 0.474609f, 0.508789f, 0.541992f, 0.574219f,
- 0.604492f, 0.634277f, 0.661133f, 0.687500f, 0.710938f, 0.733887f, 0.754883f, 0.774414f,
- 0.792480f, 0.809570f, 0.824707f, 0.838379f, 0.852051f, 0.862793f, 0.874023f, 0.885254f,
- 0.895020f, 0.903320f, 0.912109f, 0.919434f, 0.926758f, 0.932617f, 0.939941f, 0.945312f,
- 0.951172f, 0.955078f, 0.980957f, 0.982910f, 0.982422f, 0.982422f, 0.981445f, 0.981445f,
- 0.001393f, 0.004227f, 0.007011f, 0.010323f, 0.014107f, 0.018234f, 0.022766f, 0.027649f,
- 0.032898f, 0.039581f, 0.046539f, 0.054230f, 0.063293f, 0.073608f, 0.085144f, 0.097961f,
- 0.112305f, 0.127930f, 0.146362f, 0.166260f, 0.188599f, 0.212524f, 0.238647f, 0.266846f,
- 0.297363f, 0.328369f, 0.361816f, 0.395752f, 0.429932f, 0.464844f, 0.498535f, 0.531250f,
- 0.564453f, 0.596191f, 0.625488f, 0.653320f, 0.680176f, 0.704590f, 0.728027f, 0.750977f,
- 0.770020f, 0.788574f, 0.805176f, 0.821289f, 0.835449f, 0.849609f, 0.862793f, 0.874023f,
- 0.884277f, 0.894043f, 0.903320f, 0.911621f, 0.919434f, 0.926758f, 0.933594f, 0.939453f,
- 0.945312f, 0.951172f, 0.979492f, 0.980957f, 0.980957f, 0.980957f, 0.980469f, 0.979980f,
- 0.001163f, 0.003527f, 0.006229f, 0.009323f, 0.012199f, 0.015808f, 0.019928f, 0.024200f,
- 0.028870f, 0.033997f, 0.040161f, 0.046967f, 0.054871f, 0.063477f, 0.073181f, 0.083618f,
- 0.096252f, 0.109863f, 0.125122f, 0.142334f, 0.161743f, 0.182739f, 0.206421f, 0.232300f,
- 0.259277f, 0.288086f, 0.320068f, 0.352783f, 0.386475f, 0.420410f, 0.454590f, 0.489258f,
- 0.521973f, 0.555176f, 0.586914f, 0.617188f, 0.646484f, 0.673828f, 0.699707f, 0.723633f,
- 0.746094f, 0.766113f, 0.785645f, 0.803223f, 0.819336f, 0.834961f, 0.848633f, 0.861328f,
- 0.873535f, 0.884766f, 0.893555f, 0.903809f, 0.911621f, 0.920410f, 0.928223f, 0.934082f,
- 0.939941f, 0.946777f, 0.978027f, 0.979492f, 0.979492f, 0.979004f, 0.979004f, 0.978516f,
- 0.000981f, 0.002987f, 0.005329f, 0.008186f, 0.010895f, 0.013832f, 0.017532f, 0.021149f,
- 0.025253f, 0.029999f, 0.035034f, 0.040985f, 0.047485f, 0.054993f, 0.063049f, 0.072510f,
- 0.082581f, 0.094421f, 0.107727f, 0.122498f, 0.138794f, 0.157471f, 0.178467f, 0.200562f,
- 0.225586f, 0.251953f, 0.281250f, 0.311279f, 0.343750f, 0.377197f, 0.411621f, 0.445557f,
- 0.479736f, 0.513672f, 0.546875f, 0.579590f, 0.610352f, 0.640625f, 0.668457f, 0.694336f,
- 0.718750f, 0.742188f, 0.762695f, 0.782715f, 0.801270f, 0.817871f, 0.833496f, 0.847168f,
- 0.860840f, 0.872559f, 0.884277f, 0.894531f, 0.904297f, 0.912598f, 0.920898f, 0.928711f,
- 0.935547f, 0.942383f, 0.976074f, 0.978027f, 0.978516f, 0.978027f, 0.977539f, 0.977051f,
- 0.000880f, 0.002707f, 0.005089f, 0.007305f, 0.010147f, 0.012596f, 0.015160f, 0.018616f,
- 0.022507f, 0.026230f, 0.030777f, 0.035767f, 0.041351f, 0.047455f, 0.054565f, 0.062256f,
- 0.071289f, 0.081299f, 0.092346f, 0.105408f, 0.119812f, 0.135620f, 0.153320f, 0.173462f,
- 0.195068f, 0.219482f, 0.245361f, 0.273682f, 0.303711f, 0.335938f, 0.368896f, 0.402588f,
- 0.437500f, 0.472168f, 0.505859f, 0.539551f, 0.573242f, 0.604492f, 0.634766f, 0.663086f,
- 0.689453f, 0.714844f, 0.738770f, 0.760254f, 0.780762f, 0.799316f, 0.817383f, 0.833496f,
- 0.847168f, 0.860840f, 0.873535f, 0.884766f, 0.895508f, 0.905273f, 0.914062f, 0.922363f,
- 0.930176f, 0.937012f, 0.974609f, 0.976074f, 0.976074f, 0.976562f, 0.976074f, 0.975586f,
- 0.000851f, 0.002659f, 0.004692f, 0.006466f, 0.008545f, 0.011055f, 0.013649f, 0.016403f,
- 0.019714f, 0.023056f, 0.026962f, 0.031235f, 0.035828f, 0.041656f, 0.047699f, 0.054077f,
- 0.061859f, 0.070496f, 0.080200f, 0.091125f, 0.103088f, 0.116882f, 0.132446f, 0.149780f,
- 0.168701f, 0.190430f, 0.213379f, 0.239258f, 0.267334f, 0.296631f, 0.328369f, 0.360840f,
- 0.395020f, 0.429932f, 0.464355f, 0.499512f, 0.533203f, 0.566406f, 0.599121f, 0.629883f,
- 0.658203f, 0.687012f, 0.712402f, 0.735840f, 0.758789f, 0.779297f, 0.798828f, 0.816406f,
- 0.832520f, 0.847168f, 0.861328f, 0.874023f, 0.886230f, 0.896973f, 0.907227f, 0.915527f,
- 0.924805f, 0.931641f, 0.972168f, 0.975586f, 0.975586f, 0.974609f, 0.974121f, 0.973633f,
- 0.000762f, 0.002214f, 0.004040f, 0.005859f, 0.007790f, 0.009689f, 0.012161f, 0.014786f,
- 0.017441f, 0.020493f, 0.023956f, 0.027618f, 0.031860f, 0.036255f, 0.041595f, 0.047394f,
- 0.053894f, 0.061188f, 0.069214f, 0.078735f, 0.089050f, 0.101135f, 0.114441f, 0.129150f,
- 0.145874f, 0.164673f, 0.185303f, 0.208862f, 0.233765f, 0.260742f, 0.290283f, 0.321045f,
- 0.354248f, 0.388184f, 0.422607f, 0.457764f, 0.493652f, 0.526855f, 0.561523f, 0.594238f,
- 0.625977f, 0.655273f, 0.683594f, 0.710449f, 0.734863f, 0.758301f, 0.779297f, 0.798828f,
- 0.817383f, 0.833984f, 0.848145f, 0.862793f, 0.875488f, 0.887207f, 0.899414f, 0.908691f,
- 0.917969f, 0.926270f, 0.970215f, 0.972656f, 0.974121f, 0.973145f, 0.972656f, 0.972168f,
- 0.000732f, 0.001928f, 0.003513f, 0.005234f, 0.007042f, 0.008629f, 0.010620f, 0.012985f,
- 0.015244f, 0.018158f, 0.020935f, 0.024475f, 0.027908f, 0.032013f, 0.036316f, 0.041290f,
- 0.046661f, 0.053040f, 0.060089f, 0.068115f, 0.077087f, 0.087463f, 0.099121f, 0.111633f,
- 0.126221f, 0.142578f, 0.160767f, 0.181396f, 0.203003f, 0.228149f, 0.255127f, 0.284180f,
- 0.315186f, 0.347900f, 0.381836f, 0.416748f, 0.451904f, 0.487549f, 0.522949f, 0.556641f,
- 0.590332f, 0.623047f, 0.652832f, 0.682129f, 0.708984f, 0.733887f, 0.757324f, 0.779785f,
- 0.799316f, 0.818359f, 0.835449f, 0.850586f, 0.865234f, 0.877441f, 0.890137f, 0.901367f,
- 0.912109f, 0.920410f, 0.968262f, 0.970703f, 0.971191f, 0.970703f, 0.971191f, 0.971191f,
- 0.000524f, 0.001758f, 0.003185f, 0.004864f, 0.006081f, 0.007820f, 0.009705f, 0.011467f,
- 0.013634f, 0.016068f, 0.018707f, 0.021378f, 0.024597f, 0.028030f, 0.032135f, 0.036224f,
- 0.041016f, 0.046692f, 0.052399f, 0.059265f, 0.067505f, 0.076050f, 0.085510f, 0.096558f,
- 0.109253f, 0.123657f, 0.138794f, 0.157227f, 0.176880f, 0.198730f, 0.223267f, 0.250000f,
- 0.278809f, 0.309326f, 0.342041f, 0.375977f, 0.410889f, 0.447021f, 0.483154f, 0.518555f,
- 0.554199f, 0.586914f, 0.620117f, 0.650879f, 0.681641f, 0.708496f, 0.734375f, 0.757324f,
- 0.780762f, 0.801270f, 0.819336f, 0.837891f, 0.852539f, 0.867188f, 0.880371f, 0.893066f,
- 0.903809f, 0.914551f, 0.966309f, 0.968750f, 0.969238f, 0.969727f, 0.968750f, 0.968750f,
- 0.000503f, 0.001896f, 0.002653f, 0.004128f, 0.005627f, 0.007004f, 0.008797f, 0.010361f,
- 0.012230f, 0.014175f, 0.016647f, 0.019348f, 0.021454f, 0.024872f, 0.028290f, 0.031830f,
- 0.036163f, 0.040649f, 0.045715f, 0.051941f, 0.058319f, 0.065979f, 0.074402f, 0.083618f,
- 0.094360f, 0.106812f, 0.120239f, 0.135742f, 0.153320f, 0.172974f, 0.194824f, 0.218506f,
- 0.245117f, 0.273926f, 0.304688f, 0.336426f, 0.371094f, 0.406982f, 0.442627f, 0.479492f,
- 0.514648f, 0.550781f, 0.584961f, 0.618652f, 0.650879f, 0.681152f, 0.709473f, 0.735352f,
- 0.760742f, 0.782715f, 0.803711f, 0.821777f, 0.838867f, 0.855957f, 0.870605f, 0.884277f,
- 0.895996f, 0.906738f, 0.964355f, 0.966309f, 0.967285f, 0.966797f, 0.966309f, 0.966309f,
- 0.000636f, 0.001421f, 0.002768f, 0.003761f, 0.004944f, 0.006462f, 0.007889f, 0.009262f,
- 0.010780f, 0.013000f, 0.014946f, 0.017029f, 0.019516f, 0.022049f, 0.024933f, 0.028091f,
- 0.031616f, 0.035553f, 0.040161f, 0.045380f, 0.051239f, 0.057281f, 0.064270f, 0.072693f,
- 0.081970f, 0.092468f, 0.104736f, 0.117859f, 0.132690f, 0.150391f, 0.169189f, 0.190796f,
- 0.214233f, 0.240601f, 0.268555f, 0.299561f, 0.332520f, 0.367188f, 0.402344f, 0.438965f,
- 0.476074f, 0.512695f, 0.549805f, 0.584473f, 0.619141f, 0.651367f, 0.681152f, 0.709961f,
- 0.737305f, 0.762695f, 0.785156f, 0.806641f, 0.826172f, 0.843262f, 0.859375f, 0.874023f,
- 0.888184f, 0.900391f, 0.961426f, 0.964355f, 0.965332f, 0.964844f, 0.964355f, 0.964844f,
- 0.000295f, 0.001419f, 0.002342f, 0.003471f, 0.004539f, 0.005821f, 0.006882f, 0.008354f,
- 0.010155f, 0.011574f, 0.013283f, 0.015129f, 0.017090f, 0.019333f, 0.022125f, 0.024643f,
- 0.028122f, 0.031586f, 0.035522f, 0.039825f, 0.044586f, 0.050110f, 0.056091f, 0.063354f,
- 0.071045f, 0.080078f, 0.090637f, 0.102112f, 0.115479f, 0.130127f, 0.147217f, 0.165649f,
- 0.186768f, 0.210571f, 0.236694f, 0.265137f, 0.295654f, 0.328857f, 0.363770f, 0.399902f,
- 0.436523f, 0.474365f, 0.511230f, 0.548828f, 0.584961f, 0.619141f, 0.652344f, 0.684082f,
- 0.712891f, 0.741211f, 0.766113f, 0.789062f, 0.810547f, 0.830078f, 0.848633f, 0.864258f,
- 0.879395f, 0.892578f, 0.958496f, 0.962402f, 0.962402f, 0.962402f, 0.961914f, 0.962402f,
- 0.000464f, 0.001313f, 0.002159f, 0.003134f, 0.004463f, 0.005001f, 0.006466f, 0.007595f,
- 0.008842f, 0.010277f, 0.011971f, 0.013550f, 0.015434f, 0.017242f, 0.019348f, 0.021805f,
- 0.024734f, 0.027817f, 0.031174f, 0.034821f, 0.039124f, 0.043823f, 0.049164f, 0.055237f,
- 0.062164f, 0.069336f, 0.078430f, 0.088501f, 0.099976f, 0.112854f, 0.127319f, 0.143555f,
- 0.162354f, 0.183350f, 0.207031f, 0.233032f, 0.260986f, 0.291992f, 0.325195f, 0.361084f,
- 0.397217f, 0.435059f, 0.473389f, 0.510742f, 0.549316f, 0.586426f, 0.620605f, 0.654785f,
- 0.686523f, 0.716797f, 0.744629f, 0.769043f, 0.793945f, 0.815918f, 0.834961f, 0.852539f,
- 0.869141f, 0.884277f, 0.955078f, 0.959473f, 0.959473f, 0.959473f, 0.959961f, 0.959961f,
- 0.000541f, 0.001223f, 0.002172f, 0.002886f, 0.003679f, 0.004681f, 0.005512f, 0.006683f,
- 0.008049f, 0.009346f, 0.010704f, 0.012024f, 0.013626f, 0.015213f, 0.017227f, 0.019516f,
- 0.022079f, 0.024612f, 0.027313f, 0.030731f, 0.034180f, 0.038239f, 0.042969f, 0.048187f,
- 0.053864f, 0.060516f, 0.068298f, 0.076843f, 0.086670f, 0.097473f, 0.110107f, 0.124268f,
- 0.140869f, 0.159302f, 0.180420f, 0.203613f, 0.229614f, 0.258057f, 0.289062f, 0.323486f,
- 0.358398f, 0.395996f, 0.434082f, 0.472900f, 0.511719f, 0.550293f, 0.587402f, 0.624023f,
- 0.658203f, 0.690918f, 0.721191f, 0.749512f, 0.774902f, 0.799316f, 0.821289f, 0.840820f,
- 0.859375f, 0.875488f, 0.952637f, 0.956543f, 0.957520f, 0.957520f, 0.957520f, 0.957031f,
- 0.000252f, 0.001056f, 0.001923f, 0.002523f, 0.003414f, 0.003960f, 0.005146f, 0.006172f,
- 0.007130f, 0.008179f, 0.009567f, 0.010735f, 0.012077f, 0.013878f, 0.015640f, 0.017456f,
- 0.019638f, 0.021622f, 0.024170f, 0.026978f, 0.030121f, 0.033630f, 0.037445f, 0.042053f,
- 0.047119f, 0.052826f, 0.059174f, 0.066711f, 0.075012f, 0.084473f, 0.095276f, 0.107727f,
- 0.122070f, 0.138184f, 0.156250f, 0.177246f, 0.200928f, 0.226929f, 0.255371f, 0.286865f,
- 0.321289f, 0.356934f, 0.395264f, 0.434326f, 0.473877f, 0.514160f, 0.553711f, 0.591797f,
- 0.628418f, 0.663574f, 0.696777f, 0.728027f, 0.755859f, 0.782715f, 0.806152f, 0.829102f,
- 0.847656f, 0.867188f, 0.949707f, 0.954102f, 0.954590f, 0.954590f, 0.954102f, 0.954590f,
- 0.000365f, 0.000963f, 0.001581f, 0.002337f, 0.002996f, 0.003952f, 0.004608f, 0.005459f,
- 0.006489f, 0.007351f, 0.008484f, 0.009544f, 0.011108f, 0.012413f, 0.013901f, 0.015388f,
- 0.017181f, 0.019012f, 0.021439f, 0.023727f, 0.026520f, 0.029449f, 0.032898f, 0.036835f,
- 0.041046f, 0.045868f, 0.051575f, 0.058075f, 0.064758f, 0.073120f, 0.082520f, 0.093079f,
- 0.105652f, 0.119385f, 0.135620f, 0.153687f, 0.174683f, 0.198364f, 0.224365f, 0.253662f,
- 0.285400f, 0.320557f, 0.357178f, 0.395752f, 0.435791f, 0.476318f, 0.516602f, 0.557129f,
- 0.596191f, 0.633789f, 0.669434f, 0.703613f, 0.734375f, 0.763672f, 0.790039f, 0.812988f,
- 0.836914f, 0.855957f, 0.946289f, 0.949707f, 0.951172f, 0.951172f, 0.951172f, 0.951172f,
- 0.000404f, 0.001028f, 0.001410f, 0.002098f, 0.002657f, 0.003445f, 0.004391f, 0.005039f,
- 0.005665f, 0.006569f, 0.007549f, 0.008614f, 0.009743f, 0.011108f, 0.012390f, 0.013611f,
- 0.015396f, 0.017044f, 0.018921f, 0.020874f, 0.023453f, 0.025833f, 0.028809f, 0.032501f,
- 0.036011f, 0.040161f, 0.044952f, 0.050018f, 0.056091f, 0.063477f, 0.071533f, 0.080200f,
- 0.091064f, 0.103027f, 0.117065f, 0.133057f, 0.151489f, 0.171997f, 0.196045f, 0.222290f,
- 0.251709f, 0.284424f, 0.319824f, 0.357422f, 0.397217f, 0.438232f, 0.479492f, 0.521484f,
- 0.562500f, 0.602051f, 0.641113f, 0.677734f, 0.711914f, 0.743164f, 0.772461f, 0.799316f,
- 0.822754f, 0.845215f, 0.942383f, 0.946777f, 0.947754f, 0.947754f, 0.948242f, 0.948242f,
- 0.000406f, 0.000992f, 0.001447f, 0.001986f, 0.002499f, 0.003149f, 0.003769f, 0.004272f,
- 0.005016f, 0.005981f, 0.006924f, 0.007675f, 0.008766f, 0.009727f, 0.010765f, 0.011986f,
- 0.013588f, 0.014915f, 0.016724f, 0.018478f, 0.020508f, 0.022873f, 0.025497f, 0.028336f,
- 0.031525f, 0.034882f, 0.038818f, 0.043243f, 0.048615f, 0.054626f, 0.061707f, 0.069214f,
- 0.078430f, 0.089111f, 0.101013f, 0.115112f, 0.130859f, 0.148926f, 0.170166f, 0.193604f,
- 0.220947f, 0.250732f, 0.283936f, 0.320068f, 0.358887f, 0.400391f, 0.442139f, 0.483887f,
- 0.527344f, 0.569824f, 0.610352f, 0.649414f, 0.686523f, 0.722168f, 0.753906f, 0.782227f,
- 0.809570f, 0.833496f, 0.938477f, 0.942871f, 0.944824f, 0.944336f, 0.943848f, 0.943848f,
- 0.000235f, 0.000984f, 0.001204f, 0.001706f, 0.002239f, 0.002998f, 0.003462f, 0.004093f,
- 0.004372f, 0.005371f, 0.006149f, 0.006962f, 0.007736f, 0.008766f, 0.009804f, 0.010780f,
- 0.011887f, 0.013336f, 0.014618f, 0.016159f, 0.018158f, 0.020050f, 0.022232f, 0.024597f,
- 0.027313f, 0.030334f, 0.033752f, 0.037872f, 0.042389f, 0.047516f, 0.053192f, 0.059937f,
- 0.067749f, 0.076599f, 0.086975f, 0.098755f, 0.112610f, 0.128662f, 0.146973f, 0.168091f,
- 0.192383f, 0.220215f, 0.250732f, 0.284668f, 0.322021f, 0.361572f, 0.403564f, 0.446777f,
- 0.490723f, 0.534668f, 0.577637f, 0.619629f, 0.660156f, 0.697754f, 0.731934f, 0.764648f,
- 0.794922f, 0.820312f, 0.934082f, 0.939453f, 0.939941f, 0.941406f, 0.940430f, 0.940918f,
- 0.000237f, 0.000591f, 0.001098f, 0.001619f, 0.002241f, 0.002636f, 0.003176f, 0.003521f,
- 0.004101f, 0.004631f, 0.005398f, 0.006378f, 0.007000f, 0.007767f, 0.008713f, 0.009758f,
- 0.010475f, 0.011734f, 0.013016f, 0.014404f, 0.015762f, 0.017517f, 0.019440f, 0.021469f,
- 0.023651f, 0.026199f, 0.029495f, 0.033112f, 0.036499f, 0.040955f, 0.045959f, 0.051849f,
- 0.058197f, 0.065552f, 0.074585f, 0.085022f, 0.096680f, 0.110535f, 0.126709f, 0.145264f,
- 0.166626f, 0.191406f, 0.219482f, 0.250488f, 0.286133f, 0.323975f, 0.365723f, 0.408447f,
- 0.453125f, 0.498779f, 0.542969f, 0.588379f, 0.631836f, 0.671387f, 0.709473f, 0.745117f,
- 0.777344f, 0.807617f, 0.930176f, 0.935059f, 0.936523f, 0.936523f, 0.936523f, 0.936035f,
- 0.000242f, 0.000761f, 0.000943f, 0.001624f, 0.001858f, 0.002390f, 0.002638f, 0.003054f,
- 0.003805f, 0.004559f, 0.005035f, 0.005493f, 0.006157f, 0.006878f, 0.007687f, 0.008530f,
- 0.009178f, 0.010406f, 0.011406f, 0.012520f, 0.014053f, 0.015579f, 0.017105f, 0.018661f,
- 0.020737f, 0.022903f, 0.025650f, 0.028259f, 0.031433f, 0.035065f, 0.039581f, 0.044342f,
- 0.049988f, 0.056366f, 0.064026f, 0.072632f, 0.082825f, 0.094666f, 0.108582f, 0.124634f,
- 0.143799f, 0.165405f, 0.190796f, 0.219360f, 0.251953f, 0.287842f, 0.328125f, 0.370605f,
- 0.415283f, 0.461670f, 0.507812f, 0.555176f, 0.600586f, 0.645020f, 0.685547f, 0.724121f,
- 0.759277f, 0.792969f, 0.924805f, 0.931152f, 0.931641f, 0.932129f, 0.932129f, 0.931641f,
- 0.000240f, 0.000685f, 0.000955f, 0.001395f, 0.001768f, 0.002157f, 0.002533f, 0.002970f,
- 0.003223f, 0.003813f, 0.004601f, 0.004993f, 0.005428f, 0.005981f, 0.006878f, 0.007484f,
- 0.008110f, 0.009132f, 0.009964f, 0.011208f, 0.012138f, 0.013374f, 0.015099f, 0.016190f,
- 0.018112f, 0.020187f, 0.022202f, 0.024780f, 0.027573f, 0.030411f, 0.034119f, 0.037964f,
- 0.042755f, 0.048553f, 0.054474f, 0.061890f, 0.070984f, 0.080688f, 0.092590f, 0.106812f,
- 0.123291f, 0.142456f, 0.164551f, 0.190430f, 0.220459f, 0.253418f, 0.291504f, 0.332520f,
- 0.376709f, 0.423340f, 0.471436f, 0.520508f, 0.567383f, 0.614746f, 0.660156f, 0.702148f,
- 0.741211f, 0.776367f, 0.920410f, 0.925293f, 0.926270f, 0.926758f, 0.927246f, 0.926758f,
- 0.000244f, 0.000431f, 0.000799f, 0.001309f, 0.001587f, 0.001945f, 0.002317f, 0.002514f,
- 0.003290f, 0.003548f, 0.004082f, 0.004349f, 0.004707f, 0.005348f, 0.006027f, 0.006565f,
- 0.007141f, 0.008011f, 0.008850f, 0.009552f, 0.010757f, 0.011650f, 0.012794f, 0.014145f,
- 0.015778f, 0.017303f, 0.019028f, 0.021088f, 0.023575f, 0.026169f, 0.029175f, 0.032562f,
- 0.036713f, 0.041382f, 0.046448f, 0.052948f, 0.060303f, 0.068787f, 0.079041f, 0.090942f,
- 0.105103f, 0.121643f, 0.141113f, 0.164185f, 0.190308f, 0.221191f, 0.256836f, 0.295898f,
- 0.339355f, 0.385010f, 0.433838f, 0.484619f, 0.534668f, 0.583496f, 0.631348f, 0.678223f,
- 0.719727f, 0.759766f, 0.913574f, 0.920410f, 0.921387f, 0.921875f, 0.921875f, 0.921387f,
- 0.000243f, 0.000496f, 0.000847f, 0.001157f, 0.001426f, 0.001634f, 0.002020f, 0.002338f,
- 0.002607f, 0.003035f, 0.003502f, 0.003872f, 0.004459f, 0.004726f, 0.005402f, 0.005779f,
- 0.006325f, 0.007095f, 0.007767f, 0.008568f, 0.009331f, 0.010086f, 0.011009f, 0.012314f,
- 0.013611f, 0.015060f, 0.016312f, 0.018158f, 0.020401f, 0.022476f, 0.024979f, 0.027863f,
- 0.031036f, 0.034943f, 0.039581f, 0.044830f, 0.050903f, 0.058289f, 0.066895f, 0.076782f,
- 0.088989f, 0.103210f, 0.120422f, 0.140259f, 0.164185f, 0.191772f, 0.223877f, 0.260742f,
- 0.301758f, 0.347168f, 0.395508f, 0.446533f, 0.497803f, 0.551270f, 0.601562f, 0.651855f,
- 0.697754f, 0.741211f, 0.908203f, 0.915039f, 0.916016f, 0.916016f, 0.916504f, 0.915527f,
- 0.000239f, 0.000345f, 0.000690f, 0.000913f, 0.001250f, 0.001343f, 0.001579f, 0.002050f,
- 0.002331f, 0.002861f, 0.003048f, 0.003616f, 0.003696f, 0.004211f, 0.004723f, 0.005074f,
- 0.005657f, 0.006100f, 0.006893f, 0.007290f, 0.008118f, 0.008659f, 0.009552f, 0.010704f,
- 0.011681f, 0.012764f, 0.014114f, 0.015533f, 0.017227f, 0.018982f, 0.021286f, 0.023560f,
- 0.026489f, 0.029861f, 0.033417f, 0.037933f, 0.043121f, 0.049286f, 0.056519f, 0.065002f,
- 0.075073f, 0.087158f, 0.101624f, 0.118835f, 0.139648f, 0.164185f, 0.193481f, 0.226929f,
- 0.265625f, 0.309570f, 0.356934f, 0.408203f, 0.461426f, 0.516113f, 0.569824f, 0.623047f,
- 0.674316f, 0.720703f, 0.902344f, 0.908203f, 0.909668f, 0.910645f, 0.910645f, 0.911133f,
- 0.000000f, 0.000281f, 0.000560f, 0.000977f, 0.001063f, 0.001171f, 0.001569f, 0.001903f,
- 0.002075f, 0.002413f, 0.002695f, 0.003004f, 0.003399f, 0.003553f, 0.003998f, 0.004333f,
- 0.004971f, 0.005314f, 0.005806f, 0.006340f, 0.007015f, 0.007492f, 0.008377f, 0.009186f,
- 0.010094f, 0.010910f, 0.012199f, 0.013351f, 0.014618f, 0.016266f, 0.018082f, 0.019852f,
- 0.022491f, 0.025085f, 0.028168f, 0.031799f, 0.036041f, 0.041107f, 0.047394f, 0.054321f,
- 0.062866f, 0.073181f, 0.085327f, 0.100525f, 0.118408f, 0.139648f, 0.165527f, 0.196411f,
- 0.231812f, 0.273193f, 0.318848f, 0.369629f, 0.423828f, 0.480225f, 0.536621f, 0.592773f,
- 0.647949f, 0.699707f, 0.894043f, 0.900879f, 0.903809f, 0.903320f, 0.903320f, 0.902832f,
- 0.000232f, 0.000227f, 0.000555f, 0.000656f, 0.000937f, 0.000985f, 0.001351f, 0.001723f,
- 0.001925f, 0.002010f, 0.002445f, 0.002625f, 0.002760f, 0.003220f, 0.003551f, 0.003870f,
- 0.004303f, 0.004826f, 0.005028f, 0.005451f, 0.005985f, 0.006523f, 0.007000f, 0.007744f,
- 0.008499f, 0.009361f, 0.010109f, 0.011185f, 0.012413f, 0.013603f, 0.015121f, 0.016891f,
- 0.018753f, 0.020920f, 0.023407f, 0.026764f, 0.030197f, 0.034302f, 0.039429f, 0.044891f,
- 0.052368f, 0.060822f, 0.071167f, 0.083557f, 0.098877f, 0.117493f, 0.139893f, 0.167725f,
- 0.200195f, 0.238037f, 0.281982f, 0.331543f, 0.385010f, 0.442627f, 0.501465f, 0.561523f,
- 0.620605f, 0.675781f, 0.887207f, 0.894531f, 0.895020f, 0.896484f, 0.896484f, 0.895996f,
- 0.000000f, 0.000332f, 0.000577f, 0.000723f, 0.000720f, 0.001210f, 0.001469f, 0.001456f,
- 0.001546f, 0.001775f, 0.002159f, 0.002291f, 0.002659f, 0.002916f, 0.003046f, 0.003439f,
- 0.003752f, 0.003883f, 0.004375f, 0.004635f, 0.005241f, 0.005638f, 0.006054f, 0.006630f,
- 0.007191f, 0.007744f, 0.008545f, 0.009178f, 0.010498f, 0.011536f, 0.012802f, 0.013931f,
- 0.015808f, 0.017548f, 0.019379f, 0.022110f, 0.025040f, 0.028473f, 0.032471f, 0.037323f,
- 0.043152f, 0.050476f, 0.058807f, 0.069214f, 0.082520f, 0.098145f, 0.116821f, 0.141602f,
- 0.170044f, 0.204834f, 0.245728f, 0.293213f, 0.346436f, 0.403564f, 0.464111f, 0.527832f,
- 0.589844f, 0.650879f, 0.878418f, 0.886719f, 0.888184f, 0.887695f, 0.888672f, 0.888672f,
- 0.000243f, 0.000307f, 0.000526f, 0.000561f, 0.000923f, 0.000980f, 0.001143f, 0.001386f,
- 0.001414f, 0.001683f, 0.001735f, 0.001972f, 0.002232f, 0.002481f, 0.002657f, 0.002754f,
- 0.003193f, 0.003359f, 0.003603f, 0.003956f, 0.004368f, 0.004692f, 0.005119f, 0.005596f,
- 0.005955f, 0.006634f, 0.007256f, 0.007881f, 0.008652f, 0.009552f, 0.010376f, 0.011719f,
- 0.012634f, 0.014595f, 0.016113f, 0.018219f, 0.020554f, 0.023254f, 0.026520f, 0.030502f,
- 0.035553f, 0.041168f, 0.048065f, 0.057190f, 0.067261f, 0.080811f, 0.097107f, 0.117737f,
- 0.143066f, 0.173950f, 0.211182f, 0.256592f, 0.307129f, 0.364502f, 0.427002f, 0.491943f,
- 0.557617f, 0.624023f, 0.869629f, 0.877930f, 0.879883f, 0.879883f, 0.879883f, 0.880371f,
- 0.000000f, 0.000270f, 0.000342f, 0.000509f, 0.000668f, 0.000989f, 0.000945f, 0.001105f,
- 0.001230f, 0.001335f, 0.001492f, 0.001757f, 0.001917f, 0.002140f, 0.002386f, 0.002501f,
- 0.002644f, 0.002884f, 0.003199f, 0.003441f, 0.003620f, 0.003891f, 0.004337f, 0.004631f,
- 0.005119f, 0.005520f, 0.006100f, 0.006504f, 0.007301f, 0.007771f, 0.008751f, 0.009521f,
- 0.010658f, 0.011765f, 0.013145f, 0.014641f, 0.016785f, 0.018829f, 0.021545f, 0.024719f,
- 0.028381f, 0.033203f, 0.038849f, 0.046112f, 0.055084f, 0.065552f, 0.079529f, 0.096985f,
- 0.118530f, 0.145630f, 0.179321f, 0.220337f, 0.269287f, 0.325439f, 0.387207f, 0.454102f,
- 0.524414f, 0.595215f, 0.859863f, 0.868652f, 0.870605f, 0.869629f, 0.870117f, 0.870605f,
- 0.000000f, 0.000230f, 0.000334f, 0.000416f, 0.000700f, 0.000726f, 0.000921f, 0.001008f,
- 0.001065f, 0.001186f, 0.001365f, 0.001471f, 0.001627f, 0.001796f, 0.001843f, 0.002069f,
- 0.002266f, 0.002438f, 0.002596f, 0.002831f, 0.003000f, 0.003298f, 0.003597f, 0.003887f,
- 0.004265f, 0.004581f, 0.004986f, 0.005505f, 0.005947f, 0.006454f, 0.007069f, 0.007801f,
- 0.008621f, 0.009575f, 0.010612f, 0.011848f, 0.013321f, 0.015259f, 0.017410f, 0.019775f,
- 0.022934f, 0.026550f, 0.031464f, 0.036713f, 0.043945f, 0.052887f, 0.064209f, 0.078735f,
- 0.096924f, 0.120361f, 0.149536f, 0.186768f, 0.232422f, 0.285889f, 0.347656f, 0.415527f,
- 0.488281f, 0.563965f, 0.849121f, 0.857910f, 0.859375f, 0.860840f, 0.860840f, 0.860352f,
- 0.000233f, 0.000225f, 0.000219f, 0.000431f, 0.000579f, 0.000648f, 0.000671f, 0.000744f,
- 0.000946f, 0.000994f, 0.001091f, 0.001307f, 0.001364f, 0.001490f, 0.001561f, 0.001712f,
- 0.001892f, 0.001999f, 0.002190f, 0.002369f, 0.002512f, 0.002733f, 0.003014f, 0.003145f,
- 0.003553f, 0.003822f, 0.004135f, 0.004326f, 0.004799f, 0.005344f, 0.005718f, 0.006378f,
- 0.007008f, 0.007721f, 0.008400f, 0.009537f, 0.010597f, 0.011917f, 0.013542f, 0.015579f,
- 0.018051f, 0.020889f, 0.024765f, 0.029236f, 0.034668f, 0.041779f, 0.051056f, 0.062439f,
- 0.077576f, 0.097595f, 0.122864f, 0.155273f, 0.196655f, 0.247437f, 0.307617f, 0.375977f,
- 0.450684f, 0.531250f, 0.837891f, 0.847168f, 0.848633f, 0.849609f, 0.849121f, 0.849609f,
- 0.000202f, 0.000180f, 0.000206f, 0.000339f, 0.000479f, 0.000536f, 0.000687f, 0.000739f,
- 0.000771f, 0.000849f, 0.001051f, 0.001060f, 0.001154f, 0.001219f, 0.001389f, 0.001505f,
- 0.001469f, 0.001729f, 0.001858f, 0.001980f, 0.002209f, 0.002243f, 0.002483f, 0.002695f,
- 0.002951f, 0.003149f, 0.003374f, 0.003654f, 0.004002f, 0.004154f, 0.004539f, 0.005032f,
- 0.005428f, 0.005989f, 0.006760f, 0.007549f, 0.008423f, 0.009499f, 0.010620f, 0.012016f,
- 0.013992f, 0.016434f, 0.019135f, 0.022583f, 0.026840f, 0.032501f, 0.039551f, 0.048828f,
- 0.061066f, 0.077393f, 0.098755f, 0.127075f, 0.163208f, 0.209717f, 0.267578f, 0.334961f,
- 0.411133f, 0.494629f, 0.825684f, 0.834473f, 0.836426f, 0.837402f, 0.837402f, 0.837402f,
- 0.000000f, 0.000185f, 0.000184f, 0.000404f, 0.000408f, 0.000454f, 0.000480f, 0.000506f,
- 0.000660f, 0.000694f, 0.000742f, 0.000801f, 0.000989f, 0.001111f, 0.001167f, 0.001250f,
- 0.001311f, 0.001424f, 0.001541f, 0.001574f, 0.001712f, 0.001930f, 0.001982f, 0.002201f,
- 0.002375f, 0.002439f, 0.002792f, 0.002905f, 0.003065f, 0.003412f, 0.003653f, 0.003952f,
- 0.004463f, 0.004723f, 0.005230f, 0.005936f, 0.006386f, 0.007092f, 0.008240f, 0.009247f,
- 0.010765f, 0.012344f, 0.014420f, 0.017090f, 0.020493f, 0.024551f, 0.030014f, 0.037689f,
- 0.047302f, 0.060028f, 0.077820f, 0.100830f, 0.132812f, 0.174561f, 0.228516f, 0.294434f,
- 0.371582f, 0.457031f, 0.812012f, 0.820801f, 0.823730f, 0.824219f, 0.824707f, 0.824219f,
- 0.000000f, 0.000053f, 0.000206f, 0.000360f, 0.000379f, 0.000391f, 0.000379f, 0.000478f,
- 0.000549f, 0.000589f, 0.000626f, 0.000674f, 0.000762f, 0.000832f, 0.000894f, 0.001050f,
- 0.001111f, 0.001155f, 0.001286f, 0.001345f, 0.001449f, 0.001564f, 0.001666f, 0.001750f,
- 0.001856f, 0.001925f, 0.002056f, 0.002359f, 0.002542f, 0.002728f, 0.003042f, 0.003164f,
- 0.003460f, 0.003786f, 0.004116f, 0.004578f, 0.005116f, 0.005688f, 0.006508f, 0.007229f,
- 0.008125f, 0.009232f, 0.010796f, 0.012741f, 0.015137f, 0.018158f, 0.022186f, 0.028030f,
- 0.035248f, 0.045593f, 0.059052f, 0.078308f, 0.105042f, 0.141602f, 0.190308f, 0.252930f,
- 0.329102f, 0.417969f, 0.797852f, 0.807129f, 0.810059f, 0.810547f, 0.811035f, 0.810547f,
- 0.000000f, 0.000000f, 0.000082f, 0.000195f, 0.000309f, 0.000336f, 0.000324f, 0.000414f,
- 0.000439f, 0.000460f, 0.000599f, 0.000643f, 0.000637f, 0.000690f, 0.000733f, 0.000834f,
- 0.000821f, 0.000922f, 0.000989f, 0.001067f, 0.001207f, 0.001293f, 0.001327f, 0.001476f,
- 0.001581f, 0.001663f, 0.001725f, 0.001906f, 0.001934f, 0.002180f, 0.002258f, 0.002602f,
- 0.002701f, 0.003019f, 0.003229f, 0.003502f, 0.003847f, 0.004261f, 0.004795f, 0.005318f,
- 0.006130f, 0.007008f, 0.008118f, 0.009277f, 0.011024f, 0.013229f, 0.016205f, 0.020203f,
- 0.025620f, 0.033020f, 0.043854f, 0.059021f, 0.080383f, 0.111206f, 0.154419f, 0.212646f,
- 0.287354f, 0.378418f, 0.781250f, 0.792480f, 0.793457f, 0.795410f, 0.795898f, 0.794922f,
- 0.000000f, 0.000121f, 0.000120f, 0.000198f, 0.000275f, 0.000249f, 0.000290f, 0.000360f,
- 0.000375f, 0.000379f, 0.000391f, 0.000438f, 0.000505f, 0.000534f, 0.000669f, 0.000629f,
- 0.000659f, 0.000754f, 0.000890f, 0.000833f, 0.000849f, 0.000975f, 0.001029f, 0.001117f,
- 0.001193f, 0.001203f, 0.001269f, 0.001424f, 0.001594f, 0.001675f, 0.001737f, 0.001957f,
- 0.002094f, 0.002319f, 0.002342f, 0.002609f, 0.002928f, 0.003248f, 0.003523f, 0.003967f,
- 0.004547f, 0.005138f, 0.005871f, 0.006760f, 0.007912f, 0.009430f, 0.011528f, 0.014236f,
- 0.017899f, 0.023346f, 0.031235f, 0.042694f, 0.059235f, 0.084229f, 0.120972f, 0.173950f,
- 0.245239f, 0.334473f, 0.764160f, 0.775391f, 0.777344f, 0.778809f, 0.777832f, 0.778809f,
- 0.000000f, 0.000121f, 0.000119f, 0.000182f, 0.000177f, 0.000179f, 0.000262f, 0.000239f,
- 0.000309f, 0.000322f, 0.000404f, 0.000370f, 0.000361f, 0.000430f, 0.000458f, 0.000540f,
- 0.000589f, 0.000615f, 0.000648f, 0.000632f, 0.000777f, 0.000782f, 0.000798f, 0.000871f,
- 0.000857f, 0.000925f, 0.001000f, 0.001045f, 0.001191f, 0.001223f, 0.001426f, 0.001419f,
- 0.001512f, 0.001635f, 0.001884f, 0.002092f, 0.002100f, 0.002293f, 0.002577f, 0.003012f,
- 0.003258f, 0.003761f, 0.004253f, 0.004814f, 0.005619f, 0.006676f, 0.008064f, 0.009750f,
- 0.012268f, 0.015854f, 0.021255f, 0.029282f, 0.041687f, 0.061005f, 0.091370f, 0.136230f,
- 0.202759f, 0.291504f, 0.746582f, 0.757324f, 0.759277f, 0.760254f, 0.760254f, 0.760254f,
- 0.000000f, 0.000000f, 0.000117f, 0.000126f, 0.000113f, 0.000146f, 0.000158f, 0.000155f,
- 0.000189f, 0.000288f, 0.000254f, 0.000336f, 0.000347f, 0.000353f, 0.000370f, 0.000355f,
- 0.000390f, 0.000417f, 0.000456f, 0.000480f, 0.000525f, 0.000587f, 0.000596f, 0.000620f,
- 0.000676f, 0.000740f, 0.000758f, 0.000852f, 0.000907f, 0.000947f, 0.001057f, 0.001122f,
- 0.001170f, 0.001293f, 0.001316f, 0.001437f, 0.001531f, 0.001813f, 0.001952f, 0.002090f,
- 0.002346f, 0.002560f, 0.002974f, 0.003334f, 0.003899f, 0.004547f, 0.005360f, 0.006516f,
- 0.008179f, 0.010468f, 0.013947f, 0.019241f, 0.027832f, 0.041443f, 0.064941f, 0.102600f,
- 0.162231f, 0.247437f, 0.726074f, 0.737793f, 0.739258f, 0.740723f, 0.741211f, 0.741211f,
- 0.000000f, 0.000118f, 0.000115f, 0.000113f, 0.000110f, 0.000126f, 0.000121f, 0.000139f,
- 0.000147f, 0.000160f, 0.000161f, 0.000233f, 0.000199f, 0.000266f, 0.000286f, 0.000297f,
- 0.000329f, 0.000313f, 0.000347f, 0.000358f, 0.000364f, 0.000394f, 0.000435f, 0.000446f,
- 0.000489f, 0.000506f, 0.000546f, 0.000625f, 0.000648f, 0.000674f, 0.000723f, 0.000782f,
- 0.000865f, 0.000918f, 0.000979f, 0.001104f, 0.001100f, 0.001196f, 0.001352f, 0.001488f,
- 0.001586f, 0.001749f, 0.001955f, 0.002275f, 0.002644f, 0.003054f, 0.003563f, 0.004322f,
- 0.005314f, 0.006786f, 0.008980f, 0.012115f, 0.017319f, 0.026520f, 0.043121f, 0.072693f,
- 0.123535f, 0.203613f, 0.705566f, 0.716797f, 0.719238f, 0.719727f, 0.720703f, 0.721191f,
- 0.000000f, 0.000000f, 0.000112f, 0.000109f, 0.000106f, 0.000104f, 0.000102f, 0.000096f,
- 0.000091f, 0.000113f, 0.000147f, 0.000129f, 0.000155f, 0.000134f, 0.000196f, 0.000205f,
- 0.000181f, 0.000239f, 0.000297f, 0.000255f, 0.000317f, 0.000273f, 0.000335f, 0.000299f,
- 0.000379f, 0.000385f, 0.000398f, 0.000402f, 0.000473f, 0.000552f, 0.000489f, 0.000543f,
- 0.000557f, 0.000606f, 0.000662f, 0.000698f, 0.000747f, 0.000810f, 0.000902f, 0.000961f,
- 0.001063f, 0.001166f, 0.001312f, 0.001523f, 0.001662f, 0.001908f, 0.002298f, 0.002758f,
- 0.003365f, 0.004135f, 0.005394f, 0.007290f, 0.010490f, 0.015991f, 0.026215f, 0.047180f,
- 0.087646f, 0.160645f, 0.682617f, 0.695801f, 0.697266f, 0.697266f, 0.697266f, 0.698730f,
- 0.000000f, 0.000112f, 0.000106f, 0.000104f, 0.000100f, 0.000098f, 0.000095f, 0.000094f,
- 0.000090f, 0.000085f, 0.000080f, 0.000081f, 0.000085f, 0.000123f, 0.000123f, 0.000138f,
- 0.000151f, 0.000158f, 0.000147f, 0.000171f, 0.000183f, 0.000192f, 0.000242f, 0.000215f,
- 0.000253f, 0.000256f, 0.000269f, 0.000278f, 0.000293f, 0.000315f, 0.000377f, 0.000357f,
- 0.000357f, 0.000423f, 0.000479f, 0.000493f, 0.000489f, 0.000535f, 0.000579f, 0.000628f,
- 0.000683f, 0.000731f, 0.000833f, 0.000935f, 0.001068f, 0.001200f, 0.001347f, 0.001581f,
- 0.001995f, 0.002419f, 0.003109f, 0.004147f, 0.005829f, 0.008919f, 0.014641f, 0.027405f,
- 0.056885f, 0.119385f, 0.658691f, 0.669922f, 0.673828f, 0.673828f, 0.675293f, 0.675293f,
- 0.000000f, 0.000105f, 0.000101f, 0.000096f, 0.000092f, 0.000089f, 0.000087f, 0.000085f,
- 0.000083f, 0.000081f, 0.000077f, 0.000073f, 0.000070f, 0.000066f, 0.000080f, 0.000084f,
- 0.000089f, 0.000068f, 0.000101f, 0.000094f, 0.000116f, 0.000118f, 0.000125f, 0.000129f,
- 0.000150f, 0.000168f, 0.000153f, 0.000192f, 0.000195f, 0.000185f, 0.000200f, 0.000217f,
- 0.000226f, 0.000247f, 0.000257f, 0.000262f, 0.000319f, 0.000334f, 0.000347f, 0.000376f,
- 0.000395f, 0.000447f, 0.000504f, 0.000544f, 0.000590f, 0.000670f, 0.000789f, 0.000887f,
- 0.001069f, 0.001345f, 0.001670f, 0.002167f, 0.003065f, 0.004562f, 0.007660f, 0.014290f,
- 0.032135f, 0.081299f, 0.632812f, 0.645996f, 0.648926f, 0.649414f, 0.648926f, 0.649902f,
- 0.000109f, 0.000094f, 0.000087f, 0.000082f, 0.000078f, 0.000076f, 0.000074f, 0.000071f,
- 0.000069f, 0.000068f, 0.000067f, 0.000066f, 0.000064f, 0.000061f, 0.000058f, 0.000055f,
- 0.000053f, 0.000050f, 0.000051f, 0.000046f, 0.000059f, 0.000056f, 0.000057f, 0.000068f,
- 0.000078f, 0.000088f, 0.000096f, 0.000096f, 0.000105f, 0.000107f, 0.000128f, 0.000121f,
- 0.000133f, 0.000141f, 0.000156f, 0.000151f, 0.000160f, 0.000200f, 0.000209f, 0.000198f,
- 0.000222f, 0.000242f, 0.000258f, 0.000275f, 0.000314f, 0.000352f, 0.000410f, 0.000468f,
- 0.000537f, 0.000639f, 0.000799f, 0.001002f, 0.001390f, 0.002092f, 0.003466f, 0.006653f,
- 0.015305f, 0.048004f, 0.606934f, 0.618652f, 0.622559f, 0.623047f, 0.623535f, 0.624023f,
- 0.000084f, 0.000067f, 0.000064f, 0.000062f, 0.000057f, 0.000056f, 0.000053f, 0.000054f,
- 0.000051f, 0.000052f, 0.000050f, 0.000050f, 0.000050f, 0.000049f, 0.000048f, 0.000047f,
- 0.000046f, 0.000044f, 0.000042f, 0.000040f, 0.000039f, 0.000037f, 0.000035f, 0.000036f,
- 0.000037f, 0.000031f, 0.000040f, 0.000041f, 0.000042f, 0.000051f, 0.000058f, 0.000063f,
- 0.000067f, 0.000069f, 0.000072f, 0.000079f, 0.000085f, 0.000092f, 0.000093f, 0.000101f,
- 0.000107f, 0.000123f, 0.000125f, 0.000139f, 0.000147f, 0.000154f, 0.000181f, 0.000204f,
- 0.000229f, 0.000270f, 0.000327f, 0.000425f, 0.000559f, 0.000772f, 0.001265f, 0.002462f,
- 0.006191f, 0.022415f, 0.578613f, 0.592285f, 0.595215f, 0.596191f, 0.596191f, 0.597656f,
- 0.000008f, 0.000022f, 0.000022f, 0.000024f, 0.000024f, 0.000027f, 0.000028f, 0.000028f,
- 0.000028f, 0.000026f, 0.000028f, 0.000029f, 0.000029f, 0.000028f, 0.000029f, 0.000029f,
- 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000030f, 0.000029f, 0.000028f, 0.000027f,
- 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f,
- 0.000021f, 0.000020f, 0.000022f, 0.000026f, 0.000028f, 0.000033f, 0.000037f, 0.000036f,
- 0.000039f, 0.000045f, 0.000051f, 0.000046f, 0.000056f, 0.000059f, 0.000061f, 0.000071f,
- 0.000084f, 0.000098f, 0.000110f, 0.000133f, 0.000169f, 0.000223f, 0.000356f, 0.000648f,
- 0.001702f, 0.007713f, 0.550293f, 0.564453f, 0.566895f, 0.567871f, 0.568359f, 0.568848f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f, 0.000003f, 0.000004f, 0.000006f,
- 0.000007f, 0.000007f, 0.000008f, 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000011f,
- 0.000012f, 0.000012f, 0.000013f, 0.000013f, 0.000013f, 0.000014f, 0.000014f, 0.000013f,
- 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f,
- 0.000008f, 0.000008f, 0.000009f, 0.000011f, 0.000014f, 0.000017f, 0.000015f, 0.000018f,
- 0.000021f, 0.000022f, 0.000023f, 0.000026f, 0.000035f, 0.000040f, 0.000056f, 0.000089f,
- 0.000225f, 0.001332f, 0.520996f, 0.535156f, 0.538086f, 0.540039f, 0.540039f, 0.540039f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000003f,
- 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000002f, 0.000003f, 0.000003f,
- 0.000004f, 0.000017f, 0.491211f, 0.506348f, 0.508789f, 0.510254f, 0.510254f, 0.510742f,
- },
- {
- 0.064758f, 0.179688f, 0.277344f, 0.358398f, 0.427002f, 0.485107f, 0.535156f, 0.578613f,
- 0.615234f, 0.647949f, 0.677734f, 0.703125f, 0.725586f, 0.745605f, 0.763672f, 0.780273f,
- 0.795410f, 0.810059f, 0.821777f, 0.833496f, 0.843750f, 0.854004f, 0.862793f, 0.871582f,
- 0.879883f, 0.886719f, 0.894043f, 0.900879f, 0.906250f, 0.912109f, 0.917969f, 0.922852f,
- 0.927246f, 0.932129f, 0.936523f, 0.940918f, 0.944824f, 0.948242f, 0.951660f, 0.955078f,
- 0.958496f, 0.961426f, 0.964844f, 0.967773f, 0.970215f, 0.973145f, 0.975586f, 0.977539f,
- 0.979980f, 0.982422f, 0.984863f, 0.986328f, 0.988770f, 0.990234f, 0.992676f, 0.993652f,
- 0.995605f, 0.997559f, 0.998535f, 0.996582f, 0.995117f, 0.993652f, 0.992188f, 0.990723f,
- 0.040344f, 0.121460f, 0.199341f, 0.272949f, 0.339600f, 0.401123f, 0.455078f, 0.501953f,
- 0.546875f, 0.583984f, 0.618164f, 0.648926f, 0.676270f, 0.700195f, 0.723145f, 0.743164f,
- 0.761230f, 0.776855f, 0.793457f, 0.806641f, 0.819336f, 0.831543f, 0.842285f, 0.852051f,
- 0.861328f, 0.869629f, 0.877930f, 0.886230f, 0.892578f, 0.899902f, 0.905273f, 0.911621f,
- 0.917480f, 0.922852f, 0.927246f, 0.932129f, 0.936035f, 0.940430f, 0.945312f, 0.949219f,
- 0.952148f, 0.956055f, 0.958984f, 0.961914f, 0.965332f, 0.967773f, 0.970703f, 0.973633f,
- 0.976074f, 0.978516f, 0.980957f, 0.983398f, 0.985840f, 0.987305f, 0.989258f, 0.991699f,
- 0.993652f, 0.995117f, 0.997070f, 0.995605f, 0.994141f, 0.993164f, 0.991699f, 0.990234f,
- 0.027191f, 0.084961f, 0.145630f, 0.206177f, 0.266113f, 0.323242f, 0.377930f, 0.428711f,
- 0.474609f, 0.517090f, 0.554688f, 0.591309f, 0.621582f, 0.650391f, 0.676758f, 0.700684f,
- 0.723145f, 0.741699f, 0.760254f, 0.776855f, 0.791504f, 0.805664f, 0.818359f, 0.830566f,
- 0.841309f, 0.851074f, 0.861816f, 0.870117f, 0.878418f, 0.885254f, 0.892090f, 0.899414f,
- 0.906250f, 0.912598f, 0.916992f, 0.922363f, 0.928223f, 0.932617f, 0.937500f, 0.941895f,
- 0.945801f, 0.949219f, 0.953613f, 0.957031f, 0.960449f, 0.963379f, 0.966797f, 0.969727f,
- 0.971680f, 0.974609f, 0.977539f, 0.979980f, 0.981934f, 0.984375f, 0.986328f, 0.989258f,
- 0.991211f, 0.992676f, 0.996094f, 0.994629f, 0.993652f, 0.992188f, 0.990723f, 0.989746f,
- 0.019577f, 0.061340f, 0.108337f, 0.156860f, 0.207153f, 0.258789f, 0.310059f, 0.358887f,
- 0.405762f, 0.450928f, 0.491211f, 0.530273f, 0.565430f, 0.597656f, 0.627441f, 0.654297f,
- 0.680176f, 0.702637f, 0.724121f, 0.743164f, 0.760742f, 0.776855f, 0.791992f, 0.806152f,
- 0.817871f, 0.830078f, 0.841797f, 0.852539f, 0.861816f, 0.870117f, 0.878906f, 0.886230f,
- 0.893066f, 0.900391f, 0.906738f, 0.912598f, 0.918457f, 0.923340f, 0.928223f, 0.933594f,
- 0.938477f, 0.942871f, 0.946777f, 0.950684f, 0.954590f, 0.958496f, 0.960938f, 0.964844f,
- 0.967773f, 0.970703f, 0.973633f, 0.976074f, 0.979004f, 0.981445f, 0.983398f, 0.985840f,
- 0.987793f, 0.990234f, 0.995117f, 0.993652f, 0.992676f, 0.991699f, 0.990234f, 0.989258f,
- 0.014397f, 0.046295f, 0.081543f, 0.120728f, 0.162842f, 0.206177f, 0.250977f, 0.296143f,
- 0.342041f, 0.385986f, 0.427979f, 0.468262f, 0.506348f, 0.542480f, 0.575195f, 0.605469f,
- 0.633789f, 0.660156f, 0.684570f, 0.706543f, 0.727539f, 0.745117f, 0.763184f, 0.778809f,
- 0.793945f, 0.807617f, 0.820312f, 0.833008f, 0.842773f, 0.852539f, 0.862305f, 0.872070f,
- 0.879395f, 0.887207f, 0.894531f, 0.900879f, 0.907227f, 0.914551f, 0.919922f, 0.925293f,
- 0.930176f, 0.935547f, 0.938965f, 0.943359f, 0.948730f, 0.952637f, 0.956055f, 0.959473f,
- 0.962891f, 0.966309f, 0.969238f, 0.972656f, 0.975098f, 0.977539f, 0.980957f, 0.982910f,
- 0.984863f, 0.987793f, 0.994141f, 0.993164f, 0.991699f, 0.990723f, 0.989746f, 0.988281f,
- 0.010925f, 0.035828f, 0.063660f, 0.094360f, 0.128174f, 0.164551f, 0.203247f, 0.244385f,
- 0.285645f, 0.326416f, 0.367432f, 0.409424f, 0.447998f, 0.484131f, 0.520508f, 0.553711f,
- 0.584473f, 0.614258f, 0.641113f, 0.666016f, 0.689453f, 0.710938f, 0.730469f, 0.750488f,
- 0.766602f, 0.781250f, 0.796387f, 0.809570f, 0.822266f, 0.833496f, 0.844727f, 0.854980f,
- 0.864258f, 0.873047f, 0.881348f, 0.889648f, 0.895996f, 0.903809f, 0.910156f, 0.916504f,
- 0.921387f, 0.926758f, 0.932129f, 0.937500f, 0.941895f, 0.946777f, 0.950684f, 0.954102f,
- 0.958008f, 0.960938f, 0.965332f, 0.968262f, 0.971680f, 0.975098f, 0.977539f, 0.979492f,
- 0.982422f, 0.984863f, 0.992676f, 0.991699f, 0.990723f, 0.989746f, 0.988770f, 0.987793f,
- 0.008698f, 0.028244f, 0.049866f, 0.074463f, 0.102295f, 0.132935f, 0.165161f, 0.200073f,
- 0.236206f, 0.275391f, 0.313477f, 0.352051f, 0.391113f, 0.428955f, 0.465088f, 0.500977f,
- 0.534180f, 0.565430f, 0.593750f, 0.622559f, 0.648438f, 0.671875f, 0.694824f, 0.715820f,
- 0.734863f, 0.753906f, 0.771484f, 0.784668f, 0.799805f, 0.813477f, 0.825195f, 0.836914f,
- 0.847656f, 0.857910f, 0.866699f, 0.875488f, 0.884766f, 0.892090f, 0.898438f, 0.906250f,
- 0.913086f, 0.918457f, 0.923828f, 0.929688f, 0.935059f, 0.939941f, 0.944336f, 0.948730f,
- 0.952637f, 0.956055f, 0.959961f, 0.963379f, 0.967285f, 0.970703f, 0.973633f, 0.976074f,
- 0.979492f, 0.982422f, 0.991211f, 0.990723f, 0.990234f, 0.988770f, 0.987793f, 0.986328f,
- 0.007210f, 0.022797f, 0.040039f, 0.060181f, 0.082153f, 0.107300f, 0.134155f, 0.164673f,
- 0.196167f, 0.229492f, 0.265381f, 0.301025f, 0.338379f, 0.374756f, 0.411133f, 0.446533f,
- 0.481201f, 0.515625f, 0.546387f, 0.576660f, 0.605957f, 0.631348f, 0.656738f, 0.681152f,
- 0.702148f, 0.722168f, 0.741699f, 0.758789f, 0.775391f, 0.791016f, 0.803711f, 0.817383f,
- 0.829102f, 0.840820f, 0.851562f, 0.860840f, 0.871094f, 0.879395f, 0.887695f, 0.895020f,
- 0.901855f, 0.909180f, 0.915527f, 0.921387f, 0.927734f, 0.932129f, 0.937500f, 0.941895f,
- 0.947266f, 0.950684f, 0.955078f, 0.958984f, 0.962891f, 0.966797f, 0.969727f, 0.973145f,
- 0.976562f, 0.979004f, 0.990234f, 0.989746f, 0.988770f, 0.987793f, 0.986816f, 0.985840f,
- 0.005863f, 0.018936f, 0.032898f, 0.049377f, 0.067261f, 0.088257f, 0.110535f, 0.135254f,
- 0.162231f, 0.191895f, 0.223389f, 0.255371f, 0.290039f, 0.324707f, 0.359863f, 0.395996f,
- 0.429932f, 0.464355f, 0.497314f, 0.529297f, 0.559570f, 0.587891f, 0.616699f, 0.642090f,
- 0.665527f, 0.688965f, 0.709961f, 0.729492f, 0.747559f, 0.765625f, 0.780762f, 0.794922f,
- 0.809082f, 0.822754f, 0.833984f, 0.844727f, 0.855957f, 0.864746f, 0.875000f, 0.883789f,
- 0.891113f, 0.898926f, 0.906250f, 0.912598f, 0.918457f, 0.925293f, 0.930664f, 0.935059f,
- 0.940918f, 0.945312f, 0.950195f, 0.954590f, 0.958496f, 0.962402f, 0.965820f, 0.969238f,
- 0.972656f, 0.976074f, 0.988770f, 0.988770f, 0.987793f, 0.986816f, 0.985840f, 0.984863f,
- 0.004925f, 0.015518f, 0.027451f, 0.041199f, 0.055786f, 0.072998f, 0.091492f, 0.112427f,
- 0.135254f, 0.160767f, 0.187500f, 0.216919f, 0.247314f, 0.280273f, 0.313477f, 0.346680f,
- 0.381592f, 0.415283f, 0.448730f, 0.481201f, 0.513184f, 0.543945f, 0.573242f, 0.601562f,
- 0.627441f, 0.652344f, 0.675293f, 0.697754f, 0.718262f, 0.737793f, 0.754883f, 0.771973f,
- 0.787109f, 0.800781f, 0.815430f, 0.828125f, 0.839844f, 0.851074f, 0.860840f, 0.870117f,
- 0.879883f, 0.887695f, 0.896484f, 0.902832f, 0.911133f, 0.916992f, 0.922852f, 0.928711f,
- 0.934082f, 0.939941f, 0.944336f, 0.948730f, 0.954102f, 0.958008f, 0.961426f, 0.965332f,
- 0.969238f, 0.972168f, 0.987305f, 0.987305f, 0.986816f, 0.985840f, 0.984863f, 0.983887f,
- 0.004139f, 0.012955f, 0.022781f, 0.034088f, 0.046997f, 0.061005f, 0.076538f, 0.094360f,
- 0.113464f, 0.134888f, 0.158203f, 0.183716f, 0.210693f, 0.239990f, 0.270264f, 0.302734f,
- 0.334961f, 0.367676f, 0.400635f, 0.434082f, 0.467041f, 0.497803f, 0.528809f, 0.558105f,
- 0.586426f, 0.614258f, 0.638672f, 0.663574f, 0.686035f, 0.707520f, 0.728027f, 0.745605f,
- 0.762695f, 0.779297f, 0.794434f, 0.808594f, 0.821777f, 0.834473f, 0.845215f, 0.855957f,
- 0.866699f, 0.876465f, 0.884766f, 0.892090f, 0.900391f, 0.908203f, 0.915039f, 0.920898f,
- 0.927246f, 0.932617f, 0.937988f, 0.943848f, 0.948730f, 0.952637f, 0.957520f, 0.961426f,
- 0.965820f, 0.968750f, 0.985840f, 0.985840f, 0.985840f, 0.984375f, 0.983887f, 0.982910f,
- 0.003492f, 0.011307f, 0.019608f, 0.028793f, 0.039246f, 0.051544f, 0.064392f, 0.078796f,
- 0.095337f, 0.113953f, 0.134033f, 0.155396f, 0.179688f, 0.205200f, 0.232300f, 0.261475f,
- 0.291748f, 0.323730f, 0.355225f, 0.387939f, 0.420410f, 0.452637f, 0.483887f, 0.514648f,
- 0.544922f, 0.573730f, 0.601074f, 0.626953f, 0.651367f, 0.675293f, 0.697266f, 0.717285f,
- 0.736816f, 0.755371f, 0.771973f, 0.786621f, 0.803223f, 0.815430f, 0.828613f, 0.840820f,
- 0.851562f, 0.863281f, 0.873047f, 0.880859f, 0.890625f, 0.898438f, 0.905762f, 0.913086f,
- 0.919434f, 0.925781f, 0.931641f, 0.937500f, 0.942871f, 0.947754f, 0.952637f, 0.957520f,
- 0.960938f, 0.965820f, 0.984375f, 0.984863f, 0.984375f, 0.983398f, 0.982422f, 0.981445f,
- 0.002977f, 0.009415f, 0.016708f, 0.024811f, 0.033356f, 0.043457f, 0.054535f, 0.067017f,
- 0.080322f, 0.096130f, 0.113708f, 0.132080f, 0.152710f, 0.175415f, 0.199829f, 0.226440f,
- 0.253662f, 0.282959f, 0.313232f, 0.343750f, 0.375000f, 0.406982f, 0.439453f, 0.471191f,
- 0.501465f, 0.531738f, 0.560547f, 0.587891f, 0.615234f, 0.640625f, 0.664062f, 0.687500f,
- 0.708496f, 0.728516f, 0.747559f, 0.765137f, 0.781738f, 0.795898f, 0.811523f, 0.824707f,
- 0.836426f, 0.847656f, 0.858887f, 0.869141f, 0.878906f, 0.887695f, 0.895996f, 0.904297f,
- 0.911133f, 0.917969f, 0.925293f, 0.931152f, 0.937012f, 0.942383f, 0.947266f, 0.953125f,
- 0.957031f, 0.961426f, 0.982910f, 0.983398f, 0.982910f, 0.982422f, 0.981445f, 0.980957f,
- 0.002743f, 0.008568f, 0.014305f, 0.021378f, 0.028732f, 0.037201f, 0.046387f, 0.057068f,
- 0.068848f, 0.082336f, 0.096924f, 0.113159f, 0.130859f, 0.150146f, 0.171509f, 0.194824f,
- 0.219482f, 0.246338f, 0.273926f, 0.302734f, 0.333496f, 0.364502f, 0.395752f, 0.426758f,
- 0.458252f, 0.489990f, 0.519531f, 0.548340f, 0.576660f, 0.604004f, 0.630859f, 0.654297f,
- 0.678223f, 0.700684f, 0.720215f, 0.740234f, 0.758301f, 0.775391f, 0.790527f, 0.805176f,
- 0.818848f, 0.833008f, 0.844238f, 0.855469f, 0.866699f, 0.876953f, 0.886230f, 0.894043f,
- 0.902832f, 0.910645f, 0.917480f, 0.924316f, 0.930664f, 0.937012f, 0.941895f, 0.947266f,
- 0.952148f, 0.957031f, 0.981445f, 0.982422f, 0.981445f, 0.980957f, 0.980469f, 0.979004f,
- 0.002504f, 0.007004f, 0.012634f, 0.018555f, 0.024933f, 0.032654f, 0.040283f, 0.048920f,
- 0.059357f, 0.070007f, 0.082642f, 0.096741f, 0.112122f, 0.128906f, 0.147339f, 0.167603f,
- 0.189697f, 0.213257f, 0.238770f, 0.265869f, 0.293701f, 0.323242f, 0.354004f, 0.384766f,
- 0.415283f, 0.447021f, 0.478516f, 0.507812f, 0.536621f, 0.565918f, 0.593750f, 0.620605f,
- 0.645508f, 0.668945f, 0.692383f, 0.712891f, 0.733398f, 0.751465f, 0.769531f, 0.785156f,
- 0.801270f, 0.814941f, 0.828125f, 0.841797f, 0.853516f, 0.864746f, 0.874512f, 0.883789f,
- 0.893555f, 0.900879f, 0.910156f, 0.917480f, 0.923340f, 0.930664f, 0.936523f, 0.942383f,
- 0.947754f, 0.952637f, 0.979492f, 0.980469f, 0.980469f, 0.979492f, 0.978516f, 0.978027f,
- 0.002039f, 0.006287f, 0.010864f, 0.016129f, 0.021637f, 0.027786f, 0.034485f, 0.042450f,
- 0.051331f, 0.060760f, 0.071594f, 0.082886f, 0.096313f, 0.110840f, 0.126587f, 0.145020f,
- 0.164185f, 0.185181f, 0.207520f, 0.232300f, 0.258301f, 0.285889f, 0.314941f, 0.344238f,
- 0.374268f, 0.405029f, 0.436035f, 0.466797f, 0.498291f, 0.527344f, 0.555664f, 0.583984f,
- 0.611328f, 0.636230f, 0.661133f, 0.684082f, 0.705566f, 0.726562f, 0.745605f, 0.764648f,
- 0.781250f, 0.797852f, 0.812500f, 0.825195f, 0.838867f, 0.851074f, 0.862305f, 0.873535f,
- 0.883301f, 0.892578f, 0.901367f, 0.908203f, 0.916992f, 0.923828f, 0.931152f, 0.937012f,
- 0.942383f, 0.947266f, 0.978027f, 0.978516f, 0.979004f, 0.978027f, 0.977051f, 0.977051f,
- 0.001762f, 0.005489f, 0.009804f, 0.013931f, 0.019028f, 0.024445f, 0.030518f, 0.036865f,
- 0.044189f, 0.052460f, 0.061432f, 0.071960f, 0.083008f, 0.095642f, 0.109558f, 0.124756f,
- 0.141602f, 0.160156f, 0.180664f, 0.202148f, 0.225952f, 0.250977f, 0.278076f, 0.305664f,
- 0.334961f, 0.364990f, 0.394775f, 0.425537f, 0.456543f, 0.487061f, 0.517090f, 0.546387f,
- 0.575195f, 0.602539f, 0.627930f, 0.653809f, 0.676758f, 0.699707f, 0.721191f, 0.740723f,
- 0.759766f, 0.777832f, 0.793945f, 0.809082f, 0.823242f, 0.836426f, 0.849609f, 0.861328f,
- 0.872070f, 0.881836f, 0.892578f, 0.900391f, 0.908691f, 0.916992f, 0.924316f, 0.931152f,
- 0.937500f, 0.943359f, 0.976074f, 0.977051f, 0.977051f, 0.976562f, 0.976074f, 0.975098f,
- 0.001675f, 0.005020f, 0.008400f, 0.012253f, 0.016724f, 0.021469f, 0.026428f, 0.032104f,
- 0.039062f, 0.045563f, 0.053741f, 0.062103f, 0.072205f, 0.082947f, 0.094666f, 0.107727f,
- 0.122681f, 0.139038f, 0.156250f, 0.176514f, 0.197388f, 0.220581f, 0.244629f, 0.270752f,
- 0.297607f, 0.326172f, 0.355957f, 0.386475f, 0.416748f, 0.447754f, 0.478027f, 0.507812f,
- 0.538086f, 0.566406f, 0.594727f, 0.621582f, 0.647461f, 0.671387f, 0.694336f, 0.716797f,
- 0.737305f, 0.755859f, 0.773438f, 0.791016f, 0.807129f, 0.820801f, 0.834961f, 0.848145f,
- 0.860352f, 0.871582f, 0.881836f, 0.891602f, 0.901367f, 0.909180f, 0.917480f, 0.925293f,
- 0.932129f, 0.938965f, 0.974609f, 0.975586f, 0.976074f, 0.974609f, 0.974121f, 0.973633f,
- 0.001437f, 0.004513f, 0.007427f, 0.010994f, 0.014526f, 0.018829f, 0.023331f, 0.028229f,
- 0.034058f, 0.040192f, 0.046844f, 0.054321f, 0.062683f, 0.071716f, 0.082397f, 0.093933f,
- 0.106567f, 0.120728f, 0.136230f, 0.153320f, 0.172485f, 0.192627f, 0.214233f, 0.237915f,
- 0.263672f, 0.290527f, 0.318115f, 0.347412f, 0.377197f, 0.408203f, 0.438477f, 0.469482f,
- 0.499512f, 0.529785f, 0.558594f, 0.586914f, 0.614258f, 0.641602f, 0.665527f, 0.689941f,
- 0.711914f, 0.732422f, 0.752930f, 0.771484f, 0.789062f, 0.805664f, 0.819824f, 0.833984f,
- 0.847656f, 0.860840f, 0.871094f, 0.881836f, 0.891602f, 0.902344f, 0.910156f, 0.918457f,
- 0.926270f, 0.932617f, 0.972168f, 0.973633f, 0.973633f, 0.973145f, 0.973145f, 0.971680f,
- 0.001390f, 0.003952f, 0.006779f, 0.009941f, 0.013062f, 0.017029f, 0.020905f, 0.024994f,
- 0.029877f, 0.035187f, 0.041077f, 0.047119f, 0.055145f, 0.062500f, 0.071594f, 0.081543f,
- 0.092712f, 0.104736f, 0.118530f, 0.133179f, 0.150024f, 0.168091f, 0.187378f, 0.209717f,
- 0.232178f, 0.256836f, 0.283447f, 0.311279f, 0.339844f, 0.369873f, 0.399658f, 0.429932f,
- 0.461426f, 0.492188f, 0.521973f, 0.551758f, 0.580566f, 0.608887f, 0.635254f, 0.660645f,
- 0.685059f, 0.708008f, 0.729492f, 0.750488f, 0.769043f, 0.786621f, 0.802734f, 0.818848f,
- 0.832520f, 0.846680f, 0.860352f, 0.871582f, 0.882324f, 0.892578f, 0.902832f, 0.911133f,
- 0.919922f, 0.926758f, 0.970703f, 0.971680f, 0.971680f, 0.971680f, 0.971680f, 0.969238f,
- 0.001328f, 0.003641f, 0.006138f, 0.008690f, 0.011444f, 0.014786f, 0.018311f, 0.022125f,
- 0.026337f, 0.031403f, 0.036011f, 0.041809f, 0.047943f, 0.054901f, 0.062622f, 0.071106f,
- 0.081299f, 0.091614f, 0.103455f, 0.116333f, 0.130493f, 0.146484f, 0.164307f, 0.183228f,
- 0.204224f, 0.226685f, 0.251221f, 0.277100f, 0.303711f, 0.332764f, 0.361572f, 0.391846f,
- 0.422852f, 0.454102f, 0.485352f, 0.515625f, 0.545410f, 0.574707f, 0.603027f, 0.630371f,
- 0.656250f, 0.681641f, 0.705078f, 0.726562f, 0.747070f, 0.767578f, 0.784668f, 0.803223f,
- 0.818848f, 0.833008f, 0.847656f, 0.860352f, 0.872559f, 0.883301f, 0.894043f, 0.903809f,
- 0.913574f, 0.921387f, 0.967773f, 0.970215f, 0.970215f, 0.968750f, 0.969238f, 0.968750f,
- 0.001053f, 0.002905f, 0.005432f, 0.007912f, 0.010658f, 0.012901f, 0.016464f, 0.019363f,
- 0.023376f, 0.027237f, 0.031799f, 0.036346f, 0.042145f, 0.048248f, 0.054871f, 0.062256f,
- 0.070618f, 0.079834f, 0.089844f, 0.101440f, 0.113831f, 0.128174f, 0.143433f, 0.160156f,
- 0.179077f, 0.199707f, 0.222046f, 0.245483f, 0.271240f, 0.297363f, 0.325684f, 0.355469f,
- 0.385254f, 0.416016f, 0.447754f, 0.479004f, 0.508789f, 0.539551f, 0.570312f, 0.598145f,
- 0.626465f, 0.652344f, 0.678223f, 0.702148f, 0.725098f, 0.746094f, 0.765625f, 0.785645f,
- 0.803223f, 0.819336f, 0.834961f, 0.848145f, 0.861328f, 0.873535f, 0.884766f, 0.895508f,
- 0.905762f, 0.915527f, 0.965332f, 0.967773f, 0.968262f, 0.967773f, 0.967285f, 0.966309f,
- 0.001106f, 0.002684f, 0.004913f, 0.006733f, 0.009300f, 0.011955f, 0.014435f, 0.017700f,
- 0.020477f, 0.024124f, 0.028091f, 0.032532f, 0.037231f, 0.042511f, 0.048309f, 0.054596f,
- 0.061798f, 0.069885f, 0.078857f, 0.089050f, 0.099915f, 0.112183f, 0.125488f, 0.140503f,
- 0.157104f, 0.175293f, 0.195068f, 0.216309f, 0.240356f, 0.265381f, 0.291748f, 0.319580f,
- 0.348633f, 0.379150f, 0.410156f, 0.441406f, 0.472900f, 0.503418f, 0.534668f, 0.565430f,
- 0.594727f, 0.622070f, 0.649902f, 0.676270f, 0.700195f, 0.723633f, 0.746094f, 0.766602f,
- 0.786133f, 0.802734f, 0.819824f, 0.835449f, 0.849609f, 0.863281f, 0.875977f, 0.887695f,
- 0.898438f, 0.908203f, 0.962891f, 0.965820f, 0.966309f, 0.965332f, 0.964844f, 0.964355f,
- 0.000782f, 0.002707f, 0.004574f, 0.006184f, 0.008286f, 0.010681f, 0.012878f, 0.015640f,
- 0.018478f, 0.021912f, 0.025208f, 0.028976f, 0.032867f, 0.037598f, 0.042938f, 0.048370f,
- 0.054443f, 0.061432f, 0.069214f, 0.077515f, 0.087402f, 0.098145f, 0.109497f, 0.122803f,
- 0.137329f, 0.153564f, 0.171509f, 0.190918f, 0.212158f, 0.235352f, 0.259766f, 0.286133f,
- 0.314209f, 0.343262f, 0.373535f, 0.404297f, 0.436279f, 0.467773f, 0.499512f, 0.530273f,
- 0.561523f, 0.590820f, 0.620117f, 0.647461f, 0.674316f, 0.699219f, 0.722656f, 0.745605f,
- 0.766602f, 0.785645f, 0.804688f, 0.821777f, 0.836426f, 0.852051f, 0.865234f, 0.878418f,
- 0.890625f, 0.901855f, 0.959961f, 0.962891f, 0.963867f, 0.963379f, 0.962402f, 0.962402f,
- 0.000787f, 0.002195f, 0.004250f, 0.005775f, 0.007774f, 0.009445f, 0.011795f, 0.013725f,
- 0.016678f, 0.019531f, 0.022018f, 0.025665f, 0.029495f, 0.033142f, 0.037598f, 0.042664f,
- 0.048248f, 0.053772f, 0.060699f, 0.067993f, 0.076416f, 0.085815f, 0.095764f, 0.107422f,
- 0.120239f, 0.134277f, 0.150269f, 0.167358f, 0.186646f, 0.207764f, 0.230347f, 0.255127f,
- 0.281250f, 0.308838f, 0.337891f, 0.368408f, 0.399414f, 0.431396f, 0.463135f, 0.495605f,
- 0.526855f, 0.558594f, 0.588379f, 0.618652f, 0.646973f, 0.673828f, 0.699707f, 0.723633f,
- 0.746094f, 0.767090f, 0.788086f, 0.806641f, 0.823730f, 0.840332f, 0.854980f, 0.869141f,
- 0.881836f, 0.893555f, 0.957520f, 0.960938f, 0.960938f, 0.961426f, 0.960449f, 0.959961f,
- 0.000765f, 0.002207f, 0.003666f, 0.005177f, 0.006973f, 0.008301f, 0.010704f, 0.012794f,
- 0.015015f, 0.017303f, 0.020309f, 0.022568f, 0.026123f, 0.029587f, 0.033325f, 0.037659f,
- 0.042206f, 0.047516f, 0.053223f, 0.059814f, 0.067017f, 0.075195f, 0.083801f, 0.094055f,
- 0.105042f, 0.117737f, 0.131470f, 0.146851f, 0.163940f, 0.182739f, 0.203369f, 0.225952f,
- 0.250244f, 0.276367f, 0.304199f, 0.333008f, 0.364258f, 0.395264f, 0.427002f, 0.459961f,
- 0.491699f, 0.524414f, 0.555664f, 0.586914f, 0.617676f, 0.645996f, 0.673340f, 0.699707f,
- 0.724121f, 0.748047f, 0.770020f, 0.790039f, 0.809082f, 0.827148f, 0.842773f, 0.858398f,
- 0.873047f, 0.885742f, 0.954102f, 0.958008f, 0.958496f, 0.958496f, 0.958496f, 0.957520f,
- 0.000586f, 0.001937f, 0.003107f, 0.004745f, 0.006168f, 0.007610f, 0.009590f, 0.011345f,
- 0.013321f, 0.015587f, 0.017593f, 0.020294f, 0.023346f, 0.026154f, 0.029205f, 0.033234f,
- 0.037415f, 0.041962f, 0.046906f, 0.052673f, 0.058533f, 0.065796f, 0.073669f, 0.082642f,
- 0.092346f, 0.103027f, 0.115234f, 0.128784f, 0.143799f, 0.160889f, 0.179199f, 0.199585f,
- 0.221802f, 0.246094f, 0.271973f, 0.299805f, 0.329102f, 0.359863f, 0.391357f, 0.423340f,
- 0.456299f, 0.490234f, 0.522949f, 0.555176f, 0.586426f, 0.617188f, 0.645996f, 0.675293f,
- 0.701660f, 0.726074f, 0.750488f, 0.773926f, 0.793945f, 0.812988f, 0.831543f, 0.847656f,
- 0.862793f, 0.877441f, 0.951660f, 0.955078f, 0.955566f, 0.955566f, 0.955078f, 0.954590f,
- 0.000678f, 0.001864f, 0.003138f, 0.004333f, 0.005707f, 0.006893f, 0.008224f, 0.009850f,
- 0.012215f, 0.013954f, 0.015747f, 0.018219f, 0.020584f, 0.023148f, 0.026047f, 0.029434f,
- 0.033020f, 0.037018f, 0.041626f, 0.046509f, 0.051910f, 0.058105f, 0.064636f, 0.072510f,
- 0.080750f, 0.090149f, 0.100891f, 0.112549f, 0.126343f, 0.141113f, 0.157593f, 0.175537f,
- 0.195801f, 0.218018f, 0.242554f, 0.268311f, 0.295898f, 0.325195f, 0.355713f, 0.388184f,
- 0.421143f, 0.454834f, 0.488281f, 0.522949f, 0.554199f, 0.587402f, 0.618164f, 0.648438f,
- 0.676758f, 0.704102f, 0.730957f, 0.754395f, 0.776855f, 0.798340f, 0.817871f, 0.836426f,
- 0.852051f, 0.868164f, 0.948242f, 0.952637f, 0.953125f, 0.952637f, 0.952148f, 0.951660f,
- 0.000470f, 0.001578f, 0.002934f, 0.003838f, 0.005032f, 0.006310f, 0.007725f, 0.008972f,
- 0.010826f, 0.012657f, 0.014359f, 0.015991f, 0.018402f, 0.020721f, 0.023102f, 0.026230f,
- 0.029495f, 0.032867f, 0.036743f, 0.040680f, 0.045654f, 0.050812f, 0.056763f, 0.063477f,
- 0.071045f, 0.078918f, 0.088440f, 0.098938f, 0.110657f, 0.123535f, 0.138062f, 0.154175f,
- 0.172363f, 0.192627f, 0.214478f, 0.238770f, 0.264404f, 0.292236f, 0.322266f, 0.353271f,
- 0.385742f, 0.419189f, 0.453857f, 0.487549f, 0.521484f, 0.555664f, 0.588867f, 0.621094f,
- 0.651367f, 0.680176f, 0.708008f, 0.733887f, 0.759766f, 0.780762f, 0.802734f, 0.821289f,
- 0.840820f, 0.858398f, 0.943848f, 0.949219f, 0.949707f, 0.949707f, 0.949707f, 0.949219f,
- 0.000485f, 0.001689f, 0.002386f, 0.003698f, 0.004547f, 0.005936f, 0.006851f, 0.008217f,
- 0.009834f, 0.011055f, 0.012810f, 0.014473f, 0.016449f, 0.018509f, 0.020950f, 0.023209f,
- 0.025940f, 0.029114f, 0.032410f, 0.036133f, 0.040161f, 0.044861f, 0.050018f, 0.055664f,
- 0.061859f, 0.069153f, 0.077515f, 0.086365f, 0.096680f, 0.108093f, 0.120605f, 0.135132f,
- 0.151489f, 0.169556f, 0.189209f, 0.211426f, 0.235352f, 0.261475f, 0.289307f, 0.319580f,
- 0.351074f, 0.384521f, 0.418701f, 0.452881f, 0.487549f, 0.522461f, 0.556641f, 0.591309f,
- 0.623535f, 0.653809f, 0.684570f, 0.712891f, 0.739258f, 0.764160f, 0.787109f, 0.809570f,
- 0.829102f, 0.847168f, 0.940918f, 0.945801f, 0.946289f, 0.946777f, 0.946777f, 0.945312f,
- 0.000620f, 0.001351f, 0.002413f, 0.003273f, 0.004307f, 0.004971f, 0.006138f, 0.007542f,
- 0.008835f, 0.009972f, 0.011581f, 0.013069f, 0.014717f, 0.016495f, 0.018738f, 0.020691f,
- 0.023315f, 0.025879f, 0.028793f, 0.031860f, 0.035309f, 0.039246f, 0.043762f, 0.048950f,
- 0.054474f, 0.060669f, 0.067932f, 0.075378f, 0.084351f, 0.094055f, 0.105774f, 0.118469f,
- 0.132690f, 0.148315f, 0.166504f, 0.186401f, 0.208130f, 0.232544f, 0.258789f, 0.287109f,
- 0.317627f, 0.349854f, 0.383057f, 0.417725f, 0.453125f, 0.488770f, 0.523926f, 0.559082f,
- 0.594238f, 0.627441f, 0.659180f, 0.689941f, 0.719238f, 0.745117f, 0.770508f, 0.794434f,
- 0.815430f, 0.836914f, 0.936523f, 0.941895f, 0.942871f, 0.942871f, 0.942871f, 0.942383f,
- 0.000404f, 0.001095f, 0.002087f, 0.002983f, 0.003986f, 0.004673f, 0.005844f, 0.006878f,
- 0.007740f, 0.008873f, 0.010323f, 0.011757f, 0.013176f, 0.014915f, 0.016586f, 0.018585f,
- 0.020523f, 0.022720f, 0.025391f, 0.028244f, 0.031219f, 0.034821f, 0.038788f, 0.042908f,
- 0.047943f, 0.053040f, 0.058960f, 0.066162f, 0.073547f, 0.082397f, 0.092285f, 0.102844f,
- 0.115234f, 0.129883f, 0.146118f, 0.163452f, 0.183350f, 0.205688f, 0.229614f, 0.256592f,
- 0.285156f, 0.316162f, 0.348633f, 0.383057f, 0.418457f, 0.454590f, 0.490967f, 0.526855f,
- 0.563477f, 0.598633f, 0.632812f, 0.665527f, 0.696777f, 0.726074f, 0.752930f, 0.779297f,
- 0.803223f, 0.825684f, 0.933105f, 0.938477f, 0.938477f, 0.938965f, 0.938477f, 0.938477f,
- 0.000415f, 0.000864f, 0.001907f, 0.002775f, 0.003519f, 0.004204f, 0.005352f, 0.006237f,
- 0.007019f, 0.008064f, 0.009239f, 0.010483f, 0.011742f, 0.013130f, 0.014877f, 0.016571f,
- 0.018494f, 0.020126f, 0.022537f, 0.024826f, 0.027649f, 0.030701f, 0.033875f, 0.037964f,
- 0.042114f, 0.046356f, 0.051605f, 0.057587f, 0.064209f, 0.071777f, 0.080261f, 0.089722f,
- 0.100952f, 0.113220f, 0.127075f, 0.143066f, 0.160767f, 0.180664f, 0.202759f, 0.227417f,
- 0.254395f, 0.284180f, 0.315674f, 0.348633f, 0.383789f, 0.420166f, 0.457275f, 0.494385f,
- 0.531250f, 0.569336f, 0.605469f, 0.639160f, 0.672363f, 0.705078f, 0.735352f, 0.762207f,
- 0.788574f, 0.811523f, 0.928711f, 0.934082f, 0.934570f, 0.935059f, 0.935059f, 0.935059f,
- 0.000236f, 0.001136f, 0.001664f, 0.002502f, 0.003187f, 0.004082f, 0.004631f, 0.005386f,
- 0.006275f, 0.007385f, 0.008217f, 0.009453f, 0.010567f, 0.011787f, 0.013115f, 0.014420f,
- 0.016083f, 0.017944f, 0.019867f, 0.022079f, 0.024414f, 0.026962f, 0.029755f, 0.033112f,
- 0.036926f, 0.040771f, 0.045258f, 0.050232f, 0.056183f, 0.062500f, 0.069946f, 0.078430f,
- 0.087708f, 0.098389f, 0.110779f, 0.124634f, 0.140259f, 0.158203f, 0.178223f, 0.200928f,
- 0.225708f, 0.253174f, 0.282715f, 0.315430f, 0.349365f, 0.385254f, 0.422363f, 0.460938f,
- 0.499023f, 0.537109f, 0.574707f, 0.612305f, 0.646484f, 0.682129f, 0.713867f, 0.745117f,
- 0.772461f, 0.799316f, 0.923828f, 0.930176f, 0.930664f, 0.931152f, 0.930664f, 0.930664f,
- 0.000229f, 0.000964f, 0.001582f, 0.002182f, 0.002838f, 0.003653f, 0.004341f, 0.004921f,
- 0.005615f, 0.006626f, 0.007423f, 0.008545f, 0.009483f, 0.010666f, 0.011612f, 0.013000f,
- 0.014275f, 0.015900f, 0.017487f, 0.019333f, 0.021484f, 0.023773f, 0.026276f, 0.028992f,
- 0.032135f, 0.035492f, 0.039398f, 0.044037f, 0.049072f, 0.054443f, 0.061035f, 0.067871f,
- 0.076111f, 0.085632f, 0.096252f, 0.108154f, 0.122253f, 0.138306f, 0.156006f, 0.175903f,
- 0.199219f, 0.224243f, 0.251953f, 0.282715f, 0.315918f, 0.350830f, 0.387451f, 0.425781f,
- 0.465332f, 0.504395f, 0.544434f, 0.583008f, 0.620117f, 0.657715f, 0.692383f, 0.725098f,
- 0.755371f, 0.783691f, 0.919434f, 0.925781f, 0.926270f, 0.926758f, 0.926758f, 0.925781f,
- 0.000410f, 0.000856f, 0.001542f, 0.001844f, 0.002565f, 0.003380f, 0.003971f, 0.004246f,
- 0.005047f, 0.005863f, 0.006653f, 0.007744f, 0.008568f, 0.009407f, 0.010529f, 0.011482f,
- 0.012657f, 0.013924f, 0.015602f, 0.017105f, 0.018997f, 0.020859f, 0.022980f, 0.025192f,
- 0.028030f, 0.031036f, 0.034515f, 0.038300f, 0.042236f, 0.047180f, 0.052795f, 0.059113f,
- 0.065857f, 0.074097f, 0.083374f, 0.094360f, 0.105896f, 0.119873f, 0.135620f, 0.154175f,
- 0.174072f, 0.197632f, 0.223267f, 0.251465f, 0.283447f, 0.317139f, 0.353760f, 0.391113f,
- 0.431152f, 0.470703f, 0.512207f, 0.552734f, 0.592285f, 0.631348f, 0.669434f, 0.704590f,
- 0.737793f, 0.768555f, 0.913574f, 0.919922f, 0.920898f, 0.920898f, 0.921387f, 0.921387f,
- 0.000214f, 0.000619f, 0.001172f, 0.001941f, 0.002228f, 0.002960f, 0.003490f, 0.003994f,
- 0.004761f, 0.005180f, 0.005806f, 0.006622f, 0.007565f, 0.008301f, 0.009262f, 0.010170f,
- 0.011208f, 0.012482f, 0.013855f, 0.015060f, 0.016739f, 0.018311f, 0.020248f, 0.022034f,
- 0.024597f, 0.027084f, 0.030045f, 0.033051f, 0.036743f, 0.041016f, 0.045807f, 0.050964f,
- 0.056946f, 0.063904f, 0.071899f, 0.080994f, 0.091675f, 0.103699f, 0.117920f, 0.133667f,
- 0.151978f, 0.172729f, 0.196533f, 0.222534f, 0.252197f, 0.284424f, 0.319580f, 0.356689f,
- 0.396973f, 0.437500f, 0.479492f, 0.521484f, 0.562500f, 0.604004f, 0.644043f, 0.682129f,
- 0.718262f, 0.751465f, 0.907715f, 0.915039f, 0.916016f, 0.916504f, 0.916504f, 0.916504f,
- 0.000405f, 0.000760f, 0.001116f, 0.001688f, 0.002180f, 0.002670f, 0.003313f, 0.003569f,
- 0.003979f, 0.004543f, 0.005466f, 0.005985f, 0.006699f, 0.007359f, 0.008102f, 0.009094f,
- 0.009949f, 0.011055f, 0.012047f, 0.013412f, 0.014488f, 0.016068f, 0.017532f, 0.019348f,
- 0.021210f, 0.023834f, 0.025986f, 0.028854f, 0.031891f, 0.035339f, 0.039490f, 0.043976f,
- 0.049347f, 0.055084f, 0.061951f, 0.069763f, 0.078918f, 0.089478f, 0.101379f, 0.115479f,
- 0.131592f, 0.150024f, 0.171387f, 0.195068f, 0.222900f, 0.252686f, 0.286621f, 0.323242f,
- 0.362061f, 0.402588f, 0.445312f, 0.488770f, 0.532715f, 0.575684f, 0.618652f, 0.659180f,
- 0.698242f, 0.734375f, 0.901367f, 0.909180f, 0.911133f, 0.910645f, 0.911133f, 0.910645f,
- 0.000218f, 0.000539f, 0.001187f, 0.001617f, 0.001987f, 0.002316f, 0.002666f, 0.003176f,
- 0.003841f, 0.004425f, 0.004917f, 0.005402f, 0.005768f, 0.006462f, 0.007233f, 0.008018f,
- 0.008575f, 0.009758f, 0.010582f, 0.011520f, 0.012756f, 0.013832f, 0.015312f, 0.016968f,
- 0.018509f, 0.020279f, 0.022644f, 0.024857f, 0.027740f, 0.030472f, 0.033783f, 0.037567f,
- 0.042175f, 0.047150f, 0.052979f, 0.059601f, 0.067505f, 0.076538f, 0.087158f, 0.099243f,
- 0.113281f, 0.129272f, 0.148315f, 0.170532f, 0.194702f, 0.223267f, 0.254639f, 0.289795f,
- 0.327393f, 0.368408f, 0.410889f, 0.455322f, 0.499756f, 0.544434f, 0.590332f, 0.633789f,
- 0.676270f, 0.716309f, 0.895508f, 0.902344f, 0.903809f, 0.905762f, 0.903809f, 0.904297f,
- 0.000184f, 0.000612f, 0.001122f, 0.001464f, 0.001848f, 0.002150f, 0.002514f, 0.002651f,
- 0.003391f, 0.003666f, 0.004368f, 0.004677f, 0.005219f, 0.005882f, 0.006531f, 0.007019f,
- 0.007675f, 0.008530f, 0.009224f, 0.010269f, 0.011017f, 0.012146f, 0.013321f, 0.014626f,
- 0.016098f, 0.017639f, 0.019440f, 0.021317f, 0.023773f, 0.026123f, 0.029144f, 0.032410f,
- 0.036072f, 0.040314f, 0.045013f, 0.051086f, 0.057587f, 0.065308f, 0.074402f, 0.084961f,
- 0.097107f, 0.111267f, 0.127930f, 0.147217f, 0.169556f, 0.195312f, 0.224365f, 0.257568f,
- 0.294189f, 0.333496f, 0.375977f, 0.420166f, 0.467041f, 0.514160f, 0.561035f, 0.607422f,
- 0.652344f, 0.695312f, 0.888672f, 0.896484f, 0.897461f, 0.897461f, 0.897949f, 0.897949f,
- 0.000159f, 0.000537f, 0.000830f, 0.001206f, 0.001578f, 0.001760f, 0.002050f, 0.002504f,
- 0.002951f, 0.003397f, 0.003674f, 0.004238f, 0.004520f, 0.005245f, 0.005692f, 0.006138f,
- 0.006748f, 0.007240f, 0.008087f, 0.008728f, 0.009636f, 0.010437f, 0.011543f, 0.012611f,
- 0.013763f, 0.015266f, 0.016617f, 0.018433f, 0.020248f, 0.022354f, 0.024887f, 0.027390f,
- 0.030716f, 0.034454f, 0.038422f, 0.043365f, 0.048950f, 0.055511f, 0.062988f, 0.072021f,
- 0.082336f, 0.094727f, 0.109375f, 0.125977f, 0.145874f, 0.169556f, 0.195679f, 0.226929f,
- 0.260986f, 0.299805f, 0.341309f, 0.385498f, 0.432129f, 0.480957f, 0.529297f, 0.579102f,
- 0.627441f, 0.673828f, 0.881348f, 0.889160f, 0.890625f, 0.891113f, 0.891602f, 0.891113f,
- 0.000204f, 0.000566f, 0.000741f, 0.001033f, 0.001378f, 0.001599f, 0.001961f, 0.002354f,
- 0.002609f, 0.002974f, 0.003300f, 0.003609f, 0.004101f, 0.004463f, 0.004906f, 0.005337f,
- 0.006020f, 0.006290f, 0.007023f, 0.007656f, 0.008301f, 0.009140f, 0.009918f, 0.010933f,
- 0.011940f, 0.013107f, 0.014252f, 0.015656f, 0.017136f, 0.019058f, 0.021057f, 0.023209f,
- 0.025940f, 0.029190f, 0.032715f, 0.036591f, 0.041138f, 0.046661f, 0.053253f, 0.060944f,
- 0.069702f, 0.080444f, 0.092651f, 0.107788f, 0.124695f, 0.145630f, 0.169189f, 0.197632f,
- 0.229736f, 0.266113f, 0.306396f, 0.350586f, 0.397217f, 0.447021f, 0.497803f, 0.549805f,
- 0.600586f, 0.650391f, 0.872559f, 0.881836f, 0.882812f, 0.883301f, 0.884277f, 0.884277f,
- 0.000240f, 0.000349f, 0.000795f, 0.000892f, 0.001151f, 0.001377f, 0.001773f, 0.001984f,
- 0.002415f, 0.002602f, 0.002932f, 0.003168f, 0.003483f, 0.003906f, 0.004257f, 0.004681f,
- 0.005173f, 0.005596f, 0.006119f, 0.006550f, 0.007126f, 0.007759f, 0.008522f, 0.009270f,
- 0.010086f, 0.011108f, 0.012138f, 0.013199f, 0.014549f, 0.015884f, 0.017776f, 0.019623f,
- 0.022003f, 0.024384f, 0.027237f, 0.030624f, 0.034515f, 0.039215f, 0.044342f, 0.050873f,
- 0.058411f, 0.067017f, 0.078003f, 0.090332f, 0.105530f, 0.123718f, 0.144775f, 0.170410f,
- 0.200195f, 0.234131f, 0.272461f, 0.315674f, 0.362305f, 0.412354f, 0.465332f, 0.518555f,
- 0.572754f, 0.626465f, 0.863770f, 0.873047f, 0.875488f, 0.875488f, 0.875977f, 0.875977f,
- 0.000102f, 0.000298f, 0.000604f, 0.000950f, 0.001089f, 0.001472f, 0.001760f, 0.001823f,
- 0.001903f, 0.002325f, 0.002611f, 0.002775f, 0.003185f, 0.003405f, 0.003674f, 0.004005f,
- 0.004406f, 0.004814f, 0.005203f, 0.005665f, 0.006062f, 0.006702f, 0.007317f, 0.007881f,
- 0.008560f, 0.009239f, 0.010193f, 0.010994f, 0.012161f, 0.013588f, 0.015068f, 0.016479f,
- 0.018250f, 0.020386f, 0.022781f, 0.025665f, 0.028809f, 0.032501f, 0.037048f, 0.042297f,
- 0.048553f, 0.055908f, 0.065491f, 0.075378f, 0.088501f, 0.104248f, 0.122742f, 0.145874f,
- 0.171997f, 0.203247f, 0.239990f, 0.281250f, 0.326904f, 0.376953f, 0.430176f, 0.486328f,
- 0.542480f, 0.600586f, 0.855469f, 0.864746f, 0.866211f, 0.867188f, 0.867188f, 0.867188f,
- 0.000000f, 0.000357f, 0.000576f, 0.000692f, 0.001013f, 0.001069f, 0.001383f, 0.001702f,
- 0.001789f, 0.002102f, 0.002182f, 0.002377f, 0.002686f, 0.002985f, 0.003347f, 0.003359f,
- 0.003782f, 0.004036f, 0.004436f, 0.004749f, 0.005169f, 0.005672f, 0.006145f, 0.006649f,
- 0.007187f, 0.007828f, 0.008644f, 0.009529f, 0.010269f, 0.011200f, 0.012337f, 0.013596f,
- 0.015038f, 0.017044f, 0.018784f, 0.021011f, 0.023727f, 0.026871f, 0.030457f, 0.034637f,
- 0.039978f, 0.046478f, 0.053436f, 0.062622f, 0.073730f, 0.086792f, 0.102661f, 0.122437f,
- 0.146240f, 0.174561f, 0.208252f, 0.247437f, 0.291748f, 0.341064f, 0.395020f, 0.451904f,
- 0.511230f, 0.571777f, 0.844238f, 0.854980f, 0.857422f, 0.858887f, 0.857910f, 0.857910f,
- 0.000101f, 0.000326f, 0.000535f, 0.000683f, 0.000848f, 0.001161f, 0.001184f, 0.001284f,
- 0.001576f, 0.001701f, 0.001839f, 0.002167f, 0.002321f, 0.002584f, 0.002645f, 0.002941f,
- 0.003141f, 0.003538f, 0.003817f, 0.004112f, 0.004395f, 0.004646f, 0.005165f, 0.005531f,
- 0.006096f, 0.006496f, 0.007217f, 0.007767f, 0.008629f, 0.009163f, 0.010239f, 0.011276f,
- 0.012611f, 0.013779f, 0.015213f, 0.017120f, 0.019379f, 0.021606f, 0.024994f, 0.028351f,
- 0.032379f, 0.037201f, 0.043640f, 0.050903f, 0.060120f, 0.071045f, 0.084900f, 0.101868f,
- 0.122559f, 0.147827f, 0.178223f, 0.214722f, 0.257080f, 0.305664f, 0.358887f, 0.416992f,
- 0.478027f, 0.542969f, 0.834473f, 0.845215f, 0.847656f, 0.847656f, 0.847656f, 0.848633f,
- 0.000092f, 0.000316f, 0.000410f, 0.000556f, 0.000808f, 0.000918f, 0.001094f, 0.001287f,
- 0.001309f, 0.001411f, 0.001671f, 0.001780f, 0.001909f, 0.002092f, 0.002274f, 0.002523f,
- 0.002733f, 0.002974f, 0.003101f, 0.003401f, 0.003677f, 0.003956f, 0.004311f, 0.004551f,
- 0.004940f, 0.005444f, 0.005768f, 0.006451f, 0.006977f, 0.007568f, 0.008270f, 0.009201f,
- 0.010170f, 0.011230f, 0.012566f, 0.013939f, 0.015503f, 0.017761f, 0.020111f, 0.022873f,
- 0.025940f, 0.029938f, 0.035217f, 0.040985f, 0.048431f, 0.057770f, 0.069092f, 0.083618f,
- 0.100891f, 0.123047f, 0.150146f, 0.183838f, 0.223633f, 0.269531f, 0.322510f, 0.381348f,
- 0.444824f, 0.511719f, 0.823730f, 0.834473f, 0.835938f, 0.836914f, 0.836914f, 0.837402f,
- 0.000240f, 0.000273f, 0.000326f, 0.000564f, 0.000682f, 0.000807f, 0.000854f, 0.000949f,
- 0.001139f, 0.001238f, 0.001404f, 0.001548f, 0.001637f, 0.001840f, 0.001893f, 0.002077f,
- 0.002321f, 0.002434f, 0.002642f, 0.002821f, 0.003044f, 0.003271f, 0.003649f, 0.003763f,
- 0.004208f, 0.004448f, 0.004986f, 0.005169f, 0.005657f, 0.006279f, 0.006680f, 0.007442f,
- 0.008194f, 0.008881f, 0.009895f, 0.010918f, 0.012138f, 0.013924f, 0.015915f, 0.018112f,
- 0.020645f, 0.023743f, 0.027817f, 0.032745f, 0.038361f, 0.045990f, 0.055481f, 0.066895f,
- 0.082031f, 0.100769f, 0.124573f, 0.154541f, 0.190796f, 0.235107f, 0.286133f, 0.344238f,
- 0.408936f, 0.478271f, 0.810547f, 0.822266f, 0.824707f, 0.825195f, 0.825684f, 0.825684f,
- 0.000115f, 0.000222f, 0.000252f, 0.000524f, 0.000574f, 0.000673f, 0.000869f, 0.000928f,
- 0.000963f, 0.001022f, 0.001246f, 0.001292f, 0.001404f, 0.001477f, 0.001652f, 0.001811f,
- 0.001822f, 0.002058f, 0.002237f, 0.002371f, 0.002588f, 0.002645f, 0.003019f, 0.003080f,
- 0.003506f, 0.003689f, 0.003904f, 0.004383f, 0.004707f, 0.005020f, 0.005386f, 0.006023f,
- 0.006451f, 0.007038f, 0.007809f, 0.008911f, 0.009949f, 0.011200f, 0.012222f, 0.014137f,
- 0.016068f, 0.018692f, 0.021683f, 0.025314f, 0.029861f, 0.035889f, 0.043335f, 0.052582f,
- 0.065186f, 0.080627f, 0.101501f, 0.127441f, 0.159912f, 0.200806f, 0.250000f, 0.307129f,
- 0.371582f, 0.444580f, 0.798340f, 0.809570f, 0.811523f, 0.812988f, 0.812988f, 0.812988f,
- 0.000000f, 0.000211f, 0.000204f, 0.000474f, 0.000555f, 0.000583f, 0.000600f, 0.000593f,
- 0.000812f, 0.000865f, 0.000941f, 0.001013f, 0.001162f, 0.001348f, 0.001418f, 0.001465f,
- 0.001616f, 0.001722f, 0.001856f, 0.001888f, 0.002048f, 0.002321f, 0.002396f, 0.002632f,
- 0.002821f, 0.002974f, 0.003265f, 0.003477f, 0.003632f, 0.004051f, 0.004299f, 0.004700f,
- 0.005238f, 0.005592f, 0.006199f, 0.006756f, 0.007614f, 0.008324f, 0.009727f, 0.010811f,
- 0.012337f, 0.014168f, 0.016434f, 0.019257f, 0.022858f, 0.027451f, 0.033295f, 0.040619f,
- 0.050690f, 0.063416f, 0.080261f, 0.102295f, 0.131104f, 0.168335f, 0.214355f, 0.270508f,
- 0.334717f, 0.408936f, 0.783691f, 0.795898f, 0.798340f, 0.799316f, 0.800293f, 0.800293f,
- 0.000174f, 0.000090f, 0.000281f, 0.000397f, 0.000401f, 0.000450f, 0.000488f, 0.000640f,
- 0.000674f, 0.000713f, 0.000753f, 0.000845f, 0.000872f, 0.001020f, 0.001115f, 0.001264f,
- 0.001327f, 0.001373f, 0.001520f, 0.001616f, 0.001767f, 0.001875f, 0.001968f, 0.002090f,
- 0.002232f, 0.002333f, 0.002472f, 0.002802f, 0.002926f, 0.003189f, 0.003569f, 0.003752f,
- 0.004009f, 0.004513f, 0.004860f, 0.005375f, 0.005997f, 0.006561f, 0.007378f, 0.008347f,
- 0.009384f, 0.010612f, 0.012466f, 0.014526f, 0.017075f, 0.020447f, 0.024887f, 0.030533f,
- 0.038300f, 0.048584f, 0.062042f, 0.080383f, 0.104736f, 0.137329f, 0.180176f, 0.232544f,
- 0.296875f, 0.371338f, 0.769043f, 0.781250f, 0.784180f, 0.784668f, 0.786133f, 0.786133f,
- 0.000025f, 0.000135f, 0.000154f, 0.000260f, 0.000353f, 0.000364f, 0.000380f, 0.000520f,
- 0.000548f, 0.000587f, 0.000712f, 0.000735f, 0.000772f, 0.000822f, 0.000886f, 0.001004f,
- 0.000946f, 0.001115f, 0.001177f, 0.001266f, 0.001454f, 0.001527f, 0.001575f, 0.001680f,
- 0.001883f, 0.001961f, 0.002043f, 0.002193f, 0.002281f, 0.002520f, 0.002712f, 0.003021f,
- 0.003147f, 0.003561f, 0.003786f, 0.004116f, 0.004570f, 0.005058f, 0.005634f, 0.006165f,
- 0.007095f, 0.008049f, 0.009201f, 0.010674f, 0.012550f, 0.014854f, 0.018051f, 0.022385f,
- 0.027908f, 0.035522f, 0.046295f, 0.061035f, 0.081238f, 0.109131f, 0.146729f, 0.197021f,
- 0.258301f, 0.333008f, 0.752441f, 0.766113f, 0.768555f, 0.769531f, 0.770020f, 0.769531f,
- 0.000000f, 0.000121f, 0.000209f, 0.000291f, 0.000337f, 0.000307f, 0.000324f, 0.000415f,
- 0.000426f, 0.000453f, 0.000491f, 0.000573f, 0.000644f, 0.000650f, 0.000781f, 0.000746f,
- 0.000830f, 0.000803f, 0.000997f, 0.001017f, 0.001020f, 0.001158f, 0.001241f, 0.001317f,
- 0.001375f, 0.001432f, 0.001524f, 0.001656f, 0.001858f, 0.001955f, 0.002050f, 0.002274f,
- 0.002460f, 0.002724f, 0.002831f, 0.003050f, 0.003441f, 0.003790f, 0.004162f, 0.004623f,
- 0.005219f, 0.005951f, 0.006721f, 0.007729f, 0.008926f, 0.010620f, 0.013000f, 0.015686f,
- 0.019852f, 0.025436f, 0.033295f, 0.044617f, 0.060608f, 0.083313f, 0.116211f, 0.161499f,
- 0.220093f, 0.293945f, 0.734863f, 0.749512f, 0.752441f, 0.752930f, 0.753906f, 0.753906f,
- 0.000000f, 0.000121f, 0.000118f, 0.000246f, 0.000233f, 0.000252f, 0.000338f, 0.000282f,
- 0.000353f, 0.000355f, 0.000448f, 0.000435f, 0.000464f, 0.000530f, 0.000578f, 0.000649f,
- 0.000677f, 0.000710f, 0.000749f, 0.000792f, 0.000881f, 0.000903f, 0.000967f, 0.001049f,
- 0.001041f, 0.001100f, 0.001176f, 0.001254f, 0.001402f, 0.001451f, 0.001697f, 0.001674f,
- 0.001804f, 0.001914f, 0.002195f, 0.002451f, 0.002474f, 0.002758f, 0.003029f, 0.003483f,
- 0.003824f, 0.004272f, 0.004833f, 0.005573f, 0.006477f, 0.007629f, 0.009041f, 0.010918f,
- 0.013573f, 0.017319f, 0.022842f, 0.031036f, 0.043030f, 0.061096f, 0.088440f, 0.127563f,
- 0.182861f, 0.254395f, 0.717285f, 0.731934f, 0.734863f, 0.735352f, 0.735840f, 0.736328f,
- 0.000000f, 0.000000f, 0.000117f, 0.000163f, 0.000109f, 0.000208f, 0.000212f, 0.000208f,
- 0.000270f, 0.000356f, 0.000324f, 0.000377f, 0.000391f, 0.000420f, 0.000449f, 0.000440f,
- 0.000484f, 0.000504f, 0.000534f, 0.000561f, 0.000639f, 0.000667f, 0.000715f, 0.000722f,
- 0.000799f, 0.000845f, 0.000939f, 0.000945f, 0.001053f, 0.001149f, 0.001252f, 0.001310f,
- 0.001392f, 0.001507f, 0.001526f, 0.001710f, 0.001773f, 0.002111f, 0.002300f, 0.002443f,
- 0.002661f, 0.002996f, 0.003376f, 0.003880f, 0.004482f, 0.005150f, 0.006115f, 0.007401f,
- 0.009132f, 0.011696f, 0.015076f, 0.020416f, 0.029236f, 0.042389f, 0.063782f, 0.096802f,
- 0.146362f, 0.215576f, 0.698242f, 0.712891f, 0.715332f, 0.716797f, 0.717285f, 0.717285f,
- 0.000000f, 0.000118f, 0.000115f, 0.000133f, 0.000144f, 0.000147f, 0.000162f, 0.000150f,
- 0.000194f, 0.000215f, 0.000228f, 0.000299f, 0.000271f, 0.000313f, 0.000328f, 0.000358f,
- 0.000378f, 0.000360f, 0.000407f, 0.000438f, 0.000441f, 0.000488f, 0.000515f, 0.000544f,
- 0.000576f, 0.000617f, 0.000659f, 0.000715f, 0.000741f, 0.000773f, 0.000850f, 0.000921f,
- 0.000979f, 0.001066f, 0.001128f, 0.001292f, 0.001279f, 0.001400f, 0.001572f, 0.001668f,
- 0.001869f, 0.002029f, 0.002295f, 0.002607f, 0.002985f, 0.003464f, 0.004066f, 0.004913f,
- 0.006023f, 0.007519f, 0.009827f, 0.013016f, 0.018524f, 0.027481f, 0.042847f, 0.068970f,
- 0.111938f, 0.176392f, 0.675781f, 0.692871f, 0.695801f, 0.696777f, 0.698242f, 0.697754f,
- 0.000000f, 0.000000f, 0.000111f, 0.000108f, 0.000104f, 0.000102f, 0.000118f, 0.000120f,
- 0.000134f, 0.000128f, 0.000188f, 0.000154f, 0.000197f, 0.000188f, 0.000245f, 0.000256f,
- 0.000233f, 0.000266f, 0.000345f, 0.000281f, 0.000355f, 0.000322f, 0.000392f, 0.000358f,
- 0.000437f, 0.000425f, 0.000458f, 0.000477f, 0.000564f, 0.000636f, 0.000578f, 0.000607f,
- 0.000668f, 0.000719f, 0.000769f, 0.000832f, 0.000880f, 0.000953f, 0.001060f, 0.001116f,
- 0.001226f, 0.001363f, 0.001486f, 0.001760f, 0.001944f, 0.002216f, 0.002605f, 0.003107f,
- 0.003778f, 0.004715f, 0.005989f, 0.007942f, 0.011292f, 0.016632f, 0.026550f, 0.045532f,
- 0.079956f, 0.138550f, 0.655762f, 0.671875f, 0.674805f, 0.675293f, 0.675781f, 0.678223f,
- 0.000000f, 0.000112f, 0.000105f, 0.000102f, 0.000098f, 0.000095f, 0.000093f, 0.000088f,
- 0.000089f, 0.000085f, 0.000095f, 0.000126f, 0.000109f, 0.000154f, 0.000153f, 0.000162f,
- 0.000176f, 0.000190f, 0.000202f, 0.000204f, 0.000212f, 0.000214f, 0.000266f, 0.000239f,
- 0.000279f, 0.000293f, 0.000329f, 0.000329f, 0.000339f, 0.000365f, 0.000437f, 0.000424f,
- 0.000429f, 0.000474f, 0.000525f, 0.000596f, 0.000572f, 0.000612f, 0.000666f, 0.000723f,
- 0.000791f, 0.000850f, 0.000977f, 0.001066f, 0.001225f, 0.001351f, 0.001555f, 0.001837f,
- 0.002279f, 0.002760f, 0.003445f, 0.004612f, 0.006386f, 0.009438f, 0.015221f, 0.027008f,
- 0.052551f, 0.102966f, 0.633789f, 0.649414f, 0.652832f, 0.653809f, 0.655273f, 0.655273f,
- 0.000000f, 0.000105f, 0.000099f, 0.000094f, 0.000090f, 0.000087f, 0.000084f, 0.000082f,
- 0.000079f, 0.000075f, 0.000071f, 0.000068f, 0.000064f, 0.000072f, 0.000096f, 0.000105f,
- 0.000112f, 0.000088f, 0.000123f, 0.000129f, 0.000132f, 0.000140f, 0.000147f, 0.000170f,
- 0.000188f, 0.000192f, 0.000171f, 0.000210f, 0.000217f, 0.000223f, 0.000237f, 0.000251f,
- 0.000258f, 0.000294f, 0.000298f, 0.000316f, 0.000350f, 0.000382f, 0.000400f, 0.000437f,
- 0.000479f, 0.000514f, 0.000576f, 0.000620f, 0.000688f, 0.000782f, 0.000916f, 0.001026f,
- 0.001219f, 0.001502f, 0.001892f, 0.002424f, 0.003359f, 0.004974f, 0.008118f, 0.014343f,
- 0.030075f, 0.070068f, 0.610352f, 0.626953f, 0.629883f, 0.631348f, 0.632324f, 0.632324f,
- 0.000110f, 0.000094f, 0.000087f, 0.000081f, 0.000077f, 0.000075f, 0.000072f, 0.000069f,
- 0.000067f, 0.000066f, 0.000064f, 0.000062f, 0.000058f, 0.000056f, 0.000053f, 0.000051f,
- 0.000054f, 0.000047f, 0.000057f, 0.000055f, 0.000075f, 0.000078f, 0.000086f, 0.000093f,
- 0.000093f, 0.000102f, 0.000112f, 0.000113f, 0.000130f, 0.000128f, 0.000142f, 0.000145f,
- 0.000156f, 0.000153f, 0.000180f, 0.000178f, 0.000183f, 0.000223f, 0.000230f, 0.000240f,
- 0.000265f, 0.000276f, 0.000300f, 0.000332f, 0.000357f, 0.000411f, 0.000449f, 0.000540f,
- 0.000615f, 0.000741f, 0.000916f, 0.001144f, 0.001566f, 0.002310f, 0.003731f, 0.006905f,
- 0.014793f, 0.041779f, 0.585938f, 0.603027f, 0.605957f, 0.608398f, 0.608398f, 0.609375f,
- 0.000090f, 0.000071f, 0.000066f, 0.000062f, 0.000058f, 0.000056f, 0.000053f, 0.000053f,
- 0.000051f, 0.000051f, 0.000049f, 0.000048f, 0.000048f, 0.000047f, 0.000045f, 0.000043f,
- 0.000042f, 0.000040f, 0.000038f, 0.000036f, 0.000036f, 0.000033f, 0.000034f, 0.000040f,
- 0.000040f, 0.000040f, 0.000048f, 0.000053f, 0.000060f, 0.000064f, 0.000067f, 0.000070f,
- 0.000075f, 0.000081f, 0.000085f, 0.000090f, 0.000091f, 0.000103f, 0.000106f, 0.000120f,
- 0.000134f, 0.000138f, 0.000142f, 0.000156f, 0.000174f, 0.000180f, 0.000212f, 0.000239f,
- 0.000253f, 0.000310f, 0.000377f, 0.000479f, 0.000627f, 0.000875f, 0.001396f, 0.002623f,
- 0.006184f, 0.019897f, 0.560547f, 0.578125f, 0.581543f, 0.583008f, 0.583984f, 0.583984f,
- 0.000038f, 0.000035f, 0.000031f, 0.000031f, 0.000030f, 0.000031f, 0.000031f, 0.000030f,
- 0.000030f, 0.000028f, 0.000029f, 0.000030f, 0.000029f, 0.000028f, 0.000029f, 0.000029f,
- 0.000029f, 0.000029f, 0.000029f, 0.000028f, 0.000027f, 0.000026f, 0.000025f, 0.000024f,
- 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000021f, 0.000019f, 0.000022f,
- 0.000023f, 0.000027f, 0.000031f, 0.000035f, 0.000037f, 0.000039f, 0.000039f, 0.000043f,
- 0.000049f, 0.000052f, 0.000056f, 0.000050f, 0.000068f, 0.000062f, 0.000070f, 0.000087f,
- 0.000094f, 0.000107f, 0.000122f, 0.000140f, 0.000191f, 0.000247f, 0.000388f, 0.000710f,
- 0.001781f, 0.007076f, 0.535156f, 0.553223f, 0.556152f, 0.558105f, 0.559082f, 0.559082f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000003f, 0.000003f, 0.000005f, 0.000006f, 0.000007f, 0.000007f, 0.000009f,
- 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000012f, 0.000012f,
- 0.000012f, 0.000013f, 0.000013f, 0.000013f, 0.000013f, 0.000012f, 0.000012f, 0.000011f,
- 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000009f,
- 0.000009f, 0.000010f, 0.000011f, 0.000015f, 0.000017f, 0.000016f, 0.000018f, 0.000021f,
- 0.000020f, 0.000024f, 0.000024f, 0.000032f, 0.000035f, 0.000045f, 0.000065f, 0.000105f,
- 0.000246f, 0.001313f, 0.508789f, 0.527344f, 0.530762f, 0.531738f, 0.532715f, 0.533691f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f,
- 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f,
- 0.000005f, 0.000018f, 0.481934f, 0.500977f, 0.504883f, 0.505859f, 0.507324f, 0.507812f,
- },
- {
- 0.053833f, 0.152832f, 0.239014f, 0.313477f, 0.377686f, 0.433838f, 0.481689f, 0.524414f,
- 0.562988f, 0.596680f, 0.626953f, 0.654785f, 0.678711f, 0.700684f, 0.720703f, 0.739746f,
- 0.755859f, 0.771973f, 0.787109f, 0.798828f, 0.812012f, 0.823730f, 0.833984f, 0.844238f,
- 0.853027f, 0.862793f, 0.870605f, 0.878418f, 0.885254f, 0.892090f, 0.898926f, 0.904297f,
- 0.910645f, 0.916504f, 0.921875f, 0.926270f, 0.931641f, 0.936035f, 0.939941f, 0.944336f,
- 0.948242f, 0.952148f, 0.955566f, 0.959961f, 0.962402f, 0.966309f, 0.969238f, 0.972168f,
- 0.975098f, 0.978027f, 0.980957f, 0.983398f, 0.985840f, 0.988281f, 0.990723f, 0.992676f,
- 0.995117f, 0.996582f, 0.998047f, 0.995117f, 0.993164f, 0.990723f, 0.988770f, 0.986816f,
- 0.036804f, 0.109497f, 0.178589f, 0.244751f, 0.305908f, 0.361084f, 0.411621f, 0.457275f,
- 0.498535f, 0.536133f, 0.569824f, 0.601562f, 0.629883f, 0.655273f, 0.679688f, 0.700195f,
- 0.720215f, 0.737793f, 0.755859f, 0.770508f, 0.785645f, 0.798340f, 0.811035f, 0.822754f,
- 0.833008f, 0.843750f, 0.852539f, 0.861328f, 0.869629f, 0.877441f, 0.885742f, 0.892578f,
- 0.898926f, 0.905273f, 0.911133f, 0.916504f, 0.921875f, 0.926758f, 0.931641f, 0.936523f,
- 0.940430f, 0.945312f, 0.949219f, 0.953613f, 0.956543f, 0.960449f, 0.963867f, 0.967285f,
- 0.970703f, 0.973633f, 0.976562f, 0.979004f, 0.981934f, 0.984375f, 0.986816f, 0.989746f,
- 0.992188f, 0.994141f, 0.996582f, 0.994141f, 0.992188f, 0.990234f, 0.988281f, 0.986328f,
- 0.025787f, 0.080383f, 0.136230f, 0.191650f, 0.245239f, 0.297119f, 0.345947f, 0.392822f,
- 0.436035f, 0.476807f, 0.513184f, 0.547363f, 0.578125f, 0.607910f, 0.634766f, 0.658203f,
- 0.681152f, 0.702637f, 0.721191f, 0.738770f, 0.755371f, 0.770508f, 0.784668f, 0.798828f,
- 0.810547f, 0.821777f, 0.833984f, 0.843262f, 0.852539f, 0.861816f, 0.869629f, 0.877930f,
- 0.885254f, 0.893555f, 0.898926f, 0.906250f, 0.911621f, 0.917969f, 0.923340f, 0.928223f,
- 0.933105f, 0.937500f, 0.941406f, 0.946289f, 0.950195f, 0.954102f, 0.958496f, 0.961914f,
- 0.965820f, 0.968750f, 0.971680f, 0.975098f, 0.978027f, 0.980469f, 0.983887f, 0.985840f,
- 0.988770f, 0.991211f, 0.995117f, 0.993164f, 0.991211f, 0.989258f, 0.987305f, 0.985352f,
- 0.019455f, 0.060944f, 0.104553f, 0.150513f, 0.196411f, 0.243164f, 0.289062f, 0.333740f,
- 0.376709f, 0.417725f, 0.454346f, 0.491211f, 0.524414f, 0.556641f, 0.585938f, 0.613770f,
- 0.639160f, 0.662598f, 0.682617f, 0.703613f, 0.723633f, 0.740723f, 0.756836f, 0.771973f,
- 0.787109f, 0.798828f, 0.812012f, 0.823242f, 0.833984f, 0.844238f, 0.853516f, 0.863281f,
- 0.871094f, 0.879395f, 0.886719f, 0.893555f, 0.899902f, 0.907227f, 0.913086f, 0.918945f,
- 0.924805f, 0.928711f, 0.934082f, 0.938965f, 0.943848f, 0.947754f, 0.952637f, 0.955566f,
- 0.959961f, 0.963867f, 0.966797f, 0.970215f, 0.973633f, 0.977051f, 0.979004f, 0.982422f,
- 0.985840f, 0.987793f, 0.993652f, 0.991699f, 0.989746f, 0.988281f, 0.986328f, 0.984375f,
- 0.015221f, 0.047363f, 0.082092f, 0.119202f, 0.159058f, 0.199219f, 0.239380f, 0.280762f,
- 0.321533f, 0.362061f, 0.400146f, 0.436768f, 0.472900f, 0.504883f, 0.536621f, 0.566406f,
- 0.594238f, 0.621094f, 0.645508f, 0.667969f, 0.688477f, 0.707520f, 0.726562f, 0.742676f,
- 0.759277f, 0.773926f, 0.787598f, 0.800781f, 0.812988f, 0.825195f, 0.835938f, 0.846191f,
- 0.856445f, 0.865234f, 0.872559f, 0.880859f, 0.888672f, 0.895020f, 0.902832f, 0.908203f,
- 0.914551f, 0.919922f, 0.926758f, 0.931152f, 0.937012f, 0.941406f, 0.945312f, 0.949707f,
- 0.954102f, 0.958496f, 0.962402f, 0.965820f, 0.969238f, 0.972168f, 0.976074f, 0.978516f,
- 0.981934f, 0.984863f, 0.992188f, 0.990723f, 0.988770f, 0.987305f, 0.985352f, 0.983887f,
- 0.011658f, 0.037170f, 0.065430f, 0.096008f, 0.128784f, 0.162842f, 0.198975f, 0.235596f,
- 0.273926f, 0.310791f, 0.348145f, 0.385010f, 0.420410f, 0.454834f, 0.488037f, 0.519043f,
- 0.548828f, 0.577148f, 0.603516f, 0.627441f, 0.650879f, 0.672363f, 0.693848f, 0.712402f,
- 0.729980f, 0.748535f, 0.762207f, 0.778809f, 0.791504f, 0.804199f, 0.815918f, 0.827637f,
- 0.838867f, 0.848145f, 0.857910f, 0.866211f, 0.875977f, 0.883301f, 0.891602f, 0.898438f,
- 0.905273f, 0.911133f, 0.917480f, 0.923340f, 0.928711f, 0.933594f, 0.938477f, 0.942871f,
- 0.948242f, 0.952637f, 0.956543f, 0.960449f, 0.964355f, 0.968262f, 0.971191f, 0.974609f,
- 0.978027f, 0.980957f, 0.990723f, 0.989258f, 0.987793f, 0.985840f, 0.984375f, 0.983398f,
- 0.009758f, 0.030121f, 0.052490f, 0.077576f, 0.104309f, 0.134277f, 0.164917f, 0.197510f,
- 0.231812f, 0.266113f, 0.301025f, 0.336426f, 0.372070f, 0.405762f, 0.438721f, 0.471436f,
- 0.502441f, 0.531738f, 0.560059f, 0.587402f, 0.612793f, 0.634766f, 0.658691f, 0.679199f,
- 0.699219f, 0.718262f, 0.735352f, 0.751953f, 0.767090f, 0.780762f, 0.794922f, 0.808105f,
- 0.820801f, 0.831055f, 0.842285f, 0.851562f, 0.861328f, 0.870117f, 0.878906f, 0.886719f,
- 0.893555f, 0.900879f, 0.907715f, 0.913574f, 0.919434f, 0.926270f, 0.932129f, 0.936523f,
- 0.941895f, 0.945801f, 0.951172f, 0.955078f, 0.959473f, 0.963867f, 0.966797f, 0.970703f,
- 0.974121f, 0.977539f, 0.989746f, 0.988281f, 0.986328f, 0.984863f, 0.983398f, 0.982422f,
- 0.007744f, 0.024567f, 0.043365f, 0.063782f, 0.086487f, 0.111389f, 0.137451f, 0.166260f,
- 0.195435f, 0.226929f, 0.259033f, 0.291748f, 0.324951f, 0.358398f, 0.391113f, 0.424316f,
- 0.456299f, 0.486328f, 0.516113f, 0.543945f, 0.571289f, 0.597656f, 0.621094f, 0.644531f,
- 0.666504f, 0.686523f, 0.705078f, 0.724121f, 0.741211f, 0.757324f, 0.773438f, 0.786621f,
- 0.801270f, 0.812988f, 0.823730f, 0.835938f, 0.846191f, 0.855957f, 0.865723f, 0.873047f,
- 0.882324f, 0.889648f, 0.897949f, 0.905762f, 0.911133f, 0.917969f, 0.923828f, 0.929199f,
- 0.934082f, 0.940430f, 0.944824f, 0.949707f, 0.954102f, 0.958008f, 0.962891f, 0.966309f,
- 0.970215f, 0.974121f, 0.987793f, 0.986816f, 0.985352f, 0.983887f, 0.981934f, 0.980469f,
- 0.006672f, 0.020828f, 0.035950f, 0.053345f, 0.071594f, 0.092834f, 0.114624f, 0.139282f,
- 0.165649f, 0.192627f, 0.222290f, 0.252197f, 0.283203f, 0.314941f, 0.346680f, 0.377930f,
- 0.409668f, 0.441650f, 0.471680f, 0.500977f, 0.529297f, 0.557129f, 0.583008f, 0.607422f,
- 0.630859f, 0.654297f, 0.674805f, 0.694824f, 0.713867f, 0.731445f, 0.748535f, 0.763672f,
- 0.778320f, 0.791992f, 0.805664f, 0.817871f, 0.829590f, 0.840332f, 0.850098f, 0.860352f,
- 0.869141f, 0.878906f, 0.886719f, 0.894043f, 0.901855f, 0.909180f, 0.915527f, 0.920898f,
- 0.927246f, 0.933105f, 0.938477f, 0.943848f, 0.948730f, 0.953125f, 0.957520f, 0.961914f,
- 0.965820f, 0.970215f, 0.985840f, 0.985352f, 0.983887f, 0.981934f, 0.980957f, 0.979492f,
- 0.005592f, 0.017181f, 0.030457f, 0.044739f, 0.060638f, 0.077454f, 0.097046f, 0.117981f,
- 0.140625f, 0.164673f, 0.190552f, 0.217896f, 0.246582f, 0.275635f, 0.305176f, 0.336426f,
- 0.366943f, 0.397949f, 0.428711f, 0.457764f, 0.487061f, 0.515137f, 0.542480f, 0.568848f,
- 0.593750f, 0.619141f, 0.641602f, 0.662598f, 0.683594f, 0.703613f, 0.721191f, 0.738281f,
- 0.755859f, 0.770996f, 0.784180f, 0.799316f, 0.811035f, 0.823730f, 0.833984f, 0.845703f,
- 0.855957f, 0.865234f, 0.875000f, 0.883301f, 0.891602f, 0.898926f, 0.906738f, 0.912598f,
- 0.919922f, 0.926270f, 0.931152f, 0.937988f, 0.942871f, 0.948242f, 0.952148f, 0.957520f,
- 0.961914f, 0.966309f, 0.984375f, 0.983398f, 0.982422f, 0.981445f, 0.979492f, 0.978027f,
- 0.004829f, 0.014816f, 0.025711f, 0.037964f, 0.051300f, 0.065796f, 0.082458f, 0.100037f,
- 0.120178f, 0.141357f, 0.163330f, 0.187622f, 0.213013f, 0.240601f, 0.268311f, 0.296387f,
- 0.325928f, 0.356445f, 0.385742f, 0.415771f, 0.445557f, 0.474121f, 0.501465f, 0.530762f,
- 0.556152f, 0.581543f, 0.606445f, 0.630859f, 0.651855f, 0.672852f, 0.693359f, 0.712402f,
- 0.730469f, 0.746582f, 0.762695f, 0.777832f, 0.791992f, 0.806152f, 0.818359f, 0.830566f,
- 0.840820f, 0.852051f, 0.862305f, 0.871094f, 0.880371f, 0.888184f, 0.896484f, 0.904297f,
- 0.910645f, 0.917969f, 0.924316f, 0.931152f, 0.936035f, 0.942383f, 0.947266f, 0.951660f,
- 0.957031f, 0.960938f, 0.982422f, 0.982422f, 0.981445f, 0.979492f, 0.978516f, 0.977051f,
- 0.004040f, 0.012436f, 0.022064f, 0.032440f, 0.044006f, 0.056549f, 0.070068f, 0.085999f,
- 0.102539f, 0.120239f, 0.140625f, 0.161621f, 0.184448f, 0.208496f, 0.234253f, 0.260742f,
- 0.288086f, 0.316406f, 0.345215f, 0.374512f, 0.404297f, 0.433350f, 0.462402f, 0.490234f,
- 0.518066f, 0.543945f, 0.570312f, 0.594727f, 0.618652f, 0.642090f, 0.663086f, 0.683594f,
- 0.703613f, 0.721680f, 0.739258f, 0.755859f, 0.772461f, 0.786621f, 0.798828f, 0.812500f,
- 0.825195f, 0.836914f, 0.848633f, 0.858887f, 0.869141f, 0.877441f, 0.886230f, 0.894531f,
- 0.902832f, 0.909668f, 0.916992f, 0.923340f, 0.929688f, 0.935547f, 0.941406f, 0.947266f,
- 0.951660f, 0.957031f, 0.980469f, 0.980469f, 0.979492f, 0.978516f, 0.977051f, 0.976074f,
- 0.003536f, 0.010872f, 0.018829f, 0.027893f, 0.037872f, 0.048492f, 0.060883f, 0.073425f,
- 0.088074f, 0.103638f, 0.120789f, 0.139038f, 0.159912f, 0.181274f, 0.204102f, 0.227905f,
- 0.253906f, 0.280518f, 0.307861f, 0.335938f, 0.364746f, 0.393311f, 0.421631f, 0.451416f,
- 0.479004f, 0.505859f, 0.533203f, 0.560059f, 0.584473f, 0.608398f, 0.631836f, 0.653320f,
- 0.674805f, 0.695801f, 0.714355f, 0.731934f, 0.749512f, 0.765137f, 0.781250f, 0.794434f,
- 0.808594f, 0.821289f, 0.833496f, 0.844238f, 0.855469f, 0.866211f, 0.875000f, 0.883789f,
- 0.892578f, 0.901855f, 0.908691f, 0.915527f, 0.922852f, 0.929199f, 0.935059f, 0.941406f,
- 0.947266f, 0.951172f, 0.978516f, 0.979004f, 0.978027f, 0.977051f, 0.975586f, 0.974121f,
- 0.002989f, 0.009476f, 0.016785f, 0.024246f, 0.032745f, 0.041809f, 0.052246f, 0.063782f,
- 0.076111f, 0.089722f, 0.104675f, 0.120605f, 0.138306f, 0.157959f, 0.178101f, 0.200073f,
- 0.223145f, 0.247192f, 0.273193f, 0.300293f, 0.327148f, 0.354736f, 0.383545f, 0.411621f,
- 0.439941f, 0.468018f, 0.495605f, 0.522949f, 0.548828f, 0.574219f, 0.598145f, 0.622559f,
- 0.645508f, 0.666016f, 0.687500f, 0.706543f, 0.725586f, 0.743164f, 0.759766f, 0.775391f,
- 0.791016f, 0.803711f, 0.817871f, 0.829590f, 0.841797f, 0.852539f, 0.863281f, 0.873047f,
- 0.882812f, 0.891113f, 0.900391f, 0.906738f, 0.915039f, 0.922852f, 0.929688f, 0.936035f,
- 0.941895f, 0.946777f, 0.976074f, 0.977051f, 0.976074f, 0.975586f, 0.974121f, 0.972656f,
- 0.002846f, 0.008568f, 0.014557f, 0.021484f, 0.028442f, 0.036377f, 0.045074f, 0.055054f,
- 0.066101f, 0.077759f, 0.090759f, 0.104797f, 0.120483f, 0.136719f, 0.155029f, 0.175171f,
- 0.196045f, 0.218262f, 0.241943f, 0.266357f, 0.292480f, 0.319336f, 0.345703f, 0.373535f,
- 0.402100f, 0.429932f, 0.457764f, 0.484863f, 0.512207f, 0.539062f, 0.564941f, 0.589844f,
- 0.613281f, 0.636719f, 0.659180f, 0.680664f, 0.700684f, 0.718750f, 0.736816f, 0.754883f,
- 0.770508f, 0.785645f, 0.799805f, 0.813965f, 0.826172f, 0.838867f, 0.850586f, 0.861328f,
- 0.871582f, 0.881836f, 0.890625f, 0.898926f, 0.906738f, 0.915039f, 0.922363f, 0.928711f,
- 0.936035f, 0.941895f, 0.974609f, 0.975098f, 0.974609f, 0.973633f, 0.972656f, 0.971191f,
- 0.002285f, 0.007290f, 0.012634f, 0.018280f, 0.024918f, 0.032074f, 0.039673f, 0.048157f,
- 0.057220f, 0.067810f, 0.078735f, 0.091248f, 0.104370f, 0.119873f, 0.135742f, 0.152344f,
- 0.171631f, 0.191650f, 0.213501f, 0.236206f, 0.260010f, 0.285156f, 0.310547f, 0.338135f,
- 0.364746f, 0.392578f, 0.420410f, 0.448242f, 0.476562f, 0.502441f, 0.529785f, 0.555664f,
- 0.581543f, 0.605469f, 0.629395f, 0.652344f, 0.673340f, 0.693848f, 0.713867f, 0.732910f,
- 0.750000f, 0.767090f, 0.782715f, 0.797852f, 0.811035f, 0.825195f, 0.836914f, 0.848633f,
- 0.860840f, 0.870605f, 0.880371f, 0.890137f, 0.898926f, 0.907227f, 0.915527f, 0.923340f,
- 0.929688f, 0.936523f, 0.972168f, 0.973145f, 0.972656f, 0.972168f, 0.970703f, 0.969727f,
- 0.002064f, 0.006584f, 0.011154f, 0.016266f, 0.022263f, 0.028397f, 0.034973f, 0.042145f,
- 0.050232f, 0.059235f, 0.069031f, 0.079346f, 0.091736f, 0.104553f, 0.118652f, 0.133789f,
- 0.150635f, 0.168457f, 0.188110f, 0.208984f, 0.230225f, 0.253906f, 0.278076f, 0.303955f,
- 0.329346f, 0.356689f, 0.384033f, 0.411865f, 0.439941f, 0.467285f, 0.493896f, 0.520996f,
- 0.547363f, 0.573730f, 0.597168f, 0.622559f, 0.645508f, 0.667969f, 0.688965f, 0.709473f,
- 0.728027f, 0.746094f, 0.762695f, 0.778809f, 0.794922f, 0.809082f, 0.822754f, 0.834961f,
- 0.847168f, 0.858887f, 0.870117f, 0.880371f, 0.889648f, 0.898926f, 0.907227f, 0.915039f,
- 0.923828f, 0.930176f, 0.970215f, 0.971680f, 0.970215f, 0.970215f, 0.968750f, 0.968262f,
- 0.001935f, 0.005634f, 0.010078f, 0.014389f, 0.019669f, 0.024658f, 0.030716f, 0.037201f,
- 0.044098f, 0.051941f, 0.060333f, 0.070129f, 0.080383f, 0.091370f, 0.103638f, 0.116943f,
- 0.131714f, 0.148193f, 0.165161f, 0.183838f, 0.203979f, 0.225220f, 0.247803f, 0.271240f,
- 0.296631f, 0.322510f, 0.349121f, 0.376221f, 0.403076f, 0.431152f, 0.458984f, 0.485596f,
- 0.513672f, 0.540039f, 0.564941f, 0.590820f, 0.616211f, 0.638672f, 0.662109f, 0.683105f,
- 0.704102f, 0.723633f, 0.741699f, 0.759766f, 0.776855f, 0.792480f, 0.807617f, 0.821777f,
- 0.833496f, 0.847168f, 0.858887f, 0.870117f, 0.880859f, 0.889648f, 0.899414f, 0.908203f,
- 0.916992f, 0.924316f, 0.967285f, 0.968262f, 0.968750f, 0.968262f, 0.967285f, 0.966309f,
- 0.001805f, 0.005119f, 0.009079f, 0.013023f, 0.017487f, 0.022278f, 0.027130f, 0.032684f,
- 0.038666f, 0.045959f, 0.052826f, 0.061401f, 0.070801f, 0.080139f, 0.090698f, 0.102844f,
- 0.115845f, 0.130005f, 0.145264f, 0.162476f, 0.180176f, 0.199951f, 0.220459f, 0.242188f,
- 0.265869f, 0.290283f, 0.315430f, 0.341309f, 0.368652f, 0.395752f, 0.423584f, 0.451416f,
- 0.479248f, 0.505859f, 0.532227f, 0.559082f, 0.584961f, 0.609863f, 0.634277f, 0.656738f,
- 0.678711f, 0.700195f, 0.720703f, 0.738281f, 0.757324f, 0.774414f, 0.790527f, 0.805664f,
- 0.820312f, 0.834473f, 0.846680f, 0.858887f, 0.869629f, 0.880859f, 0.890625f, 0.899902f,
- 0.909668f, 0.917969f, 0.964844f, 0.966797f, 0.967285f, 0.965820f, 0.964844f, 0.963867f,
- 0.001437f, 0.004662f, 0.007919f, 0.011681f, 0.015404f, 0.019272f, 0.024261f, 0.029205f,
- 0.034515f, 0.040619f, 0.046967f, 0.054138f, 0.061737f, 0.070496f, 0.080200f, 0.090271f,
- 0.101807f, 0.114136f, 0.127686f, 0.143188f, 0.159058f, 0.176514f, 0.195190f, 0.215454f,
- 0.237305f, 0.260010f, 0.283936f, 0.309326f, 0.334717f, 0.361328f, 0.389160f, 0.416260f,
- 0.444336f, 0.471436f, 0.499512f, 0.525879f, 0.552734f, 0.579590f, 0.604004f, 0.628906f,
- 0.651855f, 0.674805f, 0.696777f, 0.717773f, 0.737305f, 0.755859f, 0.772949f, 0.789551f,
- 0.805664f, 0.819336f, 0.833984f, 0.847168f, 0.859375f, 0.871094f, 0.881836f, 0.892090f,
- 0.902344f, 0.910156f, 0.962402f, 0.964355f, 0.964355f, 0.963867f, 0.962891f, 0.961914f,
- 0.001264f, 0.004036f, 0.007088f, 0.010170f, 0.013672f, 0.017365f, 0.021423f, 0.025955f,
- 0.030533f, 0.035614f, 0.041321f, 0.047791f, 0.054626f, 0.062195f, 0.070679f, 0.080017f,
- 0.089600f, 0.100769f, 0.112854f, 0.125977f, 0.139893f, 0.156128f, 0.172852f, 0.191650f,
- 0.211060f, 0.232056f, 0.254883f, 0.278076f, 0.302979f, 0.328125f, 0.355225f, 0.381836f,
- 0.409912f, 0.437256f, 0.464844f, 0.492676f, 0.520508f, 0.547852f, 0.573242f, 0.599609f,
- 0.625000f, 0.649414f, 0.672363f, 0.694336f, 0.714844f, 0.734863f, 0.753418f, 0.771484f,
- 0.788574f, 0.804688f, 0.820312f, 0.833496f, 0.847656f, 0.859863f, 0.873047f, 0.883301f,
- 0.894043f, 0.903809f, 0.959961f, 0.961914f, 0.962402f, 0.960938f, 0.960449f, 0.959961f,
- 0.001297f, 0.003721f, 0.006397f, 0.009308f, 0.012260f, 0.015808f, 0.019302f, 0.023010f,
- 0.027267f, 0.032013f, 0.037109f, 0.042419f, 0.048523f, 0.054962f, 0.061920f, 0.070435f,
- 0.079407f, 0.088318f, 0.099121f, 0.111084f, 0.124023f, 0.137695f, 0.152832f, 0.169434f,
- 0.187378f, 0.206421f, 0.227783f, 0.249268f, 0.272461f, 0.297363f, 0.322754f, 0.348389f,
- 0.376221f, 0.403809f, 0.431396f, 0.459229f, 0.487305f, 0.515137f, 0.542480f, 0.569336f,
- 0.595215f, 0.621094f, 0.645996f, 0.669434f, 0.691406f, 0.712891f, 0.733887f, 0.753418f,
- 0.770996f, 0.789062f, 0.805176f, 0.820801f, 0.835449f, 0.849121f, 0.861328f, 0.874512f,
- 0.885742f, 0.895508f, 0.956543f, 0.959473f, 0.958984f, 0.958984f, 0.958008f, 0.957031f,
- 0.001267f, 0.003481f, 0.005955f, 0.008568f, 0.011185f, 0.014030f, 0.017151f, 0.020294f,
- 0.024246f, 0.028427f, 0.032654f, 0.037476f, 0.042603f, 0.048523f, 0.054871f, 0.062408f,
- 0.070129f, 0.078552f, 0.087769f, 0.097534f, 0.109192f, 0.121399f, 0.135010f, 0.150513f,
- 0.165894f, 0.183960f, 0.202881f, 0.222656f, 0.244385f, 0.267334f, 0.291260f, 0.317139f,
- 0.343506f, 0.370605f, 0.397949f, 0.426025f, 0.454346f, 0.482666f, 0.511230f, 0.538086f,
- 0.565918f, 0.592285f, 0.618164f, 0.642578f, 0.667480f, 0.690918f, 0.711914f, 0.732910f,
- 0.752930f, 0.771484f, 0.790039f, 0.806641f, 0.821777f, 0.837402f, 0.850586f, 0.864746f,
- 0.875977f, 0.887695f, 0.953613f, 0.956543f, 0.957031f, 0.956055f, 0.956055f, 0.955078f,
- 0.001068f, 0.003025f, 0.005283f, 0.007442f, 0.009857f, 0.012665f, 0.015930f, 0.018570f,
- 0.021820f, 0.025314f, 0.028931f, 0.033325f, 0.038147f, 0.042908f, 0.049011f, 0.055176f,
- 0.061859f, 0.069397f, 0.077637f, 0.086792f, 0.096252f, 0.107117f, 0.119385f, 0.132690f,
- 0.147095f, 0.162720f, 0.180054f, 0.198486f, 0.218384f, 0.239990f, 0.262207f, 0.287109f,
- 0.311523f, 0.337891f, 0.364990f, 0.392822f, 0.420654f, 0.449219f, 0.478027f, 0.505859f,
- 0.535156f, 0.562012f, 0.588867f, 0.615723f, 0.641602f, 0.666016f, 0.688965f, 0.711914f,
- 0.732910f, 0.753906f, 0.773438f, 0.791016f, 0.808594f, 0.823730f, 0.839355f, 0.854004f,
- 0.867188f, 0.879883f, 0.950195f, 0.954102f, 0.954102f, 0.953125f, 0.952637f, 0.952148f,
- 0.000884f, 0.003082f, 0.004631f, 0.006931f, 0.008942f, 0.011513f, 0.013779f, 0.016663f,
- 0.019806f, 0.022934f, 0.026215f, 0.029999f, 0.033813f, 0.038544f, 0.043365f, 0.048615f,
- 0.054352f, 0.061005f, 0.068420f, 0.076477f, 0.085022f, 0.095032f, 0.105469f, 0.117432f,
- 0.130127f, 0.143799f, 0.159790f, 0.176270f, 0.194580f, 0.214478f, 0.235229f, 0.257568f,
- 0.281982f, 0.306641f, 0.332764f, 0.359863f, 0.388184f, 0.416016f, 0.445557f, 0.474854f,
- 0.502441f, 0.531738f, 0.559570f, 0.586914f, 0.614258f, 0.640625f, 0.665039f, 0.689453f,
- 0.712891f, 0.734863f, 0.755371f, 0.774902f, 0.793945f, 0.810547f, 0.827637f, 0.842773f,
- 0.857910f, 0.871094f, 0.946777f, 0.950684f, 0.951172f, 0.950684f, 0.949707f, 0.949707f,
- 0.000848f, 0.002630f, 0.004330f, 0.006386f, 0.008148f, 0.010437f, 0.012436f, 0.014977f,
- 0.017731f, 0.020645f, 0.023529f, 0.026413f, 0.030289f, 0.034302f, 0.038391f, 0.043365f,
- 0.048737f, 0.054413f, 0.060455f, 0.067383f, 0.075134f, 0.083801f, 0.093262f, 0.103821f,
- 0.114746f, 0.127441f, 0.140991f, 0.156372f, 0.172729f, 0.190918f, 0.210449f, 0.231201f,
- 0.253662f, 0.277344f, 0.302734f, 0.328857f, 0.355225f, 0.384033f, 0.413086f, 0.440918f,
- 0.471191f, 0.500488f, 0.529785f, 0.558594f, 0.586426f, 0.613770f, 0.640137f, 0.666016f,
- 0.689453f, 0.714355f, 0.736328f, 0.757812f, 0.777832f, 0.796875f, 0.813965f, 0.831543f,
- 0.847168f, 0.860840f, 0.943848f, 0.948242f, 0.947754f, 0.948242f, 0.946777f, 0.946777f,
- 0.000747f, 0.002462f, 0.004192f, 0.005573f, 0.007454f, 0.009430f, 0.011253f, 0.013588f,
- 0.015762f, 0.018112f, 0.020859f, 0.023758f, 0.027084f, 0.030426f, 0.034332f, 0.038635f,
- 0.042999f, 0.048340f, 0.053772f, 0.060028f, 0.066589f, 0.074402f, 0.082764f, 0.091553f,
- 0.101685f, 0.112854f, 0.125122f, 0.138184f, 0.153320f, 0.169556f, 0.187500f, 0.206543f,
- 0.227539f, 0.249512f, 0.273193f, 0.298340f, 0.324463f, 0.351562f, 0.379883f, 0.409424f,
- 0.438477f, 0.468750f, 0.498047f, 0.527832f, 0.556641f, 0.585449f, 0.614258f, 0.641113f,
- 0.666992f, 0.692383f, 0.716309f, 0.738281f, 0.760742f, 0.780273f, 0.799805f, 0.818848f,
- 0.834473f, 0.851074f, 0.939941f, 0.944824f, 0.944336f, 0.944336f, 0.944336f, 0.943359f,
- 0.000670f, 0.002079f, 0.003538f, 0.005146f, 0.006508f, 0.008247f, 0.010223f, 0.012260f,
- 0.014153f, 0.016479f, 0.018677f, 0.021515f, 0.024323f, 0.027313f, 0.030518f, 0.034302f,
- 0.038422f, 0.042725f, 0.047760f, 0.053101f, 0.059113f, 0.065613f, 0.072937f, 0.080444f,
- 0.089722f, 0.099426f, 0.110596f, 0.122314f, 0.135742f, 0.150513f, 0.166260f, 0.183716f,
- 0.202759f, 0.223633f, 0.245728f, 0.269287f, 0.294189f, 0.320557f, 0.348633f, 0.376709f,
- 0.406494f, 0.436523f, 0.467285f, 0.497070f, 0.528320f, 0.557129f, 0.586426f, 0.614746f,
- 0.642090f, 0.668945f, 0.694824f, 0.718750f, 0.742676f, 0.764648f, 0.786133f, 0.805176f,
- 0.823242f, 0.840820f, 0.936035f, 0.940918f, 0.941406f, 0.941406f, 0.940430f, 0.939941f,
- 0.000645f, 0.001963f, 0.003384f, 0.004719f, 0.006042f, 0.007614f, 0.009384f, 0.011192f,
- 0.012665f, 0.015083f, 0.016861f, 0.019165f, 0.021393f, 0.024445f, 0.027451f, 0.030716f,
- 0.034149f, 0.038116f, 0.042389f, 0.047028f, 0.052277f, 0.058014f, 0.064270f, 0.071289f,
- 0.079041f, 0.087830f, 0.097351f, 0.108337f, 0.119995f, 0.132812f, 0.147217f, 0.163452f,
- 0.180420f, 0.199585f, 0.219849f, 0.242065f, 0.265625f, 0.291260f, 0.318115f, 0.345703f,
- 0.375000f, 0.404541f, 0.434326f, 0.465820f, 0.496582f, 0.526855f, 0.557617f, 0.587402f,
- 0.616699f, 0.645508f, 0.672363f, 0.698242f, 0.723145f, 0.747559f, 0.770020f, 0.791504f,
- 0.810059f, 0.828613f, 0.931641f, 0.937012f, 0.937500f, 0.937500f, 0.937012f, 0.936523f,
- 0.000692f, 0.001705f, 0.003000f, 0.004238f, 0.005798f, 0.006805f, 0.008659f, 0.009933f,
- 0.011681f, 0.013191f, 0.015259f, 0.017166f, 0.019379f, 0.021729f, 0.024796f, 0.027328f,
- 0.030380f, 0.033661f, 0.037598f, 0.041718f, 0.046539f, 0.051270f, 0.056946f, 0.062988f,
- 0.069885f, 0.077271f, 0.085999f, 0.095398f, 0.105652f, 0.117859f, 0.129883f, 0.144409f,
- 0.159912f, 0.177002f, 0.196045f, 0.216553f, 0.239014f, 0.262451f, 0.288086f, 0.314941f,
- 0.343262f, 0.372314f, 0.403076f, 0.433594f, 0.465332f, 0.496826f, 0.527832f, 0.559082f,
- 0.589355f, 0.619629f, 0.648926f, 0.676758f, 0.703125f, 0.728516f, 0.752930f, 0.775391f,
- 0.797363f, 0.817871f, 0.927246f, 0.933105f, 0.934082f, 0.933594f, 0.933594f, 0.933105f,
- 0.000460f, 0.001622f, 0.002705f, 0.003983f, 0.004925f, 0.006363f, 0.007652f, 0.008965f,
- 0.010521f, 0.011963f, 0.013664f, 0.015480f, 0.017258f, 0.019440f, 0.021912f, 0.024338f,
- 0.027084f, 0.030212f, 0.033356f, 0.037018f, 0.040833f, 0.045380f, 0.050110f, 0.055573f,
- 0.061829f, 0.068359f, 0.075928f, 0.083984f, 0.093140f, 0.103333f, 0.115112f, 0.127441f,
- 0.141602f, 0.156982f, 0.174316f, 0.192871f, 0.213257f, 0.235596f, 0.259766f, 0.285400f,
- 0.312256f, 0.341797f, 0.371094f, 0.402100f, 0.434082f, 0.465332f, 0.497314f, 0.529297f,
- 0.562012f, 0.592773f, 0.623535f, 0.652832f, 0.681641f, 0.709473f, 0.735352f, 0.759766f,
- 0.783203f, 0.803711f, 0.922363f, 0.929199f, 0.929688f, 0.929199f, 0.929688f, 0.928711f,
- 0.000341f, 0.001686f, 0.002537f, 0.003769f, 0.004745f, 0.005764f, 0.007034f, 0.008286f,
- 0.009369f, 0.010742f, 0.012161f, 0.013931f, 0.015671f, 0.017563f, 0.019440f, 0.021851f,
- 0.024231f, 0.026672f, 0.029556f, 0.032776f, 0.036255f, 0.040283f, 0.044464f, 0.049194f,
- 0.054413f, 0.060059f, 0.066589f, 0.074036f, 0.081909f, 0.091187f, 0.100769f, 0.112000f,
- 0.124512f, 0.139038f, 0.154297f, 0.171265f, 0.189819f, 0.210571f, 0.232788f, 0.257324f,
- 0.283203f, 0.311035f, 0.339844f, 0.370850f, 0.402100f, 0.433838f, 0.466797f, 0.499268f,
- 0.532227f, 0.565430f, 0.598145f, 0.628418f, 0.659180f, 0.687988f, 0.715820f, 0.742188f,
- 0.767090f, 0.791504f, 0.917969f, 0.924805f, 0.925293f, 0.925293f, 0.924805f, 0.924805f,
- 0.000405f, 0.001282f, 0.002298f, 0.003269f, 0.004448f, 0.005043f, 0.006294f, 0.007233f,
- 0.008606f, 0.009727f, 0.010849f, 0.012421f, 0.013885f, 0.015465f, 0.017426f, 0.019394f,
- 0.021667f, 0.023819f, 0.026154f, 0.029175f, 0.032227f, 0.035706f, 0.039062f, 0.043427f,
- 0.047913f, 0.052856f, 0.058502f, 0.064880f, 0.071960f, 0.079895f, 0.088867f, 0.098633f,
- 0.109619f, 0.122192f, 0.135742f, 0.151489f, 0.168457f, 0.187134f, 0.207764f, 0.230835f,
- 0.254883f, 0.281494f, 0.310059f, 0.339355f, 0.370361f, 0.402588f, 0.435547f, 0.468994f,
- 0.502930f, 0.537109f, 0.569824f, 0.602051f, 0.634766f, 0.665527f, 0.695801f, 0.724121f,
- 0.750488f, 0.776855f, 0.912598f, 0.919434f, 0.920410f, 0.920410f, 0.919922f, 0.920410f,
- 0.000529f, 0.001217f, 0.002171f, 0.003035f, 0.003790f, 0.004784f, 0.005711f, 0.006756f,
- 0.007782f, 0.008987f, 0.009773f, 0.011185f, 0.012650f, 0.013771f, 0.015656f, 0.017181f,
- 0.018890f, 0.021057f, 0.023239f, 0.025848f, 0.028488f, 0.031525f, 0.034607f, 0.038147f,
- 0.042023f, 0.046539f, 0.051605f, 0.056793f, 0.063049f, 0.069946f, 0.078064f, 0.086548f,
- 0.096313f, 0.107117f, 0.119446f, 0.133301f, 0.148560f, 0.165405f, 0.184570f, 0.205811f,
- 0.228394f, 0.253174f, 0.280029f, 0.308594f, 0.339111f, 0.370605f, 0.404053f, 0.437988f,
- 0.471680f, 0.506348f, 0.541504f, 0.576172f, 0.609375f, 0.642578f, 0.674316f, 0.705078f,
- 0.734375f, 0.761719f, 0.907227f, 0.914062f, 0.915527f, 0.915527f, 0.916016f, 0.915039f,
- 0.000402f, 0.001247f, 0.001841f, 0.002651f, 0.003414f, 0.004200f, 0.005337f, 0.005821f,
- 0.006733f, 0.008041f, 0.008942f, 0.010201f, 0.011261f, 0.012749f, 0.013893f, 0.015472f,
- 0.016663f, 0.018829f, 0.020615f, 0.022873f, 0.025299f, 0.027893f, 0.030533f, 0.033600f,
- 0.037140f, 0.040924f, 0.044983f, 0.049927f, 0.055359f, 0.061340f, 0.068176f, 0.075500f,
- 0.084106f, 0.093933f, 0.104370f, 0.116638f, 0.130249f, 0.145996f, 0.162842f, 0.181885f,
- 0.203735f, 0.226562f, 0.251465f, 0.279297f, 0.308594f, 0.339355f, 0.373047f, 0.406982f,
- 0.440918f, 0.477051f, 0.511719f, 0.548340f, 0.583496f, 0.618164f, 0.652344f, 0.684570f,
- 0.715332f, 0.745605f, 0.901855f, 0.909180f, 0.910156f, 0.910645f, 0.910156f, 0.910156f,
- 0.000371f, 0.001090f, 0.001752f, 0.002409f, 0.003042f, 0.003963f, 0.004898f, 0.005295f,
- 0.006077f, 0.006992f, 0.008102f, 0.009338f, 0.010101f, 0.011078f, 0.012375f, 0.013718f,
- 0.015099f, 0.016403f, 0.018402f, 0.020203f, 0.022354f, 0.024475f, 0.026825f, 0.029388f,
- 0.032623f, 0.035522f, 0.039429f, 0.043762f, 0.048462f, 0.053558f, 0.059265f, 0.065552f,
- 0.073120f, 0.081787f, 0.091431f, 0.102112f, 0.114136f, 0.127930f, 0.143066f, 0.160767f,
- 0.179810f, 0.200928f, 0.224854f, 0.250732f, 0.279053f, 0.308838f, 0.340820f, 0.374756f,
- 0.410156f, 0.446045f, 0.482666f, 0.520020f, 0.556152f, 0.593262f, 0.628906f, 0.663574f,
- 0.695801f, 0.728027f, 0.895508f, 0.903809f, 0.904297f, 0.904297f, 0.904297f, 0.904785f,
- 0.000425f, 0.000937f, 0.001529f, 0.002129f, 0.002674f, 0.003696f, 0.004257f, 0.004990f,
- 0.005726f, 0.006161f, 0.007118f, 0.007919f, 0.009109f, 0.009941f, 0.011055f, 0.011993f,
- 0.013191f, 0.014832f, 0.016281f, 0.017868f, 0.019562f, 0.021362f, 0.023514f, 0.025909f,
- 0.028549f, 0.031189f, 0.034637f, 0.037994f, 0.042145f, 0.046570f, 0.051453f, 0.057129f,
- 0.063965f, 0.070984f, 0.079285f, 0.088806f, 0.099426f, 0.111267f, 0.125366f, 0.140747f,
- 0.158203f, 0.178101f, 0.199585f, 0.223755f, 0.250732f, 0.279297f, 0.310059f, 0.343994f,
- 0.377686f, 0.414307f, 0.451904f, 0.489258f, 0.527832f, 0.565918f, 0.603027f, 0.640137f,
- 0.675781f, 0.710449f, 0.888672f, 0.897461f, 0.899902f, 0.900391f, 0.899414f, 0.899414f,
- 0.000317f, 0.000823f, 0.001386f, 0.002108f, 0.002684f, 0.003239f, 0.003883f, 0.004303f,
- 0.004730f, 0.005569f, 0.006626f, 0.007214f, 0.008003f, 0.008865f, 0.009590f, 0.010948f,
- 0.011856f, 0.012871f, 0.014381f, 0.015640f, 0.017075f, 0.018799f, 0.020569f, 0.022537f,
- 0.024704f, 0.027405f, 0.030090f, 0.033142f, 0.036346f, 0.040436f, 0.044830f, 0.049835f,
- 0.055450f, 0.061584f, 0.068665f, 0.076904f, 0.086060f, 0.096741f, 0.109192f, 0.122559f,
- 0.138428f, 0.155762f, 0.176270f, 0.198242f, 0.223145f, 0.250244f, 0.280518f, 0.312500f,
- 0.346680f, 0.382324f, 0.420410f, 0.458740f, 0.498779f, 0.538086f, 0.577637f, 0.616211f,
- 0.654297f, 0.690918f, 0.881348f, 0.890625f, 0.892578f, 0.893066f, 0.893066f, 0.892578f,
- 0.000385f, 0.000766f, 0.001544f, 0.001925f, 0.002359f, 0.002947f, 0.003176f, 0.003691f,
- 0.004288f, 0.005215f, 0.005917f, 0.006214f, 0.007019f, 0.007843f, 0.008469f, 0.009598f,
- 0.010345f, 0.011559f, 0.012497f, 0.013634f, 0.014992f, 0.016373f, 0.017853f, 0.019608f,
- 0.021515f, 0.023788f, 0.026260f, 0.028931f, 0.031860f, 0.034912f, 0.038635f, 0.042633f,
- 0.047638f, 0.053070f, 0.059540f, 0.066284f, 0.074524f, 0.083679f, 0.094177f, 0.106445f,
- 0.120361f, 0.135620f, 0.154053f, 0.174072f, 0.197144f, 0.222900f, 0.251221f, 0.281982f,
- 0.315430f, 0.351318f, 0.388672f, 0.427734f, 0.468506f, 0.508301f, 0.549805f, 0.591309f,
- 0.631348f, 0.670410f, 0.874512f, 0.884766f, 0.885742f, 0.886230f, 0.886230f, 0.886230f,
- 0.000230f, 0.000832f, 0.001281f, 0.001865f, 0.002207f, 0.002605f, 0.003212f, 0.003284f,
- 0.004124f, 0.004597f, 0.005222f, 0.005703f, 0.006260f, 0.007095f, 0.007790f, 0.008377f,
- 0.009010f, 0.010078f, 0.011009f, 0.011925f, 0.013153f, 0.014282f, 0.015610f, 0.017151f,
- 0.018951f, 0.020416f, 0.022583f, 0.024826f, 0.027328f, 0.030136f, 0.033508f, 0.036835f,
- 0.040985f, 0.045410f, 0.050812f, 0.056854f, 0.063965f, 0.071777f, 0.081177f, 0.091858f,
- 0.103699f, 0.117615f, 0.133423f, 0.152588f, 0.172974f, 0.196777f, 0.222900f, 0.252686f,
- 0.284912f, 0.319824f, 0.356934f, 0.395996f, 0.436768f, 0.478516f, 0.521484f, 0.564453f,
- 0.607422f, 0.649414f, 0.866699f, 0.876953f, 0.877930f, 0.879395f, 0.879883f, 0.878418f,
- 0.000228f, 0.000734f, 0.000993f, 0.001416f, 0.001935f, 0.002293f, 0.002541f, 0.003174f,
- 0.003508f, 0.004040f, 0.004337f, 0.005039f, 0.005505f, 0.006054f, 0.006840f, 0.007366f,
- 0.008041f, 0.008644f, 0.009544f, 0.010460f, 0.011238f, 0.012329f, 0.013542f, 0.014755f,
- 0.016083f, 0.017624f, 0.019424f, 0.021408f, 0.023422f, 0.025803f, 0.028366f, 0.031311f,
- 0.034912f, 0.039124f, 0.043304f, 0.048492f, 0.054291f, 0.061188f, 0.069397f, 0.078552f,
- 0.089233f, 0.101074f, 0.115540f, 0.131226f, 0.150757f, 0.172119f, 0.196533f, 0.224243f,
- 0.254883f, 0.288574f, 0.324707f, 0.364014f, 0.405029f, 0.447510f, 0.491699f, 0.536133f,
- 0.581543f, 0.627441f, 0.858398f, 0.869141f, 0.870605f, 0.871582f, 0.871094f, 0.871582f,
- 0.000118f, 0.000713f, 0.000985f, 0.001328f, 0.001612f, 0.001999f, 0.002399f, 0.002913f,
- 0.003139f, 0.003567f, 0.004055f, 0.004406f, 0.004986f, 0.005226f, 0.005856f, 0.006332f,
- 0.007042f, 0.007553f, 0.008286f, 0.009064f, 0.009834f, 0.010696f, 0.011658f, 0.012726f,
- 0.013817f, 0.015289f, 0.016693f, 0.018265f, 0.019699f, 0.021835f, 0.024307f, 0.026642f,
- 0.029770f, 0.033234f, 0.037048f, 0.041351f, 0.046478f, 0.052032f, 0.058960f, 0.066589f,
- 0.075745f, 0.086182f, 0.099121f, 0.113037f, 0.129517f, 0.149048f, 0.171387f, 0.196899f,
- 0.225464f, 0.257812f, 0.293457f, 0.331787f, 0.373291f, 0.416748f, 0.460938f, 0.507812f,
- 0.554688f, 0.602051f, 0.849609f, 0.859863f, 0.862793f, 0.863281f, 0.862793f, 0.862793f,
- 0.000211f, 0.000522f, 0.000877f, 0.001204f, 0.001507f, 0.001724f, 0.002062f, 0.002426f,
- 0.002867f, 0.003157f, 0.003443f, 0.003752f, 0.004192f, 0.004753f, 0.005154f, 0.005428f,
- 0.006065f, 0.006546f, 0.007210f, 0.007725f, 0.008530f, 0.009247f, 0.010025f, 0.010887f,
- 0.011909f, 0.012970f, 0.014069f, 0.015335f, 0.017105f, 0.018433f, 0.020554f, 0.022552f,
- 0.025116f, 0.027802f, 0.031158f, 0.034485f, 0.038971f, 0.044037f, 0.049469f, 0.055847f,
- 0.063843f, 0.072815f, 0.083618f, 0.095947f, 0.110840f, 0.128174f, 0.147949f, 0.171387f,
- 0.198242f, 0.228271f, 0.262207f, 0.299805f, 0.340332f, 0.384277f, 0.430176f, 0.477295f,
- 0.527344f, 0.577637f, 0.839844f, 0.851074f, 0.853516f, 0.854492f, 0.854980f, 0.854980f,
- 0.000218f, 0.000479f, 0.000706f, 0.001109f, 0.001245f, 0.001763f, 0.001800f, 0.002211f,
- 0.002377f, 0.002783f, 0.003103f, 0.003223f, 0.003782f, 0.004089f, 0.004326f, 0.004711f,
- 0.005306f, 0.005569f, 0.006199f, 0.006653f, 0.007168f, 0.007919f, 0.008560f, 0.009254f,
- 0.009979f, 0.010872f, 0.012054f, 0.012810f, 0.014221f, 0.015793f, 0.017181f, 0.018967f,
- 0.021088f, 0.023361f, 0.026001f, 0.028915f, 0.032257f, 0.036469f, 0.040924f, 0.046875f,
- 0.053375f, 0.061218f, 0.070435f, 0.080811f, 0.093628f, 0.108704f, 0.126709f, 0.147461f,
- 0.172241f, 0.199951f, 0.232788f, 0.268799f, 0.308594f, 0.351562f, 0.397705f, 0.447266f,
- 0.498291f, 0.550293f, 0.830078f, 0.841797f, 0.843750f, 0.845215f, 0.845215f, 0.845703f,
- 0.000139f, 0.000379f, 0.000704f, 0.000896f, 0.001095f, 0.001392f, 0.001649f, 0.002058f,
- 0.002235f, 0.002483f, 0.002621f, 0.002878f, 0.003214f, 0.003580f, 0.003820f, 0.004055f,
- 0.004498f, 0.004791f, 0.005173f, 0.005692f, 0.006145f, 0.006691f, 0.007175f, 0.007874f,
- 0.008499f, 0.009239f, 0.010117f, 0.011032f, 0.011864f, 0.012901f, 0.014282f, 0.015701f,
- 0.017242f, 0.019516f, 0.021469f, 0.024002f, 0.026749f, 0.029953f, 0.034027f, 0.038727f,
- 0.044250f, 0.050568f, 0.058136f, 0.067139f, 0.078247f, 0.091614f, 0.106689f, 0.125366f,
- 0.147339f, 0.172974f, 0.202881f, 0.237671f, 0.275879f, 0.318359f, 0.365234f, 0.415283f,
- 0.468018f, 0.521973f, 0.819336f, 0.832031f, 0.834473f, 0.834961f, 0.835449f, 0.835938f,
- 0.000115f, 0.000396f, 0.000688f, 0.000885f, 0.000917f, 0.001393f, 0.001478f, 0.001590f,
- 0.001944f, 0.002123f, 0.002291f, 0.002644f, 0.002666f, 0.003023f, 0.003197f, 0.003546f,
- 0.003714f, 0.004246f, 0.004551f, 0.004837f, 0.005108f, 0.005577f, 0.006054f, 0.006504f,
- 0.007023f, 0.007633f, 0.008362f, 0.009148f, 0.009926f, 0.010742f, 0.011917f, 0.013062f,
- 0.014351f, 0.015991f, 0.017639f, 0.019455f, 0.021729f, 0.024689f, 0.027740f, 0.031708f,
- 0.036102f, 0.041260f, 0.047882f, 0.055450f, 0.064392f, 0.075500f, 0.088928f, 0.104797f,
- 0.124756f, 0.147949f, 0.175415f, 0.207275f, 0.244507f, 0.286133f, 0.332520f, 0.381836f,
- 0.436279f, 0.492432f, 0.808105f, 0.821289f, 0.822754f, 0.824707f, 0.825195f, 0.824219f,
- 0.000209f, 0.000435f, 0.000493f, 0.000669f, 0.001040f, 0.001076f, 0.001254f, 0.001398f,
- 0.001603f, 0.001697f, 0.001987f, 0.002140f, 0.002268f, 0.002472f, 0.002769f, 0.002991f,
- 0.003302f, 0.003572f, 0.003685f, 0.004002f, 0.004337f, 0.004654f, 0.005062f, 0.005379f,
- 0.005871f, 0.006363f, 0.006733f, 0.007416f, 0.008102f, 0.008812f, 0.009727f, 0.010689f,
- 0.011566f, 0.013145f, 0.014053f, 0.015762f, 0.017899f, 0.020096f, 0.022552f, 0.025528f,
- 0.028992f, 0.033325f, 0.038635f, 0.044952f, 0.052582f, 0.061554f, 0.072998f, 0.086670f,
- 0.103577f, 0.124329f, 0.148804f, 0.178467f, 0.213501f, 0.253174f, 0.298828f, 0.348877f,
- 0.403076f, 0.461914f, 0.795898f, 0.809570f, 0.812012f, 0.813477f, 0.813477f, 0.814453f,
- 0.000243f, 0.000322f, 0.000466f, 0.000710f, 0.000863f, 0.000942f, 0.001051f, 0.001182f,
- 0.001369f, 0.001451f, 0.001716f, 0.001851f, 0.001968f, 0.002192f, 0.002323f, 0.002470f,
- 0.002773f, 0.002850f, 0.003056f, 0.003399f, 0.003624f, 0.003832f, 0.004192f, 0.004467f,
- 0.004955f, 0.005276f, 0.005772f, 0.006084f, 0.006672f, 0.007191f, 0.007828f, 0.008720f,
- 0.009575f, 0.010292f, 0.011505f, 0.012535f, 0.014114f, 0.016006f, 0.017838f, 0.020462f,
- 0.023193f, 0.026489f, 0.030807f, 0.035858f, 0.041840f, 0.049652f, 0.059174f, 0.070435f,
- 0.084839f, 0.102783f, 0.124146f, 0.151489f, 0.183472f, 0.221802f, 0.265137f, 0.315186f,
- 0.369629f, 0.430664f, 0.782715f, 0.796875f, 0.799805f, 0.800293f, 0.801758f, 0.801758f,
- 0.000119f, 0.000369f, 0.000340f, 0.000595f, 0.000667f, 0.000841f, 0.001010f, 0.001086f,
- 0.001179f, 0.001225f, 0.001494f, 0.001555f, 0.001654f, 0.001754f, 0.001965f, 0.002142f,
- 0.002197f, 0.002432f, 0.002619f, 0.002811f, 0.003021f, 0.003139f, 0.003567f, 0.003708f,
- 0.004066f, 0.004360f, 0.004612f, 0.005123f, 0.005489f, 0.005878f, 0.006306f, 0.006824f,
- 0.007576f, 0.008286f, 0.008949f, 0.010155f, 0.011322f, 0.012756f, 0.014046f, 0.015976f,
- 0.018250f, 0.020874f, 0.024094f, 0.027878f, 0.032867f, 0.039154f, 0.046509f, 0.055908f,
- 0.068054f, 0.082886f, 0.102356f, 0.125732f, 0.155029f, 0.190674f, 0.232422f, 0.281006f,
- 0.335693f, 0.397949f, 0.770020f, 0.783691f, 0.786621f, 0.787598f, 0.788086f, 0.789551f,
- 0.000000f, 0.000220f, 0.000275f, 0.000562f, 0.000618f, 0.000683f, 0.000733f, 0.000761f,
- 0.000966f, 0.001022f, 0.001184f, 0.001237f, 0.001382f, 0.001552f, 0.001688f, 0.001724f,
- 0.001918f, 0.002024f, 0.002115f, 0.002243f, 0.002403f, 0.002718f, 0.002840f, 0.003052f,
- 0.003330f, 0.003508f, 0.003860f, 0.004097f, 0.004314f, 0.004719f, 0.005074f, 0.005535f,
- 0.006058f, 0.006584f, 0.007168f, 0.007874f, 0.008759f, 0.009651f, 0.011086f, 0.012459f,
- 0.013992f, 0.015945f, 0.018433f, 0.021408f, 0.025192f, 0.029861f, 0.035950f, 0.043396f,
- 0.053406f, 0.065735f, 0.082031f, 0.102234f, 0.128052f, 0.160645f, 0.200073f, 0.247192f,
- 0.301025f, 0.363281f, 0.755371f, 0.770996f, 0.772949f, 0.773926f, 0.775879f, 0.775879f,
- 0.000216f, 0.000102f, 0.000381f, 0.000487f, 0.000429f, 0.000552f, 0.000579f, 0.000788f,
- 0.000804f, 0.000854f, 0.000937f, 0.000996f, 0.001078f, 0.001218f, 0.001315f, 0.001499f,
- 0.001532f, 0.001642f, 0.001805f, 0.001825f, 0.002077f, 0.002178f, 0.002312f, 0.002396f,
- 0.002575f, 0.002735f, 0.002947f, 0.003317f, 0.003428f, 0.003721f, 0.004185f, 0.004379f,
- 0.004704f, 0.005253f, 0.005650f, 0.006145f, 0.006870f, 0.007515f, 0.008415f, 0.009430f,
- 0.010612f, 0.012093f, 0.013954f, 0.016052f, 0.018967f, 0.022476f, 0.027115f, 0.032898f,
- 0.040649f, 0.050690f, 0.063599f, 0.080811f, 0.103210f, 0.132202f, 0.168823f, 0.213501f,
- 0.266602f, 0.329102f, 0.740234f, 0.756348f, 0.758789f, 0.760254f, 0.761230f, 0.761230f,
- 0.000179f, 0.000181f, 0.000180f, 0.000289f, 0.000413f, 0.000458f, 0.000497f, 0.000620f,
- 0.000646f, 0.000688f, 0.000830f, 0.000868f, 0.000904f, 0.000981f, 0.001024f, 0.001178f,
- 0.001146f, 0.001302f, 0.001382f, 0.001523f, 0.001679f, 0.001737f, 0.001824f, 0.001959f,
- 0.002195f, 0.002283f, 0.002438f, 0.002579f, 0.002703f, 0.002939f, 0.003181f, 0.003454f,
- 0.003677f, 0.004051f, 0.004395f, 0.004738f, 0.005283f, 0.005783f, 0.006420f, 0.007095f,
- 0.007988f, 0.009094f, 0.010384f, 0.011955f, 0.013939f, 0.016434f, 0.019836f, 0.024292f,
- 0.030029f, 0.037659f, 0.048065f, 0.061890f, 0.080811f, 0.105774f, 0.138672f, 0.180542f,
- 0.231934f, 0.293213f, 0.724121f, 0.740234f, 0.744141f, 0.745117f, 0.745605f, 0.746094f,
- 0.000000f, 0.000056f, 0.000263f, 0.000339f, 0.000369f, 0.000357f, 0.000376f, 0.000508f,
- 0.000519f, 0.000558f, 0.000581f, 0.000678f, 0.000767f, 0.000775f, 0.000905f, 0.000849f,
- 0.000992f, 0.000942f, 0.001192f, 0.001169f, 0.001204f, 0.001375f, 0.001439f, 0.001532f,
- 0.001634f, 0.001676f, 0.001799f, 0.001904f, 0.002165f, 0.002262f, 0.002377f, 0.002611f,
- 0.002836f, 0.003103f, 0.003321f, 0.003550f, 0.004005f, 0.004356f, 0.004772f, 0.005295f,
- 0.005962f, 0.006756f, 0.007690f, 0.008690f, 0.010078f, 0.011871f, 0.014252f, 0.017242f,
- 0.021393f, 0.027100f, 0.034851f, 0.046051f, 0.060455f, 0.081848f, 0.110474f, 0.148682f,
- 0.197632f, 0.257568f, 0.706543f, 0.724121f, 0.727539f, 0.729492f, 0.729980f, 0.729492f,
- 0.000000f, 0.000130f, 0.000174f, 0.000312f, 0.000290f, 0.000293f, 0.000372f, 0.000319f,
- 0.000397f, 0.000433f, 0.000550f, 0.000552f, 0.000564f, 0.000593f, 0.000638f, 0.000758f,
- 0.000784f, 0.000797f, 0.000842f, 0.000937f, 0.001011f, 0.001068f, 0.001125f, 0.001231f,
- 0.001228f, 0.001288f, 0.001409f, 0.001465f, 0.001644f, 0.001697f, 0.001965f, 0.001924f,
- 0.002136f, 0.002270f, 0.002436f, 0.002697f, 0.002916f, 0.003202f, 0.003492f, 0.003929f,
- 0.004391f, 0.004887f, 0.005516f, 0.006233f, 0.007240f, 0.008461f, 0.010094f, 0.012070f,
- 0.014854f, 0.018585f, 0.024338f, 0.032379f, 0.043884f, 0.060516f, 0.084656f, 0.118469f,
- 0.164185f, 0.222168f, 0.689941f, 0.708008f, 0.710449f, 0.711914f, 0.712891f, 0.712402f,
- 0.000000f, 0.000000f, 0.000122f, 0.000226f, 0.000145f, 0.000282f, 0.000255f, 0.000247f,
- 0.000323f, 0.000389f, 0.000379f, 0.000435f, 0.000461f, 0.000509f, 0.000535f, 0.000517f,
- 0.000557f, 0.000604f, 0.000649f, 0.000690f, 0.000757f, 0.000773f, 0.000836f, 0.000865f,
- 0.000924f, 0.000957f, 0.001095f, 0.001104f, 0.001243f, 0.001361f, 0.001458f, 0.001486f,
- 0.001619f, 0.001745f, 0.001791f, 0.001993f, 0.002100f, 0.002321f, 0.002539f, 0.002771f,
- 0.003084f, 0.003412f, 0.003866f, 0.004368f, 0.005062f, 0.005821f, 0.006882f, 0.008278f,
- 0.010071f, 0.012756f, 0.016327f, 0.021774f, 0.029785f, 0.042206f, 0.061462f, 0.090149f,
- 0.131348f, 0.187378f, 0.669434f, 0.688965f, 0.692383f, 0.694824f, 0.695801f, 0.695312f,
- 0.000000f, 0.000118f, 0.000113f, 0.000158f, 0.000158f, 0.000176f, 0.000224f, 0.000202f,
- 0.000251f, 0.000260f, 0.000280f, 0.000332f, 0.000316f, 0.000365f, 0.000389f, 0.000419f,
- 0.000454f, 0.000435f, 0.000476f, 0.000494f, 0.000516f, 0.000576f, 0.000609f, 0.000656f,
- 0.000678f, 0.000712f, 0.000792f, 0.000800f, 0.000852f, 0.000919f, 0.000961f, 0.001070f,
- 0.001120f, 0.001238f, 0.001300f, 0.001480f, 0.001459f, 0.001634f, 0.001798f, 0.001947f,
- 0.002111f, 0.002377f, 0.002615f, 0.002966f, 0.003410f, 0.003933f, 0.004585f, 0.005489f,
- 0.006706f, 0.008148f, 0.010757f, 0.013962f, 0.019257f, 0.027771f, 0.041931f, 0.065125f,
- 0.101135f, 0.152832f, 0.650391f, 0.670898f, 0.674316f, 0.675293f, 0.675781f, 0.677246f,
- 0.000000f, 0.000000f, 0.000109f, 0.000106f, 0.000121f, 0.000117f, 0.000130f, 0.000151f,
- 0.000161f, 0.000174f, 0.000234f, 0.000197f, 0.000205f, 0.000236f, 0.000272f, 0.000296f,
- 0.000267f, 0.000296f, 0.000397f, 0.000344f, 0.000413f, 0.000395f, 0.000433f, 0.000434f,
- 0.000504f, 0.000488f, 0.000532f, 0.000550f, 0.000602f, 0.000711f, 0.000675f, 0.000704f,
- 0.000752f, 0.000817f, 0.000896f, 0.000955f, 0.001009f, 0.001091f, 0.001223f, 0.001271f,
- 0.001415f, 0.001560f, 0.001721f, 0.001989f, 0.002214f, 0.002508f, 0.002930f, 0.003504f,
- 0.004208f, 0.005169f, 0.006603f, 0.008606f, 0.011864f, 0.017090f, 0.026367f, 0.043396f,
- 0.072571f, 0.119751f, 0.630859f, 0.650879f, 0.653809f, 0.656250f, 0.657227f, 0.657227f,
- 0.000000f, 0.000111f, 0.000104f, 0.000100f, 0.000096f, 0.000094f, 0.000105f, 0.000096f,
- 0.000101f, 0.000115f, 0.000119f, 0.000155f, 0.000129f, 0.000180f, 0.000186f, 0.000199f,
- 0.000208f, 0.000214f, 0.000232f, 0.000230f, 0.000237f, 0.000247f, 0.000303f, 0.000276f,
- 0.000324f, 0.000332f, 0.000381f, 0.000371f, 0.000393f, 0.000428f, 0.000490f, 0.000468f,
- 0.000512f, 0.000540f, 0.000598f, 0.000670f, 0.000673f, 0.000711f, 0.000767f, 0.000842f,
- 0.000894f, 0.000985f, 0.001120f, 0.001200f, 0.001416f, 0.001544f, 0.001768f, 0.002052f,
- 0.002510f, 0.003044f, 0.003796f, 0.005016f, 0.006870f, 0.009918f, 0.015335f, 0.026077f,
- 0.048004f, 0.088745f, 0.610352f, 0.630859f, 0.634277f, 0.636230f, 0.637207f, 0.638184f,
- 0.000000f, 0.000104f, 0.000098f, 0.000092f, 0.000087f, 0.000084f, 0.000081f, 0.000078f,
- 0.000074f, 0.000070f, 0.000073f, 0.000075f, 0.000081f, 0.000081f, 0.000119f, 0.000124f,
- 0.000129f, 0.000115f, 0.000142f, 0.000169f, 0.000155f, 0.000169f, 0.000172f, 0.000196f,
- 0.000209f, 0.000211f, 0.000203f, 0.000238f, 0.000245f, 0.000260f, 0.000282f, 0.000281f,
- 0.000297f, 0.000333f, 0.000343f, 0.000374f, 0.000398f, 0.000428f, 0.000473f, 0.000494f,
- 0.000534f, 0.000591f, 0.000643f, 0.000708f, 0.000790f, 0.000893f, 0.001040f, 0.001169f,
- 0.001381f, 0.001676f, 0.002123f, 0.002686f, 0.003658f, 0.005329f, 0.008347f, 0.014244f,
- 0.027954f, 0.060638f, 0.587891f, 0.609375f, 0.613281f, 0.614746f, 0.616699f, 0.616211f,
- 0.000110f, 0.000094f, 0.000085f, 0.000079f, 0.000075f, 0.000072f, 0.000069f, 0.000067f,
- 0.000065f, 0.000063f, 0.000059f, 0.000059f, 0.000054f, 0.000051f, 0.000055f, 0.000051f,
- 0.000066f, 0.000066f, 0.000078f, 0.000074f, 0.000089f, 0.000091f, 0.000102f, 0.000109f,
- 0.000114f, 0.000126f, 0.000133f, 0.000130f, 0.000141f, 0.000141f, 0.000156f, 0.000172f,
- 0.000180f, 0.000179f, 0.000206f, 0.000199f, 0.000214f, 0.000254f, 0.000247f, 0.000282f,
- 0.000300f, 0.000324f, 0.000349f, 0.000374f, 0.000413f, 0.000459f, 0.000513f, 0.000619f,
- 0.000711f, 0.000823f, 0.001030f, 0.001269f, 0.001724f, 0.002487f, 0.003948f, 0.007015f,
- 0.014122f, 0.036346f, 0.565430f, 0.586426f, 0.592285f, 0.592773f, 0.594238f, 0.594727f,
- 0.000092f, 0.000073f, 0.000067f, 0.000062f, 0.000057f, 0.000055f, 0.000052f, 0.000052f,
- 0.000049f, 0.000049f, 0.000047f, 0.000046f, 0.000046f, 0.000043f, 0.000041f, 0.000039f,
- 0.000038f, 0.000036f, 0.000039f, 0.000036f, 0.000039f, 0.000037f, 0.000039f, 0.000047f,
- 0.000051f, 0.000057f, 0.000059f, 0.000060f, 0.000067f, 0.000071f, 0.000078f, 0.000085f,
- 0.000087f, 0.000091f, 0.000098f, 0.000095f, 0.000102f, 0.000122f, 0.000122f, 0.000137f,
- 0.000143f, 0.000145f, 0.000168f, 0.000171f, 0.000197f, 0.000209f, 0.000234f, 0.000264f,
- 0.000295f, 0.000349f, 0.000418f, 0.000520f, 0.000678f, 0.000958f, 0.001512f, 0.002745f,
- 0.006092f, 0.017456f, 0.542969f, 0.565430f, 0.568848f, 0.569824f, 0.572266f, 0.572266f,
- 0.000052f, 0.000042f, 0.000037f, 0.000035f, 0.000033f, 0.000033f, 0.000032f, 0.000031f,
- 0.000031f, 0.000029f, 0.000030f, 0.000030f, 0.000029f, 0.000028f, 0.000028f, 0.000028f,
- 0.000028f, 0.000028f, 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000022f,
- 0.000021f, 0.000020f, 0.000019f, 0.000022f, 0.000020f, 0.000023f, 0.000024f, 0.000026f,
- 0.000028f, 0.000035f, 0.000037f, 0.000038f, 0.000039f, 0.000043f, 0.000048f, 0.000050f,
- 0.000053f, 0.000055f, 0.000062f, 0.000059f, 0.000072f, 0.000070f, 0.000087f, 0.000099f,
- 0.000100f, 0.000119f, 0.000142f, 0.000162f, 0.000217f, 0.000283f, 0.000425f, 0.000760f,
- 0.001818f, 0.006405f, 0.519043f, 0.541504f, 0.546387f, 0.548828f, 0.549316f, 0.550781f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f,
- 0.000004f, 0.000006f, 0.000006f, 0.000008f, 0.000009f, 0.000009f, 0.000009f, 0.000010f,
- 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000011f, 0.000012f, 0.000012f, 0.000012f,
- 0.000012f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000010f,
- 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000008f, 0.000011f,
- 0.000011f, 0.000012f, 0.000015f, 0.000016f, 0.000016f, 0.000018f, 0.000018f, 0.000020f,
- 0.000022f, 0.000024f, 0.000028f, 0.000035f, 0.000036f, 0.000052f, 0.000071f, 0.000117f,
- 0.000260f, 0.001269f, 0.495605f, 0.518555f, 0.523926f, 0.525879f, 0.526855f, 0.527344f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000002f,
- 0.000002f, 0.000002f, 0.000003f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f,
- 0.000005f, 0.000021f, 0.473145f, 0.495605f, 0.500000f, 0.502441f, 0.503418f, 0.503906f,
- },
- {
- 0.045868f, 0.130493f, 0.205322f, 0.272705f, 0.331787f, 0.384521f, 0.431885f, 0.473389f,
- 0.511719f, 0.545898f, 0.576660f, 0.605469f, 0.631348f, 0.654785f, 0.676758f, 0.696289f,
- 0.714355f, 0.732422f, 0.749023f, 0.763184f, 0.777832f, 0.790527f, 0.802734f, 0.813477f,
- 0.824219f, 0.834961f, 0.844238f, 0.853027f, 0.862305f, 0.869629f, 0.877441f, 0.884277f,
- 0.892090f, 0.898926f, 0.904297f, 0.910645f, 0.916992f, 0.921875f, 0.926758f, 0.931641f,
- 0.937012f, 0.941406f, 0.945801f, 0.950195f, 0.954102f, 0.958496f, 0.962402f, 0.966309f,
- 0.969238f, 0.973145f, 0.976074f, 0.979492f, 0.982422f, 0.985352f, 0.988281f, 0.991211f,
- 0.993652f, 0.996094f, 0.997070f, 0.993164f, 0.990234f, 0.987305f, 0.984375f, 0.981445f,
- 0.033447f, 0.097717f, 0.160400f, 0.219238f, 0.273438f, 0.323486f, 0.371582f, 0.414062f,
- 0.454834f, 0.491211f, 0.524414f, 0.555176f, 0.583984f, 0.610840f, 0.635254f, 0.658203f,
- 0.678223f, 0.697754f, 0.716309f, 0.732422f, 0.749023f, 0.763184f, 0.776855f, 0.790527f,
- 0.802734f, 0.812988f, 0.824707f, 0.834473f, 0.844238f, 0.853516f, 0.862305f, 0.870117f,
- 0.877930f, 0.884766f, 0.892090f, 0.897949f, 0.905762f, 0.910645f, 0.917480f, 0.923340f,
- 0.927734f, 0.933105f, 0.937988f, 0.942871f, 0.947266f, 0.951172f, 0.955566f, 0.960449f,
- 0.963379f, 0.967285f, 0.970703f, 0.974609f, 0.978027f, 0.981445f, 0.984863f, 0.986816f,
- 0.989746f, 0.993164f, 0.995605f, 0.992188f, 0.988770f, 0.986328f, 0.983398f, 0.980957f,
- 0.024796f, 0.075195f, 0.126221f, 0.176025f, 0.224976f, 0.271729f, 0.317383f, 0.359375f,
- 0.399902f, 0.437744f, 0.472656f, 0.505371f, 0.536133f, 0.565430f, 0.591797f, 0.615723f,
- 0.639648f, 0.660156f, 0.681152f, 0.699219f, 0.718262f, 0.734375f, 0.749512f, 0.764648f,
- 0.777832f, 0.791016f, 0.802734f, 0.813965f, 0.825195f, 0.835449f, 0.844727f, 0.854004f,
- 0.862305f, 0.871094f, 0.878418f, 0.886230f, 0.893555f, 0.900391f, 0.906738f, 0.912598f,
- 0.917969f, 0.923828f, 0.929688f, 0.935059f, 0.939941f, 0.943848f, 0.949219f, 0.953613f,
- 0.958008f, 0.961914f, 0.965332f, 0.969238f, 0.972656f, 0.976074f, 0.979492f, 0.982910f,
- 0.986328f, 0.989258f, 0.993652f, 0.990723f, 0.987793f, 0.985352f, 0.982910f, 0.979980f,
- 0.019119f, 0.058624f, 0.100220f, 0.142578f, 0.185303f, 0.227417f, 0.269287f, 0.310059f,
- 0.348877f, 0.385254f, 0.421875f, 0.455566f, 0.489014f, 0.518555f, 0.546875f, 0.574707f,
- 0.598633f, 0.624023f, 0.645508f, 0.666016f, 0.684082f, 0.702637f, 0.720703f, 0.736816f,
- 0.751465f, 0.766113f, 0.779785f, 0.792969f, 0.804199f, 0.815918f, 0.826660f, 0.836426f,
- 0.846191f, 0.855957f, 0.864746f, 0.872559f, 0.880371f, 0.888184f, 0.895508f, 0.902344f,
- 0.908691f, 0.914062f, 0.919922f, 0.925293f, 0.932129f, 0.936035f, 0.941895f, 0.946289f,
- 0.951172f, 0.955566f, 0.959473f, 0.963867f, 0.967773f, 0.970703f, 0.975586f, 0.978516f,
- 0.981934f, 0.985352f, 0.991699f, 0.988770f, 0.986328f, 0.983887f, 0.981445f, 0.979004f,
- 0.015175f, 0.046997f, 0.080688f, 0.116028f, 0.152466f, 0.189819f, 0.227417f, 0.264404f,
- 0.301758f, 0.338623f, 0.374268f, 0.407471f, 0.439941f, 0.471924f, 0.501465f, 0.529785f,
- 0.556641f, 0.582031f, 0.606445f, 0.629395f, 0.649902f, 0.670898f, 0.688965f, 0.708496f,
- 0.725098f, 0.740723f, 0.755371f, 0.769531f, 0.782715f, 0.795410f, 0.807129f, 0.818848f,
- 0.829590f, 0.839844f, 0.849121f, 0.857910f, 0.866699f, 0.875488f, 0.882812f, 0.890625f,
- 0.897461f, 0.904297f, 0.910645f, 0.916992f, 0.922363f, 0.928223f, 0.933594f, 0.938477f,
- 0.944824f, 0.949707f, 0.953613f, 0.958008f, 0.962402f, 0.966309f, 0.970703f, 0.974121f,
- 0.977539f, 0.981934f, 0.990234f, 0.987793f, 0.984863f, 0.982910f, 0.980469f, 0.978516f,
- 0.012215f, 0.038452f, 0.066101f, 0.095825f, 0.126831f, 0.159180f, 0.192749f, 0.226685f,
- 0.260986f, 0.294922f, 0.328857f, 0.363037f, 0.394531f, 0.426270f, 0.457520f, 0.486572f,
- 0.514648f, 0.541016f, 0.567871f, 0.590820f, 0.614746f, 0.636230f, 0.657227f, 0.676270f,
- 0.694336f, 0.711914f, 0.729492f, 0.744141f, 0.759277f, 0.773438f, 0.786621f, 0.798340f,
- 0.811523f, 0.822266f, 0.833496f, 0.842773f, 0.851562f, 0.861816f, 0.869629f, 0.878418f,
- 0.885742f, 0.893066f, 0.900879f, 0.907715f, 0.913574f, 0.919922f, 0.925781f, 0.932129f,
- 0.937012f, 0.942871f, 0.946777f, 0.951660f, 0.957031f, 0.960938f, 0.965332f, 0.969727f,
- 0.973633f, 0.977051f, 0.988281f, 0.986328f, 0.983887f, 0.981445f, 0.979492f, 0.976562f,
- 0.009903f, 0.031525f, 0.054626f, 0.078979f, 0.105408f, 0.133789f, 0.162720f, 0.192993f,
- 0.224976f, 0.256592f, 0.288330f, 0.320312f, 0.352295f, 0.383545f, 0.414062f, 0.443848f,
- 0.473389f, 0.500488f, 0.526367f, 0.553223f, 0.577637f, 0.600586f, 0.622070f, 0.644043f,
- 0.664551f, 0.683105f, 0.701660f, 0.718262f, 0.734375f, 0.750000f, 0.764648f, 0.778320f,
- 0.791016f, 0.802734f, 0.815430f, 0.826172f, 0.836426f, 0.845703f, 0.855957f, 0.864258f,
- 0.874023f, 0.881348f, 0.889648f, 0.896973f, 0.904297f, 0.911621f, 0.917480f, 0.922852f,
- 0.929199f, 0.935059f, 0.939941f, 0.944824f, 0.950195f, 0.954590f, 0.959961f, 0.964355f,
- 0.968262f, 0.972656f, 0.986328f, 0.984375f, 0.981934f, 0.979980f, 0.978027f, 0.975586f,
- 0.008385f, 0.026154f, 0.045319f, 0.066467f, 0.089111f, 0.113220f, 0.138916f, 0.165405f,
- 0.192871f, 0.222290f, 0.252197f, 0.281494f, 0.311279f, 0.342285f, 0.372314f, 0.402832f,
- 0.431641f, 0.459473f, 0.486572f, 0.513672f, 0.539062f, 0.562988f, 0.587402f, 0.609863f,
- 0.631348f, 0.652344f, 0.671875f, 0.689941f, 0.708008f, 0.724609f, 0.740234f, 0.755371f,
- 0.768066f, 0.783203f, 0.795410f, 0.808105f, 0.819336f, 0.830078f, 0.840332f, 0.851074f,
- 0.860352f, 0.869141f, 0.877930f, 0.885742f, 0.893555f, 0.900879f, 0.907715f, 0.915039f,
- 0.920410f, 0.926758f, 0.933105f, 0.938965f, 0.944336f, 0.949707f, 0.953613f, 0.958984f,
- 0.962891f, 0.967285f, 0.984375f, 0.982910f, 0.980957f, 0.978516f, 0.976562f, 0.974609f,
- 0.006992f, 0.022324f, 0.038544f, 0.056396f, 0.075317f, 0.095947f, 0.117981f, 0.141968f,
- 0.166504f, 0.192627f, 0.219238f, 0.246704f, 0.275879f, 0.304443f, 0.333252f, 0.362305f,
- 0.390869f, 0.419678f, 0.447266f, 0.474121f, 0.500977f, 0.525879f, 0.551270f, 0.574219f,
- 0.597656f, 0.620117f, 0.641602f, 0.661133f, 0.680664f, 0.698242f, 0.715332f, 0.731934f,
- 0.746582f, 0.761230f, 0.775391f, 0.789551f, 0.802246f, 0.813477f, 0.825195f, 0.835938f,
- 0.846191f, 0.855957f, 0.865723f, 0.873535f, 0.882324f, 0.890625f, 0.898438f, 0.905762f,
- 0.912598f, 0.918945f, 0.925781f, 0.931641f, 0.937012f, 0.943848f, 0.948730f, 0.954102f,
- 0.957520f, 0.963379f, 0.981934f, 0.980957f, 0.979004f, 0.977051f, 0.975098f, 0.973145f,
- 0.006260f, 0.018387f, 0.032684f, 0.047821f, 0.064636f, 0.082153f, 0.101318f, 0.122009f,
- 0.143921f, 0.166870f, 0.191406f, 0.216187f, 0.243164f, 0.269287f, 0.297119f, 0.324951f,
- 0.352783f, 0.380859f, 0.408691f, 0.435547f, 0.462402f, 0.489258f, 0.514160f, 0.540039f,
- 0.563965f, 0.585938f, 0.608398f, 0.629395f, 0.649414f, 0.669434f, 0.689453f, 0.705566f,
- 0.722656f, 0.739258f, 0.753418f, 0.769043f, 0.783203f, 0.795898f, 0.807617f, 0.819824f,
- 0.830566f, 0.842285f, 0.852051f, 0.862305f, 0.871094f, 0.878906f, 0.888184f, 0.895996f,
- 0.902832f, 0.910645f, 0.917480f, 0.924316f, 0.930176f, 0.936523f, 0.942383f, 0.946777f,
- 0.953613f, 0.958496f, 0.979980f, 0.979004f, 0.977539f, 0.975586f, 0.973633f, 0.972168f,
- 0.005268f, 0.016418f, 0.028091f, 0.041107f, 0.055420f, 0.070435f, 0.087341f, 0.105347f,
- 0.124512f, 0.144531f, 0.166260f, 0.189453f, 0.213989f, 0.238037f, 0.263184f, 0.290039f,
- 0.317139f, 0.344238f, 0.370850f, 0.398438f, 0.425293f, 0.451660f, 0.477539f, 0.503418f,
- 0.528320f, 0.551270f, 0.576172f, 0.598145f, 0.619629f, 0.640137f, 0.659668f, 0.680176f,
- 0.697754f, 0.714844f, 0.731934f, 0.748047f, 0.762695f, 0.776367f, 0.790039f, 0.803223f,
- 0.814453f, 0.827148f, 0.837891f, 0.847656f, 0.858398f, 0.868164f, 0.876953f, 0.885742f,
- 0.893066f, 0.901855f, 0.908691f, 0.916504f, 0.922852f, 0.929199f, 0.935059f, 0.941895f,
- 0.947754f, 0.953125f, 0.978027f, 0.977539f, 0.975586f, 0.973633f, 0.971680f, 0.969727f,
- 0.004372f, 0.013802f, 0.024185f, 0.036011f, 0.047729f, 0.060944f, 0.075684f, 0.090820f,
- 0.107788f, 0.125488f, 0.144653f, 0.165771f, 0.187012f, 0.210205f, 0.233643f, 0.258545f,
- 0.283447f, 0.309326f, 0.335449f, 0.362305f, 0.388672f, 0.415771f, 0.441650f, 0.468018f,
- 0.492920f, 0.518066f, 0.542480f, 0.564941f, 0.587891f, 0.609863f, 0.630859f, 0.651855f,
- 0.670898f, 0.689453f, 0.707520f, 0.724609f, 0.740723f, 0.755859f, 0.770996f, 0.785156f,
- 0.799316f, 0.809570f, 0.822754f, 0.834473f, 0.845215f, 0.855469f, 0.865723f, 0.874023f,
- 0.883301f, 0.892090f, 0.899902f, 0.907715f, 0.915039f, 0.922363f, 0.928711f, 0.935059f,
- 0.941406f, 0.947266f, 0.975586f, 0.975098f, 0.973633f, 0.971680f, 0.969727f, 0.968262f,
- 0.003809f, 0.012253f, 0.021240f, 0.030884f, 0.041473f, 0.052887f, 0.065308f, 0.079224f,
- 0.094177f, 0.109558f, 0.126709f, 0.145142f, 0.163940f, 0.184814f, 0.207397f, 0.229736f,
- 0.252686f, 0.276855f, 0.302246f, 0.327881f, 0.353271f, 0.380127f, 0.405762f, 0.432129f,
- 0.457520f, 0.482422f, 0.507324f, 0.531250f, 0.556152f, 0.578125f, 0.600586f, 0.622559f,
- 0.642578f, 0.662109f, 0.681641f, 0.700195f, 0.716797f, 0.734375f, 0.750000f, 0.766113f,
- 0.779297f, 0.793457f, 0.807129f, 0.819336f, 0.830078f, 0.842285f, 0.853027f, 0.862793f,
- 0.872559f, 0.881348f, 0.890625f, 0.899414f, 0.907227f, 0.914551f, 0.920898f, 0.928223f,
- 0.935059f, 0.941406f, 0.973633f, 0.973145f, 0.971680f, 0.970215f, 0.968262f, 0.966797f,
- 0.003462f, 0.010796f, 0.018646f, 0.026962f, 0.036377f, 0.046173f, 0.057190f, 0.068665f,
- 0.081726f, 0.095520f, 0.110962f, 0.127563f, 0.144897f, 0.162476f, 0.182373f, 0.202881f,
- 0.225342f, 0.248291f, 0.271729f, 0.294922f, 0.320312f, 0.345459f, 0.370850f, 0.397217f,
- 0.422607f, 0.447998f, 0.473145f, 0.498291f, 0.522461f, 0.546875f, 0.569824f, 0.591797f,
- 0.614258f, 0.635742f, 0.655273f, 0.674805f, 0.693359f, 0.711426f, 0.729492f, 0.745605f,
- 0.760742f, 0.775391f, 0.789551f, 0.803223f, 0.816406f, 0.828125f, 0.839844f, 0.850586f,
- 0.861328f, 0.871094f, 0.880371f, 0.889648f, 0.898438f, 0.906250f, 0.915039f, 0.921875f,
- 0.928223f, 0.935547f, 0.970703f, 0.970215f, 0.970215f, 0.967773f, 0.966309f, 0.965332f,
- 0.002872f, 0.009338f, 0.016174f, 0.024231f, 0.031525f, 0.040558f, 0.050140f, 0.060455f,
- 0.071472f, 0.084167f, 0.097168f, 0.111450f, 0.127197f, 0.143433f, 0.160889f, 0.179565f,
- 0.199463f, 0.220825f, 0.242554f, 0.265625f, 0.288818f, 0.312744f, 0.338135f, 0.362793f,
- 0.387939f, 0.414307f, 0.439453f, 0.464355f, 0.489014f, 0.514648f, 0.537598f, 0.561523f,
- 0.583984f, 0.606445f, 0.627930f, 0.648926f, 0.667480f, 0.687988f, 0.705566f, 0.723633f,
- 0.740234f, 0.756348f, 0.771484f, 0.786621f, 0.799805f, 0.812012f, 0.825195f, 0.836426f,
- 0.849121f, 0.859375f, 0.870605f, 0.879883f, 0.888672f, 0.897461f, 0.905762f, 0.915039f,
- 0.921387f, 0.928711f, 0.967773f, 0.969238f, 0.966797f, 0.966797f, 0.964355f, 0.963379f,
- 0.002750f, 0.008202f, 0.014519f, 0.021301f, 0.028183f, 0.035828f, 0.044342f, 0.053375f,
- 0.063354f, 0.074219f, 0.085876f, 0.098083f, 0.111938f, 0.126343f, 0.142212f, 0.158936f,
- 0.177124f, 0.196411f, 0.216553f, 0.237427f, 0.260010f, 0.282715f, 0.306641f, 0.330811f,
- 0.355957f, 0.381104f, 0.405518f, 0.431152f, 0.456543f, 0.480957f, 0.504883f, 0.529785f,
- 0.553223f, 0.577148f, 0.599121f, 0.620605f, 0.642090f, 0.662598f, 0.682617f, 0.701172f,
- 0.718750f, 0.735352f, 0.751953f, 0.768066f, 0.783691f, 0.796875f, 0.810547f, 0.822754f,
- 0.835938f, 0.847656f, 0.858398f, 0.869141f, 0.879395f, 0.888672f, 0.897949f, 0.906250f,
- 0.914551f, 0.922363f, 0.965820f, 0.966797f, 0.965820f, 0.963867f, 0.963379f, 0.961426f,
- 0.002264f, 0.007446f, 0.012741f, 0.018494f, 0.024536f, 0.031769f, 0.039154f, 0.047424f,
- 0.056122f, 0.065308f, 0.075623f, 0.087219f, 0.098755f, 0.111328f, 0.125854f, 0.140869f,
- 0.157349f, 0.174805f, 0.193115f, 0.212402f, 0.233643f, 0.254883f, 0.276855f, 0.300293f,
- 0.324463f, 0.348389f, 0.374023f, 0.398193f, 0.423340f, 0.448242f, 0.473877f, 0.498291f,
- 0.521973f, 0.545898f, 0.569824f, 0.592773f, 0.614258f, 0.635742f, 0.657227f, 0.676270f,
- 0.695801f, 0.714844f, 0.731445f, 0.749512f, 0.765137f, 0.779785f, 0.793945f, 0.808594f,
- 0.821777f, 0.833496f, 0.846191f, 0.858398f, 0.868652f, 0.879395f, 0.888672f, 0.897949f,
- 0.906738f, 0.916016f, 0.962402f, 0.963867f, 0.962891f, 0.961914f, 0.960938f, 0.958984f,
- 0.002377f, 0.006668f, 0.011467f, 0.016693f, 0.021820f, 0.028091f, 0.034485f, 0.041748f,
- 0.049347f, 0.057678f, 0.066589f, 0.076538f, 0.086975f, 0.098816f, 0.111816f, 0.125366f,
- 0.139404f, 0.155151f, 0.171875f, 0.190186f, 0.208496f, 0.228760f, 0.250244f, 0.271973f,
- 0.294189f, 0.317871f, 0.341797f, 0.365479f, 0.391357f, 0.415771f, 0.440430f, 0.466797f,
- 0.491699f, 0.515625f, 0.539551f, 0.563477f, 0.585938f, 0.608887f, 0.630371f, 0.651855f,
- 0.672363f, 0.692383f, 0.710449f, 0.729492f, 0.745605f, 0.762695f, 0.778320f, 0.792480f,
- 0.807129f, 0.820801f, 0.833984f, 0.846680f, 0.857910f, 0.869141f, 0.879395f, 0.889648f,
- 0.899414f, 0.907715f, 0.959473f, 0.961426f, 0.960449f, 0.959961f, 0.958496f, 0.957031f,
- 0.002062f, 0.006180f, 0.010201f, 0.015053f, 0.019531f, 0.025116f, 0.030960f, 0.037292f,
- 0.043915f, 0.051117f, 0.059570f, 0.067749f, 0.076843f, 0.087708f, 0.099060f, 0.110352f,
- 0.123413f, 0.138062f, 0.153198f, 0.169067f, 0.186768f, 0.204956f, 0.224487f, 0.244873f,
- 0.265625f, 0.288330f, 0.311768f, 0.335205f, 0.359863f, 0.384521f, 0.409668f, 0.434082f,
- 0.459717f, 0.483887f, 0.508789f, 0.533203f, 0.557617f, 0.580566f, 0.603516f, 0.626465f,
- 0.646484f, 0.667969f, 0.687500f, 0.708008f, 0.726074f, 0.744141f, 0.760742f, 0.776367f,
- 0.791504f, 0.806641f, 0.820312f, 0.833496f, 0.846191f, 0.858398f, 0.869629f, 0.879883f,
- 0.890625f, 0.900879f, 0.956543f, 0.958496f, 0.958008f, 0.956543f, 0.955566f, 0.954102f,
- 0.001774f, 0.005459f, 0.009155f, 0.013290f, 0.017807f, 0.022537f, 0.027527f, 0.033081f,
- 0.038818f, 0.045380f, 0.052643f, 0.060516f, 0.068420f, 0.077942f, 0.087952f, 0.098572f,
- 0.109863f, 0.122925f, 0.136230f, 0.150146f, 0.166382f, 0.183105f, 0.201172f, 0.219482f,
- 0.240112f, 0.261230f, 0.283203f, 0.305664f, 0.329590f, 0.353027f, 0.377930f, 0.402344f,
- 0.427490f, 0.453369f, 0.478516f, 0.502930f, 0.527832f, 0.552246f, 0.575684f, 0.598145f,
- 0.621094f, 0.643555f, 0.664551f, 0.685547f, 0.704590f, 0.723633f, 0.742188f, 0.759277f,
- 0.775879f, 0.791016f, 0.806152f, 0.820801f, 0.833496f, 0.847168f, 0.859375f, 0.870605f,
- 0.881348f, 0.893066f, 0.953125f, 0.956055f, 0.955566f, 0.954102f, 0.953125f, 0.951660f,
- 0.001655f, 0.004757f, 0.008308f, 0.011993f, 0.015808f, 0.020187f, 0.024780f, 0.029434f,
- 0.034851f, 0.040741f, 0.046997f, 0.053650f, 0.061096f, 0.069397f, 0.078064f, 0.087280f,
- 0.097351f, 0.108887f, 0.121033f, 0.134277f, 0.148560f, 0.163330f, 0.180054f, 0.197144f,
- 0.215332f, 0.235718f, 0.255859f, 0.277588f, 0.300049f, 0.323730f, 0.347656f, 0.371826f,
- 0.396729f, 0.422607f, 0.447021f, 0.472168f, 0.497803f, 0.521973f, 0.547363f, 0.571289f,
- 0.594238f, 0.618164f, 0.640137f, 0.662109f, 0.682617f, 0.702637f, 0.722168f, 0.739746f,
- 0.758301f, 0.774902f, 0.790527f, 0.806641f, 0.820801f, 0.834961f, 0.848633f, 0.860352f,
- 0.872559f, 0.883789f, 0.949707f, 0.953125f, 0.952148f, 0.951172f, 0.950684f, 0.948730f,
- 0.001418f, 0.004456f, 0.007584f, 0.010803f, 0.014450f, 0.018005f, 0.022186f, 0.026398f,
- 0.031342f, 0.036224f, 0.041687f, 0.048126f, 0.054382f, 0.061676f, 0.069641f, 0.077759f,
- 0.086914f, 0.097168f, 0.107910f, 0.119263f, 0.132446f, 0.145752f, 0.161011f, 0.176758f,
- 0.193726f, 0.211914f, 0.231201f, 0.251709f, 0.272705f, 0.294922f, 0.318604f, 0.342041f,
- 0.366455f, 0.390869f, 0.416992f, 0.441895f, 0.467285f, 0.493164f, 0.517578f, 0.541992f,
- 0.566895f, 0.590820f, 0.614746f, 0.637207f, 0.660156f, 0.681152f, 0.701172f, 0.720703f,
- 0.739746f, 0.758301f, 0.775391f, 0.791992f, 0.807617f, 0.821289f, 0.836426f, 0.850586f,
- 0.863281f, 0.874512f, 0.946777f, 0.949707f, 0.949707f, 0.948730f, 0.947266f, 0.946289f,
- 0.001213f, 0.003864f, 0.006721f, 0.009796f, 0.012932f, 0.016037f, 0.020218f, 0.024231f,
- 0.028275f, 0.032379f, 0.037567f, 0.042603f, 0.048584f, 0.054993f, 0.061798f, 0.069519f,
- 0.077637f, 0.086182f, 0.095703f, 0.106323f, 0.117676f, 0.130127f, 0.143555f, 0.158203f,
- 0.173462f, 0.189941f, 0.207886f, 0.226807f, 0.247192f, 0.267822f, 0.290527f, 0.312500f,
- 0.336670f, 0.360352f, 0.385742f, 0.410889f, 0.437256f, 0.462646f, 0.488281f, 0.513184f,
- 0.539062f, 0.563477f, 0.588379f, 0.612305f, 0.636230f, 0.657715f, 0.679199f, 0.700195f,
- 0.720703f, 0.740234f, 0.758301f, 0.775879f, 0.793945f, 0.809082f, 0.824219f, 0.838867f,
- 0.852539f, 0.865234f, 0.942871f, 0.946777f, 0.946777f, 0.945312f, 0.944824f, 0.943359f,
- 0.001063f, 0.003754f, 0.005909f, 0.008789f, 0.011780f, 0.014671f, 0.017792f, 0.021378f,
- 0.025238f, 0.029221f, 0.033417f, 0.038300f, 0.043488f, 0.048828f, 0.054779f, 0.061554f,
- 0.068604f, 0.076721f, 0.085388f, 0.094482f, 0.104614f, 0.115845f, 0.128296f, 0.141113f,
- 0.155029f, 0.170044f, 0.186401f, 0.204224f, 0.222778f, 0.242188f, 0.263916f, 0.285156f,
- 0.308350f, 0.331787f, 0.355957f, 0.381348f, 0.407227f, 0.432617f, 0.459229f, 0.484619f,
- 0.509277f, 0.536133f, 0.560547f, 0.585938f, 0.609863f, 0.633301f, 0.657715f, 0.678711f,
- 0.699707f, 0.721191f, 0.740723f, 0.759277f, 0.777344f, 0.794922f, 0.811035f, 0.826660f,
- 0.841797f, 0.855469f, 0.939453f, 0.943359f, 0.943359f, 0.942871f, 0.941895f, 0.940918f,
- 0.001175f, 0.003069f, 0.005558f, 0.007912f, 0.010712f, 0.013199f, 0.016235f, 0.019547f,
- 0.022659f, 0.026138f, 0.030151f, 0.034424f, 0.038940f, 0.044067f, 0.049255f, 0.054993f,
- 0.061493f, 0.068359f, 0.075928f, 0.084290f, 0.093262f, 0.103760f, 0.114319f, 0.126099f,
- 0.138550f, 0.152466f, 0.167114f, 0.183472f, 0.200439f, 0.219238f, 0.239014f, 0.259277f,
- 0.281250f, 0.303711f, 0.327148f, 0.351807f, 0.376709f, 0.402344f, 0.428955f, 0.453857f,
- 0.480713f, 0.507324f, 0.533203f, 0.558594f, 0.583984f, 0.609375f, 0.633301f, 0.656738f,
- 0.678711f, 0.700195f, 0.722168f, 0.742188f, 0.761719f, 0.780273f, 0.797852f, 0.813477f,
- 0.830078f, 0.845703f, 0.935547f, 0.939453f, 0.939453f, 0.938965f, 0.937988f, 0.937012f,
- 0.001089f, 0.002945f, 0.005066f, 0.007225f, 0.009575f, 0.012016f, 0.014656f, 0.017288f,
- 0.020142f, 0.023712f, 0.026764f, 0.030640f, 0.034637f, 0.039490f, 0.043854f, 0.048706f,
- 0.054688f, 0.060913f, 0.067871f, 0.075256f, 0.083191f, 0.092163f, 0.101868f, 0.111938f,
- 0.123657f, 0.136108f, 0.149658f, 0.164185f, 0.179932f, 0.196777f, 0.215454f, 0.234375f,
- 0.255371f, 0.276611f, 0.299805f, 0.323486f, 0.347656f, 0.373047f, 0.398682f, 0.425293f,
- 0.451172f, 0.477783f, 0.504883f, 0.530762f, 0.557617f, 0.583008f, 0.607910f, 0.632812f,
- 0.657227f, 0.680664f, 0.702637f, 0.724121f, 0.743652f, 0.764160f, 0.783691f, 0.800781f,
- 0.818848f, 0.833984f, 0.930664f, 0.936035f, 0.936035f, 0.935547f, 0.934570f, 0.933594f,
- 0.000847f, 0.002800f, 0.004562f, 0.006786f, 0.008804f, 0.011017f, 0.013145f, 0.015640f,
- 0.018509f, 0.021255f, 0.024277f, 0.027603f, 0.030991f, 0.035248f, 0.039642f, 0.043854f,
- 0.048798f, 0.054504f, 0.060516f, 0.067017f, 0.073914f, 0.082092f, 0.090515f, 0.099854f,
- 0.109863f, 0.121521f, 0.133545f, 0.146851f, 0.161133f, 0.176514f, 0.192993f, 0.211426f,
- 0.230957f, 0.251465f, 0.272705f, 0.295410f, 0.319092f, 0.343994f, 0.369385f, 0.395020f,
- 0.421631f, 0.448242f, 0.475342f, 0.501953f, 0.529785f, 0.556152f, 0.582031f, 0.608887f,
- 0.633789f, 0.658203f, 0.681152f, 0.704590f, 0.726074f, 0.748535f, 0.768555f, 0.787109f,
- 0.804199f, 0.822754f, 0.926758f, 0.931641f, 0.932129f, 0.931641f, 0.931152f, 0.930176f,
- 0.001035f, 0.002598f, 0.004147f, 0.006062f, 0.007942f, 0.009933f, 0.012405f, 0.014565f,
- 0.016174f, 0.019135f, 0.021988f, 0.024811f, 0.028259f, 0.031616f, 0.035065f, 0.039429f,
- 0.043884f, 0.048615f, 0.053833f, 0.059723f, 0.065796f, 0.072693f, 0.080383f, 0.088745f,
- 0.098206f, 0.107727f, 0.119080f, 0.130981f, 0.143677f, 0.157959f, 0.173218f, 0.189941f,
- 0.207642f, 0.226929f, 0.247437f, 0.269043f, 0.291748f, 0.315674f, 0.340576f, 0.366211f,
- 0.392578f, 0.419434f, 0.446533f, 0.473877f, 0.502441f, 0.528320f, 0.556152f, 0.583008f,
- 0.609375f, 0.635254f, 0.660156f, 0.684082f, 0.706543f, 0.729980f, 0.751953f, 0.771973f,
- 0.792480f, 0.810547f, 0.922363f, 0.927734f, 0.928223f, 0.928223f, 0.927246f, 0.926758f,
- 0.000775f, 0.002325f, 0.003843f, 0.005573f, 0.007397f, 0.009163f, 0.010857f, 0.012939f,
- 0.015312f, 0.017273f, 0.019684f, 0.022537f, 0.025070f, 0.028183f, 0.031616f, 0.035461f,
- 0.038940f, 0.043671f, 0.048096f, 0.053131f, 0.058411f, 0.064941f, 0.071777f, 0.078857f,
- 0.086731f, 0.096130f, 0.105835f, 0.116760f, 0.128296f, 0.140747f, 0.154907f, 0.170410f,
- 0.186646f, 0.204834f, 0.223633f, 0.243896f, 0.265625f, 0.288330f, 0.312012f, 0.337402f,
- 0.363037f, 0.389648f, 0.417480f, 0.444824f, 0.473633f, 0.500000f, 0.529297f, 0.556641f,
- 0.583984f, 0.610840f, 0.638184f, 0.662598f, 0.687988f, 0.711914f, 0.734375f, 0.755859f,
- 0.777832f, 0.798828f, 0.916992f, 0.922852f, 0.923828f, 0.923828f, 0.923340f, 0.922363f,
- 0.000617f, 0.002234f, 0.003510f, 0.005035f, 0.006397f, 0.008156f, 0.010033f, 0.011665f,
- 0.013481f, 0.015717f, 0.017700f, 0.020004f, 0.022766f, 0.025391f, 0.028214f, 0.031586f,
- 0.035217f, 0.038757f, 0.042999f, 0.047668f, 0.052368f, 0.057434f, 0.063538f, 0.070190f,
- 0.077698f, 0.085449f, 0.094299f, 0.103394f, 0.113953f, 0.125610f, 0.137817f, 0.151855f,
- 0.167236f, 0.183228f, 0.200806f, 0.219971f, 0.240479f, 0.262451f, 0.285645f, 0.309570f,
- 0.334961f, 0.360596f, 0.387939f, 0.416016f, 0.444092f, 0.473145f, 0.501465f, 0.529785f,
- 0.558105f, 0.585938f, 0.614258f, 0.640137f, 0.666992f, 0.692383f, 0.716797f, 0.739746f,
- 0.763184f, 0.784180f, 0.912109f, 0.918457f, 0.919434f, 0.919434f, 0.918457f, 0.917969f,
- 0.000665f, 0.002039f, 0.003386f, 0.004520f, 0.005989f, 0.007511f, 0.009262f, 0.010902f,
- 0.012314f, 0.014320f, 0.015869f, 0.018127f, 0.020248f, 0.022476f, 0.025284f, 0.028122f,
- 0.030991f, 0.034668f, 0.038239f, 0.042206f, 0.046539f, 0.051361f, 0.056610f, 0.062347f,
- 0.068604f, 0.075623f, 0.083313f, 0.092041f, 0.101379f, 0.111572f, 0.122986f, 0.135132f,
- 0.148926f, 0.164062f, 0.180054f, 0.197510f, 0.216797f, 0.237183f, 0.259521f, 0.282227f,
- 0.307129f, 0.332764f, 0.358887f, 0.386475f, 0.415527f, 0.443604f, 0.473389f, 0.501465f,
- 0.530762f, 0.560059f, 0.588867f, 0.617676f, 0.645020f, 0.671387f, 0.698242f, 0.722656f,
- 0.746094f, 0.770020f, 0.906738f, 0.913574f, 0.915039f, 0.914551f, 0.914062f, 0.914062f,
- 0.000661f, 0.001754f, 0.002831f, 0.004066f, 0.005333f, 0.006668f, 0.008286f, 0.009773f,
- 0.011124f, 0.012794f, 0.014320f, 0.016357f, 0.018036f, 0.020386f, 0.022766f, 0.025192f,
- 0.027924f, 0.030807f, 0.034027f, 0.037628f, 0.041321f, 0.045349f, 0.050262f, 0.055328f,
- 0.060699f, 0.066833f, 0.073669f, 0.081360f, 0.089600f, 0.099060f, 0.108826f, 0.119995f,
- 0.132324f, 0.145874f, 0.160889f, 0.176880f, 0.194702f, 0.213379f, 0.234497f, 0.256104f,
- 0.280029f, 0.304688f, 0.330811f, 0.358154f, 0.385986f, 0.415039f, 0.444092f, 0.474609f,
- 0.503418f, 0.534180f, 0.563965f, 0.592773f, 0.621094f, 0.650391f, 0.678223f, 0.704590f,
- 0.730469f, 0.754883f, 0.901855f, 0.908691f, 0.910156f, 0.909668f, 0.909668f, 0.908691f,
- 0.000653f, 0.001667f, 0.002666f, 0.003887f, 0.004986f, 0.006359f, 0.007202f, 0.008751f,
- 0.010300f, 0.011757f, 0.012939f, 0.014595f, 0.016281f, 0.018234f, 0.020142f, 0.022415f,
- 0.025101f, 0.027466f, 0.030182f, 0.033539f, 0.036865f, 0.040680f, 0.044342f, 0.048798f,
- 0.053619f, 0.059479f, 0.065491f, 0.071716f, 0.079285f, 0.087341f, 0.096497f, 0.106445f,
- 0.117615f, 0.129395f, 0.142822f, 0.157959f, 0.174194f, 0.192139f, 0.210938f, 0.231567f,
- 0.253906f, 0.277832f, 0.302979f, 0.329590f, 0.357422f, 0.385986f, 0.415283f, 0.446045f,
- 0.475830f, 0.506348f, 0.537109f, 0.567871f, 0.599121f, 0.628418f, 0.657227f, 0.685547f,
- 0.712891f, 0.739746f, 0.895508f, 0.902344f, 0.904297f, 0.904785f, 0.904297f, 0.904297f,
- 0.000372f, 0.001397f, 0.002384f, 0.003529f, 0.004509f, 0.005505f, 0.007015f, 0.008026f,
- 0.009201f, 0.010292f, 0.011536f, 0.013130f, 0.014915f, 0.016266f, 0.018387f, 0.020218f,
- 0.022034f, 0.024399f, 0.026901f, 0.029617f, 0.032623f, 0.035950f, 0.039032f, 0.043030f,
- 0.047577f, 0.052612f, 0.057556f, 0.063477f, 0.070007f, 0.077209f, 0.085083f, 0.094177f,
- 0.103821f, 0.114563f, 0.126709f, 0.140015f, 0.154785f, 0.171143f, 0.188477f, 0.208252f,
- 0.229004f, 0.251709f, 0.275879f, 0.302002f, 0.328613f, 0.356445f, 0.385986f, 0.416504f,
- 0.447510f, 0.478760f, 0.510254f, 0.542480f, 0.573730f, 0.604980f, 0.635742f, 0.665527f,
- 0.694336f, 0.722656f, 0.887695f, 0.897949f, 0.898926f, 0.899414f, 0.897949f, 0.898438f,
- 0.000661f, 0.001222f, 0.002275f, 0.003313f, 0.004181f, 0.005119f, 0.006275f, 0.007126f,
- 0.007988f, 0.009354f, 0.010300f, 0.012062f, 0.013313f, 0.014786f, 0.016251f, 0.018021f,
- 0.019516f, 0.021896f, 0.024017f, 0.026428f, 0.029022f, 0.031799f, 0.034698f, 0.038422f,
- 0.042236f, 0.046265f, 0.050598f, 0.055786f, 0.061493f, 0.067871f, 0.074951f, 0.082458f,
- 0.091187f, 0.101135f, 0.111694f, 0.123779f, 0.137207f, 0.151978f, 0.167969f, 0.186157f,
- 0.205688f, 0.226929f, 0.249756f, 0.274658f, 0.301025f, 0.328613f, 0.357178f, 0.387207f,
- 0.418457f, 0.450195f, 0.482422f, 0.516113f, 0.548340f, 0.580566f, 0.612305f, 0.644043f,
- 0.674805f, 0.705566f, 0.882812f, 0.890625f, 0.892578f, 0.893066f, 0.892578f, 0.893066f,
- 0.000379f, 0.001211f, 0.002066f, 0.003040f, 0.003834f, 0.004616f, 0.005608f, 0.006550f,
- 0.007347f, 0.008408f, 0.009529f, 0.010452f, 0.011940f, 0.013039f, 0.014313f, 0.015961f,
- 0.017746f, 0.019180f, 0.021210f, 0.023239f, 0.025482f, 0.028030f, 0.030640f, 0.033661f,
- 0.036987f, 0.040466f, 0.044617f, 0.048828f, 0.053894f, 0.059235f, 0.065674f, 0.072632f,
- 0.079956f, 0.089050f, 0.098267f, 0.109009f, 0.120789f, 0.134521f, 0.148926f, 0.165405f,
- 0.183228f, 0.202881f, 0.224731f, 0.248779f, 0.273193f, 0.300049f, 0.329346f, 0.358887f,
- 0.390381f, 0.421387f, 0.454590f, 0.488770f, 0.521484f, 0.555176f, 0.588379f, 0.621582f,
- 0.654785f, 0.686523f, 0.875488f, 0.885254f, 0.886719f, 0.886230f, 0.886719f, 0.886230f,
- 0.000282f, 0.001126f, 0.002010f, 0.002661f, 0.003340f, 0.004269f, 0.005192f, 0.005711f,
- 0.006638f, 0.007278f, 0.008377f, 0.009483f, 0.010567f, 0.011742f, 0.012871f, 0.014061f,
- 0.015480f, 0.017242f, 0.018799f, 0.020584f, 0.022461f, 0.024490f, 0.027100f, 0.029434f,
- 0.032532f, 0.035706f, 0.038971f, 0.042969f, 0.047241f, 0.052094f, 0.057373f, 0.063232f,
- 0.070007f, 0.077637f, 0.086243f, 0.095764f, 0.106323f, 0.118164f, 0.131470f, 0.146118f,
- 0.162720f, 0.181030f, 0.200928f, 0.223022f, 0.247070f, 0.272705f, 0.300537f, 0.330322f,
- 0.360107f, 0.393066f, 0.426270f, 0.459473f, 0.494629f, 0.529297f, 0.564453f, 0.598633f,
- 0.633789f, 0.666504f, 0.868652f, 0.878418f, 0.879395f, 0.880371f, 0.879883f, 0.879395f,
- 0.000340f, 0.000963f, 0.001826f, 0.002459f, 0.003307f, 0.003847f, 0.004719f, 0.004936f,
- 0.005802f, 0.006695f, 0.007748f, 0.008522f, 0.009506f, 0.010376f, 0.011383f, 0.012787f,
- 0.013901f, 0.015182f, 0.016663f, 0.018051f, 0.019821f, 0.021759f, 0.023590f, 0.025818f,
- 0.028519f, 0.030975f, 0.034210f, 0.037811f, 0.040802f, 0.045349f, 0.050201f, 0.055298f,
- 0.061310f, 0.067688f, 0.074768f, 0.083557f, 0.092590f, 0.103149f, 0.115479f, 0.128906f,
- 0.142944f, 0.160278f, 0.178345f, 0.198975f, 0.221802f, 0.246094f, 0.272949f, 0.301514f,
- 0.331543f, 0.363525f, 0.396729f, 0.430908f, 0.466553f, 0.501953f, 0.538086f, 0.574707f,
- 0.610840f, 0.646973f, 0.860352f, 0.870605f, 0.873047f, 0.873047f, 0.873535f, 0.872559f,
- 0.000225f, 0.001021f, 0.001653f, 0.002302f, 0.002827f, 0.003448f, 0.003937f, 0.004486f,
- 0.004986f, 0.006252f, 0.007000f, 0.007416f, 0.008224f, 0.009300f, 0.009972f, 0.011322f,
- 0.012115f, 0.013428f, 0.014557f, 0.015991f, 0.017532f, 0.018982f, 0.020706f, 0.022781f,
- 0.024567f, 0.027161f, 0.029770f, 0.032623f, 0.035828f, 0.039551f, 0.043030f, 0.047852f,
- 0.052795f, 0.058716f, 0.065125f, 0.072266f, 0.080566f, 0.089661f, 0.100403f, 0.112854f,
- 0.125732f, 0.140991f, 0.157349f, 0.176514f, 0.197510f, 0.220581f, 0.245850f, 0.273438f,
- 0.302979f, 0.334717f, 0.367676f, 0.401855f, 0.437256f, 0.474609f, 0.512695f, 0.549316f,
- 0.588379f, 0.625000f, 0.853027f, 0.863281f, 0.866211f, 0.866211f, 0.866699f, 0.866211f,
- 0.000324f, 0.000845f, 0.001534f, 0.002172f, 0.002474f, 0.003115f, 0.003824f, 0.003937f,
- 0.004848f, 0.005417f, 0.006222f, 0.006760f, 0.007446f, 0.008186f, 0.009102f, 0.009888f,
- 0.010620f, 0.011551f, 0.012878f, 0.013954f, 0.015106f, 0.016495f, 0.018143f, 0.019669f,
- 0.021713f, 0.023468f, 0.025818f, 0.028183f, 0.031021f, 0.033783f, 0.037445f, 0.041534f,
- 0.045532f, 0.050598f, 0.056152f, 0.062500f, 0.069580f, 0.077698f, 0.086914f, 0.097717f,
- 0.108948f, 0.123047f, 0.138184f, 0.155273f, 0.174438f, 0.196167f, 0.219604f, 0.246094f,
- 0.274902f, 0.305420f, 0.338379f, 0.372314f, 0.408936f, 0.445801f, 0.484131f, 0.523438f,
- 0.562988f, 0.604492f, 0.843262f, 0.856445f, 0.857422f, 0.857910f, 0.858398f, 0.858398f,
- 0.000331f, 0.000944f, 0.001288f, 0.001833f, 0.002388f, 0.002769f, 0.003216f, 0.003664f,
- 0.004276f, 0.004822f, 0.005173f, 0.005951f, 0.006531f, 0.007156f, 0.007896f, 0.008438f,
- 0.009430f, 0.010117f, 0.011208f, 0.012253f, 0.012970f, 0.014297f, 0.015572f, 0.017059f,
- 0.018692f, 0.020264f, 0.022125f, 0.024323f, 0.026474f, 0.029343f, 0.032288f, 0.035461f,
- 0.039062f, 0.043335f, 0.047821f, 0.053558f, 0.059509f, 0.067078f, 0.074341f, 0.083862f,
- 0.094360f, 0.106323f, 0.120117f, 0.135254f, 0.153442f, 0.172852f, 0.195190f, 0.220337f,
- 0.246948f, 0.276611f, 0.308594f, 0.343262f, 0.379150f, 0.416992f, 0.455811f, 0.496582f,
- 0.537598f, 0.579590f, 0.834473f, 0.847656f, 0.850098f, 0.850098f, 0.849609f, 0.850098f,
- 0.000316f, 0.000824f, 0.001088f, 0.001693f, 0.002062f, 0.002403f, 0.003027f, 0.003460f,
- 0.003712f, 0.004166f, 0.004765f, 0.005138f, 0.005871f, 0.006218f, 0.006924f, 0.007431f,
- 0.008255f, 0.008850f, 0.009781f, 0.010590f, 0.011391f, 0.012367f, 0.013474f, 0.014709f,
- 0.015823f, 0.017685f, 0.018982f, 0.020844f, 0.022629f, 0.025070f, 0.027496f, 0.030380f,
- 0.033447f, 0.037140f, 0.041168f, 0.045654f, 0.050720f, 0.057251f, 0.063965f, 0.071777f,
- 0.080811f, 0.091248f, 0.103638f, 0.117126f, 0.133179f, 0.151001f, 0.171631f, 0.194580f,
- 0.220337f, 0.248413f, 0.279785f, 0.313965f, 0.349365f, 0.386963f, 0.426514f, 0.468262f,
- 0.510742f, 0.555176f, 0.825684f, 0.838379f, 0.839844f, 0.841309f, 0.841309f, 0.841309f,
- 0.000210f, 0.000717f, 0.001084f, 0.001454f, 0.001882f, 0.002096f, 0.002468f, 0.002996f,
- 0.003395f, 0.003632f, 0.004066f, 0.004467f, 0.005020f, 0.005569f, 0.005917f, 0.006474f,
- 0.006958f, 0.007576f, 0.008453f, 0.009140f, 0.010002f, 0.010689f, 0.011520f, 0.012596f,
- 0.013695f, 0.014938f, 0.016220f, 0.017593f, 0.019424f, 0.020996f, 0.023331f, 0.025696f,
- 0.028427f, 0.031067f, 0.034668f, 0.038422f, 0.042908f, 0.048096f, 0.054016f, 0.060699f,
- 0.068909f, 0.077515f, 0.088501f, 0.100464f, 0.114624f, 0.130615f, 0.149048f, 0.170654f,
- 0.194214f, 0.222046f, 0.251465f, 0.283936f, 0.319580f, 0.357422f, 0.397461f, 0.440186f,
- 0.484375f, 0.528320f, 0.814941f, 0.828613f, 0.830078f, 0.832031f, 0.831543f, 0.833008f,
- 0.000234f, 0.000576f, 0.000939f, 0.001362f, 0.001481f, 0.001999f, 0.002228f, 0.002714f,
- 0.002846f, 0.003218f, 0.003555f, 0.003933f, 0.004356f, 0.004787f, 0.005169f, 0.005604f,
- 0.006145f, 0.006554f, 0.007275f, 0.007675f, 0.008293f, 0.009201f, 0.009979f, 0.010651f,
- 0.011497f, 0.012527f, 0.013893f, 0.014771f, 0.016373f, 0.017975f, 0.019455f, 0.021683f,
- 0.023895f, 0.026077f, 0.029114f, 0.032257f, 0.036072f, 0.040405f, 0.045197f, 0.050903f,
- 0.057770f, 0.065613f, 0.074524f, 0.085388f, 0.097656f, 0.111694f, 0.128540f, 0.147949f,
- 0.170166f, 0.195435f, 0.223389f, 0.255127f, 0.289551f, 0.327393f, 0.367432f, 0.410400f,
- 0.455078f, 0.502441f, 0.804199f, 0.818848f, 0.821289f, 0.822266f, 0.822754f, 0.822266f,
- 0.000213f, 0.000506f, 0.000756f, 0.001184f, 0.001396f, 0.001697f, 0.002010f, 0.002474f,
- 0.002569f, 0.002918f, 0.003090f, 0.003496f, 0.003855f, 0.004139f, 0.004478f, 0.004852f,
- 0.005253f, 0.005665f, 0.006100f, 0.006638f, 0.007080f, 0.007744f, 0.008293f, 0.009132f,
- 0.009750f, 0.010658f, 0.011536f, 0.012413f, 0.013779f, 0.014908f, 0.016510f, 0.017990f,
- 0.019623f, 0.021637f, 0.024109f, 0.026718f, 0.029922f, 0.033539f, 0.037567f, 0.042572f,
- 0.048279f, 0.054413f, 0.062042f, 0.071472f, 0.081909f, 0.094604f, 0.109436f, 0.127075f,
- 0.146484f, 0.170044f, 0.196533f, 0.226929f, 0.260254f, 0.296875f, 0.337402f, 0.380615f,
- 0.426025f, 0.475342f, 0.792969f, 0.807617f, 0.811035f, 0.811523f, 0.812012f, 0.813477f,
- 0.000119f, 0.000422f, 0.000883f, 0.001027f, 0.001189f, 0.001604f, 0.001783f, 0.001913f,
- 0.002228f, 0.002522f, 0.002645f, 0.003086f, 0.003199f, 0.003534f, 0.003790f, 0.004105f,
- 0.004421f, 0.004902f, 0.005283f, 0.005589f, 0.006039f, 0.006401f, 0.007088f, 0.007519f,
- 0.008217f, 0.008812f, 0.009712f, 0.010460f, 0.011337f, 0.012413f, 0.013596f, 0.014687f,
- 0.016159f, 0.018051f, 0.019913f, 0.022018f, 0.024551f, 0.027359f, 0.030792f, 0.035065f,
- 0.039703f, 0.044983f, 0.051392f, 0.059204f, 0.068176f, 0.079102f, 0.092041f, 0.106873f,
- 0.125000f, 0.145874f, 0.170532f, 0.198975f, 0.230835f, 0.267090f, 0.306641f, 0.349854f,
- 0.395508f, 0.445801f, 0.780762f, 0.796875f, 0.799805f, 0.801270f, 0.801270f, 0.801270f,
- 0.000227f, 0.000521f, 0.000698f, 0.000817f, 0.001236f, 0.001359f, 0.001540f, 0.001619f,
- 0.001940f, 0.002089f, 0.002430f, 0.002552f, 0.002655f, 0.002932f, 0.003241f, 0.003532f,
- 0.003841f, 0.004120f, 0.004292f, 0.004761f, 0.005051f, 0.005459f, 0.005886f, 0.006290f,
- 0.006821f, 0.007320f, 0.007889f, 0.008652f, 0.009399f, 0.010063f, 0.010887f, 0.012215f,
- 0.013206f, 0.014648f, 0.016037f, 0.017853f, 0.019958f, 0.022491f, 0.024994f, 0.028091f,
- 0.032135f, 0.036530f, 0.041809f, 0.048096f, 0.055908f, 0.064941f, 0.076050f, 0.089050f,
- 0.104980f, 0.123596f, 0.146118f, 0.172363f, 0.203003f, 0.237183f, 0.276123f, 0.318359f,
- 0.365479f, 0.416504f, 0.768555f, 0.784668f, 0.788086f, 0.789551f, 0.790039f, 0.790039f,
- 0.000000f, 0.000448f, 0.000566f, 0.000688f, 0.000985f, 0.001144f, 0.001305f, 0.001437f,
- 0.001622f, 0.001731f, 0.001989f, 0.002174f, 0.002338f, 0.002552f, 0.002739f, 0.002924f,
- 0.003239f, 0.003405f, 0.003628f, 0.003933f, 0.004200f, 0.004463f, 0.004948f, 0.005245f,
- 0.005615f, 0.006138f, 0.006699f, 0.006989f, 0.007793f, 0.008247f, 0.008980f, 0.009918f,
- 0.010857f, 0.011795f, 0.013016f, 0.014244f, 0.015930f, 0.017868f, 0.019882f, 0.022659f,
- 0.025543f, 0.029160f, 0.033417f, 0.038635f, 0.044983f, 0.052338f, 0.061859f, 0.072693f,
- 0.086487f, 0.102966f, 0.122864f, 0.146973f, 0.175049f, 0.207764f, 0.245605f, 0.287842f,
- 0.334229f, 0.385986f, 0.755371f, 0.771973f, 0.775879f, 0.777344f, 0.777832f, 0.778809f,
- 0.000000f, 0.000303f, 0.000512f, 0.000752f, 0.000828f, 0.001036f, 0.001184f, 0.001292f,
- 0.001281f, 0.001460f, 0.001717f, 0.001843f, 0.001955f, 0.002060f, 0.002317f, 0.002476f,
- 0.002542f, 0.002869f, 0.003088f, 0.003313f, 0.003559f, 0.003693f, 0.004082f, 0.004318f,
- 0.004696f, 0.005070f, 0.005245f, 0.005741f, 0.006126f, 0.006771f, 0.007298f, 0.007828f,
- 0.008583f, 0.009338f, 0.010246f, 0.011528f, 0.012794f, 0.014160f, 0.015717f, 0.017853f,
- 0.019958f, 0.022995f, 0.026291f, 0.030533f, 0.035553f, 0.041565f, 0.048981f, 0.058350f,
- 0.069824f, 0.083801f, 0.101685f, 0.122437f, 0.148438f, 0.178833f, 0.215454f, 0.256104f,
- 0.302490f, 0.354736f, 0.741699f, 0.758789f, 0.762695f, 0.763672f, 0.764648f, 0.765625f,
- 0.000097f, 0.000306f, 0.000370f, 0.000618f, 0.000713f, 0.000810f, 0.000953f, 0.000920f,
- 0.001167f, 0.001238f, 0.001406f, 0.001483f, 0.001540f, 0.001794f, 0.001970f, 0.002028f,
- 0.002264f, 0.002354f, 0.002459f, 0.002636f, 0.002827f, 0.003096f, 0.003342f, 0.003544f,
- 0.003881f, 0.003948f, 0.004459f, 0.004742f, 0.005005f, 0.005394f, 0.005867f, 0.006374f,
- 0.006901f, 0.007507f, 0.008202f, 0.008881f, 0.010017f, 0.010986f, 0.012451f, 0.013809f,
- 0.015511f, 0.017776f, 0.020325f, 0.023453f, 0.027390f, 0.032349f, 0.038330f, 0.045624f,
- 0.055359f, 0.067078f, 0.082275f, 0.101013f, 0.123657f, 0.151611f, 0.185791f, 0.225342f,
- 0.270752f, 0.322754f, 0.727051f, 0.746094f, 0.749512f, 0.750977f, 0.751953f, 0.751953f,
- 0.000228f, 0.000211f, 0.000504f, 0.000443f, 0.000523f, 0.000672f, 0.000703f, 0.000902f,
- 0.000975f, 0.001010f, 0.001122f, 0.001178f, 0.001257f, 0.001424f, 0.001575f, 0.001631f,
- 0.001789f, 0.001910f, 0.002090f, 0.002144f, 0.002411f, 0.002520f, 0.002703f, 0.002827f,
- 0.003010f, 0.003195f, 0.003403f, 0.003750f, 0.003960f, 0.004276f, 0.004780f, 0.005005f,
- 0.005432f, 0.005981f, 0.006428f, 0.007015f, 0.007812f, 0.008537f, 0.009415f, 0.010658f,
- 0.011963f, 0.013443f, 0.015396f, 0.017731f, 0.020782f, 0.024414f, 0.029083f, 0.034912f,
- 0.042572f, 0.052216f, 0.064392f, 0.080017f, 0.100220f, 0.126099f, 0.157227f, 0.194946f,
- 0.239136f, 0.290283f, 0.712402f, 0.731445f, 0.734863f, 0.736816f, 0.737305f, 0.737793f,
- 0.000211f, 0.000198f, 0.000195f, 0.000413f, 0.000517f, 0.000531f, 0.000586f, 0.000736f,
- 0.000769f, 0.000809f, 0.000970f, 0.001007f, 0.001067f, 0.001134f, 0.001211f, 0.001348f,
- 0.001341f, 0.001534f, 0.001617f, 0.001734f, 0.001942f, 0.002010f, 0.002110f, 0.002268f,
- 0.002523f, 0.002607f, 0.002829f, 0.003004f, 0.003113f, 0.003403f, 0.003681f, 0.003990f,
- 0.004257f, 0.004601f, 0.005039f, 0.005444f, 0.005993f, 0.006561f, 0.007278f, 0.008026f,
- 0.009041f, 0.010124f, 0.011513f, 0.013222f, 0.015320f, 0.017914f, 0.021408f, 0.025833f,
- 0.031433f, 0.039429f, 0.049255f, 0.062286f, 0.079102f, 0.101135f, 0.130005f, 0.164917f,
- 0.207764f, 0.258057f, 0.696289f, 0.716309f, 0.720215f, 0.722168f, 0.722656f, 0.723145f,
- 0.000000f, 0.000080f, 0.000286f, 0.000374f, 0.000434f, 0.000457f, 0.000460f, 0.000568f,
- 0.000610f, 0.000669f, 0.000715f, 0.000773f, 0.000877f, 0.000918f, 0.001030f, 0.000998f,
- 0.001148f, 0.001134f, 0.001305f, 0.001369f, 0.001410f, 0.001534f, 0.001688f, 0.001780f,
- 0.001899f, 0.001963f, 0.002081f, 0.002199f, 0.002470f, 0.002563f, 0.002758f, 0.003006f,
- 0.003273f, 0.003531f, 0.003817f, 0.004093f, 0.004532f, 0.004993f, 0.005463f, 0.006027f,
- 0.006657f, 0.007492f, 0.008537f, 0.009689f, 0.011246f, 0.012985f, 0.015518f, 0.018539f,
- 0.022827f, 0.028534f, 0.036072f, 0.046234f, 0.060028f, 0.078918f, 0.103943f, 0.136353f,
- 0.176514f, 0.225952f, 0.679199f, 0.699707f, 0.703613f, 0.706055f, 0.706543f, 0.708008f,
- 0.000089f, 0.000176f, 0.000232f, 0.000342f, 0.000317f, 0.000319f, 0.000420f, 0.000382f,
- 0.000494f, 0.000515f, 0.000612f, 0.000650f, 0.000671f, 0.000701f, 0.000732f, 0.000859f,
- 0.000888f, 0.000923f, 0.001002f, 0.001048f, 0.001170f, 0.001234f, 0.001292f, 0.001426f,
- 0.001414f, 0.001476f, 0.001622f, 0.001723f, 0.001892f, 0.001976f, 0.002237f, 0.002239f,
- 0.002476f, 0.002645f, 0.002817f, 0.003092f, 0.003355f, 0.003626f, 0.003979f, 0.004459f,
- 0.004948f, 0.005527f, 0.006256f, 0.007027f, 0.008026f, 0.009270f, 0.010918f, 0.013184f,
- 0.016098f, 0.019913f, 0.025253f, 0.033112f, 0.043762f, 0.059113f, 0.079956f, 0.109009f,
- 0.146729f, 0.193726f, 0.660645f, 0.682129f, 0.688477f, 0.690430f, 0.689941f, 0.690918f,
- 0.000000f, 0.000063f, 0.000194f, 0.000281f, 0.000187f, 0.000325f, 0.000278f, 0.000272f,
- 0.000386f, 0.000466f, 0.000462f, 0.000510f, 0.000519f, 0.000587f, 0.000613f, 0.000603f,
- 0.000671f, 0.000709f, 0.000744f, 0.000808f, 0.000858f, 0.000913f, 0.000963f, 0.000999f,
- 0.001062f, 0.001106f, 0.001262f, 0.001266f, 0.001431f, 0.001562f, 0.001672f, 0.001693f,
- 0.001810f, 0.001976f, 0.002090f, 0.002289f, 0.002422f, 0.002666f, 0.002916f, 0.003166f,
- 0.003513f, 0.003862f, 0.004318f, 0.004936f, 0.005646f, 0.006493f, 0.007626f, 0.009048f,
- 0.010826f, 0.013519f, 0.017166f, 0.022476f, 0.030258f, 0.041687f, 0.058807f, 0.083435f,
- 0.117737f, 0.162598f, 0.644043f, 0.666504f, 0.670410f, 0.673340f, 0.674316f, 0.675293f,
- 0.000000f, 0.000117f, 0.000112f, 0.000178f, 0.000216f, 0.000222f, 0.000271f, 0.000229f,
- 0.000280f, 0.000283f, 0.000326f, 0.000376f, 0.000376f, 0.000443f, 0.000456f, 0.000470f,
- 0.000499f, 0.000507f, 0.000547f, 0.000566f, 0.000613f, 0.000667f, 0.000692f, 0.000749f,
- 0.000773f, 0.000803f, 0.000917f, 0.000924f, 0.000997f, 0.001055f, 0.001096f, 0.001236f,
- 0.001261f, 0.001376f, 0.001466f, 0.001693f, 0.001695f, 0.001826f, 0.002077f, 0.002226f,
- 0.002411f, 0.002686f, 0.002985f, 0.003368f, 0.003801f, 0.004353f, 0.005131f, 0.005974f,
- 0.007370f, 0.008842f, 0.011345f, 0.014717f, 0.019699f, 0.027893f, 0.040619f, 0.060730f,
- 0.090454f, 0.132080f, 0.625488f, 0.649414f, 0.653809f, 0.655273f, 0.656250f, 0.658203f,
- 0.000000f, 0.000000f, 0.000108f, 0.000121f, 0.000136f, 0.000154f, 0.000158f, 0.000191f,
- 0.000203f, 0.000213f, 0.000270f, 0.000223f, 0.000232f, 0.000270f, 0.000296f, 0.000342f,
- 0.000324f, 0.000352f, 0.000453f, 0.000407f, 0.000450f, 0.000459f, 0.000486f, 0.000524f,
- 0.000545f, 0.000565f, 0.000630f, 0.000620f, 0.000678f, 0.000803f, 0.000763f, 0.000813f,
- 0.000860f, 0.000937f, 0.001035f, 0.001101f, 0.001141f, 0.001254f, 0.001399f, 0.001449f,
- 0.001616f, 0.001779f, 0.001942f, 0.002220f, 0.002493f, 0.002808f, 0.003258f, 0.003895f,
- 0.004623f, 0.005714f, 0.007111f, 0.009178f, 0.012367f, 0.017319f, 0.025879f, 0.040741f,
- 0.065552f, 0.103577f, 0.606934f, 0.630371f, 0.635254f, 0.637695f, 0.638672f, 0.639648f,
- 0.000000f, 0.000109f, 0.000102f, 0.000098f, 0.000105f, 0.000110f, 0.000113f, 0.000122f,
- 0.000117f, 0.000132f, 0.000147f, 0.000189f, 0.000163f, 0.000212f, 0.000213f, 0.000222f,
- 0.000224f, 0.000233f, 0.000258f, 0.000262f, 0.000274f, 0.000305f, 0.000340f, 0.000329f,
- 0.000358f, 0.000376f, 0.000445f, 0.000418f, 0.000447f, 0.000478f, 0.000546f, 0.000530f,
- 0.000594f, 0.000626f, 0.000679f, 0.000745f, 0.000763f, 0.000804f, 0.000869f, 0.000952f,
- 0.001025f, 0.001119f, 0.001254f, 0.001359f, 0.001584f, 0.001728f, 0.001993f, 0.002295f,
- 0.002790f, 0.003298f, 0.004135f, 0.005363f, 0.007267f, 0.010277f, 0.015350f, 0.024994f,
- 0.043518f, 0.076599f, 0.585938f, 0.611816f, 0.616211f, 0.619141f, 0.619629f, 0.620605f,
- 0.000000f, 0.000102f, 0.000095f, 0.000090f, 0.000085f, 0.000081f, 0.000078f, 0.000073f,
- 0.000075f, 0.000079f, 0.000087f, 0.000092f, 0.000095f, 0.000094f, 0.000133f, 0.000143f,
- 0.000152f, 0.000155f, 0.000161f, 0.000195f, 0.000174f, 0.000183f, 0.000188f, 0.000216f,
- 0.000233f, 0.000241f, 0.000241f, 0.000257f, 0.000269f, 0.000302f, 0.000325f, 0.000321f,
- 0.000350f, 0.000363f, 0.000405f, 0.000426f, 0.000456f, 0.000486f, 0.000539f, 0.000560f,
- 0.000614f, 0.000671f, 0.000722f, 0.000811f, 0.000891f, 0.000989f, 0.001162f, 0.001312f,
- 0.001545f, 0.001863f, 0.002340f, 0.002920f, 0.003963f, 0.005615f, 0.008499f, 0.013931f,
- 0.025833f, 0.052094f, 0.566406f, 0.591797f, 0.597168f, 0.599609f, 0.601074f, 0.601562f,
- 0.000110f, 0.000092f, 0.000084f, 0.000077f, 0.000073f, 0.000070f, 0.000067f, 0.000064f,
- 0.000061f, 0.000058f, 0.000055f, 0.000064f, 0.000051f, 0.000054f, 0.000071f, 0.000059f,
- 0.000082f, 0.000081f, 0.000090f, 0.000087f, 0.000099f, 0.000103f, 0.000127f, 0.000131f,
- 0.000135f, 0.000139f, 0.000142f, 0.000143f, 0.000156f, 0.000162f, 0.000173f, 0.000194f,
- 0.000206f, 0.000201f, 0.000233f, 0.000225f, 0.000246f, 0.000294f, 0.000279f, 0.000313f,
- 0.000333f, 0.000356f, 0.000395f, 0.000432f, 0.000459f, 0.000511f, 0.000577f, 0.000664f,
- 0.000770f, 0.000916f, 0.001114f, 0.001400f, 0.001881f, 0.002665f, 0.004093f, 0.006966f,
- 0.013290f, 0.031525f, 0.545410f, 0.571777f, 0.577637f, 0.579102f, 0.580566f, 0.581055f,
- 0.000093f, 0.000073f, 0.000066f, 0.000061f, 0.000056f, 0.000054f, 0.000051f, 0.000050f,
- 0.000048f, 0.000047f, 0.000045f, 0.000044f, 0.000042f, 0.000040f, 0.000038f, 0.000036f,
- 0.000039f, 0.000033f, 0.000041f, 0.000040f, 0.000046f, 0.000048f, 0.000051f, 0.000057f,
- 0.000060f, 0.000066f, 0.000062f, 0.000067f, 0.000080f, 0.000085f, 0.000088f, 0.000092f,
- 0.000092f, 0.000097f, 0.000109f, 0.000109f, 0.000117f, 0.000132f, 0.000134f, 0.000147f,
- 0.000154f, 0.000156f, 0.000188f, 0.000197f, 0.000219f, 0.000234f, 0.000266f, 0.000286f,
- 0.000335f, 0.000397f, 0.000472f, 0.000566f, 0.000751f, 0.001039f, 0.001626f, 0.002834f,
- 0.005909f, 0.015411f, 0.524414f, 0.551270f, 0.557129f, 0.559570f, 0.561035f, 0.561523f,
- 0.000060f, 0.000046f, 0.000039f, 0.000037f, 0.000034f, 0.000034f, 0.000032f, 0.000032f,
- 0.000031f, 0.000029f, 0.000029f, 0.000029f, 0.000028f, 0.000028f, 0.000028f, 0.000027f,
- 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000021f,
- 0.000020f, 0.000018f, 0.000018f, 0.000023f, 0.000024f, 0.000028f, 0.000032f, 0.000033f,
- 0.000032f, 0.000038f, 0.000039f, 0.000043f, 0.000046f, 0.000050f, 0.000052f, 0.000053f,
- 0.000057f, 0.000067f, 0.000073f, 0.000068f, 0.000076f, 0.000083f, 0.000097f, 0.000110f,
- 0.000116f, 0.000127f, 0.000157f, 0.000185f, 0.000246f, 0.000319f, 0.000466f, 0.000810f,
- 0.001841f, 0.005795f, 0.503418f, 0.531250f, 0.536621f, 0.539062f, 0.540039f, 0.540527f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000005f, 0.000005f, 0.000008f,
- 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000010f, 0.000010f, 0.000011f,
- 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000012f, 0.000012f, 0.000012f, 0.000012f,
- 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f,
- 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000012f,
- 0.000013f, 0.000014f, 0.000015f, 0.000017f, 0.000020f, 0.000021f, 0.000018f, 0.000023f,
- 0.000023f, 0.000025f, 0.000030f, 0.000038f, 0.000043f, 0.000059f, 0.000079f, 0.000131f,
- 0.000279f, 0.001210f, 0.481934f, 0.510254f, 0.516113f, 0.518555f, 0.520020f, 0.520508f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f,
- 0.000006f, 0.000022f, 0.460449f, 0.489258f, 0.495850f, 0.498291f, 0.499512f, 0.500000f,
- },
- {
- 0.038544f, 0.111450f, 0.177368f, 0.237061f, 0.290771f, 0.339600f, 0.384277f, 0.425293f,
- 0.462402f, 0.497070f, 0.527344f, 0.556152f, 0.583496f, 0.607910f, 0.630859f, 0.652344f,
- 0.672852f, 0.690918f, 0.708496f, 0.724609f, 0.740723f, 0.754883f, 0.768066f, 0.780273f,
- 0.792480f, 0.803711f, 0.815430f, 0.825684f, 0.835449f, 0.844727f, 0.853516f, 0.861816f,
- 0.870117f, 0.877930f, 0.885254f, 0.892578f, 0.899414f, 0.905762f, 0.912109f, 0.918945f,
- 0.923828f, 0.928711f, 0.934082f, 0.939941f, 0.944824f, 0.949707f, 0.953613f, 0.958496f,
- 0.962402f, 0.967285f, 0.971191f, 0.974609f, 0.979004f, 0.982422f, 0.985352f, 0.989258f,
- 0.992188f, 0.996094f, 0.996094f, 0.990723f, 0.986328f, 0.982422f, 0.978516f, 0.975098f,
- 0.029068f, 0.087219f, 0.142578f, 0.195190f, 0.244629f, 0.291016f, 0.334717f, 0.375000f,
- 0.412842f, 0.446533f, 0.481201f, 0.511230f, 0.539062f, 0.565918f, 0.590820f, 0.614258f,
- 0.636719f, 0.656250f, 0.675293f, 0.693359f, 0.710449f, 0.726562f, 0.741699f, 0.755371f,
- 0.769043f, 0.781738f, 0.793457f, 0.805176f, 0.815918f, 0.826660f, 0.835938f, 0.845703f,
- 0.854980f, 0.862793f, 0.871582f, 0.879395f, 0.885742f, 0.894531f, 0.900879f, 0.907227f,
- 0.913086f, 0.919434f, 0.925293f, 0.931152f, 0.936523f, 0.941406f, 0.946777f, 0.951172f,
- 0.956055f, 0.960449f, 0.964355f, 0.968750f, 0.972656f, 0.976562f, 0.980469f, 0.984375f,
- 0.987793f, 0.991211f, 0.994141f, 0.989258f, 0.984863f, 0.981445f, 0.977539f, 0.974121f,
- 0.023346f, 0.069641f, 0.115601f, 0.160767f, 0.205078f, 0.248047f, 0.289062f, 0.328125f,
- 0.365723f, 0.401367f, 0.435059f, 0.466309f, 0.495361f, 0.523926f, 0.550781f, 0.574707f,
- 0.597168f, 0.620117f, 0.641113f, 0.660156f, 0.679688f, 0.696777f, 0.713379f, 0.728516f,
- 0.743652f, 0.757324f, 0.770996f, 0.784180f, 0.795410f, 0.806641f, 0.817383f, 0.828125f,
- 0.837891f, 0.847168f, 0.855957f, 0.864258f, 0.873047f, 0.880859f, 0.888672f, 0.895996f,
- 0.902832f, 0.909668f, 0.915039f, 0.921875f, 0.927246f, 0.934082f, 0.937988f, 0.943848f,
- 0.948242f, 0.953613f, 0.958496f, 0.962402f, 0.967285f, 0.971191f, 0.975098f, 0.979492f,
- 0.983398f, 0.985840f, 0.992188f, 0.987305f, 0.983398f, 0.979980f, 0.977051f, 0.973633f,
- 0.018600f, 0.056366f, 0.094299f, 0.133545f, 0.172729f, 0.211670f, 0.249756f, 0.285889f,
- 0.322021f, 0.356934f, 0.390869f, 0.421875f, 0.452148f, 0.481201f, 0.509277f, 0.535156f,
- 0.560059f, 0.583496f, 0.605957f, 0.626465f, 0.647949f, 0.665527f, 0.684570f, 0.700684f,
- 0.717285f, 0.731934f, 0.746582f, 0.760254f, 0.773926f, 0.786621f, 0.799316f, 0.809082f,
- 0.820312f, 0.830566f, 0.840332f, 0.850098f, 0.858887f, 0.867188f, 0.875000f, 0.883789f,
- 0.890625f, 0.898926f, 0.904297f, 0.912109f, 0.916992f, 0.924316f, 0.930176f, 0.935547f,
- 0.941406f, 0.945801f, 0.951172f, 0.956055f, 0.960938f, 0.964844f, 0.969727f, 0.974609f,
- 0.978516f, 0.981934f, 0.989746f, 0.985840f, 0.981934f, 0.978516f, 0.975586f, 0.972168f,
- 0.015068f, 0.046143f, 0.077881f, 0.111816f, 0.145264f, 0.179688f, 0.214600f, 0.249023f,
- 0.282715f, 0.316406f, 0.348389f, 0.380615f, 0.411133f, 0.440430f, 0.468018f, 0.494873f,
- 0.520508f, 0.546387f, 0.568848f, 0.591309f, 0.613281f, 0.634277f, 0.653809f, 0.670898f,
- 0.688477f, 0.706055f, 0.721191f, 0.736328f, 0.751465f, 0.764648f, 0.776855f, 0.789551f,
- 0.801270f, 0.812500f, 0.823730f, 0.833496f, 0.843262f, 0.853027f, 0.861328f, 0.869629f,
- 0.878418f, 0.885742f, 0.893555f, 0.900391f, 0.908203f, 0.914551f, 0.921387f, 0.927246f,
- 0.932617f, 0.938965f, 0.943848f, 0.949219f, 0.953613f, 0.959473f, 0.963867f, 0.968262f,
- 0.972656f, 0.977051f, 0.987305f, 0.983887f, 0.980957f, 0.977051f, 0.974121f, 0.970703f,
- 0.012444f, 0.037933f, 0.065613f, 0.093811f, 0.123474f, 0.153809f, 0.185059f, 0.215820f,
- 0.247559f, 0.279297f, 0.310547f, 0.341309f, 0.370361f, 0.399658f, 0.428467f, 0.457031f,
- 0.482910f, 0.507812f, 0.533203f, 0.556152f, 0.579590f, 0.600098f, 0.621094f, 0.641113f,
- 0.659668f, 0.676270f, 0.695312f, 0.710449f, 0.726074f, 0.740723f, 0.756348f, 0.769043f,
- 0.780762f, 0.794434f, 0.805176f, 0.816895f, 0.827637f, 0.837891f, 0.847168f, 0.855957f,
- 0.865723f, 0.873535f, 0.882324f, 0.889648f, 0.897949f, 0.904297f, 0.911133f, 0.917480f,
- 0.924316f, 0.930176f, 0.936523f, 0.941895f, 0.947266f, 0.952637f, 0.958008f, 0.962891f,
- 0.967285f, 0.971680f, 0.984863f, 0.981934f, 0.978516f, 0.975586f, 0.972656f, 0.969238f,
- 0.010353f, 0.032043f, 0.055359f, 0.079529f, 0.104980f, 0.131836f, 0.159424f, 0.187866f,
- 0.216431f, 0.245239f, 0.275146f, 0.304199f, 0.333496f, 0.362061f, 0.390869f, 0.417969f,
- 0.445068f, 0.471191f, 0.496582f, 0.520508f, 0.543457f, 0.566895f, 0.588867f, 0.608398f,
- 0.628906f, 0.648438f, 0.666992f, 0.684570f, 0.701660f, 0.716797f, 0.732422f, 0.746582f,
- 0.760254f, 0.773438f, 0.786133f, 0.798340f, 0.810547f, 0.821777f, 0.832520f, 0.842773f,
- 0.851074f, 0.860352f, 0.869629f, 0.878906f, 0.886230f, 0.894043f, 0.901855f, 0.908691f,
- 0.915527f, 0.922363f, 0.928223f, 0.935059f, 0.939941f, 0.945312f, 0.950684f, 0.956055f,
- 0.962402f, 0.966797f, 0.982910f, 0.979980f, 0.977051f, 0.973633f, 0.970703f, 0.968262f,
- 0.008598f, 0.027328f, 0.046417f, 0.067871f, 0.089905f, 0.113220f, 0.137695f, 0.163330f,
- 0.189087f, 0.216064f, 0.243164f, 0.270752f, 0.298340f, 0.326416f, 0.354004f, 0.381348f,
- 0.407715f, 0.434082f, 0.460205f, 0.484863f, 0.508789f, 0.532227f, 0.555176f, 0.577637f,
- 0.598145f, 0.618652f, 0.637695f, 0.657227f, 0.674805f, 0.691406f, 0.708008f, 0.723633f,
- 0.738770f, 0.751953f, 0.766113f, 0.779785f, 0.791992f, 0.804199f, 0.815918f, 0.825684f,
- 0.836914f, 0.846680f, 0.856934f, 0.866211f, 0.874512f, 0.882324f, 0.890625f, 0.898438f,
- 0.905273f, 0.913086f, 0.919922f, 0.926758f, 0.933105f, 0.938477f, 0.944824f, 0.951172f,
- 0.955566f, 0.960938f, 0.980469f, 0.978027f, 0.974609f, 0.972168f, 0.969238f, 0.966797f,
- 0.007561f, 0.023315f, 0.040344f, 0.058228f, 0.077148f, 0.097534f, 0.119995f, 0.142212f,
- 0.165649f, 0.190063f, 0.214722f, 0.240601f, 0.266846f, 0.293457f, 0.319824f, 0.346924f,
- 0.372314f, 0.398438f, 0.424561f, 0.449463f, 0.474609f, 0.498535f, 0.521973f, 0.544434f,
- 0.566895f, 0.587402f, 0.608398f, 0.628418f, 0.645996f, 0.665039f, 0.683105f, 0.699219f,
- 0.716309f, 0.731445f, 0.745117f, 0.760254f, 0.772949f, 0.786133f, 0.799316f, 0.809570f,
- 0.820801f, 0.832031f, 0.843262f, 0.852051f, 0.861816f, 0.871094f, 0.880371f, 0.887695f,
- 0.895996f, 0.904297f, 0.911133f, 0.917969f, 0.924805f, 0.931641f, 0.937012f, 0.943848f,
- 0.949707f, 0.954590f, 0.978027f, 0.976074f, 0.973145f, 0.970215f, 0.967773f, 0.965332f,
- 0.006416f, 0.020065f, 0.034943f, 0.050537f, 0.067078f, 0.084900f, 0.104065f, 0.123962f,
- 0.145264f, 0.166748f, 0.189575f, 0.213501f, 0.237305f, 0.262451f, 0.288574f, 0.313477f,
- 0.338623f, 0.364502f, 0.389893f, 0.414551f, 0.440186f, 0.464600f, 0.487549f, 0.510742f,
- 0.534668f, 0.556641f, 0.578613f, 0.598145f, 0.618652f, 0.637207f, 0.655273f, 0.674805f,
- 0.690430f, 0.707031f, 0.724121f, 0.739258f, 0.752930f, 0.767090f, 0.779785f, 0.792969f,
- 0.805176f, 0.816895f, 0.827637f, 0.838379f, 0.849121f, 0.858398f, 0.868652f, 0.876465f,
- 0.885742f, 0.894043f, 0.901855f, 0.909180f, 0.916992f, 0.923828f, 0.930176f, 0.937012f,
- 0.943359f, 0.949707f, 0.975586f, 0.973633f, 0.971191f, 0.968262f, 0.965820f, 0.963379f,
- 0.005802f, 0.017502f, 0.030045f, 0.043823f, 0.058014f, 0.074280f, 0.090759f, 0.108459f,
- 0.127197f, 0.146484f, 0.167725f, 0.189087f, 0.211304f, 0.234497f, 0.258301f, 0.282471f,
- 0.307373f, 0.331299f, 0.356689f, 0.381104f, 0.405762f, 0.430420f, 0.455078f, 0.478516f,
- 0.502441f, 0.524414f, 0.545898f, 0.568359f, 0.588867f, 0.608887f, 0.628906f, 0.646973f,
- 0.665527f, 0.684082f, 0.701172f, 0.715820f, 0.731934f, 0.746582f, 0.760742f, 0.774414f,
- 0.787598f, 0.800781f, 0.812500f, 0.823730f, 0.834961f, 0.845703f, 0.855469f, 0.865234f,
- 0.874512f, 0.883789f, 0.892090f, 0.899902f, 0.908203f, 0.916016f, 0.922852f, 0.930176f,
- 0.936523f, 0.942871f, 0.972656f, 0.971191f, 0.968750f, 0.966309f, 0.963867f, 0.961426f,
- 0.004734f, 0.014984f, 0.026169f, 0.038177f, 0.051208f, 0.065186f, 0.079468f, 0.095276f,
- 0.111633f, 0.129639f, 0.148071f, 0.167969f, 0.188599f, 0.208984f, 0.231689f, 0.254639f,
- 0.277832f, 0.301025f, 0.325439f, 0.349854f, 0.373779f, 0.397705f, 0.422607f, 0.446045f,
- 0.469727f, 0.492676f, 0.514648f, 0.537598f, 0.559570f, 0.580078f, 0.600586f, 0.620117f,
- 0.639648f, 0.658203f, 0.676758f, 0.692871f, 0.708984f, 0.725586f, 0.740723f, 0.755859f,
- 0.769531f, 0.783691f, 0.796875f, 0.808594f, 0.820801f, 0.832520f, 0.842285f, 0.852539f,
- 0.862793f, 0.872070f, 0.881836f, 0.890137f, 0.898926f, 0.906738f, 0.915039f, 0.922363f,
- 0.929199f, 0.936523f, 0.969727f, 0.968750f, 0.966797f, 0.964355f, 0.961914f, 0.959473f,
- 0.004055f, 0.013588f, 0.023132f, 0.033722f, 0.044891f, 0.057343f, 0.069763f, 0.083923f,
- 0.098389f, 0.114441f, 0.131226f, 0.148682f, 0.167603f, 0.186768f, 0.207031f, 0.228516f,
- 0.250732f, 0.272949f, 0.295410f, 0.318604f, 0.342285f, 0.365967f, 0.390381f, 0.413574f,
- 0.437744f, 0.460938f, 0.484131f, 0.506348f, 0.528320f, 0.550781f, 0.572266f, 0.592773f,
- 0.613281f, 0.632812f, 0.651367f, 0.669922f, 0.687500f, 0.704102f, 0.720215f, 0.735840f,
- 0.751465f, 0.764160f, 0.778809f, 0.792480f, 0.803711f, 0.816895f, 0.829102f, 0.840332f,
- 0.850586f, 0.860352f, 0.870605f, 0.880371f, 0.889648f, 0.897949f, 0.905762f, 0.914551f,
- 0.922363f, 0.929199f, 0.967285f, 0.966797f, 0.964844f, 0.961426f, 0.959473f, 0.958008f,
- 0.003611f, 0.011971f, 0.020401f, 0.030029f, 0.039185f, 0.050415f, 0.061737f, 0.074341f,
- 0.086975f, 0.101074f, 0.115845f, 0.131958f, 0.148682f, 0.166626f, 0.185059f, 0.205200f,
- 0.224854f, 0.245483f, 0.267334f, 0.290771f, 0.312988f, 0.335449f, 0.359619f, 0.382080f,
- 0.406250f, 0.429443f, 0.452881f, 0.475830f, 0.498779f, 0.520996f, 0.542480f, 0.563477f,
- 0.584473f, 0.604980f, 0.625977f, 0.643555f, 0.663086f, 0.681152f, 0.698242f, 0.714355f,
- 0.729980f, 0.746582f, 0.760742f, 0.774902f, 0.788086f, 0.801758f, 0.814941f, 0.826660f,
- 0.838867f, 0.848633f, 0.859863f, 0.869141f, 0.879395f, 0.889160f, 0.897949f, 0.906250f,
- 0.914551f, 0.922363f, 0.963867f, 0.964355f, 0.961914f, 0.959961f, 0.957520f, 0.955078f,
- 0.003393f, 0.010361f, 0.018494f, 0.026337f, 0.035187f, 0.044556f, 0.054596f, 0.065186f,
- 0.077515f, 0.089783f, 0.102783f, 0.117249f, 0.132446f, 0.148071f, 0.165649f, 0.183838f,
- 0.202026f, 0.221313f, 0.241943f, 0.262939f, 0.285156f, 0.307129f, 0.329102f, 0.352539f,
- 0.375977f, 0.398438f, 0.421875f, 0.445312f, 0.468750f, 0.490723f, 0.512695f, 0.534668f,
- 0.556641f, 0.577637f, 0.598633f, 0.619141f, 0.637695f, 0.656738f, 0.674805f, 0.692383f,
- 0.709473f, 0.726074f, 0.742188f, 0.756836f, 0.771973f, 0.786133f, 0.799316f, 0.812012f,
- 0.824707f, 0.835938f, 0.848145f, 0.858887f, 0.868164f, 0.878906f, 0.888184f, 0.897949f,
- 0.906250f, 0.914551f, 0.960938f, 0.960938f, 0.959473f, 0.957520f, 0.955078f, 0.953125f,
- 0.003084f, 0.009521f, 0.016144f, 0.023346f, 0.031204f, 0.039520f, 0.048523f, 0.057953f,
- 0.068359f, 0.079895f, 0.091309f, 0.104126f, 0.117920f, 0.132324f, 0.147949f, 0.164062f,
- 0.181396f, 0.199219f, 0.218872f, 0.238403f, 0.258545f, 0.279541f, 0.301758f, 0.323486f,
- 0.346191f, 0.368408f, 0.391846f, 0.414795f, 0.437256f, 0.460693f, 0.483643f, 0.505371f,
- 0.527832f, 0.550293f, 0.571289f, 0.591797f, 0.612305f, 0.632324f, 0.651855f, 0.670898f,
- 0.687500f, 0.705566f, 0.722168f, 0.737793f, 0.753418f, 0.768555f, 0.783691f, 0.796875f,
- 0.811035f, 0.823242f, 0.834473f, 0.846191f, 0.857422f, 0.868652f, 0.878418f, 0.887695f,
- 0.897949f, 0.906250f, 0.958008f, 0.958008f, 0.957031f, 0.954590f, 0.952637f, 0.950684f,
- 0.002666f, 0.008293f, 0.014297f, 0.021225f, 0.027847f, 0.035156f, 0.043274f, 0.051666f,
- 0.060791f, 0.070801f, 0.081543f, 0.092407f, 0.104858f, 0.118530f, 0.131836f, 0.146606f,
- 0.162598f, 0.179443f, 0.196777f, 0.215210f, 0.234375f, 0.254150f, 0.274414f, 0.295898f,
- 0.317871f, 0.340088f, 0.362549f, 0.385010f, 0.407959f, 0.430664f, 0.454590f, 0.476562f,
- 0.499268f, 0.521484f, 0.543945f, 0.564941f, 0.585938f, 0.606934f, 0.626465f, 0.646484f,
- 0.665527f, 0.683594f, 0.701660f, 0.717773f, 0.735352f, 0.751465f, 0.766113f, 0.781738f,
- 0.794922f, 0.808105f, 0.821289f, 0.833496f, 0.846191f, 0.857910f, 0.868164f, 0.878906f,
- 0.889160f, 0.899414f, 0.954102f, 0.955566f, 0.953613f, 0.952148f, 0.950195f, 0.948730f,
- 0.002396f, 0.007427f, 0.012978f, 0.018646f, 0.025024f, 0.031403f, 0.038788f, 0.046112f,
- 0.054260f, 0.063354f, 0.072693f, 0.082886f, 0.093689f, 0.105469f, 0.118164f, 0.130859f,
- 0.145996f, 0.161011f, 0.177124f, 0.193359f, 0.211670f, 0.230225f, 0.249634f, 0.270020f,
- 0.290771f, 0.311768f, 0.333740f, 0.356201f, 0.378906f, 0.401855f, 0.424561f, 0.447754f,
- 0.470215f, 0.493408f, 0.515137f, 0.537109f, 0.559570f, 0.580078f, 0.601074f, 0.621582f,
- 0.642090f, 0.661621f, 0.679688f, 0.697754f, 0.715820f, 0.732422f, 0.749512f, 0.765137f,
- 0.779785f, 0.794434f, 0.808594f, 0.821289f, 0.833496f, 0.846191f, 0.857910f, 0.869141f,
- 0.879883f, 0.889648f, 0.950195f, 0.952637f, 0.950684f, 0.948730f, 0.947266f, 0.945801f,
- 0.002029f, 0.006672f, 0.011658f, 0.016937f, 0.022476f, 0.028305f, 0.034332f, 0.041351f,
- 0.048584f, 0.056671f, 0.064697f, 0.073853f, 0.083923f, 0.094482f, 0.105225f, 0.117798f,
- 0.130615f, 0.144287f, 0.159302f, 0.174683f, 0.190430f, 0.208740f, 0.226318f, 0.245483f,
- 0.264893f, 0.285400f, 0.307129f, 0.328369f, 0.350342f, 0.372803f, 0.395264f, 0.418701f,
- 0.441650f, 0.462891f, 0.486816f, 0.509277f, 0.532227f, 0.553711f, 0.575684f, 0.596680f,
- 0.617676f, 0.638672f, 0.657715f, 0.676758f, 0.695312f, 0.712402f, 0.729492f, 0.746582f,
- 0.762695f, 0.778320f, 0.793457f, 0.807129f, 0.820801f, 0.833984f, 0.846191f, 0.858887f,
- 0.869629f, 0.881836f, 0.947266f, 0.949219f, 0.947754f, 0.946289f, 0.944824f, 0.942871f,
- 0.002142f, 0.006401f, 0.010841f, 0.015251f, 0.019760f, 0.025055f, 0.031113f, 0.037201f,
- 0.043671f, 0.050598f, 0.057892f, 0.066101f, 0.075012f, 0.084351f, 0.093994f, 0.105164f,
- 0.117432f, 0.129517f, 0.142822f, 0.157104f, 0.172119f, 0.188110f, 0.204956f, 0.223145f,
- 0.241577f, 0.260498f, 0.280762f, 0.301758f, 0.322998f, 0.345215f, 0.366943f, 0.389893f,
- 0.412842f, 0.435791f, 0.458008f, 0.482178f, 0.504395f, 0.526855f, 0.548828f, 0.571289f,
- 0.592285f, 0.612793f, 0.634277f, 0.654297f, 0.673340f, 0.692383f, 0.710938f, 0.729004f,
- 0.745117f, 0.762207f, 0.777832f, 0.792480f, 0.807129f, 0.821289f, 0.834961f, 0.847168f,
- 0.859863f, 0.871582f, 0.943359f, 0.946289f, 0.944824f, 0.943359f, 0.941895f, 0.940430f,
- 0.001760f, 0.005562f, 0.009621f, 0.013710f, 0.018417f, 0.022736f, 0.027939f, 0.033264f,
- 0.039185f, 0.045166f, 0.052460f, 0.059143f, 0.067261f, 0.075745f, 0.084106f, 0.094177f,
- 0.104980f, 0.116455f, 0.128174f, 0.141113f, 0.155151f, 0.169922f, 0.184937f, 0.201660f,
- 0.219238f, 0.237549f, 0.256348f, 0.276367f, 0.296875f, 0.317871f, 0.339844f, 0.361572f,
- 0.383789f, 0.407227f, 0.430908f, 0.453857f, 0.476807f, 0.498779f, 0.521973f, 0.543945f,
- 0.567383f, 0.589355f, 0.609863f, 0.631348f, 0.651855f, 0.671875f, 0.690918f, 0.709961f,
- 0.727539f, 0.744141f, 0.761719f, 0.777344f, 0.793457f, 0.808594f, 0.823242f, 0.835449f,
- 0.848633f, 0.861328f, 0.938965f, 0.941895f, 0.941406f, 0.940430f, 0.938477f, 0.937012f,
- 0.001594f, 0.005283f, 0.008789f, 0.012383f, 0.016342f, 0.020523f, 0.025284f, 0.029968f,
- 0.035217f, 0.040741f, 0.046417f, 0.052948f, 0.060120f, 0.067566f, 0.076294f, 0.084534f,
- 0.093750f, 0.104614f, 0.115173f, 0.126831f, 0.139160f, 0.152832f, 0.166748f, 0.181885f,
- 0.198853f, 0.215698f, 0.233521f, 0.252197f, 0.271973f, 0.291992f, 0.313477f, 0.334717f,
- 0.357178f, 0.379395f, 0.401855f, 0.425537f, 0.448242f, 0.471924f, 0.495361f, 0.517578f,
- 0.541016f, 0.562988f, 0.585938f, 0.607422f, 0.627930f, 0.649414f, 0.670410f, 0.688965f,
- 0.708496f, 0.727539f, 0.744629f, 0.761719f, 0.778809f, 0.794922f, 0.809082f, 0.824219f,
- 0.838379f, 0.851074f, 0.935059f, 0.938965f, 0.937988f, 0.937012f, 0.936035f, 0.933594f,
- 0.001564f, 0.004665f, 0.007973f, 0.011276f, 0.014908f, 0.018600f, 0.022675f, 0.027176f,
- 0.031464f, 0.036621f, 0.042023f, 0.047974f, 0.054108f, 0.060822f, 0.068237f, 0.075684f,
- 0.084229f, 0.093567f, 0.103210f, 0.113892f, 0.125000f, 0.137329f, 0.150269f, 0.164307f,
- 0.179810f, 0.194946f, 0.212158f, 0.229248f, 0.247925f, 0.267578f, 0.287842f, 0.308350f,
- 0.330322f, 0.352051f, 0.374756f, 0.397461f, 0.420654f, 0.444092f, 0.466797f, 0.490723f,
- 0.514160f, 0.537109f, 0.560059f, 0.582031f, 0.604980f, 0.626953f, 0.648926f, 0.668457f,
- 0.688477f, 0.708008f, 0.727539f, 0.745117f, 0.763672f, 0.779297f, 0.795410f, 0.811523f,
- 0.826660f, 0.840332f, 0.930664f, 0.934570f, 0.934082f, 0.933594f, 0.932129f, 0.930664f,
- 0.001424f, 0.004261f, 0.007122f, 0.010239f, 0.013374f, 0.016693f, 0.020401f, 0.024368f,
- 0.028595f, 0.033325f, 0.037964f, 0.043152f, 0.048340f, 0.054962f, 0.060730f, 0.067749f,
- 0.075684f, 0.083862f, 0.092041f, 0.102051f, 0.112305f, 0.123657f, 0.135376f, 0.148071f,
- 0.161987f, 0.176270f, 0.192139f, 0.208252f, 0.226196f, 0.244141f, 0.263672f, 0.283447f,
- 0.304199f, 0.325195f, 0.346924f, 0.370605f, 0.392822f, 0.416260f, 0.439209f, 0.463623f,
- 0.486084f, 0.511230f, 0.534180f, 0.558105f, 0.580566f, 0.603516f, 0.625000f, 0.647461f,
- 0.668457f, 0.688965f, 0.708496f, 0.727539f, 0.746582f, 0.764160f, 0.781738f, 0.798340f,
- 0.813477f, 0.829590f, 0.926758f, 0.931152f, 0.930664f, 0.929199f, 0.928223f, 0.927246f,
- 0.001294f, 0.004196f, 0.006538f, 0.009346f, 0.012306f, 0.015335f, 0.018845f, 0.022003f,
- 0.025558f, 0.029816f, 0.034149f, 0.038605f, 0.043915f, 0.049042f, 0.054810f, 0.061188f,
- 0.067993f, 0.075256f, 0.083130f, 0.091553f, 0.100769f, 0.110779f, 0.121643f, 0.133057f,
- 0.145630f, 0.159058f, 0.173218f, 0.188721f, 0.204590f, 0.222290f, 0.240234f, 0.259277f,
- 0.279053f, 0.299561f, 0.321533f, 0.343506f, 0.365723f, 0.389404f, 0.412354f, 0.436035f,
- 0.459961f, 0.484131f, 0.508301f, 0.532227f, 0.555176f, 0.579102f, 0.601562f, 0.624512f,
- 0.646484f, 0.668457f, 0.688965f, 0.709473f, 0.729004f, 0.748047f, 0.766602f, 0.784668f,
- 0.800293f, 0.817383f, 0.921875f, 0.926270f, 0.926270f, 0.925781f, 0.924316f, 0.923340f,
- 0.001081f, 0.003603f, 0.006027f, 0.008575f, 0.010979f, 0.013847f, 0.016937f, 0.020020f,
- 0.023315f, 0.026917f, 0.030930f, 0.035156f, 0.039429f, 0.044098f, 0.049622f, 0.054779f,
- 0.060791f, 0.067566f, 0.074341f, 0.082336f, 0.090515f, 0.099548f, 0.109070f, 0.119263f,
- 0.130981f, 0.143188f, 0.156250f, 0.170288f, 0.185303f, 0.201294f, 0.218262f, 0.236450f,
- 0.255615f, 0.275391f, 0.295654f, 0.316895f, 0.339111f, 0.362061f, 0.385498f, 0.408936f,
- 0.432861f, 0.457275f, 0.481689f, 0.505371f, 0.529785f, 0.553711f, 0.577637f, 0.601074f,
- 0.624023f, 0.646484f, 0.669434f, 0.689941f, 0.711426f, 0.731445f, 0.750977f, 0.770020f,
- 0.787598f, 0.804688f, 0.916992f, 0.922363f, 0.922363f, 0.921875f, 0.920898f, 0.918945f,
- 0.001064f, 0.003231f, 0.005322f, 0.007710f, 0.010323f, 0.012489f, 0.015244f, 0.018051f,
- 0.020798f, 0.024338f, 0.027893f, 0.031738f, 0.035553f, 0.039795f, 0.044495f, 0.049133f,
- 0.054657f, 0.060608f, 0.066895f, 0.073792f, 0.081421f, 0.089050f, 0.097717f, 0.106934f,
- 0.117554f, 0.128540f, 0.140503f, 0.153442f, 0.167236f, 0.182129f, 0.197998f, 0.214966f,
- 0.232422f, 0.251465f, 0.271240f, 0.291992f, 0.313232f, 0.335693f, 0.358643f, 0.382080f,
- 0.406006f, 0.430176f, 0.454590f, 0.479004f, 0.503906f, 0.528320f, 0.552734f, 0.577637f,
- 0.601562f, 0.625000f, 0.648438f, 0.670898f, 0.691895f, 0.713867f, 0.733887f, 0.754883f,
- 0.774414f, 0.791992f, 0.912109f, 0.917969f, 0.918457f, 0.916992f, 0.916016f, 0.915039f,
- 0.000998f, 0.003012f, 0.005123f, 0.007114f, 0.009438f, 0.011360f, 0.013763f, 0.016510f,
- 0.018951f, 0.022171f, 0.025101f, 0.028305f, 0.031830f, 0.035736f, 0.039795f, 0.044067f,
- 0.048950f, 0.053864f, 0.059601f, 0.066345f, 0.072815f, 0.079956f, 0.087402f, 0.096375f,
- 0.105835f, 0.115479f, 0.126343f, 0.138184f, 0.150635f, 0.164062f, 0.178711f, 0.194214f,
- 0.210815f, 0.229004f, 0.247314f, 0.267090f, 0.288330f, 0.309570f, 0.332275f, 0.355469f,
- 0.378418f, 0.402832f, 0.427490f, 0.452637f, 0.477783f, 0.501953f, 0.527832f, 0.552734f,
- 0.577637f, 0.602051f, 0.626465f, 0.649902f, 0.672852f, 0.695312f, 0.717773f, 0.737793f,
- 0.758789f, 0.778809f, 0.906250f, 0.913086f, 0.913574f, 0.912598f, 0.911621f, 0.910645f,
- 0.001059f, 0.002985f, 0.004475f, 0.006496f, 0.008545f, 0.010300f, 0.012581f, 0.014969f,
- 0.017471f, 0.019852f, 0.022507f, 0.025864f, 0.028824f, 0.032135f, 0.036041f, 0.039795f,
- 0.043884f, 0.048706f, 0.053680f, 0.059113f, 0.064819f, 0.071472f, 0.078491f, 0.086365f,
- 0.094360f, 0.103577f, 0.113403f, 0.124023f, 0.135620f, 0.147705f, 0.160889f, 0.175537f,
- 0.191284f, 0.207764f, 0.225464f, 0.244263f, 0.264160f, 0.284912f, 0.306641f, 0.329102f,
- 0.352295f, 0.376465f, 0.400635f, 0.426025f, 0.451416f, 0.476562f, 0.502930f, 0.527344f,
- 0.553711f, 0.579102f, 0.603027f, 0.627930f, 0.652344f, 0.675781f, 0.700195f, 0.722168f,
- 0.742676f, 0.764648f, 0.901367f, 0.907715f, 0.908691f, 0.908203f, 0.907227f, 0.906250f,
- 0.000988f, 0.002577f, 0.004124f, 0.006042f, 0.007603f, 0.009506f, 0.011299f, 0.013680f,
- 0.015778f, 0.017883f, 0.020554f, 0.023102f, 0.025940f, 0.028946f, 0.031891f, 0.035431f,
- 0.039825f, 0.043671f, 0.048157f, 0.053009f, 0.058075f, 0.063782f, 0.069885f, 0.077087f,
- 0.084839f, 0.092712f, 0.101379f, 0.110779f, 0.121155f, 0.132446f, 0.144775f, 0.157837f,
- 0.172363f, 0.187744f, 0.204590f, 0.222290f, 0.240601f, 0.260254f, 0.281494f, 0.303223f,
- 0.325439f, 0.349609f, 0.373535f, 0.399170f, 0.424561f, 0.450439f, 0.475586f, 0.501953f,
- 0.528320f, 0.554688f, 0.580566f, 0.605957f, 0.630859f, 0.656250f, 0.680176f, 0.704102f,
- 0.727051f, 0.749512f, 0.895508f, 0.902344f, 0.903320f, 0.902832f, 0.901855f, 0.901855f,
- 0.000842f, 0.002253f, 0.003597f, 0.005352f, 0.007195f, 0.008804f, 0.010460f, 0.012100f,
- 0.014130f, 0.016281f, 0.018341f, 0.021057f, 0.023193f, 0.025742f, 0.029022f, 0.031830f,
- 0.035278f, 0.039246f, 0.042999f, 0.047211f, 0.052032f, 0.056946f, 0.062744f, 0.068848f,
- 0.075195f, 0.082642f, 0.090332f, 0.099060f, 0.108215f, 0.118469f, 0.129517f, 0.141724f,
- 0.154907f, 0.169434f, 0.184448f, 0.201172f, 0.218506f, 0.237427f, 0.257324f, 0.278320f,
- 0.300293f, 0.323242f, 0.347412f, 0.372070f, 0.397217f, 0.423340f, 0.449707f, 0.476807f,
- 0.502930f, 0.529785f, 0.556641f, 0.582520f, 0.609863f, 0.635254f, 0.660645f, 0.686035f,
- 0.710938f, 0.733887f, 0.889648f, 0.897461f, 0.898926f, 0.896973f, 0.896973f, 0.896484f,
- 0.000660f, 0.002014f, 0.003531f, 0.004951f, 0.006424f, 0.007935f, 0.009392f, 0.011322f,
- 0.012924f, 0.014824f, 0.016754f, 0.018906f, 0.020935f, 0.023376f, 0.026245f, 0.028809f,
- 0.031860f, 0.034821f, 0.038330f, 0.042236f, 0.046387f, 0.050812f, 0.056061f, 0.061279f,
- 0.066956f, 0.073547f, 0.080566f, 0.088074f, 0.096802f, 0.106079f, 0.116089f, 0.127075f,
- 0.138672f, 0.151855f, 0.165649f, 0.180908f, 0.197754f, 0.215332f, 0.234375f, 0.254150f,
- 0.275391f, 0.298096f, 0.321533f, 0.344971f, 0.370361f, 0.396973f, 0.422852f, 0.449219f,
- 0.477295f, 0.504395f, 0.532227f, 0.558594f, 0.586914f, 0.614258f, 0.640625f, 0.666016f,
- 0.692871f, 0.718262f, 0.882812f, 0.891602f, 0.892578f, 0.892090f, 0.892090f, 0.890625f,
- 0.000623f, 0.002073f, 0.003298f, 0.004292f, 0.005589f, 0.007401f, 0.008377f, 0.010315f,
- 0.011871f, 0.013596f, 0.015213f, 0.016632f, 0.018829f, 0.020920f, 0.023239f, 0.025726f,
- 0.028381f, 0.031250f, 0.034241f, 0.037781f, 0.041473f, 0.045349f, 0.049469f, 0.054199f,
- 0.059448f, 0.065186f, 0.071716f, 0.078613f, 0.085999f, 0.093872f, 0.103516f, 0.112976f,
- 0.123840f, 0.135620f, 0.148804f, 0.162720f, 0.178223f, 0.194824f, 0.212280f, 0.231079f,
- 0.251953f, 0.273193f, 0.295410f, 0.319580f, 0.343994f, 0.370117f, 0.396729f, 0.422852f,
- 0.450684f, 0.478516f, 0.507324f, 0.534668f, 0.562988f, 0.591797f, 0.619629f, 0.646484f,
- 0.674316f, 0.700195f, 0.875488f, 0.885254f, 0.886719f, 0.886719f, 0.885742f, 0.885254f,
- 0.000583f, 0.001746f, 0.002840f, 0.004143f, 0.005234f, 0.006516f, 0.007835f, 0.009460f,
- 0.010788f, 0.012062f, 0.013428f, 0.015053f, 0.017349f, 0.018753f, 0.021271f, 0.023163f,
- 0.025284f, 0.027924f, 0.030655f, 0.033478f, 0.036957f, 0.040527f, 0.044037f, 0.048309f,
- 0.053223f, 0.058319f, 0.063660f, 0.069763f, 0.076172f, 0.083679f, 0.091431f, 0.100647f,
- 0.110229f, 0.120667f, 0.132690f, 0.145386f, 0.159668f, 0.174805f, 0.191284f, 0.208984f,
- 0.228516f, 0.248535f, 0.270996f, 0.293701f, 0.317383f, 0.342529f, 0.369629f, 0.396240f,
- 0.424072f, 0.452148f, 0.480957f, 0.509277f, 0.539551f, 0.567871f, 0.596680f, 0.625977f,
- 0.654785f, 0.682129f, 0.868652f, 0.878906f, 0.880371f, 0.879883f, 0.879883f, 0.879395f,
- 0.000535f, 0.001538f, 0.002930f, 0.003725f, 0.004986f, 0.005920f, 0.006973f, 0.008247f,
- 0.009575f, 0.010841f, 0.012115f, 0.013550f, 0.015343f, 0.016983f, 0.018814f, 0.020523f,
- 0.022568f, 0.024887f, 0.027206f, 0.029907f, 0.032959f, 0.035828f, 0.039185f, 0.042877f,
- 0.046967f, 0.051605f, 0.056213f, 0.061432f, 0.067749f, 0.073730f, 0.081238f, 0.089111f,
- 0.097656f, 0.107300f, 0.118042f, 0.129883f, 0.142334f, 0.156250f, 0.171875f, 0.187866f,
- 0.206665f, 0.225708f, 0.246704f, 0.268799f, 0.291992f, 0.316650f, 0.342529f, 0.369629f,
- 0.397217f, 0.425537f, 0.454590f, 0.484131f, 0.513672f, 0.544434f, 0.574219f, 0.604492f,
- 0.633789f, 0.664062f, 0.861328f, 0.871582f, 0.873535f, 0.874512f, 0.873047f, 0.872559f,
- 0.000581f, 0.001668f, 0.002563f, 0.003471f, 0.004494f, 0.005562f, 0.006580f, 0.007782f,
- 0.008690f, 0.009766f, 0.011261f, 0.012314f, 0.013901f, 0.014969f, 0.016479f, 0.018265f,
- 0.020294f, 0.022156f, 0.024353f, 0.026505f, 0.029053f, 0.031799f, 0.034607f, 0.037964f,
- 0.041382f, 0.045471f, 0.049591f, 0.054047f, 0.059326f, 0.065186f, 0.071411f, 0.078735f,
- 0.086304f, 0.094971f, 0.104126f, 0.114807f, 0.126587f, 0.138916f, 0.153564f, 0.169067f,
- 0.185669f, 0.203613f, 0.223389f, 0.244629f, 0.266602f, 0.291260f, 0.316406f, 0.342773f,
- 0.370361f, 0.398926f, 0.427734f, 0.458008f, 0.488770f, 0.520020f, 0.550293f, 0.582031f,
- 0.613281f, 0.645020f, 0.854004f, 0.865234f, 0.866699f, 0.867188f, 0.866699f, 0.866699f,
- 0.000571f, 0.001365f, 0.002483f, 0.003033f, 0.004120f, 0.005054f, 0.005981f, 0.006737f,
- 0.007603f, 0.008675f, 0.009789f, 0.011078f, 0.012413f, 0.013626f, 0.014908f, 0.016174f,
- 0.017792f, 0.019699f, 0.021591f, 0.023499f, 0.025635f, 0.028000f, 0.030533f, 0.033417f,
- 0.036499f, 0.039948f, 0.043762f, 0.047943f, 0.052460f, 0.057465f, 0.062622f, 0.068848f,
- 0.076111f, 0.083557f, 0.092102f, 0.101562f, 0.111816f, 0.123230f, 0.135864f, 0.150024f,
- 0.165771f, 0.182373f, 0.200806f, 0.221191f, 0.242920f, 0.265869f, 0.290283f, 0.316406f,
- 0.343262f, 0.371582f, 0.400879f, 0.431396f, 0.463623f, 0.494629f, 0.526367f, 0.558105f,
- 0.591309f, 0.624023f, 0.845215f, 0.856934f, 0.859375f, 0.859375f, 0.859863f, 0.860352f,
- 0.000411f, 0.001296f, 0.002012f, 0.002808f, 0.003754f, 0.004543f, 0.005215f, 0.006012f,
- 0.006725f, 0.007851f, 0.008888f, 0.009979f, 0.010994f, 0.012009f, 0.013062f, 0.014549f,
- 0.016113f, 0.017441f, 0.019073f, 0.020767f, 0.022598f, 0.024689f, 0.026764f, 0.029358f,
- 0.032043f, 0.034760f, 0.038391f, 0.041779f, 0.045380f, 0.050110f, 0.055054f, 0.060394f,
- 0.066650f, 0.073120f, 0.080688f, 0.089233f, 0.098450f, 0.108582f, 0.120178f, 0.133057f,
- 0.146973f, 0.162354f, 0.179565f, 0.198364f, 0.218750f, 0.240967f, 0.264648f, 0.290039f,
- 0.316650f, 0.344971f, 0.374023f, 0.404541f, 0.435791f, 0.467773f, 0.500977f, 0.535156f,
- 0.569336f, 0.601562f, 0.836914f, 0.850098f, 0.852051f, 0.852539f, 0.852539f, 0.852051f,
- 0.000408f, 0.001071f, 0.001857f, 0.002573f, 0.003338f, 0.004078f, 0.004692f, 0.005379f,
- 0.006046f, 0.007275f, 0.007957f, 0.008606f, 0.009598f, 0.010864f, 0.011658f, 0.013084f,
- 0.013977f, 0.015366f, 0.016724f, 0.018402f, 0.019669f, 0.021759f, 0.023697f, 0.025726f,
- 0.027954f, 0.030640f, 0.033356f, 0.036530f, 0.039948f, 0.043701f, 0.047791f, 0.052704f,
- 0.057770f, 0.063782f, 0.070129f, 0.077881f, 0.085999f, 0.095337f, 0.105591f, 0.116882f,
- 0.130005f, 0.143921f, 0.159302f, 0.177246f, 0.196411f, 0.217163f, 0.239746f, 0.263916f,
- 0.290039f, 0.317871f, 0.346924f, 0.377441f, 0.408936f, 0.442139f, 0.476074f, 0.509766f,
- 0.545410f, 0.580078f, 0.828613f, 0.841309f, 0.843262f, 0.844238f, 0.843750f, 0.844238f,
- 0.000322f, 0.001009f, 0.001674f, 0.002262f, 0.002949f, 0.003633f, 0.004250f, 0.004780f,
- 0.005478f, 0.006256f, 0.007248f, 0.007919f, 0.008720f, 0.009552f, 0.010277f, 0.011391f,
- 0.012291f, 0.013466f, 0.014786f, 0.015976f, 0.017288f, 0.019043f, 0.020477f, 0.022385f,
- 0.024292f, 0.026276f, 0.029175f, 0.031769f, 0.034546f, 0.037842f, 0.041626f, 0.045868f,
- 0.050293f, 0.055084f, 0.060669f, 0.067688f, 0.074585f, 0.083008f, 0.092102f, 0.102234f,
- 0.113525f, 0.126587f, 0.140869f, 0.156860f, 0.174805f, 0.194214f, 0.215698f, 0.239014f,
- 0.264404f, 0.291016f, 0.320068f, 0.350098f, 0.382080f, 0.414551f, 0.449463f, 0.485107f,
- 0.520996f, 0.557617f, 0.818848f, 0.833496f, 0.836426f, 0.836914f, 0.836426f, 0.835938f,
- 0.000483f, 0.000841f, 0.001632f, 0.002142f, 0.002678f, 0.003359f, 0.003830f, 0.004333f,
- 0.005077f, 0.005527f, 0.006104f, 0.006908f, 0.007675f, 0.008392f, 0.009216f, 0.009789f,
- 0.010880f, 0.011719f, 0.012817f, 0.013809f, 0.015068f, 0.016357f, 0.017883f, 0.019485f,
- 0.021271f, 0.022995f, 0.025162f, 0.027359f, 0.029755f, 0.032806f, 0.036133f, 0.039459f,
- 0.043091f, 0.047821f, 0.052368f, 0.058258f, 0.064514f, 0.071472f, 0.079224f, 0.088623f,
- 0.098694f, 0.109924f, 0.123230f, 0.137817f, 0.154053f, 0.172363f, 0.192261f, 0.214478f,
- 0.238647f, 0.265137f, 0.292725f, 0.322998f, 0.354492f, 0.387695f, 0.422363f, 0.458740f,
- 0.495605f, 0.533691f, 0.809570f, 0.824219f, 0.826660f, 0.827148f, 0.828125f, 0.827148f,
- 0.000240f, 0.000906f, 0.001379f, 0.001807f, 0.002495f, 0.002916f, 0.003490f, 0.004139f,
- 0.004471f, 0.004898f, 0.005638f, 0.005978f, 0.006874f, 0.007313f, 0.007957f, 0.008698f,
- 0.009560f, 0.010178f, 0.011345f, 0.012177f, 0.012985f, 0.014214f, 0.015274f, 0.016708f,
- 0.017929f, 0.019882f, 0.021393f, 0.023560f, 0.025406f, 0.028137f, 0.030472f, 0.033752f,
- 0.036896f, 0.040619f, 0.044952f, 0.049622f, 0.055298f, 0.061249f, 0.068420f, 0.075928f,
- 0.084900f, 0.095398f, 0.107300f, 0.119934f, 0.134766f, 0.151733f, 0.170410f, 0.191284f,
- 0.213867f, 0.238647f, 0.265869f, 0.295654f, 0.326660f, 0.359863f, 0.394775f, 0.432129f,
- 0.469482f, 0.508789f, 0.798340f, 0.814941f, 0.817871f, 0.818359f, 0.818848f, 0.818848f,
- 0.000376f, 0.000870f, 0.001291f, 0.001619f, 0.002251f, 0.002520f, 0.003016f, 0.003502f,
- 0.004036f, 0.004299f, 0.004723f, 0.005234f, 0.005840f, 0.006512f, 0.006908f, 0.007595f,
- 0.008003f, 0.008797f, 0.009773f, 0.010536f, 0.011284f, 0.012161f, 0.013237f, 0.014465f,
- 0.015579f, 0.016968f, 0.018402f, 0.019882f, 0.021759f, 0.023621f, 0.026138f, 0.028488f,
- 0.031738f, 0.034668f, 0.038239f, 0.042389f, 0.046783f, 0.052094f, 0.058319f, 0.064941f,
- 0.072815f, 0.081726f, 0.092102f, 0.103516f, 0.117188f, 0.132202f, 0.149048f, 0.168091f,
- 0.189941f, 0.213745f, 0.239990f, 0.268311f, 0.299316f, 0.332275f, 0.367188f, 0.403076f,
- 0.442871f, 0.483398f, 0.788086f, 0.805176f, 0.808105f, 0.808594f, 0.809082f, 0.809082f,
- 0.000386f, 0.000765f, 0.000998f, 0.001537f, 0.001833f, 0.002407f, 0.002529f, 0.003113f,
- 0.003334f, 0.003841f, 0.004192f, 0.004585f, 0.005096f, 0.005543f, 0.006073f, 0.006405f,
- 0.007118f, 0.007641f, 0.008278f, 0.008957f, 0.009651f, 0.010498f, 0.011307f, 0.012184f,
- 0.013199f, 0.014343f, 0.015671f, 0.016678f, 0.018585f, 0.019852f, 0.021881f, 0.023987f,
- 0.026398f, 0.029099f, 0.032227f, 0.035339f, 0.039246f, 0.043915f, 0.048859f, 0.054688f,
- 0.061554f, 0.069519f, 0.078247f, 0.088379f, 0.100037f, 0.113770f, 0.129272f, 0.146606f,
- 0.166626f, 0.189575f, 0.214111f, 0.241577f, 0.271973f, 0.304199f, 0.339844f, 0.375977f,
- 0.415527f, 0.457275f, 0.776855f, 0.794434f, 0.797363f, 0.797852f, 0.798828f, 0.799316f,
- 0.000232f, 0.000636f, 0.000996f, 0.001201f, 0.001721f, 0.002029f, 0.002340f, 0.002802f,
- 0.003012f, 0.003462f, 0.003693f, 0.004059f, 0.004295f, 0.004822f, 0.005077f, 0.005623f,
- 0.006126f, 0.006653f, 0.007027f, 0.007561f, 0.008049f, 0.008904f, 0.009399f, 0.010300f,
- 0.011200f, 0.012115f, 0.013092f, 0.014221f, 0.015671f, 0.016891f, 0.018433f, 0.020294f,
- 0.022064f, 0.024277f, 0.026688f, 0.029678f, 0.032654f, 0.036499f, 0.040955f, 0.045715f,
- 0.051514f, 0.058014f, 0.065674f, 0.074707f, 0.084717f, 0.096802f, 0.111023f, 0.126709f,
- 0.144775f, 0.165771f, 0.189209f, 0.215820f, 0.244385f, 0.275879f, 0.310547f, 0.348145f,
- 0.387695f, 0.429932f, 0.765137f, 0.783203f, 0.787109f, 0.788574f, 0.788574f, 0.789551f,
- 0.000171f, 0.000518f, 0.001106f, 0.001242f, 0.001475f, 0.001939f, 0.002092f, 0.002254f,
- 0.002607f, 0.002930f, 0.003084f, 0.003382f, 0.003674f, 0.004040f, 0.004395f, 0.004780f,
- 0.005157f, 0.005653f, 0.006088f, 0.006355f, 0.006870f, 0.007420f, 0.008057f, 0.008667f,
- 0.009361f, 0.010040f, 0.011101f, 0.011803f, 0.012711f, 0.013962f, 0.015343f, 0.016586f,
- 0.018036f, 0.020142f, 0.022079f, 0.024399f, 0.027023f, 0.030075f, 0.033569f, 0.037750f,
- 0.042603f, 0.048096f, 0.054718f, 0.062134f, 0.071045f, 0.081299f, 0.093445f, 0.107605f,
- 0.124268f, 0.142944f, 0.165405f, 0.189941f, 0.218262f, 0.249268f, 0.282227f, 0.319336f,
- 0.359375f, 0.402832f, 0.752930f, 0.771973f, 0.775879f, 0.776855f, 0.777832f, 0.777832f,
- 0.000204f, 0.000608f, 0.000865f, 0.001011f, 0.001362f, 0.001632f, 0.001817f, 0.001930f,
- 0.002274f, 0.002491f, 0.002796f, 0.002932f, 0.003139f, 0.003429f, 0.003736f, 0.004055f,
- 0.004448f, 0.004829f, 0.004971f, 0.005497f, 0.005859f, 0.006298f, 0.006741f, 0.007080f,
- 0.007687f, 0.008308f, 0.009087f, 0.009880f, 0.010735f, 0.011528f, 0.012375f, 0.013664f,
- 0.014862f, 0.016464f, 0.017868f, 0.019852f, 0.022156f, 0.024490f, 0.027435f, 0.030853f,
- 0.034637f, 0.039154f, 0.044495f, 0.050964f, 0.058441f, 0.067383f, 0.077759f, 0.090332f,
- 0.104797f, 0.121826f, 0.142334f, 0.164795f, 0.191528f, 0.221313f, 0.254150f, 0.290771f,
- 0.330078f, 0.374268f, 0.740234f, 0.759277f, 0.763672f, 0.766113f, 0.766602f, 0.766113f,
- 0.000150f, 0.000514f, 0.000666f, 0.000865f, 0.001163f, 0.001389f, 0.001540f, 0.001672f,
- 0.001940f, 0.002110f, 0.002302f, 0.002419f, 0.002745f, 0.002974f, 0.003120f, 0.003366f,
- 0.003695f, 0.003815f, 0.004173f, 0.004574f, 0.004879f, 0.005165f, 0.005646f, 0.006058f,
- 0.006481f, 0.006969f, 0.007626f, 0.007881f, 0.008751f, 0.009445f, 0.010231f, 0.011246f,
- 0.012222f, 0.013268f, 0.014641f, 0.015976f, 0.017792f, 0.019867f, 0.021912f, 0.024704f,
- 0.027786f, 0.031494f, 0.036011f, 0.041229f, 0.047363f, 0.054962f, 0.063904f, 0.074463f,
- 0.087036f, 0.102295f, 0.120483f, 0.141113f, 0.166260f, 0.194214f, 0.226196f, 0.261719f,
- 0.301514f, 0.345459f, 0.727051f, 0.747070f, 0.751953f, 0.753418f, 0.754395f, 0.754883f,
- 0.000103f, 0.000251f, 0.000628f, 0.000912f, 0.000978f, 0.001191f, 0.001365f, 0.001507f,
- 0.001513f, 0.001757f, 0.001980f, 0.002121f, 0.002316f, 0.002373f, 0.002645f, 0.002909f,
- 0.003012f, 0.003305f, 0.003538f, 0.003775f, 0.004070f, 0.004246f, 0.004642f, 0.004986f,
- 0.005394f, 0.005802f, 0.006031f, 0.006565f, 0.006969f, 0.007618f, 0.008293f, 0.008980f,
- 0.009766f, 0.010612f, 0.011528f, 0.012802f, 0.014198f, 0.015671f, 0.017517f, 0.019592f,
- 0.021957f, 0.024918f, 0.028442f, 0.032562f, 0.037567f, 0.043762f, 0.051025f, 0.059753f,
- 0.071045f, 0.084412f, 0.099792f, 0.119385f, 0.141846f, 0.167969f, 0.199341f, 0.233521f,
- 0.272461f, 0.315674f, 0.712891f, 0.733887f, 0.738770f, 0.740234f, 0.741211f, 0.741699f,
- 0.000185f, 0.000434f, 0.000489f, 0.000732f, 0.000874f, 0.000968f, 0.001122f, 0.001124f,
- 0.001371f, 0.001423f, 0.001639f, 0.001693f, 0.001805f, 0.002094f, 0.002241f, 0.002356f,
- 0.002567f, 0.002691f, 0.002871f, 0.003063f, 0.003195f, 0.003582f, 0.003790f, 0.004089f,
- 0.004372f, 0.004536f, 0.005085f, 0.005314f, 0.005699f, 0.006153f, 0.006672f, 0.007202f,
- 0.007805f, 0.008522f, 0.009216f, 0.010071f, 0.011086f, 0.012184f, 0.013596f, 0.015297f,
- 0.017014f, 0.019363f, 0.021988f, 0.025299f, 0.029282f, 0.033936f, 0.040070f, 0.047028f,
- 0.056519f, 0.067932f, 0.080872f, 0.098083f, 0.118469f, 0.143188f, 0.171753f, 0.205200f,
- 0.243286f, 0.286133f, 0.698730f, 0.721680f, 0.725098f, 0.727051f, 0.728027f, 0.728516f,
- 0.000116f, 0.000267f, 0.000565f, 0.000505f, 0.000648f, 0.000772f, 0.000813f, 0.001031f,
- 0.001107f, 0.001184f, 0.001335f, 0.001391f, 0.001451f, 0.001633f, 0.001798f, 0.001874f,
- 0.002090f, 0.002192f, 0.002392f, 0.002464f, 0.002707f, 0.002895f, 0.003044f, 0.003206f,
- 0.003468f, 0.003666f, 0.003887f, 0.004261f, 0.004524f, 0.004898f, 0.005379f, 0.005711f,
- 0.006130f, 0.006721f, 0.007267f, 0.007912f, 0.008659f, 0.009575f, 0.010475f, 0.011749f,
- 0.013252f, 0.014717f, 0.016815f, 0.019302f, 0.022369f, 0.025955f, 0.030502f, 0.036285f,
- 0.043579f, 0.052795f, 0.064453f, 0.078735f, 0.096497f, 0.118591f, 0.145508f, 0.177368f,
- 0.213989f, 0.256592f, 0.683105f, 0.707031f, 0.710938f, 0.713379f, 0.714844f, 0.714844f,
- 0.000223f, 0.000239f, 0.000286f, 0.000476f, 0.000580f, 0.000647f, 0.000715f, 0.000843f,
- 0.000914f, 0.000950f, 0.001090f, 0.001163f, 0.001259f, 0.001328f, 0.001392f, 0.001560f,
- 0.001549f, 0.001775f, 0.001868f, 0.001999f, 0.002199f, 0.002235f, 0.002436f, 0.002575f,
- 0.002842f, 0.002892f, 0.003111f, 0.003401f, 0.003563f, 0.003887f, 0.004196f, 0.004505f,
- 0.004791f, 0.005142f, 0.005684f, 0.006153f, 0.006710f, 0.007378f, 0.008064f, 0.008881f,
- 0.009979f, 0.011177f, 0.012779f, 0.014435f, 0.016647f, 0.019150f, 0.022583f, 0.027252f,
- 0.033051f, 0.040039f, 0.049561f, 0.061340f, 0.076843f, 0.096313f, 0.120544f, 0.150513f,
- 0.185547f, 0.227173f, 0.668457f, 0.692383f, 0.696289f, 0.698242f, 0.699219f, 0.701172f,
- 0.000000f, 0.000109f, 0.000315f, 0.000449f, 0.000511f, 0.000507f, 0.000538f, 0.000653f,
- 0.000724f, 0.000749f, 0.000830f, 0.000893f, 0.001007f, 0.001079f, 0.001189f, 0.001163f,
- 0.001335f, 0.001307f, 0.001502f, 0.001575f, 0.001627f, 0.001778f, 0.001933f, 0.002029f,
- 0.002155f, 0.002254f, 0.002401f, 0.002535f, 0.002829f, 0.002943f, 0.003143f, 0.003422f,
- 0.003710f, 0.003990f, 0.004318f, 0.004627f, 0.005108f, 0.005585f, 0.006142f, 0.006641f,
- 0.007378f, 0.008354f, 0.009430f, 0.010628f, 0.012123f, 0.014015f, 0.016541f, 0.019836f,
- 0.023849f, 0.029312f, 0.036774f, 0.046356f, 0.058868f, 0.075562f, 0.097107f, 0.124634f,
- 0.157837f, 0.197754f, 0.653320f, 0.677734f, 0.682129f, 0.684082f, 0.685547f, 0.684570f,
- 0.000166f, 0.000195f, 0.000256f, 0.000372f, 0.000386f, 0.000415f, 0.000515f, 0.000432f,
- 0.000579f, 0.000606f, 0.000706f, 0.000745f, 0.000764f, 0.000837f, 0.000853f, 0.000993f,
- 0.001034f, 0.001066f, 0.001156f, 0.001203f, 0.001339f, 0.001418f, 0.001470f, 0.001612f,
- 0.001614f, 0.001707f, 0.001850f, 0.001986f, 0.002151f, 0.002254f, 0.002499f, 0.002560f,
- 0.002794f, 0.003000f, 0.003212f, 0.003510f, 0.003761f, 0.004086f, 0.004475f, 0.004967f,
- 0.005428f, 0.006134f, 0.006840f, 0.007786f, 0.008858f, 0.010033f, 0.011909f, 0.014137f,
- 0.016907f, 0.020767f, 0.025894f, 0.033386f, 0.043274f, 0.056854f, 0.075439f, 0.099548f,
- 0.130737f, 0.169434f, 0.634277f, 0.661133f, 0.667480f, 0.668945f, 0.669922f, 0.670898f,
- 0.000115f, 0.000119f, 0.000230f, 0.000304f, 0.000221f, 0.000380f, 0.000322f, 0.000351f,
- 0.000453f, 0.000527f, 0.000535f, 0.000558f, 0.000595f, 0.000675f, 0.000707f, 0.000670f,
- 0.000776f, 0.000812f, 0.000839f, 0.000911f, 0.000974f, 0.001033f, 0.001082f, 0.001154f,
- 0.001209f, 0.001268f, 0.001416f, 0.001432f, 0.001607f, 0.001775f, 0.001877f, 0.001911f,
- 0.002041f, 0.002207f, 0.002380f, 0.002563f, 0.002741f, 0.002956f, 0.003281f, 0.003513f,
- 0.003902f, 0.004353f, 0.004803f, 0.005405f, 0.006256f, 0.007072f, 0.008263f, 0.009659f,
- 0.011627f, 0.014221f, 0.017792f, 0.022919f, 0.030075f, 0.040497f, 0.055878f, 0.076721f,
- 0.104980f, 0.141357f, 0.618652f, 0.644531f, 0.650391f, 0.652832f, 0.653320f, 0.654785f,
- 0.000000f, 0.000122f, 0.000142f, 0.000227f, 0.000248f, 0.000246f, 0.000296f, 0.000254f,
- 0.000308f, 0.000329f, 0.000387f, 0.000437f, 0.000443f, 0.000504f, 0.000515f, 0.000535f,
- 0.000566f, 0.000592f, 0.000618f, 0.000641f, 0.000706f, 0.000746f, 0.000787f, 0.000839f,
- 0.000878f, 0.000920f, 0.001043f, 0.001041f, 0.001136f, 0.001199f, 0.001258f, 0.001393f,
- 0.001428f, 0.001549f, 0.001632f, 0.001856f, 0.001945f, 0.002079f, 0.002310f, 0.002489f,
- 0.002708f, 0.002996f, 0.003315f, 0.003759f, 0.004177f, 0.004803f, 0.005619f, 0.006527f,
- 0.007793f, 0.009468f, 0.011917f, 0.015152f, 0.019897f, 0.027298f, 0.038910f, 0.055908f,
- 0.080811f, 0.114563f, 0.600586f, 0.628906f, 0.634277f, 0.636719f, 0.637207f, 0.638672f,
- 0.000000f, 0.000000f, 0.000106f, 0.000137f, 0.000172f, 0.000211f, 0.000189f, 0.000226f,
- 0.000230f, 0.000248f, 0.000293f, 0.000251f, 0.000264f, 0.000321f, 0.000343f, 0.000399f,
- 0.000368f, 0.000401f, 0.000499f, 0.000479f, 0.000498f, 0.000526f, 0.000550f, 0.000595f,
- 0.000631f, 0.000645f, 0.000726f, 0.000717f, 0.000786f, 0.000902f, 0.000865f, 0.000916f,
- 0.000989f, 0.001059f, 0.001165f, 0.001246f, 0.001279f, 0.001408f, 0.001566f, 0.001628f,
- 0.001808f, 0.001991f, 0.002165f, 0.002466f, 0.002766f, 0.003084f, 0.003534f, 0.004250f,
- 0.005016f, 0.006130f, 0.007584f, 0.009605f, 0.012718f, 0.017395f, 0.025131f, 0.038269f,
- 0.058899f, 0.089661f, 0.582031f, 0.611328f, 0.616699f, 0.620117f, 0.621094f, 0.622559f,
- 0.000000f, 0.000108f, 0.000104f, 0.000095f, 0.000117f, 0.000117f, 0.000122f, 0.000143f,
- 0.000147f, 0.000164f, 0.000174f, 0.000216f, 0.000191f, 0.000227f, 0.000241f, 0.000250f,
- 0.000257f, 0.000271f, 0.000301f, 0.000298f, 0.000317f, 0.000344f, 0.000370f, 0.000392f,
- 0.000404f, 0.000427f, 0.000491f, 0.000491f, 0.000519f, 0.000535f, 0.000611f, 0.000601f,
- 0.000668f, 0.000698f, 0.000767f, 0.000838f, 0.000865f, 0.000895f, 0.000993f, 0.001066f,
- 0.001161f, 0.001242f, 0.001415f, 0.001521f, 0.001743f, 0.001901f, 0.002209f, 0.002523f,
- 0.003038f, 0.003601f, 0.004478f, 0.005699f, 0.007545f, 0.010437f, 0.015175f, 0.023682f,
- 0.039429f, 0.066406f, 0.563477f, 0.593262f, 0.598633f, 0.602051f, 0.602539f, 0.603516f,
- 0.000000f, 0.000101f, 0.000093f, 0.000087f, 0.000082f, 0.000078f, 0.000084f, 0.000087f,
- 0.000093f, 0.000094f, 0.000099f, 0.000104f, 0.000114f, 0.000123f, 0.000158f, 0.000163f,
- 0.000166f, 0.000178f, 0.000177f, 0.000214f, 0.000191f, 0.000208f, 0.000212f, 0.000247f,
- 0.000268f, 0.000263f, 0.000272f, 0.000287f, 0.000310f, 0.000336f, 0.000353f, 0.000368f,
- 0.000396f, 0.000408f, 0.000453f, 0.000476f, 0.000511f, 0.000540f, 0.000615f, 0.000635f,
- 0.000682f, 0.000751f, 0.000812f, 0.000908f, 0.000987f, 0.001116f, 0.001278f, 0.001431f,
- 0.001702f, 0.002047f, 0.002512f, 0.003126f, 0.004181f, 0.005817f, 0.008553f, 0.013489f,
- 0.023697f, 0.045288f, 0.544922f, 0.575684f, 0.581543f, 0.584473f, 0.585938f, 0.587402f,
- 0.000109f, 0.000091f, 0.000081f, 0.000075f, 0.000070f, 0.000067f, 0.000064f, 0.000061f,
- 0.000057f, 0.000054f, 0.000058f, 0.000075f, 0.000062f, 0.000064f, 0.000085f, 0.000068f,
- 0.000092f, 0.000094f, 0.000103f, 0.000110f, 0.000113f, 0.000119f, 0.000141f, 0.000141f,
- 0.000148f, 0.000152f, 0.000159f, 0.000164f, 0.000175f, 0.000188f, 0.000184f, 0.000218f,
- 0.000233f, 0.000223f, 0.000253f, 0.000265f, 0.000282f, 0.000321f, 0.000322f, 0.000351f,
- 0.000371f, 0.000405f, 0.000443f, 0.000478f, 0.000515f, 0.000571f, 0.000652f, 0.000733f,
- 0.000856f, 0.001011f, 0.001227f, 0.001531f, 0.002029f, 0.002817f, 0.004215f, 0.006874f,
- 0.012390f, 0.027405f, 0.525879f, 0.557129f, 0.563477f, 0.566895f, 0.568848f, 0.569824f,
- 0.000094f, 0.000073f, 0.000065f, 0.000060f, 0.000055f, 0.000052f, 0.000049f, 0.000048f,
- 0.000046f, 0.000045f, 0.000042f, 0.000040f, 0.000040f, 0.000037f, 0.000035f, 0.000035f,
- 0.000042f, 0.000036f, 0.000049f, 0.000051f, 0.000055f, 0.000056f, 0.000059f, 0.000062f,
- 0.000064f, 0.000078f, 0.000071f, 0.000079f, 0.000088f, 0.000091f, 0.000093f, 0.000099f,
- 0.000103f, 0.000110f, 0.000125f, 0.000123f, 0.000127f, 0.000151f, 0.000151f, 0.000161f,
- 0.000169f, 0.000179f, 0.000204f, 0.000219f, 0.000240f, 0.000267f, 0.000294f, 0.000321f,
- 0.000378f, 0.000438f, 0.000524f, 0.000628f, 0.000818f, 0.001125f, 0.001693f, 0.002888f,
- 0.005638f, 0.013580f, 0.505859f, 0.539062f, 0.544922f, 0.548340f, 0.550293f, 0.550781f,
- 0.000064f, 0.000048f, 0.000041f, 0.000037f, 0.000035f, 0.000034f, 0.000032f, 0.000031f,
- 0.000030f, 0.000029f, 0.000028f, 0.000028f, 0.000027f, 0.000027f, 0.000026f, 0.000025f,
- 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000019f, 0.000023f,
- 0.000021f, 0.000022f, 0.000026f, 0.000029f, 0.000032f, 0.000031f, 0.000036f, 0.000037f,
- 0.000036f, 0.000044f, 0.000046f, 0.000048f, 0.000052f, 0.000054f, 0.000056f, 0.000061f,
- 0.000070f, 0.000073f, 0.000076f, 0.000081f, 0.000082f, 0.000095f, 0.000105f, 0.000120f,
- 0.000126f, 0.000143f, 0.000173f, 0.000203f, 0.000267f, 0.000346f, 0.000505f, 0.000853f,
- 0.001829f, 0.005222f, 0.487061f, 0.519531f, 0.527344f, 0.529785f, 0.531738f, 0.532715f,
- 0.000000f, 0.000002f, 0.000003f, 0.000004f, 0.000008f, 0.000008f, 0.000008f, 0.000010f,
- 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f,
- 0.000012f, 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000012f, 0.000011f,
- 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f,
- 0.000008f, 0.000007f, 0.000008f, 0.000009f, 0.000010f, 0.000012f, 0.000012f, 0.000015f,
- 0.000013f, 0.000015f, 0.000018f, 0.000020f, 0.000021f, 0.000022f, 0.000022f, 0.000024f,
- 0.000026f, 0.000027f, 0.000034f, 0.000043f, 0.000049f, 0.000065f, 0.000089f, 0.000138f,
- 0.000293f, 0.001143f, 0.466553f, 0.500488f, 0.508301f, 0.510742f, 0.512207f, 0.513672f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f,
- 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f,
- 0.000006f, 0.000023f, 0.446777f, 0.482178f, 0.489746f, 0.492676f, 0.494629f, 0.496094f,
- },
- {
- 0.032318f, 0.095032f, 0.152344f, 0.205322f, 0.254883f, 0.299316f, 0.342041f, 0.380859f,
- 0.416504f, 0.449707f, 0.481201f, 0.508789f, 0.537109f, 0.562012f, 0.584961f, 0.608398f,
- 0.628418f, 0.648926f, 0.666504f, 0.684570f, 0.701172f, 0.716797f, 0.731934f, 0.746094f,
- 0.759766f, 0.770996f, 0.784668f, 0.795898f, 0.806641f, 0.817871f, 0.827637f, 0.837402f,
- 0.846680f, 0.855469f, 0.863770f, 0.872559f, 0.879883f, 0.887695f, 0.895508f, 0.901367f,
- 0.909180f, 0.915527f, 0.921387f, 0.927734f, 0.934082f, 0.939453f, 0.944824f, 0.950684f,
- 0.955566f, 0.960449f, 0.965332f, 0.969238f, 0.974121f, 0.978516f, 0.982910f, 0.986816f,
- 0.990723f, 0.994629f, 0.994629f, 0.987793f, 0.981934f, 0.976562f, 0.971680f, 0.966797f,
- 0.025833f, 0.076965f, 0.125854f, 0.173096f, 0.217896f, 0.259766f, 0.299561f, 0.338135f,
- 0.372559f, 0.407471f, 0.437500f, 0.468262f, 0.496582f, 0.522949f, 0.547852f, 0.571289f,
- 0.593750f, 0.614746f, 0.633789f, 0.652832f, 0.671387f, 0.687988f, 0.705078f, 0.719727f,
- 0.734863f, 0.749023f, 0.761719f, 0.774414f, 0.786621f, 0.797363f, 0.808594f, 0.818848f,
- 0.829590f, 0.838867f, 0.848633f, 0.858398f, 0.865723f, 0.874512f, 0.881836f, 0.890137f,
- 0.897949f, 0.904297f, 0.910645f, 0.917480f, 0.923828f, 0.929688f, 0.935547f, 0.941895f,
- 0.947266f, 0.952637f, 0.957520f, 0.962402f, 0.967285f, 0.971680f, 0.976562f, 0.980957f,
- 0.984863f, 0.989258f, 0.992676f, 0.985840f, 0.979980f, 0.975098f, 0.970703f, 0.966309f,
- 0.020828f, 0.063049f, 0.104797f, 0.146606f, 0.187134f, 0.225464f, 0.263916f, 0.299072f,
- 0.333252f, 0.366943f, 0.398438f, 0.429199f, 0.457031f, 0.484131f, 0.509766f, 0.534668f,
- 0.559082f, 0.579590f, 0.600586f, 0.622070f, 0.640625f, 0.659180f, 0.676758f, 0.692383f,
- 0.708984f, 0.722656f, 0.737793f, 0.751465f, 0.764648f, 0.776367f, 0.789062f, 0.801270f,
- 0.811523f, 0.821289f, 0.832031f, 0.841309f, 0.850586f, 0.860352f, 0.868652f, 0.876953f,
- 0.884766f, 0.892090f, 0.899902f, 0.906738f, 0.913086f, 0.920410f, 0.927246f, 0.933105f,
- 0.938477f, 0.944336f, 0.950195f, 0.955078f, 0.959961f, 0.965332f, 0.970215f, 0.975098f,
- 0.979492f, 0.983887f, 0.989746f, 0.983398f, 0.978516f, 0.973633f, 0.969238f, 0.964844f,
- 0.017273f, 0.052429f, 0.088745f, 0.124207f, 0.160034f, 0.195068f, 0.230103f, 0.263916f,
- 0.297119f, 0.329102f, 0.360596f, 0.390625f, 0.418945f, 0.446289f, 0.472656f, 0.498535f,
- 0.521973f, 0.545898f, 0.567871f, 0.588867f, 0.609375f, 0.629395f, 0.646973f, 0.664551f,
- 0.681641f, 0.698242f, 0.712402f, 0.727539f, 0.741699f, 0.755371f, 0.768555f, 0.780762f,
- 0.792480f, 0.803711f, 0.814941f, 0.825195f, 0.834961f, 0.844727f, 0.854004f, 0.863281f,
- 0.871094f, 0.879883f, 0.887695f, 0.895508f, 0.902832f, 0.909668f, 0.916504f, 0.923828f,
- 0.929688f, 0.936035f, 0.941895f, 0.947754f, 0.952637f, 0.958496f, 0.963379f, 0.968750f,
- 0.973633f, 0.978027f, 0.986816f, 0.980957f, 0.976562f, 0.972168f, 0.967285f, 0.963379f,
- 0.014076f, 0.043915f, 0.074951f, 0.106140f, 0.137573f, 0.169189f, 0.201416f, 0.233154f,
- 0.264648f, 0.295166f, 0.324707f, 0.354248f, 0.381836f, 0.410156f, 0.436279f, 0.462891f,
- 0.487793f, 0.510742f, 0.534180f, 0.556152f, 0.576660f, 0.598145f, 0.616211f, 0.636719f,
- 0.653320f, 0.670410f, 0.687500f, 0.703125f, 0.718262f, 0.733398f, 0.746582f, 0.760742f,
- 0.772949f, 0.785156f, 0.796875f, 0.808105f, 0.818848f, 0.829590f, 0.838867f, 0.848145f,
- 0.857910f, 0.867188f, 0.875977f, 0.883301f, 0.891602f, 0.899414f, 0.906738f, 0.913086f,
- 0.919922f, 0.926270f, 0.932617f, 0.938477f, 0.944824f, 0.951660f, 0.957520f, 0.961914f,
- 0.967285f, 0.972168f, 0.984863f, 0.979004f, 0.974609f, 0.970215f, 0.966309f, 0.961914f,
- 0.012077f, 0.037445f, 0.063660f, 0.090881f, 0.118774f, 0.147827f, 0.176636f, 0.206055f,
- 0.234253f, 0.262939f, 0.291504f, 0.320312f, 0.347168f, 0.374756f, 0.401367f, 0.427734f,
- 0.451904f, 0.477051f, 0.500488f, 0.523438f, 0.545898f, 0.566406f, 0.587402f, 0.605957f,
- 0.624512f, 0.643555f, 0.662109f, 0.676758f, 0.693848f, 0.708984f, 0.724609f, 0.738770f,
- 0.751465f, 0.765137f, 0.777344f, 0.790039f, 0.800781f, 0.812500f, 0.823242f, 0.833984f,
- 0.842773f, 0.853027f, 0.861816f, 0.871094f, 0.879395f, 0.887695f, 0.895508f, 0.903320f,
- 0.910156f, 0.917969f, 0.924316f, 0.931152f, 0.937988f, 0.943848f, 0.949219f, 0.955566f,
- 0.960449f, 0.966309f, 0.981445f, 0.977051f, 0.972168f, 0.968262f, 0.964355f, 0.960938f,
- 0.010445f, 0.032562f, 0.054657f, 0.078613f, 0.103333f, 0.128540f, 0.153564f, 0.181274f,
- 0.207520f, 0.234619f, 0.261475f, 0.288818f, 0.315674f, 0.342041f, 0.368408f, 0.394287f,
- 0.418945f, 0.443604f, 0.467773f, 0.490479f, 0.512695f, 0.534180f, 0.555664f, 0.575684f,
- 0.596191f, 0.616211f, 0.633301f, 0.651855f, 0.668457f, 0.685547f, 0.701172f, 0.714844f,
- 0.729492f, 0.743652f, 0.758301f, 0.770996f, 0.783203f, 0.794922f, 0.806641f, 0.817383f,
- 0.827637f, 0.838867f, 0.847656f, 0.857422f, 0.866699f, 0.875000f, 0.884277f, 0.892578f,
- 0.900391f, 0.907227f, 0.914551f, 0.922363f, 0.929199f, 0.935059f, 0.941895f, 0.948242f,
- 0.953125f, 0.959473f, 0.978516f, 0.974609f, 0.970215f, 0.966309f, 0.962402f, 0.958984f,
- 0.009117f, 0.027466f, 0.047424f, 0.067871f, 0.089783f, 0.112244f, 0.135376f, 0.159668f,
- 0.184082f, 0.209106f, 0.233887f, 0.259277f, 0.285400f, 0.311523f, 0.336182f, 0.360840f,
- 0.385986f, 0.410889f, 0.435059f, 0.458252f, 0.480713f, 0.503418f, 0.524902f, 0.546387f,
- 0.566895f, 0.586426f, 0.605469f, 0.624512f, 0.642578f, 0.659668f, 0.676758f, 0.692383f,
- 0.708008f, 0.722168f, 0.736816f, 0.749512f, 0.763184f, 0.776855f, 0.789062f, 0.800781f,
- 0.812012f, 0.823730f, 0.833496f, 0.843750f, 0.854004f, 0.863281f, 0.872559f, 0.880371f,
- 0.889648f, 0.896973f, 0.905762f, 0.912598f, 0.919922f, 0.927734f, 0.934082f, 0.940918f,
- 0.946289f, 0.952637f, 0.976074f, 0.972168f, 0.967773f, 0.963867f, 0.960938f, 0.957031f,
- 0.007561f, 0.024231f, 0.041077f, 0.059631f, 0.078369f, 0.098145f, 0.119507f, 0.140747f,
- 0.163208f, 0.185913f, 0.209839f, 0.233154f, 0.257324f, 0.281494f, 0.305908f, 0.330566f,
- 0.354736f, 0.378906f, 0.402588f, 0.425781f, 0.449219f, 0.471924f, 0.494385f, 0.516602f,
- 0.536621f, 0.557617f, 0.576660f, 0.596680f, 0.616211f, 0.632812f, 0.650879f, 0.668457f,
- 0.684082f, 0.700684f, 0.715332f, 0.729492f, 0.744141f, 0.757812f, 0.771973f, 0.783691f,
- 0.796387f, 0.807129f, 0.818359f, 0.829590f, 0.840820f, 0.850098f, 0.859375f, 0.868652f,
- 0.877930f, 0.886719f, 0.894531f, 0.903320f, 0.910645f, 0.918945f, 0.925781f, 0.932617f,
- 0.939453f, 0.945801f, 0.972656f, 0.969727f, 0.965820f, 0.961914f, 0.958496f, 0.955078f,
- 0.006832f, 0.020676f, 0.036224f, 0.051758f, 0.069214f, 0.086609f, 0.105225f, 0.124146f,
- 0.144653f, 0.165527f, 0.186646f, 0.209106f, 0.232178f, 0.254883f, 0.277588f, 0.301758f,
- 0.325195f, 0.348633f, 0.371826f, 0.395264f, 0.418213f, 0.440674f, 0.463135f, 0.485596f,
- 0.506348f, 0.527832f, 0.548340f, 0.567871f, 0.587891f, 0.606934f, 0.625977f, 0.642578f,
- 0.660645f, 0.677734f, 0.692871f, 0.708008f, 0.723633f, 0.737793f, 0.752441f, 0.765137f,
- 0.778320f, 0.791504f, 0.802734f, 0.814453f, 0.825684f, 0.835449f, 0.847168f, 0.856934f,
- 0.866699f, 0.875488f, 0.884766f, 0.893066f, 0.901367f, 0.910156f, 0.917480f, 0.924805f,
- 0.932129f, 0.938965f, 0.970215f, 0.966797f, 0.963379f, 0.959961f, 0.956543f, 0.953125f,
- 0.006050f, 0.018585f, 0.031860f, 0.045807f, 0.060883f, 0.076538f, 0.093323f, 0.109985f,
- 0.128174f, 0.147949f, 0.167480f, 0.186768f, 0.208496f, 0.230591f, 0.252441f, 0.274170f,
- 0.297363f, 0.319824f, 0.342773f, 0.365723f, 0.388672f, 0.411133f, 0.433350f, 0.455811f,
- 0.477295f, 0.498291f, 0.519531f, 0.539551f, 0.560059f, 0.580566f, 0.599121f, 0.617676f,
- 0.635254f, 0.653320f, 0.669434f, 0.686523f, 0.702148f, 0.717773f, 0.732422f, 0.747070f,
- 0.760742f, 0.773926f, 0.786621f, 0.798340f, 0.811035f, 0.822754f, 0.833008f, 0.843750f,
- 0.854004f, 0.863770f, 0.873047f, 0.882812f, 0.891602f, 0.900879f, 0.908691f, 0.916504f,
- 0.924316f, 0.931152f, 0.966309f, 0.964355f, 0.961426f, 0.957520f, 0.954102f, 0.951172f,
- 0.005352f, 0.016388f, 0.027985f, 0.040222f, 0.053436f, 0.067261f, 0.082520f, 0.098022f,
- 0.114319f, 0.131836f, 0.150146f, 0.167969f, 0.187744f, 0.208008f, 0.228271f, 0.249634f,
- 0.270996f, 0.292969f, 0.314697f, 0.337158f, 0.359375f, 0.380859f, 0.403809f, 0.426025f,
- 0.447510f, 0.469482f, 0.490967f, 0.511719f, 0.532227f, 0.552734f, 0.571777f, 0.591309f,
- 0.609375f, 0.628418f, 0.645508f, 0.663086f, 0.680664f, 0.696289f, 0.711426f, 0.727051f,
- 0.741699f, 0.755859f, 0.768555f, 0.782227f, 0.795410f, 0.807617f, 0.818359f, 0.830078f,
- 0.841309f, 0.851074f, 0.861816f, 0.871582f, 0.880859f, 0.890625f, 0.898438f, 0.907715f,
- 0.915527f, 0.923828f, 0.962402f, 0.961914f, 0.958496f, 0.955078f, 0.951172f, 0.948730f,
- 0.004700f, 0.014397f, 0.025208f, 0.035675f, 0.047485f, 0.060120f, 0.073242f, 0.087097f,
- 0.102173f, 0.117249f, 0.133789f, 0.150513f, 0.168823f, 0.186890f, 0.206665f, 0.225830f,
- 0.246216f, 0.267334f, 0.288574f, 0.309814f, 0.331299f, 0.353271f, 0.375244f, 0.396729f,
- 0.418701f, 0.440674f, 0.461182f, 0.483398f, 0.504883f, 0.524902f, 0.544434f, 0.564941f,
- 0.584473f, 0.603027f, 0.621582f, 0.639648f, 0.656738f, 0.673828f, 0.690430f, 0.705566f,
- 0.721680f, 0.736816f, 0.750977f, 0.764648f, 0.778809f, 0.791016f, 0.804688f, 0.815918f,
- 0.826660f, 0.838867f, 0.850098f, 0.860840f, 0.870605f, 0.879883f, 0.889648f, 0.898438f,
- 0.907227f, 0.915527f, 0.959961f, 0.958496f, 0.955078f, 0.952148f, 0.949219f, 0.946777f,
- 0.004238f, 0.013138f, 0.022202f, 0.031769f, 0.042358f, 0.053040f, 0.065613f, 0.077637f,
- 0.090759f, 0.104980f, 0.119995f, 0.135498f, 0.151855f, 0.167725f, 0.186646f, 0.205078f,
- 0.224121f, 0.243042f, 0.263672f, 0.283936f, 0.305176f, 0.326416f, 0.347168f, 0.369629f,
- 0.390625f, 0.411865f, 0.433350f, 0.454590f, 0.475830f, 0.497314f, 0.517578f, 0.537109f,
- 0.557617f, 0.577637f, 0.596191f, 0.615723f, 0.632812f, 0.651367f, 0.668945f, 0.685059f,
- 0.701172f, 0.716797f, 0.732422f, 0.747559f, 0.761230f, 0.775391f, 0.788574f, 0.800781f,
- 0.813965f, 0.824707f, 0.837402f, 0.848145f, 0.859375f, 0.869141f, 0.879395f, 0.889160f,
- 0.897949f, 0.906250f, 0.956055f, 0.955566f, 0.952148f, 0.950195f, 0.947266f, 0.943848f,
- 0.003944f, 0.011490f, 0.019943f, 0.028748f, 0.037964f, 0.047485f, 0.058014f, 0.069702f,
- 0.081360f, 0.093994f, 0.107361f, 0.121277f, 0.136353f, 0.151978f, 0.167480f, 0.185669f,
- 0.202637f, 0.222168f, 0.240601f, 0.259766f, 0.279541f, 0.300293f, 0.321533f, 0.342285f,
- 0.362549f, 0.384033f, 0.405762f, 0.427002f, 0.447998f, 0.469238f, 0.490479f, 0.510742f,
- 0.532227f, 0.551758f, 0.570312f, 0.589844f, 0.609375f, 0.628418f, 0.645508f, 0.662598f,
- 0.680664f, 0.696777f, 0.712402f, 0.728516f, 0.744141f, 0.757812f, 0.771973f, 0.785156f,
- 0.798828f, 0.811523f, 0.824707f, 0.835449f, 0.847168f, 0.858887f, 0.869141f, 0.878906f,
- 0.888672f, 0.897949f, 0.952148f, 0.952148f, 0.949219f, 0.946777f, 0.944336f, 0.941406f,
- 0.003448f, 0.010574f, 0.017807f, 0.025558f, 0.033875f, 0.042633f, 0.052307f, 0.062134f,
- 0.073059f, 0.084045f, 0.096375f, 0.109192f, 0.122803f, 0.136475f, 0.151367f, 0.167603f,
- 0.183960f, 0.201416f, 0.218506f, 0.237427f, 0.256104f, 0.275635f, 0.295410f, 0.315918f,
- 0.336426f, 0.357178f, 0.378906f, 0.399414f, 0.421143f, 0.442139f, 0.462891f, 0.484375f,
- 0.504883f, 0.524902f, 0.544922f, 0.564941f, 0.583984f, 0.603516f, 0.622070f, 0.640625f,
- 0.658691f, 0.675781f, 0.692871f, 0.709473f, 0.725098f, 0.740234f, 0.754883f, 0.769531f,
- 0.783203f, 0.796875f, 0.809570f, 0.823242f, 0.834473f, 0.846191f, 0.857422f, 0.868164f,
- 0.878906f, 0.889160f, 0.948730f, 0.948242f, 0.946289f, 0.944336f, 0.940918f, 0.938477f,
- 0.003017f, 0.009422f, 0.015900f, 0.023041f, 0.030380f, 0.038574f, 0.047150f, 0.055969f,
- 0.065735f, 0.075684f, 0.086426f, 0.098267f, 0.110535f, 0.123047f, 0.136841f, 0.151489f,
- 0.166138f, 0.182495f, 0.198975f, 0.216553f, 0.233765f, 0.252930f, 0.271484f, 0.291016f,
- 0.310547f, 0.331299f, 0.351562f, 0.372559f, 0.393555f, 0.415039f, 0.435059f, 0.457275f,
- 0.477539f, 0.498047f, 0.519043f, 0.538574f, 0.559570f, 0.579102f, 0.598633f, 0.617188f,
- 0.635742f, 0.654297f, 0.672363f, 0.688965f, 0.706055f, 0.721191f, 0.737793f, 0.752930f,
- 0.768066f, 0.782227f, 0.795898f, 0.809082f, 0.821289f, 0.833496f, 0.846191f, 0.857422f,
- 0.869141f, 0.879883f, 0.944824f, 0.945312f, 0.942871f, 0.940918f, 0.938477f, 0.936035f,
- 0.002802f, 0.008575f, 0.014763f, 0.020844f, 0.027557f, 0.034576f, 0.042084f, 0.050476f,
- 0.058990f, 0.067993f, 0.077942f, 0.087952f, 0.098999f, 0.111267f, 0.122803f, 0.136719f,
- 0.150269f, 0.165527f, 0.180542f, 0.196533f, 0.213257f, 0.230591f, 0.248779f, 0.267334f,
- 0.286865f, 0.306152f, 0.325928f, 0.346436f, 0.367188f, 0.387695f, 0.409424f, 0.429199f,
- 0.450195f, 0.471680f, 0.492920f, 0.513184f, 0.534180f, 0.553711f, 0.573730f, 0.593750f,
- 0.612793f, 0.631836f, 0.649414f, 0.668457f, 0.685059f, 0.703125f, 0.719238f, 0.735352f,
- 0.750000f, 0.766113f, 0.781738f, 0.794434f, 0.808105f, 0.821777f, 0.833984f, 0.846191f,
- 0.858398f, 0.870117f, 0.940918f, 0.941895f, 0.939941f, 0.937500f, 0.935059f, 0.932617f,
- 0.002573f, 0.007603f, 0.013100f, 0.018799f, 0.024719f, 0.031372f, 0.038147f, 0.045105f,
- 0.052795f, 0.061127f, 0.069519f, 0.079529f, 0.089355f, 0.099976f, 0.111084f, 0.123718f,
- 0.136353f, 0.148926f, 0.163574f, 0.178345f, 0.194214f, 0.210083f, 0.227783f, 0.245361f,
- 0.263672f, 0.282471f, 0.301758f, 0.321533f, 0.341797f, 0.361816f, 0.383057f, 0.403320f,
- 0.424316f, 0.445557f, 0.466797f, 0.487061f, 0.507812f, 0.528809f, 0.549805f, 0.569336f,
- 0.589844f, 0.608887f, 0.627930f, 0.646973f, 0.665527f, 0.682129f, 0.700195f, 0.717773f,
- 0.732910f, 0.749512f, 0.765137f, 0.779785f, 0.794434f, 0.808105f, 0.821777f, 0.834473f,
- 0.847168f, 0.859375f, 0.936523f, 0.937988f, 0.936035f, 0.933594f, 0.932129f, 0.929688f,
- 0.002409f, 0.007107f, 0.011833f, 0.017075f, 0.022278f, 0.028351f, 0.034088f, 0.040558f,
- 0.047943f, 0.055389f, 0.063232f, 0.072021f, 0.080322f, 0.090454f, 0.100220f, 0.111389f,
- 0.122986f, 0.135010f, 0.148438f, 0.162109f, 0.176270f, 0.191772f, 0.207642f, 0.224121f,
- 0.241699f, 0.259277f, 0.278076f, 0.297363f, 0.316650f, 0.336670f, 0.356934f, 0.377686f,
- 0.397949f, 0.418701f, 0.439941f, 0.461914f, 0.482178f, 0.502930f, 0.524414f, 0.544922f,
- 0.565918f, 0.585938f, 0.605957f, 0.625000f, 0.643066f, 0.662109f, 0.680176f, 0.698730f,
- 0.715820f, 0.731934f, 0.748047f, 0.764648f, 0.780273f, 0.794434f, 0.808594f, 0.821777f,
- 0.836914f, 0.848145f, 0.932129f, 0.934082f, 0.932617f, 0.930176f, 0.928711f, 0.926270f,
- 0.002066f, 0.006329f, 0.010986f, 0.015541f, 0.020294f, 0.025452f, 0.030975f, 0.037201f,
- 0.043152f, 0.049835f, 0.056824f, 0.064331f, 0.072998f, 0.081177f, 0.090637f, 0.100525f,
- 0.110718f, 0.122131f, 0.134033f, 0.146851f, 0.159912f, 0.173584f, 0.189331f, 0.204468f,
- 0.221191f, 0.237671f, 0.255615f, 0.273682f, 0.292969f, 0.312012f, 0.331543f, 0.352295f,
- 0.372314f, 0.393311f, 0.413818f, 0.435547f, 0.456055f, 0.477539f, 0.499023f, 0.520508f,
- 0.540039f, 0.561523f, 0.581543f, 0.602051f, 0.622070f, 0.641113f, 0.659668f, 0.678223f,
- 0.697266f, 0.714844f, 0.731445f, 0.748535f, 0.765137f, 0.778809f, 0.794922f, 0.810059f,
- 0.824219f, 0.837402f, 0.926758f, 0.930176f, 0.928711f, 0.926758f, 0.924805f, 0.922852f,
- 0.001840f, 0.005703f, 0.009918f, 0.014099f, 0.018311f, 0.023026f, 0.028000f, 0.033508f,
- 0.038971f, 0.045044f, 0.051880f, 0.058289f, 0.065796f, 0.073425f, 0.081482f, 0.090698f,
- 0.100464f, 0.110413f, 0.121216f, 0.132812f, 0.145142f, 0.158203f, 0.171997f, 0.186401f,
- 0.201538f, 0.217651f, 0.234497f, 0.251465f, 0.269287f, 0.288330f, 0.307129f, 0.327148f,
- 0.346924f, 0.367920f, 0.388428f, 0.409668f, 0.430420f, 0.451416f, 0.474121f, 0.494873f,
- 0.516113f, 0.537598f, 0.558105f, 0.579102f, 0.598633f, 0.619629f, 0.639160f, 0.657715f,
- 0.677734f, 0.695801f, 0.713867f, 0.731934f, 0.748047f, 0.764160f, 0.781738f, 0.796875f,
- 0.810547f, 0.826172f, 0.922363f, 0.925781f, 0.924805f, 0.922852f, 0.921387f, 0.919434f,
- 0.001621f, 0.005188f, 0.008888f, 0.012939f, 0.016724f, 0.021271f, 0.025772f, 0.029984f,
- 0.035553f, 0.040741f, 0.046417f, 0.052490f, 0.059265f, 0.066528f, 0.074097f, 0.081482f,
- 0.090271f, 0.100220f, 0.109741f, 0.120178f, 0.131226f, 0.143188f, 0.156006f, 0.169189f,
- 0.183716f, 0.198486f, 0.214233f, 0.230713f, 0.247925f, 0.265381f, 0.284424f, 0.303711f,
- 0.322754f, 0.342773f, 0.363525f, 0.384277f, 0.405518f, 0.427002f, 0.447754f, 0.469727f,
- 0.491455f, 0.512207f, 0.534180f, 0.554688f, 0.576172f, 0.597168f, 0.617188f, 0.636719f,
- 0.657227f, 0.677734f, 0.695312f, 0.713379f, 0.731934f, 0.749512f, 0.766113f, 0.782715f,
- 0.798340f, 0.813477f, 0.917480f, 0.920898f, 0.920410f, 0.919922f, 0.916992f, 0.915039f,
- 0.001581f, 0.004616f, 0.008049f, 0.011917f, 0.015556f, 0.019547f, 0.023270f, 0.027908f,
- 0.031860f, 0.036652f, 0.041992f, 0.047577f, 0.053528f, 0.060150f, 0.066772f, 0.073914f,
- 0.082153f, 0.090088f, 0.099304f, 0.108887f, 0.118835f, 0.129517f, 0.141357f, 0.154297f,
- 0.166992f, 0.180908f, 0.195557f, 0.210815f, 0.227173f, 0.244141f, 0.261963f, 0.279785f,
- 0.299072f, 0.318359f, 0.338379f, 0.358887f, 0.380127f, 0.401123f, 0.422607f, 0.443848f,
- 0.466309f, 0.487793f, 0.509277f, 0.530762f, 0.553223f, 0.573730f, 0.594727f, 0.616699f,
- 0.636719f, 0.656250f, 0.676270f, 0.695801f, 0.713867f, 0.733398f, 0.750488f, 0.767090f,
- 0.784180f, 0.801270f, 0.912598f, 0.916992f, 0.916504f, 0.914551f, 0.913086f, 0.911133f,
- 0.001476f, 0.004410f, 0.007374f, 0.010620f, 0.013931f, 0.017258f, 0.021057f, 0.024979f,
- 0.029144f, 0.033478f, 0.037872f, 0.042969f, 0.048737f, 0.053986f, 0.060150f, 0.066895f,
- 0.074036f, 0.081665f, 0.089417f, 0.098083f, 0.107361f, 0.117371f, 0.127930f, 0.139648f,
- 0.151489f, 0.164062f, 0.178589f, 0.192627f, 0.208130f, 0.223755f, 0.240601f, 0.258057f,
- 0.275879f, 0.295654f, 0.314697f, 0.334961f, 0.354980f, 0.375977f, 0.396729f, 0.418945f,
- 0.440430f, 0.462402f, 0.484619f, 0.506348f, 0.528809f, 0.550781f, 0.572266f, 0.593750f,
- 0.615234f, 0.637207f, 0.656738f, 0.676758f, 0.696289f, 0.716309f, 0.734863f, 0.752930f,
- 0.770508f, 0.788574f, 0.906738f, 0.911621f, 0.912109f, 0.910156f, 0.908691f, 0.907227f,
- 0.001204f, 0.003998f, 0.006786f, 0.009850f, 0.012642f, 0.015762f, 0.019226f, 0.022751f,
- 0.026749f, 0.030502f, 0.034698f, 0.038940f, 0.044006f, 0.048615f, 0.054352f, 0.060608f,
- 0.066711f, 0.073059f, 0.080505f, 0.088318f, 0.097290f, 0.105835f, 0.115845f, 0.126343f,
- 0.137085f, 0.148804f, 0.161377f, 0.175049f, 0.189331f, 0.204346f, 0.219604f, 0.236816f,
- 0.253662f, 0.272217f, 0.291260f, 0.310547f, 0.330811f, 0.350830f, 0.372314f, 0.393799f,
- 0.415771f, 0.437500f, 0.459717f, 0.481934f, 0.504883f, 0.527344f, 0.549316f, 0.571777f,
- 0.593750f, 0.615723f, 0.636230f, 0.657715f, 0.678223f, 0.697754f, 0.718262f, 0.737793f,
- 0.756348f, 0.774902f, 0.900879f, 0.907227f, 0.906738f, 0.905762f, 0.904297f, 0.902832f,
- 0.001290f, 0.003807f, 0.006207f, 0.008652f, 0.011368f, 0.014618f, 0.017792f, 0.020813f,
- 0.023849f, 0.027588f, 0.031036f, 0.035400f, 0.039917f, 0.044250f, 0.049408f, 0.054321f,
- 0.059937f, 0.065918f, 0.072937f, 0.079773f, 0.087463f, 0.095703f, 0.104553f, 0.113892f,
- 0.124146f, 0.134888f, 0.146606f, 0.159058f, 0.171753f, 0.185913f, 0.201416f, 0.216309f,
- 0.232910f, 0.250000f, 0.268555f, 0.287354f, 0.306885f, 0.326904f, 0.347412f, 0.369141f,
- 0.390381f, 0.412842f, 0.434570f, 0.457764f, 0.479736f, 0.502930f, 0.525879f, 0.547852f,
- 0.570801f, 0.592773f, 0.615723f, 0.637207f, 0.659180f, 0.680176f, 0.700684f, 0.720703f,
- 0.740234f, 0.759766f, 0.895996f, 0.901855f, 0.901855f, 0.900879f, 0.899414f, 0.897949f,
- 0.001030f, 0.003561f, 0.005718f, 0.008301f, 0.010582f, 0.013283f, 0.015839f, 0.018753f,
- 0.022156f, 0.025314f, 0.028427f, 0.032318f, 0.035889f, 0.040039f, 0.044434f, 0.048737f,
- 0.054077f, 0.059723f, 0.065613f, 0.072083f, 0.079224f, 0.086426f, 0.094238f, 0.102966f,
- 0.111938f, 0.122253f, 0.132568f, 0.143555f, 0.155884f, 0.168945f, 0.182861f, 0.197510f,
- 0.213379f, 0.229492f, 0.246948f, 0.264648f, 0.283203f, 0.303467f, 0.322998f, 0.343994f,
- 0.365479f, 0.387451f, 0.409912f, 0.432129f, 0.455078f, 0.478760f, 0.501465f, 0.523926f,
- 0.547852f, 0.570801f, 0.593750f, 0.616211f, 0.639160f, 0.661133f, 0.682617f, 0.703613f,
- 0.725098f, 0.745117f, 0.888672f, 0.896484f, 0.896973f, 0.895020f, 0.895508f, 0.893555f,
- 0.001051f, 0.002956f, 0.005398f, 0.007523f, 0.009613f, 0.012024f, 0.014725f, 0.017059f,
- 0.019714f, 0.022537f, 0.025681f, 0.029236f, 0.032715f, 0.036102f, 0.040100f, 0.043945f,
- 0.048859f, 0.053772f, 0.058838f, 0.064880f, 0.070862f, 0.077576f, 0.084839f, 0.092712f,
- 0.101013f, 0.110229f, 0.119446f, 0.130005f, 0.141113f, 0.153198f, 0.166016f, 0.179565f,
- 0.193970f, 0.209351f, 0.225830f, 0.242920f, 0.261230f, 0.280273f, 0.299316f, 0.320068f,
- 0.341309f, 0.363037f, 0.384521f, 0.407227f, 0.429443f, 0.453369f, 0.477051f, 0.500977f,
- 0.524414f, 0.547852f, 0.571777f, 0.595215f, 0.619141f, 0.641602f, 0.664062f, 0.686035f,
- 0.707520f, 0.729004f, 0.882812f, 0.891602f, 0.891113f, 0.890625f, 0.889160f, 0.888184f,
- 0.000934f, 0.002998f, 0.004883f, 0.006859f, 0.009102f, 0.010925f, 0.012871f, 0.015656f,
- 0.017853f, 0.020767f, 0.023422f, 0.026413f, 0.029251f, 0.032593f, 0.036011f, 0.039825f,
- 0.044495f, 0.048645f, 0.053284f, 0.058258f, 0.063782f, 0.069885f, 0.076111f, 0.083313f,
- 0.090881f, 0.099060f, 0.107788f, 0.117126f, 0.127075f, 0.138428f, 0.150391f, 0.162720f,
- 0.176270f, 0.190796f, 0.206177f, 0.222290f, 0.239624f, 0.257568f, 0.276367f, 0.296387f,
- 0.316895f, 0.338623f, 0.360352f, 0.382812f, 0.404785f, 0.428467f, 0.452148f, 0.476562f,
- 0.500488f, 0.524902f, 0.548828f, 0.572754f, 0.597168f, 0.621094f, 0.644531f, 0.667480f,
- 0.689941f, 0.712402f, 0.875977f, 0.883789f, 0.884766f, 0.884766f, 0.883301f, 0.883789f,
- 0.001108f, 0.002474f, 0.004707f, 0.006248f, 0.007744f, 0.009888f, 0.011787f, 0.014244f,
- 0.016205f, 0.018631f, 0.021286f, 0.023758f, 0.026535f, 0.029510f, 0.032654f, 0.035919f,
- 0.039825f, 0.043762f, 0.047852f, 0.052368f, 0.057373f, 0.062561f, 0.068604f, 0.074707f,
- 0.081360f, 0.088623f, 0.096802f, 0.105103f, 0.114624f, 0.124573f, 0.135498f, 0.147217f,
- 0.159424f, 0.172729f, 0.187378f, 0.202881f, 0.219116f, 0.235962f, 0.254639f, 0.273438f,
- 0.293945f, 0.314453f, 0.335449f, 0.358154f, 0.380371f, 0.403564f, 0.428223f, 0.452148f,
- 0.476074f, 0.500977f, 0.525879f, 0.550293f, 0.575195f, 0.599609f, 0.625000f, 0.649414f,
- 0.672852f, 0.695801f, 0.870117f, 0.879395f, 0.879883f, 0.879395f, 0.878906f, 0.877441f,
- 0.000877f, 0.002495f, 0.003918f, 0.005669f, 0.007484f, 0.009148f, 0.010895f, 0.012634f,
- 0.014717f, 0.017014f, 0.019302f, 0.021347f, 0.023849f, 0.026443f, 0.029388f, 0.032532f,
- 0.035492f, 0.039185f, 0.042816f, 0.046906f, 0.051453f, 0.056122f, 0.061310f, 0.066895f,
- 0.072937f, 0.079590f, 0.086548f, 0.094360f, 0.103027f, 0.111938f, 0.121643f, 0.132568f,
- 0.144043f, 0.156006f, 0.169434f, 0.184204f, 0.199341f, 0.215698f, 0.233032f, 0.251221f,
- 0.269531f, 0.290039f, 0.311768f, 0.333740f, 0.355957f, 0.379395f, 0.402344f, 0.426758f,
- 0.451172f, 0.476562f, 0.501465f, 0.526855f, 0.552246f, 0.578613f, 0.603516f, 0.629395f,
- 0.653809f, 0.679199f, 0.863281f, 0.872559f, 0.874023f, 0.873535f, 0.872559f, 0.871094f,
- 0.000779f, 0.002241f, 0.003813f, 0.005371f, 0.006763f, 0.008186f, 0.009827f, 0.011574f,
- 0.013260f, 0.015274f, 0.017303f, 0.019119f, 0.021362f, 0.023972f, 0.026505f, 0.029144f,
- 0.031860f, 0.035126f, 0.038422f, 0.041809f, 0.045929f, 0.050323f, 0.054840f, 0.059631f,
- 0.065002f, 0.070984f, 0.077759f, 0.084656f, 0.091736f, 0.100037f, 0.109436f, 0.118835f,
- 0.129272f, 0.140625f, 0.152832f, 0.166138f, 0.180786f, 0.195679f, 0.211914f, 0.229736f,
- 0.247803f, 0.267822f, 0.287598f, 0.309326f, 0.331055f, 0.354492f, 0.377686f, 0.401855f,
- 0.426270f, 0.451660f, 0.477051f, 0.503418f, 0.529785f, 0.555664f, 0.583008f, 0.608887f,
- 0.635254f, 0.661133f, 0.855957f, 0.865234f, 0.866699f, 0.867188f, 0.866211f, 0.865723f,
- 0.000778f, 0.002155f, 0.003584f, 0.004871f, 0.006149f, 0.007519f, 0.008858f, 0.010498f,
- 0.012100f, 0.013977f, 0.015511f, 0.017303f, 0.019363f, 0.021515f, 0.023880f, 0.026230f,
- 0.028564f, 0.031555f, 0.034241f, 0.037476f, 0.041138f, 0.044983f, 0.048859f, 0.053436f,
- 0.058014f, 0.063232f, 0.069214f, 0.075195f, 0.081848f, 0.089417f, 0.097168f, 0.106201f,
- 0.115479f, 0.126343f, 0.137695f, 0.149658f, 0.162476f, 0.177002f, 0.192993f, 0.209473f,
- 0.226440f, 0.245239f, 0.264404f, 0.285156f, 0.306885f, 0.330078f, 0.353271f, 0.376465f,
- 0.402100f, 0.426758f, 0.453857f, 0.479492f, 0.505859f, 0.532715f, 0.560547f, 0.587402f,
- 0.614258f, 0.640137f, 0.847168f, 0.858398f, 0.860352f, 0.859863f, 0.859863f, 0.858887f,
- 0.000673f, 0.002026f, 0.003120f, 0.004242f, 0.005390f, 0.006874f, 0.008087f, 0.009346f,
- 0.011192f, 0.012642f, 0.013855f, 0.015511f, 0.017502f, 0.019394f, 0.021301f, 0.023331f,
- 0.025681f, 0.028137f, 0.030792f, 0.033295f, 0.036804f, 0.039917f, 0.043488f, 0.047363f,
- 0.051880f, 0.056580f, 0.061646f, 0.066956f, 0.072998f, 0.079407f, 0.086609f, 0.094971f,
- 0.103027f, 0.112793f, 0.122742f, 0.134399f, 0.146118f, 0.159058f, 0.173828f, 0.188599f,
- 0.205444f, 0.223633f, 0.241943f, 0.262451f, 0.283203f, 0.304932f, 0.328369f, 0.352051f,
- 0.376953f, 0.402100f, 0.428467f, 0.454834f, 0.481934f, 0.509766f, 0.537598f, 0.566406f,
- 0.594238f, 0.622559f, 0.838867f, 0.852051f, 0.853516f, 0.853027f, 0.853027f, 0.852051f,
- 0.000419f, 0.001721f, 0.003044f, 0.003881f, 0.005161f, 0.006329f, 0.007500f, 0.009117f,
- 0.009941f, 0.011147f, 0.013023f, 0.014053f, 0.015869f, 0.017181f, 0.018906f, 0.020889f,
- 0.023026f, 0.025085f, 0.027435f, 0.029724f, 0.032440f, 0.035492f, 0.038605f, 0.042175f,
- 0.045898f, 0.049988f, 0.054504f, 0.059143f, 0.064697f, 0.070435f, 0.076721f, 0.083984f,
- 0.091675f, 0.100037f, 0.109009f, 0.119629f, 0.130737f, 0.143066f, 0.156250f, 0.170654f,
- 0.186157f, 0.202393f, 0.220825f, 0.239990f, 0.259521f, 0.281250f, 0.303467f, 0.327148f,
- 0.351318f, 0.376953f, 0.402832f, 0.430664f, 0.458252f, 0.485596f, 0.514648f, 0.543457f,
- 0.572754f, 0.602051f, 0.830566f, 0.844238f, 0.845703f, 0.845703f, 0.845703f, 0.845215f,
- 0.000503f, 0.001644f, 0.002455f, 0.003765f, 0.004906f, 0.005901f, 0.006805f, 0.007744f,
- 0.008789f, 0.009972f, 0.011314f, 0.012688f, 0.014160f, 0.015480f, 0.016953f, 0.018555f,
- 0.020325f, 0.022232f, 0.024338f, 0.026535f, 0.028717f, 0.031403f, 0.034119f, 0.037384f,
- 0.040680f, 0.044128f, 0.047943f, 0.052551f, 0.057098f, 0.062134f, 0.067871f, 0.074158f,
- 0.081543f, 0.088684f, 0.097107f, 0.106262f, 0.116028f, 0.127563f, 0.139404f, 0.152344f,
- 0.167358f, 0.182739f, 0.199951f, 0.217773f, 0.237427f, 0.257812f, 0.279541f, 0.303223f,
- 0.327148f, 0.351807f, 0.377441f, 0.405518f, 0.433105f, 0.460449f, 0.491211f, 0.520020f,
- 0.550293f, 0.581543f, 0.821777f, 0.835938f, 0.837891f, 0.838867f, 0.838867f, 0.837891f,
- 0.000649f, 0.001432f, 0.002455f, 0.003469f, 0.004162f, 0.005192f, 0.006046f, 0.007053f,
- 0.007919f, 0.009148f, 0.010185f, 0.011490f, 0.012558f, 0.013748f, 0.015083f, 0.016663f,
- 0.018341f, 0.019897f, 0.021561f, 0.023376f, 0.025513f, 0.027725f, 0.030075f, 0.032745f,
- 0.035583f, 0.038544f, 0.041901f, 0.045898f, 0.049896f, 0.054443f, 0.059784f, 0.065186f,
- 0.071228f, 0.078247f, 0.085632f, 0.093872f, 0.103088f, 0.113098f, 0.123840f, 0.135986f,
- 0.148682f, 0.163696f, 0.179321f, 0.196533f, 0.214722f, 0.234985f, 0.256104f, 0.278320f,
- 0.302246f, 0.326660f, 0.352783f, 0.379395f, 0.406738f, 0.436279f, 0.465820f, 0.496338f,
- 0.527344f, 0.559082f, 0.813477f, 0.827148f, 0.829590f, 0.830566f, 0.830566f, 0.829590f,
- 0.000427f, 0.001431f, 0.002077f, 0.002947f, 0.004009f, 0.004860f, 0.005501f, 0.006416f,
- 0.007008f, 0.008171f, 0.009155f, 0.010063f, 0.011154f, 0.012474f, 0.013336f, 0.014793f,
- 0.016006f, 0.017471f, 0.019119f, 0.020630f, 0.022079f, 0.024078f, 0.026505f, 0.028687f,
- 0.031128f, 0.033813f, 0.036804f, 0.040283f, 0.043732f, 0.047882f, 0.052094f, 0.057281f,
- 0.062500f, 0.068726f, 0.075012f, 0.082581f, 0.090393f, 0.099487f, 0.109375f, 0.120728f,
- 0.131958f, 0.145508f, 0.160278f, 0.176025f, 0.193848f, 0.212891f, 0.232788f, 0.253906f,
- 0.277344f, 0.302002f, 0.327637f, 0.354248f, 0.382080f, 0.411621f, 0.441162f, 0.472656f,
- 0.504395f, 0.536621f, 0.803223f, 0.818359f, 0.821777f, 0.821777f, 0.822266f, 0.821777f,
- 0.000574f, 0.001416f, 0.001961f, 0.002621f, 0.003527f, 0.004250f, 0.004894f, 0.005653f,
- 0.006340f, 0.007263f, 0.008255f, 0.008965f, 0.009819f, 0.010857f, 0.011864f, 0.012917f,
- 0.014114f, 0.015358f, 0.016678f, 0.018005f, 0.019669f, 0.021347f, 0.023239f, 0.025070f,
- 0.027267f, 0.029434f, 0.032318f, 0.035156f, 0.038269f, 0.041534f, 0.045624f, 0.049469f,
- 0.054321f, 0.059479f, 0.065369f, 0.071655f, 0.078857f, 0.086853f, 0.095886f, 0.105652f,
- 0.116943f, 0.128662f, 0.142090f, 0.156860f, 0.173096f, 0.190918f, 0.210327f, 0.231201f,
- 0.253418f, 0.277100f, 0.302490f, 0.328369f, 0.356445f, 0.385254f, 0.415771f, 0.446533f,
- 0.479736f, 0.513184f, 0.794434f, 0.810547f, 0.812500f, 0.813477f, 0.812988f, 0.813477f,
- 0.000417f, 0.001152f, 0.002066f, 0.002480f, 0.003115f, 0.003778f, 0.004543f, 0.005001f,
- 0.005936f, 0.006420f, 0.007130f, 0.007881f, 0.008789f, 0.009666f, 0.010605f, 0.011276f,
- 0.012352f, 0.013367f, 0.014626f, 0.015732f, 0.017090f, 0.018509f, 0.020096f, 0.021759f,
- 0.023895f, 0.025681f, 0.027740f, 0.030121f, 0.032776f, 0.036011f, 0.039276f, 0.042694f,
- 0.046906f, 0.051575f, 0.056488f, 0.061951f, 0.068481f, 0.075684f, 0.083191f, 0.092102f,
- 0.101990f, 0.112915f, 0.125122f, 0.138672f, 0.153564f, 0.170410f, 0.188477f, 0.208008f,
- 0.229980f, 0.252441f, 0.276855f, 0.303711f, 0.331055f, 0.360596f, 0.391357f, 0.422607f,
- 0.456299f, 0.490234f, 0.783203f, 0.799805f, 0.803223f, 0.804688f, 0.804199f, 0.805176f,
- 0.000422f, 0.000885f, 0.001743f, 0.002075f, 0.002930f, 0.003460f, 0.004105f, 0.004696f,
- 0.005257f, 0.005753f, 0.006550f, 0.006916f, 0.007805f, 0.008308f, 0.009109f, 0.010056f,
- 0.010918f, 0.011627f, 0.012787f, 0.013725f, 0.014732f, 0.016113f, 0.017319f, 0.018906f,
- 0.020264f, 0.022324f, 0.023911f, 0.026230f, 0.028183f, 0.030884f, 0.033661f, 0.036865f,
- 0.040314f, 0.044189f, 0.048615f, 0.053284f, 0.058838f, 0.065491f, 0.072205f, 0.079651f,
- 0.088379f, 0.098389f, 0.109314f, 0.121765f, 0.135010f, 0.150513f, 0.167358f, 0.186035f,
- 0.206543f, 0.228516f, 0.252197f, 0.278320f, 0.305176f, 0.333496f, 0.364746f, 0.396973f,
- 0.430176f, 0.465820f, 0.772949f, 0.790527f, 0.794434f, 0.794922f, 0.795410f, 0.794922f,
- 0.000211f, 0.000970f, 0.001484f, 0.002035f, 0.002586f, 0.003040f, 0.003540f, 0.004086f,
- 0.004696f, 0.005016f, 0.005508f, 0.006100f, 0.006763f, 0.007401f, 0.008011f, 0.008675f,
- 0.009247f, 0.010071f, 0.011009f, 0.011940f, 0.012802f, 0.013870f, 0.014771f, 0.016281f,
- 0.017487f, 0.018890f, 0.020584f, 0.022171f, 0.024200f, 0.026505f, 0.028870f, 0.031372f,
- 0.034363f, 0.037659f, 0.041412f, 0.045685f, 0.050262f, 0.055664f, 0.061768f, 0.068359f,
- 0.076172f, 0.084717f, 0.094666f, 0.105835f, 0.117798f, 0.131958f, 0.147095f, 0.164795f,
- 0.184326f, 0.204956f, 0.228271f, 0.253174f, 0.279785f, 0.307861f, 0.338379f, 0.370361f,
- 0.404785f, 0.440430f, 0.761230f, 0.780273f, 0.783691f, 0.785645f, 0.786133f, 0.785156f,
- 0.000281f, 0.000954f, 0.001275f, 0.001745f, 0.002159f, 0.002810f, 0.003002f, 0.003622f,
- 0.003918f, 0.004471f, 0.004776f, 0.005352f, 0.005852f, 0.006298f, 0.006989f, 0.007339f,
- 0.008087f, 0.008698f, 0.009499f, 0.010208f, 0.010986f, 0.011871f, 0.012802f, 0.013809f,
- 0.014923f, 0.016129f, 0.017624f, 0.018753f, 0.020645f, 0.022156f, 0.024399f, 0.026382f,
- 0.029037f, 0.031769f, 0.034851f, 0.038513f, 0.042542f, 0.047180f, 0.052063f, 0.058136f,
- 0.064819f, 0.072205f, 0.080933f, 0.090698f, 0.101685f, 0.114441f, 0.128784f, 0.144287f,
- 0.162476f, 0.182617f, 0.203979f, 0.228149f, 0.253906f, 0.282227f, 0.312744f, 0.344482f,
- 0.378418f, 0.415039f, 0.749023f, 0.770020f, 0.773438f, 0.774902f, 0.775391f, 0.776367f,
- 0.000200f, 0.000790f, 0.001209f, 0.001475f, 0.002022f, 0.002375f, 0.002754f, 0.003136f,
- 0.003532f, 0.003851f, 0.004253f, 0.004719f, 0.004864f, 0.005455f, 0.005749f, 0.006435f,
- 0.007053f, 0.007557f, 0.007988f, 0.008614f, 0.009216f, 0.010101f, 0.010712f, 0.011604f,
- 0.012596f, 0.013588f, 0.014877f, 0.016052f, 0.017334f, 0.018753f, 0.020401f, 0.022415f,
- 0.024338f, 0.026642f, 0.029282f, 0.032196f, 0.035461f, 0.039215f, 0.043854f, 0.048706f,
- 0.054413f, 0.060913f, 0.068237f, 0.076965f, 0.086792f, 0.097961f, 0.110657f, 0.125488f,
- 0.141846f, 0.160278f, 0.180542f, 0.203857f, 0.229004f, 0.256348f, 0.286133f, 0.317627f,
- 0.351807f, 0.388184f, 0.737305f, 0.757812f, 0.762695f, 0.763672f, 0.764160f, 0.764648f,
- 0.000214f, 0.000700f, 0.001134f, 0.001480f, 0.001724f, 0.002056f, 0.002468f, 0.002672f,
- 0.003069f, 0.003412f, 0.003618f, 0.003883f, 0.004265f, 0.004627f, 0.004971f, 0.005508f,
- 0.005817f, 0.006397f, 0.006866f, 0.007244f, 0.007812f, 0.008446f, 0.009003f, 0.009872f,
- 0.010544f, 0.011345f, 0.012375f, 0.013321f, 0.014275f, 0.015587f, 0.017075f, 0.018372f,
- 0.020050f, 0.022186f, 0.024246f, 0.026596f, 0.029388f, 0.032562f, 0.036285f, 0.040344f,
- 0.045197f, 0.050568f, 0.056946f, 0.064514f, 0.072876f, 0.082886f, 0.093933f, 0.107056f,
- 0.122070f, 0.139404f, 0.158325f, 0.180176f, 0.204590f, 0.231201f, 0.260010f, 0.290771f,
- 0.325195f, 0.361816f, 0.726074f, 0.747070f, 0.751465f, 0.753418f, 0.753906f, 0.754395f,
- 0.000187f, 0.000637f, 0.001095f, 0.001133f, 0.001488f, 0.001872f, 0.002007f, 0.002253f,
- 0.002590f, 0.002880f, 0.003010f, 0.003420f, 0.003593f, 0.003914f, 0.004322f, 0.004650f,
- 0.005051f, 0.005424f, 0.005733f, 0.006134f, 0.006683f, 0.007183f, 0.007671f, 0.008072f,
- 0.008720f, 0.009483f, 0.010201f, 0.011070f, 0.011871f, 0.012863f, 0.013924f, 0.015167f,
- 0.016434f, 0.018143f, 0.019669f, 0.021851f, 0.024109f, 0.026749f, 0.029587f, 0.033020f,
- 0.037109f, 0.041718f, 0.047119f, 0.053192f, 0.060516f, 0.068848f, 0.078857f, 0.090149f,
- 0.104004f, 0.119202f, 0.136841f, 0.157471f, 0.180420f, 0.205322f, 0.234009f, 0.264648f,
- 0.297852f, 0.335449f, 0.711914f, 0.735352f, 0.740234f, 0.741211f, 0.742676f, 0.742676f,
- 0.000201f, 0.000676f, 0.000884f, 0.001044f, 0.001369f, 0.001633f, 0.001786f, 0.002001f,
- 0.002237f, 0.002460f, 0.002680f, 0.002777f, 0.003117f, 0.003408f, 0.003632f, 0.003910f,
- 0.004211f, 0.004375f, 0.004772f, 0.005226f, 0.005520f, 0.005909f, 0.006302f, 0.006882f,
- 0.007385f, 0.007858f, 0.008553f, 0.008919f, 0.009827f, 0.010582f, 0.011398f, 0.012520f,
- 0.013611f, 0.014725f, 0.016190f, 0.017593f, 0.019424f, 0.021622f, 0.023941f, 0.026703f,
- 0.029938f, 0.033539f, 0.038055f, 0.043243f, 0.049408f, 0.056519f, 0.065002f, 0.074951f,
- 0.086548f, 0.100403f, 0.116394f, 0.135132f, 0.156860f, 0.181030f, 0.208252f, 0.238281f,
- 0.271240f, 0.307861f, 0.698730f, 0.722656f, 0.727539f, 0.729980f, 0.730957f, 0.730469f,
- 0.000185f, 0.000371f, 0.000784f, 0.001028f, 0.001153f, 0.001304f, 0.001567f, 0.001792f,
- 0.001790f, 0.002028f, 0.002283f, 0.002424f, 0.002640f, 0.002764f, 0.003044f, 0.003313f,
- 0.003445f, 0.003748f, 0.004044f, 0.004337f, 0.004677f, 0.004879f, 0.005207f, 0.005661f,
- 0.006027f, 0.006481f, 0.006870f, 0.007454f, 0.007874f, 0.008583f, 0.009239f, 0.009880f,
- 0.010849f, 0.011871f, 0.012833f, 0.014153f, 0.015656f, 0.017151f, 0.018967f, 0.021118f,
- 0.023621f, 0.026703f, 0.030197f, 0.034576f, 0.039368f, 0.045441f, 0.052460f, 0.061157f,
- 0.070862f, 0.083069f, 0.097290f, 0.114441f, 0.134155f, 0.157104f, 0.182983f, 0.212158f,
- 0.244507f, 0.281250f, 0.684570f, 0.710449f, 0.715332f, 0.717285f, 0.717773f, 0.718750f,
- 0.000109f, 0.000455f, 0.000558f, 0.000757f, 0.000986f, 0.001166f, 0.001298f, 0.001310f,
- 0.001566f, 0.001614f, 0.001852f, 0.001933f, 0.002062f, 0.002327f, 0.002571f, 0.002699f,
- 0.002909f, 0.003057f, 0.003254f, 0.003496f, 0.003643f, 0.004066f, 0.004295f, 0.004665f,
- 0.004822f, 0.005161f, 0.005722f, 0.006008f, 0.006424f, 0.006897f, 0.007435f, 0.008049f,
- 0.008789f, 0.009529f, 0.010284f, 0.011177f, 0.012321f, 0.013466f, 0.014885f, 0.016586f,
- 0.018417f, 0.020844f, 0.023575f, 0.026810f, 0.030655f, 0.035400f, 0.041412f, 0.048462f,
- 0.056976f, 0.067322f, 0.079712f, 0.094543f, 0.112610f, 0.133789f, 0.158691f, 0.186279f,
- 0.217896f, 0.253418f, 0.670898f, 0.696777f, 0.702148f, 0.704590f, 0.705078f, 0.705566f,
- 0.000000f, 0.000317f, 0.000556f, 0.000619f, 0.000759f, 0.000889f, 0.001012f, 0.001163f,
- 0.001282f, 0.001353f, 0.001531f, 0.001621f, 0.001681f, 0.001862f, 0.001976f, 0.002140f,
- 0.002392f, 0.002502f, 0.002745f, 0.002838f, 0.003019f, 0.003311f, 0.003477f, 0.003639f,
- 0.003889f, 0.004166f, 0.004429f, 0.004784f, 0.005119f, 0.005547f, 0.006042f, 0.006317f,
- 0.006901f, 0.007442f, 0.008110f, 0.008751f, 0.009583f, 0.010590f, 0.011566f, 0.012894f,
- 0.014404f, 0.015930f, 0.018158f, 0.020569f, 0.023697f, 0.027374f, 0.031830f, 0.037567f,
- 0.044434f, 0.053009f, 0.063599f, 0.076538f, 0.092346f, 0.111511f, 0.134521f, 0.161133f,
- 0.191772f, 0.227173f, 0.654297f, 0.684082f, 0.687988f, 0.690918f, 0.691895f, 0.691895f,
- 0.000000f, 0.000275f, 0.000368f, 0.000572f, 0.000683f, 0.000731f, 0.000877f, 0.000979f,
- 0.001039f, 0.001091f, 0.001234f, 0.001332f, 0.001447f, 0.001547f, 0.001601f, 0.001760f,
- 0.001790f, 0.002007f, 0.002119f, 0.002245f, 0.002493f, 0.002565f, 0.002747f, 0.002920f,
- 0.003168f, 0.003235f, 0.003551f, 0.003830f, 0.004040f, 0.004368f, 0.004658f, 0.005001f,
- 0.005337f, 0.005798f, 0.006287f, 0.006794f, 0.007488f, 0.008087f, 0.008865f, 0.009773f,
- 0.010963f, 0.012199f, 0.013649f, 0.015610f, 0.017822f, 0.020493f, 0.023849f, 0.028320f,
- 0.033752f, 0.040466f, 0.049377f, 0.060028f, 0.073853f, 0.090698f, 0.111572f, 0.136841f,
- 0.166016f, 0.199341f, 0.640137f, 0.667969f, 0.675781f, 0.676758f, 0.678223f, 0.678223f,
- 0.000017f, 0.000193f, 0.000383f, 0.000487f, 0.000586f, 0.000597f, 0.000618f, 0.000733f,
- 0.000826f, 0.000863f, 0.000902f, 0.001037f, 0.001121f, 0.001244f, 0.001342f, 0.001329f,
- 0.001514f, 0.001506f, 0.001719f, 0.001793f, 0.001851f, 0.002016f, 0.002182f, 0.002281f,
- 0.002432f, 0.002554f, 0.002708f, 0.002859f, 0.003168f, 0.003344f, 0.003563f, 0.003845f,
- 0.004158f, 0.004478f, 0.004852f, 0.005154f, 0.005714f, 0.006207f, 0.006752f, 0.007370f,
- 0.008186f, 0.009155f, 0.010193f, 0.011490f, 0.013016f, 0.015144f, 0.017517f, 0.020752f,
- 0.024811f, 0.029922f, 0.036835f, 0.045593f, 0.056946f, 0.071533f, 0.090576f, 0.113159f,
- 0.140991f, 0.173340f, 0.624023f, 0.653809f, 0.660156f, 0.663574f, 0.664551f, 0.664062f,
- 0.000194f, 0.000227f, 0.000316f, 0.000451f, 0.000449f, 0.000482f, 0.000610f, 0.000511f,
- 0.000654f, 0.000673f, 0.000804f, 0.000844f, 0.000880f, 0.000955f, 0.000961f, 0.001127f,
- 0.001169f, 0.001210f, 0.001318f, 0.001330f, 0.001507f, 0.001592f, 0.001657f, 0.001771f,
- 0.001839f, 0.001953f, 0.002083f, 0.002214f, 0.002399f, 0.002518f, 0.002815f, 0.002882f,
- 0.003132f, 0.003361f, 0.003605f, 0.003925f, 0.004177f, 0.004528f, 0.004963f, 0.005527f,
- 0.006027f, 0.006783f, 0.007381f, 0.008469f, 0.009644f, 0.010849f, 0.012772f, 0.014748f,
- 0.017578f, 0.021332f, 0.026367f, 0.033142f, 0.042389f, 0.054413f, 0.070129f, 0.091064f,
- 0.116943f, 0.147339f, 0.608887f, 0.640137f, 0.645996f, 0.647461f, 0.650391f, 0.651367f,
- 0.000166f, 0.000146f, 0.000248f, 0.000320f, 0.000288f, 0.000446f, 0.000375f, 0.000407f,
- 0.000468f, 0.000514f, 0.000629f, 0.000638f, 0.000681f, 0.000773f, 0.000806f, 0.000766f,
- 0.000883f, 0.000927f, 0.000959f, 0.001036f, 0.001097f, 0.001172f, 0.001224f, 0.001297f,
- 0.001392f, 0.001425f, 0.001592f, 0.001631f, 0.001793f, 0.001965f, 0.002089f, 0.002157f,
- 0.002321f, 0.002495f, 0.002680f, 0.002874f, 0.003054f, 0.003305f, 0.003632f, 0.003902f,
- 0.004314f, 0.004753f, 0.005306f, 0.005901f, 0.006828f, 0.007645f, 0.008896f, 0.010323f,
- 0.012283f, 0.014816f, 0.018234f, 0.023010f, 0.029678f, 0.039276f, 0.052307f, 0.070190f,
- 0.093811f, 0.123474f, 0.591797f, 0.623535f, 0.631348f, 0.633301f, 0.634766f, 0.635254f,
- 0.000000f, 0.000154f, 0.000184f, 0.000257f, 0.000265f, 0.000266f, 0.000323f, 0.000291f,
- 0.000369f, 0.000384f, 0.000450f, 0.000472f, 0.000505f, 0.000572f, 0.000577f, 0.000604f,
- 0.000636f, 0.000675f, 0.000699f, 0.000736f, 0.000787f, 0.000840f, 0.000890f, 0.000945f,
- 0.000988f, 0.001039f, 0.001165f, 0.001165f, 0.001266f, 0.001318f, 0.001410f, 0.001550f,
- 0.001618f, 0.001743f, 0.001866f, 0.001997f, 0.002151f, 0.002319f, 0.002562f, 0.002779f,
- 0.002975f, 0.003298f, 0.003674f, 0.004131f, 0.004604f, 0.005268f, 0.006065f, 0.007027f,
- 0.008316f, 0.009949f, 0.012390f, 0.015526f, 0.019852f, 0.026733f, 0.036682f, 0.051666f,
- 0.072449f, 0.099792f, 0.574707f, 0.608398f, 0.614746f, 0.618164f, 0.619629f, 0.621094f,
- 0.000000f, 0.000008f, 0.000146f, 0.000181f, 0.000203f, 0.000243f, 0.000206f, 0.000250f,
- 0.000257f, 0.000283f, 0.000335f, 0.000293f, 0.000304f, 0.000368f, 0.000373f, 0.000435f,
- 0.000418f, 0.000468f, 0.000539f, 0.000540f, 0.000564f, 0.000598f, 0.000628f, 0.000657f,
- 0.000716f, 0.000724f, 0.000797f, 0.000807f, 0.000883f, 0.001002f, 0.000974f, 0.001037f,
- 0.001104f, 0.001196f, 0.001316f, 0.001394f, 0.001445f, 0.001574f, 0.001746f, 0.001829f,
- 0.002005f, 0.002222f, 0.002401f, 0.002699f, 0.003057f, 0.003372f, 0.003874f, 0.004505f,
- 0.005360f, 0.006500f, 0.007927f, 0.009972f, 0.012878f, 0.017258f, 0.024155f, 0.035339f,
- 0.052795f, 0.077637f, 0.558105f, 0.592285f, 0.600586f, 0.602539f, 0.604004f, 0.605469f,
- 0.000000f, 0.000107f, 0.000122f, 0.000093f, 0.000133f, 0.000142f, 0.000149f, 0.000174f,
- 0.000174f, 0.000184f, 0.000190f, 0.000234f, 0.000214f, 0.000250f, 0.000273f, 0.000286f,
- 0.000292f, 0.000302f, 0.000329f, 0.000336f, 0.000366f, 0.000391f, 0.000408f, 0.000444f,
- 0.000452f, 0.000495f, 0.000531f, 0.000559f, 0.000578f, 0.000611f, 0.000659f, 0.000675f,
- 0.000757f, 0.000771f, 0.000854f, 0.000906f, 0.000957f, 0.001004f, 0.001102f, 0.001187f,
- 0.001267f, 0.001394f, 0.001546f, 0.001683f, 0.001922f, 0.002094f, 0.002420f, 0.002754f,
- 0.003254f, 0.003878f, 0.004757f, 0.005997f, 0.007812f, 0.010544f, 0.014786f, 0.022324f,
- 0.035522f, 0.057465f, 0.541504f, 0.576172f, 0.583984f, 0.585938f, 0.588379f, 0.590332f,
- 0.000000f, 0.000099f, 0.000091f, 0.000084f, 0.000084f, 0.000086f, 0.000089f, 0.000101f,
- 0.000105f, 0.000109f, 0.000122f, 0.000124f, 0.000132f, 0.000146f, 0.000171f, 0.000172f,
- 0.000176f, 0.000198f, 0.000197f, 0.000239f, 0.000218f, 0.000235f, 0.000240f, 0.000281f,
- 0.000309f, 0.000301f, 0.000312f, 0.000321f, 0.000347f, 0.000370f, 0.000387f, 0.000419f,
- 0.000444f, 0.000458f, 0.000513f, 0.000536f, 0.000570f, 0.000607f, 0.000688f, 0.000703f,
- 0.000754f, 0.000834f, 0.000890f, 0.000997f, 0.001100f, 0.001238f, 0.001410f, 0.001584f,
- 0.001859f, 0.002207f, 0.002665f, 0.003323f, 0.004353f, 0.005947f, 0.008492f, 0.012909f,
- 0.021606f, 0.039368f, 0.522461f, 0.559082f, 0.566406f, 0.569824f, 0.572266f, 0.572754f,
- 0.000108f, 0.000089f, 0.000079f, 0.000072f, 0.000068f, 0.000065f, 0.000061f, 0.000057f,
- 0.000061f, 0.000062f, 0.000063f, 0.000086f, 0.000070f, 0.000071f, 0.000095f, 0.000080f,
- 0.000107f, 0.000113f, 0.000115f, 0.000124f, 0.000121f, 0.000130f, 0.000151f, 0.000154f,
- 0.000164f, 0.000170f, 0.000176f, 0.000189f, 0.000193f, 0.000215f, 0.000211f, 0.000242f,
- 0.000252f, 0.000260f, 0.000280f, 0.000293f, 0.000312f, 0.000350f, 0.000359f, 0.000389f,
- 0.000410f, 0.000452f, 0.000481f, 0.000535f, 0.000578f, 0.000643f, 0.000718f, 0.000812f,
- 0.000939f, 0.001107f, 0.001329f, 0.001644f, 0.002155f, 0.002930f, 0.004284f, 0.006706f,
- 0.011452f, 0.023895f, 0.504395f, 0.542480f, 0.550293f, 0.553711f, 0.555664f, 0.557129f,
- 0.000093f, 0.000072f, 0.000063f, 0.000058f, 0.000053f, 0.000050f, 0.000047f, 0.000046f,
- 0.000044f, 0.000042f, 0.000039f, 0.000037f, 0.000042f, 0.000035f, 0.000036f, 0.000037f,
- 0.000051f, 0.000046f, 0.000057f, 0.000058f, 0.000061f, 0.000062f, 0.000066f, 0.000069f,
- 0.000072f, 0.000087f, 0.000077f, 0.000088f, 0.000093f, 0.000099f, 0.000103f, 0.000109f,
- 0.000115f, 0.000122f, 0.000139f, 0.000134f, 0.000142f, 0.000170f, 0.000175f, 0.000179f,
- 0.000192f, 0.000203f, 0.000228f, 0.000245f, 0.000265f, 0.000291f, 0.000326f, 0.000360f,
- 0.000420f, 0.000481f, 0.000574f, 0.000686f, 0.000887f, 0.001203f, 0.001759f, 0.002892f,
- 0.005318f, 0.011955f, 0.487305f, 0.524902f, 0.534180f, 0.538086f, 0.539551f, 0.540527f,
- 0.000066f, 0.000049f, 0.000041f, 0.000037f, 0.000034f, 0.000033f, 0.000032f, 0.000030f,
- 0.000029f, 0.000028f, 0.000028f, 0.000027f, 0.000026f, 0.000025f, 0.000024f, 0.000023f,
- 0.000022f, 0.000021f, 0.000022f, 0.000023f, 0.000019f, 0.000018f, 0.000019f, 0.000024f,
- 0.000026f, 0.000029f, 0.000032f, 0.000032f, 0.000036f, 0.000034f, 0.000040f, 0.000041f,
- 0.000043f, 0.000049f, 0.000049f, 0.000050f, 0.000056f, 0.000059f, 0.000067f, 0.000067f,
- 0.000074f, 0.000078f, 0.000082f, 0.000092f, 0.000094f, 0.000103f, 0.000120f, 0.000130f,
- 0.000141f, 0.000163f, 0.000191f, 0.000230f, 0.000286f, 0.000374f, 0.000543f, 0.000890f,
- 0.001802f, 0.004650f, 0.468994f, 0.507812f, 0.516602f, 0.520508f, 0.522461f, 0.523926f,
- 0.000007f, 0.000008f, 0.000008f, 0.000008f, 0.000011f, 0.000010f, 0.000010f, 0.000011f,
- 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000012f,
- 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f,
- 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000009f, 0.000009f,
- 0.000009f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000014f, 0.000013f, 0.000016f,
- 0.000015f, 0.000018f, 0.000020f, 0.000021f, 0.000022f, 0.000025f, 0.000024f, 0.000025f,
- 0.000030f, 0.000031f, 0.000040f, 0.000046f, 0.000052f, 0.000071f, 0.000099f, 0.000147f,
- 0.000306f, 0.001072f, 0.450439f, 0.491211f, 0.499756f, 0.503418f, 0.505859f, 0.507324f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f,
- 0.000007f, 0.000024f, 0.432129f, 0.474121f, 0.482666f, 0.486572f, 0.489014f, 0.490234f,
- },
- {
- 0.027573f, 0.080750f, 0.130981f, 0.177734f, 0.222290f, 0.263672f, 0.302002f, 0.338623f,
- 0.373291f, 0.405029f, 0.435791f, 0.464111f, 0.490967f, 0.516602f, 0.540039f, 0.563477f,
- 0.584961f, 0.605469f, 0.625000f, 0.644043f, 0.660645f, 0.677246f, 0.693848f, 0.708496f,
- 0.724121f, 0.738281f, 0.751465f, 0.764648f, 0.776855f, 0.789062f, 0.799805f, 0.810547f,
- 0.821289f, 0.831055f, 0.840820f, 0.850098f, 0.859863f, 0.867676f, 0.876953f, 0.884277f,
- 0.892578f, 0.900391f, 0.907227f, 0.914551f, 0.921875f, 0.928223f, 0.934082f, 0.940430f,
- 0.946777f, 0.952637f, 0.957520f, 0.964355f, 0.968262f, 0.974121f, 0.979004f, 0.983887f,
- 0.989258f, 0.994141f, 0.993164f, 0.983398f, 0.976074f, 0.969238f, 0.962891f, 0.957031f,
- 0.022873f, 0.067871f, 0.111511f, 0.153809f, 0.193359f, 0.232788f, 0.268799f, 0.303223f,
- 0.337402f, 0.368652f, 0.399414f, 0.427734f, 0.455078f, 0.481201f, 0.506348f, 0.529785f,
- 0.552246f, 0.573242f, 0.593750f, 0.613281f, 0.632324f, 0.650391f, 0.667480f, 0.683105f,
- 0.698730f, 0.713867f, 0.728516f, 0.741211f, 0.755371f, 0.767578f, 0.779785f, 0.791504f,
- 0.803223f, 0.813477f, 0.823242f, 0.834473f, 0.843750f, 0.853027f, 0.861816f, 0.870605f,
- 0.878906f, 0.887695f, 0.895996f, 0.901855f, 0.910645f, 0.917480f, 0.923828f, 0.930176f,
- 0.937012f, 0.943359f, 0.949707f, 0.955078f, 0.960938f, 0.966797f, 0.972656f, 0.977051f,
- 0.982422f, 0.987305f, 0.989746f, 0.981445f, 0.973633f, 0.967773f, 0.961426f, 0.956055f,
- 0.019089f, 0.057007f, 0.095215f, 0.132202f, 0.168823f, 0.204712f, 0.238281f, 0.272217f,
- 0.304688f, 0.334717f, 0.364502f, 0.392822f, 0.420898f, 0.446533f, 0.471924f, 0.495850f,
- 0.518555f, 0.541992f, 0.562988f, 0.582520f, 0.602539f, 0.621094f, 0.639160f, 0.655762f,
- 0.672852f, 0.687988f, 0.703613f, 0.718262f, 0.732422f, 0.746094f, 0.758789f, 0.771484f,
- 0.783203f, 0.795898f, 0.807129f, 0.817383f, 0.827637f, 0.837402f, 0.846680f, 0.856445f,
- 0.865234f, 0.874023f, 0.882324f, 0.890137f, 0.898438f, 0.905273f, 0.913574f, 0.920410f,
- 0.927246f, 0.934082f, 0.940918f, 0.946777f, 0.953125f, 0.958496f, 0.964844f, 0.969727f,
- 0.975586f, 0.980957f, 0.986816f, 0.979004f, 0.971680f, 0.965332f, 0.959961f, 0.954590f,
- 0.016327f, 0.048676f, 0.081787f, 0.114807f, 0.147705f, 0.180176f, 0.211426f, 0.243652f,
- 0.273438f, 0.303223f, 0.332031f, 0.360107f, 0.386963f, 0.412598f, 0.438477f, 0.462891f,
- 0.487305f, 0.510254f, 0.530762f, 0.552246f, 0.572754f, 0.590820f, 0.610352f, 0.629883f,
- 0.647461f, 0.662598f, 0.679688f, 0.693848f, 0.709961f, 0.723633f, 0.737305f, 0.750977f,
- 0.763672f, 0.776367f, 0.788086f, 0.799316f, 0.810059f, 0.820801f, 0.832031f, 0.841309f,
- 0.851074f, 0.860352f, 0.868652f, 0.877930f, 0.886230f, 0.894531f, 0.902832f, 0.910156f,
- 0.916504f, 0.924316f, 0.930664f, 0.937500f, 0.943848f, 0.950684f, 0.957031f, 0.962891f,
- 0.968262f, 0.974121f, 0.983887f, 0.976074f, 0.969727f, 0.963867f, 0.958496f, 0.953125f,
- 0.013573f, 0.041901f, 0.070801f, 0.100098f, 0.129517f, 0.159058f, 0.187866f, 0.217041f,
- 0.246216f, 0.274414f, 0.302002f, 0.328857f, 0.354980f, 0.381592f, 0.406738f, 0.431641f,
- 0.455322f, 0.478271f, 0.500000f, 0.521484f, 0.541992f, 0.563477f, 0.583008f, 0.600098f,
- 0.619141f, 0.636719f, 0.653320f, 0.671387f, 0.684570f, 0.699707f, 0.715332f, 0.729492f,
- 0.743164f, 0.755371f, 0.768555f, 0.780762f, 0.792480f, 0.804199f, 0.814453f, 0.824707f,
- 0.835449f, 0.845215f, 0.854980f, 0.864746f, 0.874023f, 0.882812f, 0.890137f, 0.898438f,
- 0.905762f, 0.914062f, 0.921387f, 0.928223f, 0.935059f, 0.941406f, 0.948242f, 0.955078f,
- 0.961426f, 0.966797f, 0.980957f, 0.973633f, 0.967773f, 0.961914f, 0.956543f, 0.951660f,
- 0.011681f, 0.036316f, 0.061584f, 0.087524f, 0.113342f, 0.140259f, 0.167358f, 0.194214f,
- 0.220947f, 0.247437f, 0.273926f, 0.300537f, 0.325684f, 0.351074f, 0.375732f, 0.400146f,
- 0.423828f, 0.446533f, 0.469482f, 0.491943f, 0.512695f, 0.532715f, 0.553223f, 0.573242f,
- 0.592285f, 0.609863f, 0.627930f, 0.644531f, 0.660156f, 0.676758f, 0.691406f, 0.706055f,
- 0.720215f, 0.734863f, 0.749023f, 0.762207f, 0.774414f, 0.786133f, 0.797852f, 0.809082f,
- 0.820801f, 0.831055f, 0.840332f, 0.850098f, 0.859863f, 0.869629f, 0.878418f, 0.886719f,
- 0.895508f, 0.903809f, 0.910645f, 0.918945f, 0.925781f, 0.932617f, 0.939453f, 0.947754f,
- 0.953613f, 0.958984f, 0.977539f, 0.970703f, 0.964844f, 0.959473f, 0.954102f, 0.949707f,
- 0.010330f, 0.031525f, 0.053406f, 0.076538f, 0.100159f, 0.124084f, 0.148193f, 0.173096f,
- 0.197998f, 0.223267f, 0.247681f, 0.273193f, 0.297607f, 0.322021f, 0.346924f, 0.370117f,
- 0.394043f, 0.417236f, 0.439697f, 0.462158f, 0.483887f, 0.504883f, 0.524902f, 0.545410f,
- 0.563477f, 0.583008f, 0.602539f, 0.618652f, 0.636230f, 0.652344f, 0.669922f, 0.685059f,
- 0.699219f, 0.714355f, 0.729004f, 0.741211f, 0.755371f, 0.767578f, 0.780762f, 0.792480f,
- 0.803711f, 0.815918f, 0.825195f, 0.836914f, 0.846191f, 0.855957f, 0.864746f, 0.874512f,
- 0.883301f, 0.891602f, 0.900391f, 0.908203f, 0.916016f, 0.923828f, 0.931152f, 0.937988f,
- 0.945801f, 0.952148f, 0.974121f, 0.967773f, 0.962891f, 0.957520f, 0.952637f, 0.947754f,
- 0.009186f, 0.027359f, 0.047302f, 0.067505f, 0.088806f, 0.109924f, 0.132202f, 0.154907f,
- 0.177246f, 0.201050f, 0.224121f, 0.247925f, 0.271240f, 0.295410f, 0.318359f, 0.341797f,
- 0.365234f, 0.387939f, 0.410156f, 0.432861f, 0.454590f, 0.475586f, 0.495850f, 0.517090f,
- 0.536621f, 0.556152f, 0.575195f, 0.592773f, 0.609863f, 0.628418f, 0.645020f, 0.661133f,
- 0.677246f, 0.692383f, 0.707520f, 0.721191f, 0.735352f, 0.748047f, 0.762207f, 0.774414f,
- 0.786621f, 0.798828f, 0.810547f, 0.820801f, 0.831543f, 0.842285f, 0.852539f, 0.862305f,
- 0.871094f, 0.880859f, 0.889648f, 0.898438f, 0.906738f, 0.914551f, 0.921875f, 0.929199f,
- 0.936035f, 0.944824f, 0.971191f, 0.965332f, 0.959473f, 0.955078f, 0.950195f, 0.945801f,
- 0.008041f, 0.024384f, 0.041321f, 0.059631f, 0.078003f, 0.097656f, 0.117554f, 0.138428f,
- 0.159912f, 0.181152f, 0.203003f, 0.224976f, 0.247070f, 0.269531f, 0.292480f, 0.314697f,
- 0.337891f, 0.360352f, 0.382324f, 0.403809f, 0.426025f, 0.447998f, 0.468018f, 0.488770f,
- 0.508301f, 0.528320f, 0.547852f, 0.567383f, 0.585449f, 0.603516f, 0.620605f, 0.637695f,
- 0.654297f, 0.670410f, 0.686523f, 0.700195f, 0.715820f, 0.729980f, 0.743164f, 0.756836f,
- 0.769531f, 0.782715f, 0.794434f, 0.805664f, 0.816895f, 0.827637f, 0.838379f, 0.848633f,
- 0.859375f, 0.868164f, 0.877930f, 0.887695f, 0.895996f, 0.905273f, 0.912598f, 0.920898f,
- 0.928711f, 0.936035f, 0.966797f, 0.962402f, 0.957031f, 0.952637f, 0.947754f, 0.943848f,
- 0.007095f, 0.021515f, 0.036926f, 0.052704f, 0.069641f, 0.087463f, 0.105347f, 0.123413f,
- 0.143188f, 0.163452f, 0.183105f, 0.204102f, 0.225220f, 0.246704f, 0.268066f, 0.290283f,
- 0.311768f, 0.333740f, 0.355225f, 0.376465f, 0.397949f, 0.419434f, 0.440430f, 0.461670f,
- 0.481445f, 0.500977f, 0.520020f, 0.540527f, 0.559570f, 0.578125f, 0.595703f, 0.613770f,
- 0.630371f, 0.646973f, 0.663086f, 0.678223f, 0.694336f, 0.709473f, 0.723145f, 0.736328f,
- 0.750000f, 0.764648f, 0.777344f, 0.790039f, 0.801270f, 0.812988f, 0.824707f, 0.834961f,
- 0.846191f, 0.856934f, 0.865723f, 0.875977f, 0.884766f, 0.894531f, 0.903320f, 0.911621f,
- 0.919922f, 0.927734f, 0.962891f, 0.959473f, 0.954102f, 0.949219f, 0.945312f, 0.941406f,
- 0.006138f, 0.019150f, 0.033051f, 0.047089f, 0.061829f, 0.077515f, 0.094299f, 0.111084f,
- 0.128174f, 0.146729f, 0.165771f, 0.185059f, 0.205200f, 0.224731f, 0.245361f, 0.265625f,
- 0.286865f, 0.307861f, 0.328857f, 0.350098f, 0.370605f, 0.392090f, 0.413086f, 0.433594f,
- 0.454346f, 0.474609f, 0.493896f, 0.513672f, 0.532227f, 0.552734f, 0.569824f, 0.588867f,
- 0.605957f, 0.623047f, 0.640625f, 0.656738f, 0.672852f, 0.688477f, 0.703613f, 0.717773f,
- 0.732910f, 0.746582f, 0.759766f, 0.772461f, 0.786621f, 0.798340f, 0.810059f, 0.820312f,
- 0.832520f, 0.842773f, 0.853516f, 0.863770f, 0.873535f, 0.883789f, 0.892578f, 0.901367f,
- 0.910645f, 0.919434f, 0.958984f, 0.955566f, 0.951172f, 0.946777f, 0.942871f, 0.938965f,
- 0.005424f, 0.017059f, 0.029541f, 0.042023f, 0.055389f, 0.069397f, 0.083984f, 0.099670f,
- 0.115601f, 0.132324f, 0.149292f, 0.167114f, 0.185547f, 0.204468f, 0.224121f, 0.243896f,
- 0.262939f, 0.283691f, 0.304443f, 0.323486f, 0.345459f, 0.365479f, 0.386230f, 0.407471f,
- 0.426758f, 0.448486f, 0.467529f, 0.487061f, 0.506348f, 0.526367f, 0.545410f, 0.563965f,
- 0.581543f, 0.600098f, 0.617676f, 0.634277f, 0.650391f, 0.666016f, 0.682617f, 0.697754f,
- 0.712891f, 0.727539f, 0.741211f, 0.755859f, 0.769043f, 0.782227f, 0.793945f, 0.806152f,
- 0.818848f, 0.830566f, 0.840332f, 0.851074f, 0.861328f, 0.872070f, 0.881836f, 0.892090f,
- 0.900879f, 0.910645f, 0.955566f, 0.952637f, 0.948730f, 0.943359f, 0.939941f, 0.935547f,
- 0.004833f, 0.015442f, 0.026169f, 0.037689f, 0.049683f, 0.062164f, 0.075806f, 0.089539f,
- 0.103760f, 0.119263f, 0.134888f, 0.151978f, 0.168335f, 0.186646f, 0.204102f, 0.223022f,
- 0.242065f, 0.260986f, 0.280518f, 0.300537f, 0.320801f, 0.340820f, 0.360107f, 0.381104f,
- 0.401367f, 0.421387f, 0.441650f, 0.460449f, 0.480957f, 0.500000f, 0.519531f, 0.538574f,
- 0.557129f, 0.575684f, 0.593262f, 0.610840f, 0.628906f, 0.645508f, 0.662109f, 0.677246f,
- 0.692871f, 0.708008f, 0.723145f, 0.738281f, 0.751465f, 0.766113f, 0.778320f, 0.791504f,
- 0.802246f, 0.816406f, 0.827637f, 0.838867f, 0.850098f, 0.860352f, 0.871582f, 0.881348f,
- 0.890137f, 0.899902f, 0.951660f, 0.948730f, 0.944824f, 0.940918f, 0.937012f, 0.933594f,
- 0.004269f, 0.013809f, 0.023911f, 0.033569f, 0.044342f, 0.056213f, 0.068054f, 0.080811f,
- 0.093933f, 0.107910f, 0.122131f, 0.137451f, 0.152710f, 0.169434f, 0.185791f, 0.203979f,
- 0.221436f, 0.239990f, 0.257812f, 0.277344f, 0.296631f, 0.316162f, 0.335693f, 0.355713f,
- 0.375244f, 0.395996f, 0.416016f, 0.436035f, 0.455078f, 0.474365f, 0.494629f, 0.513184f,
- 0.532715f, 0.550781f, 0.569336f, 0.586914f, 0.604980f, 0.622559f, 0.639648f, 0.655762f,
- 0.672363f, 0.688477f, 0.704102f, 0.718750f, 0.733887f, 0.747559f, 0.761230f, 0.775391f,
- 0.788574f, 0.800781f, 0.814453f, 0.825684f, 0.837402f, 0.848633f, 0.859375f, 0.870605f,
- 0.880371f, 0.891113f, 0.947754f, 0.945312f, 0.941895f, 0.937988f, 0.934082f, 0.931152f,
- 0.004028f, 0.012581f, 0.021133f, 0.030396f, 0.039948f, 0.050323f, 0.061523f, 0.072815f,
- 0.084961f, 0.096985f, 0.110535f, 0.124756f, 0.138916f, 0.153687f, 0.169800f, 0.185669f,
- 0.202881f, 0.219116f, 0.237305f, 0.255615f, 0.273926f, 0.293213f, 0.311768f, 0.331055f,
- 0.351074f, 0.370605f, 0.390381f, 0.409668f, 0.429688f, 0.449707f, 0.468994f, 0.487549f,
- 0.506836f, 0.526367f, 0.545898f, 0.562988f, 0.581543f, 0.599121f, 0.616699f, 0.634766f,
- 0.651367f, 0.667480f, 0.683594f, 0.699707f, 0.714844f, 0.730957f, 0.744141f, 0.758789f,
- 0.772949f, 0.785645f, 0.799316f, 0.812500f, 0.823730f, 0.836914f, 0.847168f, 0.859375f,
- 0.869629f, 0.880371f, 0.942383f, 0.941406f, 0.937500f, 0.934570f, 0.931152f, 0.927734f,
- 0.003613f, 0.011391f, 0.018875f, 0.027679f, 0.036133f, 0.045624f, 0.055420f, 0.065491f,
- 0.076416f, 0.088135f, 0.099487f, 0.112427f, 0.126099f, 0.139771f, 0.154419f, 0.169556f,
- 0.184814f, 0.201050f, 0.218262f, 0.234985f, 0.252441f, 0.271484f, 0.289062f, 0.308594f,
- 0.326660f, 0.346924f, 0.365234f, 0.384521f, 0.404541f, 0.424072f, 0.443359f, 0.463135f,
- 0.482422f, 0.501953f, 0.521484f, 0.539551f, 0.558594f, 0.576660f, 0.595215f, 0.612793f,
- 0.629883f, 0.647949f, 0.663574f, 0.679688f, 0.695801f, 0.711426f, 0.727539f, 0.741699f,
- 0.757324f, 0.770996f, 0.785156f, 0.798828f, 0.811035f, 0.823730f, 0.835449f, 0.848145f,
- 0.858887f, 0.870605f, 0.937988f, 0.937988f, 0.934570f, 0.931152f, 0.927734f, 0.924805f,
- 0.003248f, 0.010185f, 0.017395f, 0.025055f, 0.032928f, 0.041321f, 0.049957f, 0.059265f,
- 0.069092f, 0.079407f, 0.090820f, 0.101746f, 0.113770f, 0.126953f, 0.140381f, 0.154053f,
- 0.168701f, 0.184082f, 0.199951f, 0.216431f, 0.232788f, 0.250000f, 0.267578f, 0.285645f,
- 0.303955f, 0.322998f, 0.341553f, 0.361084f, 0.379150f, 0.399414f, 0.418701f, 0.437988f,
- 0.457275f, 0.477051f, 0.496094f, 0.515137f, 0.534180f, 0.553223f, 0.571289f, 0.589844f,
- 0.606934f, 0.625488f, 0.643066f, 0.659668f, 0.676758f, 0.692871f, 0.708984f, 0.725098f,
- 0.740234f, 0.753906f, 0.769043f, 0.782227f, 0.796387f, 0.810059f, 0.822266f, 0.834961f,
- 0.847168f, 0.859375f, 0.933594f, 0.933594f, 0.931152f, 0.927246f, 0.923828f, 0.921387f,
- 0.002914f, 0.009361f, 0.015793f, 0.022659f, 0.029938f, 0.037354f, 0.045593f, 0.053406f,
- 0.062988f, 0.072083f, 0.081665f, 0.092712f, 0.103943f, 0.114990f, 0.128174f, 0.140503f,
- 0.153809f, 0.167725f, 0.182251f, 0.198242f, 0.213623f, 0.230225f, 0.246826f, 0.263672f,
- 0.281494f, 0.300049f, 0.318604f, 0.337158f, 0.356201f, 0.374756f, 0.394531f, 0.413574f,
- 0.433105f, 0.451904f, 0.471680f, 0.491211f, 0.509766f, 0.529297f, 0.547852f, 0.566895f,
- 0.584961f, 0.603516f, 0.621094f, 0.638672f, 0.656738f, 0.673340f, 0.689453f, 0.706543f,
- 0.722656f, 0.737793f, 0.752930f, 0.767578f, 0.781250f, 0.796875f, 0.809082f, 0.823242f,
- 0.835449f, 0.847656f, 0.929199f, 0.929199f, 0.927246f, 0.923828f, 0.920898f, 0.917969f,
- 0.002766f, 0.008736f, 0.014442f, 0.020691f, 0.027054f, 0.033905f, 0.040924f, 0.048645f,
- 0.056976f, 0.065674f, 0.074951f, 0.084229f, 0.094116f, 0.105225f, 0.116333f, 0.127563f,
- 0.139771f, 0.153564f, 0.166626f, 0.181030f, 0.196411f, 0.211182f, 0.227417f, 0.243896f,
- 0.260742f, 0.277588f, 0.295898f, 0.314209f, 0.332031f, 0.351562f, 0.370117f, 0.389404f,
- 0.408203f, 0.428223f, 0.447266f, 0.467041f, 0.486084f, 0.505859f, 0.524414f, 0.543945f,
- 0.562012f, 0.581543f, 0.600098f, 0.617676f, 0.636230f, 0.654297f, 0.670898f, 0.687500f,
- 0.704102f, 0.720703f, 0.736816f, 0.751465f, 0.766113f, 0.781738f, 0.796387f, 0.809082f,
- 0.823242f, 0.835938f, 0.923828f, 0.925781f, 0.922852f, 0.920410f, 0.916992f, 0.914551f,
- 0.002483f, 0.007599f, 0.013161f, 0.018555f, 0.024551f, 0.030670f, 0.037476f, 0.044464f,
- 0.051636f, 0.059174f, 0.067688f, 0.075928f, 0.085693f, 0.095093f, 0.105591f, 0.116394f,
- 0.127441f, 0.139648f, 0.152344f, 0.165527f, 0.179565f, 0.193970f, 0.208862f, 0.224487f,
- 0.240356f, 0.256836f, 0.274658f, 0.291748f, 0.310059f, 0.328369f, 0.346680f, 0.365234f,
- 0.384521f, 0.404297f, 0.423340f, 0.442139f, 0.462646f, 0.481445f, 0.500977f, 0.520020f,
- 0.540039f, 0.559082f, 0.577148f, 0.596191f, 0.614746f, 0.632812f, 0.651367f, 0.669434f,
- 0.685059f, 0.702637f, 0.718750f, 0.734375f, 0.750488f, 0.766113f, 0.780762f, 0.795410f,
- 0.811035f, 0.823730f, 0.919434f, 0.920898f, 0.918457f, 0.916016f, 0.913086f, 0.910645f,
- 0.002457f, 0.007114f, 0.011757f, 0.016708f, 0.022125f, 0.027786f, 0.033752f, 0.040375f,
- 0.046661f, 0.053864f, 0.061584f, 0.069336f, 0.077515f, 0.086365f, 0.095947f, 0.105896f,
- 0.116638f, 0.127075f, 0.138916f, 0.151245f, 0.164062f, 0.177490f, 0.191528f, 0.206177f,
- 0.221802f, 0.237427f, 0.253906f, 0.270508f, 0.287842f, 0.305664f, 0.323730f, 0.342285f,
- 0.361572f, 0.379639f, 0.399170f, 0.418457f, 0.438965f, 0.458252f, 0.477295f, 0.497559f,
- 0.516113f, 0.536133f, 0.554688f, 0.574707f, 0.593750f, 0.612305f, 0.630859f, 0.648926f,
- 0.666504f, 0.684082f, 0.701660f, 0.717773f, 0.734863f, 0.751465f, 0.766602f, 0.781738f,
- 0.797852f, 0.812012f, 0.913086f, 0.916016f, 0.913574f, 0.911621f, 0.909180f, 0.906250f,
- 0.002132f, 0.006493f, 0.010750f, 0.015717f, 0.020569f, 0.025604f, 0.030823f, 0.036682f,
- 0.043060f, 0.049286f, 0.055786f, 0.062988f, 0.070557f, 0.078918f, 0.086914f, 0.096191f,
- 0.105530f, 0.116028f, 0.126953f, 0.138306f, 0.149902f, 0.162231f, 0.175537f, 0.189453f,
- 0.203491f, 0.218628f, 0.234131f, 0.250000f, 0.266602f, 0.284180f, 0.301514f, 0.319580f,
- 0.338135f, 0.356689f, 0.375977f, 0.395020f, 0.413818f, 0.434082f, 0.452881f, 0.473145f,
- 0.492920f, 0.512207f, 0.532227f, 0.552246f, 0.570801f, 0.591309f, 0.609375f, 0.629395f,
- 0.646973f, 0.665527f, 0.683105f, 0.700684f, 0.717773f, 0.734863f, 0.751465f, 0.767578f,
- 0.782715f, 0.799316f, 0.908203f, 0.911133f, 0.909180f, 0.907227f, 0.904785f, 0.902832f,
- 0.001891f, 0.006008f, 0.010025f, 0.014122f, 0.018616f, 0.023239f, 0.028442f, 0.033691f,
- 0.038757f, 0.044556f, 0.050964f, 0.057465f, 0.064087f, 0.071167f, 0.079224f, 0.087463f,
- 0.096008f, 0.105591f, 0.115356f, 0.125488f, 0.136597f, 0.148193f, 0.160278f, 0.173218f,
- 0.186768f, 0.200684f, 0.215332f, 0.231323f, 0.246338f, 0.262939f, 0.279785f, 0.297607f,
- 0.314941f, 0.333984f, 0.353271f, 0.371094f, 0.391357f, 0.409668f, 0.430420f, 0.448975f,
- 0.469482f, 0.489746f, 0.509277f, 0.528809f, 0.549316f, 0.568848f, 0.588379f, 0.607910f,
- 0.626953f, 0.645996f, 0.664062f, 0.683105f, 0.700684f, 0.718262f, 0.735840f, 0.751953f,
- 0.768555f, 0.785645f, 0.902344f, 0.906250f, 0.904785f, 0.902832f, 0.900391f, 0.898438f,
- 0.001732f, 0.005573f, 0.009193f, 0.012932f, 0.017075f, 0.021286f, 0.025406f, 0.030289f,
- 0.035675f, 0.040344f, 0.046326f, 0.052032f, 0.058411f, 0.064575f, 0.072205f, 0.079834f,
- 0.087708f, 0.095947f, 0.104797f, 0.114380f, 0.124451f, 0.134888f, 0.146606f, 0.158691f,
- 0.170776f, 0.184082f, 0.197510f, 0.212524f, 0.227417f, 0.243164f, 0.259521f, 0.276367f,
- 0.293457f, 0.311768f, 0.329590f, 0.348633f, 0.367188f, 0.386230f, 0.406006f, 0.425781f,
- 0.446533f, 0.465332f, 0.486084f, 0.505859f, 0.526367f, 0.545898f, 0.567383f, 0.585938f,
- 0.605957f, 0.625977f, 0.645508f, 0.664551f, 0.683105f, 0.701172f, 0.718750f, 0.736816f,
- 0.754395f, 0.770508f, 0.896484f, 0.900879f, 0.900391f, 0.897949f, 0.895996f, 0.894043f,
- 0.001713f, 0.004684f, 0.008339f, 0.011818f, 0.015450f, 0.019409f, 0.023605f, 0.027832f,
- 0.032349f, 0.036865f, 0.041809f, 0.047302f, 0.052673f, 0.058838f, 0.065613f, 0.072083f,
- 0.079407f, 0.087280f, 0.095337f, 0.104126f, 0.113037f, 0.122986f, 0.133667f, 0.144897f,
- 0.156250f, 0.168579f, 0.181396f, 0.195068f, 0.208984f, 0.224243f, 0.239624f, 0.255859f,
- 0.272461f, 0.289551f, 0.307617f, 0.326172f, 0.344482f, 0.363770f, 0.383301f, 0.402588f,
- 0.422607f, 0.443115f, 0.463135f, 0.483154f, 0.503418f, 0.523926f, 0.544434f, 0.564941f,
- 0.584473f, 0.604980f, 0.624512f, 0.645508f, 0.664551f, 0.683594f, 0.701660f, 0.721191f,
- 0.738281f, 0.755859f, 0.889648f, 0.895996f, 0.895020f, 0.893066f, 0.891602f, 0.889160f,
- 0.001545f, 0.004745f, 0.007710f, 0.010979f, 0.014450f, 0.017807f, 0.021469f, 0.025238f,
- 0.029282f, 0.033661f, 0.038177f, 0.043182f, 0.048157f, 0.053436f, 0.059326f, 0.065674f,
- 0.072205f, 0.078857f, 0.086548f, 0.094604f, 0.102905f, 0.111816f, 0.121521f, 0.131592f,
- 0.142334f, 0.153442f, 0.165894f, 0.178345f, 0.192139f, 0.205933f, 0.220703f, 0.236084f,
- 0.251709f, 0.268555f, 0.285645f, 0.303467f, 0.321777f, 0.340332f, 0.359619f, 0.379150f,
- 0.398682f, 0.419189f, 0.440430f, 0.460449f, 0.480957f, 0.501465f, 0.521973f, 0.543457f,
- 0.563477f, 0.584961f, 0.604492f, 0.625488f, 0.645508f, 0.665039f, 0.684082f, 0.704102f,
- 0.723145f, 0.741211f, 0.885254f, 0.890137f, 0.889160f, 0.887695f, 0.886719f, 0.884277f,
- 0.001487f, 0.004356f, 0.006828f, 0.010162f, 0.012993f, 0.016022f, 0.019333f, 0.023087f,
- 0.026886f, 0.030518f, 0.034668f, 0.039062f, 0.043671f, 0.048370f, 0.053741f, 0.059326f,
- 0.065308f, 0.071655f, 0.078125f, 0.085693f, 0.093323f, 0.101807f, 0.110657f, 0.119507f,
- 0.129517f, 0.140137f, 0.151367f, 0.163330f, 0.175781f, 0.188843f, 0.202759f, 0.217163f,
- 0.232666f, 0.248413f, 0.264893f, 0.282227f, 0.299805f, 0.318115f, 0.336914f, 0.356445f,
- 0.375488f, 0.395996f, 0.416504f, 0.436279f, 0.457520f, 0.479004f, 0.499023f, 0.520508f,
- 0.541504f, 0.562988f, 0.583984f, 0.604492f, 0.625488f, 0.646973f, 0.666504f, 0.687012f,
- 0.706055f, 0.725098f, 0.877441f, 0.885254f, 0.884766f, 0.882324f, 0.881836f, 0.880371f,
- 0.001443f, 0.003807f, 0.006336f, 0.009171f, 0.011909f, 0.015007f, 0.018097f, 0.020905f,
- 0.024384f, 0.027893f, 0.031555f, 0.035370f, 0.039581f, 0.044128f, 0.048889f, 0.053894f,
- 0.059174f, 0.065125f, 0.070984f, 0.077698f, 0.084656f, 0.091919f, 0.100037f, 0.108093f,
- 0.117493f, 0.127563f, 0.137817f, 0.148438f, 0.159912f, 0.172485f, 0.185547f, 0.199585f,
- 0.213867f, 0.229248f, 0.244995f, 0.261230f, 0.278564f, 0.296387f, 0.314697f, 0.333252f,
- 0.353271f, 0.372314f, 0.393311f, 0.413330f, 0.433594f, 0.455078f, 0.476318f, 0.497314f,
- 0.519531f, 0.540527f, 0.562500f, 0.583496f, 0.605469f, 0.626953f, 0.648438f, 0.669434f,
- 0.689941f, 0.709961f, 0.870605f, 0.878906f, 0.878418f, 0.877441f, 0.875488f, 0.873535f,
- 0.001302f, 0.003712f, 0.005859f, 0.008286f, 0.010910f, 0.013779f, 0.016235f, 0.019135f,
- 0.021912f, 0.025345f, 0.029022f, 0.032166f, 0.036011f, 0.040131f, 0.044128f, 0.048492f,
- 0.053528f, 0.058533f, 0.064209f, 0.070129f, 0.076355f, 0.083191f, 0.090149f, 0.098328f,
- 0.106628f, 0.115662f, 0.124817f, 0.134766f, 0.145630f, 0.157104f, 0.169678f, 0.182495f,
- 0.195801f, 0.210205f, 0.225342f, 0.241455f, 0.257812f, 0.274902f, 0.292725f, 0.311035f,
- 0.330322f, 0.349365f, 0.369873f, 0.390137f, 0.411133f, 0.432373f, 0.453369f, 0.474609f,
- 0.496826f, 0.519043f, 0.541504f, 0.563477f, 0.585449f, 0.606445f, 0.629395f, 0.650391f,
- 0.672363f, 0.693848f, 0.863281f, 0.872070f, 0.872070f, 0.871582f, 0.869629f, 0.868164f,
- 0.001170f, 0.003151f, 0.005295f, 0.007812f, 0.010132f, 0.012466f, 0.015076f, 0.017517f,
- 0.019943f, 0.023178f, 0.026443f, 0.029312f, 0.032471f, 0.036041f, 0.039978f, 0.044037f,
- 0.048828f, 0.053070f, 0.057983f, 0.063232f, 0.068909f, 0.075378f, 0.081909f, 0.088745f,
- 0.096375f, 0.104309f, 0.113281f, 0.122437f, 0.132202f, 0.142944f, 0.154419f, 0.166138f,
- 0.178955f, 0.192505f, 0.206421f, 0.221558f, 0.237183f, 0.253906f, 0.270996f, 0.289062f,
- 0.308105f, 0.326904f, 0.346924f, 0.366455f, 0.387695f, 0.408936f, 0.430176f, 0.451416f,
- 0.474365f, 0.496582f, 0.518066f, 0.541016f, 0.563965f, 0.585938f, 0.608887f, 0.630859f,
- 0.654297f, 0.675781f, 0.856934f, 0.865234f, 0.866211f, 0.864746f, 0.863281f, 0.862793f,
- 0.001049f, 0.003254f, 0.005234f, 0.007263f, 0.009270f, 0.011307f, 0.013596f, 0.015869f,
- 0.018555f, 0.020844f, 0.023972f, 0.026566f, 0.029739f, 0.033020f, 0.036316f, 0.039856f,
- 0.044159f, 0.048096f, 0.052277f, 0.057281f, 0.062439f, 0.067871f, 0.073792f, 0.079956f,
- 0.087158f, 0.094055f, 0.102234f, 0.110535f, 0.119934f, 0.129517f, 0.140259f, 0.151245f,
- 0.162842f, 0.175537f, 0.189209f, 0.203369f, 0.218262f, 0.233643f, 0.250488f, 0.268066f,
- 0.285645f, 0.304443f, 0.324219f, 0.343750f, 0.364014f, 0.385254f, 0.406494f, 0.428223f,
- 0.450928f, 0.472656f, 0.495605f, 0.519043f, 0.541504f, 0.565918f, 0.588379f, 0.612305f,
- 0.635742f, 0.659180f, 0.850098f, 0.859863f, 0.859863f, 0.858398f, 0.857910f, 0.856934f,
- 0.000914f, 0.002861f, 0.004742f, 0.006569f, 0.008415f, 0.010521f, 0.012596f, 0.014648f,
- 0.016708f, 0.019089f, 0.021515f, 0.023865f, 0.026688f, 0.029572f, 0.032928f, 0.036377f,
- 0.039337f, 0.043365f, 0.047333f, 0.051544f, 0.056305f, 0.061066f, 0.066406f, 0.071960f,
- 0.078247f, 0.084961f, 0.092163f, 0.099426f, 0.108215f, 0.116943f, 0.126831f, 0.136719f,
- 0.148193f, 0.159302f, 0.171875f, 0.185669f, 0.199585f, 0.214478f, 0.230469f, 0.247070f,
- 0.264160f, 0.282471f, 0.301270f, 0.321045f, 0.341553f, 0.362061f, 0.383545f, 0.404785f,
- 0.427734f, 0.449951f, 0.473389f, 0.496582f, 0.520020f, 0.543457f, 0.568359f, 0.592285f,
- 0.615723f, 0.639648f, 0.840820f, 0.851074f, 0.853027f, 0.853027f, 0.852051f, 0.850586f,
- 0.000679f, 0.002518f, 0.004173f, 0.006149f, 0.008064f, 0.009369f, 0.011551f, 0.013222f,
- 0.015175f, 0.017212f, 0.019592f, 0.021835f, 0.024048f, 0.026932f, 0.029846f, 0.032623f,
- 0.035675f, 0.038940f, 0.042542f, 0.046295f, 0.050354f, 0.055054f, 0.059601f, 0.064880f,
- 0.070190f, 0.076233f, 0.082703f, 0.089661f, 0.097229f, 0.105103f, 0.113831f, 0.123474f,
- 0.133423f, 0.144409f, 0.156006f, 0.168335f, 0.182495f, 0.196411f, 0.211304f, 0.227295f,
- 0.243530f, 0.260986f, 0.279053f, 0.298828f, 0.318359f, 0.339111f, 0.360107f, 0.381348f,
- 0.403809f, 0.427490f, 0.449463f, 0.473633f, 0.497803f, 0.521484f, 0.546875f, 0.570801f,
- 0.595703f, 0.620605f, 0.833008f, 0.845215f, 0.845703f, 0.845703f, 0.845215f, 0.843750f,
- 0.000719f, 0.002470f, 0.003975f, 0.005337f, 0.007275f, 0.008713f, 0.010376f, 0.012032f,
- 0.013580f, 0.015793f, 0.017609f, 0.019501f, 0.021530f, 0.024277f, 0.026657f, 0.029312f,
- 0.031982f, 0.035187f, 0.038086f, 0.041565f, 0.045288f, 0.049103f, 0.053436f, 0.058136f,
- 0.062927f, 0.068054f, 0.073853f, 0.080383f, 0.087341f, 0.094666f, 0.102173f, 0.111084f,
- 0.120300f, 0.130859f, 0.141235f, 0.152954f, 0.164429f, 0.178223f, 0.192749f, 0.207642f,
- 0.223145f, 0.239868f, 0.258301f, 0.276611f, 0.295654f, 0.316162f, 0.337402f, 0.358643f,
- 0.380859f, 0.403320f, 0.427002f, 0.450684f, 0.474609f, 0.499756f, 0.523926f, 0.550781f,
- 0.575195f, 0.600586f, 0.824707f, 0.836914f, 0.838379f, 0.838867f, 0.837402f, 0.837402f,
- 0.000683f, 0.002361f, 0.003649f, 0.005116f, 0.006416f, 0.008202f, 0.009460f, 0.010941f,
- 0.012817f, 0.014099f, 0.015839f, 0.017593f, 0.019867f, 0.021988f, 0.023926f, 0.026276f,
- 0.028824f, 0.031311f, 0.034363f, 0.036957f, 0.040375f, 0.043823f, 0.047546f, 0.051758f,
- 0.056183f, 0.061249f, 0.066162f, 0.071777f, 0.077942f, 0.084534f, 0.091553f, 0.099487f,
- 0.107910f, 0.116882f, 0.127075f, 0.137451f, 0.148804f, 0.161499f, 0.174805f, 0.188721f,
- 0.203735f, 0.220093f, 0.237427f, 0.254639f, 0.273926f, 0.293457f, 0.313965f, 0.334961f,
- 0.357666f, 0.379883f, 0.403076f, 0.427002f, 0.451660f, 0.476807f, 0.501953f, 0.527344f,
- 0.553711f, 0.581055f, 0.815918f, 0.829102f, 0.831055f, 0.831055f, 0.831055f, 0.830566f,
- 0.000607f, 0.001863f, 0.003416f, 0.004528f, 0.005943f, 0.007191f, 0.008781f, 0.009964f,
- 0.011337f, 0.012939f, 0.014458f, 0.015808f, 0.018051f, 0.019394f, 0.021332f, 0.023529f,
- 0.025803f, 0.028168f, 0.030502f, 0.033020f, 0.036072f, 0.039032f, 0.042419f, 0.046082f,
- 0.049927f, 0.054321f, 0.058411f, 0.063538f, 0.069336f, 0.075684f, 0.081787f, 0.088562f,
- 0.096436f, 0.104553f, 0.113281f, 0.123596f, 0.133667f, 0.145386f, 0.157471f, 0.171021f,
- 0.185547f, 0.200562f, 0.216553f, 0.234619f, 0.251709f, 0.271240f, 0.291504f, 0.312012f,
- 0.333496f, 0.355957f, 0.379395f, 0.403076f, 0.428223f, 0.453857f, 0.479492f, 0.506348f,
- 0.532715f, 0.560059f, 0.805664f, 0.820801f, 0.823730f, 0.822754f, 0.822754f, 0.822266f,
- 0.000593f, 0.001862f, 0.002966f, 0.004341f, 0.005600f, 0.006516f, 0.007626f, 0.008995f,
- 0.010223f, 0.011292f, 0.012848f, 0.014427f, 0.016098f, 0.017532f, 0.019165f, 0.021027f,
- 0.022842f, 0.024918f, 0.027115f, 0.029739f, 0.032013f, 0.034637f, 0.037506f, 0.040955f,
- 0.044220f, 0.048065f, 0.051941f, 0.056305f, 0.061768f, 0.066528f, 0.072327f, 0.078979f,
- 0.085571f, 0.092834f, 0.101135f, 0.110229f, 0.119690f, 0.130127f, 0.141602f, 0.153564f,
- 0.167114f, 0.181763f, 0.196899f, 0.213623f, 0.230957f, 0.249268f, 0.268555f, 0.289062f,
- 0.310059f, 0.333252f, 0.355957f, 0.379883f, 0.404541f, 0.430176f, 0.456055f, 0.483887f,
- 0.510254f, 0.539062f, 0.797852f, 0.812988f, 0.814941f, 0.815430f, 0.815918f, 0.814453f,
- 0.000556f, 0.001811f, 0.002998f, 0.003815f, 0.004658f, 0.005905f, 0.007099f, 0.008232f,
- 0.009239f, 0.010483f, 0.011559f, 0.013016f, 0.014305f, 0.015671f, 0.017090f, 0.018646f,
- 0.020370f, 0.022369f, 0.024124f, 0.026062f, 0.028458f, 0.030624f, 0.033264f, 0.036041f,
- 0.039307f, 0.042053f, 0.045807f, 0.049530f, 0.054016f, 0.058441f, 0.063904f, 0.069641f,
- 0.075745f, 0.082520f, 0.089539f, 0.097717f, 0.106750f, 0.116150f, 0.126587f, 0.137817f,
- 0.150024f, 0.163452f, 0.177490f, 0.193359f, 0.209717f, 0.227539f, 0.246704f, 0.266602f,
- 0.287598f, 0.309326f, 0.332520f, 0.355713f, 0.380371f, 0.406494f, 0.432861f, 0.459961f,
- 0.488525f, 0.517090f, 0.787598f, 0.804199f, 0.806641f, 0.807617f, 0.807617f, 0.807129f,
- 0.000507f, 0.001697f, 0.002468f, 0.003351f, 0.004425f, 0.005486f, 0.006325f, 0.007412f,
- 0.008156f, 0.009270f, 0.010239f, 0.011497f, 0.012520f, 0.013954f, 0.015182f, 0.016617f,
- 0.018036f, 0.019714f, 0.021362f, 0.022934f, 0.024704f, 0.026886f, 0.029419f, 0.031525f,
- 0.034302f, 0.037292f, 0.040558f, 0.043701f, 0.047577f, 0.051849f, 0.056183f, 0.061249f,
- 0.066467f, 0.072876f, 0.078918f, 0.086548f, 0.094116f, 0.102844f, 0.112427f, 0.122620f,
- 0.133667f, 0.146362f, 0.159668f, 0.174438f, 0.190063f, 0.207153f, 0.225098f, 0.244263f,
- 0.264648f, 0.286377f, 0.308350f, 0.332275f, 0.357178f, 0.382080f, 0.408936f, 0.436035f,
- 0.465820f, 0.495361f, 0.776855f, 0.794922f, 0.797852f, 0.799316f, 0.798828f, 0.798340f,
- 0.000366f, 0.001644f, 0.002289f, 0.003046f, 0.004082f, 0.005032f, 0.005550f, 0.006599f,
- 0.007389f, 0.008369f, 0.009201f, 0.010315f, 0.011276f, 0.012405f, 0.013466f, 0.014587f,
- 0.015991f, 0.017303f, 0.018692f, 0.020081f, 0.021851f, 0.023865f, 0.025726f, 0.027771f,
- 0.030136f, 0.032532f, 0.035309f, 0.038422f, 0.041626f, 0.045044f, 0.048767f, 0.053375f,
- 0.057861f, 0.063477f, 0.069031f, 0.075684f, 0.082336f, 0.090515f, 0.099182f, 0.107849f,
- 0.118958f, 0.130005f, 0.142212f, 0.156128f, 0.170898f, 0.186890f, 0.203857f, 0.222534f,
- 0.241821f, 0.263428f, 0.285156f, 0.308105f, 0.332275f, 0.359131f, 0.385010f, 0.413086f,
- 0.441895f, 0.472168f, 0.767090f, 0.785645f, 0.789062f, 0.789551f, 0.790527f, 0.789551f,
- 0.000340f, 0.001434f, 0.002129f, 0.002827f, 0.003696f, 0.004463f, 0.005112f, 0.005730f,
- 0.006836f, 0.007465f, 0.008217f, 0.008972f, 0.009972f, 0.010887f, 0.011948f, 0.012794f,
- 0.013947f, 0.015030f, 0.016266f, 0.017670f, 0.019165f, 0.020813f, 0.022415f, 0.024216f,
- 0.026047f, 0.028336f, 0.030594f, 0.033142f, 0.035858f, 0.039154f, 0.042328f, 0.046265f,
- 0.050537f, 0.055237f, 0.059998f, 0.065918f, 0.072083f, 0.078918f, 0.086243f, 0.094788f,
- 0.104309f, 0.114807f, 0.125854f, 0.138672f, 0.152222f, 0.166992f, 0.183716f, 0.200928f,
- 0.220459f, 0.240112f, 0.261719f, 0.284668f, 0.308838f, 0.333740f, 0.360840f, 0.388672f,
- 0.418213f, 0.448730f, 0.756348f, 0.775391f, 0.779297f, 0.780273f, 0.781250f, 0.780273f,
- 0.000511f, 0.001174f, 0.002163f, 0.002554f, 0.003391f, 0.003990f, 0.004547f, 0.005211f,
- 0.005993f, 0.006653f, 0.007462f, 0.007942f, 0.008781f, 0.009476f, 0.010323f, 0.011444f,
- 0.012207f, 0.013062f, 0.014336f, 0.015427f, 0.016464f, 0.017929f, 0.019287f, 0.021164f,
- 0.022461f, 0.024567f, 0.026474f, 0.028885f, 0.031067f, 0.033630f, 0.036835f, 0.040070f,
- 0.043488f, 0.047394f, 0.051910f, 0.056732f, 0.062378f, 0.068481f, 0.075073f, 0.082764f,
- 0.090881f, 0.100403f, 0.110779f, 0.122009f, 0.134399f, 0.148560f, 0.163940f, 0.180298f,
- 0.198120f, 0.218140f, 0.239014f, 0.260986f, 0.285645f, 0.310059f, 0.336182f, 0.364502f,
- 0.393311f, 0.424316f, 0.744629f, 0.765137f, 0.769531f, 0.770508f, 0.771484f, 0.771484f,
- 0.000374f, 0.000983f, 0.001696f, 0.002279f, 0.002924f, 0.003571f, 0.004139f, 0.004742f,
- 0.005390f, 0.005817f, 0.006371f, 0.006981f, 0.007648f, 0.008354f, 0.009041f, 0.009727f,
- 0.010536f, 0.011375f, 0.012398f, 0.013535f, 0.014389f, 0.015541f, 0.016602f, 0.018112f,
- 0.019516f, 0.020996f, 0.022644f, 0.024582f, 0.026627f, 0.028748f, 0.031586f, 0.034210f,
- 0.037415f, 0.040588f, 0.044464f, 0.048676f, 0.053192f, 0.058472f, 0.064880f, 0.070984f,
- 0.078674f, 0.086914f, 0.096191f, 0.106445f, 0.117859f, 0.130859f, 0.144775f, 0.160522f,
- 0.177490f, 0.196411f, 0.215942f, 0.237793f, 0.261475f, 0.285645f, 0.312012f, 0.339111f,
- 0.368652f, 0.400391f, 0.733887f, 0.755371f, 0.759766f, 0.760742f, 0.761719f, 0.761719f,
- 0.000298f, 0.000924f, 0.001542f, 0.002125f, 0.002439f, 0.003153f, 0.003502f, 0.004196f,
- 0.004585f, 0.005039f, 0.005531f, 0.006054f, 0.006531f, 0.007217f, 0.007935f, 0.008362f,
- 0.009171f, 0.009773f, 0.010704f, 0.011505f, 0.012207f, 0.013321f, 0.014381f, 0.015556f,
- 0.016586f, 0.017792f, 0.019608f, 0.020844f, 0.022583f, 0.024536f, 0.026566f, 0.028885f,
- 0.031494f, 0.034332f, 0.037689f, 0.041260f, 0.045258f, 0.049927f, 0.054901f, 0.060699f,
- 0.067322f, 0.074768f, 0.082764f, 0.091675f, 0.102173f, 0.113831f, 0.126831f, 0.141113f,
- 0.157104f, 0.175049f, 0.194580f, 0.215210f, 0.237305f, 0.261475f, 0.287598f, 0.314697f,
- 0.344482f, 0.375977f, 0.721680f, 0.744629f, 0.749512f, 0.751465f, 0.751465f, 0.751465f,
- 0.000275f, 0.001002f, 0.001335f, 0.001704f, 0.002264f, 0.002790f, 0.003202f, 0.003555f,
- 0.004017f, 0.004368f, 0.004894f, 0.005318f, 0.005592f, 0.006241f, 0.006611f, 0.007317f,
- 0.007851f, 0.008560f, 0.009071f, 0.009758f, 0.010429f, 0.011375f, 0.011986f, 0.013130f,
- 0.013916f, 0.015205f, 0.016403f, 0.017624f, 0.019119f, 0.020660f, 0.022278f, 0.024582f,
- 0.026474f, 0.029007f, 0.031738f, 0.034668f, 0.038025f, 0.041962f, 0.046417f, 0.051270f,
- 0.056915f, 0.063110f, 0.070312f, 0.078369f, 0.087769f, 0.098145f, 0.109863f, 0.123352f,
- 0.137451f, 0.154785f, 0.172363f, 0.192261f, 0.214233f, 0.237793f, 0.262939f, 0.289795f,
- 0.319336f, 0.351074f, 0.708984f, 0.733398f, 0.738281f, 0.740234f, 0.741211f, 0.740723f,
- 0.000334f, 0.000805f, 0.001231f, 0.001640f, 0.002033f, 0.002277f, 0.002871f, 0.003115f,
- 0.003481f, 0.003895f, 0.004147f, 0.004379f, 0.004841f, 0.005306f, 0.005653f, 0.006241f,
- 0.006630f, 0.007217f, 0.007721f, 0.008133f, 0.008842f, 0.009529f, 0.010010f, 0.011017f,
- 0.011780f, 0.012733f, 0.013626f, 0.014824f, 0.015656f, 0.017212f, 0.018829f, 0.020248f,
- 0.021973f, 0.023926f, 0.026306f, 0.028900f, 0.031616f, 0.034973f, 0.038605f, 0.042816f,
- 0.047424f, 0.052765f, 0.059021f, 0.066162f, 0.074219f, 0.083435f, 0.093994f, 0.105835f,
- 0.119385f, 0.134277f, 0.151611f, 0.170532f, 0.191284f, 0.214233f, 0.239014f, 0.265381f,
- 0.293701f, 0.325684f, 0.696289f, 0.722168f, 0.727051f, 0.729004f, 0.729980f, 0.729980f,
- 0.000215f, 0.000635f, 0.001184f, 0.001348f, 0.001758f, 0.002171f, 0.002249f, 0.002596f,
- 0.003004f, 0.003325f, 0.003487f, 0.003906f, 0.004108f, 0.004494f, 0.004955f, 0.005241f,
- 0.005726f, 0.006134f, 0.006485f, 0.006916f, 0.007496f, 0.008072f, 0.008629f, 0.009071f,
- 0.009857f, 0.010651f, 0.011375f, 0.012283f, 0.013283f, 0.014320f, 0.015350f, 0.016739f,
- 0.017975f, 0.019852f, 0.021454f, 0.023712f, 0.025925f, 0.028717f, 0.031769f, 0.035217f,
- 0.038910f, 0.043396f, 0.048767f, 0.054901f, 0.061707f, 0.069824f, 0.078613f, 0.089783f,
- 0.101685f, 0.115479f, 0.131104f, 0.149292f, 0.168823f, 0.190674f, 0.214844f, 0.241211f,
- 0.269775f, 0.299561f, 0.683594f, 0.709961f, 0.715332f, 0.717773f, 0.718262f, 0.718750f,
- 0.000199f, 0.000826f, 0.001047f, 0.001288f, 0.001600f, 0.001857f, 0.002014f, 0.002329f,
- 0.002535f, 0.002785f, 0.003027f, 0.003210f, 0.003580f, 0.003788f, 0.004025f, 0.004444f,
- 0.004791f, 0.004974f, 0.005417f, 0.005909f, 0.006248f, 0.006672f, 0.007118f, 0.007664f,
- 0.008232f, 0.008759f, 0.009598f, 0.009964f, 0.010956f, 0.011650f, 0.012665f, 0.013702f,
- 0.014832f, 0.016144f, 0.017654f, 0.019211f, 0.021118f, 0.023102f, 0.025681f, 0.028320f,
- 0.031708f, 0.035370f, 0.039673f, 0.044739f, 0.050812f, 0.057800f, 0.065796f, 0.074768f,
- 0.085510f, 0.097961f, 0.112000f, 0.128662f, 0.147217f, 0.168213f, 0.190796f, 0.216309f,
- 0.244751f, 0.274902f, 0.669922f, 0.698730f, 0.703613f, 0.705566f, 0.707031f, 0.707031f,
- 0.000212f, 0.000458f, 0.000959f, 0.001192f, 0.001321f, 0.001500f, 0.001823f, 0.002064f,
- 0.002073f, 0.002293f, 0.002512f, 0.002768f, 0.002981f, 0.003138f, 0.003431f, 0.003765f,
- 0.003918f, 0.004238f, 0.004482f, 0.004814f, 0.005245f, 0.005531f, 0.005871f, 0.006214f,
- 0.006660f, 0.007236f, 0.007664f, 0.008331f, 0.008812f, 0.009628f, 0.010277f, 0.010979f,
- 0.012016f, 0.012978f, 0.014084f, 0.015495f, 0.016937f, 0.018494f, 0.020386f, 0.022659f,
- 0.025208f, 0.028183f, 0.031860f, 0.036072f, 0.040894f, 0.046326f, 0.053009f, 0.061127f,
- 0.070374f, 0.081238f, 0.094238f, 0.109314f, 0.126343f, 0.145874f, 0.167847f, 0.192505f,
- 0.219604f, 0.249634f, 0.656738f, 0.686035f, 0.690430f, 0.694336f, 0.694336f, 0.696777f,
- 0.000151f, 0.000529f, 0.000692f, 0.000883f, 0.001153f, 0.001337f, 0.001380f, 0.001520f,
- 0.001753f, 0.001886f, 0.002077f, 0.002243f, 0.002386f, 0.002556f, 0.002832f, 0.003029f,
- 0.003277f, 0.003447f, 0.003683f, 0.003952f, 0.004135f, 0.004578f, 0.004833f, 0.005222f,
- 0.005417f, 0.005810f, 0.006355f, 0.006718f, 0.007076f, 0.007652f, 0.008293f, 0.008980f,
- 0.009674f, 0.010422f, 0.011276f, 0.012283f, 0.013443f, 0.014664f, 0.016113f, 0.017853f,
- 0.019897f, 0.022156f, 0.024826f, 0.028275f, 0.032135f, 0.036865f, 0.042389f, 0.049011f,
- 0.056732f, 0.066223f, 0.077576f, 0.090820f, 0.106384f, 0.124512f, 0.145264f, 0.169067f,
- 0.195190f, 0.224976f, 0.642578f, 0.671387f, 0.679688f, 0.682617f, 0.682617f, 0.683594f,
- 0.000127f, 0.000376f, 0.000600f, 0.000721f, 0.000901f, 0.001066f, 0.001180f, 0.001332f,
- 0.001455f, 0.001549f, 0.001709f, 0.001831f, 0.001947f, 0.002150f, 0.002245f, 0.002443f,
- 0.002682f, 0.002844f, 0.002989f, 0.003201f, 0.003403f, 0.003683f, 0.003883f, 0.004097f,
- 0.004372f, 0.004665f, 0.004963f, 0.005348f, 0.005711f, 0.006165f, 0.006672f, 0.007004f,
- 0.007610f, 0.008278f, 0.008873f, 0.009636f, 0.010475f, 0.011475f, 0.012634f, 0.014053f,
- 0.015404f, 0.017242f, 0.019104f, 0.021774f, 0.024750f, 0.028458f, 0.032745f, 0.038391f,
- 0.044861f, 0.052795f, 0.062103f, 0.073914f, 0.087830f, 0.104553f, 0.123718f, 0.145996f,
- 0.171509f, 0.200439f, 0.627930f, 0.658691f, 0.666504f, 0.668945f, 0.671387f, 0.671387f,
- 0.000013f, 0.000374f, 0.000443f, 0.000688f, 0.000819f, 0.000844f, 0.001004f, 0.001132f,
- 0.001216f, 0.001259f, 0.001405f, 0.001523f, 0.001566f, 0.001753f, 0.001842f, 0.001997f,
- 0.002022f, 0.002287f, 0.002377f, 0.002541f, 0.002787f, 0.002878f, 0.003096f, 0.003283f,
- 0.003551f, 0.003651f, 0.003971f, 0.004272f, 0.004524f, 0.004887f, 0.005196f, 0.005527f,
- 0.005939f, 0.006386f, 0.006977f, 0.007526f, 0.008148f, 0.008835f, 0.009689f, 0.010689f,
- 0.011810f, 0.013000f, 0.014641f, 0.016388f, 0.018799f, 0.021469f, 0.024734f, 0.029022f,
- 0.034210f, 0.040588f, 0.048401f, 0.058319f, 0.070435f, 0.085205f, 0.102905f, 0.123901f,
- 0.147827f, 0.175903f, 0.612793f, 0.645508f, 0.653320f, 0.656250f, 0.657227f, 0.657227f,
- 0.000113f, 0.000234f, 0.000465f, 0.000547f, 0.000646f, 0.000684f, 0.000711f, 0.000832f,
- 0.000963f, 0.000999f, 0.001042f, 0.001183f, 0.001279f, 0.001402f, 0.001494f, 0.001513f,
- 0.001688f, 0.001716f, 0.001919f, 0.001993f, 0.002081f, 0.002253f, 0.002441f, 0.002575f,
- 0.002714f, 0.002876f, 0.003050f, 0.003214f, 0.003531f, 0.003714f, 0.003956f, 0.004276f,
- 0.004604f, 0.004967f, 0.005386f, 0.005718f, 0.006283f, 0.006790f, 0.007290f, 0.008133f,
- 0.008957f, 0.009987f, 0.010956f, 0.012375f, 0.013916f, 0.015991f, 0.018311f, 0.021347f,
- 0.025253f, 0.030289f, 0.036560f, 0.044586f, 0.054779f, 0.067749f, 0.083252f, 0.102722f,
- 0.125732f, 0.152100f, 0.597168f, 0.631836f, 0.639160f, 0.643555f, 0.643066f, 0.645508f,
- 0.000207f, 0.000175f, 0.000364f, 0.000507f, 0.000496f, 0.000569f, 0.000683f, 0.000584f,
- 0.000737f, 0.000764f, 0.000885f, 0.000964f, 0.000999f, 0.001076f, 0.001085f, 0.001272f,
- 0.001327f, 0.001354f, 0.001491f, 0.001494f, 0.001677f, 0.001781f, 0.001862f, 0.001976f,
- 0.002079f, 0.002190f, 0.002338f, 0.002481f, 0.002691f, 0.002811f, 0.003117f, 0.003214f,
- 0.003422f, 0.003706f, 0.003990f, 0.004314f, 0.004608f, 0.004982f, 0.005379f, 0.006027f,
- 0.006580f, 0.007351f, 0.008049f, 0.009041f, 0.010323f, 0.011551f, 0.013428f, 0.015419f,
- 0.018219f, 0.021713f, 0.026550f, 0.032715f, 0.040833f, 0.051605f, 0.065552f, 0.082458f,
- 0.104004f, 0.129395f, 0.582031f, 0.618652f, 0.625488f, 0.627930f, 0.630859f, 0.631348f,
- 0.000189f, 0.000160f, 0.000272f, 0.000387f, 0.000335f, 0.000486f, 0.000424f, 0.000469f,
- 0.000551f, 0.000589f, 0.000700f, 0.000727f, 0.000772f, 0.000859f, 0.000891f, 0.000872f,
- 0.001000f, 0.001048f, 0.001076f, 0.001172f, 0.001224f, 0.001311f, 0.001376f, 0.001450f,
- 0.001554f, 0.001591f, 0.001760f, 0.001838f, 0.001999f, 0.002180f, 0.002333f, 0.002388f,
- 0.002584f, 0.002777f, 0.002907f, 0.003162f, 0.003368f, 0.003677f, 0.003979f, 0.004303f,
- 0.004715f, 0.005188f, 0.005787f, 0.006378f, 0.007313f, 0.008194f, 0.009407f, 0.010887f,
- 0.012779f, 0.015198f, 0.018494f, 0.022888f, 0.029037f, 0.037659f, 0.048920f, 0.064270f,
- 0.083740f, 0.107300f, 0.565918f, 0.603516f, 0.611328f, 0.614746f, 0.617188f, 0.618164f,
- 0.000000f, 0.000170f, 0.000207f, 0.000274f, 0.000292f, 0.000309f, 0.000381f, 0.000326f,
- 0.000418f, 0.000439f, 0.000519f, 0.000519f, 0.000560f, 0.000574f, 0.000652f, 0.000678f,
- 0.000717f, 0.000756f, 0.000782f, 0.000820f, 0.000893f, 0.000937f, 0.000991f, 0.001063f,
- 0.001112f, 0.001174f, 0.001284f, 0.001302f, 0.001408f, 0.001460f, 0.001586f, 0.001711f,
- 0.001826f, 0.001959f, 0.002058f, 0.002207f, 0.002388f, 0.002565f, 0.002836f, 0.003046f,
- 0.003284f, 0.003567f, 0.004009f, 0.004463f, 0.005001f, 0.005661f, 0.006451f, 0.007473f,
- 0.008751f, 0.010368f, 0.012611f, 0.015587f, 0.019730f, 0.025787f, 0.034729f, 0.047272f,
- 0.064392f, 0.087097f, 0.550293f, 0.587891f, 0.596680f, 0.600586f, 0.602539f, 0.603516f,
- 0.000000f, 0.000057f, 0.000175f, 0.000210f, 0.000221f, 0.000261f, 0.000224f, 0.000285f,
- 0.000296f, 0.000329f, 0.000374f, 0.000329f, 0.000344f, 0.000416f, 0.000421f, 0.000479f,
- 0.000455f, 0.000530f, 0.000552f, 0.000598f, 0.000640f, 0.000670f, 0.000695f, 0.000740f,
- 0.000798f, 0.000806f, 0.000883f, 0.000908f, 0.000983f, 0.001094f, 0.001083f, 0.001169f,
- 0.001242f, 0.001340f, 0.001440f, 0.001536f, 0.001601f, 0.001752f, 0.001893f, 0.002029f,
- 0.002218f, 0.002424f, 0.002651f, 0.002934f, 0.003294f, 0.003681f, 0.004200f, 0.004833f,
- 0.005688f, 0.006863f, 0.008202f, 0.010178f, 0.012955f, 0.016846f, 0.023163f, 0.032745f,
- 0.047150f, 0.067383f, 0.534180f, 0.574219f, 0.582031f, 0.584961f, 0.586914f, 0.589844f,
- 0.000000f, 0.000105f, 0.000145f, 0.000101f, 0.000161f, 0.000163f, 0.000165f, 0.000193f,
- 0.000190f, 0.000202f, 0.000205f, 0.000260f, 0.000251f, 0.000281f, 0.000305f, 0.000316f,
- 0.000323f, 0.000346f, 0.000364f, 0.000383f, 0.000413f, 0.000436f, 0.000461f, 0.000486f,
- 0.000515f, 0.000564f, 0.000594f, 0.000616f, 0.000639f, 0.000677f, 0.000729f, 0.000748f,
- 0.000842f, 0.000861f, 0.000943f, 0.000970f, 0.001054f, 0.001120f, 0.001219f, 0.001310f,
- 0.001398f, 0.001534f, 0.001709f, 0.001852f, 0.002096f, 0.002291f, 0.002594f, 0.002987f,
- 0.003481f, 0.004128f, 0.004997f, 0.006218f, 0.007950f, 0.010445f, 0.014313f, 0.020874f,
- 0.032166f, 0.049866f, 0.517578f, 0.558105f, 0.567383f, 0.570801f, 0.573730f, 0.574707f,
- 0.000000f, 0.000097f, 0.000089f, 0.000082f, 0.000092f, 0.000096f, 0.000092f, 0.000118f,
- 0.000126f, 0.000130f, 0.000138f, 0.000138f, 0.000143f, 0.000163f, 0.000181f, 0.000187f,
- 0.000195f, 0.000228f, 0.000221f, 0.000261f, 0.000243f, 0.000254f, 0.000274f, 0.000299f,
- 0.000334f, 0.000332f, 0.000345f, 0.000362f, 0.000394f, 0.000410f, 0.000433f, 0.000463f,
- 0.000497f, 0.000510f, 0.000562f, 0.000594f, 0.000636f, 0.000670f, 0.000731f, 0.000777f,
- 0.000832f, 0.000927f, 0.000991f, 0.001101f, 0.001210f, 0.001350f, 0.001513f, 0.001720f,
- 0.001999f, 0.002373f, 0.002815f, 0.003498f, 0.004478f, 0.006001f, 0.008347f, 0.012299f,
- 0.019669f, 0.034210f, 0.501465f, 0.542969f, 0.552246f, 0.556641f, 0.559082f, 0.559570f,
- 0.000107f, 0.000087f, 0.000077f, 0.000070f, 0.000065f, 0.000066f, 0.000059f, 0.000064f,
- 0.000065f, 0.000071f, 0.000070f, 0.000095f, 0.000081f, 0.000085f, 0.000110f, 0.000097f,
- 0.000117f, 0.000126f, 0.000127f, 0.000133f, 0.000132f, 0.000141f, 0.000169f, 0.000173f,
- 0.000185f, 0.000183f, 0.000192f, 0.000215f, 0.000216f, 0.000235f, 0.000236f, 0.000265f,
- 0.000278f, 0.000290f, 0.000313f, 0.000317f, 0.000347f, 0.000365f, 0.000400f, 0.000422f,
- 0.000457f, 0.000494f, 0.000535f, 0.000586f, 0.000639f, 0.000700f, 0.000786f, 0.000888f,
- 0.001019f, 0.001207f, 0.001435f, 0.001746f, 0.002258f, 0.003019f, 0.004299f, 0.006523f,
- 0.010612f, 0.020859f, 0.484619f, 0.527344f, 0.536621f, 0.541504f, 0.542969f, 0.544922f,
- 0.000092f, 0.000070f, 0.000062f, 0.000056f, 0.000051f, 0.000048f, 0.000045f, 0.000044f,
- 0.000041f, 0.000039f, 0.000038f, 0.000037f, 0.000047f, 0.000039f, 0.000041f, 0.000041f,
- 0.000058f, 0.000053f, 0.000062f, 0.000064f, 0.000068f, 0.000072f, 0.000076f, 0.000076f,
- 0.000078f, 0.000092f, 0.000085f, 0.000101f, 0.000104f, 0.000110f, 0.000115f, 0.000118f,
- 0.000127f, 0.000133f, 0.000152f, 0.000150f, 0.000163f, 0.000190f, 0.000190f, 0.000202f,
- 0.000213f, 0.000225f, 0.000249f, 0.000268f, 0.000296f, 0.000321f, 0.000354f, 0.000402f,
- 0.000458f, 0.000520f, 0.000618f, 0.000744f, 0.000950f, 0.001263f, 0.001822f, 0.002865f,
- 0.005028f, 0.010544f, 0.468018f, 0.511230f, 0.521484f, 0.524902f, 0.529297f, 0.529785f,
- 0.000067f, 0.000049f, 0.000041f, 0.000037f, 0.000034f, 0.000032f, 0.000031f, 0.000029f,
- 0.000028f, 0.000027f, 0.000027f, 0.000026f, 0.000025f, 0.000023f, 0.000022f, 0.000021f,
- 0.000020f, 0.000020f, 0.000023f, 0.000024f, 0.000021f, 0.000022f, 0.000025f, 0.000029f,
- 0.000030f, 0.000034f, 0.000036f, 0.000034f, 0.000039f, 0.000038f, 0.000045f, 0.000045f,
- 0.000048f, 0.000051f, 0.000053f, 0.000055f, 0.000063f, 0.000070f, 0.000073f, 0.000073f,
- 0.000080f, 0.000084f, 0.000089f, 0.000102f, 0.000107f, 0.000115f, 0.000128f, 0.000145f,
- 0.000156f, 0.000178f, 0.000213f, 0.000253f, 0.000311f, 0.000400f, 0.000572f, 0.000916f,
- 0.001751f, 0.004158f, 0.450439f, 0.496338f, 0.505859f, 0.510742f, 0.513184f, 0.514648f,
- 0.000016f, 0.000013f, 0.000011f, 0.000010f, 0.000012f, 0.000012f, 0.000011f, 0.000012f,
- 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f,
- 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f,
- 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000009f, 0.000009f, 0.000009f,
- 0.000009f, 0.000011f, 0.000012f, 0.000012f, 0.000015f, 0.000014f, 0.000014f, 0.000017f,
- 0.000018f, 0.000020f, 0.000020f, 0.000022f, 0.000026f, 0.000027f, 0.000028f, 0.000027f,
- 0.000033f, 0.000036f, 0.000044f, 0.000051f, 0.000057f, 0.000078f, 0.000103f, 0.000159f,
- 0.000315f, 0.000997f, 0.433350f, 0.479980f, 0.490234f, 0.495605f, 0.498291f, 0.499512f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f,
- 0.000007f, 0.000025f, 0.416016f, 0.464111f, 0.474854f, 0.479248f, 0.481934f, 0.484375f,
- },
- {
- 0.023209f, 0.069336f, 0.113037f, 0.154663f, 0.193726f, 0.231812f, 0.267578f, 0.301758f,
- 0.333740f, 0.364258f, 0.393555f, 0.421631f, 0.447510f, 0.473145f, 0.497070f, 0.520020f,
- 0.541992f, 0.562988f, 0.583008f, 0.602539f, 0.620605f, 0.638184f, 0.655762f, 0.671387f,
- 0.687500f, 0.702637f, 0.716309f, 0.729980f, 0.744141f, 0.757812f, 0.769531f, 0.782227f,
- 0.793945f, 0.804688f, 0.815918f, 0.826172f, 0.836426f, 0.846191f, 0.855957f, 0.865234f,
- 0.874023f, 0.882812f, 0.891113f, 0.898926f, 0.907227f, 0.915039f, 0.922852f, 0.929688f,
- 0.937012f, 0.943848f, 0.950684f, 0.956543f, 0.963379f, 0.969238f, 0.976074f, 0.981445f,
- 0.986816f, 0.992676f, 0.991211f, 0.978516f, 0.968750f, 0.960449f, 0.952637f, 0.945312f,
- 0.019730f, 0.059631f, 0.098206f, 0.135864f, 0.172119f, 0.206421f, 0.239624f, 0.272461f,
- 0.304932f, 0.333984f, 0.362549f, 0.389648f, 0.416016f, 0.441406f, 0.466309f, 0.489502f,
- 0.511230f, 0.533203f, 0.554199f, 0.573242f, 0.593262f, 0.611816f, 0.629395f, 0.645508f,
- 0.662598f, 0.678711f, 0.693359f, 0.708496f, 0.722168f, 0.735840f, 0.750000f, 0.762207f,
- 0.773926f, 0.786133f, 0.796875f, 0.808594f, 0.818848f, 0.829590f, 0.839355f, 0.850098f,
- 0.859863f, 0.868652f, 0.877441f, 0.886230f, 0.895020f, 0.903809f, 0.911133f, 0.918457f,
- 0.925781f, 0.933105f, 0.940430f, 0.946777f, 0.954590f, 0.960938f, 0.966797f, 0.973145f,
- 0.979004f, 0.984863f, 0.987793f, 0.976074f, 0.966797f, 0.958496f, 0.951172f, 0.943848f,
- 0.017151f, 0.051636f, 0.085510f, 0.119202f, 0.152466f, 0.184814f, 0.216187f, 0.246582f,
- 0.276855f, 0.305664f, 0.332764f, 0.360107f, 0.385986f, 0.411621f, 0.435791f, 0.459473f,
- 0.481445f, 0.502441f, 0.524414f, 0.546387f, 0.565430f, 0.583496f, 0.602051f, 0.619629f,
- 0.636719f, 0.653320f, 0.669434f, 0.684082f, 0.699707f, 0.713867f, 0.728027f, 0.741211f,
- 0.754883f, 0.767090f, 0.779297f, 0.791016f, 0.802734f, 0.813965f, 0.824219f, 0.833984f,
- 0.843750f, 0.854492f, 0.863281f, 0.873535f, 0.882324f, 0.890137f, 0.898926f, 0.906738f,
- 0.915039f, 0.922852f, 0.930176f, 0.937012f, 0.944336f, 0.951172f, 0.958008f, 0.964844f,
- 0.970703f, 0.977051f, 0.983887f, 0.972656f, 0.964355f, 0.956543f, 0.949219f, 0.942383f,
- 0.014885f, 0.044678f, 0.075195f, 0.104919f, 0.135254f, 0.165649f, 0.194702f, 0.223633f,
- 0.251221f, 0.279053f, 0.305420f, 0.331543f, 0.357422f, 0.382568f, 0.406982f, 0.430420f,
- 0.453369f, 0.475586f, 0.496582f, 0.517090f, 0.536133f, 0.556641f, 0.575684f, 0.592773f,
- 0.611328f, 0.628418f, 0.643555f, 0.661621f, 0.676270f, 0.691406f, 0.705566f, 0.720215f,
- 0.733887f, 0.746582f, 0.759766f, 0.772949f, 0.784668f, 0.795898f, 0.807129f, 0.818359f,
- 0.828125f, 0.838867f, 0.848633f, 0.858887f, 0.867676f, 0.877441f, 0.886230f, 0.894531f,
- 0.903320f, 0.911621f, 0.919434f, 0.927734f, 0.934570f, 0.940918f, 0.948730f, 0.956543f,
- 0.962402f, 0.969238f, 0.979980f, 0.970215f, 0.961914f, 0.954102f, 0.947266f, 0.940918f,
- 0.013046f, 0.038940f, 0.066162f, 0.093323f, 0.120544f, 0.147583f, 0.174683f, 0.201538f,
- 0.228516f, 0.254639f, 0.280518f, 0.304932f, 0.330566f, 0.354492f, 0.379395f, 0.402100f,
- 0.424561f, 0.446533f, 0.467529f, 0.488525f, 0.509277f, 0.529297f, 0.547852f, 0.566895f,
- 0.585449f, 0.602539f, 0.620605f, 0.636230f, 0.653809f, 0.667480f, 0.684570f, 0.698242f,
- 0.712891f, 0.726562f, 0.739746f, 0.753418f, 0.765625f, 0.777344f, 0.789551f, 0.801270f,
- 0.812500f, 0.823730f, 0.833984f, 0.844238f, 0.854004f, 0.863770f, 0.874023f, 0.882324f,
- 0.891113f, 0.899902f, 0.908203f, 0.916504f, 0.924805f, 0.932129f, 0.939453f, 0.947266f,
- 0.954102f, 0.960938f, 0.976562f, 0.967285f, 0.958984f, 0.951660f, 0.944824f, 0.938965f,
- 0.011696f, 0.034698f, 0.058807f, 0.083130f, 0.107727f, 0.132324f, 0.156982f, 0.182251f,
- 0.207153f, 0.232178f, 0.256836f, 0.280762f, 0.304688f, 0.328369f, 0.352295f, 0.375244f,
- 0.397461f, 0.419434f, 0.440430f, 0.461914f, 0.482178f, 0.501953f, 0.522461f, 0.540527f,
- 0.559570f, 0.577148f, 0.595703f, 0.613281f, 0.628418f, 0.644531f, 0.661621f, 0.676270f,
- 0.691406f, 0.705078f, 0.719727f, 0.733887f, 0.746094f, 0.759766f, 0.771973f, 0.784180f,
- 0.795898f, 0.807617f, 0.818359f, 0.829102f, 0.839844f, 0.850098f, 0.859375f, 0.869629f,
- 0.878906f, 0.887695f, 0.896484f, 0.905273f, 0.914062f, 0.921875f, 0.929688f, 0.937988f,
- 0.944824f, 0.952637f, 0.973145f, 0.963379f, 0.956055f, 0.949219f, 0.942871f, 0.937012f,
- 0.010094f, 0.030975f, 0.052063f, 0.073975f, 0.096069f, 0.118713f, 0.141479f, 0.164551f,
- 0.187866f, 0.211182f, 0.234985f, 0.258057f, 0.280518f, 0.303467f, 0.326172f, 0.348145f,
- 0.370117f, 0.392822f, 0.413574f, 0.434814f, 0.455322f, 0.476074f, 0.495361f, 0.515137f,
- 0.533203f, 0.551758f, 0.569824f, 0.586426f, 0.604492f, 0.621582f, 0.637695f, 0.654297f,
- 0.668945f, 0.683594f, 0.699219f, 0.712402f, 0.728516f, 0.741699f, 0.753906f, 0.767090f,
- 0.778320f, 0.790527f, 0.802246f, 0.813965f, 0.824219f, 0.835449f, 0.846680f, 0.855957f,
- 0.865723f, 0.875488f, 0.884766f, 0.894043f, 0.902832f, 0.911133f, 0.919434f, 0.927734f,
- 0.935547f, 0.943359f, 0.968750f, 0.960449f, 0.953125f, 0.946289f, 0.940430f, 0.934570f,
- 0.008797f, 0.027466f, 0.045959f, 0.066223f, 0.086304f, 0.106506f, 0.127441f, 0.149170f,
- 0.170532f, 0.192261f, 0.213867f, 0.236206f, 0.258057f, 0.280273f, 0.301758f, 0.323486f,
- 0.344727f, 0.367188f, 0.388184f, 0.408447f, 0.429443f, 0.450439f, 0.469727f, 0.489014f,
- 0.508301f, 0.526855f, 0.545410f, 0.562500f, 0.581055f, 0.597656f, 0.613770f, 0.630859f,
- 0.647461f, 0.663574f, 0.677734f, 0.693359f, 0.707031f, 0.720703f, 0.735352f, 0.748047f,
- 0.760254f, 0.772461f, 0.785156f, 0.797363f, 0.810059f, 0.819824f, 0.831543f, 0.842285f,
- 0.852051f, 0.862793f, 0.873047f, 0.882324f, 0.891113f, 0.899902f, 0.909180f, 0.917969f,
- 0.925781f, 0.934082f, 0.964355f, 0.957031f, 0.949707f, 0.943359f, 0.937988f, 0.932129f,
- 0.007927f, 0.024414f, 0.041077f, 0.059204f, 0.077148f, 0.095581f, 0.115479f, 0.134644f,
- 0.154785f, 0.175293f, 0.196045f, 0.216553f, 0.236694f, 0.258057f, 0.278809f, 0.300049f,
- 0.321289f, 0.342529f, 0.363281f, 0.383545f, 0.403564f, 0.424072f, 0.444092f, 0.463135f,
- 0.483154f, 0.501953f, 0.519531f, 0.539062f, 0.555664f, 0.574707f, 0.591309f, 0.608398f,
- 0.624512f, 0.640137f, 0.655762f, 0.671875f, 0.686523f, 0.701172f, 0.715820f, 0.729004f,
- 0.742676f, 0.755859f, 0.769043f, 0.781738f, 0.792969f, 0.805176f, 0.816895f, 0.827637f,
- 0.838867f, 0.849121f, 0.859375f, 0.870117f, 0.879395f, 0.889160f, 0.898926f, 0.906738f,
- 0.916504f, 0.924805f, 0.960938f, 0.953125f, 0.947266f, 0.940430f, 0.935547f, 0.929688f,
- 0.007080f, 0.022247f, 0.037445f, 0.053070f, 0.069336f, 0.086975f, 0.103577f, 0.121948f,
- 0.140503f, 0.158936f, 0.178833f, 0.198242f, 0.217651f, 0.237793f, 0.257812f, 0.278076f,
- 0.297607f, 0.318604f, 0.338623f, 0.358643f, 0.378662f, 0.399170f, 0.418213f, 0.438721f,
- 0.457520f, 0.477051f, 0.495361f, 0.513672f, 0.531250f, 0.549316f, 0.567383f, 0.583984f,
- 0.601562f, 0.617676f, 0.634277f, 0.650391f, 0.666016f, 0.680176f, 0.695801f, 0.710449f,
- 0.723633f, 0.737305f, 0.750977f, 0.764648f, 0.776367f, 0.789551f, 0.802246f, 0.813477f,
- 0.824219f, 0.835938f, 0.846680f, 0.857422f, 0.867188f, 0.876953f, 0.887207f, 0.895996f,
- 0.905762f, 0.915527f, 0.955566f, 0.949707f, 0.943359f, 0.937988f, 0.932129f, 0.927246f,
- 0.006363f, 0.019516f, 0.033691f, 0.047577f, 0.062469f, 0.078186f, 0.093933f, 0.110657f,
- 0.127563f, 0.144653f, 0.162598f, 0.181152f, 0.199707f, 0.218384f, 0.237427f, 0.257324f,
- 0.276367f, 0.295166f, 0.315674f, 0.335205f, 0.355225f, 0.374756f, 0.393799f, 0.413574f,
- 0.432617f, 0.451904f, 0.470459f, 0.489258f, 0.508301f, 0.525879f, 0.543945f, 0.560059f,
- 0.578613f, 0.595703f, 0.612793f, 0.628418f, 0.644531f, 0.659668f, 0.675293f, 0.689941f,
- 0.704590f, 0.719238f, 0.732910f, 0.747070f, 0.759766f, 0.773438f, 0.785156f, 0.797852f,
- 0.809570f, 0.821289f, 0.833008f, 0.843750f, 0.854980f, 0.865723f, 0.875977f, 0.886230f,
- 0.895508f, 0.904785f, 0.951660f, 0.945801f, 0.939941f, 0.934570f, 0.929199f, 0.924805f,
- 0.005985f, 0.017776f, 0.030212f, 0.043030f, 0.056488f, 0.070190f, 0.085205f, 0.100342f,
- 0.115723f, 0.132446f, 0.148438f, 0.165771f, 0.183228f, 0.200684f, 0.218994f, 0.237183f,
- 0.255859f, 0.274170f, 0.292725f, 0.313477f, 0.331299f, 0.351318f, 0.369873f, 0.389160f,
- 0.408936f, 0.426758f, 0.446533f, 0.464844f, 0.483154f, 0.501465f, 0.519531f, 0.537598f,
- 0.555664f, 0.572754f, 0.589844f, 0.605957f, 0.622070f, 0.639648f, 0.654297f, 0.670898f,
- 0.685059f, 0.700195f, 0.714844f, 0.728516f, 0.742188f, 0.754883f, 0.769043f, 0.781738f,
- 0.795410f, 0.808105f, 0.818359f, 0.830566f, 0.841797f, 0.853027f, 0.863770f, 0.874023f,
- 0.884766f, 0.893555f, 0.947266f, 0.942383f, 0.936523f, 0.930664f, 0.926270f, 0.921387f,
- 0.005173f, 0.016083f, 0.027359f, 0.038849f, 0.051056f, 0.063843f, 0.077026f, 0.091064f,
- 0.105591f, 0.120422f, 0.135498f, 0.150879f, 0.167480f, 0.184326f, 0.201172f, 0.218384f,
- 0.236084f, 0.254395f, 0.272949f, 0.291260f, 0.309570f, 0.328125f, 0.346680f, 0.365967f,
- 0.384766f, 0.403320f, 0.422119f, 0.440918f, 0.458984f, 0.477783f, 0.496094f, 0.513672f,
- 0.531738f, 0.548828f, 0.566406f, 0.583984f, 0.600098f, 0.617188f, 0.632812f, 0.649902f,
- 0.665527f, 0.681152f, 0.694824f, 0.709473f, 0.724121f, 0.738770f, 0.752441f, 0.765137f,
- 0.778809f, 0.791992f, 0.803711f, 0.815918f, 0.828125f, 0.839844f, 0.851562f, 0.862793f,
- 0.873535f, 0.883789f, 0.941895f, 0.938477f, 0.933105f, 0.927246f, 0.922363f, 0.918457f,
- 0.004791f, 0.014610f, 0.024475f, 0.035126f, 0.046478f, 0.057922f, 0.069885f, 0.083008f,
- 0.096069f, 0.109253f, 0.123840f, 0.137939f, 0.153076f, 0.168701f, 0.185059f, 0.200928f,
- 0.218262f, 0.234985f, 0.252686f, 0.270264f, 0.288086f, 0.306396f, 0.324951f, 0.343018f,
- 0.362305f, 0.379883f, 0.398926f, 0.417236f, 0.435547f, 0.454346f, 0.472656f, 0.491211f,
- 0.508301f, 0.526855f, 0.543457f, 0.561523f, 0.578125f, 0.595215f, 0.612305f, 0.628418f,
- 0.644043f, 0.660645f, 0.675781f, 0.691406f, 0.706055f, 0.720215f, 0.735840f, 0.749023f,
- 0.762695f, 0.776855f, 0.789551f, 0.800781f, 0.814941f, 0.826172f, 0.838867f, 0.851074f,
- 0.862305f, 0.872070f, 0.937500f, 0.933594f, 0.929199f, 0.923828f, 0.919434f, 0.915527f,
- 0.004387f, 0.013268f, 0.022385f, 0.031860f, 0.041962f, 0.052612f, 0.063171f, 0.075073f,
- 0.086792f, 0.099854f, 0.113037f, 0.125977f, 0.140381f, 0.154663f, 0.169678f, 0.184814f,
- 0.200562f, 0.217773f, 0.234131f, 0.250732f, 0.268066f, 0.284912f, 0.303223f, 0.321289f,
- 0.339355f, 0.357666f, 0.375488f, 0.394043f, 0.411865f, 0.430664f, 0.448730f, 0.467041f,
- 0.485352f, 0.503418f, 0.520508f, 0.539062f, 0.556152f, 0.573242f, 0.590820f, 0.606934f,
- 0.624512f, 0.640625f, 0.655762f, 0.672363f, 0.687500f, 0.702148f, 0.718750f, 0.731934f,
- 0.746582f, 0.759766f, 0.772949f, 0.787109f, 0.800781f, 0.813477f, 0.825195f, 0.838379f,
- 0.850098f, 0.861816f, 0.932617f, 0.929688f, 0.925293f, 0.919922f, 0.915527f, 0.912109f,
- 0.003941f, 0.011986f, 0.020630f, 0.029144f, 0.038544f, 0.048035f, 0.058075f, 0.068542f,
- 0.079590f, 0.090942f, 0.102661f, 0.115295f, 0.128296f, 0.141602f, 0.155518f, 0.170654f,
- 0.185425f, 0.200684f, 0.216309f, 0.231812f, 0.249146f, 0.265137f, 0.282471f, 0.299072f,
- 0.317139f, 0.334717f, 0.352783f, 0.371338f, 0.388916f, 0.406982f, 0.425537f, 0.443848f,
- 0.461914f, 0.479980f, 0.498291f, 0.515625f, 0.533203f, 0.550293f, 0.568359f, 0.585449f,
- 0.603027f, 0.618652f, 0.635742f, 0.652344f, 0.668457f, 0.684082f, 0.699219f, 0.713867f,
- 0.729004f, 0.743652f, 0.757812f, 0.771484f, 0.785645f, 0.798828f, 0.812012f, 0.824219f,
- 0.836914f, 0.850098f, 0.927246f, 0.925293f, 0.920410f, 0.916504f, 0.912598f, 0.908203f,
- 0.003790f, 0.011009f, 0.018829f, 0.026779f, 0.035339f, 0.043762f, 0.053223f, 0.062408f,
- 0.072693f, 0.082947f, 0.093689f, 0.105469f, 0.117554f, 0.130005f, 0.142822f, 0.156494f,
- 0.170166f, 0.184448f, 0.198975f, 0.213745f, 0.230469f, 0.246460f, 0.262939f, 0.279541f,
- 0.296143f, 0.313721f, 0.331299f, 0.348633f, 0.367188f, 0.384521f, 0.402344f, 0.420410f,
- 0.438965f, 0.457275f, 0.475830f, 0.493164f, 0.510742f, 0.528809f, 0.546387f, 0.564453f,
- 0.581055f, 0.598145f, 0.615234f, 0.631836f, 0.647461f, 0.665527f, 0.680664f, 0.696289f,
- 0.711914f, 0.728027f, 0.741211f, 0.756836f, 0.770508f, 0.783691f, 0.798340f, 0.811523f,
- 0.824219f, 0.837402f, 0.921387f, 0.920410f, 0.916504f, 0.913086f, 0.908691f, 0.904785f,
- 0.003479f, 0.009949f, 0.016937f, 0.024445f, 0.031708f, 0.039948f, 0.048218f, 0.056793f,
- 0.066223f, 0.075928f, 0.085632f, 0.096313f, 0.107178f, 0.118958f, 0.130493f, 0.143311f,
- 0.156494f, 0.170044f, 0.183960f, 0.197876f, 0.213501f, 0.228027f, 0.244019f, 0.260010f,
- 0.276611f, 0.293213f, 0.309814f, 0.327393f, 0.344482f, 0.363037f, 0.379883f, 0.398438f,
- 0.416504f, 0.434082f, 0.451904f, 0.470215f, 0.488525f, 0.505859f, 0.523926f, 0.541504f,
- 0.559570f, 0.577637f, 0.594238f, 0.611328f, 0.628418f, 0.645020f, 0.661133f, 0.677246f,
- 0.693848f, 0.709961f, 0.725586f, 0.739746f, 0.755371f, 0.769531f, 0.783203f, 0.797852f,
- 0.810547f, 0.824707f, 0.916016f, 0.915527f, 0.912109f, 0.908691f, 0.904785f, 0.900879f,
- 0.003014f, 0.008842f, 0.015640f, 0.022018f, 0.028885f, 0.036163f, 0.044250f, 0.051819f,
- 0.059967f, 0.069031f, 0.078247f, 0.088135f, 0.098267f, 0.108337f, 0.119751f, 0.131470f,
- 0.143433f, 0.156006f, 0.169189f, 0.183105f, 0.196655f, 0.211304f, 0.226196f, 0.241211f,
- 0.257080f, 0.273438f, 0.289307f, 0.306396f, 0.323975f, 0.340576f, 0.358398f, 0.375732f,
- 0.393799f, 0.411133f, 0.429688f, 0.447998f, 0.466064f, 0.483887f, 0.501465f, 0.519531f,
- 0.537598f, 0.555664f, 0.573242f, 0.590820f, 0.607910f, 0.625000f, 0.642578f, 0.658203f,
- 0.675293f, 0.691406f, 0.707520f, 0.724121f, 0.738770f, 0.753418f, 0.769531f, 0.783203f,
- 0.797363f, 0.811523f, 0.910156f, 0.910645f, 0.907715f, 0.904785f, 0.900879f, 0.896973f,
- 0.002861f, 0.008591f, 0.014000f, 0.020203f, 0.026962f, 0.033203f, 0.040161f, 0.047485f,
- 0.055237f, 0.062988f, 0.071594f, 0.080750f, 0.089905f, 0.099854f, 0.109741f, 0.120056f,
- 0.131592f, 0.143311f, 0.155640f, 0.167969f, 0.181763f, 0.195190f, 0.209229f, 0.223877f,
- 0.238647f, 0.254150f, 0.269531f, 0.285889f, 0.302979f, 0.319824f, 0.336426f, 0.354004f,
- 0.372070f, 0.389893f, 0.406982f, 0.424805f, 0.443359f, 0.461182f, 0.479492f, 0.498047f,
- 0.515625f, 0.533691f, 0.551270f, 0.569336f, 0.587402f, 0.604492f, 0.622070f, 0.639160f,
- 0.656738f, 0.673828f, 0.689941f, 0.705566f, 0.722168f, 0.737793f, 0.753418f, 0.768066f,
- 0.783203f, 0.798340f, 0.904297f, 0.905762f, 0.902832f, 0.899414f, 0.895996f, 0.893066f,
- 0.002535f, 0.007812f, 0.013252f, 0.018738f, 0.024384f, 0.030548f, 0.036774f, 0.043427f,
- 0.050476f, 0.057556f, 0.065491f, 0.073425f, 0.082458f, 0.091370f, 0.100525f, 0.110413f,
- 0.120605f, 0.131592f, 0.142822f, 0.154663f, 0.166870f, 0.180176f, 0.193237f, 0.207031f,
- 0.221191f, 0.236084f, 0.250732f, 0.266602f, 0.282959f, 0.299072f, 0.315430f, 0.332520f,
- 0.350342f, 0.367676f, 0.385010f, 0.403076f, 0.421631f, 0.439209f, 0.457520f, 0.475342f,
- 0.494141f, 0.512695f, 0.530273f, 0.547852f, 0.565918f, 0.584473f, 0.602051f, 0.619629f,
- 0.637207f, 0.655273f, 0.671387f, 0.688965f, 0.706055f, 0.721191f, 0.737305f, 0.752930f,
- 0.769531f, 0.784668f, 0.898438f, 0.900879f, 0.897949f, 0.894531f, 0.891602f, 0.888672f,
- 0.002411f, 0.007103f, 0.012161f, 0.017105f, 0.022385f, 0.027985f, 0.033203f, 0.039581f,
- 0.045532f, 0.052521f, 0.059814f, 0.067261f, 0.074768f, 0.083313f, 0.092041f, 0.101013f,
- 0.110291f, 0.120361f, 0.130615f, 0.141724f, 0.153076f, 0.165283f, 0.177612f, 0.190918f,
- 0.204346f, 0.218506f, 0.233154f, 0.247559f, 0.263428f, 0.279053f, 0.295166f, 0.312256f,
- 0.328857f, 0.345947f, 0.363281f, 0.381348f, 0.398926f, 0.417236f, 0.435547f, 0.453369f,
- 0.471191f, 0.489502f, 0.508301f, 0.525879f, 0.545410f, 0.563477f, 0.581055f, 0.600098f,
- 0.617676f, 0.635254f, 0.653809f, 0.670410f, 0.687500f, 0.705078f, 0.720703f, 0.736816f,
- 0.753418f, 0.769531f, 0.892090f, 0.895020f, 0.892578f, 0.889648f, 0.887207f, 0.884277f,
- 0.002344f, 0.006565f, 0.011322f, 0.015686f, 0.020630f, 0.025574f, 0.030807f, 0.035980f,
- 0.042084f, 0.048279f, 0.054352f, 0.061432f, 0.068848f, 0.076172f, 0.083618f, 0.092590f,
- 0.101135f, 0.109619f, 0.120178f, 0.130249f, 0.140991f, 0.151978f, 0.163696f, 0.175781f,
- 0.188721f, 0.202026f, 0.215820f, 0.230103f, 0.244873f, 0.259766f, 0.275635f, 0.291504f,
- 0.307617f, 0.324219f, 0.342041f, 0.358887f, 0.376709f, 0.394775f, 0.412354f, 0.431152f,
- 0.448975f, 0.468018f, 0.486328f, 0.504883f, 0.523438f, 0.541992f, 0.560547f, 0.579102f,
- 0.597656f, 0.615234f, 0.633789f, 0.651855f, 0.669434f, 0.687500f, 0.704590f, 0.721680f,
- 0.738770f, 0.755859f, 0.886719f, 0.889648f, 0.887695f, 0.884766f, 0.882812f, 0.879883f,
- 0.002003f, 0.006268f, 0.009987f, 0.014198f, 0.018875f, 0.023605f, 0.028259f, 0.033203f,
- 0.038513f, 0.044495f, 0.049866f, 0.056152f, 0.062500f, 0.069458f, 0.076660f, 0.084473f,
- 0.092163f, 0.100586f, 0.109741f, 0.119324f, 0.128662f, 0.139526f, 0.150146f, 0.161499f,
- 0.173706f, 0.185791f, 0.199341f, 0.212891f, 0.227051f, 0.241455f, 0.256592f, 0.271729f,
- 0.288330f, 0.304199f, 0.321045f, 0.337891f, 0.355469f, 0.373291f, 0.391113f, 0.408936f,
- 0.426758f, 0.446289f, 0.464600f, 0.483643f, 0.500977f, 0.520996f, 0.539551f, 0.558594f,
- 0.577148f, 0.595703f, 0.614746f, 0.632324f, 0.650879f, 0.669434f, 0.687012f, 0.704590f,
- 0.722656f, 0.740234f, 0.880371f, 0.883301f, 0.881836f, 0.879883f, 0.877441f, 0.875000f,
- 0.001739f, 0.005779f, 0.009598f, 0.013245f, 0.017334f, 0.021637f, 0.025955f, 0.030121f,
- 0.035217f, 0.040131f, 0.045990f, 0.051453f, 0.056915f, 0.063354f, 0.070007f, 0.076965f,
- 0.084351f, 0.091980f, 0.100281f, 0.108826f, 0.117981f, 0.127441f, 0.137939f, 0.148315f,
- 0.160034f, 0.171753f, 0.183594f, 0.196167f, 0.209961f, 0.223511f, 0.238037f, 0.252930f,
- 0.268066f, 0.284180f, 0.300537f, 0.317139f, 0.333740f, 0.351074f, 0.368896f, 0.386719f,
- 0.405273f, 0.423584f, 0.442871f, 0.460938f, 0.479736f, 0.499512f, 0.517578f, 0.537109f,
- 0.555664f, 0.575195f, 0.594238f, 0.613770f, 0.632324f, 0.650879f, 0.669922f, 0.687988f,
- 0.706055f, 0.724121f, 0.873047f, 0.876953f, 0.875488f, 0.874023f, 0.872559f, 0.869141f,
- 0.001648f, 0.005039f, 0.008675f, 0.012161f, 0.015823f, 0.019760f, 0.023865f, 0.028015f,
- 0.032318f, 0.036865f, 0.041504f, 0.046906f, 0.051758f, 0.057922f, 0.064087f, 0.070435f,
- 0.077209f, 0.084290f, 0.091736f, 0.099243f, 0.108215f, 0.117004f, 0.126343f, 0.135620f,
- 0.146484f, 0.157349f, 0.168823f, 0.180908f, 0.193848f, 0.206909f, 0.220459f, 0.234619f,
- 0.249634f, 0.264404f, 0.280273f, 0.296631f, 0.313232f, 0.329834f, 0.347412f, 0.365479f,
- 0.383545f, 0.401855f, 0.420166f, 0.438721f, 0.458252f, 0.477783f, 0.496826f, 0.516602f,
- 0.535156f, 0.554199f, 0.574219f, 0.593750f, 0.612305f, 0.631836f, 0.651367f, 0.670410f,
- 0.689453f, 0.708984f, 0.865234f, 0.872070f, 0.870605f, 0.868652f, 0.866699f, 0.863770f,
- 0.001492f, 0.004704f, 0.007973f, 0.011124f, 0.014603f, 0.017792f, 0.021652f, 0.025314f,
- 0.029526f, 0.033722f, 0.038147f, 0.042694f, 0.047668f, 0.052673f, 0.057983f, 0.064209f,
- 0.070068f, 0.076233f, 0.083313f, 0.090942f, 0.098572f, 0.106750f, 0.115295f, 0.124512f,
- 0.134277f, 0.144287f, 0.154663f, 0.166504f, 0.178345f, 0.190063f, 0.203247f, 0.217041f,
- 0.231079f, 0.245850f, 0.260986f, 0.276611f, 0.293213f, 0.309570f, 0.326172f, 0.343994f,
- 0.361816f, 0.379395f, 0.397949f, 0.417480f, 0.436523f, 0.455322f, 0.474854f, 0.493896f,
- 0.514160f, 0.533691f, 0.553711f, 0.573730f, 0.593262f, 0.612793f, 0.632812f, 0.651855f,
- 0.672363f, 0.690918f, 0.857910f, 0.865723f, 0.864746f, 0.863281f, 0.860352f, 0.858887f,
- 0.001657f, 0.004684f, 0.007290f, 0.010201f, 0.013657f, 0.016541f, 0.019989f, 0.023636f,
- 0.026932f, 0.030548f, 0.034576f, 0.039154f, 0.043793f, 0.048126f, 0.053162f, 0.058319f,
- 0.063721f, 0.069885f, 0.076355f, 0.082947f, 0.089844f, 0.097046f, 0.105286f, 0.113281f,
- 0.122559f, 0.131348f, 0.141357f, 0.152100f, 0.163330f, 0.175415f, 0.187256f, 0.199951f,
- 0.213501f, 0.227051f, 0.241943f, 0.257324f, 0.273193f, 0.288818f, 0.305420f, 0.322754f,
- 0.340576f, 0.358643f, 0.375732f, 0.394775f, 0.414307f, 0.433105f, 0.453613f, 0.472168f,
- 0.492188f, 0.512695f, 0.532715f, 0.552246f, 0.573242f, 0.593262f, 0.613770f, 0.632812f,
- 0.654785f, 0.673828f, 0.851074f, 0.859375f, 0.858398f, 0.856934f, 0.855469f, 0.853027f,
- 0.001457f, 0.003944f, 0.006870f, 0.009392f, 0.012543f, 0.015190f, 0.018417f, 0.021576f,
- 0.024811f, 0.028122f, 0.031708f, 0.035278f, 0.039398f, 0.043793f, 0.048218f, 0.052887f,
- 0.058044f, 0.063477f, 0.069397f, 0.075256f, 0.081360f, 0.088318f, 0.095398f, 0.103210f,
- 0.111084f, 0.120361f, 0.129150f, 0.139038f, 0.149292f, 0.160645f, 0.172241f, 0.183716f,
- 0.196533f, 0.209595f, 0.224121f, 0.238647f, 0.253174f, 0.268799f, 0.286133f, 0.302490f,
- 0.319092f, 0.337158f, 0.355225f, 0.373535f, 0.392090f, 0.411133f, 0.430908f, 0.450928f,
- 0.470947f, 0.490967f, 0.511719f, 0.531250f, 0.551758f, 0.573730f, 0.594238f, 0.614746f,
- 0.636230f, 0.656738f, 0.842773f, 0.852051f, 0.851562f, 0.851074f, 0.848633f, 0.846680f,
- 0.001404f, 0.003891f, 0.006233f, 0.008751f, 0.011353f, 0.014175f, 0.017075f, 0.019592f,
- 0.022842f, 0.025772f, 0.028839f, 0.032410f, 0.036011f, 0.039764f, 0.043671f, 0.048126f,
- 0.052704f, 0.057373f, 0.062561f, 0.067688f, 0.074158f, 0.080200f, 0.086853f, 0.093445f,
- 0.101379f, 0.109192f, 0.117432f, 0.126709f, 0.136353f, 0.146484f, 0.157227f, 0.168823f,
- 0.180542f, 0.193115f, 0.206299f, 0.219727f, 0.234375f, 0.249756f, 0.265869f, 0.281738f,
- 0.298096f, 0.315674f, 0.333252f, 0.352051f, 0.370850f, 0.389160f, 0.409180f, 0.428955f,
- 0.448730f, 0.469971f, 0.489502f, 0.510742f, 0.531738f, 0.552246f, 0.574707f, 0.595215f,
- 0.617676f, 0.639160f, 0.835449f, 0.845215f, 0.845215f, 0.844238f, 0.843262f, 0.840332f,
- 0.001275f, 0.003536f, 0.005600f, 0.007881f, 0.010628f, 0.012878f, 0.015610f, 0.018097f,
- 0.020996f, 0.023376f, 0.026443f, 0.029556f, 0.032867f, 0.036163f, 0.039581f, 0.043915f,
- 0.047943f, 0.052216f, 0.056763f, 0.061981f, 0.067322f, 0.072449f, 0.078796f, 0.084717f,
- 0.091919f, 0.098999f, 0.106995f, 0.115417f, 0.124084f, 0.133667f, 0.143433f, 0.154297f,
- 0.165161f, 0.177124f, 0.189697f, 0.202759f, 0.216309f, 0.230713f, 0.245728f, 0.261719f,
- 0.278320f, 0.295410f, 0.312256f, 0.330566f, 0.349365f, 0.367676f, 0.386719f, 0.406494f,
- 0.427246f, 0.447266f, 0.468506f, 0.489746f, 0.510742f, 0.532227f, 0.553711f, 0.575684f,
- 0.597656f, 0.619141f, 0.826172f, 0.837402f, 0.837891f, 0.837402f, 0.835449f, 0.833984f,
- 0.001134f, 0.003105f, 0.005337f, 0.007462f, 0.009628f, 0.011833f, 0.014137f, 0.016113f,
- 0.018875f, 0.021484f, 0.024063f, 0.026581f, 0.029709f, 0.032623f, 0.036194f, 0.039703f,
- 0.043335f, 0.047058f, 0.051422f, 0.055908f, 0.060608f, 0.065491f, 0.071167f, 0.076843f,
- 0.083313f, 0.089661f, 0.097168f, 0.104492f, 0.112122f, 0.121155f, 0.130615f, 0.140137f,
- 0.150757f, 0.161499f, 0.173462f, 0.185547f, 0.199341f, 0.212524f, 0.227051f, 0.242310f,
- 0.258057f, 0.274414f, 0.291016f, 0.309082f, 0.327148f, 0.345459f, 0.364990f, 0.384521f,
- 0.404297f, 0.425781f, 0.445801f, 0.467285f, 0.489258f, 0.510254f, 0.533203f, 0.555664f,
- 0.578125f, 0.601074f, 0.817871f, 0.830078f, 0.831055f, 0.830078f, 0.829102f, 0.828125f,
- 0.001101f, 0.003019f, 0.004818f, 0.006725f, 0.008781f, 0.010864f, 0.013069f, 0.014801f,
- 0.017151f, 0.019531f, 0.021973f, 0.024429f, 0.026917f, 0.030121f, 0.033112f, 0.036041f,
- 0.039337f, 0.042542f, 0.046509f, 0.050537f, 0.054596f, 0.058990f, 0.064209f, 0.069519f,
- 0.075134f, 0.080994f, 0.087158f, 0.094177f, 0.102051f, 0.109741f, 0.117981f, 0.127319f,
- 0.136963f, 0.147095f, 0.158081f, 0.169434f, 0.182251f, 0.195557f, 0.208984f, 0.223267f,
- 0.238281f, 0.254639f, 0.270996f, 0.288330f, 0.305908f, 0.324219f, 0.343018f, 0.362549f,
- 0.382324f, 0.402832f, 0.424805f, 0.445312f, 0.467529f, 0.489258f, 0.511230f, 0.535645f,
- 0.558594f, 0.582031f, 0.809082f, 0.822266f, 0.824219f, 0.823242f, 0.821777f, 0.820801f,
- 0.000987f, 0.002644f, 0.004562f, 0.006344f, 0.008133f, 0.009918f, 0.011696f, 0.013527f,
- 0.015572f, 0.017746f, 0.019714f, 0.021942f, 0.024155f, 0.027069f, 0.029678f, 0.032288f,
- 0.035156f, 0.038574f, 0.041779f, 0.045319f, 0.049225f, 0.053284f, 0.057678f, 0.062225f,
- 0.067505f, 0.072571f, 0.078613f, 0.084961f, 0.092041f, 0.098938f, 0.106506f, 0.115112f,
- 0.123779f, 0.133667f, 0.143311f, 0.154541f, 0.165894f, 0.178345f, 0.191406f, 0.205200f,
- 0.219238f, 0.234985f, 0.250977f, 0.267578f, 0.284912f, 0.302734f, 0.321289f, 0.340332f,
- 0.360352f, 0.380615f, 0.401611f, 0.423340f, 0.445312f, 0.467529f, 0.490967f, 0.514160f,
- 0.537598f, 0.561035f, 0.800293f, 0.814453f, 0.815918f, 0.815918f, 0.814941f, 0.813965f,
- 0.000932f, 0.002567f, 0.004009f, 0.005722f, 0.007538f, 0.008812f, 0.010864f, 0.012413f,
- 0.014290f, 0.015991f, 0.018051f, 0.019836f, 0.022247f, 0.024506f, 0.026520f, 0.029175f,
- 0.031769f, 0.034332f, 0.037689f, 0.040466f, 0.043945f, 0.047607f, 0.051605f, 0.055817f,
- 0.060486f, 0.065125f, 0.070557f, 0.076111f, 0.081909f, 0.088806f, 0.095886f, 0.103210f,
- 0.111755f, 0.120422f, 0.130249f, 0.140137f, 0.150513f, 0.162109f, 0.174561f, 0.187256f,
- 0.200928f, 0.215698f, 0.231323f, 0.246582f, 0.264160f, 0.281982f, 0.299561f, 0.319092f,
- 0.338623f, 0.358643f, 0.379883f, 0.400879f, 0.423096f, 0.445557f, 0.468750f, 0.492188f,
- 0.516113f, 0.541504f, 0.791016f, 0.805664f, 0.808105f, 0.808594f, 0.807129f, 0.806641f,
- 0.000871f, 0.002337f, 0.003727f, 0.005474f, 0.006641f, 0.008377f, 0.009567f, 0.011154f,
- 0.012848f, 0.014610f, 0.016235f, 0.017960f, 0.019958f, 0.021729f, 0.023926f, 0.026154f,
- 0.028351f, 0.030975f, 0.033722f, 0.036407f, 0.039459f, 0.042694f, 0.046082f, 0.049896f,
- 0.053833f, 0.058167f, 0.062744f, 0.067932f, 0.073608f, 0.079468f, 0.085632f, 0.092651f,
- 0.100098f, 0.108521f, 0.116699f, 0.126099f, 0.136108f, 0.146606f, 0.157959f, 0.170410f,
- 0.183594f, 0.197510f, 0.212280f, 0.227295f, 0.243652f, 0.260986f, 0.278564f, 0.297607f,
- 0.316406f, 0.336426f, 0.357178f, 0.378662f, 0.400146f, 0.422852f, 0.446045f, 0.470215f,
- 0.494873f, 0.520020f, 0.781250f, 0.796875f, 0.800293f, 0.800781f, 0.799805f, 0.799316f,
- 0.000782f, 0.002131f, 0.003649f, 0.004715f, 0.006054f, 0.007458f, 0.008759f, 0.010269f,
- 0.011711f, 0.012970f, 0.014664f, 0.016327f, 0.017914f, 0.019699f, 0.021423f, 0.023499f,
- 0.025391f, 0.027374f, 0.029999f, 0.032501f, 0.035156f, 0.037872f, 0.040710f, 0.044403f,
- 0.047791f, 0.051880f, 0.055969f, 0.060364f, 0.065247f, 0.070496f, 0.076172f, 0.082825f,
- 0.089294f, 0.096497f, 0.104431f, 0.112854f, 0.122375f, 0.132202f, 0.142700f, 0.153931f,
- 0.166260f, 0.179565f, 0.193481f, 0.208008f, 0.223877f, 0.240479f, 0.257568f, 0.275879f,
- 0.294922f, 0.314453f, 0.334961f, 0.355957f, 0.377686f, 0.400391f, 0.423828f, 0.448730f,
- 0.472900f, 0.498535f, 0.771484f, 0.789062f, 0.791504f, 0.792480f, 0.791016f, 0.791016f,
- 0.000742f, 0.001822f, 0.003183f, 0.004444f, 0.005600f, 0.006550f, 0.008087f, 0.009247f,
- 0.010559f, 0.011650f, 0.013184f, 0.014565f, 0.016083f, 0.017548f, 0.019119f, 0.020737f,
- 0.022644f, 0.024597f, 0.026627f, 0.028809f, 0.031281f, 0.033539f, 0.036469f, 0.039429f,
- 0.042480f, 0.045654f, 0.049561f, 0.053406f, 0.057739f, 0.062469f, 0.067749f, 0.073364f,
- 0.079773f, 0.086121f, 0.093262f, 0.100647f, 0.109253f, 0.118042f, 0.128174f, 0.138550f,
- 0.150024f, 0.162231f, 0.175171f, 0.189087f, 0.204468f, 0.220215f, 0.236938f, 0.254639f,
- 0.273438f, 0.292236f, 0.312012f, 0.333252f, 0.355957f, 0.377686f, 0.401367f, 0.425781f,
- 0.451416f, 0.476318f, 0.761230f, 0.779785f, 0.782227f, 0.782715f, 0.782715f, 0.782715f,
- 0.000632f, 0.001970f, 0.003042f, 0.004025f, 0.005173f, 0.006435f, 0.007343f, 0.008522f,
- 0.009369f, 0.010475f, 0.011726f, 0.012962f, 0.014145f, 0.015411f, 0.016922f, 0.018478f,
- 0.020111f, 0.021835f, 0.023682f, 0.025253f, 0.027466f, 0.029678f, 0.032196f, 0.034607f,
- 0.037415f, 0.040497f, 0.043610f, 0.047089f, 0.051178f, 0.055573f, 0.059845f, 0.064758f,
- 0.070068f, 0.076111f, 0.082275f, 0.089417f, 0.096863f, 0.105286f, 0.114441f, 0.123535f,
- 0.134399f, 0.145508f, 0.157959f, 0.171387f, 0.185425f, 0.200806f, 0.216919f, 0.233521f,
- 0.251953f, 0.270508f, 0.290527f, 0.310791f, 0.332275f, 0.355469f, 0.378418f, 0.403564f,
- 0.428223f, 0.455322f, 0.750977f, 0.770996f, 0.774414f, 0.774414f, 0.774902f, 0.773926f,
- 0.000517f, 0.001554f, 0.002741f, 0.003695f, 0.004669f, 0.005417f, 0.006466f, 0.007545f,
- 0.008453f, 0.009499f, 0.010468f, 0.011490f, 0.012718f, 0.013985f, 0.014977f, 0.016235f,
- 0.017868f, 0.019211f, 0.020630f, 0.022263f, 0.024078f, 0.026291f, 0.028275f, 0.030380f,
- 0.032928f, 0.035675f, 0.038513f, 0.041656f, 0.044769f, 0.048523f, 0.052216f, 0.057007f,
- 0.061493f, 0.066711f, 0.072510f, 0.078735f, 0.085327f, 0.093201f, 0.101135f, 0.109619f,
- 0.119690f, 0.130371f, 0.141602f, 0.154053f, 0.167480f, 0.181396f, 0.197021f, 0.213623f,
- 0.230835f, 0.248901f, 0.268066f, 0.289062f, 0.310303f, 0.332520f, 0.355225f, 0.379639f,
- 0.405273f, 0.432373f, 0.740234f, 0.760742f, 0.763672f, 0.765625f, 0.765625f, 0.765625f,
- 0.000588f, 0.001405f, 0.002306f, 0.003370f, 0.004375f, 0.005116f, 0.005817f, 0.006630f,
- 0.007797f, 0.008507f, 0.009216f, 0.010254f, 0.011246f, 0.012154f, 0.013191f, 0.014366f,
- 0.015503f, 0.016785f, 0.018127f, 0.019562f, 0.021072f, 0.022919f, 0.024643f, 0.026749f,
- 0.028564f, 0.031006f, 0.033203f, 0.036072f, 0.039032f, 0.042114f, 0.045654f, 0.049561f,
- 0.053650f, 0.058380f, 0.063049f, 0.068848f, 0.075256f, 0.081543f, 0.088562f, 0.096924f,
- 0.105652f, 0.115173f, 0.125977f, 0.137207f, 0.149902f, 0.163208f, 0.177979f, 0.193726f,
- 0.210205f, 0.228027f, 0.247070f, 0.266602f, 0.287842f, 0.309326f, 0.333008f, 0.356934f,
- 0.382568f, 0.408691f, 0.729004f, 0.751953f, 0.755371f, 0.756348f, 0.757324f, 0.756348f,
- 0.000431f, 0.001562f, 0.002253f, 0.003088f, 0.003944f, 0.004536f, 0.005066f, 0.006020f,
- 0.006840f, 0.007542f, 0.008347f, 0.008949f, 0.009827f, 0.010719f, 0.011696f, 0.012756f,
- 0.013649f, 0.014679f, 0.015808f, 0.017288f, 0.018356f, 0.019913f, 0.021332f, 0.023148f,
- 0.024719f, 0.026840f, 0.029007f, 0.031250f, 0.033661f, 0.036469f, 0.039490f, 0.042969f,
- 0.046326f, 0.050293f, 0.054901f, 0.059845f, 0.064941f, 0.071289f, 0.077454f, 0.084656f,
- 0.092529f, 0.101562f, 0.111145f, 0.121460f, 0.132935f, 0.145386f, 0.159302f, 0.174438f,
- 0.190186f, 0.206909f, 0.225098f, 0.244751f, 0.265381f, 0.287109f, 0.310059f, 0.333984f,
- 0.359131f, 0.386230f, 0.716797f, 0.740723f, 0.744629f, 0.746582f, 0.747070f, 0.747070f,
- 0.000576f, 0.001266f, 0.002028f, 0.002766f, 0.003317f, 0.004051f, 0.004742f, 0.005459f,
- 0.006054f, 0.006641f, 0.007240f, 0.007919f, 0.008644f, 0.009300f, 0.010170f, 0.010925f,
- 0.011795f, 0.012733f, 0.013855f, 0.014885f, 0.015900f, 0.017212f, 0.018326f, 0.019684f,
- 0.021469f, 0.023178f, 0.024734f, 0.026794f, 0.028946f, 0.031204f, 0.033844f, 0.036682f,
- 0.039948f, 0.043335f, 0.047150f, 0.051422f, 0.055969f, 0.061066f, 0.067139f, 0.073242f,
- 0.080444f, 0.088440f, 0.096985f, 0.106445f, 0.116943f, 0.128906f, 0.141479f, 0.154907f,
- 0.170410f, 0.186523f, 0.204102f, 0.222900f, 0.243774f, 0.264160f, 0.286865f, 0.310791f,
- 0.336182f, 0.362793f, 0.705078f, 0.730469f, 0.735352f, 0.736816f, 0.737793f, 0.736816f,
- 0.000307f, 0.001126f, 0.001758f, 0.002436f, 0.002911f, 0.003540f, 0.004047f, 0.004711f,
- 0.005245f, 0.005749f, 0.006302f, 0.006844f, 0.007355f, 0.008095f, 0.008835f, 0.009438f,
- 0.010139f, 0.010941f, 0.011963f, 0.012878f, 0.013519f, 0.014847f, 0.015945f, 0.017029f,
- 0.018250f, 0.019669f, 0.021362f, 0.022675f, 0.024750f, 0.026657f, 0.028854f, 0.031219f,
- 0.033844f, 0.036804f, 0.040222f, 0.043793f, 0.047791f, 0.052185f, 0.057251f, 0.062866f,
- 0.069275f, 0.075867f, 0.083923f, 0.092407f, 0.102295f, 0.112366f, 0.124207f, 0.137085f,
- 0.151489f, 0.167114f, 0.183838f, 0.202148f, 0.221558f, 0.242065f, 0.263916f, 0.287842f,
- 0.312256f, 0.339111f, 0.693848f, 0.719727f, 0.724609f, 0.726074f, 0.727539f, 0.727051f,
- 0.000428f, 0.000939f, 0.001581f, 0.002033f, 0.002665f, 0.003222f, 0.003660f, 0.004059f,
- 0.004475f, 0.004997f, 0.005554f, 0.006031f, 0.006371f, 0.007080f, 0.007511f, 0.008263f,
- 0.008820f, 0.009552f, 0.010124f, 0.010948f, 0.011665f, 0.012550f, 0.013397f, 0.014526f,
- 0.015388f, 0.016754f, 0.017960f, 0.019257f, 0.020844f, 0.022583f, 0.024246f, 0.026642f,
- 0.028656f, 0.031128f, 0.033783f, 0.036865f, 0.040253f, 0.044312f, 0.048523f, 0.053314f,
- 0.058655f, 0.064880f, 0.071594f, 0.079102f, 0.087891f, 0.097107f, 0.108276f, 0.119751f,
- 0.133179f, 0.148071f, 0.163818f, 0.180908f, 0.199951f, 0.219849f, 0.241699f, 0.264160f,
- 0.288818f, 0.315918f, 0.680176f, 0.708496f, 0.713867f, 0.716309f, 0.716797f, 0.717285f,
- 0.000467f, 0.001054f, 0.001476f, 0.001825f, 0.002386f, 0.002644f, 0.003218f, 0.003553f,
- 0.003866f, 0.004433f, 0.004700f, 0.004948f, 0.005505f, 0.006023f, 0.006405f, 0.006920f,
- 0.007484f, 0.008057f, 0.008598f, 0.009178f, 0.009857f, 0.010551f, 0.011169f, 0.012199f,
- 0.013092f, 0.014084f, 0.015091f, 0.016205f, 0.017303f, 0.018845f, 0.020538f, 0.021957f,
- 0.023773f, 0.025833f, 0.028152f, 0.030716f, 0.033661f, 0.036896f, 0.040405f, 0.044708f,
- 0.049286f, 0.054321f, 0.060333f, 0.067322f, 0.074890f, 0.083435f, 0.092651f, 0.103516f,
- 0.115784f, 0.129028f, 0.144287f, 0.160278f, 0.178345f, 0.197632f, 0.218994f, 0.241089f,
- 0.265869f, 0.292725f, 0.667969f, 0.697266f, 0.702637f, 0.704590f, 0.706055f, 0.707031f,
- 0.000348f, 0.000841f, 0.001292f, 0.001580f, 0.001961f, 0.002508f, 0.002630f, 0.002993f,
- 0.003458f, 0.003738f, 0.003952f, 0.004425f, 0.004639f, 0.005070f, 0.005547f, 0.005840f,
- 0.006462f, 0.006844f, 0.007214f, 0.007698f, 0.008339f, 0.008980f, 0.009560f, 0.010094f,
- 0.010941f, 0.011711f, 0.012550f, 0.013565f, 0.014404f, 0.015579f, 0.016754f, 0.018082f,
- 0.019592f, 0.021439f, 0.023209f, 0.025375f, 0.027863f, 0.030411f, 0.033478f, 0.037018f,
- 0.040680f, 0.045105f, 0.050476f, 0.056183f, 0.062805f, 0.070251f, 0.078613f, 0.088196f,
- 0.099060f, 0.111450f, 0.125122f, 0.140869f, 0.158203f, 0.176880f, 0.197266f, 0.218506f,
- 0.242798f, 0.268555f, 0.655273f, 0.686035f, 0.691406f, 0.694336f, 0.695312f, 0.695801f,
- 0.000170f, 0.000976f, 0.001161f, 0.001441f, 0.001846f, 0.002144f, 0.002367f, 0.002632f,
- 0.002892f, 0.003178f, 0.003435f, 0.003618f, 0.004021f, 0.004292f, 0.004562f, 0.005028f,
- 0.005405f, 0.005623f, 0.006069f, 0.006577f, 0.006973f, 0.007431f, 0.007904f, 0.008484f,
- 0.009018f, 0.009659f, 0.010559f, 0.010994f, 0.012009f, 0.012840f, 0.013901f, 0.014915f,
- 0.016129f, 0.017502f, 0.019089f, 0.020676f, 0.022568f, 0.024673f, 0.027252f, 0.029984f,
- 0.033234f, 0.037079f, 0.041016f, 0.045868f, 0.051758f, 0.058014f, 0.065613f, 0.073853f,
- 0.083801f, 0.094727f, 0.107483f, 0.121826f, 0.137573f, 0.156006f, 0.175049f, 0.196167f,
- 0.219482f, 0.245850f, 0.641113f, 0.673340f, 0.679688f, 0.681641f, 0.683594f, 0.684082f,
- 0.000293f, 0.000601f, 0.001049f, 0.001358f, 0.001532f, 0.001719f, 0.001882f, 0.002298f,
- 0.002317f, 0.002628f, 0.002750f, 0.003143f, 0.003363f, 0.003559f, 0.003866f, 0.004204f,
- 0.004383f, 0.004753f, 0.005028f, 0.005348f, 0.005863f, 0.006176f, 0.006569f, 0.006954f,
- 0.007401f, 0.008057f, 0.008537f, 0.009178f, 0.009735f, 0.010521f, 0.011208f, 0.011978f,
- 0.013130f, 0.014099f, 0.015289f, 0.016739f, 0.018219f, 0.019821f, 0.021713f, 0.024200f,
- 0.026749f, 0.029785f, 0.033386f, 0.036987f, 0.041840f, 0.047089f, 0.053253f, 0.060760f,
- 0.069214f, 0.079224f, 0.090515f, 0.103638f, 0.118652f, 0.135376f, 0.154175f, 0.174561f,
- 0.196777f, 0.222534f, 0.628906f, 0.660645f, 0.668457f, 0.670410f, 0.672852f, 0.673340f,
- 0.000258f, 0.000656f, 0.000811f, 0.001049f, 0.001288f, 0.001462f, 0.001599f, 0.001740f,
- 0.002012f, 0.002171f, 0.002367f, 0.002535f, 0.002705f, 0.002880f, 0.003115f, 0.003429f,
- 0.003666f, 0.003897f, 0.004116f, 0.004398f, 0.004635f, 0.005066f, 0.005341f, 0.005779f,
- 0.006042f, 0.006454f, 0.006954f, 0.007450f, 0.007835f, 0.008400f, 0.009132f, 0.009819f,
- 0.010536f, 0.011307f, 0.012245f, 0.013229f, 0.014580f, 0.015900f, 0.017303f, 0.019119f,
- 0.021103f, 0.023468f, 0.026123f, 0.029495f, 0.033112f, 0.037628f, 0.042938f, 0.048859f,
- 0.056152f, 0.064941f, 0.074829f, 0.086548f, 0.100281f, 0.115967f, 0.133545f, 0.153198f,
- 0.175171f, 0.199341f, 0.613770f, 0.648926f, 0.655273f, 0.658691f, 0.660645f, 0.662598f,
- 0.000176f, 0.000474f, 0.000602f, 0.000854f, 0.001030f, 0.001240f, 0.001349f, 0.001505f,
- 0.001580f, 0.001738f, 0.001957f, 0.002068f, 0.002230f, 0.002420f, 0.002556f, 0.002705f,
- 0.002998f, 0.003178f, 0.003345f, 0.003567f, 0.003811f, 0.004105f, 0.004284f, 0.004593f,
- 0.004848f, 0.005173f, 0.005527f, 0.005939f, 0.006306f, 0.006817f, 0.007366f, 0.007729f,
- 0.008339f, 0.008995f, 0.009644f, 0.010551f, 0.011360f, 0.012344f, 0.013710f, 0.015030f,
- 0.016510f, 0.018143f, 0.020279f, 0.022751f, 0.025650f, 0.029144f, 0.033508f, 0.038452f,
- 0.044556f, 0.052032f, 0.060364f, 0.070923f, 0.082642f, 0.097290f, 0.113525f, 0.132446f,
- 0.153442f, 0.176880f, 0.600586f, 0.636719f, 0.644531f, 0.647461f, 0.648926f, 0.649414f,
- 0.000121f, 0.000426f, 0.000509f, 0.000778f, 0.000931f, 0.000992f, 0.001135f, 0.001303f,
- 0.001359f, 0.001410f, 0.001519f, 0.001722f, 0.001751f, 0.001951f, 0.002060f, 0.002218f,
- 0.002287f, 0.002487f, 0.002670f, 0.002848f, 0.003061f, 0.003233f, 0.003452f, 0.003664f,
- 0.003883f, 0.004078f, 0.004379f, 0.004692f, 0.004982f, 0.005329f, 0.005756f, 0.006081f,
- 0.006504f, 0.007019f, 0.007599f, 0.008217f, 0.008850f, 0.009628f, 0.010437f, 0.011597f,
- 0.012650f, 0.013931f, 0.015480f, 0.017380f, 0.019577f, 0.022247f, 0.025513f, 0.029617f,
- 0.034363f, 0.040314f, 0.047241f, 0.056274f, 0.066711f, 0.079773f, 0.094482f, 0.112488f,
- 0.132446f, 0.154907f, 0.585449f, 0.624023f, 0.630371f, 0.634277f, 0.636230f, 0.637207f,
- 0.000161f, 0.000263f, 0.000526f, 0.000627f, 0.000723f, 0.000775f, 0.000856f, 0.000960f,
- 0.001079f, 0.001158f, 0.001208f, 0.001272f, 0.001441f, 0.001557f, 0.001657f, 0.001702f,
- 0.001897f, 0.001918f, 0.002151f, 0.002232f, 0.002337f, 0.002522f, 0.002720f, 0.002865f,
- 0.003029f, 0.003193f, 0.003387f, 0.003601f, 0.003887f, 0.004124f, 0.004356f, 0.004639f,
- 0.005070f, 0.005466f, 0.005863f, 0.006298f, 0.006874f, 0.007290f, 0.007965f, 0.008774f,
- 0.009560f, 0.010666f, 0.011719f, 0.013077f, 0.014679f, 0.016693f, 0.019058f, 0.021881f,
- 0.025528f, 0.030121f, 0.036011f, 0.043396f, 0.052460f, 0.063477f, 0.076721f, 0.093079f,
- 0.112305f, 0.133667f, 0.572266f, 0.609375f, 0.618164f, 0.622070f, 0.623535f, 0.625488f,
- 0.000109f, 0.000212f, 0.000404f, 0.000578f, 0.000567f, 0.000655f, 0.000763f, 0.000676f,
- 0.000824f, 0.000869f, 0.000971f, 0.001064f, 0.001132f, 0.001210f, 0.001212f, 0.001398f,
- 0.001486f, 0.001525f, 0.001653f, 0.001676f, 0.001867f, 0.001953f, 0.002062f, 0.002199f,
- 0.002295f, 0.002443f, 0.002586f, 0.002766f, 0.002979f, 0.003128f, 0.003429f, 0.003551f,
- 0.003763f, 0.004074f, 0.004349f, 0.004688f, 0.005032f, 0.005470f, 0.005894f, 0.006519f,
- 0.007092f, 0.007896f, 0.008629f, 0.009659f, 0.010910f, 0.012215f, 0.013962f, 0.015991f,
- 0.018646f, 0.021881f, 0.026428f, 0.032074f, 0.039276f, 0.048645f, 0.060455f, 0.075256f,
- 0.092773f, 0.113220f, 0.554688f, 0.596191f, 0.605957f, 0.608887f, 0.610352f, 0.612305f,
- 0.000202f, 0.000186f, 0.000312f, 0.000433f, 0.000382f, 0.000543f, 0.000482f, 0.000546f,
- 0.000621f, 0.000666f, 0.000789f, 0.000802f, 0.000859f, 0.000950f, 0.000970f, 0.000975f,
- 0.001113f, 0.001162f, 0.001207f, 0.001312f, 0.001362f, 0.001433f, 0.001541f, 0.001618f,
- 0.001720f, 0.001791f, 0.001966f, 0.002035f, 0.002199f, 0.002413f, 0.002546f, 0.002626f,
- 0.002855f, 0.003063f, 0.003204f, 0.003448f, 0.003693f, 0.003986f, 0.004364f, 0.004684f,
- 0.005127f, 0.005619f, 0.006271f, 0.006870f, 0.007748f, 0.008713f, 0.009911f, 0.011368f,
- 0.013191f, 0.015518f, 0.018646f, 0.022644f, 0.028107f, 0.035645f, 0.045471f, 0.058502f,
- 0.074646f, 0.093994f, 0.541016f, 0.583008f, 0.591797f, 0.596191f, 0.599121f, 0.600098f,
- 0.000000f, 0.000179f, 0.000242f, 0.000318f, 0.000341f, 0.000345f, 0.000432f, 0.000364f,
- 0.000475f, 0.000483f, 0.000572f, 0.000576f, 0.000619f, 0.000640f, 0.000716f, 0.000737f,
- 0.000791f, 0.000845f, 0.000871f, 0.000907f, 0.000998f, 0.001025f, 0.001107f, 0.001181f,
- 0.001244f, 0.001303f, 0.001391f, 0.001462f, 0.001549f, 0.001631f, 0.001756f, 0.001906f,
- 0.001984f, 0.002161f, 0.002264f, 0.002419f, 0.002613f, 0.002825f, 0.003103f, 0.003321f,
- 0.003584f, 0.003893f, 0.004349f, 0.004799f, 0.005383f, 0.006020f, 0.006836f, 0.007858f,
- 0.009117f, 0.010674f, 0.012825f, 0.015533f, 0.019363f, 0.024780f, 0.032593f, 0.043274f,
- 0.057770f, 0.076111f, 0.525879f, 0.569336f, 0.578613f, 0.583008f, 0.585449f, 0.586426f,
- 0.000000f, 0.000088f, 0.000192f, 0.000227f, 0.000230f, 0.000286f, 0.000255f, 0.000317f,
- 0.000321f, 0.000371f, 0.000401f, 0.000373f, 0.000391f, 0.000457f, 0.000474f, 0.000530f,
- 0.000509f, 0.000585f, 0.000625f, 0.000664f, 0.000707f, 0.000746f, 0.000772f, 0.000817f,
- 0.000877f, 0.000887f, 0.000978f, 0.001007f, 0.001069f, 0.001202f, 0.001192f, 0.001290f,
- 0.001356f, 0.001464f, 0.001583f, 0.001678f, 0.001771f, 0.001929f, 0.002050f, 0.002230f,
- 0.002424f, 0.002651f, 0.002888f, 0.003176f, 0.003534f, 0.003967f, 0.004475f, 0.005154f,
- 0.005993f, 0.007118f, 0.008469f, 0.010338f, 0.012794f, 0.016403f, 0.021957f, 0.030090f,
- 0.042419f, 0.059052f, 0.510254f, 0.554199f, 0.564453f, 0.570312f, 0.572754f, 0.573242f,
- 0.000000f, 0.000126f, 0.000180f, 0.000121f, 0.000178f, 0.000176f, 0.000177f, 0.000212f,
- 0.000210f, 0.000228f, 0.000238f, 0.000291f, 0.000280f, 0.000298f, 0.000336f, 0.000350f,
- 0.000369f, 0.000387f, 0.000395f, 0.000427f, 0.000460f, 0.000476f, 0.000515f, 0.000536f,
- 0.000573f, 0.000619f, 0.000650f, 0.000670f, 0.000703f, 0.000746f, 0.000798f, 0.000836f,
- 0.000902f, 0.000949f, 0.001031f, 0.001062f, 0.001162f, 0.001227f, 0.001349f, 0.001442f,
- 0.001533f, 0.001690f, 0.001865f, 0.001995f, 0.002228f, 0.002495f, 0.002800f, 0.003191f,
- 0.003653f, 0.004349f, 0.005203f, 0.006393f, 0.008026f, 0.010307f, 0.013710f, 0.019379f,
- 0.028854f, 0.043457f, 0.494873f, 0.541016f, 0.550781f, 0.555664f, 0.558105f, 0.559570f,
- 0.000000f, 0.000095f, 0.000086f, 0.000079f, 0.000105f, 0.000124f, 0.000111f, 0.000137f,
- 0.000141f, 0.000142f, 0.000147f, 0.000151f, 0.000160f, 0.000181f, 0.000202f, 0.000207f,
- 0.000214f, 0.000248f, 0.000244f, 0.000282f, 0.000273f, 0.000283f, 0.000306f, 0.000334f,
- 0.000367f, 0.000378f, 0.000376f, 0.000399f, 0.000437f, 0.000459f, 0.000474f, 0.000516f,
- 0.000552f, 0.000567f, 0.000616f, 0.000649f, 0.000693f, 0.000743f, 0.000805f, 0.000851f,
- 0.000918f, 0.000999f, 0.001085f, 0.001195f, 0.001309f, 0.001466f, 0.001644f, 0.001850f,
- 0.002151f, 0.002487f, 0.002974f, 0.003654f, 0.004574f, 0.006001f, 0.008156f, 0.011452f,
- 0.017853f, 0.029739f, 0.478271f, 0.526367f, 0.537109f, 0.541504f, 0.544434f, 0.545898f,
- 0.000106f, 0.000085f, 0.000074f, 0.000067f, 0.000066f, 0.000070f, 0.000069f, 0.000073f,
- 0.000073f, 0.000080f, 0.000084f, 0.000109f, 0.000093f, 0.000098f, 0.000119f, 0.000108f,
- 0.000128f, 0.000135f, 0.000137f, 0.000149f, 0.000150f, 0.000157f, 0.000182f, 0.000185f,
- 0.000207f, 0.000206f, 0.000214f, 0.000234f, 0.000237f, 0.000253f, 0.000267f, 0.000289f,
- 0.000306f, 0.000313f, 0.000344f, 0.000352f, 0.000384f, 0.000406f, 0.000445f, 0.000467f,
- 0.000503f, 0.000543f, 0.000593f, 0.000634f, 0.000697f, 0.000764f, 0.000850f, 0.000963f,
- 0.001105f, 0.001298f, 0.001536f, 0.001856f, 0.002333f, 0.003069f, 0.004299f, 0.006271f,
- 0.009789f, 0.018234f, 0.462402f, 0.511719f, 0.522949f, 0.527344f, 0.530762f, 0.532715f,
- 0.000091f, 0.000069f, 0.000060f, 0.000054f, 0.000049f, 0.000046f, 0.000043f, 0.000041f,
- 0.000040f, 0.000044f, 0.000040f, 0.000040f, 0.000054f, 0.000044f, 0.000045f, 0.000044f,
- 0.000062f, 0.000062f, 0.000069f, 0.000071f, 0.000074f, 0.000079f, 0.000081f, 0.000081f,
- 0.000085f, 0.000099f, 0.000098f, 0.000115f, 0.000115f, 0.000119f, 0.000125f, 0.000130f,
- 0.000140f, 0.000144f, 0.000165f, 0.000172f, 0.000178f, 0.000191f, 0.000205f, 0.000222f,
- 0.000234f, 0.000251f, 0.000276f, 0.000293f, 0.000327f, 0.000354f, 0.000392f, 0.000437f,
- 0.000494f, 0.000562f, 0.000662f, 0.000800f, 0.001005f, 0.001315f, 0.001852f, 0.002825f,
- 0.004723f, 0.009285f, 0.446533f, 0.497803f, 0.508301f, 0.514160f, 0.516602f, 0.519043f,
- 0.000067f, 0.000048f, 0.000040f, 0.000036f, 0.000033f, 0.000031f, 0.000030f, 0.000028f,
- 0.000027f, 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f,
- 0.000019f, 0.000020f, 0.000024f, 0.000026f, 0.000025f, 0.000027f, 0.000031f, 0.000032f,
- 0.000032f, 0.000037f, 0.000041f, 0.000038f, 0.000045f, 0.000042f, 0.000048f, 0.000049f,
- 0.000053f, 0.000055f, 0.000059f, 0.000062f, 0.000071f, 0.000074f, 0.000077f, 0.000081f,
- 0.000086f, 0.000091f, 0.000098f, 0.000109f, 0.000116f, 0.000125f, 0.000137f, 0.000158f,
- 0.000173f, 0.000193f, 0.000230f, 0.000273f, 0.000335f, 0.000425f, 0.000603f, 0.000935f,
- 0.001694f, 0.003727f, 0.431396f, 0.481934f, 0.493652f, 0.499512f, 0.502930f, 0.504883f,
- 0.000021f, 0.000016f, 0.000013f, 0.000012f, 0.000013f, 0.000012f, 0.000012f, 0.000012f,
- 0.000012f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f,
- 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f,
- 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000009f, 0.000009f, 0.000010f,
- 0.000010f, 0.000013f, 0.000014f, 0.000013f, 0.000015f, 0.000016f, 0.000017f, 0.000019f,
- 0.000019f, 0.000020f, 0.000023f, 0.000026f, 0.000027f, 0.000027f, 0.000032f, 0.000030f,
- 0.000036f, 0.000039f, 0.000050f, 0.000056f, 0.000063f, 0.000082f, 0.000109f, 0.000168f,
- 0.000317f, 0.000922f, 0.415283f, 0.467773f, 0.479980f, 0.486328f, 0.489014f, 0.490723f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000005f,
- 0.000008f, 0.000026f, 0.398926f, 0.452881f, 0.465576f, 0.471436f, 0.474854f, 0.477051f,
- },
- {
- 0.019653f, 0.058990f, 0.097473f, 0.134277f, 0.169189f, 0.203491f, 0.236450f, 0.267578f,
- 0.297852f, 0.326416f, 0.354004f, 0.380859f, 0.406250f, 0.431641f, 0.455078f, 0.477539f,
- 0.500000f, 0.520996f, 0.541504f, 0.560547f, 0.580566f, 0.598633f, 0.615723f, 0.633301f,
- 0.649902f, 0.666016f, 0.681641f, 0.695801f, 0.709961f, 0.724609f, 0.738770f, 0.751953f,
- 0.765137f, 0.775879f, 0.788574f, 0.799805f, 0.812012f, 0.822754f, 0.833496f, 0.844238f,
- 0.854004f, 0.864258f, 0.874023f, 0.883301f, 0.891602f, 0.900391f, 0.909668f, 0.917969f,
- 0.925781f, 0.934570f, 0.941895f, 0.949707f, 0.956543f, 0.963379f, 0.970703f, 0.977539f,
- 0.984863f, 0.991211f, 0.988770f, 0.972656f, 0.960449f, 0.949707f, 0.940430f, 0.931641f,
- 0.017303f, 0.052399f, 0.086548f, 0.119446f, 0.153076f, 0.183594f, 0.214722f, 0.245117f,
- 0.273193f, 0.301270f, 0.328613f, 0.354492f, 0.379883f, 0.404541f, 0.427979f, 0.450195f,
- 0.472656f, 0.494629f, 0.515137f, 0.534668f, 0.554199f, 0.573242f, 0.591309f, 0.608887f,
- 0.625977f, 0.642578f, 0.658203f, 0.672852f, 0.688477f, 0.704102f, 0.717285f, 0.731445f,
- 0.744629f, 0.756836f, 0.769531f, 0.782715f, 0.793945f, 0.805664f, 0.816406f, 0.828125f,
- 0.838379f, 0.849121f, 0.858887f, 0.868652f, 0.877930f, 0.888184f, 0.896973f, 0.905762f,
- 0.915039f, 0.921875f, 0.930176f, 0.937988f, 0.946777f, 0.954102f, 0.960938f, 0.968750f,
- 0.975586f, 0.982422f, 0.984375f, 0.969238f, 0.957520f, 0.947754f, 0.938477f, 0.930176f,
- 0.015221f, 0.045837f, 0.076843f, 0.107666f, 0.136719f, 0.166504f, 0.196045f, 0.223999f,
- 0.250244f, 0.278320f, 0.303711f, 0.329346f, 0.353271f, 0.378906f, 0.401367f, 0.424316f,
- 0.447266f, 0.468018f, 0.487793f, 0.508301f, 0.529297f, 0.547363f, 0.566406f, 0.583984f,
- 0.601562f, 0.618652f, 0.634766f, 0.650879f, 0.666016f, 0.681641f, 0.695801f, 0.710449f,
- 0.724121f, 0.737305f, 0.750488f, 0.762695f, 0.775391f, 0.788086f, 0.799316f, 0.811035f,
- 0.821777f, 0.833008f, 0.844238f, 0.854004f, 0.864258f, 0.874023f, 0.882812f, 0.892578f,
- 0.901367f, 0.910156f, 0.918457f, 0.926758f, 0.936035f, 0.942871f, 0.950684f, 0.958496f,
- 0.965820f, 0.973145f, 0.980469f, 0.965820f, 0.955078f, 0.945312f, 0.936523f, 0.928223f,
- 0.013420f, 0.041138f, 0.068359f, 0.096436f, 0.124023f, 0.150879f, 0.177246f, 0.204224f,
- 0.230103f, 0.255859f, 0.281494f, 0.305420f, 0.329834f, 0.352783f, 0.376709f, 0.398682f,
- 0.420654f, 0.442627f, 0.462646f, 0.483887f, 0.502441f, 0.521484f, 0.540527f, 0.559082f,
- 0.576172f, 0.595703f, 0.611328f, 0.627930f, 0.644043f, 0.659668f, 0.674316f, 0.688965f,
- 0.703613f, 0.717285f, 0.730957f, 0.744629f, 0.756836f, 0.770020f, 0.781738f, 0.793945f,
- 0.805176f, 0.816895f, 0.828125f, 0.838379f, 0.849121f, 0.859375f, 0.869141f, 0.878418f,
- 0.888184f, 0.897461f, 0.906738f, 0.915039f, 0.923828f, 0.932129f, 0.940430f, 0.947754f,
- 0.956543f, 0.963867f, 0.976074f, 0.962402f, 0.951660f, 0.942383f, 0.934082f, 0.926758f,
- 0.012001f, 0.036591f, 0.061737f, 0.086670f, 0.112000f, 0.136719f, 0.161743f, 0.186768f,
- 0.211792f, 0.235840f, 0.259521f, 0.283203f, 0.307129f, 0.329590f, 0.352295f, 0.374268f,
- 0.395996f, 0.416992f, 0.437744f, 0.457520f, 0.477295f, 0.497314f, 0.515625f, 0.534180f,
- 0.553223f, 0.570312f, 0.588379f, 0.604492f, 0.621582f, 0.636719f, 0.653320f, 0.666992f,
- 0.683105f, 0.697266f, 0.710449f, 0.724609f, 0.737793f, 0.750977f, 0.764160f, 0.775879f,
- 0.788086f, 0.799805f, 0.812012f, 0.823242f, 0.833496f, 0.844238f, 0.854492f, 0.864746f,
- 0.875000f, 0.884277f, 0.894043f, 0.902832f, 0.911621f, 0.920898f, 0.929688f, 0.937500f,
- 0.945801f, 0.953613f, 0.971191f, 0.958984f, 0.949219f, 0.939941f, 0.932129f, 0.924316f,
- 0.010612f, 0.032684f, 0.054810f, 0.077759f, 0.100952f, 0.124023f, 0.146851f, 0.171021f,
- 0.193604f, 0.217163f, 0.239380f, 0.261963f, 0.284424f, 0.307129f, 0.328613f, 0.351318f,
- 0.371826f, 0.392334f, 0.413574f, 0.432617f, 0.453613f, 0.472656f, 0.491943f, 0.510254f,
- 0.528320f, 0.546387f, 0.563965f, 0.580078f, 0.598633f, 0.613770f, 0.629883f, 0.645996f,
- 0.661621f, 0.675293f, 0.688965f, 0.705078f, 0.718262f, 0.731934f, 0.745605f, 0.757812f,
- 0.770996f, 0.782715f, 0.795410f, 0.807129f, 0.818359f, 0.829102f, 0.839844f, 0.851074f,
- 0.860840f, 0.871094f, 0.880859f, 0.891113f, 0.900391f, 0.909668f, 0.917969f, 0.927246f,
- 0.935547f, 0.943848f, 0.966797f, 0.955566f, 0.945801f, 0.937012f, 0.929199f, 0.921875f,
- 0.009483f, 0.029556f, 0.050140f, 0.070129f, 0.091797f, 0.112549f, 0.134155f, 0.156372f,
- 0.177368f, 0.198975f, 0.220825f, 0.243286f, 0.263916f, 0.285645f, 0.306885f, 0.327393f,
- 0.348145f, 0.368896f, 0.389404f, 0.409424f, 0.429199f, 0.448730f, 0.467529f, 0.486572f,
- 0.505371f, 0.522461f, 0.540039f, 0.558105f, 0.574219f, 0.591309f, 0.607422f, 0.623535f,
- 0.639648f, 0.654785f, 0.669922f, 0.685547f, 0.698730f, 0.712891f, 0.726074f, 0.740234f,
- 0.752441f, 0.765625f, 0.778320f, 0.789551f, 0.802246f, 0.813477f, 0.825195f, 0.836426f,
- 0.847168f, 0.856934f, 0.868164f, 0.877930f, 0.888184f, 0.897461f, 0.906738f, 0.915527f,
- 0.925293f, 0.935059f, 0.962402f, 0.951660f, 0.942383f, 0.933594f, 0.926270f, 0.919434f,
- 0.008934f, 0.026581f, 0.044708f, 0.063354f, 0.082825f, 0.102844f, 0.122437f, 0.141968f,
- 0.162720f, 0.183105f, 0.202515f, 0.224609f, 0.244995f, 0.265381f, 0.285645f, 0.306152f,
- 0.326416f, 0.346680f, 0.365967f, 0.385498f, 0.406006f, 0.425293f, 0.444092f, 0.461914f,
- 0.480225f, 0.499268f, 0.517090f, 0.535156f, 0.552246f, 0.568359f, 0.585449f, 0.601562f,
- 0.616699f, 0.633789f, 0.649414f, 0.663574f, 0.678711f, 0.693848f, 0.706543f, 0.721680f,
- 0.734375f, 0.746582f, 0.760742f, 0.773438f, 0.786133f, 0.797852f, 0.809082f, 0.821777f,
- 0.832031f, 0.843262f, 0.854492f, 0.864746f, 0.875000f, 0.884766f, 0.895020f, 0.904785f,
- 0.914062f, 0.922852f, 0.957520f, 0.947266f, 0.938965f, 0.930664f, 0.923340f, 0.916992f,
- 0.007668f, 0.024017f, 0.040405f, 0.057831f, 0.075195f, 0.093079f, 0.111694f, 0.130127f,
- 0.148926f, 0.168213f, 0.187500f, 0.206543f, 0.226440f, 0.246460f, 0.265869f, 0.285400f,
- 0.305176f, 0.324707f, 0.344238f, 0.363281f, 0.383057f, 0.401123f, 0.420166f, 0.439941f,
- 0.457764f, 0.475586f, 0.493164f, 0.511719f, 0.528809f, 0.545898f, 0.562988f, 0.579590f,
- 0.596191f, 0.612305f, 0.627441f, 0.643555f, 0.658203f, 0.672363f, 0.687988f, 0.702637f,
- 0.715332f, 0.728516f, 0.742676f, 0.756348f, 0.768555f, 0.781250f, 0.794434f, 0.806152f,
- 0.818359f, 0.828613f, 0.840332f, 0.851074f, 0.861816f, 0.872559f, 0.882812f, 0.892578f,
- 0.903320f, 0.912598f, 0.952637f, 0.943848f, 0.935059f, 0.927246f, 0.920410f, 0.914062f,
- 0.007263f, 0.021530f, 0.037048f, 0.052429f, 0.068909f, 0.084961f, 0.102112f, 0.119568f,
- 0.136475f, 0.154541f, 0.172852f, 0.191528f, 0.209717f, 0.228638f, 0.246948f, 0.265869f,
- 0.284912f, 0.304199f, 0.322510f, 0.341309f, 0.360596f, 0.379639f, 0.397461f, 0.416504f,
- 0.434570f, 0.452881f, 0.470947f, 0.489014f, 0.505859f, 0.523438f, 0.541016f, 0.557129f,
- 0.574219f, 0.590332f, 0.606445f, 0.622070f, 0.637695f, 0.653809f, 0.667969f, 0.682129f,
- 0.697754f, 0.711426f, 0.724609f, 0.737793f, 0.750977f, 0.765625f, 0.777832f, 0.790039f,
- 0.801270f, 0.813477f, 0.825684f, 0.837402f, 0.848145f, 0.859375f, 0.870117f, 0.880859f,
- 0.891602f, 0.900391f, 0.947754f, 0.938965f, 0.931152f, 0.923828f, 0.917480f, 0.911133f,
- 0.006401f, 0.019730f, 0.033813f, 0.047729f, 0.062561f, 0.077515f, 0.093140f, 0.108948f,
- 0.125366f, 0.141968f, 0.159058f, 0.175781f, 0.193726f, 0.212036f, 0.229980f, 0.247681f,
- 0.265869f, 0.284424f, 0.302734f, 0.320557f, 0.339111f, 0.357910f, 0.376221f, 0.394287f,
- 0.412109f, 0.429688f, 0.448486f, 0.466064f, 0.483398f, 0.500977f, 0.517090f, 0.535156f,
- 0.552246f, 0.568359f, 0.583984f, 0.600586f, 0.616699f, 0.632324f, 0.647949f, 0.662598f,
- 0.677246f, 0.692383f, 0.706543f, 0.719727f, 0.734375f, 0.747070f, 0.761230f, 0.773926f,
- 0.786621f, 0.797852f, 0.811523f, 0.823242f, 0.834961f, 0.846680f, 0.857422f, 0.868652f,
- 0.879395f, 0.890137f, 0.942383f, 0.934082f, 0.927246f, 0.919922f, 0.913574f, 0.908203f,
- 0.005836f, 0.018158f, 0.030746f, 0.043335f, 0.057007f, 0.070801f, 0.085754f, 0.099548f,
- 0.115112f, 0.130127f, 0.146362f, 0.162354f, 0.178711f, 0.195801f, 0.212769f, 0.230103f,
- 0.247925f, 0.264893f, 0.283203f, 0.300293f, 0.318604f, 0.336426f, 0.354492f, 0.372314f,
- 0.390137f, 0.408203f, 0.425537f, 0.443848f, 0.461182f, 0.478271f, 0.496094f, 0.513184f,
- 0.529297f, 0.546387f, 0.563477f, 0.580566f, 0.595703f, 0.611816f, 0.626465f, 0.642090f,
- 0.658691f, 0.671875f, 0.686523f, 0.702148f, 0.716797f, 0.729980f, 0.744629f, 0.757324f,
- 0.770020f, 0.783203f, 0.796875f, 0.808105f, 0.820312f, 0.832520f, 0.844727f, 0.855957f,
- 0.867188f, 0.877930f, 0.937012f, 0.930176f, 0.922852f, 0.916504f, 0.910645f, 0.904785f,
- 0.005486f, 0.016525f, 0.028030f, 0.039612f, 0.052185f, 0.064636f, 0.077576f, 0.091553f,
- 0.105347f, 0.119568f, 0.134521f, 0.149536f, 0.164917f, 0.180664f, 0.197388f, 0.213623f,
- 0.230347f, 0.246826f, 0.264160f, 0.280518f, 0.298584f, 0.315674f, 0.334229f, 0.350830f,
- 0.369141f, 0.386963f, 0.404053f, 0.422119f, 0.438477f, 0.456299f, 0.474121f, 0.491211f,
- 0.507812f, 0.524902f, 0.541504f, 0.557617f, 0.574707f, 0.590820f, 0.606934f, 0.622559f,
- 0.637207f, 0.652832f, 0.668945f, 0.683105f, 0.698730f, 0.711914f, 0.726074f, 0.740723f,
- 0.753906f, 0.766602f, 0.780273f, 0.792969f, 0.805664f, 0.818848f, 0.830566f, 0.842285f,
- 0.854492f, 0.866211f, 0.931641f, 0.925781f, 0.918945f, 0.913086f, 0.907227f, 0.900879f,
- 0.004810f, 0.014847f, 0.025604f, 0.036621f, 0.047577f, 0.059174f, 0.071472f, 0.084106f,
- 0.096985f, 0.109863f, 0.124146f, 0.137939f, 0.152954f, 0.167358f, 0.182495f, 0.197754f,
- 0.213745f, 0.230103f, 0.246216f, 0.262939f, 0.279297f, 0.296387f, 0.313477f, 0.329834f,
- 0.348145f, 0.365479f, 0.382080f, 0.399658f, 0.417480f, 0.434082f, 0.452148f, 0.469238f,
- 0.486084f, 0.502441f, 0.520020f, 0.536621f, 0.552734f, 0.569336f, 0.585938f, 0.601562f,
- 0.617676f, 0.632812f, 0.648438f, 0.664062f, 0.679688f, 0.693848f, 0.708008f, 0.722656f,
- 0.735840f, 0.750488f, 0.765137f, 0.777832f, 0.791016f, 0.803711f, 0.816895f, 0.829102f,
- 0.841309f, 0.853027f, 0.925781f, 0.921387f, 0.914551f, 0.908203f, 0.903320f, 0.897461f,
- 0.004494f, 0.013809f, 0.023331f, 0.033264f, 0.043549f, 0.053833f, 0.065369f, 0.076660f,
- 0.088684f, 0.100708f, 0.113464f, 0.127075f, 0.140381f, 0.154419f, 0.169067f, 0.183472f,
- 0.198975f, 0.213623f, 0.229370f, 0.245117f, 0.261475f, 0.277832f, 0.294678f, 0.311523f,
- 0.327148f, 0.344727f, 0.362061f, 0.378418f, 0.395996f, 0.413086f, 0.430176f, 0.447021f,
- 0.464111f, 0.481689f, 0.498047f, 0.514648f, 0.531738f, 0.547363f, 0.565430f, 0.582031f,
- 0.597656f, 0.612793f, 0.628418f, 0.644043f, 0.660645f, 0.674805f, 0.689941f, 0.705078f,
- 0.718750f, 0.734375f, 0.747559f, 0.761719f, 0.775391f, 0.788086f, 0.803223f, 0.814453f,
- 0.828125f, 0.840332f, 0.919434f, 0.916504f, 0.909668f, 0.904785f, 0.898926f, 0.894043f,
- 0.004120f, 0.012512f, 0.021423f, 0.030655f, 0.039673f, 0.049500f, 0.059845f, 0.070374f,
- 0.081543f, 0.093323f, 0.104614f, 0.116577f, 0.129395f, 0.142456f, 0.156250f, 0.169434f,
- 0.183594f, 0.198364f, 0.213257f, 0.228638f, 0.244141f, 0.259766f, 0.275635f, 0.291748f,
- 0.308105f, 0.324707f, 0.341309f, 0.359131f, 0.375244f, 0.391846f, 0.408447f, 0.426025f,
- 0.442871f, 0.459473f, 0.477051f, 0.494141f, 0.510254f, 0.527344f, 0.543457f, 0.560059f,
- 0.577148f, 0.592773f, 0.608887f, 0.625977f, 0.640625f, 0.656738f, 0.671875f, 0.686523f,
- 0.702637f, 0.716797f, 0.731445f, 0.746582f, 0.759277f, 0.773926f, 0.787598f, 0.800293f,
- 0.814453f, 0.827148f, 0.914062f, 0.911133f, 0.905273f, 0.899902f, 0.895508f, 0.890625f,
- 0.004120f, 0.011566f, 0.019180f, 0.027969f, 0.036255f, 0.045746f, 0.054901f, 0.064941f,
- 0.074707f, 0.085327f, 0.096436f, 0.107239f, 0.119324f, 0.131470f, 0.144165f, 0.157104f,
- 0.169922f, 0.183594f, 0.198242f, 0.212769f, 0.227295f, 0.242188f, 0.257568f, 0.273193f,
- 0.289307f, 0.305420f, 0.321289f, 0.337891f, 0.354492f, 0.371094f, 0.387451f, 0.405029f,
- 0.421143f, 0.438477f, 0.455322f, 0.472656f, 0.488525f, 0.505859f, 0.521973f, 0.539551f,
- 0.555664f, 0.572754f, 0.588867f, 0.605469f, 0.621582f, 0.637207f, 0.653320f, 0.668945f,
- 0.684570f, 0.698242f, 0.714844f, 0.729492f, 0.745117f, 0.758301f, 0.771973f, 0.787109f,
- 0.800781f, 0.813477f, 0.907715f, 0.905762f, 0.900879f, 0.895508f, 0.890625f, 0.886719f,
- 0.003464f, 0.010536f, 0.018143f, 0.025604f, 0.033600f, 0.041992f, 0.050659f, 0.059631f,
- 0.068481f, 0.078552f, 0.088196f, 0.099060f, 0.110107f, 0.121033f, 0.133057f, 0.145020f,
- 0.157349f, 0.170166f, 0.183838f, 0.197632f, 0.210938f, 0.225464f, 0.241089f, 0.255371f,
- 0.270508f, 0.286377f, 0.302246f, 0.317871f, 0.334229f, 0.349854f, 0.367188f, 0.383789f,
- 0.399414f, 0.417236f, 0.433838f, 0.450928f, 0.468018f, 0.484131f, 0.501465f, 0.519043f,
- 0.535156f, 0.551758f, 0.568359f, 0.585449f, 0.601074f, 0.617676f, 0.634277f, 0.649902f,
- 0.666016f, 0.681152f, 0.695801f, 0.711914f, 0.727539f, 0.741699f, 0.756836f, 0.770508f,
- 0.785645f, 0.800293f, 0.901855f, 0.900391f, 0.895996f, 0.891113f, 0.886230f, 0.881836f,
- 0.003197f, 0.009903f, 0.016525f, 0.023849f, 0.030853f, 0.038605f, 0.046265f, 0.054657f,
- 0.063232f, 0.072266f, 0.081543f, 0.090881f, 0.100769f, 0.112061f, 0.123047f, 0.134155f,
- 0.145752f, 0.157471f, 0.170166f, 0.182861f, 0.196289f, 0.210327f, 0.223755f, 0.238525f,
- 0.253418f, 0.268066f, 0.283203f, 0.299316f, 0.314697f, 0.330811f, 0.346680f, 0.363281f,
- 0.379639f, 0.396484f, 0.412842f, 0.429443f, 0.446289f, 0.462891f, 0.480225f, 0.497559f,
- 0.514648f, 0.531250f, 0.547852f, 0.564453f, 0.581055f, 0.598145f, 0.615234f, 0.631836f,
- 0.646484f, 0.663086f, 0.679199f, 0.694824f, 0.710449f, 0.726074f, 0.740234f, 0.755859f,
- 0.770508f, 0.784668f, 0.895020f, 0.894531f, 0.890625f, 0.886719f, 0.881836f, 0.877441f,
- 0.003071f, 0.009163f, 0.015602f, 0.021729f, 0.028412f, 0.035522f, 0.042755f, 0.050598f,
- 0.057983f, 0.066284f, 0.075317f, 0.083862f, 0.092773f, 0.102905f, 0.113342f, 0.123840f,
- 0.134399f, 0.145752f, 0.157593f, 0.169556f, 0.182129f, 0.194702f, 0.207886f, 0.222046f,
- 0.235840f, 0.250977f, 0.265137f, 0.280273f, 0.295898f, 0.311279f, 0.326660f, 0.342773f,
- 0.359375f, 0.375732f, 0.392090f, 0.409180f, 0.425049f, 0.441895f, 0.459473f, 0.476318f,
- 0.493652f, 0.510742f, 0.527344f, 0.544434f, 0.561035f, 0.578125f, 0.595215f, 0.611328f,
- 0.628418f, 0.645020f, 0.661133f, 0.677246f, 0.693359f, 0.708496f, 0.724609f, 0.740723f,
- 0.755859f, 0.771484f, 0.889160f, 0.889160f, 0.885254f, 0.881348f, 0.876953f, 0.873047f,
- 0.002748f, 0.008171f, 0.014084f, 0.019638f, 0.026108f, 0.032318f, 0.039154f, 0.045990f,
- 0.053619f, 0.061066f, 0.068665f, 0.076477f, 0.085632f, 0.094727f, 0.104187f, 0.113831f,
- 0.123535f, 0.134888f, 0.145508f, 0.157104f, 0.168701f, 0.181030f, 0.193481f, 0.206665f,
- 0.220093f, 0.233398f, 0.248169f, 0.262695f, 0.277344f, 0.292236f, 0.307617f, 0.322998f,
- 0.339355f, 0.355469f, 0.371582f, 0.388184f, 0.404541f, 0.420410f, 0.438477f, 0.455322f,
- 0.472656f, 0.489014f, 0.506348f, 0.523926f, 0.541016f, 0.557617f, 0.575195f, 0.591309f,
- 0.608887f, 0.625977f, 0.643555f, 0.659180f, 0.674805f, 0.691406f, 0.707520f, 0.724121f,
- 0.739746f, 0.755371f, 0.882812f, 0.883789f, 0.879883f, 0.875977f, 0.872559f, 0.868652f,
- 0.002491f, 0.007809f, 0.012764f, 0.018448f, 0.024094f, 0.029861f, 0.036102f, 0.042572f,
- 0.049500f, 0.056091f, 0.063293f, 0.070984f, 0.079285f, 0.087036f, 0.095825f, 0.104858f,
- 0.114441f, 0.124084f, 0.133789f, 0.144653f, 0.156250f, 0.167480f, 0.179199f, 0.191650f,
- 0.204102f, 0.217896f, 0.231445f, 0.245239f, 0.259521f, 0.274170f, 0.289307f, 0.304199f,
- 0.319580f, 0.334961f, 0.351074f, 0.367676f, 0.384277f, 0.400635f, 0.417480f, 0.434570f,
- 0.451660f, 0.468994f, 0.485352f, 0.502441f, 0.520508f, 0.537109f, 0.554688f, 0.571777f,
- 0.588867f, 0.605957f, 0.623047f, 0.639648f, 0.656738f, 0.673828f, 0.690430f, 0.708008f,
- 0.723633f, 0.739746f, 0.874023f, 0.876953f, 0.874023f, 0.871582f, 0.867188f, 0.862793f,
- 0.002279f, 0.007130f, 0.012291f, 0.016922f, 0.022171f, 0.027847f, 0.033325f, 0.039185f,
- 0.045349f, 0.051849f, 0.058411f, 0.064880f, 0.072144f, 0.080017f, 0.087891f, 0.096313f,
- 0.105103f, 0.114197f, 0.123779f, 0.134155f, 0.144043f, 0.155151f, 0.166016f, 0.177246f,
- 0.189697f, 0.202271f, 0.214722f, 0.228271f, 0.242310f, 0.256592f, 0.270752f, 0.285400f,
- 0.300537f, 0.315674f, 0.331543f, 0.347656f, 0.363525f, 0.379639f, 0.396729f, 0.414307f,
- 0.430908f, 0.447754f, 0.465088f, 0.482178f, 0.499512f, 0.517090f, 0.533203f, 0.552246f,
- 0.568848f, 0.586426f, 0.603516f, 0.621582f, 0.639648f, 0.656250f, 0.673828f, 0.690918f,
- 0.707520f, 0.724121f, 0.867676f, 0.870605f, 0.868164f, 0.865723f, 0.861328f, 0.857910f,
- 0.002220f, 0.006565f, 0.011238f, 0.015961f, 0.020401f, 0.025558f, 0.030853f, 0.036133f,
- 0.041199f, 0.047180f, 0.053436f, 0.059723f, 0.066162f, 0.073853f, 0.080688f, 0.088440f,
- 0.096436f, 0.105042f, 0.114319f, 0.123047f, 0.132446f, 0.142822f, 0.153198f, 0.164062f,
- 0.175659f, 0.187378f, 0.199463f, 0.212402f, 0.225464f, 0.239014f, 0.252686f, 0.266846f,
- 0.281494f, 0.296631f, 0.312500f, 0.328369f, 0.343750f, 0.359863f, 0.376221f, 0.393066f,
- 0.409668f, 0.426514f, 0.444336f, 0.461670f, 0.478760f, 0.496826f, 0.513672f, 0.532227f,
- 0.549316f, 0.567383f, 0.584961f, 0.602051f, 0.620605f, 0.637207f, 0.655273f, 0.672363f,
- 0.689941f, 0.708008f, 0.860840f, 0.864746f, 0.862793f, 0.859375f, 0.855957f, 0.853027f,
- 0.002190f, 0.005993f, 0.010117f, 0.014420f, 0.018738f, 0.023361f, 0.028015f, 0.033142f,
- 0.037781f, 0.043732f, 0.048920f, 0.054840f, 0.061218f, 0.067810f, 0.074219f, 0.081299f,
- 0.088562f, 0.096130f, 0.104614f, 0.113098f, 0.122253f, 0.131714f, 0.141113f, 0.151245f,
- 0.162109f, 0.173462f, 0.184692f, 0.196899f, 0.209473f, 0.222534f, 0.236206f, 0.249634f,
- 0.263672f, 0.277588f, 0.293213f, 0.308350f, 0.323975f, 0.339844f, 0.355957f, 0.372070f,
- 0.389404f, 0.405762f, 0.422852f, 0.439941f, 0.458008f, 0.475098f, 0.492920f, 0.510742f,
- 0.528320f, 0.546875f, 0.564453f, 0.583496f, 0.601074f, 0.619141f, 0.636719f, 0.654785f,
- 0.672852f, 0.691406f, 0.852539f, 0.858398f, 0.856445f, 0.853516f, 0.850586f, 0.847656f,
- 0.001787f, 0.005753f, 0.009300f, 0.013611f, 0.017410f, 0.021576f, 0.025665f, 0.030533f,
- 0.035126f, 0.040039f, 0.044952f, 0.050446f, 0.055817f, 0.061890f, 0.068054f, 0.074707f,
- 0.081482f, 0.088501f, 0.095764f, 0.103943f, 0.112183f, 0.120850f, 0.130249f, 0.139526f,
- 0.149658f, 0.160400f, 0.171021f, 0.182007f, 0.194336f, 0.206421f, 0.219360f, 0.232666f,
- 0.245850f, 0.260010f, 0.274170f, 0.289307f, 0.304443f, 0.319580f, 0.335693f, 0.352295f,
- 0.369141f, 0.385498f, 0.402344f, 0.419189f, 0.437012f, 0.454346f, 0.472412f, 0.490234f,
- 0.507812f, 0.525879f, 0.545410f, 0.562500f, 0.581055f, 0.600098f, 0.618164f, 0.636719f,
- 0.655273f, 0.674316f, 0.845703f, 0.852051f, 0.849609f, 0.847168f, 0.845215f, 0.841309f,
- 0.001766f, 0.005241f, 0.008881f, 0.012024f, 0.016129f, 0.020233f, 0.024124f, 0.027664f,
- 0.032135f, 0.036835f, 0.041321f, 0.046173f, 0.051392f, 0.056946f, 0.062225f, 0.068604f,
- 0.074524f, 0.080933f, 0.088135f, 0.095398f, 0.103210f, 0.110779f, 0.119263f, 0.128296f,
- 0.137695f, 0.147217f, 0.157349f, 0.168091f, 0.179688f, 0.191284f, 0.203613f, 0.215942f,
- 0.228882f, 0.242554f, 0.255859f, 0.270508f, 0.285400f, 0.300537f, 0.316406f, 0.331787f,
- 0.348877f, 0.364746f, 0.382080f, 0.398682f, 0.415771f, 0.434082f, 0.451416f, 0.469482f,
- 0.487793f, 0.505859f, 0.524414f, 0.542969f, 0.562012f, 0.580566f, 0.598145f, 0.618652f,
- 0.637695f, 0.657227f, 0.837891f, 0.844727f, 0.843750f, 0.841309f, 0.838379f, 0.836426f,
- 0.001598f, 0.004887f, 0.008217f, 0.011497f, 0.014786f, 0.018326f, 0.021652f, 0.025513f,
- 0.029541f, 0.033813f, 0.038086f, 0.042236f, 0.046844f, 0.052032f, 0.057251f, 0.062622f,
- 0.068237f, 0.074280f, 0.080505f, 0.086975f, 0.094116f, 0.101074f, 0.109314f, 0.117554f,
- 0.126587f, 0.135254f, 0.144775f, 0.155029f, 0.165405f, 0.176392f, 0.187744f, 0.199829f,
- 0.212646f, 0.224976f, 0.238647f, 0.252441f, 0.267090f, 0.281738f, 0.296631f, 0.312256f,
- 0.328369f, 0.344971f, 0.361328f, 0.377686f, 0.395264f, 0.412842f, 0.430908f, 0.448730f,
- 0.467041f, 0.485596f, 0.503906f, 0.522461f, 0.541504f, 0.561523f, 0.580078f, 0.599121f,
- 0.618164f, 0.639648f, 0.828613f, 0.837891f, 0.836914f, 0.834473f, 0.833008f, 0.830566f,
- 0.001709f, 0.004494f, 0.007416f, 0.010628f, 0.013680f, 0.016785f, 0.020203f, 0.023712f,
- 0.027435f, 0.031006f, 0.034424f, 0.038635f, 0.043182f, 0.047668f, 0.052307f, 0.057159f,
- 0.062042f, 0.067749f, 0.073730f, 0.079956f, 0.086182f, 0.092773f, 0.100159f, 0.107727f,
- 0.115479f, 0.123962f, 0.132935f, 0.142578f, 0.151978f, 0.162476f, 0.173340f, 0.184570f,
- 0.196411f, 0.208740f, 0.221436f, 0.235229f, 0.248779f, 0.262939f, 0.277832f, 0.293213f,
- 0.308105f, 0.324219f, 0.341309f, 0.357178f, 0.374756f, 0.391846f, 0.409424f, 0.427490f,
- 0.446533f, 0.464844f, 0.483643f, 0.501953f, 0.521484f, 0.541504f, 0.561035f, 0.579590f,
- 0.599609f, 0.620605f, 0.821289f, 0.830566f, 0.830078f, 0.828125f, 0.825684f, 0.823242f,
- 0.001367f, 0.004105f, 0.007023f, 0.009552f, 0.012611f, 0.015289f, 0.018341f, 0.021652f,
- 0.024857f, 0.027878f, 0.031769f, 0.035614f, 0.039276f, 0.043610f, 0.047333f, 0.052155f,
- 0.056549f, 0.061401f, 0.066895f, 0.072449f, 0.078613f, 0.084778f, 0.091309f, 0.098083f,
- 0.105774f, 0.113281f, 0.121399f, 0.130371f, 0.139648f, 0.148926f, 0.159546f, 0.169922f,
- 0.180908f, 0.192749f, 0.204834f, 0.217651f, 0.231567f, 0.244385f, 0.259277f, 0.273926f,
- 0.289307f, 0.304688f, 0.320557f, 0.336914f, 0.354248f, 0.371338f, 0.388184f, 0.406982f,
- 0.424316f, 0.443115f, 0.462646f, 0.481445f, 0.501465f, 0.520508f, 0.541016f, 0.559570f,
- 0.580078f, 0.601074f, 0.812988f, 0.823242f, 0.823242f, 0.821289f, 0.819824f, 0.817383f,
- 0.001398f, 0.003883f, 0.006351f, 0.008911f, 0.011559f, 0.014343f, 0.017212f, 0.020035f,
- 0.022797f, 0.026062f, 0.028793f, 0.031891f, 0.035858f, 0.039368f, 0.043213f, 0.047607f,
- 0.051483f, 0.056030f, 0.060883f, 0.065979f, 0.071350f, 0.076843f, 0.083130f, 0.089172f,
- 0.096069f, 0.103333f, 0.111023f, 0.119019f, 0.127319f, 0.136719f, 0.145996f, 0.156128f,
- 0.166138f, 0.177368f, 0.189453f, 0.201416f, 0.213745f, 0.227295f, 0.240601f, 0.255371f,
- 0.269287f, 0.285400f, 0.301270f, 0.317139f, 0.333740f, 0.350586f, 0.367920f, 0.385986f,
- 0.404297f, 0.422852f, 0.442383f, 0.460938f, 0.479980f, 0.500488f, 0.520508f, 0.541016f,
- 0.560547f, 0.582520f, 0.803711f, 0.814941f, 0.815430f, 0.814453f, 0.812500f, 0.810547f,
- 0.001259f, 0.003464f, 0.006332f, 0.008286f, 0.010384f, 0.013000f, 0.015587f, 0.018234f,
- 0.021027f, 0.023422f, 0.026566f, 0.029480f, 0.032379f, 0.035919f, 0.039215f, 0.043060f,
- 0.046997f, 0.050995f, 0.055267f, 0.059998f, 0.065002f, 0.069946f, 0.075317f, 0.081299f,
- 0.087280f, 0.094116f, 0.101135f, 0.108276f, 0.116150f, 0.124695f, 0.133545f, 0.142700f,
- 0.152222f, 0.162720f, 0.173950f, 0.185303f, 0.197754f, 0.210205f, 0.223022f, 0.237061f,
- 0.250732f, 0.265869f, 0.281250f, 0.297119f, 0.313477f, 0.330322f, 0.347656f, 0.364746f,
- 0.383301f, 0.401367f, 0.420898f, 0.440186f, 0.459229f, 0.479736f, 0.499512f, 0.520996f,
- 0.541016f, 0.562988f, 0.794434f, 0.807129f, 0.807617f, 0.807129f, 0.805176f, 0.803711f,
- 0.001070f, 0.003237f, 0.005432f, 0.007359f, 0.009857f, 0.012337f, 0.014191f, 0.016586f,
- 0.019257f, 0.021561f, 0.024094f, 0.026901f, 0.029724f, 0.032745f, 0.035675f, 0.039368f,
- 0.042572f, 0.045990f, 0.050354f, 0.054535f, 0.058746f, 0.063232f, 0.068420f, 0.073608f,
- 0.079529f, 0.085266f, 0.091370f, 0.098083f, 0.105835f, 0.113159f, 0.121094f, 0.129639f,
- 0.139038f, 0.148926f, 0.159058f, 0.169678f, 0.181274f, 0.193481f, 0.205811f, 0.219482f,
- 0.233032f, 0.247192f, 0.262207f, 0.277100f, 0.293213f, 0.309814f, 0.326660f, 0.344238f,
- 0.361816f, 0.380615f, 0.398926f, 0.418945f, 0.438477f, 0.458008f, 0.479004f, 0.499512f,
- 0.520996f, 0.543945f, 0.784668f, 0.798828f, 0.800293f, 0.799805f, 0.797852f, 0.796875f,
- 0.001074f, 0.002916f, 0.004955f, 0.007149f, 0.009033f, 0.011055f, 0.013268f, 0.015495f,
- 0.017365f, 0.019485f, 0.022095f, 0.024002f, 0.026688f, 0.029633f, 0.032593f, 0.035370f,
- 0.038361f, 0.041870f, 0.045319f, 0.049225f, 0.052948f, 0.057068f, 0.061676f, 0.066345f,
- 0.071167f, 0.076782f, 0.082581f, 0.088867f, 0.095886f, 0.102539f, 0.109802f, 0.118042f,
- 0.126709f, 0.135132f, 0.144897f, 0.155151f, 0.165771f, 0.177368f, 0.189209f, 0.201904f,
- 0.215210f, 0.229370f, 0.242798f, 0.258057f, 0.274170f, 0.290039f, 0.306885f, 0.323242f,
- 0.341309f, 0.359375f, 0.378418f, 0.397461f, 0.416260f, 0.437500f, 0.457031f, 0.479004f,
- 0.501465f, 0.522461f, 0.775391f, 0.790527f, 0.791992f, 0.791504f, 0.791016f, 0.789551f,
- 0.000837f, 0.002916f, 0.004738f, 0.006477f, 0.008575f, 0.010170f, 0.012161f, 0.014023f,
- 0.015808f, 0.017792f, 0.020111f, 0.022064f, 0.024414f, 0.026794f, 0.029251f, 0.032074f,
- 0.034698f, 0.037598f, 0.040741f, 0.043915f, 0.047577f, 0.051361f, 0.055389f, 0.059692f,
- 0.064209f, 0.068787f, 0.074585f, 0.079712f, 0.085632f, 0.092346f, 0.099487f, 0.106323f,
- 0.114929f, 0.122925f, 0.131958f, 0.141235f, 0.151123f, 0.161865f, 0.172974f, 0.184937f,
- 0.197632f, 0.210693f, 0.224854f, 0.239136f, 0.254395f, 0.269531f, 0.285889f, 0.302979f,
- 0.320557f, 0.338623f, 0.356689f, 0.375977f, 0.395752f, 0.415527f, 0.436523f, 0.458252f,
- 0.479248f, 0.501465f, 0.765137f, 0.781738f, 0.783691f, 0.784180f, 0.783203f, 0.781250f,
- 0.000854f, 0.002817f, 0.004089f, 0.005684f, 0.007675f, 0.009277f, 0.010864f, 0.012413f,
- 0.014427f, 0.016235f, 0.017838f, 0.019913f, 0.021805f, 0.023987f, 0.026276f, 0.028915f,
- 0.030960f, 0.033875f, 0.036652f, 0.039551f, 0.042816f, 0.045837f, 0.049591f, 0.053589f,
- 0.057526f, 0.061829f, 0.066650f, 0.071655f, 0.077393f, 0.083008f, 0.088989f, 0.096008f,
- 0.103210f, 0.110657f, 0.119141f, 0.127930f, 0.137085f, 0.146973f, 0.157593f, 0.169312f,
- 0.181274f, 0.193481f, 0.207031f, 0.220581f, 0.235229f, 0.250732f, 0.266357f, 0.282227f,
- 0.299805f, 0.317627f, 0.335449f, 0.354736f, 0.374268f, 0.394531f, 0.415527f, 0.436279f,
- 0.458252f, 0.481689f, 0.754883f, 0.773438f, 0.775391f, 0.775879f, 0.774902f, 0.773926f,
- 0.000852f, 0.002520f, 0.003937f, 0.005527f, 0.006836f, 0.008408f, 0.009773f, 0.011620f,
- 0.013039f, 0.014687f, 0.016327f, 0.017944f, 0.019760f, 0.021774f, 0.023697f, 0.025894f,
- 0.027969f, 0.030121f, 0.032501f, 0.035370f, 0.038208f, 0.041046f, 0.044098f, 0.047791f,
- 0.051453f, 0.055176f, 0.059570f, 0.064026f, 0.068787f, 0.074158f, 0.079834f, 0.085938f,
- 0.092590f, 0.099304f, 0.106873f, 0.114990f, 0.124023f, 0.133301f, 0.143066f, 0.153687f,
- 0.164551f, 0.176392f, 0.189209f, 0.202637f, 0.216553f, 0.231323f, 0.246704f, 0.262451f,
- 0.279297f, 0.296387f, 0.314697f, 0.333496f, 0.353516f, 0.373047f, 0.394775f, 0.415039f,
- 0.437500f, 0.460449f, 0.745117f, 0.763672f, 0.766602f, 0.767090f, 0.767090f, 0.765625f,
- 0.000762f, 0.002342f, 0.003563f, 0.004787f, 0.006447f, 0.007648f, 0.009193f, 0.010353f,
- 0.012016f, 0.013138f, 0.014557f, 0.016312f, 0.017929f, 0.019470f, 0.021103f, 0.023056f,
- 0.024918f, 0.026886f, 0.029099f, 0.031586f, 0.034058f, 0.036499f, 0.039307f, 0.042450f,
- 0.045685f, 0.049072f, 0.052826f, 0.056915f, 0.061096f, 0.065918f, 0.070984f, 0.076538f,
- 0.082520f, 0.088928f, 0.095520f, 0.102905f, 0.111206f, 0.119629f, 0.128662f, 0.138184f,
- 0.148682f, 0.160156f, 0.171997f, 0.184937f, 0.198364f, 0.212524f, 0.227173f, 0.243042f,
- 0.259277f, 0.276611f, 0.294189f, 0.312500f, 0.331055f, 0.350830f, 0.372070f, 0.392334f,
- 0.415771f, 0.438232f, 0.734375f, 0.754395f, 0.758789f, 0.758789f, 0.758789f, 0.757812f,
- 0.000848f, 0.002024f, 0.003553f, 0.004646f, 0.005726f, 0.007050f, 0.008362f, 0.009438f,
- 0.010536f, 0.011810f, 0.013123f, 0.014481f, 0.015778f, 0.017242f, 0.018753f, 0.020447f,
- 0.022278f, 0.023819f, 0.025940f, 0.027771f, 0.029999f, 0.032410f, 0.034851f, 0.037354f,
- 0.040375f, 0.043610f, 0.046631f, 0.050354f, 0.054108f, 0.058563f, 0.062805f, 0.067871f,
- 0.073242f, 0.078796f, 0.085083f, 0.091797f, 0.098816f, 0.106689f, 0.115540f, 0.124207f,
- 0.134155f, 0.144409f, 0.155762f, 0.167725f, 0.180664f, 0.193848f, 0.208618f, 0.223389f,
- 0.239746f, 0.256104f, 0.273438f, 0.291260f, 0.310059f, 0.330078f, 0.349854f, 0.370850f,
- 0.393555f, 0.416992f, 0.724121f, 0.744629f, 0.748535f, 0.750000f, 0.749512f, 0.749512f,
- 0.000736f, 0.001780f, 0.002937f, 0.004314f, 0.005211f, 0.006214f, 0.007423f, 0.008537f,
- 0.009392f, 0.010773f, 0.011726f, 0.012970f, 0.014183f, 0.015373f, 0.016724f, 0.017990f,
- 0.019730f, 0.021194f, 0.022644f, 0.024368f, 0.026443f, 0.028610f, 0.030685f, 0.032898f,
- 0.035583f, 0.038300f, 0.041351f, 0.044556f, 0.047638f, 0.051422f, 0.055359f, 0.059875f,
- 0.064392f, 0.069580f, 0.075195f, 0.080872f, 0.087646f, 0.094849f, 0.102173f, 0.110596f,
- 0.119690f, 0.129761f, 0.139893f, 0.151367f, 0.163452f, 0.176147f, 0.190063f, 0.204590f,
- 0.219238f, 0.235718f, 0.252441f, 0.270264f, 0.289062f, 0.307861f, 0.328613f, 0.350098f,
- 0.372314f, 0.395020f, 0.712402f, 0.734863f, 0.739746f, 0.740723f, 0.740723f, 0.740234f,
- 0.000589f, 0.001616f, 0.002674f, 0.003841f, 0.004940f, 0.005676f, 0.006554f, 0.007442f,
- 0.008812f, 0.009537f, 0.010277f, 0.011528f, 0.012634f, 0.013527f, 0.014671f, 0.016037f,
- 0.017136f, 0.018631f, 0.019943f, 0.021530f, 0.023071f, 0.025146f, 0.026825f, 0.029037f,
- 0.030853f, 0.033447f, 0.035736f, 0.038849f, 0.041656f, 0.044922f, 0.048462f, 0.052277f,
- 0.056519f, 0.061127f, 0.065796f, 0.071411f, 0.077148f, 0.083435f, 0.090393f, 0.097900f,
- 0.106079f, 0.115356f, 0.125122f, 0.135132f, 0.146729f, 0.158936f, 0.171509f, 0.185059f,
- 0.200439f, 0.215576f, 0.232056f, 0.249756f, 0.267822f, 0.286621f, 0.306885f, 0.328125f,
- 0.349854f, 0.373291f, 0.701172f, 0.725586f, 0.729980f, 0.730957f, 0.731934f, 0.730957f,
- 0.000547f, 0.001666f, 0.002367f, 0.003559f, 0.004238f, 0.005028f, 0.005852f, 0.006859f,
- 0.007755f, 0.008530f, 0.009163f, 0.010056f, 0.010956f, 0.011978f, 0.013062f, 0.014076f,
- 0.015053f, 0.016251f, 0.017471f, 0.018921f, 0.020233f, 0.021774f, 0.023315f, 0.025162f,
- 0.026871f, 0.029007f, 0.031204f, 0.033661f, 0.036102f, 0.039062f, 0.042053f, 0.045380f,
- 0.048859f, 0.053040f, 0.057343f, 0.062225f, 0.067261f, 0.073120f, 0.079407f, 0.086243f,
- 0.093567f, 0.101868f, 0.110596f, 0.120239f, 0.130859f, 0.141968f, 0.154053f, 0.167358f,
- 0.181274f, 0.196045f, 0.212158f, 0.229248f, 0.247192f, 0.265381f, 0.285400f, 0.305664f,
- 0.327637f, 0.350586f, 0.689453f, 0.715820f, 0.720215f, 0.722168f, 0.722168f, 0.722168f,
- 0.000492f, 0.001634f, 0.002342f, 0.003111f, 0.003866f, 0.004574f, 0.005417f, 0.005928f,
- 0.006588f, 0.007393f, 0.008041f, 0.008873f, 0.009689f, 0.010391f, 0.011375f, 0.012146f,
- 0.013100f, 0.014183f, 0.015274f, 0.016479f, 0.017456f, 0.018768f, 0.020157f, 0.021606f,
- 0.023300f, 0.024933f, 0.026855f, 0.028885f, 0.031143f, 0.033417f, 0.036133f, 0.039032f,
- 0.042236f, 0.045776f, 0.049713f, 0.053680f, 0.058228f, 0.063232f, 0.069092f, 0.074829f,
- 0.081482f, 0.089050f, 0.096924f, 0.105591f, 0.115417f, 0.126221f, 0.137329f, 0.149658f,
- 0.162964f, 0.176880f, 0.192505f, 0.208740f, 0.226318f, 0.244873f, 0.263428f, 0.283936f,
- 0.306396f, 0.329346f, 0.676270f, 0.705078f, 0.709961f, 0.711914f, 0.712891f, 0.711914f,
- 0.000506f, 0.001342f, 0.002157f, 0.002813f, 0.003353f, 0.004105f, 0.004658f, 0.005344f,
- 0.005871f, 0.006538f, 0.007050f, 0.007751f, 0.008247f, 0.009109f, 0.009865f, 0.010559f,
- 0.011269f, 0.012169f, 0.013290f, 0.014191f, 0.015015f, 0.016312f, 0.017395f, 0.018570f,
- 0.019989f, 0.021439f, 0.023102f, 0.024536f, 0.026535f, 0.028702f, 0.030899f, 0.033356f,
- 0.035980f, 0.039093f, 0.042328f, 0.046051f, 0.049927f, 0.054199f, 0.059052f, 0.064575f,
- 0.070496f, 0.076782f, 0.084412f, 0.092285f, 0.100708f, 0.110779f, 0.121399f, 0.132690f,
- 0.145508f, 0.158813f, 0.173584f, 0.189453f, 0.205688f, 0.223755f, 0.242554f, 0.263184f,
- 0.284180f, 0.306641f, 0.664551f, 0.693848f, 0.699707f, 0.702148f, 0.702637f, 0.703125f,
- 0.000500f, 0.001122f, 0.001810f, 0.002363f, 0.002987f, 0.003576f, 0.004158f, 0.004620f,
- 0.005032f, 0.005627f, 0.006161f, 0.006721f, 0.007179f, 0.007790f, 0.008385f, 0.009163f,
- 0.009758f, 0.010536f, 0.011284f, 0.011986f, 0.012878f, 0.013710f, 0.014725f, 0.015823f,
- 0.016937f, 0.018326f, 0.019547f, 0.020874f, 0.022522f, 0.024399f, 0.026077f, 0.028427f,
- 0.030609f, 0.032990f, 0.035736f, 0.038788f, 0.042236f, 0.045990f, 0.050354f, 0.054901f,
- 0.059967f, 0.065918f, 0.072205f, 0.079468f, 0.087219f, 0.096252f, 0.105713f, 0.116272f,
- 0.128174f, 0.140747f, 0.154419f, 0.169556f, 0.186279f, 0.203125f, 0.221313f, 0.240601f,
- 0.261719f, 0.284424f, 0.652344f, 0.683105f, 0.688965f, 0.691406f, 0.692383f, 0.693359f,
- 0.000482f, 0.001184f, 0.001604f, 0.002171f, 0.002562f, 0.003029f, 0.003656f, 0.003941f,
- 0.004410f, 0.004948f, 0.005325f, 0.005577f, 0.006157f, 0.006702f, 0.007172f, 0.007751f,
- 0.008331f, 0.008904f, 0.009514f, 0.010063f, 0.010925f, 0.011719f, 0.012306f, 0.013321f,
- 0.014275f, 0.015465f, 0.016510f, 0.017593f, 0.018845f, 0.020401f, 0.022095f, 0.023682f,
- 0.025513f, 0.027679f, 0.029968f, 0.032593f, 0.035461f, 0.038757f, 0.042175f, 0.046326f,
- 0.050873f, 0.055939f, 0.061462f, 0.067444f, 0.074402f, 0.082520f, 0.091125f, 0.100830f,
- 0.111572f, 0.123413f, 0.136719f, 0.150513f, 0.165894f, 0.182251f, 0.200684f, 0.219727f,
- 0.240234f, 0.261963f, 0.640137f, 0.671387f, 0.679199f, 0.680664f, 0.682617f, 0.683105f,
- 0.000501f, 0.000919f, 0.001424f, 0.001853f, 0.002266f, 0.002789f, 0.002998f, 0.003397f,
- 0.003902f, 0.004192f, 0.004417f, 0.004974f, 0.005207f, 0.005676f, 0.006134f, 0.006527f,
- 0.007179f, 0.007465f, 0.008018f, 0.008537f, 0.009178f, 0.009888f, 0.010544f, 0.011093f,
- 0.011986f, 0.012794f, 0.013664f, 0.014717f, 0.015747f, 0.016983f, 0.018127f, 0.019470f,
- 0.021103f, 0.022919f, 0.024826f, 0.026962f, 0.029358f, 0.031769f, 0.035065f, 0.038239f,
- 0.042297f, 0.046570f, 0.051422f, 0.056671f, 0.062805f, 0.069763f, 0.077698f, 0.086182f,
- 0.095825f, 0.106812f, 0.119080f, 0.132568f, 0.147217f, 0.162598f, 0.180176f, 0.198730f,
- 0.218628f, 0.241211f, 0.627441f, 0.660156f, 0.668457f, 0.669922f, 0.672363f, 0.671875f,
- 0.000235f, 0.001120f, 0.001356f, 0.001651f, 0.002117f, 0.002441f, 0.002678f, 0.002993f,
- 0.003244f, 0.003519f, 0.003876f, 0.004086f, 0.004505f, 0.004787f, 0.005085f, 0.005604f,
- 0.005985f, 0.006271f, 0.006783f, 0.007145f, 0.007679f, 0.008217f, 0.008728f, 0.009277f,
- 0.009956f, 0.010605f, 0.011490f, 0.012062f, 0.013084f, 0.013962f, 0.014984f, 0.016113f,
- 0.017395f, 0.018829f, 0.020416f, 0.022125f, 0.023972f, 0.025955f, 0.028625f, 0.031616f,
- 0.034515f, 0.038147f, 0.042114f, 0.046783f, 0.052094f, 0.058075f, 0.065002f, 0.072510f,
- 0.081604f, 0.091125f, 0.102539f, 0.114807f, 0.128662f, 0.143921f, 0.160034f, 0.178467f,
- 0.198364f, 0.218750f, 0.613281f, 0.648926f, 0.657227f, 0.659668f, 0.661621f, 0.661621f,
- 0.000382f, 0.000704f, 0.001099f, 0.001557f, 0.001774f, 0.001976f, 0.002132f, 0.002575f,
- 0.002634f, 0.002916f, 0.003103f, 0.003494f, 0.003754f, 0.003956f, 0.004269f, 0.004684f,
- 0.004902f, 0.005234f, 0.005569f, 0.005890f, 0.006416f, 0.006786f, 0.007160f, 0.007645f,
- 0.008118f, 0.008781f, 0.009346f, 0.010025f, 0.010658f, 0.011475f, 0.012230f, 0.013016f,
- 0.014122f, 0.015251f, 0.016342f, 0.017807f, 0.019424f, 0.021103f, 0.023026f, 0.025436f,
- 0.027817f, 0.030914f, 0.034210f, 0.037750f, 0.042450f, 0.047455f, 0.053101f, 0.059998f,
- 0.067688f, 0.076660f, 0.086670f, 0.097961f, 0.110779f, 0.125366f, 0.140747f, 0.158081f,
- 0.176880f, 0.197632f, 0.600098f, 0.637207f, 0.644531f, 0.647949f, 0.649414f, 0.651855f,
- 0.000182f, 0.000738f, 0.000942f, 0.001220f, 0.001469f, 0.001634f, 0.001820f, 0.002005f,
- 0.002291f, 0.002441f, 0.002636f, 0.002832f, 0.003019f, 0.003242f, 0.003502f, 0.003824f,
- 0.004017f, 0.004333f, 0.004570f, 0.004883f, 0.005173f, 0.005615f, 0.005909f, 0.006317f,
- 0.006649f, 0.007160f, 0.007656f, 0.008156f, 0.008583f, 0.009209f, 0.009857f, 0.010696f,
- 0.011322f, 0.012367f, 0.013229f, 0.014259f, 0.015686f, 0.016815f, 0.018402f, 0.020126f,
- 0.022095f, 0.024414f, 0.027176f, 0.030273f, 0.033722f, 0.038086f, 0.042969f, 0.048645f,
- 0.055237f, 0.063171f, 0.071960f, 0.082031f, 0.093994f, 0.107300f, 0.122131f, 0.138550f,
- 0.156494f, 0.177002f, 0.586426f, 0.625488f, 0.633789f, 0.637207f, 0.638672f, 0.639648f,
- 0.000199f, 0.000534f, 0.000745f, 0.000995f, 0.001190f, 0.001387f, 0.001516f, 0.001691f,
- 0.001790f, 0.001941f, 0.002214f, 0.002346f, 0.002449f, 0.002686f, 0.002832f, 0.003042f,
- 0.003304f, 0.003531f, 0.003662f, 0.003952f, 0.004181f, 0.004517f, 0.004704f, 0.005074f,
- 0.005352f, 0.005718f, 0.006096f, 0.006481f, 0.006947f, 0.007454f, 0.007988f, 0.008484f,
- 0.009140f, 0.009804f, 0.010475f, 0.011307f, 0.012299f, 0.013268f, 0.014511f, 0.015823f,
- 0.017410f, 0.018936f, 0.021225f, 0.023621f, 0.026367f, 0.029770f, 0.033661f, 0.038452f,
- 0.044067f, 0.050812f, 0.058411f, 0.067444f, 0.077942f, 0.090149f, 0.104187f, 0.119812f,
- 0.137085f, 0.156372f, 0.572754f, 0.613770f, 0.621582f, 0.625977f, 0.627441f, 0.628906f,
- 0.000165f, 0.000486f, 0.000618f, 0.000880f, 0.001063f, 0.001140f, 0.001258f, 0.001464f,
- 0.001498f, 0.001561f, 0.001707f, 0.001899f, 0.001976f, 0.002171f, 0.002285f, 0.002474f,
- 0.002571f, 0.002764f, 0.002968f, 0.003170f, 0.003389f, 0.003580f, 0.003822f, 0.004036f,
- 0.004269f, 0.004505f, 0.004738f, 0.005157f, 0.005474f, 0.005821f, 0.006279f, 0.006649f,
- 0.007107f, 0.007610f, 0.008240f, 0.008835f, 0.009598f, 0.010361f, 0.011276f, 0.012299f,
- 0.013466f, 0.014740f, 0.016251f, 0.018021f, 0.020294f, 0.022797f, 0.025833f, 0.029739f,
- 0.034058f, 0.039612f, 0.046021f, 0.053833f, 0.063110f, 0.074158f, 0.086914f, 0.101562f,
- 0.118164f, 0.136841f, 0.558594f, 0.601074f, 0.608887f, 0.613281f, 0.615234f, 0.617188f,
- 0.000096f, 0.000348f, 0.000585f, 0.000707f, 0.000837f, 0.000866f, 0.000972f, 0.001095f,
- 0.001198f, 0.001309f, 0.001355f, 0.001417f, 0.001615f, 0.001740f, 0.001863f, 0.001880f,
- 0.002048f, 0.002159f, 0.002380f, 0.002487f, 0.002613f, 0.002777f, 0.003000f, 0.003143f,
- 0.003353f, 0.003521f, 0.003748f, 0.003963f, 0.004265f, 0.004490f, 0.004776f, 0.005093f,
- 0.005577f, 0.005966f, 0.006321f, 0.006828f, 0.007320f, 0.007904f, 0.008575f, 0.009392f,
- 0.010231f, 0.011276f, 0.012321f, 0.013832f, 0.015343f, 0.017242f, 0.019501f, 0.022247f,
- 0.025696f, 0.029922f, 0.035187f, 0.041779f, 0.049683f, 0.059387f, 0.070801f, 0.084106f,
- 0.100037f, 0.117798f, 0.544434f, 0.588867f, 0.597656f, 0.602539f, 0.604492f, 0.605469f,
- 0.000123f, 0.000248f, 0.000443f, 0.000625f, 0.000663f, 0.000733f, 0.000843f, 0.000780f,
- 0.000921f, 0.000986f, 0.001081f, 0.001178f, 0.001254f, 0.001348f, 0.001364f, 0.001515f,
- 0.001565f, 0.001705f, 0.001824f, 0.001870f, 0.002066f, 0.002155f, 0.002274f, 0.002422f,
- 0.002525f, 0.002695f, 0.002863f, 0.003038f, 0.003271f, 0.003441f, 0.003736f, 0.003901f,
- 0.004112f, 0.004478f, 0.004719f, 0.005093f, 0.005482f, 0.005913f, 0.006413f, 0.007019f,
- 0.007626f, 0.008408f, 0.009201f, 0.010201f, 0.011436f, 0.012749f, 0.014389f, 0.016373f,
- 0.018906f, 0.022034f, 0.025909f, 0.031082f, 0.037628f, 0.045715f, 0.055939f, 0.068176f,
- 0.082764f, 0.099365f, 0.529785f, 0.574707f, 0.584961f, 0.589844f, 0.591797f, 0.593750f,
- 0.000210f, 0.000212f, 0.000365f, 0.000494f, 0.000438f, 0.000597f, 0.000538f, 0.000623f,
- 0.000638f, 0.000736f, 0.000866f, 0.000882f, 0.000954f, 0.001040f, 0.001070f, 0.001086f,
- 0.001220f, 0.001274f, 0.001341f, 0.001457f, 0.001513f, 0.001598f, 0.001697f, 0.001781f,
- 0.001898f, 0.001970f, 0.002131f, 0.002241f, 0.002401f, 0.002645f, 0.002783f, 0.002892f,
- 0.003120f, 0.003347f, 0.003508f, 0.003757f, 0.004032f, 0.004314f, 0.004688f, 0.005066f,
- 0.005520f, 0.006012f, 0.006702f, 0.007332f, 0.008171f, 0.009140f, 0.010399f, 0.011787f,
- 0.013496f, 0.015732f, 0.018509f, 0.022278f, 0.027267f, 0.033813f, 0.042328f, 0.053070f,
- 0.066406f, 0.082825f, 0.516602f, 0.562500f, 0.573242f, 0.577637f, 0.580078f, 0.581543f,
- 0.000000f, 0.000216f, 0.000281f, 0.000346f, 0.000374f, 0.000388f, 0.000491f, 0.000416f,
- 0.000516f, 0.000535f, 0.000635f, 0.000625f, 0.000681f, 0.000719f, 0.000790f, 0.000813f,
- 0.000879f, 0.000926f, 0.000968f, 0.001004f, 0.001097f, 0.001135f, 0.001229f, 0.001300f,
- 0.001361f, 0.001431f, 0.001541f, 0.001610f, 0.001711f, 0.001802f, 0.001922f, 0.002094f,
- 0.002169f, 0.002346f, 0.002468f, 0.002644f, 0.002844f, 0.003094f, 0.003368f, 0.003586f,
- 0.003883f, 0.004223f, 0.004662f, 0.005093f, 0.005680f, 0.006348f, 0.007206f, 0.008202f,
- 0.009392f, 0.010895f, 0.012939f, 0.015465f, 0.018906f, 0.023682f, 0.030502f, 0.039825f,
- 0.051331f, 0.066528f, 0.500977f, 0.548828f, 0.560059f, 0.564453f, 0.567871f, 0.569336f,
- 0.000000f, 0.000106f, 0.000201f, 0.000252f, 0.000251f, 0.000322f, 0.000281f, 0.000340f,
- 0.000359f, 0.000428f, 0.000443f, 0.000419f, 0.000444f, 0.000500f, 0.000524f, 0.000590f,
- 0.000574f, 0.000650f, 0.000693f, 0.000732f, 0.000778f, 0.000821f, 0.000848f, 0.000900f,
- 0.000965f, 0.000982f, 0.001072f, 0.001109f, 0.001169f, 0.001307f, 0.001301f, 0.001409f,
- 0.001483f, 0.001610f, 0.001734f, 0.001835f, 0.001940f, 0.002098f, 0.002241f, 0.002426f,
- 0.002634f, 0.002865f, 0.003136f, 0.003431f, 0.003763f, 0.004211f, 0.004742f, 0.005417f,
- 0.006229f, 0.007298f, 0.008621f, 0.010330f, 0.012650f, 0.015808f, 0.020569f, 0.027908f,
- 0.037994f, 0.051514f, 0.485840f, 0.536133f, 0.547363f, 0.551758f, 0.554688f, 0.557617f,
- 0.000026f, 0.000156f, 0.000201f, 0.000136f, 0.000188f, 0.000187f, 0.000192f, 0.000240f,
- 0.000245f, 0.000254f, 0.000262f, 0.000311f, 0.000309f, 0.000331f, 0.000374f, 0.000385f,
- 0.000411f, 0.000431f, 0.000443f, 0.000461f, 0.000507f, 0.000522f, 0.000562f, 0.000596f,
- 0.000634f, 0.000684f, 0.000718f, 0.000735f, 0.000776f, 0.000815f, 0.000875f, 0.000927f,
- 0.000982f, 0.001053f, 0.001123f, 0.001162f, 0.001271f, 0.001346f, 0.001473f, 0.001577f,
- 0.001670f, 0.001838f, 0.002005f, 0.002161f, 0.002405f, 0.002670f, 0.002993f, 0.003399f,
- 0.003860f, 0.004528f, 0.005386f, 0.006523f, 0.008003f, 0.010063f, 0.013206f, 0.017990f,
- 0.026031f, 0.038086f, 0.471191f, 0.522949f, 0.534668f, 0.540039f, 0.543457f, 0.544922f,
- 0.000000f, 0.000093f, 0.000084f, 0.000085f, 0.000124f, 0.000145f, 0.000122f, 0.000149f,
- 0.000152f, 0.000152f, 0.000158f, 0.000167f, 0.000186f, 0.000209f, 0.000217f, 0.000225f,
- 0.000231f, 0.000272f, 0.000273f, 0.000301f, 0.000303f, 0.000310f, 0.000338f, 0.000361f,
- 0.000387f, 0.000423f, 0.000413f, 0.000436f, 0.000478f, 0.000503f, 0.000525f, 0.000570f,
- 0.000608f, 0.000626f, 0.000677f, 0.000706f, 0.000753f, 0.000813f, 0.000884f, 0.000929f,
- 0.001000f, 0.001094f, 0.001183f, 0.001302f, 0.001412f, 0.001563f, 0.001769f, 0.001974f,
- 0.002277f, 0.002626f, 0.003124f, 0.003761f, 0.004665f, 0.005993f, 0.007935f, 0.010818f,
- 0.016205f, 0.026138f, 0.456299f, 0.509277f, 0.520996f, 0.527344f, 0.530762f, 0.532715f,
- 0.000105f, 0.000083f, 0.000072f, 0.000065f, 0.000071f, 0.000072f, 0.000077f, 0.000084f,
- 0.000088f, 0.000093f, 0.000095f, 0.000120f, 0.000100f, 0.000108f, 0.000126f, 0.000118f,
- 0.000139f, 0.000149f, 0.000153f, 0.000165f, 0.000169f, 0.000172f, 0.000194f, 0.000203f,
- 0.000233f, 0.000225f, 0.000233f, 0.000253f, 0.000266f, 0.000275f, 0.000299f, 0.000319f,
- 0.000338f, 0.000345f, 0.000374f, 0.000384f, 0.000415f, 0.000448f, 0.000483f, 0.000511f,
- 0.000543f, 0.000585f, 0.000647f, 0.000692f, 0.000755f, 0.000827f, 0.000924f, 0.001041f,
- 0.001186f, 0.001372f, 0.001608f, 0.001953f, 0.002411f, 0.003098f, 0.004238f, 0.005989f,
- 0.009003f, 0.016006f, 0.441406f, 0.495361f, 0.508301f, 0.514160f, 0.518066f, 0.520508f,
- 0.000090f, 0.000067f, 0.000058f, 0.000052f, 0.000047f, 0.000044f, 0.000044f, 0.000040f,
- 0.000042f, 0.000049f, 0.000042f, 0.000045f, 0.000059f, 0.000047f, 0.000050f, 0.000054f,
- 0.000071f, 0.000073f, 0.000075f, 0.000078f, 0.000079f, 0.000084f, 0.000087f, 0.000090f,
- 0.000097f, 0.000109f, 0.000108f, 0.000124f, 0.000124f, 0.000131f, 0.000138f, 0.000143f,
- 0.000155f, 0.000164f, 0.000178f, 0.000182f, 0.000192f, 0.000209f, 0.000225f, 0.000244f,
- 0.000259f, 0.000274f, 0.000303f, 0.000321f, 0.000357f, 0.000385f, 0.000429f, 0.000470f,
- 0.000537f, 0.000608f, 0.000710f, 0.000852f, 0.001052f, 0.001371f, 0.001877f, 0.002762f,
- 0.004406f, 0.008202f, 0.426270f, 0.483154f, 0.495605f, 0.500977f, 0.505371f, 0.507324f,
- 0.000067f, 0.000047f, 0.000039f, 0.000035f, 0.000032f, 0.000030f, 0.000029f, 0.000027f,
- 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000021f, 0.000020f, 0.000019f, 0.000021f,
- 0.000020f, 0.000024f, 0.000028f, 0.000030f, 0.000029f, 0.000032f, 0.000035f, 0.000034f,
- 0.000036f, 0.000044f, 0.000046f, 0.000040f, 0.000048f, 0.000047f, 0.000051f, 0.000053f,
- 0.000059f, 0.000059f, 0.000064f, 0.000066f, 0.000077f, 0.000079f, 0.000081f, 0.000091f,
- 0.000094f, 0.000100f, 0.000108f, 0.000119f, 0.000129f, 0.000137f, 0.000148f, 0.000173f,
- 0.000191f, 0.000210f, 0.000249f, 0.000292f, 0.000357f, 0.000448f, 0.000629f, 0.000943f,
- 0.001630f, 0.003332f, 0.411377f, 0.468506f, 0.482910f, 0.488770f, 0.492188f, 0.495117f,
- 0.000025f, 0.000018f, 0.000015f, 0.000013f, 0.000014f, 0.000013f, 0.000012f, 0.000012f,
- 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f,
- 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f,
- 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000010f, 0.000010f, 0.000010f,
- 0.000012f, 0.000014f, 0.000014f, 0.000014f, 0.000016f, 0.000018f, 0.000019f, 0.000021f,
- 0.000020f, 0.000023f, 0.000025f, 0.000027f, 0.000027f, 0.000029f, 0.000035f, 0.000033f,
- 0.000040f, 0.000044f, 0.000052f, 0.000061f, 0.000069f, 0.000087f, 0.000117f, 0.000174f,
- 0.000319f, 0.000847f, 0.395996f, 0.454834f, 0.468750f, 0.475586f, 0.479004f, 0.481689f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f,
- 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f,
- 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f, 0.000005f,
- 0.000009f, 0.000027f, 0.381348f, 0.441406f, 0.455566f, 0.462891f, 0.466309f, 0.468994f,
- },
- {
- 0.016769f, 0.050629f, 0.083740f, 0.116638f, 0.148071f, 0.178955f, 0.208374f, 0.236938f,
- 0.265137f, 0.291992f, 0.317871f, 0.343994f, 0.368164f, 0.391846f, 0.415527f, 0.437988f,
- 0.459717f, 0.480469f, 0.501465f, 0.520996f, 0.540527f, 0.559082f, 0.577637f, 0.594727f,
- 0.612305f, 0.628418f, 0.644531f, 0.661133f, 0.676270f, 0.691406f, 0.705566f, 0.719727f,
- 0.734375f, 0.747070f, 0.760254f, 0.773438f, 0.786133f, 0.798828f, 0.810059f, 0.821777f,
- 0.833008f, 0.843262f, 0.854492f, 0.865234f, 0.875488f, 0.885254f, 0.895508f, 0.904297f,
- 0.913574f, 0.923340f, 0.932617f, 0.940918f, 0.949707f, 0.958008f, 0.966309f, 0.974609f,
- 0.981934f, 0.990234f, 0.985352f, 0.965332f, 0.950195f, 0.937500f, 0.926270f, 0.915527f,
- 0.015083f, 0.045929f, 0.075806f, 0.105408f, 0.135254f, 0.163208f, 0.191772f, 0.219238f,
- 0.245239f, 0.271973f, 0.297363f, 0.321045f, 0.345947f, 0.369141f, 0.391846f, 0.414062f,
- 0.435791f, 0.456787f, 0.477295f, 0.497314f, 0.516113f, 0.535645f, 0.554199f, 0.571777f,
- 0.588867f, 0.606445f, 0.623047f, 0.639160f, 0.654785f, 0.669434f, 0.685059f, 0.699219f,
- 0.713379f, 0.728027f, 0.741211f, 0.754883f, 0.767578f, 0.780273f, 0.792480f, 0.804688f,
- 0.815918f, 0.826660f, 0.838867f, 0.850098f, 0.859863f, 0.871094f, 0.880859f, 0.891113f,
- 0.900879f, 0.909180f, 0.919434f, 0.929688f, 0.937500f, 0.946289f, 0.954590f, 0.963379f,
- 0.971191f, 0.979004f, 0.980469f, 0.961426f, 0.947266f, 0.935059f, 0.924316f, 0.914062f,
- 0.013573f, 0.040955f, 0.068848f, 0.096313f, 0.123169f, 0.150635f, 0.175537f, 0.202026f,
- 0.228271f, 0.251709f, 0.276367f, 0.300781f, 0.323730f, 0.347168f, 0.369385f, 0.390625f,
- 0.412354f, 0.433594f, 0.454346f, 0.473145f, 0.491943f, 0.512207f, 0.529785f, 0.549316f,
- 0.566406f, 0.583008f, 0.600586f, 0.616211f, 0.633301f, 0.648438f, 0.663574f, 0.679199f,
- 0.693359f, 0.708008f, 0.721680f, 0.735840f, 0.748535f, 0.762207f, 0.773926f, 0.786621f,
- 0.798340f, 0.811035f, 0.822754f, 0.833984f, 0.845215f, 0.855957f, 0.865723f, 0.876465f,
- 0.886719f, 0.895508f, 0.906738f, 0.916016f, 0.925293f, 0.934570f, 0.943848f, 0.952148f,
- 0.960449f, 0.969238f, 0.976074f, 0.958008f, 0.944336f, 0.932617f, 0.921875f, 0.912109f,
- 0.012329f, 0.037201f, 0.062164f, 0.087646f, 0.112488f, 0.137451f, 0.161865f, 0.187134f,
- 0.210938f, 0.234253f, 0.258301f, 0.281006f, 0.303467f, 0.325195f, 0.347656f, 0.368652f,
- 0.389648f, 0.410400f, 0.430664f, 0.450928f, 0.470215f, 0.488770f, 0.507812f, 0.525391f,
- 0.543457f, 0.560059f, 0.579102f, 0.593750f, 0.611816f, 0.627441f, 0.643066f, 0.658203f,
- 0.672363f, 0.687500f, 0.702148f, 0.715820f, 0.729004f, 0.742676f, 0.755371f, 0.768066f,
- 0.781738f, 0.792969f, 0.805176f, 0.816895f, 0.829102f, 0.839844f, 0.850586f, 0.861816f,
- 0.872559f, 0.882812f, 0.893066f, 0.902832f, 0.912109f, 0.921875f, 0.930664f, 0.940430f,
- 0.948242f, 0.958008f, 0.970703f, 0.953613f, 0.940430f, 0.929199f, 0.919434f, 0.910156f,
- 0.010979f, 0.033752f, 0.056763f, 0.080139f, 0.103516f, 0.126221f, 0.149414f, 0.172485f,
- 0.195435f, 0.218262f, 0.240356f, 0.261719f, 0.284180f, 0.306396f, 0.326416f, 0.347900f,
- 0.368408f, 0.389160f, 0.408691f, 0.427979f, 0.447754f, 0.467041f, 0.484863f, 0.502441f,
- 0.520996f, 0.538086f, 0.555664f, 0.573242f, 0.589355f, 0.604980f, 0.622559f, 0.637207f,
- 0.652832f, 0.666992f, 0.680664f, 0.695801f, 0.710938f, 0.724121f, 0.737305f, 0.750977f,
- 0.763672f, 0.776855f, 0.789062f, 0.799805f, 0.812012f, 0.824219f, 0.835449f, 0.846680f,
- 0.857910f, 0.868164f, 0.878418f, 0.889160f, 0.898926f, 0.909180f, 0.917969f, 0.928223f,
- 0.937012f, 0.946777f, 0.965820f, 0.949707f, 0.937012f, 0.926270f, 0.916504f, 0.907715f,
- 0.009941f, 0.030746f, 0.051514f, 0.073181f, 0.094116f, 0.116028f, 0.137817f, 0.158691f,
- 0.180664f, 0.202637f, 0.223511f, 0.244873f, 0.265869f, 0.285889f, 0.307129f, 0.327881f,
- 0.347412f, 0.367188f, 0.387207f, 0.405762f, 0.425537f, 0.444092f, 0.462646f, 0.481201f,
- 0.499756f, 0.516602f, 0.533691f, 0.550781f, 0.567383f, 0.583984f, 0.599609f, 0.616211f,
- 0.630859f, 0.647461f, 0.661621f, 0.676758f, 0.689453f, 0.704590f, 0.718750f, 0.731934f,
- 0.745117f, 0.757812f, 0.770996f, 0.783691f, 0.796387f, 0.807617f, 0.819824f, 0.831543f,
- 0.842773f, 0.854004f, 0.864258f, 0.875488f, 0.885742f, 0.895508f, 0.905762f, 0.915527f,
- 0.925781f, 0.934570f, 0.960449f, 0.945312f, 0.933594f, 0.922852f, 0.913574f, 0.905273f,
- 0.009003f, 0.027756f, 0.046997f, 0.066711f, 0.085999f, 0.106506f, 0.127075f, 0.146973f,
- 0.166992f, 0.187500f, 0.207886f, 0.228149f, 0.248169f, 0.268311f, 0.287842f, 0.307861f,
- 0.327393f, 0.347656f, 0.365967f, 0.385010f, 0.404541f, 0.422363f, 0.441162f, 0.458740f,
- 0.477783f, 0.495117f, 0.512207f, 0.529297f, 0.546387f, 0.562012f, 0.578613f, 0.595215f,
- 0.610840f, 0.625977f, 0.641113f, 0.656738f, 0.670410f, 0.685059f, 0.699707f, 0.714355f,
- 0.727051f, 0.741699f, 0.752441f, 0.767090f, 0.778809f, 0.791504f, 0.803711f, 0.815430f,
- 0.827148f, 0.838867f, 0.850098f, 0.860840f, 0.872070f, 0.881836f, 0.893066f, 0.903809f,
- 0.913574f, 0.923828f, 0.955078f, 0.940918f, 0.929199f, 0.919922f, 0.911133f, 0.902344f,
- 0.008469f, 0.025375f, 0.043121f, 0.060944f, 0.079468f, 0.097961f, 0.116394f, 0.135620f,
- 0.154541f, 0.174072f, 0.193115f, 0.212280f, 0.231689f, 0.250732f, 0.270264f, 0.289307f,
- 0.307861f, 0.327148f, 0.345215f, 0.364990f, 0.382812f, 0.401123f, 0.418945f, 0.437012f,
- 0.455811f, 0.472900f, 0.490234f, 0.507812f, 0.524414f, 0.541016f, 0.558105f, 0.573242f,
- 0.590332f, 0.605469f, 0.620117f, 0.636230f, 0.651367f, 0.665039f, 0.679688f, 0.694336f,
- 0.708496f, 0.722168f, 0.735840f, 0.750000f, 0.762695f, 0.774902f, 0.787598f, 0.798828f,
- 0.811523f, 0.823730f, 0.834473f, 0.846191f, 0.857910f, 0.868652f, 0.879883f, 0.891113f,
- 0.900391f, 0.911133f, 0.949219f, 0.937012f, 0.925293f, 0.916016f, 0.907227f, 0.899414f,
- 0.007618f, 0.023178f, 0.039490f, 0.055542f, 0.072937f, 0.090271f, 0.107605f, 0.125122f,
- 0.142944f, 0.160889f, 0.178955f, 0.197510f, 0.216553f, 0.234497f, 0.252686f, 0.271240f,
- 0.289795f, 0.307861f, 0.326172f, 0.344238f, 0.362549f, 0.380859f, 0.398438f, 0.416504f,
- 0.433838f, 0.452393f, 0.468994f, 0.485840f, 0.502930f, 0.519531f, 0.536133f, 0.553223f,
- 0.569336f, 0.584473f, 0.599609f, 0.615234f, 0.631348f, 0.646484f, 0.659668f, 0.675293f,
- 0.689941f, 0.703125f, 0.716797f, 0.730957f, 0.744141f, 0.756836f, 0.771484f, 0.782227f,
- 0.795898f, 0.807617f, 0.819824f, 0.831543f, 0.843750f, 0.854980f, 0.866211f, 0.877441f,
- 0.888672f, 0.898438f, 0.943359f, 0.931641f, 0.921387f, 0.912109f, 0.903809f, 0.896484f,
- 0.007118f, 0.021255f, 0.035889f, 0.051514f, 0.066895f, 0.083191f, 0.098999f, 0.115540f,
- 0.132324f, 0.149292f, 0.166260f, 0.183716f, 0.200928f, 0.218628f, 0.236084f, 0.253906f,
- 0.272217f, 0.289795f, 0.307617f, 0.325439f, 0.342529f, 0.360596f, 0.378906f, 0.395996f,
- 0.413330f, 0.430908f, 0.447510f, 0.465332f, 0.481934f, 0.497803f, 0.514648f, 0.531738f,
- 0.547852f, 0.562988f, 0.579102f, 0.595215f, 0.610840f, 0.625977f, 0.641113f, 0.655273f,
- 0.670410f, 0.685059f, 0.698730f, 0.712891f, 0.726074f, 0.739258f, 0.753418f, 0.766113f,
- 0.779785f, 0.791992f, 0.803711f, 0.816406f, 0.829102f, 0.839844f, 0.852539f, 0.863770f,
- 0.874512f, 0.886719f, 0.937988f, 0.926758f, 0.917480f, 0.908203f, 0.900391f, 0.893066f,
- 0.006481f, 0.019775f, 0.032928f, 0.047272f, 0.061371f, 0.076233f, 0.091064f, 0.107117f,
- 0.122559f, 0.138062f, 0.154663f, 0.170532f, 0.187256f, 0.204346f, 0.220947f, 0.237915f,
- 0.254883f, 0.272217f, 0.289062f, 0.306641f, 0.323730f, 0.341064f, 0.358643f, 0.375732f,
- 0.393555f, 0.410645f, 0.426758f, 0.444580f, 0.461182f, 0.477783f, 0.494141f, 0.510254f,
- 0.526855f, 0.543457f, 0.559082f, 0.574219f, 0.590332f, 0.605957f, 0.621094f, 0.634766f,
- 0.650879f, 0.665039f, 0.679688f, 0.694824f, 0.708008f, 0.722656f, 0.736816f, 0.749023f,
- 0.762695f, 0.775391f, 0.788086f, 0.801270f, 0.813965f, 0.826172f, 0.838379f, 0.849121f,
- 0.861328f, 0.873535f, 0.932129f, 0.921875f, 0.912598f, 0.904297f, 0.896484f, 0.889160f,
- 0.005924f, 0.017899f, 0.030426f, 0.043427f, 0.056824f, 0.070435f, 0.084106f, 0.098755f,
- 0.112976f, 0.128052f, 0.143311f, 0.158936f, 0.174072f, 0.189575f, 0.206421f, 0.222534f,
- 0.238403f, 0.255615f, 0.271729f, 0.288818f, 0.305908f, 0.322021f, 0.339355f, 0.356445f,
- 0.373291f, 0.390137f, 0.407227f, 0.423584f, 0.440430f, 0.457031f, 0.472900f, 0.489502f,
- 0.506836f, 0.521973f, 0.538574f, 0.554688f, 0.570312f, 0.585449f, 0.601074f, 0.616211f,
- 0.631348f, 0.646484f, 0.661621f, 0.675781f, 0.690430f, 0.704590f, 0.717285f, 0.731934f,
- 0.746094f, 0.759277f, 0.771973f, 0.785156f, 0.798340f, 0.810547f, 0.823242f, 0.835938f,
- 0.848145f, 0.860352f, 0.925781f, 0.916504f, 0.908203f, 0.900391f, 0.893066f, 0.886719f,
- 0.005573f, 0.016693f, 0.028366f, 0.040192f, 0.052277f, 0.064880f, 0.078064f, 0.090698f,
- 0.105042f, 0.118591f, 0.133057f, 0.147461f, 0.162231f, 0.177612f, 0.192383f, 0.207886f,
- 0.223633f, 0.239502f, 0.255615f, 0.272217f, 0.288330f, 0.304932f, 0.320312f, 0.337646f,
- 0.354004f, 0.369873f, 0.386719f, 0.403320f, 0.419922f, 0.437012f, 0.453369f, 0.469482f,
- 0.485596f, 0.501465f, 0.517578f, 0.534180f, 0.549316f, 0.565918f, 0.581055f, 0.595703f,
- 0.611328f, 0.626953f, 0.641602f, 0.657227f, 0.671387f, 0.686523f, 0.699707f, 0.714355f,
- 0.729004f, 0.742676f, 0.756348f, 0.769043f, 0.782715f, 0.795410f, 0.809082f, 0.821289f,
- 0.833984f, 0.846680f, 0.919434f, 0.911133f, 0.903320f, 0.895508f, 0.888672f, 0.882324f,
- 0.005016f, 0.015396f, 0.026169f, 0.037231f, 0.048126f, 0.059937f, 0.071716f, 0.084167f,
- 0.096680f, 0.109558f, 0.123169f, 0.136719f, 0.150269f, 0.164917f, 0.179077f, 0.194580f,
- 0.208984f, 0.223877f, 0.239746f, 0.255127f, 0.270996f, 0.286377f, 0.302490f, 0.319336f,
- 0.335205f, 0.351318f, 0.367432f, 0.383545f, 0.399902f, 0.415771f, 0.432373f, 0.448975f,
- 0.465088f, 0.481934f, 0.497314f, 0.513672f, 0.529785f, 0.544434f, 0.561035f, 0.576660f,
- 0.592285f, 0.607422f, 0.622559f, 0.638184f, 0.652344f, 0.667480f, 0.681641f, 0.696777f,
- 0.711426f, 0.725586f, 0.738770f, 0.753418f, 0.766602f, 0.779297f, 0.793945f, 0.807129f,
- 0.819824f, 0.833008f, 0.913086f, 0.906738f, 0.898438f, 0.890625f, 0.884277f, 0.878418f,
- 0.004738f, 0.014053f, 0.024017f, 0.033752f, 0.044495f, 0.055328f, 0.066467f, 0.078064f,
- 0.089661f, 0.102051f, 0.114258f, 0.126831f, 0.139771f, 0.153564f, 0.167114f, 0.181030f,
- 0.195190f, 0.209839f, 0.224731f, 0.239136f, 0.253906f, 0.269531f, 0.285156f, 0.300293f,
- 0.317139f, 0.332520f, 0.348145f, 0.364990f, 0.380859f, 0.396240f, 0.412109f, 0.428711f,
- 0.444336f, 0.460938f, 0.477295f, 0.492676f, 0.509277f, 0.524902f, 0.540527f, 0.556641f,
- 0.572266f, 0.587402f, 0.604004f, 0.618164f, 0.633301f, 0.648438f, 0.664062f, 0.678223f,
- 0.693359f, 0.708008f, 0.722656f, 0.736328f, 0.750000f, 0.764160f, 0.777832f, 0.791016f,
- 0.805176f, 0.817871f, 0.907227f, 0.900879f, 0.894043f, 0.886719f, 0.880371f, 0.874512f,
- 0.004105f, 0.012741f, 0.022491f, 0.031769f, 0.041107f, 0.051208f, 0.061249f, 0.071777f,
- 0.083069f, 0.093811f, 0.105896f, 0.117554f, 0.129761f, 0.142212f, 0.155273f, 0.168579f,
- 0.182251f, 0.196167f, 0.210449f, 0.223755f, 0.238525f, 0.253662f, 0.268799f, 0.283447f,
- 0.298828f, 0.313965f, 0.329834f, 0.344971f, 0.361328f, 0.376953f, 0.393066f, 0.408691f,
- 0.424561f, 0.441406f, 0.457031f, 0.472656f, 0.488770f, 0.504883f, 0.520996f, 0.536133f,
- 0.551758f, 0.567871f, 0.583496f, 0.599121f, 0.614258f, 0.629395f, 0.645996f, 0.660156f,
- 0.675781f, 0.689453f, 0.704102f, 0.719727f, 0.733398f, 0.747559f, 0.761719f, 0.776367f,
- 0.789062f, 0.803223f, 0.899902f, 0.895020f, 0.888184f, 0.881836f, 0.875488f, 0.870117f,
- 0.003925f, 0.011978f, 0.020538f, 0.028763f, 0.038269f, 0.047028f, 0.056732f, 0.066223f,
- 0.076904f, 0.086731f, 0.097900f, 0.109314f, 0.120483f, 0.132324f, 0.144653f, 0.156982f,
- 0.169678f, 0.183228f, 0.196289f, 0.209961f, 0.223633f, 0.237427f, 0.251953f, 0.266602f,
- 0.281982f, 0.296875f, 0.312012f, 0.326660f, 0.342041f, 0.357910f, 0.373779f, 0.389404f,
- 0.404785f, 0.420166f, 0.436768f, 0.452637f, 0.468506f, 0.484863f, 0.500977f, 0.516602f,
- 0.531738f, 0.546875f, 0.563965f, 0.579102f, 0.595215f, 0.610840f, 0.625977f, 0.641602f,
- 0.657227f, 0.671387f, 0.687500f, 0.702148f, 0.716309f, 0.731445f, 0.746094f, 0.760742f,
- 0.774414f, 0.788086f, 0.893066f, 0.889648f, 0.882812f, 0.876953f, 0.870605f, 0.865723f,
- 0.003704f, 0.011169f, 0.019165f, 0.026550f, 0.035339f, 0.043488f, 0.052277f, 0.061066f,
- 0.071045f, 0.080933f, 0.090576f, 0.101074f, 0.111877f, 0.122925f, 0.134277f, 0.146118f,
- 0.157837f, 0.170288f, 0.183105f, 0.195557f, 0.209351f, 0.222900f, 0.236328f, 0.250732f,
- 0.264893f, 0.279297f, 0.294189f, 0.308838f, 0.323975f, 0.339844f, 0.354736f, 0.370117f,
- 0.385986f, 0.401367f, 0.416504f, 0.432861f, 0.448486f, 0.463867f, 0.480469f, 0.497070f,
- 0.511719f, 0.527832f, 0.544434f, 0.559570f, 0.575684f, 0.591797f, 0.606934f, 0.623047f,
- 0.638184f, 0.654297f, 0.668945f, 0.684570f, 0.699219f, 0.714355f, 0.729492f, 0.744629f,
- 0.758789f, 0.773926f, 0.886230f, 0.883301f, 0.877441f, 0.871582f, 0.866211f, 0.860840f,
- 0.003500f, 0.010292f, 0.017395f, 0.024963f, 0.032440f, 0.040344f, 0.048462f, 0.057098f,
- 0.065063f, 0.074646f, 0.083679f, 0.093445f, 0.103882f, 0.114136f, 0.124451f, 0.135498f,
- 0.146606f, 0.158447f, 0.170410f, 0.182739f, 0.195435f, 0.208008f, 0.221558f, 0.234863f,
- 0.248657f, 0.262695f, 0.276855f, 0.291748f, 0.306152f, 0.320801f, 0.335693f, 0.350830f,
- 0.365967f, 0.382080f, 0.396973f, 0.413330f, 0.429199f, 0.444336f, 0.459473f, 0.476074f,
- 0.492188f, 0.507812f, 0.524414f, 0.540039f, 0.555664f, 0.571777f, 0.586914f, 0.604004f,
- 0.619629f, 0.635742f, 0.650391f, 0.666504f, 0.682129f, 0.697754f, 0.712891f, 0.728027f,
- 0.743164f, 0.758301f, 0.878906f, 0.877441f, 0.871582f, 0.866699f, 0.860840f, 0.856445f,
- 0.003084f, 0.009697f, 0.016403f, 0.022659f, 0.029892f, 0.037354f, 0.044281f, 0.052338f,
- 0.060516f, 0.068970f, 0.077515f, 0.086243f, 0.096069f, 0.105713f, 0.115356f, 0.125610f,
- 0.136353f, 0.147339f, 0.158081f, 0.170410f, 0.181396f, 0.194458f, 0.207275f, 0.219482f,
- 0.232910f, 0.246704f, 0.260010f, 0.274170f, 0.288330f, 0.302979f, 0.317383f, 0.332764f,
- 0.347656f, 0.363037f, 0.378174f, 0.392578f, 0.408936f, 0.424316f, 0.440430f, 0.456299f,
- 0.472656f, 0.488525f, 0.503906f, 0.519531f, 0.535645f, 0.552734f, 0.568359f, 0.584961f,
- 0.600586f, 0.616699f, 0.633301f, 0.648438f, 0.663574f, 0.679199f, 0.694824f, 0.710938f,
- 0.726074f, 0.742188f, 0.872559f, 0.870605f, 0.865723f, 0.860840f, 0.855957f, 0.851074f,
- 0.002913f, 0.008781f, 0.014938f, 0.021759f, 0.027878f, 0.034393f, 0.041412f, 0.048737f,
- 0.055969f, 0.063599f, 0.072021f, 0.080200f, 0.088928f, 0.097839f, 0.106934f, 0.116150f,
- 0.126587f, 0.136353f, 0.147095f, 0.157715f, 0.169189f, 0.181519f, 0.193481f, 0.205933f,
- 0.217773f, 0.231323f, 0.244629f, 0.257812f, 0.271240f, 0.285400f, 0.299561f, 0.314453f,
- 0.329590f, 0.343506f, 0.358887f, 0.373779f, 0.389648f, 0.405029f, 0.420410f, 0.437012f,
- 0.452393f, 0.468262f, 0.484375f, 0.500000f, 0.516113f, 0.532227f, 0.548828f, 0.564941f,
- 0.581055f, 0.597168f, 0.612793f, 0.629883f, 0.645508f, 0.662109f, 0.678223f, 0.694336f,
- 0.709473f, 0.726074f, 0.863770f, 0.864258f, 0.859863f, 0.854980f, 0.850586f, 0.846191f,
- 0.002815f, 0.008194f, 0.013954f, 0.019653f, 0.025696f, 0.031982f, 0.038177f, 0.044830f,
- 0.051819f, 0.058502f, 0.066162f, 0.073792f, 0.082031f, 0.090393f, 0.098999f, 0.107605f,
- 0.117493f, 0.126709f, 0.137207f, 0.146729f, 0.157593f, 0.168579f, 0.179810f, 0.191772f,
- 0.203369f, 0.215820f, 0.228882f, 0.241455f, 0.254395f, 0.268311f, 0.282227f, 0.296631f,
- 0.310303f, 0.325439f, 0.339844f, 0.354736f, 0.370361f, 0.385742f, 0.400879f, 0.416504f,
- 0.432617f, 0.448486f, 0.464355f, 0.479980f, 0.496094f, 0.513184f, 0.528809f, 0.545410f,
- 0.561035f, 0.578613f, 0.594727f, 0.611328f, 0.626953f, 0.643555f, 0.660156f, 0.676270f,
- 0.693359f, 0.709473f, 0.856445f, 0.858398f, 0.854492f, 0.849121f, 0.845215f, 0.841309f,
- 0.002583f, 0.007492f, 0.012878f, 0.018417f, 0.023941f, 0.029495f, 0.035339f, 0.041779f,
- 0.047577f, 0.054047f, 0.061523f, 0.068787f, 0.075562f, 0.083313f, 0.091858f, 0.099792f,
- 0.108521f, 0.117615f, 0.126709f, 0.136108f, 0.146851f, 0.156860f, 0.166992f, 0.178345f,
- 0.189819f, 0.202148f, 0.213623f, 0.225830f, 0.238892f, 0.252197f, 0.265137f, 0.278809f,
- 0.292480f, 0.306885f, 0.321045f, 0.336914f, 0.350830f, 0.366943f, 0.381348f, 0.396240f,
- 0.412354f, 0.428223f, 0.444336f, 0.460449f, 0.476318f, 0.493408f, 0.509277f, 0.525879f,
- 0.542480f, 0.559082f, 0.574707f, 0.591797f, 0.608398f, 0.625488f, 0.642090f, 0.659180f,
- 0.675781f, 0.691406f, 0.848145f, 0.851562f, 0.848145f, 0.843750f, 0.838867f, 0.835449f,
- 0.002512f, 0.007374f, 0.012115f, 0.016983f, 0.022064f, 0.027359f, 0.032715f, 0.038147f,
- 0.044373f, 0.050354f, 0.056641f, 0.063293f, 0.070190f, 0.077026f, 0.084717f, 0.092041f,
- 0.100342f, 0.108398f, 0.117554f, 0.126221f, 0.135742f, 0.145142f, 0.155151f, 0.165771f,
- 0.176758f, 0.187988f, 0.199341f, 0.210815f, 0.223389f, 0.236206f, 0.249023f, 0.261719f,
- 0.275879f, 0.289062f, 0.303467f, 0.317627f, 0.332520f, 0.347412f, 0.361816f, 0.377197f,
- 0.393066f, 0.407959f, 0.424072f, 0.440186f, 0.457031f, 0.473145f, 0.489502f, 0.505859f,
- 0.522461f, 0.540039f, 0.555664f, 0.572754f, 0.589844f, 0.606445f, 0.623535f, 0.640625f,
- 0.658203f, 0.675781f, 0.840820f, 0.843750f, 0.841309f, 0.836914f, 0.833984f, 0.830566f,
- 0.002369f, 0.006668f, 0.011093f, 0.015778f, 0.020523f, 0.025223f, 0.030701f, 0.035339f,
- 0.040710f, 0.046600f, 0.051971f, 0.058075f, 0.064819f, 0.071228f, 0.077942f, 0.085205f,
- 0.092224f, 0.100464f, 0.108398f, 0.116882f, 0.125610f, 0.134155f, 0.143555f, 0.153564f,
- 0.164062f, 0.174316f, 0.185303f, 0.196899f, 0.208496f, 0.220093f, 0.232666f, 0.245239f,
- 0.258057f, 0.271729f, 0.285645f, 0.299561f, 0.313721f, 0.328613f, 0.342773f, 0.358154f,
- 0.373535f, 0.388916f, 0.405518f, 0.419922f, 0.437012f, 0.453125f, 0.469238f, 0.486328f,
- 0.502930f, 0.519531f, 0.536133f, 0.553223f, 0.571289f, 0.588379f, 0.605469f, 0.623047f,
- 0.640137f, 0.656250f, 0.833008f, 0.837402f, 0.834473f, 0.831055f, 0.827637f, 0.824219f,
- 0.002188f, 0.006027f, 0.010582f, 0.014297f, 0.018921f, 0.023270f, 0.028183f, 0.032593f,
- 0.037781f, 0.042999f, 0.048584f, 0.053650f, 0.059601f, 0.065369f, 0.071899f, 0.078369f,
- 0.085449f, 0.092407f, 0.099609f, 0.107788f, 0.115601f, 0.124451f, 0.133301f, 0.142212f,
- 0.151978f, 0.161865f, 0.172363f, 0.182617f, 0.193970f, 0.205566f, 0.217407f, 0.229858f,
- 0.241943f, 0.254639f, 0.268311f, 0.281494f, 0.295654f, 0.310059f, 0.324219f, 0.339600f,
- 0.353760f, 0.369629f, 0.385010f, 0.400879f, 0.417725f, 0.433594f, 0.449219f, 0.465820f,
- 0.482910f, 0.499512f, 0.517090f, 0.534180f, 0.551270f, 0.568848f, 0.586426f, 0.604004f,
- 0.622559f, 0.639160f, 0.824219f, 0.830078f, 0.827637f, 0.824707f, 0.821777f, 0.818359f,
- 0.002098f, 0.005634f, 0.009354f, 0.013557f, 0.017685f, 0.021576f, 0.025604f, 0.030380f,
- 0.034943f, 0.039429f, 0.044281f, 0.049255f, 0.055023f, 0.060577f, 0.066101f, 0.072144f,
- 0.078491f, 0.085083f, 0.091858f, 0.098999f, 0.106873f, 0.114502f, 0.122498f, 0.131592f,
- 0.140137f, 0.149536f, 0.159424f, 0.169556f, 0.180054f, 0.191162f, 0.202026f, 0.213989f,
- 0.226318f, 0.239136f, 0.250977f, 0.264648f, 0.278320f, 0.291748f, 0.305908f, 0.320557f,
- 0.334961f, 0.350342f, 0.365479f, 0.381592f, 0.397461f, 0.413818f, 0.429199f, 0.446289f,
- 0.462891f, 0.479736f, 0.496338f, 0.514160f, 0.530762f, 0.548828f, 0.566406f, 0.584473f,
- 0.602539f, 0.621582f, 0.815918f, 0.823730f, 0.821289f, 0.817871f, 0.815430f, 0.812500f,
- 0.001772f, 0.005249f, 0.008995f, 0.012260f, 0.016251f, 0.020020f, 0.024216f, 0.027603f,
- 0.032196f, 0.036377f, 0.041199f, 0.045410f, 0.050110f, 0.055603f, 0.061005f, 0.066406f,
- 0.072327f, 0.077820f, 0.084290f, 0.090942f, 0.098083f, 0.105164f, 0.113037f, 0.120789f,
- 0.129272f, 0.138062f, 0.147339f, 0.156982f, 0.166626f, 0.176758f, 0.187866f, 0.199097f,
- 0.210449f, 0.222412f, 0.234985f, 0.247559f, 0.260742f, 0.273682f, 0.287598f, 0.302002f,
- 0.316650f, 0.331299f, 0.346191f, 0.362061f, 0.377686f, 0.393066f, 0.409668f, 0.426514f,
- 0.443115f, 0.459717f, 0.476807f, 0.494629f, 0.511230f, 0.529785f, 0.547852f, 0.565430f,
- 0.583984f, 0.602539f, 0.806152f, 0.814453f, 0.813965f, 0.811035f, 0.809082f, 0.806641f,
- 0.001631f, 0.005131f, 0.008186f, 0.011673f, 0.014938f, 0.018463f, 0.021957f, 0.025635f,
- 0.029083f, 0.033325f, 0.037445f, 0.041840f, 0.046478f, 0.050751f, 0.055634f, 0.060760f,
- 0.065979f, 0.071472f, 0.077515f, 0.083801f, 0.090027f, 0.096802f, 0.104065f, 0.110840f,
- 0.119080f, 0.127197f, 0.135498f, 0.144775f, 0.153931f, 0.163574f, 0.173462f, 0.184570f,
- 0.195312f, 0.207153f, 0.218506f, 0.230591f, 0.243652f, 0.256348f, 0.270020f, 0.283691f,
- 0.297852f, 0.312744f, 0.326904f, 0.342529f, 0.357910f, 0.373535f, 0.389404f, 0.406494f,
- 0.421875f, 0.439941f, 0.457275f, 0.474365f, 0.492432f, 0.509766f, 0.527832f, 0.546875f,
- 0.564941f, 0.584473f, 0.797852f, 0.807129f, 0.807129f, 0.804199f, 0.801758f, 0.799316f,
- 0.001632f, 0.004704f, 0.007912f, 0.010788f, 0.013870f, 0.017105f, 0.020187f, 0.023483f,
- 0.026932f, 0.030563f, 0.034332f, 0.038086f, 0.042694f, 0.046631f, 0.050995f, 0.055725f,
- 0.060486f, 0.065674f, 0.070862f, 0.076721f, 0.082825f, 0.088623f, 0.094910f, 0.102112f,
- 0.109070f, 0.116516f, 0.124695f, 0.133057f, 0.141968f, 0.151001f, 0.160522f, 0.170776f,
- 0.181030f, 0.191650f, 0.202881f, 0.214722f, 0.227417f, 0.239624f, 0.252686f, 0.265625f,
- 0.279785f, 0.293213f, 0.308350f, 0.323242f, 0.338867f, 0.354248f, 0.370117f, 0.386475f,
- 0.403076f, 0.420410f, 0.437012f, 0.454102f, 0.471924f, 0.490234f, 0.508789f, 0.526855f,
- 0.545410f, 0.564453f, 0.788086f, 0.799316f, 0.798828f, 0.797852f, 0.794434f, 0.791992f,
- 0.001594f, 0.004177f, 0.007122f, 0.010201f, 0.012344f, 0.015839f, 0.018372f, 0.021683f,
- 0.024857f, 0.028534f, 0.031464f, 0.035034f, 0.038879f, 0.042572f, 0.046295f, 0.051056f,
- 0.055389f, 0.059723f, 0.064697f, 0.069763f, 0.075073f, 0.080750f, 0.087219f, 0.093445f,
- 0.099548f, 0.107056f, 0.114136f, 0.121887f, 0.130249f, 0.138794f, 0.147217f, 0.157104f,
- 0.166748f, 0.177124f, 0.187988f, 0.199097f, 0.210693f, 0.222778f, 0.235352f, 0.248169f,
- 0.261719f, 0.275635f, 0.289062f, 0.303955f, 0.319336f, 0.334717f, 0.350098f, 0.365479f,
- 0.382324f, 0.398926f, 0.416016f, 0.433594f, 0.451904f, 0.469238f, 0.487549f, 0.506348f,
- 0.525391f, 0.544922f, 0.779297f, 0.791504f, 0.791504f, 0.789551f, 0.788086f, 0.786133f,
- 0.001365f, 0.004173f, 0.006222f, 0.008842f, 0.011703f, 0.014366f, 0.017242f, 0.020218f,
- 0.022903f, 0.025787f, 0.028824f, 0.032227f, 0.035522f, 0.038818f, 0.042511f, 0.046326f,
- 0.050507f, 0.054657f, 0.058594f, 0.063660f, 0.068359f, 0.073914f, 0.078918f, 0.085083f,
- 0.091125f, 0.097534f, 0.104126f, 0.111511f, 0.118896f, 0.126831f, 0.135742f, 0.144043f,
- 0.153564f, 0.163330f, 0.173462f, 0.184082f, 0.195068f, 0.206787f, 0.218628f, 0.231079f,
- 0.243896f, 0.257080f, 0.270996f, 0.285645f, 0.300049f, 0.314941f, 0.330322f, 0.346191f,
- 0.362305f, 0.379395f, 0.395508f, 0.412842f, 0.431641f, 0.448975f, 0.468262f, 0.487549f,
- 0.505371f, 0.525391f, 0.769531f, 0.783691f, 0.783691f, 0.782715f, 0.781250f, 0.778809f,
- 0.001230f, 0.003925f, 0.006268f, 0.008659f, 0.010796f, 0.013145f, 0.015617f, 0.018234f,
- 0.021133f, 0.023682f, 0.026215f, 0.029251f, 0.032349f, 0.035400f, 0.038696f, 0.042206f,
- 0.045807f, 0.049377f, 0.053925f, 0.057953f, 0.062500f, 0.067078f, 0.071777f, 0.077271f,
- 0.082703f, 0.088806f, 0.094910f, 0.101379f, 0.109192f, 0.115967f, 0.123779f, 0.131470f,
- 0.140259f, 0.149536f, 0.159302f, 0.169312f, 0.180054f, 0.190674f, 0.202515f, 0.214722f,
- 0.226562f, 0.239624f, 0.253174f, 0.266602f, 0.281738f, 0.295898f, 0.311035f, 0.326904f,
- 0.342529f, 0.359131f, 0.375732f, 0.393066f, 0.410400f, 0.428467f, 0.447510f, 0.466064f,
- 0.485596f, 0.504883f, 0.759277f, 0.774902f, 0.775879f, 0.774902f, 0.773438f, 0.771973f,
- 0.001031f, 0.003601f, 0.005604f, 0.007858f, 0.009880f, 0.012146f, 0.014549f, 0.016998f,
- 0.019043f, 0.021362f, 0.024475f, 0.026566f, 0.029358f, 0.032196f, 0.035248f, 0.038391f,
- 0.041656f, 0.045044f, 0.048553f, 0.052582f, 0.056213f, 0.060669f, 0.065186f, 0.070068f,
- 0.074768f, 0.080322f, 0.086060f, 0.092102f, 0.098877f, 0.105408f, 0.112366f, 0.120239f,
- 0.128540f, 0.136597f, 0.145874f, 0.155396f, 0.165283f, 0.175537f, 0.186401f, 0.198120f,
- 0.210083f, 0.222534f, 0.235229f, 0.248657f, 0.262451f, 0.277344f, 0.291504f, 0.307617f,
- 0.322998f, 0.339111f, 0.354980f, 0.372559f, 0.390625f, 0.408936f, 0.426758f, 0.445312f,
- 0.466064f, 0.485840f, 0.749512f, 0.765137f, 0.767578f, 0.767090f, 0.765137f, 0.764648f,
- 0.001161f, 0.003078f, 0.005310f, 0.007282f, 0.009201f, 0.011330f, 0.013214f, 0.015404f,
- 0.017273f, 0.019409f, 0.021988f, 0.024078f, 0.026550f, 0.029358f, 0.032043f, 0.034454f,
- 0.037415f, 0.040710f, 0.043854f, 0.047272f, 0.050659f, 0.054840f, 0.058777f, 0.063293f,
- 0.067566f, 0.072449f, 0.077759f, 0.083069f, 0.088928f, 0.095886f, 0.102478f, 0.109070f,
- 0.116760f, 0.124390f, 0.132935f, 0.141479f, 0.151123f, 0.161011f, 0.171143f, 0.182007f,
- 0.193726f, 0.205688f, 0.218018f, 0.230835f, 0.244507f, 0.258789f, 0.272949f, 0.287109f,
- 0.303467f, 0.319336f, 0.335449f, 0.352539f, 0.369873f, 0.387939f, 0.406250f, 0.425049f,
- 0.444824f, 0.464844f, 0.739258f, 0.756348f, 0.758789f, 0.758789f, 0.757324f, 0.756836f,
- 0.001004f, 0.002939f, 0.005005f, 0.006779f, 0.008453f, 0.010323f, 0.012177f, 0.013870f,
- 0.016052f, 0.018051f, 0.019638f, 0.022141f, 0.023956f, 0.026413f, 0.028870f, 0.031281f,
- 0.033661f, 0.036591f, 0.039429f, 0.042542f, 0.045776f, 0.049011f, 0.053009f, 0.056885f,
- 0.061035f, 0.065186f, 0.069885f, 0.075134f, 0.080505f, 0.085999f, 0.091858f, 0.098633f,
- 0.105591f, 0.112732f, 0.120667f, 0.128662f, 0.137573f, 0.146729f, 0.156372f, 0.166748f,
- 0.177490f, 0.189331f, 0.201294f, 0.213501f, 0.226807f, 0.239746f, 0.254150f, 0.268555f,
- 0.283936f, 0.298828f, 0.316162f, 0.332275f, 0.349609f, 0.367432f, 0.385498f, 0.404053f,
- 0.423828f, 0.443848f, 0.728516f, 0.747559f, 0.750488f, 0.750488f, 0.749512f, 0.748047f,
- 0.000970f, 0.002523f, 0.004665f, 0.006203f, 0.007759f, 0.009491f, 0.011070f, 0.012802f,
- 0.014336f, 0.016266f, 0.017944f, 0.019852f, 0.021805f, 0.023911f, 0.025818f, 0.028137f,
- 0.030579f, 0.032837f, 0.035248f, 0.038055f, 0.041046f, 0.044189f, 0.047333f, 0.050842f,
- 0.054504f, 0.058502f, 0.062866f, 0.067383f, 0.071960f, 0.077393f, 0.082642f, 0.088928f,
- 0.095093f, 0.101685f, 0.108765f, 0.116272f, 0.124451f, 0.133423f, 0.142212f, 0.152100f,
- 0.162354f, 0.172729f, 0.184692f, 0.196411f, 0.209106f, 0.221802f, 0.235718f, 0.250000f,
- 0.265137f, 0.280029f, 0.296143f, 0.312012f, 0.329346f, 0.346924f, 0.364990f, 0.384277f,
- 0.403564f, 0.423340f, 0.718262f, 0.738770f, 0.741211f, 0.742188f, 0.741211f, 0.740234f,
- 0.000785f, 0.002600f, 0.004028f, 0.005390f, 0.007275f, 0.008774f, 0.010124f, 0.011620f,
- 0.013306f, 0.014427f, 0.015991f, 0.017838f, 0.019577f, 0.021469f, 0.023254f, 0.024902f,
- 0.027115f, 0.029190f, 0.031677f, 0.034088f, 0.036682f, 0.039307f, 0.042175f, 0.045410f,
- 0.048553f, 0.052002f, 0.055908f, 0.060028f, 0.064270f, 0.068909f, 0.074097f, 0.079163f,
- 0.085022f, 0.091309f, 0.097473f, 0.104797f, 0.112183f, 0.120239f, 0.128662f, 0.137451f,
- 0.146973f, 0.157471f, 0.168213f, 0.179810f, 0.191650f, 0.204468f, 0.217529f, 0.231201f,
- 0.245605f, 0.260254f, 0.275879f, 0.292236f, 0.308838f, 0.326416f, 0.344238f, 0.363037f,
- 0.382080f, 0.403076f, 0.707031f, 0.729980f, 0.732422f, 0.733398f, 0.733398f, 0.732910f,
- 0.000775f, 0.002190f, 0.003696f, 0.005081f, 0.006397f, 0.007858f, 0.009239f, 0.010323f,
- 0.011803f, 0.012978f, 0.014328f, 0.015915f, 0.017349f, 0.019058f, 0.020630f, 0.022339f,
- 0.024445f, 0.025909f, 0.028275f, 0.030151f, 0.032532f, 0.035065f, 0.037476f, 0.040283f,
- 0.042969f, 0.046448f, 0.049469f, 0.053314f, 0.056976f, 0.061371f, 0.065613f, 0.070435f,
- 0.075623f, 0.081360f, 0.087341f, 0.093628f, 0.100220f, 0.107788f, 0.115845f, 0.123901f,
- 0.133057f, 0.142456f, 0.152832f, 0.163574f, 0.174561f, 0.187012f, 0.199463f, 0.212646f,
- 0.226562f, 0.241455f, 0.256836f, 0.272705f, 0.288818f, 0.305664f, 0.323486f, 0.341797f,
- 0.362305f, 0.382080f, 0.695312f, 0.719238f, 0.722656f, 0.724121f, 0.724121f, 0.723633f,
- 0.000906f, 0.002022f, 0.003521f, 0.004963f, 0.005756f, 0.006847f, 0.008446f, 0.009392f,
- 0.010437f, 0.012039f, 0.012863f, 0.014343f, 0.015457f, 0.016876f, 0.018295f, 0.019730f,
- 0.021484f, 0.023102f, 0.024689f, 0.026581f, 0.028717f, 0.030945f, 0.032928f, 0.035370f,
- 0.037872f, 0.040894f, 0.043915f, 0.047028f, 0.050415f, 0.054169f, 0.058167f, 0.062286f,
- 0.067078f, 0.071960f, 0.077209f, 0.082947f, 0.089417f, 0.096008f, 0.103271f, 0.110718f,
- 0.119324f, 0.128052f, 0.137817f, 0.147705f, 0.158691f, 0.169922f, 0.181519f, 0.195435f,
- 0.208496f, 0.222534f, 0.237305f, 0.252441f, 0.268799f, 0.285645f, 0.302979f, 0.322266f,
- 0.340332f, 0.360840f, 0.683594f, 0.708984f, 0.714355f, 0.715332f, 0.715820f, 0.715332f,
- 0.000700f, 0.002043f, 0.003139f, 0.004219f, 0.005417f, 0.006477f, 0.007442f, 0.008415f,
- 0.009499f, 0.010475f, 0.011497f, 0.012619f, 0.013824f, 0.014969f, 0.016190f, 0.017639f,
- 0.018799f, 0.020386f, 0.021896f, 0.023560f, 0.025131f, 0.027176f, 0.028900f, 0.031067f,
- 0.033295f, 0.035919f, 0.038239f, 0.041229f, 0.044373f, 0.047394f, 0.050934f, 0.054871f,
- 0.058838f, 0.063293f, 0.068115f, 0.073303f, 0.078857f, 0.084839f, 0.091309f, 0.098328f,
- 0.106079f, 0.114136f, 0.123230f, 0.132690f, 0.143066f, 0.153442f, 0.165161f, 0.177368f,
- 0.190186f, 0.203979f, 0.218262f, 0.232910f, 0.248901f, 0.265381f, 0.282227f, 0.301025f,
- 0.319580f, 0.339355f, 0.672852f, 0.699707f, 0.704590f, 0.706055f, 0.706543f, 0.706055f,
- 0.000762f, 0.001804f, 0.002762f, 0.003914f, 0.004791f, 0.005764f, 0.006542f, 0.007622f,
- 0.008606f, 0.009232f, 0.010178f, 0.011093f, 0.012108f, 0.013191f, 0.014412f, 0.015289f,
- 0.016510f, 0.017731f, 0.019119f, 0.020615f, 0.022049f, 0.023483f, 0.025345f, 0.027100f,
- 0.028885f, 0.031067f, 0.033417f, 0.035797f, 0.038422f, 0.041382f, 0.044495f, 0.047638f,
- 0.051178f, 0.055267f, 0.059387f, 0.064026f, 0.069092f, 0.074585f, 0.080566f, 0.087097f,
- 0.093811f, 0.101624f, 0.109619f, 0.117798f, 0.127319f, 0.137817f, 0.148682f, 0.160278f,
- 0.172607f, 0.185669f, 0.199097f, 0.214233f, 0.229492f, 0.245850f, 0.261963f, 0.280273f,
- 0.299316f, 0.319580f, 0.660645f, 0.689453f, 0.694824f, 0.696777f, 0.697266f, 0.697266f,
- 0.000499f, 0.001527f, 0.002565f, 0.003622f, 0.004429f, 0.005138f, 0.005955f, 0.006691f,
- 0.007317f, 0.008156f, 0.008949f, 0.009903f, 0.010635f, 0.011452f, 0.012512f, 0.013451f,
- 0.014503f, 0.015610f, 0.016632f, 0.017746f, 0.019073f, 0.020355f, 0.021957f, 0.023453f,
- 0.025208f, 0.026932f, 0.028732f, 0.030945f, 0.033142f, 0.035614f, 0.038300f, 0.041199f,
- 0.044464f, 0.047760f, 0.051514f, 0.055573f, 0.059998f, 0.064819f, 0.070312f, 0.075867f,
- 0.082275f, 0.088806f, 0.096436f, 0.104797f, 0.113342f, 0.122559f, 0.132568f, 0.143799f,
- 0.155396f, 0.167725f, 0.181274f, 0.195068f, 0.209961f, 0.225708f, 0.242310f, 0.259766f,
- 0.277832f, 0.297363f, 0.648926f, 0.678711f, 0.685059f, 0.687500f, 0.687500f, 0.687988f,
- 0.000653f, 0.001627f, 0.002562f, 0.003166f, 0.003872f, 0.004562f, 0.005287f, 0.005905f,
- 0.006557f, 0.007309f, 0.007835f, 0.008621f, 0.009140f, 0.010109f, 0.010773f, 0.011627f,
- 0.012428f, 0.013351f, 0.014488f, 0.015472f, 0.016479f, 0.017578f, 0.018845f, 0.020157f,
- 0.021591f, 0.023132f, 0.024765f, 0.026337f, 0.028473f, 0.030594f, 0.032867f, 0.035309f,
- 0.037933f, 0.041107f, 0.044403f, 0.047852f, 0.051666f, 0.055756f, 0.060455f, 0.065552f,
- 0.070740f, 0.077454f, 0.083862f, 0.091125f, 0.099304f, 0.107971f, 0.117859f, 0.127808f,
- 0.139038f, 0.150757f, 0.163574f, 0.176880f, 0.191162f, 0.206665f, 0.222656f, 0.239258f,
- 0.257568f, 0.277100f, 0.636230f, 0.667969f, 0.675293f, 0.677734f, 0.678223f, 0.678711f,
- 0.000393f, 0.001375f, 0.002174f, 0.002773f, 0.003334f, 0.004070f, 0.004692f, 0.005047f,
- 0.005672f, 0.006298f, 0.006893f, 0.007454f, 0.007957f, 0.008636f, 0.009171f, 0.010002f,
- 0.010674f, 0.011574f, 0.012451f, 0.013145f, 0.014091f, 0.014893f, 0.016083f, 0.017151f,
- 0.018402f, 0.019714f, 0.021042f, 0.022415f, 0.024155f, 0.026108f, 0.027786f, 0.030212f,
- 0.032379f, 0.034698f, 0.037415f, 0.040436f, 0.043793f, 0.047455f, 0.051727f, 0.056030f,
- 0.061218f, 0.066284f, 0.072571f, 0.079041f, 0.086121f, 0.094299f, 0.102844f, 0.112305f,
- 0.122925f, 0.134033f, 0.145752f, 0.158569f, 0.172729f, 0.187378f, 0.203003f, 0.219238f,
- 0.237671f, 0.255859f, 0.624023f, 0.657227f, 0.664062f, 0.666992f, 0.668457f, 0.668457f,
- 0.000379f, 0.001404f, 0.001893f, 0.002403f, 0.002840f, 0.003458f, 0.004021f, 0.004459f,
- 0.004894f, 0.005527f, 0.005844f, 0.006256f, 0.006866f, 0.007423f, 0.007957f, 0.008476f,
- 0.009155f, 0.009735f, 0.010422f, 0.011078f, 0.011925f, 0.012787f, 0.013458f, 0.014526f,
- 0.015541f, 0.016632f, 0.017838f, 0.019028f, 0.020248f, 0.021851f, 0.023514f, 0.024979f,
- 0.027054f, 0.029236f, 0.031555f, 0.034180f, 0.036713f, 0.040375f, 0.043854f, 0.047607f,
- 0.051727f, 0.056549f, 0.061768f, 0.067627f, 0.073792f, 0.081116f, 0.089111f, 0.097595f,
- 0.107056f, 0.117371f, 0.128906f, 0.141113f, 0.154053f, 0.168579f, 0.183960f, 0.199585f,
- 0.216309f, 0.235352f, 0.612793f, 0.647949f, 0.652832f, 0.656250f, 0.658691f, 0.658203f,
- 0.000506f, 0.001164f, 0.001575f, 0.002136f, 0.002600f, 0.003054f, 0.003405f, 0.003735f,
- 0.004364f, 0.004681f, 0.004944f, 0.005569f, 0.005810f, 0.006187f, 0.006813f, 0.007233f,
- 0.007881f, 0.008217f, 0.008850f, 0.009293f, 0.010109f, 0.010788f, 0.011543f, 0.012161f,
- 0.012993f, 0.013931f, 0.014809f, 0.015945f, 0.016983f, 0.018234f, 0.019440f, 0.020813f,
- 0.022491f, 0.024261f, 0.026169f, 0.028458f, 0.030701f, 0.033295f, 0.036560f, 0.039520f,
- 0.043121f, 0.047333f, 0.052032f, 0.056885f, 0.062561f, 0.068909f, 0.076111f, 0.083496f,
- 0.092407f, 0.101929f, 0.112671f, 0.124451f, 0.136719f, 0.150146f, 0.165039f, 0.180786f,
- 0.197510f, 0.215210f, 0.597656f, 0.636230f, 0.642578f, 0.647461f, 0.647949f, 0.649902f,
- 0.000344f, 0.001057f, 0.001456f, 0.001907f, 0.002377f, 0.002735f, 0.002983f, 0.003359f,
- 0.003651f, 0.003960f, 0.004311f, 0.004471f, 0.005009f, 0.005283f, 0.005653f, 0.006145f,
- 0.006592f, 0.006889f, 0.007469f, 0.007889f, 0.008423f, 0.008911f, 0.009567f, 0.010124f,
- 0.010788f, 0.011574f, 0.012466f, 0.013123f, 0.014053f, 0.015091f, 0.016159f, 0.017288f,
- 0.018539f, 0.020111f, 0.021698f, 0.023285f, 0.025024f, 0.027405f, 0.029800f, 0.032501f,
- 0.035583f, 0.039001f, 0.042908f, 0.047302f, 0.052185f, 0.057465f, 0.063843f, 0.070984f,
- 0.078857f, 0.087463f, 0.097168f, 0.108215f, 0.120117f, 0.132812f, 0.146851f, 0.161865f,
- 0.177856f, 0.195557f, 0.585449f, 0.624023f, 0.633301f, 0.636230f, 0.637695f, 0.638672f,
- 0.000516f, 0.000847f, 0.001210f, 0.001663f, 0.002012f, 0.002218f, 0.002424f, 0.002861f,
- 0.002947f, 0.003275f, 0.003469f, 0.003819f, 0.004169f, 0.004337f, 0.004658f, 0.005169f,
- 0.005424f, 0.005795f, 0.006138f, 0.006500f, 0.007057f, 0.007458f, 0.007874f, 0.008369f,
- 0.008888f, 0.009583f, 0.010147f, 0.010864f, 0.011589f, 0.012428f, 0.013161f, 0.013931f,
- 0.015076f, 0.016266f, 0.017456f, 0.018845f, 0.020432f, 0.022232f, 0.024094f, 0.026459f,
- 0.028809f, 0.031586f, 0.034973f, 0.038513f, 0.042755f, 0.047485f, 0.052643f, 0.058929f,
- 0.065796f, 0.073792f, 0.082581f, 0.092407f, 0.103516f, 0.115723f, 0.128906f, 0.142944f,
- 0.158813f, 0.175781f, 0.572266f, 0.613770f, 0.621094f, 0.625977f, 0.626953f, 0.628418f,
- 0.000262f, 0.000864f, 0.001096f, 0.001409f, 0.001576f, 0.001852f, 0.002047f, 0.002247f,
- 0.002518f, 0.002741f, 0.002956f, 0.003157f, 0.003359f, 0.003597f, 0.003872f, 0.004230f,
- 0.004406f, 0.004772f, 0.005035f, 0.005379f, 0.005695f, 0.006153f, 0.006485f, 0.006935f,
- 0.007275f, 0.007801f, 0.008301f, 0.008789f, 0.009300f, 0.009949f, 0.010727f, 0.011482f,
- 0.012245f, 0.013145f, 0.014236f, 0.015236f, 0.016525f, 0.017838f, 0.019348f, 0.021088f,
- 0.023010f, 0.025253f, 0.027878f, 0.031128f, 0.034149f, 0.038269f, 0.042694f, 0.047852f,
- 0.053833f, 0.060852f, 0.068665f, 0.077698f, 0.087891f, 0.099182f, 0.111633f, 0.125732f,
- 0.140381f, 0.157227f, 0.558105f, 0.601562f, 0.610840f, 0.614746f, 0.617188f, 0.619141f,
- 0.000270f, 0.000683f, 0.000851f, 0.001138f, 0.001346f, 0.001561f, 0.001701f, 0.001884f,
- 0.001984f, 0.002193f, 0.002455f, 0.002609f, 0.002743f, 0.002993f, 0.003159f, 0.003361f,
- 0.003593f, 0.003883f, 0.004044f, 0.004360f, 0.004532f, 0.004971f, 0.005169f, 0.005573f,
- 0.005863f, 0.006252f, 0.006653f, 0.007095f, 0.007572f, 0.008110f, 0.008713f, 0.009056f,
- 0.009827f, 0.010574f, 0.011307f, 0.012070f, 0.013069f, 0.014122f, 0.015297f, 0.016678f,
- 0.018234f, 0.019775f, 0.021835f, 0.024216f, 0.026917f, 0.030151f, 0.033875f, 0.038147f,
- 0.043121f, 0.049408f, 0.056091f, 0.064026f, 0.073059f, 0.083801f, 0.095276f, 0.108459f,
- 0.122803f, 0.138794f, 0.545410f, 0.590332f, 0.599609f, 0.603516f, 0.606445f, 0.607422f,
- 0.000190f, 0.000607f, 0.000724f, 0.000989f, 0.001171f, 0.001265f, 0.001416f, 0.001602f,
- 0.001666f, 0.001761f, 0.001893f, 0.002102f, 0.002199f, 0.002413f, 0.002537f, 0.002743f,
- 0.002850f, 0.003027f, 0.003258f, 0.003494f, 0.003729f, 0.003937f, 0.004204f, 0.004410f,
- 0.004616f, 0.004921f, 0.005192f, 0.005604f, 0.005936f, 0.006298f, 0.006836f, 0.007233f,
- 0.007694f, 0.008224f, 0.008827f, 0.009506f, 0.010262f, 0.011055f, 0.011978f, 0.012955f,
- 0.014099f, 0.015434f, 0.017029f, 0.018677f, 0.020813f, 0.023193f, 0.026169f, 0.029541f,
- 0.033783f, 0.038513f, 0.044403f, 0.051208f, 0.059387f, 0.068665f, 0.079468f, 0.091858f,
- 0.105774f, 0.120728f, 0.530762f, 0.578125f, 0.588379f, 0.592773f, 0.595215f, 0.597168f,
- 0.000151f, 0.000443f, 0.000673f, 0.000793f, 0.000937f, 0.000987f, 0.001092f, 0.001192f,
- 0.001324f, 0.001460f, 0.001495f, 0.001565f, 0.001778f, 0.001944f, 0.002054f, 0.002096f,
- 0.002254f, 0.002338f, 0.002594f, 0.002737f, 0.002886f, 0.003048f, 0.003294f, 0.003460f,
- 0.003679f, 0.003868f, 0.004086f, 0.004322f, 0.004642f, 0.004894f, 0.005199f, 0.005554f,
- 0.006035f, 0.006451f, 0.006836f, 0.007359f, 0.007820f, 0.008461f, 0.009163f, 0.009956f,
- 0.010803f, 0.011871f, 0.012917f, 0.014343f, 0.015900f, 0.017670f, 0.019791f, 0.022400f,
- 0.025589f, 0.029404f, 0.034210f, 0.039948f, 0.046936f, 0.055298f, 0.064941f, 0.076172f,
- 0.089172f, 0.103821f, 0.517090f, 0.565918f, 0.576172f, 0.582031f, 0.584961f, 0.586426f,
- 0.000203f, 0.000287f, 0.000531f, 0.000688f, 0.000738f, 0.000820f, 0.000915f, 0.000875f,
- 0.001036f, 0.001117f, 0.001215f, 0.001317f, 0.001374f, 0.001476f, 0.001524f, 0.001682f,
- 0.001726f, 0.001867f, 0.002014f, 0.002056f, 0.002209f, 0.002365f, 0.002495f, 0.002663f,
- 0.002775f, 0.002953f, 0.003134f, 0.003325f, 0.003567f, 0.003736f, 0.004070f, 0.004261f,
- 0.004494f, 0.004845f, 0.005116f, 0.005459f, 0.005928f, 0.006329f, 0.006863f, 0.007458f,
- 0.008087f, 0.008873f, 0.009689f, 0.010651f, 0.011826f, 0.013130f, 0.014732f, 0.016617f,
- 0.018890f, 0.021912f, 0.025482f, 0.029938f, 0.035736f, 0.042847f, 0.051453f, 0.061615f,
- 0.074158f, 0.087952f, 0.504395f, 0.554199f, 0.565918f, 0.569336f, 0.573242f, 0.574219f,
- 0.000215f, 0.000259f, 0.000423f, 0.000534f, 0.000499f, 0.000649f, 0.000622f, 0.000690f,
- 0.000717f, 0.000817f, 0.000937f, 0.000984f, 0.001045f, 0.001148f, 0.001182f, 0.001211f,
- 0.001339f, 0.001406f, 0.001463f, 0.001590f, 0.001666f, 0.001759f, 0.001867f, 0.001949f,
- 0.002064f, 0.002176f, 0.002342f, 0.002453f, 0.002619f, 0.002871f, 0.003033f, 0.003101f,
- 0.003389f, 0.003620f, 0.003794f, 0.004059f, 0.004368f, 0.004681f, 0.005035f, 0.005466f,
- 0.005917f, 0.006405f, 0.007092f, 0.007744f, 0.008591f, 0.009506f, 0.010567f, 0.011993f,
- 0.013710f, 0.015762f, 0.018326f, 0.021759f, 0.026077f, 0.031891f, 0.039124f, 0.048462f,
- 0.059570f, 0.072571f, 0.489258f, 0.542480f, 0.553223f, 0.558594f, 0.562012f, 0.563965f,
- 0.000067f, 0.000253f, 0.000305f, 0.000367f, 0.000422f, 0.000431f, 0.000530f, 0.000466f,
- 0.000565f, 0.000590f, 0.000702f, 0.000690f, 0.000746f, 0.000795f, 0.000859f, 0.000897f,
- 0.000962f, 0.001021f, 0.001069f, 0.001105f, 0.001207f, 0.001257f, 0.001354f, 0.001424f,
- 0.001483f, 0.001570f, 0.001687f, 0.001750f, 0.001857f, 0.001982f, 0.002071f, 0.002281f,
- 0.002361f, 0.002527f, 0.002684f, 0.002846f, 0.003092f, 0.003342f, 0.003622f, 0.003866f,
- 0.004173f, 0.004520f, 0.004955f, 0.005428f, 0.006023f, 0.006687f, 0.007481f, 0.008446f,
- 0.009628f, 0.011047f, 0.012840f, 0.015205f, 0.018326f, 0.022629f, 0.028442f, 0.036102f,
- 0.046051f, 0.058197f, 0.476318f, 0.529785f, 0.541992f, 0.547852f, 0.550293f, 0.553223f,
- 0.000000f, 0.000118f, 0.000216f, 0.000288f, 0.000272f, 0.000350f, 0.000312f, 0.000374f,
- 0.000395f, 0.000470f, 0.000488f, 0.000477f, 0.000495f, 0.000548f, 0.000573f, 0.000646f,
- 0.000636f, 0.000714f, 0.000763f, 0.000803f, 0.000852f, 0.000897f, 0.000930f, 0.000985f,
- 0.001056f, 0.001089f, 0.001163f, 0.001210f, 0.001281f, 0.001432f, 0.001431f, 0.001548f,
- 0.001622f, 0.001743f, 0.001869f, 0.001991f, 0.002104f, 0.002262f, 0.002428f, 0.002632f,
- 0.002815f, 0.003077f, 0.003344f, 0.003656f, 0.004002f, 0.004478f, 0.004974f, 0.005627f,
- 0.006435f, 0.007481f, 0.008713f, 0.010307f, 0.012291f, 0.015289f, 0.019409f, 0.025497f,
- 0.033966f, 0.045013f, 0.461914f, 0.517090f, 0.529297f, 0.536133f, 0.539551f, 0.541504f,
- 0.000073f, 0.000175f, 0.000165f, 0.000149f, 0.000200f, 0.000208f, 0.000215f, 0.000260f,
- 0.000268f, 0.000277f, 0.000292f, 0.000341f, 0.000334f, 0.000370f, 0.000413f, 0.000424f,
- 0.000449f, 0.000474f, 0.000488f, 0.000507f, 0.000555f, 0.000574f, 0.000616f, 0.000652f,
- 0.000696f, 0.000746f, 0.000780f, 0.000804f, 0.000849f, 0.000888f, 0.000949f, 0.001011f,
- 0.001075f, 0.001151f, 0.001225f, 0.001266f, 0.001385f, 0.001466f, 0.001596f, 0.001699f,
- 0.001808f, 0.001980f, 0.002157f, 0.002329f, 0.002544f, 0.002850f, 0.003178f, 0.003593f,
- 0.004047f, 0.004658f, 0.005508f, 0.006565f, 0.007935f, 0.009819f, 0.012527f, 0.016647f,
- 0.023514f, 0.033173f, 0.447510f, 0.503906f, 0.517578f, 0.523926f, 0.527344f, 0.529297f,
- 0.000000f, 0.000106f, 0.000097f, 0.000099f, 0.000136f, 0.000157f, 0.000129f, 0.000162f,
- 0.000167f, 0.000172f, 0.000180f, 0.000186f, 0.000209f, 0.000227f, 0.000232f, 0.000248f,
- 0.000260f, 0.000291f, 0.000300f, 0.000327f, 0.000335f, 0.000343f, 0.000363f, 0.000395f,
- 0.000428f, 0.000459f, 0.000458f, 0.000477f, 0.000515f, 0.000549f, 0.000578f, 0.000621f,
- 0.000659f, 0.000683f, 0.000741f, 0.000767f, 0.000818f, 0.000877f, 0.000952f, 0.001010f,
- 0.001085f, 0.001177f, 0.001275f, 0.001406f, 0.001516f, 0.001664f, 0.001884f, 0.002096f,
- 0.002415f, 0.002745f, 0.003231f, 0.003843f, 0.004715f, 0.005936f, 0.007629f, 0.010139f,
- 0.014763f, 0.022812f, 0.433350f, 0.491455f, 0.506348f, 0.511719f, 0.515625f, 0.518066f,
- 0.000104f, 0.000080f, 0.000069f, 0.000062f, 0.000074f, 0.000074f, 0.000089f, 0.000097f,
- 0.000099f, 0.000102f, 0.000105f, 0.000126f, 0.000106f, 0.000119f, 0.000139f, 0.000135f,
- 0.000154f, 0.000164f, 0.000166f, 0.000175f, 0.000188f, 0.000194f, 0.000211f, 0.000220f,
- 0.000252f, 0.000248f, 0.000260f, 0.000272f, 0.000293f, 0.000301f, 0.000328f, 0.000347f,
- 0.000365f, 0.000371f, 0.000401f, 0.000422f, 0.000447f, 0.000489f, 0.000524f, 0.000553f,
- 0.000588f, 0.000635f, 0.000701f, 0.000751f, 0.000816f, 0.000897f, 0.000997f, 0.001109f,
- 0.001265f, 0.001460f, 0.001686f, 0.002035f, 0.002457f, 0.003130f, 0.004124f, 0.005676f,
- 0.008263f, 0.014114f, 0.418945f, 0.479492f, 0.493652f, 0.500000f, 0.503418f, 0.506836f,
- 0.000089f, 0.000065f, 0.000056f, 0.000050f, 0.000045f, 0.000042f, 0.000046f, 0.000042f,
- 0.000043f, 0.000055f, 0.000046f, 0.000049f, 0.000065f, 0.000055f, 0.000057f, 0.000063f,
- 0.000075f, 0.000080f, 0.000078f, 0.000084f, 0.000085f, 0.000092f, 0.000097f, 0.000102f,
- 0.000108f, 0.000117f, 0.000118f, 0.000138f, 0.000135f, 0.000142f, 0.000151f, 0.000160f,
- 0.000172f, 0.000180f, 0.000195f, 0.000197f, 0.000210f, 0.000230f, 0.000244f, 0.000266f,
- 0.000279f, 0.000299f, 0.000324f, 0.000352f, 0.000383f, 0.000414f, 0.000457f, 0.000509f,
- 0.000575f, 0.000650f, 0.000756f, 0.000904f, 0.001103f, 0.001410f, 0.001880f, 0.002668f,
- 0.004112f, 0.007290f, 0.404541f, 0.466309f, 0.481201f, 0.488037f, 0.492432f, 0.495361f,
- 0.000066f, 0.000046f, 0.000038f, 0.000034f, 0.000031f, 0.000029f, 0.000027f, 0.000026f,
- 0.000025f, 0.000023f, 0.000022f, 0.000024f, 0.000020f, 0.000021f, 0.000021f, 0.000026f,
- 0.000024f, 0.000028f, 0.000031f, 0.000032f, 0.000032f, 0.000035f, 0.000040f, 0.000038f,
- 0.000041f, 0.000047f, 0.000049f, 0.000043f, 0.000050f, 0.000052f, 0.000056f, 0.000059f,
- 0.000066f, 0.000062f, 0.000067f, 0.000071f, 0.000082f, 0.000083f, 0.000089f, 0.000098f,
- 0.000104f, 0.000107f, 0.000116f, 0.000125f, 0.000141f, 0.000149f, 0.000160f, 0.000183f,
- 0.000207f, 0.000228f, 0.000264f, 0.000311f, 0.000376f, 0.000469f, 0.000646f, 0.000937f,
- 0.001554f, 0.002983f, 0.390381f, 0.454346f, 0.469727f, 0.476318f, 0.480713f, 0.484131f,
- 0.000028f, 0.000019f, 0.000015f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f,
- 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f,
- 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000007f,
- 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000012f, 0.000011f,
- 0.000014f, 0.000015f, 0.000016f, 0.000016f, 0.000018f, 0.000019f, 0.000019f, 0.000022f,
- 0.000023f, 0.000024f, 0.000026f, 0.000028f, 0.000029f, 0.000032f, 0.000037f, 0.000037f,
- 0.000042f, 0.000048f, 0.000056f, 0.000066f, 0.000077f, 0.000091f, 0.000124f, 0.000183f,
- 0.000318f, 0.000779f, 0.376465f, 0.441406f, 0.457275f, 0.464600f, 0.468994f, 0.471924f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f,
- 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f,
- 0.000010f, 0.000027f, 0.363037f, 0.428223f, 0.444580f, 0.452881f, 0.457031f, 0.459961f,
- },
- {
- 0.014420f, 0.043488f, 0.072388f, 0.100830f, 0.129150f, 0.156494f, 0.183350f, 0.210327f,
- 0.235352f, 0.260986f, 0.285645f, 0.309082f, 0.332764f, 0.355713f, 0.377441f, 0.399658f,
- 0.420898f, 0.441650f, 0.461914f, 0.481445f, 0.500977f, 0.520508f, 0.538574f, 0.556641f,
- 0.574707f, 0.591797f, 0.608398f, 0.624512f, 0.641602f, 0.657227f, 0.672363f, 0.687500f,
- 0.702148f, 0.717285f, 0.730957f, 0.745117f, 0.758789f, 0.772461f, 0.783203f, 0.797363f,
- 0.810547f, 0.822266f, 0.833984f, 0.845703f, 0.857422f, 0.868652f, 0.879395f, 0.890625f,
- 0.901367f, 0.911621f, 0.921875f, 0.932129f, 0.941895f, 0.951660f, 0.960938f, 0.970215f,
- 0.979492f, 0.987793f, 0.981934f, 0.957031f, 0.938965f, 0.923340f, 0.909668f, 0.897461f,
- 0.013199f, 0.039978f, 0.066284f, 0.093445f, 0.119324f, 0.145386f, 0.170410f, 0.195801f,
- 0.220581f, 0.244019f, 0.268066f, 0.291260f, 0.314453f, 0.335938f, 0.358154f, 0.379639f,
- 0.399902f, 0.420898f, 0.441406f, 0.460938f, 0.480225f, 0.498291f, 0.516602f, 0.535156f,
- 0.553223f, 0.570312f, 0.587891f, 0.603516f, 0.620117f, 0.636719f, 0.652832f, 0.667480f,
- 0.682617f, 0.696777f, 0.711914f, 0.726074f, 0.739746f, 0.753418f, 0.766602f, 0.779785f,
- 0.791992f, 0.804688f, 0.817871f, 0.829102f, 0.841309f, 0.852539f, 0.864258f, 0.875488f,
- 0.886230f, 0.896973f, 0.907227f, 0.917969f, 0.928223f, 0.937500f, 0.947266f, 0.957520f,
- 0.966797f, 0.975586f, 0.976562f, 0.952637f, 0.935547f, 0.920898f, 0.907715f, 0.895996f,
- 0.011932f, 0.036499f, 0.061554f, 0.085999f, 0.110962f, 0.135010f, 0.158813f, 0.182373f,
- 0.206421f, 0.229004f, 0.251221f, 0.274170f, 0.295654f, 0.317871f, 0.339111f, 0.360107f,
- 0.379395f, 0.399414f, 0.420654f, 0.440430f, 0.458252f, 0.477295f, 0.496094f, 0.513672f,
- 0.531738f, 0.549805f, 0.566406f, 0.583984f, 0.599121f, 0.616211f, 0.631348f, 0.647461f,
- 0.662598f, 0.677734f, 0.692383f, 0.705566f, 0.720703f, 0.734863f, 0.748047f, 0.761230f,
- 0.774414f, 0.787598f, 0.799805f, 0.812500f, 0.824707f, 0.837402f, 0.848633f, 0.859375f,
- 0.871094f, 0.882324f, 0.892578f, 0.904297f, 0.913574f, 0.924316f, 0.934570f, 0.943848f,
- 0.954102f, 0.963867f, 0.970703f, 0.948242f, 0.931641f, 0.917480f, 0.905273f, 0.894043f,
- 0.011070f, 0.033478f, 0.056396f, 0.079529f, 0.101990f, 0.125244f, 0.147705f, 0.170410f,
- 0.192139f, 0.214111f, 0.235596f, 0.257812f, 0.279053f, 0.300293f, 0.320557f, 0.340576f,
- 0.360596f, 0.381104f, 0.400635f, 0.420166f, 0.438965f, 0.458008f, 0.476562f, 0.493652f,
- 0.511230f, 0.527832f, 0.545898f, 0.562012f, 0.579102f, 0.595703f, 0.610840f, 0.627930f,
- 0.642578f, 0.657227f, 0.672363f, 0.686523f, 0.701660f, 0.715332f, 0.729492f, 0.742676f,
- 0.756348f, 0.769531f, 0.782227f, 0.795898f, 0.807617f, 0.820312f, 0.832031f, 0.843262f,
- 0.855469f, 0.866699f, 0.877441f, 0.889648f, 0.899414f, 0.910156f, 0.920410f, 0.930664f,
- 0.940430f, 0.950684f, 0.964844f, 0.943848f, 0.927734f, 0.914551f, 0.902344f, 0.891602f,
- 0.010010f, 0.031067f, 0.051880f, 0.073303f, 0.094421f, 0.116577f, 0.136963f, 0.157959f,
- 0.180542f, 0.200684f, 0.221436f, 0.242676f, 0.262939f, 0.283447f, 0.303467f, 0.323242f,
- 0.342529f, 0.362305f, 0.381348f, 0.399414f, 0.418701f, 0.437256f, 0.455322f, 0.472412f,
- 0.490479f, 0.507812f, 0.524902f, 0.541992f, 0.558105f, 0.574219f, 0.591309f, 0.606445f,
- 0.622070f, 0.637695f, 0.652344f, 0.666504f, 0.683594f, 0.695801f, 0.710449f, 0.724121f,
- 0.737305f, 0.751465f, 0.765137f, 0.777344f, 0.790039f, 0.802734f, 0.814941f, 0.827637f,
- 0.839355f, 0.851074f, 0.862305f, 0.874512f, 0.885254f, 0.895996f, 0.906738f, 0.917480f,
- 0.927246f, 0.937988f, 0.958984f, 0.939453f, 0.923828f, 0.911133f, 0.899414f, 0.889160f,
- 0.009491f, 0.028305f, 0.047699f, 0.067810f, 0.087341f, 0.107849f, 0.127686f, 0.147827f,
- 0.167725f, 0.187744f, 0.207886f, 0.227051f, 0.247314f, 0.266846f, 0.286377f, 0.305908f,
- 0.324463f, 0.343262f, 0.361572f, 0.380371f, 0.399658f, 0.416748f, 0.435547f, 0.452881f,
- 0.470703f, 0.488281f, 0.503906f, 0.522461f, 0.538086f, 0.554199f, 0.571289f, 0.586914f,
- 0.602051f, 0.617676f, 0.633789f, 0.647949f, 0.663086f, 0.677246f, 0.692871f, 0.705078f,
- 0.718750f, 0.732910f, 0.746582f, 0.759766f, 0.773438f, 0.785645f, 0.798340f, 0.811035f,
- 0.823242f, 0.834961f, 0.847168f, 0.859863f, 0.870117f, 0.881348f, 0.893066f, 0.903320f,
- 0.914551f, 0.924316f, 0.953125f, 0.934082f, 0.919434f, 0.906738f, 0.896484f, 0.885742f,
- 0.008598f, 0.026245f, 0.044495f, 0.062622f, 0.081177f, 0.100098f, 0.119019f, 0.137817f,
- 0.156616f, 0.175903f, 0.194946f, 0.213745f, 0.232788f, 0.251221f, 0.269775f, 0.288330f,
- 0.307129f, 0.325928f, 0.344238f, 0.362305f, 0.380371f, 0.397705f, 0.415771f, 0.433105f,
- 0.450928f, 0.468262f, 0.484863f, 0.501953f, 0.518555f, 0.534668f, 0.550293f, 0.566406f,
- 0.582520f, 0.598145f, 0.612305f, 0.627930f, 0.643555f, 0.657715f, 0.672852f, 0.687500f,
- 0.700684f, 0.715332f, 0.728516f, 0.742188f, 0.755371f, 0.769531f, 0.781738f, 0.794434f,
- 0.807129f, 0.818359f, 0.831543f, 0.843262f, 0.855469f, 0.865723f, 0.877930f, 0.889160f,
- 0.900391f, 0.911621f, 0.946777f, 0.929199f, 0.915039f, 0.903320f, 0.892578f, 0.883301f,
- 0.007896f, 0.024490f, 0.041138f, 0.057892f, 0.075439f, 0.092712f, 0.110229f, 0.128296f,
- 0.146118f, 0.164429f, 0.181885f, 0.200562f, 0.218628f, 0.236572f, 0.255127f, 0.272949f,
- 0.291016f, 0.308594f, 0.326172f, 0.343994f, 0.361816f, 0.380127f, 0.396973f, 0.414551f,
- 0.430908f, 0.447998f, 0.465576f, 0.481445f, 0.497559f, 0.514160f, 0.529785f, 0.546387f,
- 0.562988f, 0.578613f, 0.593262f, 0.609375f, 0.623047f, 0.638672f, 0.653809f, 0.667480f,
- 0.681641f, 0.697266f, 0.710938f, 0.724121f, 0.737305f, 0.752441f, 0.765625f, 0.776367f,
- 0.790527f, 0.803223f, 0.815918f, 0.827637f, 0.839844f, 0.851562f, 0.863281f, 0.875000f,
- 0.886719f, 0.898926f, 0.940430f, 0.923828f, 0.910645f, 0.899414f, 0.889160f, 0.879883f,
- 0.007320f, 0.022369f, 0.038055f, 0.053925f, 0.070190f, 0.086609f, 0.103027f, 0.119568f,
- 0.136475f, 0.153320f, 0.170532f, 0.187988f, 0.204834f, 0.223022f, 0.240112f, 0.257324f,
- 0.275391f, 0.291504f, 0.308838f, 0.326904f, 0.344727f, 0.361572f, 0.378662f, 0.395020f,
- 0.411865f, 0.428711f, 0.445068f, 0.462646f, 0.478271f, 0.494141f, 0.510254f, 0.525879f,
- 0.542480f, 0.557129f, 0.573242f, 0.588867f, 0.603516f, 0.618164f, 0.633789f, 0.648438f,
- 0.663086f, 0.678223f, 0.691895f, 0.706543f, 0.720215f, 0.733398f, 0.746582f, 0.759766f,
- 0.774414f, 0.786621f, 0.799805f, 0.811523f, 0.823730f, 0.836914f, 0.848145f, 0.860840f,
- 0.872070f, 0.884277f, 0.933594f, 0.918945f, 0.906250f, 0.895020f, 0.885254f, 0.876953f,
- 0.006760f, 0.021011f, 0.034973f, 0.050049f, 0.065369f, 0.080261f, 0.095337f, 0.111633f,
- 0.127319f, 0.142822f, 0.159668f, 0.176514f, 0.192383f, 0.209106f, 0.225586f, 0.242554f,
- 0.259277f, 0.275635f, 0.292480f, 0.309326f, 0.326904f, 0.343750f, 0.359619f, 0.376465f,
- 0.393066f, 0.409424f, 0.426514f, 0.442871f, 0.458252f, 0.475586f, 0.490967f, 0.505859f,
- 0.522461f, 0.539062f, 0.554199f, 0.569336f, 0.583984f, 0.600586f, 0.614258f, 0.630371f,
- 0.643555f, 0.658691f, 0.673340f, 0.687500f, 0.702148f, 0.715332f, 0.729980f, 0.743652f,
- 0.756348f, 0.770020f, 0.782715f, 0.796387f, 0.808105f, 0.820801f, 0.833008f, 0.846680f,
- 0.857910f, 0.870117f, 0.927246f, 0.913574f, 0.901367f, 0.891113f, 0.881348f, 0.873047f,
- 0.006367f, 0.019165f, 0.032379f, 0.046295f, 0.060089f, 0.074463f, 0.088867f, 0.103821f,
- 0.118835f, 0.133911f, 0.149048f, 0.164673f, 0.180298f, 0.196289f, 0.212524f, 0.228516f,
- 0.244385f, 0.260742f, 0.277344f, 0.293213f, 0.309570f, 0.326416f, 0.342773f, 0.358887f,
- 0.374512f, 0.391113f, 0.406982f, 0.423340f, 0.439453f, 0.455078f, 0.470947f, 0.487793f,
- 0.502441f, 0.519043f, 0.533691f, 0.550293f, 0.564941f, 0.580078f, 0.595703f, 0.610840f,
- 0.625488f, 0.640137f, 0.654785f, 0.669434f, 0.683594f, 0.696777f, 0.710938f, 0.725586f,
- 0.738770f, 0.752441f, 0.766113f, 0.778320f, 0.791016f, 0.805176f, 0.818359f, 0.830566f,
- 0.842773f, 0.854980f, 0.920410f, 0.908203f, 0.896484f, 0.886230f, 0.877441f, 0.868652f,
- 0.005981f, 0.017914f, 0.030350f, 0.042908f, 0.056213f, 0.069092f, 0.083008f, 0.096619f,
- 0.111084f, 0.124634f, 0.139526f, 0.154297f, 0.169312f, 0.184570f, 0.199951f, 0.215454f,
- 0.230713f, 0.245728f, 0.261963f, 0.277588f, 0.293213f, 0.309326f, 0.325195f, 0.340820f,
- 0.356934f, 0.373047f, 0.388916f, 0.404785f, 0.420410f, 0.436279f, 0.452148f, 0.468506f,
- 0.483154f, 0.499756f, 0.515137f, 0.530762f, 0.545898f, 0.560059f, 0.576172f, 0.590820f,
- 0.606445f, 0.621094f, 0.635254f, 0.649902f, 0.663574f, 0.678223f, 0.692383f, 0.706543f,
- 0.720703f, 0.733887f, 0.748535f, 0.762695f, 0.775391f, 0.789551f, 0.801758f, 0.814941f,
- 0.828125f, 0.840332f, 0.913574f, 0.902344f, 0.890625f, 0.881836f, 0.872559f, 0.865234f,
- 0.005402f, 0.016617f, 0.028061f, 0.039948f, 0.051758f, 0.064270f, 0.076782f, 0.089600f,
- 0.102600f, 0.116455f, 0.130371f, 0.144165f, 0.158936f, 0.172607f, 0.187744f, 0.201904f,
- 0.216431f, 0.232422f, 0.247192f, 0.261719f, 0.277100f, 0.292480f, 0.308838f, 0.323975f,
- 0.339355f, 0.355469f, 0.371338f, 0.386230f, 0.402344f, 0.417725f, 0.433350f, 0.448486f,
- 0.464600f, 0.480225f, 0.495361f, 0.510742f, 0.525879f, 0.541992f, 0.557129f, 0.571777f,
- 0.586914f, 0.601562f, 0.616211f, 0.631836f, 0.645508f, 0.661621f, 0.674805f, 0.688965f,
- 0.703125f, 0.717773f, 0.731934f, 0.745605f, 0.757812f, 0.772949f, 0.785156f, 0.799316f,
- 0.812012f, 0.826172f, 0.906738f, 0.896484f, 0.886230f, 0.876465f, 0.868164f, 0.860840f,
- 0.005264f, 0.015457f, 0.026474f, 0.037170f, 0.048157f, 0.059845f, 0.071594f, 0.083984f,
- 0.096191f, 0.109070f, 0.121887f, 0.134766f, 0.148193f, 0.161255f, 0.175781f, 0.189209f,
- 0.203369f, 0.218384f, 0.233032f, 0.247681f, 0.261963f, 0.277100f, 0.292480f, 0.307129f,
- 0.322998f, 0.337891f, 0.352539f, 0.368652f, 0.384033f, 0.399170f, 0.414307f, 0.430420f,
- 0.445801f, 0.460693f, 0.475342f, 0.491211f, 0.506836f, 0.521973f, 0.537598f, 0.551758f,
- 0.567383f, 0.582520f, 0.598145f, 0.612305f, 0.627441f, 0.642090f, 0.656738f, 0.670898f,
- 0.685059f, 0.698730f, 0.713867f, 0.728516f, 0.742188f, 0.755371f, 0.770020f, 0.782715f,
- 0.796387f, 0.810547f, 0.899414f, 0.889648f, 0.879883f, 0.872070f, 0.863770f, 0.856445f,
- 0.004719f, 0.014229f, 0.024384f, 0.034607f, 0.044708f, 0.055756f, 0.066895f, 0.077942f,
- 0.089600f, 0.101624f, 0.113525f, 0.125854f, 0.138428f, 0.151245f, 0.164673f, 0.177734f,
- 0.191650f, 0.205078f, 0.219360f, 0.233154f, 0.247925f, 0.261475f, 0.276367f, 0.291504f,
- 0.305908f, 0.320312f, 0.335449f, 0.350098f, 0.365723f, 0.380615f, 0.395996f, 0.411133f,
- 0.427002f, 0.441895f, 0.456543f, 0.472656f, 0.487793f, 0.502441f, 0.518555f, 0.533203f,
- 0.547852f, 0.562988f, 0.577637f, 0.593262f, 0.607910f, 0.623535f, 0.638184f, 0.652344f,
- 0.666992f, 0.681641f, 0.696777f, 0.711426f, 0.725098f, 0.738281f, 0.753418f, 0.766113f,
- 0.782227f, 0.794922f, 0.892090f, 0.884277f, 0.875000f, 0.866699f, 0.858887f, 0.852539f,
- 0.004280f, 0.013329f, 0.022476f, 0.031982f, 0.042114f, 0.051849f, 0.062225f, 0.072449f,
- 0.083679f, 0.095032f, 0.105530f, 0.117676f, 0.129517f, 0.141357f, 0.154297f, 0.166748f,
- 0.178711f, 0.192505f, 0.205933f, 0.219727f, 0.233521f, 0.247070f, 0.260986f, 0.275391f,
- 0.290039f, 0.303955f, 0.319580f, 0.333740f, 0.347412f, 0.363037f, 0.377686f, 0.392822f,
- 0.408203f, 0.422852f, 0.437988f, 0.453125f, 0.468506f, 0.483398f, 0.498779f, 0.514160f,
- 0.527832f, 0.543945f, 0.559570f, 0.574707f, 0.588867f, 0.604492f, 0.619141f, 0.634277f,
- 0.648438f, 0.663086f, 0.678223f, 0.692383f, 0.707520f, 0.721680f, 0.735352f, 0.749512f,
- 0.764648f, 0.778320f, 0.884277f, 0.877441f, 0.868652f, 0.861328f, 0.854492f, 0.847656f,
- 0.004280f, 0.012138f, 0.021103f, 0.029999f, 0.038940f, 0.048279f, 0.057831f, 0.067566f,
- 0.077454f, 0.087524f, 0.098816f, 0.109558f, 0.120728f, 0.131958f, 0.143799f, 0.155762f,
- 0.168091f, 0.180176f, 0.193359f, 0.206177f, 0.219360f, 0.232910f, 0.246338f, 0.260254f,
- 0.273682f, 0.287598f, 0.302246f, 0.316650f, 0.331299f, 0.344971f, 0.359863f, 0.374268f,
- 0.389648f, 0.404297f, 0.419434f, 0.434326f, 0.449463f, 0.464844f, 0.479492f, 0.494141f,
- 0.509766f, 0.524414f, 0.540039f, 0.555176f, 0.569824f, 0.584961f, 0.600098f, 0.615723f,
- 0.629883f, 0.645508f, 0.659668f, 0.675293f, 0.689453f, 0.704590f, 0.719238f, 0.732422f,
- 0.748535f, 0.762207f, 0.876953f, 0.871582f, 0.863281f, 0.855957f, 0.849609f, 0.842773f,
- 0.003744f, 0.011436f, 0.019348f, 0.027893f, 0.036102f, 0.044739f, 0.053711f, 0.063110f,
- 0.072205f, 0.081970f, 0.091919f, 0.101746f, 0.112732f, 0.122864f, 0.134521f, 0.145996f,
- 0.157715f, 0.169434f, 0.181519f, 0.193848f, 0.206665f, 0.219360f, 0.231445f, 0.245361f,
- 0.259033f, 0.272217f, 0.286621f, 0.299805f, 0.314209f, 0.328125f, 0.342285f, 0.357178f,
- 0.371826f, 0.386475f, 0.400635f, 0.415527f, 0.430420f, 0.445068f, 0.459717f, 0.476074f,
- 0.490234f, 0.505371f, 0.521484f, 0.536133f, 0.551758f, 0.565430f, 0.581543f, 0.595703f,
- 0.611816f, 0.626465f, 0.641602f, 0.656738f, 0.671875f, 0.686523f, 0.701172f, 0.715820f,
- 0.731445f, 0.746582f, 0.868652f, 0.864746f, 0.856934f, 0.851074f, 0.844727f, 0.837891f,
- 0.003595f, 0.011093f, 0.018265f, 0.025711f, 0.033600f, 0.041656f, 0.050140f, 0.058350f,
- 0.067505f, 0.076416f, 0.085632f, 0.095093f, 0.104919f, 0.115295f, 0.125610f, 0.136108f,
- 0.147583f, 0.157959f, 0.169800f, 0.181519f, 0.193359f, 0.205933f, 0.218140f, 0.231323f,
- 0.243652f, 0.257324f, 0.270508f, 0.283447f, 0.297363f, 0.311523f, 0.325928f, 0.339111f,
- 0.353516f, 0.367432f, 0.382812f, 0.396973f, 0.412109f, 0.426758f, 0.441406f, 0.456055f,
- 0.471436f, 0.486328f, 0.501953f, 0.516113f, 0.531738f, 0.546875f, 0.562500f, 0.577637f,
- 0.592773f, 0.607910f, 0.622559f, 0.638184f, 0.653809f, 0.669434f, 0.684082f, 0.699219f,
- 0.714355f, 0.729492f, 0.860840f, 0.857422f, 0.852051f, 0.844727f, 0.839355f, 0.832520f,
- 0.003349f, 0.009933f, 0.016754f, 0.024063f, 0.031204f, 0.038849f, 0.046356f, 0.054413f,
- 0.062744f, 0.070984f, 0.080017f, 0.088989f, 0.097778f, 0.107361f, 0.117004f, 0.127197f,
- 0.137451f, 0.148071f, 0.159180f, 0.169922f, 0.181519f, 0.192993f, 0.204956f, 0.217407f,
- 0.229980f, 0.242188f, 0.254883f, 0.267578f, 0.281494f, 0.294434f, 0.307861f, 0.321533f,
- 0.335693f, 0.350098f, 0.364258f, 0.379150f, 0.393066f, 0.407715f, 0.422607f, 0.437500f,
- 0.452148f, 0.467041f, 0.482422f, 0.497314f, 0.512695f, 0.527832f, 0.542969f, 0.558594f,
- 0.573730f, 0.589844f, 0.604004f, 0.619629f, 0.635254f, 0.651367f, 0.665527f, 0.681152f,
- 0.696289f, 0.711914f, 0.852539f, 0.851562f, 0.846191f, 0.838867f, 0.832520f, 0.827637f,
- 0.003290f, 0.009415f, 0.015976f, 0.022095f, 0.028946f, 0.036255f, 0.043396f, 0.050598f,
- 0.058502f, 0.066284f, 0.074036f, 0.082275f, 0.091187f, 0.099731f, 0.108826f, 0.118652f,
- 0.128296f, 0.137939f, 0.148193f, 0.159302f, 0.170166f, 0.180786f, 0.191895f, 0.203491f,
- 0.215210f, 0.227661f, 0.240112f, 0.252686f, 0.265625f, 0.278564f, 0.291748f, 0.305176f,
- 0.318604f, 0.332764f, 0.346924f, 0.360352f, 0.375000f, 0.389160f, 0.404297f, 0.418213f,
- 0.433105f, 0.448486f, 0.463135f, 0.477783f, 0.493408f, 0.508301f, 0.523438f, 0.540039f,
- 0.554199f, 0.570312f, 0.585938f, 0.601074f, 0.617188f, 0.633301f, 0.648926f, 0.664062f,
- 0.679688f, 0.695312f, 0.844727f, 0.844238f, 0.838867f, 0.833008f, 0.827148f, 0.822266f,
- 0.002913f, 0.008621f, 0.014595f, 0.020950f, 0.027496f, 0.033600f, 0.040558f, 0.047119f,
- 0.054260f, 0.061615f, 0.068970f, 0.076782f, 0.084717f, 0.093140f, 0.101562f, 0.109985f,
- 0.118591f, 0.129150f, 0.138306f, 0.148682f, 0.158447f, 0.169189f, 0.180054f, 0.191162f,
- 0.202148f, 0.213379f, 0.225586f, 0.237305f, 0.250488f, 0.262939f, 0.275391f, 0.288086f,
- 0.302490f, 0.315186f, 0.329346f, 0.342529f, 0.356934f, 0.370117f, 0.385742f, 0.400146f,
- 0.414795f, 0.429199f, 0.444336f, 0.459473f, 0.473389f, 0.489258f, 0.503906f, 0.519531f,
- 0.535645f, 0.551270f, 0.566895f, 0.582520f, 0.598145f, 0.614258f, 0.629395f, 0.645996f,
- 0.661621f, 0.677734f, 0.837402f, 0.836914f, 0.832520f, 0.826660f, 0.821777f, 0.816406f,
- 0.002748f, 0.008018f, 0.014168f, 0.019196f, 0.025040f, 0.031250f, 0.037506f, 0.043732f,
- 0.050415f, 0.057098f, 0.063721f, 0.071167f, 0.078979f, 0.086609f, 0.094299f, 0.102783f,
- 0.111145f, 0.119812f, 0.128296f, 0.138306f, 0.147583f, 0.157593f, 0.168213f, 0.178711f,
- 0.188843f, 0.200317f, 0.211792f, 0.223511f, 0.235352f, 0.247192f, 0.259521f, 0.272461f,
- 0.285156f, 0.298584f, 0.312012f, 0.324707f, 0.339111f, 0.352783f, 0.366943f, 0.381348f,
- 0.395996f, 0.410889f, 0.425537f, 0.439941f, 0.454834f, 0.470459f, 0.485352f, 0.501953f,
- 0.516113f, 0.531738f, 0.547363f, 0.563477f, 0.579102f, 0.595703f, 0.611328f, 0.626953f,
- 0.642578f, 0.659668f, 0.828125f, 0.830566f, 0.825684f, 0.820801f, 0.815430f, 0.811035f,
- 0.002630f, 0.007412f, 0.012978f, 0.018356f, 0.023758f, 0.028931f, 0.034729f, 0.040894f,
- 0.046631f, 0.053101f, 0.059143f, 0.065979f, 0.073669f, 0.080200f, 0.087585f, 0.095276f,
- 0.102844f, 0.111633f, 0.119812f, 0.128296f, 0.137573f, 0.146729f, 0.156128f, 0.166382f,
- 0.176880f, 0.187256f, 0.197998f, 0.209351f, 0.220581f, 0.232422f, 0.244385f, 0.256592f,
- 0.268799f, 0.281982f, 0.294922f, 0.308105f, 0.321045f, 0.334717f, 0.348633f, 0.363525f,
- 0.378174f, 0.391846f, 0.406006f, 0.420898f, 0.436279f, 0.451660f, 0.466064f, 0.481934f,
- 0.496826f, 0.513184f, 0.528320f, 0.543945f, 0.560059f, 0.576660f, 0.592285f, 0.608887f,
- 0.625000f, 0.640625f, 0.819336f, 0.822266f, 0.818848f, 0.813965f, 0.810059f, 0.805664f,
- 0.002201f, 0.007240f, 0.011803f, 0.016617f, 0.021622f, 0.027344f, 0.032288f, 0.037598f,
- 0.043427f, 0.049194f, 0.055267f, 0.061462f, 0.067566f, 0.073853f, 0.080872f, 0.088013f,
- 0.095703f, 0.103821f, 0.111145f, 0.119446f, 0.127563f, 0.136597f, 0.145752f, 0.155273f,
- 0.165039f, 0.174683f, 0.185181f, 0.195801f, 0.206543f, 0.218140f, 0.229370f, 0.241455f,
- 0.253174f, 0.265381f, 0.278564f, 0.291504f, 0.304199f, 0.317383f, 0.331299f, 0.344971f,
- 0.358643f, 0.373291f, 0.386963f, 0.402100f, 0.416016f, 0.431641f, 0.447266f, 0.462646f,
- 0.477295f, 0.493652f, 0.509277f, 0.524902f, 0.541504f, 0.557617f, 0.574219f, 0.589844f,
- 0.605957f, 0.623047f, 0.810059f, 0.814453f, 0.811035f, 0.807129f, 0.803223f, 0.798828f,
- 0.002293f, 0.006927f, 0.010994f, 0.015617f, 0.020584f, 0.025131f, 0.029663f, 0.034760f,
- 0.040192f, 0.045532f, 0.050964f, 0.056793f, 0.062805f, 0.068726f, 0.074890f, 0.081482f,
- 0.088806f, 0.096069f, 0.103333f, 0.110535f, 0.118896f, 0.126709f, 0.135254f, 0.144165f,
- 0.153442f, 0.162720f, 0.172119f, 0.182495f, 0.192749f, 0.203735f, 0.214600f, 0.225952f,
- 0.237793f, 0.250000f, 0.261719f, 0.274170f, 0.287354f, 0.300293f, 0.313477f, 0.326904f,
- 0.340820f, 0.354980f, 0.369385f, 0.383545f, 0.396973f, 0.411865f, 0.427734f, 0.442871f,
- 0.458740f, 0.473633f, 0.489502f, 0.505859f, 0.522461f, 0.537598f, 0.553711f, 0.572754f,
- 0.588379f, 0.604492f, 0.802246f, 0.807617f, 0.804199f, 0.800781f, 0.797363f, 0.792969f,
- 0.002081f, 0.006172f, 0.010460f, 0.014503f, 0.019104f, 0.023163f, 0.027832f, 0.032410f,
- 0.037354f, 0.041992f, 0.047211f, 0.052490f, 0.057831f, 0.063232f, 0.069458f, 0.075317f,
- 0.082153f, 0.088257f, 0.094910f, 0.102295f, 0.110107f, 0.117554f, 0.125122f, 0.133667f,
- 0.142456f, 0.151001f, 0.160767f, 0.169922f, 0.179443f, 0.190430f, 0.200562f, 0.211914f,
- 0.222412f, 0.234009f, 0.245850f, 0.258545f, 0.270752f, 0.283203f, 0.296387f, 0.309082f,
- 0.322998f, 0.336670f, 0.350098f, 0.364990f, 0.378906f, 0.393311f, 0.408936f, 0.423096f,
- 0.438965f, 0.454834f, 0.470703f, 0.486572f, 0.502441f, 0.518555f, 0.534668f, 0.551270f,
- 0.569336f, 0.585938f, 0.792480f, 0.799316f, 0.797363f, 0.793457f, 0.790039f, 0.786621f,
- 0.002028f, 0.005669f, 0.009705f, 0.013565f, 0.017532f, 0.021286f, 0.025574f, 0.030197f,
- 0.034180f, 0.038757f, 0.043488f, 0.048737f, 0.053497f, 0.058594f, 0.064026f, 0.070007f,
- 0.075623f, 0.081360f, 0.088135f, 0.094238f, 0.101379f, 0.108643f, 0.116028f, 0.123718f,
- 0.131592f, 0.140137f, 0.149048f, 0.157715f, 0.167114f, 0.176636f, 0.187012f, 0.197388f,
- 0.208130f, 0.219238f, 0.230347f, 0.241943f, 0.254150f, 0.266113f, 0.279053f, 0.291504f,
- 0.304932f, 0.318848f, 0.332031f, 0.345947f, 0.360107f, 0.375000f, 0.389404f, 0.404541f,
- 0.419922f, 0.434814f, 0.450684f, 0.466553f, 0.482910f, 0.499023f, 0.516113f, 0.533203f,
- 0.550293f, 0.567383f, 0.783203f, 0.790527f, 0.789551f, 0.786621f, 0.783691f, 0.780762f,
- 0.001852f, 0.005554f, 0.008957f, 0.012642f, 0.016296f, 0.020172f, 0.024033f, 0.027878f,
- 0.031677f, 0.035919f, 0.040253f, 0.044952f, 0.049255f, 0.053955f, 0.058960f, 0.063965f,
- 0.069336f, 0.074951f, 0.080933f, 0.087219f, 0.093201f, 0.100159f, 0.106689f, 0.114197f,
- 0.121521f, 0.129517f, 0.137817f, 0.146118f, 0.155151f, 0.164307f, 0.173462f, 0.183472f,
- 0.193970f, 0.204224f, 0.215210f, 0.226562f, 0.238037f, 0.250244f, 0.262451f, 0.274902f,
- 0.287598f, 0.301025f, 0.314209f, 0.327393f, 0.342041f, 0.356445f, 0.370850f, 0.385254f,
- 0.400879f, 0.415771f, 0.431396f, 0.446777f, 0.463379f, 0.480469f, 0.497314f, 0.514160f,
- 0.530273f, 0.547363f, 0.774414f, 0.783203f, 0.782715f, 0.779297f, 0.776367f, 0.773438f,
- 0.001690f, 0.005207f, 0.008278f, 0.011696f, 0.015068f, 0.018784f, 0.022186f, 0.025909f,
- 0.029221f, 0.033508f, 0.037109f, 0.041321f, 0.045471f, 0.049774f, 0.054108f, 0.058838f,
- 0.063843f, 0.069214f, 0.074280f, 0.080078f, 0.086243f, 0.091980f, 0.098083f, 0.105164f,
- 0.111877f, 0.119446f, 0.126953f, 0.134888f, 0.143555f, 0.151978f, 0.161133f, 0.170532f,
- 0.180176f, 0.189697f, 0.200684f, 0.211182f, 0.222412f, 0.234009f, 0.245972f, 0.257568f,
- 0.270508f, 0.282959f, 0.295898f, 0.309570f, 0.323486f, 0.337158f, 0.351562f, 0.366211f,
- 0.381104f, 0.396729f, 0.411865f, 0.427490f, 0.443604f, 0.459961f, 0.477051f, 0.494385f,
- 0.510742f, 0.529297f, 0.763184f, 0.774902f, 0.773438f, 0.771973f, 0.769043f, 0.767578f,
- 0.001528f, 0.004692f, 0.007587f, 0.010956f, 0.014221f, 0.016907f, 0.020218f, 0.023407f,
- 0.027283f, 0.030273f, 0.033997f, 0.038055f, 0.041809f, 0.045959f, 0.049683f, 0.053955f,
- 0.058838f, 0.063171f, 0.068176f, 0.073120f, 0.078491f, 0.084473f, 0.090332f, 0.096619f,
- 0.102905f, 0.109619f, 0.116699f, 0.124207f, 0.131958f, 0.140503f, 0.148438f, 0.157349f,
- 0.166626f, 0.176392f, 0.186157f, 0.196045f, 0.207031f, 0.218018f, 0.229736f, 0.241699f,
- 0.253174f, 0.265381f, 0.278320f, 0.291748f, 0.305176f, 0.318848f, 0.333496f, 0.347412f,
- 0.362305f, 0.376709f, 0.392822f, 0.407715f, 0.424072f, 0.440430f, 0.457031f, 0.473633f,
- 0.491211f, 0.508789f, 0.753906f, 0.766602f, 0.767090f, 0.764160f, 0.761719f, 0.759766f,
- 0.001261f, 0.004250f, 0.007389f, 0.010185f, 0.013023f, 0.015976f, 0.018692f, 0.021713f,
- 0.024734f, 0.028183f, 0.031464f, 0.034943f, 0.038452f, 0.041870f, 0.045410f, 0.049561f,
- 0.054047f, 0.058044f, 0.062164f, 0.067017f, 0.071838f, 0.077332f, 0.082581f, 0.088318f,
- 0.094360f, 0.100525f, 0.107117f, 0.114258f, 0.121643f, 0.128540f, 0.136841f, 0.144897f,
- 0.153931f, 0.162476f, 0.171875f, 0.182007f, 0.192139f, 0.202637f, 0.213623f, 0.224854f,
- 0.237183f, 0.248657f, 0.260986f, 0.274170f, 0.287354f, 0.300781f, 0.314453f, 0.328613f,
- 0.343018f, 0.358643f, 0.373291f, 0.388916f, 0.404785f, 0.420654f, 0.437744f, 0.454590f,
- 0.471924f, 0.489990f, 0.744629f, 0.757812f, 0.757812f, 0.756836f, 0.754395f, 0.752441f,
- 0.001527f, 0.004047f, 0.006680f, 0.009369f, 0.012024f, 0.014618f, 0.017288f, 0.020248f,
- 0.022705f, 0.025803f, 0.028778f, 0.031769f, 0.034912f, 0.038330f, 0.041595f, 0.045166f,
- 0.048737f, 0.052673f, 0.056885f, 0.061218f, 0.065552f, 0.070251f, 0.075012f, 0.080505f,
- 0.086060f, 0.091614f, 0.097656f, 0.104065f, 0.110901f, 0.118225f, 0.125366f, 0.133179f,
- 0.141357f, 0.149902f, 0.158569f, 0.168213f, 0.177734f, 0.187866f, 0.198364f, 0.208984f,
- 0.220581f, 0.232422f, 0.244019f, 0.256836f, 0.269287f, 0.282471f, 0.296143f, 0.309326f,
- 0.324463f, 0.338379f, 0.353760f, 0.368652f, 0.385498f, 0.400635f, 0.417725f, 0.434570f,
- 0.451660f, 0.469482f, 0.733887f, 0.749023f, 0.750977f, 0.749023f, 0.747070f, 0.744629f,
- 0.001313f, 0.003803f, 0.006126f, 0.008507f, 0.011185f, 0.013550f, 0.015839f, 0.018219f,
- 0.021027f, 0.023438f, 0.026520f, 0.029129f, 0.031738f, 0.034821f, 0.037964f, 0.041138f,
- 0.044434f, 0.048035f, 0.051636f, 0.055420f, 0.059540f, 0.063782f, 0.068176f, 0.073181f,
- 0.077881f, 0.083496f, 0.088989f, 0.094849f, 0.101440f, 0.107849f, 0.114441f, 0.121887f,
- 0.129395f, 0.137207f, 0.145874f, 0.154419f, 0.163574f, 0.173462f, 0.183228f, 0.193726f,
- 0.204712f, 0.216064f, 0.227661f, 0.239624f, 0.251709f, 0.264648f, 0.277832f, 0.291504f,
- 0.305664f, 0.320312f, 0.334473f, 0.349854f, 0.365479f, 0.380615f, 0.397217f, 0.414551f,
- 0.432129f, 0.449951f, 0.722656f, 0.740234f, 0.741699f, 0.741211f, 0.739746f, 0.737793f,
- 0.001137f, 0.003654f, 0.005871f, 0.007881f, 0.010262f, 0.012268f, 0.014496f, 0.017059f,
- 0.018890f, 0.021317f, 0.023605f, 0.026291f, 0.029007f, 0.031494f, 0.034515f, 0.036987f,
- 0.040375f, 0.043457f, 0.046936f, 0.050385f, 0.053925f, 0.058044f, 0.061981f, 0.066650f,
- 0.070679f, 0.075562f, 0.080994f, 0.085938f, 0.091919f, 0.098450f, 0.104370f, 0.110840f,
- 0.118164f, 0.125366f, 0.133301f, 0.141357f, 0.150024f, 0.159546f, 0.168457f, 0.178711f,
- 0.189453f, 0.199707f, 0.211060f, 0.222656f, 0.234741f, 0.247314f, 0.260010f, 0.272705f,
- 0.287354f, 0.300781f, 0.315674f, 0.330322f, 0.345947f, 0.362061f, 0.377441f, 0.394775f,
- 0.412109f, 0.429199f, 0.712891f, 0.730957f, 0.733398f, 0.733398f, 0.731445f, 0.729492f,
- 0.001163f, 0.003218f, 0.005329f, 0.007542f, 0.009331f, 0.011330f, 0.013367f, 0.015434f,
- 0.017685f, 0.019714f, 0.021515f, 0.024139f, 0.026062f, 0.028763f, 0.031204f, 0.033722f,
- 0.036163f, 0.039398f, 0.041992f, 0.045624f, 0.048553f, 0.051971f, 0.056000f, 0.059937f,
- 0.063904f, 0.068054f, 0.072876f, 0.077820f, 0.083374f, 0.088623f, 0.094116f, 0.100830f,
- 0.107117f, 0.114197f, 0.121399f, 0.129272f, 0.136963f, 0.145630f, 0.154785f, 0.163696f,
- 0.173828f, 0.184204f, 0.194946f, 0.205933f, 0.217529f, 0.229614f, 0.242676f, 0.255859f,
- 0.269043f, 0.282471f, 0.296387f, 0.311523f, 0.326172f, 0.341553f, 0.357910f, 0.374756f,
- 0.391846f, 0.409180f, 0.701660f, 0.721680f, 0.723633f, 0.724609f, 0.723145f, 0.722656f,
- 0.001008f, 0.003147f, 0.004818f, 0.006882f, 0.008530f, 0.010468f, 0.012390f, 0.013832f,
- 0.016006f, 0.017899f, 0.019608f, 0.021866f, 0.023849f, 0.025940f, 0.027847f, 0.030350f,
- 0.032806f, 0.035187f, 0.037994f, 0.040619f, 0.043732f, 0.046875f, 0.050110f, 0.053833f,
- 0.057617f, 0.061371f, 0.065613f, 0.070068f, 0.074768f, 0.079895f, 0.085144f, 0.090637f,
- 0.096863f, 0.103149f, 0.110107f, 0.116943f, 0.124634f, 0.132568f, 0.140991f, 0.149536f,
- 0.159302f, 0.169189f, 0.179443f, 0.189575f, 0.201538f, 0.213013f, 0.225342f, 0.236938f,
- 0.250244f, 0.264160f, 0.278320f, 0.292236f, 0.307617f, 0.322021f, 0.337891f, 0.354248f,
- 0.371582f, 0.389160f, 0.689941f, 0.712891f, 0.715820f, 0.715820f, 0.715820f, 0.714355f,
- 0.001126f, 0.002708f, 0.004486f, 0.006313f, 0.007927f, 0.009659f, 0.011238f, 0.012833f,
- 0.014435f, 0.015823f, 0.017670f, 0.019485f, 0.021347f, 0.023453f, 0.025101f, 0.027161f,
- 0.029160f, 0.031525f, 0.033752f, 0.036560f, 0.039154f, 0.041687f, 0.044891f, 0.047943f,
- 0.051453f, 0.054871f, 0.058655f, 0.062622f, 0.067078f, 0.071411f, 0.076355f, 0.081665f,
- 0.086792f, 0.092957f, 0.098877f, 0.105713f, 0.112549f, 0.119995f, 0.127563f, 0.135864f,
- 0.144897f, 0.154297f, 0.164185f, 0.173828f, 0.185059f, 0.196045f, 0.208008f, 0.219849f,
- 0.232666f, 0.245483f, 0.259033f, 0.273438f, 0.287842f, 0.302734f, 0.318604f, 0.334473f,
- 0.351318f, 0.369385f, 0.679688f, 0.702637f, 0.707031f, 0.707031f, 0.707031f, 0.705566f,
- 0.000980f, 0.002733f, 0.004021f, 0.005688f, 0.007084f, 0.008553f, 0.010345f, 0.011513f,
- 0.012962f, 0.014297f, 0.015823f, 0.017609f, 0.019119f, 0.020721f, 0.022568f, 0.024200f,
- 0.026291f, 0.028000f, 0.030457f, 0.032410f, 0.034912f, 0.037476f, 0.039734f, 0.042786f,
- 0.045563f, 0.048920f, 0.052185f, 0.055817f, 0.059662f, 0.063660f, 0.067993f, 0.072632f,
- 0.077759f, 0.083191f, 0.088623f, 0.094971f, 0.101135f, 0.107849f, 0.115479f, 0.122864f,
- 0.131592f, 0.139893f, 0.149414f, 0.158447f, 0.169067f, 0.179443f, 0.191040f, 0.202393f,
- 0.214478f, 0.227539f, 0.240723f, 0.255127f, 0.268555f, 0.283447f, 0.298828f, 0.315186f,
- 0.331787f, 0.348389f, 0.667480f, 0.693359f, 0.697754f, 0.698730f, 0.698242f, 0.697754f,
- 0.000870f, 0.002420f, 0.003994f, 0.005165f, 0.006584f, 0.007763f, 0.009209f, 0.010468f,
- 0.011604f, 0.013336f, 0.013977f, 0.015442f, 0.016830f, 0.018509f, 0.020065f, 0.021606f,
- 0.023224f, 0.024933f, 0.026672f, 0.028656f, 0.030914f, 0.033112f, 0.035187f, 0.037689f,
- 0.040344f, 0.043335f, 0.046234f, 0.049438f, 0.052948f, 0.056427f, 0.060394f, 0.064331f,
- 0.069031f, 0.073853f, 0.078735f, 0.084412f, 0.090271f, 0.096436f, 0.103455f, 0.110229f,
- 0.118042f, 0.126099f, 0.134766f, 0.143921f, 0.153198f, 0.163696f, 0.174438f, 0.185913f,
- 0.197754f, 0.210083f, 0.222778f, 0.235962f, 0.250000f, 0.264648f, 0.279053f, 0.294922f,
- 0.311279f, 0.328613f, 0.655273f, 0.684082f, 0.688477f, 0.689941f, 0.689941f, 0.689941f,
- 0.000790f, 0.002153f, 0.003576f, 0.004726f, 0.005966f, 0.007172f, 0.008186f, 0.009453f,
- 0.010521f, 0.011482f, 0.012772f, 0.013771f, 0.015144f, 0.016434f, 0.017792f, 0.019226f,
- 0.020355f, 0.022049f, 0.023666f, 0.025375f, 0.027145f, 0.029297f, 0.030975f, 0.033142f,
- 0.035339f, 0.037964f, 0.040405f, 0.043365f, 0.046478f, 0.049744f, 0.053101f, 0.057068f,
- 0.060944f, 0.065063f, 0.069763f, 0.074646f, 0.079956f, 0.085938f, 0.091675f, 0.098083f,
- 0.105164f, 0.112732f, 0.121033f, 0.129395f, 0.138428f, 0.148560f, 0.158325f, 0.169067f,
- 0.180664f, 0.192139f, 0.205078f, 0.217529f, 0.231934f, 0.246094f, 0.260010f, 0.275391f,
- 0.292236f, 0.309570f, 0.644043f, 0.673340f, 0.678711f, 0.680664f, 0.680664f, 0.680176f,
- 0.000538f, 0.002022f, 0.003185f, 0.004456f, 0.005360f, 0.006321f, 0.007286f, 0.008484f,
- 0.009422f, 0.010185f, 0.011177f, 0.012283f, 0.013191f, 0.014435f, 0.015587f, 0.016769f,
- 0.017914f, 0.019302f, 0.020584f, 0.022171f, 0.023819f, 0.025391f, 0.027222f, 0.028992f,
- 0.030914f, 0.033234f, 0.035461f, 0.037903f, 0.040649f, 0.043396f, 0.046326f, 0.049561f,
- 0.053131f, 0.056946f, 0.061279f, 0.065613f, 0.070374f, 0.075439f, 0.080811f, 0.086731f,
- 0.093140f, 0.100037f, 0.107544f, 0.115662f, 0.124023f, 0.132935f, 0.143066f, 0.153320f,
- 0.163696f, 0.175415f, 0.187012f, 0.200195f, 0.213013f, 0.227173f, 0.241455f, 0.256592f,
- 0.272461f, 0.288330f, 0.632812f, 0.663574f, 0.669434f, 0.670898f, 0.671387f, 0.671875f,
- 0.000686f, 0.001864f, 0.002884f, 0.003883f, 0.004829f, 0.005592f, 0.006504f, 0.007454f,
- 0.008064f, 0.008995f, 0.009850f, 0.010948f, 0.011711f, 0.012581f, 0.013763f, 0.014618f,
- 0.015701f, 0.016953f, 0.018112f, 0.019180f, 0.020691f, 0.021973f, 0.023560f, 0.025192f,
- 0.026962f, 0.028717f, 0.030624f, 0.032959f, 0.035004f, 0.037567f, 0.040314f, 0.043121f,
- 0.046204f, 0.049713f, 0.053284f, 0.057129f, 0.061157f, 0.065796f, 0.071167f, 0.076477f,
- 0.082214f, 0.088379f, 0.095276f, 0.102600f, 0.110596f, 0.118652f, 0.127808f, 0.137817f,
- 0.147705f, 0.158569f, 0.170166f, 0.182251f, 0.195068f, 0.208008f, 0.222656f, 0.237671f,
- 0.252686f, 0.269287f, 0.620605f, 0.653320f, 0.659180f, 0.661621f, 0.663086f, 0.663574f,
- 0.000782f, 0.001828f, 0.002949f, 0.003487f, 0.004421f, 0.005032f, 0.005878f, 0.006557f,
- 0.007332f, 0.008110f, 0.008591f, 0.009537f, 0.010094f, 0.011147f, 0.011864f, 0.012779f,
- 0.013573f, 0.014549f, 0.015625f, 0.016846f, 0.017822f, 0.018936f, 0.020279f, 0.021729f,
- 0.023117f, 0.024704f, 0.026505f, 0.028183f, 0.030289f, 0.032349f, 0.034546f, 0.037109f,
- 0.039703f, 0.042786f, 0.045837f, 0.049133f, 0.053009f, 0.056763f, 0.061584f, 0.066284f,
- 0.071411f, 0.076843f, 0.083191f, 0.089722f, 0.097290f, 0.104919f, 0.113647f, 0.122498f,
- 0.132324f, 0.142578f, 0.153809f, 0.164917f, 0.177612f, 0.190430f, 0.203857f, 0.218506f,
- 0.233887f, 0.249390f, 0.606934f, 0.642578f, 0.649414f, 0.653320f, 0.652832f, 0.654785f,
- 0.000604f, 0.001636f, 0.002550f, 0.003180f, 0.003799f, 0.004498f, 0.005051f, 0.005573f,
- 0.006325f, 0.006836f, 0.007607f, 0.008087f, 0.008820f, 0.009483f, 0.010132f, 0.010918f,
- 0.011665f, 0.012527f, 0.013535f, 0.014297f, 0.015251f, 0.016190f, 0.017288f, 0.018433f,
- 0.019791f, 0.021133f, 0.022400f, 0.023865f, 0.025742f, 0.027664f, 0.029373f, 0.031677f,
- 0.034027f, 0.036255f, 0.039032f, 0.042023f, 0.045197f, 0.048798f, 0.052643f, 0.056824f,
- 0.061493f, 0.066467f, 0.072327f, 0.078308f, 0.084473f, 0.091858f, 0.099609f, 0.108032f,
- 0.117249f, 0.126831f, 0.137451f, 0.148193f, 0.160034f, 0.172729f, 0.186035f, 0.199829f,
- 0.214722f, 0.229980f, 0.596680f, 0.632812f, 0.638672f, 0.642578f, 0.644531f, 0.645020f,
- 0.000447f, 0.001384f, 0.001986f, 0.002697f, 0.003225f, 0.003828f, 0.004501f, 0.005009f,
- 0.005459f, 0.006027f, 0.006474f, 0.006935f, 0.007591f, 0.008217f, 0.008644f, 0.009308f,
- 0.010025f, 0.010498f, 0.011330f, 0.012100f, 0.012909f, 0.013924f, 0.014618f, 0.015610f,
- 0.016739f, 0.017807f, 0.019043f, 0.020340f, 0.021622f, 0.023178f, 0.024979f, 0.026520f,
- 0.028366f, 0.030640f, 0.032959f, 0.035492f, 0.038239f, 0.041260f, 0.044495f, 0.048340f,
- 0.052399f, 0.056732f, 0.061768f, 0.067017f, 0.072754f, 0.079224f, 0.086304f, 0.093994f,
- 0.102478f, 0.111511f, 0.121521f, 0.132080f, 0.143311f, 0.155518f, 0.168213f, 0.181763f,
- 0.196411f, 0.211548f, 0.583008f, 0.621094f, 0.629395f, 0.632324f, 0.634766f, 0.635742f,
- 0.000375f, 0.001324f, 0.001728f, 0.002466f, 0.002872f, 0.003384f, 0.003685f, 0.004185f,
- 0.004845f, 0.005184f, 0.005444f, 0.006130f, 0.006401f, 0.006844f, 0.007446f, 0.007957f,
- 0.008636f, 0.008965f, 0.009659f, 0.010139f, 0.010971f, 0.011742f, 0.012497f, 0.013138f,
- 0.014099f, 0.014992f, 0.015900f, 0.017166f, 0.018143f, 0.019485f, 0.020676f, 0.022156f,
- 0.023697f, 0.025528f, 0.027374f, 0.029556f, 0.031921f, 0.034424f, 0.037445f, 0.040375f,
- 0.044067f, 0.047577f, 0.052155f, 0.056824f, 0.062042f, 0.067688f, 0.074158f, 0.081055f,
- 0.088745f, 0.097351f, 0.106323f, 0.116455f, 0.127075f, 0.138672f, 0.151123f, 0.164062f,
- 0.177856f, 0.192871f, 0.570801f, 0.610840f, 0.619629f, 0.623047f, 0.625488f, 0.625977f,
- 0.000432f, 0.000921f, 0.001664f, 0.002056f, 0.002697f, 0.003061f, 0.003326f, 0.003757f,
- 0.004044f, 0.004379f, 0.004761f, 0.004948f, 0.005463f, 0.005791f, 0.006199f, 0.006752f,
- 0.007229f, 0.007526f, 0.008156f, 0.008621f, 0.009193f, 0.009712f, 0.010330f, 0.010994f,
- 0.011688f, 0.012466f, 0.013374f, 0.014153f, 0.015099f, 0.016083f, 0.017212f, 0.018250f,
- 0.019623f, 0.021210f, 0.022614f, 0.024445f, 0.026321f, 0.028351f, 0.030762f, 0.033325f,
- 0.036377f, 0.039642f, 0.043304f, 0.047485f, 0.051880f, 0.056885f, 0.062469f, 0.068542f,
- 0.075623f, 0.083374f, 0.091919f, 0.101135f, 0.111389f, 0.122559f, 0.134277f, 0.146606f,
- 0.160278f, 0.174683f, 0.557617f, 0.600098f, 0.609375f, 0.612793f, 0.615723f, 0.616699f,
- 0.000255f, 0.000997f, 0.001393f, 0.001908f, 0.002239f, 0.002512f, 0.002720f, 0.003166f,
- 0.003283f, 0.003616f, 0.003866f, 0.004223f, 0.004597f, 0.004795f, 0.005127f, 0.005573f,
- 0.005939f, 0.006359f, 0.006657f, 0.007133f, 0.007687f, 0.008041f, 0.008545f, 0.009087f,
- 0.009636f, 0.010300f, 0.010910f, 0.011757f, 0.012489f, 0.013313f, 0.014153f, 0.014954f,
- 0.016037f, 0.017258f, 0.018555f, 0.019867f, 0.021530f, 0.023239f, 0.025055f, 0.027252f,
- 0.029663f, 0.032379f, 0.035339f, 0.038666f, 0.042664f, 0.047058f, 0.051849f, 0.057465f,
- 0.063416f, 0.070557f, 0.078369f, 0.086731f, 0.096313f, 0.106384f, 0.117798f, 0.129761f,
- 0.143311f, 0.156982f, 0.544922f, 0.588867f, 0.599121f, 0.602539f, 0.605469f, 0.606445f,
- 0.000353f, 0.000879f, 0.001276f, 0.001613f, 0.001785f, 0.002075f, 0.002300f, 0.002501f,
- 0.002808f, 0.003010f, 0.003283f, 0.003487f, 0.003714f, 0.003967f, 0.004269f, 0.004597f,
- 0.004837f, 0.005230f, 0.005512f, 0.005878f, 0.006203f, 0.006626f, 0.007030f, 0.007519f,
- 0.007866f, 0.008354f, 0.009010f, 0.009468f, 0.010017f, 0.010765f, 0.011444f, 0.012291f,
- 0.013100f, 0.014030f, 0.015030f, 0.016098f, 0.017441f, 0.018646f, 0.020157f, 0.021912f,
- 0.023804f, 0.026047f, 0.028488f, 0.031342f, 0.034424f, 0.037994f, 0.042206f, 0.046997f,
- 0.052338f, 0.058533f, 0.065369f, 0.073364f, 0.081787f, 0.091492f, 0.102356f, 0.113647f,
- 0.126343f, 0.139526f, 0.531250f, 0.579102f, 0.587891f, 0.592773f, 0.595703f, 0.596680f,
- 0.000295f, 0.000784f, 0.000912f, 0.001261f, 0.001517f, 0.001761f, 0.001893f, 0.002113f,
- 0.002211f, 0.002432f, 0.002676f, 0.002861f, 0.002993f, 0.003294f, 0.003479f, 0.003700f,
- 0.003933f, 0.004242f, 0.004452f, 0.004745f, 0.004974f, 0.005428f, 0.005642f, 0.006081f,
- 0.006401f, 0.006817f, 0.007240f, 0.007641f, 0.008209f, 0.008667f, 0.009361f, 0.009720f,
- 0.010506f, 0.011261f, 0.012024f, 0.012794f, 0.013840f, 0.014893f, 0.016113f, 0.017395f,
- 0.018860f, 0.020493f, 0.022446f, 0.024658f, 0.027283f, 0.030228f, 0.033691f, 0.037659f,
- 0.042145f, 0.047546f, 0.053467f, 0.060547f, 0.068359f, 0.077332f, 0.087158f, 0.098145f,
- 0.109741f, 0.123230f, 0.517090f, 0.566895f, 0.576660f, 0.581543f, 0.584961f, 0.587402f,
- 0.000247f, 0.000702f, 0.000849f, 0.001033f, 0.001304f, 0.001416f, 0.001576f, 0.001754f,
- 0.001860f, 0.001953f, 0.002104f, 0.002327f, 0.002419f, 0.002651f, 0.002785f, 0.003014f,
- 0.003134f, 0.003315f, 0.003584f, 0.003813f, 0.004078f, 0.004295f, 0.004555f, 0.004784f,
- 0.005013f, 0.005329f, 0.005669f, 0.006069f, 0.006439f, 0.006821f, 0.007381f, 0.007797f,
- 0.008301f, 0.008812f, 0.009430f, 0.010139f, 0.010948f, 0.011642f, 0.012573f, 0.013664f,
- 0.014671f, 0.016052f, 0.017502f, 0.019135f, 0.021255f, 0.023438f, 0.026199f, 0.029312f,
- 0.033203f, 0.037476f, 0.042725f, 0.048828f, 0.055695f, 0.063721f, 0.072937f, 0.082947f,
- 0.094666f, 0.107117f, 0.504883f, 0.555664f, 0.566406f, 0.572754f, 0.574707f, 0.577148f,
- 0.000217f, 0.000516f, 0.000750f, 0.000898f, 0.001011f, 0.001117f, 0.001203f, 0.001307f,
- 0.001470f, 0.001604f, 0.001659f, 0.001750f, 0.001945f, 0.002121f, 0.002249f, 0.002316f,
- 0.002478f, 0.002581f, 0.002832f, 0.003000f, 0.003164f, 0.003334f, 0.003593f, 0.003784f,
- 0.003990f, 0.004196f, 0.004440f, 0.004673f, 0.005035f, 0.005329f, 0.005642f, 0.005981f,
- 0.006462f, 0.006916f, 0.007313f, 0.007805f, 0.008377f, 0.008987f, 0.009727f, 0.010521f,
- 0.011314f, 0.012421f, 0.013466f, 0.014755f, 0.016235f, 0.017914f, 0.019913f, 0.022461f,
- 0.025330f, 0.028778f, 0.033081f, 0.038239f, 0.044189f, 0.051422f, 0.059662f, 0.069336f,
- 0.080200f, 0.091980f, 0.492676f, 0.543945f, 0.555664f, 0.561035f, 0.564453f, 0.566406f,
- 0.000131f, 0.000355f, 0.000605f, 0.000759f, 0.000832f, 0.000904f, 0.001018f, 0.000975f,
- 0.001144f, 0.001235f, 0.001336f, 0.001447f, 0.001518f, 0.001620f, 0.001668f, 0.001835f,
- 0.001901f, 0.002045f, 0.002188f, 0.002270f, 0.002424f, 0.002577f, 0.002707f, 0.002893f,
- 0.003002f, 0.003223f, 0.003407f, 0.003572f, 0.003851f, 0.004017f, 0.004391f, 0.004608f,
- 0.004833f, 0.005203f, 0.005497f, 0.005886f, 0.006351f, 0.006771f, 0.007278f, 0.007858f,
- 0.008560f, 0.009315f, 0.010086f, 0.011078f, 0.012222f, 0.013443f, 0.015022f, 0.016769f,
- 0.018967f, 0.021591f, 0.024780f, 0.028931f, 0.033875f, 0.039734f, 0.047241f, 0.056122f,
- 0.066101f, 0.077637f, 0.477783f, 0.532715f, 0.544922f, 0.551270f, 0.553711f, 0.555664f,
- 0.000245f, 0.000303f, 0.000473f, 0.000498f, 0.000544f, 0.000707f, 0.000700f, 0.000767f,
- 0.000802f, 0.000892f, 0.001021f, 0.001086f, 0.001140f, 0.001260f, 0.001303f, 0.001325f,
- 0.001462f, 0.001553f, 0.001603f, 0.001746f, 0.001816f, 0.001904f, 0.002043f, 0.002127f,
- 0.002254f, 0.002356f, 0.002548f, 0.002672f, 0.002851f, 0.003092f, 0.003265f, 0.003374f,
- 0.003647f, 0.003891f, 0.004097f, 0.004360f, 0.004669f, 0.004997f, 0.005390f, 0.005810f,
- 0.006226f, 0.006756f, 0.007450f, 0.008095f, 0.008934f, 0.009827f, 0.010902f, 0.012268f,
- 0.013840f, 0.015701f, 0.018036f, 0.021072f, 0.024948f, 0.029800f, 0.035980f, 0.043945f,
- 0.053345f, 0.063843f, 0.465576f, 0.520996f, 0.535645f, 0.540039f, 0.543457f, 0.545898f,
- 0.000108f, 0.000275f, 0.000332f, 0.000402f, 0.000462f, 0.000468f, 0.000580f, 0.000522f,
- 0.000616f, 0.000657f, 0.000758f, 0.000762f, 0.000812f, 0.000870f, 0.000945f, 0.000978f,
- 0.001054f, 0.001109f, 0.001179f, 0.001213f, 0.001311f, 0.001371f, 0.001473f, 0.001558f,
- 0.001629f, 0.001718f, 0.001837f, 0.001903f, 0.002016f, 0.002159f, 0.002258f, 0.002478f,
- 0.002548f, 0.002731f, 0.002909f, 0.003086f, 0.003317f, 0.003580f, 0.003885f, 0.004116f,
- 0.004421f, 0.004818f, 0.005264f, 0.005745f, 0.006294f, 0.006966f, 0.007748f, 0.008667f,
- 0.009766f, 0.011086f, 0.012787f, 0.014908f, 0.017746f, 0.021271f, 0.026382f, 0.032990f,
- 0.041199f, 0.051239f, 0.452393f, 0.509277f, 0.522461f, 0.529297f, 0.533203f, 0.535156f,
- 0.000016f, 0.000143f, 0.000244f, 0.000315f, 0.000309f, 0.000391f, 0.000344f, 0.000402f,
- 0.000429f, 0.000517f, 0.000522f, 0.000526f, 0.000546f, 0.000606f, 0.000628f, 0.000705f,
- 0.000692f, 0.000781f, 0.000837f, 0.000868f, 0.000923f, 0.000969f, 0.001013f, 0.001070f,
- 0.001142f, 0.001186f, 0.001273f, 0.001326f, 0.001397f, 0.001534f, 0.001561f, 0.001685f,
- 0.001775f, 0.001873f, 0.002024f, 0.002153f, 0.002272f, 0.002443f, 0.002611f, 0.002800f,
- 0.003014f, 0.003250f, 0.003529f, 0.003868f, 0.004227f, 0.004692f, 0.005192f, 0.005836f,
- 0.006603f, 0.007587f, 0.008751f, 0.010193f, 0.012001f, 0.014610f, 0.018219f, 0.023392f,
- 0.030594f, 0.039795f, 0.437744f, 0.498291f, 0.512207f, 0.517578f, 0.521484f, 0.525391f,
- 0.000102f, 0.000186f, 0.000171f, 0.000181f, 0.000227f, 0.000229f, 0.000231f, 0.000278f,
- 0.000293f, 0.000304f, 0.000314f, 0.000375f, 0.000365f, 0.000411f, 0.000446f, 0.000457f,
- 0.000496f, 0.000513f, 0.000533f, 0.000554f, 0.000603f, 0.000622f, 0.000669f, 0.000708f,
- 0.000757f, 0.000789f, 0.000843f, 0.000875f, 0.000925f, 0.000964f, 0.001037f, 0.001094f,
- 0.001172f, 0.001243f, 0.001324f, 0.001373f, 0.001497f, 0.001570f, 0.001712f, 0.001829f,
- 0.001947f, 0.002123f, 0.002291f, 0.002472f, 0.002703f, 0.003008f, 0.003342f, 0.003757f,
- 0.004204f, 0.004810f, 0.005539f, 0.006554f, 0.007828f, 0.009537f, 0.011894f, 0.015442f,
- 0.021072f, 0.029282f, 0.424561f, 0.486084f, 0.500488f, 0.506836f, 0.512207f, 0.514648f,
- 0.000014f, 0.000127f, 0.000112f, 0.000109f, 0.000143f, 0.000165f, 0.000141f, 0.000180f,
- 0.000185f, 0.000191f, 0.000196f, 0.000203f, 0.000233f, 0.000252f, 0.000260f, 0.000274f,
- 0.000288f, 0.000314f, 0.000328f, 0.000363f, 0.000362f, 0.000374f, 0.000400f, 0.000436f,
- 0.000464f, 0.000501f, 0.000504f, 0.000521f, 0.000563f, 0.000593f, 0.000635f, 0.000671f,
- 0.000712f, 0.000740f, 0.000800f, 0.000837f, 0.000892f, 0.000955f, 0.001030f, 0.001092f,
- 0.001167f, 0.001270f, 0.001369f, 0.001491f, 0.001626f, 0.001769f, 0.001993f, 0.002209f,
- 0.002523f, 0.002863f, 0.003325f, 0.003880f, 0.004715f, 0.005764f, 0.007320f, 0.009468f,
- 0.013344f, 0.020187f, 0.410645f, 0.473877f, 0.489258f, 0.496826f, 0.500488f, 0.503906f,
- 0.000103f, 0.000078f, 0.000067f, 0.000065f, 0.000086f, 0.000085f, 0.000101f, 0.000106f,
- 0.000106f, 0.000107f, 0.000115f, 0.000133f, 0.000118f, 0.000133f, 0.000154f, 0.000150f,
- 0.000167f, 0.000177f, 0.000180f, 0.000190f, 0.000207f, 0.000213f, 0.000228f, 0.000238f,
- 0.000267f, 0.000277f, 0.000287f, 0.000298f, 0.000313f, 0.000325f, 0.000347f, 0.000375f,
- 0.000393f, 0.000405f, 0.000440f, 0.000463f, 0.000486f, 0.000527f, 0.000562f, 0.000599f,
- 0.000639f, 0.000688f, 0.000757f, 0.000807f, 0.000879f, 0.000961f, 0.001059f, 0.001180f,
- 0.001342f, 0.001533f, 0.001762f, 0.002102f, 0.002502f, 0.003128f, 0.004028f, 0.005379f,
- 0.007591f, 0.012505f, 0.397217f, 0.462891f, 0.478760f, 0.485840f, 0.490479f, 0.492676f,
- 0.000087f, 0.000063f, 0.000054f, 0.000048f, 0.000047f, 0.000044f, 0.000046f, 0.000047f,
- 0.000047f, 0.000060f, 0.000053f, 0.000056f, 0.000072f, 0.000060f, 0.000064f, 0.000069f,
- 0.000078f, 0.000085f, 0.000084f, 0.000090f, 0.000094f, 0.000102f, 0.000105f, 0.000111f,
- 0.000116f, 0.000126f, 0.000132f, 0.000150f, 0.000147f, 0.000158f, 0.000167f, 0.000178f,
- 0.000185f, 0.000192f, 0.000211f, 0.000216f, 0.000226f, 0.000246f, 0.000265f, 0.000284f,
- 0.000299f, 0.000325f, 0.000349f, 0.000381f, 0.000415f, 0.000448f, 0.000490f, 0.000544f,
- 0.000612f, 0.000694f, 0.000798f, 0.000943f, 0.001139f, 0.001436f, 0.001870f, 0.002586f,
- 0.003817f, 0.006474f, 0.383545f, 0.450195f, 0.467041f, 0.474365f, 0.478760f, 0.482422f,
- 0.000065f, 0.000045f, 0.000037f, 0.000033f, 0.000030f, 0.000028f, 0.000026f, 0.000025f,
- 0.000024f, 0.000022f, 0.000021f, 0.000025f, 0.000020f, 0.000021f, 0.000025f, 0.000029f,
- 0.000028f, 0.000031f, 0.000033f, 0.000034f, 0.000036f, 0.000041f, 0.000045f, 0.000040f,
- 0.000045f, 0.000049f, 0.000051f, 0.000048f, 0.000055f, 0.000057f, 0.000061f, 0.000066f,
- 0.000072f, 0.000068f, 0.000073f, 0.000078f, 0.000087f, 0.000089f, 0.000097f, 0.000104f,
- 0.000113f, 0.000115f, 0.000128f, 0.000137f, 0.000148f, 0.000160f, 0.000174f, 0.000194f,
- 0.000221f, 0.000248f, 0.000283f, 0.000324f, 0.000396f, 0.000496f, 0.000657f, 0.000928f,
- 0.001479f, 0.002684f, 0.371094f, 0.438477f, 0.455078f, 0.463867f, 0.468750f, 0.471191f,
- 0.000029f, 0.000019f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f,
- 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f,
- 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000007f,
- 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000013f,
- 0.000015f, 0.000017f, 0.000018f, 0.000018f, 0.000020f, 0.000019f, 0.000021f, 0.000024f,
- 0.000024f, 0.000026f, 0.000028f, 0.000031f, 0.000031f, 0.000035f, 0.000040f, 0.000041f,
- 0.000045f, 0.000052f, 0.000059f, 0.000071f, 0.000083f, 0.000099f, 0.000132f, 0.000188f,
- 0.000315f, 0.000712f, 0.356934f, 0.426514f, 0.444824f, 0.452637f, 0.457520f, 0.460938f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000001f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000006f,
- 0.000010f, 0.000027f, 0.343750f, 0.414795f, 0.433105f, 0.441895f, 0.446289f, 0.449951f,
- },
- {
- 0.012436f, 0.037598f, 0.062805f, 0.087891f, 0.113037f, 0.137329f, 0.161621f, 0.185425f,
- 0.209717f, 0.232544f, 0.255371f, 0.278076f, 0.300049f, 0.321289f, 0.343506f, 0.364014f,
- 0.385010f, 0.404785f, 0.424561f, 0.444824f, 0.463623f, 0.482422f, 0.501465f, 0.520020f,
- 0.537598f, 0.554688f, 0.572266f, 0.589355f, 0.605957f, 0.622070f, 0.639648f, 0.655273f,
- 0.670410f, 0.685547f, 0.700684f, 0.715332f, 0.730469f, 0.744629f, 0.758301f, 0.771973f,
- 0.785156f, 0.799316f, 0.812012f, 0.825684f, 0.837891f, 0.850586f, 0.863281f, 0.875000f,
- 0.887207f, 0.898926f, 0.910156f, 0.921387f, 0.933105f, 0.944336f, 0.954102f, 0.964844f,
- 0.976074f, 0.985840f, 0.978027f, 0.947266f, 0.925781f, 0.907715f, 0.892090f, 0.877930f,
- 0.011276f, 0.034546f, 0.058289f, 0.082031f, 0.105469f, 0.128662f, 0.152344f, 0.174805f,
- 0.197876f, 0.219604f, 0.241455f, 0.263672f, 0.284912f, 0.306152f, 0.326416f, 0.347168f,
- 0.366699f, 0.387695f, 0.406494f, 0.426025f, 0.444824f, 0.463379f, 0.481934f, 0.500000f,
- 0.518066f, 0.535645f, 0.552246f, 0.569824f, 0.586426f, 0.603027f, 0.619141f, 0.634766f,
- 0.650391f, 0.666016f, 0.681152f, 0.695801f, 0.710938f, 0.725586f, 0.739258f, 0.753906f,
- 0.768066f, 0.781250f, 0.794922f, 0.807617f, 0.821289f, 0.833496f, 0.846191f, 0.858398f,
- 0.870605f, 0.882812f, 0.894531f, 0.906250f, 0.917480f, 0.929199f, 0.939453f, 0.951660f,
- 0.961426f, 0.972656f, 0.971680f, 0.942871f, 0.921875f, 0.904785f, 0.889160f, 0.875977f,
- 0.010628f, 0.032288f, 0.054932f, 0.076172f, 0.099060f, 0.121216f, 0.142700f, 0.164795f,
- 0.186279f, 0.207642f, 0.229248f, 0.249756f, 0.269531f, 0.291016f, 0.310791f, 0.331543f,
- 0.349609f, 0.369385f, 0.388916f, 0.409180f, 0.427246f, 0.444824f, 0.463135f, 0.480713f,
- 0.499512f, 0.516602f, 0.533203f, 0.550293f, 0.567383f, 0.583496f, 0.599609f, 0.615723f,
- 0.630859f, 0.646973f, 0.661621f, 0.677246f, 0.691895f, 0.705566f, 0.720703f, 0.735352f,
- 0.749512f, 0.763184f, 0.776367f, 0.790039f, 0.803223f, 0.816406f, 0.828613f, 0.842285f,
- 0.854492f, 0.867676f, 0.878418f, 0.890137f, 0.902832f, 0.913086f, 0.925293f, 0.936035f,
- 0.947754f, 0.958008f, 0.964844f, 0.937500f, 0.917480f, 0.901367f, 0.886719f, 0.873535f,
- 0.009926f, 0.030167f, 0.050995f, 0.071594f, 0.092346f, 0.113892f, 0.134399f, 0.154663f,
- 0.175537f, 0.195679f, 0.216309f, 0.235840f, 0.256104f, 0.276611f, 0.295654f, 0.314453f,
- 0.333496f, 0.353027f, 0.370850f, 0.389404f, 0.408936f, 0.427490f, 0.445312f, 0.462891f,
- 0.480225f, 0.497803f, 0.513672f, 0.531250f, 0.547363f, 0.563965f, 0.580078f, 0.597168f,
- 0.612305f, 0.627930f, 0.642578f, 0.658691f, 0.673340f, 0.687500f, 0.702637f, 0.717285f,
- 0.731445f, 0.744629f, 0.758301f, 0.772461f, 0.786133f, 0.799316f, 0.811523f, 0.824707f,
- 0.837891f, 0.849121f, 0.861816f, 0.874023f, 0.887207f, 0.898438f, 0.910156f, 0.920898f,
- 0.932617f, 0.943848f, 0.958008f, 0.932129f, 0.913086f, 0.897461f, 0.883301f, 0.871094f,
- 0.009178f, 0.028107f, 0.047729f, 0.066895f, 0.086182f, 0.106384f, 0.125977f, 0.145386f,
- 0.165527f, 0.184937f, 0.203857f, 0.224121f, 0.242676f, 0.261475f, 0.281006f, 0.300049f,
- 0.318604f, 0.336426f, 0.355469f, 0.372314f, 0.391113f, 0.409424f, 0.426514f, 0.444092f,
- 0.461426f, 0.477783f, 0.495850f, 0.512207f, 0.528809f, 0.544434f, 0.561035f, 0.576660f,
- 0.593262f, 0.608398f, 0.623047f, 0.638184f, 0.655273f, 0.668945f, 0.682617f, 0.697754f,
- 0.712402f, 0.726562f, 0.740234f, 0.753906f, 0.768066f, 0.781250f, 0.794434f, 0.807617f,
- 0.820312f, 0.833496f, 0.845215f, 0.858398f, 0.870605f, 0.881836f, 0.894043f, 0.906738f,
- 0.917480f, 0.928711f, 0.951172f, 0.926758f, 0.909180f, 0.893555f, 0.880859f, 0.868164f,
- 0.008667f, 0.025986f, 0.044922f, 0.062805f, 0.081421f, 0.099854f, 0.118347f, 0.137085f,
- 0.155518f, 0.173828f, 0.193115f, 0.211304f, 0.229858f, 0.248413f, 0.266602f, 0.285400f,
- 0.303223f, 0.321045f, 0.339111f, 0.357178f, 0.373779f, 0.391357f, 0.409424f, 0.426270f,
- 0.443115f, 0.460449f, 0.476807f, 0.494141f, 0.510254f, 0.526855f, 0.541992f, 0.559082f,
- 0.574219f, 0.589355f, 0.605469f, 0.620117f, 0.636230f, 0.649902f, 0.664551f, 0.678711f,
- 0.693848f, 0.707031f, 0.723145f, 0.736328f, 0.750977f, 0.762695f, 0.776855f, 0.790039f,
- 0.803223f, 0.816406f, 0.828613f, 0.842285f, 0.853516f, 0.866211f, 0.878906f, 0.890625f,
- 0.902832f, 0.913574f, 0.944336f, 0.921875f, 0.903809f, 0.889160f, 0.876953f, 0.865234f,
- 0.008057f, 0.024658f, 0.041321f, 0.058411f, 0.075989f, 0.093811f, 0.110535f, 0.128784f,
- 0.146729f, 0.164307f, 0.182007f, 0.200073f, 0.217773f, 0.234619f, 0.252930f, 0.271240f,
- 0.288086f, 0.306152f, 0.322998f, 0.341064f, 0.357910f, 0.374756f, 0.391357f, 0.409180f,
- 0.425293f, 0.442383f, 0.458496f, 0.475342f, 0.491455f, 0.507324f, 0.523438f, 0.539551f,
- 0.555176f, 0.570312f, 0.585938f, 0.601074f, 0.616699f, 0.631836f, 0.646484f, 0.660645f,
- 0.676270f, 0.688477f, 0.704102f, 0.718262f, 0.731445f, 0.745117f, 0.760254f, 0.771484f,
- 0.785156f, 0.799316f, 0.812500f, 0.824707f, 0.836914f, 0.850098f, 0.862793f, 0.874512f,
- 0.886719f, 0.898438f, 0.937500f, 0.915527f, 0.899414f, 0.885254f, 0.872559f, 0.861816f,
- 0.007477f, 0.022919f, 0.038971f, 0.054901f, 0.070801f, 0.087646f, 0.104065f, 0.121155f,
- 0.137573f, 0.155029f, 0.171875f, 0.188721f, 0.206177f, 0.222778f, 0.240112f, 0.257080f,
- 0.274170f, 0.290283f, 0.308350f, 0.324463f, 0.342041f, 0.358154f, 0.375488f, 0.391113f,
- 0.407471f, 0.424561f, 0.440430f, 0.456787f, 0.474121f, 0.489746f, 0.505371f, 0.521484f,
- 0.536133f, 0.552246f, 0.565918f, 0.582031f, 0.597168f, 0.613281f, 0.626953f, 0.642578f,
- 0.656738f, 0.670898f, 0.684570f, 0.699219f, 0.712891f, 0.727539f, 0.741211f, 0.754395f,
- 0.768066f, 0.781738f, 0.794434f, 0.808105f, 0.820312f, 0.833984f, 0.846680f, 0.858887f,
- 0.871582f, 0.883301f, 0.930176f, 0.910156f, 0.894043f, 0.880371f, 0.868652f, 0.858398f,
- 0.007023f, 0.021240f, 0.036224f, 0.051300f, 0.066467f, 0.082092f, 0.097900f, 0.113892f,
- 0.129517f, 0.145752f, 0.161743f, 0.178223f, 0.194702f, 0.210327f, 0.227661f, 0.243408f,
- 0.260986f, 0.276855f, 0.292725f, 0.309814f, 0.326172f, 0.342041f, 0.358398f, 0.375732f,
- 0.391113f, 0.406982f, 0.422852f, 0.438965f, 0.454590f, 0.471191f, 0.486816f, 0.502441f,
- 0.517578f, 0.533203f, 0.548340f, 0.562988f, 0.578613f, 0.593750f, 0.609375f, 0.623535f,
- 0.638184f, 0.652832f, 0.666992f, 0.680664f, 0.695312f, 0.708984f, 0.722656f, 0.736816f,
- 0.750000f, 0.764160f, 0.777344f, 0.789551f, 0.803223f, 0.816895f, 0.830078f, 0.842773f,
- 0.854980f, 0.868652f, 0.922852f, 0.904297f, 0.889160f, 0.875977f, 0.864746f, 0.854492f,
- 0.006458f, 0.019913f, 0.033691f, 0.048126f, 0.062744f, 0.077026f, 0.092224f, 0.106567f,
- 0.122192f, 0.137207f, 0.152222f, 0.167725f, 0.183838f, 0.199951f, 0.215088f, 0.231323f,
- 0.246826f, 0.262695f, 0.279053f, 0.294678f, 0.310547f, 0.326172f, 0.342041f, 0.358887f,
- 0.374268f, 0.389893f, 0.405518f, 0.421143f, 0.437012f, 0.452637f, 0.467773f, 0.483643f,
- 0.499512f, 0.513672f, 0.529785f, 0.545410f, 0.560059f, 0.575195f, 0.590332f, 0.604980f,
- 0.618652f, 0.634277f, 0.648438f, 0.662598f, 0.676270f, 0.690918f, 0.704102f, 0.718750f,
- 0.732422f, 0.745605f, 0.760254f, 0.773438f, 0.786621f, 0.801270f, 0.812988f, 0.826172f,
- 0.839844f, 0.851562f, 0.915527f, 0.897949f, 0.883789f, 0.871094f, 0.860352f, 0.850586f,
- 0.006077f, 0.018921f, 0.031464f, 0.045258f, 0.058411f, 0.072144f, 0.085999f, 0.100220f,
- 0.114258f, 0.129028f, 0.143677f, 0.158691f, 0.173584f, 0.188477f, 0.203247f, 0.219238f,
- 0.234497f, 0.249634f, 0.264893f, 0.280273f, 0.295410f, 0.310791f, 0.326904f, 0.342285f,
- 0.357910f, 0.373535f, 0.388428f, 0.404053f, 0.420166f, 0.435303f, 0.450195f, 0.465332f,
- 0.481201f, 0.496338f, 0.511230f, 0.525879f, 0.540527f, 0.556641f, 0.570312f, 0.585938f,
- 0.600098f, 0.614746f, 0.629883f, 0.644531f, 0.657715f, 0.672363f, 0.687012f, 0.700684f,
- 0.714355f, 0.729004f, 0.742188f, 0.755371f, 0.769531f, 0.782227f, 0.796875f, 0.810059f,
- 0.823242f, 0.836426f, 0.907715f, 0.891602f, 0.877930f, 0.866211f, 0.855957f, 0.846680f,
- 0.005596f, 0.017654f, 0.029587f, 0.041840f, 0.055115f, 0.067871f, 0.080566f, 0.093994f,
- 0.107361f, 0.120911f, 0.134766f, 0.149414f, 0.163452f, 0.177979f, 0.192261f, 0.206787f,
- 0.221191f, 0.236816f, 0.250732f, 0.266113f, 0.281250f, 0.295898f, 0.311279f, 0.326904f,
- 0.342041f, 0.356201f, 0.371826f, 0.387451f, 0.402344f, 0.417236f, 0.432373f, 0.447266f,
- 0.462891f, 0.477539f, 0.492432f, 0.506836f, 0.522949f, 0.536621f, 0.551758f, 0.566895f,
- 0.582031f, 0.596191f, 0.610352f, 0.625488f, 0.640625f, 0.653320f, 0.668457f, 0.682617f,
- 0.696777f, 0.710449f, 0.724609f, 0.739258f, 0.751465f, 0.765625f, 0.780273f, 0.792480f,
- 0.806152f, 0.820801f, 0.899902f, 0.885742f, 0.872070f, 0.861328f, 0.851562f, 0.842285f,
- 0.005451f, 0.016479f, 0.028259f, 0.039856f, 0.051331f, 0.063416f, 0.075867f, 0.088196f,
- 0.100952f, 0.113770f, 0.126953f, 0.140747f, 0.153564f, 0.167847f, 0.181519f, 0.195679f,
- 0.210083f, 0.223633f, 0.237427f, 0.252197f, 0.267334f, 0.281738f, 0.296143f, 0.311035f,
- 0.325928f, 0.340332f, 0.355469f, 0.370361f, 0.385010f, 0.400635f, 0.415039f, 0.429688f,
- 0.444092f, 0.459717f, 0.474121f, 0.489258f, 0.503906f, 0.519043f, 0.533203f, 0.548828f,
- 0.562012f, 0.577637f, 0.591797f, 0.606445f, 0.621582f, 0.635742f, 0.650391f, 0.664551f,
- 0.678223f, 0.692871f, 0.706055f, 0.721191f, 0.733887f, 0.747559f, 0.762207f, 0.775879f,
- 0.791016f, 0.804199f, 0.892090f, 0.878906f, 0.866699f, 0.855957f, 0.846191f, 0.837891f,
- 0.004963f, 0.015343f, 0.026169f, 0.037079f, 0.047943f, 0.059570f, 0.070801f, 0.083008f,
- 0.095093f, 0.106750f, 0.119507f, 0.132080f, 0.145142f, 0.158569f, 0.171143f, 0.184692f,
- 0.198730f, 0.211792f, 0.225830f, 0.239380f, 0.253662f, 0.267578f, 0.281738f, 0.295898f,
- 0.309814f, 0.324219f, 0.340088f, 0.353760f, 0.368164f, 0.383057f, 0.397705f, 0.412842f,
- 0.426758f, 0.441406f, 0.456787f, 0.470947f, 0.485352f, 0.500000f, 0.515137f, 0.529785f,
- 0.543945f, 0.559082f, 0.572754f, 0.588379f, 0.602539f, 0.616699f, 0.631348f, 0.645996f,
- 0.659180f, 0.674805f, 0.689453f, 0.703125f, 0.716797f, 0.729980f, 0.744629f, 0.758789f,
- 0.772461f, 0.786621f, 0.883789f, 0.872070f, 0.860840f, 0.850586f, 0.841309f, 0.833008f,
- 0.004726f, 0.014549f, 0.024109f, 0.034668f, 0.044708f, 0.055573f, 0.066467f, 0.077820f,
- 0.088928f, 0.100342f, 0.112000f, 0.124390f, 0.136230f, 0.148804f, 0.161621f, 0.173950f,
- 0.186768f, 0.200439f, 0.213623f, 0.226074f, 0.239868f, 0.253418f, 0.267090f, 0.281250f,
- 0.295410f, 0.309570f, 0.323486f, 0.337891f, 0.352295f, 0.365967f, 0.381104f, 0.394775f,
- 0.409180f, 0.423828f, 0.438477f, 0.452881f, 0.467773f, 0.481689f, 0.496582f, 0.511230f,
- 0.525391f, 0.539551f, 0.554199f, 0.568848f, 0.583984f, 0.599121f, 0.612305f, 0.627441f,
- 0.641113f, 0.656250f, 0.669922f, 0.684570f, 0.699219f, 0.713379f, 0.727539f, 0.741699f,
- 0.755859f, 0.771484f, 0.875488f, 0.865723f, 0.854492f, 0.845215f, 0.836426f, 0.828613f,
- 0.004452f, 0.013359f, 0.022690f, 0.032745f, 0.042297f, 0.051910f, 0.061920f, 0.072693f,
- 0.083496f, 0.094177f, 0.105408f, 0.116760f, 0.128174f, 0.140137f, 0.151855f, 0.164185f,
- 0.176758f, 0.189087f, 0.201660f, 0.214478f, 0.227173f, 0.240356f, 0.253906f, 0.267578f,
- 0.280273f, 0.294922f, 0.307373f, 0.321045f, 0.336670f, 0.350098f, 0.363770f, 0.378174f,
- 0.392334f, 0.406006f, 0.420410f, 0.434082f, 0.448975f, 0.463623f, 0.478271f, 0.492676f,
- 0.506836f, 0.520996f, 0.536133f, 0.550781f, 0.565430f, 0.580078f, 0.593750f, 0.608887f,
- 0.623047f, 0.638184f, 0.651367f, 0.666016f, 0.681152f, 0.695312f, 0.709473f, 0.723145f,
- 0.738281f, 0.752930f, 0.867676f, 0.858398f, 0.848633f, 0.839355f, 0.831055f, 0.823730f,
- 0.004143f, 0.012794f, 0.021713f, 0.030396f, 0.039551f, 0.048645f, 0.058563f, 0.068176f,
- 0.078308f, 0.088928f, 0.098328f, 0.109924f, 0.120728f, 0.131592f, 0.142944f, 0.154175f,
- 0.165771f, 0.178223f, 0.190186f, 0.202881f, 0.214844f, 0.227417f, 0.240845f, 0.253906f,
- 0.265869f, 0.279541f, 0.293213f, 0.305908f, 0.320068f, 0.333496f, 0.347168f, 0.361816f,
- 0.375000f, 0.389160f, 0.403320f, 0.417236f, 0.431396f, 0.444824f, 0.459473f, 0.473633f,
- 0.488525f, 0.503418f, 0.517578f, 0.532227f, 0.545410f, 0.560547f, 0.575684f, 0.590332f,
- 0.604004f, 0.618652f, 0.632812f, 0.647949f, 0.663086f, 0.676758f, 0.691895f, 0.706543f,
- 0.721191f, 0.735840f, 0.859375f, 0.852539f, 0.842773f, 0.833496f, 0.824707f, 0.818848f,
- 0.003839f, 0.012062f, 0.020126f, 0.028366f, 0.036774f, 0.045593f, 0.054718f, 0.063416f,
- 0.073120f, 0.082825f, 0.092957f, 0.102966f, 0.113464f, 0.123535f, 0.134277f, 0.145020f,
- 0.155762f, 0.167847f, 0.179199f, 0.190796f, 0.202393f, 0.214844f, 0.227417f, 0.239868f,
- 0.252197f, 0.264648f, 0.277588f, 0.291016f, 0.304199f, 0.317383f, 0.330811f, 0.343750f,
- 0.357422f, 0.371826f, 0.385254f, 0.399902f, 0.413574f, 0.427246f, 0.441162f, 0.455566f,
- 0.469971f, 0.484375f, 0.498535f, 0.514160f, 0.527344f, 0.541992f, 0.556152f, 0.570312f,
- 0.585449f, 0.600098f, 0.614746f, 0.629883f, 0.645508f, 0.658203f, 0.673340f, 0.688477f,
- 0.703125f, 0.718262f, 0.851074f, 0.844727f, 0.835938f, 0.827637f, 0.820312f, 0.812988f,
- 0.003786f, 0.011147f, 0.018921f, 0.026550f, 0.034729f, 0.042664f, 0.051117f, 0.060028f,
- 0.068298f, 0.077454f, 0.086914f, 0.096130f, 0.105835f, 0.115662f, 0.126343f, 0.136475f,
- 0.146606f, 0.157715f, 0.168457f, 0.180176f, 0.191528f, 0.202759f, 0.215088f, 0.226929f,
- 0.239014f, 0.251221f, 0.263428f, 0.275391f, 0.289062f, 0.301514f, 0.314941f, 0.328369f,
- 0.341797f, 0.354736f, 0.367676f, 0.382324f, 0.395264f, 0.409912f, 0.423340f, 0.437012f,
- 0.451660f, 0.465576f, 0.480469f, 0.494629f, 0.508301f, 0.522949f, 0.538086f, 0.551758f,
- 0.567383f, 0.582031f, 0.596191f, 0.610840f, 0.625977f, 0.639648f, 0.655273f, 0.670410f,
- 0.685547f, 0.700684f, 0.842285f, 0.837402f, 0.829590f, 0.821289f, 0.813965f, 0.808105f,
- 0.003504f, 0.010445f, 0.017609f, 0.025131f, 0.032349f, 0.040314f, 0.047485f, 0.055756f,
- 0.064026f, 0.072571f, 0.080872f, 0.089661f, 0.099426f, 0.108459f, 0.118286f, 0.127930f,
- 0.137817f, 0.147583f, 0.158203f, 0.169189f, 0.180908f, 0.191040f, 0.203003f, 0.214111f,
- 0.225708f, 0.237549f, 0.249023f, 0.261475f, 0.273926f, 0.286865f, 0.299316f, 0.311768f,
- 0.325684f, 0.338623f, 0.351562f, 0.364746f, 0.378418f, 0.392578f, 0.405518f, 0.419678f,
- 0.433105f, 0.447998f, 0.461670f, 0.475830f, 0.490479f, 0.503906f, 0.519531f, 0.533203f,
- 0.547852f, 0.562988f, 0.576660f, 0.591797f, 0.606445f, 0.622070f, 0.636719f, 0.652344f,
- 0.666504f, 0.682617f, 0.833496f, 0.830078f, 0.822754f, 0.815918f, 0.808594f, 0.802734f,
- 0.003447f, 0.009941f, 0.016373f, 0.023300f, 0.030228f, 0.037689f, 0.044128f, 0.052551f,
- 0.059845f, 0.068115f, 0.076538f, 0.083862f, 0.092896f, 0.101440f, 0.110596f, 0.119995f,
- 0.129028f, 0.138916f, 0.148926f, 0.158936f, 0.169189f, 0.180176f, 0.190308f, 0.201416f,
- 0.212769f, 0.224365f, 0.235962f, 0.247192f, 0.259033f, 0.271973f, 0.283936f, 0.296631f,
- 0.309570f, 0.321777f, 0.334961f, 0.348389f, 0.361572f, 0.374756f, 0.388184f, 0.401611f,
- 0.415771f, 0.429443f, 0.443359f, 0.457520f, 0.471436f, 0.486084f, 0.500977f, 0.514648f,
- 0.528809f, 0.543457f, 0.558594f, 0.573242f, 0.588867f, 0.603516f, 0.617676f, 0.633301f,
- 0.648926f, 0.664551f, 0.824219f, 0.823242f, 0.815918f, 0.809082f, 0.802246f, 0.796387f,
- 0.003141f, 0.009407f, 0.015251f, 0.021851f, 0.028107f, 0.034882f, 0.041779f, 0.048340f,
- 0.056244f, 0.062988f, 0.071106f, 0.078796f, 0.087036f, 0.094910f, 0.103149f, 0.112305f,
- 0.121460f, 0.130371f, 0.139404f, 0.149048f, 0.159180f, 0.169189f, 0.179565f, 0.189087f,
- 0.200317f, 0.211548f, 0.222412f, 0.233765f, 0.245117f, 0.257324f, 0.269043f, 0.281006f,
- 0.293213f, 0.305664f, 0.318848f, 0.331055f, 0.343750f, 0.358398f, 0.369873f, 0.384033f,
- 0.397217f, 0.411865f, 0.424805f, 0.438965f, 0.453125f, 0.467529f, 0.481689f, 0.495850f,
- 0.510254f, 0.524414f, 0.539551f, 0.554688f, 0.569824f, 0.584961f, 0.599121f, 0.614258f,
- 0.629883f, 0.645020f, 0.815430f, 0.814453f, 0.809570f, 0.802734f, 0.796875f, 0.791504f,
- 0.002838f, 0.008461f, 0.014236f, 0.020676f, 0.026749f, 0.032593f, 0.039032f, 0.045715f,
- 0.052216f, 0.059479f, 0.066467f, 0.073608f, 0.080933f, 0.088623f, 0.096619f, 0.104919f,
- 0.113098f, 0.121521f, 0.130493f, 0.139526f, 0.148560f, 0.158203f, 0.167969f, 0.177979f,
- 0.187988f, 0.198730f, 0.208862f, 0.220093f, 0.231323f, 0.242798f, 0.253906f, 0.265869f,
- 0.278320f, 0.289551f, 0.302246f, 0.314941f, 0.327393f, 0.340088f, 0.353516f, 0.365967f,
- 0.379883f, 0.392822f, 0.406738f, 0.420898f, 0.434814f, 0.447998f, 0.462891f, 0.477539f,
- 0.491455f, 0.506836f, 0.520996f, 0.536133f, 0.550781f, 0.565918f, 0.581055f, 0.596680f,
- 0.611816f, 0.627441f, 0.806152f, 0.807617f, 0.801270f, 0.796387f, 0.790039f, 0.784668f,
- 0.002689f, 0.008102f, 0.013618f, 0.019058f, 0.024719f, 0.030548f, 0.036560f, 0.042725f,
- 0.048615f, 0.054779f, 0.061615f, 0.068604f, 0.075012f, 0.082703f, 0.090271f, 0.097900f,
- 0.105530f, 0.113586f, 0.121826f, 0.130371f, 0.139282f, 0.147705f, 0.157349f, 0.166504f,
- 0.176147f, 0.186401f, 0.196289f, 0.207520f, 0.217651f, 0.228394f, 0.239868f, 0.251465f,
- 0.262451f, 0.274414f, 0.286377f, 0.298828f, 0.311035f, 0.323730f, 0.336670f, 0.349121f,
- 0.362549f, 0.375244f, 0.389160f, 0.402344f, 0.417236f, 0.429932f, 0.443848f, 0.458984f,
- 0.472168f, 0.487793f, 0.501953f, 0.517578f, 0.531738f, 0.546875f, 0.561523f, 0.576660f,
- 0.593262f, 0.608398f, 0.797852f, 0.798828f, 0.794922f, 0.789551f, 0.784668f, 0.779297f,
- 0.002666f, 0.007462f, 0.012596f, 0.018066f, 0.023026f, 0.028412f, 0.033813f, 0.039398f,
- 0.045166f, 0.051239f, 0.057587f, 0.063721f, 0.070312f, 0.077148f, 0.084167f, 0.090820f,
- 0.098267f, 0.105591f, 0.113159f, 0.121460f, 0.129761f, 0.138428f, 0.147217f, 0.156128f,
- 0.165283f, 0.174438f, 0.183960f, 0.194092f, 0.204834f, 0.214844f, 0.225830f, 0.236816f,
- 0.247925f, 0.259033f, 0.270752f, 0.282227f, 0.294678f, 0.306641f, 0.319336f, 0.332031f,
- 0.344482f, 0.357910f, 0.371094f, 0.384033f, 0.398682f, 0.412109f, 0.425781f, 0.440186f,
- 0.454102f, 0.468018f, 0.482910f, 0.497314f, 0.512207f, 0.528320f, 0.542969f, 0.558594f,
- 0.573242f, 0.589355f, 0.787598f, 0.791016f, 0.787109f, 0.781738f, 0.777344f, 0.772461f,
- 0.002569f, 0.007069f, 0.012199f, 0.016739f, 0.021393f, 0.026672f, 0.031189f, 0.037109f,
- 0.042480f, 0.047729f, 0.053345f, 0.059387f, 0.065430f, 0.071838f, 0.078186f, 0.084167f,
- 0.091492f, 0.098816f, 0.105774f, 0.112976f, 0.121155f, 0.129028f, 0.136963f, 0.145508f,
- 0.153687f, 0.163086f, 0.172363f, 0.181885f, 0.191406f, 0.201782f, 0.211670f, 0.222412f,
- 0.233032f, 0.244263f, 0.255371f, 0.266846f, 0.278809f, 0.290527f, 0.302734f, 0.314697f,
- 0.327393f, 0.340820f, 0.353027f, 0.366455f, 0.380127f, 0.393799f, 0.406006f, 0.421143f,
- 0.435059f, 0.449707f, 0.463623f, 0.479248f, 0.494141f, 0.509277f, 0.523438f, 0.539551f,
- 0.555176f, 0.570801f, 0.778320f, 0.783203f, 0.779785f, 0.775879f, 0.770996f, 0.767090f,
- 0.002398f, 0.006733f, 0.010918f, 0.015495f, 0.020203f, 0.024963f, 0.029663f, 0.034485f,
- 0.039246f, 0.044678f, 0.049896f, 0.055267f, 0.060486f, 0.066345f, 0.072693f, 0.078857f,
- 0.085083f, 0.091370f, 0.097961f, 0.105530f, 0.112244f, 0.119629f, 0.127563f, 0.135376f,
- 0.143799f, 0.152100f, 0.160889f, 0.169922f, 0.178833f, 0.188843f, 0.198608f, 0.208496f,
- 0.218628f, 0.229492f, 0.240479f, 0.251953f, 0.262695f, 0.274902f, 0.286377f, 0.298340f,
- 0.310547f, 0.323242f, 0.335693f, 0.349365f, 0.362061f, 0.375000f, 0.388916f, 0.402832f,
- 0.416748f, 0.430420f, 0.445068f, 0.459473f, 0.474854f, 0.489258f, 0.504883f, 0.519531f,
- 0.535645f, 0.551758f, 0.769043f, 0.774902f, 0.771973f, 0.768555f, 0.764160f, 0.759766f,
- 0.002062f, 0.006191f, 0.010384f, 0.014786f, 0.018402f, 0.023270f, 0.027435f, 0.031891f,
- 0.036163f, 0.041199f, 0.045685f, 0.051208f, 0.056244f, 0.061371f, 0.066772f, 0.072510f,
- 0.078369f, 0.084656f, 0.091125f, 0.097290f, 0.104309f, 0.111145f, 0.118164f, 0.126221f,
- 0.133301f, 0.141724f, 0.149658f, 0.157837f, 0.167236f, 0.176025f, 0.185547f, 0.195190f,
- 0.205444f, 0.215332f, 0.225830f, 0.236084f, 0.247314f, 0.259033f, 0.270020f, 0.281982f,
- 0.293701f, 0.305908f, 0.318848f, 0.331787f, 0.344482f, 0.357178f, 0.370361f, 0.384521f,
- 0.397461f, 0.411621f, 0.426025f, 0.440674f, 0.455322f, 0.470703f, 0.485596f, 0.500977f,
- 0.517578f, 0.532227f, 0.759277f, 0.766602f, 0.764160f, 0.761230f, 0.757324f, 0.753418f,
- 0.002064f, 0.005859f, 0.009613f, 0.013626f, 0.017456f, 0.021606f, 0.025574f, 0.029526f,
- 0.034302f, 0.038422f, 0.042938f, 0.047485f, 0.052155f, 0.056763f, 0.061951f, 0.067139f,
- 0.072754f, 0.078308f, 0.084167f, 0.090149f, 0.096191f, 0.102722f, 0.109558f, 0.116699f,
- 0.123901f, 0.131104f, 0.139160f, 0.146729f, 0.155273f, 0.163940f, 0.173096f, 0.182129f,
- 0.192017f, 0.201172f, 0.211060f, 0.221558f, 0.232544f, 0.243530f, 0.254150f, 0.266113f,
- 0.277588f, 0.289307f, 0.301758f, 0.313965f, 0.326904f, 0.338867f, 0.352051f, 0.366211f,
- 0.379150f, 0.393066f, 0.407471f, 0.421875f, 0.436768f, 0.450439f, 0.466553f, 0.481201f,
- 0.497314f, 0.513184f, 0.749512f, 0.758301f, 0.756348f, 0.753906f, 0.750000f, 0.746582f,
- 0.001851f, 0.005405f, 0.009109f, 0.012589f, 0.016129f, 0.020020f, 0.023926f, 0.027481f,
- 0.031738f, 0.035492f, 0.039734f, 0.044128f, 0.048065f, 0.052765f, 0.057373f, 0.061859f,
- 0.066711f, 0.072388f, 0.077393f, 0.083130f, 0.088745f, 0.094727f, 0.101135f, 0.107666f,
- 0.114380f, 0.121704f, 0.128540f, 0.136108f, 0.144043f, 0.151733f, 0.160522f, 0.169678f,
- 0.178589f, 0.187622f, 0.197998f, 0.207397f, 0.217285f, 0.227905f, 0.238892f, 0.250000f,
- 0.261230f, 0.272461f, 0.284180f, 0.296387f, 0.308838f, 0.321533f, 0.334473f, 0.347656f,
- 0.361328f, 0.375000f, 0.388672f, 0.402588f, 0.417969f, 0.432617f, 0.447021f, 0.461914f,
- 0.478516f, 0.493652f, 0.739258f, 0.749512f, 0.749023f, 0.745605f, 0.742188f, 0.739746f,
- 0.001666f, 0.005405f, 0.008575f, 0.011696f, 0.015327f, 0.018646f, 0.022293f, 0.025650f,
- 0.029327f, 0.032776f, 0.036530f, 0.040619f, 0.044128f, 0.048828f, 0.052887f, 0.057098f,
- 0.061829f, 0.066467f, 0.071350f, 0.076355f, 0.081909f, 0.087341f, 0.092896f, 0.099304f,
- 0.105469f, 0.112000f, 0.118835f, 0.125977f, 0.133545f, 0.140991f, 0.148438f, 0.156982f,
- 0.165771f, 0.174805f, 0.183960f, 0.193115f, 0.203369f, 0.212891f, 0.223389f, 0.234497f,
- 0.244751f, 0.256348f, 0.268066f, 0.279541f, 0.291260f, 0.303955f, 0.316406f, 0.329590f,
- 0.342529f, 0.355957f, 0.369385f, 0.384766f, 0.398926f, 0.413330f, 0.428467f, 0.442383f,
- 0.458740f, 0.474609f, 0.728516f, 0.740723f, 0.740234f, 0.738281f, 0.735352f, 0.732910f,
- 0.001534f, 0.004936f, 0.007980f, 0.011223f, 0.013893f, 0.017212f, 0.020294f, 0.023361f,
- 0.026688f, 0.030182f, 0.033600f, 0.037537f, 0.040924f, 0.044495f, 0.048340f, 0.052155f,
- 0.056732f, 0.061035f, 0.065430f, 0.069824f, 0.075073f, 0.080078f, 0.085571f, 0.091003f,
- 0.096863f, 0.103271f, 0.109009f, 0.115723f, 0.123230f, 0.129639f, 0.137207f, 0.145264f,
- 0.153320f, 0.161499f, 0.170410f, 0.179688f, 0.189087f, 0.198364f, 0.208740f, 0.218750f,
- 0.229126f, 0.240356f, 0.251465f, 0.263184f, 0.274902f, 0.286621f, 0.299072f, 0.311768f,
- 0.324463f, 0.337402f, 0.351074f, 0.364746f, 0.378662f, 0.394287f, 0.408936f, 0.423096f,
- 0.439453f, 0.455322f, 0.716797f, 0.731934f, 0.732422f, 0.729980f, 0.728027f, 0.725586f,
- 0.001639f, 0.004337f, 0.007439f, 0.009888f, 0.013092f, 0.015717f, 0.018921f, 0.021805f,
- 0.024612f, 0.027542f, 0.030762f, 0.034088f, 0.037598f, 0.041107f, 0.044189f, 0.047699f,
- 0.051666f, 0.055664f, 0.059723f, 0.064148f, 0.068542f, 0.073425f, 0.078003f, 0.083435f,
- 0.088806f, 0.094360f, 0.100159f, 0.106079f, 0.112915f, 0.119690f, 0.125977f, 0.133667f,
- 0.141357f, 0.149414f, 0.157349f, 0.166260f, 0.175049f, 0.184326f, 0.193970f, 0.203735f,
- 0.214355f, 0.224609f, 0.235352f, 0.246460f, 0.257568f, 0.269287f, 0.281738f, 0.294189f,
- 0.305908f, 0.319824f, 0.332520f, 0.346680f, 0.360596f, 0.375244f, 0.389648f, 0.404297f,
- 0.419189f, 0.435791f, 0.707520f, 0.723145f, 0.723633f, 0.722656f, 0.720703f, 0.717773f,
- 0.001469f, 0.004345f, 0.006844f, 0.009483f, 0.012428f, 0.014679f, 0.017166f, 0.019989f,
- 0.022949f, 0.025574f, 0.028320f, 0.031525f, 0.034088f, 0.037323f, 0.040710f, 0.043762f,
- 0.047119f, 0.050873f, 0.054352f, 0.058441f, 0.062561f, 0.066711f, 0.071167f, 0.075989f,
- 0.080627f, 0.086426f, 0.091553f, 0.097473f, 0.103210f, 0.109680f, 0.115723f, 0.122986f,
- 0.129761f, 0.137451f, 0.145142f, 0.153198f, 0.161621f, 0.170654f, 0.179688f, 0.189087f,
- 0.198730f, 0.209229f, 0.219604f, 0.230225f, 0.241211f, 0.252197f, 0.264404f, 0.276367f,
- 0.288574f, 0.301270f, 0.314453f, 0.328125f, 0.341309f, 0.354980f, 0.370117f, 0.385498f,
- 0.399902f, 0.415771f, 0.696289f, 0.714355f, 0.715820f, 0.714355f, 0.712891f, 0.710449f,
- 0.001227f, 0.003862f, 0.006245f, 0.008644f, 0.010796f, 0.013344f, 0.015823f, 0.018448f,
- 0.020645f, 0.023331f, 0.025681f, 0.028305f, 0.030975f, 0.033722f, 0.036987f, 0.039673f,
- 0.043121f, 0.046112f, 0.049774f, 0.053406f, 0.056854f, 0.060760f, 0.064697f, 0.069397f,
- 0.073364f, 0.078369f, 0.083313f, 0.088257f, 0.094116f, 0.100098f, 0.105957f, 0.112122f,
- 0.118774f, 0.125854f, 0.133057f, 0.140869f, 0.148682f, 0.157227f, 0.165405f, 0.174927f,
- 0.184082f, 0.193726f, 0.204102f, 0.214111f, 0.225098f, 0.236328f, 0.247314f, 0.259277f,
- 0.270752f, 0.282959f, 0.296143f, 0.309082f, 0.322510f, 0.336426f, 0.350830f, 0.365479f,
- 0.380371f, 0.396240f, 0.684570f, 0.705078f, 0.706543f, 0.706543f, 0.705078f, 0.703125f,
- 0.001069f, 0.003525f, 0.006062f, 0.008286f, 0.010178f, 0.012589f, 0.014542f, 0.017075f,
- 0.019241f, 0.021179f, 0.023499f, 0.026047f, 0.028137f, 0.030762f, 0.033417f, 0.035889f,
- 0.038757f, 0.041779f, 0.044586f, 0.048309f, 0.051056f, 0.054810f, 0.058777f, 0.062347f,
- 0.066528f, 0.070740f, 0.075256f, 0.080261f, 0.085205f, 0.090393f, 0.095886f, 0.102478f,
- 0.108154f, 0.114441f, 0.121399f, 0.128784f, 0.135742f, 0.144165f, 0.151978f, 0.160767f,
- 0.169434f, 0.178833f, 0.188721f, 0.198608f, 0.208984f, 0.220215f, 0.230957f, 0.241943f,
- 0.253906f, 0.265869f, 0.278564f, 0.291260f, 0.304443f, 0.318359f, 0.332031f, 0.346680f,
- 0.361572f, 0.377197f, 0.673828f, 0.695801f, 0.698242f, 0.697754f, 0.697266f, 0.695312f,
- 0.001211f, 0.003250f, 0.005112f, 0.007195f, 0.009651f, 0.011414f, 0.013641f, 0.015205f,
- 0.017334f, 0.019608f, 0.021164f, 0.023712f, 0.025726f, 0.027863f, 0.029984f, 0.032410f,
- 0.035034f, 0.037689f, 0.040466f, 0.042938f, 0.046478f, 0.049591f, 0.052856f, 0.056274f,
- 0.060089f, 0.063721f, 0.068115f, 0.072266f, 0.076904f, 0.081970f, 0.087036f, 0.092285f,
- 0.097961f, 0.104309f, 0.110535f, 0.117126f, 0.124084f, 0.131226f, 0.139038f, 0.147095f,
- 0.155884f, 0.164429f, 0.174194f, 0.183228f, 0.192749f, 0.203491f, 0.214233f, 0.224976f,
- 0.236206f, 0.247925f, 0.260498f, 0.272705f, 0.285889f, 0.299805f, 0.312988f, 0.327637f,
- 0.342529f, 0.356934f, 0.662598f, 0.686523f, 0.689453f, 0.689453f, 0.688965f, 0.687500f,
- 0.001138f, 0.003206f, 0.005180f, 0.007309f, 0.008377f, 0.010635f, 0.012352f, 0.014153f,
- 0.015640f, 0.017487f, 0.019272f, 0.021164f, 0.023026f, 0.025314f, 0.027222f, 0.029282f,
- 0.031433f, 0.033600f, 0.036041f, 0.038788f, 0.041626f, 0.044281f, 0.047455f, 0.050507f,
- 0.054047f, 0.057556f, 0.061188f, 0.065063f, 0.069214f, 0.073486f, 0.078369f, 0.083191f,
- 0.088196f, 0.093811f, 0.099609f, 0.106018f, 0.112305f, 0.119385f, 0.126343f, 0.134033f,
- 0.142090f, 0.150635f, 0.159546f, 0.168579f, 0.177734f, 0.187500f, 0.198242f, 0.208618f,
- 0.219604f, 0.231812f, 0.242188f, 0.254883f, 0.267578f, 0.281494f, 0.294434f, 0.308350f,
- 0.322998f, 0.338379f, 0.651367f, 0.676758f, 0.681152f, 0.680664f, 0.680664f, 0.679688f,
- 0.000977f, 0.002806f, 0.004559f, 0.006176f, 0.008034f, 0.009476f, 0.011131f, 0.012741f,
- 0.014275f, 0.015732f, 0.017334f, 0.019104f, 0.020767f, 0.022293f, 0.024323f, 0.026016f,
- 0.028198f, 0.030197f, 0.032257f, 0.034515f, 0.036957f, 0.039856f, 0.042084f, 0.044891f,
- 0.047791f, 0.051147f, 0.054535f, 0.058197f, 0.061768f, 0.065674f, 0.069946f, 0.074585f,
- 0.079102f, 0.084412f, 0.089600f, 0.095398f, 0.101196f, 0.107544f, 0.114258f, 0.121094f,
- 0.128662f, 0.137085f, 0.145020f, 0.153687f, 0.162720f, 0.172607f, 0.182129f, 0.192749f,
- 0.203125f, 0.214111f, 0.226074f, 0.237671f, 0.249878f, 0.262207f, 0.275635f, 0.289551f,
- 0.304199f, 0.318848f, 0.639160f, 0.666992f, 0.671387f, 0.671875f, 0.671875f, 0.671387f,
- 0.000968f, 0.002722f, 0.004318f, 0.005634f, 0.007393f, 0.008667f, 0.010139f, 0.011383f,
- 0.012856f, 0.014389f, 0.015427f, 0.016907f, 0.018387f, 0.020081f, 0.021683f, 0.023315f,
- 0.025085f, 0.026840f, 0.028641f, 0.030624f, 0.032837f, 0.035065f, 0.037445f, 0.039948f,
- 0.042542f, 0.045410f, 0.048340f, 0.051514f, 0.054840f, 0.058502f, 0.062408f, 0.066223f,
- 0.070679f, 0.075134f, 0.080078f, 0.085388f, 0.090515f, 0.096436f, 0.102722f, 0.109314f,
- 0.116333f, 0.123352f, 0.131592f, 0.139526f, 0.147949f, 0.156860f, 0.166748f, 0.176758f,
- 0.187134f, 0.197632f, 0.209106f, 0.220337f, 0.232666f, 0.244751f, 0.257568f, 0.270996f,
- 0.284912f, 0.300537f, 0.627441f, 0.657227f, 0.662598f, 0.663574f, 0.663574f, 0.663086f,
- 0.001081f, 0.002466f, 0.003862f, 0.005348f, 0.006447f, 0.007927f, 0.009018f, 0.010490f,
- 0.011436f, 0.012627f, 0.013916f, 0.015015f, 0.016449f, 0.017563f, 0.019165f, 0.020706f,
- 0.021973f, 0.023834f, 0.025467f, 0.027130f, 0.029175f, 0.030991f, 0.033081f, 0.035156f,
- 0.037384f, 0.040039f, 0.042603f, 0.045502f, 0.048492f, 0.051636f, 0.054962f, 0.058716f,
- 0.062439f, 0.066467f, 0.071045f, 0.075378f, 0.080811f, 0.085815f, 0.091492f, 0.098022f,
- 0.103943f, 0.111023f, 0.118164f, 0.125732f, 0.133911f, 0.142456f, 0.151367f, 0.161011f,
- 0.170898f, 0.181396f, 0.192139f, 0.203247f, 0.214844f, 0.227173f, 0.239380f, 0.252441f,
- 0.266602f, 0.281006f, 0.616699f, 0.647949f, 0.653320f, 0.655273f, 0.654785f, 0.655273f,
- 0.000735f, 0.002331f, 0.003601f, 0.005005f, 0.005825f, 0.007061f, 0.008049f, 0.009148f,
- 0.010315f, 0.011131f, 0.012230f, 0.013367f, 0.014328f, 0.015541f, 0.016968f, 0.018234f,
- 0.019257f, 0.020798f, 0.022202f, 0.023666f, 0.025452f, 0.027115f, 0.028885f, 0.030792f,
- 0.032715f, 0.035034f, 0.037323f, 0.039825f, 0.042419f, 0.045258f, 0.048157f, 0.051422f,
- 0.054810f, 0.058411f, 0.062378f, 0.066528f, 0.071106f, 0.076233f, 0.081116f, 0.086853f,
- 0.092407f, 0.098938f, 0.105469f, 0.112854f, 0.120361f, 0.128418f, 0.136841f, 0.145752f,
- 0.155273f, 0.165283f, 0.175537f, 0.186646f, 0.197510f, 0.209473f, 0.221558f, 0.234619f,
- 0.248047f, 0.261719f, 0.603516f, 0.636719f, 0.644531f, 0.645020f, 0.645508f, 0.646484f,
- 0.000837f, 0.002073f, 0.003357f, 0.004292f, 0.005409f, 0.006271f, 0.007271f, 0.007973f,
- 0.008873f, 0.009956f, 0.010811f, 0.012032f, 0.012848f, 0.013664f, 0.014870f, 0.015839f,
- 0.017090f, 0.018280f, 0.019333f, 0.020691f, 0.022186f, 0.023453f, 0.025223f, 0.026779f,
- 0.028595f, 0.030441f, 0.032410f, 0.034729f, 0.036743f, 0.039307f, 0.042023f, 0.044434f,
- 0.047791f, 0.050781f, 0.054413f, 0.058075f, 0.061951f, 0.066711f, 0.071106f, 0.076355f,
- 0.081848f, 0.087341f, 0.093872f, 0.099854f, 0.107483f, 0.114441f, 0.122925f, 0.131104f,
- 0.140381f, 0.149414f, 0.159180f, 0.170166f, 0.181152f, 0.192139f, 0.204468f, 0.216553f,
- 0.230103f, 0.244507f, 0.592773f, 0.626953f, 0.635254f, 0.637207f, 0.636719f, 0.637695f,
- 0.000524f, 0.001863f, 0.003014f, 0.003777f, 0.004852f, 0.005516f, 0.006428f, 0.007111f,
- 0.008095f, 0.008888f, 0.009476f, 0.010345f, 0.011063f, 0.012016f, 0.012810f, 0.013786f,
- 0.014648f, 0.015717f, 0.016891f, 0.017929f, 0.019150f, 0.020401f, 0.021606f, 0.023193f,
- 0.024597f, 0.026276f, 0.027939f, 0.029770f, 0.031738f, 0.033936f, 0.036194f, 0.038574f,
- 0.041107f, 0.043945f, 0.047180f, 0.050385f, 0.054291f, 0.057770f, 0.061981f, 0.066345f,
- 0.071167f, 0.076355f, 0.082153f, 0.088074f, 0.094666f, 0.101685f, 0.109131f, 0.117249f,
- 0.125610f, 0.134399f, 0.143921f, 0.154175f, 0.164795f, 0.175659f, 0.187256f, 0.199341f,
- 0.211670f, 0.225464f, 0.580078f, 0.617676f, 0.625000f, 0.627930f, 0.628906f, 0.628906f,
- 0.000657f, 0.001829f, 0.002909f, 0.003525f, 0.004295f, 0.005051f, 0.005592f, 0.006123f,
- 0.006920f, 0.007553f, 0.008339f, 0.008888f, 0.009689f, 0.010262f, 0.011017f, 0.011848f,
- 0.012634f, 0.013489f, 0.014572f, 0.015427f, 0.016449f, 0.017426f, 0.018539f, 0.019852f,
- 0.021133f, 0.022507f, 0.023834f, 0.025375f, 0.027084f, 0.028976f, 0.030792f, 0.032959f,
- 0.035400f, 0.037720f, 0.040405f, 0.043243f, 0.046356f, 0.049530f, 0.053314f, 0.057190f,
- 0.061554f, 0.066223f, 0.071472f, 0.076782f, 0.082825f, 0.089417f, 0.096191f, 0.103210f,
- 0.111633f, 0.119934f, 0.128662f, 0.138550f, 0.148315f, 0.158813f, 0.170288f, 0.182373f,
- 0.194458f, 0.207642f, 0.567383f, 0.606445f, 0.615234f, 0.619141f, 0.620117f, 0.620117f,
- 0.000584f, 0.001548f, 0.002333f, 0.003086f, 0.003660f, 0.004303f, 0.005020f, 0.005543f,
- 0.006042f, 0.006538f, 0.007118f, 0.007641f, 0.008301f, 0.008919f, 0.009499f, 0.010147f,
- 0.010918f, 0.011414f, 0.012222f, 0.013084f, 0.013901f, 0.014954f, 0.015671f, 0.016724f,
- 0.017914f, 0.019012f, 0.020325f, 0.021698f, 0.022949f, 0.024445f, 0.026215f, 0.027954f,
- 0.029755f, 0.032043f, 0.034210f, 0.036591f, 0.039215f, 0.042297f, 0.045441f, 0.048676f,
- 0.052612f, 0.056580f, 0.061432f, 0.066040f, 0.071350f, 0.077332f, 0.083496f, 0.090393f,
- 0.097717f, 0.105835f, 0.114380f, 0.123413f, 0.133301f, 0.143066f, 0.153931f, 0.165039f,
- 0.177124f, 0.190308f, 0.555176f, 0.597656f, 0.604980f, 0.609375f, 0.609863f, 0.611328f,
- 0.000438f, 0.001456f, 0.001925f, 0.002811f, 0.003246f, 0.003731f, 0.004108f, 0.004669f,
- 0.005344f, 0.005535f, 0.005913f, 0.006641f, 0.007038f, 0.007473f, 0.008049f, 0.008675f,
- 0.009361f, 0.009689f, 0.010513f, 0.011032f, 0.011894f, 0.012695f, 0.013390f, 0.014183f,
- 0.015114f, 0.016037f, 0.016998f, 0.018280f, 0.019272f, 0.020645f, 0.022003f, 0.023361f,
- 0.024796f, 0.026779f, 0.028656f, 0.030685f, 0.032928f, 0.035370f, 0.038147f, 0.040955f,
- 0.044403f, 0.047821f, 0.052032f, 0.056183f, 0.060974f, 0.066162f, 0.071777f, 0.078125f,
- 0.084656f, 0.092102f, 0.100159f, 0.109009f, 0.117981f, 0.127563f, 0.138306f, 0.148804f,
- 0.160645f, 0.173218f, 0.542969f, 0.586914f, 0.594727f, 0.599609f, 0.601074f, 0.601074f,
- 0.000520f, 0.001104f, 0.001921f, 0.002256f, 0.002886f, 0.003389f, 0.003689f, 0.004063f,
- 0.004440f, 0.004829f, 0.005230f, 0.005466f, 0.005966f, 0.006332f, 0.006786f, 0.007347f,
- 0.007835f, 0.008232f, 0.008812f, 0.009216f, 0.009865f, 0.010490f, 0.011124f, 0.011803f,
- 0.012573f, 0.013390f, 0.014275f, 0.015121f, 0.016144f, 0.016953f, 0.018234f, 0.019257f,
- 0.020782f, 0.022064f, 0.023743f, 0.025360f, 0.027176f, 0.029327f, 0.031616f, 0.034058f,
- 0.036957f, 0.039917f, 0.043182f, 0.047272f, 0.051025f, 0.055695f, 0.060913f, 0.066345f,
- 0.072693f, 0.079285f, 0.086548f, 0.094543f, 0.103271f, 0.112793f, 0.122864f, 0.132812f,
- 0.144531f, 0.156616f, 0.530273f, 0.576660f, 0.585449f, 0.590332f, 0.592285f, 0.593262f,
- 0.000366f, 0.001040f, 0.001583f, 0.002129f, 0.002522f, 0.002792f, 0.003012f, 0.003420f,
- 0.003630f, 0.003967f, 0.004246f, 0.004623f, 0.005039f, 0.005253f, 0.005627f, 0.006096f,
- 0.006447f, 0.006939f, 0.007179f, 0.007710f, 0.008324f, 0.008698f, 0.009247f, 0.009796f,
- 0.010414f, 0.011063f, 0.011627f, 0.012543f, 0.013191f, 0.014099f, 0.014938f, 0.015930f,
- 0.016983f, 0.018219f, 0.019440f, 0.020813f, 0.022324f, 0.024002f, 0.025818f, 0.027969f,
- 0.030289f, 0.032898f, 0.035583f, 0.038727f, 0.042450f, 0.046234f, 0.050781f, 0.055695f,
- 0.061157f, 0.067383f, 0.074158f, 0.081360f, 0.089478f, 0.098267f, 0.107788f, 0.117737f,
- 0.129028f, 0.140503f, 0.517578f, 0.566406f, 0.575195f, 0.581055f, 0.582520f, 0.584473f,
- 0.000482f, 0.001008f, 0.001481f, 0.001818f, 0.002001f, 0.002296f, 0.002569f, 0.002781f,
- 0.002998f, 0.003319f, 0.003620f, 0.003828f, 0.004082f, 0.004364f, 0.004658f, 0.004978f,
- 0.005257f, 0.005665f, 0.005993f, 0.006340f, 0.006725f, 0.007160f, 0.007576f, 0.008095f,
- 0.008522f, 0.008980f, 0.009621f, 0.010170f, 0.010765f, 0.011543f, 0.012161f, 0.013023f,
- 0.013840f, 0.014801f, 0.015869f, 0.016861f, 0.018127f, 0.019379f, 0.020859f, 0.022583f,
- 0.024261f, 0.026596f, 0.028839f, 0.031555f, 0.034271f, 0.037628f, 0.041504f, 0.045837f,
- 0.050598f, 0.056000f, 0.062134f, 0.068726f, 0.076172f, 0.084656f, 0.093567f, 0.103088f,
- 0.113586f, 0.125000f, 0.504883f, 0.554688f, 0.565918f, 0.570801f, 0.573242f, 0.574219f,
- 0.000400f, 0.000803f, 0.001046f, 0.001427f, 0.001657f, 0.001952f, 0.002033f, 0.002337f,
- 0.002453f, 0.002678f, 0.002871f, 0.003120f, 0.003286f, 0.003605f, 0.003817f, 0.004036f,
- 0.004299f, 0.004604f, 0.004848f, 0.005142f, 0.005428f, 0.005871f, 0.006107f, 0.006584f,
- 0.006908f, 0.007332f, 0.007736f, 0.008186f, 0.008820f, 0.009308f, 0.009964f, 0.010422f,
- 0.011200f, 0.011993f, 0.012726f, 0.013512f, 0.014511f, 0.015610f, 0.016724f, 0.017914f,
- 0.019440f, 0.021057f, 0.022827f, 0.024933f, 0.027466f, 0.030197f, 0.033295f, 0.036896f,
- 0.041077f, 0.045776f, 0.050995f, 0.056976f, 0.063721f, 0.071167f, 0.079773f, 0.089172f,
- 0.098633f, 0.109314f, 0.491699f, 0.543457f, 0.555176f, 0.561035f, 0.563477f, 0.565430f,
- 0.000279f, 0.000821f, 0.000974f, 0.001161f, 0.001382f, 0.001583f, 0.001670f, 0.001934f,
- 0.002064f, 0.002153f, 0.002306f, 0.002544f, 0.002670f, 0.002909f, 0.003052f, 0.003288f,
- 0.003429f, 0.003624f, 0.003893f, 0.004082f, 0.004406f, 0.004635f, 0.004925f, 0.005196f,
- 0.005444f, 0.005764f, 0.006134f, 0.006546f, 0.006947f, 0.007343f, 0.007858f, 0.008270f,
- 0.008858f, 0.009346f, 0.010010f, 0.010757f, 0.011475f, 0.012260f, 0.013206f, 0.014214f,
- 0.015236f, 0.016479f, 0.017975f, 0.019623f, 0.021515f, 0.023590f, 0.026062f, 0.028976f,
- 0.032471f, 0.036224f, 0.040833f, 0.046082f, 0.052094f, 0.059052f, 0.066650f, 0.075684f,
- 0.084778f, 0.094971f, 0.479492f, 0.532715f, 0.545898f, 0.551270f, 0.553711f, 0.555664f,
- 0.000253f, 0.000612f, 0.000835f, 0.000998f, 0.001111f, 0.001228f, 0.001334f, 0.001452f,
- 0.001619f, 0.001757f, 0.001837f, 0.001920f, 0.002140f, 0.002321f, 0.002453f, 0.002544f,
- 0.002670f, 0.002790f, 0.003086f, 0.003260f, 0.003422f, 0.003620f, 0.003893f, 0.004101f,
- 0.004326f, 0.004528f, 0.004761f, 0.005051f, 0.005444f, 0.005756f, 0.006065f, 0.006435f,
- 0.006882f, 0.007378f, 0.007763f, 0.008286f, 0.008865f, 0.009506f, 0.010162f, 0.011024f,
- 0.011826f, 0.012917f, 0.013916f, 0.015175f, 0.016602f, 0.018204f, 0.020035f, 0.022293f,
- 0.024948f, 0.028076f, 0.031921f, 0.036377f, 0.041565f, 0.047577f, 0.054535f, 0.062622f,
- 0.071777f, 0.081787f, 0.465576f, 0.522461f, 0.535645f, 0.541992f, 0.544922f, 0.546875f,
- 0.000155f, 0.000398f, 0.000680f, 0.000828f, 0.000907f, 0.000989f, 0.001113f, 0.001081f,
- 0.001253f, 0.001350f, 0.001453f, 0.001573f, 0.001661f, 0.001777f, 0.001829f, 0.001978f,
- 0.002062f, 0.002216f, 0.002346f, 0.002470f, 0.002644f, 0.002804f, 0.002930f, 0.003134f,
- 0.003265f, 0.003485f, 0.003674f, 0.003866f, 0.004154f, 0.004333f, 0.004707f, 0.004910f,
- 0.005180f, 0.005581f, 0.005875f, 0.006283f, 0.006729f, 0.007164f, 0.007713f, 0.008270f,
- 0.008934f, 0.009727f, 0.010513f, 0.011482f, 0.012520f, 0.013710f, 0.015152f, 0.016815f,
- 0.018799f, 0.021118f, 0.024048f, 0.027756f, 0.032104f, 0.037201f, 0.043518f, 0.050903f,
- 0.059418f, 0.068420f, 0.453125f, 0.511719f, 0.525391f, 0.530762f, 0.535156f, 0.536621f,
- 0.000303f, 0.000337f, 0.000498f, 0.000560f, 0.000603f, 0.000721f, 0.000782f, 0.000845f,
- 0.000880f, 0.000988f, 0.001119f, 0.001184f, 0.001258f, 0.001377f, 0.001420f, 0.001446f,
- 0.001590f, 0.001666f, 0.001754f, 0.001889f, 0.001980f, 0.002073f, 0.002216f, 0.002308f,
- 0.002447f, 0.002562f, 0.002758f, 0.002899f, 0.003084f, 0.003328f, 0.003506f, 0.003641f,
- 0.003922f, 0.004147f, 0.004391f, 0.004665f, 0.004959f, 0.005322f, 0.005695f, 0.006119f,
- 0.006588f, 0.007072f, 0.007790f, 0.008392f, 0.009178f, 0.010056f, 0.011124f, 0.012383f,
- 0.013832f, 0.015587f, 0.017685f, 0.020309f, 0.023926f, 0.028076f, 0.033447f, 0.039978f,
- 0.047638f, 0.056335f, 0.440186f, 0.500000f, 0.514160f, 0.520996f, 0.524414f, 0.526855f,
- 0.000132f, 0.000296f, 0.000368f, 0.000444f, 0.000501f, 0.000519f, 0.000631f, 0.000580f,
- 0.000675f, 0.000735f, 0.000820f, 0.000840f, 0.000882f, 0.000946f, 0.001029f, 0.001070f,
- 0.001164f, 0.001221f, 0.001286f, 0.001317f, 0.001416f, 0.001494f, 0.001607f, 0.001681f,
- 0.001763f, 0.001863f, 0.001978f, 0.002069f, 0.002169f, 0.002348f, 0.002451f, 0.002661f,
- 0.002754f, 0.002943f, 0.003130f, 0.003323f, 0.003553f, 0.003813f, 0.004124f, 0.004364f,
- 0.004669f, 0.005062f, 0.005493f, 0.005985f, 0.006546f, 0.007172f, 0.007950f, 0.008850f,
- 0.009857f, 0.011116f, 0.012695f, 0.014603f, 0.016983f, 0.020157f, 0.024490f, 0.029968f,
- 0.036957f, 0.045166f, 0.426025f, 0.488770f, 0.503906f, 0.511719f, 0.515137f, 0.517578f,
- 0.000063f, 0.000160f, 0.000267f, 0.000282f, 0.000339f, 0.000417f, 0.000377f, 0.000433f,
- 0.000472f, 0.000570f, 0.000563f, 0.000578f, 0.000599f, 0.000663f, 0.000681f, 0.000759f,
- 0.000760f, 0.000845f, 0.000910f, 0.000941f, 0.000997f, 0.001057f, 0.001110f, 0.001169f,
- 0.001238f, 0.001288f, 0.001381f, 0.001441f, 0.001514f, 0.001655f, 0.001693f, 0.001815f,
- 0.001910f, 0.002028f, 0.002153f, 0.002308f, 0.002441f, 0.002607f, 0.002783f, 0.002962f,
- 0.003214f, 0.003458f, 0.003744f, 0.004051f, 0.004444f, 0.004883f, 0.005402f, 0.006031f,
- 0.006699f, 0.007610f, 0.008766f, 0.009933f, 0.011688f, 0.013931f, 0.017075f, 0.021454f,
- 0.027313f, 0.035004f, 0.414307f, 0.478271f, 0.493652f, 0.501465f, 0.505859f, 0.508301f,
- 0.000120f, 0.000194f, 0.000194f, 0.000205f, 0.000245f, 0.000246f, 0.000251f, 0.000301f,
- 0.000322f, 0.000332f, 0.000343f, 0.000413f, 0.000397f, 0.000448f, 0.000481f, 0.000494f,
- 0.000545f, 0.000556f, 0.000582f, 0.000601f, 0.000653f, 0.000676f, 0.000726f, 0.000767f,
- 0.000821f, 0.000840f, 0.000919f, 0.000952f, 0.001011f, 0.001054f, 0.001116f, 0.001186f,
- 0.001263f, 0.001337f, 0.001418f, 0.001482f, 0.001607f, 0.001685f, 0.001842f, 0.001965f,
- 0.002090f, 0.002235f, 0.002420f, 0.002613f, 0.002851f, 0.003159f, 0.003492f, 0.003887f,
- 0.004345f, 0.004906f, 0.005600f, 0.006474f, 0.007645f, 0.009186f, 0.011230f, 0.014305f,
- 0.019135f, 0.025848f, 0.400635f, 0.466797f, 0.483398f, 0.490967f, 0.495117f, 0.498047f,
- 0.000030f, 0.000140f, 0.000121f, 0.000114f, 0.000147f, 0.000178f, 0.000159f, 0.000195f,
- 0.000199f, 0.000204f, 0.000216f, 0.000223f, 0.000255f, 0.000271f, 0.000288f, 0.000302f,
- 0.000314f, 0.000346f, 0.000357f, 0.000395f, 0.000397f, 0.000408f, 0.000436f, 0.000470f,
- 0.000501f, 0.000542f, 0.000547f, 0.000566f, 0.000612f, 0.000641f, 0.000692f, 0.000722f,
- 0.000767f, 0.000798f, 0.000861f, 0.000898f, 0.000963f, 0.001030f, 0.001107f, 0.001164f,
- 0.001255f, 0.001361f, 0.001464f, 0.001591f, 0.001719f, 0.001871f, 0.002111f, 0.002312f,
- 0.002617f, 0.002964f, 0.003368f, 0.003902f, 0.004654f, 0.005653f, 0.006958f, 0.008888f,
- 0.012161f, 0.017822f, 0.388672f, 0.456543f, 0.473389f, 0.481201f, 0.486328f, 0.489014f,
- 0.000102f, 0.000076f, 0.000076f, 0.000075f, 0.000095f, 0.000092f, 0.000109f, 0.000111f,
- 0.000112f, 0.000113f, 0.000126f, 0.000147f, 0.000135f, 0.000144f, 0.000165f, 0.000161f,
- 0.000179f, 0.000192f, 0.000198f, 0.000202f, 0.000224f, 0.000232f, 0.000248f, 0.000259f,
- 0.000278f, 0.000295f, 0.000308f, 0.000320f, 0.000340f, 0.000353f, 0.000379f, 0.000402f,
- 0.000423f, 0.000440f, 0.000472f, 0.000503f, 0.000526f, 0.000564f, 0.000610f, 0.000644f,
- 0.000690f, 0.000741f, 0.000810f, 0.000862f, 0.000946f, 0.001024f, 0.001121f, 0.001247f,
- 0.001407f, 0.001603f, 0.001822f, 0.002144f, 0.002539f, 0.003098f, 0.003901f, 0.005096f,
- 0.006931f, 0.011024f, 0.375244f, 0.444092f, 0.462158f, 0.470215f, 0.475586f, 0.478760f,
- 0.000085f, 0.000061f, 0.000052f, 0.000047f, 0.000049f, 0.000046f, 0.000047f, 0.000050f,
- 0.000055f, 0.000069f, 0.000060f, 0.000062f, 0.000077f, 0.000066f, 0.000069f, 0.000075f,
- 0.000084f, 0.000093f, 0.000093f, 0.000098f, 0.000102f, 0.000108f, 0.000111f, 0.000121f,
- 0.000129f, 0.000136f, 0.000142f, 0.000154f, 0.000162f, 0.000172f, 0.000182f, 0.000187f,
- 0.000197f, 0.000209f, 0.000225f, 0.000231f, 0.000246f, 0.000262f, 0.000290f, 0.000306f,
- 0.000321f, 0.000349f, 0.000380f, 0.000402f, 0.000437f, 0.000480f, 0.000525f, 0.000579f,
- 0.000649f, 0.000735f, 0.000842f, 0.000984f, 0.001173f, 0.001451f, 0.001855f, 0.002485f,
- 0.003542f, 0.005753f, 0.362305f, 0.434326f, 0.451904f, 0.460693f, 0.465576f, 0.468506f,
- 0.000064f, 0.000044f, 0.000036f, 0.000032f, 0.000029f, 0.000027f, 0.000025f, 0.000024f,
- 0.000022f, 0.000023f, 0.000021f, 0.000027f, 0.000023f, 0.000022f, 0.000028f, 0.000031f,
- 0.000030f, 0.000034f, 0.000036f, 0.000038f, 0.000040f, 0.000045f, 0.000048f, 0.000042f,
- 0.000047f, 0.000053f, 0.000055f, 0.000054f, 0.000060f, 0.000062f, 0.000065f, 0.000072f,
- 0.000078f, 0.000075f, 0.000079f, 0.000087f, 0.000093f, 0.000098f, 0.000106f, 0.000113f,
- 0.000121f, 0.000126f, 0.000136f, 0.000150f, 0.000159f, 0.000173f, 0.000190f, 0.000209f,
- 0.000235f, 0.000265f, 0.000302f, 0.000343f, 0.000416f, 0.000515f, 0.000665f, 0.000917f,
- 0.001396f, 0.002401f, 0.349854f, 0.421875f, 0.440918f, 0.449951f, 0.455811f, 0.458008f,
- 0.000030f, 0.000020f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f,
- 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f,
- 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000007f, 0.000008f, 0.000008f,
- 0.000009f, 0.000011f, 0.000011f, 0.000013f, 0.000013f, 0.000012f, 0.000013f, 0.000014f,
- 0.000016f, 0.000018f, 0.000018f, 0.000019f, 0.000021f, 0.000021f, 0.000023f, 0.000027f,
- 0.000025f, 0.000028f, 0.000031f, 0.000032f, 0.000033f, 0.000038f, 0.000043f, 0.000046f,
- 0.000050f, 0.000055f, 0.000062f, 0.000074f, 0.000088f, 0.000106f, 0.000138f, 0.000191f,
- 0.000312f, 0.000653f, 0.337402f, 0.410645f, 0.431152f, 0.438965f, 0.445068f, 0.448975f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000006f,
- 0.000010f, 0.000026f, 0.324219f, 0.399902f, 0.419922f, 0.429688f, 0.435059f, 0.438965f,
- },
- {
- 0.010521f, 0.032043f, 0.054443f, 0.076843f, 0.098572f, 0.121216f, 0.142700f, 0.164062f,
- 0.185913f, 0.207275f, 0.229004f, 0.249268f, 0.270508f, 0.290527f, 0.311035f, 0.331055f,
- 0.350586f, 0.370361f, 0.389648f, 0.408936f, 0.428223f, 0.446533f, 0.465088f, 0.482666f,
- 0.500977f, 0.519043f, 0.536133f, 0.553223f, 0.570801f, 0.587891f, 0.604980f, 0.621582f,
- 0.637207f, 0.653320f, 0.668945f, 0.685547f, 0.700684f, 0.716309f, 0.730957f, 0.745605f,
- 0.760254f, 0.774902f, 0.789551f, 0.803711f, 0.816895f, 0.831543f, 0.845703f, 0.858887f,
- 0.871582f, 0.885254f, 0.897949f, 0.910645f, 0.923340f, 0.936035f, 0.948242f, 0.959961f,
- 0.972168f, 0.984375f, 0.972656f, 0.936035f, 0.910645f, 0.890137f, 0.872070f, 0.855957f,
- 0.010048f, 0.030350f, 0.051392f, 0.072266f, 0.093506f, 0.114319f, 0.135620f, 0.155273f,
- 0.177124f, 0.197144f, 0.217773f, 0.237915f, 0.257568f, 0.277588f, 0.298096f, 0.316895f,
- 0.336182f, 0.355225f, 0.374268f, 0.393311f, 0.411865f, 0.430176f, 0.448486f, 0.466309f,
- 0.483398f, 0.501465f, 0.519043f, 0.535645f, 0.552734f, 0.570312f, 0.586426f, 0.602539f,
- 0.618652f, 0.635254f, 0.650879f, 0.666016f, 0.682129f, 0.697266f, 0.712402f, 0.727539f,
- 0.741699f, 0.756836f, 0.770996f, 0.785645f, 0.799805f, 0.812988f, 0.826660f, 0.840332f,
- 0.854004f, 0.867676f, 0.881348f, 0.893066f, 0.907715f, 0.919434f, 0.932617f, 0.943848f,
- 0.955566f, 0.968262f, 0.965332f, 0.930664f, 0.906738f, 0.886719f, 0.869629f, 0.854004f,
- 0.009254f, 0.028961f, 0.048615f, 0.068054f, 0.088562f, 0.108093f, 0.128540f, 0.147705f,
- 0.167236f, 0.188599f, 0.207886f, 0.227295f, 0.244873f, 0.265625f, 0.284668f, 0.303955f,
- 0.322510f, 0.340820f, 0.358887f, 0.378662f, 0.396484f, 0.414307f, 0.431885f, 0.448975f,
- 0.466797f, 0.484619f, 0.500977f, 0.519043f, 0.535645f, 0.551758f, 0.568359f, 0.584961f,
- 0.600586f, 0.616699f, 0.632324f, 0.647949f, 0.663086f, 0.678223f, 0.693848f, 0.708984f,
- 0.723633f, 0.738281f, 0.752930f, 0.767578f, 0.780762f, 0.794922f, 0.809082f, 0.822754f,
- 0.835938f, 0.849609f, 0.863770f, 0.875488f, 0.888672f, 0.902344f, 0.915527f, 0.927246f,
- 0.939453f, 0.952637f, 0.958008f, 0.925293f, 0.901855f, 0.882812f, 0.866211f, 0.851562f,
- 0.008736f, 0.027039f, 0.045807f, 0.064514f, 0.083801f, 0.102844f, 0.121826f, 0.140869f,
- 0.159302f, 0.179077f, 0.197388f, 0.216064f, 0.234741f, 0.253662f, 0.271729f, 0.290283f,
- 0.308350f, 0.327148f, 0.344238f, 0.362061f, 0.381836f, 0.398926f, 0.416016f, 0.432373f,
- 0.450195f, 0.466797f, 0.484375f, 0.500977f, 0.517090f, 0.533691f, 0.550781f, 0.567871f,
- 0.582031f, 0.598145f, 0.613770f, 0.629395f, 0.645020f, 0.659668f, 0.675781f, 0.689941f,
- 0.705566f, 0.719727f, 0.734375f, 0.749512f, 0.763184f, 0.776855f, 0.791016f, 0.804688f,
- 0.818848f, 0.832031f, 0.845215f, 0.858398f, 0.872559f, 0.884766f, 0.897949f, 0.909668f,
- 0.922852f, 0.936035f, 0.950684f, 0.919434f, 0.896973f, 0.878906f, 0.862793f, 0.848633f,
- 0.008339f, 0.025543f, 0.043427f, 0.060974f, 0.078979f, 0.097168f, 0.115051f, 0.133179f,
- 0.151367f, 0.169678f, 0.187988f, 0.206055f, 0.223999f, 0.241821f, 0.260742f, 0.277832f,
- 0.295166f, 0.313232f, 0.331299f, 0.347412f, 0.365479f, 0.383057f, 0.399902f, 0.416992f,
- 0.433350f, 0.450195f, 0.467773f, 0.484863f, 0.499756f, 0.515625f, 0.532715f, 0.548340f,
- 0.564941f, 0.580566f, 0.596191f, 0.610840f, 0.626953f, 0.641602f, 0.656738f, 0.671875f,
- 0.686035f, 0.701660f, 0.714844f, 0.730469f, 0.745117f, 0.759766f, 0.772461f, 0.786621f,
- 0.801270f, 0.814453f, 0.827637f, 0.841309f, 0.854004f, 0.867676f, 0.880859f, 0.893555f,
- 0.907227f, 0.919434f, 0.943359f, 0.913086f, 0.891602f, 0.874512f, 0.858887f, 0.845703f,
- 0.008102f, 0.024002f, 0.040802f, 0.057098f, 0.074768f, 0.091553f, 0.108826f, 0.126343f,
- 0.143921f, 0.161377f, 0.179077f, 0.195923f, 0.213745f, 0.230835f, 0.248047f, 0.265869f,
- 0.282227f, 0.299561f, 0.316895f, 0.334473f, 0.350586f, 0.367920f, 0.384277f, 0.400391f,
- 0.417725f, 0.434326f, 0.450195f, 0.467285f, 0.482910f, 0.498291f, 0.514648f, 0.530762f,
- 0.546387f, 0.561523f, 0.577637f, 0.593262f, 0.608398f, 0.623535f, 0.637695f, 0.654297f,
- 0.668457f, 0.682617f, 0.698242f, 0.711914f, 0.727051f, 0.741211f, 0.754395f, 0.768066f,
- 0.782715f, 0.796387f, 0.810547f, 0.823730f, 0.836426f, 0.849609f, 0.863770f, 0.876465f,
- 0.889648f, 0.902344f, 0.934570f, 0.907715f, 0.887207f, 0.870117f, 0.854980f, 0.842285f,
- 0.007504f, 0.022812f, 0.038727f, 0.054871f, 0.070312f, 0.087097f, 0.103088f, 0.119446f,
- 0.136475f, 0.153442f, 0.169556f, 0.186523f, 0.203369f, 0.219971f, 0.236450f, 0.253418f,
- 0.270264f, 0.287109f, 0.302979f, 0.319824f, 0.336182f, 0.353271f, 0.369141f, 0.386230f,
- 0.402100f, 0.417725f, 0.433594f, 0.450684f, 0.466553f, 0.482178f, 0.498047f, 0.513184f,
- 0.528809f, 0.543945f, 0.559082f, 0.575195f, 0.589844f, 0.605469f, 0.621094f, 0.634277f,
- 0.649414f, 0.665039f, 0.679688f, 0.694824f, 0.708496f, 0.722168f, 0.736816f, 0.750000f,
- 0.763184f, 0.778809f, 0.791504f, 0.805664f, 0.819336f, 0.832520f, 0.845703f, 0.858887f,
- 0.872070f, 0.885742f, 0.927246f, 0.900879f, 0.881836f, 0.864746f, 0.851074f, 0.838867f,
- 0.006836f, 0.021683f, 0.036224f, 0.051666f, 0.066772f, 0.081970f, 0.098022f, 0.113831f,
- 0.129517f, 0.145264f, 0.161011f, 0.177856f, 0.193359f, 0.209106f, 0.226196f, 0.241821f,
- 0.257812f, 0.274414f, 0.290283f, 0.306641f, 0.322754f, 0.338623f, 0.354492f, 0.370361f,
- 0.386230f, 0.402100f, 0.417725f, 0.433838f, 0.449463f, 0.465088f, 0.480469f, 0.495605f,
- 0.511719f, 0.527344f, 0.541016f, 0.556641f, 0.571777f, 0.587402f, 0.601562f, 0.617676f,
- 0.631836f, 0.646484f, 0.660645f, 0.674805f, 0.689941f, 0.704102f, 0.718262f, 0.731934f,
- 0.746582f, 0.760254f, 0.774414f, 0.786621f, 0.801758f, 0.815430f, 0.828125f, 0.842285f,
- 0.854980f, 0.868652f, 0.918457f, 0.894531f, 0.875977f, 0.859863f, 0.846680f, 0.834961f,
- 0.006672f, 0.020401f, 0.034088f, 0.048462f, 0.062927f, 0.077820f, 0.092529f, 0.107666f,
- 0.122803f, 0.137695f, 0.152954f, 0.169067f, 0.183716f, 0.199829f, 0.214722f, 0.230347f,
- 0.246704f, 0.262207f, 0.277832f, 0.292969f, 0.308105f, 0.324219f, 0.339600f, 0.354492f,
- 0.371094f, 0.386963f, 0.401855f, 0.418457f, 0.432861f, 0.449219f, 0.463379f, 0.478271f,
- 0.494385f, 0.508301f, 0.523438f, 0.539551f, 0.553711f, 0.568848f, 0.583984f, 0.598633f,
- 0.612793f, 0.627441f, 0.642578f, 0.656250f, 0.670898f, 0.685547f, 0.698730f, 0.714355f,
- 0.728027f, 0.742188f, 0.755859f, 0.769531f, 0.783691f, 0.795898f, 0.810059f, 0.824707f,
- 0.838379f, 0.850586f, 0.910645f, 0.887695f, 0.870117f, 0.854980f, 0.842285f, 0.831055f,
- 0.006207f, 0.019211f, 0.032623f, 0.046112f, 0.059662f, 0.073181f, 0.087585f, 0.102051f,
- 0.116577f, 0.130249f, 0.145142f, 0.159790f, 0.175171f, 0.189575f, 0.205322f, 0.219238f,
- 0.235474f, 0.249634f, 0.265137f, 0.280029f, 0.294678f, 0.310547f, 0.325928f, 0.340820f,
- 0.356201f, 0.371094f, 0.386230f, 0.401367f, 0.416504f, 0.431885f, 0.446533f, 0.461670f,
- 0.476074f, 0.492188f, 0.507324f, 0.520996f, 0.535645f, 0.550781f, 0.564941f, 0.580078f,
- 0.594727f, 0.609863f, 0.623535f, 0.637695f, 0.652832f, 0.667480f, 0.681152f, 0.695312f,
- 0.709473f, 0.723633f, 0.737793f, 0.751953f, 0.765137f, 0.779297f, 0.793945f, 0.807129f,
- 0.819824f, 0.833496f, 0.901855f, 0.880859f, 0.864258f, 0.850098f, 0.837891f, 0.826660f,
- 0.006020f, 0.018219f, 0.030579f, 0.043365f, 0.055908f, 0.069153f, 0.082336f, 0.096802f,
- 0.109497f, 0.123535f, 0.137451f, 0.151855f, 0.165649f, 0.180054f, 0.194702f, 0.208252f,
- 0.223999f, 0.238037f, 0.252930f, 0.267334f, 0.281982f, 0.296875f, 0.312012f, 0.326904f,
- 0.340820f, 0.355957f, 0.370850f, 0.385986f, 0.400391f, 0.415039f, 0.430176f, 0.445801f,
- 0.459229f, 0.474365f, 0.489014f, 0.502441f, 0.518066f, 0.533203f, 0.547363f, 0.562012f,
- 0.576660f, 0.590820f, 0.605469f, 0.619629f, 0.633789f, 0.647949f, 0.663574f, 0.676758f,
- 0.690918f, 0.705566f, 0.719238f, 0.733398f, 0.746582f, 0.760254f, 0.774414f, 0.788574f,
- 0.802246f, 0.816406f, 0.894043f, 0.874023f, 0.858398f, 0.844238f, 0.832031f, 0.822266f,
- 0.005520f, 0.017059f, 0.028625f, 0.040649f, 0.053131f, 0.065552f, 0.077698f, 0.091187f,
- 0.104065f, 0.117371f, 0.130859f, 0.143677f, 0.157349f, 0.171021f, 0.184814f, 0.198730f,
- 0.213135f, 0.226807f, 0.241211f, 0.255127f, 0.269775f, 0.283691f, 0.298096f, 0.312744f,
- 0.326660f, 0.341553f, 0.355957f, 0.370117f, 0.384766f, 0.399170f, 0.414307f, 0.427979f,
- 0.442627f, 0.457764f, 0.471924f, 0.486084f, 0.500488f, 0.515137f, 0.529785f, 0.543945f,
- 0.558594f, 0.572754f, 0.587402f, 0.601074f, 0.615234f, 0.629395f, 0.644043f, 0.657715f,
- 0.672852f, 0.685547f, 0.700684f, 0.714844f, 0.728027f, 0.743164f, 0.756348f, 0.770508f,
- 0.785645f, 0.798340f, 0.885254f, 0.867676f, 0.852051f, 0.839355f, 0.828125f, 0.817871f,
- 0.005241f, 0.015854f, 0.027481f, 0.038605f, 0.050171f, 0.061859f, 0.073853f, 0.085693f,
- 0.098328f, 0.111206f, 0.123474f, 0.136475f, 0.149658f, 0.162598f, 0.175293f, 0.188477f,
- 0.202148f, 0.216431f, 0.229858f, 0.242798f, 0.256104f, 0.270264f, 0.284668f, 0.298828f,
- 0.312744f, 0.326904f, 0.341064f, 0.355469f, 0.369141f, 0.383057f, 0.396729f, 0.411621f,
- 0.426025f, 0.439697f, 0.454590f, 0.468506f, 0.482666f, 0.497070f, 0.512207f, 0.525391f,
- 0.540527f, 0.555176f, 0.567871f, 0.582031f, 0.596191f, 0.610840f, 0.625488f, 0.639648f,
- 0.653809f, 0.668457f, 0.681641f, 0.695801f, 0.710449f, 0.724121f, 0.738770f, 0.751953f,
- 0.766602f, 0.780273f, 0.876465f, 0.860352f, 0.845703f, 0.833984f, 0.822754f, 0.812988f,
- 0.004982f, 0.015274f, 0.025681f, 0.036438f, 0.047119f, 0.058167f, 0.069397f, 0.081055f,
- 0.092957f, 0.104492f, 0.116577f, 0.128418f, 0.141113f, 0.153442f, 0.166504f, 0.179321f,
- 0.192261f, 0.205200f, 0.218506f, 0.231934f, 0.244629f, 0.258301f, 0.271729f, 0.284912f,
- 0.299072f, 0.312988f, 0.325684f, 0.340088f, 0.353271f, 0.367676f, 0.381836f, 0.395508f,
- 0.408936f, 0.423584f, 0.438232f, 0.451416f, 0.466309f, 0.479736f, 0.493896f, 0.507812f,
- 0.521973f, 0.536133f, 0.550293f, 0.563965f, 0.578613f, 0.592773f, 0.606934f, 0.620605f,
- 0.635254f, 0.649414f, 0.663086f, 0.677246f, 0.691406f, 0.706543f, 0.720703f, 0.734375f,
- 0.748047f, 0.762695f, 0.868164f, 0.853027f, 0.839355f, 0.828125f, 0.817383f, 0.808105f,
- 0.004745f, 0.014290f, 0.024506f, 0.034393f, 0.044617f, 0.054749f, 0.065308f, 0.076538f,
- 0.087646f, 0.098938f, 0.110535f, 0.121582f, 0.134155f, 0.145264f, 0.157837f, 0.170166f,
- 0.182373f, 0.194824f, 0.207153f, 0.220337f, 0.233276f, 0.245728f, 0.259277f, 0.271973f,
- 0.285645f, 0.298584f, 0.311768f, 0.325684f, 0.338623f, 0.352539f, 0.365967f, 0.379395f,
- 0.393066f, 0.406738f, 0.421143f, 0.434326f, 0.448730f, 0.462402f, 0.475586f, 0.490479f,
- 0.503906f, 0.518066f, 0.532227f, 0.546387f, 0.560059f, 0.574219f, 0.588379f, 0.602539f,
- 0.616211f, 0.630371f, 0.644531f, 0.658691f, 0.673340f, 0.686523f, 0.701660f, 0.715332f,
- 0.730469f, 0.745117f, 0.858887f, 0.845215f, 0.833008f, 0.821777f, 0.812012f, 0.802734f,
- 0.004494f, 0.013550f, 0.022675f, 0.032227f, 0.042145f, 0.052002f, 0.061554f, 0.072205f,
- 0.082520f, 0.093323f, 0.104614f, 0.115112f, 0.126099f, 0.137817f, 0.149536f, 0.160767f,
- 0.172607f, 0.184692f, 0.196167f, 0.208862f, 0.221924f, 0.233765f, 0.246216f, 0.258545f,
- 0.272461f, 0.284424f, 0.297119f, 0.310547f, 0.323242f, 0.336914f, 0.350586f, 0.363281f,
- 0.376953f, 0.390869f, 0.403564f, 0.416992f, 0.431152f, 0.444824f, 0.458496f, 0.472656f,
- 0.486084f, 0.500000f, 0.513672f, 0.527832f, 0.541504f, 0.555664f, 0.569824f, 0.583496f,
- 0.598145f, 0.611816f, 0.626465f, 0.639648f, 0.654297f, 0.668457f, 0.683594f, 0.697754f,
- 0.711914f, 0.726562f, 0.849609f, 0.838867f, 0.826172f, 0.815918f, 0.806641f, 0.796875f,
- 0.004288f, 0.012619f, 0.021713f, 0.030945f, 0.039368f, 0.048737f, 0.058533f, 0.067932f,
- 0.077759f, 0.088013f, 0.098755f, 0.108398f, 0.119080f, 0.129639f, 0.141235f, 0.152466f,
- 0.163940f, 0.174927f, 0.186768f, 0.198608f, 0.210205f, 0.222290f, 0.234131f, 0.246094f,
- 0.258789f, 0.270508f, 0.283203f, 0.296631f, 0.309326f, 0.321777f, 0.335449f, 0.348145f,
- 0.361084f, 0.374023f, 0.386963f, 0.400391f, 0.414062f, 0.427734f, 0.441162f, 0.455078f,
- 0.467773f, 0.482422f, 0.495117f, 0.509277f, 0.523926f, 0.536621f, 0.550781f, 0.564941f,
- 0.579102f, 0.593262f, 0.607422f, 0.621582f, 0.635742f, 0.649902f, 0.664551f, 0.678711f,
- 0.693848f, 0.708008f, 0.840820f, 0.831055f, 0.819336f, 0.809570f, 0.801270f, 0.792969f,
- 0.004013f, 0.012070f, 0.019989f, 0.029190f, 0.037415f, 0.045776f, 0.055023f, 0.064392f,
- 0.073669f, 0.083374f, 0.092224f, 0.102295f, 0.112610f, 0.122742f, 0.133057f, 0.143799f,
- 0.155273f, 0.165527f, 0.176880f, 0.188110f, 0.199463f, 0.210815f, 0.222534f, 0.234619f,
- 0.245972f, 0.258301f, 0.270508f, 0.282715f, 0.294678f, 0.307129f, 0.320557f, 0.333008f,
- 0.345947f, 0.358398f, 0.371826f, 0.384277f, 0.397461f, 0.410889f, 0.424561f, 0.437256f,
- 0.451416f, 0.464600f, 0.477783f, 0.491455f, 0.504395f, 0.518555f, 0.532715f, 0.546875f,
- 0.560547f, 0.574219f, 0.588379f, 0.604004f, 0.617188f, 0.631348f, 0.645020f, 0.660645f,
- 0.674316f, 0.689941f, 0.832031f, 0.823242f, 0.813477f, 0.803711f, 0.794922f, 0.787109f,
- 0.003790f, 0.011559f, 0.019119f, 0.027069f, 0.035034f, 0.043762f, 0.052032f, 0.060059f,
- 0.069153f, 0.078369f, 0.087280f, 0.096741f, 0.105957f, 0.115967f, 0.125732f, 0.135620f,
- 0.146118f, 0.156128f, 0.166992f, 0.177612f, 0.188965f, 0.199829f, 0.210815f, 0.222290f,
- 0.233887f, 0.244873f, 0.257324f, 0.268799f, 0.281006f, 0.292969f, 0.305420f, 0.317627f,
- 0.329834f, 0.341797f, 0.355469f, 0.368164f, 0.380859f, 0.393311f, 0.407227f, 0.419434f,
- 0.433350f, 0.446533f, 0.459961f, 0.473633f, 0.486328f, 0.500488f, 0.515625f, 0.528320f,
- 0.541504f, 0.556152f, 0.570312f, 0.584473f, 0.598633f, 0.612305f, 0.626465f, 0.640625f,
- 0.655762f, 0.670410f, 0.822266f, 0.815918f, 0.805664f, 0.796387f, 0.788574f, 0.782227f,
- 0.003599f, 0.010727f, 0.018219f, 0.025177f, 0.033203f, 0.041046f, 0.048981f, 0.057220f,
- 0.065247f, 0.073792f, 0.082764f, 0.091064f, 0.100220f, 0.108826f, 0.118591f, 0.128052f,
- 0.137573f, 0.147705f, 0.158081f, 0.167603f, 0.177979f, 0.188721f, 0.198975f, 0.210205f,
- 0.221924f, 0.232544f, 0.243774f, 0.255615f, 0.267090f, 0.278564f, 0.290039f, 0.302490f,
- 0.314941f, 0.327393f, 0.338623f, 0.352295f, 0.364014f, 0.377441f, 0.390381f, 0.403564f,
- 0.415039f, 0.428955f, 0.441895f, 0.455078f, 0.468994f, 0.482666f, 0.496094f, 0.509277f,
- 0.523926f, 0.537598f, 0.551270f, 0.565430f, 0.579590f, 0.594238f, 0.608887f, 0.622559f,
- 0.637207f, 0.651855f, 0.813477f, 0.807617f, 0.798340f, 0.790527f, 0.782715f, 0.775391f,
- 0.003355f, 0.009918f, 0.017105f, 0.023911f, 0.031281f, 0.038147f, 0.045990f, 0.053284f,
- 0.061493f, 0.069214f, 0.077026f, 0.085571f, 0.093567f, 0.102600f, 0.111755f, 0.120728f,
- 0.129761f, 0.138916f, 0.148804f, 0.158447f, 0.167725f, 0.177979f, 0.188965f, 0.198608f,
- 0.209473f, 0.220215f, 0.231567f, 0.242554f, 0.253906f, 0.264160f, 0.276123f, 0.287109f,
- 0.300049f, 0.312012f, 0.323975f, 0.336182f, 0.348145f, 0.360840f, 0.372803f, 0.385986f,
- 0.398438f, 0.411621f, 0.424316f, 0.437256f, 0.450439f, 0.464844f, 0.478027f, 0.490723f,
- 0.504395f, 0.518066f, 0.532715f, 0.546387f, 0.561523f, 0.575684f, 0.589355f, 0.604004f,
- 0.618164f, 0.632324f, 0.802246f, 0.800293f, 0.792480f, 0.783691f, 0.776367f, 0.769531f,
- 0.003265f, 0.009575f, 0.016144f, 0.022415f, 0.029510f, 0.036316f, 0.042755f, 0.050812f,
- 0.057556f, 0.065002f, 0.072388f, 0.080200f, 0.087952f, 0.096680f, 0.104858f, 0.113281f,
- 0.122070f, 0.130493f, 0.139771f, 0.148926f, 0.158447f, 0.168335f, 0.177612f, 0.187500f,
- 0.198120f, 0.208130f, 0.218750f, 0.229492f, 0.240234f, 0.250732f, 0.262207f, 0.273682f,
- 0.285156f, 0.296143f, 0.308594f, 0.320068f, 0.332520f, 0.344482f, 0.357178f, 0.368652f,
- 0.381836f, 0.394043f, 0.406494f, 0.420410f, 0.433105f, 0.445801f, 0.459717f, 0.473633f,
- 0.486816f, 0.500000f, 0.513672f, 0.527832f, 0.541992f, 0.556152f, 0.570312f, 0.585449f,
- 0.598633f, 0.613770f, 0.794434f, 0.791504f, 0.784180f, 0.776855f, 0.770020f, 0.764160f,
- 0.002954f, 0.008904f, 0.014961f, 0.021210f, 0.027420f, 0.033905f, 0.040619f, 0.047363f,
- 0.053986f, 0.060883f, 0.068054f, 0.075378f, 0.082703f, 0.090515f, 0.098022f, 0.105896f,
- 0.114319f, 0.122742f, 0.131592f, 0.139771f, 0.149170f, 0.157959f, 0.167480f, 0.177124f,
- 0.186768f, 0.196411f, 0.206543f, 0.216919f, 0.227539f, 0.237671f, 0.248413f, 0.259277f,
- 0.270264f, 0.281738f, 0.292725f, 0.304443f, 0.315918f, 0.327637f, 0.340576f, 0.352539f,
- 0.364746f, 0.377930f, 0.390137f, 0.401855f, 0.415039f, 0.428223f, 0.441406f, 0.454834f,
- 0.468506f, 0.481689f, 0.494873f, 0.509277f, 0.523438f, 0.537598f, 0.551758f, 0.565918f,
- 0.580078f, 0.594727f, 0.783691f, 0.783203f, 0.776855f, 0.770508f, 0.763672f, 0.757324f,
- 0.002836f, 0.008659f, 0.014351f, 0.019913f, 0.025772f, 0.032074f, 0.037933f, 0.044128f,
- 0.050903f, 0.057159f, 0.064026f, 0.070496f, 0.077698f, 0.085022f, 0.091919f, 0.099426f,
- 0.107727f, 0.114990f, 0.123169f, 0.131226f, 0.140015f, 0.148682f, 0.157349f, 0.166260f,
- 0.175171f, 0.184692f, 0.194214f, 0.203979f, 0.214355f, 0.224487f, 0.234985f, 0.245728f,
- 0.256104f, 0.267334f, 0.278320f, 0.288818f, 0.301025f, 0.312256f, 0.324219f, 0.335938f,
- 0.347900f, 0.360596f, 0.372070f, 0.384521f, 0.397217f, 0.410400f, 0.423340f, 0.436279f,
- 0.449463f, 0.463135f, 0.476807f, 0.490723f, 0.503906f, 0.517578f, 0.532227f, 0.546875f,
- 0.561035f, 0.575684f, 0.773926f, 0.775391f, 0.769043f, 0.763672f, 0.757812f, 0.751953f,
- 0.002506f, 0.008080f, 0.013100f, 0.018738f, 0.024384f, 0.029953f, 0.035797f, 0.041473f,
- 0.047485f, 0.053558f, 0.059265f, 0.065918f, 0.072693f, 0.079468f, 0.086426f, 0.093384f,
- 0.100708f, 0.108032f, 0.115417f, 0.122986f, 0.130615f, 0.139038f, 0.147827f, 0.156494f,
- 0.165039f, 0.173828f, 0.182617f, 0.192139f, 0.201782f, 0.211426f, 0.221558f, 0.231323f,
- 0.242188f, 0.252686f, 0.263672f, 0.274414f, 0.284912f, 0.296143f, 0.308105f, 0.319824f,
- 0.331543f, 0.343750f, 0.355225f, 0.367432f, 0.379883f, 0.393066f, 0.405273f, 0.418457f,
- 0.431641f, 0.444580f, 0.457764f, 0.471924f, 0.485840f, 0.499268f, 0.512695f, 0.527344f,
- 0.542480f, 0.556641f, 0.764160f, 0.766602f, 0.761719f, 0.756348f, 0.750488f, 0.745605f,
- 0.002640f, 0.007809f, 0.012497f, 0.017593f, 0.023102f, 0.028122f, 0.033569f, 0.038879f,
- 0.044250f, 0.049988f, 0.055908f, 0.061615f, 0.067627f, 0.074036f, 0.080566f, 0.087524f,
- 0.093262f, 0.100769f, 0.107910f, 0.114929f, 0.121948f, 0.130371f, 0.137939f, 0.146362f,
- 0.154297f, 0.163208f, 0.171509f, 0.180664f, 0.189697f, 0.199341f, 0.208618f, 0.218506f,
- 0.228394f, 0.238892f, 0.248779f, 0.259277f, 0.270752f, 0.281250f, 0.292236f, 0.303467f,
- 0.315186f, 0.326660f, 0.338867f, 0.351074f, 0.362305f, 0.374756f, 0.387939f, 0.400146f,
- 0.413330f, 0.426514f, 0.439209f, 0.452881f, 0.466553f, 0.480225f, 0.494141f, 0.508301f,
- 0.522949f, 0.537109f, 0.753906f, 0.758301f, 0.754395f, 0.749023f, 0.743652f, 0.739258f,
- 0.002441f, 0.007088f, 0.011993f, 0.016266f, 0.021255f, 0.026031f, 0.031189f, 0.036072f,
- 0.041260f, 0.046753f, 0.052155f, 0.057587f, 0.063232f, 0.068787f, 0.075623f, 0.081055f,
- 0.087341f, 0.094177f, 0.100647f, 0.106689f, 0.113892f, 0.121399f, 0.129028f, 0.136841f,
- 0.144287f, 0.152222f, 0.160522f, 0.169312f, 0.178101f, 0.186523f, 0.196045f, 0.205200f,
- 0.214966f, 0.224487f, 0.234863f, 0.244751f, 0.255371f, 0.265625f, 0.276367f, 0.287842f,
- 0.298828f, 0.310303f, 0.321533f, 0.333984f, 0.345459f, 0.357666f, 0.370117f, 0.382568f,
- 0.394287f, 0.407959f, 0.421875f, 0.433838f, 0.446777f, 0.461426f, 0.475098f, 0.488525f,
- 0.504395f, 0.517578f, 0.744141f, 0.749512f, 0.746094f, 0.741699f, 0.736816f, 0.732422f,
- 0.002172f, 0.006695f, 0.011093f, 0.015266f, 0.020081f, 0.024521f, 0.029388f, 0.033966f,
- 0.038727f, 0.043427f, 0.048706f, 0.053772f, 0.059418f, 0.064270f, 0.069580f, 0.075500f,
- 0.081421f, 0.087280f, 0.093262f, 0.099670f, 0.106567f, 0.113220f, 0.119995f, 0.127197f,
- 0.134644f, 0.142212f, 0.150146f, 0.157959f, 0.166382f, 0.174927f, 0.184082f, 0.192505f,
- 0.201904f, 0.211792f, 0.220825f, 0.230713f, 0.240601f, 0.251221f, 0.261719f, 0.272461f,
- 0.282715f, 0.294434f, 0.305420f, 0.316650f, 0.328369f, 0.340088f, 0.352783f, 0.364746f,
- 0.377197f, 0.389648f, 0.402832f, 0.416016f, 0.429443f, 0.442627f, 0.456055f, 0.469971f,
- 0.484863f, 0.499268f, 0.733887f, 0.741211f, 0.737793f, 0.734375f, 0.729980f, 0.725586f,
- 0.002045f, 0.006187f, 0.010406f, 0.014664f, 0.018570f, 0.022675f, 0.027176f, 0.031586f,
- 0.035858f, 0.040253f, 0.045227f, 0.049774f, 0.054504f, 0.059692f, 0.065186f, 0.070374f,
- 0.075500f, 0.080627f, 0.086792f, 0.092285f, 0.098999f, 0.104675f, 0.111816f, 0.118286f,
- 0.125610f, 0.132324f, 0.139771f, 0.147339f, 0.155029f, 0.163696f, 0.171631f, 0.180420f,
- 0.189087f, 0.197754f, 0.207275f, 0.216309f, 0.226440f, 0.236694f, 0.246338f, 0.256836f,
- 0.267334f, 0.278320f, 0.289062f, 0.300537f, 0.312012f, 0.323975f, 0.335449f, 0.347168f,
- 0.359375f, 0.372314f, 0.384521f, 0.396973f, 0.410400f, 0.423584f, 0.437500f, 0.450928f,
- 0.465332f, 0.479736f, 0.723145f, 0.732422f, 0.729980f, 0.726562f, 0.722656f, 0.718750f,
- 0.002148f, 0.005802f, 0.009811f, 0.013565f, 0.017578f, 0.021179f, 0.025040f, 0.029053f,
- 0.033417f, 0.037445f, 0.042114f, 0.046112f, 0.050720f, 0.055511f, 0.060028f, 0.065002f,
- 0.069458f, 0.075134f, 0.080078f, 0.085693f, 0.091492f, 0.097290f, 0.103394f, 0.109802f,
- 0.116089f, 0.122925f, 0.129883f, 0.136963f, 0.144165f, 0.151733f, 0.160156f, 0.167847f,
- 0.176392f, 0.184692f, 0.193848f, 0.203003f, 0.212402f, 0.221680f, 0.231689f, 0.242065f,
- 0.251953f, 0.262207f, 0.273193f, 0.283936f, 0.295410f, 0.306152f, 0.318359f, 0.329590f,
- 0.342285f, 0.354248f, 0.366455f, 0.379150f, 0.391846f, 0.405273f, 0.418701f, 0.432617f,
- 0.446289f, 0.460205f, 0.712891f, 0.723633f, 0.722168f, 0.718750f, 0.715332f, 0.712402f,
- 0.001963f, 0.005642f, 0.009071f, 0.012756f, 0.016006f, 0.020020f, 0.023422f, 0.027679f,
- 0.030762f, 0.034943f, 0.038605f, 0.042969f, 0.047028f, 0.051178f, 0.055542f, 0.060120f,
- 0.064575f, 0.069153f, 0.074280f, 0.079041f, 0.084595f, 0.089905f, 0.095276f, 0.101440f,
- 0.107300f, 0.113586f, 0.119751f, 0.127075f, 0.134033f, 0.141357f, 0.148438f, 0.155884f,
- 0.164062f, 0.172729f, 0.180542f, 0.190063f, 0.198364f, 0.207764f, 0.217163f, 0.226807f,
- 0.236938f, 0.247070f, 0.257324f, 0.268066f, 0.278320f, 0.289795f, 0.301025f, 0.312744f,
- 0.324707f, 0.336182f, 0.347900f, 0.360840f, 0.372803f, 0.386230f, 0.399902f, 0.413574f,
- 0.427246f, 0.441162f, 0.702148f, 0.714355f, 0.713867f, 0.711426f, 0.707520f, 0.704590f,
- 0.001995f, 0.005245f, 0.008553f, 0.011543f, 0.015015f, 0.018326f, 0.021881f, 0.025131f,
- 0.028641f, 0.032349f, 0.035675f, 0.039520f, 0.043549f, 0.047089f, 0.051086f, 0.054962f,
- 0.059265f, 0.063782f, 0.068054f, 0.072571f, 0.077759f, 0.082520f, 0.088013f, 0.093323f,
- 0.098755f, 0.104858f, 0.111145f, 0.117371f, 0.123840f, 0.130615f, 0.137207f, 0.144897f,
- 0.152344f, 0.160278f, 0.167969f, 0.176514f, 0.185425f, 0.193848f, 0.202881f, 0.212524f,
- 0.221924f, 0.231323f, 0.241821f, 0.251953f, 0.262451f, 0.272949f, 0.284424f, 0.295166f,
- 0.306396f, 0.319092f, 0.329590f, 0.343018f, 0.355225f, 0.368652f, 0.381348f, 0.393799f,
- 0.408447f, 0.422852f, 0.691406f, 0.706055f, 0.706055f, 0.703125f, 0.700684f, 0.697754f,
- 0.001692f, 0.004898f, 0.007828f, 0.011070f, 0.013992f, 0.017227f, 0.020187f, 0.023499f,
- 0.026520f, 0.029526f, 0.033081f, 0.036377f, 0.039459f, 0.043396f, 0.047028f, 0.050323f,
- 0.054199f, 0.058350f, 0.062317f, 0.066711f, 0.071106f, 0.075928f, 0.080750f, 0.085510f,
- 0.090820f, 0.096497f, 0.102234f, 0.107727f, 0.114075f, 0.120300f, 0.126587f, 0.133789f,
- 0.141113f, 0.148193f, 0.156006f, 0.163696f, 0.171753f, 0.180542f, 0.188965f, 0.198120f,
- 0.207275f, 0.216797f, 0.226318f, 0.236206f, 0.246338f, 0.256836f, 0.267334f, 0.278809f,
- 0.289795f, 0.300781f, 0.313232f, 0.324707f, 0.337402f, 0.349365f, 0.362305f, 0.376221f,
- 0.389404f, 0.403809f, 0.680176f, 0.696289f, 0.697266f, 0.695312f, 0.692871f, 0.689941f,
- 0.001606f, 0.004543f, 0.007450f, 0.010269f, 0.012962f, 0.015900f, 0.018677f, 0.021591f,
- 0.024628f, 0.027618f, 0.030182f, 0.033783f, 0.036194f, 0.039734f, 0.042725f, 0.046478f,
- 0.049652f, 0.053253f, 0.057251f, 0.060883f, 0.065186f, 0.069336f, 0.073730f, 0.078247f,
- 0.083252f, 0.088501f, 0.093628f, 0.099182f, 0.104553f, 0.110718f, 0.116577f, 0.123108f,
- 0.129883f, 0.136719f, 0.143921f, 0.151367f, 0.159302f, 0.167114f, 0.175415f, 0.183960f,
- 0.192871f, 0.202148f, 0.210938f, 0.221436f, 0.230713f, 0.240723f, 0.250977f, 0.261963f,
- 0.272461f, 0.283691f, 0.295166f, 0.306885f, 0.319092f, 0.331055f, 0.343750f, 0.356689f,
- 0.370361f, 0.383545f, 0.669434f, 0.687500f, 0.688965f, 0.687500f, 0.685547f, 0.682617f,
- 0.001701f, 0.004345f, 0.006802f, 0.009514f, 0.012283f, 0.014793f, 0.017288f, 0.019958f,
- 0.022614f, 0.025177f, 0.027695f, 0.030487f, 0.033081f, 0.035858f, 0.039185f, 0.042236f,
- 0.045319f, 0.048523f, 0.051941f, 0.055847f, 0.059326f, 0.063171f, 0.067139f, 0.071594f,
- 0.075928f, 0.080566f, 0.085571f, 0.090454f, 0.095520f, 0.101196f, 0.106567f, 0.112427f,
- 0.119019f, 0.125610f, 0.132324f, 0.139282f, 0.146973f, 0.154419f, 0.161987f, 0.170532f,
- 0.178833f, 0.187134f, 0.196777f, 0.206177f, 0.214966f, 0.225220f, 0.235352f, 0.246094f,
- 0.255615f, 0.266846f, 0.278320f, 0.290039f, 0.301270f, 0.313477f, 0.325195f, 0.338867f,
- 0.352539f, 0.365234f, 0.657715f, 0.678711f, 0.679688f, 0.679199f, 0.677734f, 0.675293f,
- 0.001310f, 0.003979f, 0.006393f, 0.008522f, 0.011223f, 0.013557f, 0.015976f, 0.018433f,
- 0.020737f, 0.022842f, 0.025421f, 0.027649f, 0.030289f, 0.032806f, 0.035645f, 0.038025f,
- 0.041199f, 0.044220f, 0.047058f, 0.050720f, 0.053589f, 0.057281f, 0.061157f, 0.064941f,
- 0.068787f, 0.072998f, 0.077698f, 0.082153f, 0.086975f, 0.092102f, 0.097229f, 0.103027f,
- 0.108826f, 0.114746f, 0.121094f, 0.127930f, 0.134521f, 0.141846f, 0.149292f, 0.157227f,
- 0.164673f, 0.173218f, 0.182007f, 0.190552f, 0.199951f, 0.209717f, 0.219360f, 0.229004f,
- 0.239502f, 0.250244f, 0.260986f, 0.272461f, 0.282959f, 0.295166f, 0.307373f, 0.320557f,
- 0.333252f, 0.346436f, 0.646973f, 0.668945f, 0.670898f, 0.671387f, 0.669922f, 0.668457f,
- 0.001348f, 0.003523f, 0.005863f, 0.008133f, 0.010338f, 0.012520f, 0.014511f, 0.016464f,
- 0.018768f, 0.020920f, 0.022888f, 0.025665f, 0.027588f, 0.029861f, 0.032135f, 0.034485f,
- 0.037140f, 0.040039f, 0.042725f, 0.045532f, 0.048859f, 0.051971f, 0.055237f, 0.058594f,
- 0.062408f, 0.066101f, 0.070251f, 0.074280f, 0.078735f, 0.083435f, 0.088318f, 0.093567f,
- 0.098633f, 0.104431f, 0.110291f, 0.116455f, 0.122986f, 0.129517f, 0.136963f, 0.143921f,
- 0.152222f, 0.159546f, 0.167358f, 0.176514f, 0.185181f, 0.194214f, 0.203857f, 0.213623f,
- 0.223389f, 0.233521f, 0.244385f, 0.255127f, 0.266602f, 0.277832f, 0.289307f, 0.301758f,
- 0.314697f, 0.328613f, 0.635254f, 0.659668f, 0.663086f, 0.663086f, 0.662109f, 0.660156f,
- 0.001084f, 0.003263f, 0.005554f, 0.007416f, 0.009445f, 0.011185f, 0.013161f, 0.015366f,
- 0.017136f, 0.019058f, 0.020935f, 0.022781f, 0.024857f, 0.026886f, 0.029160f, 0.031097f,
- 0.033569f, 0.035858f, 0.038361f, 0.040924f, 0.043427f, 0.046478f, 0.049500f, 0.052948f,
- 0.056122f, 0.059418f, 0.063293f, 0.067139f, 0.070923f, 0.075073f, 0.079712f, 0.084229f,
- 0.089233f, 0.094604f, 0.100037f, 0.105774f, 0.111694f, 0.117798f, 0.124634f, 0.131226f,
- 0.139038f, 0.146484f, 0.154175f, 0.162231f, 0.170654f, 0.179199f, 0.188599f, 0.197754f,
- 0.207153f, 0.217407f, 0.227295f, 0.238159f, 0.248657f, 0.260986f, 0.271973f, 0.284912f,
- 0.296631f, 0.308838f, 0.623535f, 0.650391f, 0.653809f, 0.654297f, 0.653809f, 0.652832f,
- 0.001070f, 0.003069f, 0.005108f, 0.006855f, 0.008522f, 0.010384f, 0.011993f, 0.013847f,
- 0.015549f, 0.016968f, 0.018677f, 0.020660f, 0.022079f, 0.024048f, 0.026077f, 0.027954f,
- 0.030014f, 0.032135f, 0.034210f, 0.036560f, 0.038971f, 0.041840f, 0.044434f, 0.047089f,
- 0.049896f, 0.053284f, 0.056763f, 0.060120f, 0.063477f, 0.067505f, 0.071533f, 0.075928f,
- 0.080261f, 0.085205f, 0.089905f, 0.095520f, 0.100830f, 0.106567f, 0.113159f, 0.119385f,
- 0.126221f, 0.133301f, 0.140259f, 0.148560f, 0.156494f, 0.165039f, 0.173462f, 0.182861f,
- 0.192017f, 0.201172f, 0.211548f, 0.221802f, 0.232666f, 0.243286f, 0.254639f, 0.265869f,
- 0.278809f, 0.291260f, 0.611816f, 0.640625f, 0.645508f, 0.645996f, 0.645508f, 0.645020f,
- 0.001057f, 0.002815f, 0.004646f, 0.006187f, 0.007935f, 0.009583f, 0.011139f, 0.012428f,
- 0.013878f, 0.015404f, 0.016830f, 0.018433f, 0.019836f, 0.021637f, 0.023300f, 0.024857f,
- 0.026855f, 0.028519f, 0.030533f, 0.032593f, 0.034790f, 0.037140f, 0.039520f, 0.041748f,
- 0.044525f, 0.047302f, 0.050232f, 0.053497f, 0.056580f, 0.059998f, 0.063721f, 0.067627f,
- 0.071777f, 0.076111f, 0.080627f, 0.085571f, 0.090698f, 0.096130f, 0.101624f, 0.107849f,
- 0.114258f, 0.120544f, 0.127686f, 0.135132f, 0.142700f, 0.150269f, 0.158813f, 0.167725f,
- 0.176392f, 0.185791f, 0.195312f, 0.205444f, 0.216064f, 0.226562f, 0.237793f, 0.248657f,
- 0.260254f, 0.272949f, 0.600098f, 0.631348f, 0.636230f, 0.637207f, 0.637695f, 0.636719f,
- 0.001022f, 0.002628f, 0.004486f, 0.005684f, 0.007179f, 0.008636f, 0.009911f, 0.011307f,
- 0.012428f, 0.013771f, 0.015152f, 0.016342f, 0.017822f, 0.018997f, 0.020584f, 0.022263f,
- 0.023651f, 0.025482f, 0.027191f, 0.028793f, 0.030960f, 0.032715f, 0.034912f, 0.036987f,
- 0.039368f, 0.041840f, 0.044495f, 0.047180f, 0.050110f, 0.053314f, 0.056580f, 0.060059f,
- 0.063660f, 0.067383f, 0.071777f, 0.075928f, 0.081055f, 0.085938f, 0.091187f, 0.096619f,
- 0.102356f, 0.108826f, 0.115051f, 0.121948f, 0.129150f, 0.136475f, 0.144653f, 0.152832f,
- 0.161621f, 0.170288f, 0.179932f, 0.189209f, 0.198730f, 0.209595f, 0.220459f, 0.231201f,
- 0.242798f, 0.255615f, 0.588867f, 0.621094f, 0.626953f, 0.629883f, 0.629395f, 0.629883f,
- 0.001016f, 0.002304f, 0.003975f, 0.005024f, 0.006584f, 0.007812f, 0.008926f, 0.009987f,
- 0.011024f, 0.012199f, 0.013321f, 0.014595f, 0.015617f, 0.016830f, 0.018326f, 0.019577f,
- 0.020798f, 0.022293f, 0.023758f, 0.025253f, 0.027145f, 0.028656f, 0.030640f, 0.032501f,
- 0.034546f, 0.036682f, 0.039001f, 0.041412f, 0.044037f, 0.046875f, 0.049622f, 0.052917f,
- 0.056030f, 0.059387f, 0.063354f, 0.067383f, 0.071655f, 0.075928f, 0.080750f, 0.085876f,
- 0.091248f, 0.097168f, 0.102905f, 0.109497f, 0.116272f, 0.123413f, 0.130859f, 0.138550f,
- 0.147217f, 0.155518f, 0.164551f, 0.173828f, 0.183350f, 0.193481f, 0.204102f, 0.214600f,
- 0.225342f, 0.237915f, 0.575684f, 0.611816f, 0.617188f, 0.621094f, 0.621582f, 0.620605f,
- 0.000768f, 0.002398f, 0.003801f, 0.004875f, 0.005848f, 0.006889f, 0.008072f, 0.008820f,
- 0.009758f, 0.010910f, 0.011810f, 0.013023f, 0.013878f, 0.014786f, 0.016083f, 0.017166f,
- 0.018402f, 0.019577f, 0.020691f, 0.022125f, 0.023743f, 0.025009f, 0.026779f, 0.028336f,
- 0.030075f, 0.031921f, 0.033997f, 0.036255f, 0.038452f, 0.040833f, 0.043488f, 0.045959f,
- 0.049011f, 0.052216f, 0.055634f, 0.059052f, 0.062744f, 0.066956f, 0.071289f, 0.075745f,
- 0.080566f, 0.086060f, 0.091614f, 0.097351f, 0.103821f, 0.110291f, 0.117432f, 0.124939f,
- 0.132568f, 0.140869f, 0.149414f, 0.158325f, 0.168213f, 0.177368f, 0.187744f, 0.197876f,
- 0.208984f, 0.219849f, 0.563965f, 0.602051f, 0.608887f, 0.610840f, 0.613770f, 0.612305f,
- 0.000764f, 0.002028f, 0.003302f, 0.004276f, 0.005325f, 0.006035f, 0.007034f, 0.007843f,
- 0.008904f, 0.009628f, 0.010323f, 0.011192f, 0.012039f, 0.013092f, 0.013924f, 0.014854f,
- 0.015793f, 0.016953f, 0.018036f, 0.019211f, 0.020355f, 0.021667f, 0.023010f, 0.024582f,
- 0.026016f, 0.027771f, 0.029434f, 0.031235f, 0.033264f, 0.035217f, 0.037628f, 0.039886f,
- 0.042084f, 0.044952f, 0.048126f, 0.051392f, 0.054779f, 0.058197f, 0.062164f, 0.066223f,
- 0.070740f, 0.075439f, 0.080566f, 0.086182f, 0.091919f, 0.098145f, 0.104431f, 0.111633f,
- 0.119080f, 0.126587f, 0.134888f, 0.143311f, 0.152710f, 0.162109f, 0.171631f, 0.182129f,
- 0.192139f, 0.203491f, 0.552246f, 0.591309f, 0.599609f, 0.602539f, 0.604004f, 0.604980f,
- 0.000782f, 0.001970f, 0.003082f, 0.003859f, 0.004635f, 0.005611f, 0.006123f, 0.006767f,
- 0.007595f, 0.008270f, 0.009140f, 0.009674f, 0.010490f, 0.011040f, 0.011902f, 0.012749f,
- 0.013573f, 0.014526f, 0.015656f, 0.016541f, 0.017548f, 0.018631f, 0.019730f, 0.021103f,
- 0.022446f, 0.023758f, 0.025162f, 0.026611f, 0.028458f, 0.030441f, 0.032074f, 0.034302f,
- 0.036316f, 0.038727f, 0.041138f, 0.044098f, 0.046997f, 0.050232f, 0.053711f, 0.057281f,
- 0.061340f, 0.065491f, 0.070435f, 0.075256f, 0.080688f, 0.086426f, 0.092346f, 0.098694f,
- 0.105896f, 0.113098f, 0.120911f, 0.129028f, 0.137695f, 0.146606f, 0.155884f, 0.165894f,
- 0.175903f, 0.186768f, 0.540527f, 0.582520f, 0.590332f, 0.593750f, 0.594727f, 0.596191f,
- 0.000711f, 0.001649f, 0.002529f, 0.003332f, 0.004036f, 0.004799f, 0.005444f, 0.006050f,
- 0.006638f, 0.007160f, 0.007771f, 0.008331f, 0.008980f, 0.009644f, 0.010307f, 0.010887f,
- 0.011787f, 0.012306f, 0.013176f, 0.014099f, 0.014915f, 0.015839f, 0.016708f, 0.017822f,
- 0.019073f, 0.020233f, 0.021423f, 0.022690f, 0.024033f, 0.025589f, 0.027344f, 0.028976f,
- 0.030930f, 0.032990f, 0.035156f, 0.037445f, 0.040131f, 0.042847f, 0.045776f, 0.049042f,
- 0.052551f, 0.056519f, 0.060486f, 0.064941f, 0.069458f, 0.074951f, 0.080444f, 0.086487f,
- 0.092957f, 0.099915f, 0.107361f, 0.114929f, 0.123535f, 0.131714f, 0.140747f, 0.150513f,
- 0.160767f, 0.171265f, 0.527832f, 0.572754f, 0.581543f, 0.583496f, 0.586426f, 0.587402f,
- 0.000504f, 0.001575f, 0.002235f, 0.003147f, 0.003641f, 0.004150f, 0.004570f, 0.005173f,
- 0.005863f, 0.006016f, 0.006462f, 0.007111f, 0.007660f, 0.008156f, 0.008736f, 0.009354f,
- 0.010094f, 0.010475f, 0.011253f, 0.011879f, 0.012657f, 0.013603f, 0.014267f, 0.015099f,
- 0.016144f, 0.017014f, 0.017990f, 0.019104f, 0.020416f, 0.021652f, 0.022919f, 0.024353f,
- 0.025986f, 0.027710f, 0.029602f, 0.031494f, 0.033722f, 0.036102f, 0.038635f, 0.041412f,
- 0.044525f, 0.047729f, 0.051636f, 0.055511f, 0.059540f, 0.064331f, 0.069580f, 0.075073f,
- 0.080750f, 0.087341f, 0.094116f, 0.101379f, 0.109558f, 0.117676f, 0.126221f, 0.135376f,
- 0.145874f, 0.155518f, 0.516113f, 0.562012f, 0.571777f, 0.576172f, 0.578125f, 0.579102f,
- 0.000445f, 0.001304f, 0.002201f, 0.002535f, 0.003126f, 0.003664f, 0.004047f, 0.004463f,
- 0.004887f, 0.005234f, 0.005711f, 0.005997f, 0.006500f, 0.006901f, 0.007389f, 0.007904f,
- 0.008293f, 0.008919f, 0.009499f, 0.009941f, 0.010635f, 0.011269f, 0.011948f, 0.012589f,
- 0.013435f, 0.014252f, 0.015091f, 0.016052f, 0.017059f, 0.017960f, 0.019241f, 0.020264f,
- 0.021667f, 0.022995f, 0.024628f, 0.026230f, 0.027985f, 0.029984f, 0.032288f, 0.034515f,
- 0.037140f, 0.040009f, 0.043152f, 0.046722f, 0.050354f, 0.054504f, 0.059143f, 0.064026f,
- 0.069458f, 0.075256f, 0.081726f, 0.088562f, 0.095825f, 0.103516f, 0.112000f, 0.120850f,
- 0.130005f, 0.140381f, 0.502441f, 0.551758f, 0.562012f, 0.566406f, 0.568848f, 0.571289f,
- 0.000396f, 0.001226f, 0.001812f, 0.002357f, 0.002796f, 0.003094f, 0.003328f, 0.003763f,
- 0.003979f, 0.004364f, 0.004642f, 0.005051f, 0.005489f, 0.005745f, 0.006126f, 0.006611f,
- 0.007004f, 0.007473f, 0.007771f, 0.008293f, 0.008919f, 0.009392f, 0.009941f, 0.010483f,
- 0.011169f, 0.011765f, 0.012436f, 0.013344f, 0.014030f, 0.014908f, 0.015778f, 0.016769f,
- 0.017838f, 0.018997f, 0.020279f, 0.021622f, 0.023056f, 0.024704f, 0.026474f, 0.028580f,
- 0.030579f, 0.033051f, 0.035706f, 0.038605f, 0.041840f, 0.045380f, 0.049500f, 0.053986f,
- 0.058685f, 0.063843f, 0.069885f, 0.076050f, 0.083191f, 0.090576f, 0.098511f, 0.107056f,
- 0.115479f, 0.125122f, 0.491211f, 0.541504f, 0.552734f, 0.557617f, 0.560547f, 0.562012f,
- 0.000559f, 0.001152f, 0.001668f, 0.001955f, 0.002234f, 0.002550f, 0.002821f, 0.003057f,
- 0.003296f, 0.003635f, 0.003948f, 0.004189f, 0.004448f, 0.004761f, 0.005077f, 0.005417f,
- 0.005699f, 0.006142f, 0.006458f, 0.006844f, 0.007271f, 0.007717f, 0.008156f, 0.008675f,
- 0.009132f, 0.009590f, 0.010277f, 0.010864f, 0.011482f, 0.012131f, 0.012901f, 0.013741f,
- 0.014595f, 0.015549f, 0.016525f, 0.017563f, 0.018799f, 0.020111f, 0.021484f, 0.023087f,
- 0.024765f, 0.026840f, 0.028992f, 0.031403f, 0.034119f, 0.037323f, 0.040680f, 0.044464f,
- 0.048584f, 0.053345f, 0.058838f, 0.064514f, 0.071045f, 0.078247f, 0.085571f, 0.093567f,
- 0.101685f, 0.111023f, 0.477539f, 0.531738f, 0.542969f, 0.548340f, 0.552246f, 0.553711f,
- 0.000459f, 0.000939f, 0.001184f, 0.001600f, 0.001761f, 0.002144f, 0.002258f, 0.002546f,
- 0.002708f, 0.002922f, 0.003157f, 0.003414f, 0.003588f, 0.003918f, 0.004154f, 0.004387f,
- 0.004662f, 0.004993f, 0.005249f, 0.005566f, 0.005867f, 0.006252f, 0.006573f, 0.007061f,
- 0.007408f, 0.007858f, 0.008270f, 0.008713f, 0.009361f, 0.009911f, 0.010513f, 0.011047f,
- 0.011841f, 0.012566f, 0.013252f, 0.014175f, 0.015182f, 0.016220f, 0.017258f, 0.018524f,
- 0.019882f, 0.021454f, 0.023132f, 0.025146f, 0.027405f, 0.029877f, 0.032745f, 0.035919f,
- 0.039642f, 0.043823f, 0.048492f, 0.053619f, 0.059235f, 0.065735f, 0.072693f, 0.080383f,
- 0.088867f, 0.097412f, 0.466309f, 0.520508f, 0.533691f, 0.539062f, 0.542480f, 0.543945f,
- 0.000369f, 0.000915f, 0.001124f, 0.001297f, 0.001534f, 0.001741f, 0.001833f, 0.002111f,
- 0.002272f, 0.002369f, 0.002516f, 0.002766f, 0.002920f, 0.003162f, 0.003317f, 0.003551f,
- 0.003723f, 0.003941f, 0.004211f, 0.004425f, 0.004757f, 0.004993f, 0.005306f, 0.005581f,
- 0.005859f, 0.006203f, 0.006592f, 0.007015f, 0.007450f, 0.007828f, 0.008377f, 0.008797f,
- 0.009361f, 0.009895f, 0.010582f, 0.011322f, 0.012016f, 0.012772f, 0.013687f, 0.014748f,
- 0.015778f, 0.016907f, 0.018326f, 0.019821f, 0.021622f, 0.023483f, 0.025742f, 0.028473f,
- 0.031525f, 0.034943f, 0.038910f, 0.043457f, 0.048645f, 0.054749f, 0.061279f, 0.068420f,
- 0.076111f, 0.084778f, 0.453613f, 0.510742f, 0.523926f, 0.529785f, 0.533203f, 0.536133f,
- 0.000186f, 0.000582f, 0.000925f, 0.001026f, 0.001228f, 0.001351f, 0.001470f, 0.001606f,
- 0.001765f, 0.001908f, 0.001999f, 0.002104f, 0.002281f, 0.002476f, 0.002659f, 0.002766f,
- 0.002911f, 0.003040f, 0.003344f, 0.003475f, 0.003683f, 0.003922f, 0.004185f, 0.004417f,
- 0.004673f, 0.004890f, 0.005123f, 0.005440f, 0.005817f, 0.006126f, 0.006481f, 0.006859f,
- 0.007275f, 0.007740f, 0.008202f, 0.008728f, 0.009315f, 0.009972f, 0.010597f, 0.011391f,
- 0.012268f, 0.013252f, 0.014221f, 0.015388f, 0.016724f, 0.018265f, 0.020004f, 0.022049f,
- 0.024445f, 0.027206f, 0.030762f, 0.034424f, 0.038971f, 0.044220f, 0.050262f, 0.056976f,
- 0.064575f, 0.072083f, 0.441650f, 0.500488f, 0.514160f, 0.520020f, 0.524414f, 0.526855f,
- 0.000194f, 0.000467f, 0.000775f, 0.000911f, 0.000994f, 0.001081f, 0.001221f, 0.001204f,
- 0.001368f, 0.001479f, 0.001582f, 0.001707f, 0.001801f, 0.001921f, 0.001993f, 0.002146f,
- 0.002245f, 0.002398f, 0.002531f, 0.002674f, 0.002871f, 0.003033f, 0.003172f, 0.003374f,
- 0.003519f, 0.003742f, 0.003963f, 0.004158f, 0.004448f, 0.004650f, 0.005032f, 0.005230f,
- 0.005550f, 0.005932f, 0.006241f, 0.006634f, 0.007088f, 0.007572f, 0.008110f, 0.008636f,
- 0.009323f, 0.010071f, 0.010834f, 0.011757f, 0.012779f, 0.013863f, 0.015190f, 0.016769f,
- 0.018555f, 0.020706f, 0.023331f, 0.026352f, 0.030182f, 0.034760f, 0.040039f, 0.046356f,
- 0.053406f, 0.060638f, 0.427979f, 0.489502f, 0.504883f, 0.511719f, 0.515137f, 0.518066f,
- 0.000339f, 0.000388f, 0.000559f, 0.000617f, 0.000667f, 0.000795f, 0.000853f, 0.000938f,
- 0.000972f, 0.001079f, 0.001217f, 0.001274f, 0.001369f, 0.001480f, 0.001536f, 0.001581f,
- 0.001711f, 0.001804f, 0.001900f, 0.002047f, 0.002129f, 0.002245f, 0.002394f, 0.002493f,
- 0.002645f, 0.002773f, 0.002974f, 0.003124f, 0.003307f, 0.003559f, 0.003757f, 0.003893f,
- 0.004169f, 0.004353f, 0.004684f, 0.004963f, 0.005272f, 0.005615f, 0.005981f, 0.006420f,
- 0.006878f, 0.007378f, 0.008080f, 0.008682f, 0.009438f, 0.010239f, 0.011299f, 0.012459f,
- 0.013809f, 0.015305f, 0.017212f, 0.019501f, 0.022583f, 0.026245f, 0.030838f, 0.036255f,
- 0.042938f, 0.049988f, 0.416504f, 0.479492f, 0.495361f, 0.501465f, 0.505859f, 0.508789f,
- 0.000148f, 0.000349f, 0.000414f, 0.000480f, 0.000554f, 0.000575f, 0.000675f, 0.000641f,
- 0.000743f, 0.000809f, 0.000882f, 0.000919f, 0.000967f, 0.001019f, 0.001122f, 0.001156f,
- 0.001264f, 0.001322f, 0.001392f, 0.001431f, 0.001529f, 0.001625f, 0.001735f, 0.001802f,
- 0.001912f, 0.002007f, 0.002131f, 0.002237f, 0.002338f, 0.002525f, 0.002638f, 0.002850f,
- 0.002962f, 0.003130f, 0.003347f, 0.003536f, 0.003784f, 0.004063f, 0.004364f, 0.004623f,
- 0.004929f, 0.005314f, 0.005714f, 0.006191f, 0.006760f, 0.007385f, 0.008080f, 0.008919f,
- 0.009933f, 0.011078f, 0.012390f, 0.014130f, 0.016251f, 0.019012f, 0.022720f, 0.027496f,
- 0.033234f, 0.040192f, 0.403320f, 0.468994f, 0.485352f, 0.491943f, 0.497070f, 0.500000f,
- 0.000093f, 0.000191f, 0.000299f, 0.000284f, 0.000367f, 0.000453f, 0.000420f, 0.000467f,
- 0.000519f, 0.000611f, 0.000607f, 0.000626f, 0.000647f, 0.000722f, 0.000741f, 0.000815f,
- 0.000829f, 0.000910f, 0.000967f, 0.001023f, 0.001076f, 0.001138f, 0.001197f, 0.001260f,
- 0.001334f, 0.001393f, 0.001490f, 0.001562f, 0.001633f, 0.001772f, 0.001831f, 0.001949f,
- 0.002056f, 0.002167f, 0.002312f, 0.002472f, 0.002607f, 0.002781f, 0.002972f, 0.003145f,
- 0.003387f, 0.003647f, 0.003941f, 0.004253f, 0.004604f, 0.005051f, 0.005558f, 0.006165f,
- 0.006836f, 0.007660f, 0.008652f, 0.009796f, 0.011284f, 0.013260f, 0.015945f, 0.019608f,
- 0.024734f, 0.031082f, 0.390625f, 0.459229f, 0.475586f, 0.482910f, 0.488037f, 0.490723f,
- 0.000132f, 0.000208f, 0.000217f, 0.000221f, 0.000267f, 0.000272f, 0.000277f, 0.000320f,
- 0.000356f, 0.000372f, 0.000372f, 0.000446f, 0.000436f, 0.000487f, 0.000514f, 0.000531f,
- 0.000587f, 0.000601f, 0.000629f, 0.000658f, 0.000707f, 0.000736f, 0.000784f, 0.000816f,
- 0.000880f, 0.000909f, 0.000978f, 0.001035f, 0.001084f, 0.001135f, 0.001200f, 0.001278f,
- 0.001357f, 0.001429f, 0.001516f, 0.001588f, 0.001724f, 0.001802f, 0.001949f, 0.002085f,
- 0.002230f, 0.002373f, 0.002554f, 0.002743f, 0.003000f, 0.003300f, 0.003611f, 0.003963f,
- 0.004425f, 0.004967f, 0.005630f, 0.006424f, 0.007462f, 0.008812f, 0.010551f, 0.013184f,
- 0.017258f, 0.022980f, 0.377686f, 0.448242f, 0.465820f, 0.474121f, 0.478760f, 0.481934f,
- 0.000041f, 0.000149f, 0.000126f, 0.000128f, 0.000158f, 0.000196f, 0.000174f, 0.000206f,
- 0.000216f, 0.000223f, 0.000231f, 0.000244f, 0.000276f, 0.000291f, 0.000312f, 0.000326f,
- 0.000338f, 0.000374f, 0.000387f, 0.000423f, 0.000430f, 0.000447f, 0.000471f, 0.000509f,
- 0.000538f, 0.000583f, 0.000591f, 0.000613f, 0.000659f, 0.000688f, 0.000743f, 0.000779f,
- 0.000833f, 0.000865f, 0.000924f, 0.000966f, 0.001033f, 0.001106f, 0.001186f, 0.001245f,
- 0.001336f, 0.001453f, 0.001559f, 0.001685f, 0.001807f, 0.001980f, 0.002207f, 0.002417f,
- 0.002689f, 0.003027f, 0.003418f, 0.003933f, 0.004604f, 0.005482f, 0.006641f, 0.008263f,
- 0.011017f, 0.015778f, 0.364746f, 0.437256f, 0.456055f, 0.463623f, 0.469238f, 0.472656f,
- 0.000100f, 0.000089f, 0.000085f, 0.000081f, 0.000101f, 0.000096f, 0.000116f, 0.000116f,
- 0.000119f, 0.000126f, 0.000141f, 0.000157f, 0.000149f, 0.000158f, 0.000179f, 0.000176f,
- 0.000195f, 0.000206f, 0.000216f, 0.000222f, 0.000240f, 0.000246f, 0.000269f, 0.000279f,
- 0.000303f, 0.000320f, 0.000333f, 0.000345f, 0.000365f, 0.000379f, 0.000409f, 0.000434f,
- 0.000453f, 0.000477f, 0.000511f, 0.000541f, 0.000569f, 0.000608f, 0.000656f, 0.000689f,
- 0.000738f, 0.000795f, 0.000867f, 0.000918f, 0.001005f, 0.001087f, 0.001189f, 0.001312f,
- 0.001465f, 0.001656f, 0.001873f, 0.002171f, 0.002546f, 0.003056f, 0.003767f, 0.004765f,
- 0.006390f, 0.009811f, 0.353516f, 0.426758f, 0.446045f, 0.455078f, 0.459717f, 0.464111f,
- 0.000084f, 0.000059f, 0.000050f, 0.000049f, 0.000049f, 0.000047f, 0.000052f, 0.000058f,
- 0.000061f, 0.000075f, 0.000065f, 0.000066f, 0.000080f, 0.000071f, 0.000076f, 0.000082f,
- 0.000092f, 0.000102f, 0.000100f, 0.000105f, 0.000110f, 0.000115f, 0.000121f, 0.000133f,
- 0.000140f, 0.000146f, 0.000152f, 0.000164f, 0.000177f, 0.000185f, 0.000192f, 0.000202f,
- 0.000213f, 0.000224f, 0.000241f, 0.000252f, 0.000268f, 0.000283f, 0.000310f, 0.000328f,
- 0.000348f, 0.000374f, 0.000406f, 0.000431f, 0.000470f, 0.000515f, 0.000560f, 0.000614f,
- 0.000688f, 0.000771f, 0.000884f, 0.001019f, 0.001202f, 0.001466f, 0.001827f, 0.002369f,
- 0.003269f, 0.005184f, 0.341797f, 0.416016f, 0.435791f, 0.445557f, 0.450928f, 0.455078f,
- 0.000062f, 0.000042f, 0.000035f, 0.000030f, 0.000028f, 0.000026f, 0.000024f, 0.000023f,
- 0.000023f, 0.000023f, 0.000023f, 0.000030f, 0.000024f, 0.000024f, 0.000031f, 0.000034f,
- 0.000035f, 0.000037f, 0.000039f, 0.000040f, 0.000043f, 0.000048f, 0.000050f, 0.000046f,
- 0.000051f, 0.000057f, 0.000059f, 0.000058f, 0.000063f, 0.000068f, 0.000070f, 0.000077f,
- 0.000082f, 0.000082f, 0.000086f, 0.000093f, 0.000100f, 0.000106f, 0.000114f, 0.000120f,
- 0.000131f, 0.000136f, 0.000145f, 0.000161f, 0.000171f, 0.000186f, 0.000204f, 0.000222f,
- 0.000251f, 0.000281f, 0.000318f, 0.000364f, 0.000430f, 0.000530f, 0.000672f, 0.000902f,
- 0.001316f, 0.002153f, 0.329346f, 0.406006f, 0.426758f, 0.436035f, 0.441650f, 0.445801f,
- 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f,
- 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f,
- 0.000008f, 0.000008f, 0.000007f, 0.000007f, 0.000007f, 0.000008f, 0.000009f, 0.000010f,
- 0.000011f, 0.000012f, 0.000012f, 0.000014f, 0.000014f, 0.000013f, 0.000015f, 0.000016f,
- 0.000018f, 0.000019f, 0.000019f, 0.000020f, 0.000023f, 0.000023f, 0.000025f, 0.000027f,
- 0.000028f, 0.000031f, 0.000034f, 0.000034f, 0.000037f, 0.000041f, 0.000045f, 0.000049f,
- 0.000053f, 0.000059f, 0.000066f, 0.000079f, 0.000093f, 0.000112f, 0.000144f, 0.000196f,
- 0.000307f, 0.000598f, 0.317383f, 0.394531f, 0.416504f, 0.425781f, 0.432129f, 0.436279f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000007f,
- 0.000010f, 0.000026f, 0.305420f, 0.384277f, 0.405762f, 0.416504f, 0.423340f, 0.427246f,
- },
- {
- 0.009338f, 0.028412f, 0.047394f, 0.066895f, 0.086548f, 0.105774f, 0.125854f, 0.145142f,
- 0.165039f, 0.184570f, 0.204712f, 0.223389f, 0.243164f, 0.261719f, 0.280762f, 0.299805f,
- 0.318848f, 0.338135f, 0.356445f, 0.374512f, 0.393066f, 0.412354f, 0.429932f, 0.447510f,
- 0.465576f, 0.483887f, 0.501465f, 0.518555f, 0.536133f, 0.553711f, 0.570312f, 0.587402f,
- 0.604492f, 0.621094f, 0.637695f, 0.653809f, 0.670898f, 0.687012f, 0.702637f, 0.719238f,
- 0.734863f, 0.750488f, 0.765137f, 0.780762f, 0.795898f, 0.811523f, 0.825684f, 0.840820f,
- 0.855469f, 0.870605f, 0.884277f, 0.899414f, 0.913086f, 0.926758f, 0.940918f, 0.955078f,
- 0.967773f, 0.981934f, 0.966797f, 0.923828f, 0.894531f, 0.870605f, 0.850586f, 0.832520f,
- 0.008652f, 0.026825f, 0.045380f, 0.063965f, 0.082703f, 0.101807f, 0.120544f, 0.139282f,
- 0.158569f, 0.177246f, 0.196167f, 0.214722f, 0.233521f, 0.252197f, 0.270508f, 0.289062f,
- 0.307861f, 0.325928f, 0.343994f, 0.361328f, 0.380615f, 0.397705f, 0.415771f, 0.433594f,
- 0.450928f, 0.469238f, 0.485596f, 0.502930f, 0.520020f, 0.537598f, 0.553223f, 0.570801f,
- 0.586914f, 0.603516f, 0.620117f, 0.636719f, 0.652832f, 0.668945f, 0.683594f, 0.700684f,
- 0.716309f, 0.731934f, 0.746582f, 0.762695f, 0.777344f, 0.792480f, 0.807617f, 0.821777f,
- 0.836914f, 0.850586f, 0.865723f, 0.880371f, 0.894043f, 0.908691f, 0.921875f, 0.937012f,
- 0.950195f, 0.963867f, 0.958496f, 0.917969f, 0.889648f, 0.867188f, 0.847656f, 0.830566f,
- 0.008293f, 0.025620f, 0.042999f, 0.061035f, 0.079163f, 0.097656f, 0.115112f, 0.132812f,
- 0.151367f, 0.170532f, 0.188599f, 0.206787f, 0.223999f, 0.242920f, 0.259766f, 0.278809f,
- 0.296143f, 0.313232f, 0.331055f, 0.349609f, 0.367432f, 0.385010f, 0.401611f, 0.418945f,
- 0.435791f, 0.453369f, 0.469727f, 0.487061f, 0.503906f, 0.520508f, 0.537598f, 0.553223f,
- 0.569824f, 0.586426f, 0.603027f, 0.619141f, 0.634277f, 0.650879f, 0.666504f, 0.682129f,
- 0.697754f, 0.713379f, 0.729004f, 0.743164f, 0.758301f, 0.773926f, 0.789062f, 0.803711f,
- 0.818359f, 0.833008f, 0.847168f, 0.862305f, 0.875488f, 0.890137f, 0.903809f, 0.917480f,
- 0.931152f, 0.945801f, 0.950195f, 0.911133f, 0.884766f, 0.862793f, 0.844238f, 0.828125f,
- 0.008148f, 0.024506f, 0.041016f, 0.058289f, 0.075256f, 0.092712f, 0.109802f, 0.127319f,
- 0.145020f, 0.162964f, 0.180298f, 0.198120f, 0.215454f, 0.232300f, 0.250244f, 0.267822f,
- 0.285400f, 0.302734f, 0.318848f, 0.335693f, 0.354004f, 0.371582f, 0.388672f, 0.405029f,
- 0.421143f, 0.438965f, 0.455078f, 0.472168f, 0.487549f, 0.503906f, 0.521484f, 0.537598f,
- 0.551758f, 0.568359f, 0.584961f, 0.601562f, 0.616211f, 0.633301f, 0.648926f, 0.664062f,
- 0.679199f, 0.694824f, 0.709473f, 0.725098f, 0.740234f, 0.755371f, 0.770020f, 0.785156f,
- 0.799805f, 0.813965f, 0.828125f, 0.842773f, 0.856934f, 0.871582f, 0.884766f, 0.898926f,
- 0.912598f, 0.926270f, 0.941895f, 0.905273f, 0.879883f, 0.858887f, 0.840332f, 0.824707f,
- 0.007523f, 0.023010f, 0.039246f, 0.055542f, 0.072021f, 0.088257f, 0.105347f, 0.122070f,
- 0.138306f, 0.155273f, 0.172852f, 0.189575f, 0.206421f, 0.223145f, 0.240112f, 0.256592f,
- 0.274170f, 0.291260f, 0.307617f, 0.323730f, 0.340576f, 0.358154f, 0.374023f, 0.390137f,
- 0.406738f, 0.422852f, 0.440430f, 0.456543f, 0.472656f, 0.489014f, 0.504395f, 0.520996f,
- 0.537109f, 0.552734f, 0.568848f, 0.584473f, 0.599121f, 0.615234f, 0.630859f, 0.645020f,
- 0.660645f, 0.677246f, 0.690918f, 0.706055f, 0.721680f, 0.736328f, 0.750977f, 0.766113f,
- 0.780273f, 0.794922f, 0.809570f, 0.823730f, 0.837891f, 0.852539f, 0.866211f, 0.880371f,
- 0.894531f, 0.908691f, 0.933105f, 0.898438f, 0.874023f, 0.853516f, 0.836426f, 0.821289f,
- 0.007339f, 0.021912f, 0.037170f, 0.052948f, 0.068665f, 0.084412f, 0.100281f, 0.116333f,
- 0.133057f, 0.149048f, 0.164795f, 0.181274f, 0.198242f, 0.214233f, 0.230835f, 0.247314f,
- 0.262939f, 0.279053f, 0.295898f, 0.312500f, 0.328613f, 0.344971f, 0.360107f, 0.376953f,
- 0.392578f, 0.408691f, 0.425293f, 0.441406f, 0.456787f, 0.472656f, 0.488525f, 0.504883f,
- 0.520020f, 0.535156f, 0.550781f, 0.567383f, 0.582520f, 0.597656f, 0.612793f, 0.628418f,
- 0.642578f, 0.657715f, 0.673340f, 0.688477f, 0.702637f, 0.718750f, 0.731445f, 0.748047f,
- 0.762207f, 0.775879f, 0.791016f, 0.804199f, 0.818848f, 0.833008f, 0.847656f, 0.861328f,
- 0.875000f, 0.890625f, 0.924316f, 0.891602f, 0.868164f, 0.849121f, 0.832520f, 0.817871f,
- 0.006817f, 0.021133f, 0.035675f, 0.050018f, 0.065186f, 0.080505f, 0.096069f, 0.111389f,
- 0.126831f, 0.142456f, 0.158203f, 0.174194f, 0.189819f, 0.205444f, 0.220703f, 0.237183f,
- 0.253174f, 0.268555f, 0.284668f, 0.300049f, 0.316406f, 0.332275f, 0.347656f, 0.363281f,
- 0.379395f, 0.394775f, 0.409668f, 0.426270f, 0.442139f, 0.457275f, 0.472656f, 0.488037f,
- 0.503906f, 0.518555f, 0.534668f, 0.548828f, 0.564941f, 0.579590f, 0.595215f, 0.610352f,
- 0.625000f, 0.640137f, 0.654785f, 0.669434f, 0.685059f, 0.699707f, 0.713379f, 0.728027f,
- 0.742676f, 0.758301f, 0.770996f, 0.786621f, 0.799316f, 0.813965f, 0.828613f, 0.842285f,
- 0.856445f, 0.871094f, 0.915527f, 0.884766f, 0.862305f, 0.843750f, 0.827637f, 0.813965f,
- 0.006611f, 0.020111f, 0.033752f, 0.047974f, 0.062378f, 0.076843f, 0.091431f, 0.106262f,
- 0.120911f, 0.136230f, 0.151123f, 0.166382f, 0.181396f, 0.196899f, 0.211670f, 0.227295f,
- 0.242554f, 0.257812f, 0.272705f, 0.288086f, 0.304199f, 0.318848f, 0.334473f, 0.349609f,
- 0.365967f, 0.379883f, 0.395996f, 0.410889f, 0.426270f, 0.441895f, 0.457764f, 0.472412f,
- 0.487061f, 0.502930f, 0.517090f, 0.532227f, 0.547363f, 0.563477f, 0.577637f, 0.592285f,
- 0.606934f, 0.621582f, 0.636230f, 0.651367f, 0.665039f, 0.679688f, 0.694336f, 0.709473f,
- 0.724121f, 0.738770f, 0.752930f, 0.767578f, 0.780762f, 0.795410f, 0.809082f, 0.823242f,
- 0.837891f, 0.852539f, 0.906250f, 0.877441f, 0.855957f, 0.838379f, 0.823242f, 0.809570f,
- 0.006153f, 0.019150f, 0.031952f, 0.045624f, 0.059326f, 0.073303f, 0.087158f, 0.101562f,
- 0.115540f, 0.129395f, 0.144653f, 0.159180f, 0.173584f, 0.187866f, 0.203613f, 0.217651f,
- 0.232300f, 0.247559f, 0.262207f, 0.277344f, 0.292969f, 0.307617f, 0.322021f, 0.336914f,
- 0.352051f, 0.367188f, 0.381592f, 0.396729f, 0.411377f, 0.427002f, 0.440918f, 0.456787f,
- 0.471436f, 0.486572f, 0.500977f, 0.514648f, 0.530273f, 0.545410f, 0.560059f, 0.574219f,
- 0.589355f, 0.604004f, 0.618164f, 0.632324f, 0.647461f, 0.661133f, 0.676270f, 0.691406f,
- 0.705078f, 0.719727f, 0.733887f, 0.748047f, 0.763184f, 0.777344f, 0.791016f, 0.805176f,
- 0.819336f, 0.833496f, 0.896973f, 0.870117f, 0.849609f, 0.833008f, 0.818359f, 0.805176f,
- 0.005947f, 0.018311f, 0.030731f, 0.043243f, 0.056732f, 0.069580f, 0.083435f, 0.096558f,
- 0.110474f, 0.123962f, 0.137695f, 0.152100f, 0.166016f, 0.180054f, 0.194092f, 0.208862f,
- 0.222656f, 0.236816f, 0.251465f, 0.266113f, 0.281250f, 0.294922f, 0.309814f, 0.324219f,
- 0.338623f, 0.352783f, 0.368164f, 0.382568f, 0.397461f, 0.411377f, 0.426025f, 0.441162f,
- 0.455078f, 0.469971f, 0.484131f, 0.499268f, 0.513672f, 0.528320f, 0.542969f, 0.557129f,
- 0.571289f, 0.585449f, 0.599609f, 0.614258f, 0.628418f, 0.643066f, 0.657227f, 0.671875f,
- 0.686523f, 0.700195f, 0.714355f, 0.729004f, 0.743164f, 0.756836f, 0.770996f, 0.785645f,
- 0.800293f, 0.814453f, 0.888184f, 0.862305f, 0.843262f, 0.827148f, 0.813477f, 0.800781f,
- 0.005646f, 0.017136f, 0.029388f, 0.041534f, 0.053802f, 0.066162f, 0.078979f, 0.092285f,
- 0.104980f, 0.118408f, 0.130981f, 0.144897f, 0.158203f, 0.172363f, 0.185547f, 0.199951f,
- 0.213501f, 0.226440f, 0.240356f, 0.254883f, 0.269287f, 0.283691f, 0.297607f, 0.311279f,
- 0.325439f, 0.339600f, 0.353760f, 0.368408f, 0.382812f, 0.396973f, 0.410645f, 0.425049f,
- 0.439697f, 0.454102f, 0.468262f, 0.482178f, 0.496094f, 0.510742f, 0.524902f, 0.539551f,
- 0.554199f, 0.568359f, 0.582031f, 0.596191f, 0.610352f, 0.624023f, 0.639160f, 0.652832f,
- 0.667969f, 0.681152f, 0.696289f, 0.709961f, 0.723633f, 0.738770f, 0.752441f, 0.765625f,
- 0.780273f, 0.794922f, 0.878418f, 0.855469f, 0.836914f, 0.821289f, 0.808105f, 0.796387f,
- 0.005478f, 0.016174f, 0.027740f, 0.038849f, 0.051270f, 0.063293f, 0.075317f, 0.087402f,
- 0.099854f, 0.112793f, 0.125366f, 0.138184f, 0.151001f, 0.164307f, 0.177734f, 0.190918f,
- 0.204102f, 0.217529f, 0.231079f, 0.244141f, 0.257324f, 0.271240f, 0.284668f, 0.299072f,
- 0.312744f, 0.326660f, 0.339600f, 0.354004f, 0.368408f, 0.382324f, 0.395264f, 0.410156f,
- 0.423096f, 0.437500f, 0.452148f, 0.465332f, 0.480469f, 0.493408f, 0.507812f, 0.521484f,
- 0.535645f, 0.549316f, 0.563477f, 0.578125f, 0.592285f, 0.605957f, 0.620605f, 0.634766f,
- 0.647949f, 0.662109f, 0.676758f, 0.691406f, 0.705078f, 0.718750f, 0.732910f, 0.747559f,
- 0.762207f, 0.777344f, 0.869141f, 0.847656f, 0.830078f, 0.815430f, 0.802734f, 0.791504f,
- 0.005005f, 0.015762f, 0.026657f, 0.037384f, 0.048218f, 0.059998f, 0.071594f, 0.083618f,
- 0.095215f, 0.107666f, 0.119141f, 0.131958f, 0.144043f, 0.156128f, 0.169800f, 0.182129f,
- 0.194824f, 0.207031f, 0.219849f, 0.233032f, 0.247559f, 0.260010f, 0.272949f, 0.286133f,
- 0.300293f, 0.313477f, 0.326172f, 0.339844f, 0.353516f, 0.367188f, 0.381592f, 0.394531f,
- 0.407959f, 0.422363f, 0.436279f, 0.449463f, 0.462891f, 0.477539f, 0.490723f, 0.504395f,
- 0.518066f, 0.532227f, 0.545898f, 0.560059f, 0.574219f, 0.586914f, 0.602051f, 0.616211f,
- 0.629395f, 0.644531f, 0.657227f, 0.671875f, 0.685547f, 0.699707f, 0.713867f, 0.728516f,
- 0.742676f, 0.756836f, 0.859375f, 0.840332f, 0.823730f, 0.809082f, 0.797363f, 0.786621f,
- 0.004894f, 0.014786f, 0.025269f, 0.035614f, 0.045990f, 0.057129f, 0.068420f, 0.079224f,
- 0.090698f, 0.102112f, 0.113708f, 0.125610f, 0.137817f, 0.149536f, 0.161377f, 0.174316f,
- 0.185791f, 0.198486f, 0.211670f, 0.223389f, 0.236816f, 0.249512f, 0.261230f, 0.274414f,
- 0.287598f, 0.300537f, 0.313232f, 0.326904f, 0.340576f, 0.353027f, 0.366211f, 0.379883f,
- 0.393066f, 0.406006f, 0.419678f, 0.433350f, 0.446289f, 0.460205f, 0.473633f, 0.487305f,
- 0.500977f, 0.515137f, 0.528320f, 0.542480f, 0.554688f, 0.569824f, 0.583008f, 0.597656f,
- 0.610840f, 0.625488f, 0.638672f, 0.652832f, 0.666504f, 0.681152f, 0.694824f, 0.708984f,
- 0.723145f, 0.737793f, 0.850098f, 0.833008f, 0.817383f, 0.802734f, 0.791992f, 0.780762f,
- 0.004536f, 0.014160f, 0.023972f, 0.033630f, 0.043823f, 0.053955f, 0.064697f, 0.075195f,
- 0.086365f, 0.096802f, 0.108276f, 0.119751f, 0.130493f, 0.142212f, 0.153687f, 0.165405f,
- 0.177246f, 0.189331f, 0.201538f, 0.213501f, 0.225464f, 0.237915f, 0.250244f, 0.262939f,
- 0.274902f, 0.288086f, 0.300781f, 0.312988f, 0.326172f, 0.339600f, 0.352051f, 0.365479f,
- 0.377930f, 0.390625f, 0.403564f, 0.417480f, 0.430420f, 0.444092f, 0.457520f, 0.470215f,
- 0.483643f, 0.497559f, 0.510742f, 0.524414f, 0.537598f, 0.551270f, 0.564941f, 0.579102f,
- 0.592285f, 0.605957f, 0.619629f, 0.633789f, 0.647949f, 0.661621f, 0.675293f, 0.689453f,
- 0.704102f, 0.718262f, 0.840332f, 0.825195f, 0.809570f, 0.797363f, 0.786133f, 0.776367f,
- 0.004433f, 0.013138f, 0.022720f, 0.032013f, 0.041199f, 0.051147f, 0.061462f, 0.071716f,
- 0.082336f, 0.091919f, 0.102722f, 0.113586f, 0.124390f, 0.135010f, 0.145996f, 0.157837f,
- 0.168823f, 0.180054f, 0.192383f, 0.203491f, 0.215332f, 0.227417f, 0.239502f, 0.251221f,
- 0.263672f, 0.275635f, 0.287842f, 0.300537f, 0.312500f, 0.324707f, 0.338135f, 0.350342f,
- 0.363037f, 0.375977f, 0.388672f, 0.401611f, 0.413818f, 0.427246f, 0.440186f, 0.453613f,
- 0.466064f, 0.479736f, 0.492920f, 0.506836f, 0.519531f, 0.533203f, 0.546875f, 0.560059f,
- 0.573242f, 0.587402f, 0.600098f, 0.614746f, 0.628418f, 0.642578f, 0.657227f, 0.670898f,
- 0.685059f, 0.699707f, 0.830566f, 0.816406f, 0.802734f, 0.791016f, 0.780273f, 0.770996f,
- 0.004372f, 0.012619f, 0.021393f, 0.030350f, 0.039276f, 0.048523f, 0.058289f, 0.067505f,
- 0.077393f, 0.087585f, 0.097290f, 0.107727f, 0.118225f, 0.128296f, 0.138550f, 0.149414f,
- 0.160278f, 0.171631f, 0.182739f, 0.193359f, 0.205200f, 0.216187f, 0.228027f, 0.240234f,
- 0.251465f, 0.263428f, 0.275146f, 0.287598f, 0.298828f, 0.311523f, 0.323242f, 0.336182f,
- 0.348633f, 0.360107f, 0.372803f, 0.385986f, 0.398682f, 0.411621f, 0.424072f, 0.436523f,
- 0.449951f, 0.462891f, 0.475098f, 0.488525f, 0.501953f, 0.514648f, 0.527344f, 0.541992f,
- 0.555176f, 0.569336f, 0.582031f, 0.596191f, 0.609863f, 0.623047f, 0.637695f, 0.651855f,
- 0.665527f, 0.679688f, 0.821289f, 0.808105f, 0.795410f, 0.784180f, 0.774902f, 0.765137f,
- 0.003937f, 0.012169f, 0.020477f, 0.028641f, 0.037781f, 0.046448f, 0.055481f, 0.064209f,
- 0.073181f, 0.082458f, 0.092651f, 0.101990f, 0.111572f, 0.121948f, 0.132202f, 0.142212f,
- 0.151978f, 0.162720f, 0.173340f, 0.184326f, 0.195312f, 0.206055f, 0.217163f, 0.228516f,
- 0.239990f, 0.250977f, 0.262695f, 0.274658f, 0.285889f, 0.297363f, 0.308838f, 0.321045f,
- 0.333496f, 0.345459f, 0.357422f, 0.370117f, 0.382324f, 0.395020f, 0.407227f, 0.419922f,
- 0.432617f, 0.444336f, 0.458008f, 0.470703f, 0.483398f, 0.497559f, 0.510254f, 0.522949f,
- 0.536133f, 0.550293f, 0.562988f, 0.577637f, 0.590820f, 0.603516f, 0.618164f, 0.632324f,
- 0.645508f, 0.660645f, 0.811035f, 0.800293f, 0.788086f, 0.777832f, 0.768555f, 0.760254f,
- 0.003868f, 0.011368f, 0.019257f, 0.027512f, 0.035431f, 0.043274f, 0.051880f, 0.060852f,
- 0.069214f, 0.078003f, 0.087524f, 0.096924f, 0.105896f, 0.115112f, 0.124817f, 0.134766f,
- 0.144409f, 0.154663f, 0.164673f, 0.175415f, 0.184814f, 0.196289f, 0.206299f, 0.216797f,
- 0.228394f, 0.239380f, 0.250244f, 0.260986f, 0.273193f, 0.284424f, 0.295410f, 0.307373f,
- 0.319092f, 0.331299f, 0.342285f, 0.354248f, 0.366455f, 0.378662f, 0.390869f, 0.403809f,
- 0.415771f, 0.427734f, 0.440430f, 0.453369f, 0.466309f, 0.479736f, 0.492188f, 0.504883f,
- 0.518066f, 0.531250f, 0.544922f, 0.558105f, 0.571777f, 0.584473f, 0.598633f, 0.612305f,
- 0.626465f, 0.641602f, 0.801758f, 0.792480f, 0.781738f, 0.770508f, 0.761230f, 0.753906f,
- 0.003616f, 0.010872f, 0.018387f, 0.026077f, 0.033875f, 0.041351f, 0.049591f, 0.057434f,
- 0.065674f, 0.073669f, 0.082153f, 0.091064f, 0.100098f, 0.109009f, 0.117981f, 0.127563f,
- 0.137207f, 0.146362f, 0.156494f, 0.165894f, 0.176025f, 0.186157f, 0.196655f, 0.206421f,
- 0.216919f, 0.227539f, 0.237915f, 0.249268f, 0.260254f, 0.270752f, 0.282471f, 0.293945f,
- 0.305176f, 0.316406f, 0.328125f, 0.338867f, 0.350342f, 0.361816f, 0.375244f, 0.387207f,
- 0.398926f, 0.411133f, 0.423584f, 0.436523f, 0.448730f, 0.461182f, 0.474121f, 0.485840f,
- 0.499756f, 0.513672f, 0.525391f, 0.539062f, 0.552734f, 0.565918f, 0.580566f, 0.593750f,
- 0.608398f, 0.621094f, 0.790527f, 0.783691f, 0.773926f, 0.764160f, 0.755859f, 0.747559f,
- 0.003450f, 0.010429f, 0.017487f, 0.024445f, 0.031860f, 0.039581f, 0.046631f, 0.054718f,
- 0.061951f, 0.070251f, 0.078003f, 0.086121f, 0.094910f, 0.102905f, 0.111572f, 0.120300f,
- 0.129761f, 0.138428f, 0.147217f, 0.156982f, 0.166992f, 0.176147f, 0.186157f, 0.196045f,
- 0.206299f, 0.216187f, 0.226318f, 0.236938f, 0.247437f, 0.258301f, 0.268311f, 0.279785f,
- 0.290527f, 0.301758f, 0.312744f, 0.324219f, 0.335449f, 0.346680f, 0.359131f, 0.370605f,
- 0.382812f, 0.394531f, 0.406982f, 0.419189f, 0.430908f, 0.443604f, 0.456055f, 0.468506f,
- 0.481445f, 0.494873f, 0.506836f, 0.520996f, 0.534180f, 0.547363f, 0.561035f, 0.573730f,
- 0.588379f, 0.601074f, 0.780762f, 0.775879f, 0.766602f, 0.757324f, 0.748535f, 0.741699f,
- 0.003281f, 0.009811f, 0.016174f, 0.023438f, 0.030060f, 0.037109f, 0.044464f, 0.051239f,
- 0.058441f, 0.066345f, 0.073792f, 0.081238f, 0.089539f, 0.097229f, 0.105286f, 0.113647f,
- 0.122498f, 0.130615f, 0.139526f, 0.148438f, 0.157837f, 0.166626f, 0.176636f, 0.185547f,
- 0.195312f, 0.204956f, 0.215088f, 0.224976f, 0.234863f, 0.245239f, 0.255859f, 0.266113f,
- 0.276367f, 0.287354f, 0.298096f, 0.309326f, 0.320801f, 0.331787f, 0.343018f, 0.355225f,
- 0.366211f, 0.378418f, 0.389893f, 0.401611f, 0.413574f, 0.425781f, 0.438721f, 0.451416f,
- 0.463135f, 0.476074f, 0.489014f, 0.501465f, 0.514648f, 0.528809f, 0.541992f, 0.554688f,
- 0.568848f, 0.582520f, 0.770508f, 0.767090f, 0.758789f, 0.750488f, 0.743164f, 0.735352f,
- 0.002901f, 0.009422f, 0.015488f, 0.021729f, 0.028290f, 0.035278f, 0.041321f, 0.048523f,
- 0.055420f, 0.062195f, 0.069336f, 0.076477f, 0.084412f, 0.091858f, 0.099609f, 0.107361f,
- 0.115112f, 0.123535f, 0.131592f, 0.140137f, 0.148438f, 0.157715f, 0.166382f, 0.174927f,
- 0.184692f, 0.193970f, 0.203369f, 0.212646f, 0.222656f, 0.232910f, 0.242920f, 0.252197f,
- 0.263184f, 0.273438f, 0.284180f, 0.294922f, 0.305664f, 0.316895f, 0.327881f, 0.338867f,
- 0.349854f, 0.361328f, 0.373291f, 0.385254f, 0.397461f, 0.408691f, 0.420898f, 0.433350f,
- 0.445801f, 0.458252f, 0.470703f, 0.483154f, 0.496826f, 0.510254f, 0.522461f, 0.535645f,
- 0.549805f, 0.562988f, 0.760742f, 0.758789f, 0.750488f, 0.743652f, 0.736328f, 0.729492f,
- 0.002861f, 0.008606f, 0.014488f, 0.021057f, 0.026810f, 0.032898f, 0.038879f, 0.045532f,
- 0.051666f, 0.058319f, 0.065125f, 0.072449f, 0.079224f, 0.086426f, 0.093689f, 0.100830f,
- 0.108276f, 0.116089f, 0.123962f, 0.131958f, 0.140625f, 0.148560f, 0.156494f, 0.164795f,
- 0.174194f, 0.183228f, 0.192017f, 0.201294f, 0.210815f, 0.220093f, 0.229858f, 0.239746f,
- 0.249390f, 0.260010f, 0.270508f, 0.280518f, 0.290771f, 0.301758f, 0.312744f, 0.323486f,
- 0.334473f, 0.345215f, 0.356934f, 0.368408f, 0.379883f, 0.391846f, 0.403564f, 0.416016f,
- 0.427490f, 0.439453f, 0.452881f, 0.465332f, 0.478271f, 0.490234f, 0.503906f, 0.517090f,
- 0.529785f, 0.543945f, 0.750000f, 0.750000f, 0.743164f, 0.736328f, 0.729492f, 0.723145f,
- 0.002977f, 0.008492f, 0.013931f, 0.019745f, 0.024948f, 0.030991f, 0.036804f, 0.042755f,
- 0.048889f, 0.055267f, 0.061737f, 0.067932f, 0.074829f, 0.081116f, 0.087646f, 0.095215f,
- 0.102356f, 0.109436f, 0.116760f, 0.124023f, 0.131714f, 0.139648f, 0.147461f, 0.155762f,
- 0.164185f, 0.172485f, 0.181152f, 0.189697f, 0.198730f, 0.208130f, 0.217285f, 0.226685f,
- 0.236572f, 0.245850f, 0.255859f, 0.265869f, 0.276367f, 0.286377f, 0.297607f, 0.307861f,
- 0.318359f, 0.329102f, 0.340576f, 0.351807f, 0.363281f, 0.374023f, 0.386230f, 0.397949f,
- 0.409668f, 0.422119f, 0.434082f, 0.446777f, 0.459229f, 0.471924f, 0.484863f, 0.497803f,
- 0.511230f, 0.525391f, 0.739746f, 0.741211f, 0.735352f, 0.729004f, 0.722656f, 0.717285f,
- 0.002441f, 0.007896f, 0.013443f, 0.018402f, 0.023911f, 0.029343f, 0.034454f, 0.040375f,
- 0.045868f, 0.051453f, 0.057800f, 0.063721f, 0.070068f, 0.075928f, 0.082520f, 0.089233f,
- 0.095703f, 0.102478f, 0.109314f, 0.116638f, 0.123596f, 0.131348f, 0.138550f, 0.145996f,
- 0.153809f, 0.162109f, 0.170044f, 0.179199f, 0.187866f, 0.196045f, 0.205078f, 0.213745f,
- 0.223389f, 0.233032f, 0.242554f, 0.252197f, 0.261963f, 0.271973f, 0.281982f, 0.292236f,
- 0.303223f, 0.312988f, 0.324463f, 0.335693f, 0.346191f, 0.357910f, 0.368652f, 0.380371f,
- 0.391846f, 0.404541f, 0.415527f, 0.428467f, 0.440674f, 0.453369f, 0.466553f, 0.479248f,
- 0.491455f, 0.505371f, 0.729492f, 0.732422f, 0.727539f, 0.721191f, 0.716309f, 0.709961f,
- 0.002457f, 0.007553f, 0.012489f, 0.017548f, 0.022217f, 0.027405f, 0.032471f, 0.037689f,
- 0.043060f, 0.048553f, 0.054230f, 0.059631f, 0.065369f, 0.071533f, 0.077393f, 0.083069f,
- 0.089417f, 0.096069f, 0.102356f, 0.108398f, 0.115417f, 0.122925f, 0.130127f, 0.137451f,
- 0.144531f, 0.152100f, 0.160156f, 0.168091f, 0.176514f, 0.184570f, 0.192871f, 0.201660f,
- 0.210571f, 0.219238f, 0.229126f, 0.238281f, 0.248413f, 0.257812f, 0.267578f, 0.277588f,
- 0.287354f, 0.298096f, 0.308594f, 0.319336f, 0.329590f, 0.340820f, 0.351318f, 0.363770f,
- 0.375732f, 0.386963f, 0.397949f, 0.409912f, 0.422363f, 0.434326f, 0.446533f, 0.459473f,
- 0.473145f, 0.486084f, 0.718750f, 0.723633f, 0.719727f, 0.713867f, 0.708984f, 0.703613f,
- 0.002436f, 0.006939f, 0.011612f, 0.016113f, 0.021072f, 0.025497f, 0.030640f, 0.035339f,
- 0.040222f, 0.045441f, 0.050690f, 0.055725f, 0.060669f, 0.066589f, 0.072144f, 0.077881f,
- 0.083740f, 0.089294f, 0.095215f, 0.101501f, 0.108032f, 0.114868f, 0.121643f, 0.128052f,
- 0.135010f, 0.142334f, 0.150024f, 0.157349f, 0.164917f, 0.173340f, 0.181274f, 0.189697f,
- 0.198120f, 0.206909f, 0.215698f, 0.224365f, 0.234497f, 0.243652f, 0.252930f, 0.262695f,
- 0.272461f, 0.282471f, 0.292480f, 0.302979f, 0.313721f, 0.324463f, 0.335205f, 0.346436f,
- 0.357666f, 0.369141f, 0.380859f, 0.391602f, 0.404541f, 0.416016f, 0.428467f, 0.440918f,
- 0.454102f, 0.466553f, 0.708496f, 0.715820f, 0.711426f, 0.706055f, 0.701660f, 0.696777f,
- 0.002188f, 0.006599f, 0.011032f, 0.015068f, 0.019897f, 0.024048f, 0.028656f, 0.033264f,
- 0.037720f, 0.042236f, 0.047028f, 0.051941f, 0.056824f, 0.062012f, 0.067444f, 0.072449f,
- 0.077942f, 0.083374f, 0.088867f, 0.094727f, 0.100769f, 0.106750f, 0.112732f, 0.119263f,
- 0.126099f, 0.133179f, 0.139648f, 0.146729f, 0.154175f, 0.161987f, 0.170044f, 0.177612f,
- 0.185791f, 0.194214f, 0.203125f, 0.211670f, 0.220581f, 0.229370f, 0.238770f, 0.248047f,
- 0.257812f, 0.267822f, 0.277344f, 0.287109f, 0.297363f, 0.307861f, 0.318848f, 0.329590f,
- 0.341064f, 0.351562f, 0.363037f, 0.374512f, 0.385498f, 0.397461f, 0.409668f, 0.422363f,
- 0.434326f, 0.447021f, 0.697266f, 0.706543f, 0.703125f, 0.698730f, 0.694336f, 0.689941f,
- 0.002024f, 0.006165f, 0.010399f, 0.014481f, 0.018555f, 0.022797f, 0.026627f, 0.030869f,
- 0.035187f, 0.039459f, 0.043732f, 0.047943f, 0.052917f, 0.057434f, 0.062622f, 0.067261f,
- 0.071838f, 0.077454f, 0.082581f, 0.087891f, 0.093628f, 0.099182f, 0.105469f, 0.111206f,
- 0.117126f, 0.123779f, 0.130371f, 0.137085f, 0.143921f, 0.151001f, 0.158691f, 0.166016f,
- 0.173950f, 0.181641f, 0.190063f, 0.198120f, 0.206909f, 0.215698f, 0.224976f, 0.233398f,
- 0.242798f, 0.252197f, 0.262207f, 0.271973f, 0.281738f, 0.291992f, 0.302734f, 0.313477f,
- 0.323242f, 0.334229f, 0.345459f, 0.355957f, 0.368652f, 0.380615f, 0.391602f, 0.403809f,
- 0.415771f, 0.428467f, 0.686523f, 0.696777f, 0.695312f, 0.691895f, 0.687500f, 0.683105f,
- 0.001931f, 0.005970f, 0.009651f, 0.013557f, 0.017136f, 0.021088f, 0.024902f, 0.028748f,
- 0.032623f, 0.036743f, 0.040833f, 0.044983f, 0.049591f, 0.053467f, 0.057800f, 0.062500f,
- 0.066833f, 0.071533f, 0.076538f, 0.081238f, 0.086670f, 0.092224f, 0.097290f, 0.103088f,
- 0.108887f, 0.114990f, 0.120972f, 0.127197f, 0.134277f, 0.140503f, 0.147705f, 0.154663f,
- 0.162231f, 0.169922f, 0.177612f, 0.185303f, 0.193604f, 0.201904f, 0.210815f, 0.219238f,
- 0.228516f, 0.237427f, 0.247070f, 0.256592f, 0.265869f, 0.275879f, 0.285645f, 0.295898f,
- 0.306396f, 0.317139f, 0.328369f, 0.338623f, 0.350342f, 0.362305f, 0.374023f, 0.385010f,
- 0.397461f, 0.410156f, 0.675781f, 0.687988f, 0.687012f, 0.683594f, 0.680664f, 0.676270f,
- 0.001725f, 0.005436f, 0.009171f, 0.012589f, 0.016190f, 0.019485f, 0.023132f, 0.026978f,
- 0.030899f, 0.034180f, 0.037659f, 0.041565f, 0.045074f, 0.049438f, 0.053345f, 0.057739f,
- 0.061768f, 0.065918f, 0.070679f, 0.075073f, 0.080078f, 0.084656f, 0.089966f, 0.095215f,
- 0.100464f, 0.106445f, 0.112000f, 0.117615f, 0.124207f, 0.130737f, 0.136719f, 0.144043f,
- 0.151123f, 0.158081f, 0.165405f, 0.173096f, 0.181152f, 0.189087f, 0.197510f, 0.205688f,
- 0.214600f, 0.223145f, 0.232178f, 0.241699f, 0.250732f, 0.260254f, 0.270264f, 0.279785f,
- 0.289795f, 0.300293f, 0.310791f, 0.322510f, 0.333496f, 0.344238f, 0.355713f, 0.367188f,
- 0.379395f, 0.392090f, 0.664551f, 0.678711f, 0.678223f, 0.675781f, 0.672852f, 0.669922f,
- 0.001741f, 0.005077f, 0.008522f, 0.011810f, 0.014946f, 0.018524f, 0.021332f, 0.024872f,
- 0.028519f, 0.031799f, 0.034973f, 0.038727f, 0.041992f, 0.045654f, 0.049072f, 0.052856f,
- 0.056671f, 0.060638f, 0.064819f, 0.069092f, 0.073425f, 0.078125f, 0.082886f, 0.087280f,
- 0.092651f, 0.098206f, 0.103638f, 0.109192f, 0.114563f, 0.120667f, 0.126709f, 0.133057f,
- 0.139771f, 0.146851f, 0.153931f, 0.160767f, 0.168457f, 0.175903f, 0.183838f, 0.192505f,
- 0.200195f, 0.208618f, 0.217407f, 0.226562f, 0.236084f, 0.245239f, 0.254639f, 0.263672f,
- 0.273926f, 0.283447f, 0.294189f, 0.304932f, 0.315674f, 0.326172f, 0.337402f, 0.348877f,
- 0.360107f, 0.373291f, 0.653809f, 0.670410f, 0.669922f, 0.667480f, 0.665527f, 0.662109f,
- 0.001639f, 0.004951f, 0.007996f, 0.010857f, 0.013779f, 0.016968f, 0.019974f, 0.023392f,
- 0.026001f, 0.029373f, 0.032013f, 0.035370f, 0.038513f, 0.041992f, 0.044586f, 0.048706f,
- 0.052124f, 0.055634f, 0.059723f, 0.063354f, 0.067444f, 0.071289f, 0.075745f, 0.080444f,
- 0.085022f, 0.089722f, 0.095032f, 0.100220f, 0.105347f, 0.111206f, 0.117126f, 0.123108f,
- 0.129395f, 0.135620f, 0.142090f, 0.148682f, 0.156372f, 0.163574f, 0.170898f, 0.178711f,
- 0.186890f, 0.194580f, 0.203613f, 0.211426f, 0.220459f, 0.229492f, 0.238281f, 0.248169f,
- 0.257324f, 0.267578f, 0.277832f, 0.287354f, 0.298340f, 0.308350f, 0.319824f, 0.331543f,
- 0.342041f, 0.354248f, 0.641602f, 0.660645f, 0.662109f, 0.660645f, 0.658203f, 0.654785f,
- 0.001569f, 0.004539f, 0.007538f, 0.010368f, 0.013359f, 0.016006f, 0.018539f, 0.021210f,
- 0.024384f, 0.026855f, 0.029892f, 0.032471f, 0.035034f, 0.038177f, 0.041199f, 0.044434f,
- 0.047485f, 0.050781f, 0.054321f, 0.057953f, 0.061523f, 0.065430f, 0.069275f, 0.073547f,
- 0.077820f, 0.082092f, 0.086731f, 0.091736f, 0.096985f, 0.101990f, 0.107361f, 0.112549f,
- 0.118774f, 0.124878f, 0.131104f, 0.137573f, 0.144409f, 0.150635f, 0.157837f, 0.165283f,
- 0.173340f, 0.181274f, 0.188599f, 0.197510f, 0.205933f, 0.214600f, 0.223633f, 0.232056f,
- 0.241577f, 0.251709f, 0.261230f, 0.270996f, 0.281250f, 0.291260f, 0.302246f, 0.313477f,
- 0.323730f, 0.336182f, 0.630859f, 0.651855f, 0.652832f, 0.652344f, 0.650391f, 0.647461f,
- 0.001558f, 0.004139f, 0.007103f, 0.009560f, 0.012077f, 0.014313f, 0.016983f, 0.019653f,
- 0.021988f, 0.024490f, 0.027023f, 0.029526f, 0.031891f, 0.034821f, 0.037903f, 0.040192f,
- 0.043457f, 0.046417f, 0.049316f, 0.052795f, 0.055725f, 0.059357f, 0.063354f, 0.066895f,
- 0.070740f, 0.074890f, 0.078979f, 0.083801f, 0.088440f, 0.093018f, 0.097961f, 0.103394f,
- 0.108704f, 0.114563f, 0.120239f, 0.126343f, 0.132690f, 0.139038f, 0.145874f, 0.152710f,
- 0.159912f, 0.168091f, 0.175537f, 0.183228f, 0.191650f, 0.199707f, 0.208130f, 0.216797f,
- 0.226074f, 0.235352f, 0.244507f, 0.254395f, 0.264404f, 0.274414f, 0.285156f, 0.296631f,
- 0.307373f, 0.318604f, 0.619141f, 0.643066f, 0.644531f, 0.644043f, 0.642578f, 0.639648f,
- 0.001314f, 0.004002f, 0.006603f, 0.009056f, 0.011490f, 0.013184f, 0.015587f, 0.017883f,
- 0.020157f, 0.022415f, 0.024582f, 0.027206f, 0.029160f, 0.031677f, 0.034088f, 0.036530f,
- 0.039337f, 0.042206f, 0.044891f, 0.047729f, 0.050751f, 0.053955f, 0.057312f, 0.060486f,
- 0.064148f, 0.068054f, 0.071960f, 0.075867f, 0.079895f, 0.084595f, 0.089172f, 0.094238f,
- 0.098999f, 0.104492f, 0.109802f, 0.115173f, 0.121338f, 0.127686f, 0.134033f, 0.140991f,
- 0.147095f, 0.154541f, 0.161865f, 0.169800f, 0.177368f, 0.185547f, 0.193848f, 0.201904f,
- 0.211060f, 0.219116f, 0.229004f, 0.238525f, 0.248047f, 0.257812f, 0.267822f, 0.277832f,
- 0.289062f, 0.300537f, 0.607910f, 0.633301f, 0.636230f, 0.635742f, 0.634766f, 0.633301f,
- 0.001217f, 0.003571f, 0.005947f, 0.008011f, 0.010391f, 0.012207f, 0.014313f, 0.016617f,
- 0.018280f, 0.020523f, 0.022537f, 0.024475f, 0.026443f, 0.028778f, 0.030884f, 0.032867f,
- 0.035553f, 0.037872f, 0.040375f, 0.042938f, 0.045593f, 0.048431f, 0.051605f, 0.054688f,
- 0.057953f, 0.061279f, 0.065002f, 0.068665f, 0.072266f, 0.076294f, 0.080872f, 0.085083f,
- 0.089783f, 0.094482f, 0.099915f, 0.104736f, 0.110901f, 0.116272f, 0.122314f, 0.128784f,
- 0.134888f, 0.142090f, 0.148560f, 0.155884f, 0.163574f, 0.171753f, 0.179077f, 0.187500f,
- 0.195679f, 0.204346f, 0.213745f, 0.222656f, 0.231812f, 0.241455f, 0.250977f, 0.261230f,
- 0.272461f, 0.282959f, 0.596680f, 0.623535f, 0.627441f, 0.627930f, 0.627441f, 0.625000f,
- 0.001111f, 0.003542f, 0.005569f, 0.007504f, 0.009338f, 0.011452f, 0.012939f, 0.015030f,
- 0.016678f, 0.018326f, 0.020203f, 0.022217f, 0.023788f, 0.025604f, 0.027771f, 0.029877f,
- 0.031860f, 0.033813f, 0.036102f, 0.038605f, 0.040985f, 0.043579f, 0.046448f, 0.049042f,
- 0.051849f, 0.055054f, 0.058319f, 0.061615f, 0.065125f, 0.068909f, 0.072815f, 0.076843f,
- 0.080872f, 0.085571f, 0.089905f, 0.095398f, 0.100159f, 0.105713f, 0.111206f, 0.116882f,
- 0.122925f, 0.129517f, 0.135742f, 0.142822f, 0.149902f, 0.157349f, 0.165161f, 0.172852f,
- 0.181152f, 0.189331f, 0.198120f, 0.206909f, 0.215820f, 0.225342f, 0.235474f, 0.245239f,
- 0.254883f, 0.266602f, 0.584473f, 0.614746f, 0.619141f, 0.619629f, 0.619141f, 0.618164f,
- 0.001149f, 0.003147f, 0.004826f, 0.006886f, 0.008629f, 0.010452f, 0.012024f, 0.013359f,
- 0.015175f, 0.016647f, 0.018143f, 0.019882f, 0.021332f, 0.023026f, 0.024902f, 0.026550f,
- 0.028397f, 0.030045f, 0.032318f, 0.034393f, 0.036682f, 0.038910f, 0.041107f, 0.043671f,
- 0.046295f, 0.048950f, 0.051819f, 0.054993f, 0.058258f, 0.061523f, 0.065063f, 0.068481f,
- 0.072510f, 0.076965f, 0.081055f, 0.085510f, 0.090393f, 0.095093f, 0.100342f, 0.105774f,
- 0.111694f, 0.117371f, 0.124084f, 0.130371f, 0.136963f, 0.143921f, 0.151245f, 0.159058f,
- 0.166626f, 0.174927f, 0.182983f, 0.191650f, 0.200195f, 0.209473f, 0.218750f, 0.228149f,
- 0.238037f, 0.249146f, 0.572266f, 0.604980f, 0.609863f, 0.611328f, 0.610352f, 0.611328f,
- 0.001009f, 0.003059f, 0.004620f, 0.006283f, 0.007881f, 0.009415f, 0.010864f, 0.011940f,
- 0.013443f, 0.014847f, 0.016403f, 0.017700f, 0.019012f, 0.020493f, 0.021927f, 0.023697f,
- 0.025177f, 0.026947f, 0.028732f, 0.030472f, 0.032654f, 0.034302f, 0.036591f, 0.038757f,
- 0.041046f, 0.043488f, 0.045837f, 0.048706f, 0.051544f, 0.054810f, 0.057770f, 0.061188f,
- 0.064331f, 0.068237f, 0.072083f, 0.076416f, 0.080872f, 0.085388f, 0.090149f, 0.095276f,
- 0.100403f, 0.105896f, 0.111877f, 0.117798f, 0.124329f, 0.130859f, 0.138062f, 0.145020f,
- 0.152710f, 0.160034f, 0.168335f, 0.176514f, 0.185059f, 0.193481f, 0.203125f, 0.212158f,
- 0.221924f, 0.232178f, 0.562500f, 0.594727f, 0.601074f, 0.602539f, 0.603516f, 0.602539f,
- 0.000865f, 0.002674f, 0.004444f, 0.005615f, 0.007233f, 0.008430f, 0.009827f, 0.010880f,
- 0.011917f, 0.013206f, 0.014412f, 0.015717f, 0.016876f, 0.018173f, 0.019501f, 0.020950f,
- 0.022217f, 0.023773f, 0.025284f, 0.026749f, 0.028610f, 0.030151f, 0.032166f, 0.034149f,
- 0.036041f, 0.038330f, 0.040558f, 0.042877f, 0.045532f, 0.048157f, 0.050934f, 0.053894f,
- 0.056946f, 0.060303f, 0.063843f, 0.067566f, 0.071472f, 0.075806f, 0.080261f, 0.084778f,
- 0.089600f, 0.094971f, 0.100220f, 0.105896f, 0.111877f, 0.118103f, 0.125000f, 0.131348f,
- 0.138550f, 0.146362f, 0.153687f, 0.161987f, 0.169678f, 0.178223f, 0.187134f, 0.196045f,
- 0.205811f, 0.215698f, 0.549805f, 0.584961f, 0.592773f, 0.594238f, 0.593750f, 0.595215f,
- 0.000951f, 0.002476f, 0.003956f, 0.005062f, 0.006268f, 0.007637f, 0.008888f, 0.009666f,
- 0.010628f, 0.011810f, 0.012856f, 0.013878f, 0.014946f, 0.015900f, 0.017227f, 0.018356f,
- 0.019592f, 0.020889f, 0.022003f, 0.023438f, 0.025101f, 0.026489f, 0.028122f, 0.029739f,
- 0.031555f, 0.033295f, 0.035431f, 0.037537f, 0.039795f, 0.041962f, 0.044647f, 0.047302f,
- 0.049957f, 0.052979f, 0.056122f, 0.059387f, 0.062927f, 0.066956f, 0.070679f, 0.074951f,
- 0.079468f, 0.084167f, 0.089294f, 0.094482f, 0.100098f, 0.106018f, 0.112061f, 0.118835f,
- 0.125366f, 0.132446f, 0.139893f, 0.147827f, 0.155762f, 0.163574f, 0.172607f, 0.180786f,
- 0.190063f, 0.199951f, 0.536621f, 0.576172f, 0.583496f, 0.586914f, 0.587402f, 0.586914f,
- 0.000788f, 0.002115f, 0.003592f, 0.004780f, 0.005939f, 0.006615f, 0.007740f, 0.008598f,
- 0.009514f, 0.010376f, 0.011200f, 0.012138f, 0.013016f, 0.014069f, 0.014977f, 0.015961f,
- 0.016922f, 0.018036f, 0.019043f, 0.020447f, 0.021606f, 0.022995f, 0.024323f, 0.025864f,
- 0.027344f, 0.028946f, 0.030731f, 0.032593f, 0.034515f, 0.036530f, 0.038910f, 0.041016f,
- 0.043274f, 0.046021f, 0.048981f, 0.051819f, 0.055176f, 0.058472f, 0.062012f, 0.065857f,
- 0.069946f, 0.074219f, 0.078796f, 0.083801f, 0.088806f, 0.094299f, 0.100281f, 0.106018f,
- 0.112793f, 0.119446f, 0.126343f, 0.133545f, 0.141357f, 0.149292f, 0.157104f, 0.165894f,
- 0.174683f, 0.184326f, 0.524902f, 0.566895f, 0.575195f, 0.576660f, 0.579102f, 0.579590f,
- 0.000661f, 0.001961f, 0.003382f, 0.004311f, 0.005161f, 0.006062f, 0.006737f, 0.007427f,
- 0.008286f, 0.008995f, 0.009857f, 0.010368f, 0.011230f, 0.011955f, 0.012833f, 0.013786f,
- 0.014565f, 0.015480f, 0.016647f, 0.017578f, 0.018677f, 0.019806f, 0.020950f, 0.022263f,
- 0.023651f, 0.024994f, 0.026306f, 0.027863f, 0.029724f, 0.031525f, 0.033325f, 0.035370f,
- 0.037292f, 0.039673f, 0.042114f, 0.044769f, 0.047546f, 0.050537f, 0.053680f, 0.057098f,
- 0.060852f, 0.064514f, 0.069031f, 0.073303f, 0.078064f, 0.083069f, 0.088379f, 0.094238f,
- 0.100220f, 0.106689f, 0.113342f, 0.120300f, 0.127563f, 0.135132f, 0.142700f, 0.151245f,
- 0.160034f, 0.168823f, 0.512695f, 0.557129f, 0.566406f, 0.569824f, 0.569824f, 0.571289f,
- 0.000757f, 0.001709f, 0.002844f, 0.003582f, 0.004448f, 0.005192f, 0.005989f, 0.006519f,
- 0.007038f, 0.007801f, 0.008453f, 0.009071f, 0.009727f, 0.010391f, 0.011009f, 0.011726f,
- 0.012650f, 0.013184f, 0.014107f, 0.014977f, 0.015900f, 0.016800f, 0.017776f, 0.018936f,
- 0.020172f, 0.021271f, 0.022446f, 0.023697f, 0.025055f, 0.026703f, 0.028397f, 0.030014f,
- 0.031921f, 0.033905f, 0.035919f, 0.038177f, 0.040680f, 0.043243f, 0.045898f, 0.049072f,
- 0.052216f, 0.055725f, 0.059784f, 0.063538f, 0.067688f, 0.072327f, 0.077271f, 0.082764f,
- 0.088379f, 0.094299f, 0.100708f, 0.107239f, 0.114136f, 0.121582f, 0.128906f, 0.136963f,
- 0.145630f, 0.153564f, 0.500977f, 0.547852f, 0.556641f, 0.561523f, 0.562500f, 0.563965f,
- 0.000704f, 0.001769f, 0.002542f, 0.003523f, 0.004036f, 0.004562f, 0.005032f, 0.005661f,
- 0.006176f, 0.006542f, 0.007072f, 0.007698f, 0.008339f, 0.008827f, 0.009323f, 0.010094f,
- 0.010757f, 0.011276f, 0.012093f, 0.012733f, 0.013489f, 0.014488f, 0.015244f, 0.016006f,
- 0.017151f, 0.017975f, 0.018967f, 0.020142f, 0.021255f, 0.022552f, 0.023880f, 0.025314f,
- 0.026840f, 0.028503f, 0.030441f, 0.032166f, 0.034424f, 0.036438f, 0.039001f, 0.041656f,
- 0.044464f, 0.047455f, 0.050842f, 0.054443f, 0.058167f, 0.062286f, 0.066956f, 0.071899f,
- 0.076904f, 0.082458f, 0.088501f, 0.094482f, 0.101196f, 0.108337f, 0.115662f, 0.123352f,
- 0.130981f, 0.139282f, 0.489746f, 0.538574f, 0.547852f, 0.551270f, 0.554688f, 0.555176f,
- 0.000579f, 0.001450f, 0.002396f, 0.002857f, 0.003454f, 0.004032f, 0.004356f, 0.004791f,
- 0.005333f, 0.005718f, 0.006130f, 0.006485f, 0.007042f, 0.007473f, 0.007988f, 0.008476f,
- 0.008865f, 0.009613f, 0.010086f, 0.010651f, 0.011345f, 0.012047f, 0.012764f, 0.013435f,
- 0.014282f, 0.015144f, 0.015884f, 0.016846f, 0.017868f, 0.018814f, 0.020050f, 0.021164f,
- 0.022507f, 0.023773f, 0.025192f, 0.026978f, 0.028564f, 0.030640f, 0.032623f, 0.034882f,
- 0.037231f, 0.039886f, 0.042786f, 0.046143f, 0.049286f, 0.052979f, 0.057098f, 0.061279f,
- 0.066223f, 0.071167f, 0.076660f, 0.082581f, 0.088989f, 0.095581f, 0.102661f, 0.109863f,
- 0.117737f, 0.125488f, 0.476807f, 0.528320f, 0.538574f, 0.543945f, 0.546875f, 0.546875f,
- 0.000510f, 0.001428f, 0.002037f, 0.002613f, 0.003086f, 0.003290f, 0.003672f, 0.004108f,
- 0.004345f, 0.004768f, 0.005035f, 0.005470f, 0.005959f, 0.006207f, 0.006599f, 0.007095f,
- 0.007568f, 0.008003f, 0.008377f, 0.008904f, 0.009575f, 0.010010f, 0.010643f, 0.011131f,
- 0.011871f, 0.012535f, 0.013199f, 0.014038f, 0.014839f, 0.015640f, 0.016586f, 0.017502f,
- 0.018585f, 0.019745f, 0.021088f, 0.022354f, 0.023727f, 0.025253f, 0.026962f, 0.028870f,
- 0.030762f, 0.033051f, 0.035492f, 0.038177f, 0.041229f, 0.044403f, 0.048004f, 0.051880f,
- 0.056213f, 0.060516f, 0.065857f, 0.071045f, 0.077271f, 0.083374f, 0.090027f, 0.096863f,
- 0.104492f, 0.112183f, 0.463623f, 0.518066f, 0.529785f, 0.535156f, 0.538086f, 0.540039f,
- 0.000473f, 0.001222f, 0.001771f, 0.002117f, 0.002323f, 0.002796f, 0.003096f, 0.003355f,
- 0.003601f, 0.003975f, 0.004295f, 0.004543f, 0.004833f, 0.005142f, 0.005455f, 0.005848f,
- 0.006165f, 0.006535f, 0.006947f, 0.007370f, 0.007809f, 0.008240f, 0.008690f, 0.009216f,
- 0.009758f, 0.010223f, 0.010925f, 0.011536f, 0.012146f, 0.012833f, 0.013573f, 0.014389f,
- 0.015244f, 0.016220f, 0.017120f, 0.018219f, 0.019379f, 0.020599f, 0.021988f, 0.023514f,
- 0.025131f, 0.027054f, 0.029037f, 0.031311f, 0.033752f, 0.036591f, 0.039520f, 0.042999f,
- 0.046661f, 0.050873f, 0.055603f, 0.060333f, 0.066101f, 0.071960f, 0.078491f, 0.084961f,
- 0.091797f, 0.099426f, 0.452148f, 0.508301f, 0.520508f, 0.526367f, 0.528809f, 0.530273f,
- 0.000299f, 0.001057f, 0.001329f, 0.001771f, 0.001957f, 0.002350f, 0.002483f, 0.002697f,
- 0.002964f, 0.003181f, 0.003441f, 0.003653f, 0.003904f, 0.004238f, 0.004501f, 0.004738f,
- 0.005024f, 0.005390f, 0.005657f, 0.005985f, 0.006279f, 0.006714f, 0.007053f, 0.007507f,
- 0.007881f, 0.008369f, 0.008774f, 0.009300f, 0.009888f, 0.010483f, 0.011093f, 0.011627f,
- 0.012398f, 0.013130f, 0.013855f, 0.014717f, 0.015686f, 0.016739f, 0.017761f, 0.018890f,
- 0.020248f, 0.021698f, 0.023376f, 0.025131f, 0.027237f, 0.029556f, 0.032166f, 0.035004f,
- 0.038208f, 0.041962f, 0.045868f, 0.050507f, 0.055359f, 0.060852f, 0.066772f, 0.073242f,
- 0.080017f, 0.087097f, 0.440674f, 0.498047f, 0.511719f, 0.517090f, 0.520508f, 0.522949f,
- 0.000427f, 0.001020f, 0.001253f, 0.001431f, 0.001690f, 0.001900f, 0.002018f, 0.002304f,
- 0.002481f, 0.002569f, 0.002731f, 0.002998f, 0.003157f, 0.003424f, 0.003592f, 0.003838f,
- 0.004017f, 0.004253f, 0.004551f, 0.004776f, 0.005100f, 0.005379f, 0.005699f, 0.005932f,
- 0.006290f, 0.006630f, 0.007038f, 0.007465f, 0.007927f, 0.008286f, 0.008858f, 0.009293f,
- 0.009888f, 0.010429f, 0.011086f, 0.011765f, 0.012482f, 0.013298f, 0.014168f, 0.015068f,
- 0.016129f, 0.017288f, 0.018585f, 0.019943f, 0.021622f, 0.023361f, 0.025436f, 0.027847f,
- 0.030655f, 0.033447f, 0.037079f, 0.041229f, 0.045776f, 0.050568f, 0.056061f, 0.062317f,
- 0.068726f, 0.075684f, 0.427734f, 0.488525f, 0.502441f, 0.508789f, 0.513184f, 0.513672f,
- 0.000255f, 0.000597f, 0.001032f, 0.001150f, 0.001353f, 0.001493f, 0.001608f, 0.001750f,
- 0.001933f, 0.002062f, 0.002178f, 0.002302f, 0.002474f, 0.002670f, 0.002872f, 0.002995f,
- 0.003147f, 0.003298f, 0.003565f, 0.003729f, 0.003941f, 0.004219f, 0.004436f, 0.004719f,
- 0.005005f, 0.005230f, 0.005489f, 0.005806f, 0.006191f, 0.006496f, 0.006897f, 0.007267f,
- 0.007671f, 0.008179f, 0.008636f, 0.009163f, 0.009766f, 0.010368f, 0.011047f, 0.011810f,
- 0.012611f, 0.013527f, 0.014519f, 0.015640f, 0.016800f, 0.018265f, 0.019897f, 0.021698f,
- 0.023895f, 0.026260f, 0.029175f, 0.032715f, 0.036682f, 0.041168f, 0.045929f, 0.051758f,
- 0.057922f, 0.064575f, 0.415771f, 0.478271f, 0.493652f, 0.500000f, 0.503906f, 0.505859f,
- 0.000255f, 0.000544f, 0.000863f, 0.000994f, 0.001086f, 0.001183f, 0.001317f, 0.001328f,
- 0.001491f, 0.001608f, 0.001716f, 0.001851f, 0.001943f, 0.002075f, 0.002161f, 0.002319f,
- 0.002426f, 0.002596f, 0.002741f, 0.002884f, 0.003088f, 0.003265f, 0.003391f, 0.003620f,
- 0.003777f, 0.004005f, 0.004215f, 0.004452f, 0.004734f, 0.004963f, 0.005341f, 0.005577f,
- 0.005875f, 0.006271f, 0.006603f, 0.006996f, 0.007450f, 0.007919f, 0.008446f, 0.009003f,
- 0.009674f, 0.010338f, 0.011101f, 0.011909f, 0.012917f, 0.013977f, 0.015190f, 0.016495f,
- 0.018112f, 0.020325f, 0.022415f, 0.025146f, 0.028473f, 0.032349f, 0.036804f, 0.041992f,
- 0.047913f, 0.054077f, 0.404541f, 0.468506f, 0.484131f, 0.490967f, 0.495361f, 0.498291f,
- 0.000377f, 0.000440f, 0.000606f, 0.000685f, 0.000735f, 0.000876f, 0.000929f, 0.001035f,
- 0.001068f, 0.001157f, 0.001307f, 0.001381f, 0.001473f, 0.001595f, 0.001664f, 0.001708f,
- 0.001850f, 0.001957f, 0.002043f, 0.002195f, 0.002291f, 0.002422f, 0.002571f, 0.002687f,
- 0.002842f, 0.002979f, 0.003183f, 0.003345f, 0.003532f, 0.003794f, 0.004002f, 0.004154f,
- 0.004429f, 0.004635f, 0.004967f, 0.005253f, 0.005573f, 0.005909f, 0.006275f, 0.006695f,
- 0.007183f, 0.007660f, 0.008316f, 0.008934f, 0.009644f, 0.010429f, 0.011360f, 0.012497f,
- 0.013634f, 0.014977f, 0.016663f, 0.018875f, 0.021423f, 0.024643f, 0.028549f, 0.033020f,
- 0.038483f, 0.044525f, 0.391602f, 0.458984f, 0.474854f, 0.482178f, 0.488037f, 0.489990f,
- 0.000159f, 0.000401f, 0.000450f, 0.000522f, 0.000605f, 0.000634f, 0.000728f, 0.000702f,
- 0.000808f, 0.000882f, 0.000959f, 0.000991f, 0.001043f, 0.001112f, 0.001205f, 0.001245f,
- 0.001357f, 0.001419f, 0.001513f, 0.001546f, 0.001648f, 0.001752f, 0.001863f, 0.001942f,
- 0.002056f, 0.002159f, 0.002289f, 0.002392f, 0.002506f, 0.002697f, 0.002827f, 0.003023f,
- 0.003172f, 0.003330f, 0.003542f, 0.003750f, 0.004017f, 0.004292f, 0.004559f, 0.004871f,
- 0.005161f, 0.005539f, 0.005932f, 0.006416f, 0.006973f, 0.007526f, 0.008232f, 0.008980f,
- 0.009918f, 0.010895f, 0.012085f, 0.013680f, 0.015472f, 0.017975f, 0.021103f, 0.025146f,
- 0.029938f, 0.035645f, 0.379395f, 0.448486f, 0.465820f, 0.473633f, 0.478760f, 0.481689f,
- 0.000112f, 0.000220f, 0.000321f, 0.000322f, 0.000401f, 0.000489f, 0.000469f, 0.000510f,
- 0.000568f, 0.000653f, 0.000659f, 0.000676f, 0.000703f, 0.000789f, 0.000811f, 0.000886f,
- 0.000888f, 0.000994f, 0.001048f, 0.001096f, 0.001155f, 0.001220f, 0.001289f, 0.001357f,
- 0.001431f, 0.001496f, 0.001599f, 0.001675f, 0.001759f, 0.001894f, 0.001965f, 0.002083f,
- 0.002193f, 0.002310f, 0.002464f, 0.002634f, 0.002758f, 0.002949f, 0.003134f, 0.003319f,
- 0.003551f, 0.003830f, 0.004120f, 0.004440f, 0.004784f, 0.005188f, 0.005680f, 0.006222f,
- 0.006886f, 0.007614f, 0.008461f, 0.009529f, 0.010864f, 0.012596f, 0.014961f, 0.018097f,
- 0.022263f, 0.027466f, 0.367920f, 0.438232f, 0.456543f, 0.465332f, 0.470215f, 0.472900f,
- 0.000140f, 0.000219f, 0.000241f, 0.000245f, 0.000290f, 0.000291f, 0.000302f, 0.000342f,
- 0.000380f, 0.000409f, 0.000408f, 0.000485f, 0.000473f, 0.000527f, 0.000556f, 0.000575f,
- 0.000630f, 0.000642f, 0.000673f, 0.000711f, 0.000762f, 0.000800f, 0.000852f, 0.000886f,
- 0.000952f, 0.000982f, 0.001049f, 0.001108f, 0.001159f, 0.001220f, 0.001281f, 0.001369f,
- 0.001454f, 0.001522f, 0.001595f, 0.001695f, 0.001839f, 0.001928f, 0.002068f, 0.002209f,
- 0.002337f, 0.002504f, 0.002686f, 0.002876f, 0.003139f, 0.003437f, 0.003723f, 0.004078f,
- 0.004509f, 0.005009f, 0.005615f, 0.006332f, 0.007317f, 0.008461f, 0.009926f, 0.012154f,
- 0.015640f, 0.020325f, 0.356445f, 0.429199f, 0.447266f, 0.456299f, 0.462158f, 0.464844f,
- 0.000048f, 0.000154f, 0.000141f, 0.000147f, 0.000174f, 0.000207f, 0.000188f, 0.000221f,
- 0.000233f, 0.000242f, 0.000248f, 0.000271f, 0.000299f, 0.000312f, 0.000337f, 0.000350f,
- 0.000367f, 0.000403f, 0.000416f, 0.000458f, 0.000465f, 0.000483f, 0.000507f, 0.000546f,
- 0.000576f, 0.000625f, 0.000637f, 0.000659f, 0.000705f, 0.000742f, 0.000797f, 0.000837f,
- 0.000890f, 0.000925f, 0.000978f, 0.001036f, 0.001103f, 0.001181f, 0.001253f, 0.001329f,
- 0.001421f, 0.001529f, 0.001647f, 0.001782f, 0.001906f, 0.002075f, 0.002291f, 0.002483f,
- 0.002758f, 0.003059f, 0.003450f, 0.003906f, 0.004536f, 0.005306f, 0.006325f, 0.007713f,
- 0.010101f, 0.014084f, 0.343262f, 0.418457f, 0.437744f, 0.447510f, 0.452881f, 0.456543f,
- 0.000099f, 0.000100f, 0.000091f, 0.000085f, 0.000105f, 0.000099f, 0.000127f, 0.000127f,
- 0.000130f, 0.000137f, 0.000152f, 0.000164f, 0.000164f, 0.000172f, 0.000195f, 0.000186f,
- 0.000209f, 0.000222f, 0.000231f, 0.000241f, 0.000258f, 0.000266f, 0.000290f, 0.000301f,
- 0.000324f, 0.000343f, 0.000357f, 0.000369f, 0.000392f, 0.000409f, 0.000440f, 0.000463f,
- 0.000484f, 0.000513f, 0.000544f, 0.000578f, 0.000607f, 0.000650f, 0.000702f, 0.000737f,
- 0.000787f, 0.000846f, 0.000918f, 0.000977f, 0.001062f, 0.001146f, 0.001259f, 0.001379f,
- 0.001524f, 0.001701f, 0.001924f, 0.002207f, 0.002542f, 0.003006f, 0.003628f, 0.004494f,
- 0.005821f, 0.008774f, 0.332031f, 0.409180f, 0.428467f, 0.438965f, 0.444336f, 0.447998f,
- 0.000082f, 0.000057f, 0.000048f, 0.000051f, 0.000055f, 0.000054f, 0.000057f, 0.000064f,
- 0.000066f, 0.000079f, 0.000070f, 0.000070f, 0.000084f, 0.000078f, 0.000084f, 0.000091f,
- 0.000099f, 0.000108f, 0.000108f, 0.000114f, 0.000119f, 0.000124f, 0.000129f, 0.000144f,
- 0.000151f, 0.000158f, 0.000163f, 0.000176f, 0.000188f, 0.000196f, 0.000208f, 0.000220f,
- 0.000227f, 0.000239f, 0.000259f, 0.000273f, 0.000290f, 0.000303f, 0.000331f, 0.000351f,
- 0.000376f, 0.000402f, 0.000432f, 0.000460f, 0.000500f, 0.000547f, 0.000593f, 0.000648f,
- 0.000720f, 0.000805f, 0.000918f, 0.001045f, 0.001225f, 0.001462f, 0.001788f, 0.002264f,
- 0.003029f, 0.004623f, 0.320801f, 0.398682f, 0.419922f, 0.430420f, 0.436279f, 0.440674f,
- 0.000061f, 0.000041f, 0.000033f, 0.000029f, 0.000026f, 0.000025f, 0.000024f, 0.000024f,
- 0.000023f, 0.000023f, 0.000025f, 0.000032f, 0.000026f, 0.000027f, 0.000035f, 0.000037f,
- 0.000039f, 0.000041f, 0.000041f, 0.000041f, 0.000044f, 0.000050f, 0.000054f, 0.000051f,
- 0.000055f, 0.000060f, 0.000061f, 0.000062f, 0.000069f, 0.000074f, 0.000075f, 0.000081f,
- 0.000087f, 0.000090f, 0.000093f, 0.000098f, 0.000108f, 0.000114f, 0.000123f, 0.000130f,
- 0.000142f, 0.000144f, 0.000156f, 0.000173f, 0.000179f, 0.000200f, 0.000218f, 0.000237f,
- 0.000267f, 0.000299f, 0.000335f, 0.000382f, 0.000448f, 0.000544f, 0.000677f, 0.000883f,
- 0.001233f, 0.001933f, 0.309570f, 0.388672f, 0.410889f, 0.421143f, 0.427246f, 0.431885f,
- 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, 0.000011f,
- 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000009f,
- 0.000009f, 0.000007f, 0.000007f, 0.000007f, 0.000008f, 0.000009f, 0.000011f, 0.000012f,
- 0.000012f, 0.000012f, 0.000013f, 0.000015f, 0.000015f, 0.000014f, 0.000016f, 0.000017f,
- 0.000019f, 0.000020f, 0.000020f, 0.000022f, 0.000025f, 0.000023f, 0.000026f, 0.000029f,
- 0.000031f, 0.000034f, 0.000036f, 0.000037f, 0.000040f, 0.000044f, 0.000048f, 0.000052f,
- 0.000056f, 0.000063f, 0.000068f, 0.000083f, 0.000098f, 0.000117f, 0.000149f, 0.000201f,
- 0.000301f, 0.000544f, 0.297607f, 0.379150f, 0.400879f, 0.411865f, 0.419189f, 0.423340f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000005f, 0.000007f,
- 0.000011f, 0.000026f, 0.286621f, 0.368896f, 0.391846f, 0.402588f, 0.409912f, 0.414551f,
- },
- {
- 0.007935f, 0.024429f, 0.041290f, 0.058838f, 0.076355f, 0.093933f, 0.111145f, 0.128174f,
- 0.146606f, 0.164429f, 0.182617f, 0.200562f, 0.218750f, 0.236206f, 0.254150f, 0.271729f,
- 0.289551f, 0.308105f, 0.325684f, 0.342773f, 0.360596f, 0.379150f, 0.396240f, 0.414795f,
- 0.431641f, 0.450439f, 0.468018f, 0.484619f, 0.502441f, 0.520020f, 0.536621f, 0.554688f,
- 0.571777f, 0.588379f, 0.605469f, 0.622559f, 0.640137f, 0.657227f, 0.672852f, 0.689941f,
- 0.707031f, 0.723633f, 0.740234f, 0.756836f, 0.773926f, 0.789551f, 0.805664f, 0.821777f,
- 0.838379f, 0.854980f, 0.870117f, 0.885742f, 0.901855f, 0.917480f, 0.932617f, 0.948730f,
- 0.963379f, 0.979492f, 0.960449f, 0.909668f, 0.876465f, 0.850098f, 0.827637f, 0.807617f,
- 0.007530f, 0.023422f, 0.039764f, 0.056610f, 0.073303f, 0.090149f, 0.107300f, 0.124084f,
- 0.141968f, 0.158569f, 0.176392f, 0.193604f, 0.210815f, 0.228760f, 0.246094f, 0.262695f,
- 0.280518f, 0.298340f, 0.315430f, 0.333252f, 0.350586f, 0.367432f, 0.384766f, 0.402344f,
- 0.419678f, 0.436768f, 0.453613f, 0.471436f, 0.488037f, 0.504883f, 0.521973f, 0.538574f,
- 0.556641f, 0.573242f, 0.589844f, 0.605957f, 0.623535f, 0.639160f, 0.656250f, 0.673340f,
- 0.688477f, 0.706055f, 0.721680f, 0.738770f, 0.754883f, 0.770508f, 0.786133f, 0.803711f,
- 0.817871f, 0.834473f, 0.850586f, 0.866211f, 0.881348f, 0.896973f, 0.913086f, 0.928223f,
- 0.942871f, 0.958984f, 0.951172f, 0.903320f, 0.871094f, 0.845703f, 0.824219f, 0.805664f,
- 0.007320f, 0.022552f, 0.038391f, 0.054260f, 0.070312f, 0.086792f, 0.103271f, 0.120178f,
- 0.136841f, 0.153564f, 0.170410f, 0.187256f, 0.203735f, 0.220825f, 0.237793f, 0.255127f,
- 0.271240f, 0.288086f, 0.305420f, 0.322021f, 0.339844f, 0.356689f, 0.373047f, 0.390137f,
- 0.406738f, 0.423340f, 0.440186f, 0.456787f, 0.474121f, 0.490967f, 0.507324f, 0.523926f,
- 0.540527f, 0.557129f, 0.573242f, 0.590332f, 0.606445f, 0.623047f, 0.638672f, 0.655273f,
- 0.671875f, 0.687500f, 0.703613f, 0.720215f, 0.735840f, 0.751953f, 0.767578f, 0.783203f,
- 0.799316f, 0.814941f, 0.830078f, 0.845703f, 0.861328f, 0.877441f, 0.892090f, 0.908203f,
- 0.922852f, 0.938477f, 0.941895f, 0.895996f, 0.865723f, 0.841309f, 0.820801f, 0.802734f,
- 0.007008f, 0.021667f, 0.036865f, 0.052216f, 0.067871f, 0.083862f, 0.099426f, 0.115479f,
- 0.131470f, 0.148315f, 0.164551f, 0.180298f, 0.196899f, 0.213379f, 0.229370f, 0.246460f,
- 0.262695f, 0.279541f, 0.295410f, 0.311523f, 0.329102f, 0.345215f, 0.360840f, 0.378174f,
- 0.394043f, 0.410156f, 0.427246f, 0.443115f, 0.459717f, 0.476318f, 0.493652f, 0.508789f,
- 0.524902f, 0.541016f, 0.557129f, 0.573242f, 0.589844f, 0.605469f, 0.621582f, 0.638672f,
- 0.652832f, 0.669434f, 0.685547f, 0.701660f, 0.717285f, 0.731934f, 0.749023f, 0.764160f,
- 0.779785f, 0.794922f, 0.810059f, 0.826172f, 0.841309f, 0.856445f, 0.872070f, 0.886719f,
- 0.902344f, 0.917480f, 0.932129f, 0.889648f, 0.859863f, 0.835938f, 0.816895f, 0.799316f,
- 0.006817f, 0.020645f, 0.035156f, 0.050110f, 0.065247f, 0.080383f, 0.096313f, 0.111450f,
- 0.126587f, 0.142456f, 0.158447f, 0.174316f, 0.189819f, 0.205566f, 0.221802f, 0.237427f,
- 0.253662f, 0.269775f, 0.285889f, 0.301514f, 0.317627f, 0.333740f, 0.349609f, 0.366211f,
- 0.381348f, 0.397705f, 0.414307f, 0.429932f, 0.447266f, 0.462646f, 0.477539f, 0.494385f,
- 0.509766f, 0.525879f, 0.541992f, 0.557617f, 0.571777f, 0.588379f, 0.605469f, 0.619629f,
- 0.636230f, 0.651855f, 0.666992f, 0.681152f, 0.698242f, 0.714355f, 0.729980f, 0.745117f,
- 0.759766f, 0.775391f, 0.790527f, 0.806152f, 0.821289f, 0.835938f, 0.850586f, 0.866211f,
- 0.882324f, 0.896484f, 0.922363f, 0.882324f, 0.854004f, 0.831543f, 0.812500f, 0.795898f,
- 0.006378f, 0.019989f, 0.034027f, 0.048004f, 0.062744f, 0.077148f, 0.091980f, 0.107178f,
- 0.122192f, 0.137207f, 0.152466f, 0.167603f, 0.183960f, 0.199097f, 0.214111f, 0.229736f,
- 0.244995f, 0.260254f, 0.276367f, 0.291504f, 0.306641f, 0.322998f, 0.338623f, 0.354248f,
- 0.369629f, 0.385254f, 0.400879f, 0.416504f, 0.432617f, 0.447510f, 0.464111f, 0.479492f,
- 0.494141f, 0.511230f, 0.525879f, 0.541016f, 0.556641f, 0.572754f, 0.586914f, 0.602051f,
- 0.617676f, 0.633789f, 0.648926f, 0.665039f, 0.679688f, 0.695312f, 0.710449f, 0.726074f,
- 0.739746f, 0.755859f, 0.771484f, 0.785645f, 0.800781f, 0.815918f, 0.831055f, 0.846680f,
- 0.860840f, 0.875977f, 0.912598f, 0.874512f, 0.847656f, 0.826172f, 0.807617f, 0.791504f,
- 0.006603f, 0.019287f, 0.032776f, 0.046356f, 0.060272f, 0.073914f, 0.088135f, 0.102905f,
- 0.117554f, 0.132690f, 0.147095f, 0.161377f, 0.176636f, 0.191162f, 0.205444f, 0.221680f,
- 0.236572f, 0.251465f, 0.267090f, 0.281250f, 0.296875f, 0.312256f, 0.327393f, 0.342285f,
- 0.357666f, 0.373291f, 0.388184f, 0.403076f, 0.418457f, 0.433838f, 0.448975f, 0.465088f,
- 0.479980f, 0.494385f, 0.509277f, 0.525879f, 0.540039f, 0.555176f, 0.570801f, 0.586426f,
- 0.601074f, 0.616211f, 0.631348f, 0.646484f, 0.661133f, 0.676270f, 0.692383f, 0.705078f,
- 0.720215f, 0.735352f, 0.751953f, 0.766602f, 0.781250f, 0.796387f, 0.810059f, 0.825684f,
- 0.840820f, 0.855469f, 0.902344f, 0.866699f, 0.841797f, 0.820312f, 0.803223f, 0.787598f,
- 0.006111f, 0.018433f, 0.031097f, 0.044739f, 0.057892f, 0.071472f, 0.085205f, 0.099304f,
- 0.113037f, 0.127319f, 0.141357f, 0.156128f, 0.169678f, 0.183838f, 0.198608f, 0.213745f,
- 0.227661f, 0.243652f, 0.257324f, 0.272705f, 0.286865f, 0.301025f, 0.316406f, 0.331543f,
- 0.345703f, 0.360107f, 0.375000f, 0.390625f, 0.405762f, 0.420410f, 0.435303f, 0.449951f,
- 0.465088f, 0.479492f, 0.494141f, 0.509277f, 0.523926f, 0.538574f, 0.553711f, 0.569336f,
- 0.583496f, 0.598145f, 0.612793f, 0.628418f, 0.642578f, 0.657227f, 0.671387f, 0.687012f,
- 0.702637f, 0.716797f, 0.731934f, 0.745605f, 0.761230f, 0.775391f, 0.790527f, 0.805176f,
- 0.819824f, 0.834961f, 0.892578f, 0.858887f, 0.834473f, 0.814941f, 0.798340f, 0.783203f,
- 0.005756f, 0.017761f, 0.029907f, 0.042572f, 0.055481f, 0.068420f, 0.081482f, 0.095276f,
- 0.108826f, 0.122070f, 0.135620f, 0.149902f, 0.163330f, 0.177368f, 0.191284f, 0.206421f,
- 0.219482f, 0.233521f, 0.247925f, 0.262451f, 0.277100f, 0.290771f, 0.304688f, 0.319580f,
- 0.334229f, 0.348389f, 0.362549f, 0.377441f, 0.391602f, 0.406250f, 0.421143f, 0.435791f,
- 0.450439f, 0.463867f, 0.478760f, 0.493164f, 0.507812f, 0.521973f, 0.537109f, 0.551270f,
- 0.565430f, 0.580078f, 0.594727f, 0.609863f, 0.624023f, 0.638672f, 0.653320f, 0.668457f,
- 0.682129f, 0.697266f, 0.711914f, 0.726562f, 0.740723f, 0.755859f, 0.770996f, 0.785156f,
- 0.799805f, 0.814453f, 0.882812f, 0.851562f, 0.827148f, 0.808594f, 0.792969f, 0.778809f,
- 0.005741f, 0.017166f, 0.029053f, 0.041138f, 0.053345f, 0.065796f, 0.078674f, 0.091248f,
- 0.104614f, 0.117004f, 0.130737f, 0.143921f, 0.156860f, 0.170288f, 0.183960f, 0.197754f,
- 0.211304f, 0.224976f, 0.238892f, 0.251953f, 0.266357f, 0.280273f, 0.294922f, 0.308594f,
- 0.322021f, 0.336914f, 0.350098f, 0.364502f, 0.378174f, 0.393066f, 0.407471f, 0.420166f,
- 0.435059f, 0.449219f, 0.463135f, 0.477295f, 0.491699f, 0.506348f, 0.520996f, 0.534668f,
- 0.549316f, 0.563477f, 0.577148f, 0.591309f, 0.605469f, 0.620605f, 0.634766f, 0.648438f,
- 0.663086f, 0.677734f, 0.691895f, 0.706543f, 0.720215f, 0.734863f, 0.750488f, 0.765137f,
- 0.779297f, 0.793945f, 0.872559f, 0.843262f, 0.820801f, 0.803223f, 0.787598f, 0.773926f,
- 0.005283f, 0.016052f, 0.028030f, 0.039246f, 0.050751f, 0.063232f, 0.074829f, 0.087341f,
- 0.099976f, 0.112732f, 0.125122f, 0.138062f, 0.150757f, 0.163696f, 0.176758f, 0.189697f,
- 0.203125f, 0.216553f, 0.229614f, 0.243286f, 0.256592f, 0.269775f, 0.283203f, 0.297119f,
- 0.310547f, 0.324463f, 0.337891f, 0.351807f, 0.365234f, 0.378662f, 0.392822f, 0.406738f,
- 0.419922f, 0.434814f, 0.448730f, 0.461182f, 0.476562f, 0.489746f, 0.502930f, 0.517578f,
- 0.531738f, 0.545410f, 0.559082f, 0.573730f, 0.587402f, 0.602051f, 0.615723f, 0.629395f,
- 0.644043f, 0.658203f, 0.672363f, 0.686523f, 0.701660f, 0.714844f, 0.729980f, 0.743652f,
- 0.758301f, 0.774414f, 0.862305f, 0.835449f, 0.813965f, 0.796875f, 0.782227f, 0.769043f,
- 0.005272f, 0.015427f, 0.026230f, 0.037506f, 0.049164f, 0.060516f, 0.072021f, 0.083740f,
- 0.095825f, 0.108521f, 0.120361f, 0.132324f, 0.144897f, 0.156738f, 0.169922f, 0.182373f,
- 0.195068f, 0.208008f, 0.220459f, 0.233887f, 0.246948f, 0.260254f, 0.272461f, 0.285889f,
- 0.299561f, 0.312500f, 0.325684f, 0.338867f, 0.352783f, 0.365479f, 0.378906f, 0.392334f,
- 0.406006f, 0.419189f, 0.432861f, 0.446777f, 0.460693f, 0.473877f, 0.486572f, 0.500977f,
- 0.515137f, 0.528809f, 0.542480f, 0.555176f, 0.569824f, 0.583984f, 0.597656f, 0.611328f,
- 0.625000f, 0.639648f, 0.653320f, 0.667480f, 0.681641f, 0.695801f, 0.709961f, 0.723633f,
- 0.738281f, 0.752930f, 0.852539f, 0.827148f, 0.807129f, 0.790527f, 0.776367f, 0.764160f,
- 0.004822f, 0.014885f, 0.025360f, 0.035767f, 0.046570f, 0.057587f, 0.068726f, 0.080139f,
- 0.091736f, 0.103577f, 0.115479f, 0.126709f, 0.138672f, 0.150879f, 0.162231f, 0.174805f,
- 0.187622f, 0.199951f, 0.212524f, 0.224854f, 0.236694f, 0.249878f, 0.262207f, 0.275391f,
- 0.287842f, 0.300293f, 0.313477f, 0.326904f, 0.340088f, 0.353027f, 0.365479f, 0.378174f,
- 0.391602f, 0.404541f, 0.417236f, 0.431641f, 0.444336f, 0.457764f, 0.470703f, 0.484375f,
- 0.497803f, 0.510742f, 0.524902f, 0.537598f, 0.552246f, 0.564941f, 0.579590f, 0.592285f,
- 0.606445f, 0.621094f, 0.634277f, 0.646973f, 0.662109f, 0.675781f, 0.689453f, 0.704102f,
- 0.718262f, 0.733398f, 0.842285f, 0.818848f, 0.799805f, 0.784180f, 0.770996f, 0.758301f,
- 0.004745f, 0.014427f, 0.024277f, 0.034546f, 0.044800f, 0.055176f, 0.066040f, 0.076477f,
- 0.087341f, 0.099060f, 0.110474f, 0.121216f, 0.132690f, 0.144165f, 0.156006f, 0.167358f,
- 0.179688f, 0.191284f, 0.203247f, 0.216187f, 0.227905f, 0.239868f, 0.252441f, 0.264648f,
- 0.277100f, 0.289307f, 0.301270f, 0.314453f, 0.326660f, 0.338867f, 0.352539f, 0.364990f,
- 0.377686f, 0.390137f, 0.403076f, 0.416016f, 0.428467f, 0.441406f, 0.453857f, 0.468262f,
- 0.480957f, 0.494385f, 0.507324f, 0.520020f, 0.534180f, 0.547363f, 0.560059f, 0.573730f,
- 0.586914f, 0.601074f, 0.615234f, 0.628418f, 0.641602f, 0.656250f, 0.669434f, 0.683594f,
- 0.697754f, 0.712402f, 0.832520f, 0.809570f, 0.792480f, 0.778320f, 0.764160f, 0.753906f,
- 0.004612f, 0.013840f, 0.023483f, 0.033081f, 0.042999f, 0.052490f, 0.063049f, 0.073303f,
- 0.083801f, 0.094238f, 0.105042f, 0.115967f, 0.127319f, 0.138062f, 0.149048f, 0.160645f,
- 0.171875f, 0.183228f, 0.194946f, 0.206665f, 0.218384f, 0.230347f, 0.241699f, 0.253906f,
- 0.265869f, 0.277832f, 0.290039f, 0.301758f, 0.314209f, 0.326660f, 0.339111f, 0.351074f,
- 0.363281f, 0.375977f, 0.388428f, 0.401123f, 0.413330f, 0.426270f, 0.439453f, 0.451904f,
- 0.464111f, 0.478027f, 0.489746f, 0.503418f, 0.515625f, 0.529297f, 0.542480f, 0.556152f,
- 0.569336f, 0.582031f, 0.595215f, 0.608887f, 0.622559f, 0.636230f, 0.649902f, 0.663574f,
- 0.677246f, 0.691895f, 0.821289f, 0.802246f, 0.785645f, 0.771484f, 0.758789f, 0.748047f,
- 0.004345f, 0.012985f, 0.022156f, 0.030884f, 0.040802f, 0.050568f, 0.060303f, 0.069946f,
- 0.079956f, 0.090393f, 0.100403f, 0.111084f, 0.120667f, 0.131714f, 0.142700f, 0.153198f,
- 0.164429f, 0.175659f, 0.186523f, 0.197876f, 0.208496f, 0.220337f, 0.231567f, 0.243286f,
- 0.254639f, 0.266113f, 0.277832f, 0.289795f, 0.301758f, 0.313477f, 0.325439f, 0.337402f,
- 0.349609f, 0.361328f, 0.373779f, 0.385986f, 0.398193f, 0.410889f, 0.423340f, 0.435059f,
- 0.447998f, 0.460205f, 0.473389f, 0.486084f, 0.499023f, 0.511230f, 0.524414f, 0.537109f,
- 0.549805f, 0.563477f, 0.576172f, 0.589355f, 0.603027f, 0.616699f, 0.629883f, 0.644531f,
- 0.658691f, 0.670898f, 0.811035f, 0.792969f, 0.777832f, 0.764648f, 0.752441f, 0.742676f,
- 0.004002f, 0.012718f, 0.021210f, 0.029877f, 0.039246f, 0.048431f, 0.057281f, 0.067078f,
- 0.076538f, 0.086121f, 0.096008f, 0.105957f, 0.115540f, 0.125732f, 0.136475f, 0.146729f,
- 0.157227f, 0.167236f, 0.177979f, 0.189819f, 0.200195f, 0.210693f, 0.221802f, 0.232788f,
- 0.243896f, 0.255127f, 0.266602f, 0.278320f, 0.289062f, 0.300293f, 0.312012f, 0.323975f,
- 0.335449f, 0.347168f, 0.359131f, 0.371094f, 0.382812f, 0.394775f, 0.406982f, 0.419434f,
- 0.431152f, 0.443604f, 0.455566f, 0.468506f, 0.481445f, 0.493408f, 0.506348f, 0.519043f,
- 0.531738f, 0.544922f, 0.558105f, 0.570801f, 0.583984f, 0.597168f, 0.610352f, 0.624512f,
- 0.637695f, 0.651855f, 0.800293f, 0.785156f, 0.770508f, 0.757812f, 0.747070f, 0.737305f,
- 0.003967f, 0.011940f, 0.020203f, 0.028931f, 0.037109f, 0.045898f, 0.054840f, 0.063477f,
- 0.073059f, 0.082214f, 0.090942f, 0.100647f, 0.110535f, 0.120178f, 0.129639f, 0.139648f,
- 0.149902f, 0.160156f, 0.170044f, 0.180786f, 0.190674f, 0.201416f, 0.211792f, 0.222412f,
- 0.233521f, 0.244751f, 0.255615f, 0.266113f, 0.276855f, 0.288574f, 0.299561f, 0.311279f,
- 0.322266f, 0.333984f, 0.344727f, 0.356934f, 0.368164f, 0.379395f, 0.390869f, 0.403076f,
- 0.415283f, 0.427246f, 0.439453f, 0.451172f, 0.464111f, 0.476807f, 0.488281f, 0.500977f,
- 0.513672f, 0.526367f, 0.538574f, 0.551758f, 0.564453f, 0.577637f, 0.590820f, 0.604492f,
- 0.618164f, 0.631836f, 0.790039f, 0.775879f, 0.763184f, 0.750977f, 0.740723f, 0.731445f,
- 0.003679f, 0.011749f, 0.019135f, 0.027237f, 0.035431f, 0.043884f, 0.052399f, 0.060577f,
- 0.069153f, 0.077881f, 0.086731f, 0.095947f, 0.104797f, 0.114380f, 0.123535f, 0.133057f,
- 0.142700f, 0.152588f, 0.162231f, 0.171753f, 0.182129f, 0.192261f, 0.202026f, 0.212524f,
- 0.222900f, 0.233643f, 0.243896f, 0.254395f, 0.264893f, 0.276123f, 0.286621f, 0.297119f,
- 0.308105f, 0.319336f, 0.331299f, 0.341553f, 0.353027f, 0.364258f, 0.375977f, 0.387451f,
- 0.399414f, 0.410645f, 0.422607f, 0.434814f, 0.445801f, 0.458984f, 0.470703f, 0.482910f,
- 0.495361f, 0.508301f, 0.520020f, 0.532227f, 0.545410f, 0.558594f, 0.570801f, 0.584961f,
- 0.597656f, 0.611816f, 0.778809f, 0.768066f, 0.754883f, 0.743652f, 0.733887f, 0.725098f,
- 0.003525f, 0.010956f, 0.018433f, 0.026260f, 0.033295f, 0.041870f, 0.049377f, 0.057709f,
- 0.065735f, 0.074463f, 0.082764f, 0.091736f, 0.099976f, 0.108582f, 0.118103f, 0.126465f,
- 0.135742f, 0.144775f, 0.154175f, 0.164307f, 0.173218f, 0.182983f, 0.192505f, 0.202759f,
- 0.212646f, 0.221924f, 0.232910f, 0.242188f, 0.252930f, 0.262939f, 0.273926f, 0.284180f,
- 0.294922f, 0.305420f, 0.316162f, 0.327637f, 0.338867f, 0.349609f, 0.361084f, 0.371826f,
- 0.382812f, 0.395020f, 0.406494f, 0.417725f, 0.429688f, 0.441406f, 0.452637f, 0.465088f,
- 0.477783f, 0.489258f, 0.501953f, 0.514160f, 0.527344f, 0.539062f, 0.551758f, 0.564941f,
- 0.578125f, 0.591797f, 0.768555f, 0.759277f, 0.748047f, 0.736816f, 0.728027f, 0.718750f,
- 0.003363f, 0.010353f, 0.017548f, 0.024765f, 0.032196f, 0.039673f, 0.046936f, 0.054565f,
- 0.062561f, 0.070496f, 0.078308f, 0.086731f, 0.094910f, 0.103333f, 0.111633f, 0.120422f,
- 0.129150f, 0.137695f, 0.146973f, 0.155762f, 0.164673f, 0.173950f, 0.183228f, 0.193359f,
- 0.201782f, 0.212036f, 0.221436f, 0.231323f, 0.241699f, 0.251221f, 0.261719f, 0.271729f,
- 0.281494f, 0.291992f, 0.302734f, 0.312988f, 0.323730f, 0.334961f, 0.345459f, 0.357666f,
- 0.367432f, 0.378662f, 0.389893f, 0.401855f, 0.412842f, 0.424316f, 0.435791f, 0.447266f,
- 0.459473f, 0.471436f, 0.482910f, 0.495605f, 0.507324f, 0.520508f, 0.533203f, 0.545898f,
- 0.558594f, 0.570801f, 0.757812f, 0.750488f, 0.740234f, 0.729980f, 0.720703f, 0.712402f,
- 0.003254f, 0.010048f, 0.016815f, 0.023453f, 0.030609f, 0.037537f, 0.044617f, 0.051971f,
- 0.059265f, 0.066833f, 0.074280f, 0.082153f, 0.089905f, 0.097717f, 0.106018f, 0.113770f,
- 0.122131f, 0.131104f, 0.139282f, 0.147705f, 0.155762f, 0.165161f, 0.173950f, 0.183228f,
- 0.192139f, 0.200928f, 0.210693f, 0.220093f, 0.229736f, 0.239258f, 0.248657f, 0.259277f,
- 0.268799f, 0.279053f, 0.288574f, 0.299561f, 0.309814f, 0.319580f, 0.330322f, 0.340820f,
- 0.352783f, 0.362549f, 0.374023f, 0.385010f, 0.395752f, 0.407471f, 0.418701f, 0.429688f,
- 0.441650f, 0.453125f, 0.465088f, 0.477539f, 0.489014f, 0.500977f, 0.513184f, 0.526855f,
- 0.539062f, 0.552246f, 0.747559f, 0.741699f, 0.731934f, 0.722656f, 0.714355f, 0.707031f,
- 0.003345f, 0.009262f, 0.015900f, 0.022614f, 0.029282f, 0.035522f, 0.042633f, 0.048981f,
- 0.056000f, 0.063110f, 0.070801f, 0.077454f, 0.084839f, 0.092590f, 0.100281f, 0.107849f,
- 0.116089f, 0.123169f, 0.131348f, 0.139648f, 0.148193f, 0.156616f, 0.164795f, 0.173584f,
- 0.182617f, 0.191284f, 0.200073f, 0.208740f, 0.218140f, 0.227417f, 0.236694f, 0.246338f,
- 0.255859f, 0.265381f, 0.275146f, 0.285889f, 0.294922f, 0.305420f, 0.315918f, 0.325928f,
- 0.336670f, 0.347412f, 0.358154f, 0.368652f, 0.378662f, 0.390381f, 0.402100f, 0.412842f,
- 0.424316f, 0.435059f, 0.447021f, 0.458984f, 0.470459f, 0.482422f, 0.494873f, 0.508301f,
- 0.520020f, 0.532227f, 0.737305f, 0.732910f, 0.723633f, 0.715820f, 0.708008f, 0.700195f,
- 0.003195f, 0.009010f, 0.015137f, 0.021225f, 0.027466f, 0.033844f, 0.040161f, 0.046417f,
- 0.053497f, 0.059875f, 0.066711f, 0.073425f, 0.080505f, 0.087280f, 0.094788f, 0.102173f,
- 0.109070f, 0.117004f, 0.124634f, 0.132446f, 0.139893f, 0.147705f, 0.155884f, 0.163940f,
- 0.172729f, 0.180908f, 0.189697f, 0.198242f, 0.206665f, 0.215820f, 0.225220f, 0.233765f,
- 0.243408f, 0.251953f, 0.262207f, 0.271484f, 0.281494f, 0.291260f, 0.300537f, 0.311035f,
- 0.320801f, 0.332520f, 0.341797f, 0.352051f, 0.362305f, 0.373535f, 0.384521f, 0.395264f,
- 0.406494f, 0.417480f, 0.429443f, 0.440430f, 0.451904f, 0.463867f, 0.476074f, 0.487793f,
- 0.499268f, 0.513184f, 0.726562f, 0.723633f, 0.716309f, 0.708496f, 0.700684f, 0.694336f,
- 0.002859f, 0.008507f, 0.014366f, 0.020203f, 0.026123f, 0.031891f, 0.038025f, 0.044281f,
- 0.050354f, 0.056519f, 0.062683f, 0.069275f, 0.075195f, 0.082458f, 0.088806f, 0.095947f,
- 0.102783f, 0.110046f, 0.117065f, 0.124878f, 0.132080f, 0.139282f, 0.146851f, 0.154907f,
- 0.162598f, 0.171265f, 0.178833f, 0.187500f, 0.195435f, 0.204590f, 0.213013f, 0.221680f,
- 0.231079f, 0.239502f, 0.248047f, 0.258301f, 0.267334f, 0.277100f, 0.286133f, 0.296387f,
- 0.306641f, 0.316162f, 0.326416f, 0.336426f, 0.346924f, 0.357422f, 0.367188f, 0.378418f,
- 0.389160f, 0.400391f, 0.411865f, 0.422852f, 0.433594f, 0.445557f, 0.457520f, 0.468994f,
- 0.481445f, 0.493408f, 0.715332f, 0.715332f, 0.708984f, 0.700684f, 0.693848f, 0.687988f,
- 0.002701f, 0.008080f, 0.013718f, 0.019058f, 0.024582f, 0.030197f, 0.035675f, 0.041748f,
- 0.047302f, 0.053589f, 0.059082f, 0.065308f, 0.071777f, 0.077576f, 0.084106f, 0.090332f,
- 0.097107f, 0.103577f, 0.110046f, 0.117493f, 0.124146f, 0.131470f, 0.138550f, 0.145508f,
- 0.153564f, 0.161377f, 0.169067f, 0.176880f, 0.184814f, 0.192627f, 0.201294f, 0.209717f,
- 0.218140f, 0.226929f, 0.235229f, 0.245117f, 0.253418f, 0.262939f, 0.272705f, 0.281738f,
- 0.290771f, 0.300781f, 0.310791f, 0.321289f, 0.330566f, 0.341064f, 0.351562f, 0.361572f,
- 0.372559f, 0.382568f, 0.393066f, 0.405273f, 0.415771f, 0.426758f, 0.438721f, 0.450439f,
- 0.461670f, 0.474121f, 0.704102f, 0.706543f, 0.700195f, 0.693359f, 0.687012f, 0.681152f,
- 0.002546f, 0.007771f, 0.012985f, 0.017975f, 0.023392f, 0.028976f, 0.034180f, 0.039368f,
- 0.044556f, 0.050110f, 0.055847f, 0.061218f, 0.066895f, 0.072815f, 0.078674f, 0.085083f,
- 0.091309f, 0.097168f, 0.103516f, 0.110107f, 0.116821f, 0.123413f, 0.130371f, 0.137329f,
- 0.144165f, 0.151733f, 0.158813f, 0.166382f, 0.174438f, 0.182129f, 0.190063f, 0.197510f,
- 0.206055f, 0.214355f, 0.222778f, 0.231812f, 0.240723f, 0.249023f, 0.258789f, 0.267578f,
- 0.276855f, 0.285889f, 0.295654f, 0.305420f, 0.315430f, 0.324463f, 0.334961f, 0.345215f,
- 0.354492f, 0.365234f, 0.376221f, 0.387451f, 0.398926f, 0.409424f, 0.419678f, 0.432129f,
- 0.443848f, 0.455566f, 0.693848f, 0.697266f, 0.691895f, 0.686523f, 0.680176f, 0.674805f,
- 0.002542f, 0.007271f, 0.012337f, 0.017181f, 0.021744f, 0.026840f, 0.031555f, 0.037231f,
- 0.042236f, 0.046906f, 0.051941f, 0.057709f, 0.063049f, 0.068542f, 0.073853f, 0.079712f,
- 0.085266f, 0.091064f, 0.096985f, 0.103027f, 0.109009f, 0.115417f, 0.122192f, 0.128540f,
- 0.135132f, 0.141846f, 0.148926f, 0.156250f, 0.163696f, 0.171387f, 0.178223f, 0.186035f,
- 0.194580f, 0.202271f, 0.210327f, 0.218994f, 0.227173f, 0.235596f, 0.244385f, 0.252930f,
- 0.262451f, 0.271240f, 0.280762f, 0.290771f, 0.299805f, 0.309082f, 0.318359f, 0.329102f,
- 0.338623f, 0.348633f, 0.358643f, 0.370117f, 0.379639f, 0.390869f, 0.401611f, 0.413330f,
- 0.425293f, 0.436523f, 0.682129f, 0.688477f, 0.684082f, 0.678711f, 0.673340f, 0.667969f,
- 0.002300f, 0.007076f, 0.011505f, 0.016251f, 0.020401f, 0.025665f, 0.029816f, 0.034790f,
- 0.039368f, 0.044159f, 0.048798f, 0.053955f, 0.059174f, 0.064148f, 0.069153f, 0.074463f,
- 0.079346f, 0.085266f, 0.090759f, 0.096191f, 0.102112f, 0.108032f, 0.114075f, 0.120117f,
- 0.126587f, 0.133057f, 0.139648f, 0.146240f, 0.153442f, 0.160400f, 0.167725f, 0.174683f,
- 0.182739f, 0.190308f, 0.198120f, 0.206177f, 0.214355f, 0.222656f, 0.230713f, 0.239258f,
- 0.248413f, 0.257080f, 0.265869f, 0.274658f, 0.284424f, 0.292725f, 0.302490f, 0.313232f,
- 0.321777f, 0.331787f, 0.341797f, 0.352295f, 0.363281f, 0.373535f, 0.383545f, 0.395264f,
- 0.405762f, 0.416992f, 0.671387f, 0.679688f, 0.675293f, 0.670898f, 0.666016f, 0.661133f,
- 0.002104f, 0.006474f, 0.010506f, 0.015099f, 0.018875f, 0.023911f, 0.028534f, 0.032715f,
- 0.036652f, 0.041290f, 0.046021f, 0.050171f, 0.054535f, 0.059570f, 0.064575f, 0.069458f,
- 0.074341f, 0.079346f, 0.084351f, 0.089844f, 0.095032f, 0.100830f, 0.106628f, 0.112122f,
- 0.117859f, 0.124084f, 0.130249f, 0.136841f, 0.143188f, 0.149780f, 0.157349f, 0.163940f,
- 0.171021f, 0.178345f, 0.186279f, 0.193848f, 0.201172f, 0.209717f, 0.217529f, 0.225464f,
- 0.233765f, 0.242676f, 0.251221f, 0.260254f, 0.268311f, 0.278076f, 0.287109f, 0.296143f,
- 0.305908f, 0.315674f, 0.325195f, 0.335449f, 0.344971f, 0.355469f, 0.365967f, 0.377441f,
- 0.387939f, 0.398193f, 0.660645f, 0.670410f, 0.667969f, 0.663086f, 0.659180f, 0.654785f,
- 0.002085f, 0.006306f, 0.010506f, 0.014107f, 0.018448f, 0.022293f, 0.026215f, 0.029953f,
- 0.034515f, 0.038391f, 0.042786f, 0.046844f, 0.051361f, 0.055573f, 0.059784f, 0.064331f,
- 0.068970f, 0.073425f, 0.078430f, 0.083313f, 0.088318f, 0.093567f, 0.098816f, 0.104126f,
- 0.109924f, 0.115662f, 0.121521f, 0.127197f, 0.133545f, 0.139771f, 0.146729f, 0.153076f,
- 0.160278f, 0.166992f, 0.174316f, 0.181274f, 0.188965f, 0.196045f, 0.204468f, 0.212036f,
- 0.220459f, 0.228638f, 0.237183f, 0.245483f, 0.254150f, 0.262451f, 0.271484f, 0.281250f,
- 0.290283f, 0.299561f, 0.308350f, 0.318115f, 0.328369f, 0.337158f, 0.349121f, 0.358887f,
- 0.370117f, 0.380615f, 0.649414f, 0.661133f, 0.659668f, 0.655762f, 0.651855f, 0.647949f,
- 0.001922f, 0.005867f, 0.009399f, 0.013565f, 0.017380f, 0.020859f, 0.024551f, 0.028442f,
- 0.032318f, 0.035980f, 0.039551f, 0.043488f, 0.047333f, 0.051239f, 0.055573f, 0.059875f,
- 0.063660f, 0.067810f, 0.072876f, 0.077087f, 0.081726f, 0.086304f, 0.091370f, 0.096863f,
- 0.101746f, 0.107483f, 0.112732f, 0.117920f, 0.124329f, 0.130005f, 0.136108f, 0.142822f,
- 0.149170f, 0.155396f, 0.162598f, 0.169434f, 0.176636f, 0.183838f, 0.191772f, 0.198975f,
- 0.206665f, 0.214478f, 0.222290f, 0.230835f, 0.239258f, 0.247803f, 0.256836f, 0.264893f,
- 0.274414f, 0.283203f, 0.292725f, 0.301758f, 0.311035f, 0.321289f, 0.332275f, 0.340820f,
- 0.351562f, 0.363037f, 0.637695f, 0.652832f, 0.651367f, 0.647949f, 0.644531f, 0.641602f,
- 0.002052f, 0.005253f, 0.009117f, 0.012482f, 0.016113f, 0.019302f, 0.022842f, 0.026230f,
- 0.029831f, 0.033447f, 0.036682f, 0.040588f, 0.044189f, 0.047333f, 0.051178f, 0.055267f,
- 0.058807f, 0.062683f, 0.067200f, 0.070984f, 0.075195f, 0.079895f, 0.084534f, 0.088806f,
- 0.093933f, 0.098999f, 0.104309f, 0.109619f, 0.114807f, 0.120422f, 0.126587f, 0.132080f,
- 0.138550f, 0.144775f, 0.151245f, 0.157837f, 0.164551f, 0.171387f, 0.178467f, 0.186157f,
- 0.193359f, 0.201294f, 0.208740f, 0.216797f, 0.224854f, 0.233398f, 0.241211f, 0.250000f,
- 0.258545f, 0.267822f, 0.276855f, 0.286133f, 0.295410f, 0.304932f, 0.314697f, 0.324463f,
- 0.334229f, 0.344238f, 0.626953f, 0.642578f, 0.643066f, 0.641113f, 0.637695f, 0.634277f,
- 0.001711f, 0.005424f, 0.008347f, 0.012024f, 0.014977f, 0.018066f, 0.021500f, 0.024399f,
- 0.027756f, 0.030869f, 0.034058f, 0.037048f, 0.040558f, 0.044006f, 0.046906f, 0.050690f,
- 0.054169f, 0.057983f, 0.061584f, 0.065247f, 0.069336f, 0.073425f, 0.077576f, 0.082092f,
- 0.086670f, 0.091064f, 0.095886f, 0.101196f, 0.105957f, 0.111267f, 0.116943f, 0.122559f,
- 0.128174f, 0.133789f, 0.140259f, 0.146118f, 0.153076f, 0.159424f, 0.166016f, 0.173462f,
- 0.180542f, 0.187744f, 0.195435f, 0.203003f, 0.209961f, 0.218994f, 0.226562f, 0.234619f,
- 0.243286f, 0.251709f, 0.260742f, 0.269531f, 0.277832f, 0.287354f, 0.297363f, 0.306885f,
- 0.316406f, 0.326660f, 0.615234f, 0.633789f, 0.634277f, 0.632812f, 0.630371f, 0.626953f,
- 0.001721f, 0.004829f, 0.008034f, 0.010857f, 0.013893f, 0.016953f, 0.019806f, 0.022705f,
- 0.025589f, 0.028793f, 0.031616f, 0.034180f, 0.036926f, 0.039978f, 0.043213f, 0.046356f,
- 0.049744f, 0.052887f, 0.056305f, 0.059906f, 0.063416f, 0.067322f, 0.070862f, 0.075134f,
- 0.079285f, 0.083435f, 0.088074f, 0.092712f, 0.097534f, 0.102173f, 0.107544f, 0.112305f,
- 0.118225f, 0.123657f, 0.129272f, 0.135376f, 0.141602f, 0.147705f, 0.153931f, 0.160889f,
- 0.167847f, 0.174683f, 0.181885f, 0.189209f, 0.196533f, 0.204224f, 0.212524f, 0.219727f,
- 0.228271f, 0.236572f, 0.245483f, 0.253418f, 0.261719f, 0.270996f, 0.280029f, 0.289307f,
- 0.300537f, 0.309326f, 0.604004f, 0.625000f, 0.626953f, 0.625000f, 0.622559f, 0.620117f,
- 0.001624f, 0.004730f, 0.007412f, 0.010300f, 0.013199f, 0.015717f, 0.018448f, 0.020935f,
- 0.023163f, 0.026138f, 0.028687f, 0.031204f, 0.033875f, 0.036743f, 0.039825f, 0.042389f,
- 0.045166f, 0.048523f, 0.051422f, 0.054535f, 0.057953f, 0.061249f, 0.064880f, 0.068542f,
- 0.072388f, 0.076355f, 0.080505f, 0.084534f, 0.089294f, 0.093750f, 0.098389f, 0.103210f,
- 0.108337f, 0.113647f, 0.118896f, 0.124817f, 0.130737f, 0.135986f, 0.142212f, 0.148560f,
- 0.155151f, 0.162109f, 0.168579f, 0.175415f, 0.183105f, 0.190552f, 0.197998f, 0.205322f,
- 0.213623f, 0.221436f, 0.229370f, 0.237915f, 0.246216f, 0.254883f, 0.264160f, 0.273438f,
- 0.282471f, 0.292236f, 0.593262f, 0.615723f, 0.618164f, 0.617188f, 0.615234f, 0.612793f,
- 0.001355f, 0.004463f, 0.007061f, 0.009506f, 0.011612f, 0.014381f, 0.016830f, 0.019394f,
- 0.021576f, 0.023697f, 0.026428f, 0.028778f, 0.030975f, 0.033386f, 0.035950f, 0.038513f,
- 0.041260f, 0.044067f, 0.046967f, 0.049622f, 0.052612f, 0.055847f, 0.059052f, 0.062164f,
- 0.065918f, 0.069397f, 0.073242f, 0.077271f, 0.081055f, 0.085327f, 0.089661f, 0.094177f,
- 0.098877f, 0.103455f, 0.108582f, 0.113647f, 0.119812f, 0.125000f, 0.130981f, 0.137085f,
- 0.142944f, 0.149414f, 0.156006f, 0.162354f, 0.169434f, 0.176514f, 0.183716f, 0.191284f,
- 0.198975f, 0.206421f, 0.214844f, 0.222412f, 0.231323f, 0.238647f, 0.247437f, 0.256592f,
- 0.265625f, 0.276367f, 0.581055f, 0.606445f, 0.609863f, 0.608887f, 0.607910f, 0.606445f,
- 0.001413f, 0.004128f, 0.006180f, 0.008781f, 0.010994f, 0.013496f, 0.015427f, 0.017654f,
- 0.019684f, 0.021881f, 0.024139f, 0.025879f, 0.028137f, 0.030334f, 0.032471f, 0.034821f,
- 0.037354f, 0.039642f, 0.042236f, 0.044708f, 0.047394f, 0.050079f, 0.053223f, 0.056244f,
- 0.059479f, 0.062622f, 0.066223f, 0.069946f, 0.073608f, 0.077209f, 0.081604f, 0.085632f,
- 0.089722f, 0.094360f, 0.098999f, 0.103943f, 0.108826f, 0.114319f, 0.119568f, 0.125122f,
- 0.131104f, 0.137085f, 0.143433f, 0.150024f, 0.156494f, 0.163330f, 0.170044f, 0.177490f,
- 0.184326f, 0.191895f, 0.199707f, 0.207764f, 0.215698f, 0.223755f, 0.231812f, 0.240845f,
- 0.249756f, 0.258789f, 0.568848f, 0.598145f, 0.601562f, 0.600586f, 0.600586f, 0.599121f,
- 0.001182f, 0.003773f, 0.005970f, 0.008293f, 0.010277f, 0.012512f, 0.014030f, 0.016129f,
- 0.017929f, 0.019791f, 0.021683f, 0.023590f, 0.025452f, 0.027328f, 0.029404f, 0.031677f,
- 0.033539f, 0.035583f, 0.037903f, 0.040314f, 0.042877f, 0.045319f, 0.048126f, 0.050690f,
- 0.053436f, 0.056519f, 0.059723f, 0.062744f, 0.066284f, 0.069702f, 0.073608f, 0.077209f,
- 0.081055f, 0.085754f, 0.089783f, 0.094421f, 0.099060f, 0.103821f, 0.109192f, 0.114563f,
- 0.119934f, 0.125488f, 0.131104f, 0.137695f, 0.144043f, 0.149780f, 0.156738f, 0.163940f,
- 0.170654f, 0.177856f, 0.185181f, 0.192871f, 0.200439f, 0.208740f, 0.216675f, 0.225342f,
- 0.233521f, 0.242554f, 0.557617f, 0.587891f, 0.592285f, 0.592773f, 0.592285f, 0.592285f,
- 0.001198f, 0.003677f, 0.005547f, 0.007561f, 0.009468f, 0.011253f, 0.012833f, 0.014465f,
- 0.016205f, 0.017792f, 0.019394f, 0.021240f, 0.022751f, 0.024475f, 0.026260f, 0.028015f,
- 0.030136f, 0.031708f, 0.034088f, 0.036102f, 0.038361f, 0.040497f, 0.042816f, 0.045288f,
- 0.047882f, 0.050476f, 0.053284f, 0.056183f, 0.059174f, 0.062500f, 0.065796f, 0.069153f,
- 0.072998f, 0.076904f, 0.080994f, 0.085083f, 0.089478f, 0.094116f, 0.098633f, 0.103394f,
- 0.108704f, 0.113953f, 0.119934f, 0.125366f, 0.131348f, 0.137329f, 0.143555f, 0.150391f,
- 0.157227f, 0.163818f, 0.170776f, 0.178467f, 0.185791f, 0.193359f, 0.201538f, 0.209717f,
- 0.218018f, 0.226807f, 0.544922f, 0.578613f, 0.583984f, 0.584961f, 0.585449f, 0.584473f,
- 0.001067f, 0.003101f, 0.004974f, 0.006855f, 0.008522f, 0.009949f, 0.011635f, 0.012985f,
- 0.014595f, 0.016052f, 0.017685f, 0.019012f, 0.020264f, 0.021851f, 0.023346f, 0.025146f,
- 0.026688f, 0.028336f, 0.030304f, 0.031860f, 0.034119f, 0.035889f, 0.038025f, 0.040283f,
- 0.042450f, 0.044952f, 0.047302f, 0.050049f, 0.052765f, 0.055908f, 0.058594f, 0.061859f,
- 0.064880f, 0.068481f, 0.072327f, 0.076172f, 0.080200f, 0.084290f, 0.088684f, 0.093262f,
- 0.098145f, 0.102905f, 0.108337f, 0.113708f, 0.119080f, 0.125000f, 0.131348f, 0.137329f,
- 0.143921f, 0.150391f, 0.157593f, 0.164551f, 0.171753f, 0.179077f, 0.186768f, 0.194702f,
- 0.203003f, 0.210815f, 0.534180f, 0.569336f, 0.575684f, 0.577637f, 0.577637f, 0.577148f,
- 0.001196f, 0.003178f, 0.004601f, 0.006241f, 0.007782f, 0.009262f, 0.010391f, 0.011795f,
- 0.012955f, 0.014198f, 0.015518f, 0.016785f, 0.018097f, 0.019409f, 0.020782f, 0.022247f,
- 0.023544f, 0.025269f, 0.026749f, 0.028152f, 0.030045f, 0.031555f, 0.033630f, 0.035645f,
- 0.037567f, 0.039642f, 0.041992f, 0.044281f, 0.046692f, 0.049042f, 0.052094f, 0.054779f,
- 0.057831f, 0.060760f, 0.064209f, 0.067627f, 0.071228f, 0.075256f, 0.079224f, 0.083557f,
- 0.087891f, 0.092468f, 0.097168f, 0.102356f, 0.107605f, 0.113098f, 0.119019f, 0.124878f,
- 0.130859f, 0.137451f, 0.144287f, 0.150635f, 0.157471f, 0.164917f, 0.171997f, 0.179932f,
- 0.187378f, 0.196899f, 0.521973f, 0.560547f, 0.566895f, 0.569824f, 0.570312f, 0.568848f,
- 0.001242f, 0.002674f, 0.004421f, 0.005573f, 0.006882f, 0.008354f, 0.009491f, 0.010559f,
- 0.011406f, 0.012695f, 0.013893f, 0.014908f, 0.015854f, 0.017044f, 0.018234f, 0.019501f,
- 0.020752f, 0.022003f, 0.023254f, 0.024689f, 0.026154f, 0.027802f, 0.029434f, 0.031113f,
- 0.032898f, 0.034668f, 0.036774f, 0.038910f, 0.040802f, 0.043030f, 0.045593f, 0.048065f,
- 0.050873f, 0.053680f, 0.056458f, 0.059692f, 0.062866f, 0.066467f, 0.069946f, 0.074036f,
- 0.077942f, 0.082275f, 0.086731f, 0.091614f, 0.096313f, 0.101562f, 0.106934f, 0.112671f,
- 0.118591f, 0.124634f, 0.130859f, 0.137207f, 0.144043f, 0.151123f, 0.157593f, 0.165283f,
- 0.173218f, 0.180664f, 0.510254f, 0.550781f, 0.558105f, 0.561035f, 0.562012f, 0.562012f,
- 0.000842f, 0.002552f, 0.003769f, 0.005333f, 0.006149f, 0.007298f, 0.008362f, 0.009224f,
- 0.010254f, 0.011230f, 0.012108f, 0.013092f, 0.014000f, 0.014992f, 0.016006f, 0.016953f,
- 0.017990f, 0.019196f, 0.020142f, 0.021622f, 0.022827f, 0.024216f, 0.025513f, 0.026993f,
- 0.028564f, 0.030212f, 0.032013f, 0.033813f, 0.035706f, 0.037598f, 0.039703f, 0.041840f,
- 0.044159f, 0.046539f, 0.049347f, 0.052155f, 0.055084f, 0.058228f, 0.061554f, 0.065002f,
- 0.068909f, 0.072693f, 0.076599f, 0.081238f, 0.085388f, 0.090515f, 0.095764f, 0.100891f,
- 0.106689f, 0.112366f, 0.118103f, 0.124634f, 0.130859f, 0.137573f, 0.144287f, 0.151855f,
- 0.158447f, 0.166260f, 0.498535f, 0.541992f, 0.549805f, 0.553711f, 0.554199f, 0.554688f,
- 0.000874f, 0.002186f, 0.003445f, 0.004807f, 0.005562f, 0.006607f, 0.007378f, 0.008102f,
- 0.008919f, 0.009666f, 0.010513f, 0.011131f, 0.012039f, 0.012848f, 0.013779f, 0.014671f,
- 0.015465f, 0.016464f, 0.017517f, 0.018585f, 0.019730f, 0.020798f, 0.022018f, 0.023300f,
- 0.024612f, 0.026093f, 0.027374f, 0.029022f, 0.030624f, 0.032440f, 0.034180f, 0.036285f,
- 0.038116f, 0.040344f, 0.042725f, 0.045349f, 0.047913f, 0.050476f, 0.053406f, 0.056488f,
- 0.059998f, 0.063354f, 0.067383f, 0.071289f, 0.075562f, 0.079834f, 0.084656f, 0.089478f,
- 0.094849f, 0.100342f, 0.106140f, 0.111877f, 0.118042f, 0.124573f, 0.130981f, 0.137451f,
- 0.144653f, 0.152588f, 0.486816f, 0.531738f, 0.541016f, 0.545410f, 0.547363f, 0.546875f,
- 0.000667f, 0.002001f, 0.003244f, 0.003895f, 0.004936f, 0.005608f, 0.006477f, 0.006901f,
- 0.007648f, 0.008354f, 0.009132f, 0.009766f, 0.010490f, 0.011177f, 0.011780f, 0.012543f,
- 0.013420f, 0.014084f, 0.015045f, 0.015961f, 0.016876f, 0.017822f, 0.018768f, 0.019958f,
- 0.021255f, 0.022232f, 0.023560f, 0.024780f, 0.026108f, 0.027634f, 0.029221f, 0.030762f,
- 0.032684f, 0.034576f, 0.036621f, 0.038605f, 0.040985f, 0.043488f, 0.046021f, 0.049042f,
- 0.051727f, 0.054901f, 0.058441f, 0.061981f, 0.065552f, 0.069885f, 0.074097f, 0.078857f,
- 0.083923f, 0.088623f, 0.094360f, 0.099854f, 0.105957f, 0.111694f, 0.118164f, 0.124817f,
- 0.131836f, 0.138794f, 0.474365f, 0.522949f, 0.532227f, 0.536621f, 0.538574f, 0.539062f,
- 0.000876f, 0.002020f, 0.002857f, 0.003855f, 0.004436f, 0.005009f, 0.005482f, 0.006130f,
- 0.006588f, 0.007084f, 0.007656f, 0.008286f, 0.008949f, 0.009506f, 0.010025f, 0.010803f,
- 0.011444f, 0.012047f, 0.012802f, 0.013512f, 0.014305f, 0.015282f, 0.016052f, 0.016846f,
- 0.017914f, 0.018829f, 0.019882f, 0.021027f, 0.022232f, 0.023453f, 0.024689f, 0.026169f,
- 0.027573f, 0.029327f, 0.031036f, 0.032806f, 0.034882f, 0.036743f, 0.039032f, 0.041626f,
- 0.044312f, 0.046936f, 0.050018f, 0.053253f, 0.056610f, 0.060272f, 0.064392f, 0.068542f,
- 0.072937f, 0.078003f, 0.082886f, 0.088318f, 0.093933f, 0.099670f, 0.106140f, 0.112000f,
- 0.118713f, 0.125732f, 0.463135f, 0.513672f, 0.524414f, 0.528809f, 0.530762f, 0.532227f,
- 0.000573f, 0.001698f, 0.002670f, 0.003082f, 0.003735f, 0.004318f, 0.004673f, 0.005161f,
- 0.005779f, 0.006203f, 0.006565f, 0.007015f, 0.007591f, 0.007965f, 0.008583f, 0.009094f,
- 0.009491f, 0.010239f, 0.010780f, 0.011353f, 0.012047f, 0.012787f, 0.013504f, 0.014206f,
- 0.015060f, 0.015915f, 0.016708f, 0.017685f, 0.018677f, 0.019653f, 0.020828f, 0.021866f,
- 0.023224f, 0.024445f, 0.025818f, 0.027557f, 0.029114f, 0.030991f, 0.032928f, 0.035034f,
- 0.037201f, 0.039581f, 0.042328f, 0.045166f, 0.048157f, 0.051392f, 0.054962f, 0.058685f,
- 0.062988f, 0.067444f, 0.072021f, 0.077148f, 0.082520f, 0.088196f, 0.093750f, 0.100403f,
- 0.106201f, 0.112976f, 0.450928f, 0.503906f, 0.515137f, 0.520020f, 0.522949f, 0.524414f,
- 0.000643f, 0.001637f, 0.002197f, 0.002800f, 0.003376f, 0.003613f, 0.003914f, 0.004391f,
- 0.004742f, 0.005150f, 0.005466f, 0.005924f, 0.006344f, 0.006645f, 0.007046f, 0.007591f,
- 0.008118f, 0.008560f, 0.008934f, 0.009529f, 0.010147f, 0.010651f, 0.011276f, 0.011787f,
- 0.012543f, 0.013229f, 0.013916f, 0.014740f, 0.015564f, 0.016388f, 0.017258f, 0.018188f,
- 0.019257f, 0.020355f, 0.021729f, 0.022766f, 0.024277f, 0.025696f, 0.027237f, 0.029022f,
- 0.030945f, 0.033020f, 0.035248f, 0.037689f, 0.040405f, 0.043182f, 0.046295f, 0.049866f,
- 0.053528f, 0.057526f, 0.061920f, 0.066284f, 0.071716f, 0.077209f, 0.082703f, 0.088196f,
- 0.094177f, 0.101074f, 0.438965f, 0.494629f, 0.507324f, 0.512207f, 0.515137f, 0.516113f,
- 0.000484f, 0.001272f, 0.001968f, 0.002327f, 0.002573f, 0.003054f, 0.003338f, 0.003660f,
- 0.003906f, 0.004303f, 0.004658f, 0.004921f, 0.005222f, 0.005547f, 0.005878f, 0.006290f,
- 0.006542f, 0.007015f, 0.007442f, 0.007851f, 0.008339f, 0.008713f, 0.009247f, 0.009811f,
- 0.010345f, 0.010849f, 0.011490f, 0.012123f, 0.012733f, 0.013428f, 0.014183f, 0.014961f,
- 0.015839f, 0.016815f, 0.017731f, 0.018768f, 0.019821f, 0.021072f, 0.022385f, 0.023727f,
- 0.025345f, 0.027084f, 0.028946f, 0.030914f, 0.033295f, 0.035614f, 0.038513f, 0.041473f,
- 0.044678f, 0.048462f, 0.052338f, 0.056671f, 0.061310f, 0.066101f, 0.071533f, 0.077148f,
- 0.083069f, 0.089172f, 0.427246f, 0.485352f, 0.498535f, 0.503906f, 0.508301f, 0.509766f,
- 0.000416f, 0.001121f, 0.001410f, 0.001959f, 0.002159f, 0.002558f, 0.002724f, 0.002939f,
- 0.003220f, 0.003447f, 0.003733f, 0.003944f, 0.004219f, 0.004578f, 0.004810f, 0.005100f,
- 0.005402f, 0.005783f, 0.006077f, 0.006382f, 0.006729f, 0.007141f, 0.007526f, 0.007965f,
- 0.008354f, 0.008858f, 0.009300f, 0.009789f, 0.010452f, 0.010986f, 0.011658f, 0.012131f,
- 0.012833f, 0.013702f, 0.014435f, 0.015266f, 0.016113f, 0.017136f, 0.018143f, 0.019241f,
- 0.020493f, 0.021820f, 0.023346f, 0.025085f, 0.027023f, 0.028976f, 0.031174f, 0.033966f,
- 0.036743f, 0.039856f, 0.043396f, 0.047180f, 0.051605f, 0.056152f, 0.061127f, 0.066284f,
- 0.072021f, 0.078247f, 0.415283f, 0.475586f, 0.490234f, 0.496338f, 0.499756f, 0.501953f,
- 0.000493f, 0.001126f, 0.001391f, 0.001574f, 0.001786f, 0.002073f, 0.002188f, 0.002417f,
- 0.002657f, 0.002785f, 0.002964f, 0.003189f, 0.003384f, 0.003687f, 0.003859f, 0.004124f,
- 0.004330f, 0.004555f, 0.004890f, 0.005119f, 0.005451f, 0.005749f, 0.006054f, 0.006348f,
- 0.006683f, 0.007050f, 0.007458f, 0.007889f, 0.008339f, 0.008751f, 0.009323f, 0.009766f,
- 0.010353f, 0.010887f, 0.011520f, 0.012192f, 0.012932f, 0.013748f, 0.014542f, 0.015434f,
- 0.016434f, 0.017471f, 0.018723f, 0.019989f, 0.021500f, 0.023117f, 0.024948f, 0.027100f,
- 0.029770f, 0.032166f, 0.035248f, 0.038696f, 0.042633f, 0.046875f, 0.051605f, 0.056427f,
- 0.061859f, 0.067688f, 0.403320f, 0.467041f, 0.480957f, 0.487793f, 0.491699f, 0.494385f,
- 0.000336f, 0.000673f, 0.001150f, 0.001274f, 0.001482f, 0.001630f, 0.001748f, 0.001904f,
- 0.002087f, 0.002232f, 0.002306f, 0.002497f, 0.002672f, 0.002872f, 0.003092f, 0.003225f,
- 0.003387f, 0.003553f, 0.003819f, 0.003979f, 0.004230f, 0.004517f, 0.004738f, 0.005016f,
- 0.005322f, 0.005569f, 0.005848f, 0.006184f, 0.006573f, 0.006851f, 0.007271f, 0.007660f,
- 0.008064f, 0.008568f, 0.009048f, 0.009567f, 0.010139f, 0.010788f, 0.011391f, 0.012161f,
- 0.012939f, 0.013763f, 0.014694f, 0.015717f, 0.016815f, 0.018097f, 0.019714f, 0.021149f,
- 0.023270f, 0.025421f, 0.028015f, 0.030991f, 0.034271f, 0.038116f, 0.042328f, 0.046997f,
- 0.052094f, 0.057770f, 0.391113f, 0.457031f, 0.472412f, 0.479736f, 0.484375f, 0.486816f,
- 0.000309f, 0.000612f, 0.000953f, 0.001086f, 0.001191f, 0.001281f, 0.001351f, 0.001442f,
- 0.001610f, 0.001733f, 0.001783f, 0.001991f, 0.002087f, 0.002232f, 0.002337f, 0.002495f,
- 0.002611f, 0.002775f, 0.002935f, 0.003101f, 0.003302f, 0.003496f, 0.003622f, 0.003839f,
- 0.004047f, 0.004265f, 0.004494f, 0.004738f, 0.005039f, 0.005272f, 0.005650f, 0.005898f,
- 0.006210f, 0.006588f, 0.006950f, 0.007332f, 0.007782f, 0.008240f, 0.008766f, 0.009331f,
- 0.009964f, 0.010612f, 0.011314f, 0.012062f, 0.013023f, 0.014038f, 0.015007f, 0.016251f,
- 0.017761f, 0.019501f, 0.021530f, 0.023926f, 0.026718f, 0.030106f, 0.033905f, 0.038361f,
- 0.043060f, 0.048370f, 0.379395f, 0.446777f, 0.464111f, 0.471191f, 0.475586f, 0.479492f,
- 0.000439f, 0.000476f, 0.000672f, 0.000752f, 0.000810f, 0.000949f, 0.001011f, 0.001121f,
- 0.001160f, 0.001249f, 0.001408f, 0.001493f, 0.001591f, 0.001719f, 0.001788f, 0.001845f,
- 0.001982f, 0.002106f, 0.002201f, 0.002357f, 0.002460f, 0.002598f, 0.002724f, 0.002869f,
- 0.003036f, 0.003187f, 0.003397f, 0.003569f, 0.003763f, 0.004017f, 0.004211f, 0.004414f,
- 0.004704f, 0.004890f, 0.005234f, 0.005524f, 0.005825f, 0.006187f, 0.006535f, 0.006977f,
- 0.007423f, 0.007874f, 0.008553f, 0.009079f, 0.009857f, 0.010567f, 0.011360f, 0.012306f,
- 0.013390f, 0.014702f, 0.016220f, 0.017960f, 0.020157f, 0.022995f, 0.026352f, 0.030212f,
- 0.034790f, 0.039459f, 0.368408f, 0.437744f, 0.455322f, 0.463379f, 0.468018f, 0.471436f,
- 0.000202f, 0.000437f, 0.000488f, 0.000579f, 0.000664f, 0.000692f, 0.000792f, 0.000762f,
- 0.000875f, 0.000949f, 0.001038f, 0.001068f, 0.001116f, 0.001196f, 0.001300f, 0.001352f,
- 0.001458f, 0.001529f, 0.001623f, 0.001667f, 0.001770f, 0.001884f, 0.001989f, 0.002071f,
- 0.002203f, 0.002310f, 0.002445f, 0.002556f, 0.002680f, 0.002876f, 0.002991f, 0.003206f,
- 0.003365f, 0.003531f, 0.003759f, 0.003956f, 0.004227f, 0.004513f, 0.004768f, 0.005074f,
- 0.005402f, 0.005756f, 0.006142f, 0.006603f, 0.007160f, 0.007645f, 0.008339f, 0.008987f,
- 0.009819f, 0.010780f, 0.011803f, 0.013153f, 0.014763f, 0.016876f, 0.019623f, 0.022995f,
- 0.026978f, 0.031708f, 0.356445f, 0.428223f, 0.446533f, 0.455078f, 0.460449f, 0.463379f,
- 0.000126f, 0.000241f, 0.000344f, 0.000353f, 0.000437f, 0.000522f, 0.000513f, 0.000552f,
- 0.000613f, 0.000699f, 0.000717f, 0.000727f, 0.000763f, 0.000848f, 0.000877f, 0.000956f,
- 0.000963f, 0.001068f, 0.001128f, 0.001170f, 0.001238f, 0.001311f, 0.001385f, 0.001454f,
- 0.001534f, 0.001603f, 0.001714f, 0.001779f, 0.001885f, 0.002016f, 0.002092f, 0.002214f,
- 0.002331f, 0.002460f, 0.002613f, 0.002777f, 0.002924f, 0.003120f, 0.003298f, 0.003496f,
- 0.003708f, 0.004009f, 0.004292f, 0.004601f, 0.004951f, 0.005341f, 0.005772f, 0.006260f,
- 0.006901f, 0.007572f, 0.008324f, 0.009300f, 0.010445f, 0.011848f, 0.013870f, 0.016678f,
- 0.020218f, 0.024536f, 0.345703f, 0.419189f, 0.437500f, 0.447021f, 0.452393f, 0.455811f,
- 0.000146f, 0.000240f, 0.000268f, 0.000268f, 0.000310f, 0.000311f, 0.000331f, 0.000366f,
- 0.000410f, 0.000447f, 0.000446f, 0.000517f, 0.000511f, 0.000571f, 0.000596f, 0.000618f,
- 0.000674f, 0.000691f, 0.000723f, 0.000762f, 0.000822f, 0.000856f, 0.000912f, 0.000950f,
- 0.001014f, 0.001049f, 0.001128f, 0.001188f, 0.001237f, 0.001303f, 0.001371f, 0.001466f,
- 0.001532f, 0.001623f, 0.001701f, 0.001805f, 0.001945f, 0.002035f, 0.002186f, 0.002329f,
- 0.002460f, 0.002632f, 0.002819f, 0.003012f, 0.003271f, 0.003550f, 0.003819f, 0.004162f,
- 0.004539f, 0.005024f, 0.005585f, 0.006233f, 0.007050f, 0.008072f, 0.009331f, 0.011269f,
- 0.014160f, 0.018112f, 0.333740f, 0.408447f, 0.428711f, 0.438232f, 0.443359f, 0.447510f,
- 0.000053f, 0.000163f, 0.000155f, 0.000160f, 0.000191f, 0.000228f, 0.000206f, 0.000233f,
- 0.000248f, 0.000263f, 0.000267f, 0.000294f, 0.000324f, 0.000335f, 0.000364f, 0.000378f,
- 0.000396f, 0.000435f, 0.000445f, 0.000490f, 0.000502f, 0.000522f, 0.000543f, 0.000582f,
- 0.000619f, 0.000665f, 0.000679f, 0.000705f, 0.000755f, 0.000797f, 0.000856f, 0.000887f,
- 0.000953f, 0.000988f, 0.001043f, 0.001103f, 0.001177f, 0.001256f, 0.001331f, 0.001410f,
- 0.001508f, 0.001612f, 0.001734f, 0.001873f, 0.001999f, 0.002163f, 0.002378f, 0.002565f,
- 0.002827f, 0.003119f, 0.003479f, 0.003899f, 0.004463f, 0.005116f, 0.005951f, 0.007153f,
- 0.009163f, 0.012535f, 0.322510f, 0.400146f, 0.420654f, 0.430176f, 0.436523f, 0.440430f,
- 0.000097f, 0.000107f, 0.000095f, 0.000087f, 0.000107f, 0.000110f, 0.000137f, 0.000139f,
- 0.000140f, 0.000147f, 0.000168f, 0.000175f, 0.000177f, 0.000184f, 0.000210f, 0.000200f,
- 0.000224f, 0.000239f, 0.000246f, 0.000258f, 0.000278f, 0.000288f, 0.000312f, 0.000324f,
- 0.000347f, 0.000368f, 0.000382f, 0.000395f, 0.000418f, 0.000440f, 0.000471f, 0.000495f,
- 0.000521f, 0.000547f, 0.000577f, 0.000620f, 0.000649f, 0.000695f, 0.000749f, 0.000785f,
- 0.000838f, 0.000897f, 0.000972f, 0.001028f, 0.001118f, 0.001204f, 0.001316f, 0.001432f,
- 0.001580f, 0.001748f, 0.001961f, 0.002207f, 0.002533f, 0.002941f, 0.003487f, 0.004223f,
- 0.005371f, 0.007809f, 0.311523f, 0.390381f, 0.411377f, 0.421875f, 0.428467f, 0.432617f,
- 0.000000f, 0.000055f, 0.000046f, 0.000054f, 0.000060f, 0.000058f, 0.000060f, 0.000068f,
- 0.000068f, 0.000082f, 0.000076f, 0.000078f, 0.000092f, 0.000087f, 0.000091f, 0.000097f,
- 0.000105f, 0.000115f, 0.000118f, 0.000124f, 0.000128f, 0.000133f, 0.000139f, 0.000154f,
- 0.000160f, 0.000172f, 0.000175f, 0.000191f, 0.000201f, 0.000211f, 0.000221f, 0.000238f,
- 0.000242f, 0.000257f, 0.000277f, 0.000295f, 0.000309f, 0.000326f, 0.000351f, 0.000375f,
- 0.000400f, 0.000428f, 0.000459f, 0.000490f, 0.000535f, 0.000579f, 0.000626f, 0.000683f,
- 0.000754f, 0.000836f, 0.000952f, 0.001064f, 0.001237f, 0.001460f, 0.001751f, 0.002157f,
- 0.002800f, 0.004189f, 0.299561f, 0.380127f, 0.403076f, 0.413574f, 0.419922f, 0.424072f,
- 0.000059f, 0.000039f, 0.000032f, 0.000028f, 0.000025f, 0.000025f, 0.000025f, 0.000024f,
- 0.000023f, 0.000024f, 0.000026f, 0.000034f, 0.000029f, 0.000031f, 0.000038f, 0.000040f,
- 0.000042f, 0.000043f, 0.000042f, 0.000043f, 0.000048f, 0.000054f, 0.000058f, 0.000056f,
- 0.000060f, 0.000062f, 0.000066f, 0.000069f, 0.000072f, 0.000078f, 0.000082f, 0.000085f,
- 0.000093f, 0.000096f, 0.000099f, 0.000106f, 0.000116f, 0.000123f, 0.000132f, 0.000140f,
- 0.000150f, 0.000154f, 0.000167f, 0.000184f, 0.000192f, 0.000212f, 0.000231f, 0.000251f,
- 0.000282f, 0.000314f, 0.000350f, 0.000401f, 0.000463f, 0.000554f, 0.000679f, 0.000861f,
- 0.001157f, 0.001750f, 0.289307f, 0.371582f, 0.394043f, 0.406006f, 0.412109f, 0.417236f,
- 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000011f,
- 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000009f,
- 0.000009f, 0.000007f, 0.000008f, 0.000008f, 0.000010f, 0.000011f, 0.000012f, 0.000013f,
- 0.000013f, 0.000013f, 0.000014f, 0.000017f, 0.000017f, 0.000016f, 0.000018f, 0.000019f,
- 0.000021f, 0.000021f, 0.000022f, 0.000025f, 0.000027f, 0.000025f, 0.000028f, 0.000030f,
- 0.000033f, 0.000036f, 0.000038f, 0.000040f, 0.000042f, 0.000047f, 0.000052f, 0.000057f,
- 0.000060f, 0.000068f, 0.000073f, 0.000089f, 0.000104f, 0.000124f, 0.000153f, 0.000204f,
- 0.000293f, 0.000497f, 0.278076f, 0.362793f, 0.385498f, 0.397705f, 0.405029f, 0.409912f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, 0.000005f, 0.000008f,
- 0.000012f, 0.000026f, 0.267822f, 0.353027f, 0.376953f, 0.388916f, 0.395996f, 0.401367f,
- },
- {
- 0.006824f, 0.021286f, 0.036285f, 0.051208f, 0.066467f, 0.082825f, 0.098694f, 0.114563f,
- 0.130737f, 0.146973f, 0.162720f, 0.179932f, 0.196411f, 0.212646f, 0.229370f, 0.246338f,
- 0.263184f, 0.279785f, 0.297363f, 0.314209f, 0.331055f, 0.348389f, 0.365479f, 0.383301f,
- 0.400146f, 0.417725f, 0.435303f, 0.451904f, 0.469971f, 0.486816f, 0.503906f, 0.521484f,
- 0.539551f, 0.556641f, 0.573730f, 0.592285f, 0.609375f, 0.627441f, 0.644531f, 0.662598f,
- 0.679688f, 0.696777f, 0.714355f, 0.731934f, 0.749512f, 0.768066f, 0.784180f, 0.802246f,
- 0.820312f, 0.837891f, 0.854980f, 0.871582f, 0.889648f, 0.906738f, 0.924805f, 0.941406f,
- 0.959473f, 0.976074f, 0.953125f, 0.895020f, 0.857422f, 0.827637f, 0.803223f, 0.781738f,
- 0.006741f, 0.020706f, 0.035187f, 0.049866f, 0.065125f, 0.079895f, 0.095581f, 0.111206f,
- 0.126953f, 0.142822f, 0.158569f, 0.174561f, 0.190796f, 0.207031f, 0.223511f, 0.239380f,
- 0.256104f, 0.272705f, 0.289307f, 0.305664f, 0.322754f, 0.338867f, 0.356201f, 0.372314f,
- 0.389404f, 0.406494f, 0.423828f, 0.440430f, 0.457520f, 0.474854f, 0.491211f, 0.508789f,
- 0.525391f, 0.541992f, 0.559082f, 0.576660f, 0.594238f, 0.610840f, 0.627930f, 0.645508f,
- 0.662598f, 0.679199f, 0.696289f, 0.713379f, 0.731445f, 0.747559f, 0.765137f, 0.782715f,
- 0.799805f, 0.816895f, 0.834473f, 0.851074f, 0.868164f, 0.884766f, 0.902344f, 0.919434f,
- 0.936523f, 0.953613f, 0.942871f, 0.887695f, 0.851562f, 0.823730f, 0.799805f, 0.779297f,
- 0.006504f, 0.020004f, 0.033875f, 0.048676f, 0.063110f, 0.077759f, 0.092712f, 0.108032f,
- 0.123230f, 0.138672f, 0.153931f, 0.170044f, 0.185791f, 0.200806f, 0.217041f, 0.233276f,
- 0.248901f, 0.265137f, 0.280762f, 0.297363f, 0.313721f, 0.329834f, 0.346680f, 0.363037f,
- 0.378418f, 0.395752f, 0.411621f, 0.428467f, 0.445312f, 0.461670f, 0.479004f, 0.494873f,
- 0.511230f, 0.527832f, 0.544434f, 0.561523f, 0.578613f, 0.594727f, 0.611328f, 0.628906f,
- 0.645508f, 0.662109f, 0.679199f, 0.695312f, 0.712402f, 0.729004f, 0.746094f, 0.762695f,
- 0.779297f, 0.796387f, 0.812500f, 0.829590f, 0.846191f, 0.863281f, 0.879395f, 0.896973f,
- 0.914062f, 0.930176f, 0.932129f, 0.879395f, 0.845703f, 0.818848f, 0.795898f, 0.776367f,
- 0.006226f, 0.019318f, 0.032959f, 0.046631f, 0.060699f, 0.075745f, 0.089966f, 0.104553f,
- 0.119385f, 0.134277f, 0.149292f, 0.164917f, 0.179932f, 0.195190f, 0.210693f, 0.226562f,
- 0.242188f, 0.257568f, 0.273438f, 0.289062f, 0.304932f, 0.320557f, 0.336426f, 0.352539f,
- 0.368652f, 0.384766f, 0.400391f, 0.417236f, 0.433105f, 0.448730f, 0.465088f, 0.481689f,
- 0.497559f, 0.513672f, 0.528809f, 0.546875f, 0.562500f, 0.578613f, 0.595215f, 0.612793f,
- 0.627930f, 0.645508f, 0.661621f, 0.677246f, 0.693848f, 0.709961f, 0.726562f, 0.743164f,
- 0.759766f, 0.774902f, 0.791992f, 0.808594f, 0.825195f, 0.841309f, 0.856934f, 0.874023f,
- 0.890625f, 0.907715f, 0.921387f, 0.872070f, 0.839355f, 0.813477f, 0.791504f, 0.772461f,
- 0.005928f, 0.018997f, 0.031830f, 0.045380f, 0.059235f, 0.072754f, 0.087463f, 0.101562f,
- 0.115723f, 0.130371f, 0.145264f, 0.159668f, 0.175049f, 0.189453f, 0.204468f, 0.219482f,
- 0.234497f, 0.250000f, 0.266113f, 0.280273f, 0.295410f, 0.311768f, 0.327393f, 0.343018f,
- 0.357422f, 0.373779f, 0.389404f, 0.404785f, 0.421143f, 0.437012f, 0.452881f, 0.468262f,
- 0.484375f, 0.499512f, 0.515137f, 0.531738f, 0.546875f, 0.562500f, 0.579102f, 0.595215f,
- 0.610840f, 0.627441f, 0.643555f, 0.659180f, 0.674805f, 0.691406f, 0.708008f, 0.723145f,
- 0.738770f, 0.755371f, 0.771484f, 0.787598f, 0.803711f, 0.819824f, 0.835449f, 0.851562f,
- 0.867676f, 0.884277f, 0.910156f, 0.864258f, 0.832520f, 0.808105f, 0.787109f, 0.769043f,
- 0.005939f, 0.018066f, 0.030991f, 0.043488f, 0.057312f, 0.070557f, 0.084473f, 0.098328f,
- 0.112610f, 0.126587f, 0.140259f, 0.154907f, 0.169678f, 0.184326f, 0.198608f, 0.213379f,
- 0.227783f, 0.242065f, 0.257568f, 0.272705f, 0.287109f, 0.302246f, 0.318115f, 0.333252f,
- 0.347656f, 0.362549f, 0.378418f, 0.393555f, 0.408936f, 0.423828f, 0.439697f, 0.455078f,
- 0.471191f, 0.484863f, 0.500488f, 0.517578f, 0.532227f, 0.547363f, 0.562500f, 0.579102f,
- 0.594727f, 0.610352f, 0.625488f, 0.641602f, 0.657227f, 0.671875f, 0.687500f, 0.704102f,
- 0.719238f, 0.733887f, 0.750488f, 0.767090f, 0.782715f, 0.798340f, 0.813965f, 0.830566f,
- 0.845215f, 0.862305f, 0.899902f, 0.855469f, 0.825684f, 0.801758f, 0.782227f, 0.764648f,
- 0.005684f, 0.017639f, 0.030334f, 0.042572f, 0.055298f, 0.068054f, 0.081787f, 0.095276f,
- 0.108765f, 0.122192f, 0.136353f, 0.150513f, 0.164307f, 0.178467f, 0.192627f, 0.206665f,
- 0.221436f, 0.234985f, 0.249634f, 0.264404f, 0.278564f, 0.293213f, 0.308350f, 0.321533f,
- 0.337646f, 0.353027f, 0.367432f, 0.381592f, 0.395996f, 0.411865f, 0.426758f, 0.441895f,
- 0.456543f, 0.471680f, 0.485840f, 0.501465f, 0.517090f, 0.531738f, 0.546387f, 0.562012f,
- 0.576660f, 0.592773f, 0.608398f, 0.623047f, 0.638672f, 0.654297f, 0.668457f, 0.684082f,
- 0.699707f, 0.714844f, 0.730469f, 0.745605f, 0.761230f, 0.777832f, 0.791504f, 0.807617f,
- 0.823242f, 0.839355f, 0.889160f, 0.847656f, 0.818848f, 0.796387f, 0.776855f, 0.760254f,
- 0.005417f, 0.017136f, 0.028778f, 0.041016f, 0.054047f, 0.066528f, 0.079590f, 0.092102f,
- 0.105225f, 0.118652f, 0.131714f, 0.145630f, 0.158813f, 0.172607f, 0.186523f, 0.200317f,
- 0.213745f, 0.227905f, 0.242188f, 0.256104f, 0.270020f, 0.283936f, 0.299072f, 0.312744f,
- 0.327148f, 0.341797f, 0.355957f, 0.369629f, 0.384766f, 0.399414f, 0.413574f, 0.427490f,
- 0.443115f, 0.457764f, 0.472656f, 0.487061f, 0.501465f, 0.516602f, 0.530762f, 0.545898f,
- 0.560547f, 0.574707f, 0.589844f, 0.605469f, 0.619629f, 0.633301f, 0.648926f, 0.665527f,
- 0.679688f, 0.694824f, 0.709961f, 0.725586f, 0.739746f, 0.755371f, 0.770020f, 0.786133f,
- 0.802246f, 0.817383f, 0.877930f, 0.838867f, 0.812012f, 0.790039f, 0.771973f, 0.755371f,
- 0.005520f, 0.016464f, 0.027695f, 0.039948f, 0.051575f, 0.063965f, 0.076660f, 0.089111f,
- 0.101807f, 0.114319f, 0.126953f, 0.140381f, 0.153564f, 0.166992f, 0.180298f, 0.193970f,
- 0.207153f, 0.220337f, 0.234131f, 0.248169f, 0.261475f, 0.275146f, 0.288818f, 0.302734f,
- 0.316162f, 0.330566f, 0.345459f, 0.358887f, 0.372803f, 0.386719f, 0.401367f, 0.415527f,
- 0.429199f, 0.443848f, 0.458008f, 0.472412f, 0.486572f, 0.500977f, 0.515137f, 0.529785f,
- 0.544434f, 0.558105f, 0.572754f, 0.587891f, 0.601074f, 0.617188f, 0.631836f, 0.645020f,
- 0.660645f, 0.674805f, 0.689453f, 0.704590f, 0.719727f, 0.734375f, 0.750000f, 0.764160f,
- 0.780273f, 0.794922f, 0.866699f, 0.830566f, 0.804688f, 0.784180f, 0.766113f, 0.750977f,
- 0.005222f, 0.016022f, 0.026962f, 0.038086f, 0.050049f, 0.061798f, 0.074158f, 0.085876f,
- 0.098145f, 0.110718f, 0.122986f, 0.135864f, 0.148438f, 0.161133f, 0.173584f, 0.187378f,
- 0.199707f, 0.213501f, 0.226440f, 0.240112f, 0.252441f, 0.266113f, 0.279785f, 0.292725f,
- 0.306152f, 0.320068f, 0.333984f, 0.347900f, 0.361572f, 0.374512f, 0.387695f, 0.402344f,
- 0.416504f, 0.429688f, 0.443604f, 0.458008f, 0.471680f, 0.485596f, 0.499023f, 0.513184f,
- 0.527832f, 0.541016f, 0.555664f, 0.569336f, 0.583984f, 0.598633f, 0.612793f, 0.626465f,
- 0.641602f, 0.656250f, 0.669922f, 0.684570f, 0.698730f, 0.713867f, 0.728516f, 0.742188f,
- 0.757812f, 0.771484f, 0.855957f, 0.822266f, 0.797852f, 0.777832f, 0.760742f, 0.746094f,
- 0.004944f, 0.015327f, 0.026230f, 0.037201f, 0.048187f, 0.059448f, 0.071167f, 0.082642f,
- 0.094727f, 0.106506f, 0.119019f, 0.130371f, 0.143555f, 0.155640f, 0.167725f, 0.180908f,
- 0.193604f, 0.206177f, 0.218506f, 0.231812f, 0.244873f, 0.257568f, 0.270996f, 0.283203f,
- 0.296387f, 0.309814f, 0.322754f, 0.336670f, 0.348877f, 0.362061f, 0.376465f, 0.389893f,
- 0.402588f, 0.415283f, 0.429443f, 0.443115f, 0.457031f, 0.470459f, 0.483887f, 0.497314f,
- 0.511230f, 0.524414f, 0.538574f, 0.551758f, 0.565918f, 0.579590f, 0.593750f, 0.606934f,
- 0.621094f, 0.635254f, 0.649902f, 0.664062f, 0.678223f, 0.692871f, 0.707031f, 0.721191f,
- 0.735840f, 0.750488f, 0.846191f, 0.813477f, 0.790527f, 0.770996f, 0.754883f, 0.740723f,
- 0.004951f, 0.014656f, 0.025253f, 0.035309f, 0.046417f, 0.057465f, 0.068665f, 0.079773f,
- 0.091370f, 0.102844f, 0.114441f, 0.126099f, 0.138062f, 0.150391f, 0.161987f, 0.174561f,
- 0.186523f, 0.198730f, 0.211060f, 0.223267f, 0.235352f, 0.248779f, 0.260986f, 0.274414f,
- 0.286621f, 0.298584f, 0.312256f, 0.324463f, 0.337158f, 0.350342f, 0.363281f, 0.376953f,
- 0.389404f, 0.402344f, 0.415283f, 0.428955f, 0.441162f, 0.455322f, 0.467285f, 0.481201f,
- 0.493896f, 0.507324f, 0.520996f, 0.534668f, 0.547852f, 0.561035f, 0.575195f, 0.588867f,
- 0.603027f, 0.616211f, 0.630371f, 0.643555f, 0.658203f, 0.671875f, 0.686035f, 0.699707f,
- 0.714844f, 0.729492f, 0.833984f, 0.804688f, 0.782227f, 0.764160f, 0.749512f, 0.735352f,
- 0.004700f, 0.014343f, 0.024200f, 0.034515f, 0.044586f, 0.055176f, 0.066162f, 0.077209f,
- 0.087830f, 0.098816f, 0.110413f, 0.121826f, 0.132690f, 0.144897f, 0.156372f, 0.168213f,
- 0.179443f, 0.191650f, 0.203369f, 0.215088f, 0.227661f, 0.239990f, 0.251709f, 0.263916f,
- 0.276611f, 0.289551f, 0.301270f, 0.313965f, 0.325928f, 0.338135f, 0.350586f, 0.363037f,
- 0.376465f, 0.388428f, 0.401123f, 0.414062f, 0.426514f, 0.439209f, 0.452393f, 0.465088f,
- 0.478271f, 0.491455f, 0.503906f, 0.517090f, 0.530273f, 0.543457f, 0.556641f, 0.570312f,
- 0.583008f, 0.597168f, 0.610352f, 0.624512f, 0.638184f, 0.651367f, 0.665527f, 0.679199f,
- 0.692871f, 0.708496f, 0.823242f, 0.796387f, 0.774902f, 0.757812f, 0.742676f, 0.729980f,
- 0.004395f, 0.013802f, 0.023499f, 0.033173f, 0.043121f, 0.053345f, 0.063538f, 0.073730f,
- 0.085083f, 0.095581f, 0.106140f, 0.116760f, 0.127930f, 0.139160f, 0.150757f, 0.161621f,
- 0.173096f, 0.184814f, 0.196289f, 0.207520f, 0.219971f, 0.231201f, 0.242920f, 0.254150f,
- 0.266602f, 0.278320f, 0.290527f, 0.302490f, 0.314209f, 0.326904f, 0.338867f, 0.349854f,
- 0.362305f, 0.375488f, 0.387451f, 0.400146f, 0.412354f, 0.424805f, 0.436768f, 0.449219f,
- 0.461914f, 0.475098f, 0.487061f, 0.500000f, 0.512695f, 0.525391f, 0.538574f, 0.551758f,
- 0.564453f, 0.577148f, 0.590820f, 0.604004f, 0.618164f, 0.631348f, 0.644531f, 0.658203f,
- 0.672363f, 0.686523f, 0.812500f, 0.786621f, 0.767090f, 0.750977f, 0.736816f, 0.724609f,
- 0.004425f, 0.013405f, 0.022385f, 0.032043f, 0.041565f, 0.051605f, 0.061340f, 0.071106f,
- 0.081116f, 0.091125f, 0.101868f, 0.112671f, 0.123169f, 0.133667f, 0.144897f, 0.155029f,
- 0.166748f, 0.177246f, 0.188599f, 0.199585f, 0.211182f, 0.222046f, 0.233643f, 0.245361f,
- 0.255615f, 0.268066f, 0.279053f, 0.291260f, 0.303223f, 0.314209f, 0.325684f, 0.338379f,
- 0.349854f, 0.361572f, 0.374023f, 0.385254f, 0.397949f, 0.409912f, 0.421143f, 0.434082f,
- 0.445801f, 0.457764f, 0.470215f, 0.482910f, 0.495361f, 0.508301f, 0.520996f, 0.534180f,
- 0.546387f, 0.560059f, 0.572266f, 0.584961f, 0.597168f, 0.610840f, 0.624023f, 0.638184f,
- 0.650879f, 0.666016f, 0.801270f, 0.778320f, 0.760254f, 0.744141f, 0.730469f, 0.719238f,
- 0.004261f, 0.012543f, 0.021591f, 0.031052f, 0.039734f, 0.049164f, 0.058838f, 0.068420f,
- 0.077881f, 0.087402f, 0.098145f, 0.108276f, 0.118225f, 0.128784f, 0.138550f, 0.149292f,
- 0.159790f, 0.170654f, 0.181519f, 0.191772f, 0.203003f, 0.213623f, 0.225098f, 0.235107f,
- 0.247070f, 0.257324f, 0.269287f, 0.280273f, 0.291260f, 0.302246f, 0.313721f, 0.325439f,
- 0.336670f, 0.348145f, 0.359619f, 0.371338f, 0.382812f, 0.395020f, 0.406738f, 0.418213f,
- 0.429932f, 0.442139f, 0.454102f, 0.466309f, 0.479004f, 0.490723f, 0.502930f, 0.515625f,
- 0.526855f, 0.540527f, 0.552246f, 0.565918f, 0.578613f, 0.591309f, 0.604492f, 0.617188f,
- 0.630859f, 0.644043f, 0.790039f, 0.769531f, 0.751953f, 0.737305f, 0.724121f, 0.713379f,
- 0.003983f, 0.012329f, 0.020538f, 0.029312f, 0.038452f, 0.047241f, 0.056244f, 0.065552f,
- 0.075195f, 0.084290f, 0.094238f, 0.103638f, 0.113403f, 0.123413f, 0.133057f, 0.143066f,
- 0.153076f, 0.163696f, 0.173584f, 0.184204f, 0.194580f, 0.204834f, 0.215332f, 0.225952f,
- 0.237305f, 0.247803f, 0.258545f, 0.269531f, 0.280518f, 0.291260f, 0.301758f, 0.312988f,
- 0.324219f, 0.335205f, 0.346191f, 0.357178f, 0.368896f, 0.380127f, 0.391113f, 0.403076f,
- 0.414551f, 0.426270f, 0.437500f, 0.449951f, 0.460938f, 0.473389f, 0.485596f, 0.497314f,
- 0.509277f, 0.522461f, 0.533691f, 0.546875f, 0.558594f, 0.571289f, 0.583496f, 0.596680f,
- 0.608887f, 0.623047f, 0.778809f, 0.761230f, 0.744141f, 0.730957f, 0.718262f, 0.707031f,
- 0.003717f, 0.012016f, 0.020142f, 0.028137f, 0.036682f, 0.045441f, 0.053711f, 0.062927f,
- 0.071777f, 0.080627f, 0.090210f, 0.099060f, 0.108643f, 0.118164f, 0.127808f, 0.137329f,
- 0.147095f, 0.156128f, 0.166748f, 0.175903f, 0.186157f, 0.196655f, 0.206909f, 0.216797f,
- 0.227417f, 0.236816f, 0.247559f, 0.258301f, 0.268799f, 0.278809f, 0.289795f, 0.299805f,
- 0.310547f, 0.321777f, 0.333008f, 0.343262f, 0.354492f, 0.365234f, 0.376953f, 0.387939f,
- 0.398438f, 0.410400f, 0.421387f, 0.433105f, 0.444824f, 0.455811f, 0.467529f, 0.479736f,
- 0.491943f, 0.502930f, 0.515625f, 0.527344f, 0.540039f, 0.551758f, 0.563965f, 0.576660f,
- 0.589844f, 0.602539f, 0.767578f, 0.751465f, 0.736328f, 0.723633f, 0.711914f, 0.701660f,
- 0.003813f, 0.011337f, 0.019028f, 0.027252f, 0.035583f, 0.043396f, 0.051849f, 0.060028f,
- 0.068481f, 0.077026f, 0.086121f, 0.095093f, 0.103821f, 0.112610f, 0.121765f, 0.131470f,
- 0.140503f, 0.149780f, 0.159058f, 0.168701f, 0.178711f, 0.187744f, 0.197998f, 0.207397f,
- 0.217651f, 0.227661f, 0.236694f, 0.246704f, 0.257080f, 0.267334f, 0.277832f, 0.288330f,
- 0.298584f, 0.308838f, 0.319336f, 0.329590f, 0.340332f, 0.351318f, 0.361816f, 0.372559f,
- 0.383301f, 0.395020f, 0.405273f, 0.416260f, 0.427734f, 0.439209f, 0.450195f, 0.462158f,
- 0.473389f, 0.485107f, 0.497314f, 0.508301f, 0.520996f, 0.533203f, 0.544922f, 0.557617f,
- 0.568848f, 0.582031f, 0.757324f, 0.742676f, 0.729004f, 0.716309f, 0.705566f, 0.695801f,
- 0.003633f, 0.011040f, 0.018280f, 0.026062f, 0.033569f, 0.041229f, 0.049591f, 0.057373f,
- 0.065308f, 0.073975f, 0.082214f, 0.090393f, 0.099243f, 0.107544f, 0.116028f, 0.125854f,
- 0.134155f, 0.143311f, 0.151978f, 0.160767f, 0.170410f, 0.179321f, 0.188477f, 0.198242f,
- 0.207764f, 0.217896f, 0.227051f, 0.236328f, 0.246338f, 0.256104f, 0.265869f, 0.276123f,
- 0.285645f, 0.295898f, 0.306152f, 0.316162f, 0.326172f, 0.336914f, 0.347412f, 0.358154f,
- 0.368164f, 0.378906f, 0.389648f, 0.400146f, 0.410889f, 0.421631f, 0.432861f, 0.444824f,
- 0.456055f, 0.466797f, 0.479004f, 0.490234f, 0.501465f, 0.514160f, 0.525879f, 0.537598f,
- 0.549316f, 0.561523f, 0.745605f, 0.733887f, 0.721191f, 0.708496f, 0.699219f, 0.689453f,
- 0.003469f, 0.010429f, 0.017609f, 0.024612f, 0.032135f, 0.039520f, 0.047516f, 0.055206f,
- 0.062347f, 0.070618f, 0.078308f, 0.085938f, 0.094727f, 0.102417f, 0.111511f, 0.119446f,
- 0.127441f, 0.136475f, 0.144897f, 0.154175f, 0.162476f, 0.171509f, 0.180054f, 0.189697f,
- 0.198486f, 0.207886f, 0.216553f, 0.225830f, 0.235229f, 0.244873f, 0.254395f, 0.263428f,
- 0.273193f, 0.283203f, 0.292969f, 0.302734f, 0.312744f, 0.322510f, 0.333008f, 0.342773f,
- 0.353027f, 0.363037f, 0.374023f, 0.384521f, 0.395264f, 0.405762f, 0.416260f, 0.427002f,
- 0.438232f, 0.449219f, 0.460449f, 0.471924f, 0.482910f, 0.494629f, 0.506348f, 0.517578f,
- 0.529785f, 0.541504f, 0.734375f, 0.725098f, 0.712891f, 0.701660f, 0.692383f, 0.683594f,
- 0.003328f, 0.009804f, 0.016373f, 0.023727f, 0.030746f, 0.037994f, 0.044952f, 0.052032f,
- 0.059998f, 0.067383f, 0.074707f, 0.082214f, 0.089783f, 0.097961f, 0.105774f, 0.114197f,
- 0.122131f, 0.129517f, 0.137695f, 0.146118f, 0.154419f, 0.163330f, 0.171997f, 0.180664f,
- 0.188477f, 0.197388f, 0.206055f, 0.215332f, 0.224365f, 0.233765f, 0.242798f, 0.251709f,
- 0.260986f, 0.270020f, 0.279785f, 0.289062f, 0.299561f, 0.308594f, 0.318115f, 0.328613f,
- 0.338135f, 0.348877f, 0.358154f, 0.368408f, 0.378174f, 0.388916f, 0.399658f, 0.410156f,
- 0.420898f, 0.431885f, 0.442871f, 0.453369f, 0.463867f, 0.475342f, 0.486572f, 0.498535f,
- 0.510742f, 0.521973f, 0.723633f, 0.715820f, 0.705078f, 0.694336f, 0.686035f, 0.677246f,
- 0.003090f, 0.009628f, 0.016129f, 0.022644f, 0.029068f, 0.036407f, 0.042633f, 0.049866f,
- 0.056946f, 0.063904f, 0.071167f, 0.078186f, 0.085327f, 0.092896f, 0.100098f, 0.107788f,
- 0.115662f, 0.123230f, 0.131104f, 0.139160f, 0.146973f, 0.154907f, 0.162964f, 0.171265f,
- 0.179565f, 0.188110f, 0.196777f, 0.204834f, 0.213745f, 0.222168f, 0.231079f, 0.239868f,
- 0.248779f, 0.258057f, 0.267090f, 0.276611f, 0.285645f, 0.294434f, 0.304688f, 0.314209f,
- 0.323242f, 0.332520f, 0.342773f, 0.353027f, 0.362549f, 0.373047f, 0.383057f, 0.393311f,
- 0.404053f, 0.414307f, 0.424561f, 0.435059f, 0.445801f, 0.456787f, 0.467773f, 0.479004f,
- 0.490479f, 0.501953f, 0.712891f, 0.707031f, 0.696777f, 0.687500f, 0.679199f, 0.671387f,
- 0.003096f, 0.009026f, 0.015450f, 0.021606f, 0.027695f, 0.034302f, 0.040833f, 0.047455f,
- 0.054077f, 0.060669f, 0.067444f, 0.074097f, 0.081604f, 0.088501f, 0.095337f, 0.102295f,
- 0.109375f, 0.116821f, 0.124146f, 0.131592f, 0.139404f, 0.147217f, 0.155029f, 0.162231f,
- 0.170288f, 0.177979f, 0.186646f, 0.194092f, 0.203247f, 0.211670f, 0.219604f, 0.228149f,
- 0.236816f, 0.245605f, 0.254639f, 0.263184f, 0.272217f, 0.281250f, 0.290527f, 0.299805f,
- 0.308838f, 0.318604f, 0.327637f, 0.337646f, 0.347900f, 0.356934f, 0.367432f, 0.376953f,
- 0.387451f, 0.397217f, 0.407227f, 0.417480f, 0.427979f, 0.439209f, 0.449463f, 0.459717f,
- 0.470947f, 0.482666f, 0.701172f, 0.698242f, 0.688477f, 0.680176f, 0.671875f, 0.665039f,
- 0.002831f, 0.008789f, 0.014702f, 0.020523f, 0.026642f, 0.032684f, 0.038757f, 0.044708f,
- 0.051666f, 0.057312f, 0.063660f, 0.070190f, 0.076904f, 0.083435f, 0.090454f, 0.097046f,
- 0.103821f, 0.110535f, 0.117981f, 0.124817f, 0.131714f, 0.138916f, 0.146606f, 0.153687f,
- 0.161011f, 0.168823f, 0.176270f, 0.184570f, 0.192139f, 0.200317f, 0.208008f, 0.216309f,
- 0.224609f, 0.233032f, 0.241821f, 0.250244f, 0.258789f, 0.268066f, 0.276611f, 0.285400f,
- 0.294678f, 0.303223f, 0.312500f, 0.322021f, 0.331787f, 0.340088f, 0.350830f, 0.360596f,
- 0.369385f, 0.380371f, 0.389893f, 0.399658f, 0.410645f, 0.420654f, 0.430908f, 0.442383f,
- 0.452148f, 0.464111f, 0.690430f, 0.688965f, 0.681152f, 0.672852f, 0.665039f, 0.658691f,
- 0.002712f, 0.008553f, 0.013878f, 0.019638f, 0.025360f, 0.030716f, 0.037231f, 0.042633f,
- 0.048615f, 0.054810f, 0.060638f, 0.066650f, 0.072205f, 0.078796f, 0.085083f, 0.091492f,
- 0.097961f, 0.104065f, 0.110718f, 0.117859f, 0.124207f, 0.130981f, 0.138550f, 0.145142f,
- 0.152588f, 0.160156f, 0.166992f, 0.174561f, 0.181885f, 0.189453f, 0.197754f, 0.205444f,
- 0.213013f, 0.220825f, 0.229004f, 0.237061f, 0.246094f, 0.254639f, 0.262939f, 0.271484f,
- 0.280273f, 0.288818f, 0.298584f, 0.307129f, 0.316162f, 0.325195f, 0.334229f, 0.344482f,
- 0.353516f, 0.363525f, 0.372803f, 0.382812f, 0.392822f, 0.402344f, 0.412842f, 0.423096f,
- 0.433350f, 0.444092f, 0.679199f, 0.679688f, 0.672852f, 0.665039f, 0.658203f, 0.651855f,
- 0.002674f, 0.007828f, 0.013290f, 0.018723f, 0.023743f, 0.029160f, 0.034790f, 0.040100f,
- 0.045929f, 0.051544f, 0.057068f, 0.063110f, 0.068359f, 0.074280f, 0.080078f, 0.086243f,
- 0.092346f, 0.098206f, 0.104919f, 0.110779f, 0.117493f, 0.123291f, 0.130005f, 0.136963f,
- 0.143677f, 0.150635f, 0.157471f, 0.164307f, 0.171631f, 0.179199f, 0.186279f, 0.193604f,
- 0.201904f, 0.209229f, 0.217163f, 0.224976f, 0.233154f, 0.240967f, 0.249634f, 0.258301f,
- 0.266113f, 0.274414f, 0.283691f, 0.291748f, 0.301025f, 0.310059f, 0.319336f, 0.327148f,
- 0.337402f, 0.347168f, 0.355957f, 0.364746f, 0.375488f, 0.385498f, 0.394043f, 0.405273f,
- 0.415283f, 0.426025f, 0.667969f, 0.670410f, 0.664551f, 0.657227f, 0.651367f, 0.645508f,
- 0.002731f, 0.007622f, 0.012627f, 0.017868f, 0.022781f, 0.028107f, 0.032959f, 0.037811f,
- 0.043121f, 0.048615f, 0.053925f, 0.059235f, 0.064514f, 0.070007f, 0.075562f, 0.080688f,
- 0.086914f, 0.092102f, 0.098083f, 0.104309f, 0.110107f, 0.115906f, 0.122314f, 0.128540f,
- 0.135010f, 0.141479f, 0.147949f, 0.154663f, 0.161865f, 0.168579f, 0.175415f, 0.182739f,
- 0.191040f, 0.197510f, 0.205200f, 0.212891f, 0.219971f, 0.228638f, 0.236328f, 0.244263f,
- 0.252686f, 0.260498f, 0.268799f, 0.278076f, 0.286133f, 0.294434f, 0.303223f, 0.312500f,
- 0.320801f, 0.329834f, 0.339844f, 0.347656f, 0.357910f, 0.367676f, 0.376709f, 0.386963f,
- 0.396729f, 0.406982f, 0.656738f, 0.662598f, 0.656738f, 0.649902f, 0.644531f, 0.638672f,
- 0.002411f, 0.007168f, 0.012238f, 0.016739f, 0.021957f, 0.026184f, 0.031311f, 0.035583f,
- 0.041016f, 0.045685f, 0.050568f, 0.055573f, 0.060791f, 0.065735f, 0.070557f, 0.076111f,
- 0.081238f, 0.086792f, 0.092163f, 0.097534f, 0.103271f, 0.108887f, 0.114563f, 0.120605f,
- 0.126587f, 0.132446f, 0.139038f, 0.145508f, 0.152100f, 0.158447f, 0.165527f, 0.171997f,
- 0.178833f, 0.186035f, 0.193481f, 0.200928f, 0.207886f, 0.215820f, 0.222900f, 0.230713f,
- 0.238770f, 0.246948f, 0.255127f, 0.262695f, 0.271484f, 0.280029f, 0.287842f, 0.296631f,
- 0.305420f, 0.313965f, 0.322754f, 0.331787f, 0.340576f, 0.350342f, 0.359375f, 0.369385f,
- 0.379150f, 0.388184f, 0.645508f, 0.652832f, 0.648438f, 0.643066f, 0.637695f, 0.632324f,
- 0.002480f, 0.006691f, 0.011452f, 0.015900f, 0.020828f, 0.024734f, 0.029327f, 0.033752f,
- 0.038513f, 0.042999f, 0.047638f, 0.052429f, 0.056671f, 0.061859f, 0.066040f, 0.071289f,
- 0.075684f, 0.080688f, 0.086243f, 0.091248f, 0.096436f, 0.101562f, 0.107300f, 0.112366f,
- 0.118347f, 0.124146f, 0.130249f, 0.135864f, 0.141968f, 0.148438f, 0.155029f, 0.161377f,
- 0.167969f, 0.174683f, 0.181641f, 0.188599f, 0.195679f, 0.203247f, 0.210449f, 0.217529f,
- 0.225342f, 0.233398f, 0.241577f, 0.249023f, 0.256592f, 0.264893f, 0.273193f, 0.281494f,
- 0.289795f, 0.297607f, 0.306885f, 0.315430f, 0.323730f, 0.333496f, 0.342529f, 0.351318f,
- 0.360840f, 0.370605f, 0.634766f, 0.643555f, 0.640625f, 0.635742f, 0.630859f, 0.625488f,
- 0.002230f, 0.006477f, 0.010582f, 0.014870f, 0.019073f, 0.023270f, 0.027893f, 0.031860f,
- 0.036072f, 0.040253f, 0.044373f, 0.048706f, 0.052856f, 0.057312f, 0.061859f, 0.066406f,
- 0.070984f, 0.075317f, 0.080139f, 0.084839f, 0.089661f, 0.094910f, 0.099792f, 0.104858f,
- 0.110718f, 0.115356f, 0.121399f, 0.126831f, 0.132690f, 0.138672f, 0.145142f, 0.151001f,
- 0.157471f, 0.164185f, 0.170532f, 0.177002f, 0.184082f, 0.191040f, 0.197876f, 0.205200f,
- 0.212402f, 0.219604f, 0.227295f, 0.234985f, 0.242188f, 0.250244f, 0.257812f, 0.266113f,
- 0.274170f, 0.282471f, 0.290771f, 0.299072f, 0.307373f, 0.316162f, 0.326416f, 0.333984f,
- 0.343750f, 0.353271f, 0.622070f, 0.634277f, 0.631836f, 0.627930f, 0.623535f, 0.619141f,
- 0.002220f, 0.006039f, 0.010353f, 0.014328f, 0.017838f, 0.022141f, 0.025742f, 0.029510f,
- 0.033600f, 0.037781f, 0.041443f, 0.045502f, 0.049469f, 0.053436f, 0.057190f, 0.061462f,
- 0.065735f, 0.069946f, 0.074524f, 0.078674f, 0.083069f, 0.087830f, 0.092468f, 0.097412f,
- 0.102783f, 0.107910f, 0.112793f, 0.118164f, 0.123901f, 0.129395f, 0.135132f, 0.140991f,
- 0.147339f, 0.152954f, 0.159302f, 0.165527f, 0.172363f, 0.178589f, 0.185425f, 0.191895f,
- 0.199219f, 0.206665f, 0.213989f, 0.221069f, 0.228516f, 0.236206f, 0.243042f, 0.251709f,
- 0.258789f, 0.266846f, 0.275146f, 0.283203f, 0.291260f, 0.300537f, 0.308350f, 0.317627f,
- 0.326904f, 0.335938f, 0.611816f, 0.625000f, 0.624023f, 0.620117f, 0.616211f, 0.612793f,
- 0.001965f, 0.005882f, 0.009613f, 0.013184f, 0.016785f, 0.020370f, 0.024384f, 0.027664f,
- 0.031311f, 0.035126f, 0.038727f, 0.042572f, 0.046112f, 0.049347f, 0.053253f, 0.056915f,
- 0.060883f, 0.064697f, 0.068909f, 0.072693f, 0.076843f, 0.081055f, 0.085754f, 0.090088f,
- 0.094849f, 0.099609f, 0.104614f, 0.109741f, 0.114746f, 0.119995f, 0.125488f, 0.130981f,
- 0.136719f, 0.142700f, 0.148315f, 0.154541f, 0.160522f, 0.166870f, 0.173828f, 0.179932f,
- 0.186768f, 0.193604f, 0.200439f, 0.207764f, 0.214844f, 0.221802f, 0.228882f, 0.236328f,
- 0.244385f, 0.252197f, 0.259277f, 0.268066f, 0.275635f, 0.283447f, 0.292236f, 0.301270f,
- 0.309570f, 0.318848f, 0.600098f, 0.616211f, 0.615234f, 0.612793f, 0.609375f, 0.605469f,
- 0.001966f, 0.005653f, 0.009109f, 0.012428f, 0.015945f, 0.018967f, 0.022537f, 0.025894f,
- 0.029175f, 0.032440f, 0.035797f, 0.038818f, 0.042389f, 0.046051f, 0.049072f, 0.052521f,
- 0.056335f, 0.059906f, 0.063293f, 0.067017f, 0.070923f, 0.075134f, 0.078979f, 0.083496f,
- 0.087646f, 0.091980f, 0.096619f, 0.101196f, 0.105957f, 0.111145f, 0.116028f, 0.121277f,
- 0.126831f, 0.132080f, 0.137817f, 0.143311f, 0.149780f, 0.155029f, 0.161621f, 0.167847f,
- 0.173950f, 0.180786f, 0.187622f, 0.194214f, 0.201050f, 0.207764f, 0.215210f, 0.222046f,
- 0.229370f, 0.236816f, 0.244751f, 0.251953f, 0.260010f, 0.268311f, 0.276123f, 0.284180f,
- 0.293213f, 0.301514f, 0.588379f, 0.606934f, 0.607422f, 0.604980f, 0.602051f, 0.599609f,
- 0.001963f, 0.005333f, 0.008377f, 0.011589f, 0.014450f, 0.017593f, 0.021133f, 0.023972f,
- 0.027145f, 0.030075f, 0.033295f, 0.035858f, 0.038818f, 0.041992f, 0.045288f, 0.048279f,
- 0.051849f, 0.054840f, 0.058289f, 0.061737f, 0.065186f, 0.068848f, 0.072632f, 0.076721f,
- 0.080505f, 0.084717f, 0.088806f, 0.093079f, 0.097717f, 0.102356f, 0.106934f, 0.111755f,
- 0.116882f, 0.121887f, 0.127319f, 0.132935f, 0.138306f, 0.144287f, 0.149902f, 0.156250f,
- 0.162109f, 0.168579f, 0.174316f, 0.180908f, 0.187500f, 0.194458f, 0.201538f, 0.208252f,
- 0.215210f, 0.222656f, 0.229980f, 0.237061f, 0.244629f, 0.252441f, 0.260254f, 0.267334f,
- 0.276123f, 0.284180f, 0.576660f, 0.597656f, 0.599609f, 0.598145f, 0.595215f, 0.591797f,
- 0.001631f, 0.004906f, 0.007805f, 0.010826f, 0.013802f, 0.016983f, 0.019485f, 0.022079f,
- 0.024750f, 0.027939f, 0.030136f, 0.033112f, 0.035797f, 0.038727f, 0.041443f, 0.044281f,
- 0.047058f, 0.050018f, 0.053253f, 0.056396f, 0.059662f, 0.063049f, 0.066406f, 0.069946f,
- 0.073730f, 0.077454f, 0.081360f, 0.085388f, 0.089417f, 0.093750f, 0.098267f, 0.102844f,
- 0.107727f, 0.112244f, 0.117615f, 0.122253f, 0.127441f, 0.133057f, 0.138550f, 0.144287f,
- 0.150024f, 0.156250f, 0.161987f, 0.167969f, 0.174805f, 0.181274f, 0.187744f, 0.194580f,
- 0.201294f, 0.208374f, 0.215210f, 0.222412f, 0.229736f, 0.237183f, 0.244629f, 0.252197f,
- 0.260010f, 0.269287f, 0.566406f, 0.588867f, 0.590820f, 0.590332f, 0.587891f, 0.585938f,
- 0.001858f, 0.004318f, 0.007465f, 0.010246f, 0.012550f, 0.015793f, 0.018143f, 0.020782f,
- 0.022980f, 0.025116f, 0.027924f, 0.030106f, 0.032623f, 0.035126f, 0.037720f, 0.040283f,
- 0.042847f, 0.045380f, 0.048492f, 0.051300f, 0.054321f, 0.057373f, 0.060516f, 0.063599f,
- 0.067139f, 0.070496f, 0.074219f, 0.078003f, 0.081848f, 0.085754f, 0.089783f, 0.093994f,
- 0.098267f, 0.102783f, 0.107239f, 0.112366f, 0.117371f, 0.122498f, 0.127686f, 0.132935f,
- 0.138428f, 0.144043f, 0.150024f, 0.155884f, 0.161865f, 0.168091f, 0.174316f, 0.180664f,
- 0.187622f, 0.194214f, 0.200928f, 0.207520f, 0.214966f, 0.221680f, 0.229370f, 0.236816f,
- 0.244751f, 0.252441f, 0.553223f, 0.579102f, 0.583496f, 0.582031f, 0.581055f, 0.579590f,
- 0.001425f, 0.004284f, 0.007019f, 0.009521f, 0.011894f, 0.014191f, 0.016632f, 0.018723f,
- 0.021210f, 0.023209f, 0.025482f, 0.027344f, 0.029617f, 0.032043f, 0.034210f, 0.036407f,
- 0.039001f, 0.041077f, 0.043976f, 0.046448f, 0.049133f, 0.051819f, 0.054932f, 0.057770f,
- 0.060730f, 0.063965f, 0.067322f, 0.070862f, 0.074280f, 0.077698f, 0.082031f, 0.085571f,
- 0.089844f, 0.093994f, 0.098022f, 0.102722f, 0.107178f, 0.111877f, 0.116821f, 0.121887f,
- 0.127075f, 0.132446f, 0.138062f, 0.143799f, 0.149414f, 0.155518f, 0.161377f, 0.167480f,
- 0.173950f, 0.180176f, 0.186890f, 0.193481f, 0.200562f, 0.207397f, 0.214355f, 0.221313f,
- 0.229492f, 0.237427f, 0.541504f, 0.570801f, 0.575195f, 0.575195f, 0.573730f, 0.572266f,
- 0.001613f, 0.004181f, 0.006252f, 0.008774f, 0.011108f, 0.013054f, 0.015152f, 0.016937f,
- 0.019150f, 0.021011f, 0.023163f, 0.024826f, 0.026993f, 0.028793f, 0.030823f, 0.033081f,
- 0.035156f, 0.037201f, 0.039612f, 0.041748f, 0.044464f, 0.046814f, 0.049438f, 0.052155f,
- 0.054840f, 0.057831f, 0.060699f, 0.063599f, 0.067078f, 0.070374f, 0.073853f, 0.077087f,
- 0.081177f, 0.085083f, 0.089111f, 0.093262f, 0.097473f, 0.101929f, 0.106689f, 0.111023f,
- 0.116455f, 0.121277f, 0.126343f, 0.132080f, 0.137573f, 0.142700f, 0.148682f, 0.154907f,
- 0.161133f, 0.167236f, 0.173340f, 0.179688f, 0.186768f, 0.193115f, 0.200684f, 0.207275f,
- 0.214233f, 0.221924f, 0.530273f, 0.561523f, 0.565430f, 0.567383f, 0.564941f, 0.564941f,
- 0.001237f, 0.003775f, 0.006348f, 0.008141f, 0.010117f, 0.012184f, 0.013763f, 0.015656f,
- 0.017319f, 0.018967f, 0.020645f, 0.022507f, 0.023926f, 0.025757f, 0.027573f, 0.029449f,
- 0.031677f, 0.033325f, 0.035645f, 0.037659f, 0.039734f, 0.041809f, 0.044189f, 0.046692f,
- 0.049133f, 0.051697f, 0.054504f, 0.057251f, 0.060059f, 0.063110f, 0.066467f, 0.069763f,
- 0.072937f, 0.076477f, 0.080505f, 0.084290f, 0.088013f, 0.092407f, 0.096436f, 0.101013f,
- 0.105713f, 0.110352f, 0.115356f, 0.120605f, 0.125488f, 0.130981f, 0.136353f, 0.142090f,
- 0.148438f, 0.153931f, 0.159912f, 0.166260f, 0.172485f, 0.179321f, 0.185791f, 0.193115f,
- 0.199463f, 0.206665f, 0.520020f, 0.552246f, 0.558105f, 0.559570f, 0.559082f, 0.557617f,
- 0.001151f, 0.003399f, 0.005611f, 0.007439f, 0.009354f, 0.010925f, 0.012489f, 0.014061f,
- 0.015610f, 0.017258f, 0.018845f, 0.020248f, 0.021484f, 0.023193f, 0.024796f, 0.026459f,
- 0.028183f, 0.029785f, 0.031738f, 0.033386f, 0.035309f, 0.037384f, 0.039368f, 0.041626f,
- 0.043701f, 0.046204f, 0.048553f, 0.051178f, 0.053955f, 0.056488f, 0.059418f, 0.062256f,
- 0.065308f, 0.068542f, 0.071899f, 0.075623f, 0.079224f, 0.082947f, 0.087097f, 0.091064f,
- 0.095520f, 0.099854f, 0.104736f, 0.109314f, 0.114136f, 0.119324f, 0.124756f, 0.130127f,
- 0.135498f, 0.141113f, 0.146973f, 0.153198f, 0.159180f, 0.165527f, 0.172241f, 0.178711f,
- 0.185425f, 0.192749f, 0.507324f, 0.543945f, 0.549316f, 0.552246f, 0.551270f, 0.551270f,
- 0.001070f, 0.002996f, 0.004986f, 0.006851f, 0.008514f, 0.009850f, 0.011330f, 0.012596f,
- 0.014015f, 0.015259f, 0.016586f, 0.017731f, 0.019287f, 0.020676f, 0.022079f, 0.023468f,
- 0.024765f, 0.026489f, 0.028030f, 0.029465f, 0.031311f, 0.032898f, 0.034851f, 0.036743f,
- 0.038940f, 0.040833f, 0.043091f, 0.045074f, 0.047729f, 0.050079f, 0.052673f, 0.055389f,
- 0.058136f, 0.061188f, 0.064087f, 0.067261f, 0.070618f, 0.074158f, 0.077942f, 0.081726f,
- 0.085815f, 0.089783f, 0.094055f, 0.098572f, 0.103088f, 0.107971f, 0.113037f, 0.118164f,
- 0.123413f, 0.128784f, 0.134521f, 0.140137f, 0.146118f, 0.152100f, 0.158325f, 0.164307f,
- 0.171387f, 0.177368f, 0.496094f, 0.534668f, 0.541992f, 0.543945f, 0.544434f, 0.544434f,
- 0.001086f, 0.003069f, 0.004463f, 0.006256f, 0.007393f, 0.009026f, 0.010178f, 0.011276f,
- 0.012260f, 0.013542f, 0.014648f, 0.015808f, 0.016861f, 0.017899f, 0.019333f, 0.020599f,
- 0.021942f, 0.023117f, 0.024384f, 0.025833f, 0.027344f, 0.028992f, 0.030579f, 0.032318f,
- 0.034149f, 0.035828f, 0.037842f, 0.039764f, 0.041901f, 0.044037f, 0.046539f, 0.048645f,
- 0.051147f, 0.053894f, 0.056641f, 0.059631f, 0.062500f, 0.065735f, 0.069031f, 0.072754f,
- 0.076294f, 0.080139f, 0.083984f, 0.088379f, 0.092712f, 0.097229f, 0.101929f, 0.106873f,
- 0.111694f, 0.117004f, 0.122314f, 0.127930f, 0.133789f, 0.139282f, 0.145142f, 0.151367f,
- 0.157349f, 0.163818f, 0.484619f, 0.525391f, 0.534180f, 0.536621f, 0.536133f, 0.536621f,
- 0.001125f, 0.002892f, 0.003883f, 0.005867f, 0.006603f, 0.007935f, 0.009026f, 0.009911f,
- 0.010956f, 0.012077f, 0.012909f, 0.013901f, 0.014977f, 0.015671f, 0.016983f, 0.018021f,
- 0.019058f, 0.020279f, 0.021225f, 0.022598f, 0.023941f, 0.025299f, 0.026535f, 0.028107f,
- 0.029755f, 0.031113f, 0.033020f, 0.034668f, 0.036682f, 0.038483f, 0.040527f, 0.042511f,
- 0.044708f, 0.046936f, 0.049744f, 0.052216f, 0.054840f, 0.057800f, 0.060791f, 0.064087f,
- 0.067505f, 0.071045f, 0.074463f, 0.078491f, 0.082397f, 0.086609f, 0.091248f, 0.095581f,
- 0.100342f, 0.105530f, 0.110474f, 0.116272f, 0.120972f, 0.126953f, 0.132812f, 0.138672f,
- 0.144287f, 0.150513f, 0.472412f, 0.516113f, 0.524902f, 0.528809f, 0.529785f, 0.529785f,
- 0.000859f, 0.002470f, 0.003815f, 0.005226f, 0.005913f, 0.007206f, 0.007942f, 0.008652f,
- 0.009583f, 0.010406f, 0.011223f, 0.011971f, 0.012856f, 0.013664f, 0.014664f, 0.015549f,
- 0.016464f, 0.017487f, 0.018478f, 0.019592f, 0.020767f, 0.021774f, 0.023117f, 0.024338f,
- 0.025604f, 0.027008f, 0.028519f, 0.029953f, 0.031525f, 0.033173f, 0.034943f, 0.036865f,
- 0.038696f, 0.040863f, 0.042969f, 0.045471f, 0.048004f, 0.050293f, 0.052979f, 0.055847f,
- 0.058960f, 0.062042f, 0.065491f, 0.069153f, 0.072937f, 0.076660f, 0.080750f, 0.085144f,
- 0.089539f, 0.094177f, 0.099304f, 0.104187f, 0.109741f, 0.114807f, 0.120483f, 0.125977f,
- 0.131836f, 0.138306f, 0.460449f, 0.507812f, 0.516602f, 0.520020f, 0.522461f, 0.522949f,
- 0.000906f, 0.002359f, 0.003643f, 0.004356f, 0.005310f, 0.005989f, 0.007030f, 0.007507f,
- 0.008255f, 0.009010f, 0.009834f, 0.010483f, 0.011230f, 0.011887f, 0.012573f, 0.013367f,
- 0.014252f, 0.014954f, 0.015900f, 0.016785f, 0.017776f, 0.018631f, 0.019775f, 0.020874f,
- 0.022110f, 0.023117f, 0.024368f, 0.025589f, 0.026932f, 0.028549f, 0.029938f, 0.031525f,
- 0.033325f, 0.035187f, 0.037109f, 0.038971f, 0.041138f, 0.043396f, 0.045715f, 0.048370f,
- 0.051025f, 0.053772f, 0.057129f, 0.060089f, 0.063416f, 0.067261f, 0.070679f, 0.075012f,
- 0.079285f, 0.083618f, 0.088379f, 0.093018f, 0.098083f, 0.102478f, 0.108093f, 0.114380f,
- 0.119507f, 0.125488f, 0.448975f, 0.498291f, 0.508789f, 0.513672f, 0.514648f, 0.516113f,
- 0.000728f, 0.001932f, 0.003067f, 0.003990f, 0.004784f, 0.005295f, 0.005974f, 0.006584f,
- 0.007099f, 0.007652f, 0.008255f, 0.008904f, 0.009491f, 0.010109f, 0.010658f, 0.011497f,
- 0.012131f, 0.012718f, 0.013535f, 0.014336f, 0.015083f, 0.016083f, 0.016785f, 0.017761f,
- 0.018738f, 0.019669f, 0.020691f, 0.021805f, 0.023010f, 0.024170f, 0.025467f, 0.026794f,
- 0.028336f, 0.029922f, 0.031555f, 0.033203f, 0.035034f, 0.036987f, 0.039062f, 0.041290f,
- 0.043671f, 0.046143f, 0.048920f, 0.051880f, 0.054901f, 0.058228f, 0.061615f, 0.065369f,
- 0.069214f, 0.073425f, 0.077637f, 0.082214f, 0.087097f, 0.091797f, 0.096497f, 0.102356f,
- 0.107483f, 0.113464f, 0.437256f, 0.489746f, 0.500977f, 0.504883f, 0.507812f, 0.509277f,
- 0.000724f, 0.001842f, 0.002728f, 0.003332f, 0.004101f, 0.004707f, 0.005020f, 0.005497f,
- 0.006245f, 0.006603f, 0.007027f, 0.007515f, 0.008156f, 0.008537f, 0.009125f, 0.009659f,
- 0.010101f, 0.010864f, 0.011482f, 0.012070f, 0.012756f, 0.013496f, 0.014236f, 0.014931f,
- 0.015808f, 0.016632f, 0.017487f, 0.018433f, 0.019379f, 0.020416f, 0.021530f, 0.022583f,
- 0.023804f, 0.024979f, 0.026443f, 0.027939f, 0.029526f, 0.031235f, 0.033020f, 0.035004f,
- 0.037018f, 0.039185f, 0.041595f, 0.044159f, 0.046783f, 0.049866f, 0.052856f, 0.056274f,
- 0.059906f, 0.063721f, 0.067749f, 0.072327f, 0.076172f, 0.081299f, 0.085938f, 0.091309f,
- 0.096558f, 0.101807f, 0.426270f, 0.480469f, 0.492676f, 0.498047f, 0.500488f, 0.501953f,
- 0.000673f, 0.001715f, 0.002426f, 0.002953f, 0.003588f, 0.003944f, 0.004200f, 0.004776f,
- 0.005131f, 0.005527f, 0.005886f, 0.006371f, 0.006790f, 0.007076f, 0.007538f, 0.008133f,
- 0.008644f, 0.009140f, 0.009483f, 0.010071f, 0.010689f, 0.011230f, 0.011879f, 0.012474f,
- 0.013222f, 0.013916f, 0.014587f, 0.015411f, 0.016190f, 0.016983f, 0.017883f, 0.018845f,
- 0.019867f, 0.020935f, 0.022141f, 0.023270f, 0.024567f, 0.026001f, 0.027481f, 0.029114f,
- 0.030777f, 0.032684f, 0.034698f, 0.036865f, 0.039337f, 0.041748f, 0.044647f, 0.047882f,
- 0.050964f, 0.054260f, 0.058258f, 0.062195f, 0.066528f, 0.070679f, 0.075623f, 0.080505f,
- 0.085510f, 0.090515f, 0.414307f, 0.472168f, 0.484131f, 0.490234f, 0.492920f, 0.495850f,
- 0.000484f, 0.001445f, 0.002169f, 0.002569f, 0.002836f, 0.003317f, 0.003569f, 0.003952f,
- 0.004215f, 0.004623f, 0.004959f, 0.005306f, 0.005592f, 0.005951f, 0.006306f, 0.006737f,
- 0.007004f, 0.007492f, 0.007942f, 0.008331f, 0.008865f, 0.009270f, 0.009781f, 0.010338f,
- 0.010887f, 0.011429f, 0.012047f, 0.012726f, 0.013336f, 0.014030f, 0.014771f, 0.015572f,
- 0.016418f, 0.017258f, 0.018234f, 0.019196f, 0.020279f, 0.021423f, 0.022675f, 0.023987f,
- 0.025375f, 0.027039f, 0.028702f, 0.030563f, 0.032623f, 0.034698f, 0.037262f, 0.040039f,
- 0.042664f, 0.046051f, 0.049194f, 0.052948f, 0.057129f, 0.061371f, 0.065613f, 0.070007f,
- 0.075317f, 0.080200f, 0.402588f, 0.462402f, 0.476807f, 0.482666f, 0.485107f, 0.487061f,
- 0.000459f, 0.001265f, 0.001572f, 0.002138f, 0.002365f, 0.002775f, 0.002920f, 0.003189f,
- 0.003454f, 0.003723f, 0.003986f, 0.004250f, 0.004536f, 0.004906f, 0.005150f, 0.005463f,
- 0.005787f, 0.006172f, 0.006481f, 0.006794f, 0.007156f, 0.007542f, 0.007980f, 0.008430f,
- 0.008827f, 0.009361f, 0.009796f, 0.010300f, 0.010910f, 0.011497f, 0.012161f, 0.012672f,
- 0.013336f, 0.014183f, 0.014893f, 0.015640f, 0.016541f, 0.017517f, 0.018448f, 0.019485f,
- 0.020676f, 0.021912f, 0.023392f, 0.024979f, 0.026627f, 0.028351f, 0.030457f, 0.032806f,
- 0.035034f, 0.037933f, 0.041229f, 0.044373f, 0.047821f, 0.052002f, 0.056244f, 0.060547f,
- 0.065247f, 0.069885f, 0.390869f, 0.453857f, 0.468018f, 0.475098f, 0.478027f, 0.480469f,
- 0.000332f, 0.001075f, 0.001464f, 0.001721f, 0.001911f, 0.002235f, 0.002375f, 0.002558f,
- 0.002834f, 0.002998f, 0.003185f, 0.003441f, 0.003647f, 0.003952f, 0.004139f, 0.004421f,
- 0.004631f, 0.004879f, 0.005180f, 0.005447f, 0.005795f, 0.006115f, 0.006416f, 0.006718f,
- 0.007099f, 0.007462f, 0.007881f, 0.008331f, 0.008797f, 0.009140f, 0.009735f, 0.010223f,
- 0.010803f, 0.011337f, 0.011986f, 0.012611f, 0.013283f, 0.014076f, 0.014847f, 0.015732f,
- 0.016693f, 0.017700f, 0.018784f, 0.019897f, 0.021317f, 0.022873f, 0.024429f, 0.026306f,
- 0.028473f, 0.030960f, 0.033600f, 0.036407f, 0.039856f, 0.043549f, 0.047119f, 0.051392f,
- 0.055969f, 0.060394f, 0.379639f, 0.444580f, 0.458984f, 0.467529f, 0.470947f, 0.472900f,
- 0.000408f, 0.000770f, 0.001271f, 0.001390f, 0.001601f, 0.001762f, 0.001848f, 0.002052f,
- 0.002247f, 0.002401f, 0.002491f, 0.002684f, 0.002878f, 0.003086f, 0.003304f, 0.003452f,
- 0.003626f, 0.003805f, 0.004074f, 0.004257f, 0.004513f, 0.004807f, 0.005039f, 0.005299f,
- 0.005638f, 0.005905f, 0.006191f, 0.006516f, 0.006927f, 0.007206f, 0.007645f, 0.008034f,
- 0.008415f, 0.008911f, 0.009384f, 0.009941f, 0.010483f, 0.011116f, 0.011711f, 0.012428f,
- 0.013191f, 0.013969f, 0.014862f, 0.015854f, 0.016785f, 0.017975f, 0.019348f, 0.020721f,
- 0.022461f, 0.024445f, 0.026733f, 0.029175f, 0.032227f, 0.035248f, 0.038788f, 0.042755f,
- 0.046967f, 0.051636f, 0.367920f, 0.435059f, 0.452148f, 0.459229f, 0.463623f, 0.466797f,
- 0.000382f, 0.000669f, 0.001037f, 0.001185f, 0.001293f, 0.001379f, 0.001470f, 0.001565f,
- 0.001729f, 0.001864f, 0.001928f, 0.002138f, 0.002237f, 0.002398f, 0.002510f, 0.002672f,
- 0.002802f, 0.002966f, 0.003134f, 0.003319f, 0.003517f, 0.003723f, 0.003870f, 0.004089f,
- 0.004311f, 0.004532f, 0.004772f, 0.005013f, 0.005314f, 0.005573f, 0.005924f, 0.006203f,
- 0.006523f, 0.006897f, 0.007240f, 0.007660f, 0.008041f, 0.008530f, 0.009048f, 0.009621f,
- 0.010201f, 0.010841f, 0.011467f, 0.012192f, 0.013138f, 0.013969f, 0.014931f, 0.016113f,
- 0.017380f, 0.018936f, 0.020630f, 0.022751f, 0.025208f, 0.027924f, 0.031311f, 0.034851f,
- 0.038879f, 0.043274f, 0.356689f, 0.426270f, 0.443848f, 0.451660f, 0.456055f, 0.459473f,
- 0.000482f, 0.000542f, 0.000723f, 0.000822f, 0.000881f, 0.001025f, 0.001100f, 0.001209f,
- 0.001249f, 0.001355f, 0.001522f, 0.001599f, 0.001708f, 0.001836f, 0.001918f, 0.001970f,
- 0.002129f, 0.002251f, 0.002357f, 0.002522f, 0.002636f, 0.002768f, 0.002911f, 0.003056f,
- 0.003237f, 0.003393f, 0.003605f, 0.003771f, 0.003994f, 0.004234f, 0.004444f, 0.004635f,
- 0.004932f, 0.005150f, 0.005486f, 0.005779f, 0.006081f, 0.006458f, 0.006775f, 0.007179f,
- 0.007668f, 0.008110f, 0.008690f, 0.009209f, 0.009926f, 0.010551f, 0.011330f, 0.012184f,
- 0.013184f, 0.014297f, 0.015610f, 0.017181f, 0.019165f, 0.021500f, 0.024384f, 0.027618f,
- 0.031372f, 0.035614f, 0.345459f, 0.417236f, 0.435303f, 0.443604f, 0.448730f, 0.451904f,
- 0.000240f, 0.000479f, 0.000533f, 0.000625f, 0.000716f, 0.000746f, 0.000857f, 0.000835f,
- 0.000941f, 0.001024f, 0.001104f, 0.001155f, 0.001204f, 0.001282f, 0.001396f, 0.001453f,
- 0.001554f, 0.001627f, 0.001737f, 0.001787f, 0.001894f, 0.002012f, 0.002119f, 0.002218f,
- 0.002335f, 0.002453f, 0.002611f, 0.002714f, 0.002848f, 0.003050f, 0.003168f, 0.003395f,
- 0.003529f, 0.003740f, 0.003963f, 0.004158f, 0.004429f, 0.004688f, 0.004982f, 0.005280f,
- 0.005600f, 0.005959f, 0.006340f, 0.006775f, 0.007252f, 0.007748f, 0.008369f, 0.008980f,
- 0.009705f, 0.010513f, 0.011513f, 0.012665f, 0.014069f, 0.015869f, 0.018158f, 0.020950f,
- 0.024338f, 0.028366f, 0.335205f, 0.408203f, 0.427002f, 0.435547f, 0.441162f, 0.445312f,
- 0.000138f, 0.000265f, 0.000381f, 0.000386f, 0.000465f, 0.000556f, 0.000558f, 0.000597f,
- 0.000659f, 0.000748f, 0.000770f, 0.000786f, 0.000829f, 0.000904f, 0.000940f, 0.001021f,
- 0.001043f, 0.001139f, 0.001201f, 0.001253f, 0.001327f, 0.001396f, 0.001481f, 0.001555f,
- 0.001637f, 0.001712f, 0.001813f, 0.001899f, 0.002005f, 0.002140f, 0.002220f, 0.002348f,
- 0.002462f, 0.002600f, 0.002733f, 0.002932f, 0.003075f, 0.003279f, 0.003452f, 0.003630f,
- 0.003872f, 0.004166f, 0.004436f, 0.004742f, 0.005077f, 0.005459f, 0.005848f, 0.006310f,
- 0.006874f, 0.007492f, 0.008171f, 0.009026f, 0.009995f, 0.011307f, 0.013008f, 0.015343f,
- 0.018265f, 0.021881f, 0.323486f, 0.399170f, 0.418945f, 0.428467f, 0.434326f, 0.437988f,
- 0.000165f, 0.000260f, 0.000287f, 0.000296f, 0.000331f, 0.000339f, 0.000360f, 0.000395f,
- 0.000442f, 0.000482f, 0.000487f, 0.000551f, 0.000546f, 0.000611f, 0.000640f, 0.000667f,
- 0.000711f, 0.000742f, 0.000775f, 0.000816f, 0.000876f, 0.000916f, 0.000974f, 0.001015f,
- 0.001081f, 0.001123f, 0.001195f, 0.001267f, 0.001317f, 0.001388f, 0.001459f, 0.001558f,
- 0.001630f, 0.001718f, 0.001804f, 0.001916f, 0.002033f, 0.002148f, 0.002295f, 0.002455f,
- 0.002583f, 0.002754f, 0.002941f, 0.003134f, 0.003386f, 0.003639f, 0.003910f, 0.004215f,
- 0.004597f, 0.005013f, 0.005520f, 0.006130f, 0.006821f, 0.007690f, 0.008789f, 0.010452f,
- 0.012909f, 0.016174f, 0.312012f, 0.390381f, 0.410645f, 0.420654f, 0.426270f, 0.430664f,
- 0.000057f, 0.000171f, 0.000164f, 0.000170f, 0.000211f, 0.000213f, 0.000229f, 0.000247f,
- 0.000267f, 0.000279f, 0.000289f, 0.000317f, 0.000349f, 0.000364f, 0.000390f, 0.000407f,
- 0.000427f, 0.000467f, 0.000476f, 0.000521f, 0.000537f, 0.000561f, 0.000578f, 0.000626f,
- 0.000667f, 0.000714f, 0.000729f, 0.000753f, 0.000806f, 0.000855f, 0.000911f, 0.000945f,
- 0.001004f, 0.001054f, 0.001112f, 0.001172f, 0.001251f, 0.001333f, 0.001406f, 0.001489f,
- 0.001595f, 0.001694f, 0.001811f, 0.001952f, 0.002090f, 0.002243f, 0.002453f, 0.002638f,
- 0.002888f, 0.003143f, 0.003489f, 0.003870f, 0.004353f, 0.004921f, 0.005672f, 0.006664f,
- 0.008423f, 0.011230f, 0.301758f, 0.381104f, 0.402832f, 0.413330f, 0.418457f, 0.423828f,
- 0.000096f, 0.000112f, 0.000097f, 0.000090f, 0.000113f, 0.000119f, 0.000144f, 0.000149f,
- 0.000151f, 0.000158f, 0.000181f, 0.000184f, 0.000179f, 0.000201f, 0.000224f, 0.000216f,
- 0.000237f, 0.000255f, 0.000263f, 0.000276f, 0.000297f, 0.000308f, 0.000332f, 0.000347f,
- 0.000369f, 0.000395f, 0.000408f, 0.000422f, 0.000447f, 0.000471f, 0.000500f, 0.000531f,
- 0.000554f, 0.000583f, 0.000617f, 0.000660f, 0.000690f, 0.000739f, 0.000795f, 0.000833f,
- 0.000885f, 0.000948f, 0.001022f, 0.001085f, 0.001175f, 0.001262f, 0.001371f, 0.001487f,
- 0.001633f, 0.001778f, 0.001986f, 0.002218f, 0.002502f, 0.002865f, 0.003330f, 0.003979f,
- 0.004932f, 0.007000f, 0.291260f, 0.372070f, 0.394043f, 0.404541f, 0.412109f, 0.416260f,
- 0.000000f, 0.000056f, 0.000049f, 0.000061f, 0.000064f, 0.000061f, 0.000062f, 0.000071f,
- 0.000072f, 0.000088f, 0.000083f, 0.000086f, 0.000097f, 0.000094f, 0.000098f, 0.000105f,
- 0.000116f, 0.000122f, 0.000126f, 0.000134f, 0.000137f, 0.000143f, 0.000150f, 0.000164f,
- 0.000171f, 0.000183f, 0.000188f, 0.000204f, 0.000214f, 0.000224f, 0.000236f, 0.000255f,
- 0.000258f, 0.000277f, 0.000293f, 0.000315f, 0.000328f, 0.000349f, 0.000376f, 0.000396f,
- 0.000426f, 0.000454f, 0.000486f, 0.000521f, 0.000563f, 0.000605f, 0.000657f, 0.000714f,
- 0.000791f, 0.000866f, 0.000977f, 0.001085f, 0.001243f, 0.001441f, 0.001703f, 0.002058f,
- 0.002573f, 0.003740f, 0.280029f, 0.362793f, 0.385742f, 0.397217f, 0.404297f, 0.408936f,
- 0.000058f, 0.000038f, 0.000031f, 0.000027f, 0.000025f, 0.000026f, 0.000025f, 0.000024f,
- 0.000024f, 0.000027f, 0.000030f, 0.000038f, 0.000032f, 0.000035f, 0.000040f, 0.000041f,
- 0.000044f, 0.000045f, 0.000045f, 0.000047f, 0.000052f, 0.000058f, 0.000061f, 0.000059f,
- 0.000065f, 0.000067f, 0.000069f, 0.000073f, 0.000078f, 0.000083f, 0.000089f, 0.000091f,
- 0.000099f, 0.000103f, 0.000106f, 0.000114f, 0.000124f, 0.000132f, 0.000141f, 0.000150f,
- 0.000158f, 0.000164f, 0.000180f, 0.000193f, 0.000205f, 0.000225f, 0.000245f, 0.000267f,
- 0.000297f, 0.000329f, 0.000365f, 0.000416f, 0.000479f, 0.000563f, 0.000676f, 0.000839f,
- 0.001088f, 0.001589f, 0.270264f, 0.353760f, 0.377197f, 0.390137f, 0.396973f, 0.402100f,
- 0.000030f, 0.000019f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000011f,
- 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000007f, 0.000009f,
- 0.000009f, 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000012f, 0.000014f,
- 0.000014f, 0.000014f, 0.000015f, 0.000018f, 0.000017f, 0.000017f, 0.000019f, 0.000020f,
- 0.000022f, 0.000022f, 0.000023f, 0.000026f, 0.000028f, 0.000027f, 0.000030f, 0.000032f,
- 0.000035f, 0.000038f, 0.000040f, 0.000042f, 0.000045f, 0.000049f, 0.000055f, 0.000060f,
- 0.000065f, 0.000074f, 0.000078f, 0.000095f, 0.000109f, 0.000129f, 0.000160f, 0.000205f,
- 0.000284f, 0.000452f, 0.259766f, 0.345703f, 0.369629f, 0.382812f, 0.390625f, 0.395264f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f,
- 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f,
- 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, 0.000006f, 0.000009f,
- 0.000012f, 0.000026f, 0.249878f, 0.336182f, 0.362061f, 0.374512f, 0.382080f, 0.387695f,
- }};
-
/* 4 different blue noise, one per channel */
const float blue_noise[64 * 64][4] = {
{0.367188f, 0.855469f, 0.523438f, 0.375000f}, {0.242188f, 0.699219f, 0.164062f, 0.292969f},
@@ -23031,3 +5554,17449 @@ const float blue_noise[64 * 64][4] = {
{0.621094f, 0.089844f, 0.500000f, 0.394531f}, {0.523438f, 0.644531f, 0.906250f, 0.773438f},
{0.796875f, 0.507812f, 0.203125f, 0.480469f}, {0.582031f, 0.042969f, 0.367188f, 0.710938f},
};
+
+const float bsdf_split_sum_ggx[64 * 64 * 2] = {
+ 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f,
+ 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f,
+ 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999512f, 0.000006f,
+ 0.999512f, 0.000011f, 0.999512f, 0.000020f, 0.999512f, 0.000034f, 0.999512f, 0.000057f,
+ 0.999512f, 0.000089f, 0.999023f, 0.000133f, 0.996582f, 0.000174f, 0.983887f, 0.000068f,
+ 0.983398f, 0.000099f, 0.982910f, 0.000140f, 0.982422f, 0.000192f, 0.980469f, 0.000251f,
+ 0.975098f, 0.000288f, 0.964844f, 0.000255f, 0.962402f, 0.000324f, 0.957520f, 0.000386f,
+ 0.947754f, 0.000402f, 0.939941f, 0.000443f, 0.931641f, 0.000499f, 0.919434f, 0.000515f,
+ 0.909668f, 0.000575f, 0.896484f, 0.000598f, 0.883789f, 0.000648f, 0.868652f, 0.000673f,
+ 0.854004f, 0.000715f, 0.837402f, 0.000743f, 0.819824f, 0.000767f, 0.801758f, 0.000795f,
+ 0.782715f, 0.000817f, 0.762695f, 0.000833f, 0.741699f, 0.000846f, 0.720703f, 0.000857f,
+ 0.698730f, 0.000864f, 0.676758f, 0.000868f, 0.654297f, 0.000868f, 0.631348f, 0.000865f,
+ 0.608887f, 0.000858f, 0.585938f, 0.000849f, 0.562988f, 0.000837f, 0.540527f, 0.000823f,
+ 0.518066f, 0.000807f, 0.496582f, 0.000789f, 0.474854f, 0.000769f, 0.453857f, 0.000748f,
+ 0.433350f, 0.000726f, 0.413086f, 0.000703f, 0.393799f, 0.000680f, 0.375000f, 0.000656f,
+ 0.356689f, 0.000632f, 0.339111f, 0.000607f, 0.322266f, 0.000584f, 0.306152f, 0.000559f,
+ 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f,
+ 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f,
+ 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999512f, 0.000006f,
+ 0.999512f, 0.000011f, 0.999512f, 0.000020f, 0.999512f, 0.000035f, 0.999512f, 0.000057f,
+ 0.999512f, 0.000090f, 0.999023f, 0.000134f, 0.996582f, 0.000174f, 0.983887f, 0.000069f,
+ 0.983398f, 0.000100f, 0.982910f, 0.000141f, 0.982422f, 0.000193f, 0.980469f, 0.000252f,
+ 0.975098f, 0.000288f, 0.964844f, 0.000259f, 0.962402f, 0.000326f, 0.957520f, 0.000387f,
+ 0.947754f, 0.000401f, 0.939941f, 0.000445f, 0.931641f, 0.000500f, 0.919922f, 0.000520f,
+ 0.909668f, 0.000576f, 0.896484f, 0.000603f, 0.883789f, 0.000650f, 0.869141f, 0.000678f,
+ 0.854004f, 0.000716f, 0.837402f, 0.000744f, 0.819824f, 0.000771f, 0.801758f, 0.000796f,
+ 0.782715f, 0.000818f, 0.762695f, 0.000835f, 0.741699f, 0.000849f, 0.720703f, 0.000860f,
+ 0.698730f, 0.000866f, 0.676758f, 0.000869f, 0.654297f, 0.000869f, 0.631348f, 0.000866f,
+ 0.608887f, 0.000859f, 0.585938f, 0.000850f, 0.562988f, 0.000838f, 0.540527f, 0.000824f,
+ 0.518555f, 0.000808f, 0.496582f, 0.000790f, 0.474854f, 0.000771f, 0.453857f, 0.000750f,
+ 0.433350f, 0.000728f, 0.413330f, 0.000704f, 0.393799f, 0.000681f, 0.375000f, 0.000657f,
+ 0.356689f, 0.000632f, 0.339111f, 0.000608f, 0.322266f, 0.000584f, 0.306152f, 0.000560f,
+ 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f,
+ 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f,
+ 0.999512f, 0.000001f, 0.999512f, 0.000002f, 0.999512f, 0.000003f, 0.999512f, 0.000006f,
+ 0.999512f, 0.000012f, 0.999512f, 0.000021f, 0.999512f, 0.000036f, 0.999512f, 0.000059f,
+ 0.999512f, 0.000093f, 0.999023f, 0.000138f, 0.996094f, 0.000172f, 0.984863f, 0.000086f,
+ 0.983398f, 0.000104f, 0.982910f, 0.000146f, 0.982422f, 0.000199f, 0.979980f, 0.000257f,
+ 0.974609f, 0.000288f, 0.965820f, 0.000278f, 0.962402f, 0.000334f, 0.957031f, 0.000392f,
+ 0.947754f, 0.000413f, 0.939453f, 0.000453f, 0.931152f, 0.000504f, 0.920410f, 0.000537f,
+ 0.909180f, 0.000582f, 0.896973f, 0.000619f, 0.883301f, 0.000656f, 0.869141f, 0.000693f,
+ 0.853516f, 0.000724f, 0.837402f, 0.000755f, 0.819824f, 0.000784f, 0.801270f, 0.000807f,
+ 0.782227f, 0.000827f, 0.762207f, 0.000845f, 0.741699f, 0.000860f, 0.720703f, 0.000870f,
+ 0.698730f, 0.000875f, 0.676758f, 0.000879f, 0.654297f, 0.000878f, 0.631348f, 0.000875f,
+ 0.608887f, 0.000868f, 0.585938f, 0.000858f, 0.562988f, 0.000846f, 0.540527f, 0.000831f,
+ 0.518555f, 0.000814f, 0.496582f, 0.000796f, 0.474854f, 0.000776f, 0.453857f, 0.000755f,
+ 0.433350f, 0.000732f, 0.413330f, 0.000709f, 0.393799f, 0.000685f, 0.375000f, 0.000661f,
+ 0.356934f, 0.000637f, 0.339355f, 0.000612f, 0.322510f, 0.000587f, 0.306396f, 0.000564f,
+ 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f,
+ 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f,
+ 0.999512f, 0.000001f, 0.999512f, 0.000002f, 0.999512f, 0.000004f, 0.999512f, 0.000008f,
+ 0.999512f, 0.000014f, 0.999512f, 0.000024f, 0.999512f, 0.000040f, 0.999512f, 0.000064f,
+ 0.999512f, 0.000098f, 0.999023f, 0.000143f, 0.995605f, 0.000165f, 0.986328f, 0.000105f,
+ 0.983398f, 0.000112f, 0.982910f, 0.000155f, 0.981934f, 0.000209f, 0.979980f, 0.000267f,
+ 0.974121f, 0.000285f, 0.966797f, 0.000300f, 0.961914f, 0.000347f, 0.956543f, 0.000401f,
+ 0.948242f, 0.000431f, 0.939453f, 0.000471f, 0.930664f, 0.000513f, 0.920410f, 0.000558f,
+ 0.908691f, 0.000592f, 0.896973f, 0.000638f, 0.883301f, 0.000670f, 0.869141f, 0.000711f,
+ 0.853516f, 0.000741f, 0.836914f, 0.000773f, 0.819824f, 0.000801f, 0.801270f, 0.000825f,
+ 0.782227f, 0.000846f, 0.762207f, 0.000863f, 0.741699f, 0.000875f, 0.720215f, 0.000885f,
+ 0.698730f, 0.000892f, 0.676758f, 0.000894f, 0.654297f, 0.000893f, 0.631348f, 0.000889f,
+ 0.608398f, 0.000881f, 0.585938f, 0.000871f, 0.562988f, 0.000858f, 0.540527f, 0.000843f,
+ 0.518555f, 0.000825f, 0.496582f, 0.000806f, 0.475098f, 0.000786f, 0.454102f, 0.000764f,
+ 0.433350f, 0.000741f, 0.413330f, 0.000717f, 0.394043f, 0.000693f, 0.375244f, 0.000669f,
+ 0.356934f, 0.000644f, 0.339600f, 0.000618f, 0.322754f, 0.000594f, 0.306641f, 0.000569f,
+ 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f,
+ 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f,
+ 0.999512f, 0.000003f, 0.999512f, 0.000004f, 0.999512f, 0.000006f, 0.999512f, 0.000010f,
+ 0.999512f, 0.000017f, 0.999512f, 0.000028f, 0.999512f, 0.000045f, 0.999512f, 0.000070f,
+ 0.999512f, 0.000106f, 0.999023f, 0.000152f, 0.994141f, 0.000151f, 0.987305f, 0.000122f,
+ 0.983398f, 0.000123f, 0.982910f, 0.000169f, 0.981934f, 0.000224f, 0.979492f, 0.000279f,
+ 0.973633f, 0.000294f, 0.967773f, 0.000324f, 0.961426f, 0.000365f, 0.955566f, 0.000411f,
+ 0.948242f, 0.000454f, 0.939941f, 0.000496f, 0.930176f, 0.000534f, 0.920410f, 0.000583f,
+ 0.908691f, 0.000617f, 0.896973f, 0.000663f, 0.883301f, 0.000698f, 0.868652f, 0.000734f,
+ 0.853516f, 0.000769f, 0.836914f, 0.000800f, 0.819336f, 0.000825f, 0.801270f, 0.000850f,
+ 0.782227f, 0.000871f, 0.762207f, 0.000887f, 0.741699f, 0.000900f, 0.720215f, 0.000909f,
+ 0.698730f, 0.000915f, 0.676270f, 0.000916f, 0.653809f, 0.000914f, 0.631348f, 0.000909f,
+ 0.608398f, 0.000900f, 0.585938f, 0.000889f, 0.562988f, 0.000875f, 0.540527f, 0.000859f,
+ 0.518555f, 0.000841f, 0.496826f, 0.000821f, 0.475342f, 0.000800f, 0.454102f, 0.000777f,
+ 0.433594f, 0.000753f, 0.413574f, 0.000729f, 0.394287f, 0.000704f, 0.375488f, 0.000678f,
+ 0.357178f, 0.000653f, 0.339844f, 0.000627f, 0.322998f, 0.000602f, 0.306885f, 0.000576f,
+ 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f,
+ 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000005f,
+ 0.999512f, 0.000006f, 0.999512f, 0.000007f, 0.999512f, 0.000010f, 0.999512f, 0.000015f,
+ 0.999512f, 0.000022f, 0.999512f, 0.000034f, 0.999512f, 0.000052f, 0.999512f, 0.000079f,
+ 0.999512f, 0.000117f, 0.998535f, 0.000163f, 0.993652f, 0.000150f, 0.988281f, 0.000138f,
+ 0.983398f, 0.000139f, 0.982910f, 0.000187f, 0.981934f, 0.000244f, 0.979004f, 0.000294f,
+ 0.973633f, 0.000312f, 0.968262f, 0.000352f, 0.961426f, 0.000392f, 0.955078f, 0.000430f,
+ 0.948242f, 0.000483f, 0.939453f, 0.000525f, 0.929688f, 0.000563f, 0.920410f, 0.000612f,
+ 0.908691f, 0.000652f, 0.896484f, 0.000691f, 0.883301f, 0.000733f, 0.868652f, 0.000767f,
+ 0.853027f, 0.000801f, 0.836426f, 0.000832f, 0.819336f, 0.000860f, 0.800781f, 0.000884f,
+ 0.781738f, 0.000903f, 0.761719f, 0.000919f, 0.741211f, 0.000931f, 0.720215f, 0.000938f,
+ 0.698242f, 0.000943f, 0.676270f, 0.000944f, 0.653809f, 0.000941f, 0.631348f, 0.000935f,
+ 0.608398f, 0.000925f, 0.585938f, 0.000913f, 0.562988f, 0.000898f, 0.541016f, 0.000881f,
+ 0.518555f, 0.000861f, 0.496826f, 0.000840f, 0.475342f, 0.000818f, 0.454346f, 0.000794f,
+ 0.433838f, 0.000769f, 0.413818f, 0.000743f, 0.394531f, 0.000718f, 0.375732f, 0.000691f,
+ 0.357666f, 0.000665f, 0.340088f, 0.000638f, 0.323242f, 0.000612f, 0.307129f, 0.000587f,
+ 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f,
+ 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000009f,
+ 0.999512f, 0.000010f, 0.999512f, 0.000012f, 0.999512f, 0.000015f, 0.999512f, 0.000021f,
+ 0.999512f, 0.000030f, 0.999512f, 0.000043f, 0.999512f, 0.000063f, 0.999512f, 0.000091f,
+ 0.999512f, 0.000131f, 0.998535f, 0.000177f, 0.993164f, 0.000157f, 0.988770f, 0.000157f,
+ 0.983398f, 0.000160f, 0.982910f, 0.000210f, 0.981445f, 0.000268f, 0.978516f, 0.000311f,
+ 0.973633f, 0.000338f, 0.968262f, 0.000386f, 0.961426f, 0.000426f, 0.954590f, 0.000461f,
+ 0.948242f, 0.000518f, 0.939453f, 0.000557f, 0.929688f, 0.000602f, 0.919922f, 0.000647f,
+ 0.908691f, 0.000694f, 0.895996f, 0.000731f, 0.882812f, 0.000773f, 0.868164f, 0.000809f,
+ 0.853027f, 0.000844f, 0.836426f, 0.000873f, 0.818848f, 0.000901f, 0.800781f, 0.000924f,
+ 0.781738f, 0.000944f, 0.761719f, 0.000959f, 0.741211f, 0.000969f, 0.719727f, 0.000977f,
+ 0.698242f, 0.000979f, 0.676270f, 0.000978f, 0.653809f, 0.000975f, 0.631348f, 0.000967f,
+ 0.608398f, 0.000956f, 0.585938f, 0.000942f, 0.563477f, 0.000926f, 0.541016f, 0.000907f,
+ 0.518555f, 0.000886f, 0.497070f, 0.000864f, 0.475586f, 0.000840f, 0.454590f, 0.000814f,
+ 0.434082f, 0.000789f, 0.414307f, 0.000762f, 0.394775f, 0.000735f, 0.376221f, 0.000708f,
+ 0.357910f, 0.000680f, 0.340576f, 0.000653f, 0.323730f, 0.000626f, 0.307617f, 0.000599f,
+ 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f,
+ 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000016f,
+ 0.999512f, 0.000017f, 0.999512f, 0.000020f, 0.999512f, 0.000024f, 0.999512f, 0.000030f,
+ 0.999512f, 0.000040f, 0.999512f, 0.000055f, 0.999512f, 0.000077f, 0.999512f, 0.000108f,
+ 0.999023f, 0.000150f, 0.998047f, 0.000193f, 0.993164f, 0.000170f, 0.989258f, 0.000180f,
+ 0.984375f, 0.000193f, 0.982422f, 0.000239f, 0.981445f, 0.000299f, 0.977539f, 0.000330f,
+ 0.973145f, 0.000371f, 0.968750f, 0.000425f, 0.961426f, 0.000463f, 0.954590f, 0.000501f,
+ 0.947754f, 0.000560f, 0.939453f, 0.000602f, 0.929688f, 0.000650f, 0.919434f, 0.000693f,
+ 0.908203f, 0.000742f, 0.895508f, 0.000782f, 0.882324f, 0.000822f, 0.867676f, 0.000860f,
+ 0.852539f, 0.000894f, 0.835938f, 0.000925f, 0.818359f, 0.000951f, 0.800293f, 0.000973f,
+ 0.781250f, 0.000992f, 0.761230f, 0.001005f, 0.740723f, 0.001016f, 0.719727f, 0.001021f,
+ 0.697754f, 0.001022f, 0.675781f, 0.001020f, 0.653809f, 0.001015f, 0.631348f, 0.001005f,
+ 0.608398f, 0.000993f, 0.585938f, 0.000977f, 0.563477f, 0.000958f, 0.541016f, 0.000938f,
+ 0.519043f, 0.000916f, 0.497314f, 0.000892f, 0.475830f, 0.000866f, 0.454834f, 0.000840f,
+ 0.434570f, 0.000812f, 0.414551f, 0.000784f, 0.395264f, 0.000755f, 0.376465f, 0.000727f,
+ 0.358398f, 0.000698f, 0.341064f, 0.000669f, 0.324219f, 0.000641f, 0.308105f, 0.000613f,
+ 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f,
+ 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f,
+ 0.999512f, 0.000028f, 0.999512f, 0.000031f, 0.999512f, 0.000036f, 0.999512f, 0.000044f,
+ 0.999512f, 0.000055f, 0.999512f, 0.000072f, 0.999512f, 0.000096f, 0.999512f, 0.000130f,
+ 0.999023f, 0.000175f, 0.997559f, 0.000208f, 0.993164f, 0.000191f, 0.989746f, 0.000208f,
+ 0.985352f, 0.000232f, 0.982422f, 0.000275f, 0.980957f, 0.000335f, 0.977051f, 0.000362f,
+ 0.973145f, 0.000413f, 0.968750f, 0.000471f, 0.961426f, 0.000505f, 0.954102f, 0.000551f,
+ 0.947266f, 0.000607f, 0.938965f, 0.000657f, 0.929688f, 0.000705f, 0.918945f, 0.000750f,
+ 0.907715f, 0.000797f, 0.895508f, 0.000842f, 0.881836f, 0.000882f, 0.867676f, 0.000920f,
+ 0.852051f, 0.000952f, 0.835449f, 0.000984f, 0.817871f, 0.001010f, 0.799805f, 0.001032f,
+ 0.780762f, 0.001049f, 0.760742f, 0.001062f, 0.740234f, 0.001071f, 0.719238f, 0.001074f,
+ 0.697754f, 0.001074f, 0.675781f, 0.001070f, 0.653320f, 0.001061f, 0.630859f, 0.001050f,
+ 0.608398f, 0.001036f, 0.585938f, 0.001018f, 0.563477f, 0.000998f, 0.541016f, 0.000975f,
+ 0.519043f, 0.000950f, 0.497559f, 0.000925f, 0.476074f, 0.000897f, 0.455322f, 0.000868f,
+ 0.434814f, 0.000839f, 0.415039f, 0.000809f, 0.395752f, 0.000779f, 0.376953f, 0.000749f,
+ 0.358887f, 0.000719f, 0.341553f, 0.000689f, 0.324707f, 0.000659f, 0.308594f, 0.000630f,
+ 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f,
+ 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000042f,
+ 0.999512f, 0.000044f, 0.999512f, 0.000048f, 0.999512f, 0.000054f, 0.999512f, 0.000062f,
+ 0.999512f, 0.000075f, 0.999512f, 0.000094f, 0.999512f, 0.000121f, 0.999512f, 0.000158f,
+ 0.999023f, 0.000206f, 0.996582f, 0.000219f, 0.993164f, 0.000219f, 0.990234f, 0.000243f,
+ 0.986328f, 0.000276f, 0.982422f, 0.000320f, 0.980469f, 0.000377f, 0.976562f, 0.000407f,
+ 0.973145f, 0.000465f, 0.968262f, 0.000524f, 0.961426f, 0.000562f, 0.954102f, 0.000614f,
+ 0.946777f, 0.000663f, 0.938965f, 0.000721f, 0.929199f, 0.000769f, 0.918457f, 0.000818f,
+ 0.907227f, 0.000865f, 0.895020f, 0.000910f, 0.881348f, 0.000951f, 0.867188f, 0.000991f,
+ 0.851562f, 0.001023f, 0.834961f, 0.001053f, 0.817383f, 0.001079f, 0.799316f, 0.001100f,
+ 0.780273f, 0.001115f, 0.760254f, 0.001127f, 0.739746f, 0.001133f, 0.718750f, 0.001136f,
+ 0.697266f, 0.001133f, 0.675293f, 0.001126f, 0.653320f, 0.001117f, 0.630859f, 0.001102f,
+ 0.608398f, 0.001085f, 0.585938f, 0.001065f, 0.563477f, 0.001042f, 0.541016f, 0.001018f,
+ 0.519531f, 0.000991f, 0.497803f, 0.000962f, 0.476562f, 0.000932f, 0.455566f, 0.000902f,
+ 0.435303f, 0.000870f, 0.415527f, 0.000839f, 0.396240f, 0.000806f, 0.377686f, 0.000774f,
+ 0.359619f, 0.000742f, 0.342041f, 0.000711f, 0.325439f, 0.000680f, 0.309326f, 0.000649f,
+ 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f,
+ 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000063f,
+ 0.999512f, 0.000066f, 0.999512f, 0.000071f, 0.999512f, 0.000077f, 0.999512f, 0.000088f,
+ 0.999512f, 0.000102f, 0.999512f, 0.000124f, 0.999512f, 0.000153f, 0.999512f, 0.000194f,
+ 0.999023f, 0.000245f, 0.995605f, 0.000245f, 0.993164f, 0.000256f, 0.990234f, 0.000287f,
+ 0.986816f, 0.000329f, 0.981934f, 0.000374f, 0.979492f, 0.000424f, 0.976074f, 0.000462f,
+ 0.972656f, 0.000527f, 0.967773f, 0.000584f, 0.961426f, 0.000630f, 0.954102f, 0.000687f,
+ 0.946289f, 0.000734f, 0.938477f, 0.000796f, 0.928711f, 0.000846f, 0.917969f, 0.000896f,
+ 0.906738f, 0.000946f, 0.894531f, 0.000991f, 0.880859f, 0.001032f, 0.866211f, 0.001071f,
+ 0.851074f, 0.001105f, 0.834473f, 0.001134f, 0.816895f, 0.001159f, 0.798828f, 0.001178f,
+ 0.779785f, 0.001193f, 0.759766f, 0.001202f, 0.739258f, 0.001206f, 0.718262f, 0.001206f,
+ 0.696777f, 0.001201f, 0.675293f, 0.001191f, 0.652832f, 0.001179f, 0.630859f, 0.001162f,
+ 0.608398f, 0.001142f, 0.585938f, 0.001119f, 0.563477f, 0.001093f, 0.541504f, 0.001065f,
+ 0.519531f, 0.001036f, 0.498047f, 0.001005f, 0.476807f, 0.000973f, 0.456055f, 0.000939f,
+ 0.435791f, 0.000906f, 0.416016f, 0.000872f, 0.396973f, 0.000838f, 0.378174f, 0.000803f,
+ 0.360352f, 0.000770f, 0.342773f, 0.000737f, 0.326172f, 0.000704f, 0.310059f, 0.000672f,
+ 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f,
+ 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000092f,
+ 0.999512f, 0.000096f, 0.999512f, 0.000101f, 0.999512f, 0.000109f, 0.999512f, 0.000121f,
+ 0.999512f, 0.000138f, 0.999512f, 0.000162f, 0.999512f, 0.000195f, 0.999512f, 0.000240f,
+ 0.998535f, 0.000293f, 0.995605f, 0.000285f, 0.992676f, 0.000303f, 0.990234f, 0.000341f,
+ 0.987305f, 0.000391f, 0.982422f, 0.000442f, 0.979004f, 0.000477f, 0.976074f, 0.000531f,
+ 0.972656f, 0.000600f, 0.967285f, 0.000652f, 0.961426f, 0.000711f, 0.954102f, 0.000769f,
+ 0.945312f, 0.000819f, 0.937988f, 0.000881f, 0.928711f, 0.000937f, 0.917480f, 0.000987f,
+ 0.905762f, 0.001037f, 0.894043f, 0.001085f, 0.880371f, 0.001127f, 0.865723f, 0.001163f,
+ 0.850098f, 0.001198f, 0.833496f, 0.001225f, 0.816406f, 0.001249f, 0.798340f, 0.001266f,
+ 0.779297f, 0.001280f, 0.759277f, 0.001287f, 0.738770f, 0.001288f, 0.717773f, 0.001286f,
+ 0.696777f, 0.001278f, 0.674805f, 0.001266f, 0.652832f, 0.001248f, 0.630371f, 0.001229f,
+ 0.608398f, 0.001205f, 0.585938f, 0.001180f, 0.563477f, 0.001150f, 0.541504f, 0.001120f,
+ 0.520020f, 0.001087f, 0.498535f, 0.001053f, 0.477295f, 0.001018f, 0.456543f, 0.000982f,
+ 0.436279f, 0.000946f, 0.416748f, 0.000909f, 0.397461f, 0.000872f, 0.378906f, 0.000836f,
+ 0.361084f, 0.000800f, 0.343506f, 0.000765f, 0.326904f, 0.000731f, 0.310791f, 0.000697f,
+ 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f,
+ 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000131f,
+ 0.999512f, 0.000135f, 0.999512f, 0.000142f, 0.999512f, 0.000151f, 0.999512f, 0.000164f,
+ 0.999512f, 0.000184f, 0.999512f, 0.000210f, 0.999512f, 0.000247f, 0.999023f, 0.000296f,
+ 0.998535f, 0.000350f, 0.995117f, 0.000337f, 0.992676f, 0.000364f, 0.990723f, 0.000408f,
+ 0.987793f, 0.000465f, 0.982910f, 0.000521f, 0.978027f, 0.000550f, 0.975586f, 0.000614f,
+ 0.972168f, 0.000687f, 0.966797f, 0.000738f, 0.960938f, 0.000806f, 0.953613f, 0.000861f,
+ 0.945312f, 0.000921f, 0.937012f, 0.000978f, 0.928223f, 0.001041f, 0.917480f, 0.001094f,
+ 0.905273f, 0.001142f, 0.893066f, 0.001192f, 0.879883f, 0.001235f, 0.864746f, 0.001272f,
+ 0.849609f, 0.001305f, 0.833008f, 0.001332f, 0.815918f, 0.001353f, 0.797363f, 0.001369f,
+ 0.778320f, 0.001378f, 0.758789f, 0.001383f, 0.738281f, 0.001382f, 0.717773f, 0.001375f,
+ 0.696289f, 0.001364f, 0.674316f, 0.001348f, 0.652344f, 0.001328f, 0.630371f, 0.001305f,
+ 0.607910f, 0.001277f, 0.585938f, 0.001247f, 0.563965f, 0.001215f, 0.541992f, 0.001181f,
+ 0.520020f, 0.001144f, 0.498779f, 0.001106f, 0.477783f, 0.001068f, 0.457275f, 0.001029f,
+ 0.437012f, 0.000990f, 0.417480f, 0.000951f, 0.398193f, 0.000911f, 0.379639f, 0.000873f,
+ 0.361816f, 0.000834f, 0.344482f, 0.000796f, 0.327637f, 0.000760f, 0.311768f, 0.000724f,
+ 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f,
+ 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000181f,
+ 0.999512f, 0.000186f, 0.999512f, 0.000193f, 0.999512f, 0.000204f, 0.999512f, 0.000220f,
+ 0.999512f, 0.000242f, 0.999512f, 0.000272f, 0.999023f, 0.000313f, 0.999023f, 0.000366f,
+ 0.998047f, 0.000414f, 0.994629f, 0.000404f, 0.992676f, 0.000438f, 0.990723f, 0.000489f,
+ 0.987793f, 0.000553f, 0.983398f, 0.000611f, 0.977539f, 0.000640f, 0.975098f, 0.000713f,
+ 0.971680f, 0.000786f, 0.966309f, 0.000842f, 0.960938f, 0.000916f, 0.953613f, 0.000973f,
+ 0.945312f, 0.001039f, 0.936035f, 0.001096f, 0.927246f, 0.001159f, 0.916992f, 0.001216f,
+ 0.904785f, 0.001266f, 0.892090f, 0.001312f, 0.878906f, 0.001357f, 0.864258f, 0.001394f,
+ 0.848633f, 0.001426f, 0.832520f, 0.001451f, 0.814941f, 0.001470f, 0.796875f, 0.001483f,
+ 0.777832f, 0.001490f, 0.758301f, 0.001491f, 0.737793f, 0.001486f, 0.716797f, 0.001476f,
+ 0.695801f, 0.001460f, 0.674316f, 0.001440f, 0.652344f, 0.001416f, 0.630371f, 0.001389f,
+ 0.607910f, 0.001357f, 0.585938f, 0.001323f, 0.563965f, 0.001287f, 0.541992f, 0.001247f,
+ 0.520508f, 0.001207f, 0.499268f, 0.001166f, 0.478271f, 0.001124f, 0.457764f, 0.001081f,
+ 0.437744f, 0.001040f, 0.418213f, 0.000997f, 0.399170f, 0.000955f, 0.380615f, 0.000913f,
+ 0.362793f, 0.000872f, 0.345459f, 0.000832f, 0.328613f, 0.000793f, 0.312744f, 0.000754f,
+ 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f,
+ 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000245f,
+ 0.999512f, 0.000251f, 0.999512f, 0.000259f, 0.999512f, 0.000272f, 0.999512f, 0.000289f,
+ 0.999512f, 0.000314f, 0.999512f, 0.000348f, 0.999023f, 0.000394f, 0.999023f, 0.000452f,
+ 0.997070f, 0.000480f, 0.994629f, 0.000487f, 0.992676f, 0.000528f, 0.990723f, 0.000587f,
+ 0.987793f, 0.000658f, 0.983398f, 0.000711f, 0.977051f, 0.000749f, 0.974609f, 0.000830f,
+ 0.970703f, 0.000898f, 0.965820f, 0.000966f, 0.960449f, 0.001040f, 0.953125f, 0.001104f,
+ 0.944824f, 0.001170f, 0.935547f, 0.001232f, 0.926270f, 0.001294f, 0.916016f, 0.001354f,
+ 0.904297f, 0.001408f, 0.891602f, 0.001453f, 0.877930f, 0.001496f, 0.863770f, 0.001533f,
+ 0.847656f, 0.001561f, 0.831543f, 0.001585f, 0.813965f, 0.001601f, 0.795898f, 0.001612f,
+ 0.776855f, 0.001616f, 0.757324f, 0.001612f, 0.737305f, 0.001603f, 0.716309f, 0.001588f,
+ 0.695312f, 0.001568f, 0.673828f, 0.001544f, 0.651855f, 0.001514f, 0.629883f, 0.001482f,
+ 0.607910f, 0.001446f, 0.585938f, 0.001407f, 0.563965f, 0.001366f, 0.542480f, 0.001323f,
+ 0.520996f, 0.001278f, 0.499756f, 0.001232f, 0.478760f, 0.001186f, 0.458496f, 0.001140f,
+ 0.438477f, 0.001094f, 0.418945f, 0.001047f, 0.399902f, 0.001002f, 0.381592f, 0.000957f,
+ 0.363770f, 0.000913f, 0.346436f, 0.000870f, 0.329834f, 0.000828f, 0.313721f, 0.000788f,
+ 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f,
+ 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000326f,
+ 0.999512f, 0.000332f, 0.999512f, 0.000342f, 0.999512f, 0.000356f, 0.999512f, 0.000376f,
+ 0.999023f, 0.000404f, 0.999023f, 0.000442f, 0.999023f, 0.000493f, 0.998535f, 0.000556f,
+ 0.996582f, 0.000569f, 0.994141f, 0.000590f, 0.992676f, 0.000638f, 0.990723f, 0.000705f,
+ 0.988281f, 0.000782f, 0.983398f, 0.000825f, 0.977539f, 0.000883f, 0.974121f, 0.000966f,
+ 0.969727f, 0.001030f, 0.965332f, 0.001111f, 0.959473f, 0.001182f, 0.952637f, 0.001257f,
+ 0.944336f, 0.001322f, 0.935059f, 0.001389f, 0.925781f, 0.001451f, 0.915527f, 0.001511f,
+ 0.903809f, 0.001565f, 0.890625f, 0.001612f, 0.876953f, 0.001654f, 0.862793f, 0.001689f,
+ 0.847168f, 0.001716f, 0.830566f, 0.001737f, 0.813477f, 0.001750f, 0.794922f, 0.001755f,
+ 0.776367f, 0.001755f, 0.756348f, 0.001746f, 0.736328f, 0.001733f, 0.715820f, 0.001713f,
+ 0.694824f, 0.001688f, 0.673340f, 0.001657f, 0.651855f, 0.001623f, 0.629883f, 0.001585f,
+ 0.607910f, 0.001543f, 0.585938f, 0.001499f, 0.564453f, 0.001452f, 0.542480f, 0.001404f,
+ 0.520996f, 0.001355f, 0.500000f, 0.001306f, 0.479492f, 0.001255f, 0.459229f, 0.001204f,
+ 0.439209f, 0.001154f, 0.419678f, 0.001103f, 0.400879f, 0.001054f, 0.382568f, 0.001005f,
+ 0.364746f, 0.000958f, 0.347412f, 0.000913f, 0.330811f, 0.000868f, 0.314941f, 0.000825f,
+ 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f,
+ 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000426f,
+ 0.999512f, 0.000433f, 0.999512f, 0.000445f, 0.999023f, 0.000461f, 0.999023f, 0.000484f,
+ 0.999023f, 0.000515f, 0.999023f, 0.000557f, 0.999023f, 0.000613f, 0.998535f, 0.000681f,
+ 0.996094f, 0.000683f, 0.994141f, 0.000715f, 0.992676f, 0.000771f, 0.990723f, 0.000845f,
+ 0.987793f, 0.000926f, 0.983398f, 0.000968f, 0.978027f, 0.001040f, 0.973633f, 0.001123f,
+ 0.969238f, 0.001190f, 0.964844f, 0.001278f, 0.958984f, 0.001349f, 0.952148f, 0.001431f,
+ 0.943848f, 0.001499f, 0.934570f, 0.001565f, 0.924316f, 0.001631f, 0.914551f, 0.001692f,
+ 0.902832f, 0.001745f, 0.889648f, 0.001791f, 0.875977f, 0.001829f, 0.861816f, 0.001863f,
+ 0.846191f, 0.001888f, 0.829590f, 0.001904f, 0.812500f, 0.001915f, 0.793945f, 0.001915f,
+ 0.775391f, 0.001910f, 0.755859f, 0.001897f, 0.735840f, 0.001877f, 0.715332f, 0.001851f,
+ 0.694336f, 0.001820f, 0.672852f, 0.001783f, 0.651367f, 0.001743f, 0.629395f, 0.001698f,
+ 0.607910f, 0.001651f, 0.585938f, 0.001600f, 0.564453f, 0.001549f, 0.542969f, 0.001495f,
+ 0.521484f, 0.001440f, 0.500488f, 0.001385f, 0.480225f, 0.001329f, 0.459961f, 0.001274f,
+ 0.440186f, 0.001219f, 0.420654f, 0.001164f, 0.401855f, 0.001111f, 0.383545f, 0.001060f,
+ 0.365967f, 0.001009f, 0.348633f, 0.000959f, 0.332031f, 0.000912f, 0.316162f, 0.000866f,
+ 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f,
+ 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000549f,
+ 0.999023f, 0.000557f, 0.999023f, 0.000570f, 0.999023f, 0.000588f, 0.999023f, 0.000614f,
+ 0.999023f, 0.000649f, 0.999023f, 0.000696f, 0.998535f, 0.000758f, 0.998047f, 0.000828f,
+ 0.995605f, 0.000824f, 0.993652f, 0.000865f, 0.992188f, 0.000930f, 0.990723f, 0.001012f,
+ 0.987793f, 0.001093f, 0.983398f, 0.001141f, 0.978027f, 0.001224f, 0.972656f, 0.001304f,
+ 0.968750f, 0.001380f, 0.963867f, 0.001470f, 0.958008f, 0.001546f, 0.951660f, 0.001627f,
+ 0.943359f, 0.001702f, 0.934082f, 0.001769f, 0.923340f, 0.001833f, 0.913574f, 0.001896f,
+ 0.901855f, 0.001949f, 0.889160f, 0.001995f, 0.875000f, 0.002031f, 0.860352f, 0.002062f,
+ 0.845215f, 0.002083f, 0.828613f, 0.002094f, 0.811035f, 0.002098f, 0.792969f, 0.002094f,
+ 0.774414f, 0.002081f, 0.754883f, 0.002062f, 0.734863f, 0.002035f, 0.714355f, 0.002003f,
+ 0.693359f, 0.001965f, 0.672363f, 0.001923f, 0.650879f, 0.001874f, 0.629395f, 0.001823f,
+ 0.607910f, 0.001769f, 0.585938f, 0.001712f, 0.564453f, 0.001654f, 0.543457f, 0.001595f,
+ 0.521973f, 0.001534f, 0.501465f, 0.001472f, 0.480957f, 0.001410f, 0.460693f, 0.001350f,
+ 0.440918f, 0.001290f, 0.421875f, 0.001232f, 0.403076f, 0.001174f, 0.384766f, 0.001118f,
+ 0.367188f, 0.001062f, 0.349854f, 0.001010f, 0.333496f, 0.000958f, 0.317383f, 0.000909f,
+ 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f,
+ 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000699f,
+ 0.999023f, 0.000708f, 0.999023f, 0.000723f, 0.999023f, 0.000743f, 0.999023f, 0.000772f,
+ 0.999023f, 0.000811f, 0.998535f, 0.000864f, 0.998535f, 0.000931f, 0.997559f, 0.000999f,
+ 0.995117f, 0.000996f, 0.993652f, 0.001045f, 0.992188f, 0.001119f, 0.990234f, 0.001207f,
+ 0.987305f, 0.001283f, 0.982910f, 0.001344f, 0.978516f, 0.001436f, 0.971680f, 0.001508f,
+ 0.967773f, 0.001599f, 0.962891f, 0.001686f, 0.957520f, 0.001774f, 0.950684f, 0.001852f,
+ 0.942871f, 0.001933f, 0.933105f, 0.002003f, 0.922852f, 0.002066f, 0.912109f, 0.002125f,
+ 0.900879f, 0.002178f, 0.888184f, 0.002222f, 0.874023f, 0.002254f, 0.859375f, 0.002281f,
+ 0.843750f, 0.002296f, 0.827148f, 0.002304f, 0.810059f, 0.002302f, 0.791992f, 0.002293f,
+ 0.773438f, 0.002272f, 0.753906f, 0.002247f, 0.733887f, 0.002213f, 0.713867f, 0.002172f,
+ 0.692871f, 0.002125f, 0.671875f, 0.002073f, 0.650391f, 0.002018f, 0.629395f, 0.001961f,
+ 0.607910f, 0.001899f, 0.586426f, 0.001835f, 0.564941f, 0.001769f, 0.543457f, 0.001701f,
+ 0.522461f, 0.001635f, 0.501953f, 0.001567f, 0.481689f, 0.001500f, 0.461670f, 0.001433f,
+ 0.441895f, 0.001369f, 0.422852f, 0.001305f, 0.404053f, 0.001242f, 0.385986f, 0.001181f,
+ 0.368408f, 0.001122f, 0.351318f, 0.001065f, 0.334717f, 0.001010f, 0.318848f, 0.000957f,
+ 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f,
+ 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000879f,
+ 0.999023f, 0.000890f, 0.999023f, 0.000906f, 0.998535f, 0.000930f, 0.998535f, 0.000962f,
+ 0.998535f, 0.001005f, 0.998535f, 0.001063f, 0.998047f, 0.001138f, 0.997070f, 0.001189f,
+ 0.994629f, 0.001201f, 0.993164f, 0.001258f, 0.991699f, 0.001341f, 0.990234f, 0.001437f,
+ 0.986816f, 0.001500f, 0.982910f, 0.001581f, 0.978516f, 0.001681f, 0.971680f, 0.001753f,
+ 0.967285f, 0.001852f, 0.961914f, 0.001937f, 0.956543f, 0.002033f, 0.949707f, 0.002113f,
+ 0.941895f, 0.002190f, 0.932617f, 0.002268f, 0.921875f, 0.002331f, 0.910645f, 0.002388f,
+ 0.899414f, 0.002438f, 0.886719f, 0.002478f, 0.873047f, 0.002508f, 0.857910f, 0.002527f,
+ 0.842773f, 0.002539f, 0.826172f, 0.002539f, 0.808594f, 0.002529f, 0.791016f, 0.002512f,
+ 0.772461f, 0.002485f, 0.752930f, 0.002449f, 0.733398f, 0.002407f, 0.712891f, 0.002357f,
+ 0.692383f, 0.002302f, 0.671387f, 0.002241f, 0.650391f, 0.002178f, 0.628906f, 0.002110f,
+ 0.607422f, 0.002039f, 0.586426f, 0.001966f, 0.564941f, 0.001894f, 0.543945f, 0.001820f,
+ 0.522949f, 0.001745f, 0.502441f, 0.001671f, 0.482422f, 0.001597f, 0.462646f, 0.001525f,
+ 0.443115f, 0.001453f, 0.424072f, 0.001384f, 0.405518f, 0.001316f, 0.387451f, 0.001250f,
+ 0.369873f, 0.001186f, 0.352783f, 0.001124f, 0.336182f, 0.001065f, 0.320312f, 0.001009f,
+ 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f,
+ 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001096f,
+ 0.998535f, 0.001108f, 0.998535f, 0.001126f, 0.998535f, 0.001152f, 0.998535f, 0.001188f,
+ 0.998535f, 0.001237f, 0.998047f, 0.001301f, 0.998047f, 0.001381f, 0.996094f, 0.001410f,
+ 0.994141f, 0.001442f, 0.993164f, 0.001511f, 0.991699f, 0.001602f, 0.989746f, 0.001703f,
+ 0.986328f, 0.001763f, 0.982910f, 0.001861f, 0.978027f, 0.001961f, 0.971680f, 0.002041f,
+ 0.966309f, 0.002142f, 0.960938f, 0.002230f, 0.955566f, 0.002325f, 0.948730f, 0.002413f,
+ 0.940918f, 0.002491f, 0.931641f, 0.002563f, 0.920898f, 0.002628f, 0.909668f, 0.002684f,
+ 0.897949f, 0.002729f, 0.885742f, 0.002766f, 0.871582f, 0.002790f, 0.856934f, 0.002804f,
+ 0.841309f, 0.002806f, 0.824707f, 0.002800f, 0.807617f, 0.002783f, 0.789551f, 0.002754f,
+ 0.770996f, 0.002718f, 0.751953f, 0.002672f, 0.732422f, 0.002621f, 0.711914f, 0.002562f,
+ 0.691406f, 0.002497f, 0.670898f, 0.002426f, 0.649902f, 0.002352f, 0.628906f, 0.002274f,
+ 0.607422f, 0.002193f, 0.586426f, 0.002113f, 0.565430f, 0.002031f, 0.544434f, 0.001948f,
+ 0.523926f, 0.001866f, 0.503418f, 0.001784f, 0.483398f, 0.001703f, 0.463623f, 0.001623f,
+ 0.444092f, 0.001546f, 0.425293f, 0.001470f, 0.406738f, 0.001396f, 0.388672f, 0.001325f,
+ 0.371338f, 0.001256f, 0.354248f, 0.001190f, 0.337891f, 0.001126f, 0.322021f, 0.001065f,
+ 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f,
+ 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001354f,
+ 0.998535f, 0.001368f, 0.998535f, 0.001389f, 0.998047f, 0.001417f, 0.998047f, 0.001457f,
+ 0.998047f, 0.001511f, 0.998047f, 0.001581f, 0.997559f, 0.001668f, 0.995605f, 0.001684f,
+ 0.994141f, 0.001730f, 0.992676f, 0.001808f, 0.991211f, 0.001908f, 0.989258f, 0.002010f,
+ 0.985840f, 0.002073f, 0.982422f, 0.002182f, 0.978027f, 0.002279f, 0.971680f, 0.002373f,
+ 0.964844f, 0.002470f, 0.959961f, 0.002567f, 0.954102f, 0.002657f, 0.947754f, 0.002750f,
+ 0.939941f, 0.002831f, 0.930664f, 0.002901f, 0.919922f, 0.002962f, 0.908691f, 0.003014f,
+ 0.896484f, 0.003056f, 0.884277f, 0.003088f, 0.870605f, 0.003105f, 0.855469f, 0.003111f,
+ 0.839355f, 0.003105f, 0.823242f, 0.003088f, 0.806152f, 0.003061f, 0.788086f, 0.003023f,
+ 0.770020f, 0.002975f, 0.750977f, 0.002920f, 0.730957f, 0.002855f, 0.711426f, 0.002785f,
+ 0.690918f, 0.002708f, 0.670410f, 0.002626f, 0.649414f, 0.002541f, 0.628418f, 0.002453f,
+ 0.607422f, 0.002363f, 0.586426f, 0.002272f, 0.565918f, 0.002180f, 0.544922f, 0.002089f,
+ 0.524414f, 0.001995f, 0.504395f, 0.001906f, 0.484375f, 0.001818f, 0.464600f, 0.001731f,
+ 0.445312f, 0.001646f, 0.426514f, 0.001563f, 0.408203f, 0.001483f, 0.390381f, 0.001406f,
+ 0.372803f, 0.001332f, 0.355957f, 0.001261f, 0.339600f, 0.001192f, 0.323730f, 0.001126f,
+ 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f,
+ 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001660f,
+ 0.998047f, 0.001676f, 0.998047f, 0.001698f, 0.998047f, 0.001730f, 0.998047f, 0.001775f,
+ 0.997559f, 0.001834f, 0.997559f, 0.001911f, 0.997070f, 0.002003f, 0.994629f, 0.002008f,
+ 0.993652f, 0.002064f, 0.992188f, 0.002155f, 0.990723f, 0.002264f, 0.988281f, 0.002357f,
+ 0.985352f, 0.002436f, 0.981934f, 0.002554f, 0.977051f, 0.002642f, 0.971680f, 0.002752f,
+ 0.964355f, 0.002844f, 0.958984f, 0.002951f, 0.953125f, 0.003044f, 0.946289f, 0.003130f,
+ 0.938477f, 0.003214f, 0.929199f, 0.003284f, 0.918945f, 0.003342f, 0.907227f, 0.003389f,
+ 0.895020f, 0.003424f, 0.882324f, 0.003447f, 0.868652f, 0.003456f, 0.854004f, 0.003452f,
+ 0.838379f, 0.003437f, 0.821777f, 0.003408f, 0.804688f, 0.003368f, 0.787109f, 0.003319f,
+ 0.768555f, 0.003258f, 0.749512f, 0.003189f, 0.729980f, 0.003113f, 0.710449f, 0.003029f,
+ 0.690430f, 0.002939f, 0.669434f, 0.002846f, 0.648926f, 0.002748f, 0.628418f, 0.002647f,
+ 0.607422f, 0.002546f, 0.586914f, 0.002443f, 0.565918f, 0.002342f, 0.545410f, 0.002239f,
+ 0.525391f, 0.002138f, 0.504883f, 0.002039f, 0.485352f, 0.001942f, 0.465820f, 0.001846f,
+ 0.446777f, 0.001754f, 0.427979f, 0.001664f, 0.409668f, 0.001577f, 0.391846f, 0.001494f,
+ 0.374512f, 0.001413f, 0.357666f, 0.001337f, 0.341309f, 0.001264f, 0.325439f, 0.001193f,
+ 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f,
+ 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002020f,
+ 0.997559f, 0.002037f, 0.997559f, 0.002062f, 0.997559f, 0.002098f, 0.997559f, 0.002148f,
+ 0.997070f, 0.002213f, 0.997070f, 0.002296f, 0.996582f, 0.002390f, 0.994141f, 0.002390f,
+ 0.993164f, 0.002460f, 0.991699f, 0.002558f, 0.990234f, 0.002676f, 0.987793f, 0.002754f,
+ 0.984863f, 0.002857f, 0.981445f, 0.002977f, 0.976562f, 0.003069f, 0.971191f, 0.003185f,
+ 0.964355f, 0.003281f, 0.957520f, 0.003384f, 0.951660f, 0.003483f, 0.944824f, 0.003569f,
+ 0.937012f, 0.003643f, 0.927734f, 0.003712f, 0.917480f, 0.003765f, 0.906250f, 0.003805f,
+ 0.893555f, 0.003834f, 0.880859f, 0.003847f, 0.867188f, 0.003847f, 0.852539f, 0.003832f,
+ 0.836914f, 0.003803f, 0.820312f, 0.003761f, 0.803223f, 0.003710f, 0.785645f, 0.003643f,
+ 0.767090f, 0.003569f, 0.748535f, 0.003485f, 0.729004f, 0.003395f, 0.709473f, 0.003296f,
+ 0.689453f, 0.003193f, 0.668945f, 0.003084f, 0.648438f, 0.002974f, 0.627930f, 0.002861f,
+ 0.607422f, 0.002747f, 0.586914f, 0.002632f, 0.566406f, 0.002518f, 0.545898f, 0.002403f,
+ 0.525879f, 0.002293f, 0.505859f, 0.002184f, 0.486572f, 0.002075f, 0.467041f, 0.001972f,
+ 0.447998f, 0.001871f, 0.429443f, 0.001774f, 0.411377f, 0.001679f, 0.393555f, 0.001589f,
+ 0.376221f, 0.001502f, 0.359375f, 0.001419f, 0.343262f, 0.001340f, 0.327393f, 0.001265f,
+ 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f,
+ 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002443f,
+ 0.997070f, 0.002462f, 0.997070f, 0.002489f, 0.997070f, 0.002529f, 0.997070f, 0.002583f,
+ 0.997070f, 0.002655f, 0.996582f, 0.002747f, 0.995605f, 0.002827f, 0.993652f, 0.002840f,
+ 0.992188f, 0.002918f, 0.991211f, 0.003027f, 0.989746f, 0.003151f, 0.986816f, 0.003223f,
+ 0.984375f, 0.003344f, 0.980957f, 0.003462f, 0.976074f, 0.003563f, 0.970703f, 0.003677f,
+ 0.963867f, 0.003782f, 0.956055f, 0.003876f, 0.950195f, 0.003975f, 0.943359f, 0.004063f,
+ 0.935547f, 0.004135f, 0.926270f, 0.004196f, 0.916016f, 0.004242f, 0.904785f, 0.004276f,
+ 0.892090f, 0.004292f, 0.878418f, 0.004292f, 0.865234f, 0.004280f, 0.850586f, 0.004253f,
+ 0.834961f, 0.004208f, 0.818359f, 0.004150f, 0.801758f, 0.004082f, 0.784180f, 0.004002f,
+ 0.765625f, 0.003910f, 0.747070f, 0.003811f, 0.728027f, 0.003702f, 0.708496f, 0.003590f,
+ 0.688477f, 0.003469f, 0.668457f, 0.003345f, 0.648438f, 0.003220f, 0.627930f, 0.003092f,
+ 0.607422f, 0.002964f, 0.587402f, 0.002834f, 0.566895f, 0.002708f, 0.546875f, 0.002583f,
+ 0.526855f, 0.002459f, 0.506836f, 0.002338f, 0.487549f, 0.002222f, 0.468506f, 0.002108f,
+ 0.449463f, 0.001997f, 0.431152f, 0.001892f, 0.413086f, 0.001790f, 0.395264f, 0.001692f,
+ 0.378174f, 0.001598f, 0.361328f, 0.001509f, 0.345215f, 0.001423f, 0.329346f, 0.001342f,
+ 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f,
+ 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002937f,
+ 0.996582f, 0.002958f, 0.996582f, 0.002989f, 0.996582f, 0.003033f, 0.996582f, 0.003092f,
+ 0.996094f, 0.003170f, 0.996094f, 0.003271f, 0.994629f, 0.003317f, 0.992676f, 0.003361f,
+ 0.991699f, 0.003448f, 0.990723f, 0.003571f, 0.988770f, 0.003695f, 0.985840f, 0.003771f,
+ 0.983398f, 0.003902f, 0.979980f, 0.004005f, 0.975586f, 0.004128f, 0.969727f, 0.004230f,
+ 0.963379f, 0.004345f, 0.955078f, 0.004440f, 0.948730f, 0.004532f, 0.941406f, 0.004616f,
+ 0.933594f, 0.004684f, 0.924805f, 0.004738f, 0.914551f, 0.004780f, 0.902832f, 0.004799f,
+ 0.890625f, 0.004803f, 0.876953f, 0.004791f, 0.863281f, 0.004761f, 0.848633f, 0.004719f,
+ 0.833496f, 0.004658f, 0.816895f, 0.004585f, 0.799805f, 0.004494f, 0.782227f, 0.004395f,
+ 0.764160f, 0.004284f, 0.745605f, 0.004166f, 0.726562f, 0.004040f, 0.707520f, 0.003906f,
+ 0.687500f, 0.003769f, 0.667969f, 0.003630f, 0.647949f, 0.003487f, 0.627930f, 0.003344f,
+ 0.607422f, 0.003199f, 0.587402f, 0.003056f, 0.567383f, 0.002914f, 0.547363f, 0.002777f,
+ 0.527832f, 0.002640f, 0.507812f, 0.002508f, 0.488770f, 0.002380f, 0.469727f, 0.002256f,
+ 0.451172f, 0.002136f, 0.432861f, 0.002020f, 0.414795f, 0.001909f, 0.397217f, 0.001803f,
+ 0.380127f, 0.001701f, 0.363525f, 0.001605f, 0.347168f, 0.001513f, 0.331543f, 0.001425f,
+ 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f,
+ 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003513f,
+ 0.996094f, 0.003536f, 0.996094f, 0.003571f, 0.996094f, 0.003618f, 0.995605f, 0.003683f,
+ 0.995605f, 0.003769f, 0.995117f, 0.003878f, 0.993652f, 0.003906f, 0.992188f, 0.003963f,
+ 0.991211f, 0.004066f, 0.989746f, 0.004196f, 0.987793f, 0.004307f, 0.985352f, 0.004402f,
+ 0.982422f, 0.004539f, 0.978516f, 0.004639f, 0.974609f, 0.004772f, 0.969238f, 0.004875f,
+ 0.962402f, 0.004986f, 0.954590f, 0.005085f, 0.946777f, 0.005165f, 0.939941f, 0.005241f,
+ 0.931641f, 0.005302f, 0.922852f, 0.005348f, 0.912598f, 0.005375f, 0.901367f, 0.005383f,
+ 0.888672f, 0.005375f, 0.875000f, 0.005344f, 0.860840f, 0.005295f, 0.846680f, 0.005234f,
+ 0.831543f, 0.005154f, 0.814941f, 0.005058f, 0.797852f, 0.004948f, 0.780762f, 0.004826f,
+ 0.762695f, 0.004696f, 0.744141f, 0.004555f, 0.725586f, 0.004406f, 0.706543f, 0.004253f,
+ 0.687012f, 0.004097f, 0.666992f, 0.003937f, 0.647461f, 0.003777f, 0.627441f, 0.003614f,
+ 0.607422f, 0.003454f, 0.587891f, 0.003296f, 0.567871f, 0.003139f, 0.548340f, 0.002985f,
+ 0.528320f, 0.002836f, 0.509277f, 0.002691f, 0.490234f, 0.002550f, 0.471191f, 0.002415f,
+ 0.452637f, 0.002283f, 0.434570f, 0.002157f, 0.416748f, 0.002037f, 0.399170f, 0.001924f,
+ 0.382080f, 0.001813f, 0.365723f, 0.001709f, 0.349365f, 0.001610f, 0.333740f, 0.001515f,
+ 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f,
+ 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004181f,
+ 0.995605f, 0.004208f, 0.995605f, 0.004242f, 0.995117f, 0.004295f, 0.995117f, 0.004368f,
+ 0.995117f, 0.004463f, 0.994629f, 0.004578f, 0.992676f, 0.004589f, 0.991211f, 0.004662f,
+ 0.990234f, 0.004776f, 0.989258f, 0.004917f, 0.986816f, 0.005005f, 0.984375f, 0.005127f,
+ 0.981445f, 0.005268f, 0.978027f, 0.005371f, 0.973633f, 0.005497f, 0.968262f, 0.005608f,
+ 0.961426f, 0.005707f, 0.953613f, 0.005806f, 0.944824f, 0.005886f, 0.937500f, 0.005951f,
+ 0.929688f, 0.006004f, 0.920898f, 0.006035f, 0.910645f, 0.006046f, 0.899414f, 0.006035f,
+ 0.886719f, 0.006004f, 0.873047f, 0.005959f, 0.858887f, 0.005886f, 0.844238f, 0.005798f,
+ 0.829102f, 0.005695f, 0.812988f, 0.005577f, 0.796387f, 0.005447f, 0.778809f, 0.005299f,
+ 0.761230f, 0.005142f, 0.743164f, 0.004978f, 0.724121f, 0.004810f, 0.705078f, 0.004631f,
+ 0.686035f, 0.004452f, 0.666504f, 0.004272f, 0.646973f, 0.004089f, 0.627441f, 0.003910f,
+ 0.607910f, 0.003731f, 0.587891f, 0.003555f, 0.568359f, 0.003382f, 0.548828f, 0.003212f,
+ 0.529785f, 0.003048f, 0.510254f, 0.002888f, 0.491455f, 0.002735f, 0.472900f, 0.002586f,
+ 0.454590f, 0.002443f, 0.436523f, 0.002308f, 0.418701f, 0.002176f, 0.401367f, 0.002052f,
+ 0.384277f, 0.001934f, 0.367920f, 0.001822f, 0.351807f, 0.001714f, 0.336182f, 0.001612f,
+ 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f,
+ 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004955f,
+ 0.994629f, 0.004982f, 0.994629f, 0.005024f, 0.994629f, 0.005081f, 0.994141f, 0.005161f,
+ 0.994141f, 0.005260f, 0.993652f, 0.005379f, 0.991699f, 0.005383f, 0.990234f, 0.005470f,
+ 0.989258f, 0.005592f, 0.987793f, 0.005741f, 0.985352f, 0.005825f, 0.983398f, 0.005959f,
+ 0.979980f, 0.006084f, 0.976562f, 0.006207f, 0.972168f, 0.006317f, 0.966797f, 0.006439f,
+ 0.960449f, 0.006535f, 0.952637f, 0.006615f, 0.943359f, 0.006687f, 0.935547f, 0.006744f,
+ 0.927246f, 0.006783f, 0.918457f, 0.006798f, 0.908203f, 0.006790f, 0.896973f, 0.006763f,
+ 0.884766f, 0.006710f, 0.871094f, 0.006634f, 0.856445f, 0.006542f, 0.841797f, 0.006428f,
+ 0.826660f, 0.006298f, 0.811035f, 0.006153f, 0.794434f, 0.005989f, 0.776855f, 0.005817f,
+ 0.759277f, 0.005634f, 0.741211f, 0.005444f, 0.723145f, 0.005245f, 0.704102f, 0.005043f,
+ 0.685059f, 0.004841f, 0.666016f, 0.004639f, 0.646484f, 0.004433f, 0.627441f, 0.004230f,
+ 0.607910f, 0.004032f, 0.588379f, 0.003836f, 0.569336f, 0.003645f, 0.549805f, 0.003458f,
+ 0.530762f, 0.003277f, 0.511719f, 0.003101f, 0.493164f, 0.002934f, 0.474609f, 0.002771f,
+ 0.456299f, 0.002617f, 0.438477f, 0.002468f, 0.420898f, 0.002327f, 0.403564f, 0.002192f,
+ 0.386719f, 0.002064f, 0.370361f, 0.001942f, 0.354248f, 0.001826f, 0.338623f, 0.001718f,
+ 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f,
+ 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005852f,
+ 0.993652f, 0.005882f, 0.993652f, 0.005924f, 0.993652f, 0.005989f, 0.993164f, 0.006073f,
+ 0.993164f, 0.006184f, 0.992188f, 0.006290f, 0.990234f, 0.006298f, 0.989258f, 0.006393f,
+ 0.988281f, 0.006535f, 0.986816f, 0.006680f, 0.984375f, 0.006763f, 0.981934f, 0.006912f,
+ 0.979004f, 0.007019f, 0.975098f, 0.007156f, 0.970703f, 0.007259f, 0.965332f, 0.007370f,
+ 0.958984f, 0.007465f, 0.951172f, 0.007542f, 0.942383f, 0.007599f, 0.933105f, 0.007641f,
+ 0.924805f, 0.007656f, 0.916016f, 0.007652f, 0.905762f, 0.007622f, 0.894531f, 0.007568f,
+ 0.882324f, 0.007492f, 0.868652f, 0.007389f, 0.854492f, 0.007267f, 0.839355f, 0.007122f,
+ 0.824219f, 0.006958f, 0.808594f, 0.006779f, 0.792480f, 0.006588f, 0.774902f, 0.006382f,
+ 0.757324f, 0.006168f, 0.739746f, 0.005951f, 0.721680f, 0.005722f, 0.703125f, 0.005493f,
+ 0.684082f, 0.005264f, 0.665527f, 0.005032f, 0.646484f, 0.004803f, 0.627441f, 0.004578f,
+ 0.607910f, 0.004356f, 0.588867f, 0.004139f, 0.569824f, 0.003925f, 0.550781f, 0.003723f,
+ 0.531738f, 0.003525f, 0.513184f, 0.003332f, 0.494629f, 0.003149f, 0.476318f, 0.002974f,
+ 0.458252f, 0.002804f, 0.440430f, 0.002644f, 0.423096f, 0.002489f, 0.406006f, 0.002344f,
+ 0.389160f, 0.002205f, 0.372803f, 0.002073f, 0.356689f, 0.001949f, 0.341309f, 0.001831f,
+ 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f,
+ 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006882f,
+ 0.992676f, 0.006916f, 0.992676f, 0.006966f, 0.992676f, 0.007034f, 0.992188f, 0.007126f,
+ 0.992188f, 0.007244f, 0.990723f, 0.007305f, 0.989258f, 0.007351f, 0.988281f, 0.007465f,
+ 0.987305f, 0.007610f, 0.985352f, 0.007732f, 0.982910f, 0.007843f, 0.980469f, 0.007988f,
+ 0.977051f, 0.008095f, 0.973633f, 0.008224f, 0.969238f, 0.008331f, 0.963867f, 0.008423f,
+ 0.957520f, 0.008507f, 0.949707f, 0.008575f, 0.940430f, 0.008621f, 0.930664f, 0.008636f,
+ 0.922363f, 0.008629f, 0.913086f, 0.008606f, 0.902832f, 0.008545f, 0.891602f, 0.008461f,
+ 0.879395f, 0.008354f, 0.866211f, 0.008217f, 0.852051f, 0.008057f, 0.836914f, 0.007881f,
+ 0.821777f, 0.007683f, 0.806152f, 0.007469f, 0.790039f, 0.007244f, 0.772949f, 0.007000f,
+ 0.755859f, 0.006756f, 0.737793f, 0.006500f, 0.720215f, 0.006241f, 0.702148f, 0.005981f,
+ 0.683594f, 0.005722f, 0.664551f, 0.005463f, 0.645996f, 0.005207f, 0.627441f, 0.004955f,
+ 0.608398f, 0.004707f, 0.589355f, 0.004467f, 0.570312f, 0.004234f, 0.551758f, 0.004009f,
+ 0.533203f, 0.003792f, 0.514648f, 0.003582f, 0.496338f, 0.003382f, 0.478271f, 0.003189f,
+ 0.460205f, 0.003006f, 0.442627f, 0.002831f, 0.425293f, 0.002665f, 0.408203f, 0.002506f,
+ 0.391602f, 0.002356f, 0.375488f, 0.002214f, 0.359619f, 0.002079f, 0.343994f, 0.001952f,
+ 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f,
+ 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008064f,
+ 0.991699f, 0.008102f, 0.991211f, 0.008156f, 0.991211f, 0.008232f, 0.991211f, 0.008331f,
+ 0.990723f, 0.008461f, 0.989258f, 0.008492f, 0.987793f, 0.008560f, 0.986816f, 0.008682f,
+ 0.985840f, 0.008842f, 0.983398f, 0.008934f, 0.981445f, 0.009071f, 0.979004f, 0.009209f,
+ 0.975586f, 0.009323f, 0.971680f, 0.009430f, 0.967285f, 0.009544f, 0.961914f, 0.009628f,
+ 0.955566f, 0.009697f, 0.947754f, 0.009743f, 0.938965f, 0.009766f, 0.928711f, 0.009758f,
+ 0.919434f, 0.009727f, 0.910156f, 0.009666f, 0.899902f, 0.009575f, 0.888672f, 0.009460f,
+ 0.876953f, 0.009308f, 0.863770f, 0.009132f, 0.849609f, 0.008934f, 0.834473f, 0.008720f,
+ 0.818848f, 0.008476f, 0.803223f, 0.008224f, 0.787598f, 0.007957f, 0.770996f, 0.007679f,
+ 0.753906f, 0.007393f, 0.736328f, 0.007099f, 0.718750f, 0.006805f, 0.700684f, 0.006512f,
+ 0.682617f, 0.006218f, 0.664062f, 0.005928f, 0.645508f, 0.005642f, 0.627441f, 0.005360f,
+ 0.608398f, 0.005089f, 0.589844f, 0.004822f, 0.571289f, 0.004566f, 0.552734f, 0.004318f,
+ 0.534668f, 0.004078f, 0.516113f, 0.003851f, 0.498047f, 0.003633f, 0.480225f, 0.003424f,
+ 0.462402f, 0.003223f, 0.445068f, 0.003035f, 0.427734f, 0.002853f, 0.410889f, 0.002682f,
+ 0.394287f, 0.002520f, 0.378174f, 0.002367f, 0.362305f, 0.002222f, 0.346924f, 0.002085f,
+ 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f,
+ 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009430f,
+ 0.990234f, 0.009476f, 0.990234f, 0.009529f, 0.989746f, 0.009613f, 0.989746f, 0.009720f,
+ 0.989258f, 0.009857f, 0.987305f, 0.009865f, 0.986328f, 0.009949f, 0.985352f, 0.010078f,
+ 0.983887f, 0.010246f, 0.981934f, 0.010330f, 0.979980f, 0.010483f, 0.977051f, 0.010590f,
+ 0.973633f, 0.010719f, 0.969727f, 0.010811f, 0.965332f, 0.010910f, 0.959961f, 0.010986f,
+ 0.953613f, 0.011032f, 0.945801f, 0.011055f, 0.937012f, 0.011055f, 0.926758f, 0.011017f,
+ 0.916016f, 0.010948f, 0.906738f, 0.010849f, 0.896484f, 0.010719f, 0.885742f, 0.010559f,
+ 0.873535f, 0.010368f, 0.860352f, 0.010147f, 0.846680f, 0.009903f, 0.832031f, 0.009636f,
+ 0.816406f, 0.009354f, 0.800781f, 0.009048f, 0.785156f, 0.008736f, 0.768555f, 0.008415f,
+ 0.751953f, 0.008087f, 0.734863f, 0.007751f, 0.717285f, 0.007420f, 0.699707f, 0.007088f,
+ 0.681641f, 0.006756f, 0.663574f, 0.006432f, 0.645508f, 0.006111f, 0.627441f, 0.005802f,
+ 0.608887f, 0.005501f, 0.590332f, 0.005207f, 0.572266f, 0.004925f, 0.554199f, 0.004654f,
+ 0.535645f, 0.004391f, 0.517578f, 0.004143f, 0.500000f, 0.003904f, 0.482178f, 0.003675f,
+ 0.464844f, 0.003458f, 0.447510f, 0.003254f, 0.430420f, 0.003057f, 0.413574f, 0.002872f,
+ 0.397217f, 0.002697f, 0.381104f, 0.002531f, 0.365234f, 0.002375f, 0.349854f, 0.002228f,
+ 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f,
+ 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.011002f,
+ 0.988770f, 0.011040f, 0.988281f, 0.011108f, 0.988281f, 0.011192f, 0.987793f, 0.011314f,
+ 0.987305f, 0.011444f, 0.985840f, 0.011436f, 0.984375f, 0.011536f, 0.983398f, 0.011688f,
+ 0.981934f, 0.011833f, 0.979980f, 0.011925f, 0.978027f, 0.012077f, 0.974609f, 0.012169f,
+ 0.971680f, 0.012291f, 0.967773f, 0.012383f, 0.962891f, 0.012451f, 0.957520f, 0.012505f,
+ 0.951172f, 0.012527f, 0.943359f, 0.012527f, 0.934570f, 0.012489f, 0.924316f, 0.012421f,
+ 0.913574f, 0.012306f, 0.902832f, 0.012161f, 0.893066f, 0.011986f, 0.881836f, 0.011772f,
+ 0.870117f, 0.011536f, 0.857422f, 0.011261f, 0.843750f, 0.010963f, 0.829102f, 0.010643f,
+ 0.813477f, 0.010307f, 0.797852f, 0.009949f, 0.782227f, 0.009590f, 0.766113f, 0.009216f,
+ 0.750000f, 0.008842f, 0.732910f, 0.008461f, 0.715820f, 0.008080f, 0.698242f, 0.007710f,
+ 0.680664f, 0.007339f, 0.663086f, 0.006977f, 0.645020f, 0.006622f, 0.627441f, 0.006279f,
+ 0.609375f, 0.005943f, 0.591309f, 0.005623f, 0.573242f, 0.005310f, 0.555176f, 0.005013f,
+ 0.537598f, 0.004730f, 0.519531f, 0.004456f, 0.501953f, 0.004196f, 0.484375f, 0.003948f,
+ 0.467041f, 0.003714f, 0.449951f, 0.003490f, 0.433105f, 0.003277f, 0.416504f, 0.003077f,
+ 0.400146f, 0.002888f, 0.384033f, 0.002708f, 0.368408f, 0.002541f, 0.353271f, 0.002382f,
+ 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f,
+ 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012794f,
+ 0.986816f, 0.012840f, 0.986816f, 0.012909f, 0.986328f, 0.013008f, 0.986328f, 0.013130f,
+ 0.985352f, 0.013252f, 0.983398f, 0.013237f, 0.982422f, 0.013359f, 0.981445f, 0.013519f,
+ 0.979492f, 0.013626f, 0.977539f, 0.013741f, 0.975586f, 0.013885f, 0.972656f, 0.013977f,
+ 0.969238f, 0.014069f, 0.964844f, 0.014153f, 0.960449f, 0.014198f, 0.954590f, 0.014221f,
+ 0.948242f, 0.014214f, 0.940918f, 0.014175f, 0.932129f, 0.014099f, 0.921875f, 0.013977f,
+ 0.910645f, 0.013817f, 0.899414f, 0.013626f, 0.889160f, 0.013390f, 0.877930f, 0.013123f,
+ 0.866211f, 0.012817f, 0.853516f, 0.012489f, 0.840332f, 0.012131f, 0.825684f, 0.011749f,
+ 0.811035f, 0.011353f, 0.795410f, 0.010941f, 0.779297f, 0.010513f, 0.763672f, 0.010086f,
+ 0.747559f, 0.009659f, 0.730957f, 0.009224f, 0.714355f, 0.008804f, 0.697266f, 0.008377f,
+ 0.679688f, 0.007973f, 0.662598f, 0.007565f, 0.645020f, 0.007175f, 0.627441f, 0.006794f,
+ 0.609863f, 0.006424f, 0.592285f, 0.006069f, 0.574219f, 0.005730f, 0.556641f, 0.005405f,
+ 0.539062f, 0.005093f, 0.521484f, 0.004795f, 0.503906f, 0.004513f, 0.486816f, 0.004242f,
+ 0.469727f, 0.003986f, 0.452637f, 0.003746f, 0.436035f, 0.003515f, 0.419434f, 0.003300f,
+ 0.403320f, 0.003094f, 0.387451f, 0.002901f, 0.371826f, 0.002720f, 0.356445f, 0.002548f,
+ 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f,
+ 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014854f,
+ 0.984863f, 0.014908f, 0.984375f, 0.014977f, 0.984375f, 0.015083f, 0.983887f, 0.015213f,
+ 0.982910f, 0.015266f, 0.981445f, 0.015312f, 0.980469f, 0.015427f, 0.979492f, 0.015602f,
+ 0.977051f, 0.015671f, 0.975586f, 0.015808f, 0.972656f, 0.015915f, 0.969727f, 0.016022f,
+ 0.966309f, 0.016083f, 0.962402f, 0.016129f, 0.957520f, 0.016159f, 0.951660f, 0.016159f,
+ 0.945312f, 0.016113f, 0.937500f, 0.016022f, 0.928711f, 0.015884f, 0.918945f, 0.015717f,
+ 0.907715f, 0.015503f, 0.895996f, 0.015244f, 0.884766f, 0.014954f, 0.874023f, 0.014610f,
+ 0.862305f, 0.014236f, 0.849609f, 0.013840f, 0.836426f, 0.013405f, 0.822754f, 0.012955f,
+ 0.808105f, 0.012489f, 0.792480f, 0.012016f, 0.776855f, 0.011528f, 0.760742f, 0.011040f,
+ 0.745605f, 0.010551f, 0.729492f, 0.010063f, 0.712891f, 0.009583f, 0.695801f, 0.009109f,
+ 0.679199f, 0.008652f, 0.662109f, 0.008202f, 0.645020f, 0.007771f, 0.627930f, 0.007351f,
+ 0.610352f, 0.006947f, 0.592773f, 0.006554f, 0.575684f, 0.006184f, 0.558105f, 0.005825f,
+ 0.540527f, 0.005486f, 0.523438f, 0.005161f, 0.506348f, 0.004852f, 0.489258f, 0.004559f,
+ 0.472412f, 0.004284f, 0.455566f, 0.004021f, 0.438965f, 0.003773f, 0.422607f, 0.003538f,
+ 0.406494f, 0.003317f, 0.390625f, 0.003109f, 0.375244f, 0.002913f, 0.360107f, 0.002729f,
+ 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f,
+ 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017212f,
+ 0.982422f, 0.017258f, 0.981934f, 0.017349f, 0.981934f, 0.017456f, 0.981445f, 0.017593f,
+ 0.979980f, 0.017609f, 0.978516f, 0.017670f, 0.978027f, 0.017807f, 0.976562f, 0.017960f,
+ 0.974609f, 0.018021f, 0.972656f, 0.018173f, 0.969727f, 0.018234f, 0.966797f, 0.018326f,
+ 0.963379f, 0.018372f, 0.958984f, 0.018402f, 0.954102f, 0.018387f, 0.948242f, 0.018326f,
+ 0.941895f, 0.018234f, 0.934082f, 0.018097f, 0.925293f, 0.017899f, 0.915527f, 0.017654f,
+ 0.904297f, 0.017365f, 0.892578f, 0.017029f, 0.880371f, 0.016663f, 0.869629f, 0.016251f,
+ 0.857910f, 0.015793f, 0.845703f, 0.015320f, 0.832520f, 0.014801f, 0.818848f, 0.014282f,
+ 0.804688f, 0.013733f, 0.789551f, 0.013184f, 0.774414f, 0.012627f, 0.758301f, 0.012070f,
+ 0.742676f, 0.011520f, 0.727539f, 0.010971f, 0.711426f, 0.010429f, 0.694824f, 0.009903f,
+ 0.678223f, 0.009392f, 0.661621f, 0.008896f, 0.645020f, 0.008415f, 0.627930f, 0.007950f,
+ 0.610840f, 0.007507f, 0.593750f, 0.007080f, 0.576660f, 0.006672f, 0.559570f, 0.006283f,
+ 0.542480f, 0.005909f, 0.525391f, 0.005558f, 0.508789f, 0.005222f, 0.491943f, 0.004906f,
+ 0.475098f, 0.004604f, 0.458496f, 0.004318f, 0.442139f, 0.004051f, 0.426025f, 0.003798f,
+ 0.409912f, 0.003559f, 0.394287f, 0.003334f, 0.378906f, 0.003122f, 0.363770f, 0.002924f,
+ 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f,
+ 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019913f,
+ 0.979492f, 0.019958f, 0.979492f, 0.020050f, 0.979004f, 0.020172f, 0.978516f, 0.020309f,
+ 0.977051f, 0.020294f, 0.976074f, 0.020370f, 0.975098f, 0.020523f, 0.973633f, 0.020645f,
+ 0.971680f, 0.020706f, 0.969238f, 0.020828f, 0.966797f, 0.020889f, 0.963379f, 0.020935f,
+ 0.959961f, 0.020966f, 0.955566f, 0.020950f, 0.950684f, 0.020889f, 0.944824f, 0.020782f,
+ 0.937988f, 0.020615f, 0.930176f, 0.020401f, 0.921387f, 0.020142f, 0.911621f, 0.019821f,
+ 0.900879f, 0.019455f, 0.888672f, 0.019028f, 0.876465f, 0.018555f, 0.864746f, 0.018051f,
+ 0.853027f, 0.017502f, 0.841309f, 0.016937f, 0.828125f, 0.016327f, 0.814941f, 0.015717f,
+ 0.801270f, 0.015091f, 0.786621f, 0.014465f, 0.771484f, 0.013824f, 0.756348f, 0.013191f,
+ 0.740723f, 0.012566f, 0.725098f, 0.011955f, 0.709961f, 0.011353f, 0.693848f, 0.010765f,
+ 0.677734f, 0.010193f, 0.661133f, 0.009644f, 0.644531f, 0.009109f, 0.628418f, 0.008598f,
+ 0.611816f, 0.008110f, 0.595215f, 0.007645f, 0.578125f, 0.007198f, 0.561523f, 0.006775f,
+ 0.544922f, 0.006367f, 0.527832f, 0.005985f, 0.511230f, 0.005619f, 0.494629f, 0.005276f,
+ 0.478027f, 0.004948f, 0.461670f, 0.004642f, 0.445557f, 0.004349f, 0.429443f, 0.004078f,
+ 0.413574f, 0.003820f, 0.397949f, 0.003576f, 0.382568f, 0.003349f, 0.367676f, 0.003136f,
+ 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f,
+ 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022995f,
+ 0.976562f, 0.023056f, 0.976074f, 0.023148f, 0.976074f, 0.023270f, 0.975586f, 0.023407f,
+ 0.973633f, 0.023361f, 0.972656f, 0.023453f, 0.971680f, 0.023590f, 0.969727f, 0.023666f,
+ 0.968262f, 0.023773f, 0.965820f, 0.023834f, 0.962891f, 0.023895f, 0.959473f, 0.023895f,
+ 0.956055f, 0.023880f, 0.951172f, 0.023804f, 0.946289f, 0.023682f, 0.940430f, 0.023514f,
+ 0.933594f, 0.023285f, 0.925781f, 0.022980f, 0.917480f, 0.022629f, 0.907715f, 0.022217f,
+ 0.896973f, 0.021744f, 0.884766f, 0.021210f, 0.872070f, 0.020645f, 0.859375f, 0.020035f,
+ 0.848145f, 0.019379f, 0.836426f, 0.018707f, 0.823730f, 0.018005f, 0.811035f, 0.017288f,
+ 0.797363f, 0.016571f, 0.783203f, 0.015854f, 0.768555f, 0.015121f, 0.753906f, 0.014412f,
+ 0.738281f, 0.013702f, 0.723145f, 0.013016f, 0.708008f, 0.012344f, 0.692871f, 0.011688f,
+ 0.677246f, 0.011063f, 0.661133f, 0.010452f, 0.645020f, 0.009865f, 0.628906f, 0.009308f,
+ 0.612793f, 0.008766f, 0.596191f, 0.008255f, 0.580078f, 0.007771f, 0.563477f, 0.007305f,
+ 0.546875f, 0.006863f, 0.530273f, 0.006447f, 0.513672f, 0.006050f, 0.497559f, 0.005676f,
+ 0.481201f, 0.005325f, 0.465088f, 0.004990f, 0.448975f, 0.004677f, 0.433105f, 0.004379f,
+ 0.417236f, 0.004101f, 0.401855f, 0.003841f, 0.386475f, 0.003595f, 0.371582f, 0.003365f,
+ 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f,
+ 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026535f,
+ 0.973145f, 0.026596f, 0.972656f, 0.026688f, 0.972168f, 0.026825f, 0.971680f, 0.026901f,
+ 0.969727f, 0.026871f, 0.968750f, 0.026978f, 0.967773f, 0.027130f, 0.965820f, 0.027145f,
+ 0.963867f, 0.027252f, 0.961426f, 0.027252f, 0.958984f, 0.027283f, 0.955566f, 0.027267f,
+ 0.951660f, 0.027176f, 0.946777f, 0.027039f, 0.941406f, 0.026855f, 0.935547f, 0.026581f,
+ 0.928711f, 0.026260f, 0.920898f, 0.025864f, 0.912598f, 0.025406f, 0.902832f, 0.024872f,
+ 0.892090f, 0.024277f, 0.880371f, 0.023636f, 0.868164f, 0.022934f, 0.854980f, 0.022217f,
+ 0.842285f, 0.021439f, 0.831055f, 0.020645f, 0.818848f, 0.019821f, 0.806641f, 0.019012f,
+ 0.793457f, 0.018173f, 0.779785f, 0.017349f, 0.765625f, 0.016525f, 0.750977f, 0.015732f,
+ 0.736328f, 0.014938f, 0.721191f, 0.014168f, 0.706055f, 0.013420f, 0.691406f, 0.012695f,
+ 0.676270f, 0.011993f, 0.661133f, 0.011322f, 0.645508f, 0.010681f, 0.629395f, 0.010063f,
+ 0.613281f, 0.009476f, 0.597656f, 0.008919f, 0.581543f, 0.008385f, 0.565430f, 0.007874f,
+ 0.548828f, 0.007401f, 0.532715f, 0.006947f, 0.516602f, 0.006516f, 0.500488f, 0.006111f,
+ 0.484375f, 0.005726f, 0.468506f, 0.005367f, 0.452637f, 0.005028f, 0.436768f, 0.004707f,
+ 0.421387f, 0.004410f, 0.406006f, 0.004128f, 0.390625f, 0.003860f, 0.375977f, 0.003613f,
+ 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f,
+ 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030579f,
+ 0.968750f, 0.030640f, 0.968750f, 0.030746f, 0.968262f, 0.030884f, 0.966797f, 0.030869f,
+ 0.965820f, 0.030884f, 0.964844f, 0.030991f, 0.963379f, 0.031128f, 0.961426f, 0.031113f,
+ 0.959473f, 0.031174f, 0.957031f, 0.031158f, 0.954102f, 0.031113f, 0.950684f, 0.031036f,
+ 0.946289f, 0.030899f, 0.941895f, 0.030685f, 0.936523f, 0.030396f, 0.930176f, 0.030029f,
+ 0.923340f, 0.029587f, 0.915527f, 0.029083f, 0.907227f, 0.028488f, 0.897461f, 0.027817f,
+ 0.887207f, 0.027084f, 0.875488f, 0.026306f, 0.863281f, 0.025467f, 0.850586f, 0.024597f,
+ 0.837402f, 0.023697f, 0.825195f, 0.022766f, 0.813965f, 0.021820f, 0.801758f, 0.020874f,
+ 0.789062f, 0.019928f, 0.775879f, 0.018982f, 0.762695f, 0.018066f, 0.748535f, 0.017151f,
+ 0.734375f, 0.016266f, 0.719727f, 0.015411f, 0.705078f, 0.014580f, 0.689941f, 0.013779f,
+ 0.675781f, 0.013008f, 0.660645f, 0.012268f, 0.645508f, 0.011559f, 0.630371f, 0.010887f,
+ 0.614746f, 0.010239f, 0.599121f, 0.009628f, 0.583496f, 0.009048f, 0.567383f, 0.008499f,
+ 0.551758f, 0.007973f, 0.535645f, 0.007484f, 0.519531f, 0.007019f, 0.503906f, 0.006580f,
+ 0.488037f, 0.006165f, 0.472168f, 0.005775f, 0.456543f, 0.005409f, 0.440918f, 0.005062f,
+ 0.425537f, 0.004738f, 0.410156f, 0.004433f, 0.395264f, 0.004150f, 0.380371f, 0.003881f,
+ 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f,
+ 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035187f,
+ 0.964355f, 0.035278f, 0.963867f, 0.035370f, 0.963379f, 0.035522f, 0.961914f, 0.035431f,
+ 0.960938f, 0.035461f, 0.959961f, 0.035583f, 0.958496f, 0.035614f, 0.956543f, 0.035645f,
+ 0.954102f, 0.035614f, 0.951660f, 0.035583f, 0.948730f, 0.035492f, 0.944824f, 0.035309f,
+ 0.940918f, 0.035095f, 0.936035f, 0.034760f, 0.930664f, 0.034363f, 0.924316f, 0.033875f,
+ 0.917480f, 0.033295f, 0.909668f, 0.032623f, 0.900879f, 0.031891f, 0.891602f, 0.031082f,
+ 0.881348f, 0.030182f, 0.870117f, 0.029236f, 0.858398f, 0.028244f, 0.845703f, 0.027222f,
+ 0.832520f, 0.026154f, 0.819824f, 0.025070f, 0.808105f, 0.023987f, 0.796387f, 0.022903f,
+ 0.784668f, 0.021820f, 0.771973f, 0.020767f, 0.759277f, 0.019714f, 0.745605f, 0.018707f,
+ 0.731934f, 0.017715f, 0.718262f, 0.016754f, 0.703613f, 0.015839f, 0.689453f, 0.014954f,
+ 0.674805f, 0.014099f, 0.660645f, 0.013283f, 0.645996f, 0.012512f, 0.631348f, 0.011772f,
+ 0.615723f, 0.011063f, 0.600586f, 0.010399f, 0.584961f, 0.009766f, 0.569824f, 0.009171f,
+ 0.554199f, 0.008598f, 0.538574f, 0.008064f, 0.522949f, 0.007565f, 0.507324f, 0.007088f,
+ 0.491699f, 0.006641f, 0.476074f, 0.006218f, 0.460449f, 0.005821f, 0.445068f, 0.005447f,
+ 0.429932f, 0.005100f, 0.414795f, 0.004768f, 0.399658f, 0.004459f, 0.385010f, 0.004173f,
+ 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f,
+ 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040497f,
+ 0.958984f, 0.040558f, 0.958496f, 0.040680f, 0.958008f, 0.040802f, 0.956543f, 0.040680f,
+ 0.955566f, 0.040741f, 0.954590f, 0.040833f, 0.952637f, 0.040771f, 0.951172f, 0.040802f,
+ 0.948730f, 0.040710f, 0.945801f, 0.040588f, 0.942383f, 0.040436f, 0.938965f, 0.040161f,
+ 0.934570f, 0.039825f, 0.929199f, 0.039368f, 0.923828f, 0.038818f, 0.917480f, 0.038177f,
+ 0.910645f, 0.037445f, 0.902832f, 0.036621f, 0.894531f, 0.035675f, 0.885254f, 0.034668f,
+ 0.875000f, 0.033600f, 0.864258f, 0.032471f, 0.852539f, 0.031281f, 0.840332f, 0.030075f,
+ 0.827637f, 0.028839f, 0.814941f, 0.027588f, 0.802246f, 0.026337f, 0.791016f, 0.025116f,
+ 0.779785f, 0.023880f, 0.768066f, 0.022690f, 0.755859f, 0.021515f, 0.743164f, 0.020370f,
+ 0.729980f, 0.019272f, 0.716309f, 0.018219f, 0.702637f, 0.017181f, 0.688965f, 0.016220f,
+ 0.674316f, 0.015282f, 0.660645f, 0.014389f, 0.646484f, 0.013535f, 0.631836f, 0.012726f,
+ 0.617676f, 0.011963f, 0.602539f, 0.011230f, 0.587402f, 0.010544f, 0.572266f, 0.009895f,
+ 0.557129f, 0.009277f, 0.541992f, 0.008698f, 0.526367f, 0.008148f, 0.510742f, 0.007637f,
+ 0.495605f, 0.007153f, 0.480225f, 0.006699f, 0.464844f, 0.006268f, 0.449463f, 0.005867f,
+ 0.434326f, 0.005489f, 0.419434f, 0.005135f, 0.404541f, 0.004803f, 0.389893f, 0.004490f,
+ 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f,
+ 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046570f,
+ 0.952637f, 0.046661f, 0.952637f, 0.046753f, 0.951660f, 0.046844f, 0.950195f, 0.046692f,
+ 0.949219f, 0.046753f, 0.948242f, 0.046814f, 0.946289f, 0.046722f, 0.944336f, 0.046661f,
+ 0.941895f, 0.046539f, 0.938965f, 0.046295f, 0.935547f, 0.045990f, 0.931641f, 0.045624f,
+ 0.927246f, 0.045135f, 0.922363f, 0.044525f, 0.916504f, 0.043823f, 0.910156f, 0.042999f,
+ 0.902832f, 0.042023f, 0.895508f, 0.041016f, 0.887207f, 0.039856f, 0.877930f, 0.038635f,
+ 0.868164f, 0.037354f, 0.857910f, 0.036011f, 0.846680f, 0.034607f, 0.834961f, 0.033203f,
+ 0.822266f, 0.031738f, 0.809570f, 0.030334f, 0.797363f, 0.028900f, 0.785645f, 0.027496f,
+ 0.774902f, 0.026123f, 0.763672f, 0.024765f, 0.751953f, 0.023453f, 0.739746f, 0.022186f,
+ 0.727539f, 0.020966f, 0.714844f, 0.019775f, 0.701660f, 0.018661f, 0.688477f, 0.017578f,
+ 0.674805f, 0.016556f, 0.660645f, 0.015572f, 0.646973f, 0.014641f, 0.633301f, 0.013756f,
+ 0.619141f, 0.012924f, 0.604492f, 0.012131f, 0.589844f, 0.011383f, 0.574707f, 0.010674f,
+ 0.560059f, 0.010010f, 0.544922f, 0.009377f, 0.529785f, 0.008789f, 0.514648f, 0.008232f,
+ 0.499756f, 0.007710f, 0.484375f, 0.007217f, 0.469238f, 0.006752f, 0.454346f, 0.006317f,
+ 0.439209f, 0.005913f, 0.424316f, 0.005531f, 0.409668f, 0.005173f, 0.395020f, 0.004837f,
+ 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f,
+ 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.945801f, 0.053558f,
+ 0.945801f, 0.053619f, 0.945312f, 0.053741f, 0.944336f, 0.053680f, 0.942871f, 0.053589f,
+ 0.941895f, 0.053619f, 0.940918f, 0.053589f, 0.938965f, 0.053497f, 0.937012f, 0.053314f,
+ 0.934570f, 0.053101f, 0.931641f, 0.052765f, 0.927734f, 0.052338f, 0.923828f, 0.051788f,
+ 0.919434f, 0.051147f, 0.914062f, 0.050354f, 0.908203f, 0.049408f, 0.901855f, 0.048370f,
+ 0.895020f, 0.047180f, 0.887207f, 0.045868f, 0.878906f, 0.044495f, 0.870117f, 0.042999f,
+ 0.860840f, 0.041473f, 0.850586f, 0.039886f, 0.839844f, 0.038239f, 0.828613f, 0.036591f,
+ 0.816895f, 0.034943f, 0.804688f, 0.033295f, 0.792480f, 0.031677f, 0.780273f, 0.030075f,
+ 0.769531f, 0.028534f, 0.758789f, 0.027008f, 0.748047f, 0.025543f, 0.736816f, 0.024139f,
+ 0.725098f, 0.022781f, 0.713379f, 0.021484f, 0.700684f, 0.020233f, 0.687988f, 0.019058f,
+ 0.674805f, 0.017929f, 0.661621f, 0.016846f, 0.647949f, 0.015839f, 0.634277f, 0.014877f,
+ 0.620605f, 0.013962f, 0.606445f, 0.013100f, 0.592285f, 0.012291f, 0.578125f, 0.011520f,
+ 0.563477f, 0.010803f, 0.548340f, 0.010117f, 0.533691f, 0.009476f, 0.519043f, 0.008873f,
+ 0.503906f, 0.008308f, 0.489014f, 0.007778f, 0.474121f, 0.007278f, 0.458984f, 0.006813f,
+ 0.444336f, 0.006371f, 0.429688f, 0.005959f, 0.415039f, 0.005573f, 0.400391f, 0.005215f,
+ 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f,
+ 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061554f,
+ 0.937500f, 0.061615f, 0.937500f, 0.061737f, 0.936035f, 0.061554f, 0.935059f, 0.061493f,
+ 0.934082f, 0.061523f, 0.932129f, 0.061340f, 0.930664f, 0.061218f, 0.928223f, 0.060913f,
+ 0.925781f, 0.060577f, 0.922852f, 0.060089f, 0.918945f, 0.059479f, 0.915039f, 0.058777f,
+ 0.910156f, 0.057892f, 0.904785f, 0.056854f, 0.898926f, 0.055664f, 0.892578f, 0.054321f,
+ 0.885742f, 0.052887f, 0.877930f, 0.051270f, 0.870117f, 0.049591f, 0.861328f, 0.047821f,
+ 0.852539f, 0.045990f, 0.842773f, 0.044098f, 0.832520f, 0.042206f, 0.822266f, 0.040314f,
+ 0.811035f, 0.038391f, 0.799316f, 0.036530f, 0.787598f, 0.034668f, 0.775879f, 0.032867f,
+ 0.764648f, 0.031143f, 0.753906f, 0.029449f, 0.744141f, 0.027817f, 0.733398f, 0.026245f,
+ 0.722656f, 0.024750f, 0.711426f, 0.023315f, 0.699707f, 0.021942f, 0.687500f, 0.020645f,
+ 0.675293f, 0.019409f, 0.662109f, 0.018234f, 0.649414f, 0.017120f, 0.635742f, 0.016083f,
+ 0.622070f, 0.015091f, 0.608887f, 0.014153f, 0.595215f, 0.013268f, 0.581055f, 0.012444f,
+ 0.566895f, 0.011658f, 0.552246f, 0.010918f, 0.537598f, 0.010223f, 0.522949f, 0.009575f,
+ 0.508301f, 0.008965f, 0.493896f, 0.008385f, 0.479004f, 0.007851f, 0.464355f, 0.007347f,
+ 0.449463f, 0.006874f, 0.435059f, 0.006428f, 0.420654f, 0.006012f, 0.406250f, 0.005623f,
+ 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f,
+ 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070740f,
+ 0.928223f, 0.070801f, 0.928223f, 0.070923f, 0.926270f, 0.070618f, 0.925781f, 0.070557f,
+ 0.924805f, 0.070557f, 0.922852f, 0.070251f, 0.920898f, 0.069946f, 0.918945f, 0.069580f,
+ 0.916016f, 0.069092f, 0.913086f, 0.068420f, 0.909180f, 0.067627f, 0.904785f, 0.066589f,
+ 0.899902f, 0.065430f, 0.894531f, 0.064148f, 0.888672f, 0.062622f, 0.882324f, 0.060974f,
+ 0.875488f, 0.059174f, 0.867676f, 0.057251f, 0.860352f, 0.055206f, 0.852051f, 0.053070f,
+ 0.843262f, 0.050934f, 0.834473f, 0.048737f, 0.825195f, 0.046509f, 0.814941f, 0.044312f,
+ 0.804688f, 0.042145f, 0.793945f, 0.040009f, 0.783203f, 0.037933f, 0.771973f, 0.035889f,
+ 0.760742f, 0.033936f, 0.750000f, 0.032074f, 0.739746f, 0.030258f, 0.729980f, 0.028519f,
+ 0.720215f, 0.026871f, 0.709473f, 0.025284f, 0.698730f, 0.023788f, 0.687500f, 0.022369f,
+ 0.675781f, 0.021011f, 0.663574f, 0.019730f, 0.650879f, 0.018524f, 0.637695f, 0.017380f,
+ 0.624512f, 0.016296f, 0.611328f, 0.015289f, 0.597656f, 0.014328f, 0.584473f, 0.013428f,
+ 0.570312f, 0.012581f, 0.556641f, 0.011787f, 0.541992f, 0.011032f, 0.527832f, 0.010330f,
+ 0.513184f, 0.009674f, 0.498779f, 0.009048f, 0.484375f, 0.008469f, 0.469727f, 0.007927f,
+ 0.455322f, 0.007416f, 0.440674f, 0.006939f, 0.426270f, 0.006489f, 0.412354f, 0.006073f,
+ 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f,
+ 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081360f,
+ 0.917969f, 0.081421f, 0.916992f, 0.081421f, 0.915527f, 0.081055f, 0.915039f, 0.080994f,
+ 0.913574f, 0.080750f, 0.912109f, 0.080444f, 0.910156f, 0.080017f, 0.907715f, 0.079468f,
+ 0.904785f, 0.078735f, 0.901367f, 0.077820f, 0.897461f, 0.076721f, 0.893555f, 0.075500f,
+ 0.888184f, 0.073975f, 0.882812f, 0.072266f, 0.876953f, 0.070374f, 0.870605f, 0.068359f,
+ 0.863770f, 0.066101f, 0.856934f, 0.063782f, 0.849121f, 0.061340f, 0.841797f, 0.058868f,
+ 0.833496f, 0.056335f, 0.825195f, 0.053741f, 0.816406f, 0.051208f, 0.807617f, 0.048676f,
+ 0.798340f, 0.046204f, 0.788086f, 0.043793f, 0.777832f, 0.041443f, 0.767578f, 0.039185f,
+ 0.757324f, 0.036987f, 0.746582f, 0.034882f, 0.736328f, 0.032898f, 0.726562f, 0.030975f,
+ 0.717285f, 0.029144f, 0.708008f, 0.027420f, 0.697754f, 0.025772f, 0.687012f, 0.024216f,
+ 0.676270f, 0.022736f, 0.664551f, 0.021347f, 0.652344f, 0.020020f, 0.640137f, 0.018784f,
+ 0.627441f, 0.017609f, 0.614258f, 0.016510f, 0.601074f, 0.015480f, 0.587402f, 0.014503f,
+ 0.574219f, 0.013588f, 0.560547f, 0.012726f, 0.546875f, 0.011909f, 0.532715f, 0.011154f,
+ 0.518066f, 0.010437f, 0.503906f, 0.009773f, 0.489746f, 0.009148f, 0.475342f, 0.008560f,
+ 0.461182f, 0.008011f, 0.446777f, 0.007496f, 0.432617f, 0.007011f, 0.418457f, 0.006561f,
+ 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f,
+ 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f,
+ 0.905273f, 0.093628f, 0.904297f, 0.093384f, 0.903320f, 0.093140f, 0.902344f, 0.093018f,
+ 0.900879f, 0.092590f, 0.899414f, 0.092224f, 0.897461f, 0.091553f, 0.895020f, 0.090759f,
+ 0.892090f, 0.089783f, 0.888672f, 0.088562f, 0.884766f, 0.087097f, 0.880371f, 0.085449f,
+ 0.875488f, 0.083496f, 0.870117f, 0.081360f, 0.863770f, 0.078979f, 0.857910f, 0.076477f,
+ 0.851074f, 0.073792f, 0.844727f, 0.070984f, 0.837402f, 0.068054f, 0.830566f, 0.065125f,
+ 0.823242f, 0.062195f, 0.815430f, 0.059204f, 0.807617f, 0.056274f, 0.799805f, 0.053406f,
+ 0.791016f, 0.050598f, 0.782227f, 0.047852f, 0.772949f, 0.045227f, 0.763672f, 0.042694f,
+ 0.753906f, 0.040253f, 0.744141f, 0.037933f, 0.733887f, 0.035736f, 0.724121f, 0.033600f,
+ 0.714844f, 0.031616f, 0.706055f, 0.029709f, 0.696777f, 0.027908f, 0.687012f, 0.026199f,
+ 0.676270f, 0.024597f, 0.665527f, 0.023087f, 0.654297f, 0.021652f, 0.642578f, 0.020309f,
+ 0.630371f, 0.019028f, 0.617676f, 0.017838f, 0.604980f, 0.016708f, 0.591797f, 0.015656f,
+ 0.578125f, 0.014671f, 0.564941f, 0.013741f, 0.551270f, 0.012863f, 0.537598f, 0.012047f,
+ 0.523926f, 0.011276f, 0.509766f, 0.010559f, 0.495605f, 0.009880f, 0.481445f, 0.009247f,
+ 0.467285f, 0.008659f, 0.453125f, 0.008102f, 0.439209f, 0.007584f, 0.425293f, 0.007095f,
+ 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f,
+ 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f,
+ 0.891113f, 0.107727f, 0.890137f, 0.107300f, 0.889160f, 0.107056f, 0.888184f, 0.106812f,
+ 0.886719f, 0.106201f, 0.884766f, 0.105530f, 0.882812f, 0.104736f, 0.880371f, 0.103638f,
+ 0.877441f, 0.102234f, 0.874023f, 0.100708f, 0.870117f, 0.098755f, 0.865234f, 0.096619f,
+ 0.860352f, 0.094177f, 0.854980f, 0.091492f, 0.849609f, 0.088562f, 0.843750f, 0.085449f,
+ 0.837402f, 0.082214f, 0.831055f, 0.078857f, 0.824707f, 0.075439f, 0.818359f, 0.071960f,
+ 0.812012f, 0.068542f, 0.805176f, 0.065125f, 0.798340f, 0.061768f, 0.791504f, 0.058502f,
+ 0.783691f, 0.055328f, 0.775879f, 0.052246f, 0.768066f, 0.049316f, 0.759766f, 0.046478f,
+ 0.750977f, 0.043793f, 0.741699f, 0.041199f, 0.732422f, 0.038788f, 0.723145f, 0.036438f,
+ 0.713379f, 0.034241f, 0.704102f, 0.032166f, 0.695801f, 0.030228f, 0.686523f, 0.028366f,
+ 0.676758f, 0.026611f, 0.666992f, 0.024963f, 0.656250f, 0.023407f, 0.645020f, 0.021942f,
+ 0.633301f, 0.020569f, 0.621582f, 0.019272f, 0.608887f, 0.018051f, 0.596191f, 0.016922f,
+ 0.583008f, 0.015839f, 0.569824f, 0.014847f, 0.556152f, 0.013901f, 0.542969f, 0.013016f,
+ 0.529297f, 0.012192f, 0.515625f, 0.011414f, 0.501953f, 0.010681f, 0.487793f, 0.010002f,
+ 0.473877f, 0.009361f, 0.459717f, 0.008766f, 0.445801f, 0.008202f, 0.432129f, 0.007683f,
+ 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f,
+ 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875000f, 0.124084f,
+ 0.874512f, 0.124084f, 0.873535f, 0.123474f, 0.872559f, 0.123169f, 0.871582f, 0.122559f,
+ 0.870117f, 0.121948f, 0.868164f, 0.120972f, 0.866211f, 0.119812f, 0.863770f, 0.118347f,
+ 0.860840f, 0.116516f, 0.856934f, 0.114380f, 0.853027f, 0.111938f, 0.848633f, 0.109192f,
+ 0.843750f, 0.106079f, 0.838867f, 0.102722f, 0.833496f, 0.099121f, 0.827637f, 0.095337f,
+ 0.822266f, 0.091431f, 0.816406f, 0.087463f, 0.811035f, 0.083435f, 0.805664f, 0.079407f,
+ 0.799805f, 0.075378f, 0.794434f, 0.071472f, 0.788574f, 0.067627f, 0.782715f, 0.063965f,
+ 0.776367f, 0.060425f, 0.770020f, 0.056976f, 0.762695f, 0.053680f, 0.755371f, 0.050568f,
+ 0.747559f, 0.047577f, 0.739746f, 0.044739f, 0.731445f, 0.042053f, 0.722656f, 0.039520f,
+ 0.713379f, 0.037109f, 0.704102f, 0.034851f, 0.695312f, 0.032684f, 0.686035f, 0.030685f,
+ 0.677246f, 0.028778f, 0.667969f, 0.026978f, 0.658203f, 0.025299f, 0.647461f, 0.023712f,
+ 0.636719f, 0.022232f, 0.625000f, 0.020828f, 0.613281f, 0.019516f, 0.600586f, 0.018280f,
+ 0.588379f, 0.017120f, 0.575195f, 0.016037f, 0.562012f, 0.015022f, 0.548340f, 0.014076f,
+ 0.535156f, 0.013176f, 0.521484f, 0.012337f, 0.508301f, 0.011559f, 0.494629f, 0.010826f,
+ 0.480713f, 0.010132f, 0.467041f, 0.009491f, 0.453125f, 0.008888f, 0.439453f, 0.008324f,
+ 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f,
+ 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f,
+ 0.854980f, 0.142700f, 0.854492f, 0.142212f, 0.853516f, 0.141724f, 0.852539f, 0.140869f,
+ 0.851074f, 0.139893f, 0.849121f, 0.138672f, 0.847168f, 0.136963f, 0.844238f, 0.135010f,
+ 0.841309f, 0.132690f, 0.837891f, 0.129883f, 0.833984f, 0.126709f, 0.829590f, 0.123169f,
+ 0.824707f, 0.119263f, 0.820312f, 0.115112f, 0.815430f, 0.110718f, 0.810547f, 0.106140f,
+ 0.805664f, 0.101501f, 0.800781f, 0.096802f, 0.796387f, 0.092041f, 0.791992f, 0.087402f,
+ 0.787598f, 0.082825f, 0.782715f, 0.078369f, 0.778320f, 0.074036f, 0.773926f, 0.069824f,
+ 0.769043f, 0.065857f, 0.763672f, 0.062042f, 0.757812f, 0.058380f, 0.751465f, 0.054932f,
+ 0.745117f, 0.051636f, 0.737793f, 0.048523f, 0.730469f, 0.045593f, 0.722168f, 0.042786f,
+ 0.713867f, 0.040161f, 0.705566f, 0.037689f, 0.696289f, 0.035370f, 0.687500f, 0.033173f,
+ 0.678223f, 0.031113f, 0.669434f, 0.029175f, 0.660156f, 0.027344f, 0.649902f, 0.025620f,
+ 0.639648f, 0.024017f, 0.628906f, 0.022507f, 0.617676f, 0.021088f, 0.605469f, 0.019760f,
+ 0.593262f, 0.018509f, 0.581055f, 0.017334f, 0.567871f, 0.016235f, 0.554688f, 0.015221f,
+ 0.541504f, 0.014259f, 0.528320f, 0.013359f, 0.514648f, 0.012512f, 0.501465f, 0.011719f,
+ 0.488037f, 0.010979f, 0.474365f, 0.010284f, 0.460938f, 0.009636f, 0.447266f, 0.009033f,
+ 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f,
+ 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f,
+ 0.832520f, 0.164551f, 0.832031f, 0.164062f, 0.831543f, 0.163330f, 0.830078f, 0.162231f,
+ 0.828613f, 0.160767f, 0.827148f, 0.159058f, 0.824707f, 0.156738f, 0.822266f, 0.154053f,
+ 0.819336f, 0.150879f, 0.815918f, 0.147217f, 0.812012f, 0.143188f, 0.808105f, 0.138672f,
+ 0.803711f, 0.133789f, 0.799805f, 0.128662f, 0.795410f, 0.123413f, 0.791504f, 0.117859f,
+ 0.787598f, 0.112366f, 0.784180f, 0.106812f, 0.780762f, 0.101318f, 0.777344f, 0.095947f,
+ 0.774414f, 0.090759f, 0.770996f, 0.085693f, 0.768066f, 0.080811f, 0.764648f, 0.076172f,
+ 0.761230f, 0.071716f, 0.757324f, 0.067444f, 0.752930f, 0.063416f, 0.748047f, 0.059631f,
+ 0.742676f, 0.056000f, 0.736328f, 0.052612f, 0.729980f, 0.049377f, 0.722656f, 0.046326f,
+ 0.715332f, 0.043457f, 0.707031f, 0.040771f, 0.698730f, 0.038239f, 0.689941f, 0.035858f,
+ 0.680664f, 0.033600f, 0.671387f, 0.031525f, 0.662109f, 0.029541f, 0.652832f, 0.027695f,
+ 0.643066f, 0.025955f, 0.632812f, 0.024323f, 0.622070f, 0.022797f, 0.610352f, 0.021347f,
+ 0.598633f, 0.020004f, 0.586914f, 0.018753f, 0.574219f, 0.017578f, 0.561523f, 0.016464f,
+ 0.548828f, 0.015434f, 0.535645f, 0.014458f, 0.521973f, 0.013550f, 0.508789f, 0.012703f,
+ 0.495361f, 0.011902f, 0.481934f, 0.011154f, 0.468750f, 0.010460f, 0.455566f, 0.009804f,
+ 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f,
+ 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.807617f, 0.191162f,
+ 0.806641f, 0.190186f, 0.806152f, 0.189453f, 0.805176f, 0.188232f, 0.804199f, 0.186768f,
+ 0.802734f, 0.184814f, 0.801270f, 0.182373f, 0.799316f, 0.179321f, 0.796875f, 0.175781f,
+ 0.793945f, 0.171631f, 0.790527f, 0.166870f, 0.787109f, 0.161621f, 0.783691f, 0.155884f,
+ 0.780273f, 0.149780f, 0.776855f, 0.143555f, 0.773926f, 0.137085f, 0.770996f, 0.130615f,
+ 0.768066f, 0.124084f, 0.766113f, 0.117676f, 0.764160f, 0.111328f, 0.762207f, 0.105164f,
+ 0.760742f, 0.099243f, 0.759277f, 0.093567f, 0.757324f, 0.088135f, 0.755859f, 0.082886f,
+ 0.753418f, 0.077942f, 0.750977f, 0.073303f, 0.748047f, 0.068848f, 0.744141f, 0.064636f,
+ 0.740234f, 0.060669f, 0.735352f, 0.056946f, 0.729492f, 0.053436f, 0.723633f, 0.050110f,
+ 0.716797f, 0.046997f, 0.709473f, 0.044067f, 0.701660f, 0.041321f, 0.693359f, 0.038727f,
+ 0.684570f, 0.036316f, 0.675781f, 0.034027f, 0.666016f, 0.031921f, 0.656250f, 0.029922f,
+ 0.646484f, 0.028046f, 0.636230f, 0.026276f, 0.625977f, 0.024628f, 0.615723f, 0.023087f,
+ 0.604492f, 0.021637f, 0.592773f, 0.020279f, 0.580566f, 0.019012f, 0.568359f, 0.017822f,
+ 0.556152f, 0.016708f, 0.542969f, 0.015671f, 0.530273f, 0.014694f, 0.517090f, 0.013779f,
+ 0.503906f, 0.012917f, 0.490479f, 0.012115f, 0.477295f, 0.011360f, 0.463867f, 0.010658f,
+ 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f,
+ 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.776855f, 0.221069f,
+ 0.776367f, 0.220093f, 0.775879f, 0.219116f, 0.774902f, 0.217529f, 0.773926f, 0.215332f,
+ 0.772949f, 0.212646f, 0.771484f, 0.209229f, 0.769531f, 0.205078f, 0.767090f, 0.200195f,
+ 0.764648f, 0.194824f, 0.761719f, 0.188599f, 0.759277f, 0.181885f, 0.756348f, 0.174683f,
+ 0.753906f, 0.167358f, 0.751953f, 0.159668f, 0.750000f, 0.151855f, 0.748535f, 0.144165f,
+ 0.747559f, 0.136597f, 0.747070f, 0.129150f, 0.747070f, 0.121948f, 0.747070f, 0.114990f,
+ 0.747070f, 0.108276f, 0.747070f, 0.101929f, 0.747070f, 0.095886f, 0.747070f, 0.090088f,
+ 0.746094f, 0.084656f, 0.745117f, 0.079468f, 0.743652f, 0.074585f, 0.741211f, 0.070007f,
+ 0.738281f, 0.065674f, 0.734375f, 0.061584f, 0.729980f, 0.057770f, 0.724609f, 0.054169f,
+ 0.718750f, 0.050781f, 0.712402f, 0.047607f, 0.705078f, 0.044617f, 0.697754f, 0.041840f,
+ 0.689453f, 0.039215f, 0.680664f, 0.036774f, 0.671387f, 0.034454f, 0.661621f, 0.032318f,
+ 0.651855f, 0.030289f, 0.641602f, 0.028397f, 0.630859f, 0.026627f, 0.620117f, 0.024963f,
+ 0.609863f, 0.023407f, 0.598633f, 0.021942f, 0.587402f, 0.020584f, 0.575195f, 0.019302f,
+ 0.563477f, 0.018112f, 0.550781f, 0.016983f, 0.538086f, 0.015930f, 0.525391f, 0.014954f,
+ 0.512695f, 0.014030f, 0.499512f, 0.013161f, 0.486572f, 0.012360f, 0.473389f, 0.011604f,
+ 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f,
+ 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.740723f, 0.256348f,
+ 0.740234f, 0.255371f, 0.739746f, 0.253418f, 0.739258f, 0.251221f, 0.738770f, 0.248291f,
+ 0.737793f, 0.244507f, 0.736328f, 0.239868f, 0.734863f, 0.234253f, 0.732910f, 0.227783f,
+ 0.730957f, 0.220459f, 0.729492f, 0.212524f, 0.727539f, 0.204102f, 0.726074f, 0.195190f,
+ 0.725098f, 0.186035f, 0.724609f, 0.176758f, 0.724609f, 0.167725f, 0.725586f, 0.158691f,
+ 0.726562f, 0.149902f, 0.727539f, 0.141357f, 0.729492f, 0.133179f, 0.731445f, 0.125366f,
+ 0.733398f, 0.117920f, 0.735352f, 0.110840f, 0.737305f, 0.104126f, 0.738770f, 0.097717f,
+ 0.739258f, 0.091736f, 0.739746f, 0.086060f, 0.739258f, 0.080750f, 0.738281f, 0.075745f,
+ 0.736328f, 0.070984f, 0.733887f, 0.066528f, 0.730469f, 0.062408f, 0.726074f, 0.058502f,
+ 0.721191f, 0.054840f, 0.715820f, 0.051392f, 0.708984f, 0.048187f, 0.702148f, 0.045166f,
+ 0.694336f, 0.042328f, 0.686035f, 0.039703f, 0.677246f, 0.037201f, 0.667969f, 0.034882f,
+ 0.658691f, 0.032715f, 0.648438f, 0.030685f, 0.638184f, 0.028778f, 0.627441f, 0.026993f,
+ 0.616211f, 0.025330f, 0.604980f, 0.023758f, 0.593750f, 0.022293f, 0.582031f, 0.020920f,
+ 0.570801f, 0.019638f, 0.558594f, 0.018433f, 0.546387f, 0.017303f, 0.534180f, 0.016235f,
+ 0.521484f, 0.015251f, 0.508789f, 0.014328f, 0.496094f, 0.013458f, 0.483398f, 0.012642f,
+ 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f,
+ 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.298340f,
+ 0.698242f, 0.296875f, 0.697754f, 0.294189f, 0.697266f, 0.291016f, 0.697266f, 0.286621f,
+ 0.696289f, 0.281250f, 0.695801f, 0.274658f, 0.694824f, 0.266846f, 0.693848f, 0.258301f,
+ 0.692871f, 0.248779f, 0.692383f, 0.238525f, 0.692383f, 0.227905f, 0.692871f, 0.216919f,
+ 0.693848f, 0.205933f, 0.695801f, 0.194946f, 0.698242f, 0.184204f, 0.701172f, 0.173828f,
+ 0.704590f, 0.163818f, 0.708496f, 0.154175f, 0.712402f, 0.145020f, 0.716309f, 0.136230f,
+ 0.720703f, 0.128052f, 0.724121f, 0.120178f, 0.728027f, 0.112793f, 0.730957f, 0.105835f,
+ 0.733398f, 0.099243f, 0.734863f, 0.093079f, 0.735840f, 0.087219f, 0.736328f, 0.081787f,
+ 0.735352f, 0.076660f, 0.733887f, 0.071838f, 0.731445f, 0.067322f, 0.728027f, 0.063110f,
+ 0.724121f, 0.059143f, 0.719238f, 0.055450f, 0.713379f, 0.051971f, 0.707031f, 0.048706f,
+ 0.700195f, 0.045685f, 0.692383f, 0.042816f, 0.684082f, 0.040161f, 0.675293f, 0.037659f,
+ 0.666016f, 0.035339f, 0.656250f, 0.033142f, 0.645996f, 0.031113f, 0.635254f, 0.029190f,
+ 0.624512f, 0.027405f, 0.613281f, 0.025726f, 0.602051f, 0.024155f, 0.590332f, 0.022675f,
+ 0.578613f, 0.021301f, 0.566406f, 0.020004f, 0.554688f, 0.018799f, 0.542969f, 0.017670f,
+ 0.530762f, 0.016602f, 0.518066f, 0.015602f, 0.505859f, 0.014671f, 0.493408f, 0.013794f,
+ 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f,
+ 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.348145f,
+ 0.647461f, 0.345459f, 0.647949f, 0.341797f, 0.647949f, 0.336914f, 0.647949f, 0.330566f,
+ 0.647949f, 0.322998f, 0.647949f, 0.313721f, 0.648438f, 0.303223f, 0.648926f, 0.291748f,
+ 0.649902f, 0.279297f, 0.651367f, 0.266113f, 0.653809f, 0.252930f, 0.657227f, 0.239746f,
+ 0.661133f, 0.226685f, 0.665527f, 0.213867f, 0.670898f, 0.201538f, 0.676758f, 0.189697f,
+ 0.683105f, 0.178345f, 0.689453f, 0.167603f, 0.695801f, 0.157349f, 0.702148f, 0.147705f,
+ 0.708496f, 0.138550f, 0.714355f, 0.130005f, 0.719238f, 0.121948f, 0.724121f, 0.114319f,
+ 0.728027f, 0.107117f, 0.730957f, 0.100403f, 0.733398f, 0.094116f, 0.734375f, 0.088196f,
+ 0.734863f, 0.082642f, 0.734375f, 0.077393f, 0.732910f, 0.072571f, 0.730469f, 0.067993f,
+ 0.727051f, 0.063721f, 0.722656f, 0.059753f, 0.717773f, 0.056000f, 0.712402f, 0.052521f,
+ 0.705566f, 0.049255f, 0.698730f, 0.046204f, 0.690918f, 0.043335f, 0.682617f, 0.040649f,
+ 0.673828f, 0.038147f, 0.664551f, 0.035797f, 0.654785f, 0.033630f, 0.644531f, 0.031555f,
+ 0.633789f, 0.029663f, 0.623047f, 0.027863f, 0.611816f, 0.026169f, 0.600586f, 0.024597f,
+ 0.588867f, 0.023117f, 0.576660f, 0.021744f, 0.564941f, 0.020447f, 0.552734f, 0.019226f,
+ 0.540039f, 0.018082f, 0.527832f, 0.017014f, 0.515625f, 0.016006f, 0.503418f, 0.015068f,
+ 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f,
+ 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.406982f,
+ 0.587891f, 0.402832f, 0.588379f, 0.397461f, 0.589355f, 0.389893f, 0.590332f, 0.380615f,
+ 0.591797f, 0.369385f, 0.593262f, 0.356445f, 0.595703f, 0.342041f, 0.598633f, 0.326904f,
+ 0.602539f, 0.310791f, 0.607422f, 0.294678f, 0.613281f, 0.278809f, 0.620117f, 0.262939f,
+ 0.627441f, 0.247803f, 0.635742f, 0.233154f, 0.644531f, 0.219238f, 0.653809f, 0.205933f,
+ 0.663086f, 0.193359f, 0.672363f, 0.181519f, 0.681152f, 0.170166f, 0.689941f, 0.159668f,
+ 0.697754f, 0.149658f, 0.705566f, 0.140259f, 0.712402f, 0.131348f, 0.718262f, 0.123169f,
+ 0.723633f, 0.115417f, 0.728027f, 0.108093f, 0.731445f, 0.101257f, 0.733398f, 0.094849f,
+ 0.734863f, 0.088867f, 0.735352f, 0.083313f, 0.734375f, 0.078064f, 0.732910f, 0.073120f,
+ 0.730469f, 0.068542f, 0.727051f, 0.064270f, 0.722656f, 0.060303f, 0.717773f, 0.056549f,
+ 0.711914f, 0.053040f, 0.705078f, 0.049774f, 0.698242f, 0.046722f, 0.690430f, 0.043854f,
+ 0.682129f, 0.041199f, 0.673340f, 0.038696f, 0.663574f, 0.036346f, 0.653809f, 0.034149f,
+ 0.644043f, 0.032104f, 0.633301f, 0.030182f, 0.622559f, 0.028381f, 0.611328f, 0.026688f,
+ 0.600098f, 0.025116f, 0.588379f, 0.023621f, 0.576172f, 0.022232f, 0.564453f, 0.020935f,
+ 0.552246f, 0.019714f, 0.540039f, 0.018570f, 0.527832f, 0.017487f, 0.515137f, 0.016479f,
+ 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f,
+ 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.514648f, 0.477051f,
+ 0.516113f, 0.470459f, 0.517578f, 0.461426f, 0.520020f, 0.449707f, 0.522949f, 0.435547f,
+ 0.526367f, 0.419189f, 0.530762f, 0.401123f, 0.536621f, 0.381836f, 0.543457f, 0.362061f,
+ 0.551758f, 0.342285f, 0.561523f, 0.322998f, 0.571777f, 0.304199f, 0.583496f, 0.286133f,
+ 0.595703f, 0.268799f, 0.607910f, 0.252441f, 0.620605f, 0.237061f, 0.633301f, 0.222412f,
+ 0.645508f, 0.208618f, 0.657227f, 0.195557f, 0.668945f, 0.183350f, 0.679688f, 0.171753f,
+ 0.689453f, 0.160889f, 0.698730f, 0.150757f, 0.707031f, 0.141113f, 0.714355f, 0.132202f,
+ 0.720703f, 0.123901f, 0.726074f, 0.116028f, 0.729980f, 0.108704f, 0.733398f, 0.101807f,
+ 0.735352f, 0.095398f, 0.736328f, 0.089417f, 0.736816f, 0.083801f, 0.735840f, 0.078552f,
+ 0.733887f, 0.073608f, 0.730957f, 0.069031f, 0.727539f, 0.064819f, 0.723145f, 0.060822f,
+ 0.717773f, 0.057098f, 0.711914f, 0.053589f, 0.705078f, 0.050323f, 0.698242f, 0.047302f,
+ 0.690430f, 0.044434f, 0.681641f, 0.041779f, 0.672852f, 0.039276f, 0.663574f, 0.036926f,
+ 0.653809f, 0.034729f, 0.644043f, 0.032684f, 0.633301f, 0.030777f, 0.622559f, 0.028976f,
+ 0.611816f, 0.027283f, 0.600098f, 0.025711f, 0.588867f, 0.024216f, 0.577148f, 0.022827f,
+ 0.564941f, 0.021530f, 0.553223f, 0.020294f, 0.541016f, 0.019150f, 0.528809f, 0.018066f,
+ 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f,
+ 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.427246f, 0.558594f,
+ 0.430176f, 0.547363f, 0.434082f, 0.532227f, 0.438965f, 0.513184f, 0.445312f, 0.491943f,
+ 0.453125f, 0.468262f, 0.462891f, 0.443848f, 0.474365f, 0.419434f, 0.487549f, 0.395264f,
+ 0.501953f, 0.372070f, 0.518066f, 0.349854f, 0.534180f, 0.328613f, 0.551270f, 0.308594f,
+ 0.568359f, 0.289795f, 0.584961f, 0.271729f, 0.601074f, 0.254883f, 0.617188f, 0.238892f,
+ 0.632324f, 0.223877f, 0.646484f, 0.209717f, 0.659668f, 0.196411f, 0.672363f, 0.183960f,
+ 0.683594f, 0.172241f, 0.693848f, 0.161255f, 0.703125f, 0.151001f, 0.711426f, 0.141357f,
+ 0.718750f, 0.132446f, 0.724609f, 0.124023f, 0.729980f, 0.116211f, 0.733887f, 0.108826f,
+ 0.736328f, 0.101990f, 0.738281f, 0.095642f, 0.738770f, 0.089661f, 0.738770f, 0.084106f,
+ 0.737305f, 0.078918f, 0.735352f, 0.074036f, 0.732422f, 0.069519f, 0.728516f, 0.065247f,
+ 0.723633f, 0.061310f, 0.718262f, 0.057617f, 0.712402f, 0.054169f, 0.705566f, 0.050934f,
+ 0.698242f, 0.047913f, 0.690430f, 0.045074f, 0.682129f, 0.042419f, 0.673340f, 0.039948f,
+ 0.664062f, 0.037598f, 0.654785f, 0.035431f, 0.644531f, 0.033386f, 0.634277f, 0.031464f,
+ 0.623535f, 0.029694f, 0.612793f, 0.028000f, 0.601562f, 0.026413f, 0.590332f, 0.024933f,
+ 0.578613f, 0.023529f, 0.566895f, 0.022217f, 0.555176f, 0.020981f, 0.543457f, 0.019836f,
+ 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f,
+ 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.322266f, 0.649414f,
+ 0.328613f, 0.627441f, 0.336914f, 0.600586f, 0.347900f, 0.570801f, 0.361572f, 0.539551f,
+ 0.377930f, 0.508789f, 0.396484f, 0.479248f, 0.416992f, 0.450928f, 0.438965f, 0.424072f,
+ 0.461426f, 0.398682f, 0.484131f, 0.374512f, 0.506348f, 0.351807f, 0.528320f, 0.330078f,
+ 0.549805f, 0.309570f, 0.569824f, 0.290039f, 0.589355f, 0.271973f, 0.607422f, 0.254639f,
+ 0.624512f, 0.238525f, 0.640137f, 0.223267f, 0.654785f, 0.208984f, 0.668457f, 0.195557f,
+ 0.680664f, 0.183105f, 0.691895f, 0.171387f, 0.701660f, 0.160522f, 0.710449f, 0.150269f,
+ 0.718262f, 0.140747f, 0.724609f, 0.131836f, 0.729980f, 0.123596f, 0.734375f, 0.115845f,
+ 0.737793f, 0.108643f, 0.740234f, 0.101868f, 0.741211f, 0.095581f, 0.741699f, 0.089722f,
+ 0.740723f, 0.084229f, 0.739258f, 0.079102f, 0.736816f, 0.074341f, 0.733398f, 0.069885f,
+ 0.729492f, 0.065735f, 0.724609f, 0.061859f, 0.719238f, 0.058197f, 0.712891f, 0.054779f,
+ 0.706543f, 0.051605f, 0.699219f, 0.048615f, 0.691406f, 0.045807f, 0.683105f, 0.043182f,
+ 0.674316f, 0.040710f, 0.665039f, 0.038422f, 0.655762f, 0.036255f, 0.645508f, 0.034210f,
+ 0.635254f, 0.032318f, 0.625000f, 0.030518f, 0.614258f, 0.028839f, 0.603516f, 0.027252f,
+ 0.592285f, 0.025757f, 0.581055f, 0.024368f, 0.569336f, 0.023041f, 0.558105f, 0.021805f,
+ 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f,
+ 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.202271f, 0.719238f,
+ 0.218872f, 0.678711f, 0.239990f, 0.639648f, 0.264893f, 0.603027f, 0.292725f, 0.568848f,
+ 0.322266f, 0.537109f, 0.352783f, 0.506348f, 0.383057f, 0.477295f, 0.413086f, 0.449219f,
+ 0.441895f, 0.422119f, 0.469482f, 0.396484f, 0.495850f, 0.371826f, 0.520508f, 0.348633f,
+ 0.543945f, 0.326660f, 0.565918f, 0.305908f, 0.586426f, 0.286377f, 0.605469f, 0.268066f,
+ 0.623047f, 0.250732f, 0.639160f, 0.234863f, 0.654297f, 0.219849f, 0.667969f, 0.205811f,
+ 0.680176f, 0.192627f, 0.691406f, 0.180420f, 0.701660f, 0.168945f, 0.710938f, 0.158325f,
+ 0.718750f, 0.148438f, 0.725586f, 0.139160f, 0.730957f, 0.130493f, 0.735840f, 0.122498f,
+ 0.739258f, 0.114990f, 0.742188f, 0.107971f, 0.743652f, 0.101440f, 0.744141f, 0.095276f,
+ 0.744141f, 0.089600f, 0.743164f, 0.084290f, 0.741211f, 0.079285f, 0.738281f, 0.074646f,
+ 0.734863f, 0.070251f, 0.730469f, 0.066162f, 0.725586f, 0.062378f, 0.719727f, 0.058807f,
+ 0.713867f, 0.055450f, 0.707031f, 0.052338f, 0.699707f, 0.049377f, 0.691895f, 0.046631f,
+ 0.683594f, 0.044037f, 0.675293f, 0.041595f, 0.666016f, 0.039307f, 0.656738f, 0.037170f,
+ 0.646973f, 0.035156f, 0.637207f, 0.033264f, 0.626953f, 0.031464f, 0.616211f, 0.029800f,
+ 0.605469f, 0.028229f, 0.594727f, 0.026733f, 0.583496f, 0.025330f, 0.572266f, 0.024017f,
+ 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f,
+ 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.153564f, 0.733887f,
+ 0.189453f, 0.698242f, 0.225830f, 0.661621f, 0.261963f, 0.625488f, 0.297363f, 0.590332f,
+ 0.331543f, 0.556152f, 0.364502f, 0.522949f, 0.395752f, 0.491699f, 0.425781f, 0.461670f,
+ 0.454102f, 0.433350f, 0.480957f, 0.406494f, 0.505859f, 0.381104f, 0.529785f, 0.357178f,
+ 0.551758f, 0.334717f, 0.572754f, 0.313721f, 0.592285f, 0.293945f, 0.610352f, 0.275391f,
+ 0.626953f, 0.258057f, 0.642578f, 0.242065f, 0.656738f, 0.226807f, 0.670410f, 0.212646f,
+ 0.682129f, 0.199463f, 0.693359f, 0.187012f, 0.703125f, 0.175537f, 0.711914f, 0.164673f,
+ 0.719727f, 0.154663f, 0.726562f, 0.145264f, 0.732422f, 0.136475f, 0.737305f, 0.128174f,
+ 0.741211f, 0.120544f, 0.743652f, 0.113403f, 0.745605f, 0.106689f, 0.747070f, 0.100464f,
+ 0.747070f, 0.094604f, 0.746094f, 0.089111f, 0.744629f, 0.083984f, 0.742676f, 0.079163f,
+ 0.739258f, 0.074707f, 0.735840f, 0.070435f, 0.731445f, 0.066528f, 0.726074f, 0.062805f,
+ 0.720703f, 0.059357f, 0.714355f, 0.056091f, 0.707520f, 0.053040f, 0.700684f, 0.050171f,
+ 0.692871f, 0.047455f, 0.684570f, 0.044922f, 0.676270f, 0.042542f, 0.667480f, 0.040283f,
+ 0.658203f, 0.038177f, 0.648438f, 0.036194f, 0.638672f, 0.034302f, 0.628906f, 0.032532f,
+ 0.618652f, 0.030884f, 0.607910f, 0.029312f, 0.597656f, 0.027832f, 0.586426f, 0.026428f,
+};
+
+const float btdf_split_sum_ggx[16][64 * 64 * 2] = {
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.468994f, 0.999512f, 0.470215f, 0.999512f, 0.480713f,
+ 0.999512f, 0.490967f, 0.999512f, 0.499756f, 0.999512f, 0.507324f, 0.999512f, 0.513672f,
+ 0.999512f, 0.518555f, 0.999512f, 0.522949f, 0.999512f, 0.526367f, 0.999512f, 0.529297f,
+ 0.999512f, 0.531250f, 0.999512f, 0.533203f, 0.999512f, 0.534668f, 0.999512f, 0.535645f,
+ 0.999512f, 0.536133f, 0.999512f, 0.536133f, 0.999512f, 0.536133f, 0.999512f, 0.535645f,
+ 0.999512f, 0.535156f, 0.999512f, 0.534180f, 0.999512f, 0.533203f, 0.999512f, 0.532227f,
+ 0.999512f, 0.530762f, 0.999512f, 0.528809f, 0.999512f, 0.526855f, 0.999512f, 0.524902f,
+ 0.999512f, 0.522461f, 0.999512f, 0.520020f, 0.999512f, 0.517578f, 0.999512f, 0.514648f,
+ 0.999512f, 0.511719f, 0.999512f, 0.508789f, 0.999512f, 0.505371f, 0.999512f, 0.501465f,
+ 0.999512f, 0.498047f, 0.999512f, 0.494141f, 0.999512f, 0.489746f, 0.999512f, 0.485352f,
+ 0.999512f, 0.480713f, 0.999512f, 0.475830f, 0.999512f, 0.470459f, 0.999512f, 0.464844f,
+ 0.999512f, 0.458984f, 0.999512f, 0.452881f, 0.999512f, 0.446289f, 0.999512f, 0.439209f,
+ 0.999512f, 0.431641f, 0.999512f, 0.423584f, 0.999512f, 0.414795f, 0.999512f, 0.405518f,
+ 0.999512f, 0.395264f, 0.999512f, 0.384277f, 0.999512f, 0.372070f, 0.999512f, 0.358398f,
+ 0.999512f, 0.343262f, 0.999512f, 0.325928f, 0.999512f, 0.305664f, 0.999512f, 0.281738f,
+ 0.999512f, 0.251953f, 0.999512f, 0.212524f, 0.999512f, 0.152954f, 0.999512f, 0.040253f,
+ 0.000000f, 1.000000f, 0.999512f, 0.484131f, 1.000000f, 0.432861f, 0.999512f, 0.411865f,
+ 0.999512f, 0.400879f, 1.000000f, 0.394287f, 1.000000f, 0.389893f, 0.999512f, 0.386719f,
+ 0.999512f, 0.384033f, 0.999512f, 0.381836f, 1.000000f, 0.379883f, 0.999512f, 0.377930f,
+ 1.000000f, 0.375977f, 0.999512f, 0.374023f, 1.000000f, 0.372070f, 0.999512f, 0.370117f,
+ 0.999512f, 0.367920f, 0.999512f, 0.365723f, 1.000000f, 0.363281f, 0.999512f, 0.361084f,
+ 0.999512f, 0.358398f, 0.999512f, 0.355957f, 1.000000f, 0.353271f, 0.999512f, 0.350342f,
+ 0.999512f, 0.347412f, 0.999512f, 0.344238f, 0.999512f, 0.341309f, 0.999512f, 0.337891f,
+ 1.000000f, 0.334473f, 0.999512f, 0.331055f, 1.000000f, 0.327393f, 0.999512f, 0.323730f,
+ 0.999512f, 0.319824f, 0.999512f, 0.315674f, 0.999512f, 0.311523f, 0.999512f, 0.307373f,
+ 0.999512f, 0.302734f, 0.999512f, 0.298096f, 0.999512f, 0.293457f, 0.999512f, 0.288574f,
+ 0.999512f, 0.283203f, 0.999512f, 0.278076f, 0.999512f, 0.272461f, 0.999512f, 0.266602f,
+ 0.999512f, 0.260498f, 0.999512f, 0.254395f, 0.999512f, 0.247803f, 0.999512f, 0.240845f,
+ 0.999512f, 0.233643f, 0.999512f, 0.226074f, 0.999512f, 0.218018f, 0.999512f, 0.209473f,
+ 0.999512f, 0.200439f, 0.999512f, 0.190796f, 0.999512f, 0.180542f, 1.000000f, 0.169312f,
+ 0.999512f, 0.157227f, 0.999512f, 0.143921f, 0.999512f, 0.129028f, 0.999512f, 0.112366f,
+ 0.999512f, 0.093018f, 0.999512f, 0.069946f, 0.999512f, 0.040527f, 0.999512f, 0.004879f,
+ 0.000000f, 1.000000f, 1.000000f, 0.506836f, 1.000000f, 0.434570f, 1.000000f, 0.398193f,
+ 1.000000f, 0.375977f, 1.000000f, 0.360352f, 0.999512f, 0.348877f, 0.999512f, 0.339600f,
+ 1.000000f, 0.332031f, 1.000000f, 0.325684f, 1.000000f, 0.319824f, 1.000000f, 0.314697f,
+ 1.000000f, 0.310059f, 1.000000f, 0.305664f, 1.000000f, 0.301514f, 1.000000f, 0.297363f,
+ 1.000000f, 0.293457f, 1.000000f, 0.289795f, 1.000000f, 0.285889f, 1.000000f, 0.282227f,
+ 1.000000f, 0.278564f, 0.999512f, 0.274902f, 1.000000f, 0.271240f, 1.000000f, 0.267578f,
+ 1.000000f, 0.263916f, 1.000000f, 0.260254f, 1.000000f, 0.256592f, 1.000000f, 0.252686f,
+ 1.000000f, 0.249023f, 1.000000f, 0.245117f, 1.000000f, 0.241089f, 1.000000f, 0.237183f,
+ 1.000000f, 0.233032f, 1.000000f, 0.228882f, 1.000000f, 0.224731f, 1.000000f, 0.220337f,
+ 1.000000f, 0.215942f, 1.000000f, 0.211426f, 1.000000f, 0.206787f, 0.999512f, 0.202148f,
+ 1.000000f, 0.197266f, 1.000000f, 0.192261f, 1.000000f, 0.187134f, 0.999512f, 0.181885f,
+ 1.000000f, 0.176514f, 1.000000f, 0.170898f, 1.000000f, 0.165161f, 1.000000f, 0.159180f,
+ 1.000000f, 0.152954f, 0.999512f, 0.146484f, 1.000000f, 0.139771f, 0.999512f, 0.132812f,
+ 1.000000f, 0.125488f, 0.999512f, 0.117737f, 0.999512f, 0.109619f, 0.999512f, 0.101013f,
+ 0.999512f, 0.091858f, 1.000000f, 0.082092f, 1.000000f, 0.071533f, 0.999512f, 0.060028f,
+ 0.999512f, 0.047333f, 0.999512f, 0.033081f, 1.000000f, 0.016830f, 0.999512f, 0.001331f,
+ 0.000000f, 1.000000f, 1.000000f, 0.524902f, 1.000000f, 0.440430f, 1.000000f, 0.395020f,
+ 1.000000f, 0.365479f, 1.000000f, 0.343994f, 1.000000f, 0.327637f, 1.000000f, 0.314453f,
+ 1.000000f, 0.303467f, 1.000000f, 0.293945f, 1.000000f, 0.285645f, 1.000000f, 0.278076f,
+ 1.000000f, 0.271484f, 1.000000f, 0.265381f, 1.000000f, 0.259521f, 1.000000f, 0.254150f,
+ 1.000000f, 0.249023f, 1.000000f, 0.244141f, 0.999512f, 0.239380f, 1.000000f, 0.234863f,
+ 1.000000f, 0.230469f, 1.000000f, 0.226074f, 1.000000f, 0.221802f, 1.000000f, 0.217651f,
+ 1.000000f, 0.213501f, 1.000000f, 0.209473f, 1.000000f, 0.205322f, 1.000000f, 0.201294f,
+ 0.999512f, 0.197266f, 1.000000f, 0.193237f, 1.000000f, 0.189209f, 1.000000f, 0.185181f,
+ 1.000000f, 0.181030f, 0.999512f, 0.177002f, 1.000000f, 0.172852f, 0.999512f, 0.168701f,
+ 1.000000f, 0.164429f, 0.999512f, 0.160156f, 1.000000f, 0.155884f, 1.000000f, 0.151489f,
+ 1.000000f, 0.147095f, 1.000000f, 0.142578f, 1.000000f, 0.137939f, 1.000000f, 0.133301f,
+ 1.000000f, 0.128540f, 1.000000f, 0.123657f, 1.000000f, 0.118652f, 1.000000f, 0.113525f,
+ 1.000000f, 0.108276f, 1.000000f, 0.102844f, 1.000000f, 0.097290f, 1.000000f, 0.091553f,
+ 1.000000f, 0.085571f, 1.000000f, 0.079407f, 1.000000f, 0.073059f, 1.000000f, 0.066345f,
+ 1.000000f, 0.059387f, 1.000000f, 0.052063f, 1.000000f, 0.044342f, 0.999512f, 0.036194f,
+ 0.999512f, 0.027496f, 1.000000f, 0.018219f, 0.999512f, 0.008430f, 0.999512f, 0.000505f,
+ 0.000000f, 1.000000f, 1.000000f, 0.538574f, 1.000000f, 0.446777f, 1.000000f, 0.395020f,
+ 1.000000f, 0.360352f, 1.000000f, 0.334717f, 1.000000f, 0.314941f, 1.000000f, 0.298584f,
+ 1.000000f, 0.284912f, 1.000000f, 0.273193f, 1.000000f, 0.263184f, 1.000000f, 0.253906f,
+ 1.000000f, 0.245850f, 1.000000f, 0.238281f, 1.000000f, 0.231445f, 1.000000f, 0.224976f,
+ 1.000000f, 0.218872f, 1.000000f, 0.213257f, 0.999512f, 0.207764f, 1.000000f, 0.202637f,
+ 1.000000f, 0.197632f, 1.000000f, 0.192749f, 1.000000f, 0.188110f, 1.000000f, 0.183594f,
+ 1.000000f, 0.179199f, 0.999512f, 0.174927f, 1.000000f, 0.170654f, 1.000000f, 0.166382f,
+ 0.999512f, 0.162354f, 1.000000f, 0.158203f, 1.000000f, 0.154175f, 1.000000f, 0.150146f,
+ 1.000000f, 0.146240f, 1.000000f, 0.142212f, 1.000000f, 0.138184f, 1.000000f, 0.134277f,
+ 1.000000f, 0.130249f, 1.000000f, 0.126343f, 1.000000f, 0.122314f, 1.000000f, 0.118286f,
+ 1.000000f, 0.114258f, 1.000000f, 0.110168f, 1.000000f, 0.106079f, 1.000000f, 0.101868f,
+ 0.999512f, 0.097717f, 0.999512f, 0.093445f, 1.000000f, 0.089111f, 1.000000f, 0.084717f,
+ 1.000000f, 0.080200f, 1.000000f, 0.075684f, 1.000000f, 0.071045f, 1.000000f, 0.066284f,
+ 1.000000f, 0.061462f, 1.000000f, 0.056488f, 1.000000f, 0.051361f, 1.000000f, 0.046112f,
+ 0.999512f, 0.040710f, 1.000000f, 0.035126f, 1.000000f, 0.029388f, 1.000000f, 0.023422f,
+ 1.000000f, 0.017273f, 0.999512f, 0.010963f, 0.999512f, 0.004715f, 0.999512f, 0.000231f,
+ 0.000000f, 1.000000f, 1.000000f, 0.549316f, 1.000000f, 0.452393f, 1.000000f, 0.396240f,
+ 1.000000f, 0.357666f, 1.000000f, 0.329102f, 1.000000f, 0.306396f, 1.000000f, 0.287842f,
+ 1.000000f, 0.272217f, 0.999512f, 0.258789f, 1.000000f, 0.247192f, 1.000000f, 0.236816f,
+ 0.999512f, 0.227417f, 1.000000f, 0.218872f, 1.000000f, 0.211060f, 1.000000f, 0.203857f,
+ 1.000000f, 0.197144f, 0.999512f, 0.190796f, 1.000000f, 0.184814f, 1.000000f, 0.179199f,
+ 1.000000f, 0.173828f, 1.000000f, 0.168701f, 1.000000f, 0.163696f, 1.000000f, 0.158936f,
+ 1.000000f, 0.154297f, 0.999512f, 0.149902f, 1.000000f, 0.145508f, 1.000000f, 0.141235f,
+ 1.000000f, 0.137085f, 1.000000f, 0.133057f, 1.000000f, 0.129028f, 1.000000f, 0.125122f,
+ 0.999512f, 0.121277f, 0.999512f, 0.117432f, 1.000000f, 0.113647f, 1.000000f, 0.109863f,
+ 1.000000f, 0.106140f, 1.000000f, 0.102417f, 1.000000f, 0.098694f, 1.000000f, 0.094971f,
+ 1.000000f, 0.091309f, 0.999512f, 0.087585f, 0.999512f, 0.083923f, 1.000000f, 0.080200f,
+ 1.000000f, 0.076477f, 0.999512f, 0.072754f, 1.000000f, 0.068970f, 0.999512f, 0.065186f,
+ 0.999512f, 0.061371f, 1.000000f, 0.057495f, 1.000000f, 0.053619f, 1.000000f, 0.049652f,
+ 1.000000f, 0.045654f, 1.000000f, 0.041595f, 1.000000f, 0.037476f, 1.000000f, 0.033295f,
+ 0.999512f, 0.029053f, 1.000000f, 0.024734f, 1.000000f, 0.020340f, 1.000000f, 0.015900f,
+ 0.999512f, 0.011436f, 1.000000f, 0.007008f, 1.000000f, 0.002840f, 0.999512f, 0.000120f,
+ 0.000000f, 1.000000f, 0.999512f, 0.558105f, 1.000000f, 0.457275f, 0.999512f, 0.397705f,
+ 1.000000f, 0.356201f, 1.000000f, 0.325195f, 1.000000f, 0.300293f, 0.999512f, 0.280029f,
+ 1.000000f, 0.262939f, 1.000000f, 0.248291f, 0.999512f, 0.235352f, 1.000000f, 0.223877f,
+ 1.000000f, 0.213623f, 1.000000f, 0.204346f, 0.999512f, 0.195801f, 0.999512f, 0.187988f,
+ 1.000000f, 0.180664f, 1.000000f, 0.173828f, 0.999512f, 0.167480f, 1.000000f, 0.161499f,
+ 0.999512f, 0.155884f, 1.000000f, 0.150391f, 0.999512f, 0.145264f, 1.000000f, 0.140381f,
+ 1.000000f, 0.135620f, 0.999512f, 0.131104f, 1.000000f, 0.126587f, 1.000000f, 0.122375f,
+ 1.000000f, 0.118225f, 1.000000f, 0.114197f, 1.000000f, 0.110291f, 1.000000f, 0.106445f,
+ 1.000000f, 0.102661f, 1.000000f, 0.098999f, 1.000000f, 0.095337f, 1.000000f, 0.091736f,
+ 0.999512f, 0.088257f, 1.000000f, 0.084778f, 1.000000f, 0.081299f, 0.999512f, 0.077881f,
+ 0.999512f, 0.074524f, 1.000000f, 0.071167f, 1.000000f, 0.067810f, 1.000000f, 0.064514f,
+ 1.000000f, 0.061218f, 1.000000f, 0.057922f, 1.000000f, 0.054626f, 1.000000f, 0.051331f,
+ 0.999512f, 0.048065f, 1.000000f, 0.044739f, 0.999512f, 0.041443f, 0.999512f, 0.038116f,
+ 1.000000f, 0.034790f, 1.000000f, 0.031464f, 1.000000f, 0.028107f, 0.999512f, 0.024734f,
+ 0.999512f, 0.021347f, 1.000000f, 0.017960f, 1.000000f, 0.014565f, 1.000000f, 0.011185f,
+ 1.000000f, 0.007866f, 1.000000f, 0.004681f, 0.999512f, 0.001804f, 1.000000f, 0.000067f,
+ 0.000000f, 1.000000f, 1.000000f, 0.564941f, 1.000000f, 0.461426f, 1.000000f, 0.399170f,
+ 1.000000f, 0.355469f, 1.000000f, 0.322510f, 0.999512f, 0.296143f, 1.000000f, 0.274170f,
+ 1.000000f, 0.255859f, 1.000000f, 0.240112f, 0.999512f, 0.226196f, 1.000000f, 0.213989f,
+ 0.999512f, 0.202881f, 0.999512f, 0.192993f, 1.000000f, 0.183838f, 1.000000f, 0.175537f,
+ 1.000000f, 0.167847f, 1.000000f, 0.160645f, 1.000000f, 0.154053f, 1.000000f, 0.147705f,
+ 0.999512f, 0.141846f, 0.999512f, 0.136230f, 1.000000f, 0.130981f, 1.000000f, 0.125854f,
+ 1.000000f, 0.121094f, 1.000000f, 0.116455f, 1.000000f, 0.112061f, 1.000000f, 0.107788f,
+ 1.000000f, 0.103638f, 1.000000f, 0.099670f, 1.000000f, 0.095825f, 1.000000f, 0.092041f,
+ 1.000000f, 0.088379f, 1.000000f, 0.084839f, 1.000000f, 0.081360f, 1.000000f, 0.078003f,
+ 1.000000f, 0.074646f, 1.000000f, 0.071411f, 1.000000f, 0.068176f, 1.000000f, 0.065002f,
+ 0.999512f, 0.061951f, 0.999512f, 0.058868f, 1.000000f, 0.055847f, 0.999512f, 0.052856f,
+ 1.000000f, 0.049896f, 0.999512f, 0.046967f, 1.000000f, 0.044067f, 1.000000f, 0.041199f,
+ 1.000000f, 0.038330f, 1.000000f, 0.035492f, 0.999512f, 0.032684f, 0.999512f, 0.029877f,
+ 1.000000f, 0.027069f, 0.999512f, 0.024292f, 0.999512f, 0.021530f, 1.000000f, 0.018784f,
+ 1.000000f, 0.016052f, 0.999512f, 0.013351f, 1.000000f, 0.010689f, 1.000000f, 0.008087f,
+ 1.000000f, 0.005581f, 1.000000f, 0.003231f, 1.000000f, 0.001194f, 0.999512f, 0.000040f,
+ 0.000000f, 1.000000f, 1.000000f, 0.570801f, 1.000000f, 0.465088f, 1.000000f, 0.400635f,
+ 1.000000f, 0.355225f, 1.000000f, 0.320557f, 1.000000f, 0.292725f, 1.000000f, 0.269775f,
+ 0.999512f, 0.250488f, 1.000000f, 0.233765f, 0.999512f, 0.218994f, 1.000000f, 0.206055f,
+ 1.000000f, 0.194458f, 1.000000f, 0.183960f, 1.000000f, 0.174438f, 1.000000f, 0.165649f,
+ 1.000000f, 0.157593f, 0.999512f, 0.150146f, 1.000000f, 0.143311f, 1.000000f, 0.136719f,
+ 1.000000f, 0.130737f, 1.000000f, 0.125000f, 1.000000f, 0.119568f, 1.000000f, 0.114441f,
+ 1.000000f, 0.109558f, 0.999512f, 0.104919f, 0.999512f, 0.100464f, 1.000000f, 0.096252f,
+ 1.000000f, 0.092163f, 1.000000f, 0.088196f, 0.999512f, 0.084412f, 1.000000f, 0.080750f,
+ 1.000000f, 0.077209f, 1.000000f, 0.073792f, 1.000000f, 0.070496f, 1.000000f, 0.067261f,
+ 1.000000f, 0.064087f, 0.999512f, 0.061035f, 1.000000f, 0.058044f, 1.000000f, 0.055115f,
+ 1.000000f, 0.052246f, 1.000000f, 0.049408f, 1.000000f, 0.046661f, 1.000000f, 0.043976f,
+ 0.999512f, 0.041290f, 1.000000f, 0.038696f, 0.999512f, 0.036102f, 1.000000f, 0.033569f,
+ 1.000000f, 0.031082f, 0.999512f, 0.028610f, 1.000000f, 0.026184f, 1.000000f, 0.023788f,
+ 1.000000f, 0.021423f, 1.000000f, 0.019073f, 0.999512f, 0.016785f, 1.000000f, 0.014519f,
+ 0.999512f, 0.012299f, 0.999512f, 0.010124f, 1.000000f, 0.008011f, 1.000000f, 0.005978f,
+ 1.000000f, 0.004051f, 1.000000f, 0.002293f, 1.000000f, 0.000817f, 1.000000f, 0.000025f,
+ 0.000000f, 1.000000f, 1.000000f, 0.575684f, 0.999512f, 0.468018f, 1.000000f, 0.402100f,
+ 1.000000f, 0.354980f, 1.000000f, 0.319092f, 1.000000f, 0.290283f, 1.000000f, 0.266357f,
+ 1.000000f, 0.246094f, 1.000000f, 0.228638f, 1.000000f, 0.213257f, 1.000000f, 0.199707f,
+ 1.000000f, 0.187622f, 1.000000f, 0.176758f, 1.000000f, 0.166748f, 1.000000f, 0.157715f,
+ 1.000000f, 0.149414f, 1.000000f, 0.141724f, 1.000000f, 0.134521f, 1.000000f, 0.127930f,
+ 0.999512f, 0.121704f, 1.000000f, 0.115906f, 1.000000f, 0.110413f, 1.000000f, 0.105225f,
+ 1.000000f, 0.100281f, 1.000000f, 0.095642f, 1.000000f, 0.091187f, 1.000000f, 0.086975f,
+ 0.999512f, 0.082886f, 1.000000f, 0.079041f, 1.000000f, 0.075317f, 1.000000f, 0.071777f,
+ 1.000000f, 0.068298f, 1.000000f, 0.065002f, 1.000000f, 0.061829f, 0.999512f, 0.058746f,
+ 1.000000f, 0.055756f, 1.000000f, 0.052856f, 1.000000f, 0.050049f, 1.000000f, 0.047302f,
+ 1.000000f, 0.044647f, 0.999512f, 0.042053f, 0.999512f, 0.039520f, 1.000000f, 0.037048f,
+ 0.999512f, 0.034637f, 1.000000f, 0.032288f, 1.000000f, 0.029999f, 1.000000f, 0.027756f,
+ 1.000000f, 0.025543f, 1.000000f, 0.023392f, 1.000000f, 0.021271f, 1.000000f, 0.019211f,
+ 0.999512f, 0.017181f, 1.000000f, 0.015213f, 1.000000f, 0.013283f, 1.000000f, 0.011398f,
+ 0.999512f, 0.009567f, 1.000000f, 0.007805f, 0.999512f, 0.006107f, 1.000000f, 0.004498f,
+ 0.999512f, 0.003000f, 1.000000f, 0.001662f, 1.000000f, 0.000573f, 1.000000f, 0.000017f,
+ 0.000000f, 1.000000f, 1.000000f, 0.579590f, 1.000000f, 0.470703f, 0.999512f, 0.403320f,
+ 1.000000f, 0.355225f, 1.000000f, 0.318115f, 1.000000f, 0.288086f, 1.000000f, 0.263428f,
+ 1.000000f, 0.242554f, 1.000000f, 0.224365f, 1.000000f, 0.208618f, 1.000000f, 0.194580f,
+ 1.000000f, 0.182007f, 1.000000f, 0.170776f, 1.000000f, 0.160522f, 1.000000f, 0.151245f,
+ 1.000000f, 0.142578f, 1.000000f, 0.134766f, 1.000000f, 0.127441f, 1.000000f, 0.120667f,
+ 0.999512f, 0.114380f, 1.000000f, 0.108459f, 1.000000f, 0.102844f, 1.000000f, 0.097656f,
+ 1.000000f, 0.092712f, 1.000000f, 0.088013f, 1.000000f, 0.083618f, 1.000000f, 0.079407f,
+ 1.000000f, 0.075439f, 1.000000f, 0.071594f, 1.000000f, 0.067993f, 1.000000f, 0.064453f,
+ 1.000000f, 0.061157f, 1.000000f, 0.057953f, 0.999512f, 0.054871f, 1.000000f, 0.051910f,
+ 1.000000f, 0.049072f, 1.000000f, 0.046326f, 1.000000f, 0.043671f, 1.000000f, 0.041107f,
+ 1.000000f, 0.038605f, 1.000000f, 0.036194f, 1.000000f, 0.033875f, 1.000000f, 0.031616f,
+ 1.000000f, 0.029434f, 1.000000f, 0.027298f, 1.000000f, 0.025223f, 1.000000f, 0.023224f,
+ 1.000000f, 0.021255f, 1.000000f, 0.019363f, 1.000000f, 0.017517f, 1.000000f, 0.015717f,
+ 1.000000f, 0.013977f, 1.000000f, 0.012291f, 1.000000f, 0.010651f, 1.000000f, 0.009071f,
+ 1.000000f, 0.007557f, 0.999512f, 0.006104f, 1.000000f, 0.004726f, 0.999512f, 0.003439f,
+ 0.999512f, 0.002260f, 0.999512f, 0.001228f, 1.000000f, 0.000412f, 0.999512f, 0.000011f,
+ 0.000000f, 1.000000f, 1.000000f, 0.583008f, 1.000000f, 0.473145f, 1.000000f, 0.404541f,
+ 1.000000f, 0.355225f, 1.000000f, 0.317139f, 1.000000f, 0.286621f, 1.000000f, 0.261230f,
+ 1.000000f, 0.239624f, 1.000000f, 0.220947f, 1.000000f, 0.204712f, 1.000000f, 0.190308f,
+ 1.000000f, 0.177368f, 1.000000f, 0.165771f, 1.000000f, 0.155273f, 1.000000f, 0.145752f,
+ 1.000000f, 0.137085f, 1.000000f, 0.129028f, 1.000000f, 0.121582f, 1.000000f, 0.114685f,
+ 1.000000f, 0.108276f, 1.000000f, 0.102295f, 1.000000f, 0.096680f, 1.000000f, 0.091431f,
+ 1.000000f, 0.086487f, 1.000000f, 0.081787f, 1.000000f, 0.077393f, 1.000000f, 0.073242f,
+ 1.000000f, 0.069275f, 0.999512f, 0.065552f, 1.000000f, 0.061951f, 1.000000f, 0.058563f,
+ 0.999512f, 0.055298f, 1.000000f, 0.052216f, 0.999512f, 0.049225f, 1.000000f, 0.046387f,
+ 1.000000f, 0.043671f, 1.000000f, 0.041046f, 1.000000f, 0.038513f, 1.000000f, 0.036102f,
+ 1.000000f, 0.033783f, 1.000000f, 0.031525f, 1.000000f, 0.029373f, 1.000000f, 0.027298f,
+ 1.000000f, 0.025284f, 1.000000f, 0.023346f, 0.999512f, 0.021469f, 1.000000f, 0.019653f,
+ 1.000000f, 0.017899f, 1.000000f, 0.016220f, 1.000000f, 0.014587f, 1.000000f, 0.013016f,
+ 1.000000f, 0.011505f, 1.000000f, 0.010048f, 1.000000f, 0.008652f, 1.000000f, 0.007313f,
+ 1.000000f, 0.006042f, 1.000000f, 0.004837f, 1.000000f, 0.003708f, 1.000000f, 0.002666f,
+ 1.000000f, 0.001729f, 1.000000f, 0.000923f, 1.000000f, 0.000301f, 1.000000f, 0.000008f,
+ 0.000000f, 1.000000f, 1.000000f, 0.585938f, 1.000000f, 0.475098f, 1.000000f, 0.405518f,
+ 1.000000f, 0.355225f, 1.000000f, 0.316650f, 1.000000f, 0.285156f, 1.000000f, 0.259277f,
+ 1.000000f, 0.237183f, 1.000000f, 0.218140f, 1.000000f, 0.201416f, 1.000000f, 0.186646f,
+ 1.000000f, 0.173584f, 1.000000f, 0.161743f, 1.000000f, 0.151001f, 1.000000f, 0.141235f,
+ 1.000000f, 0.132324f, 1.000000f, 0.124207f, 0.999512f, 0.116638f, 1.000000f, 0.109680f,
+ 1.000000f, 0.103210f, 0.999512f, 0.097168f, 1.000000f, 0.091492f, 1.000000f, 0.086243f,
+ 1.000000f, 0.081299f, 1.000000f, 0.076660f, 1.000000f, 0.072266f, 1.000000f, 0.068115f,
+ 1.000000f, 0.064209f, 1.000000f, 0.060516f, 1.000000f, 0.057007f, 1.000000f, 0.053680f,
+ 1.000000f, 0.050507f, 1.000000f, 0.047485f, 1.000000f, 0.044617f, 1.000000f, 0.041870f,
+ 1.000000f, 0.039246f, 1.000000f, 0.036743f, 1.000000f, 0.034363f, 0.999512f, 0.032074f,
+ 1.000000f, 0.029877f, 1.000000f, 0.027771f, 1.000000f, 0.025757f, 1.000000f, 0.023819f,
+ 1.000000f, 0.021957f, 0.999512f, 0.020172f, 1.000000f, 0.018463f, 1.000000f, 0.016830f,
+ 1.000000f, 0.015251f, 1.000000f, 0.013741f, 1.000000f, 0.012291f, 0.999512f, 0.010902f,
+ 1.000000f, 0.009575f, 1.000000f, 0.008308f, 1.000000f, 0.007107f, 1.000000f, 0.005966f,
+ 1.000000f, 0.004887f, 1.000000f, 0.003880f, 1.000000f, 0.002945f, 1.000000f, 0.002094f,
+ 0.999512f, 0.001340f, 1.000000f, 0.000703f, 0.999512f, 0.000224f, 1.000000f, 0.000005f,
+ 0.000000f, 1.000000f, 1.000000f, 0.588379f, 1.000000f, 0.476807f, 1.000000f, 0.406250f,
+ 1.000000f, 0.355469f, 1.000000f, 0.315918f, 1.000000f, 0.284180f, 1.000000f, 0.257568f,
+ 1.000000f, 0.235229f, 1.000000f, 0.215698f, 1.000000f, 0.198730f, 1.000000f, 0.183716f,
+ 1.000000f, 0.170288f, 1.000000f, 0.158203f, 0.999512f, 0.147339f, 1.000000f, 0.137451f,
+ 0.999512f, 0.128418f, 0.999512f, 0.120178f, 1.000000f, 0.112549f, 0.999512f, 0.105469f,
+ 1.000000f, 0.098938f, 1.000000f, 0.092896f, 1.000000f, 0.087219f, 1.000000f, 0.081909f,
+ 1.000000f, 0.076965f, 1.000000f, 0.072327f, 1.000000f, 0.067993f, 1.000000f, 0.063843f,
+ 1.000000f, 0.059998f, 1.000000f, 0.056366f, 1.000000f, 0.052917f, 1.000000f, 0.049622f,
+ 1.000000f, 0.046539f, 1.000000f, 0.043610f, 1.000000f, 0.040802f, 1.000000f, 0.038147f,
+ 1.000000f, 0.035645f, 1.000000f, 0.033234f, 1.000000f, 0.030945f, 1.000000f, 0.028778f,
+ 1.000000f, 0.026688f, 1.000000f, 0.024704f, 1.000000f, 0.022812f, 1.000000f, 0.021011f,
+ 1.000000f, 0.019287f, 1.000000f, 0.017639f, 1.000000f, 0.016068f, 1.000000f, 0.014565f,
+ 0.999512f, 0.013130f, 1.000000f, 0.011772f, 0.999512f, 0.010468f, 1.000000f, 0.009232f,
+ 1.000000f, 0.008064f, 1.000000f, 0.006954f, 1.000000f, 0.005905f, 1.000000f, 0.004921f,
+ 0.999512f, 0.004002f, 1.000000f, 0.003149f, 1.000000f, 0.002367f, 1.000000f, 0.001666f,
+ 1.000000f, 0.001052f, 0.999512f, 0.000543f, 1.000000f, 0.000169f, 0.999512f, 0.000004f,
+ 0.000000f, 1.000000f, 1.000000f, 0.590820f, 1.000000f, 0.478271f, 1.000000f, 0.407227f,
+ 1.000000f, 0.355713f, 1.000000f, 0.315674f, 1.000000f, 0.283203f, 1.000000f, 0.256348f,
+ 1.000000f, 0.233521f, 1.000000f, 0.213745f, 1.000000f, 0.196411f, 1.000000f, 0.181152f,
+ 1.000000f, 0.167480f, 1.000000f, 0.155273f, 1.000000f, 0.144287f, 1.000000f, 0.134277f,
+ 1.000000f, 0.125122f, 1.000000f, 0.116760f, 1.000000f, 0.109070f, 1.000000f, 0.101929f,
+ 1.000000f, 0.095398f, 1.000000f, 0.089294f, 1.000000f, 0.083618f, 1.000000f, 0.078308f,
+ 1.000000f, 0.073364f, 1.000000f, 0.068726f, 1.000000f, 0.064392f, 0.999512f, 0.060333f,
+ 1.000000f, 0.056488f, 1.000000f, 0.052887f, 1.000000f, 0.049500f, 1.000000f, 0.046265f,
+ 1.000000f, 0.043243f, 1.000000f, 0.040375f, 1.000000f, 0.037659f, 1.000000f, 0.035095f,
+ 1.000000f, 0.032654f, 1.000000f, 0.030350f, 1.000000f, 0.028152f, 1.000000f, 0.026062f,
+ 1.000000f, 0.024078f, 1.000000f, 0.022202f, 1.000000f, 0.020416f, 1.000000f, 0.018723f,
+ 0.999512f, 0.017105f, 0.999512f, 0.015579f, 1.000000f, 0.014122f, 1.000000f, 0.012741f,
+ 1.000000f, 0.011436f, 1.000000f, 0.010193f, 0.999512f, 0.009018f, 0.999512f, 0.007912f,
+ 1.000000f, 0.006866f, 1.000000f, 0.005882f, 1.000000f, 0.004963f, 1.000000f, 0.004105f,
+ 1.000000f, 0.003313f, 1.000000f, 0.002586f, 1.000000f, 0.001926f, 1.000000f, 0.001341f,
+ 1.000000f, 0.000836f, 1.000000f, 0.000425f, 1.000000f, 0.000129f, 1.000000f, 0.000003f,
+ 0.000000f, 1.000000f, 1.000000f, 0.592773f, 0.999512f, 0.479492f, 0.999512f, 0.407959f,
+ 1.000000f, 0.355713f, 1.000000f, 0.315186f, 0.999512f, 0.282471f, 1.000000f, 0.255127f,
+ 0.999512f, 0.232056f, 1.000000f, 0.212036f, 1.000000f, 0.194458f, 1.000000f, 0.178955f,
+ 1.000000f, 0.165161f, 0.999512f, 0.152832f, 0.999512f, 0.141724f, 0.999512f, 0.131592f,
+ 1.000000f, 0.122314f, 1.000000f, 0.113892f, 1.000000f, 0.106140f, 1.000000f, 0.098999f,
+ 1.000000f, 0.092346f, 1.000000f, 0.086243f, 1.000000f, 0.080566f, 1.000000f, 0.075256f,
+ 0.999512f, 0.070312f, 0.999512f, 0.065674f, 1.000000f, 0.061401f, 1.000000f, 0.057343f,
+ 1.000000f, 0.053558f, 1.000000f, 0.049988f, 1.000000f, 0.046631f, 0.999512f, 0.043488f,
+ 1.000000f, 0.040497f, 1.000000f, 0.037689f, 1.000000f, 0.035034f, 0.999512f, 0.032532f,
+ 1.000000f, 0.030182f, 1.000000f, 0.027954f, 1.000000f, 0.025833f, 1.000000f, 0.023834f,
+ 1.000000f, 0.021942f, 1.000000f, 0.020157f, 1.000000f, 0.018463f, 1.000000f, 0.016846f,
+ 1.000000f, 0.015343f, 1.000000f, 0.013908f, 0.999512f, 0.012550f, 1.000000f, 0.011269f,
+ 1.000000f, 0.010063f, 0.999512f, 0.008926f, 1.000000f, 0.007858f, 1.000000f, 0.006851f,
+ 1.000000f, 0.005913f, 1.000000f, 0.005035f, 0.999512f, 0.004219f, 1.000000f, 0.003468f,
+ 0.999512f, 0.002777f, 1.000000f, 0.002148f, 1.000000f, 0.001586f, 1.000000f, 0.001092f,
+ 1.000000f, 0.000673f, 1.000000f, 0.000337f, 1.000000f, 0.000100f, 1.000000f, 0.000002f,
+ 0.000000f, 1.000000f, 1.000000f, 0.594238f, 1.000000f, 0.480713f, 1.000000f, 0.408447f,
+ 1.000000f, 0.355957f, 0.999512f, 0.314941f, 1.000000f, 0.281982f, 1.000000f, 0.254395f,
+ 1.000000f, 0.230835f, 1.000000f, 0.210571f, 1.000000f, 0.192871f, 0.999512f, 0.177246f,
+ 1.000000f, 0.163208f, 1.000000f, 0.150757f, 0.999512f, 0.139526f, 1.000000f, 0.129272f,
+ 1.000000f, 0.119934f, 1.000000f, 0.111450f, 1.000000f, 0.103638f, 1.000000f, 0.096436f,
+ 0.999512f, 0.089783f, 0.999512f, 0.083679f, 1.000000f, 0.077942f, 0.999512f, 0.072693f,
+ 1.000000f, 0.067749f, 1.000000f, 0.063171f, 1.000000f, 0.058868f, 1.000000f, 0.054840f,
+ 1.000000f, 0.051086f, 1.000000f, 0.047546f, 0.999512f, 0.044250f, 1.000000f, 0.041138f,
+ 1.000000f, 0.038208f, 1.000000f, 0.035461f, 1.000000f, 0.032867f, 1.000000f, 0.030426f,
+ 1.000000f, 0.028137f, 1.000000f, 0.025970f, 1.000000f, 0.023926f, 1.000000f, 0.021988f,
+ 1.000000f, 0.020172f, 1.000000f, 0.018463f, 0.999512f, 0.016846f, 1.000000f, 0.015327f,
+ 1.000000f, 0.013893f, 1.000000f, 0.012543f, 1.000000f, 0.011269f, 1.000000f, 0.010071f,
+ 1.000000f, 0.008949f, 1.000000f, 0.007904f, 1.000000f, 0.006920f, 1.000000f, 0.006004f,
+ 1.000000f, 0.005150f, 1.000000f, 0.004360f, 1.000000f, 0.003632f, 1.000000f, 0.002962f,
+ 1.000000f, 0.002354f, 1.000000f, 0.001807f, 1.000000f, 0.001322f, 1.000000f, 0.000901f,
+ 0.999512f, 0.000548f, 0.999512f, 0.000270f, 1.000000f, 0.000079f, 1.000000f, 0.000002f,
+ 0.000000f, 1.000000f, 1.000000f, 0.595703f, 1.000000f, 0.481689f, 1.000000f, 0.408936f,
+ 1.000000f, 0.355957f, 1.000000f, 0.314697f, 1.000000f, 0.281250f, 1.000000f, 0.253418f,
+ 1.000000f, 0.229858f, 1.000000f, 0.209351f, 1.000000f, 0.191406f, 1.000000f, 0.175659f,
+ 1.000000f, 0.161621f, 1.000000f, 0.148926f, 1.000000f, 0.137573f, 0.999512f, 0.127319f,
+ 1.000000f, 0.117920f, 1.000000f, 0.109375f, 1.000000f, 0.101501f, 1.000000f, 0.094299f,
+ 1.000000f, 0.087646f, 1.000000f, 0.081482f, 1.000000f, 0.075806f, 1.000000f, 0.070496f,
+ 1.000000f, 0.065552f, 1.000000f, 0.061005f, 1.000000f, 0.056732f, 1.000000f, 0.052734f,
+ 1.000000f, 0.049011f, 1.000000f, 0.045502f, 1.000000f, 0.042236f, 1.000000f, 0.039185f,
+ 0.999512f, 0.036285f, 0.999512f, 0.033600f, 1.000000f, 0.031052f, 1.000000f, 0.028671f,
+ 1.000000f, 0.026428f, 1.000000f, 0.024323f, 0.999512f, 0.022339f, 0.999512f, 0.020477f,
+ 1.000000f, 0.018723f, 1.000000f, 0.017075f, 1.000000f, 0.015526f, 1.000000f, 0.014069f,
+ 1.000000f, 0.012703f, 1.000000f, 0.011421f, 1.000000f, 0.010223f, 1.000000f, 0.009102f,
+ 1.000000f, 0.008049f, 1.000000f, 0.007076f, 1.000000f, 0.006165f, 1.000000f, 0.005322f,
+ 1.000000f, 0.004539f, 1.000000f, 0.003820f, 1.000000f, 0.003162f, 1.000000f, 0.002563f,
+ 0.999512f, 0.002022f, 0.999512f, 0.001540f, 1.000000f, 0.001117f, 1.000000f, 0.000753f,
+ 0.999512f, 0.000453f, 1.000000f, 0.000220f, 1.000000f, 0.000063f, 1.000000f, 0.000001f,
+ 0.000000f, 1.000000f, 0.999512f, 0.596680f, 1.000000f, 0.482422f, 1.000000f, 0.409424f,
+ 1.000000f, 0.356201f, 1.000000f, 0.314697f, 0.999512f, 0.281006f, 1.000000f, 0.252930f,
+ 0.999512f, 0.229004f, 0.999512f, 0.208252f, 1.000000f, 0.190308f, 1.000000f, 0.174316f,
+ 0.999512f, 0.160156f, 1.000000f, 0.147461f, 1.000000f, 0.135986f, 1.000000f, 0.125610f,
+ 0.999512f, 0.116211f, 1.000000f, 0.107605f, 1.000000f, 0.099731f, 1.000000f, 0.092468f,
+ 1.000000f, 0.085815f, 1.000000f, 0.079651f, 1.000000f, 0.073975f, 1.000000f, 0.068665f,
+ 1.000000f, 0.063782f, 1.000000f, 0.059204f, 1.000000f, 0.054932f, 1.000000f, 0.050964f,
+ 1.000000f, 0.047272f, 1.000000f, 0.043793f, 1.000000f, 0.040558f, 0.999512f, 0.037537f,
+ 1.000000f, 0.034698f, 1.000000f, 0.032043f, 1.000000f, 0.029541f, 1.000000f, 0.027206f,
+ 1.000000f, 0.025009f, 1.000000f, 0.022949f, 1.000000f, 0.021027f, 1.000000f, 0.019211f,
+ 1.000000f, 0.017517f, 1.000000f, 0.015915f, 1.000000f, 0.014435f, 1.000000f, 0.013039f,
+ 1.000000f, 0.011734f, 0.999512f, 0.010513f, 1.000000f, 0.009369f, 0.999512f, 0.008308f,
+ 0.999512f, 0.007320f, 0.999512f, 0.006405f, 1.000000f, 0.005554f, 1.000000f, 0.004772f,
+ 1.000000f, 0.004047f, 1.000000f, 0.003389f, 1.000000f, 0.002789f, 1.000000f, 0.002245f,
+ 1.000000f, 0.001760f, 0.999512f, 0.001329f, 1.000000f, 0.000956f, 1.000000f, 0.000638f,
+ 1.000000f, 0.000379f, 0.999512f, 0.000182f, 1.000000f, 0.000051f, 1.000000f, 0.000001f,
+ 0.000000f, 1.000000f, 1.000000f, 0.597656f, 1.000000f, 0.483154f, 1.000000f, 0.409912f,
+ 1.000000f, 0.356201f, 1.000000f, 0.314453f, 1.000000f, 0.280518f, 1.000000f, 0.252197f,
+ 1.000000f, 0.228271f, 1.000000f, 0.207397f, 1.000000f, 0.189209f, 1.000000f, 0.173218f,
+ 1.000000f, 0.158936f, 1.000000f, 0.146118f, 1.000000f, 0.134644f, 0.999512f, 0.124268f,
+ 1.000000f, 0.114807f, 1.000000f, 0.106140f, 1.000000f, 0.098206f, 0.999512f, 0.090942f,
+ 1.000000f, 0.084290f, 1.000000f, 0.078125f, 1.000000f, 0.072388f, 0.999512f, 0.067139f,
+ 1.000000f, 0.062225f, 0.999512f, 0.057678f, 1.000000f, 0.053436f, 1.000000f, 0.049500f,
+ 1.000000f, 0.045807f, 1.000000f, 0.042358f, 1.000000f, 0.039154f, 1.000000f, 0.036163f,
+ 1.000000f, 0.033356f, 1.000000f, 0.030746f, 1.000000f, 0.028290f, 1.000000f, 0.025986f,
+ 1.000000f, 0.023834f, 1.000000f, 0.021820f, 1.000000f, 0.019943f, 1.000000f, 0.018173f,
+ 1.000000f, 0.016525f, 1.000000f, 0.014977f, 1.000000f, 0.013535f, 1.000000f, 0.012192f,
+ 1.000000f, 0.010933f, 1.000000f, 0.009766f, 1.000000f, 0.008675f, 1.000000f, 0.007664f,
+ 1.000000f, 0.006729f, 1.000000f, 0.005859f, 1.000000f, 0.005062f, 1.000000f, 0.004326f,
+ 1.000000f, 0.003656f, 1.000000f, 0.003044f, 1.000000f, 0.002489f, 1.000000f, 0.001993f,
+ 1.000000f, 0.001552f, 1.000000f, 0.001163f, 1.000000f, 0.000830f, 1.000000f, 0.000549f,
+ 1.000000f, 0.000323f, 0.999512f, 0.000152f, 1.000000f, 0.000042f, 1.000000f, 0.000001f,
+ 0.000000f, 1.000000f, 1.000000f, 0.598633f, 0.999512f, 0.483887f, 1.000000f, 0.410156f,
+ 0.999512f, 0.356445f, 0.999512f, 0.314453f, 0.999512f, 0.280273f, 0.999512f, 0.251709f,
+ 1.000000f, 0.227661f, 1.000000f, 0.206665f, 1.000000f, 0.188354f, 1.000000f, 0.172241f,
+ 0.999512f, 0.157959f, 1.000000f, 0.145020f, 0.999512f, 0.133545f, 1.000000f, 0.123047f,
+ 0.999512f, 0.113525f, 1.000000f, 0.104858f, 0.999512f, 0.096924f, 1.000000f, 0.089661f,
+ 1.000000f, 0.082947f, 0.999512f, 0.076782f, 1.000000f, 0.071106f, 0.999512f, 0.065796f,
+ 1.000000f, 0.060944f, 0.999512f, 0.056396f, 1.000000f, 0.052185f, 1.000000f, 0.048248f,
+ 0.999512f, 0.044586f, 0.999512f, 0.041168f, 1.000000f, 0.037994f, 1.000000f, 0.035034f,
+ 1.000000f, 0.032257f, 0.999512f, 0.029663f, 0.999512f, 0.027237f, 1.000000f, 0.024979f,
+ 1.000000f, 0.022858f, 1.000000f, 0.020889f, 1.000000f, 0.019043f, 1.000000f, 0.017319f,
+ 1.000000f, 0.015701f, 1.000000f, 0.014206f, 0.999512f, 0.012802f, 0.999512f, 0.011497f,
+ 1.000000f, 0.010284f, 1.000000f, 0.009155f, 1.000000f, 0.008110f, 1.000000f, 0.007141f,
+ 1.000000f, 0.006245f, 1.000000f, 0.005421f, 1.000000f, 0.004662f, 1.000000f, 0.003971f,
+ 1.000000f, 0.003340f, 0.999512f, 0.002768f, 1.000000f, 0.002253f, 1.000000f, 0.001793f,
+ 1.000000f, 0.001387f, 1.000000f, 0.001033f, 1.000000f, 0.000731f, 1.000000f, 0.000479f,
+ 1.000000f, 0.000279f, 0.999512f, 0.000130f, 1.000000f, 0.000035f, 1.000000f, 0.000001f,
+ 0.000000f, 1.000000f, 1.000000f, 0.599609f, 1.000000f, 0.484375f, 1.000000f, 0.410645f,
+ 0.999512f, 0.356445f, 1.000000f, 0.314209f, 1.000000f, 0.280029f, 0.999512f, 0.251465f,
+ 0.999512f, 0.227051f, 0.999512f, 0.206055f, 1.000000f, 0.187622f, 0.999512f, 0.171509f,
+ 1.000000f, 0.156982f, 1.000000f, 0.144165f, 1.000000f, 0.132568f, 1.000000f, 0.122070f,
+ 1.000000f, 0.112549f, 1.000000f, 0.103821f, 1.000000f, 0.095886f, 1.000000f, 0.088562f,
+ 0.999512f, 0.081909f, 0.999512f, 0.075684f, 1.000000f, 0.070007f, 1.000000f, 0.064758f,
+ 1.000000f, 0.059845f, 1.000000f, 0.055328f, 1.000000f, 0.051117f, 1.000000f, 0.047211f,
+ 1.000000f, 0.043579f, 0.999512f, 0.040192f, 0.999512f, 0.037018f, 1.000000f, 0.034058f,
+ 1.000000f, 0.031311f, 1.000000f, 0.028763f, 1.000000f, 0.026382f, 1.000000f, 0.024139f,
+ 1.000000f, 0.022064f, 1.000000f, 0.020111f, 1.000000f, 0.018295f, 0.999512f, 0.016602f,
+ 1.000000f, 0.015038f, 0.999512f, 0.013565f, 1.000000f, 0.012199f, 0.999512f, 0.010933f,
+ 0.999512f, 0.009750f, 1.000000f, 0.008659f, 1.000000f, 0.007648f, 1.000000f, 0.006718f,
+ 0.999512f, 0.005856f, 1.000000f, 0.005066f, 0.999512f, 0.004341f, 0.999512f, 0.003685f,
+ 0.999512f, 0.003086f, 1.000000f, 0.002546f, 1.000000f, 0.002062f, 1.000000f, 0.001634f,
+ 1.000000f, 0.001256f, 1.000000f, 0.000930f, 1.000000f, 0.000653f, 1.000000f, 0.000425f,
+ 1.000000f, 0.000245f, 1.000000f, 0.000113f, 1.000000f, 0.000030f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.600098f, 1.000000f, 0.484863f, 1.000000f, 0.410889f,
+ 0.999512f, 0.356689f, 1.000000f, 0.314209f, 0.999512f, 0.279785f, 1.000000f, 0.250977f,
+ 1.000000f, 0.226685f, 1.000000f, 0.205566f, 1.000000f, 0.187012f, 1.000000f, 0.170776f,
+ 1.000000f, 0.156372f, 1.000000f, 0.143311f, 0.999512f, 0.131714f, 1.000000f, 0.121216f,
+ 1.000000f, 0.111633f, 1.000000f, 0.102966f, 1.000000f, 0.094971f, 1.000000f, 0.087708f,
+ 1.000000f, 0.080994f, 0.999512f, 0.074768f, 1.000000f, 0.069092f, 1.000000f, 0.063843f,
+ 1.000000f, 0.058960f, 0.999512f, 0.054443f, 0.999512f, 0.050232f, 1.000000f, 0.046356f,
+ 1.000000f, 0.042725f, 1.000000f, 0.039337f, 0.999512f, 0.036224f, 1.000000f, 0.033295f,
+ 1.000000f, 0.030579f, 1.000000f, 0.028030f, 1.000000f, 0.025665f, 1.000000f, 0.023453f,
+ 1.000000f, 0.021393f, 0.999512f, 0.019485f, 1.000000f, 0.017700f, 0.999512f, 0.016037f,
+ 1.000000f, 0.014488f, 1.000000f, 0.013046f, 0.999512f, 0.011711f, 0.999512f, 0.010468f,
+ 1.000000f, 0.009323f, 0.999512f, 0.008255f, 1.000000f, 0.007278f, 0.999512f, 0.006374f,
+ 1.000000f, 0.005543f, 0.999512f, 0.004780f, 0.999512f, 0.004086f, 1.000000f, 0.003456f,
+ 0.999512f, 0.002884f, 1.000000f, 0.002371f, 0.999512f, 0.001913f, 1.000000f, 0.001508f,
+ 1.000000f, 0.001154f, 0.999512f, 0.000850f, 1.000000f, 0.000593f, 1.000000f, 0.000383f,
+ 1.000000f, 0.000219f, 1.000000f, 0.000099f, 1.000000f, 0.000026f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 1.000000f, 0.600586f, 0.999512f, 0.485352f, 1.000000f, 0.411133f,
+ 1.000000f, 0.356689f, 1.000000f, 0.314209f, 1.000000f, 0.279541f, 0.999512f, 0.250732f,
+ 0.999512f, 0.226318f, 1.000000f, 0.205078f, 0.999512f, 0.186523f, 1.000000f, 0.170288f,
+ 1.000000f, 0.155762f, 1.000000f, 0.142700f, 0.999512f, 0.131104f, 0.999512f, 0.120544f,
+ 1.000000f, 0.110962f, 1.000000f, 0.102234f, 1.000000f, 0.094238f, 1.000000f, 0.086914f,
+ 1.000000f, 0.080200f, 1.000000f, 0.074036f, 1.000000f, 0.068359f, 0.999512f, 0.063049f,
+ 1.000000f, 0.058228f, 1.000000f, 0.053711f, 1.000000f, 0.049530f, 1.000000f, 0.045654f,
+ 1.000000f, 0.042023f, 0.999512f, 0.038666f, 1.000000f, 0.035553f, 1.000000f, 0.032654f,
+ 0.999512f, 0.029953f, 0.999512f, 0.027435f, 1.000000f, 0.025085f, 0.999512f, 0.022903f,
+ 1.000000f, 0.020859f, 1.000000f, 0.018967f, 1.000000f, 0.017197f, 1.000000f, 0.015564f,
+ 1.000000f, 0.014046f, 1.000000f, 0.012627f, 1.000000f, 0.011314f, 0.999512f, 0.010101f,
+ 1.000000f, 0.008972f, 1.000000f, 0.007935f, 1.000000f, 0.006981f, 1.000000f, 0.006100f,
+ 1.000000f, 0.005291f, 1.000000f, 0.004555f, 1.000000f, 0.003883f, 1.000000f, 0.003275f,
+ 1.000000f, 0.002726f, 1.000000f, 0.002232f, 1.000000f, 0.001795f, 1.000000f, 0.001410f,
+ 1.000000f, 0.001074f, 0.999512f, 0.000787f, 1.000000f, 0.000546f, 1.000000f, 0.000350f,
+ 0.999512f, 0.000198f, 1.000000f, 0.000089f, 1.000000f, 0.000023f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 1.000000f, 0.601074f, 1.000000f, 0.485596f, 1.000000f, 0.411133f,
+ 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279541f, 0.999512f, 0.250488f,
+ 1.000000f, 0.225952f, 1.000000f, 0.204712f, 1.000000f, 0.186157f, 1.000000f, 0.169800f,
+ 1.000000f, 0.155273f, 0.999512f, 0.142212f, 1.000000f, 0.130493f, 1.000000f, 0.119934f,
+ 1.000000f, 0.110352f, 1.000000f, 0.101624f, 1.000000f, 0.093628f, 1.000000f, 0.086304f,
+ 1.000000f, 0.079590f, 0.999512f, 0.073425f, 1.000000f, 0.067749f, 1.000000f, 0.062469f,
+ 1.000000f, 0.057617f, 1.000000f, 0.053101f, 1.000000f, 0.048950f, 1.000000f, 0.045074f,
+ 1.000000f, 0.041473f, 1.000000f, 0.038116f, 1.000000f, 0.035034f, 1.000000f, 0.032135f,
+ 1.000000f, 0.029449f, 1.000000f, 0.026947f, 1.000000f, 0.024612f, 1.000000f, 0.022446f,
+ 1.000000f, 0.020432f, 1.000000f, 0.018555f, 0.999512f, 0.016815f, 1.000000f, 0.015190f,
+ 0.999512f, 0.013687f, 1.000000f, 0.012291f, 1.000000f, 0.011002f, 1.000000f, 0.009804f,
+ 0.999512f, 0.008698f, 1.000000f, 0.007683f, 1.000000f, 0.006744f, 1.000000f, 0.005882f,
+ 1.000000f, 0.005093f, 0.999512f, 0.004375f, 0.999512f, 0.003723f, 1.000000f, 0.003132f,
+ 1.000000f, 0.002600f, 1.000000f, 0.002125f, 1.000000f, 0.001703f, 0.999512f, 0.001333f,
+ 1.000000f, 0.001012f, 1.000000f, 0.000739f, 1.000000f, 0.000510f, 1.000000f, 0.000326f,
+ 1.000000f, 0.000183f, 1.000000f, 0.000082f, 1.000000f, 0.000021f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 1.000000f, 0.601562f, 1.000000f, 0.485840f, 1.000000f, 0.411377f,
+ 0.999512f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279297f, 1.000000f, 0.250244f,
+ 0.999512f, 0.225708f, 1.000000f, 0.204468f, 1.000000f, 0.185791f, 1.000000f, 0.169434f,
+ 1.000000f, 0.154785f, 1.000000f, 0.141724f, 1.000000f, 0.130005f, 0.999512f, 0.119507f,
+ 1.000000f, 0.109863f, 1.000000f, 0.101135f, 0.999512f, 0.093140f, 1.000000f, 0.085815f,
+ 1.000000f, 0.079102f, 1.000000f, 0.072937f, 1.000000f, 0.067261f, 1.000000f, 0.061981f,
+ 1.000000f, 0.057129f, 1.000000f, 0.052643f, 0.999512f, 0.048462f, 1.000000f, 0.044617f,
+ 1.000000f, 0.041016f, 1.000000f, 0.037689f, 1.000000f, 0.034607f, 1.000000f, 0.031708f,
+ 0.999512f, 0.029053f, 1.000000f, 0.026550f, 0.999512f, 0.024246f, 1.000000f, 0.022095f,
+ 1.000000f, 0.020081f, 0.999512f, 0.018219f, 0.999512f, 0.016495f, 1.000000f, 0.014900f,
+ 0.999512f, 0.013405f, 1.000000f, 0.012032f, 1.000000f, 0.010750f, 1.000000f, 0.009575f,
+ 1.000000f, 0.008484f, 1.000000f, 0.007481f, 0.999512f, 0.006557f, 1.000000f, 0.005714f,
+ 1.000000f, 0.004940f, 1.000000f, 0.004234f, 1.000000f, 0.003597f, 1.000000f, 0.003021f,
+ 1.000000f, 0.002502f, 1.000000f, 0.002041f, 1.000000f, 0.001633f, 1.000000f, 0.001274f,
+ 0.999512f, 0.000965f, 0.999512f, 0.000702f, 1.000000f, 0.000483f, 1.000000f, 0.000307f,
+ 0.999512f, 0.000172f, 1.000000f, 0.000076f, 1.000000f, 0.000019f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 1.000000f, 0.601562f, 1.000000f, 0.486084f, 1.000000f, 0.411377f,
+ 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279297f, 1.000000f, 0.250244f,
+ 1.000000f, 0.225464f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f,
+ 1.000000f, 0.154541f, 1.000000f, 0.141479f, 1.000000f, 0.129639f, 1.000000f, 0.119141f,
+ 1.000000f, 0.109497f, 1.000000f, 0.100769f, 0.999512f, 0.092773f, 1.000000f, 0.085449f,
+ 1.000000f, 0.078735f, 1.000000f, 0.072510f, 1.000000f, 0.066833f, 1.000000f, 0.061615f,
+ 1.000000f, 0.056763f, 1.000000f, 0.052277f, 1.000000f, 0.048096f, 1.000000f, 0.044250f,
+ 1.000000f, 0.040680f, 1.000000f, 0.037354f, 0.999512f, 0.034271f, 1.000000f, 0.031403f,
+ 1.000000f, 0.028732f, 1.000000f, 0.026260f, 1.000000f, 0.023956f, 1.000000f, 0.021805f,
+ 0.999512f, 0.019821f, 1.000000f, 0.017975f, 0.999512f, 0.016251f, 1.000000f, 0.014671f,
+ 1.000000f, 0.013191f, 1.000000f, 0.011826f, 1.000000f, 0.010559f, 1.000000f, 0.009392f,
+ 1.000000f, 0.008316f, 0.999512f, 0.007328f, 1.000000f, 0.006416f, 1.000000f, 0.005585f,
+ 1.000000f, 0.004822f, 1.000000f, 0.004131f, 0.999512f, 0.003504f, 1.000000f, 0.002937f,
+ 1.000000f, 0.002430f, 1.000000f, 0.001978f, 0.999512f, 0.001579f, 0.999512f, 0.001230f,
+ 1.000000f, 0.000929f, 1.000000f, 0.000674f, 0.999512f, 0.000463f, 0.999512f, 0.000293f,
+ 1.000000f, 0.000163f, 1.000000f, 0.000072f, 1.000000f, 0.000018f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486084f, 0.999512f, 0.411621f,
+ 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f,
+ 1.000000f, 0.225342f, 1.000000f, 0.203979f, 1.000000f, 0.185303f, 1.000000f, 0.168823f,
+ 1.000000f, 0.154297f, 1.000000f, 0.141235f, 1.000000f, 0.129395f, 1.000000f, 0.118835f,
+ 1.000000f, 0.109192f, 1.000000f, 0.100464f, 1.000000f, 0.092468f, 1.000000f, 0.085144f,
+ 1.000000f, 0.078430f, 1.000000f, 0.072266f, 0.999512f, 0.066528f, 1.000000f, 0.061310f,
+ 1.000000f, 0.056458f, 1.000000f, 0.051971f, 1.000000f, 0.047821f, 1.000000f, 0.043976f,
+ 0.999512f, 0.040405f, 0.999512f, 0.037079f, 0.999512f, 0.033997f, 0.999512f, 0.031158f,
+ 1.000000f, 0.028503f, 0.999512f, 0.026031f, 1.000000f, 0.023727f, 1.000000f, 0.021606f,
+ 1.000000f, 0.019623f, 1.000000f, 0.017776f, 1.000000f, 0.016068f, 1.000000f, 0.014496f,
+ 1.000000f, 0.013031f, 1.000000f, 0.011673f, 1.000000f, 0.010414f, 1.000000f, 0.009262f,
+ 1.000000f, 0.008194f, 1.000000f, 0.007214f, 1.000000f, 0.006313f, 1.000000f, 0.005489f,
+ 0.999512f, 0.004734f, 1.000000f, 0.004051f, 1.000000f, 0.003433f, 1.000000f, 0.002876f,
+ 1.000000f, 0.002377f, 0.999512f, 0.001932f, 1.000000f, 0.001540f, 1.000000f, 0.001198f,
+ 1.000000f, 0.000904f, 1.000000f, 0.000654f, 0.999512f, 0.000448f, 1.000000f, 0.000283f,
+ 1.000000f, 0.000157f, 1.000000f, 0.000069f, 1.000000f, 0.000017f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f,
+ 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f,
+ 1.000000f, 0.225220f, 1.000000f, 0.203857f, 1.000000f, 0.185181f, 0.999512f, 0.168701f,
+ 1.000000f, 0.154053f, 0.999512f, 0.140991f, 1.000000f, 0.129272f, 1.000000f, 0.118652f,
+ 1.000000f, 0.109009f, 1.000000f, 0.100220f, 1.000000f, 0.092224f, 1.000000f, 0.084900f,
+ 0.999512f, 0.078186f, 0.999512f, 0.072021f, 0.999512f, 0.066345f, 1.000000f, 0.061096f,
+ 0.999512f, 0.056244f, 1.000000f, 0.051758f, 1.000000f, 0.047607f, 1.000000f, 0.043762f,
+ 1.000000f, 0.040222f, 0.999512f, 0.036896f, 1.000000f, 0.033813f, 1.000000f, 0.030975f,
+ 1.000000f, 0.028320f, 1.000000f, 0.025864f, 1.000000f, 0.023575f, 1.000000f, 0.021454f,
+ 1.000000f, 0.019470f, 1.000000f, 0.017639f, 1.000000f, 0.015945f, 1.000000f, 0.014374f,
+ 1.000000f, 0.012917f, 1.000000f, 0.011566f, 1.000000f, 0.010315f, 1.000000f, 0.009163f,
+ 0.999512f, 0.008102f, 1.000000f, 0.007133f, 1.000000f, 0.006237f, 1.000000f, 0.005421f,
+ 1.000000f, 0.004673f, 1.000000f, 0.003998f, 0.999512f, 0.003384f, 1.000000f, 0.002832f,
+ 0.999512f, 0.002338f, 0.999512f, 0.001900f, 1.000000f, 0.001513f, 1.000000f, 0.001176f,
+ 0.999512f, 0.000886f, 1.000000f, 0.000640f, 0.999512f, 0.000438f, 0.999512f, 0.000276f,
+ 1.000000f, 0.000153f, 1.000000f, 0.000067f, 1.000000f, 0.000017f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 1.000000f, 0.411621f,
+ 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 0.999512f, 0.250000f,
+ 0.999512f, 0.225220f, 0.999512f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168579f,
+ 0.999512f, 0.153931f, 1.000000f, 0.140869f, 1.000000f, 0.129150f, 0.999512f, 0.118469f,
+ 0.999512f, 0.108887f, 1.000000f, 0.100098f, 0.999512f, 0.092102f, 0.999512f, 0.084778f,
+ 0.999512f, 0.078064f, 1.000000f, 0.071899f, 1.000000f, 0.066162f, 1.000000f, 0.060944f,
+ 1.000000f, 0.056122f, 0.999512f, 0.051636f, 1.000000f, 0.047485f, 1.000000f, 0.043640f,
+ 1.000000f, 0.040070f, 1.000000f, 0.036774f, 1.000000f, 0.033691f, 1.000000f, 0.030869f,
+ 1.000000f, 0.028214f, 1.000000f, 0.025757f, 1.000000f, 0.023468f, 1.000000f, 0.021347f,
+ 1.000000f, 0.019379f, 1.000000f, 0.017548f, 1.000000f, 0.015854f, 1.000000f, 0.014290f,
+ 0.999512f, 0.012840f, 1.000000f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f,
+ 0.999512f, 0.008049f, 1.000000f, 0.007080f, 0.999512f, 0.006187f, 0.999512f, 0.005375f,
+ 1.000000f, 0.004635f, 0.999512f, 0.003960f, 1.000000f, 0.003353f, 1.000000f, 0.002804f,
+ 0.999512f, 0.002314f, 1.000000f, 0.001879f, 0.999512f, 0.001495f, 0.999512f, 0.001162f,
+ 1.000000f, 0.000875f, 1.000000f, 0.000632f, 1.000000f, 0.000432f, 1.000000f, 0.000272f,
+ 1.000000f, 0.000151f, 0.999512f, 0.000066f, 1.000000f, 0.000016f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f,
+ 0.999512f, 0.356934f, 1.000000f, 0.313965f, 0.999512f, 0.279053f, 1.000000f, 0.250000f,
+ 1.000000f, 0.225098f, 0.999512f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168579f,
+ 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f,
+ 1.000000f, 0.108765f, 1.000000f, 0.100037f, 1.000000f, 0.091980f, 1.000000f, 0.084656f,
+ 1.000000f, 0.077942f, 0.999512f, 0.071777f, 1.000000f, 0.066101f, 0.999512f, 0.060883f,
+ 1.000000f, 0.056030f, 0.999512f, 0.051544f, 1.000000f, 0.047424f, 0.999512f, 0.043579f,
+ 1.000000f, 0.040009f, 1.000000f, 0.036713f, 0.999512f, 0.033630f, 1.000000f, 0.030792f,
+ 1.000000f, 0.028152f, 1.000000f, 0.025696f, 1.000000f, 0.023407f, 1.000000f, 0.021301f,
+ 1.000000f, 0.019333f, 1.000000f, 0.017502f, 0.999512f, 0.015808f, 1.000000f, 0.014244f,
+ 1.000000f, 0.012794f, 1.000000f, 0.011452f, 1.000000f, 0.010216f, 1.000000f, 0.009071f,
+ 0.999512f, 0.008018f, 1.000000f, 0.007050f, 1.000000f, 0.006161f, 1.000000f, 0.005352f,
+ 1.000000f, 0.004612f, 1.000000f, 0.003941f, 1.000000f, 0.003336f, 1.000000f, 0.002789f,
+ 1.000000f, 0.002300f, 1.000000f, 0.001868f, 1.000000f, 0.001486f, 0.999512f, 0.001154f,
+ 0.999512f, 0.000868f, 0.999512f, 0.000627f, 1.000000f, 0.000428f, 1.000000f, 0.000269f,
+ 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f,
+ 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f,
+ 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f,
+ 1.000000f, 0.225098f, 1.000000f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168457f,
+ 1.000000f, 0.153809f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f,
+ 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f,
+ 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f,
+ 1.000000f, 0.056000f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f,
+ 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f,
+ 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f,
+ 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f,
+ 1.000000f, 0.012779f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f,
+ 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f,
+ 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f,
+ 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f,
+ 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f,
+ 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.997070f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.994629f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000912f, 0.993652f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001939f, 0.993164f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.002798f, 0.992676f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.003477f, 0.991699f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.004002f, 0.990234f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.005341f, 0.989258f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.006973f, 0.987305f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998535f, 0.008606f, 0.985352f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998047f, 0.011108f, 0.982910f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001425f, 0.997070f, 0.014374f, 0.979492f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.002775f, 0.996582f, 0.018860f, 0.975586f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000144f, 0.998047f, 0.003784f, 0.996094f, 0.024811f, 0.969727f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999023f, 0.002699f, 0.997559f, 0.004440f, 0.994629f, 0.034180f, 0.961426f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f,
+ 0.002378f, 0.997559f, 0.003843f, 0.996582f, 0.007648f, 0.993164f, 0.047485f, 0.950684f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000106f, 0.999023f, 0.001904f, 0.998047f, 0.002897f, 0.997559f,
+ 0.003870f, 0.996582f, 0.005512f, 0.995117f, 0.011642f, 0.989746f, 0.068420f, 0.933594f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001366f, 0.999023f, 0.002296f, 0.998535f,
+ 0.002888f, 0.998047f, 0.003391f, 0.997559f, 0.003883f, 0.997070f, 0.004372f, 0.996582f,
+ 0.006683f, 0.994629f, 0.009514f, 0.992188f, 0.019272f, 0.984375f, 0.102539f, 0.907715f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000374f, 0.999512f, 0.001418f, 0.999023f,
+ 0.001929f, 0.998535f, 0.002419f, 0.998535f, 0.002895f, 0.998047f, 0.003201f, 0.998047f,
+ 0.003405f, 0.997559f, 0.003880f, 0.997559f, 0.003897f, 0.997070f, 0.004379f, 0.997070f,
+ 0.004784f, 0.996094f, 0.006626f, 0.995605f, 0.008133f, 0.994629f, 0.009506f, 0.992676f,
+ 0.012962f, 0.990723f, 0.019562f, 0.985840f, 0.037567f, 0.972656f, 0.159668f, 0.867188f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000064f, 0.999512f, 0.000964f, 0.999512f,
+ 0.001456f, 0.999023f, 0.001945f, 0.999023f, 0.002424f, 0.998535f, 0.002436f, 0.998535f,
+ 0.002918f, 0.998535f, 0.002924f, 0.998047f, 0.003403f, 0.998047f, 0.003412f, 0.998047f,
+ 0.003733f, 0.997559f, 0.003897f, 0.997559f, 0.003901f, 0.997559f, 0.004292f, 0.997559f,
+ 0.004383f, 0.997070f, 0.004387f, 0.997070f, 0.004391f, 0.997070f, 0.005638f, 0.996582f,
+ 0.006310f, 0.996094f, 0.006813f, 0.995605f, 0.007763f, 0.995117f, 0.008270f, 0.995117f,
+ 0.008751f, 0.994629f, 0.010361f, 0.993652f, 0.011818f, 0.992676f, 0.013054f, 0.991699f,
+ 0.015396f, 0.990723f, 0.018417f, 0.988770f, 0.022064f, 0.986816f, 0.027237f, 0.983398f,
+ 0.035950f, 0.978027f, 0.051636f, 0.968262f, 0.089050f, 0.942871f, 0.253662f, 0.802734f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001949f, 0.999023f, 0.002439f, 0.998535f,
+ 0.002928f, 0.998047f, 0.003416f, 0.997559f, 0.003899f, 0.997559f, 0.003904f, 0.997559f,
+ 0.004379f, 0.997070f, 0.004391f, 0.997070f, 0.004391f, 0.997070f, 0.005844f, 0.996582f,
+ 0.006790f, 0.996094f, 0.007160f, 0.996094f, 0.007317f, 0.995605f, 0.008286f, 0.995117f,
+ 0.008293f, 0.995117f, 0.008774f, 0.995117f, 0.009735f, 0.994629f, 0.010704f, 0.994141f,
+ 0.011215f, 0.993652f, 0.012184f, 0.993652f, 0.012642f, 0.993164f, 0.013733f, 0.992676f,
+ 0.014603f, 0.992188f, 0.015579f, 0.992188f, 0.016418f, 0.991699f, 0.017120f, 0.991211f,
+ 0.019241f, 0.990723f, 0.019836f, 0.990234f, 0.020416f, 0.989746f, 0.022781f, 0.989258f,
+ 0.023727f, 0.988281f, 0.024826f, 0.987793f, 0.026901f, 0.987305f, 0.027756f, 0.986328f,
+ 0.029617f, 0.985840f, 0.032043f, 0.984863f, 0.034210f, 0.983887f, 0.036804f, 0.982910f,
+ 0.039612f, 0.981934f, 0.041321f, 0.980957f, 0.044220f, 0.979492f, 0.048370f, 0.978027f,
+ 0.051941f, 0.976562f, 0.055420f, 0.974609f, 0.059326f, 0.972656f, 0.064880f, 0.970703f,
+ 0.070557f, 0.967773f, 0.077026f, 0.964844f, 0.085449f, 0.961426f, 0.094055f, 0.957031f,
+ 0.104126f, 0.952148f, 0.117554f, 0.945801f, 0.133179f, 0.937500f, 0.154053f, 0.926758f,
+ 0.181152f, 0.911133f, 0.219604f, 0.887207f, 0.281738f, 0.841797f, 0.392822f, 0.706055f,
+ 0.000000f, 1.000000f, 0.600586f, 0.700195f, 0.647461f, 0.655273f, 0.678711f, 0.636719f,
+ 0.704590f, 0.626953f, 0.724609f, 0.621094f, 0.743652f, 0.617676f, 0.759277f, 0.614746f,
+ 0.773438f, 0.612305f, 0.784180f, 0.610840f, 0.796875f, 0.608887f, 0.806152f, 0.607422f,
+ 0.815430f, 0.605469f, 0.824219f, 0.604004f, 0.831543f, 0.602051f, 0.839355f, 0.600586f,
+ 0.845703f, 0.598633f, 0.851074f, 0.596680f, 0.857422f, 0.594238f, 0.864258f, 0.592285f,
+ 0.868652f, 0.589844f, 0.874512f, 0.587402f, 0.878906f, 0.584961f, 0.883301f, 0.582031f,
+ 0.887207f, 0.579590f, 0.891602f, 0.576660f, 0.895508f, 0.573730f, 0.899414f, 0.570801f,
+ 0.902832f, 0.567383f, 0.905273f, 0.563965f, 0.908691f, 0.560547f, 0.912109f, 0.557129f,
+ 0.914551f, 0.553223f, 0.917480f, 0.549316f, 0.919922f, 0.545410f, 0.922363f, 0.541016f,
+ 0.924805f, 0.536621f, 0.927734f, 0.532227f, 0.929688f, 0.527344f, 0.932617f, 0.522461f,
+ 0.934570f, 0.517090f, 0.936035f, 0.511719f, 0.939941f, 0.505859f, 0.940918f, 0.500000f,
+ 0.942871f, 0.493896f, 0.945312f, 0.487061f, 0.946777f, 0.480225f, 0.948730f, 0.472900f,
+ 0.949707f, 0.464844f, 0.951660f, 0.456543f, 0.953125f, 0.447510f, 0.956543f, 0.437744f,
+ 0.957520f, 0.427246f, 0.958496f, 0.416016f, 0.960449f, 0.403564f, 0.961914f, 0.389648f,
+ 0.963867f, 0.374268f, 0.965820f, 0.356689f, 0.966797f, 0.336426f, 0.968750f, 0.312500f,
+ 0.971191f, 0.282471f, 0.973633f, 0.242798f, 0.975098f, 0.183105f, 0.976562f, 0.067505f,
+ 0.000000f, 1.000000f, 0.776367f, 0.615723f, 0.843262f, 0.534180f, 0.880859f, 0.493896f,
+ 0.903320f, 0.469971f, 0.918945f, 0.454102f, 0.929199f, 0.442627f, 0.938965f, 0.433838f,
+ 0.945312f, 0.427002f, 0.950195f, 0.421143f, 0.956055f, 0.416016f, 0.959961f, 0.411377f,
+ 0.963379f, 0.407227f, 0.965820f, 0.403320f, 0.968262f, 0.399658f, 0.970215f, 0.396240f,
+ 0.971680f, 0.392822f, 0.974121f, 0.389160f, 0.975586f, 0.385986f, 0.977051f, 0.382324f,
+ 0.978027f, 0.378906f, 0.979980f, 0.375488f, 0.980469f, 0.372070f, 0.981934f, 0.368408f,
+ 0.982422f, 0.364990f, 0.982910f, 0.361328f, 0.983887f, 0.357666f, 0.984375f, 0.353760f,
+ 0.985840f, 0.349854f, 0.986328f, 0.345703f, 0.986816f, 0.341553f, 0.987305f, 0.337402f,
+ 0.987793f, 0.333252f, 0.987793f, 0.328857f, 0.988281f, 0.324463f, 0.989258f, 0.319824f,
+ 0.989746f, 0.314941f, 0.990723f, 0.309814f, 0.990723f, 0.304688f, 0.991211f, 0.299561f,
+ 0.991211f, 0.294189f, 0.991211f, 0.288574f, 0.991699f, 0.282715f, 0.991699f, 0.276611f,
+ 0.991699f, 0.270508f, 0.992676f, 0.263916f, 0.992676f, 0.257080f, 0.993164f, 0.250000f,
+ 0.993652f, 0.242432f, 0.994629f, 0.234497f, 0.994629f, 0.226196f, 0.994629f, 0.217529f,
+ 0.995117f, 0.208130f, 0.995117f, 0.198242f, 0.995117f, 0.187744f, 0.995117f, 0.176392f,
+ 0.995605f, 0.164062f, 0.995605f, 0.150391f, 0.995605f, 0.135376f, 0.995605f, 0.118469f,
+ 0.996094f, 0.098755f, 0.996094f, 0.075256f, 0.996582f, 0.045105f, 0.997070f, 0.007687f,
+ 0.000000f, 1.000000f, 0.871582f, 0.576172f, 0.923340f, 0.484863f, 0.945801f, 0.438477f,
+ 0.958008f, 0.409668f, 0.965820f, 0.389648f, 0.970703f, 0.374756f, 0.974609f, 0.363037f,
+ 0.977539f, 0.353271f, 0.980469f, 0.344971f, 0.982910f, 0.337646f, 0.983887f, 0.331543f,
+ 0.985840f, 0.325439f, 0.986816f, 0.320068f, 0.987793f, 0.315186f, 0.988281f, 0.310303f,
+ 0.989746f, 0.305908f, 0.990234f, 0.301270f, 0.991211f, 0.296875f, 0.991211f, 0.292725f,
+ 0.991699f, 0.288818f, 0.991699f, 0.284668f, 0.992188f, 0.280762f, 0.993164f, 0.276611f,
+ 0.993652f, 0.272705f, 0.994141f, 0.268555f, 0.994629f, 0.264404f, 0.994629f, 0.260254f,
+ 0.995117f, 0.256104f, 0.995117f, 0.251953f, 0.995117f, 0.247925f, 0.995117f, 0.243774f,
+ 0.995117f, 0.239502f, 0.995605f, 0.235107f, 0.995605f, 0.230713f, 0.995605f, 0.226196f,
+ 0.995605f, 0.221680f, 0.996094f, 0.217041f, 0.996094f, 0.212280f, 0.996094f, 0.207397f,
+ 0.996094f, 0.202393f, 0.996582f, 0.197266f, 0.996582f, 0.192017f, 0.996582f, 0.186646f,
+ 0.997070f, 0.181030f, 0.997070f, 0.175293f, 0.997070f, 0.169312f, 0.997559f, 0.163208f,
+ 0.998047f, 0.156738f, 0.998047f, 0.150146f, 0.998535f, 0.143188f, 0.999512f, 0.135742f,
+ 0.999512f, 0.128174f, 0.999512f, 0.120239f, 0.999512f, 0.111877f, 0.999512f, 0.103088f,
+ 0.999512f, 0.093750f, 0.999512f, 0.083801f, 0.999512f, 0.072998f, 0.999512f, 0.061340f,
+ 0.999512f, 0.048401f, 0.999512f, 0.033936f, 0.999512f, 0.017349f, 0.999512f, 0.001410f,
+ 0.000000f, 1.000000f, 0.921387f, 0.562988f, 0.956543f, 0.467773f, 0.969727f, 0.417236f,
+ 0.977051f, 0.384277f, 0.981934f, 0.360352f, 0.984863f, 0.342285f, 0.986328f, 0.327637f,
+ 0.988281f, 0.315430f, 0.990234f, 0.304932f, 0.990723f, 0.295898f, 0.991699f, 0.287842f,
+ 0.992188f, 0.280518f, 0.992676f, 0.273926f, 0.994141f, 0.267334f, 0.994629f, 0.261475f,
+ 0.994629f, 0.256104f, 0.995117f, 0.250732f, 0.995117f, 0.245850f, 0.995117f, 0.240967f,
+ 0.995605f, 0.236328f, 0.995605f, 0.231812f, 0.995605f, 0.227295f, 0.996094f, 0.222900f,
+ 0.996094f, 0.218628f, 0.996094f, 0.214355f, 0.996582f, 0.210083f, 0.996582f, 0.205933f,
+ 0.997070f, 0.201660f, 0.997070f, 0.197510f, 0.997559f, 0.193237f, 0.997559f, 0.188965f,
+ 0.998047f, 0.184692f, 0.998535f, 0.180420f, 0.999023f, 0.176025f, 0.999512f, 0.171509f,
+ 0.999512f, 0.167114f, 0.999512f, 0.162598f, 0.999512f, 0.158203f, 0.999512f, 0.153687f,
+ 0.999512f, 0.149170f, 0.999512f, 0.144531f, 0.999512f, 0.139771f, 0.999512f, 0.135010f,
+ 0.999512f, 0.130127f, 0.999512f, 0.125122f, 0.999512f, 0.120117f, 0.999512f, 0.114929f,
+ 0.999512f, 0.109558f, 0.999512f, 0.104065f, 0.999512f, 0.098450f, 0.999512f, 0.092590f,
+ 0.999512f, 0.086609f, 0.999512f, 0.080383f, 0.999512f, 0.073914f, 0.999512f, 0.067139f,
+ 0.999512f, 0.060120f, 0.999512f, 0.052704f, 0.999512f, 0.044922f, 0.999512f, 0.036652f,
+ 0.999512f, 0.027878f, 0.999512f, 0.018494f, 0.999512f, 0.008583f, 0.999512f, 0.000521f,
+ 0.000000f, 1.000000f, 0.948730f, 0.560059f, 0.972656f, 0.462891f, 0.981445f, 0.408447f,
+ 0.985840f, 0.371826f, 0.988281f, 0.344971f, 0.990234f, 0.323975f, 0.991699f, 0.306885f,
+ 0.992676f, 0.292725f, 0.994629f, 0.280273f, 0.994629f, 0.269531f, 0.995117f, 0.260010f,
+ 0.995117f, 0.251465f, 0.995605f, 0.243774f, 0.995605f, 0.236572f, 0.996094f, 0.229858f,
+ 0.996094f, 0.223633f, 0.996582f, 0.217773f, 0.996582f, 0.212158f, 0.997070f, 0.206665f,
+ 0.997559f, 0.201538f, 0.997559f, 0.196411f, 0.998047f, 0.191528f, 0.999023f, 0.186646f,
+ 0.999512f, 0.181885f, 0.999512f, 0.177246f, 0.999512f, 0.172852f, 0.999512f, 0.168579f,
+ 0.999512f, 0.164307f, 0.999512f, 0.160034f, 0.999512f, 0.156006f, 0.999512f, 0.151855f,
+ 0.999512f, 0.147705f, 0.999512f, 0.143677f, 0.999512f, 0.139648f, 0.999512f, 0.135620f,
+ 0.999512f, 0.131592f, 0.999512f, 0.127563f, 0.999512f, 0.123474f, 0.999512f, 0.119446f,
+ 0.999512f, 0.115295f, 0.999512f, 0.111206f, 0.999512f, 0.106995f, 0.999512f, 0.102783f,
+ 0.999512f, 0.098511f, 0.999512f, 0.094238f, 0.999512f, 0.089844f, 0.999512f, 0.085388f,
+ 0.999512f, 0.080933f, 0.999512f, 0.076294f, 0.999512f, 0.071655f, 0.999512f, 0.066833f,
+ 0.999512f, 0.061951f, 0.999512f, 0.056946f, 0.999512f, 0.051819f, 0.999512f, 0.046509f,
+ 0.999512f, 0.041077f, 0.999512f, 0.035431f, 0.999512f, 0.029648f, 0.999512f, 0.023636f,
+ 0.999512f, 0.017441f, 0.999512f, 0.011086f, 0.999512f, 0.004772f, 0.999512f, 0.000236f,
+ 0.000000f, 1.000000f, 0.963867f, 0.562988f, 0.980957f, 0.462646f, 0.986816f, 0.405029f,
+ 0.990234f, 0.365234f, 0.992188f, 0.335938f, 0.994629f, 0.312256f, 0.994629f, 0.293213f,
+ 0.995117f, 0.277344f, 0.995605f, 0.263672f, 0.995605f, 0.251709f, 0.996094f, 0.241089f,
+ 0.996582f, 0.231567f, 0.997070f, 0.222778f, 0.997559f, 0.214722f, 0.998047f, 0.207153f,
+ 0.998535f, 0.200073f, 0.999512f, 0.193237f, 0.999512f, 0.187012f, 0.999512f, 0.181152f,
+ 0.999512f, 0.175659f, 0.999512f, 0.170410f, 0.999512f, 0.165283f, 0.999512f, 0.160400f,
+ 0.999512f, 0.155762f, 0.999512f, 0.151245f, 0.999512f, 0.146851f, 0.999512f, 0.142456f,
+ 0.999512f, 0.138306f, 0.999512f, 0.134155f, 0.999512f, 0.130127f, 0.999512f, 0.126099f,
+ 0.999512f, 0.122192f, 0.999512f, 0.118347f, 0.999512f, 0.114502f, 0.999512f, 0.110657f,
+ 0.999512f, 0.106873f, 0.999512f, 0.103149f, 0.999512f, 0.099365f, 0.999512f, 0.095642f,
+ 0.999512f, 0.091919f, 0.999512f, 0.088196f, 0.999512f, 0.084473f, 0.999512f, 0.080750f,
+ 0.999512f, 0.076965f, 0.999512f, 0.073181f, 0.999512f, 0.069397f, 0.999512f, 0.065613f,
+ 0.999512f, 0.061768f, 0.999512f, 0.057892f, 0.999512f, 0.053955f, 0.999512f, 0.049988f,
+ 0.999512f, 0.045959f, 0.999512f, 0.041870f, 0.999512f, 0.037720f, 0.999512f, 0.033508f,
+ 0.999512f, 0.029251f, 0.999512f, 0.024902f, 0.999512f, 0.020493f, 0.999512f, 0.016022f,
+ 0.999512f, 0.011520f, 0.999512f, 0.007065f, 0.999512f, 0.002867f, 0.999512f, 0.000121f,
+ 0.000000f, 1.000000f, 0.973145f, 0.566406f, 0.986328f, 0.463867f, 0.990723f, 0.403564f,
+ 0.992676f, 0.361816f, 0.994629f, 0.329590f, 0.995117f, 0.304688f, 0.995605f, 0.284180f,
+ 0.996094f, 0.266846f, 0.996582f, 0.251709f, 0.997070f, 0.238647f, 0.998047f, 0.226807f,
+ 0.999512f, 0.215942f, 0.999512f, 0.206177f, 0.999512f, 0.197510f, 0.999512f, 0.189453f,
+ 0.999512f, 0.182129f, 0.999512f, 0.175171f, 0.999512f, 0.168823f, 0.999512f, 0.162720f,
+ 0.999512f, 0.156982f, 0.999512f, 0.151489f, 0.999512f, 0.146240f, 0.999512f, 0.141357f,
+ 0.999512f, 0.136475f, 0.999512f, 0.131958f, 0.999512f, 0.127441f, 0.999512f, 0.123169f,
+ 0.999512f, 0.119019f, 0.999512f, 0.114929f, 0.999512f, 0.110962f, 0.999512f, 0.107056f,
+ 0.999512f, 0.103271f, 0.999512f, 0.099548f, 0.999512f, 0.095886f, 0.999512f, 0.092285f,
+ 0.999512f, 0.088745f, 0.999512f, 0.085266f, 0.999512f, 0.081787f, 0.999512f, 0.078369f,
+ 0.999512f, 0.074951f, 0.999512f, 0.071533f, 0.999512f, 0.068176f, 0.999512f, 0.064880f,
+ 0.999512f, 0.061554f, 0.999512f, 0.058228f, 0.999512f, 0.054932f, 0.999512f, 0.051605f,
+ 0.999512f, 0.048309f, 0.999512f, 0.044983f, 0.999512f, 0.041656f, 0.999512f, 0.038330f,
+ 0.999512f, 0.034973f, 0.999512f, 0.031616f, 0.999512f, 0.028259f, 0.999512f, 0.024872f,
+ 0.999512f, 0.021469f, 0.999512f, 0.018051f, 0.999512f, 0.014641f, 0.999512f, 0.011253f,
+ 0.999512f, 0.007919f, 0.999512f, 0.004711f, 0.999512f, 0.001818f, 0.999512f, 0.000068f,
+ 0.000000f, 1.000000f, 0.979492f, 0.570801f, 0.989746f, 0.466064f, 0.993164f, 0.403564f,
+ 0.994629f, 0.359375f, 0.995605f, 0.325928f, 0.996094f, 0.299316f, 0.996582f, 0.277344f,
+ 0.997559f, 0.258545f, 0.999023f, 0.242188f, 0.999512f, 0.227783f, 0.999512f, 0.215332f,
+ 0.999512f, 0.204102f, 0.999512f, 0.194092f, 0.999512f, 0.184937f, 0.999512f, 0.176514f,
+ 0.999512f, 0.168823f, 0.999512f, 0.161621f, 0.999512f, 0.154785f, 0.999512f, 0.148560f,
+ 0.999512f, 0.142578f, 0.999512f, 0.136963f, 0.999512f, 0.131592f, 0.999512f, 0.126587f,
+ 0.999512f, 0.121704f, 0.999512f, 0.117065f, 0.999512f, 0.112610f, 0.999512f, 0.108337f,
+ 0.999512f, 0.104187f, 0.999512f, 0.100159f, 0.999512f, 0.096252f, 0.999512f, 0.092468f,
+ 0.999512f, 0.088806f, 0.999512f, 0.085266f, 0.999512f, 0.081726f, 0.999512f, 0.078308f,
+ 0.999512f, 0.075012f, 0.999512f, 0.071716f, 0.999512f, 0.068481f, 0.999512f, 0.065308f,
+ 0.999512f, 0.062225f, 0.999512f, 0.059143f, 0.999512f, 0.056091f, 0.999512f, 0.053101f,
+ 0.999512f, 0.050140f, 0.999512f, 0.047180f, 0.999512f, 0.044281f, 0.999512f, 0.041382f,
+ 0.999512f, 0.038513f, 0.999512f, 0.035645f, 0.999512f, 0.032806f, 0.999512f, 0.029999f,
+ 0.999512f, 0.027191f, 0.999512f, 0.024399f, 0.999512f, 0.021622f, 0.999512f, 0.018860f,
+ 0.999512f, 0.016113f, 0.999512f, 0.013412f, 0.999512f, 0.010742f, 0.999512f, 0.008125f,
+ 0.999512f, 0.005608f, 0.999512f, 0.003248f, 0.999512f, 0.001202f, 0.999512f, 0.000041f,
+ 0.000000f, 1.000000f, 0.984375f, 0.574707f, 0.991211f, 0.468750f, 0.994629f, 0.403564f,
+ 0.995605f, 0.358154f, 0.996582f, 0.323242f, 0.997559f, 0.295166f, 0.999023f, 0.271484f,
+ 0.999512f, 0.251465f, 0.999512f, 0.234741f, 0.999512f, 0.219971f, 0.999512f, 0.206909f,
+ 0.999512f, 0.195312f, 0.999512f, 0.184692f, 0.999512f, 0.175171f, 0.999512f, 0.166382f,
+ 0.999512f, 0.158325f, 0.999512f, 0.150879f, 0.999512f, 0.143799f, 0.999512f, 0.137329f,
+ 0.999512f, 0.131226f, 0.999512f, 0.125488f, 0.999512f, 0.120056f, 0.999512f, 0.114929f,
+ 0.999512f, 0.109985f, 0.999512f, 0.105347f, 0.999512f, 0.100891f, 0.999512f, 0.096619f,
+ 0.999512f, 0.092529f, 0.999512f, 0.088562f, 0.999512f, 0.084778f, 0.999512f, 0.081055f,
+ 0.999512f, 0.077515f, 0.999512f, 0.074097f, 0.999512f, 0.070740f, 0.999512f, 0.067505f,
+ 0.999512f, 0.064331f, 0.999512f, 0.061249f, 0.999512f, 0.058258f, 0.999512f, 0.055298f,
+ 0.999512f, 0.052429f, 0.999512f, 0.049622f, 0.999512f, 0.046844f, 0.999512f, 0.044128f,
+ 0.999512f, 0.041443f, 0.999512f, 0.038818f, 0.999512f, 0.036255f, 0.999512f, 0.033691f,
+ 0.999512f, 0.031204f, 0.999512f, 0.028717f, 0.999512f, 0.026276f, 0.999512f, 0.023865f,
+ 0.999512f, 0.021500f, 0.999512f, 0.019150f, 0.999512f, 0.016846f, 0.999512f, 0.014572f,
+ 0.999512f, 0.012344f, 0.999512f, 0.010162f, 0.999512f, 0.008041f, 0.999512f, 0.006001f,
+ 0.999512f, 0.004066f, 0.999512f, 0.002302f, 0.999512f, 0.000821f, 0.999512f, 0.000026f,
+ 0.000000f, 1.000000f, 0.986328f, 0.578613f, 0.994141f, 0.470215f, 0.995117f, 0.404541f,
+ 0.996582f, 0.357422f, 0.997559f, 0.321045f, 0.999512f, 0.291016f, 0.999512f, 0.267090f,
+ 0.999512f, 0.246826f, 0.999512f, 0.229248f, 0.999512f, 0.213867f, 0.999512f, 0.200317f,
+ 0.999512f, 0.188232f, 0.999512f, 0.177246f, 0.999512f, 0.167358f, 0.999512f, 0.158203f,
+ 0.999512f, 0.149902f, 0.999512f, 0.142212f, 0.999512f, 0.135010f, 0.999512f, 0.128296f,
+ 0.999512f, 0.122131f, 0.999512f, 0.116272f, 0.999512f, 0.110718f, 0.999512f, 0.105530f,
+ 0.999512f, 0.100586f, 0.999512f, 0.095947f, 0.999512f, 0.091492f, 0.999512f, 0.087219f,
+ 0.999512f, 0.083191f, 0.999512f, 0.079285f, 0.999512f, 0.075562f, 0.999512f, 0.072021f,
+ 0.999512f, 0.068542f, 0.999512f, 0.065247f, 0.999512f, 0.062042f, 0.999512f, 0.058929f,
+ 0.999512f, 0.055939f, 0.999512f, 0.053009f, 0.999512f, 0.050201f, 0.999512f, 0.047455f,
+ 0.999512f, 0.044769f, 0.999512f, 0.042175f, 0.999512f, 0.039642f, 0.999512f, 0.037170f,
+ 0.999512f, 0.034760f, 0.999512f, 0.032410f, 0.999512f, 0.030090f, 0.999512f, 0.027832f,
+ 0.999512f, 0.025635f, 0.999512f, 0.023468f, 0.999512f, 0.021347f, 0.999512f, 0.019272f,
+ 0.999512f, 0.017242f, 0.999512f, 0.015259f, 0.999512f, 0.013329f, 0.999512f, 0.011436f,
+ 0.999512f, 0.009605f, 0.999512f, 0.007828f, 0.999512f, 0.006130f, 0.999512f, 0.004513f,
+ 0.999512f, 0.003012f, 0.999512f, 0.001669f, 0.999512f, 0.000576f, 0.999512f, 0.000017f,
+ 0.000000f, 1.000000f, 0.989746f, 0.581543f, 0.994629f, 0.472656f, 0.996094f, 0.405273f,
+ 0.997559f, 0.356689f, 0.999512f, 0.318604f, 0.999512f, 0.288574f, 0.999512f, 0.263916f,
+ 0.999512f, 0.243042f, 0.999512f, 0.224854f, 0.999512f, 0.208984f, 0.999512f, 0.194946f,
+ 0.999512f, 0.182495f, 0.999512f, 0.171143f, 0.999512f, 0.160889f, 0.999512f, 0.151611f,
+ 0.999512f, 0.142944f, 0.999512f, 0.135132f, 0.999512f, 0.127808f, 0.999512f, 0.120972f,
+ 0.999512f, 0.114624f, 0.999512f, 0.108704f, 0.999512f, 0.103149f, 0.999512f, 0.097900f,
+ 0.999512f, 0.092957f, 0.999512f, 0.088257f, 0.999512f, 0.083862f, 0.999512f, 0.079651f,
+ 0.999512f, 0.075623f, 0.999512f, 0.071777f, 0.999512f, 0.068176f, 0.999512f, 0.064636f,
+ 0.999512f, 0.061310f, 0.999512f, 0.058105f, 0.999512f, 0.055023f, 0.999512f, 0.052063f,
+ 0.999512f, 0.049194f, 0.999512f, 0.046448f, 0.999512f, 0.043793f, 0.999512f, 0.041199f,
+ 0.999512f, 0.038727f, 0.999512f, 0.036316f, 0.999512f, 0.033966f, 0.999512f, 0.031708f,
+ 0.999512f, 0.029510f, 0.999512f, 0.027374f, 0.999512f, 0.025299f, 0.999512f, 0.023285f,
+ 0.999512f, 0.021317f, 0.999512f, 0.019409f, 0.999512f, 0.017563f, 0.999512f, 0.015762f,
+ 0.999512f, 0.014015f, 0.999512f, 0.012321f, 0.999512f, 0.010681f, 0.999512f, 0.009102f,
+ 0.999512f, 0.007580f, 0.999512f, 0.006123f, 0.999512f, 0.004742f, 0.999512f, 0.003450f,
+ 0.999512f, 0.002268f, 0.999512f, 0.001232f, 0.999512f, 0.000413f, 0.999512f, 0.000011f,
+ 0.000000f, 1.000000f, 0.990723f, 0.584961f, 0.995117f, 0.474854f, 0.997070f, 0.406006f,
+ 0.999512f, 0.355469f, 0.999512f, 0.317383f, 0.999512f, 0.286865f, 0.999512f, 0.261475f,
+ 0.999512f, 0.239990f, 0.999512f, 0.221313f, 0.999512f, 0.205078f, 0.999512f, 0.190552f,
+ 0.999512f, 0.177734f, 0.999512f, 0.166138f, 0.999512f, 0.155640f, 0.999512f, 0.146118f,
+ 0.999512f, 0.137329f, 0.999512f, 0.129272f, 0.999512f, 0.121826f, 0.999512f, 0.114929f,
+ 0.999512f, 0.108521f, 0.999512f, 0.102478f, 0.999512f, 0.096863f, 0.999512f, 0.091614f,
+ 0.999512f, 0.086670f, 0.999512f, 0.081970f, 0.999512f, 0.077576f, 0.999512f, 0.073425f,
+ 0.999512f, 0.069458f, 0.999512f, 0.065674f, 0.999512f, 0.062103f, 0.999512f, 0.058685f,
+ 0.999512f, 0.055450f, 0.999512f, 0.052338f, 0.999512f, 0.049347f, 0.999512f, 0.046509f,
+ 0.999512f, 0.043762f, 0.999512f, 0.041138f, 0.999512f, 0.038605f, 0.999512f, 0.036194f,
+ 0.999512f, 0.033844f, 0.999512f, 0.031616f, 0.999512f, 0.029449f, 0.999512f, 0.027359f,
+ 0.999512f, 0.025345f, 0.999512f, 0.023392f, 0.999512f, 0.021515f, 0.999512f, 0.019699f,
+ 0.999512f, 0.017944f, 0.999512f, 0.016251f, 0.999512f, 0.014626f, 0.999512f, 0.013046f,
+ 0.999512f, 0.011528f, 0.999512f, 0.010071f, 0.999512f, 0.008667f, 0.999512f, 0.007332f,
+ 0.999512f, 0.006058f, 0.999512f, 0.004848f, 0.999512f, 0.003717f, 0.999512f, 0.002674f,
+ 0.999512f, 0.001734f, 0.999512f, 0.000925f, 0.999512f, 0.000302f, 0.999512f, 0.000008f,
+ 0.000000f, 1.000000f, 0.992676f, 0.587402f, 0.995605f, 0.476562f, 0.998535f, 0.406006f,
+ 0.999512f, 0.355469f, 0.999512f, 0.316650f, 0.999512f, 0.285400f, 0.999512f, 0.259521f,
+ 0.999512f, 0.237427f, 0.999512f, 0.218384f, 0.999512f, 0.201660f, 0.999512f, 0.186890f,
+ 0.999512f, 0.173828f, 0.999512f, 0.161987f, 0.999512f, 0.151245f, 0.999512f, 0.141479f,
+ 0.999512f, 0.132568f, 0.999512f, 0.124390f, 0.999512f, 0.116882f, 0.999512f, 0.109863f,
+ 0.999512f, 0.103394f, 0.999512f, 0.097351f, 0.999512f, 0.091675f, 0.999512f, 0.086426f,
+ 0.999512f, 0.081421f, 0.999512f, 0.076782f, 0.999512f, 0.072388f, 0.999512f, 0.068237f,
+ 0.999512f, 0.064331f, 0.999512f, 0.060638f, 0.999512f, 0.057129f, 0.999512f, 0.053772f,
+ 0.999512f, 0.050598f, 0.999512f, 0.047577f, 0.999512f, 0.044708f, 0.999512f, 0.041962f,
+ 0.999512f, 0.039337f, 0.999512f, 0.036835f, 0.999512f, 0.034424f, 0.999512f, 0.032135f,
+ 0.999512f, 0.029938f, 0.999512f, 0.027832f, 0.999512f, 0.025803f, 0.999512f, 0.023865f,
+ 0.999512f, 0.022003f, 0.999512f, 0.020218f, 0.999512f, 0.018509f, 0.999512f, 0.016861f,
+ 0.999512f, 0.015282f, 0.999512f, 0.013771f, 0.999512f, 0.012314f, 0.999512f, 0.010925f,
+ 0.999512f, 0.009598f, 0.999512f, 0.008331f, 0.999512f, 0.007122f, 0.999512f, 0.005978f,
+ 0.999512f, 0.004898f, 0.999512f, 0.003889f, 0.999512f, 0.002953f, 0.999512f, 0.002100f,
+ 0.999512f, 0.001343f, 0.999512f, 0.000705f, 0.999512f, 0.000224f, 0.999512f, 0.000006f,
+ 0.000000f, 1.000000f, 0.994141f, 0.589355f, 0.996582f, 0.477783f, 0.999512f, 0.406250f,
+ 0.999512f, 0.355469f, 0.999512f, 0.316162f, 0.999512f, 0.284424f, 0.999512f, 0.257812f,
+ 0.999512f, 0.235352f, 0.999512f, 0.215942f, 0.999512f, 0.198975f, 0.999512f, 0.183838f,
+ 0.999512f, 0.170532f, 0.999512f, 0.158447f, 0.999512f, 0.147583f, 0.999512f, 0.137695f,
+ 0.999512f, 0.128540f, 0.999512f, 0.120300f, 0.999512f, 0.112671f, 0.999512f, 0.105652f,
+ 0.999512f, 0.099060f, 0.999512f, 0.093018f, 0.999512f, 0.087341f, 0.999512f, 0.082031f,
+ 0.999512f, 0.077087f, 0.999512f, 0.072449f, 0.999512f, 0.068054f, 0.999512f, 0.063965f,
+ 0.999512f, 0.060120f, 0.999512f, 0.056458f, 0.999512f, 0.052979f, 0.999512f, 0.049713f,
+ 0.999512f, 0.046600f, 0.999512f, 0.043671f, 0.999512f, 0.040863f, 0.999512f, 0.038208f,
+ 0.999512f, 0.035706f, 0.999512f, 0.033295f, 0.999512f, 0.031006f, 0.999512f, 0.028824f,
+ 0.999512f, 0.026733f, 0.999512f, 0.024750f, 0.999512f, 0.022858f, 0.999512f, 0.021042f,
+ 0.999512f, 0.019318f, 0.999512f, 0.017670f, 0.999512f, 0.016098f, 0.999512f, 0.014595f,
+ 0.999512f, 0.013161f, 0.999512f, 0.011795f, 0.999512f, 0.010490f, 0.999512f, 0.009254f,
+ 0.999512f, 0.008080f, 0.999512f, 0.006966f, 0.999512f, 0.005917f, 0.999512f, 0.004932f,
+ 0.999512f, 0.004009f, 0.999512f, 0.003155f, 0.999512f, 0.002373f, 0.999512f, 0.001669f,
+ 0.999512f, 0.001054f, 0.999512f, 0.000544f, 0.999512f, 0.000169f, 0.999512f, 0.000004f,
+ 0.000000f, 1.000000f, 0.994629f, 0.591309f, 0.997559f, 0.478760f, 0.999512f, 0.406982f,
+ 0.999512f, 0.355713f, 0.999512f, 0.315674f, 0.999512f, 0.283447f, 0.999512f, 0.256592f,
+ 0.999512f, 0.233643f, 0.999512f, 0.213867f, 0.999512f, 0.196533f, 0.999512f, 0.181274f,
+ 0.999512f, 0.167725f, 0.999512f, 0.155518f, 0.999512f, 0.144409f, 0.999512f, 0.134399f,
+ 0.999512f, 0.125244f, 0.999512f, 0.116882f, 0.999512f, 0.109192f, 0.999512f, 0.102051f,
+ 0.999512f, 0.095459f, 0.999512f, 0.089355f, 0.999512f, 0.083679f, 0.999512f, 0.078369f,
+ 0.999512f, 0.073425f, 0.999512f, 0.068787f, 0.999512f, 0.064453f, 0.999512f, 0.060394f,
+ 0.999512f, 0.056580f, 0.999512f, 0.052948f, 0.999512f, 0.049561f, 0.999512f, 0.046326f,
+ 0.999512f, 0.043304f, 0.999512f, 0.040436f, 0.999512f, 0.037720f, 0.999512f, 0.035126f,
+ 0.999512f, 0.032684f, 0.999512f, 0.030380f, 0.999512f, 0.028183f, 0.999512f, 0.026108f,
+ 0.999512f, 0.024124f, 0.999512f, 0.022232f, 0.999512f, 0.020447f, 0.999512f, 0.018753f,
+ 0.999512f, 0.017136f, 0.999512f, 0.015602f, 0.999512f, 0.014145f, 0.999512f, 0.012764f,
+ 0.999512f, 0.011452f, 0.999512f, 0.010208f, 0.999512f, 0.009033f, 0.999512f, 0.007919f,
+ 0.999512f, 0.006878f, 0.999512f, 0.005894f, 0.999512f, 0.004971f, 0.999512f, 0.004112f,
+ 0.999512f, 0.003319f, 0.999512f, 0.002590f, 0.999512f, 0.001930f, 0.999512f, 0.001343f,
+ 0.999512f, 0.000838f, 0.999512f, 0.000426f, 0.999512f, 0.000129f, 0.999512f, 0.000003f,
+ 0.000000f, 1.000000f, 0.995117f, 0.593262f, 0.999512f, 0.479004f, 0.999512f, 0.407715f,
+ 0.999512f, 0.355713f, 0.999512f, 0.315430f, 0.999512f, 0.282715f, 0.999512f, 0.255371f,
+ 0.999512f, 0.232178f, 0.999512f, 0.212158f, 0.999512f, 0.194580f, 0.999512f, 0.179077f,
+ 0.999512f, 0.165283f, 0.999512f, 0.152954f, 0.999512f, 0.141846f, 0.999512f, 0.131714f,
+ 0.999512f, 0.122437f, 0.999512f, 0.114014f, 0.999512f, 0.106201f, 0.999512f, 0.099060f,
+ 0.999512f, 0.092468f, 0.999512f, 0.086304f, 0.999512f, 0.080627f, 0.999512f, 0.075317f,
+ 0.999512f, 0.070374f, 0.999512f, 0.065735f, 0.999512f, 0.061462f, 0.999512f, 0.057404f,
+ 0.999512f, 0.053619f, 0.999512f, 0.050049f, 0.999512f, 0.046692f, 0.999512f, 0.043518f,
+ 0.999512f, 0.040558f, 0.999512f, 0.037750f, 0.999512f, 0.035095f, 0.999512f, 0.032593f,
+ 0.999512f, 0.030228f, 0.999512f, 0.027985f, 0.999512f, 0.025864f, 0.999512f, 0.023865f,
+ 0.999512f, 0.021973f, 0.999512f, 0.020172f, 0.999512f, 0.018478f, 0.999512f, 0.016876f,
+ 0.999512f, 0.015358f, 0.999512f, 0.013924f, 0.999512f, 0.012566f, 0.999512f, 0.011284f,
+ 0.999512f, 0.010078f, 0.999512f, 0.008934f, 0.999512f, 0.007866f, 0.999512f, 0.006863f,
+ 0.999512f, 0.005920f, 0.999512f, 0.005043f, 0.999512f, 0.004227f, 0.999512f, 0.003473f,
+ 0.999512f, 0.002781f, 0.999512f, 0.002151f, 0.999512f, 0.001589f, 0.999512f, 0.001094f,
+ 0.999512f, 0.000674f, 0.999512f, 0.000337f, 0.999512f, 0.000100f, 0.999512f, 0.000002f,
+ 0.000000f, 1.000000f, 0.995605f, 0.594727f, 0.999512f, 0.480225f, 0.999512f, 0.408447f,
+ 0.999512f, 0.355957f, 0.999512f, 0.315186f, 0.999512f, 0.281982f, 0.999512f, 0.254395f,
+ 0.999512f, 0.230957f, 0.999512f, 0.210693f, 0.999512f, 0.192993f, 0.999512f, 0.177246f,
+ 0.999512f, 0.163330f, 0.999512f, 0.150879f, 0.999512f, 0.139526f, 0.999512f, 0.129395f,
+ 0.999512f, 0.120056f, 0.999512f, 0.111511f, 0.999512f, 0.103699f, 0.999512f, 0.096497f,
+ 0.999512f, 0.089905f, 0.999512f, 0.083740f, 0.999512f, 0.078003f, 0.999512f, 0.072754f,
+ 0.999512f, 0.067810f, 0.999512f, 0.063171f, 0.999512f, 0.058929f, 0.999512f, 0.054901f,
+ 0.999512f, 0.051117f, 0.999512f, 0.047607f, 0.999512f, 0.044281f, 0.999512f, 0.041168f,
+ 0.999512f, 0.038239f, 0.999512f, 0.035492f, 0.999512f, 0.032898f, 0.999512f, 0.030457f,
+ 0.999512f, 0.028168f, 0.999512f, 0.025986f, 0.999512f, 0.023941f, 0.999512f, 0.022018f,
+ 0.999512f, 0.020203f, 0.999512f, 0.018478f, 0.999512f, 0.016861f, 0.999512f, 0.015343f,
+ 0.999512f, 0.013908f, 0.999512f, 0.012550f, 0.999512f, 0.011284f, 0.999512f, 0.010086f,
+ 0.999512f, 0.008965f, 0.999512f, 0.007912f, 0.999512f, 0.006927f, 0.999512f, 0.006012f,
+ 0.999512f, 0.005157f, 0.999512f, 0.004364f, 0.999512f, 0.003637f, 0.999512f, 0.002968f,
+ 0.999512f, 0.002357f, 0.999512f, 0.001810f, 0.999512f, 0.001324f, 0.999512f, 0.000903f,
+ 0.999512f, 0.000549f, 0.999512f, 0.000271f, 0.999512f, 0.000079f, 0.999512f, 0.000002f,
+ 0.000000f, 1.000000f, 0.996094f, 0.596191f, 0.999512f, 0.481201f, 0.999512f, 0.408936f,
+ 0.999512f, 0.355957f, 0.999512f, 0.314941f, 0.999512f, 0.281494f, 0.999512f, 0.253662f,
+ 0.999512f, 0.229858f, 0.999512f, 0.209473f, 0.999512f, 0.191528f, 0.999512f, 0.175781f,
+ 0.999512f, 0.161621f, 0.999512f, 0.149048f, 0.999512f, 0.137695f, 0.999512f, 0.127319f,
+ 0.999512f, 0.118042f, 0.999512f, 0.109436f, 0.999512f, 0.101562f, 0.999512f, 0.094360f,
+ 0.999512f, 0.087708f, 0.999512f, 0.081543f, 0.999512f, 0.075867f, 0.999512f, 0.070557f,
+ 0.999512f, 0.065613f, 0.999512f, 0.061066f, 0.999512f, 0.056763f, 0.999512f, 0.052795f,
+ 0.999512f, 0.049042f, 0.999512f, 0.045563f, 0.999512f, 0.042267f, 0.999512f, 0.039215f,
+ 0.999512f, 0.036316f, 0.999512f, 0.033630f, 0.999512f, 0.031082f, 0.999512f, 0.028702f,
+ 0.999512f, 0.026459f, 0.999512f, 0.024338f, 0.999512f, 0.022354f, 0.999512f, 0.020493f,
+ 0.999512f, 0.018738f, 0.999512f, 0.017090f, 0.999512f, 0.015541f, 0.999512f, 0.014084f,
+ 0.999512f, 0.012718f, 0.999512f, 0.011436f, 0.999512f, 0.010231f, 0.999512f, 0.009109f,
+ 0.999512f, 0.008057f, 0.999512f, 0.007084f, 0.999512f, 0.006172f, 0.999512f, 0.005325f,
+ 0.999512f, 0.004543f, 0.999512f, 0.003826f, 0.999512f, 0.003166f, 0.999512f, 0.002565f,
+ 0.999512f, 0.002024f, 0.999512f, 0.001542f, 0.999512f, 0.001118f, 0.999512f, 0.000754f,
+ 0.999512f, 0.000453f, 0.999512f, 0.000220f, 0.999512f, 0.000063f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.996582f, 0.597168f, 0.999512f, 0.482178f, 0.999512f, 0.409424f,
+ 0.999512f, 0.356201f, 0.999512f, 0.314697f, 0.999512f, 0.281006f, 0.999512f, 0.252930f,
+ 0.999512f, 0.229004f, 0.999512f, 0.208374f, 0.999512f, 0.190308f, 0.999512f, 0.174438f,
+ 0.999512f, 0.160156f, 0.999512f, 0.147461f, 0.999512f, 0.136108f, 0.999512f, 0.125732f,
+ 0.999512f, 0.116272f, 0.999512f, 0.107666f, 0.999512f, 0.099792f, 0.999512f, 0.092529f,
+ 0.999512f, 0.085876f, 0.999512f, 0.079712f, 0.999512f, 0.073975f, 0.999512f, 0.068726f,
+ 0.999512f, 0.063782f, 0.999512f, 0.059235f, 0.999512f, 0.054962f, 0.999512f, 0.050995f,
+ 0.999512f, 0.047302f, 0.999512f, 0.043823f, 0.999512f, 0.040588f, 0.999512f, 0.037567f,
+ 0.999512f, 0.034729f, 0.999512f, 0.032043f, 0.999512f, 0.029572f, 0.999512f, 0.027222f,
+ 0.999512f, 0.025024f, 0.999512f, 0.022964f, 0.999512f, 0.021042f, 0.999512f, 0.019226f,
+ 0.999512f, 0.017532f, 0.999512f, 0.015930f, 0.999512f, 0.014442f, 0.999512f, 0.013046f,
+ 0.999512f, 0.011742f, 0.999512f, 0.010521f, 0.999512f, 0.009377f, 0.999512f, 0.008316f,
+ 0.999512f, 0.007328f, 0.999512f, 0.006409f, 0.999512f, 0.005558f, 0.999512f, 0.004776f,
+ 0.999512f, 0.004051f, 0.999512f, 0.003393f, 0.999512f, 0.002790f, 0.999512f, 0.002247f,
+ 0.999512f, 0.001761f, 0.999512f, 0.001330f, 0.999512f, 0.000957f, 0.999512f, 0.000639f,
+ 0.999512f, 0.000380f, 0.999512f, 0.000182f, 0.999512f, 0.000051f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.998047f, 0.597656f, 0.999512f, 0.482910f, 0.999512f, 0.409912f,
+ 0.999512f, 0.356201f, 0.999512f, 0.314453f, 0.999512f, 0.280518f, 0.999512f, 0.252197f,
+ 0.999512f, 0.228271f, 0.999512f, 0.207520f, 0.999512f, 0.189331f, 0.999512f, 0.173218f,
+ 0.999512f, 0.158936f, 0.999512f, 0.146240f, 0.999512f, 0.134644f, 0.999512f, 0.124329f,
+ 0.999512f, 0.114807f, 0.999512f, 0.106201f, 0.999512f, 0.098267f, 0.999512f, 0.091003f,
+ 0.999512f, 0.084290f, 0.999512f, 0.078125f, 0.999512f, 0.072449f, 0.999512f, 0.067139f,
+ 0.999512f, 0.062256f, 0.999512f, 0.057709f, 0.999512f, 0.053467f, 0.999512f, 0.049500f,
+ 0.999512f, 0.045837f, 0.999512f, 0.042389f, 0.999512f, 0.039185f, 0.999512f, 0.036194f,
+ 0.999512f, 0.033386f, 0.999512f, 0.030762f, 0.999512f, 0.028305f, 0.999512f, 0.026001f,
+ 0.999512f, 0.023849f, 0.999512f, 0.021835f, 0.999512f, 0.019943f, 0.999512f, 0.018188f,
+ 0.999512f, 0.016525f, 0.999512f, 0.014992f, 0.999512f, 0.013550f, 0.999512f, 0.012199f,
+ 0.999512f, 0.010941f, 0.999512f, 0.009773f, 0.999512f, 0.008682f, 0.999512f, 0.007671f,
+ 0.999512f, 0.006733f, 0.999512f, 0.005867f, 0.999512f, 0.005066f, 0.999512f, 0.004330f,
+ 0.999512f, 0.003658f, 0.999512f, 0.003046f, 0.999512f, 0.002493f, 0.999512f, 0.001995f,
+ 0.999512f, 0.001553f, 0.999512f, 0.001164f, 0.999512f, 0.000830f, 0.999512f, 0.000549f,
+ 0.999512f, 0.000323f, 0.999512f, 0.000152f, 0.999512f, 0.000042f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.999512f, 0.597656f, 0.999512f, 0.483643f, 0.999512f, 0.410156f,
+ 0.999512f, 0.356445f, 0.999512f, 0.314453f, 0.999512f, 0.280273f, 0.999512f, 0.251709f,
+ 0.999512f, 0.227661f, 0.999512f, 0.206665f, 0.999512f, 0.188477f, 0.999512f, 0.172241f,
+ 0.999512f, 0.157959f, 0.999512f, 0.145142f, 0.999512f, 0.133545f, 0.999512f, 0.123108f,
+ 0.999512f, 0.113586f, 0.999512f, 0.104919f, 0.999512f, 0.096985f, 0.999512f, 0.089722f,
+ 0.999512f, 0.083008f, 0.999512f, 0.076843f, 0.999512f, 0.071106f, 0.999512f, 0.065857f,
+ 0.999512f, 0.060974f, 0.999512f, 0.056427f, 0.999512f, 0.052185f, 0.999512f, 0.048279f,
+ 0.999512f, 0.044617f, 0.999512f, 0.041199f, 0.999512f, 0.037994f, 0.999512f, 0.035034f,
+ 0.999512f, 0.032257f, 0.999512f, 0.029678f, 0.999512f, 0.027252f, 0.999512f, 0.024994f,
+ 0.999512f, 0.022873f, 0.999512f, 0.020889f, 0.999512f, 0.019043f, 0.999512f, 0.017319f,
+ 0.999512f, 0.015717f, 0.999512f, 0.014214f, 0.999512f, 0.012810f, 0.999512f, 0.011505f,
+ 0.999512f, 0.010292f, 0.999512f, 0.009163f, 0.999512f, 0.008110f, 0.999512f, 0.007145f,
+ 0.999512f, 0.006248f, 0.999512f, 0.005424f, 0.999512f, 0.004665f, 0.999512f, 0.003971f,
+ 0.999512f, 0.003342f, 0.999512f, 0.002769f, 0.999512f, 0.002254f, 0.999512f, 0.001794f,
+ 0.999512f, 0.001388f, 0.999512f, 0.001034f, 0.999512f, 0.000731f, 0.999512f, 0.000480f,
+ 0.999512f, 0.000279f, 0.999512f, 0.000130f, 0.999512f, 0.000035f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.999512f, 0.598633f, 0.999512f, 0.484131f, 0.999512f, 0.410400f,
+ 0.999512f, 0.356445f, 0.999512f, 0.314209f, 0.999512f, 0.280029f, 0.999512f, 0.251465f,
+ 0.999512f, 0.227051f, 0.999512f, 0.206055f, 0.999512f, 0.187744f, 0.999512f, 0.171509f,
+ 0.999512f, 0.157104f, 0.999512f, 0.144165f, 0.999512f, 0.132568f, 0.999512f, 0.122070f,
+ 0.999512f, 0.112549f, 0.999512f, 0.103882f, 0.999512f, 0.095886f, 0.999512f, 0.088623f,
+ 0.999512f, 0.081909f, 0.999512f, 0.075745f, 0.999512f, 0.070007f, 0.999512f, 0.064758f,
+ 0.999512f, 0.059875f, 0.999512f, 0.055359f, 0.999512f, 0.051147f, 0.999512f, 0.047211f,
+ 0.999512f, 0.043579f, 0.999512f, 0.040192f, 0.999512f, 0.037018f, 0.999512f, 0.034088f,
+ 0.999512f, 0.031342f, 0.999512f, 0.028778f, 0.999512f, 0.026382f, 0.999512f, 0.024155f,
+ 0.999512f, 0.022064f, 0.999512f, 0.020126f, 0.999512f, 0.018311f, 0.999512f, 0.016617f,
+ 0.999512f, 0.015045f, 0.999512f, 0.013573f, 0.999512f, 0.012207f, 0.999512f, 0.010933f,
+ 0.999512f, 0.009758f, 0.999512f, 0.008659f, 0.999512f, 0.007652f, 0.999512f, 0.006718f,
+ 0.999512f, 0.005859f, 0.999512f, 0.005070f, 0.999512f, 0.004345f, 0.999512f, 0.003687f,
+ 0.999512f, 0.003088f, 0.999512f, 0.002548f, 0.999512f, 0.002064f, 0.999512f, 0.001635f,
+ 0.999512f, 0.001257f, 0.999512f, 0.000931f, 0.999512f, 0.000654f, 0.999512f, 0.000425f,
+ 0.999512f, 0.000245f, 0.999512f, 0.000113f, 0.999512f, 0.000030f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.599609f, 0.999512f, 0.484619f, 0.999512f, 0.410645f,
+ 0.999512f, 0.356445f, 0.999512f, 0.314209f, 0.999512f, 0.279785f, 0.999512f, 0.250977f,
+ 0.999512f, 0.226685f, 0.999512f, 0.205566f, 0.999512f, 0.187134f, 0.999512f, 0.170776f,
+ 0.999512f, 0.156372f, 0.999512f, 0.143433f, 0.999512f, 0.131714f, 0.999512f, 0.121216f,
+ 0.999512f, 0.111694f, 0.999512f, 0.102966f, 0.999512f, 0.094971f, 0.999512f, 0.087708f,
+ 0.999512f, 0.080994f, 0.999512f, 0.074829f, 0.999512f, 0.069092f, 0.999512f, 0.063843f,
+ 0.999512f, 0.058990f, 0.999512f, 0.054443f, 0.999512f, 0.050262f, 0.999512f, 0.046356f,
+ 0.999512f, 0.042725f, 0.999512f, 0.039368f, 0.999512f, 0.036224f, 0.999512f, 0.033295f,
+ 0.999512f, 0.030579f, 0.999512f, 0.028046f, 0.999512f, 0.025665f, 0.999512f, 0.023468f,
+ 0.999512f, 0.021408f, 0.999512f, 0.019485f, 0.999512f, 0.017700f, 0.999512f, 0.016037f,
+ 0.999512f, 0.014496f, 0.999512f, 0.013054f, 0.999512f, 0.011719f, 0.999512f, 0.010475f,
+ 0.999512f, 0.009323f, 0.999512f, 0.008263f, 0.999512f, 0.007282f, 0.999512f, 0.006378f,
+ 0.999512f, 0.005547f, 0.999512f, 0.004784f, 0.999512f, 0.004089f, 0.999512f, 0.003458f,
+ 0.999512f, 0.002886f, 0.999512f, 0.002373f, 0.999512f, 0.001914f, 0.999512f, 0.001509f,
+ 0.999512f, 0.001155f, 0.999512f, 0.000850f, 0.999512f, 0.000593f, 0.999512f, 0.000383f,
+ 0.999512f, 0.000219f, 0.999512f, 0.000100f, 0.999512f, 0.000026f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.600098f, 0.999512f, 0.485107f, 0.999512f, 0.410889f,
+ 0.999512f, 0.356689f, 0.999512f, 0.314209f, 0.999512f, 0.279541f, 0.999512f, 0.250732f,
+ 0.999512f, 0.226318f, 0.999512f, 0.205078f, 0.999512f, 0.186523f, 0.999512f, 0.170288f,
+ 0.999512f, 0.155762f, 0.999512f, 0.142700f, 0.999512f, 0.131104f, 0.999512f, 0.120544f,
+ 0.999512f, 0.110962f, 0.999512f, 0.102234f, 0.999512f, 0.094238f, 0.999512f, 0.086975f,
+ 0.999512f, 0.080261f, 0.999512f, 0.074036f, 0.999512f, 0.068359f, 0.999512f, 0.063110f,
+ 0.999512f, 0.058228f, 0.999512f, 0.053711f, 0.999512f, 0.049530f, 0.999512f, 0.045654f,
+ 0.999512f, 0.042053f, 0.999512f, 0.038696f, 0.999512f, 0.035553f, 0.999512f, 0.032654f,
+ 0.999512f, 0.029953f, 0.999512f, 0.027435f, 0.999512f, 0.025085f, 0.999512f, 0.022903f,
+ 0.999512f, 0.020874f, 0.999512f, 0.018967f, 0.999512f, 0.017212f, 0.999512f, 0.015572f,
+ 0.999512f, 0.014046f, 0.999512f, 0.012634f, 0.999512f, 0.011322f, 0.999512f, 0.010101f,
+ 0.999512f, 0.008980f, 0.999512f, 0.007935f, 0.999512f, 0.006981f, 0.999512f, 0.006104f,
+ 0.999512f, 0.005295f, 0.999512f, 0.004555f, 0.999512f, 0.003885f, 0.999512f, 0.003275f,
+ 0.999512f, 0.002726f, 0.999512f, 0.002234f, 0.999512f, 0.001796f, 0.999512f, 0.001410f,
+ 0.999512f, 0.001075f, 0.999512f, 0.000787f, 0.999512f, 0.000546f, 0.999512f, 0.000351f,
+ 0.999512f, 0.000199f, 0.999512f, 0.000089f, 0.999512f, 0.000023f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.600586f, 0.999512f, 0.485596f, 0.999512f, 0.411133f,
+ 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279541f, 0.999512f, 0.250488f,
+ 0.999512f, 0.225952f, 0.999512f, 0.204712f, 0.999512f, 0.186157f, 0.999512f, 0.169800f,
+ 0.999512f, 0.155273f, 0.999512f, 0.142212f, 0.999512f, 0.130493f, 0.999512f, 0.119995f,
+ 0.999512f, 0.110352f, 0.999512f, 0.101624f, 0.999512f, 0.093628f, 0.999512f, 0.086304f,
+ 0.999512f, 0.079590f, 0.999512f, 0.073425f, 0.999512f, 0.067749f, 0.999512f, 0.062500f,
+ 0.999512f, 0.057617f, 0.999512f, 0.053131f, 0.999512f, 0.048950f, 0.999512f, 0.045074f,
+ 0.999512f, 0.041473f, 0.999512f, 0.038147f, 0.999512f, 0.035034f, 0.999512f, 0.032135f,
+ 0.999512f, 0.029449f, 0.999512f, 0.026947f, 0.999512f, 0.024612f, 0.999512f, 0.022446f,
+ 0.999512f, 0.020432f, 0.999512f, 0.018555f, 0.999512f, 0.016815f, 0.999512f, 0.015198f,
+ 0.999512f, 0.013695f, 0.999512f, 0.012299f, 0.999512f, 0.011002f, 0.999512f, 0.009804f,
+ 0.999512f, 0.008698f, 0.999512f, 0.007683f, 0.999512f, 0.006744f, 0.999512f, 0.005882f,
+ 0.999512f, 0.005096f, 0.999512f, 0.004375f, 0.999512f, 0.003723f, 0.999512f, 0.003132f,
+ 0.999512f, 0.002600f, 0.999512f, 0.002125f, 0.999512f, 0.001703f, 0.999512f, 0.001333f,
+ 0.999512f, 0.001013f, 0.999512f, 0.000739f, 0.999512f, 0.000510f, 0.999512f, 0.000326f,
+ 0.999512f, 0.000183f, 0.999512f, 0.000082f, 0.999512f, 0.000021f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.601074f, 0.999512f, 0.485840f, 0.999512f, 0.411377f,
+ 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279297f, 0.999512f, 0.250244f,
+ 0.999512f, 0.225708f, 0.999512f, 0.204468f, 0.999512f, 0.185791f, 0.999512f, 0.169434f,
+ 0.999512f, 0.154785f, 0.999512f, 0.141846f, 0.999512f, 0.130005f, 0.999512f, 0.119507f,
+ 0.999512f, 0.109863f, 0.999512f, 0.101135f, 0.999512f, 0.093140f, 0.999512f, 0.085815f,
+ 0.999512f, 0.079102f, 0.999512f, 0.072937f, 0.999512f, 0.067261f, 0.999512f, 0.062012f,
+ 0.999512f, 0.057129f, 0.999512f, 0.052643f, 0.999512f, 0.048492f, 0.999512f, 0.044617f,
+ 0.999512f, 0.041016f, 0.999512f, 0.037689f, 0.999512f, 0.034607f, 0.999512f, 0.031708f,
+ 0.999512f, 0.029053f, 0.999512f, 0.026566f, 0.999512f, 0.024246f, 0.999512f, 0.022095f,
+ 0.999512f, 0.020096f, 0.999512f, 0.018234f, 0.999512f, 0.016495f, 0.999512f, 0.014900f,
+ 0.999512f, 0.013412f, 0.999512f, 0.012032f, 0.999512f, 0.010757f, 0.999512f, 0.009575f,
+ 0.999512f, 0.008484f, 0.999512f, 0.007481f, 0.999512f, 0.006561f, 0.999512f, 0.005714f,
+ 0.999512f, 0.004940f, 0.999512f, 0.004238f, 0.999512f, 0.003599f, 0.999512f, 0.003021f,
+ 0.999512f, 0.002504f, 0.999512f, 0.002041f, 0.999512f, 0.001633f, 0.999512f, 0.001274f,
+ 0.999512f, 0.000965f, 0.999512f, 0.000702f, 0.999512f, 0.000483f, 0.999512f, 0.000307f,
+ 0.999512f, 0.000172f, 0.999512f, 0.000076f, 0.999512f, 0.000019f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.601562f, 0.999512f, 0.486084f, 0.999512f, 0.411377f,
+ 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279297f, 0.999512f, 0.250244f,
+ 0.999512f, 0.225586f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f,
+ 0.999512f, 0.154541f, 0.999512f, 0.141479f, 0.999512f, 0.129761f, 0.999512f, 0.119141f,
+ 0.999512f, 0.109497f, 0.999512f, 0.100769f, 0.999512f, 0.092773f, 0.999512f, 0.085449f,
+ 0.999512f, 0.078735f, 0.999512f, 0.072571f, 0.999512f, 0.066833f, 0.999512f, 0.061615f,
+ 0.999512f, 0.056763f, 0.999512f, 0.052277f, 0.999512f, 0.048096f, 0.999512f, 0.044250f,
+ 0.999512f, 0.040680f, 0.999512f, 0.037354f, 0.999512f, 0.034271f, 0.999512f, 0.031403f,
+ 0.999512f, 0.028732f, 0.999512f, 0.026260f, 0.999512f, 0.023956f, 0.999512f, 0.021820f,
+ 0.999512f, 0.019821f, 0.999512f, 0.017975f, 0.999512f, 0.016251f, 0.999512f, 0.014671f,
+ 0.999512f, 0.013191f, 0.999512f, 0.011826f, 0.999512f, 0.010559f, 0.999512f, 0.009392f,
+ 0.999512f, 0.008316f, 0.999512f, 0.007328f, 0.999512f, 0.006416f, 0.999512f, 0.005585f,
+ 0.999512f, 0.004822f, 0.999512f, 0.004131f, 0.999512f, 0.003504f, 0.999512f, 0.002937f,
+ 0.999512f, 0.002430f, 0.999512f, 0.001978f, 0.999512f, 0.001579f, 0.999512f, 0.001230f,
+ 0.999512f, 0.000930f, 0.999512f, 0.000674f, 0.999512f, 0.000463f, 0.999512f, 0.000293f,
+ 0.999512f, 0.000163f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.601562f, 0.999512f, 0.486084f, 0.999512f, 0.411621f,
+ 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f,
+ 0.999512f, 0.225342f, 0.999512f, 0.203979f, 0.999512f, 0.185303f, 0.999512f, 0.168945f,
+ 0.999512f, 0.154297f, 0.999512f, 0.141235f, 0.999512f, 0.129395f, 0.999512f, 0.118835f,
+ 0.999512f, 0.109192f, 0.999512f, 0.100464f, 0.999512f, 0.092468f, 0.999512f, 0.085144f,
+ 0.999512f, 0.078430f, 0.999512f, 0.072266f, 0.999512f, 0.066528f, 0.999512f, 0.061310f,
+ 0.999512f, 0.056458f, 0.999512f, 0.051971f, 0.999512f, 0.047821f, 0.999512f, 0.043976f,
+ 0.999512f, 0.040405f, 0.999512f, 0.037079f, 0.999512f, 0.033997f, 0.999512f, 0.031158f,
+ 0.999512f, 0.028503f, 0.999512f, 0.026031f, 0.999512f, 0.023743f, 0.999512f, 0.021606f,
+ 0.999512f, 0.019623f, 0.999512f, 0.017776f, 0.999512f, 0.016083f, 0.999512f, 0.014496f,
+ 0.999512f, 0.013031f, 0.999512f, 0.011673f, 0.999512f, 0.010422f, 0.999512f, 0.009262f,
+ 0.999512f, 0.008194f, 0.999512f, 0.007214f, 0.999512f, 0.006313f, 0.999512f, 0.005489f,
+ 0.999512f, 0.004738f, 0.999512f, 0.004051f, 0.999512f, 0.003433f, 0.999512f, 0.002876f,
+ 0.999512f, 0.002377f, 0.999512f, 0.001932f, 0.999512f, 0.001540f, 0.999512f, 0.001198f,
+ 0.999512f, 0.000904f, 0.999512f, 0.000654f, 0.999512f, 0.000448f, 0.999512f, 0.000283f,
+ 0.999512f, 0.000157f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 0.999512f, 0.411621f,
+ 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f,
+ 0.999512f, 0.225220f, 0.999512f, 0.203857f, 0.999512f, 0.185181f, 0.999512f, 0.168701f,
+ 0.999512f, 0.154053f, 0.999512f, 0.140991f, 0.999512f, 0.129272f, 0.999512f, 0.118652f,
+ 0.999512f, 0.109009f, 0.999512f, 0.100220f, 0.999512f, 0.092224f, 0.999512f, 0.084900f,
+ 0.999512f, 0.078186f, 0.999512f, 0.072021f, 0.999512f, 0.066345f, 0.999512f, 0.061096f,
+ 0.999512f, 0.056244f, 0.999512f, 0.051788f, 0.999512f, 0.047638f, 0.999512f, 0.043762f,
+ 0.999512f, 0.040222f, 0.999512f, 0.036896f, 0.999512f, 0.033813f, 0.999512f, 0.030975f,
+ 0.999512f, 0.028336f, 0.999512f, 0.025864f, 0.999512f, 0.023575f, 0.999512f, 0.021454f,
+ 0.999512f, 0.019485f, 0.999512f, 0.017639f, 0.999512f, 0.015945f, 0.999512f, 0.014374f,
+ 0.999512f, 0.012917f, 0.999512f, 0.011566f, 0.999512f, 0.010315f, 0.999512f, 0.009163f,
+ 0.999512f, 0.008102f, 0.999512f, 0.007133f, 0.999512f, 0.006237f, 0.999512f, 0.005421f,
+ 0.999512f, 0.004673f, 0.999512f, 0.003998f, 0.999512f, 0.003386f, 0.999512f, 0.002832f,
+ 0.999512f, 0.002338f, 0.999512f, 0.001900f, 0.999512f, 0.001513f, 0.999512f, 0.001176f,
+ 0.999512f, 0.000886f, 0.999512f, 0.000640f, 0.999512f, 0.000438f, 0.999512f, 0.000276f,
+ 0.999512f, 0.000153f, 0.999512f, 0.000067f, 0.999512f, 0.000017f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 0.999512f, 0.411621f,
+ 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f,
+ 0.999512f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f,
+ 0.999512f, 0.153931f, 0.999512f, 0.140869f, 0.999512f, 0.129150f, 0.999512f, 0.118530f,
+ 0.999512f, 0.108887f, 0.999512f, 0.100098f, 0.999512f, 0.092102f, 0.999512f, 0.084778f,
+ 0.999512f, 0.078064f, 0.999512f, 0.071899f, 0.999512f, 0.066162f, 0.999512f, 0.060974f,
+ 0.999512f, 0.056122f, 0.999512f, 0.051636f, 0.999512f, 0.047485f, 0.999512f, 0.043640f,
+ 0.999512f, 0.040070f, 0.999512f, 0.036774f, 0.999512f, 0.033691f, 0.999512f, 0.030869f,
+ 0.999512f, 0.028214f, 0.999512f, 0.025757f, 0.999512f, 0.023468f, 0.999512f, 0.021347f,
+ 0.999512f, 0.019379f, 0.999512f, 0.017548f, 0.999512f, 0.015854f, 0.999512f, 0.014290f,
+ 0.999512f, 0.012840f, 0.999512f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f,
+ 0.999512f, 0.008049f, 0.999512f, 0.007080f, 0.999512f, 0.006191f, 0.999512f, 0.005375f,
+ 0.999512f, 0.004635f, 0.999512f, 0.003960f, 0.999512f, 0.003353f, 0.999512f, 0.002804f,
+ 0.999512f, 0.002314f, 0.999512f, 0.001879f, 0.999512f, 0.001495f, 0.999512f, 0.001162f,
+ 0.999512f, 0.000875f, 0.999512f, 0.000632f, 0.999512f, 0.000432f, 0.999512f, 0.000272f,
+ 0.999512f, 0.000151f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.999512f, 0.602051f, 1.000000f, 0.486328f, 0.999512f, 0.411621f,
+ 0.999512f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 0.999512f, 0.250000f,
+ 0.999512f, 0.225098f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f,
+ 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 0.999512f, 0.118408f,
+ 1.000000f, 0.108765f, 0.999512f, 0.100037f, 0.999512f, 0.092041f, 0.999512f, 0.084717f,
+ 0.999512f, 0.077942f, 0.999512f, 0.071777f, 0.999512f, 0.066101f, 0.999512f, 0.060883f,
+ 0.999512f, 0.056030f, 0.999512f, 0.051544f, 0.999512f, 0.047424f, 0.999512f, 0.043579f,
+ 0.999512f, 0.040009f, 0.999512f, 0.036713f, 0.999512f, 0.033630f, 0.999512f, 0.030792f,
+ 0.999512f, 0.028152f, 0.999512f, 0.025696f, 0.999512f, 0.023422f, 0.999512f, 0.021301f,
+ 0.999512f, 0.019333f, 0.999512f, 0.017502f, 0.999512f, 0.015808f, 0.999512f, 0.014252f,
+ 0.999512f, 0.012794f, 0.999512f, 0.011452f, 0.999512f, 0.010216f, 0.999512f, 0.009071f,
+ 0.999512f, 0.008018f, 0.999512f, 0.007050f, 0.999512f, 0.006165f, 0.999512f, 0.005352f,
+ 0.999512f, 0.004612f, 0.999512f, 0.003941f, 0.999512f, 0.003336f, 0.999512f, 0.002789f,
+ 0.999512f, 0.002300f, 0.999512f, 0.001868f, 0.999512f, 0.001486f, 0.999512f, 0.001154f,
+ 0.999512f, 0.000868f, 0.999512f, 0.000627f, 0.999512f, 0.000428f, 0.999512f, 0.000269f,
+ 0.999512f, 0.000149f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f,
+ 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f,
+ 1.000000f, 0.225098f, 1.000000f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168457f,
+ 1.000000f, 0.153809f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f,
+ 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f,
+ 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f,
+ 1.000000f, 0.056000f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f,
+ 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f,
+ 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f,
+ 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f,
+ 1.000000f, 0.012779f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f,
+ 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f,
+ 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f,
+ 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f,
+ 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f,
+ 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.935059f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.935059f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.934082f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.997070f, 0.000000f, 0.991699f, 0.000000f, 0.934570f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999023f, 0.000000f, 0.997070f, 0.000000f, 0.990723f, 0.000045f, 0.933594f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.998535f, 0.000000f, 0.996582f, 0.000000f, 0.990723f, 0.000103f, 0.931641f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.990234f, 0.000173f, 0.930176f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.998047f, 0.000000f, 0.996094f, 0.000000f, 0.989746f, 0.000454f, 0.928223f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f,
+ 0.000000f, 0.997559f, 0.000000f, 0.996094f, 0.000000f, 0.989258f, 0.000752f, 0.925293f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998535f,
+ 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.989258f, 0.001340f, 0.922852f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000613f, 0.988770f, 0.002121f, 0.919922f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.997559f,
+ 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.001522f, 0.987793f, 0.003326f, 0.916016f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f,
+ 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.002142f, 0.986816f, 0.004902f, 0.911133f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996094f, 0.000865f, 0.994141f, 0.002377f, 0.986328f, 0.007065f, 0.905762f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f,
+ 0.000006f, 0.995605f, 0.001914f, 0.993164f, 0.002640f, 0.985352f, 0.010147f, 0.900391f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f,
+ 0.001153f, 0.995605f, 0.002747f, 0.992676f, 0.003948f, 0.984375f, 0.014236f, 0.894043f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000743f, 0.996094f,
+ 0.002214f, 0.994629f, 0.003420f, 0.992188f, 0.005241f, 0.982422f, 0.019714f, 0.886719f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000686f, 0.996582f, 0.002001f, 0.995605f,
+ 0.003027f, 0.993652f, 0.003918f, 0.990723f, 0.007099f, 0.980957f, 0.026337f, 0.878418f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000896f, 0.996582f, 0.001984f, 0.996094f, 0.002903f, 0.994629f,
+ 0.003674f, 0.992676f, 0.005245f, 0.989258f, 0.009995f, 0.979004f, 0.034637f, 0.868652f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000255f, 0.997070f,
+ 0.001376f, 0.996582f, 0.002239f, 0.996094f, 0.002960f, 0.995605f, 0.003559f, 0.993652f,
+ 0.004147f, 0.992188f, 0.006874f, 0.987793f, 0.012512f, 0.976074f, 0.044891f, 0.858398f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000094f, 0.997070f, 0.001110f, 0.997070f, 0.001945f, 0.996582f,
+ 0.002563f, 0.996094f, 0.003107f, 0.996094f, 0.003622f, 0.994141f, 0.004120f, 0.992676f,
+ 0.005798f, 0.990234f, 0.008347f, 0.985840f, 0.015884f, 0.972168f, 0.056793f, 0.846191f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000411f, 0.997559f,
+ 0.001294f, 0.997070f, 0.001970f, 0.996582f, 0.002508f, 0.996582f, 0.002974f, 0.996094f,
+ 0.003359f, 0.996094f, 0.003719f, 0.994629f, 0.004181f, 0.993164f, 0.005527f, 0.991699f,
+ 0.007481f, 0.988770f, 0.010933f, 0.983398f, 0.020096f, 0.967773f, 0.070923f, 0.832031f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000279f, 0.997559f, 0.001101f, 0.997559f, 0.001685f, 0.997070f, 0.002193f, 0.997070f,
+ 0.002655f, 0.996582f, 0.003038f, 0.996094f, 0.003267f, 0.996094f, 0.003710f, 0.995605f,
+ 0.004074f, 0.994629f, 0.004257f, 0.993164f, 0.005833f, 0.992188f, 0.007458f, 0.989746f,
+ 0.009766f, 0.986816f, 0.014023f, 0.979980f, 0.025726f, 0.961914f, 0.087708f, 0.816406f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000735f, 0.997559f, 0.001388f, 0.997559f, 0.001780f, 0.997070f,
+ 0.002251f, 0.997070f, 0.002659f, 0.996582f, 0.002811f, 0.996582f, 0.003246f, 0.996094f,
+ 0.003510f, 0.996094f, 0.003769f, 0.996094f, 0.004089f, 0.995117f, 0.004272f, 0.994141f,
+ 0.005089f, 0.993164f, 0.006470f, 0.992188f, 0.007740f, 0.990234f, 0.009552f, 0.987793f,
+ 0.012672f, 0.983887f, 0.018448f, 0.976074f, 0.033417f, 0.954590f, 0.107422f, 0.798340f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000339f, 0.998047f, 0.001081f, 0.998047f, 0.001574f, 0.997559f, 0.001827f, 0.997559f,
+ 0.002275f, 0.997070f, 0.002583f, 0.997070f, 0.002810f, 0.996582f, 0.003122f, 0.996582f,
+ 0.003309f, 0.996582f, 0.003561f, 0.996094f, 0.003790f, 0.996094f, 0.003849f, 0.995605f,
+ 0.004253f, 0.994629f, 0.004314f, 0.994141f, 0.005405f, 0.993652f, 0.006416f, 0.992676f,
+ 0.007534f, 0.991699f, 0.008308f, 0.990234f, 0.010536f, 0.987793f, 0.012924f, 0.984863f,
+ 0.017166f, 0.979980f, 0.024399f, 0.970215f, 0.043671f, 0.944824f, 0.130005f, 0.778320f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000720f, 0.998047f,
+ 0.001271f, 0.998047f, 0.001718f, 0.998047f, 0.001868f, 0.997559f, 0.002308f, 0.997559f,
+ 0.002445f, 0.997070f, 0.002810f, 0.997070f, 0.002867f, 0.997070f, 0.003267f, 0.996582f,
+ 0.003347f, 0.996582f, 0.003590f, 0.996582f, 0.003809f, 0.996094f, 0.003849f, 0.996094f,
+ 0.004181f, 0.995605f, 0.004311f, 0.995117f, 0.004337f, 0.994629f, 0.005432f, 0.994141f,
+ 0.006378f, 0.993164f, 0.006992f, 0.992676f, 0.007889f, 0.991699f, 0.008499f, 0.990234f,
+ 0.010254f, 0.988770f, 0.011909f, 0.987305f, 0.014374f, 0.984375f, 0.017975f, 0.980469f,
+ 0.023239f, 0.974121f, 0.033539f, 0.962402f, 0.057526f, 0.932129f, 0.156372f, 0.755859f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000325f, 0.998535f, 0.001050f, 0.998535f, 0.001381f, 0.998047f, 0.001841f, 0.998047f,
+ 0.002081f, 0.997559f, 0.002359f, 0.997559f, 0.002447f, 0.997559f, 0.002836f, 0.997070f,
+ 0.002882f, 0.997070f, 0.003223f, 0.997070f, 0.003353f, 0.996582f, 0.003378f, 0.996582f,
+ 0.003727f, 0.996582f, 0.003841f, 0.996582f, 0.003866f, 0.996094f, 0.004097f, 0.996094f,
+ 0.004311f, 0.995605f, 0.004345f, 0.995117f, 0.004463f, 0.994629f, 0.005764f, 0.994141f,
+ 0.006466f, 0.993652f, 0.006981f, 0.993164f, 0.007450f, 0.992676f, 0.008064f, 0.991699f,
+ 0.008682f, 0.991211f, 0.010078f, 0.990234f, 0.011444f, 0.988770f, 0.012810f, 0.987305f,
+ 0.014717f, 0.985352f, 0.017349f, 0.982422f, 0.020828f, 0.979004f, 0.025436f, 0.974121f,
+ 0.033142f, 0.966309f, 0.046814f, 0.951172f, 0.078186f, 0.914551f, 0.186279f, 0.730957f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000789f, 0.998535f, 0.001338f, 0.998535f, 0.001708f, 0.998047f,
+ 0.001906f, 0.998047f, 0.002312f, 0.998047f, 0.002401f, 0.997559f, 0.002708f, 0.997559f,
+ 0.002880f, 0.997559f, 0.002903f, 0.997070f, 0.003292f, 0.997070f, 0.003376f, 0.997070f,
+ 0.003391f, 0.996582f, 0.003693f, 0.996582f, 0.003853f, 0.996582f, 0.003876f, 0.996582f,
+ 0.003883f, 0.996094f, 0.004257f, 0.996094f, 0.004345f, 0.995605f, 0.004364f, 0.995117f,
+ 0.004715f, 0.994629f, 0.005821f, 0.994629f, 0.006481f, 0.994141f, 0.006840f, 0.993652f,
+ 0.007168f, 0.993652f, 0.007568f, 0.993164f, 0.008102f, 0.992188f, 0.008560f, 0.991699f,
+ 0.009575f, 0.991211f, 0.010666f, 0.990234f, 0.011513f, 0.989258f, 0.012497f, 0.988281f,
+ 0.013969f, 0.987305f, 0.015282f, 0.985840f, 0.017303f, 0.983887f, 0.019363f, 0.981934f,
+ 0.022629f, 0.979004f, 0.026077f, 0.975586f, 0.030899f, 0.970703f, 0.038208f, 0.964355f,
+ 0.048920f, 0.953613f, 0.067078f, 0.934570f, 0.107483f, 0.891113f, 0.220215f, 0.703613f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000422f, 0.999023f, 0.001333f, 0.998535f, 0.001707f, 0.998535f,
+ 0.001929f, 0.998047f, 0.002382f, 0.998047f, 0.002422f, 0.997559f, 0.002855f, 0.997559f,
+ 0.002909f, 0.997559f, 0.002916f, 0.997070f, 0.003376f, 0.997070f, 0.003399f, 0.997070f,
+ 0.003405f, 0.996582f, 0.003839f, 0.996582f, 0.003881f, 0.996582f, 0.003889f, 0.996582f,
+ 0.003893f, 0.996094f, 0.004330f, 0.996094f, 0.004368f, 0.995605f, 0.004555f, 0.995605f,
+ 0.005287f, 0.995117f, 0.005974f, 0.994629f, 0.006672f, 0.994141f, 0.007069f, 0.994141f,
+ 0.007229f, 0.993652f, 0.007607f, 0.993652f, 0.007729f, 0.993164f, 0.008400f, 0.992676f,
+ 0.009026f, 0.992188f, 0.009872f, 0.991699f, 0.010773f, 0.991211f, 0.011246f, 0.990723f,
+ 0.011604f, 0.989746f, 0.012962f, 0.988770f, 0.014107f, 0.988281f, 0.015137f, 0.987305f,
+ 0.016022f, 0.986328f, 0.017838f, 0.985352f, 0.018921f, 0.983398f, 0.021347f, 0.981934f,
+ 0.023483f, 0.980469f, 0.025940f, 0.978516f, 0.028519f, 0.975586f, 0.032196f, 0.972656f,
+ 0.037262f, 0.968750f, 0.042358f, 0.963379f, 0.050262f, 0.957031f, 0.060425f, 0.947754f,
+ 0.075745f, 0.933594f, 0.100952f, 0.909180f, 0.150269f, 0.857422f, 0.257080f, 0.674316f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000370f, 0.999023f, 0.001435f, 0.998535f,
+ 0.001935f, 0.998535f, 0.002403f, 0.998047f, 0.002434f, 0.997559f, 0.002914f, 0.997559f,
+ 0.002922f, 0.997559f, 0.003397f, 0.997070f, 0.003408f, 0.997070f, 0.003412f, 0.997070f,
+ 0.003889f, 0.996582f, 0.003897f, 0.996582f, 0.003899f, 0.996582f, 0.004349f, 0.996094f,
+ 0.005032f, 0.995605f, 0.005718f, 0.995117f, 0.006176f, 0.995117f, 0.006611f, 0.994629f,
+ 0.007233f, 0.994141f, 0.007278f, 0.994141f, 0.007736f, 0.993652f, 0.007771f, 0.993652f,
+ 0.008148f, 0.992676f, 0.009468f, 0.992188f, 0.010078f, 0.991699f, 0.010925f, 0.991211f,
+ 0.011299f, 0.991211f, 0.011597f, 0.990723f, 0.011902f, 0.990234f, 0.013397f, 0.989258f,
+ 0.014366f, 0.988770f, 0.015320f, 0.988281f, 0.015762f, 0.987305f, 0.017136f, 0.986328f,
+ 0.018494f, 0.985840f, 0.019135f, 0.984863f, 0.020325f, 0.983887f, 0.022293f, 0.982910f,
+ 0.023926f, 0.981934f, 0.025345f, 0.980469f, 0.027115f, 0.979004f, 0.029114f, 0.977539f,
+ 0.031433f, 0.976074f, 0.033905f, 0.973633f, 0.037201f, 0.971680f, 0.040192f, 0.969238f,
+ 0.043945f, 0.966309f, 0.048737f, 0.962891f, 0.053955f, 0.958984f, 0.059631f, 0.954102f,
+ 0.067017f, 0.948242f, 0.076050f, 0.940918f, 0.087769f, 0.931152f, 0.103699f, 0.917969f,
+ 0.125244f, 0.898438f, 0.157471f, 0.868652f, 0.212036f, 0.811035f, 0.298584f, 0.642578f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001461f, 0.999023f, 0.002430f, 0.998535f,
+ 0.002922f, 0.998047f, 0.003342f, 0.997559f, 0.003414f, 0.997559f, 0.003899f, 0.997070f,
+ 0.004780f, 0.996094f, 0.005817f, 0.995605f, 0.006329f, 0.995117f, 0.006817f, 0.994629f,
+ 0.007732f, 0.994141f, 0.007793f, 0.993652f, 0.009407f, 0.992676f, 0.010078f, 0.992188f,
+ 0.010658f, 0.991699f, 0.011658f, 0.991211f, 0.012436f, 0.990723f, 0.013901f, 0.989746f,
+ 0.014809f, 0.989258f, 0.015106f, 0.988770f, 0.015961f, 0.987793f, 0.018448f, 0.986816f,
+ 0.019196f, 0.986328f, 0.019440f, 0.985352f, 0.021423f, 0.984375f, 0.022339f, 0.983887f,
+ 0.023834f, 0.982910f, 0.025330f, 0.981934f, 0.026566f, 0.980957f, 0.028549f, 0.979980f,
+ 0.030380f, 0.979004f, 0.031799f, 0.977539f, 0.033600f, 0.976562f, 0.035095f, 0.975098f,
+ 0.038330f, 0.973633f, 0.040131f, 0.972656f, 0.041656f, 0.971191f, 0.044373f, 0.969238f,
+ 0.046631f, 0.967773f, 0.050232f, 0.965820f, 0.053284f, 0.963867f, 0.056763f, 0.961426f,
+ 0.060303f, 0.959473f, 0.063721f, 0.957031f, 0.067627f, 0.954102f, 0.071960f, 0.951172f,
+ 0.076660f, 0.947754f, 0.082336f, 0.944336f, 0.087891f, 0.940430f, 0.094604f, 0.936035f,
+ 0.101562f, 0.931152f, 0.109619f, 0.925293f, 0.119080f, 0.918457f, 0.129517f, 0.910645f,
+ 0.141357f, 0.901855f, 0.155518f, 0.890625f, 0.172363f, 0.876953f, 0.192383f, 0.859863f,
+ 0.217896f, 0.836914f, 0.250977f, 0.803711f, 0.297852f, 0.748047f, 0.341553f, 0.608398f,
+ 0.000000f, 1.000000f, 0.005363f, 0.997559f, 0.010078f, 0.994141f, 0.015091f, 0.990723f,
+ 0.020065f, 0.987305f, 0.024734f, 0.983887f, 0.028702f, 0.980957f, 0.034027f, 0.977539f,
+ 0.039154f, 0.974121f, 0.044220f, 0.971191f, 0.049164f, 0.967773f, 0.053772f, 0.964844f,
+ 0.058350f, 0.962402f, 0.063538f, 0.959473f, 0.068420f, 0.956543f, 0.072754f, 0.953613f,
+ 0.078552f, 0.950684f, 0.083374f, 0.948242f, 0.088318f, 0.945312f, 0.093262f, 0.942383f,
+ 0.097961f, 0.939941f, 0.103149f, 0.937500f, 0.109009f, 0.934570f, 0.114319f, 0.931641f,
+ 0.119019f, 0.929199f, 0.125000f, 0.926270f, 0.130127f, 0.923340f, 0.135376f, 0.920410f,
+ 0.140503f, 0.917969f, 0.146118f, 0.915039f, 0.151245f, 0.912109f, 0.157104f, 0.909180f,
+ 0.162354f, 0.906250f, 0.168335f, 0.902832f, 0.173828f, 0.899902f, 0.179443f, 0.896973f,
+ 0.185303f, 0.893555f, 0.191284f, 0.890137f, 0.197510f, 0.886719f, 0.203735f, 0.883301f,
+ 0.209717f, 0.879395f, 0.216553f, 0.875488f, 0.222656f, 0.871582f, 0.229248f, 0.867676f,
+ 0.235596f, 0.863770f, 0.242798f, 0.858887f, 0.249756f, 0.854492f, 0.256592f, 0.849609f,
+ 0.264160f, 0.844727f, 0.271484f, 0.839355f, 0.279297f, 0.833496f, 0.286865f, 0.827637f,
+ 0.295410f, 0.820801f, 0.303711f, 0.813965f, 0.312500f, 0.806152f, 0.321777f, 0.797852f,
+ 0.331299f, 0.788086f, 0.341309f, 0.777344f, 0.352051f, 0.765137f, 0.364014f, 0.750000f,
+ 0.376709f, 0.731445f, 0.390625f, 0.706543f, 0.405518f, 0.667969f, 0.387695f, 0.570801f,
+ 0.000000f, 1.000000f, 0.492188f, 0.772461f, 0.515137f, 0.719727f, 0.529297f, 0.693848f,
+ 0.538574f, 0.678711f, 0.547363f, 0.668945f, 0.554199f, 0.662598f, 0.562012f, 0.657715f,
+ 0.568359f, 0.654297f, 0.573730f, 0.651367f, 0.579102f, 0.648926f, 0.584473f, 0.646973f,
+ 0.589355f, 0.645508f, 0.593750f, 0.644043f, 0.598145f, 0.642578f, 0.602051f, 0.641113f,
+ 0.606445f, 0.639648f, 0.611816f, 0.638184f, 0.615234f, 0.637207f, 0.619629f, 0.635254f,
+ 0.623535f, 0.633789f, 0.627441f, 0.632324f, 0.630859f, 0.630859f, 0.634766f, 0.628906f,
+ 0.638184f, 0.627441f, 0.642090f, 0.625488f, 0.645508f, 0.623535f, 0.649414f, 0.621582f,
+ 0.652832f, 0.619141f, 0.655762f, 0.617188f, 0.659180f, 0.614746f, 0.663574f, 0.612305f,
+ 0.666504f, 0.609863f, 0.670410f, 0.606934f, 0.673340f, 0.604492f, 0.676758f, 0.601562f,
+ 0.679688f, 0.598145f, 0.684082f, 0.594727f, 0.688477f, 0.591309f, 0.690430f, 0.587891f,
+ 0.694824f, 0.583984f, 0.698242f, 0.580078f, 0.701172f, 0.575684f, 0.705078f, 0.571289f,
+ 0.708008f, 0.566406f, 0.712891f, 0.561523f, 0.715820f, 0.556152f, 0.720215f, 0.550781f,
+ 0.722656f, 0.544434f, 0.728027f, 0.538086f, 0.731445f, 0.531250f, 0.735352f, 0.523438f,
+ 0.739746f, 0.515625f, 0.743652f, 0.506836f, 0.747559f, 0.497070f, 0.752441f, 0.486084f,
+ 0.756836f, 0.473877f, 0.761230f, 0.460205f, 0.767090f, 0.443848f, 0.772461f, 0.424805f,
+ 0.777832f, 0.401123f, 0.784180f, 0.369385f, 0.790527f, 0.321533f, 0.778809f, 0.219238f,
+ 0.000000f, 1.000000f, 0.548828f, 0.747070f, 0.594238f, 0.676270f, 0.623535f, 0.636230f,
+ 0.645996f, 0.608887f, 0.666016f, 0.588867f, 0.682617f, 0.573242f, 0.698242f, 0.560547f,
+ 0.711914f, 0.549316f, 0.722656f, 0.540039f, 0.735352f, 0.531738f, 0.745117f, 0.523926f,
+ 0.754395f, 0.517090f, 0.763184f, 0.510254f, 0.772949f, 0.503906f, 0.780273f, 0.498291f,
+ 0.787109f, 0.492676f, 0.793457f, 0.487305f, 0.800781f, 0.481934f, 0.806641f, 0.476807f,
+ 0.813477f, 0.471680f, 0.818359f, 0.466797f, 0.824219f, 0.461670f, 0.830078f, 0.456543f,
+ 0.835938f, 0.451416f, 0.840820f, 0.446533f, 0.844727f, 0.441650f, 0.849121f, 0.436523f,
+ 0.854492f, 0.431152f, 0.857910f, 0.426270f, 0.862305f, 0.421143f, 0.865723f, 0.415771f,
+ 0.869629f, 0.410645f, 0.874023f, 0.405273f, 0.876953f, 0.399658f, 0.879883f, 0.394043f,
+ 0.884277f, 0.388428f, 0.886719f, 0.382568f, 0.890137f, 0.376709f, 0.893066f, 0.370605f,
+ 0.895996f, 0.364258f, 0.899902f, 0.357910f, 0.902832f, 0.351074f, 0.905273f, 0.344238f,
+ 0.908691f, 0.337158f, 0.911133f, 0.329834f, 0.913086f, 0.322266f, 0.916016f, 0.314453f,
+ 0.918457f, 0.306152f, 0.921387f, 0.297607f, 0.923340f, 0.288574f, 0.926270f, 0.279053f,
+ 0.928711f, 0.269043f, 0.931641f, 0.258301f, 0.933105f, 0.246948f, 0.937012f, 0.234497f,
+ 0.938477f, 0.221191f, 0.940918f, 0.206543f, 0.943848f, 0.190308f, 0.946289f, 0.171753f,
+ 0.947754f, 0.150757f, 0.952148f, 0.124451f, 0.953613f, 0.090881f, 0.949707f, 0.040405f,
+ 0.000000f, 1.000000f, 0.603516f, 0.723633f, 0.665527f, 0.637207f, 0.707031f, 0.584473f,
+ 0.735352f, 0.548340f, 0.760254f, 0.520020f, 0.779785f, 0.498291f, 0.796875f, 0.479980f,
+ 0.811035f, 0.464600f, 0.822754f, 0.451172f, 0.834473f, 0.439209f, 0.845215f, 0.428467f,
+ 0.853516f, 0.418945f, 0.861328f, 0.409912f, 0.870117f, 0.401367f, 0.875977f, 0.393555f,
+ 0.881836f, 0.386230f, 0.887695f, 0.379150f, 0.892578f, 0.372314f, 0.896973f, 0.365967f,
+ 0.902344f, 0.359619f, 0.905762f, 0.353516f, 0.911133f, 0.347412f, 0.914551f, 0.341553f,
+ 0.917969f, 0.335938f, 0.921387f, 0.330078f, 0.923828f, 0.324707f, 0.926758f, 0.319092f,
+ 0.928711f, 0.313721f, 0.932617f, 0.308105f, 0.933594f, 0.302734f, 0.937012f, 0.297119f,
+ 0.938965f, 0.291748f, 0.942383f, 0.285889f, 0.943848f, 0.280273f, 0.945801f, 0.274902f,
+ 0.948242f, 0.269043f, 0.949219f, 0.263428f, 0.950195f, 0.257812f, 0.951660f, 0.252197f,
+ 0.954590f, 0.245972f, 0.956055f, 0.239868f, 0.957031f, 0.233765f, 0.958496f, 0.227539f,
+ 0.960938f, 0.220825f, 0.962402f, 0.214233f, 0.963379f, 0.207397f, 0.964844f, 0.200317f,
+ 0.965332f, 0.193237f, 0.966309f, 0.185791f, 0.967773f, 0.177979f, 0.969238f, 0.170044f,
+ 0.969727f, 0.161743f, 0.971680f, 0.152832f, 0.972656f, 0.143555f, 0.973633f, 0.133911f,
+ 0.975098f, 0.123474f, 0.976074f, 0.112427f, 0.977051f, 0.100403f, 0.978027f, 0.087280f,
+ 0.979492f, 0.072815f, 0.979980f, 0.056366f, 0.981445f, 0.036926f, 0.978027f, 0.012779f,
+ 0.000000f, 1.000000f, 0.655273f, 0.702148f, 0.727051f, 0.603516f, 0.772461f, 0.542480f,
+ 0.804199f, 0.499756f, 0.827148f, 0.467773f, 0.846191f, 0.441895f, 0.860840f, 0.420654f,
+ 0.873047f, 0.403076f, 0.884277f, 0.387451f, 0.894043f, 0.373779f, 0.901367f, 0.361816f,
+ 0.907715f, 0.350830f, 0.914062f, 0.341064f, 0.919434f, 0.332031f, 0.924805f, 0.323242f,
+ 0.928711f, 0.315186f, 0.933105f, 0.307617f, 0.937012f, 0.300293f, 0.938965f, 0.293945f,
+ 0.942871f, 0.287109f, 0.945312f, 0.281006f, 0.948730f, 0.274658f, 0.950684f, 0.268555f,
+ 0.952148f, 0.262939f, 0.955566f, 0.257324f, 0.957031f, 0.251709f, 0.958496f, 0.246338f,
+ 0.959961f, 0.240967f, 0.961426f, 0.235840f, 0.963379f, 0.230469f, 0.964844f, 0.225220f,
+ 0.965820f, 0.220093f, 0.968262f, 0.214844f, 0.968750f, 0.209595f, 0.969727f, 0.204468f,
+ 0.970703f, 0.199341f, 0.972656f, 0.193970f, 0.973145f, 0.188721f, 0.974121f, 0.183472f,
+ 0.975586f, 0.178101f, 0.976074f, 0.172852f, 0.977051f, 0.167358f, 0.977539f, 0.161987f,
+ 0.979004f, 0.156250f, 0.979492f, 0.150513f, 0.980469f, 0.144775f, 0.981445f, 0.138672f,
+ 0.981445f, 0.132690f, 0.981934f, 0.126465f, 0.981934f, 0.120361f, 0.982910f, 0.113831f,
+ 0.983887f, 0.106995f, 0.984863f, 0.099976f, 0.985352f, 0.092651f, 0.985840f, 0.085083f,
+ 0.986328f, 0.077271f, 0.986816f, 0.069031f, 0.987305f, 0.060425f, 0.988281f, 0.051086f,
+ 0.989258f, 0.040802f, 0.989746f, 0.029984f, 0.989746f, 0.018524f, 0.988770f, 0.007530f,
+ 0.000000f, 1.000000f, 0.700195f, 0.684082f, 0.778809f, 0.576172f, 0.823730f, 0.509766f,
+ 0.852051f, 0.464111f, 0.874023f, 0.428955f, 0.888672f, 0.401611f, 0.902832f, 0.378662f,
+ 0.911621f, 0.359619f, 0.920410f, 0.343018f, 0.926758f, 0.328857f, 0.932129f, 0.315918f,
+ 0.937500f, 0.304443f, 0.941895f, 0.293945f, 0.947266f, 0.284180f, 0.949707f, 0.275391f,
+ 0.952637f, 0.267334f, 0.956543f, 0.259521f, 0.958984f, 0.251953f, 0.960938f, 0.245117f,
+ 0.962891f, 0.238525f, 0.964844f, 0.232178f, 0.966797f, 0.226074f, 0.968262f, 0.220215f,
+ 0.969238f, 0.214600f, 0.970703f, 0.209106f, 0.972656f, 0.203613f, 0.973145f, 0.198486f,
+ 0.975586f, 0.193115f, 0.976074f, 0.187988f, 0.977051f, 0.182983f, 0.977539f, 0.178223f,
+ 0.978516f, 0.173340f, 0.979004f, 0.168701f, 0.980957f, 0.163818f, 0.981445f, 0.158936f,
+ 0.982422f, 0.154175f, 0.982422f, 0.149414f, 0.982910f, 0.144897f, 0.983398f, 0.140259f,
+ 0.984863f, 0.135376f, 0.985352f, 0.130493f, 0.985352f, 0.125854f, 0.985840f, 0.121094f,
+ 0.986328f, 0.116333f, 0.987305f, 0.111328f, 0.987305f, 0.106445f, 0.987793f, 0.101440f,
+ 0.988281f, 0.096436f, 0.989258f, 0.091125f, 0.989746f, 0.085815f, 0.989746f, 0.080505f,
+ 0.990723f, 0.075012f, 0.990723f, 0.069397f, 0.990723f, 0.063782f, 0.991211f, 0.057953f,
+ 0.991211f, 0.052032f, 0.991699f, 0.045807f, 0.992188f, 0.039154f, 0.992676f, 0.032318f,
+ 0.993652f, 0.024948f, 0.993652f, 0.017715f, 0.993652f, 0.010201f, 0.993652f, 0.004353f,
+ 0.000000f, 1.000000f, 0.741211f, 0.668457f, 0.819336f, 0.555176f, 0.861328f, 0.486084f,
+ 0.888184f, 0.437744f, 0.904785f, 0.401611f, 0.917969f, 0.372559f, 0.927734f, 0.349121f,
+ 0.936523f, 0.328857f, 0.942383f, 0.312012f, 0.948730f, 0.296875f, 0.952148f, 0.283691f,
+ 0.956543f, 0.271484f, 0.959473f, 0.260742f, 0.962891f, 0.250977f, 0.965332f, 0.241943f,
+ 0.967773f, 0.233276f, 0.969727f, 0.225342f, 0.971680f, 0.218018f, 0.972656f, 0.211060f,
+ 0.974121f, 0.204590f, 0.977051f, 0.197876f, 0.977539f, 0.191772f, 0.978516f, 0.186035f,
+ 0.979492f, 0.180542f, 0.980957f, 0.175171f, 0.981445f, 0.169800f, 0.982422f, 0.164673f,
+ 0.982422f, 0.159912f, 0.983398f, 0.155029f, 0.984863f, 0.150269f, 0.985840f, 0.145386f,
+ 0.985840f, 0.140869f, 0.986328f, 0.136475f, 0.986328f, 0.132080f, 0.986816f, 0.127686f,
+ 0.987305f, 0.123474f, 0.987793f, 0.119141f, 0.988281f, 0.114868f, 0.989746f, 0.110413f,
+ 0.989746f, 0.106140f, 0.989746f, 0.101990f, 0.990234f, 0.097900f, 0.990234f, 0.093689f,
+ 0.990723f, 0.089478f, 0.991211f, 0.085266f, 0.991211f, 0.081055f, 0.991211f, 0.076904f,
+ 0.991699f, 0.072632f, 0.991699f, 0.068420f, 0.992676f, 0.063965f, 0.993164f, 0.059418f,
+ 0.994141f, 0.054688f, 0.994141f, 0.050110f, 0.994141f, 0.045532f, 0.994141f, 0.040955f,
+ 0.994629f, 0.036133f, 0.994629f, 0.031403f, 0.994629f, 0.026627f, 0.995117f, 0.021637f,
+ 0.995117f, 0.016663f, 0.994629f, 0.011780f, 0.995117f, 0.006794f, 0.995117f, 0.003134f,
+ 0.000000f, 1.000000f, 0.776855f, 0.655762f, 0.853027f, 0.539062f, 0.889648f, 0.468506f,
+ 0.912109f, 0.419189f, 0.926758f, 0.381592f, 0.937988f, 0.352051f, 0.944824f, 0.327881f,
+ 0.952148f, 0.306885f, 0.957520f, 0.289307f, 0.961914f, 0.273682f, 0.964355f, 0.260254f,
+ 0.967285f, 0.247925f, 0.970215f, 0.236694f, 0.972656f, 0.226318f, 0.974121f, 0.217285f,
+ 0.976562f, 0.208496f, 0.977539f, 0.200562f, 0.979492f, 0.192993f, 0.980957f, 0.185791f,
+ 0.981445f, 0.179199f, 0.982422f, 0.172852f, 0.982910f, 0.166870f, 0.983887f, 0.161255f,
+ 0.985840f, 0.155396f, 0.986328f, 0.150024f, 0.986328f, 0.145020f, 0.986816f, 0.140259f,
+ 0.987305f, 0.135498f, 0.987793f, 0.130859f, 0.988770f, 0.126343f, 0.990234f, 0.121643f,
+ 0.990234f, 0.117310f, 0.990234f, 0.113159f, 0.990723f, 0.109070f, 0.990723f, 0.105042f,
+ 0.990723f, 0.101196f, 0.991699f, 0.097168f, 0.991699f, 0.093323f, 0.992188f, 0.089539f,
+ 0.992188f, 0.085754f, 0.992676f, 0.081970f, 0.993164f, 0.078247f, 0.994141f, 0.074341f,
+ 0.994629f, 0.070435f, 0.994629f, 0.066711f, 0.994629f, 0.063049f, 0.994629f, 0.059479f,
+ 0.994629f, 0.055908f, 0.995117f, 0.052185f, 0.995117f, 0.048584f, 0.995117f, 0.044983f,
+ 0.994629f, 0.041412f, 0.995117f, 0.037689f, 0.995117f, 0.034027f, 0.995117f, 0.030380f,
+ 0.995117f, 0.026764f, 0.995605f, 0.022888f, 0.995605f, 0.019196f, 0.996094f, 0.015350f,
+ 0.996094f, 0.011658f, 0.996582f, 0.007851f, 0.997070f, 0.004223f, 0.998535f, 0.000417f,
+ 0.000000f, 1.000000f, 0.807617f, 0.645508f, 0.878906f, 0.526855f, 0.911621f, 0.455566f,
+ 0.929199f, 0.405518f, 0.942383f, 0.367188f, 0.951660f, 0.336670f, 0.957520f, 0.311768f,
+ 0.963867f, 0.290527f, 0.966797f, 0.272461f, 0.970215f, 0.256592f, 0.973145f, 0.242554f,
+ 0.976074f, 0.229736f, 0.977051f, 0.218506f, 0.979004f, 0.208130f, 0.980957f, 0.198486f,
+ 0.982422f, 0.189697f, 0.982910f, 0.181641f, 0.984375f, 0.174072f, 0.985352f, 0.166748f,
+ 0.986328f, 0.160034f, 0.986328f, 0.153809f, 0.987305f, 0.147827f, 0.987793f, 0.142090f,
+ 0.988770f, 0.136719f, 0.990234f, 0.131226f, 0.990234f, 0.126099f, 0.990234f, 0.121460f,
+ 0.990723f, 0.116821f, 0.990723f, 0.112488f, 0.991211f, 0.108215f, 0.991699f, 0.104004f,
+ 0.992188f, 0.099915f, 0.992188f, 0.095947f, 0.992676f, 0.092041f, 0.993164f, 0.088257f,
+ 0.994141f, 0.084351f, 0.994629f, 0.080505f, 0.994629f, 0.076904f, 0.994629f, 0.073486f,
+ 0.994629f, 0.070068f, 0.994629f, 0.066772f, 0.995117f, 0.063354f, 0.995117f, 0.060150f,
+ 0.995117f, 0.056946f, 0.995117f, 0.053802f, 0.995605f, 0.050690f, 0.995605f, 0.047455f,
+ 0.995605f, 0.044373f, 0.995605f, 0.041351f, 0.996094f, 0.038239f, 0.996094f, 0.035156f,
+ 0.996094f, 0.032135f, 0.996582f, 0.029144f, 0.996582f, 0.026001f, 0.996582f, 0.023026f,
+ 0.997070f, 0.019897f, 0.997070f, 0.016907f, 0.997070f, 0.013779f, 0.997559f, 0.010658f,
+ 0.998535f, 0.007397f, 0.999023f, 0.004097f, 0.999023f, 0.001551f, 0.998535f, 0.000064f,
+ 0.000000f, 1.000000f, 0.832031f, 0.637695f, 0.897461f, 0.518555f, 0.927734f, 0.446045f,
+ 0.942871f, 0.395264f, 0.954102f, 0.356445f, 0.960938f, 0.325439f, 0.966309f, 0.300049f,
+ 0.970703f, 0.278320f, 0.973633f, 0.259766f, 0.976562f, 0.243408f, 0.978516f, 0.229004f,
+ 0.980469f, 0.216064f, 0.982422f, 0.204468f, 0.983398f, 0.193848f, 0.984863f, 0.184082f,
+ 0.985840f, 0.175171f, 0.986816f, 0.166992f, 0.987793f, 0.159180f, 0.988281f, 0.152100f,
+ 0.989746f, 0.145142f, 0.989746f, 0.138794f, 0.990234f, 0.132812f, 0.990723f, 0.127197f,
+ 0.990723f, 0.121948f, 0.991211f, 0.116882f, 0.991699f, 0.112061f, 0.992188f, 0.107239f,
+ 0.992676f, 0.102722f, 0.993164f, 0.098328f, 0.994141f, 0.093933f, 0.994629f, 0.089783f,
+ 0.994629f, 0.085815f, 0.994629f, 0.082092f, 0.994629f, 0.078491f, 0.994629f, 0.075073f,
+ 0.995117f, 0.071594f, 0.995117f, 0.068237f, 0.995117f, 0.065002f, 0.995117f, 0.061920f,
+ 0.995605f, 0.058807f, 0.995605f, 0.055725f, 0.995605f, 0.052765f, 0.995605f, 0.049866f,
+ 0.996094f, 0.046967f, 0.996094f, 0.044098f, 0.996094f, 0.041321f, 0.996094f, 0.038635f,
+ 0.996582f, 0.035797f, 0.996582f, 0.033142f, 0.997070f, 0.030411f, 0.997070f, 0.027756f,
+ 0.997559f, 0.025085f, 0.997559f, 0.022461f, 0.998047f, 0.019760f, 0.998535f, 0.017059f,
+ 0.999512f, 0.014137f, 0.999512f, 0.011505f, 0.999512f, 0.009064f, 0.999512f, 0.006756f,
+ 0.999512f, 0.004593f, 0.999023f, 0.002617f, 0.999023f, 0.000950f, 0.999023f, 0.000032f,
+ 0.000000f, 1.000000f, 0.853027f, 0.631836f, 0.915039f, 0.511230f, 0.940918f, 0.438965f,
+ 0.953125f, 0.387939f, 0.961914f, 0.348633f, 0.968262f, 0.316895f, 0.972656f, 0.290771f,
+ 0.976074f, 0.268799f, 0.979004f, 0.249878f, 0.980957f, 0.233154f, 0.982422f, 0.218506f,
+ 0.984863f, 0.205078f, 0.985840f, 0.193237f, 0.986328f, 0.182739f, 0.987793f, 0.172729f,
+ 0.989258f, 0.163452f, 0.989746f, 0.155029f, 0.989746f, 0.147461f, 0.990723f, 0.140259f,
+ 0.990723f, 0.133545f, 0.991211f, 0.127319f, 0.991699f, 0.121399f, 0.992676f, 0.115601f,
+ 0.993164f, 0.110229f, 0.994141f, 0.104919f, 0.994141f, 0.100037f, 0.994629f, 0.095398f,
+ 0.994629f, 0.091003f, 0.994629f, 0.086853f, 0.994629f, 0.082947f, 0.995117f, 0.079102f,
+ 0.995117f, 0.075378f, 0.995117f, 0.071838f, 0.995117f, 0.068481f, 0.995605f, 0.065125f,
+ 0.995605f, 0.061920f, 0.995605f, 0.058838f, 0.995605f, 0.055878f, 0.996094f, 0.052826f,
+ 0.996094f, 0.049957f, 0.996094f, 0.047211f, 0.996582f, 0.044403f, 0.996582f, 0.041718f,
+ 0.996582f, 0.039154f, 0.997070f, 0.036469f, 0.997070f, 0.033997f, 0.997559f, 0.031403f,
+ 0.998047f, 0.028961f, 0.998047f, 0.026474f, 0.998535f, 0.023956f, 0.999512f, 0.021255f,
+ 0.999512f, 0.018890f, 0.999512f, 0.016647f, 0.999512f, 0.014503f, 0.999512f, 0.012428f,
+ 0.999512f, 0.010422f, 0.999512f, 0.008499f, 0.999512f, 0.006653f, 0.999512f, 0.004906f,
+ 0.999512f, 0.003284f, 0.999512f, 0.001829f, 0.999023f, 0.000638f, 0.999023f, 0.000019f,
+ 0.000000f, 1.000000f, 0.873047f, 0.625977f, 0.927246f, 0.506836f, 0.949707f, 0.433838f,
+ 0.961426f, 0.381836f, 0.968750f, 0.342041f, 0.974121f, 0.310303f, 0.977051f, 0.283936f,
+ 0.980469f, 0.261230f, 0.982422f, 0.242065f, 0.984375f, 0.224976f, 0.985840f, 0.209961f,
+ 0.986816f, 0.196777f, 0.988770f, 0.184448f, 0.989746f, 0.173218f, 0.989746f, 0.163452f,
+ 0.990723f, 0.154419f, 0.991211f, 0.145996f, 0.991699f, 0.138184f, 0.992188f, 0.130981f,
+ 0.993164f, 0.124023f, 0.994141f, 0.117371f, 0.994141f, 0.111389f, 0.994629f, 0.105835f,
+ 0.994629f, 0.100525f, 0.994629f, 0.095581f, 0.994629f, 0.090942f, 0.995117f, 0.086426f,
+ 0.995117f, 0.082214f, 0.995117f, 0.078247f, 0.995117f, 0.074402f, 0.995605f, 0.070618f,
+ 0.995605f, 0.067078f, 0.995605f, 0.063721f, 0.996094f, 0.060364f, 0.996094f, 0.057220f,
+ 0.996094f, 0.054230f, 0.996582f, 0.051178f, 0.996582f, 0.048340f, 0.997070f, 0.045502f,
+ 0.997070f, 0.042786f, 0.997559f, 0.040161f, 0.997559f, 0.037567f, 0.998047f, 0.034973f,
+ 0.998535f, 0.032471f, 0.999023f, 0.029922f, 0.999512f, 0.027359f, 0.999512f, 0.025055f,
+ 0.999512f, 0.022873f, 0.999512f, 0.020782f, 0.999512f, 0.018768f, 0.999512f, 0.016830f,
+ 0.999512f, 0.014954f, 0.999512f, 0.013130f, 0.999512f, 0.011383f, 0.999512f, 0.009689f,
+ 0.999512f, 0.008072f, 0.999512f, 0.006523f, 0.999512f, 0.005054f, 0.999512f, 0.003685f,
+ 0.999512f, 0.002428f, 0.999512f, 0.001325f, 0.999512f, 0.000447f, 0.999023f, 0.000013f,
+ 0.000000f, 1.000000f, 0.888184f, 0.623047f, 0.937988f, 0.503418f, 0.956543f, 0.430420f,
+ 0.967285f, 0.377686f, 0.973633f, 0.337402f, 0.978027f, 0.304932f, 0.980469f, 0.278320f,
+ 0.984375f, 0.255127f, 0.985352f, 0.235718f, 0.986816f, 0.218506f, 0.988770f, 0.203003f,
+ 0.989746f, 0.189331f, 0.990234f, 0.177246f, 0.990234f, 0.166382f, 0.991211f, 0.156250f,
+ 0.992188f, 0.146973f, 0.993164f, 0.138306f, 0.994141f, 0.130005f, 0.994141f, 0.122742f,
+ 0.994629f, 0.116089f, 0.994629f, 0.109680f, 0.994629f, 0.103882f, 0.994629f, 0.098389f,
+ 0.995117f, 0.093140f, 0.995117f, 0.088257f, 0.995117f, 0.083679f, 0.995605f, 0.079224f,
+ 0.995605f, 0.075073f, 0.995605f, 0.071167f, 0.996094f, 0.067261f, 0.996094f, 0.063721f,
+ 0.996582f, 0.060242f, 0.996582f, 0.056915f, 0.996582f, 0.053772f, 0.997070f, 0.050629f,
+ 0.997070f, 0.047729f, 0.997559f, 0.044769f, 0.998047f, 0.041962f, 0.998535f, 0.039215f,
+ 0.999023f, 0.036469f, 0.999512f, 0.033752f, 0.999512f, 0.031311f, 0.999512f, 0.029022f,
+ 0.999512f, 0.026840f, 0.999512f, 0.024734f, 0.999512f, 0.022720f, 0.999512f, 0.020782f,
+ 0.999512f, 0.018921f, 0.999512f, 0.017120f, 0.999512f, 0.015404f, 0.999512f, 0.013741f,
+ 0.999512f, 0.012138f, 0.999512f, 0.010597f, 0.999512f, 0.009125f, 0.999512f, 0.007717f,
+ 0.999512f, 0.006378f, 0.999512f, 0.005108f, 0.999512f, 0.003922f, 0.999512f, 0.002823f,
+ 0.999512f, 0.001834f, 0.999512f, 0.000981f, 0.999512f, 0.000322f, 0.999512f, 0.000008f,
+ 0.000000f, 1.000000f, 0.901855f, 0.619629f, 0.946289f, 0.500488f, 0.963867f, 0.426758f,
+ 0.971680f, 0.374512f, 0.977539f, 0.333740f, 0.980957f, 0.301025f, 0.984375f, 0.273193f,
+ 0.985840f, 0.250488f, 0.988281f, 0.230347f, 0.989258f, 0.212891f, 0.990234f, 0.197510f,
+ 0.990723f, 0.183838f, 0.991699f, 0.171387f, 0.992188f, 0.160156f, 0.994141f, 0.149536f,
+ 0.994141f, 0.140137f, 0.994141f, 0.131714f, 0.994629f, 0.123779f, 0.994629f, 0.116577f,
+ 0.994629f, 0.109924f, 0.995117f, 0.103577f, 0.995117f, 0.097717f, 0.995605f, 0.092224f,
+ 0.995605f, 0.087036f, 0.995605f, 0.082214f, 0.996094f, 0.077515f, 0.996094f, 0.073242f,
+ 0.996582f, 0.069031f, 0.996582f, 0.065125f, 0.997070f, 0.061401f, 0.997070f, 0.057831f,
+ 0.997559f, 0.054382f, 0.997559f, 0.051117f, 0.998047f, 0.047913f, 0.998535f, 0.044800f,
+ 0.999512f, 0.041626f, 0.999512f, 0.038818f, 0.999512f, 0.036194f, 0.999512f, 0.033722f,
+ 0.999512f, 0.031372f, 0.999512f, 0.029144f, 0.999512f, 0.027008f, 0.999512f, 0.024963f,
+ 0.999512f, 0.022995f, 0.999512f, 0.021118f, 0.999512f, 0.019318f, 0.999512f, 0.017593f,
+ 0.999512f, 0.015945f, 0.999512f, 0.014366f, 0.999512f, 0.012856f, 0.999512f, 0.011398f,
+ 0.999512f, 0.010017f, 0.999512f, 0.008690f, 0.999512f, 0.007435f, 0.999512f, 0.006241f,
+ 0.999512f, 0.005116f, 0.999512f, 0.004063f, 0.999512f, 0.003088f, 0.999512f, 0.002197f,
+ 0.999512f, 0.001409f, 0.999512f, 0.000741f, 0.999512f, 0.000237f, 0.999512f, 0.000006f,
+ 0.000000f, 1.000000f, 0.912598f, 0.617676f, 0.952637f, 0.498779f, 0.968262f, 0.424805f,
+ 0.976074f, 0.371826f, 0.980469f, 0.330566f, 0.983887f, 0.297363f, 0.985840f, 0.270020f,
+ 0.988770f, 0.246094f, 0.989258f, 0.226196f, 0.990234f, 0.208618f, 0.991211f, 0.193115f,
+ 0.992188f, 0.178955f, 0.993652f, 0.166138f, 0.994141f, 0.154663f, 0.994141f, 0.144531f,
+ 0.994629f, 0.135132f, 0.994629f, 0.126709f, 0.995117f, 0.118774f, 0.995117f, 0.111511f,
+ 0.995117f, 0.104797f, 0.995605f, 0.098450f, 0.995605f, 0.092590f, 0.996094f, 0.087036f,
+ 0.996094f, 0.081909f, 0.996582f, 0.076965f, 0.996582f, 0.072388f, 0.997070f, 0.067993f,
+ 0.997559f, 0.063904f, 0.997559f, 0.059967f, 0.998047f, 0.056152f, 0.999023f, 0.052460f,
+ 0.999512f, 0.048828f, 0.999512f, 0.045593f, 0.999512f, 0.042603f, 0.999512f, 0.039795f,
+ 0.999512f, 0.037109f, 0.999512f, 0.034576f, 0.999512f, 0.032196f, 0.999512f, 0.029907f,
+ 0.999512f, 0.027740f, 0.999512f, 0.025665f, 0.999512f, 0.023697f, 0.999512f, 0.021820f,
+ 0.999512f, 0.020020f, 0.999512f, 0.018311f, 0.999512f, 0.016678f, 0.999512f, 0.015121f,
+ 0.999512f, 0.013634f, 0.999512f, 0.012222f, 0.999512f, 0.010872f, 0.999512f, 0.009590f,
+ 0.999512f, 0.008377f, 0.999512f, 0.007225f, 0.999512f, 0.006138f, 0.999512f, 0.005116f,
+ 0.999512f, 0.004162f, 0.999512f, 0.003277f, 0.999512f, 0.002466f, 0.999512f, 0.001737f,
+ 0.999512f, 0.001098f, 0.999512f, 0.000568f, 0.999512f, 0.000177f, 0.999512f, 0.000004f,
+ 0.000000f, 1.000000f, 0.921387f, 0.616211f, 0.958496f, 0.497314f, 0.972656f, 0.422852f,
+ 0.979004f, 0.369629f, 0.983887f, 0.327881f, 0.985840f, 0.294678f, 0.988770f, 0.266602f,
+ 0.989258f, 0.243286f, 0.990723f, 0.222778f, 0.991699f, 0.205078f, 0.993652f, 0.188599f,
+ 0.994141f, 0.174561f, 0.994141f, 0.161987f, 0.994629f, 0.150635f, 0.994629f, 0.140503f,
+ 0.995117f, 0.130981f, 0.995117f, 0.122498f, 0.995605f, 0.114502f, 0.995605f, 0.107239f,
+ 0.996094f, 0.100342f, 0.996094f, 0.094055f, 0.996582f, 0.088074f, 0.996582f, 0.082642f,
+ 0.997070f, 0.077332f, 0.997559f, 0.072388f, 0.998047f, 0.067749f, 0.998535f, 0.063293f,
+ 0.999512f, 0.058868f, 0.999512f, 0.054901f, 0.999512f, 0.051300f, 0.999512f, 0.047913f,
+ 0.999512f, 0.044739f, 0.999512f, 0.041718f, 0.999512f, 0.038910f, 0.999512f, 0.036224f,
+ 0.999512f, 0.033691f, 0.999512f, 0.031311f, 0.999512f, 0.029053f, 0.999512f, 0.026901f,
+ 0.999512f, 0.024857f, 0.999512f, 0.022903f, 0.999512f, 0.021072f, 0.999512f, 0.019318f,
+ 0.999512f, 0.017654f, 0.999512f, 0.016068f, 0.999512f, 0.014572f, 0.999512f, 0.013153f,
+ 0.999512f, 0.011803f, 0.999512f, 0.010521f, 0.999512f, 0.009308f, 0.999512f, 0.008171f,
+ 0.999512f, 0.007092f, 0.999512f, 0.006081f, 0.999512f, 0.005131f, 0.999512f, 0.004246f,
+ 0.999512f, 0.003428f, 0.999512f, 0.002676f, 0.999512f, 0.001995f, 0.999512f, 0.001390f,
+ 0.999512f, 0.000868f, 0.999512f, 0.000442f, 0.999512f, 0.000135f, 0.999512f, 0.000003f,
+ 0.000000f, 1.000000f, 0.929688f, 0.614746f, 0.962891f, 0.496338f, 0.975098f, 0.421875f,
+ 0.981934f, 0.367676f, 0.984863f, 0.326416f, 0.988281f, 0.291992f, 0.989258f, 0.264404f,
+ 0.990723f, 0.240601f, 0.992188f, 0.219849f, 0.993652f, 0.201294f, 0.994141f, 0.185425f,
+ 0.994141f, 0.171509f, 0.994629f, 0.158813f, 0.994629f, 0.147461f, 0.995117f, 0.136963f,
+ 0.995605f, 0.127563f, 0.995605f, 0.118896f, 0.996094f, 0.110840f, 0.996094f, 0.103516f,
+ 0.996582f, 0.096558f, 0.997070f, 0.090149f, 0.997559f, 0.084106f, 0.998047f, 0.078491f,
+ 0.998535f, 0.073120f, 0.999512f, 0.067871f, 0.999512f, 0.063232f, 0.999512f, 0.059021f,
+ 0.999512f, 0.055054f, 0.999512f, 0.051361f, 0.999512f, 0.047913f, 0.999512f, 0.044647f,
+ 0.999512f, 0.041565f, 0.999512f, 0.038696f, 0.999512f, 0.035950f, 0.999512f, 0.033386f,
+ 0.999512f, 0.030975f, 0.999512f, 0.028671f, 0.999512f, 0.026505f, 0.999512f, 0.024460f,
+ 0.999512f, 0.022522f, 0.999512f, 0.020676f, 0.999512f, 0.018936f, 0.999512f, 0.017303f,
+ 0.999512f, 0.015747f, 0.999512f, 0.014275f, 0.999512f, 0.012886f, 0.999512f, 0.011574f,
+ 0.999512f, 0.010338f, 0.999512f, 0.009171f, 0.999512f, 0.008072f, 0.999512f, 0.007046f,
+ 0.999512f, 0.006081f, 0.999512f, 0.005180f, 0.999512f, 0.004341f, 0.999512f, 0.003571f,
+ 0.999512f, 0.002859f, 0.999512f, 0.002214f, 0.999512f, 0.001636f, 0.999512f, 0.001127f,
+ 0.999512f, 0.000695f, 0.999512f, 0.000348f, 0.999512f, 0.000104f, 0.999512f, 0.000002f,
+ 0.000000f, 1.000000f, 0.936035f, 0.614258f, 0.966797f, 0.495605f, 0.978027f, 0.420654f,
+ 0.983398f, 0.366699f, 0.987793f, 0.324219f, 0.989258f, 0.290527f, 0.990234f, 0.262451f,
+ 0.992676f, 0.238037f, 0.993652f, 0.216919f, 0.994141f, 0.198853f, 0.994141f, 0.183105f,
+ 0.994629f, 0.168823f, 0.995117f, 0.156006f, 0.995117f, 0.144653f, 0.995605f, 0.134033f,
+ 0.996094f, 0.124512f, 0.996582f, 0.115723f, 0.996582f, 0.107666f, 0.997070f, 0.100098f,
+ 0.997559f, 0.093140f, 0.998535f, 0.086487f, 0.999512f, 0.080139f, 0.999512f, 0.074463f,
+ 0.999512f, 0.069336f, 0.999512f, 0.064575f, 0.999512f, 0.060181f, 0.999512f, 0.056030f,
+ 0.999512f, 0.052185f, 0.999512f, 0.048584f, 0.999512f, 0.045197f, 0.999512f, 0.041992f,
+ 0.999512f, 0.039001f, 0.999512f, 0.036194f, 0.999512f, 0.033569f, 0.999512f, 0.031082f,
+ 0.999512f, 0.028732f, 0.999512f, 0.026520f, 0.999512f, 0.024429f, 0.999512f, 0.022461f,
+ 0.999512f, 0.020615f, 0.999512f, 0.018860f, 0.999512f, 0.017212f, 0.999512f, 0.015656f,
+ 0.999512f, 0.014198f, 0.999512f, 0.012817f, 0.999512f, 0.011520f, 0.999512f, 0.010307f,
+ 0.999512f, 0.009155f, 0.999512f, 0.008087f, 0.999512f, 0.007084f, 0.999512f, 0.006145f,
+ 0.999512f, 0.005276f, 0.999512f, 0.004467f, 0.999512f, 0.003723f, 0.999512f, 0.003038f,
+ 0.999512f, 0.002415f, 0.999512f, 0.001856f, 0.999512f, 0.001358f, 0.999512f, 0.000926f,
+ 0.999512f, 0.000564f, 0.999512f, 0.000278f, 0.999512f, 0.000081f, 0.999512f, 0.000002f,
+ 0.000000f, 1.000000f, 0.942383f, 0.613281f, 0.970703f, 0.494385f, 0.980957f, 0.419678f,
+ 0.985840f, 0.365479f, 0.988770f, 0.322998f, 0.990234f, 0.289062f, 0.992676f, 0.260010f,
+ 0.993652f, 0.235718f, 0.994141f, 0.214966f, 0.994629f, 0.196899f, 0.994629f, 0.180908f,
+ 0.995117f, 0.166504f, 0.995605f, 0.153564f, 0.996094f, 0.141968f, 0.996094f, 0.131470f,
+ 0.996582f, 0.121826f, 0.997070f, 0.112915f, 0.998047f, 0.104553f, 0.999023f, 0.096741f,
+ 0.999512f, 0.089478f, 0.999512f, 0.083069f, 0.999512f, 0.077209f, 0.999512f, 0.071777f,
+ 0.999512f, 0.066711f, 0.999512f, 0.062073f, 0.999512f, 0.057709f, 0.999512f, 0.053650f,
+ 0.999512f, 0.049835f, 0.999512f, 0.046295f, 0.999512f, 0.042969f, 0.999512f, 0.039856f,
+ 0.999512f, 0.036926f, 0.999512f, 0.034180f, 0.999512f, 0.031586f, 0.999512f, 0.029175f,
+ 0.999512f, 0.026886f, 0.999512f, 0.024750f, 0.999512f, 0.022736f, 0.999512f, 0.020844f,
+ 0.999512f, 0.019058f, 0.999512f, 0.017380f, 0.999512f, 0.015808f, 0.999512f, 0.014328f,
+ 0.999512f, 0.012939f, 0.999512f, 0.011642f, 0.999512f, 0.010422f, 0.999512f, 0.009277f,
+ 0.999512f, 0.008209f, 0.999512f, 0.007214f, 0.999512f, 0.006290f, 0.999512f, 0.005428f,
+ 0.999512f, 0.004635f, 0.999512f, 0.003902f, 0.999512f, 0.003231f, 0.999512f, 0.002619f,
+ 0.999512f, 0.002068f, 0.999512f, 0.001575f, 0.999512f, 0.001143f, 0.999512f, 0.000772f,
+ 0.999512f, 0.000464f, 0.999512f, 0.000226f, 0.999512f, 0.000065f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.947266f, 0.612793f, 0.973633f, 0.494141f, 0.982422f, 0.418945f,
+ 0.987793f, 0.364014f, 0.989258f, 0.322266f, 0.992188f, 0.287354f, 0.993652f, 0.258301f,
+ 0.994141f, 0.234375f, 0.994141f, 0.213501f, 0.994629f, 0.195190f, 0.995117f, 0.178955f,
+ 0.995605f, 0.164551f, 0.996094f, 0.151489f, 0.996582f, 0.139771f, 0.997070f, 0.129028f,
+ 0.998047f, 0.119080f, 0.999512f, 0.109741f, 0.999512f, 0.101379f, 0.999512f, 0.093872f,
+ 0.999512f, 0.087036f, 0.999512f, 0.080811f, 0.999512f, 0.074951f, 0.999512f, 0.069580f,
+ 0.999512f, 0.064636f, 0.999512f, 0.059998f, 0.999512f, 0.055695f, 0.999512f, 0.051666f,
+ 0.999512f, 0.047913f, 0.999512f, 0.044403f, 0.999512f, 0.041107f, 0.999512f, 0.038055f,
+ 0.999512f, 0.035187f, 0.999512f, 0.032471f, 0.999512f, 0.029968f, 0.999512f, 0.027588f,
+ 0.999512f, 0.025375f, 0.999512f, 0.023285f, 0.999512f, 0.021332f, 0.999512f, 0.019501f,
+ 0.999512f, 0.017776f, 0.999512f, 0.016159f, 0.999512f, 0.014656f, 0.999512f, 0.013237f,
+ 0.999512f, 0.011917f, 0.999512f, 0.010674f, 0.999512f, 0.009521f, 0.999512f, 0.008446f,
+ 0.999512f, 0.007442f, 0.999512f, 0.006512f, 0.999512f, 0.005650f, 0.999512f, 0.004852f,
+ 0.999512f, 0.004120f, 0.999512f, 0.003450f, 0.999512f, 0.002840f, 0.999512f, 0.002287f,
+ 0.999512f, 0.001793f, 0.999512f, 0.001355f, 0.999512f, 0.000975f, 0.999512f, 0.000652f,
+ 0.999512f, 0.000388f, 0.999512f, 0.000186f, 0.999512f, 0.000052f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.951660f, 0.612305f, 0.976074f, 0.493652f, 0.983887f, 0.418457f,
+ 0.988281f, 0.363525f, 0.990723f, 0.321045f, 0.993164f, 0.285889f, 0.993652f, 0.257324f,
+ 0.994141f, 0.233154f, 0.994629f, 0.212158f, 0.995117f, 0.193726f, 0.995605f, 0.177368f,
+ 0.996582f, 0.162720f, 0.997070f, 0.149414f, 0.997559f, 0.137573f, 0.999023f, 0.126343f,
+ 0.999512f, 0.116272f, 0.999512f, 0.107422f, 0.999512f, 0.099365f, 0.999512f, 0.091980f,
+ 0.999512f, 0.085205f, 0.999512f, 0.078979f, 0.999512f, 0.073181f, 0.999512f, 0.067810f,
+ 0.999512f, 0.062866f, 0.999512f, 0.058289f, 0.999512f, 0.054016f, 0.999512f, 0.050018f,
+ 0.999512f, 0.046295f, 0.999512f, 0.042847f, 0.999512f, 0.039612f, 0.999512f, 0.036560f,
+ 0.999512f, 0.033722f, 0.999512f, 0.031097f, 0.999512f, 0.028610f, 0.999512f, 0.026291f,
+ 0.999512f, 0.024109f, 0.999512f, 0.022079f, 0.999512f, 0.020172f, 0.999512f, 0.018387f,
+ 0.999512f, 0.016724f, 0.999512f, 0.015167f, 0.999512f, 0.013710f, 0.999512f, 0.012344f,
+ 0.999512f, 0.011078f, 0.999512f, 0.009895f, 0.999512f, 0.008789f, 0.999512f, 0.007771f,
+ 0.999512f, 0.006821f, 0.999512f, 0.005943f, 0.999512f, 0.005135f, 0.999512f, 0.004391f,
+ 0.999512f, 0.003710f, 0.999512f, 0.003090f, 0.999512f, 0.002529f, 0.999512f, 0.002024f,
+ 0.999512f, 0.001576f, 0.999512f, 0.001183f, 0.999512f, 0.000844f, 0.999512f, 0.000559f,
+ 0.999512f, 0.000329f, 0.999512f, 0.000155f, 0.999512f, 0.000043f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.955078f, 0.612305f, 0.978516f, 0.493164f, 0.986816f, 0.417480f,
+ 0.989258f, 0.363037f, 0.992676f, 0.319580f, 0.993652f, 0.285156f, 0.994141f, 0.256348f,
+ 0.994629f, 0.232056f, 0.995117f, 0.210938f, 0.996094f, 0.192261f, 0.996582f, 0.175659f,
+ 0.997070f, 0.160889f, 0.998535f, 0.147339f, 0.999512f, 0.134888f, 0.999512f, 0.124268f,
+ 0.999512f, 0.114563f, 0.999512f, 0.105774f, 0.999512f, 0.097778f, 0.999512f, 0.090454f,
+ 0.999512f, 0.083679f, 0.999512f, 0.077454f, 0.999512f, 0.071716f, 0.999512f, 0.066406f,
+ 0.999512f, 0.061462f, 0.999512f, 0.056885f, 0.999512f, 0.052612f, 0.999512f, 0.048676f,
+ 0.999512f, 0.044983f, 0.999512f, 0.041534f, 0.999512f, 0.038330f, 0.999512f, 0.035339f,
+ 0.999512f, 0.032532f, 0.999512f, 0.029938f, 0.999512f, 0.027496f, 0.999512f, 0.025208f,
+ 0.999512f, 0.023087f, 0.999512f, 0.021088f, 0.999512f, 0.019226f, 0.999512f, 0.017487f,
+ 0.999512f, 0.015854f, 0.999512f, 0.014351f, 0.999512f, 0.012932f, 0.999512f, 0.011620f,
+ 0.999512f, 0.010391f, 0.999512f, 0.009254f, 0.999512f, 0.008194f, 0.999512f, 0.007221f,
+ 0.999512f, 0.006317f, 0.999512f, 0.005486f, 0.999512f, 0.004719f, 0.999512f, 0.004017f,
+ 0.999512f, 0.003380f, 0.999512f, 0.002802f, 0.999512f, 0.002281f, 0.999512f, 0.001817f,
+ 0.999512f, 0.001406f, 0.999512f, 0.001047f, 0.999512f, 0.000741f, 0.999512f, 0.000487f,
+ 0.999512f, 0.000283f, 0.999512f, 0.000132f, 0.999512f, 0.000036f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.958496f, 0.612305f, 0.979980f, 0.492920f, 0.987305f, 0.417236f,
+ 0.990723f, 0.362305f, 0.993164f, 0.319092f, 0.993652f, 0.284668f, 0.994629f, 0.255615f,
+ 0.995117f, 0.231079f, 0.996094f, 0.209717f, 0.996582f, 0.190918f, 0.997559f, 0.174072f,
+ 0.999512f, 0.158569f, 0.999512f, 0.145264f, 0.999512f, 0.133545f, 0.999512f, 0.122925f,
+ 0.999512f, 0.113281f, 0.999512f, 0.104492f, 0.999512f, 0.096497f, 0.999512f, 0.089172f,
+ 0.999512f, 0.082397f, 0.999512f, 0.076233f, 0.999512f, 0.070496f, 0.999512f, 0.065186f,
+ 0.999512f, 0.060272f, 0.999512f, 0.055695f, 0.999512f, 0.051483f, 0.999512f, 0.047546f,
+ 0.999512f, 0.043884f, 0.999512f, 0.040466f, 0.999512f, 0.037292f, 0.999512f, 0.034332f,
+ 0.999512f, 0.031555f, 0.999512f, 0.028976f, 0.999512f, 0.026581f, 0.999512f, 0.024323f,
+ 0.999512f, 0.022232f, 0.999512f, 0.020279f, 0.999512f, 0.018448f, 0.999512f, 0.016739f,
+ 0.999512f, 0.015160f, 0.999512f, 0.013680f, 0.999512f, 0.012306f, 0.999512f, 0.011024f,
+ 0.999512f, 0.009834f, 0.999512f, 0.008736f, 0.999512f, 0.007717f, 0.999512f, 0.006779f,
+ 0.999512f, 0.005913f, 0.999512f, 0.005116f, 0.999512f, 0.004387f, 0.999512f, 0.003721f,
+ 0.999512f, 0.003119f, 0.999512f, 0.002573f, 0.999512f, 0.002085f, 0.999512f, 0.001652f,
+ 0.999512f, 0.001270f, 0.999512f, 0.000941f, 0.999512f, 0.000661f, 0.999512f, 0.000430f,
+ 0.999512f, 0.000248f, 0.999512f, 0.000114f, 0.999512f, 0.000030f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.961914f, 0.611816f, 0.981934f, 0.492676f, 0.988281f, 0.417236f,
+ 0.992188f, 0.361328f, 0.993164f, 0.318848f, 0.994141f, 0.283936f, 0.995117f, 0.254883f,
+ 0.995605f, 0.230225f, 0.996582f, 0.208496f, 0.998047f, 0.189331f, 0.999512f, 0.171997f,
+ 0.999512f, 0.157227f, 0.999512f, 0.144165f, 0.999512f, 0.132446f, 0.999512f, 0.121826f,
+ 0.999512f, 0.112244f, 0.999512f, 0.103455f, 0.999512f, 0.095459f, 0.999512f, 0.088135f,
+ 0.999512f, 0.081421f, 0.999512f, 0.075195f, 0.999512f, 0.069458f, 0.999512f, 0.064148f,
+ 0.999512f, 0.059296f, 0.999512f, 0.054749f, 0.999512f, 0.050537f, 0.999512f, 0.046600f,
+ 0.999512f, 0.042969f, 0.999512f, 0.039581f, 0.999512f, 0.036438f, 0.999512f, 0.033478f,
+ 0.999512f, 0.030746f, 0.999512f, 0.028198f, 0.999512f, 0.025818f, 0.999512f, 0.023605f,
+ 0.999512f, 0.021530f, 0.999512f, 0.019608f, 0.999512f, 0.017807f, 0.999512f, 0.016129f,
+ 0.999512f, 0.014580f, 0.999512f, 0.013138f, 0.999512f, 0.011787f, 0.999512f, 0.010544f,
+ 0.999512f, 0.009384f, 0.999512f, 0.008316f, 0.999512f, 0.007332f, 0.999512f, 0.006420f,
+ 0.999512f, 0.005585f, 0.999512f, 0.004818f, 0.999512f, 0.004120f, 0.999512f, 0.003483f,
+ 0.999512f, 0.002909f, 0.999512f, 0.002392f, 0.999512f, 0.001929f, 0.999512f, 0.001521f,
+ 0.999512f, 0.001164f, 0.999512f, 0.000858f, 0.999512f, 0.000599f, 0.999512f, 0.000387f,
+ 0.999512f, 0.000221f, 0.999512f, 0.000101f, 0.999512f, 0.000026f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.964355f, 0.611816f, 0.984863f, 0.491699f, 0.989258f, 0.416748f,
+ 0.992676f, 0.361084f, 0.993652f, 0.318359f, 0.994629f, 0.283447f, 0.995605f, 0.254150f,
+ 0.996582f, 0.229126f, 0.998047f, 0.207153f, 0.999512f, 0.187500f, 0.999512f, 0.171021f,
+ 0.999512f, 0.156372f, 0.999512f, 0.143311f, 0.999512f, 0.131592f, 0.999512f, 0.120972f,
+ 0.999512f, 0.111389f, 0.999512f, 0.102600f, 0.999512f, 0.094604f, 0.999512f, 0.087280f,
+ 0.999512f, 0.080566f, 0.999512f, 0.074341f, 0.999512f, 0.068604f, 0.999512f, 0.063354f,
+ 0.999512f, 0.058472f, 0.999512f, 0.053955f, 0.999512f, 0.049744f, 0.999512f, 0.045837f,
+ 0.999512f, 0.042236f, 0.999512f, 0.038849f, 0.999512f, 0.035706f, 0.999512f, 0.032806f,
+ 0.999512f, 0.030090f, 0.999512f, 0.027557f, 0.999512f, 0.025208f, 0.999512f, 0.023010f,
+ 0.999512f, 0.020966f, 0.999512f, 0.019058f, 0.999512f, 0.017288f, 0.999512f, 0.015640f,
+ 0.999512f, 0.014114f, 0.999512f, 0.012695f, 0.999512f, 0.011375f, 0.999512f, 0.010155f,
+ 0.999512f, 0.009026f, 0.999512f, 0.007980f, 0.999512f, 0.007019f, 0.999512f, 0.006134f,
+ 0.999512f, 0.005325f, 0.999512f, 0.004581f, 0.999512f, 0.003906f, 0.999512f, 0.003296f,
+ 0.999512f, 0.002743f, 0.999512f, 0.002247f, 0.999512f, 0.001807f, 0.999512f, 0.001419f,
+ 0.999512f, 0.001081f, 0.999512f, 0.000793f, 0.999512f, 0.000550f, 0.999512f, 0.000353f,
+ 0.999512f, 0.000200f, 0.999512f, 0.000090f, 0.999512f, 0.000023f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.967285f, 0.611328f, 0.985352f, 0.491943f, 0.991699f, 0.415527f,
+ 0.993164f, 0.360840f, 0.994141f, 0.317871f, 0.995117f, 0.282959f, 0.996582f, 0.253418f,
+ 0.998047f, 0.227905f, 0.999512f, 0.205444f, 0.999512f, 0.186768f, 0.999512f, 0.170288f,
+ 0.999512f, 0.155640f, 0.999512f, 0.142578f, 0.999512f, 0.130859f, 0.999512f, 0.120300f,
+ 0.999512f, 0.110718f, 0.999512f, 0.101929f, 0.999512f, 0.093933f, 0.999512f, 0.086609f,
+ 0.999512f, 0.079834f, 0.999512f, 0.073669f, 0.999512f, 0.067932f, 0.999512f, 0.062683f,
+ 0.999512f, 0.057800f, 0.999512f, 0.053284f, 0.999512f, 0.049103f, 0.999512f, 0.045227f,
+ 0.999512f, 0.041626f, 0.999512f, 0.038269f, 0.999512f, 0.035156f, 0.999512f, 0.032257f,
+ 0.999512f, 0.029556f, 0.999512f, 0.027039f, 0.999512f, 0.024704f, 0.999512f, 0.022537f,
+ 0.999512f, 0.020508f, 0.999512f, 0.018631f, 0.999512f, 0.016876f, 0.999512f, 0.015251f,
+ 0.999512f, 0.013748f, 0.999512f, 0.012344f, 0.999512f, 0.011047f, 0.999512f, 0.009850f,
+ 0.999512f, 0.008736f, 0.999512f, 0.007717f, 0.999512f, 0.006775f, 0.999512f, 0.005909f,
+ 0.999512f, 0.005119f, 0.999512f, 0.004395f, 0.999512f, 0.003740f, 0.999512f, 0.003147f,
+ 0.999512f, 0.002613f, 0.999512f, 0.002136f, 0.999512f, 0.001712f, 0.999512f, 0.001340f,
+ 0.999512f, 0.001018f, 0.999512f, 0.000743f, 0.999512f, 0.000514f, 0.999512f, 0.000328f,
+ 0.999512f, 0.000184f, 0.999512f, 0.000082f, 0.999512f, 0.000021f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.969238f, 0.611328f, 0.985840f, 0.491943f, 0.991699f, 0.415527f,
+ 0.993164f, 0.360840f, 0.994629f, 0.317627f, 0.996094f, 0.282227f, 0.997559f, 0.252197f,
+ 0.999512f, 0.226318f, 0.999512f, 0.204956f, 0.999512f, 0.186279f, 0.999512f, 0.169800f,
+ 0.999512f, 0.155151f, 0.999512f, 0.142090f, 0.999512f, 0.130371f, 0.999512f, 0.119751f,
+ 0.999512f, 0.110107f, 0.999512f, 0.101379f, 0.999512f, 0.093384f, 0.999512f, 0.085999f,
+ 0.999512f, 0.079285f, 0.999512f, 0.073120f, 0.999512f, 0.067383f, 0.999512f, 0.062164f,
+ 0.999512f, 0.057281f, 0.999512f, 0.052765f, 0.999512f, 0.048615f, 0.999512f, 0.044739f,
+ 0.999512f, 0.041138f, 0.999512f, 0.037781f, 0.999512f, 0.034698f, 0.999512f, 0.031799f,
+ 0.999512f, 0.029129f, 0.999512f, 0.026627f, 0.999512f, 0.024307f, 0.999512f, 0.022156f,
+ 0.999512f, 0.020142f, 0.999512f, 0.018280f, 0.999512f, 0.016556f, 0.999512f, 0.014946f,
+ 0.999512f, 0.013451f, 0.999512f, 0.012070f, 0.999512f, 0.010788f, 0.999512f, 0.009605f,
+ 0.999512f, 0.008514f, 0.999512f, 0.007507f, 0.999512f, 0.006580f, 0.999512f, 0.005733f,
+ 0.999512f, 0.004959f, 0.999512f, 0.004253f, 0.999512f, 0.003613f, 0.999512f, 0.003033f,
+ 0.999512f, 0.002512f, 0.999512f, 0.002048f, 0.999512f, 0.001639f, 0.999512f, 0.001280f,
+ 0.999512f, 0.000969f, 0.999512f, 0.000705f, 0.999512f, 0.000485f, 0.999512f, 0.000308f,
+ 0.999512f, 0.000173f, 0.999512f, 0.000077f, 0.999512f, 0.000019f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.971680f, 0.610840f, 0.986816f, 0.491943f, 0.992188f, 0.415771f,
+ 0.993652f, 0.360596f, 0.995117f, 0.317139f, 0.997070f, 0.281250f, 0.999512f, 0.250732f,
+ 0.999512f, 0.225952f, 0.999512f, 0.204468f, 0.999512f, 0.185791f, 0.999512f, 0.169434f,
+ 0.999512f, 0.154785f, 0.999512f, 0.141724f, 0.999512f, 0.129883f, 0.999512f, 0.119324f,
+ 0.999512f, 0.109680f, 0.999512f, 0.100952f, 0.999512f, 0.092896f, 0.999512f, 0.085571f,
+ 0.999512f, 0.078857f, 0.999512f, 0.072693f, 0.999512f, 0.066956f, 0.999512f, 0.061737f,
+ 0.999512f, 0.056854f, 0.999512f, 0.052368f, 0.999512f, 0.048187f, 0.999512f, 0.044342f,
+ 0.999512f, 0.040741f, 0.999512f, 0.037415f, 0.999512f, 0.034332f, 0.999512f, 0.031464f,
+ 0.999512f, 0.028793f, 0.999512f, 0.026306f, 0.999512f, 0.024002f, 0.999512f, 0.021866f,
+ 0.999512f, 0.019867f, 0.999512f, 0.018021f, 0.999512f, 0.016296f, 0.999512f, 0.014702f,
+ 0.999512f, 0.013222f, 0.999512f, 0.011856f, 0.999512f, 0.010590f, 0.999512f, 0.009415f,
+ 0.999512f, 0.008339f, 0.999512f, 0.007347f, 0.999512f, 0.006435f, 0.999512f, 0.005600f,
+ 0.999512f, 0.004837f, 0.999512f, 0.004143f, 0.999512f, 0.003513f, 0.999512f, 0.002945f,
+ 0.999512f, 0.002438f, 0.999512f, 0.001984f, 0.999512f, 0.001584f, 0.999512f, 0.001234f,
+ 0.999512f, 0.000932f, 0.999512f, 0.000677f, 0.999512f, 0.000464f, 0.999512f, 0.000294f,
+ 0.999512f, 0.000164f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.973145f, 0.610840f, 0.989258f, 0.490723f, 0.992188f, 0.415771f,
+ 0.994141f, 0.360352f, 0.996094f, 0.316406f, 0.999512f, 0.279541f, 0.999512f, 0.250244f,
+ 0.999512f, 0.225586f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f,
+ 0.999512f, 0.154419f, 0.999512f, 0.141357f, 0.999512f, 0.129639f, 0.999512f, 0.119019f,
+ 0.999512f, 0.109375f, 0.999512f, 0.100586f, 0.999512f, 0.092590f, 0.999512f, 0.085266f,
+ 0.999512f, 0.078491f, 0.999512f, 0.072327f, 0.999512f, 0.066650f, 0.999512f, 0.061401f,
+ 0.999512f, 0.056549f, 0.999512f, 0.052063f, 0.999512f, 0.047882f, 0.999512f, 0.044037f,
+ 0.999512f, 0.040466f, 0.999512f, 0.037140f, 0.999512f, 0.034058f, 0.999512f, 0.031204f,
+ 0.999512f, 0.028549f, 0.999512f, 0.026062f, 0.999512f, 0.023773f, 0.999512f, 0.021637f,
+ 0.999512f, 0.019653f, 0.999512f, 0.017807f, 0.999512f, 0.016098f, 0.999512f, 0.014519f,
+ 0.999512f, 0.013054f, 0.999512f, 0.011696f, 0.999512f, 0.010437f, 0.999512f, 0.009277f,
+ 0.999512f, 0.008209f, 0.999512f, 0.007225f, 0.999512f, 0.006325f, 0.999512f, 0.005497f,
+ 0.999512f, 0.004745f, 0.999512f, 0.004059f, 0.999512f, 0.003441f, 0.999512f, 0.002882f,
+ 0.999512f, 0.002380f, 0.999512f, 0.001936f, 0.999512f, 0.001543f, 0.999512f, 0.001201f,
+ 0.999512f, 0.000906f, 0.999512f, 0.000656f, 0.999512f, 0.000449f, 0.999512f, 0.000284f,
+ 0.999512f, 0.000158f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.976074f, 0.609863f, 0.989258f, 0.490967f, 0.992676f, 0.415527f,
+ 0.995117f, 0.359619f, 0.999512f, 0.314697f, 0.999512f, 0.279297f, 0.999512f, 0.250244f,
+ 0.999512f, 0.225464f, 0.999512f, 0.203979f, 0.999512f, 0.185303f, 0.999512f, 0.168823f,
+ 0.999512f, 0.154175f, 0.999512f, 0.141113f, 0.999512f, 0.129395f, 0.999512f, 0.118713f,
+ 0.999512f, 0.109131f, 0.999512f, 0.100342f, 0.999512f, 0.092346f, 0.999512f, 0.085022f,
+ 0.999512f, 0.078247f, 0.999512f, 0.072083f, 0.999512f, 0.066406f, 0.999512f, 0.061157f,
+ 0.999512f, 0.056305f, 0.999512f, 0.051819f, 0.999512f, 0.047668f, 0.999512f, 0.043823f,
+ 0.999512f, 0.040253f, 0.999512f, 0.036926f, 0.999512f, 0.033875f, 0.999512f, 0.031006f,
+ 0.999512f, 0.028351f, 0.999512f, 0.025894f, 0.999512f, 0.023605f, 0.999512f, 0.021469f,
+ 0.999512f, 0.019501f, 0.999512f, 0.017670f, 0.999512f, 0.015961f, 0.999512f, 0.014389f,
+ 0.999512f, 0.012932f, 0.999512f, 0.011574f, 0.999512f, 0.010330f, 0.999512f, 0.009178f,
+ 0.999512f, 0.008118f, 0.999512f, 0.007141f, 0.999512f, 0.006245f, 0.999512f, 0.005428f,
+ 0.999512f, 0.004681f, 0.999512f, 0.004002f, 0.999512f, 0.003389f, 0.999512f, 0.002836f,
+ 0.999512f, 0.002342f, 0.999512f, 0.001903f, 0.999512f, 0.001515f, 0.999512f, 0.001178f,
+ 0.999512f, 0.000887f, 0.999512f, 0.000641f, 0.999512f, 0.000439f, 0.999512f, 0.000277f,
+ 0.999512f, 0.000153f, 0.999512f, 0.000067f, 0.999512f, 0.000017f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.977539f, 0.609863f, 0.989258f, 0.491211f, 0.993164f, 0.415283f,
+ 0.996582f, 0.358887f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f,
+ 0.999512f, 0.225342f, 0.999512f, 0.203857f, 0.999512f, 0.185181f, 0.999512f, 0.168701f,
+ 0.999512f, 0.154053f, 0.999512f, 0.140991f, 0.999512f, 0.129150f, 0.999512f, 0.118591f,
+ 0.999512f, 0.108948f, 0.999512f, 0.100159f, 0.999512f, 0.092163f, 0.999512f, 0.084839f,
+ 0.999512f, 0.078125f, 0.999512f, 0.071899f, 0.999512f, 0.066223f, 0.999512f, 0.061005f,
+ 0.999512f, 0.056152f, 0.999512f, 0.051666f, 0.999512f, 0.047516f, 0.999512f, 0.043671f,
+ 0.999512f, 0.040100f, 0.999512f, 0.036804f, 0.999512f, 0.033722f, 0.999512f, 0.030884f,
+ 0.999512f, 0.028229f, 0.999512f, 0.025772f, 0.999512f, 0.023483f, 0.999512f, 0.021362f,
+ 0.999512f, 0.019394f, 0.999512f, 0.017563f, 0.999512f, 0.015869f, 0.999512f, 0.014305f,
+ 0.999512f, 0.012848f, 0.999512f, 0.011497f, 0.999512f, 0.010254f, 0.999512f, 0.009109f,
+ 0.999512f, 0.008057f, 0.999512f, 0.007084f, 0.999512f, 0.006195f, 0.999512f, 0.005379f,
+ 0.999512f, 0.004639f, 0.999512f, 0.003963f, 0.999512f, 0.003355f, 0.999512f, 0.002808f,
+ 0.999512f, 0.002316f, 0.999512f, 0.001881f, 0.999512f, 0.001497f, 0.999512f, 0.001163f,
+ 0.999512f, 0.000875f, 0.999512f, 0.000632f, 0.999512f, 0.000432f, 0.999512f, 0.000272f,
+ 0.999512f, 0.000151f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.978516f, 0.609863f, 0.988281f, 0.491699f, 0.994141f, 0.414795f,
+ 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f,
+ 0.999512f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f,
+ 0.999512f, 0.153931f, 0.999512f, 0.140869f, 0.999512f, 0.129028f, 0.999512f, 0.118469f,
+ 0.999512f, 0.108826f, 0.999512f, 0.100037f, 0.999512f, 0.092041f, 0.999512f, 0.084717f,
+ 0.999512f, 0.078003f, 0.999512f, 0.071838f, 0.999512f, 0.066101f, 0.999512f, 0.060883f,
+ 0.999512f, 0.056061f, 0.999512f, 0.051575f, 0.999512f, 0.047424f, 0.999512f, 0.043579f,
+ 0.999512f, 0.040009f, 0.999512f, 0.036713f, 0.999512f, 0.033661f, 0.999512f, 0.030807f,
+ 0.999512f, 0.028168f, 0.999512f, 0.025711f, 0.999512f, 0.023422f, 0.999512f, 0.021301f,
+ 0.999512f, 0.019333f, 0.999512f, 0.017517f, 0.999512f, 0.015823f, 0.999512f, 0.014252f,
+ 0.999512f, 0.012802f, 0.999512f, 0.011459f, 0.999512f, 0.010216f, 0.999512f, 0.009071f,
+ 0.999512f, 0.008018f, 0.999512f, 0.007053f, 0.999512f, 0.006165f, 0.999512f, 0.005352f,
+ 0.999512f, 0.004616f, 0.999512f, 0.003944f, 0.999512f, 0.003336f, 0.999512f, 0.002790f,
+ 0.999512f, 0.002302f, 0.999512f, 0.001868f, 0.999512f, 0.001487f, 0.999512f, 0.001154f,
+ 0.999512f, 0.000868f, 0.999512f, 0.000627f, 0.999512f, 0.000428f, 0.999512f, 0.000270f,
+ 0.999512f, 0.000149f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.980957f, 0.608398f, 0.983887f, 0.494385f, 0.999512f, 0.411377f,
+ 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f,
+ 1.000000f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 1.000000f, 0.168579f,
+ 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f,
+ 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f,
+ 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f,
+ 1.000000f, 0.056030f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f,
+ 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f,
+ 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f,
+ 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f,
+ 1.000000f, 0.012787f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f,
+ 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f,
+ 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f,
+ 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f,
+ 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f,
+ 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.998535f, 0.000000f, 0.996582f, 0.000000f, 0.995605f,
+ 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f,
+ 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.958008f, 0.000000f, 0.762695f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997070f, 0.000000f, 0.995605f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.990723f,
+ 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.958496f, 0.000000f, 0.762207f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.995605f,
+ 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.990234f,
+ 0.000000f, 0.985840f, 0.000000f, 0.979492f, 0.000000f, 0.958008f, 0.000004f, 0.761719f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.995605f,
+ 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.989746f,
+ 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.957031f, 0.000018f, 0.760742f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f,
+ 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.989258f,
+ 0.000000f, 0.986328f, 0.000000f, 0.978516f, 0.000000f, 0.957031f, 0.000067f, 0.758789f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.991211f, 0.000000f, 0.989258f,
+ 0.000000f, 0.986328f, 0.000000f, 0.977539f, 0.000117f, 0.956055f, 0.000197f, 0.756348f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.991211f, 0.000000f, 0.988770f,
+ 0.000000f, 0.985352f, 0.000000f, 0.977051f, 0.000230f, 0.955078f, 0.000445f, 0.753418f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.990723f, 0.000000f, 0.988281f,
+ 0.000000f, 0.984863f, 0.000396f, 0.976074f, 0.000321f, 0.953125f, 0.000923f, 0.750488f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.992676f, 0.000000f, 0.990234f, 0.000000f, 0.987793f,
+ 0.000358f, 0.983887f, 0.000641f, 0.975098f, 0.000618f, 0.951172f, 0.001679f, 0.746094f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f,
+ 0.000000f, 0.995117f, 0.000000f, 0.992188f, 0.000000f, 0.990234f, 0.000387f, 0.986816f,
+ 0.000991f, 0.982910f, 0.000816f, 0.974121f, 0.001087f, 0.949219f, 0.002859f, 0.741699f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f,
+ 0.000000f, 0.994141f, 0.000006f, 0.992676f, 0.000530f, 0.989746f, 0.001236f, 0.986328f,
+ 0.001287f, 0.981934f, 0.000954f, 0.972168f, 0.001658f, 0.947266f, 0.004513f, 0.736816f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994629f,
+ 0.000205f, 0.993652f, 0.000805f, 0.992676f, 0.001437f, 0.989258f, 0.001783f, 0.985840f,
+ 0.001449f, 0.980957f, 0.001559f, 0.971191f, 0.002533f, 0.944336f, 0.006859f, 0.731445f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000081f, 0.995117f, 0.000594f, 0.993652f,
+ 0.001163f, 0.993164f, 0.001719f, 0.991699f, 0.002253f, 0.988281f, 0.001995f, 0.984375f,
+ 0.001696f, 0.979004f, 0.002380f, 0.969727f, 0.003784f, 0.940430f, 0.009933f, 0.725586f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f,
+ 0.000082f, 0.995605f, 0.000549f, 0.995117f, 0.001094f, 0.994141f, 0.001608f, 0.993164f,
+ 0.002090f, 0.992676f, 0.002542f, 0.990723f, 0.002600f, 0.988281f, 0.002073f, 0.983398f,
+ 0.002438f, 0.978027f, 0.003592f, 0.967773f, 0.005383f, 0.937012f, 0.013847f, 0.718750f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000201f, 0.996094f, 0.000678f, 0.995605f,
+ 0.001168f, 0.995117f, 0.001616f, 0.994141f, 0.002028f, 0.993164f, 0.002453f, 0.992676f,
+ 0.002846f, 0.991211f, 0.003202f, 0.989746f, 0.003056f, 0.986816f, 0.003082f, 0.982422f,
+ 0.003553f, 0.975586f, 0.005165f, 0.964844f, 0.007755f, 0.932617f, 0.018951f, 0.711914f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000058f, 0.996094f,
+ 0.000488f, 0.996094f, 0.000952f, 0.996094f, 0.001387f, 0.995605f, 0.001765f, 0.995117f,
+ 0.002134f, 0.994141f, 0.002506f, 0.993164f, 0.002806f, 0.992676f, 0.003134f, 0.991699f,
+ 0.003462f, 0.990234f, 0.003700f, 0.989258f, 0.004452f, 0.985840f, 0.004211f, 0.980469f,
+ 0.005016f, 0.973633f, 0.007156f, 0.961426f, 0.010925f, 0.927734f, 0.025650f, 0.703613f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000059f, 0.996582f, 0.000468f, 0.996582f, 0.000903f, 0.996094f, 0.001275f, 0.996094f,
+ 0.001681f, 0.996094f, 0.002024f, 0.995605f, 0.002304f, 0.994629f, 0.002640f, 0.994141f,
+ 0.002855f, 0.993164f, 0.003193f, 0.992676f, 0.003401f, 0.992188f, 0.003712f, 0.990234f,
+ 0.004063f, 0.989258f, 0.005070f, 0.987305f, 0.006126f, 0.984375f, 0.005840f, 0.979004f,
+ 0.006832f, 0.971191f, 0.009766f, 0.958008f, 0.015457f, 0.922363f, 0.033997f, 0.695312f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000196f, 0.996582f, 0.000625f, 0.996582f, 0.001025f, 0.996582f,
+ 0.001363f, 0.996094f, 0.001736f, 0.996094f, 0.001995f, 0.996094f, 0.002314f, 0.995605f,
+ 0.002537f, 0.995117f, 0.002829f, 0.994629f, 0.002998f, 0.993652f, 0.003304f, 0.993164f,
+ 0.003460f, 0.992676f, 0.003752f, 0.991699f, 0.003918f, 0.990723f, 0.004654f, 0.989746f,
+ 0.005566f, 0.987793f, 0.006470f, 0.985840f, 0.007542f, 0.982910f, 0.007732f, 0.976562f,
+ 0.009079f, 0.968262f, 0.013046f, 0.953613f, 0.020752f, 0.915527f, 0.043671f, 0.686035f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000090f, 0.997070f, 0.000474f, 0.997070f, 0.000895f, 0.996582f,
+ 0.001283f, 0.996582f, 0.001553f, 0.996582f, 0.001886f, 0.996094f, 0.002098f, 0.996094f,
+ 0.002399f, 0.996094f, 0.002554f, 0.996094f, 0.002850f, 0.995117f, 0.003019f, 0.994629f,
+ 0.003233f, 0.994141f, 0.003452f, 0.993652f, 0.003563f, 0.993164f, 0.003841f, 0.992676f,
+ 0.003994f, 0.991699f, 0.004517f, 0.990234f, 0.005398f, 0.989746f, 0.006092f, 0.987793f,
+ 0.006924f, 0.986328f, 0.007996f, 0.983398f, 0.009567f, 0.979980f, 0.010490f, 0.974121f,
+ 0.012444f, 0.964355f, 0.017044f, 0.948730f, 0.027420f, 0.907715f, 0.054840f, 0.676270f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000119f, 0.997559f, 0.000519f, 0.997070f, 0.000944f, 0.997070f,
+ 0.001301f, 0.997070f, 0.001555f, 0.996582f, 0.001870f, 0.996582f, 0.002073f, 0.996582f,
+ 0.002321f, 0.996094f, 0.002539f, 0.996094f, 0.002649f, 0.996094f, 0.002943f, 0.995605f,
+ 0.003090f, 0.995117f, 0.003222f, 0.994629f, 0.003479f, 0.994141f, 0.003599f, 0.993652f,
+ 0.003733f, 0.993164f, 0.003975f, 0.992676f, 0.004086f, 0.992188f, 0.004692f, 0.991211f,
+ 0.005527f, 0.990234f, 0.006172f, 0.989258f, 0.006809f, 0.987793f, 0.007534f, 0.986328f,
+ 0.008774f, 0.983887f, 0.010117f, 0.981445f, 0.012115f, 0.977051f, 0.013428f, 0.970703f,
+ 0.016235f, 0.960449f, 0.022552f, 0.942383f, 0.035095f, 0.898438f, 0.067566f, 0.666016f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000310f, 0.997559f, 0.000725f, 0.997559f, 0.001081f, 0.997070f,
+ 0.001432f, 0.997070f, 0.001645f, 0.997070f, 0.001943f, 0.997070f, 0.002136f, 0.996582f,
+ 0.002308f, 0.996582f, 0.002567f, 0.996582f, 0.002684f, 0.996094f, 0.002874f, 0.996094f,
+ 0.003086f, 0.996094f, 0.003183f, 0.995605f, 0.003325f, 0.995117f, 0.003557f, 0.994629f,
+ 0.003660f, 0.994141f, 0.003712f, 0.993652f, 0.003983f, 0.993164f, 0.004116f, 0.993164f,
+ 0.004452f, 0.992676f, 0.005173f, 0.991211f, 0.005871f, 0.990723f, 0.006416f, 0.989746f,
+ 0.006897f, 0.988770f, 0.007572f, 0.987305f, 0.008537f, 0.985840f, 0.009705f, 0.983887f,
+ 0.011070f, 0.981445f, 0.012840f, 0.978027f, 0.015175f, 0.973633f, 0.017761f, 0.966797f,
+ 0.020950f, 0.955078f, 0.028900f, 0.935547f, 0.044983f, 0.888184f, 0.081360f, 0.654785f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000138f, 0.998047f, 0.000599f, 0.997559f, 0.001024f, 0.997559f, 0.001263f, 0.997559f,
+ 0.001619f, 0.997070f, 0.001754f, 0.997070f, 0.002087f, 0.997070f, 0.002228f, 0.997070f,
+ 0.002401f, 0.996582f, 0.002644f, 0.996582f, 0.002741f, 0.996582f, 0.002869f, 0.996582f,
+ 0.003120f, 0.996094f, 0.003220f, 0.996094f, 0.003269f, 0.995605f, 0.003521f, 0.995117f,
+ 0.003668f, 0.994629f, 0.003733f, 0.994629f, 0.003765f, 0.994141f, 0.004055f, 0.993652f,
+ 0.004169f, 0.993164f, 0.004597f, 0.993164f, 0.005142f, 0.992188f, 0.005901f, 0.991699f,
+ 0.006443f, 0.990723f, 0.006851f, 0.989746f, 0.007206f, 0.989258f, 0.007919f, 0.987793f,
+ 0.008850f, 0.986816f, 0.009880f, 0.984863f, 0.010818f, 0.983398f, 0.012459f, 0.980957f,
+ 0.013992f, 0.978027f, 0.016190f, 0.974609f, 0.019409f, 0.969727f, 0.023407f, 0.962402f,
+ 0.027603f, 0.948242f, 0.037109f, 0.926758f, 0.056854f, 0.875488f, 0.096924f, 0.643066f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000534f, 0.998047f, 0.000953f, 0.998047f, 0.001250f, 0.997559f, 0.001594f, 0.997559f,
+ 0.001774f, 0.997559f, 0.002012f, 0.997070f, 0.002235f, 0.997070f, 0.002312f, 0.997070f,
+ 0.002581f, 0.997070f, 0.002743f, 0.996582f, 0.002804f, 0.996582f, 0.002975f, 0.996582f,
+ 0.003197f, 0.996582f, 0.003273f, 0.996094f, 0.003309f, 0.996094f, 0.003540f, 0.995605f,
+ 0.003704f, 0.995117f, 0.003765f, 0.994629f, 0.003796f, 0.994629f, 0.003983f, 0.994141f,
+ 0.004169f, 0.993652f, 0.004555f, 0.993164f, 0.005089f, 0.993164f, 0.005577f, 0.992676f,
+ 0.006222f, 0.991699f, 0.006660f, 0.991211f, 0.007030f, 0.990234f, 0.007286f, 0.989746f,
+ 0.007843f, 0.989258f, 0.008766f, 0.987793f, 0.009682f, 0.986816f, 0.010422f, 0.985352f,
+ 0.011269f, 0.983887f, 0.012802f, 0.982422f, 0.014076f, 0.979980f, 0.015961f, 0.977051f,
+ 0.017990f, 0.974121f, 0.020966f, 0.969727f, 0.024612f, 0.964355f, 0.029800f, 0.955078f,
+ 0.035370f, 0.940430f, 0.047211f, 0.916016f, 0.071106f, 0.861328f, 0.113159f, 0.630859f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000287f, 0.998535f,
+ 0.000802f, 0.998047f, 0.001254f, 0.998047f, 0.001492f, 0.997559f, 0.001792f, 0.997559f,
+ 0.001864f, 0.997559f, 0.002239f, 0.997559f, 0.002335f, 0.997070f, 0.002436f, 0.997070f,
+ 0.002747f, 0.997070f, 0.002825f, 0.997070f, 0.002855f, 0.996582f, 0.003153f, 0.996582f,
+ 0.003283f, 0.996582f, 0.003326f, 0.996582f, 0.003345f, 0.996094f, 0.003639f, 0.995605f,
+ 0.003763f, 0.995117f, 0.003807f, 0.994629f, 0.003828f, 0.994629f, 0.003983f, 0.994141f,
+ 0.004292f, 0.994141f, 0.004826f, 0.993652f, 0.005314f, 0.993164f, 0.005756f, 0.993164f,
+ 0.006271f, 0.992188f, 0.006741f, 0.991699f, 0.007065f, 0.991211f, 0.007339f, 0.990723f,
+ 0.007534f, 0.989746f, 0.008324f, 0.989258f, 0.009163f, 0.988281f, 0.010002f, 0.987305f,
+ 0.010643f, 0.986816f, 0.011169f, 0.984863f, 0.012535f, 0.983887f, 0.013802f, 0.982422f,
+ 0.014900f, 0.980469f, 0.016663f, 0.978516f, 0.018265f, 0.975586f, 0.020844f, 0.972656f,
+ 0.023605f, 0.968262f, 0.027084f, 0.963867f, 0.031891f, 0.956543f, 0.038330f, 0.946777f,
+ 0.045868f, 0.930176f, 0.060303f, 0.903320f, 0.088989f, 0.844727f, 0.131714f, 0.618652f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000621f, 0.998535f,
+ 0.001072f, 0.998047f, 0.001372f, 0.998047f, 0.001758f, 0.998047f, 0.001880f, 0.997559f,
+ 0.002172f, 0.997559f, 0.002350f, 0.997559f, 0.002388f, 0.997559f, 0.002720f, 0.997070f,
+ 0.002842f, 0.997070f, 0.002872f, 0.997070f, 0.003027f, 0.996582f, 0.003290f, 0.996582f,
+ 0.003344f, 0.996582f, 0.003365f, 0.996582f, 0.003483f, 0.996094f, 0.003761f, 0.995605f,
+ 0.003822f, 0.995605f, 0.003843f, 0.994629f, 0.003855f, 0.994629f, 0.004311f, 0.994141f,
+ 0.004990f, 0.994141f, 0.005428f, 0.993652f, 0.005856f, 0.993164f, 0.006100f, 0.993164f,
+ 0.006607f, 0.992676f, 0.006943f, 0.991699f, 0.007343f, 0.991699f, 0.007496f, 0.991211f,
+ 0.007790f, 0.990234f, 0.008484f, 0.989746f, 0.009346f, 0.989258f, 0.010162f, 0.988281f,
+ 0.010765f, 0.987305f, 0.011093f, 0.986816f, 0.012093f, 0.985352f, 0.013084f, 0.984375f,
+ 0.014252f, 0.982910f, 0.015282f, 0.981445f, 0.016876f, 0.979980f, 0.017990f, 0.978027f,
+ 0.019806f, 0.975586f, 0.022079f, 0.973145f, 0.024582f, 0.970215f, 0.027435f, 0.966309f,
+ 0.030914f, 0.961426f, 0.035553f, 0.955566f, 0.041687f, 0.947266f, 0.050049f, 0.936035f,
+ 0.059875f, 0.917480f, 0.077820f, 0.887207f, 0.110535f, 0.825195f, 0.149780f, 0.604492f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000407f, 0.998535f,
+ 0.000981f, 0.998535f, 0.001412f, 0.998535f, 0.001839f, 0.998047f, 0.001915f, 0.998047f,
+ 0.002306f, 0.998047f, 0.002396f, 0.997559f, 0.002413f, 0.997559f, 0.002840f, 0.997559f,
+ 0.002886f, 0.997070f, 0.002899f, 0.997070f, 0.003267f, 0.997070f, 0.003359f, 0.996582f,
+ 0.003378f, 0.996582f, 0.003387f, 0.996094f, 0.003742f, 0.996094f, 0.003838f, 0.995605f,
+ 0.003860f, 0.995117f, 0.004036f, 0.994629f, 0.004555f, 0.994141f, 0.005417f, 0.994141f,
+ 0.005867f, 0.994141f, 0.006088f, 0.993652f, 0.006443f, 0.993652f, 0.006603f, 0.992676f,
+ 0.007149f, 0.992188f, 0.007484f, 0.991699f, 0.007591f, 0.991211f, 0.008156f, 0.990723f,
+ 0.008858f, 0.990234f, 0.009338f, 0.989746f, 0.010201f, 0.988770f, 0.010872f, 0.988281f,
+ 0.011177f, 0.987305f, 0.011848f, 0.986816f, 0.012886f, 0.985840f, 0.013748f, 0.984863f,
+ 0.014511f, 0.983887f, 0.015541f, 0.982422f, 0.017105f, 0.981445f, 0.018051f, 0.979980f,
+ 0.019440f, 0.978516f, 0.020950f, 0.976562f, 0.022736f, 0.974609f, 0.025009f, 0.972168f,
+ 0.027405f, 0.969238f, 0.029999f, 0.965820f, 0.033325f, 0.962402f, 0.036957f, 0.957520f,
+ 0.041565f, 0.951660f, 0.048035f, 0.944336f, 0.055511f, 0.935059f, 0.065552f, 0.921387f,
+ 0.078369f, 0.900879f, 0.099731f, 0.867676f, 0.136108f, 0.802734f, 0.169189f, 0.590820f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000622f, 0.999023f, 0.001336f, 0.998535f, 0.001448f, 0.998535f, 0.001925f, 0.998535f,
+ 0.002174f, 0.998047f, 0.002413f, 0.998047f, 0.002424f, 0.997559f, 0.002876f, 0.997559f,
+ 0.002905f, 0.997559f, 0.002913f, 0.997070f, 0.003349f, 0.997070f, 0.003387f, 0.997070f,
+ 0.003397f, 0.996582f, 0.003448f, 0.996094f, 0.003845f, 0.995605f, 0.004284f, 0.995117f,
+ 0.004864f, 0.995117f, 0.005184f, 0.994629f, 0.005962f, 0.994141f, 0.006187f, 0.993652f,
+ 0.006592f, 0.993652f, 0.006691f, 0.993164f, 0.007015f, 0.992676f, 0.007278f, 0.992188f,
+ 0.007660f, 0.991699f, 0.008560f, 0.991211f, 0.009201f, 0.990723f, 0.009651f, 0.990234f,
+ 0.010071f, 0.989746f, 0.010651f, 0.988770f, 0.011253f, 0.988281f, 0.012024f, 0.987793f,
+ 0.012939f, 0.986816f, 0.013718f, 0.986328f, 0.014351f, 0.985352f, 0.014923f, 0.984375f,
+ 0.015808f, 0.983398f, 0.017593f, 0.981934f, 0.018402f, 0.980957f, 0.019608f, 0.979492f,
+ 0.020889f, 0.978516f, 0.022232f, 0.977051f, 0.023972f, 0.975098f, 0.025543f, 0.973145f,
+ 0.027863f, 0.971680f, 0.029922f, 0.968750f, 0.032166f, 0.966309f, 0.035461f, 0.963379f,
+ 0.038208f, 0.959961f, 0.041809f, 0.955566f, 0.046082f, 0.950684f, 0.051605f, 0.944824f,
+ 0.057800f, 0.937988f, 0.065308f, 0.929199f, 0.074890f, 0.917969f, 0.087708f, 0.902344f,
+ 0.103943f, 0.879395f, 0.127808f, 0.843262f, 0.167114f, 0.776855f, 0.189941f, 0.576660f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000952f, 0.999023f, 0.001452f, 0.999023f,
+ 0.001934f, 0.998535f, 0.001946f, 0.998047f, 0.002428f, 0.998047f, 0.002434f, 0.997559f,
+ 0.002913f, 0.997559f, 0.002918f, 0.997559f, 0.003349f, 0.997070f, 0.003401f, 0.996582f,
+ 0.003405f, 0.996094f, 0.004257f, 0.995605f, 0.005157f, 0.995117f, 0.005558f, 0.994629f,
+ 0.005756f, 0.994629f, 0.006145f, 0.994141f, 0.006710f, 0.993652f, 0.007019f, 0.993164f,
+ 0.007206f, 0.992676f, 0.007500f, 0.992188f, 0.008469f, 0.991699f, 0.009399f, 0.991211f,
+ 0.009903f, 0.990723f, 0.010246f, 0.990234f, 0.010857f, 0.989258f, 0.011108f, 0.988770f,
+ 0.012054f, 0.988281f, 0.013046f, 0.987305f, 0.014084f, 0.986816f, 0.014648f, 0.985840f,
+ 0.015289f, 0.985352f, 0.016068f, 0.984375f, 0.017319f, 0.983398f, 0.018158f, 0.982422f,
+ 0.019470f, 0.981445f, 0.020798f, 0.979980f, 0.021881f, 0.979004f, 0.022995f, 0.977539f,
+ 0.024689f, 0.976074f, 0.025925f, 0.975098f, 0.027664f, 0.973145f, 0.029327f, 0.972168f,
+ 0.031372f, 0.969727f, 0.033081f, 0.967285f, 0.036224f, 0.965332f, 0.038635f, 0.962891f,
+ 0.041077f, 0.960449f, 0.043884f, 0.957031f, 0.047394f, 0.953613f, 0.051422f, 0.949707f,
+ 0.056061f, 0.945312f, 0.061127f, 0.939941f, 0.066956f, 0.934082f, 0.073730f, 0.926758f,
+ 0.081543f, 0.918457f, 0.091553f, 0.907715f, 0.103455f, 0.894531f, 0.119080f, 0.876953f,
+ 0.137817f, 0.851562f, 0.164062f, 0.812988f, 0.202881f, 0.747070f, 0.211182f, 0.562012f,
+ 0.000000f, 1.000000f, 0.000975f, 0.999512f, 0.001929f, 0.998535f, 0.001950f, 0.998535f,
+ 0.002436f, 0.998047f, 0.002913f, 0.997559f, 0.002924f, 0.997559f, 0.003853f, 0.996582f,
+ 0.004753f, 0.996094f, 0.005226f, 0.995605f, 0.005798f, 0.995117f, 0.006279f, 0.994629f,
+ 0.006348f, 0.994141f, 0.006870f, 0.993652f, 0.008102f, 0.992676f, 0.009018f, 0.992188f,
+ 0.009567f, 0.991699f, 0.009888f, 0.990723f, 0.010857f, 0.989746f, 0.011917f, 0.989258f,
+ 0.012749f, 0.988770f, 0.013237f, 0.987793f, 0.014107f, 0.987305f, 0.014961f, 0.986328f,
+ 0.016220f, 0.985352f, 0.017273f, 0.984375f, 0.017990f, 0.983398f, 0.019302f, 0.982422f,
+ 0.020477f, 0.981445f, 0.021515f, 0.980469f, 0.022446f, 0.979492f, 0.024216f, 0.978516f,
+ 0.025452f, 0.977051f, 0.027023f, 0.975586f, 0.028717f, 0.974121f, 0.030289f, 0.973145f,
+ 0.031952f, 0.971680f, 0.033173f, 0.970215f, 0.034973f, 0.968262f, 0.037720f, 0.966309f,
+ 0.040070f, 0.964355f, 0.042511f, 0.962402f, 0.044647f, 0.959961f, 0.047485f, 0.958008f,
+ 0.050201f, 0.955078f, 0.053345f, 0.952148f, 0.056763f, 0.949219f, 0.060608f, 0.945801f,
+ 0.064514f, 0.941895f, 0.069336f, 0.937988f, 0.073914f, 0.933105f, 0.079529f, 0.928223f,
+ 0.085510f, 0.922363f, 0.092224f, 0.916016f, 0.100220f, 0.908203f, 0.109009f, 0.899414f,
+ 0.119141f, 0.889160f, 0.131104f, 0.876953f, 0.145752f, 0.861328f, 0.163086f, 0.841797f,
+ 0.184082f, 0.815430f, 0.209839f, 0.776367f, 0.244873f, 0.713867f, 0.232666f, 0.546875f,
+ 0.000000f, 1.000000f, 0.001464f, 0.999023f, 0.001952f, 0.998535f, 0.003386f, 0.997559f,
+ 0.004776f, 0.996582f, 0.005711f, 0.996094f, 0.005840f, 0.995117f, 0.007530f, 0.994141f,
+ 0.008636f, 0.993164f, 0.009453f, 0.992188f, 0.010834f, 0.991211f, 0.012413f, 0.989746f,
+ 0.013000f, 0.989258f, 0.014084f, 0.988281f, 0.016068f, 0.986816f, 0.017075f, 0.985840f,
+ 0.018051f, 0.984375f, 0.019699f, 0.983398f, 0.020798f, 0.982422f, 0.022858f, 0.980957f,
+ 0.024506f, 0.979492f, 0.025665f, 0.978516f, 0.027069f, 0.977539f, 0.028107f, 0.975586f,
+ 0.031128f, 0.974121f, 0.032806f, 0.973145f, 0.034576f, 0.971191f, 0.036438f, 0.969727f,
+ 0.038727f, 0.967773f, 0.040405f, 0.966309f, 0.043030f, 0.964355f, 0.044983f, 0.962402f,
+ 0.047729f, 0.960449f, 0.049713f, 0.958496f, 0.052612f, 0.956543f, 0.055695f, 0.954102f,
+ 0.058594f, 0.951660f, 0.061584f, 0.949219f, 0.064697f, 0.946777f, 0.068054f, 0.943848f,
+ 0.071899f, 0.940918f, 0.075439f, 0.937988f, 0.079346f, 0.934570f, 0.083557f, 0.931152f,
+ 0.088013f, 0.927734f, 0.093018f, 0.923340f, 0.097961f, 0.919434f, 0.103333f, 0.914551f,
+ 0.109436f, 0.909180f, 0.115845f, 0.903809f, 0.122314f, 0.897949f, 0.129639f, 0.891602f,
+ 0.137695f, 0.884277f, 0.146240f, 0.875977f, 0.155884f, 0.867188f, 0.166504f, 0.856934f,
+ 0.178589f, 0.844727f, 0.192139f, 0.831055f, 0.207153f, 0.814453f, 0.224731f, 0.794434f,
+ 0.244629f, 0.769043f, 0.266357f, 0.731934f, 0.291260f, 0.676758f, 0.255127f, 0.532227f,
+ 0.000000f, 1.000000f, 0.002438f, 0.998535f, 0.005825f, 0.996582f, 0.008965f, 0.994141f,
+ 0.011604f, 0.992188f, 0.013985f, 0.990234f, 0.016846f, 0.987793f, 0.019501f, 0.985352f,
+ 0.022583f, 0.983398f, 0.025314f, 0.980469f, 0.028046f, 0.978516f, 0.031204f, 0.976074f,
+ 0.033875f, 0.973633f, 0.037201f, 0.971680f, 0.039764f, 0.969238f, 0.043671f, 0.966309f,
+ 0.046661f, 0.964355f, 0.049591f, 0.961426f, 0.052917f, 0.958984f, 0.055847f, 0.956543f,
+ 0.059906f, 0.954102f, 0.063477f, 0.951172f, 0.067139f, 0.948730f, 0.070862f, 0.945801f,
+ 0.074463f, 0.943359f, 0.077759f, 0.940430f, 0.081787f, 0.937500f, 0.085693f, 0.935059f,
+ 0.089905f, 0.931641f, 0.094482f, 0.928711f, 0.098694f, 0.925781f, 0.103210f, 0.922363f,
+ 0.107605f, 0.918945f, 0.111816f, 0.916016f, 0.116577f, 0.912598f, 0.121155f, 0.909180f,
+ 0.125977f, 0.905273f, 0.130981f, 0.901367f, 0.136108f, 0.897949f, 0.141724f, 0.893555f,
+ 0.147461f, 0.889160f, 0.153198f, 0.884766f, 0.159302f, 0.880371f, 0.165039f, 0.875488f,
+ 0.171143f, 0.870605f, 0.177612f, 0.865234f, 0.184326f, 0.859863f, 0.191284f, 0.854004f,
+ 0.198242f, 0.848145f, 0.205688f, 0.841309f, 0.213379f, 0.834473f, 0.221558f, 0.827148f,
+ 0.230713f, 0.819336f, 0.239624f, 0.810547f, 0.249268f, 0.800781f, 0.259277f, 0.790527f,
+ 0.270020f, 0.778809f, 0.281250f, 0.765625f, 0.293213f, 0.750488f, 0.306396f, 0.732910f,
+ 0.320312f, 0.711426f, 0.332031f, 0.680664f, 0.342773f, 0.635742f, 0.278564f, 0.515137f,
+ 0.000000f, 1.000000f, 0.020798f, 0.990723f, 0.040283f, 0.977539f, 0.057739f, 0.964355f,
+ 0.075012f, 0.952148f, 0.089172f, 0.941406f, 0.103394f, 0.930664f, 0.115723f, 0.921387f,
+ 0.128052f, 0.912598f, 0.139526f, 0.903809f, 0.149780f, 0.896484f, 0.159302f, 0.889160f,
+ 0.168701f, 0.883301f, 0.177612f, 0.876465f, 0.187134f, 0.870605f, 0.195435f, 0.865234f,
+ 0.202759f, 0.859863f, 0.210083f, 0.854492f, 0.217041f, 0.850098f, 0.223633f, 0.845215f,
+ 0.229980f, 0.841309f, 0.236084f, 0.836914f, 0.243530f, 0.832520f, 0.250000f, 0.828125f,
+ 0.255859f, 0.824219f, 0.261475f, 0.820312f, 0.267090f, 0.816895f, 0.272461f, 0.812988f,
+ 0.277344f, 0.809570f, 0.282471f, 0.805664f, 0.287109f, 0.802246f, 0.291992f, 0.798828f,
+ 0.297119f, 0.795410f, 0.301514f, 0.791992f, 0.306152f, 0.788574f, 0.310547f, 0.785156f,
+ 0.314697f, 0.781738f, 0.318604f, 0.778320f, 0.323975f, 0.774414f, 0.328369f, 0.770996f,
+ 0.333008f, 0.767090f, 0.337158f, 0.763672f, 0.341309f, 0.759766f, 0.345215f, 0.755859f,
+ 0.349365f, 0.751465f, 0.353516f, 0.747559f, 0.357178f, 0.743652f, 0.361572f, 0.738770f,
+ 0.365723f, 0.734375f, 0.369629f, 0.729492f, 0.373047f, 0.724609f, 0.376953f, 0.719238f,
+ 0.380859f, 0.713867f, 0.384521f, 0.708008f, 0.387939f, 0.701660f, 0.391357f, 0.694824f,
+ 0.395020f, 0.687012f, 0.398438f, 0.678711f, 0.401367f, 0.668945f, 0.404541f, 0.657715f,
+ 0.407227f, 0.643555f, 0.406250f, 0.621582f, 0.398682f, 0.591309f, 0.302979f, 0.497314f,
+ 0.000000f, 1.000000f, 0.431641f, 0.809570f, 0.458984f, 0.751953f, 0.473389f, 0.719727f,
+ 0.483398f, 0.698730f, 0.491455f, 0.684082f, 0.496826f, 0.673340f, 0.500977f, 0.665527f,
+ 0.505859f, 0.659180f, 0.509277f, 0.654297f, 0.513184f, 0.649902f, 0.516602f, 0.646484f,
+ 0.520020f, 0.643555f, 0.523926f, 0.640625f, 0.525879f, 0.638184f, 0.527344f, 0.636230f,
+ 0.530762f, 0.634277f, 0.532715f, 0.632812f, 0.535156f, 0.630859f, 0.536621f, 0.629395f,
+ 0.539062f, 0.627930f, 0.541016f, 0.626465f, 0.542480f, 0.625000f, 0.544434f, 0.623535f,
+ 0.546875f, 0.622070f, 0.548340f, 0.620605f, 0.550293f, 0.619141f, 0.552734f, 0.617676f,
+ 0.554688f, 0.615723f, 0.556641f, 0.614258f, 0.558594f, 0.612305f, 0.561035f, 0.610840f,
+ 0.562012f, 0.608887f, 0.563965f, 0.606934f, 0.564941f, 0.604980f, 0.566406f, 0.603027f,
+ 0.568848f, 0.601074f, 0.570801f, 0.598633f, 0.572266f, 0.596191f, 0.574219f, 0.593750f,
+ 0.576172f, 0.591309f, 0.578125f, 0.588379f, 0.580566f, 0.585449f, 0.582031f, 0.582520f,
+ 0.583496f, 0.579102f, 0.585449f, 0.575684f, 0.587402f, 0.572266f, 0.589844f, 0.568359f,
+ 0.590820f, 0.564453f, 0.593750f, 0.560059f, 0.595215f, 0.555176f, 0.597656f, 0.550293f,
+ 0.599609f, 0.544434f, 0.601074f, 0.538574f, 0.603516f, 0.532227f, 0.605957f, 0.524414f,
+ 0.608398f, 0.516113f, 0.610352f, 0.506836f, 0.612793f, 0.496094f, 0.614746f, 0.483154f,
+ 0.616699f, 0.467041f, 0.614258f, 0.444336f, 0.607910f, 0.410889f, 0.540039f, 0.323730f,
+ 0.000000f, 1.000000f, 0.456787f, 0.798828f, 0.495850f, 0.732422f, 0.516602f, 0.693848f,
+ 0.535645f, 0.665527f, 0.548340f, 0.645508f, 0.560059f, 0.629883f, 0.569824f, 0.617188f,
+ 0.579102f, 0.605957f, 0.585938f, 0.597168f, 0.594727f, 0.588867f, 0.601562f, 0.582031f,
+ 0.608887f, 0.575195f, 0.615723f, 0.568848f, 0.621094f, 0.563477f, 0.626953f, 0.558594f,
+ 0.632324f, 0.553711f, 0.638672f, 0.548828f, 0.643555f, 0.543945f, 0.649414f, 0.539551f,
+ 0.654785f, 0.535156f, 0.659180f, 0.530762f, 0.664551f, 0.526855f, 0.668945f, 0.522461f,
+ 0.672852f, 0.518555f, 0.678711f, 0.514160f, 0.682617f, 0.509766f, 0.687500f, 0.505371f,
+ 0.690918f, 0.501465f, 0.695801f, 0.497314f, 0.699707f, 0.492920f, 0.704102f, 0.488770f,
+ 0.708496f, 0.484131f, 0.712891f, 0.479736f, 0.716309f, 0.475098f, 0.721191f, 0.470215f,
+ 0.725098f, 0.465332f, 0.729004f, 0.460205f, 0.732910f, 0.455322f, 0.736328f, 0.450195f,
+ 0.740723f, 0.444580f, 0.745117f, 0.439209f, 0.748535f, 0.433350f, 0.752930f, 0.427490f,
+ 0.756836f, 0.421387f, 0.760254f, 0.415039f, 0.764160f, 0.408203f, 0.767090f, 0.401611f,
+ 0.772461f, 0.394043f, 0.775879f, 0.386475f, 0.779785f, 0.378418f, 0.784668f, 0.369629f,
+ 0.789551f, 0.360596f, 0.792969f, 0.350830f, 0.797852f, 0.340332f, 0.802246f, 0.329102f,
+ 0.806641f, 0.316895f, 0.810547f, 0.303467f, 0.815918f, 0.288330f, 0.820312f, 0.270996f,
+ 0.826172f, 0.250732f, 0.828125f, 0.224243f, 0.831055f, 0.187866f, 0.804688f, 0.119873f,
+ 0.000000f, 1.000000f, 0.481445f, 0.788574f, 0.530273f, 0.713867f, 0.561035f, 0.667480f,
+ 0.584473f, 0.633301f, 0.604492f, 0.607422f, 0.620117f, 0.586914f, 0.633301f, 0.569824f,
+ 0.646484f, 0.554688f, 0.657715f, 0.541992f, 0.667969f, 0.530273f, 0.679199f, 0.519531f,
+ 0.687500f, 0.509766f, 0.695801f, 0.500977f, 0.704590f, 0.492676f, 0.711914f, 0.484863f,
+ 0.720215f, 0.477295f, 0.727539f, 0.469971f, 0.734863f, 0.462891f, 0.741211f, 0.456299f,
+ 0.747559f, 0.449707f, 0.752930f, 0.443604f, 0.758301f, 0.437500f, 0.765625f, 0.430908f,
+ 0.770508f, 0.425049f, 0.775391f, 0.419189f, 0.781250f, 0.413086f, 0.785645f, 0.407227f,
+ 0.791016f, 0.401367f, 0.796387f, 0.395508f, 0.800293f, 0.389648f, 0.805664f, 0.383789f,
+ 0.810547f, 0.377686f, 0.813477f, 0.371826f, 0.817871f, 0.365967f, 0.822754f, 0.359863f,
+ 0.825684f, 0.354004f, 0.830078f, 0.347656f, 0.834961f, 0.341553f, 0.838379f, 0.335205f,
+ 0.842285f, 0.328613f, 0.845215f, 0.322266f, 0.849121f, 0.315674f, 0.853516f, 0.308594f,
+ 0.857910f, 0.301758f, 0.860840f, 0.294434f, 0.864258f, 0.287109f, 0.867676f, 0.279541f,
+ 0.871094f, 0.271729f, 0.874512f, 0.263428f, 0.877441f, 0.255127f, 0.880859f, 0.246460f,
+ 0.884277f, 0.237305f, 0.887207f, 0.227783f, 0.890625f, 0.217529f, 0.895508f, 0.206665f,
+ 0.897461f, 0.195190f, 0.901855f, 0.182739f, 0.904785f, 0.169189f, 0.908203f, 0.154419f,
+ 0.912109f, 0.137817f, 0.914551f, 0.118591f, 0.914551f, 0.090881f, 0.900879f, 0.050354f,
+ 0.000000f, 1.000000f, 0.506348f, 0.778320f, 0.566406f, 0.695312f, 0.603027f, 0.642090f,
+ 0.632812f, 0.602539f, 0.655273f, 0.571777f, 0.674805f, 0.546387f, 0.691406f, 0.525879f,
+ 0.705566f, 0.507324f, 0.721191f, 0.490967f, 0.730957f, 0.476807f, 0.743652f, 0.463623f,
+ 0.753906f, 0.451416f, 0.762695f, 0.440430f, 0.771484f, 0.429932f, 0.780273f, 0.420166f,
+ 0.789062f, 0.410645f, 0.795410f, 0.401855f, 0.802734f, 0.393555f, 0.809082f, 0.385498f,
+ 0.815430f, 0.377930f, 0.821777f, 0.370117f, 0.827637f, 0.362793f, 0.833008f, 0.355469f,
+ 0.837891f, 0.348633f, 0.842285f, 0.342041f, 0.847656f, 0.335205f, 0.852539f, 0.328613f,
+ 0.856934f, 0.322021f, 0.860352f, 0.315674f, 0.864258f, 0.309326f, 0.869141f, 0.302979f,
+ 0.872559f, 0.296631f, 0.876465f, 0.290283f, 0.880371f, 0.283936f, 0.882812f, 0.278076f,
+ 0.887207f, 0.271484f, 0.890137f, 0.265381f, 0.892578f, 0.259033f, 0.895020f, 0.252930f,
+ 0.899902f, 0.246338f, 0.901855f, 0.239990f, 0.904785f, 0.233643f, 0.908203f, 0.227051f,
+ 0.911133f, 0.220215f, 0.913086f, 0.213379f, 0.916016f, 0.206543f, 0.918457f, 0.199463f,
+ 0.919922f, 0.192383f, 0.923828f, 0.184937f, 0.924805f, 0.177612f, 0.928711f, 0.169678f,
+ 0.929688f, 0.161865f, 0.932617f, 0.153442f, 0.935059f, 0.144775f, 0.938477f, 0.135498f,
+ 0.939453f, 0.126221f, 0.941406f, 0.116333f, 0.943359f, 0.105835f, 0.944824f, 0.094849f,
+ 0.949219f, 0.081726f, 0.950195f, 0.067993f, 0.948730f, 0.049408f, 0.941406f, 0.025864f,
+ 0.000000f, 1.000000f, 0.531738f, 0.768066f, 0.601562f, 0.676758f, 0.642578f, 0.618652f,
+ 0.676758f, 0.573242f, 0.700684f, 0.539062f, 0.724121f, 0.509766f, 0.740723f, 0.486084f,
+ 0.755859f, 0.465088f, 0.770996f, 0.446289f, 0.783691f, 0.429932f, 0.794434f, 0.415039f,
+ 0.805664f, 0.401123f, 0.814941f, 0.388672f, 0.822754f, 0.376953f, 0.831055f, 0.365967f,
+ 0.838867f, 0.355713f, 0.844727f, 0.346191f, 0.852051f, 0.336914f, 0.857422f, 0.328369f,
+ 0.864258f, 0.319580f, 0.868164f, 0.311523f, 0.873047f, 0.303955f, 0.879395f, 0.296387f,
+ 0.881836f, 0.289307f, 0.885254f, 0.282471f, 0.891113f, 0.275391f, 0.895508f, 0.268311f,
+ 0.897949f, 0.261963f, 0.902344f, 0.255371f, 0.905273f, 0.249146f, 0.908691f, 0.242798f,
+ 0.911621f, 0.236816f, 0.914062f, 0.230713f, 0.916992f, 0.224854f, 0.919434f, 0.218872f,
+ 0.923828f, 0.212524f, 0.925781f, 0.206543f, 0.927734f, 0.200684f, 0.929688f, 0.194702f,
+ 0.932129f, 0.188965f, 0.934570f, 0.182983f, 0.935547f, 0.177246f, 0.937500f, 0.171509f,
+ 0.939941f, 0.165283f, 0.941406f, 0.159424f, 0.944336f, 0.153076f, 0.946289f, 0.146729f,
+ 0.947754f, 0.140503f, 0.948730f, 0.134399f, 0.950684f, 0.128174f, 0.952637f, 0.121277f,
+ 0.954102f, 0.114563f, 0.955566f, 0.107849f, 0.957031f, 0.100891f, 0.958984f, 0.093567f,
+ 0.960938f, 0.085754f, 0.961914f, 0.078064f, 0.963867f, 0.069824f, 0.965332f, 0.061340f,
+ 0.966309f, 0.052460f, 0.967773f, 0.042450f, 0.966797f, 0.029526f, 0.960938f, 0.013649f,
+ 0.000000f, 1.000000f, 0.557617f, 0.757324f, 0.634277f, 0.659668f, 0.678711f, 0.596191f,
+ 0.717285f, 0.546875f, 0.742676f, 0.508789f, 0.765625f, 0.477295f, 0.783203f, 0.451416f,
+ 0.799805f, 0.428223f, 0.812988f, 0.407959f, 0.824707f, 0.390381f, 0.835938f, 0.374023f,
+ 0.845215f, 0.359375f, 0.854004f, 0.345947f, 0.861328f, 0.333740f, 0.868652f, 0.322266f,
+ 0.875000f, 0.311279f, 0.881348f, 0.301270f, 0.886719f, 0.291748f, 0.892090f, 0.282959f,
+ 0.896484f, 0.274170f, 0.900879f, 0.266113f, 0.905762f, 0.258057f, 0.909180f, 0.250732f,
+ 0.913086f, 0.243408f, 0.916992f, 0.236328f, 0.919434f, 0.229614f, 0.922852f, 0.223022f,
+ 0.924805f, 0.216919f, 0.928223f, 0.210449f, 0.930176f, 0.204346f, 0.934082f, 0.198242f,
+ 0.935059f, 0.192505f, 0.937500f, 0.186768f, 0.939941f, 0.180908f, 0.941895f, 0.175537f,
+ 0.943848f, 0.170044f, 0.946777f, 0.164307f, 0.947754f, 0.158936f, 0.949219f, 0.153687f,
+ 0.950684f, 0.148560f, 0.953125f, 0.143066f, 0.955078f, 0.137695f, 0.957031f, 0.132324f,
+ 0.958008f, 0.127075f, 0.958984f, 0.121887f, 0.960449f, 0.116638f, 0.961914f, 0.111389f,
+ 0.962891f, 0.106018f, 0.963867f, 0.100647f, 0.965820f, 0.095093f, 0.967285f, 0.089600f,
+ 0.968262f, 0.084045f, 0.968750f, 0.078491f, 0.970215f, 0.072632f, 0.971680f, 0.066772f,
+ 0.972656f, 0.060760f, 0.973633f, 0.054718f, 0.974121f, 0.048645f, 0.975586f, 0.041931f,
+ 0.976562f, 0.035217f, 0.977539f, 0.028076f, 0.976562f, 0.020004f, 0.973145f, 0.009071f,
+ 0.000000f, 1.000000f, 0.581543f, 0.747559f, 0.664062f, 0.644043f, 0.713379f, 0.575684f,
+ 0.750488f, 0.523926f, 0.777832f, 0.482910f, 0.800293f, 0.449463f, 0.817383f, 0.421387f,
+ 0.832520f, 0.397217f, 0.845703f, 0.375977f, 0.857910f, 0.357178f, 0.866211f, 0.340332f,
+ 0.875000f, 0.325195f, 0.882324f, 0.311768f, 0.890137f, 0.298584f, 0.895996f, 0.286865f,
+ 0.901367f, 0.275879f, 0.906250f, 0.265869f, 0.911621f, 0.256104f, 0.916504f, 0.246948f,
+ 0.919922f, 0.238403f, 0.923828f, 0.230347f, 0.927246f, 0.222656f, 0.930176f, 0.215454f,
+ 0.934082f, 0.208008f, 0.936035f, 0.201294f, 0.939941f, 0.194580f, 0.940918f, 0.188354f,
+ 0.942383f, 0.182495f, 0.946289f, 0.176270f, 0.948242f, 0.170288f, 0.949219f, 0.164795f,
+ 0.951660f, 0.159302f, 0.953125f, 0.154053f, 0.955078f, 0.148682f, 0.957031f, 0.143433f,
+ 0.958008f, 0.138428f, 0.959473f, 0.133423f, 0.960938f, 0.128540f, 0.962402f, 0.123657f,
+ 0.963867f, 0.118896f, 0.965332f, 0.114075f, 0.966309f, 0.109375f, 0.967773f, 0.104614f,
+ 0.968262f, 0.100159f, 0.969727f, 0.095581f, 0.970703f, 0.090881f, 0.971680f, 0.086426f,
+ 0.973145f, 0.081848f, 0.974609f, 0.077026f, 0.975098f, 0.072388f, 0.975098f, 0.067932f,
+ 0.976074f, 0.063416f, 0.976562f, 0.058899f, 0.978516f, 0.054138f, 0.979492f, 0.049103f,
+ 0.980469f, 0.044312f, 0.979980f, 0.039673f, 0.980957f, 0.035004f, 0.982422f, 0.029785f,
+ 0.982422f, 0.024826f, 0.983398f, 0.019531f, 0.983887f, 0.014717f, 0.979980f, 0.005009f,
+ 0.000000f, 1.000000f, 0.604980f, 0.738770f, 0.693848f, 0.628906f, 0.744141f, 0.557617f,
+ 0.781738f, 0.502930f, 0.807129f, 0.460449f, 0.829590f, 0.425293f, 0.847168f, 0.396240f,
+ 0.861328f, 0.371338f, 0.872070f, 0.349365f, 0.881348f, 0.330322f, 0.891602f, 0.312744f,
+ 0.898926f, 0.297363f, 0.905273f, 0.283203f, 0.911133f, 0.270264f, 0.916504f, 0.258545f,
+ 0.921387f, 0.247559f, 0.926758f, 0.237183f, 0.929688f, 0.227783f, 0.933594f, 0.218750f,
+ 0.936523f, 0.210327f, 0.939941f, 0.202271f, 0.941895f, 0.194824f, 0.946289f, 0.187500f,
+ 0.947754f, 0.180420f, 0.950195f, 0.173828f, 0.952148f, 0.167603f, 0.953613f, 0.161621f,
+ 0.956055f, 0.155640f, 0.958008f, 0.149902f, 0.959473f, 0.144531f, 0.960938f, 0.139160f,
+ 0.962402f, 0.133911f, 0.963867f, 0.129028f, 0.965332f, 0.124146f, 0.966797f, 0.119568f,
+ 0.968262f, 0.114624f, 0.968750f, 0.110107f, 0.971191f, 0.105408f, 0.971191f, 0.101135f,
+ 0.971680f, 0.097046f, 0.973145f, 0.092896f, 0.974609f, 0.088501f, 0.976074f, 0.084290f,
+ 0.976074f, 0.080200f, 0.977051f, 0.076172f, 0.977539f, 0.072266f, 0.978516f, 0.068359f,
+ 0.979980f, 0.064209f, 0.979980f, 0.060425f, 0.980469f, 0.056519f, 0.980957f, 0.052734f,
+ 0.981445f, 0.048920f, 0.982910f, 0.044952f, 0.983887f, 0.040863f, 0.983887f, 0.037170f,
+ 0.984375f, 0.033447f, 0.985840f, 0.029572f, 0.985352f, 0.025757f, 0.985840f, 0.022049f,
+ 0.987793f, 0.017807f, 0.987305f, 0.014160f, 0.987793f, 0.010384f, 0.983887f, 0.003956f,
+ 0.000000f, 1.000000f, 0.628418f, 0.729492f, 0.720215f, 0.615723f, 0.771484f, 0.541016f,
+ 0.809570f, 0.484131f, 0.833496f, 0.440918f, 0.854492f, 0.404785f, 0.870117f, 0.375000f,
+ 0.882324f, 0.349609f, 0.893066f, 0.327393f, 0.902832f, 0.307617f, 0.910645f, 0.290283f,
+ 0.915527f, 0.274902f, 0.922852f, 0.260254f, 0.927246f, 0.247437f, 0.932617f, 0.235718f,
+ 0.936523f, 0.224854f, 0.941406f, 0.214111f, 0.942383f, 0.205078f, 0.946777f, 0.196167f,
+ 0.948730f, 0.187866f, 0.952148f, 0.179810f, 0.954102f, 0.172485f, 0.956543f, 0.165405f,
+ 0.958008f, 0.158813f, 0.960449f, 0.152466f, 0.962891f, 0.146118f, 0.963379f, 0.140381f,
+ 0.965820f, 0.134644f, 0.966797f, 0.129395f, 0.967285f, 0.124451f, 0.969238f, 0.119385f,
+ 0.971191f, 0.114319f, 0.971680f, 0.109619f, 0.972168f, 0.105225f, 0.973633f, 0.100891f,
+ 0.975098f, 0.096375f, 0.976074f, 0.092163f, 0.976074f, 0.088318f, 0.977051f, 0.084351f,
+ 0.978516f, 0.080322f, 0.979492f, 0.076294f, 0.979492f, 0.072632f, 0.980469f, 0.069031f,
+ 0.980957f, 0.065369f, 0.981445f, 0.061920f, 0.981445f, 0.058655f, 0.983398f, 0.055054f,
+ 0.984375f, 0.051270f, 0.984375f, 0.047974f, 0.984863f, 0.044708f, 0.984863f, 0.041626f,
+ 0.985840f, 0.038361f, 0.985840f, 0.035339f, 0.986816f, 0.032013f, 0.987793f, 0.028793f,
+ 0.988770f, 0.025299f, 0.988281f, 0.022339f, 0.988770f, 0.019379f, 0.989258f, 0.016373f,
+ 0.989746f, 0.013504f, 0.989746f, 0.010826f, 0.990234f, 0.007904f, 0.987793f, 0.002123f,
+ 0.000000f, 1.000000f, 0.649902f, 0.721191f, 0.745117f, 0.603027f, 0.796875f, 0.526367f,
+ 0.832031f, 0.468506f, 0.856934f, 0.423828f, 0.874023f, 0.387939f, 0.889648f, 0.356934f,
+ 0.900391f, 0.331543f, 0.909668f, 0.309082f, 0.917969f, 0.289307f, 0.925293f, 0.271484f,
+ 0.930664f, 0.256104f, 0.934082f, 0.242188f, 0.940430f, 0.228638f, 0.942871f, 0.217285f,
+ 0.947754f, 0.206055f, 0.950684f, 0.196045f, 0.952637f, 0.186768f, 0.956055f, 0.177856f,
+ 0.958496f, 0.169678f, 0.959961f, 0.161987f, 0.962891f, 0.154785f, 0.964844f, 0.147827f,
+ 0.965332f, 0.141479f, 0.967285f, 0.135132f, 0.968750f, 0.129395f, 0.971191f, 0.123596f,
+ 0.971680f, 0.118225f, 0.972168f, 0.113403f, 0.974609f, 0.108337f, 0.975586f, 0.103394f,
+ 0.975586f, 0.098999f, 0.977051f, 0.094543f, 0.977539f, 0.090393f, 0.979004f, 0.086182f,
+ 0.979492f, 0.082214f, 0.979980f, 0.078430f, 0.981445f, 0.074524f, 0.981934f, 0.070923f,
+ 0.981934f, 0.067505f, 0.983398f, 0.064026f, 0.983887f, 0.060547f, 0.984375f, 0.057251f,
+ 0.985352f, 0.053894f, 0.985352f, 0.050873f, 0.985840f, 0.047913f, 0.986328f, 0.044891f,
+ 0.986816f, 0.041962f, 0.987305f, 0.039124f, 0.988770f, 0.036102f, 0.989258f, 0.032959f,
+ 0.988770f, 0.030273f, 0.988770f, 0.027756f, 0.989258f, 0.025116f, 0.989258f, 0.022736f,
+ 0.990234f, 0.020004f, 0.990234f, 0.017654f, 0.990723f, 0.015228f, 0.991211f, 0.012878f,
+ 0.992188f, 0.010071f, 0.992676f, 0.007557f, 0.992676f, 0.005527f, 0.989746f, 0.002165f,
+ 0.000000f, 1.000000f, 0.671387f, 0.713379f, 0.768066f, 0.591797f, 0.817383f, 0.513672f,
+ 0.851562f, 0.455078f, 0.874023f, 0.409668f, 0.892578f, 0.372803f, 0.904297f, 0.342529f,
+ 0.914551f, 0.316406f, 0.922852f, 0.293945f, 0.931641f, 0.273682f, 0.934570f, 0.256836f,
+ 0.940918f, 0.240723f, 0.945312f, 0.226562f, 0.949219f, 0.213623f, 0.952637f, 0.201904f,
+ 0.956055f, 0.190918f, 0.958984f, 0.180908f, 0.960938f, 0.171753f, 0.962891f, 0.163208f,
+ 0.965820f, 0.154907f, 0.967285f, 0.147339f, 0.968750f, 0.140381f, 0.970703f, 0.133545f,
+ 0.972168f, 0.127197f, 0.973145f, 0.121338f, 0.974121f, 0.115601f, 0.975098f, 0.110229f,
+ 0.976562f, 0.105225f, 0.977539f, 0.100159f, 0.979004f, 0.095337f, 0.979492f, 0.090759f,
+ 0.979492f, 0.086731f, 0.980469f, 0.082703f, 0.981934f, 0.078491f, 0.982422f, 0.074646f,
+ 0.983887f, 0.070862f, 0.983887f, 0.067200f, 0.984375f, 0.063782f, 0.984863f, 0.060516f,
+ 0.984863f, 0.057465f, 0.985840f, 0.054230f, 0.986328f, 0.051208f, 0.986816f, 0.048218f,
+ 0.987305f, 0.045349f, 0.988281f, 0.042389f, 0.988770f, 0.039551f, 0.989258f, 0.036804f,
+ 0.989258f, 0.034302f, 0.989746f, 0.031799f, 0.989746f, 0.029480f, 0.990234f, 0.027191f,
+ 0.990723f, 0.024826f, 0.991211f, 0.022507f, 0.991211f, 0.020325f, 0.991699f, 0.018127f,
+ 0.992188f, 0.015945f, 0.993652f, 0.013298f, 0.993164f, 0.011261f, 0.993164f, 0.009483f,
+ 0.993652f, 0.007664f, 0.993652f, 0.006149f, 0.993652f, 0.004696f, 0.992676f, 0.002760f,
+ 0.000000f, 1.000000f, 0.692383f, 0.705566f, 0.788574f, 0.582031f, 0.835449f, 0.502930f,
+ 0.868652f, 0.443604f, 0.889160f, 0.397949f, 0.905273f, 0.360840f, 0.917969f, 0.329834f,
+ 0.925781f, 0.304199f, 0.934082f, 0.281250f, 0.940430f, 0.261230f, 0.945312f, 0.244019f,
+ 0.950195f, 0.227905f, 0.954590f, 0.213867f, 0.957520f, 0.201172f, 0.960938f, 0.189087f,
+ 0.962402f, 0.178589f, 0.964844f, 0.168823f, 0.967773f, 0.159180f, 0.969238f, 0.150757f,
+ 0.971191f, 0.142822f, 0.971680f, 0.135742f, 0.974609f, 0.128296f, 0.975586f, 0.121826f,
+ 0.976074f, 0.115906f, 0.977051f, 0.110229f, 0.979492f, 0.104492f, 0.979980f, 0.099060f,
+ 0.980469f, 0.094299f, 0.980957f, 0.089722f, 0.981934f, 0.085205f, 0.982910f, 0.080933f,
+ 0.984375f, 0.076477f, 0.984375f, 0.072632f, 0.985352f, 0.068848f, 0.985352f, 0.065369f,
+ 0.985840f, 0.062042f, 0.985840f, 0.058929f, 0.987305f, 0.055420f, 0.987793f, 0.052277f,
+ 0.988770f, 0.049103f, 0.989258f, 0.046173f, 0.989258f, 0.043457f, 0.989258f, 0.040924f,
+ 0.990234f, 0.038177f, 0.990234f, 0.035736f, 0.989746f, 0.033478f, 0.990234f, 0.031128f,
+ 0.990234f, 0.029007f, 0.991211f, 0.026596f, 0.991699f, 0.024445f, 0.991699f, 0.022354f,
+ 0.992676f, 0.020142f, 0.993164f, 0.017929f, 0.993652f, 0.015808f, 0.993652f, 0.014038f,
+ 0.993652f, 0.012398f, 0.994141f, 0.010811f, 0.994141f, 0.009163f, 0.994141f, 0.007805f,
+ 0.994629f, 0.006386f, 0.994141f, 0.005188f, 0.994629f, 0.003971f, 0.994629f, 0.002979f,
+ 0.000000f, 1.000000f, 0.712402f, 0.698242f, 0.807129f, 0.572754f, 0.853516f, 0.492920f,
+ 0.882812f, 0.433838f, 0.902344f, 0.387695f, 0.917969f, 0.350342f, 0.928223f, 0.319824f,
+ 0.936035f, 0.293701f, 0.942871f, 0.270508f, 0.947754f, 0.250977f, 0.953125f, 0.233276f,
+ 0.957520f, 0.217407f, 0.960449f, 0.203369f, 0.963867f, 0.190308f, 0.965820f, 0.178955f,
+ 0.968262f, 0.168091f, 0.970703f, 0.158203f, 0.971680f, 0.149292f, 0.974121f, 0.140747f,
+ 0.975098f, 0.133057f, 0.976562f, 0.125610f, 0.978027f, 0.118835f, 0.979492f, 0.112183f,
+ 0.979980f, 0.106384f, 0.980469f, 0.100830f, 0.981445f, 0.095459f, 0.982910f, 0.090271f,
+ 0.983887f, 0.085266f, 0.983887f, 0.080933f, 0.985352f, 0.076477f, 0.985352f, 0.072449f,
+ 0.985840f, 0.068665f, 0.986328f, 0.065063f, 0.987305f, 0.061401f, 0.988770f, 0.057739f,
+ 0.988770f, 0.054352f, 0.989258f, 0.051178f, 0.989258f, 0.048309f, 0.989258f, 0.045624f,
+ 0.990234f, 0.042877f, 0.990234f, 0.040192f, 0.990723f, 0.037659f, 0.990723f, 0.035309f,
+ 0.991211f, 0.032990f, 0.991211f, 0.030823f, 0.992188f, 0.028397f, 0.992676f, 0.026184f,
+ 0.993652f, 0.023880f, 0.993652f, 0.021820f, 0.994141f, 0.019882f, 0.994141f, 0.018005f,
+ 0.994141f, 0.016342f, 0.994141f, 0.014786f, 0.994141f, 0.013229f, 0.994141f, 0.011673f,
+ 0.994141f, 0.010323f, 0.994141f, 0.009087f, 0.994629f, 0.007652f, 0.994629f, 0.006546f,
+ 0.995117f, 0.005310f, 0.995117f, 0.004387f, 0.995117f, 0.003315f, 0.996094f, 0.002047f,
+ 0.000000f, 1.000000f, 0.730469f, 0.691895f, 0.822754f, 0.565430f, 0.868164f, 0.484863f,
+ 0.894531f, 0.425537f, 0.913086f, 0.379150f, 0.925781f, 0.342285f, 0.936523f, 0.310791f,
+ 0.944824f, 0.284424f, 0.949707f, 0.261963f, 0.954590f, 0.241943f, 0.958984f, 0.224487f,
+ 0.963379f, 0.208374f, 0.965332f, 0.194824f, 0.968262f, 0.181641f, 0.970215f, 0.170166f,
+ 0.973145f, 0.159302f, 0.974121f, 0.149658f, 0.975586f, 0.140747f, 0.977539f, 0.132324f,
+ 0.979004f, 0.124512f, 0.979980f, 0.117310f, 0.980469f, 0.110901f, 0.981445f, 0.104614f,
+ 0.983398f, 0.098328f, 0.983887f, 0.092773f, 0.984375f, 0.087769f, 0.984863f, 0.082886f,
+ 0.985840f, 0.078186f, 0.986328f, 0.073853f, 0.987305f, 0.069641f, 0.988281f, 0.065491f,
+ 0.988281f, 0.061798f, 0.989258f, 0.058044f, 0.989258f, 0.054749f, 0.989258f, 0.051697f,
+ 0.989746f, 0.048645f, 0.989746f, 0.045868f, 0.990723f, 0.042908f, 0.990723f, 0.040314f,
+ 0.991211f, 0.037750f, 0.991211f, 0.035400f, 0.991699f, 0.033020f, 0.992676f, 0.030472f,
+ 0.993652f, 0.027954f, 0.993652f, 0.025848f, 0.993652f, 0.023926f, 0.994141f, 0.021973f,
+ 0.994141f, 0.020172f, 0.994141f, 0.018524f, 0.994141f, 0.016983f, 0.994629f, 0.015373f,
+ 0.994629f, 0.013885f, 0.994629f, 0.012543f, 0.994629f, 0.011292f, 0.995117f, 0.009865f,
+ 0.995117f, 0.008713f, 0.995605f, 0.007580f, 0.995605f, 0.006413f, 0.995117f, 0.005505f,
+ 0.995605f, 0.004375f, 0.996094f, 0.003344f, 0.996582f, 0.002335f, 0.998047f, 0.000193f,
+ 0.000000f, 1.000000f, 0.748047f, 0.685547f, 0.839355f, 0.558105f, 0.880859f, 0.477539f,
+ 0.906738f, 0.417969f, 0.923340f, 0.371338f, 0.934570f, 0.334473f, 0.943848f, 0.303223f,
+ 0.950684f, 0.276855f, 0.956543f, 0.254150f, 0.960938f, 0.234375f, 0.963867f, 0.216919f,
+ 0.967773f, 0.200928f, 0.969727f, 0.187256f, 0.972656f, 0.174072f, 0.973633f, 0.162964f,
+ 0.976562f, 0.152100f, 0.977539f, 0.142456f, 0.978516f, 0.133667f, 0.979980f, 0.125366f,
+ 0.981445f, 0.117676f, 0.982910f, 0.110535f, 0.983887f, 0.103699f, 0.984375f, 0.097656f,
+ 0.984863f, 0.092041f, 0.985352f, 0.086670f, 0.986328f, 0.081543f, 0.987793f, 0.076538f,
+ 0.988281f, 0.071838f, 0.988281f, 0.067688f, 0.988770f, 0.063721f, 0.989258f, 0.059906f,
+ 0.989746f, 0.056335f, 0.989746f, 0.053040f, 0.990234f, 0.049896f, 0.990723f, 0.046783f,
+ 0.991211f, 0.043793f, 0.991211f, 0.041107f, 0.991699f, 0.038422f, 0.992676f, 0.035736f,
+ 0.993652f, 0.032867f, 0.993652f, 0.030548f, 0.993652f, 0.028412f, 0.993652f, 0.026428f,
+ 0.994141f, 0.024384f, 0.994141f, 0.022552f, 0.994141f, 0.020844f, 0.994141f, 0.019257f,
+ 0.994629f, 0.017563f, 0.994629f, 0.016052f, 0.994629f, 0.014679f, 0.994629f, 0.013397f,
+ 0.995117f, 0.011932f, 0.995117f, 0.010742f, 0.995605f, 0.009621f, 0.995605f, 0.008362f,
+ 0.995605f, 0.007374f, 0.996094f, 0.006222f, 0.996094f, 0.005341f, 0.996582f, 0.004272f,
+ 0.997070f, 0.003265f, 0.997070f, 0.002253f, 0.998535f, 0.000515f, 0.998535f, 0.000015f,
+ 0.000000f, 1.000000f, 0.762695f, 0.680664f, 0.852539f, 0.552246f, 0.892090f, 0.471191f,
+ 0.913574f, 0.412598f, 0.931641f, 0.365234f, 0.942383f, 0.327881f, 0.950684f, 0.296631f,
+ 0.956543f, 0.270508f, 0.961914f, 0.247803f, 0.965332f, 0.228027f, 0.968750f, 0.210327f,
+ 0.971680f, 0.194702f, 0.973633f, 0.180664f, 0.975586f, 0.168213f, 0.978027f, 0.156372f,
+ 0.979004f, 0.145996f, 0.979980f, 0.136475f, 0.982422f, 0.127319f, 0.983398f, 0.119141f,
+ 0.983887f, 0.111816f, 0.984863f, 0.104797f, 0.985352f, 0.098267f, 0.985840f, 0.092285f,
+ 0.987305f, 0.086487f, 0.988281f, 0.080750f, 0.988281f, 0.075928f, 0.988770f, 0.071289f,
+ 0.988770f, 0.067139f, 0.989746f, 0.062805f, 0.989746f, 0.059113f, 0.990234f, 0.055450f,
+ 0.990723f, 0.052063f, 0.991211f, 0.048645f, 0.991699f, 0.045441f, 0.992188f, 0.042419f,
+ 0.993164f, 0.039307f, 0.993652f, 0.036499f, 0.993652f, 0.033966f, 0.993652f, 0.031677f,
+ 0.993652f, 0.029541f, 0.994141f, 0.027359f, 0.994141f, 0.025360f, 0.994141f, 0.023544f,
+ 0.994141f, 0.021835f, 0.994629f, 0.020020f, 0.994629f, 0.018433f, 0.994629f, 0.016968f,
+ 0.995117f, 0.015480f, 0.995117f, 0.014053f, 0.995117f, 0.012802f, 0.995605f, 0.011520f,
+ 0.995605f, 0.010292f, 0.995605f, 0.009232f, 0.996094f, 0.008034f, 0.996094f, 0.007069f,
+ 0.996582f, 0.005962f, 0.997070f, 0.005047f, 0.997070f, 0.004066f, 0.998047f, 0.002935f,
+ 0.999023f, 0.001466f, 0.999023f, 0.000664f, 0.999023f, 0.000200f, 0.998535f, 0.000005f,
+ 0.000000f, 1.000000f, 0.778809f, 0.675293f, 0.863770f, 0.546875f, 0.901367f, 0.465576f,
+ 0.922363f, 0.406738f, 0.937988f, 0.359863f, 0.948242f, 0.322510f, 0.956055f, 0.291260f,
+ 0.962402f, 0.264893f, 0.965820f, 0.242554f, 0.969238f, 0.222656f, 0.972168f, 0.205078f,
+ 0.974121f, 0.189697f, 0.977539f, 0.175171f, 0.979004f, 0.162720f, 0.980469f, 0.151367f,
+ 0.982422f, 0.140503f, 0.983398f, 0.130981f, 0.984375f, 0.122314f, 0.984863f, 0.114502f,
+ 0.986328f, 0.106812f, 0.986816f, 0.099915f, 0.988281f, 0.093140f, 0.988770f, 0.087158f,
+ 0.989258f, 0.081543f, 0.989258f, 0.076538f, 0.989746f, 0.071777f, 0.990234f, 0.067200f,
+ 0.990723f, 0.062866f, 0.991211f, 0.058899f, 0.991699f, 0.055145f, 0.992676f, 0.051300f,
+ 0.993652f, 0.047607f, 0.993652f, 0.044342f, 0.994141f, 0.041351f, 0.994141f, 0.038452f,
+ 0.994141f, 0.035858f, 0.994141f, 0.033478f, 0.994629f, 0.031082f, 0.994629f, 0.028854f,
+ 0.994629f, 0.026825f, 0.994629f, 0.024933f, 0.995117f, 0.022949f, 0.995117f, 0.021210f,
+ 0.994629f, 0.019608f, 0.995117f, 0.017944f, 0.995117f, 0.016434f, 0.995117f, 0.015068f,
+ 0.995605f, 0.013634f, 0.995605f, 0.012344f, 0.995605f, 0.011200f, 0.996094f, 0.009903f,
+ 0.996094f, 0.008865f, 0.996582f, 0.007683f, 0.996582f, 0.006748f, 0.997070f, 0.005638f,
+ 0.997559f, 0.004570f, 0.998535f, 0.003340f, 0.999023f, 0.002111f, 0.999023f, 0.001382f,
+ 0.999023f, 0.000828f, 0.999023f, 0.000409f, 0.999023f, 0.000123f, 0.999023f, 0.000003f,
+ 0.000000f, 1.000000f, 0.792480f, 0.670410f, 0.874512f, 0.541992f, 0.910645f, 0.460693f,
+ 0.930664f, 0.401855f, 0.945312f, 0.354980f, 0.953125f, 0.317871f, 0.960449f, 0.286865f,
+ 0.965820f, 0.260254f, 0.970703f, 0.237549f, 0.972656f, 0.218018f, 0.976074f, 0.200195f,
+ 0.978027f, 0.184692f, 0.979492f, 0.170776f, 0.982422f, 0.157837f, 0.982910f, 0.146484f,
+ 0.983887f, 0.136353f, 0.984863f, 0.126831f, 0.985840f, 0.118164f, 0.987793f, 0.109741f,
+ 0.988281f, 0.102234f, 0.988281f, 0.095642f, 0.989258f, 0.089172f, 0.989746f, 0.083374f,
+ 0.989746f, 0.078003f, 0.990723f, 0.072815f, 0.991211f, 0.067993f, 0.991699f, 0.063477f,
+ 0.992188f, 0.059235f, 0.993652f, 0.054749f, 0.993652f, 0.050995f, 0.993652f, 0.047607f,
+ 0.994141f, 0.044312f, 0.994141f, 0.041260f, 0.994141f, 0.038483f, 0.994141f, 0.035919f,
+ 0.994629f, 0.033264f, 0.994629f, 0.030945f, 0.994629f, 0.028778f, 0.995117f, 0.026581f,
+ 0.995117f, 0.024597f, 0.995117f, 0.022781f, 0.995605f, 0.020935f, 0.995605f, 0.019241f,
+ 0.995605f, 0.017715f, 0.996094f, 0.016113f, 0.996094f, 0.014709f, 0.996094f, 0.013435f,
+ 0.996582f, 0.012009f, 0.996582f, 0.010857f, 0.997070f, 0.009560f, 0.997559f, 0.008408f,
+ 0.997559f, 0.007324f, 0.997559f, 0.006172f, 0.998535f, 0.004894f, 0.999023f, 0.003607f,
+ 0.999023f, 0.002758f, 0.999023f, 0.002066f, 0.999023f, 0.001485f, 0.999023f, 0.000998f,
+ 0.999023f, 0.000601f, 0.999023f, 0.000295f, 0.999023f, 0.000086f, 0.999023f, 0.000002f,
+ 0.000000f, 1.000000f, 0.805664f, 0.666016f, 0.885254f, 0.537598f, 0.917969f, 0.456787f,
+ 0.935547f, 0.398193f, 0.949707f, 0.351074f, 0.958496f, 0.313721f, 0.964844f, 0.282715f,
+ 0.969238f, 0.256348f, 0.973145f, 0.233643f, 0.976074f, 0.213745f, 0.978027f, 0.196411f,
+ 0.979980f, 0.180786f, 0.981934f, 0.166626f, 0.982910f, 0.154297f, 0.984375f, 0.142944f,
+ 0.985840f, 0.132446f, 0.987305f, 0.122742f, 0.988281f, 0.113953f, 0.988281f, 0.106201f,
+ 0.988770f, 0.098999f, 0.989746f, 0.092102f, 0.990234f, 0.085938f, 0.990234f, 0.080261f,
+ 0.991211f, 0.074646f, 0.992188f, 0.069397f, 0.993164f, 0.064331f, 0.993652f, 0.059723f,
+ 0.993652f, 0.055634f, 0.993652f, 0.051910f, 0.994141f, 0.048248f, 0.994141f, 0.044952f,
+ 0.994141f, 0.041901f, 0.994629f, 0.038910f, 0.994629f, 0.036163f, 0.994629f, 0.033630f,
+ 0.995117f, 0.031158f, 0.995117f, 0.028839f, 0.995117f, 0.026749f, 0.995605f, 0.024643f,
+ 0.995605f, 0.022705f, 0.995605f, 0.020966f, 0.996094f, 0.019135f, 0.996094f, 0.017548f,
+ 0.996582f, 0.015961f, 0.996582f, 0.014496f, 0.997070f, 0.013092f, 0.997070f, 0.011742f,
+ 0.997559f, 0.010406f, 0.998047f, 0.009201f, 0.998535f, 0.007942f, 0.999512f, 0.006516f,
+ 0.999512f, 0.005203f, 0.999512f, 0.004269f, 0.999512f, 0.003471f, 0.999512f, 0.002773f,
+ 0.999512f, 0.002163f, 0.999512f, 0.001632f, 0.999512f, 0.001172f, 0.999023f, 0.000785f,
+ 0.999023f, 0.000469f, 0.999023f, 0.000226f, 0.999023f, 0.000064f, 0.999023f, 0.000001f,
+ 0.000000f, 1.000000f, 0.817871f, 0.662109f, 0.894043f, 0.533691f, 0.924805f, 0.453125f,
+ 0.941406f, 0.394531f, 0.954590f, 0.347656f, 0.962402f, 0.310059f, 0.967773f, 0.279053f,
+ 0.972168f, 0.252686f, 0.975586f, 0.229980f, 0.978027f, 0.210571f, 0.980957f, 0.192627f,
+ 0.982422f, 0.177124f, 0.983887f, 0.163452f, 0.984863f, 0.151001f, 0.987305f, 0.139160f,
+ 0.987793f, 0.128784f, 0.988281f, 0.119751f, 0.988770f, 0.111084f, 0.989258f, 0.103333f,
+ 0.990234f, 0.095947f, 0.990723f, 0.089233f, 0.991699f, 0.082947f, 0.993164f, 0.076660f,
+ 0.993164f, 0.071167f, 0.993652f, 0.066101f, 0.993652f, 0.061523f, 0.993652f, 0.057312f,
+ 0.994141f, 0.053253f, 0.994141f, 0.049561f, 0.994141f, 0.046173f, 0.994629f, 0.042816f,
+ 0.994629f, 0.039795f, 0.994629f, 0.036987f, 0.995117f, 0.034180f, 0.995117f, 0.031708f,
+ 0.995605f, 0.029358f, 0.995605f, 0.027039f, 0.995605f, 0.024979f, 0.996094f, 0.022888f,
+ 0.996094f, 0.021042f, 0.996582f, 0.019211f, 0.996582f, 0.017532f, 0.997070f, 0.015884f,
+ 0.997070f, 0.014389f, 0.997559f, 0.012848f, 0.998047f, 0.011383f, 0.998535f, 0.009941f,
+ 0.999512f, 0.008308f, 0.999512f, 0.007061f, 0.999512f, 0.006020f, 0.999512f, 0.005104f,
+ 0.999512f, 0.004288f, 0.999512f, 0.003557f, 0.999512f, 0.002905f, 0.999512f, 0.002321f,
+ 0.999512f, 0.001806f, 0.999512f, 0.001356f, 0.999512f, 0.000968f, 0.999512f, 0.000643f,
+ 0.999512f, 0.000380f, 0.999512f, 0.000181f, 0.999023f, 0.000050f, 0.999023f, 0.000001f,
+ 0.000000f, 1.000000f, 0.829102f, 0.658691f, 0.903320f, 0.530273f, 0.932129f, 0.449463f,
+ 0.945801f, 0.391357f, 0.957520f, 0.344727f, 0.965820f, 0.307129f, 0.970215f, 0.276367f,
+ 0.974609f, 0.249756f, 0.978027f, 0.227173f, 0.980957f, 0.206909f, 0.981934f, 0.189941f,
+ 0.983887f, 0.174438f, 0.985352f, 0.160522f, 0.986816f, 0.147705f, 0.987793f, 0.136353f,
+ 0.988281f, 0.126343f, 0.989258f, 0.117004f, 0.989746f, 0.108582f, 0.990723f, 0.100525f,
+ 0.991699f, 0.093201f, 0.993164f, 0.085938f, 0.993164f, 0.079712f, 0.993164f, 0.074158f,
+ 0.993652f, 0.068787f, 0.993652f, 0.063965f, 0.994141f, 0.059448f, 0.994141f, 0.055237f,
+ 0.994141f, 0.051422f, 0.994629f, 0.047638f, 0.994629f, 0.044250f, 0.995117f, 0.041046f,
+ 0.995117f, 0.037994f, 0.995117f, 0.035248f, 0.995605f, 0.032471f, 0.995605f, 0.030045f,
+ 0.996094f, 0.027618f, 0.996094f, 0.025436f, 0.996582f, 0.023285f, 0.996582f, 0.021332f,
+ 0.997070f, 0.019394f, 0.997070f, 0.017670f, 0.997559f, 0.015884f, 0.998047f, 0.014183f,
+ 0.999023f, 0.012512f, 0.999512f, 0.010674f, 0.999512f, 0.009315f, 0.999512f, 0.008133f,
+ 0.999512f, 0.007080f, 0.999512f, 0.006119f, 0.999512f, 0.005249f, 0.999512f, 0.004463f,
+ 0.999512f, 0.003748f, 0.999512f, 0.003103f, 0.999512f, 0.002525f, 0.999512f, 0.002010f,
+ 0.999512f, 0.001557f, 0.999512f, 0.001162f, 0.999512f, 0.000824f, 0.999512f, 0.000542f,
+ 0.999512f, 0.000317f, 0.999512f, 0.000149f, 0.999512f, 0.000040f, 0.999023f, 0.000001f,
+ 0.000000f, 1.000000f, 0.837891f, 0.656250f, 0.908691f, 0.527344f, 0.937012f, 0.446533f,
+ 0.950684f, 0.388428f, 0.960938f, 0.342041f, 0.967773f, 0.304688f, 0.973633f, 0.273193f,
+ 0.977051f, 0.247192f, 0.980469f, 0.224121f, 0.981934f, 0.204712f, 0.984375f, 0.187378f,
+ 0.986328f, 0.171387f, 0.987305f, 0.157715f, 0.987793f, 0.145386f, 0.988281f, 0.134277f,
+ 0.989746f, 0.124023f, 0.990234f, 0.114685f, 0.991699f, 0.105896f, 0.992676f, 0.097656f,
+ 0.993164f, 0.090332f, 0.993164f, 0.083801f, 0.993652f, 0.077759f, 0.993652f, 0.072144f,
+ 0.993652f, 0.067078f, 0.994141f, 0.062164f, 0.994141f, 0.057800f, 0.994629f, 0.053528f,
+ 0.994629f, 0.049683f, 0.995117f, 0.045990f, 0.995117f, 0.042633f, 0.995605f, 0.039429f,
+ 0.995605f, 0.036407f, 0.996094f, 0.033630f, 0.996094f, 0.030945f, 0.996582f, 0.028442f,
+ 0.996582f, 0.026093f, 0.997070f, 0.023804f, 0.997070f, 0.021790f, 0.997559f, 0.019699f,
+ 0.998047f, 0.017715f, 0.999512f, 0.015594f, 0.999512f, 0.013680f, 0.999512f, 0.012138f,
+ 0.999512f, 0.010765f, 0.999512f, 0.009521f, 0.999512f, 0.008385f, 0.999512f, 0.007351f,
+ 0.999512f, 0.006397f, 0.999512f, 0.005531f, 0.999512f, 0.004738f, 0.999512f, 0.004017f,
+ 0.999512f, 0.003366f, 0.999512f, 0.002777f, 0.999512f, 0.002251f, 0.999512f, 0.001785f,
+ 0.999512f, 0.001374f, 0.999512f, 0.001019f, 0.999512f, 0.000718f, 0.999512f, 0.000468f,
+ 0.999512f, 0.000271f, 0.999512f, 0.000125f, 0.999512f, 0.000033f, 0.999512f, 0.000001f,
+ 0.000000f, 1.000000f, 0.849609f, 0.652344f, 0.916992f, 0.523926f, 0.941895f, 0.444092f,
+ 0.955078f, 0.385742f, 0.964355f, 0.339844f, 0.971191f, 0.302002f, 0.975098f, 0.271240f,
+ 0.979492f, 0.244629f, 0.981934f, 0.222290f, 0.983887f, 0.202393f, 0.986328f, 0.184570f,
+ 0.987305f, 0.169434f, 0.987793f, 0.155762f, 0.988770f, 0.143311f, 0.989746f, 0.132202f,
+ 0.990723f, 0.121826f, 0.992676f, 0.111877f, 0.992676f, 0.103455f, 0.993164f, 0.095642f,
+ 0.993164f, 0.088684f, 0.993652f, 0.082092f, 0.993652f, 0.076172f, 0.994141f, 0.070557f,
+ 0.994141f, 0.065491f, 0.994629f, 0.060638f, 0.994629f, 0.056244f, 0.995117f, 0.052032f,
+ 0.995117f, 0.048218f, 0.995605f, 0.044495f, 0.995605f, 0.041168f, 0.996094f, 0.037903f,
+ 0.996094f, 0.035004f, 0.996582f, 0.032074f, 0.997070f, 0.029388f, 0.997070f, 0.026947f,
+ 0.997559f, 0.024490f, 0.998535f, 0.022049f, 0.999512f, 0.019547f, 0.999512f, 0.017487f,
+ 0.999512f, 0.015686f, 0.999512f, 0.014069f, 0.999512f, 0.012589f, 0.999512f, 0.011230f,
+ 0.999512f, 0.009979f, 0.999512f, 0.008835f, 0.999512f, 0.007778f, 0.999512f, 0.006805f,
+ 0.999512f, 0.005917f, 0.999512f, 0.005104f, 0.999512f, 0.004364f, 0.999512f, 0.003689f,
+ 0.999512f, 0.003080f, 0.999512f, 0.002533f, 0.999512f, 0.002047f, 0.999512f, 0.001615f,
+ 0.999512f, 0.001237f, 0.999512f, 0.000912f, 0.999512f, 0.000638f, 0.999512f, 0.000413f,
+ 0.999512f, 0.000237f, 0.999512f, 0.000108f, 0.999512f, 0.000028f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.857910f, 0.649902f, 0.921875f, 0.521973f, 0.947266f, 0.441406f,
+ 0.958008f, 0.383789f, 0.965820f, 0.338379f, 0.972656f, 0.300293f, 0.978027f, 0.268799f,
+ 0.980469f, 0.242920f, 0.983398f, 0.220215f, 0.985840f, 0.200073f, 0.986816f, 0.182861f,
+ 0.987793f, 0.167725f, 0.989258f, 0.153931f, 0.990234f, 0.141479f, 0.992188f, 0.129517f,
+ 0.992676f, 0.119385f, 0.992676f, 0.110229f, 0.993164f, 0.101868f, 0.993164f, 0.094299f,
+ 0.993652f, 0.087219f, 0.993652f, 0.080872f, 0.994141f, 0.074768f, 0.994629f, 0.069214f,
+ 0.994629f, 0.064087f, 0.995117f, 0.059296f, 0.995117f, 0.054901f, 0.995605f, 0.050659f,
+ 0.995605f, 0.046875f, 0.996094f, 0.043152f, 0.996582f, 0.039673f, 0.997070f, 0.036499f,
+ 0.997070f, 0.033447f, 0.997559f, 0.030548f, 0.998535f, 0.027634f, 0.999512f, 0.024704f,
+ 0.999512f, 0.022293f, 0.999512f, 0.020157f, 0.999512f, 0.018219f, 0.999512f, 0.016449f,
+ 0.999512f, 0.014816f, 0.999512f, 0.013306f, 0.999512f, 0.011909f, 0.999512f, 0.010620f,
+ 0.999512f, 0.009430f, 0.999512f, 0.008339f, 0.999512f, 0.007332f, 0.999512f, 0.006405f,
+ 0.999512f, 0.005558f, 0.999512f, 0.004784f, 0.999512f, 0.004078f, 0.999512f, 0.003441f,
+ 0.999512f, 0.002865f, 0.999512f, 0.002348f, 0.999512f, 0.001890f, 0.999512f, 0.001485f,
+ 0.999512f, 0.001133f, 0.999512f, 0.000831f, 0.999512f, 0.000578f, 0.999512f, 0.000371f,
+ 0.999512f, 0.000211f, 0.999512f, 0.000095f, 0.999512f, 0.000025f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.864746f, 0.647949f, 0.926758f, 0.520020f, 0.949707f, 0.439697f,
+ 0.961426f, 0.381592f, 0.967773f, 0.336670f, 0.975586f, 0.298340f, 0.979004f, 0.267334f,
+ 0.982422f, 0.241211f, 0.984863f, 0.218140f, 0.986328f, 0.198730f, 0.987305f, 0.181641f,
+ 0.988770f, 0.166138f, 0.990723f, 0.151855f, 0.992188f, 0.139038f, 0.992188f, 0.128052f,
+ 0.992676f, 0.118042f, 0.993164f, 0.108948f, 0.993164f, 0.100769f, 0.993652f, 0.093018f,
+ 0.994141f, 0.085999f, 0.994141f, 0.079590f, 0.994629f, 0.073547f, 0.995117f, 0.067993f,
+ 0.995117f, 0.062866f, 0.995605f, 0.058014f, 0.996094f, 0.053528f, 0.996094f, 0.049408f,
+ 0.996582f, 0.045441f, 0.997070f, 0.041687f, 0.997559f, 0.038177f, 0.998535f, 0.034729f,
+ 0.999512f, 0.031250f, 0.999512f, 0.028366f, 0.999512f, 0.025803f, 0.999512f, 0.023468f,
+ 0.999512f, 0.021317f, 0.999512f, 0.019318f, 0.999512f, 0.017487f, 0.999512f, 0.015793f,
+ 0.999512f, 0.014221f, 0.999512f, 0.012764f, 0.999512f, 0.011414f, 0.999512f, 0.010170f,
+ 0.999512f, 0.009026f, 0.999512f, 0.007965f, 0.999512f, 0.006992f, 0.999512f, 0.006100f,
+ 0.999512f, 0.005283f, 0.999512f, 0.004539f, 0.999512f, 0.003864f, 0.999512f, 0.003250f,
+ 0.999512f, 0.002701f, 0.999512f, 0.002207f, 0.999512f, 0.001771f, 0.999512f, 0.001387f,
+ 0.999512f, 0.001054f, 0.999512f, 0.000770f, 0.999512f, 0.000533f, 0.999512f, 0.000340f,
+ 0.999512f, 0.000192f, 0.999512f, 0.000086f, 0.999512f, 0.000022f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.874023f, 0.645020f, 0.931641f, 0.518066f, 0.953125f, 0.437744f,
+ 0.964355f, 0.379883f, 0.969727f, 0.335205f, 0.976074f, 0.297363f, 0.980469f, 0.266113f,
+ 0.983887f, 0.239380f, 0.985840f, 0.216919f, 0.987305f, 0.197388f, 0.988770f, 0.180054f,
+ 0.991211f, 0.163818f, 0.991699f, 0.150146f, 0.992188f, 0.137939f, 0.992676f, 0.126953f,
+ 0.993164f, 0.116943f, 0.993164f, 0.108032f, 0.993652f, 0.099609f, 0.994141f, 0.091919f,
+ 0.994629f, 0.084900f, 0.994629f, 0.078491f, 0.995117f, 0.072449f, 0.995605f, 0.066772f,
+ 0.996094f, 0.061584f, 0.996582f, 0.056732f, 0.997070f, 0.052185f, 0.997559f, 0.047852f,
+ 0.998047f, 0.043762f, 0.999512f, 0.039520f, 0.999512f, 0.036011f, 0.999512f, 0.032898f,
+ 0.999512f, 0.030060f, 0.999512f, 0.027435f, 0.999512f, 0.025009f, 0.999512f, 0.022766f,
+ 0.999512f, 0.020676f, 0.999512f, 0.018753f, 0.999512f, 0.016968f, 0.999512f, 0.015312f,
+ 0.999512f, 0.013779f, 0.999512f, 0.012360f, 0.999512f, 0.011047f, 0.999512f, 0.009834f,
+ 0.999512f, 0.008713f, 0.999512f, 0.007687f, 0.999512f, 0.006737f, 0.999512f, 0.005871f,
+ 0.999512f, 0.005077f, 0.999512f, 0.004353f, 0.999512f, 0.003698f, 0.999512f, 0.003107f,
+ 0.999512f, 0.002575f, 0.999512f, 0.002100f, 0.999512f, 0.001680f, 0.999512f, 0.001312f,
+ 0.999512f, 0.000995f, 0.999512f, 0.000724f, 0.999512f, 0.000499f, 0.999512f, 0.000317f,
+ 0.999512f, 0.000178f, 0.999512f, 0.000079f, 0.999512f, 0.000020f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.880371f, 0.643555f, 0.934570f, 0.517090f, 0.957031f, 0.435791f,
+ 0.966309f, 0.378174f, 0.972656f, 0.333008f, 0.977539f, 0.296143f, 0.982422f, 0.264160f,
+ 0.984375f, 0.238403f, 0.986816f, 0.215820f, 0.988770f, 0.195923f, 0.991211f, 0.177856f,
+ 0.991699f, 0.162598f, 0.992188f, 0.149170f, 0.992676f, 0.136963f, 0.993164f, 0.125977f,
+ 0.993164f, 0.116150f, 0.993652f, 0.107056f, 0.994141f, 0.098633f, 0.994629f, 0.090942f,
+ 0.995117f, 0.083862f, 0.995605f, 0.077271f, 0.996094f, 0.071167f, 0.996582f, 0.065552f,
+ 0.997070f, 0.060242f, 0.998047f, 0.055176f, 0.999512f, 0.050110f, 0.999512f, 0.045685f,
+ 0.999512f, 0.041840f, 0.999512f, 0.038330f, 0.999512f, 0.035126f, 0.999512f, 0.032135f,
+ 0.999512f, 0.029388f, 0.999512f, 0.026840f, 0.999512f, 0.024475f, 0.999512f, 0.022278f,
+ 0.999512f, 0.020233f, 0.999512f, 0.018341f, 0.999512f, 0.016586f, 0.999512f, 0.014961f,
+ 0.999512f, 0.013458f, 0.999512f, 0.012062f, 0.999512f, 0.010773f, 0.999512f, 0.009575f,
+ 0.999512f, 0.008484f, 0.999512f, 0.007473f, 0.999512f, 0.006542f, 0.999512f, 0.005695f,
+ 0.999512f, 0.004917f, 0.999512f, 0.004211f, 0.999512f, 0.003574f, 0.999512f, 0.002998f,
+ 0.999512f, 0.002480f, 0.999512f, 0.002020f, 0.999512f, 0.001613f, 0.999512f, 0.001257f,
+ 0.999512f, 0.000950f, 0.999512f, 0.000690f, 0.999512f, 0.000473f, 0.999512f, 0.000300f,
+ 0.999512f, 0.000167f, 0.999512f, 0.000074f, 0.999512f, 0.000018f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.887695f, 0.641113f, 0.938965f, 0.515137f, 0.959473f, 0.434570f,
+ 0.969727f, 0.376465f, 0.974121f, 0.332031f, 0.979004f, 0.295166f, 0.982910f, 0.263672f,
+ 0.985352f, 0.237427f, 0.988770f, 0.214233f, 0.990234f, 0.194214f, 0.991211f, 0.177002f,
+ 0.991699f, 0.161987f, 0.992188f, 0.148438f, 0.992676f, 0.136353f, 0.993164f, 0.125366f,
+ 0.993652f, 0.115295f, 0.994141f, 0.106140f, 0.995117f, 0.097656f, 0.995605f, 0.089844f,
+ 0.996094f, 0.082703f, 0.996582f, 0.076050f, 0.997559f, 0.069763f, 0.998535f, 0.063721f,
+ 0.999512f, 0.057983f, 0.999512f, 0.053162f, 0.999512f, 0.048828f, 0.999512f, 0.044830f,
+ 0.999512f, 0.041138f, 0.999512f, 0.037720f, 0.999512f, 0.034576f, 0.999512f, 0.031647f,
+ 0.999512f, 0.028946f, 0.999512f, 0.026428f, 0.999512f, 0.024094f, 0.999512f, 0.021912f,
+ 0.999512f, 0.019913f, 0.999512f, 0.018036f, 0.999512f, 0.016296f, 0.999512f, 0.014702f,
+ 0.999512f, 0.013214f, 0.999512f, 0.011833f, 0.999512f, 0.010567f, 0.999512f, 0.009392f,
+ 0.999512f, 0.008308f, 0.999512f, 0.007313f, 0.999512f, 0.006401f, 0.999512f, 0.005566f,
+ 0.999512f, 0.004803f, 0.999512f, 0.004108f, 0.999512f, 0.003483f, 0.999512f, 0.002916f,
+ 0.999512f, 0.002411f, 0.999512f, 0.001961f, 0.999512f, 0.001563f, 0.999512f, 0.001216f,
+ 0.999512f, 0.000918f, 0.999512f, 0.000665f, 0.999512f, 0.000455f, 0.999512f, 0.000288f,
+ 0.999512f, 0.000160f, 0.999512f, 0.000070f, 0.999512f, 0.000017f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.892090f, 0.640137f, 0.942383f, 0.513672f, 0.962891f, 0.432617f,
+ 0.971191f, 0.375000f, 0.977051f, 0.330078f, 0.979004f, 0.294678f, 0.983398f, 0.263184f,
+ 0.987793f, 0.235840f, 0.989746f, 0.212891f, 0.990234f, 0.193726f, 0.991211f, 0.176514f,
+ 0.992188f, 0.161377f, 0.992676f, 0.147827f, 0.993164f, 0.135620f, 0.994141f, 0.124451f,
+ 0.994629f, 0.114319f, 0.995117f, 0.105103f, 0.996094f, 0.096497f, 0.996582f, 0.088623f,
+ 0.998047f, 0.081055f, 0.999512f, 0.073669f, 0.999512f, 0.067566f, 0.999512f, 0.062073f,
+ 0.999512f, 0.057068f, 0.999512f, 0.052460f, 0.999512f, 0.048218f, 0.999512f, 0.044312f,
+ 0.999512f, 0.040680f, 0.999512f, 0.037323f, 0.999512f, 0.034210f, 0.999512f, 0.031311f,
+ 0.999512f, 0.028625f, 0.999512f, 0.026123f, 0.999512f, 0.023819f, 0.999512f, 0.021667f,
+ 0.999512f, 0.019669f, 0.999512f, 0.017822f, 0.999512f, 0.016098f, 0.999512f, 0.014511f,
+ 0.999512f, 0.013039f, 0.999512f, 0.011673f, 0.999512f, 0.010414f, 0.999512f, 0.009254f,
+ 0.999512f, 0.008179f, 0.999512f, 0.007198f, 0.999512f, 0.006298f, 0.999512f, 0.005470f,
+ 0.999512f, 0.004719f, 0.999512f, 0.004036f, 0.999512f, 0.003416f, 0.999512f, 0.002859f,
+ 0.999512f, 0.002361f, 0.999512f, 0.001919f, 0.999512f, 0.001528f, 0.999512f, 0.001187f,
+ 0.999512f, 0.000895f, 0.999512f, 0.000647f, 0.999512f, 0.000443f, 0.999512f, 0.000279f,
+ 0.999512f, 0.000155f, 0.999512f, 0.000068f, 0.999512f, 0.000017f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.898926f, 0.637695f, 0.947266f, 0.511230f, 0.965820f, 0.431152f,
+ 0.973145f, 0.373779f, 0.978027f, 0.329102f, 0.979980f, 0.293701f, 0.984863f, 0.262451f,
+ 0.987793f, 0.235229f, 0.989258f, 0.212769f, 0.990234f, 0.193359f, 0.991699f, 0.176147f,
+ 0.992188f, 0.160889f, 0.993164f, 0.147095f, 0.994141f, 0.134766f, 0.995117f, 0.123474f,
+ 0.996094f, 0.113159f, 0.997070f, 0.103516f, 0.999512f, 0.094177f, 0.999512f, 0.086060f,
+ 0.999512f, 0.079041f, 0.999512f, 0.072693f, 0.999512f, 0.066833f, 0.999512f, 0.061523f,
+ 0.999512f, 0.056610f, 0.999512f, 0.052063f, 0.999512f, 0.047852f, 0.999512f, 0.043976f,
+ 0.999512f, 0.040375f, 0.999512f, 0.037048f, 0.999512f, 0.033936f, 0.999512f, 0.031067f,
+ 0.999512f, 0.028412f, 0.999512f, 0.025925f, 0.999512f, 0.023621f, 0.999512f, 0.021484f,
+ 0.999512f, 0.019501f, 0.999512f, 0.017670f, 0.999512f, 0.015961f, 0.999512f, 0.014381f,
+ 0.999512f, 0.012917f, 0.999512f, 0.011559f, 0.999512f, 0.010315f, 0.999512f, 0.009155f,
+ 0.999512f, 0.008095f, 0.999512f, 0.007122f, 0.999512f, 0.006226f, 0.999512f, 0.005409f,
+ 0.999512f, 0.004662f, 0.999512f, 0.003983f, 0.999512f, 0.003372f, 0.999512f, 0.002821f,
+ 0.999512f, 0.002329f, 0.999512f, 0.001890f, 0.999512f, 0.001505f, 0.999512f, 0.001168f,
+ 0.999512f, 0.000880f, 0.999512f, 0.000636f, 0.999512f, 0.000434f, 0.999512f, 0.000273f,
+ 0.999512f, 0.000152f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.905273f, 0.635742f, 0.951660f, 0.509277f, 0.965820f, 0.431152f,
+ 0.976074f, 0.372070f, 0.979004f, 0.328369f, 0.983887f, 0.291016f, 0.983887f, 0.261963f,
+ 0.985840f, 0.236572f, 0.988770f, 0.213257f, 0.990234f, 0.193359f, 0.991699f, 0.175903f,
+ 0.993164f, 0.160156f, 0.994629f, 0.146240f, 0.995605f, 0.133423f, 0.998047f, 0.121338f,
+ 0.999512f, 0.110107f, 0.999512f, 0.100952f, 0.999512f, 0.092773f, 0.999512f, 0.085327f,
+ 0.999512f, 0.078491f, 0.999512f, 0.072205f, 0.999512f, 0.066467f, 0.999512f, 0.061218f,
+ 0.999512f, 0.056305f, 0.999512f, 0.051819f, 0.999512f, 0.047638f, 0.999512f, 0.043762f,
+ 0.999512f, 0.040192f, 0.999512f, 0.036865f, 0.999512f, 0.033783f, 0.999512f, 0.030914f,
+ 0.999512f, 0.028259f, 0.999512f, 0.025787f, 0.999512f, 0.023499f, 0.999512f, 0.021378f,
+ 0.999512f, 0.019394f, 0.999512f, 0.017563f, 0.999512f, 0.015869f, 0.999512f, 0.014297f,
+ 0.999512f, 0.012840f, 0.999512f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f,
+ 0.999512f, 0.008041f, 0.999512f, 0.007072f, 0.999512f, 0.006184f, 0.999512f, 0.005367f,
+ 0.999512f, 0.004627f, 0.999512f, 0.003952f, 0.999512f, 0.003345f, 0.999512f, 0.002798f,
+ 0.999512f, 0.002308f, 0.999512f, 0.001874f, 0.999512f, 0.001491f, 0.999512f, 0.001158f,
+ 0.999512f, 0.000871f, 0.999512f, 0.000629f, 0.999512f, 0.000430f, 0.999512f, 0.000270f,
+ 0.999512f, 0.000150f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.907227f, 0.635254f, 0.952637f, 0.509277f, 0.968262f, 0.429688f,
+ 0.976562f, 0.371826f, 0.983887f, 0.324951f, 0.983887f, 0.290527f, 0.983887f, 0.261719f,
+ 0.983887f, 0.237427f, 0.983887f, 0.216309f, 0.984863f, 0.197632f, 0.994629f, 0.175171f,
+ 0.999512f, 0.155884f, 0.999512f, 0.141968f, 0.999512f, 0.129883f, 0.999512f, 0.119080f,
+ 0.999512f, 0.109314f, 0.999512f, 0.100403f, 0.999512f, 0.092346f, 0.999512f, 0.084961f,
+ 0.999512f, 0.078186f, 0.999512f, 0.071960f, 0.999512f, 0.066284f, 0.999512f, 0.061005f,
+ 0.999512f, 0.056152f, 0.999512f, 0.051666f, 0.999512f, 0.047485f, 0.999512f, 0.043640f,
+ 0.999512f, 0.040070f, 0.999512f, 0.036743f, 0.999512f, 0.033691f, 0.999512f, 0.030838f,
+ 0.999512f, 0.028183f, 0.999512f, 0.025726f, 0.999512f, 0.023438f, 0.999512f, 0.021317f,
+ 0.999512f, 0.019348f, 0.999512f, 0.017517f, 0.999512f, 0.015823f, 0.999512f, 0.014252f,
+ 1.000000f, 0.012802f, 0.999512f, 0.011452f, 1.000000f, 0.010216f, 1.000000f, 0.009071f,
+ 1.000000f, 0.008018f, 1.000000f, 0.007050f, 1.000000f, 0.006161f, 1.000000f, 0.005348f,
+ 1.000000f, 0.004612f, 1.000000f, 0.003941f, 1.000000f, 0.003334f, 1.000000f, 0.002787f,
+ 1.000000f, 0.002298f, 1.000000f, 0.001866f, 1.000000f, 0.001485f, 0.999512f, 0.001152f,
+ 1.000000f, 0.000867f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f,
+ 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f,
+ 0.000000f, 0.991699f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.985840f,
+ 0.000000f, 0.984375f, 0.000000f, 0.979980f, 0.000000f, 0.976562f, 0.000000f, 0.969727f,
+ 0.000000f, 0.958984f, 0.000000f, 0.938477f, 0.000000f, 0.883789f, 0.000000f, 0.555176f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f,
+ 0.000000f, 0.991211f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.985840f,
+ 0.000000f, 0.983887f, 0.000000f, 0.979980f, 0.000000f, 0.976074f, 0.000000f, 0.969238f,
+ 0.000000f, 0.958984f, 0.000000f, 0.937988f, 0.000000f, 0.883789f, 0.000000f, 0.555176f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f,
+ 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.986328f,
+ 0.000000f, 0.983398f, 0.000000f, 0.980469f, 0.000000f, 0.975586f, 0.000000f, 0.968750f,
+ 0.000000f, 0.958496f, 0.000000f, 0.937988f, 0.000000f, 0.883301f, 0.000004f, 0.554688f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994629f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f,
+ 0.000000f, 0.990234f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.985840f,
+ 0.000000f, 0.982910f, 0.000000f, 0.980957f, 0.000000f, 0.975098f, 0.000000f, 0.969238f,
+ 0.000000f, 0.957520f, 0.000000f, 0.937012f, 0.000022f, 0.882324f, 0.000029f, 0.553711f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994141f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f,
+ 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.985840f,
+ 0.000000f, 0.982422f, 0.000000f, 0.979492f, 0.000000f, 0.975098f, 0.000000f, 0.968750f,
+ 0.000000f, 0.957031f, 0.000065f, 0.936035f, 0.000051f, 0.880859f, 0.000110f, 0.552734f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f,
+ 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990723f,
+ 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.984863f,
+ 0.000000f, 0.982910f, 0.000000f, 0.979004f, 0.000000f, 0.974121f, 0.000014f, 0.967773f,
+ 0.000153f, 0.956055f, 0.000141f, 0.935059f, 0.000156f, 0.879395f, 0.000302f, 0.551758f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994629f,
+ 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990723f,
+ 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.984863f,
+ 0.000000f, 0.981934f, 0.000000f, 0.978516f, 0.000193f, 0.974121f, 0.000303f, 0.966309f,
+ 0.000277f, 0.955078f, 0.000209f, 0.933594f, 0.000340f, 0.876465f, 0.000677f, 0.549805f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f,
+ 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000020f, 0.984375f,
+ 0.000229f, 0.980957f, 0.000481f, 0.977051f, 0.000519f, 0.973145f, 0.000462f, 0.964844f,
+ 0.000364f, 0.953125f, 0.000518f, 0.931152f, 0.000634f, 0.874023f, 0.001318f, 0.547852f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.993652f,
+ 0.000000f, 0.993164f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f,
+ 0.000000f, 0.988281f, 0.000118f, 0.986816f, 0.000355f, 0.985352f, 0.000631f, 0.983398f,
+ 0.000804f, 0.980957f, 0.000780f, 0.976074f, 0.000684f, 0.971680f, 0.000575f, 0.963867f,
+ 0.000708f, 0.951172f, 0.000806f, 0.928223f, 0.001154f, 0.870117f, 0.002291f, 0.545410f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.993652f,
+ 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000097f, 0.990723f, 0.000322f, 0.989258f,
+ 0.000583f, 0.987793f, 0.000854f, 0.986328f, 0.001122f, 0.984863f, 0.001165f, 0.982422f,
+ 0.001086f, 0.979980f, 0.000950f, 0.975586f, 0.000796f, 0.970215f, 0.000953f, 0.961914f,
+ 0.001175f, 0.949707f, 0.001426f, 0.926270f, 0.001970f, 0.866211f, 0.003677f, 0.542480f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000003f, 0.993652f, 0.000153f, 0.993652f,
+ 0.000380f, 0.992676f, 0.000623f, 0.991699f, 0.000893f, 0.989746f, 0.001161f, 0.988770f,
+ 0.001406f, 0.986816f, 0.001590f, 0.985352f, 0.001534f, 0.983398f, 0.001380f, 0.981445f,
+ 0.001233f, 0.978516f, 0.001087f, 0.974121f, 0.001286f, 0.968750f, 0.001590f, 0.960449f,
+ 0.001768f, 0.947754f, 0.002182f, 0.922363f, 0.003139f, 0.861328f, 0.005543f, 0.539551f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000089f, 0.994629f,
+ 0.000294f, 0.994141f, 0.000531f, 0.993652f, 0.000763f, 0.993652f, 0.001027f, 0.993164f,
+ 0.001268f, 0.992676f, 0.001505f, 0.990723f, 0.001743f, 0.989258f, 0.001961f, 0.987793f,
+ 0.002010f, 0.986328f, 0.001871f, 0.984375f, 0.001698f, 0.982422f, 0.001496f, 0.979492f,
+ 0.001505f, 0.977051f, 0.001706f, 0.972656f, 0.001982f, 0.966309f, 0.002312f, 0.958496f,
+ 0.002699f, 0.944824f, 0.003412f, 0.918457f, 0.004868f, 0.856934f, 0.007942f, 0.536133f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000077f, 0.996094f,
+ 0.000279f, 0.995605f, 0.000498f, 0.995117f, 0.000758f, 0.994629f, 0.000991f, 0.994141f,
+ 0.001227f, 0.993652f, 0.001451f, 0.993164f, 0.001675f, 0.993164f, 0.001869f, 0.992676f,
+ 0.002094f, 0.991211f, 0.002260f, 0.990234f, 0.002470f, 0.988770f, 0.002378f, 0.987305f,
+ 0.002199f, 0.985352f, 0.001993f, 0.983398f, 0.001861f, 0.981445f, 0.002094f, 0.979004f,
+ 0.002241f, 0.975586f, 0.002480f, 0.971680f, 0.002930f, 0.964355f, 0.003344f, 0.955566f,
+ 0.003979f, 0.941406f, 0.005020f, 0.914551f, 0.007179f, 0.851074f, 0.010880f, 0.533203f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000116f, 0.996582f,
+ 0.000329f, 0.996582f, 0.000560f, 0.996094f, 0.000815f, 0.995605f, 0.001021f, 0.995117f,
+ 0.001272f, 0.994629f, 0.001466f, 0.994141f, 0.001686f, 0.993652f, 0.001883f, 0.993652f,
+ 0.002045f, 0.993164f, 0.002262f, 0.993164f, 0.002420f, 0.991699f, 0.002590f, 0.991211f,
+ 0.002779f, 0.990723f, 0.002914f, 0.989746f, 0.002844f, 0.987793f, 0.002581f, 0.985840f,
+ 0.002447f, 0.984375f, 0.002573f, 0.982422f, 0.002857f, 0.979980f, 0.002949f, 0.976562f,
+ 0.003170f, 0.973145f, 0.003666f, 0.968750f, 0.004238f, 0.962402f, 0.004742f, 0.952148f,
+ 0.005692f, 0.937012f, 0.007179f, 0.910156f, 0.010223f, 0.844238f, 0.014442f, 0.529297f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000014f, 0.997070f, 0.000203f, 0.996582f,
+ 0.000439f, 0.996582f, 0.000669f, 0.996582f, 0.000926f, 0.996582f, 0.001131f, 0.996094f,
+ 0.001360f, 0.995605f, 0.001561f, 0.995117f, 0.001719f, 0.995117f, 0.001944f, 0.994629f,
+ 0.002104f, 0.994141f, 0.002251f, 0.993652f, 0.002451f, 0.993164f, 0.002594f, 0.993164f,
+ 0.002712f, 0.992676f, 0.002911f, 0.991699f, 0.003048f, 0.990723f, 0.003147f, 0.990234f,
+ 0.003334f, 0.989746f, 0.003483f, 0.988281f, 0.003820f, 0.987305f, 0.003553f, 0.984863f,
+ 0.003677f, 0.983398f, 0.003727f, 0.980469f, 0.003799f, 0.977539f, 0.004093f, 0.975098f,
+ 0.004559f, 0.971191f, 0.005211f, 0.966309f, 0.005978f, 0.958496f, 0.006699f, 0.948730f,
+ 0.008041f, 0.932129f, 0.010391f, 0.904297f, 0.014381f, 0.836914f, 0.018860f, 0.524902f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000081f, 0.997070f, 0.000323f, 0.997070f,
+ 0.000591f, 0.997070f, 0.000807f, 0.996582f, 0.001072f, 0.996582f, 0.001266f, 0.996582f,
+ 0.001475f, 0.996582f, 0.001679f, 0.996094f, 0.001820f, 0.995605f, 0.002018f, 0.995117f,
+ 0.002192f, 0.995117f, 0.002312f, 0.994629f, 0.002470f, 0.994141f, 0.002644f, 0.993652f,
+ 0.002764f, 0.993652f, 0.002850f, 0.993164f, 0.003048f, 0.993164f, 0.003183f, 0.991699f,
+ 0.003277f, 0.991211f, 0.003395f, 0.990723f, 0.003565f, 0.989746f, 0.003826f, 0.989258f,
+ 0.004196f, 0.988281f, 0.004684f, 0.986816f, 0.005169f, 0.985840f, 0.004967f, 0.983887f,
+ 0.004627f, 0.981445f, 0.004875f, 0.978516f, 0.005257f, 0.976074f, 0.005589f, 0.972656f,
+ 0.006306f, 0.968750f, 0.007496f, 0.963379f, 0.008354f, 0.955566f, 0.009590f, 0.944336f,
+ 0.011452f, 0.927246f, 0.014496f, 0.897949f, 0.020004f, 0.828613f, 0.024414f, 0.520996f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000200f, 0.997559f, 0.000453f, 0.997070f,
+ 0.000755f, 0.997070f, 0.000950f, 0.997070f, 0.001227f, 0.997070f, 0.001406f, 0.996582f,
+ 0.001596f, 0.996582f, 0.001802f, 0.996582f, 0.001935f, 0.996582f, 0.002087f, 0.996094f,
+ 0.002279f, 0.995605f, 0.002405f, 0.995117f, 0.002489f, 0.994629f, 0.002682f, 0.994629f,
+ 0.002827f, 0.994141f, 0.002922f, 0.993652f, 0.002987f, 0.993652f, 0.003185f, 0.993164f,
+ 0.003313f, 0.993164f, 0.003399f, 0.992188f, 0.003456f, 0.991211f, 0.003641f, 0.990723f,
+ 0.003933f, 0.990234f, 0.004311f, 0.989746f, 0.004692f, 0.988770f, 0.005169f, 0.987793f,
+ 0.005581f, 0.986816f, 0.005978f, 0.985352f, 0.006283f, 0.984375f, 0.006916f, 0.982910f,
+ 0.006577f, 0.979492f, 0.006893f, 0.977051f, 0.007221f, 0.973633f, 0.008026f, 0.969727f,
+ 0.008850f, 0.965332f, 0.010010f, 0.958984f, 0.011612f, 0.952148f, 0.012985f, 0.939453f,
+ 0.015762f, 0.921875f, 0.019714f, 0.890137f, 0.027252f, 0.819824f, 0.030869f, 0.516113f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000030f, 0.997559f, 0.000321f, 0.997559f, 0.000576f, 0.997559f,
+ 0.000901f, 0.997559f, 0.001075f, 0.997070f, 0.001365f, 0.997070f, 0.001530f, 0.997070f,
+ 0.001694f, 0.997070f, 0.001912f, 0.996582f, 0.002039f, 0.996582f, 0.002123f, 0.996582f,
+ 0.002354f, 0.996582f, 0.002487f, 0.996094f, 0.002571f, 0.995605f, 0.002680f, 0.995117f,
+ 0.002871f, 0.994629f, 0.002983f, 0.994629f, 0.003054f, 0.994141f, 0.003117f, 0.993652f,
+ 0.003319f, 0.993652f, 0.003435f, 0.993164f, 0.003510f, 0.992676f, 0.003557f, 0.992188f,
+ 0.003742f, 0.991699f, 0.004128f, 0.990723f, 0.004517f, 0.990234f, 0.004894f, 0.989746f,
+ 0.005226f, 0.988770f, 0.005699f, 0.988281f, 0.006088f, 0.986816f, 0.006390f, 0.986328f,
+ 0.006721f, 0.984863f, 0.007393f, 0.983398f, 0.008125f, 0.981934f, 0.008812f, 0.979980f,
+ 0.008667f, 0.977539f, 0.008881f, 0.974121f, 0.009567f, 0.970703f, 0.010544f, 0.966797f,
+ 0.011612f, 0.960938f, 0.013306f, 0.955078f, 0.015594f, 0.946777f, 0.017487f, 0.933594f,
+ 0.021103f, 0.915039f, 0.026505f, 0.881836f, 0.036133f, 0.810059f, 0.038300f, 0.510742f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000021f, 0.998047f, 0.000372f, 0.998047f, 0.000649f, 0.997559f,
+ 0.000998f, 0.997559f, 0.001168f, 0.997559f, 0.001455f, 0.997559f, 0.001623f, 0.997070f,
+ 0.001718f, 0.997070f, 0.001987f, 0.997070f, 0.002121f, 0.997070f, 0.002193f, 0.997070f,
+ 0.002388f, 0.996582f, 0.002552f, 0.996582f, 0.002640f, 0.996094f, 0.002691f, 0.995605f,
+ 0.002872f, 0.995117f, 0.003025f, 0.995117f, 0.003109f, 0.994629f, 0.003160f, 0.994629f,
+ 0.003241f, 0.994141f, 0.003439f, 0.993652f, 0.003544f, 0.993652f, 0.003605f, 0.993164f,
+ 0.003643f, 0.992676f, 0.003990f, 0.992188f, 0.004463f, 0.991699f, 0.004852f, 0.990723f,
+ 0.005184f, 0.990234f, 0.005505f, 0.989746f, 0.005848f, 0.988770f, 0.006275f, 0.988281f,
+ 0.006573f, 0.987305f, 0.006855f, 0.986328f, 0.007393f, 0.985352f, 0.008011f, 0.983887f,
+ 0.008751f, 0.982910f, 0.009346f, 0.981445f, 0.010017f, 0.979492f, 0.010918f, 0.977539f,
+ 0.011543f, 0.975098f, 0.011932f, 0.971191f, 0.012405f, 0.967285f, 0.013542f, 0.962402f,
+ 0.015213f, 0.956543f, 0.017365f, 0.950195f, 0.020126f, 0.941406f, 0.022736f, 0.926758f,
+ 0.027908f, 0.907227f, 0.034576f, 0.873047f, 0.046539f, 0.798828f, 0.046967f, 0.506836f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000234f, 0.998047f, 0.000661f, 0.998047f,
+ 0.000992f, 0.998047f, 0.001218f, 0.998047f, 0.001438f, 0.997559f, 0.001673f, 0.997559f,
+ 0.001766f, 0.997559f, 0.001986f, 0.997070f, 0.002169f, 0.997070f, 0.002247f, 0.997070f,
+ 0.002300f, 0.997070f, 0.002573f, 0.997070f, 0.002686f, 0.996582f, 0.002741f, 0.996094f,
+ 0.002773f, 0.996094f, 0.003023f, 0.995605f, 0.003143f, 0.995117f, 0.003204f, 0.994629f,
+ 0.003239f, 0.994629f, 0.003344f, 0.994141f, 0.003542f, 0.994141f, 0.003633f, 0.993652f,
+ 0.003704f, 0.993164f, 0.003990f, 0.992676f, 0.004383f, 0.992188f, 0.004871f, 0.991699f,
+ 0.005257f, 0.991211f, 0.005558f, 0.990723f, 0.005840f, 0.990234f, 0.006039f, 0.989746f,
+ 0.006508f, 0.988770f, 0.006794f, 0.988281f, 0.007149f, 0.987305f, 0.007702f, 0.986328f,
+ 0.008194f, 0.985352f, 0.008820f, 0.984375f, 0.009506f, 0.983398f, 0.010025f, 0.981445f,
+ 0.010864f, 0.980469f, 0.011719f, 0.978516f, 0.012512f, 0.976562f, 0.013802f, 0.974121f,
+ 0.015038f, 0.971191f, 0.015152f, 0.968262f, 0.016327f, 0.962891f, 0.018005f, 0.958008f,
+ 0.019684f, 0.951660f, 0.022278f, 0.944336f, 0.026245f, 0.934570f, 0.030212f, 0.919434f,
+ 0.036438f, 0.898438f, 0.044373f, 0.862305f, 0.058777f, 0.786621f, 0.055878f, 0.500977f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000317f, 0.998535f,
+ 0.000786f, 0.998535f, 0.001155f, 0.998047f, 0.001323f, 0.998047f, 0.001599f, 0.998047f,
+ 0.001784f, 0.997559f, 0.001842f, 0.997559f, 0.002129f, 0.997559f, 0.002270f, 0.997559f,
+ 0.002321f, 0.997070f, 0.002432f, 0.997070f, 0.002687f, 0.997070f, 0.002769f, 0.997070f,
+ 0.002806f, 0.996094f, 0.002836f, 0.996094f, 0.003128f, 0.995605f, 0.003227f, 0.995605f,
+ 0.003271f, 0.995117f, 0.003294f, 0.994629f, 0.003408f, 0.994141f, 0.003622f, 0.994141f,
+ 0.003807f, 0.994141f, 0.004154f, 0.993652f, 0.004520f, 0.993164f, 0.004818f, 0.992676f,
+ 0.005352f, 0.992188f, 0.005684f, 0.991699f, 0.005978f, 0.991211f, 0.006153f, 0.990723f,
+ 0.006420f, 0.989746f, 0.006706f, 0.989258f, 0.007057f, 0.988281f, 0.007652f, 0.987793f,
+ 0.008179f, 0.987305f, 0.008644f, 0.986328f, 0.009148f, 0.984863f, 0.009750f, 0.983887f,
+ 0.010361f, 0.982910f, 0.011147f, 0.981445f, 0.011955f, 0.980469f, 0.012680f, 0.979004f,
+ 0.013420f, 0.977051f, 0.014824f, 0.975098f, 0.015915f, 0.972656f, 0.017303f, 0.970215f,
+ 0.018753f, 0.967285f, 0.019653f, 0.963379f, 0.021011f, 0.958008f, 0.023041f, 0.952637f,
+ 0.025787f, 0.945801f, 0.028976f, 0.937012f, 0.033325f, 0.926270f, 0.038513f, 0.910645f,
+ 0.046051f, 0.887695f, 0.057159f, 0.850586f, 0.073120f, 0.773926f, 0.065735f, 0.494873f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f,
+ 0.000167f, 0.999023f, 0.000779f, 0.998535f, 0.001051f, 0.998535f, 0.001363f, 0.998535f,
+ 0.001513f, 0.998047f, 0.001830f, 0.998047f, 0.001883f, 0.998047f, 0.002144f, 0.997559f,
+ 0.002321f, 0.997559f, 0.002363f, 0.997559f, 0.002380f, 0.997559f, 0.002743f, 0.997070f,
+ 0.002819f, 0.997070f, 0.002848f, 0.996582f, 0.002861f, 0.996094f, 0.003185f, 0.995605f,
+ 0.003281f, 0.995605f, 0.003315f, 0.995117f, 0.003332f, 0.994629f, 0.003397f, 0.994629f,
+ 0.004017f, 0.994141f, 0.004440f, 0.994141f, 0.004753f, 0.993652f, 0.005085f, 0.993164f,
+ 0.005299f, 0.992676f, 0.005798f, 0.991699f, 0.006134f, 0.991699f, 0.006298f, 0.991211f,
+ 0.006577f, 0.990723f, 0.006744f, 0.990234f, 0.006954f, 0.989258f, 0.007759f, 0.988770f,
+ 0.008354f, 0.987793f, 0.008827f, 0.987305f, 0.009224f, 0.986328f, 0.009727f, 0.985840f,
+ 0.010063f, 0.984375f, 0.010925f, 0.983887f, 0.011726f, 0.982422f, 0.012543f, 0.981445f,
+ 0.013191f, 0.979980f, 0.013908f, 0.978516f, 0.014984f, 0.977051f, 0.016083f, 0.975098f,
+ 0.017380f, 0.972656f, 0.018677f, 0.970703f, 0.020126f, 0.968750f, 0.021744f, 0.965332f,
+ 0.023682f, 0.961426f, 0.026016f, 0.957520f, 0.027252f, 0.951660f, 0.029556f, 0.945312f,
+ 0.032654f, 0.937500f, 0.036835f, 0.928223f, 0.042542f, 0.916504f, 0.049011f, 0.899902f,
+ 0.057770f, 0.875488f, 0.070984f, 0.836426f, 0.089050f, 0.758789f, 0.076111f, 0.489502f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000865f, 0.999023f,
+ 0.001151f, 0.999023f, 0.001417f, 0.998535f, 0.001698f, 0.998535f, 0.001896f, 0.998535f,
+ 0.001918f, 0.998047f, 0.002308f, 0.998047f, 0.002382f, 0.998047f, 0.002399f, 0.997559f,
+ 0.002682f, 0.997559f, 0.002842f, 0.997070f, 0.002871f, 0.996582f, 0.002882f, 0.996094f,
+ 0.003136f, 0.995605f, 0.003309f, 0.995605f, 0.003344f, 0.995117f, 0.003592f, 0.995117f,
+ 0.003952f, 0.994629f, 0.004658f, 0.994141f, 0.005035f, 0.994141f, 0.005337f, 0.993652f,
+ 0.005501f, 0.993164f, 0.005798f, 0.992676f, 0.006088f, 0.991699f, 0.006474f, 0.991699f,
+ 0.006756f, 0.991211f, 0.006939f, 0.990723f, 0.007332f, 0.990234f, 0.007942f, 0.989258f,
+ 0.008514f, 0.988281f, 0.009117f, 0.988281f, 0.009514f, 0.987305f, 0.010002f, 0.986328f,
+ 0.010384f, 0.985840f, 0.011070f, 0.984863f, 0.011597f, 0.983887f, 0.012650f, 0.982422f,
+ 0.013374f, 0.981445f, 0.014091f, 0.980469f, 0.014923f, 0.979004f, 0.015884f, 0.977539f,
+ 0.016754f, 0.976074f, 0.018005f, 0.974609f, 0.019348f, 0.972168f, 0.020615f, 0.970215f,
+ 0.022125f, 0.968262f, 0.023743f, 0.965332f, 0.025604f, 0.962402f, 0.027588f, 0.958984f,
+ 0.030212f, 0.955078f, 0.033112f, 0.950195f, 0.034882f, 0.944336f, 0.038055f, 0.937012f,
+ 0.041779f, 0.928711f, 0.047150f, 0.917969f, 0.053711f, 0.904785f, 0.062439f, 0.887207f,
+ 0.072510f, 0.860840f, 0.087280f, 0.820312f, 0.106995f, 0.743652f, 0.087158f, 0.482666f,
+ 0.000000f, 1.000000f, 0.000453f, 0.999512f, 0.000958f, 0.999023f, 0.001426f, 0.999023f,
+ 0.001450f, 0.998535f, 0.001913f, 0.998535f, 0.001932f, 0.998535f, 0.002323f, 0.998047f,
+ 0.002407f, 0.998047f, 0.002417f, 0.998047f, 0.002739f, 0.997070f, 0.002878f, 0.996582f,
+ 0.002895f, 0.996582f, 0.002901f, 0.996094f, 0.003342f, 0.995605f, 0.003899f, 0.995117f,
+ 0.004318f, 0.995117f, 0.004570f, 0.994629f, 0.004921f, 0.994629f, 0.005493f, 0.993652f,
+ 0.005795f, 0.993164f, 0.006001f, 0.992676f, 0.006092f, 0.992676f, 0.006348f, 0.992188f,
+ 0.006901f, 0.991211f, 0.007431f, 0.990723f, 0.007965f, 0.990234f, 0.008484f, 0.989258f,
+ 0.008896f, 0.988770f, 0.009163f, 0.988281f, 0.009872f, 0.987793f, 0.010399f, 0.986816f,
+ 0.011093f, 0.985840f, 0.011719f, 0.985352f, 0.012199f, 0.984375f, 0.012886f, 0.983398f,
+ 0.013557f, 0.982422f, 0.014618f, 0.981445f, 0.015480f, 0.979980f, 0.016281f, 0.978516f,
+ 0.017197f, 0.977539f, 0.018295f, 0.976074f, 0.019333f, 0.975098f, 0.020386f, 0.972656f,
+ 0.022003f, 0.970703f, 0.023407f, 0.969238f, 0.025024f, 0.966797f, 0.026733f, 0.964355f,
+ 0.028534f, 0.961426f, 0.030258f, 0.958496f, 0.033142f, 0.954590f, 0.035858f, 0.950684f,
+ 0.038727f, 0.946289f, 0.042053f, 0.940918f, 0.045135f, 0.934570f, 0.048950f, 0.926270f,
+ 0.054199f, 0.916504f, 0.060120f, 0.904785f, 0.067932f, 0.890625f, 0.078247f, 0.871582f,
+ 0.089966f, 0.844238f, 0.106812f, 0.802734f, 0.127441f, 0.726074f, 0.099121f, 0.477051f,
+ 0.000000f, 1.000000f, 0.000968f, 0.999512f, 0.001446f, 0.999023f, 0.001458f, 0.999023f,
+ 0.001937f, 0.998535f, 0.001944f, 0.998535f, 0.002409f, 0.998047f, 0.002424f, 0.998047f,
+ 0.002428f, 0.997070f, 0.002890f, 0.996582f, 0.003092f, 0.996582f, 0.003626f, 0.996094f,
+ 0.004356f, 0.995605f, 0.004761f, 0.995117f, 0.005108f, 0.995117f, 0.005207f, 0.994629f,
+ 0.005558f, 0.993652f, 0.006115f, 0.993164f, 0.006248f, 0.992676f, 0.006676f, 0.992188f,
+ 0.007191f, 0.991699f, 0.007652f, 0.991211f, 0.008629f, 0.990723f, 0.009087f, 0.989746f,
+ 0.009369f, 0.988770f, 0.009666f, 0.988770f, 0.010246f, 0.987793f, 0.011024f, 0.987305f,
+ 0.012001f, 0.986328f, 0.012520f, 0.985352f, 0.012955f, 0.984375f, 0.013870f, 0.983398f,
+ 0.014633f, 0.982422f, 0.015305f, 0.981934f, 0.016144f, 0.980469f, 0.017197f, 0.979004f,
+ 0.018433f, 0.978027f, 0.019287f, 0.976562f, 0.020370f, 0.975586f, 0.021545f, 0.973633f,
+ 0.022644f, 0.971680f, 0.023865f, 0.970215f, 0.025742f, 0.968262f, 0.027435f, 0.966309f,
+ 0.029160f, 0.964355f, 0.030624f, 0.961914f, 0.032593f, 0.958984f, 0.034882f, 0.956055f,
+ 0.037354f, 0.953125f, 0.040192f, 0.949219f, 0.043121f, 0.945312f, 0.046417f, 0.940430f,
+ 0.050079f, 0.935059f, 0.054443f, 0.929199f, 0.059357f, 0.922363f, 0.063660f, 0.912598f,
+ 0.069641f, 0.901855f, 0.077087f, 0.889160f, 0.085999f, 0.873535f, 0.097839f, 0.853516f,
+ 0.111206f, 0.824707f, 0.129272f, 0.782715f, 0.149658f, 0.708008f, 0.111084f, 0.470459f,
+ 0.000000f, 1.000000f, 0.000975f, 0.999512f, 0.001461f, 0.999023f, 0.001938f, 0.998535f,
+ 0.001947f, 0.998535f, 0.002417f, 0.997559f, 0.002432f, 0.997070f, 0.003159f, 0.997070f,
+ 0.004124f, 0.996094f, 0.004288f, 0.996094f, 0.004723f, 0.995605f, 0.005253f, 0.995117f,
+ 0.005669f, 0.994141f, 0.005749f, 0.993652f, 0.006195f, 0.993164f, 0.007343f, 0.992676f,
+ 0.007858f, 0.992188f, 0.008270f, 0.991211f, 0.008804f, 0.990723f, 0.009163f, 0.990234f,
+ 0.009964f, 0.989258f, 0.010559f, 0.988281f, 0.011612f, 0.987305f, 0.012154f, 0.986816f,
+ 0.012489f, 0.986328f, 0.013168f, 0.985352f, 0.014534f, 0.983887f, 0.015350f, 0.982910f,
+ 0.016083f, 0.981934f, 0.016830f, 0.981445f, 0.017746f, 0.979980f, 0.018661f, 0.978516f,
+ 0.019897f, 0.977539f, 0.021240f, 0.976074f, 0.022491f, 0.975098f, 0.023514f, 0.973145f,
+ 0.024704f, 0.971680f, 0.025787f, 0.970215f, 0.027557f, 0.968262f, 0.029312f, 0.966797f,
+ 0.031113f, 0.964355f, 0.032654f, 0.962402f, 0.034637f, 0.959961f, 0.036530f, 0.957520f,
+ 0.038971f, 0.955078f, 0.041229f, 0.951660f, 0.043732f, 0.948730f, 0.046875f, 0.945312f,
+ 0.049957f, 0.941406f, 0.053345f, 0.937012f, 0.057037f, 0.932129f, 0.061249f, 0.926758f,
+ 0.065857f, 0.920898f, 0.070984f, 0.914062f, 0.077271f, 0.905762f, 0.082703f, 0.895508f,
+ 0.089844f, 0.883789f, 0.098755f, 0.869629f, 0.109436f, 0.853027f, 0.122070f, 0.831543f,
+ 0.137085f, 0.802246f, 0.156006f, 0.760254f, 0.174561f, 0.688477f, 0.123535f, 0.463135f,
+ 0.000000f, 1.000000f, 0.000976f, 0.999512f, 0.001463f, 0.999023f, 0.001948f, 0.998047f,
+ 0.002787f, 0.997559f, 0.003792f, 0.997070f, 0.004143f, 0.996582f, 0.004810f, 0.996094f,
+ 0.005192f, 0.995117f, 0.005463f, 0.994629f, 0.006657f, 0.993652f, 0.007496f, 0.993164f,
+ 0.007912f, 0.992188f, 0.008186f, 0.991699f, 0.009392f, 0.990723f, 0.010132f, 0.989746f,
+ 0.010811f, 0.989258f, 0.011658f, 0.988281f, 0.012596f, 0.987305f, 0.013405f, 0.986328f,
+ 0.014366f, 0.985352f, 0.014893f, 0.984375f, 0.015961f, 0.983398f, 0.016907f, 0.982422f,
+ 0.018433f, 0.980957f, 0.019257f, 0.980469f, 0.020157f, 0.978516f, 0.021347f, 0.977051f,
+ 0.022690f, 0.976074f, 0.023911f, 0.975098f, 0.025558f, 0.973145f, 0.026596f, 0.971680f,
+ 0.027908f, 0.970215f, 0.029877f, 0.968262f, 0.031494f, 0.966797f, 0.032837f, 0.964844f,
+ 0.034668f, 0.962891f, 0.036407f, 0.960938f, 0.038788f, 0.958496f, 0.040863f, 0.956055f,
+ 0.043091f, 0.953613f, 0.045471f, 0.950684f, 0.048035f, 0.948242f, 0.050659f, 0.944824f,
+ 0.053375f, 0.941895f, 0.056519f, 0.937988f, 0.060364f, 0.934082f, 0.063660f, 0.929688f,
+ 0.067993f, 0.925293f, 0.072205f, 0.920410f, 0.076782f, 0.914551f, 0.082031f, 0.908203f,
+ 0.087646f, 0.901367f, 0.094360f, 0.893555f, 0.101440f, 0.884277f, 0.108765f, 0.873535f,
+ 0.116943f, 0.860352f, 0.126465f, 0.845703f, 0.138306f, 0.827637f, 0.152466f, 0.806152f,
+ 0.167480f, 0.776367f, 0.185669f, 0.735840f, 0.201782f, 0.667969f, 0.136108f, 0.456543f,
+ 0.000000f, 1.000000f, 0.000488f, 0.999023f, 0.002407f, 0.998535f, 0.002905f, 0.998047f,
+ 0.003870f, 0.997070f, 0.004910f, 0.995605f, 0.005802f, 0.995117f, 0.007008f, 0.994141f,
+ 0.007664f, 0.993164f, 0.008270f, 0.992188f, 0.010094f, 0.991211f, 0.010651f, 0.990234f,
+ 0.011383f, 0.989258f, 0.013062f, 0.987793f, 0.014275f, 0.986816f, 0.014977f, 0.985352f,
+ 0.015915f, 0.984863f, 0.017532f, 0.982910f, 0.018890f, 0.981445f, 0.020126f, 0.980469f,
+ 0.021225f, 0.979492f, 0.021942f, 0.978027f, 0.024231f, 0.976074f, 0.026031f, 0.975098f,
+ 0.027084f, 0.973145f, 0.028320f, 0.971680f, 0.030090f, 0.970215f, 0.031830f, 0.968750f,
+ 0.033630f, 0.966797f, 0.035858f, 0.964355f, 0.037415f, 0.962402f, 0.039551f, 0.960938f,
+ 0.041260f, 0.958496f, 0.043640f, 0.956543f, 0.045654f, 0.954102f, 0.048004f, 0.951660f,
+ 0.050903f, 0.948730f, 0.053650f, 0.946289f, 0.056335f, 0.943359f, 0.058838f, 0.940430f,
+ 0.062195f, 0.937500f, 0.065186f, 0.934082f, 0.068542f, 0.930664f, 0.072021f, 0.926758f,
+ 0.076355f, 0.922363f, 0.080444f, 0.917969f, 0.084717f, 0.913086f, 0.089355f, 0.908203f,
+ 0.094360f, 0.902832f, 0.099609f, 0.896973f, 0.105469f, 0.890137f, 0.111572f, 0.883301f,
+ 0.118896f, 0.875000f, 0.126465f, 0.866211f, 0.134644f, 0.856445f, 0.143188f, 0.845215f,
+ 0.151855f, 0.831055f, 0.162231f, 0.815430f, 0.174438f, 0.797363f, 0.188965f, 0.775391f,
+ 0.203613f, 0.747070f, 0.219482f, 0.708008f, 0.230469f, 0.645508f, 0.149902f, 0.450684f,
+ 0.000000f, 1.000000f, 0.000973f, 0.999023f, 0.002571f, 0.998047f, 0.004745f, 0.996582f,
+ 0.006233f, 0.995117f, 0.008202f, 0.993652f, 0.009140f, 0.992676f, 0.011353f, 0.990723f,
+ 0.012718f, 0.989746f, 0.014008f, 0.987793f, 0.016052f, 0.986328f, 0.017120f, 0.984863f,
+ 0.019363f, 0.982910f, 0.020996f, 0.981445f, 0.022644f, 0.979492f, 0.024368f, 0.978027f,
+ 0.026810f, 0.976074f, 0.027985f, 0.974121f, 0.030487f, 0.972168f, 0.032196f, 0.970215f,
+ 0.034119f, 0.968262f, 0.036682f, 0.966309f, 0.038818f, 0.963867f, 0.040649f, 0.961914f,
+ 0.043304f, 0.959473f, 0.045502f, 0.957520f, 0.048218f, 0.955078f, 0.050934f, 0.952637f,
+ 0.053436f, 0.950195f, 0.055725f, 0.947754f, 0.058746f, 0.944824f, 0.061584f, 0.942383f,
+ 0.064636f, 0.939453f, 0.067444f, 0.936523f, 0.071411f, 0.933105f, 0.074707f, 0.930176f,
+ 0.077942f, 0.926758f, 0.081604f, 0.923340f, 0.085205f, 0.919434f, 0.088928f, 0.916016f,
+ 0.093262f, 0.912109f, 0.097412f, 0.907715f, 0.102417f, 0.903320f, 0.107056f, 0.898438f,
+ 0.111938f, 0.893555f, 0.117065f, 0.888184f, 0.122314f, 0.882812f, 0.127930f, 0.876953f,
+ 0.133911f, 0.870605f, 0.140381f, 0.863770f, 0.147095f, 0.856445f, 0.154907f, 0.848145f,
+ 0.162598f, 0.839844f, 0.170654f, 0.830078f, 0.179565f, 0.819824f, 0.188965f, 0.808594f,
+ 0.197754f, 0.794434f, 0.207764f, 0.778809f, 0.219604f, 0.760742f, 0.232544f, 0.739746f,
+ 0.245117f, 0.713379f, 0.257080f, 0.678223f, 0.260498f, 0.622559f, 0.163086f, 0.442139f,
+ 0.000000f, 1.000000f, 0.002867f, 0.998535f, 0.005180f, 0.997070f, 0.007675f, 0.994629f,
+ 0.011902f, 0.991699f, 0.014618f, 0.988770f, 0.017593f, 0.986328f, 0.020813f, 0.984375f,
+ 0.023514f, 0.980957f, 0.026474f, 0.978027f, 0.029739f, 0.975586f, 0.032715f, 0.972656f,
+ 0.035614f, 0.969727f, 0.038605f, 0.967285f, 0.041840f, 0.964355f, 0.045410f, 0.961426f,
+ 0.048584f, 0.958008f, 0.051514f, 0.955566f, 0.054749f, 0.952637f, 0.058289f, 0.949707f,
+ 0.062256f, 0.946289f, 0.065491f, 0.943359f, 0.068909f, 0.939941f, 0.072327f, 0.937012f,
+ 0.076355f, 0.933594f, 0.079651f, 0.930176f, 0.083862f, 0.927246f, 0.087830f, 0.923340f,
+ 0.091919f, 0.919922f, 0.095886f, 0.916504f, 0.099731f, 0.912598f, 0.104370f, 0.909180f,
+ 0.108459f, 0.904785f, 0.112732f, 0.901367f, 0.116943f, 0.897461f, 0.121948f, 0.893066f,
+ 0.126587f, 0.888672f, 0.131470f, 0.884277f, 0.136230f, 0.879883f, 0.141357f, 0.875488f,
+ 0.146729f, 0.870117f, 0.152100f, 0.865234f, 0.157471f, 0.859863f, 0.162964f, 0.854492f,
+ 0.168701f, 0.849121f, 0.174805f, 0.843750f, 0.181152f, 0.837402f, 0.187500f, 0.830566f,
+ 0.194092f, 0.823730f, 0.201172f, 0.816406f, 0.208252f, 0.808594f, 0.215454f, 0.800781f,
+ 0.223022f, 0.792480f, 0.230835f, 0.783203f, 0.238892f, 0.772949f, 0.247314f, 0.762207f,
+ 0.255371f, 0.749023f, 0.264160f, 0.733887f, 0.273438f, 0.717773f, 0.282959f, 0.699219f,
+ 0.291748f, 0.676758f, 0.297607f, 0.646484f, 0.291016f, 0.598145f, 0.177246f, 0.433838f,
+ 0.000000f, 1.000000f, 0.007290f, 0.996094f, 0.014267f, 0.991699f, 0.021393f, 0.985840f,
+ 0.028214f, 0.980957f, 0.036194f, 0.974609f, 0.042999f, 0.968262f, 0.050507f, 0.962402f,
+ 0.056885f, 0.956543f, 0.062500f, 0.951660f, 0.069885f, 0.945801f, 0.075867f, 0.939941f,
+ 0.082031f, 0.935059f, 0.087646f, 0.930176f, 0.094727f, 0.924805f, 0.100708f, 0.919434f,
+ 0.106323f, 0.914551f, 0.111755f, 0.909668f, 0.117554f, 0.904785f, 0.123657f, 0.900391f,
+ 0.129272f, 0.895508f, 0.135254f, 0.890625f, 0.140625f, 0.886230f, 0.146484f, 0.881348f,
+ 0.151733f, 0.876953f, 0.156982f, 0.872070f, 0.161987f, 0.868164f, 0.167847f, 0.863281f,
+ 0.173340f, 0.858887f, 0.179688f, 0.854004f, 0.184937f, 0.849609f, 0.190186f, 0.844727f,
+ 0.195312f, 0.840332f, 0.200317f, 0.835938f, 0.205444f, 0.831543f, 0.210571f, 0.826660f,
+ 0.215576f, 0.822266f, 0.221069f, 0.817383f, 0.226685f, 0.812500f, 0.232178f, 0.807617f,
+ 0.238037f, 0.802246f, 0.243408f, 0.797363f, 0.248657f, 0.791992f, 0.253906f, 0.786621f,
+ 0.259277f, 0.781250f, 0.264404f, 0.775879f, 0.269775f, 0.770020f, 0.275391f, 0.763672f,
+ 0.280762f, 0.757812f, 0.286133f, 0.751465f, 0.291504f, 0.745117f, 0.296631f, 0.738281f,
+ 0.302979f, 0.730469f, 0.309326f, 0.722168f, 0.315186f, 0.713867f, 0.321045f, 0.704590f,
+ 0.326172f, 0.693848f, 0.330566f, 0.681641f, 0.335449f, 0.668457f, 0.339600f, 0.653320f,
+ 0.342285f, 0.636230f, 0.340088f, 0.612305f, 0.323486f, 0.573242f, 0.191528f, 0.425049f,
+ 0.000000f, 1.000000f, 0.049133f, 0.978027f, 0.088074f, 0.951660f, 0.118530f, 0.927734f,
+ 0.143311f, 0.907227f, 0.162598f, 0.890625f, 0.182251f, 0.874512f, 0.198364f, 0.860352f,
+ 0.212158f, 0.848145f, 0.226196f, 0.836426f, 0.236938f, 0.826660f, 0.246216f, 0.818359f,
+ 0.254639f, 0.810547f, 0.263672f, 0.803223f, 0.272705f, 0.795898f, 0.279541f, 0.789551f,
+ 0.286377f, 0.783691f, 0.292725f, 0.778320f, 0.298584f, 0.773438f, 0.302979f, 0.769043f,
+ 0.307617f, 0.764648f, 0.311768f, 0.760742f, 0.318848f, 0.755859f, 0.323975f, 0.751953f,
+ 0.328613f, 0.748047f, 0.332764f, 0.744141f, 0.336670f, 0.740723f, 0.340820f, 0.736816f,
+ 0.344238f, 0.733887f, 0.347412f, 0.730469f, 0.350342f, 0.727539f, 0.353271f, 0.724609f,
+ 0.355957f, 0.721680f, 0.358887f, 0.718750f, 0.361084f, 0.715820f, 0.364014f, 0.712891f,
+ 0.366211f, 0.709961f, 0.368408f, 0.707031f, 0.372070f, 0.704102f, 0.375488f, 0.700684f,
+ 0.378418f, 0.697266f, 0.381104f, 0.694336f, 0.383301f, 0.690918f, 0.385986f, 0.687500f,
+ 0.388672f, 0.684082f, 0.390869f, 0.680176f, 0.392822f, 0.676758f, 0.394775f, 0.673340f,
+ 0.396729f, 0.669434f, 0.398193f, 0.665527f, 0.399658f, 0.661621f, 0.400879f, 0.657227f,
+ 0.401855f, 0.652832f, 0.402832f, 0.648438f, 0.403320f, 0.643555f, 0.404053f, 0.638184f,
+ 0.403809f, 0.631836f, 0.402100f, 0.624023f, 0.400146f, 0.615723f, 0.398438f, 0.605957f,
+ 0.396240f, 0.593262f, 0.386230f, 0.574707f, 0.359863f, 0.543945f, 0.205688f, 0.416504f,
+ 0.000000f, 1.000000f, 0.369141f, 0.840820f, 0.409668f, 0.779785f, 0.429443f, 0.743652f,
+ 0.441650f, 0.718750f, 0.449219f, 0.701660f, 0.455078f, 0.688477f, 0.461182f, 0.677246f,
+ 0.467041f, 0.667480f, 0.470459f, 0.660156f, 0.474609f, 0.653809f, 0.477539f, 0.648438f,
+ 0.479736f, 0.644043f, 0.483398f, 0.640137f, 0.485352f, 0.636230f, 0.487305f, 0.633301f,
+ 0.489258f, 0.630371f, 0.491211f, 0.627930f, 0.492432f, 0.625488f, 0.494385f, 0.623535f,
+ 0.496338f, 0.621094f, 0.498291f, 0.619141f, 0.499268f, 0.617188f, 0.500488f, 0.615723f,
+ 0.501953f, 0.613770f, 0.502930f, 0.612305f, 0.504395f, 0.610352f, 0.505859f, 0.608398f,
+ 0.507324f, 0.606934f, 0.509277f, 0.604980f, 0.510254f, 0.603516f, 0.511230f, 0.601562f,
+ 0.512207f, 0.600098f, 0.514160f, 0.598145f, 0.515137f, 0.596191f, 0.515625f, 0.594238f,
+ 0.516602f, 0.592285f, 0.517090f, 0.590820f, 0.518555f, 0.588867f, 0.519531f, 0.586426f,
+ 0.520020f, 0.584473f, 0.520996f, 0.582520f, 0.522461f, 0.579590f, 0.522949f, 0.577148f,
+ 0.523926f, 0.574707f, 0.524414f, 0.572266f, 0.525879f, 0.569336f, 0.525879f, 0.566406f,
+ 0.526367f, 0.563477f, 0.527344f, 0.560059f, 0.528320f, 0.556152f, 0.528320f, 0.552734f,
+ 0.528809f, 0.548340f, 0.530273f, 0.543457f, 0.530762f, 0.538574f, 0.530762f, 0.533203f,
+ 0.530762f, 0.526855f, 0.529297f, 0.518555f, 0.526855f, 0.509277f, 0.524414f, 0.499512f,
+ 0.520020f, 0.487549f, 0.511719f, 0.469727f, 0.488525f, 0.440674f, 0.360596f, 0.333252f,
+ 0.000000f, 1.000000f, 0.381592f, 0.835449f, 0.429199f, 0.770020f, 0.453125f, 0.729492f,
+ 0.471191f, 0.700684f, 0.483643f, 0.679199f, 0.491699f, 0.663086f, 0.500488f, 0.649414f,
+ 0.508789f, 0.637207f, 0.515137f, 0.626953f, 0.521973f, 0.618164f, 0.527344f, 0.610352f,
+ 0.533691f, 0.603027f, 0.537598f, 0.597168f, 0.542969f, 0.591309f, 0.546387f, 0.585938f,
+ 0.550293f, 0.581543f, 0.554199f, 0.576660f, 0.558594f, 0.572266f, 0.562500f, 0.567871f,
+ 0.566895f, 0.563965f, 0.569824f, 0.560059f, 0.572266f, 0.556641f, 0.576172f, 0.552734f,
+ 0.579102f, 0.549316f, 0.583008f, 0.545898f, 0.585938f, 0.541992f, 0.589844f, 0.538574f,
+ 0.592285f, 0.535156f, 0.595215f, 0.531738f, 0.598145f, 0.528320f, 0.602051f, 0.524414f,
+ 0.604004f, 0.520996f, 0.607910f, 0.517578f, 0.610352f, 0.513672f, 0.613281f, 0.510254f,
+ 0.616699f, 0.506348f, 0.619141f, 0.502441f, 0.622070f, 0.498535f, 0.625000f, 0.494629f,
+ 0.627930f, 0.490479f, 0.631836f, 0.485840f, 0.633789f, 0.481689f, 0.636719f, 0.477051f,
+ 0.640625f, 0.472168f, 0.643066f, 0.467285f, 0.645508f, 0.462158f, 0.649902f, 0.456787f,
+ 0.651367f, 0.451416f, 0.655273f, 0.445312f, 0.658203f, 0.439209f, 0.662598f, 0.432129f,
+ 0.665039f, 0.425049f, 0.668457f, 0.417725f, 0.671387f, 0.409424f, 0.674805f, 0.400879f,
+ 0.678223f, 0.391113f, 0.680664f, 0.379883f, 0.682129f, 0.366455f, 0.685059f, 0.351562f,
+ 0.687012f, 0.334473f, 0.685547f, 0.311768f, 0.678711f, 0.278320f, 0.605957f, 0.190186f,
+ 0.000000f, 1.000000f, 0.394043f, 0.830566f, 0.449463f, 0.758789f, 0.477539f, 0.715332f,
+ 0.499023f, 0.682129f, 0.514648f, 0.657715f, 0.526855f, 0.638184f, 0.539062f, 0.621582f,
+ 0.550293f, 0.605957f, 0.558594f, 0.593262f, 0.567871f, 0.582031f, 0.575684f, 0.571777f,
+ 0.583496f, 0.562500f, 0.590820f, 0.554199f, 0.597168f, 0.546387f, 0.602539f, 0.539062f,
+ 0.609863f, 0.532227f, 0.616211f, 0.525391f, 0.619629f, 0.519531f, 0.626465f, 0.513184f,
+ 0.631348f, 0.507324f, 0.636230f, 0.501953f, 0.641602f, 0.496582f, 0.645996f, 0.491455f,
+ 0.651367f, 0.486084f, 0.655273f, 0.480713f, 0.661133f, 0.475342f, 0.665039f, 0.470459f,
+ 0.668457f, 0.465576f, 0.673340f, 0.460449f, 0.678223f, 0.455322f, 0.682617f, 0.450439f,
+ 0.686035f, 0.445068f, 0.690430f, 0.439941f, 0.694824f, 0.434814f, 0.698242f, 0.429688f,
+ 0.703125f, 0.424316f, 0.707031f, 0.418945f, 0.710449f, 0.413818f, 0.714844f, 0.407959f,
+ 0.719238f, 0.402344f, 0.722656f, 0.396729f, 0.726562f, 0.390869f, 0.730957f, 0.384766f,
+ 0.733887f, 0.378662f, 0.738770f, 0.372314f, 0.743164f, 0.365723f, 0.746582f, 0.358887f,
+ 0.750977f, 0.351562f, 0.753906f, 0.344482f, 0.759766f, 0.336670f, 0.763184f, 0.328613f,
+ 0.767578f, 0.320312f, 0.771484f, 0.311279f, 0.773926f, 0.302246f, 0.779297f, 0.291992f,
+ 0.784180f, 0.281250f, 0.789062f, 0.269287f, 0.790527f, 0.254639f, 0.793945f, 0.239136f,
+ 0.797852f, 0.221680f, 0.799316f, 0.200806f, 0.797852f, 0.170166f, 0.754395f, 0.103760f,
+ 0.000000f, 1.000000f, 0.409668f, 0.823730f, 0.468018f, 0.749512f, 0.502930f, 0.700195f,
+ 0.527832f, 0.663574f, 0.546387f, 0.635742f, 0.562012f, 0.612793f, 0.576660f, 0.593262f,
+ 0.589844f, 0.575684f, 0.602051f, 0.560059f, 0.612305f, 0.546387f, 0.621582f, 0.534180f,
+ 0.632324f, 0.522461f, 0.640137f, 0.512207f, 0.647949f, 0.502441f, 0.655273f, 0.493652f,
+ 0.663574f, 0.484863f, 0.670898f, 0.476318f, 0.677246f, 0.468750f, 0.683105f, 0.461426f,
+ 0.690430f, 0.453857f, 0.695312f, 0.447021f, 0.702148f, 0.439697f, 0.707520f, 0.433105f,
+ 0.712891f, 0.426514f, 0.719238f, 0.419922f, 0.724121f, 0.413574f, 0.729492f, 0.407471f,
+ 0.733887f, 0.401367f, 0.738770f, 0.395020f, 0.745117f, 0.388672f, 0.749512f, 0.382568f,
+ 0.754883f, 0.376465f, 0.758789f, 0.370361f, 0.762695f, 0.364258f, 0.767578f, 0.358398f,
+ 0.770996f, 0.352295f, 0.776855f, 0.345947f, 0.779785f, 0.339600f, 0.784180f, 0.333252f,
+ 0.790039f, 0.326904f, 0.791992f, 0.320557f, 0.797363f, 0.313965f, 0.800781f, 0.307373f,
+ 0.804688f, 0.300537f, 0.809082f, 0.293457f, 0.812988f, 0.286621f, 0.817383f, 0.279297f,
+ 0.821777f, 0.271729f, 0.824219f, 0.264404f, 0.828613f, 0.256348f, 0.832520f, 0.248291f,
+ 0.836426f, 0.239868f, 0.839844f, 0.230957f, 0.843750f, 0.221924f, 0.849121f, 0.211670f,
+ 0.852539f, 0.201416f, 0.856445f, 0.190674f, 0.858398f, 0.177979f, 0.860840f, 0.163818f,
+ 0.864746f, 0.148438f, 0.868164f, 0.130615f, 0.866211f, 0.106384f, 0.838867f, 0.061279f,
+ 0.000000f, 1.000000f, 0.422363f, 0.818848f, 0.489502f, 0.738281f, 0.526855f, 0.686035f,
+ 0.556152f, 0.645508f, 0.579102f, 0.613770f, 0.597168f, 0.587891f, 0.611816f, 0.566406f,
+ 0.627930f, 0.545898f, 0.642578f, 0.527832f, 0.654297f, 0.512207f, 0.665527f, 0.497803f,
+ 0.675293f, 0.484619f, 0.685547f, 0.472656f, 0.694336f, 0.461182f, 0.704590f, 0.450439f,
+ 0.712402f, 0.440186f, 0.719727f, 0.430664f, 0.727051f, 0.421631f, 0.732910f, 0.413086f,
+ 0.740723f, 0.404297f, 0.747070f, 0.395996f, 0.752441f, 0.388428f, 0.759277f, 0.380371f,
+ 0.765625f, 0.372803f, 0.771484f, 0.365479f, 0.777832f, 0.358643f, 0.781250f, 0.351562f,
+ 0.787109f, 0.344482f, 0.791992f, 0.337646f, 0.797363f, 0.330811f, 0.801758f, 0.324219f,
+ 0.806152f, 0.317383f, 0.811035f, 0.311035f, 0.814453f, 0.304688f, 0.819336f, 0.298096f,
+ 0.823730f, 0.291504f, 0.827637f, 0.284912f, 0.833008f, 0.278320f, 0.835449f, 0.271973f,
+ 0.839844f, 0.265381f, 0.843262f, 0.259033f, 0.848145f, 0.252197f, 0.851074f, 0.245605f,
+ 0.854492f, 0.238892f, 0.857422f, 0.232178f, 0.861816f, 0.225220f, 0.865234f, 0.218140f,
+ 0.868652f, 0.210815f, 0.873047f, 0.203491f, 0.874512f, 0.196411f, 0.879395f, 0.188599f,
+ 0.881836f, 0.180908f, 0.885254f, 0.172607f, 0.888672f, 0.164551f, 0.892090f, 0.155640f,
+ 0.894531f, 0.146973f, 0.898438f, 0.137207f, 0.900879f, 0.127197f, 0.902344f, 0.114807f,
+ 0.904785f, 0.101868f, 0.906250f, 0.087952f, 0.906250f, 0.069458f, 0.888184f, 0.036011f,
+ 0.000000f, 1.000000f, 0.438232f, 0.812012f, 0.507324f, 0.728516f, 0.552246f, 0.670898f,
+ 0.583496f, 0.627441f, 0.609375f, 0.592773f, 0.629395f, 0.564453f, 0.646484f, 0.540039f,
+ 0.665527f, 0.517090f, 0.679199f, 0.497803f, 0.691895f, 0.479736f, 0.705078f, 0.463867f,
+ 0.715820f, 0.448975f, 0.726562f, 0.435547f, 0.735352f, 0.422852f, 0.745117f, 0.410889f,
+ 0.753906f, 0.399658f, 0.761230f, 0.389160f, 0.769043f, 0.379150f, 0.777832f, 0.369141f,
+ 0.783203f, 0.359863f, 0.790039f, 0.351074f, 0.795898f, 0.342773f, 0.802246f, 0.334229f,
+ 0.807129f, 0.326416f, 0.812988f, 0.318359f, 0.819336f, 0.310791f, 0.823730f, 0.303467f,
+ 0.829102f, 0.295898f, 0.833008f, 0.289062f, 0.838379f, 0.281982f, 0.842285f, 0.275146f,
+ 0.845703f, 0.268555f, 0.850098f, 0.261719f, 0.854004f, 0.255127f, 0.859375f, 0.248535f,
+ 0.862793f, 0.241821f, 0.865723f, 0.235596f, 0.869141f, 0.229248f, 0.874512f, 0.222778f,
+ 0.875977f, 0.216553f, 0.879883f, 0.210327f, 0.882324f, 0.204224f, 0.887695f, 0.197388f,
+ 0.889648f, 0.190918f, 0.891602f, 0.184692f, 0.896484f, 0.178101f, 0.897949f, 0.171753f,
+ 0.901367f, 0.165283f, 0.903809f, 0.158813f, 0.907227f, 0.152100f, 0.909180f, 0.145386f,
+ 0.912598f, 0.138184f, 0.915039f, 0.130981f, 0.917480f, 0.123840f, 0.919922f, 0.116577f,
+ 0.922852f, 0.108826f, 0.925293f, 0.101257f, 0.927246f, 0.092834f, 0.930176f, 0.082581f,
+ 0.930176f, 0.071960f, 0.931152f, 0.060883f, 0.930664f, 0.047760f, 0.918457f, 0.024490f,
+ 0.000000f, 1.000000f, 0.449463f, 0.807617f, 0.528809f, 0.717773f, 0.575684f, 0.656738f,
+ 0.611328f, 0.609863f, 0.638184f, 0.572754f, 0.660645f, 0.541504f, 0.678711f, 0.515137f,
+ 0.697754f, 0.490723f, 0.712891f, 0.469238f, 0.727539f, 0.449463f, 0.740723f, 0.432129f,
+ 0.750977f, 0.416504f, 0.761719f, 0.401611f, 0.772461f, 0.387695f, 0.781738f, 0.375000f,
+ 0.789062f, 0.363281f, 0.797363f, 0.351807f, 0.803711f, 0.341309f, 0.812500f, 0.330811f,
+ 0.818359f, 0.321045f, 0.823242f, 0.312012f, 0.830566f, 0.303223f, 0.836914f, 0.294434f,
+ 0.842285f, 0.285889f, 0.846680f, 0.278076f, 0.851562f, 0.270264f, 0.855957f, 0.262939f,
+ 0.861328f, 0.255371f, 0.864258f, 0.248535f, 0.868652f, 0.241455f, 0.873535f, 0.234497f,
+ 0.876953f, 0.227905f, 0.881348f, 0.221313f, 0.884766f, 0.214600f, 0.886719f, 0.208618f,
+ 0.891113f, 0.202271f, 0.894043f, 0.196289f, 0.896484f, 0.190186f, 0.900879f, 0.183960f,
+ 0.903320f, 0.177979f, 0.906250f, 0.171875f, 0.909180f, 0.165894f, 0.911621f, 0.160278f,
+ 0.914551f, 0.154297f, 0.915527f, 0.148926f, 0.918945f, 0.142822f, 0.920898f, 0.137207f,
+ 0.924805f, 0.130981f, 0.926270f, 0.125000f, 0.929688f, 0.119019f, 0.930664f, 0.113159f,
+ 0.932617f, 0.107483f, 0.934570f, 0.101440f, 0.937500f, 0.095215f, 0.939453f, 0.088989f,
+ 0.941895f, 0.082092f, 0.942871f, 0.075867f, 0.945312f, 0.069397f, 0.947266f, 0.061920f,
+ 0.946289f, 0.052948f, 0.948242f, 0.043701f, 0.948242f, 0.034393f, 0.938965f, 0.016373f,
+ 0.000000f, 1.000000f, 0.463867f, 0.801758f, 0.547852f, 0.708008f, 0.599609f, 0.642578f,
+ 0.638184f, 0.592773f, 0.665039f, 0.553223f, 0.689941f, 0.519531f, 0.710449f, 0.490967f,
+ 0.728027f, 0.465820f, 0.744629f, 0.442383f, 0.758301f, 0.422119f, 0.771484f, 0.403564f,
+ 0.782715f, 0.386719f, 0.792969f, 0.371094f, 0.802734f, 0.356689f, 0.812012f, 0.343506f,
+ 0.820801f, 0.330811f, 0.828125f, 0.319092f, 0.834473f, 0.308105f, 0.841797f, 0.297607f,
+ 0.847656f, 0.287598f, 0.853027f, 0.278076f, 0.858398f, 0.269287f, 0.863770f, 0.260254f,
+ 0.867676f, 0.252197f, 0.873535f, 0.244141f, 0.876465f, 0.236694f, 0.883301f, 0.228882f,
+ 0.885742f, 0.221680f, 0.890137f, 0.214478f, 0.893066f, 0.207764f, 0.896484f, 0.201172f,
+ 0.899902f, 0.194946f, 0.903320f, 0.188599f, 0.907715f, 0.182251f, 0.909180f, 0.176392f,
+ 0.913574f, 0.170166f, 0.916016f, 0.164429f, 0.917969f, 0.158813f, 0.920410f, 0.153076f,
+ 0.921875f, 0.147827f, 0.924316f, 0.142212f, 0.927734f, 0.136841f, 0.930664f, 0.131226f,
+ 0.932129f, 0.125977f, 0.934082f, 0.120850f, 0.936523f, 0.115540f, 0.937988f, 0.110474f,
+ 0.939453f, 0.105469f, 0.942871f, 0.099854f, 0.944336f, 0.094666f, 0.945312f, 0.089844f,
+ 0.947266f, 0.084778f, 0.949219f, 0.079468f, 0.951172f, 0.074036f, 0.953125f, 0.068726f,
+ 0.954102f, 0.063660f, 0.955566f, 0.058319f, 0.957520f, 0.052643f, 0.958984f, 0.047333f,
+ 0.958496f, 0.039642f, 0.958984f, 0.032715f, 0.958496f, 0.024780f, 0.951660f, 0.011436f,
+ 0.000000f, 1.000000f, 0.478760f, 0.795898f, 0.568359f, 0.697266f, 0.622559f, 0.629395f,
+ 0.663574f, 0.576172f, 0.692871f, 0.534180f, 0.716309f, 0.499512f, 0.738281f, 0.468994f,
+ 0.753906f, 0.443359f, 0.772461f, 0.417969f, 0.786621f, 0.396973f, 0.798828f, 0.377686f,
+ 0.809570f, 0.360107f, 0.819824f, 0.343994f, 0.828613f, 0.329590f, 0.838867f, 0.315186f,
+ 0.844727f, 0.302734f, 0.853027f, 0.290527f, 0.858398f, 0.279785f, 0.865234f, 0.268799f,
+ 0.870117f, 0.259033f, 0.876465f, 0.249268f, 0.880859f, 0.240479f, 0.885254f, 0.231812f,
+ 0.890625f, 0.223511f, 0.895020f, 0.215576f, 0.897461f, 0.208130f, 0.902832f, 0.200439f,
+ 0.905762f, 0.193604f, 0.908691f, 0.186890f, 0.912598f, 0.180420f, 0.915039f, 0.173950f,
+ 0.918945f, 0.167480f, 0.920898f, 0.161621f, 0.924316f, 0.155640f, 0.925293f, 0.150146f,
+ 0.927246f, 0.144897f, 0.930664f, 0.139282f, 0.933594f, 0.133911f, 0.935059f, 0.128662f,
+ 0.937500f, 0.123474f, 0.938965f, 0.118591f, 0.940430f, 0.114014f, 0.944336f, 0.108765f,
+ 0.945312f, 0.104004f, 0.946777f, 0.099304f, 0.948730f, 0.094604f, 0.949707f, 0.090149f,
+ 0.951660f, 0.085510f, 0.953613f, 0.080872f, 0.954590f, 0.076599f, 0.956543f, 0.072083f,
+ 0.958008f, 0.067444f, 0.958984f, 0.063171f, 0.960938f, 0.058807f, 0.962402f, 0.054291f,
+ 0.963867f, 0.049805f, 0.964844f, 0.045593f, 0.966797f, 0.040741f, 0.967285f, 0.036530f,
+ 0.967773f, 0.031097f, 0.966797f, 0.024765f, 0.967285f, 0.018341f, 0.962402f, 0.008820f,
+ 0.000000f, 1.000000f, 0.492676f, 0.790039f, 0.588379f, 0.687500f, 0.645020f, 0.616211f,
+ 0.687500f, 0.560547f, 0.718750f, 0.516602f, 0.742188f, 0.480469f, 0.762207f, 0.449219f,
+ 0.778320f, 0.422119f, 0.796875f, 0.396240f, 0.809570f, 0.374756f, 0.822266f, 0.354492f,
+ 0.832031f, 0.336914f, 0.843750f, 0.320068f, 0.852051f, 0.304932f, 0.859375f, 0.291016f,
+ 0.867188f, 0.278076f, 0.872070f, 0.266357f, 0.878906f, 0.254883f, 0.884277f, 0.244263f,
+ 0.890137f, 0.234375f, 0.894043f, 0.224976f, 0.899902f, 0.215820f, 0.903320f, 0.207397f,
+ 0.906250f, 0.199463f, 0.911621f, 0.191650f, 0.914062f, 0.184326f, 0.918457f, 0.177124f,
+ 0.920898f, 0.170288f, 0.924316f, 0.163574f, 0.926270f, 0.157715f, 0.930176f, 0.151367f,
+ 0.931152f, 0.145752f, 0.934082f, 0.140015f, 0.937500f, 0.134155f, 0.938965f, 0.128906f,
+ 0.939941f, 0.124146f, 0.942871f, 0.119141f, 0.945312f, 0.113770f, 0.946777f, 0.109009f,
+ 0.948242f, 0.104431f, 0.949707f, 0.099915f, 0.951172f, 0.095520f, 0.953613f, 0.091064f,
+ 0.955078f, 0.086731f, 0.956543f, 0.082520f, 0.958496f, 0.078186f, 0.959961f, 0.074097f,
+ 0.960449f, 0.070374f, 0.962402f, 0.066345f, 0.962891f, 0.062439f, 0.964844f, 0.058472f,
+ 0.965820f, 0.054626f, 0.967773f, 0.050842f, 0.968262f, 0.047089f, 0.968262f, 0.043762f,
+ 0.971191f, 0.039612f, 0.972168f, 0.035767f, 0.972168f, 0.032410f, 0.973633f, 0.028854f,
+ 0.975586f, 0.025055f, 0.973633f, 0.019211f, 0.972656f, 0.014503f, 0.969727f, 0.006020f,
+ 0.000000f, 1.000000f, 0.505859f, 0.785156f, 0.607422f, 0.677734f, 0.666016f, 0.604004f,
+ 0.708496f, 0.546387f, 0.739746f, 0.500488f, 0.764648f, 0.463135f, 0.785645f, 0.430664f,
+ 0.802734f, 0.402344f, 0.818359f, 0.376953f, 0.831543f, 0.354248f, 0.842773f, 0.333984f,
+ 0.852051f, 0.316162f, 0.861328f, 0.299072f, 0.870117f, 0.283936f, 0.876953f, 0.270264f,
+ 0.884766f, 0.257080f, 0.890137f, 0.244873f, 0.894531f, 0.234009f, 0.900391f, 0.223267f,
+ 0.905273f, 0.213379f, 0.910645f, 0.203857f, 0.912598f, 0.195435f, 0.917480f, 0.187012f,
+ 0.920898f, 0.179199f, 0.924805f, 0.171509f, 0.927734f, 0.164185f, 0.930176f, 0.157349f,
+ 0.931641f, 0.151367f, 0.936523f, 0.144897f, 0.938965f, 0.138428f, 0.940430f, 0.132812f,
+ 0.942871f, 0.127319f, 0.944336f, 0.122131f, 0.946289f, 0.117065f, 0.948730f, 0.111877f,
+ 0.950684f, 0.107056f, 0.952637f, 0.102173f, 0.954590f, 0.097595f, 0.955078f, 0.093506f,
+ 0.957031f, 0.089172f, 0.958496f, 0.085022f, 0.960449f, 0.080627f, 0.960938f, 0.076782f,
+ 0.963379f, 0.072754f, 0.963379f, 0.069153f, 0.964844f, 0.065613f, 0.965820f, 0.062195f,
+ 0.968262f, 0.058228f, 0.969238f, 0.054504f, 0.969727f, 0.051331f, 0.970703f, 0.048309f,
+ 0.971680f, 0.044830f, 0.973145f, 0.041443f, 0.973633f, 0.038269f, 0.974609f, 0.035187f,
+ 0.975586f, 0.032166f, 0.977051f, 0.028854f, 0.977051f, 0.026123f, 0.978027f, 0.022934f,
+ 0.978516f, 0.020386f, 0.979004f, 0.015579f, 0.977051f, 0.010773f, 0.974121f, 0.005226f,
+ 0.000000f, 1.000000f, 0.520020f, 0.779297f, 0.625488f, 0.668457f, 0.686035f, 0.591797f,
+ 0.730469f, 0.532227f, 0.761719f, 0.485596f, 0.785645f, 0.447021f, 0.805664f, 0.414062f,
+ 0.822266f, 0.385010f, 0.836914f, 0.359375f, 0.850586f, 0.335938f, 0.860352f, 0.316162f,
+ 0.871094f, 0.297363f, 0.878418f, 0.280762f, 0.884766f, 0.266113f, 0.893066f, 0.251465f,
+ 0.898926f, 0.238647f, 0.903809f, 0.226807f, 0.910156f, 0.215576f, 0.914551f, 0.204956f,
+ 0.917969f, 0.195435f, 0.921875f, 0.186523f, 0.926270f, 0.177612f, 0.930176f, 0.169312f,
+ 0.931641f, 0.161865f, 0.934570f, 0.155029f, 0.938477f, 0.147461f, 0.940918f, 0.141113f,
+ 0.943359f, 0.134766f, 0.945312f, 0.128784f, 0.947754f, 0.122986f, 0.949219f, 0.117615f,
+ 0.951172f, 0.112488f, 0.953613f, 0.107239f, 0.954590f, 0.102478f, 0.957031f, 0.097656f,
+ 0.958496f, 0.093018f, 0.959473f, 0.088867f, 0.960938f, 0.084839f, 0.963379f, 0.080444f,
+ 0.964355f, 0.076538f, 0.964844f, 0.072693f, 0.965820f, 0.069031f, 0.967285f, 0.065613f,
+ 0.969238f, 0.061798f, 0.969727f, 0.058472f, 0.970215f, 0.055420f, 0.971680f, 0.052094f,
+ 0.973145f, 0.048706f, 0.973633f, 0.045746f, 0.975098f, 0.042938f, 0.975098f, 0.040100f,
+ 0.976562f, 0.037048f, 0.977539f, 0.033997f, 0.978027f, 0.031433f, 0.979004f, 0.028717f,
+ 0.979492f, 0.026321f, 0.979980f, 0.023834f, 0.981934f, 0.020721f, 0.982422f, 0.018433f,
+ 0.981934f, 0.016449f, 0.983398f, 0.013855f, 0.980957f, 0.008705f, 0.980469f, 0.004063f,
+ 0.000000f, 1.000000f, 0.535156f, 0.773438f, 0.644043f, 0.659180f, 0.706055f, 0.580078f,
+ 0.750000f, 0.519531f, 0.780273f, 0.471680f, 0.804199f, 0.432129f, 0.823242f, 0.398682f,
+ 0.838867f, 0.369629f, 0.852539f, 0.343994f, 0.866211f, 0.320312f, 0.875977f, 0.299805f,
+ 0.884766f, 0.281494f, 0.893066f, 0.264893f, 0.900391f, 0.249756f, 0.906250f, 0.235596f,
+ 0.911621f, 0.223022f, 0.916504f, 0.211060f, 0.921875f, 0.199829f, 0.923828f, 0.190063f,
+ 0.929688f, 0.179932f, 0.932129f, 0.171387f, 0.936523f, 0.162720f, 0.938965f, 0.154785f,
+ 0.941895f, 0.147339f, 0.944336f, 0.140381f, 0.947266f, 0.133423f, 0.948730f, 0.127197f,
+ 0.951172f, 0.121277f, 0.953613f, 0.115417f, 0.955078f, 0.110168f, 0.957520f, 0.104614f,
+ 0.958984f, 0.099731f, 0.959473f, 0.095154f, 0.961426f, 0.090515f, 0.962891f, 0.085938f,
+ 0.964355f, 0.081665f, 0.965820f, 0.077637f, 0.966309f, 0.073914f, 0.967773f, 0.070068f,
+ 0.969238f, 0.066284f, 0.970215f, 0.062805f, 0.971191f, 0.059540f, 0.972656f, 0.056152f,
+ 0.973633f, 0.053009f, 0.974121f, 0.049957f, 0.975586f, 0.046997f, 0.976074f, 0.044128f,
+ 0.977539f, 0.041229f, 0.978027f, 0.038483f, 0.978516f, 0.036041f, 0.979980f, 0.033295f,
+ 0.979980f, 0.030838f, 0.980469f, 0.028625f, 0.981934f, 0.026169f, 0.982910f, 0.023605f,
+ 0.983398f, 0.021332f, 0.983398f, 0.019470f, 0.983887f, 0.017426f, 0.984863f, 0.015488f,
+ 0.985840f, 0.013283f, 0.986328f, 0.010986f, 0.984375f, 0.006939f, 0.981934f, 0.003538f,
+ 0.000000f, 1.000000f, 0.548828f, 0.768555f, 0.661621f, 0.650391f, 0.725586f, 0.569336f,
+ 0.766602f, 0.508301f, 0.797363f, 0.459473f, 0.820801f, 0.418945f, 0.839844f, 0.385010f,
+ 0.854980f, 0.355957f, 0.867676f, 0.330078f, 0.879883f, 0.306396f, 0.889160f, 0.285889f,
+ 0.898438f, 0.267334f, 0.904785f, 0.250732f, 0.910645f, 0.235718f, 0.916992f, 0.221680f,
+ 0.921875f, 0.209106f, 0.926270f, 0.197754f, 0.931152f, 0.186401f, 0.934082f, 0.176514f,
+ 0.937988f, 0.166992f, 0.941406f, 0.158081f, 0.943848f, 0.150024f, 0.946289f, 0.142334f,
+ 0.948730f, 0.135132f, 0.951660f, 0.128052f, 0.953125f, 0.121704f, 0.955566f, 0.115723f,
+ 0.957520f, 0.109985f, 0.959473f, 0.104126f, 0.960938f, 0.099060f, 0.962402f, 0.094055f,
+ 0.963379f, 0.089600f, 0.966309f, 0.084717f, 0.967285f, 0.080261f, 0.967773f, 0.076294f,
+ 0.969727f, 0.072327f, 0.969727f, 0.068726f, 0.972168f, 0.064880f, 0.973145f, 0.061188f,
+ 0.974121f, 0.057922f, 0.974121f, 0.054871f, 0.975098f, 0.051880f, 0.976562f, 0.048798f,
+ 0.978027f, 0.045563f, 0.978516f, 0.042725f, 0.978516f, 0.040375f, 0.979004f, 0.037994f,
+ 0.980469f, 0.035339f, 0.980957f, 0.032776f, 0.982422f, 0.030334f, 0.982422f, 0.028046f,
+ 0.982910f, 0.025955f, 0.983398f, 0.023926f, 0.983887f, 0.021973f, 0.984863f, 0.019989f,
+ 0.985352f, 0.018112f, 0.985352f, 0.016388f, 0.987305f, 0.013885f, 0.987305f, 0.012360f,
+ 0.987793f, 0.010902f, 0.988281f, 0.009369f, 0.986816f, 0.006710f, 0.985840f, 0.001877f,
+ 0.000000f, 1.000000f, 0.562988f, 0.762695f, 0.678223f, 0.642090f, 0.741699f, 0.559570f,
+ 0.783203f, 0.497314f, 0.812988f, 0.447998f, 0.835449f, 0.407227f, 0.854004f, 0.372803f,
+ 0.868164f, 0.343262f, 0.880859f, 0.317871f, 0.891602f, 0.293945f, 0.900879f, 0.273682f,
+ 0.908691f, 0.254883f, 0.914551f, 0.238892f, 0.921875f, 0.223022f, 0.926270f, 0.210083f,
+ 0.931152f, 0.197144f, 0.934570f, 0.185669f, 0.938477f, 0.175049f, 0.942871f, 0.164917f,
+ 0.945801f, 0.155640f, 0.947754f, 0.147339f, 0.950684f, 0.139160f, 0.953613f, 0.131592f,
+ 0.956543f, 0.124329f, 0.957520f, 0.117981f, 0.959473f, 0.111755f, 0.961914f, 0.105652f,
+ 0.962891f, 0.100098f, 0.964844f, 0.095093f, 0.966797f, 0.089722f, 0.967773f, 0.085022f,
+ 0.968750f, 0.080566f, 0.970215f, 0.076233f, 0.971680f, 0.072083f, 0.972168f, 0.068298f,
+ 0.973633f, 0.064453f, 0.974609f, 0.060883f, 0.975586f, 0.057495f, 0.976562f, 0.054291f,
+ 0.977539f, 0.051178f, 0.978027f, 0.047974f, 0.978516f, 0.045166f, 0.979004f, 0.042542f,
+ 0.979980f, 0.039948f, 0.980957f, 0.037354f, 0.981934f, 0.034882f, 0.982910f, 0.032227f,
+ 0.982910f, 0.030167f, 0.983887f, 0.027924f, 0.983887f, 0.026093f, 0.984375f, 0.024246f,
+ 0.985840f, 0.022125f, 0.986328f, 0.020248f, 0.987305f, 0.018341f, 0.987793f, 0.016449f,
+ 0.987793f, 0.014763f, 0.988281f, 0.013397f, 0.988281f, 0.012009f, 0.988770f, 0.010773f,
+ 0.989258f, 0.009399f, 0.989746f, 0.008026f, 0.991699f, 0.005917f, 0.987793f, 0.001071f,
+ 0.000000f, 1.000000f, 0.575684f, 0.758301f, 0.693359f, 0.634766f, 0.759766f, 0.549316f,
+ 0.798828f, 0.487305f, 0.828613f, 0.436768f, 0.850098f, 0.395996f, 0.866211f, 0.362061f,
+ 0.879883f, 0.332275f, 0.892090f, 0.306396f, 0.902344f, 0.283447f, 0.911621f, 0.262207f,
+ 0.919434f, 0.244019f, 0.923828f, 0.227783f, 0.929199f, 0.212891f, 0.934082f, 0.199341f,
+ 0.938477f, 0.186768f, 0.942871f, 0.175293f, 0.945801f, 0.165039f, 0.949219f, 0.154907f,
+ 0.951172f, 0.146240f, 0.955078f, 0.137451f, 0.956543f, 0.129639f, 0.958008f, 0.122681f,
+ 0.961426f, 0.115417f, 0.962891f, 0.109009f, 0.963867f, 0.103271f, 0.966797f, 0.097107f,
+ 0.967285f, 0.091858f, 0.968750f, 0.086914f, 0.969727f, 0.082153f, 0.972168f, 0.077209f,
+ 0.973145f, 0.072998f, 0.973145f, 0.069153f, 0.974609f, 0.065186f, 0.975586f, 0.061493f,
+ 0.977051f, 0.057739f, 0.978027f, 0.054382f, 0.978516f, 0.051208f, 0.979004f, 0.048309f,
+ 0.980469f, 0.045410f, 0.980957f, 0.042603f, 0.982422f, 0.039703f, 0.982910f, 0.037048f,
+ 0.982910f, 0.034851f, 0.983887f, 0.032562f, 0.984375f, 0.030258f, 0.984863f, 0.028229f,
+ 0.984863f, 0.026443f, 0.985840f, 0.024445f, 0.987305f, 0.022339f, 0.987305f, 0.020264f,
+ 0.987793f, 0.018524f, 0.987793f, 0.017059f, 0.988281f, 0.015625f, 0.988770f, 0.014076f,
+ 0.988770f, 0.012947f, 0.989258f, 0.011665f, 0.990234f, 0.010193f, 0.990723f, 0.008965f,
+ 0.991211f, 0.007645f, 0.992188f, 0.005848f, 0.992188f, 0.005161f, 0.988770f, 0.001506f,
+ 0.000000f, 1.000000f, 0.589844f, 0.752441f, 0.709961f, 0.626953f, 0.773438f, 0.541016f,
+ 0.813477f, 0.478271f, 0.841797f, 0.427002f, 0.863281f, 0.385742f, 0.878418f, 0.351562f,
+ 0.891602f, 0.322266f, 0.900391f, 0.296875f, 0.911621f, 0.273438f, 0.919434f, 0.252686f,
+ 0.926270f, 0.234741f, 0.931641f, 0.218384f, 0.937500f, 0.203369f, 0.941895f, 0.189941f,
+ 0.944824f, 0.177979f, 0.948242f, 0.166626f, 0.951172f, 0.156372f, 0.955078f, 0.146362f,
+ 0.957520f, 0.137817f, 0.959473f, 0.129395f, 0.961914f, 0.121643f, 0.962891f, 0.114868f,
+ 0.966309f, 0.107666f, 0.967285f, 0.101440f, 0.968262f, 0.095825f, 0.970215f, 0.090271f,
+ 0.972168f, 0.084656f, 0.973145f, 0.079895f, 0.973633f, 0.075623f, 0.976074f, 0.070984f,
+ 0.977051f, 0.066589f, 0.977539f, 0.062805f, 0.978027f, 0.059235f, 0.979492f, 0.055542f,
+ 0.979492f, 0.052399f, 0.979980f, 0.049225f, 0.980957f, 0.046204f, 0.982910f, 0.042938f,
+ 0.982910f, 0.040192f, 0.982910f, 0.037842f, 0.983398f, 0.035522f, 0.984375f, 0.033234f,
+ 0.984863f, 0.030853f, 0.985352f, 0.028793f, 0.986328f, 0.026642f, 0.987305f, 0.024460f,
+ 0.987793f, 0.022522f, 0.988281f, 0.020676f, 0.988281f, 0.019165f, 0.988770f, 0.017807f,
+ 0.989258f, 0.016266f, 0.989258f, 0.014915f, 0.989746f, 0.013550f, 0.990234f, 0.012337f,
+ 0.990723f, 0.011070f, 0.991211f, 0.009644f, 0.992188f, 0.008110f, 0.992676f, 0.006832f,
+ 0.992676f, 0.005985f, 0.993164f, 0.005234f, 0.992676f, 0.004589f, 0.990234f, 0.001586f,
+ 0.000000f, 1.000000f, 0.604492f, 0.747070f, 0.725586f, 0.618652f, 0.786621f, 0.533203f,
+ 0.825684f, 0.469482f, 0.853516f, 0.418701f, 0.874512f, 0.376953f, 0.889648f, 0.342773f,
+ 0.899902f, 0.313477f, 0.910156f, 0.288086f, 0.919434f, 0.265137f, 0.927734f, 0.244629f,
+ 0.933594f, 0.226318f, 0.939453f, 0.209961f, 0.943359f, 0.195435f, 0.947754f, 0.181885f,
+ 0.950195f, 0.170044f, 0.953613f, 0.158813f, 0.957031f, 0.148560f, 0.958984f, 0.139282f,
+ 0.961914f, 0.130371f, 0.964355f, 0.122192f, 0.965820f, 0.114807f, 0.968262f, 0.107727f,
+ 0.969727f, 0.101196f, 0.970703f, 0.095093f, 0.972656f, 0.089294f, 0.973633f, 0.083923f,
+ 0.974121f, 0.079163f, 0.976562f, 0.074036f, 0.977539f, 0.069397f, 0.978027f, 0.065369f,
+ 0.978516f, 0.061584f, 0.979492f, 0.057892f, 0.980957f, 0.054077f, 0.981934f, 0.050568f,
+ 0.982910f, 0.047394f, 0.982910f, 0.044495f, 0.983887f, 0.041565f, 0.983887f, 0.039093f,
+ 0.984863f, 0.036469f, 0.985352f, 0.034149f, 0.986328f, 0.031769f, 0.987305f, 0.029266f,
+ 0.987793f, 0.027008f, 0.987793f, 0.025208f, 0.988770f, 0.023285f, 0.988770f, 0.021530f,
+ 0.989258f, 0.019943f, 0.989258f, 0.018494f, 0.989258f, 0.017151f, 0.989746f, 0.015549f,
+ 0.990234f, 0.014198f, 0.990723f, 0.013031f, 0.991699f, 0.011574f, 0.992676f, 0.009941f,
+ 0.992676f, 0.008720f, 0.993164f, 0.007805f, 0.993164f, 0.006783f, 0.993164f, 0.006134f,
+ 0.993652f, 0.005295f, 0.993164f, 0.004807f, 0.993652f, 0.004078f, 0.992188f, 0.002140f,
+ 0.000000f, 1.000000f, 0.615723f, 0.742676f, 0.740234f, 0.611816f, 0.800293f, 0.525879f,
+ 0.838379f, 0.461670f, 0.865234f, 0.410400f, 0.884277f, 0.368896f, 0.898438f, 0.334229f,
+ 0.909668f, 0.305176f, 0.918457f, 0.280029f, 0.924805f, 0.258057f, 0.933594f, 0.237061f,
+ 0.939453f, 0.219116f, 0.944824f, 0.202637f, 0.949219f, 0.188232f, 0.952637f, 0.174927f,
+ 0.956055f, 0.163086f, 0.958496f, 0.151978f, 0.960938f, 0.142212f, 0.963867f, 0.132446f,
+ 0.965332f, 0.124207f, 0.968262f, 0.116150f, 0.970215f, 0.108582f, 0.970703f, 0.101929f,
+ 0.972656f, 0.095459f, 0.973633f, 0.089661f, 0.976074f, 0.083679f, 0.976562f, 0.078613f,
+ 0.977051f, 0.073792f, 0.978516f, 0.069153f, 0.979004f, 0.064941f, 0.980957f, 0.060699f,
+ 0.981445f, 0.056763f, 0.982422f, 0.053040f, 0.982910f, 0.049683f, 0.983398f, 0.046600f,
+ 0.983398f, 0.043884f, 0.984863f, 0.040741f, 0.985352f, 0.038025f, 0.985840f, 0.035522f,
+ 0.987305f, 0.032745f, 0.987793f, 0.030273f, 0.987793f, 0.028259f, 0.988281f, 0.026230f,
+ 0.988281f, 0.024521f, 0.989258f, 0.022552f, 0.989258f, 0.020935f, 0.989746f, 0.019379f,
+ 0.989746f, 0.017990f, 0.990723f, 0.016296f, 0.991211f, 0.014885f, 0.991699f, 0.013512f,
+ 0.993164f, 0.011826f, 0.993164f, 0.010445f, 0.993164f, 0.009438f, 0.993164f, 0.008598f,
+ 0.993652f, 0.007557f, 0.993164f, 0.006863f, 0.993652f, 0.006081f, 0.993652f, 0.005436f,
+ 0.994141f, 0.004818f, 0.994141f, 0.004261f, 0.994629f, 0.003578f, 0.995117f, 0.002644f,
+ 0.000000f, 1.000000f, 0.629395f, 0.737793f, 0.752930f, 0.605469f, 0.813965f, 0.518555f,
+ 0.849121f, 0.454590f, 0.875488f, 0.403076f, 0.892578f, 0.362061f, 0.906738f, 0.327393f,
+ 0.916504f, 0.298340f, 0.924805f, 0.273193f, 0.931152f, 0.251465f, 0.938477f, 0.230835f,
+ 0.944824f, 0.212524f, 0.949707f, 0.196533f, 0.953613f, 0.182129f, 0.957031f, 0.169067f,
+ 0.960449f, 0.157104f, 0.962891f, 0.146118f, 0.965332f, 0.136353f, 0.967285f, 0.127075f,
+ 0.970215f, 0.118469f, 0.971191f, 0.110779f, 0.972656f, 0.103638f, 0.975098f, 0.096741f,
+ 0.976074f, 0.090332f, 0.976562f, 0.084778f, 0.978516f, 0.079163f, 0.979004f, 0.074158f,
+ 0.980469f, 0.069519f, 0.981934f, 0.064453f, 0.982422f, 0.060425f, 0.982422f, 0.056763f,
+ 0.983887f, 0.052856f, 0.983887f, 0.049622f, 0.984375f, 0.046478f, 0.985352f, 0.043304f,
+ 0.986328f, 0.040039f, 0.987305f, 0.037018f, 0.987305f, 0.034515f, 0.987793f, 0.032166f,
+ 0.988281f, 0.029816f, 0.988281f, 0.027847f, 0.988770f, 0.025894f, 0.989258f, 0.023972f,
+ 0.989746f, 0.022125f, 0.989746f, 0.020569f, 0.990234f, 0.018951f, 0.991211f, 0.017181f,
+ 0.991699f, 0.015602f, 0.992676f, 0.013878f, 0.993164f, 0.012512f, 0.993164f, 0.011253f,
+ 0.993164f, 0.010269f, 0.993164f, 0.009407f, 0.993652f, 0.008347f, 0.993652f, 0.007614f,
+ 0.994141f, 0.006866f, 0.994141f, 0.006104f, 0.994141f, 0.005589f, 0.994629f, 0.004826f,
+ 0.994629f, 0.004421f, 0.994629f, 0.003727f, 0.995117f, 0.003061f, 0.996094f, 0.001978f,
+ 0.000000f, 1.000000f, 0.642578f, 0.732422f, 0.764648f, 0.600098f, 0.824707f, 0.511719f,
+ 0.859375f, 0.447510f, 0.884766f, 0.396240f, 0.900879f, 0.355225f, 0.913574f, 0.320801f,
+ 0.923828f, 0.292236f, 0.932129f, 0.266846f, 0.937988f, 0.244995f, 0.944824f, 0.225098f,
+ 0.950684f, 0.206787f, 0.954590f, 0.190918f, 0.957520f, 0.176758f, 0.961914f, 0.163330f,
+ 0.963867f, 0.151855f, 0.966797f, 0.140991f, 0.969238f, 0.131104f, 0.970703f, 0.122192f,
+ 0.972168f, 0.114014f, 0.974609f, 0.105957f, 0.975586f, 0.098938f, 0.976562f, 0.092407f,
+ 0.978027f, 0.086365f, 0.979492f, 0.080505f, 0.980957f, 0.074890f, 0.981445f, 0.070007f,
+ 0.982422f, 0.065308f, 0.982910f, 0.061188f, 0.983398f, 0.057220f, 0.984375f, 0.053375f,
+ 0.985352f, 0.049652f, 0.986816f, 0.046021f, 0.987305f, 0.042847f, 0.987793f, 0.039642f,
+ 0.987793f, 0.037048f, 0.988281f, 0.034515f, 0.988770f, 0.032074f, 0.989258f, 0.029770f,
+ 0.989258f, 0.027756f, 0.989746f, 0.025757f, 0.990723f, 0.023697f, 0.990723f, 0.021866f,
+ 0.991211f, 0.020111f, 0.992676f, 0.018082f, 0.993164f, 0.016220f, 0.993164f, 0.014832f,
+ 0.993652f, 0.013557f, 0.993652f, 0.012260f, 0.993164f, 0.011230f, 0.993164f, 0.010330f,
+ 0.993652f, 0.009224f, 0.993652f, 0.008430f, 0.994141f, 0.007618f, 0.994141f, 0.006821f,
+ 0.994141f, 0.006241f, 0.994629f, 0.005444f, 0.994629f, 0.004955f, 0.995117f, 0.004230f,
+ 0.995605f, 0.003597f, 0.996094f, 0.002962f, 0.996582f, 0.002153f, 0.998047f, 0.000076f,
+ 0.000000f, 1.000000f, 0.656250f, 0.727539f, 0.777832f, 0.593750f, 0.834961f, 0.505859f,
+ 0.867188f, 0.442139f, 0.892578f, 0.390625f, 0.909180f, 0.349121f, 0.920898f, 0.314941f,
+ 0.930176f, 0.286133f, 0.937988f, 0.261230f, 0.943848f, 0.239380f, 0.947754f, 0.220459f,
+ 0.954102f, 0.201904f, 0.958008f, 0.186035f, 0.961426f, 0.171753f, 0.964355f, 0.159058f,
+ 0.967285f, 0.147217f, 0.969727f, 0.136475f, 0.971680f, 0.127075f, 0.974121f, 0.117554f,
+ 0.974609f, 0.109863f, 0.976562f, 0.102051f, 0.977539f, 0.095276f, 0.979980f, 0.088318f,
+ 0.980469f, 0.082275f, 0.981934f, 0.076599f, 0.981934f, 0.071655f, 0.982422f, 0.067078f,
+ 0.983887f, 0.062256f, 0.984375f, 0.058136f, 0.986816f, 0.053680f, 0.986816f, 0.049805f,
+ 0.987305f, 0.046387f, 0.987793f, 0.043274f, 0.988281f, 0.040161f, 0.988281f, 0.037445f,
+ 0.988770f, 0.034882f, 0.989258f, 0.032318f, 0.989746f, 0.029938f, 0.990234f, 0.027786f,
+ 0.990723f, 0.025589f, 0.991699f, 0.023407f, 0.992676f, 0.021225f, 0.993164f, 0.019241f,
+ 0.993164f, 0.017578f, 0.993164f, 0.016159f, 0.993164f, 0.014908f, 0.993652f, 0.013474f,
+ 0.993652f, 0.012375f, 0.993652f, 0.011398f, 0.994141f, 0.010223f, 0.994141f, 0.009369f,
+ 0.994629f, 0.008430f, 0.994629f, 0.007622f, 0.994629f, 0.006977f, 0.995117f, 0.006115f,
+ 0.995117f, 0.005562f, 0.995605f, 0.004791f, 0.995605f, 0.004181f, 0.995605f, 0.003626f,
+ 0.996094f, 0.002935f, 0.997070f, 0.002024f, 0.998535f, 0.000397f, 0.998535f, 0.000006f,
+ 0.000000f, 1.000000f, 0.666504f, 0.724121f, 0.788574f, 0.588379f, 0.843262f, 0.500977f,
+ 0.877930f, 0.436035f, 0.899414f, 0.385498f, 0.916504f, 0.343506f, 0.926758f, 0.309814f,
+ 0.935059f, 0.281006f, 0.942871f, 0.256104f, 0.948242f, 0.234741f, 0.951660f, 0.215820f,
+ 0.957520f, 0.197632f, 0.961426f, 0.181763f, 0.965820f, 0.167236f, 0.967285f, 0.154785f,
+ 0.969727f, 0.143188f, 0.972168f, 0.132690f, 0.973633f, 0.123047f, 0.975586f, 0.114258f,
+ 0.977051f, 0.106201f, 0.979004f, 0.098389f, 0.979980f, 0.091492f, 0.980957f, 0.085144f,
+ 0.981934f, 0.079346f, 0.982910f, 0.073853f, 0.983887f, 0.068665f, 0.985352f, 0.063660f,
+ 0.986328f, 0.058899f, 0.986328f, 0.054962f, 0.987305f, 0.050934f, 0.987305f, 0.047577f,
+ 0.987793f, 0.044281f, 0.988770f, 0.041046f, 0.988770f, 0.038208f, 0.989746f, 0.035400f,
+ 0.990234f, 0.032684f, 0.990723f, 0.030228f, 0.991211f, 0.027832f, 0.992676f, 0.025070f,
+ 0.992676f, 0.023010f, 0.992676f, 0.021240f, 0.993164f, 0.019363f, 0.993164f, 0.017838f,
+ 0.993164f, 0.016464f, 0.993652f, 0.014946f, 0.993652f, 0.013748f, 0.994141f, 0.012566f,
+ 0.994141f, 0.011406f, 0.994141f, 0.010460f, 0.994629f, 0.009399f, 0.994629f, 0.008545f,
+ 0.995117f, 0.007713f, 0.995117f, 0.006878f, 0.995605f, 0.006264f, 0.995605f, 0.005421f,
+ 0.996094f, 0.004692f, 0.996094f, 0.004135f, 0.996582f, 0.003399f, 0.997070f, 0.002676f,
+ 0.998047f, 0.001649f, 0.999023f, 0.000408f, 0.998535f, 0.000095f, 0.998535f, 0.000002f,
+ 0.000000f, 1.000000f, 0.678711f, 0.719727f, 0.797852f, 0.583984f, 0.852539f, 0.495850f,
+ 0.885254f, 0.430664f, 0.905273f, 0.381104f, 0.920898f, 0.339111f, 0.933594f, 0.304688f,
+ 0.940430f, 0.276123f, 0.947266f, 0.251465f, 0.951660f, 0.230225f, 0.956055f, 0.211060f,
+ 0.959473f, 0.194458f, 0.964355f, 0.178223f, 0.966797f, 0.164062f, 0.970703f, 0.150879f,
+ 0.972168f, 0.139648f, 0.974609f, 0.129395f, 0.975586f, 0.119934f, 0.978516f, 0.110535f,
+ 0.979492f, 0.102722f, 0.980469f, 0.095398f, 0.981934f, 0.088684f, 0.982422f, 0.082458f,
+ 0.984375f, 0.076416f, 0.985352f, 0.070618f, 0.985840f, 0.065613f, 0.986328f, 0.061005f,
+ 0.986816f, 0.056763f, 0.987793f, 0.052643f, 0.987793f, 0.049042f, 0.988281f, 0.045593f,
+ 0.989258f, 0.042145f, 0.989746f, 0.039093f, 0.990723f, 0.036041f, 0.991211f, 0.033112f,
+ 0.992188f, 0.030197f, 0.992676f, 0.027649f, 0.992676f, 0.025482f, 0.992676f, 0.023560f,
+ 0.993164f, 0.021576f, 0.993164f, 0.019882f, 0.993164f, 0.018372f, 0.993652f, 0.016724f,
+ 0.993652f, 0.015396f, 0.994141f, 0.014038f, 0.994141f, 0.012810f, 0.994141f, 0.011765f,
+ 0.994629f, 0.010559f, 0.994629f, 0.009636f, 0.995117f, 0.008606f, 0.995117f, 0.007786f,
+ 0.995605f, 0.006866f, 0.995605f, 0.006161f, 0.996094f, 0.005302f, 0.996582f, 0.004539f,
+ 0.997070f, 0.003866f, 0.997559f, 0.002981f, 0.998535f, 0.002029f, 0.999023f, 0.000865f,
+ 0.999023f, 0.000441f, 0.999023f, 0.000191f, 0.999023f, 0.000049f, 0.999023f, 0.000001f,
+ 0.000000f, 1.000000f, 0.690430f, 0.715332f, 0.810547f, 0.578125f, 0.862793f, 0.490479f,
+ 0.893066f, 0.425781f, 0.912109f, 0.375977f, 0.926758f, 0.334717f, 0.937988f, 0.300537f,
+ 0.944824f, 0.271973f, 0.950684f, 0.247803f, 0.955566f, 0.226196f, 0.959473f, 0.207275f,
+ 0.962402f, 0.190918f, 0.966797f, 0.175171f, 0.970703f, 0.160767f, 0.972656f, 0.148071f,
+ 0.975098f, 0.136597f, 0.977539f, 0.125854f, 0.979004f, 0.116455f, 0.980469f, 0.107910f,
+ 0.980957f, 0.100342f, 0.982422f, 0.092896f, 0.984863f, 0.085815f, 0.985352f, 0.079346f,
+ 0.986328f, 0.073547f, 0.986328f, 0.068542f, 0.987305f, 0.063538f, 0.987793f, 0.059021f,
+ 0.988770f, 0.054810f, 0.988770f, 0.050903f, 0.989258f, 0.047211f, 0.990723f, 0.043518f,
+ 0.991211f, 0.040039f, 0.992676f, 0.036438f, 0.992676f, 0.033600f, 0.992676f, 0.031097f,
+ 0.993164f, 0.028549f, 0.993164f, 0.026398f, 0.993652f, 0.024277f, 0.993652f, 0.022354f,
+ 0.993652f, 0.020660f, 0.994141f, 0.018860f, 0.994141f, 0.017365f, 0.994629f, 0.015823f,
+ 0.994629f, 0.014488f, 0.995117f, 0.013275f, 0.995117f, 0.011963f, 0.994629f, 0.010948f,
+ 0.995117f, 0.009758f, 0.995117f, 0.008873f, 0.995605f, 0.007801f, 0.996094f, 0.006859f,
+ 0.996094f, 0.006077f, 0.996582f, 0.005161f, 0.997070f, 0.004276f, 0.997559f, 0.003401f,
+ 0.999023f, 0.001995f, 0.999023f, 0.001288f, 0.999023f, 0.000843f, 0.999023f, 0.000522f,
+ 0.999023f, 0.000289f, 0.999023f, 0.000129f, 0.999023f, 0.000033f, 0.999023f, 0.000001f,
+ 0.000000f, 1.000000f, 0.701172f, 0.711426f, 0.819824f, 0.573730f, 0.870605f, 0.485840f,
+ 0.899902f, 0.421143f, 0.918457f, 0.371582f, 0.931641f, 0.330811f, 0.941895f, 0.296631f,
+ 0.949219f, 0.268311f, 0.955078f, 0.243896f, 0.959961f, 0.222290f, 0.962402f, 0.204102f,
+ 0.966309f, 0.187256f, 0.967773f, 0.172729f, 0.972168f, 0.158203f, 0.975586f, 0.145142f,
+ 0.977051f, 0.133789f, 0.978516f, 0.123657f, 0.980469f, 0.114197f, 0.982422f, 0.105774f,
+ 0.983887f, 0.097412f, 0.984863f, 0.089966f, 0.985840f, 0.083374f, 0.985840f, 0.077515f,
+ 0.986816f, 0.071838f, 0.987305f, 0.066711f, 0.988281f, 0.061737f, 0.988770f, 0.057281f,
+ 0.989746f, 0.052856f, 0.990723f, 0.048767f, 0.992188f, 0.044464f, 0.992188f, 0.041077f,
+ 0.992676f, 0.037842f, 0.992676f, 0.035034f, 0.993164f, 0.032318f, 0.993164f, 0.029831f,
+ 0.993164f, 0.027634f, 0.993652f, 0.025330f, 0.993652f, 0.023407f, 0.994141f, 0.021408f,
+ 0.994141f, 0.019714f, 0.994629f, 0.017975f, 0.994629f, 0.016479f, 0.995117f, 0.014969f,
+ 0.995117f, 0.013657f, 0.995605f, 0.012306f, 0.995605f, 0.011162f, 0.996094f, 0.009933f,
+ 0.996094f, 0.008965f, 0.996582f, 0.007835f, 0.997070f, 0.006775f, 0.997559f, 0.005753f,
+ 0.998047f, 0.004738f, 0.999512f, 0.003304f, 0.999512f, 0.002398f, 0.999512f, 0.001793f,
+ 0.999512f, 0.001323f, 0.999512f, 0.000946f, 0.999512f, 0.000644f, 0.999023f, 0.000407f,
+ 0.999023f, 0.000228f, 0.999023f, 0.000102f, 0.999023f, 0.000026f, 0.999023f, 0.000000f,
+ 0.000000f, 1.000000f, 0.710938f, 0.708008f, 0.827148f, 0.570312f, 0.877930f, 0.481689f,
+ 0.906738f, 0.416992f, 0.923340f, 0.367920f, 0.936035f, 0.327637f, 0.945312f, 0.293701f,
+ 0.953125f, 0.264893f, 0.958008f, 0.240601f, 0.962402f, 0.219482f, 0.965820f, 0.200684f,
+ 0.967773f, 0.184570f, 0.970215f, 0.170044f, 0.974121f, 0.155762f, 0.976074f, 0.143188f,
+ 0.978027f, 0.131836f, 0.979980f, 0.121582f, 0.982910f, 0.111572f, 0.983887f, 0.103027f,
+ 0.984375f, 0.095459f, 0.985352f, 0.088318f, 0.986328f, 0.081848f, 0.986816f, 0.075867f,
+ 0.987793f, 0.070190f, 0.989258f, 0.064880f, 0.989746f, 0.059814f, 0.991699f, 0.054657f,
+ 0.991699f, 0.050476f, 0.992188f, 0.046570f, 0.992188f, 0.043121f, 0.992676f, 0.039795f,
+ 0.992676f, 0.036835f, 0.993164f, 0.033936f, 0.993164f, 0.031403f, 0.993652f, 0.028870f,
+ 0.993652f, 0.026672f, 0.994141f, 0.024445f, 0.994141f, 0.022522f, 0.994629f, 0.020538f,
+ 0.994629f, 0.018875f, 0.995117f, 0.017120f, 0.995117f, 0.015671f, 0.995605f, 0.014099f,
+ 0.996094f, 0.012665f, 0.996094f, 0.011436f, 0.996582f, 0.010109f, 0.997070f, 0.008842f,
+ 0.997559f, 0.007633f, 0.998535f, 0.006374f, 0.999512f, 0.004787f, 0.999512f, 0.003801f,
+ 0.999512f, 0.003057f, 0.999512f, 0.002445f, 0.999512f, 0.001927f, 0.999512f, 0.001488f,
+ 0.999512f, 0.001117f, 0.999512f, 0.000807f, 0.999512f, 0.000552f, 0.999512f, 0.000350f,
+ 0.999512f, 0.000195f, 0.999512f, 0.000086f, 0.999512f, 0.000022f, 0.999023f, 0.000000f,
+ 0.000000f, 1.000000f, 0.723633f, 0.703125f, 0.836426f, 0.565918f, 0.885254f, 0.477539f,
+ 0.911621f, 0.414062f, 0.928223f, 0.364258f, 0.939453f, 0.324707f, 0.949219f, 0.290283f,
+ 0.956055f, 0.261719f, 0.960938f, 0.237671f, 0.964844f, 0.216431f, 0.967773f, 0.198242f,
+ 0.971191f, 0.181396f, 0.972656f, 0.167114f, 0.974121f, 0.154297f, 0.977539f, 0.141602f,
+ 0.980957f, 0.129395f, 0.982422f, 0.119141f, 0.983398f, 0.109924f, 0.984375f, 0.101562f,
+ 0.985352f, 0.093933f, 0.986328f, 0.086853f, 0.987793f, 0.080200f, 0.988281f, 0.074097f,
+ 0.990723f, 0.067688f, 0.991211f, 0.062347f, 0.991211f, 0.057709f, 0.991699f, 0.053284f,
+ 0.992188f, 0.049255f, 0.992188f, 0.045624f, 0.992676f, 0.042114f, 0.992676f, 0.039001f,
+ 0.993164f, 0.035919f, 0.993652f, 0.033112f, 0.993652f, 0.030533f, 0.994141f, 0.028030f,
+ 0.994141f, 0.025833f, 0.994629f, 0.023590f, 0.995117f, 0.021576f, 0.995117f, 0.019699f,
+ 0.995605f, 0.017838f, 0.996094f, 0.016129f, 0.996094f, 0.014595f, 0.996582f, 0.013008f,
+ 0.997070f, 0.011490f, 0.998047f, 0.009964f, 0.999023f, 0.008308f, 0.999512f, 0.006680f,
+ 0.999512f, 0.005608f, 0.999512f, 0.004719f, 0.999512f, 0.003952f, 0.999512f, 0.003284f,
+ 0.999512f, 0.002697f, 0.999512f, 0.002180f, 0.999512f, 0.001732f, 0.999512f, 0.001344f,
+ 0.999512f, 0.001011f, 0.999512f, 0.000731f, 0.999512f, 0.000501f, 0.999512f, 0.000316f,
+ 0.999512f, 0.000176f, 0.999512f, 0.000078f, 0.999512f, 0.000019f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.732422f, 0.700195f, 0.843750f, 0.562500f, 0.891113f, 0.474854f,
+ 0.915527f, 0.411133f, 0.933105f, 0.360840f, 0.943359f, 0.321533f, 0.953125f, 0.287354f,
+ 0.959961f, 0.259033f, 0.963867f, 0.234863f, 0.967773f, 0.213867f, 0.971191f, 0.195190f,
+ 0.972656f, 0.179321f, 0.974121f, 0.165161f, 0.977539f, 0.151367f, 0.978027f, 0.139893f,
+ 0.980469f, 0.128662f, 0.982422f, 0.118286f, 0.983887f, 0.108887f, 0.984863f, 0.100525f,
+ 0.986328f, 0.092590f, 0.988281f, 0.085022f, 0.989746f, 0.077881f, 0.990234f, 0.071838f,
+ 0.990723f, 0.066345f, 0.991211f, 0.061340f, 0.991699f, 0.056702f, 0.991699f, 0.052582f,
+ 0.992188f, 0.048523f, 0.992676f, 0.044769f, 0.993164f, 0.041321f, 0.993164f, 0.038177f,
+ 0.993652f, 0.035095f, 0.994141f, 0.032257f, 0.994141f, 0.029739f, 0.994629f, 0.027176f,
+ 0.995117f, 0.024796f, 0.995605f, 0.022568f, 0.996094f, 0.020493f, 0.996582f, 0.018524f,
+ 0.997070f, 0.016556f, 0.997559f, 0.014664f, 0.998535f, 0.012726f, 0.999512f, 0.010612f,
+ 0.999512f, 0.009163f, 0.999512f, 0.007950f, 0.999512f, 0.006893f, 0.999512f, 0.005947f,
+ 0.999512f, 0.005100f, 0.999512f, 0.004341f, 0.999512f, 0.003664f, 0.999512f, 0.003057f,
+ 0.999512f, 0.002520f, 0.999512f, 0.002043f, 0.999512f, 0.001624f, 0.999512f, 0.001261f,
+ 0.999512f, 0.000949f, 0.999512f, 0.000686f, 0.999512f, 0.000469f, 0.999512f, 0.000296f,
+ 0.999512f, 0.000164f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.740234f, 0.697754f, 0.851074f, 0.559082f, 0.896973f, 0.471191f,
+ 0.921387f, 0.407471f, 0.937988f, 0.357666f, 0.947754f, 0.318115f, 0.955078f, 0.285645f,
+ 0.961426f, 0.256836f, 0.967285f, 0.231934f, 0.970215f, 0.211304f, 0.972656f, 0.193237f,
+ 0.976074f, 0.176636f, 0.977051f, 0.162231f, 0.978027f, 0.149658f, 0.979004f, 0.138306f,
+ 0.979980f, 0.128052f, 0.982422f, 0.117981f, 0.984863f, 0.107910f, 0.987793f, 0.098267f,
+ 0.988770f, 0.090393f, 0.989258f, 0.083374f, 0.989746f, 0.077026f, 0.990234f, 0.071167f,
+ 0.990723f, 0.065796f, 0.991211f, 0.060822f, 0.991699f, 0.056152f, 0.992188f, 0.051849f,
+ 0.992676f, 0.047821f, 0.993164f, 0.044037f, 0.993652f, 0.040527f, 0.994141f, 0.037231f,
+ 0.994629f, 0.034149f, 0.995117f, 0.031250f, 0.995605f, 0.028503f, 0.996094f, 0.025894f,
+ 0.996582f, 0.023407f, 0.997559f, 0.020950f, 0.998535f, 0.018417f, 0.999512f, 0.015823f,
+ 0.999512f, 0.013985f, 0.999512f, 0.012398f, 0.999512f, 0.010979f, 0.999512f, 0.009697f,
+ 0.999512f, 0.008537f, 0.999512f, 0.007484f, 0.999512f, 0.006527f, 0.999512f, 0.005657f,
+ 0.999512f, 0.004868f, 0.999512f, 0.004150f, 0.999512f, 0.003510f, 0.999512f, 0.002932f,
+ 0.999512f, 0.002417f, 0.999512f, 0.001961f, 0.999512f, 0.001559f, 0.999512f, 0.001210f,
+ 0.999512f, 0.000911f, 0.999512f, 0.000658f, 0.999512f, 0.000449f, 0.999512f, 0.000283f,
+ 0.999512f, 0.000157f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.751465f, 0.693359f, 0.859863f, 0.555176f, 0.903320f, 0.467529f,
+ 0.927246f, 0.403809f, 0.939453f, 0.355957f, 0.951660f, 0.314941f, 0.957031f, 0.283203f,
+ 0.961914f, 0.255859f, 0.968262f, 0.230835f, 0.972656f, 0.209229f, 0.975586f, 0.190430f,
+ 0.977051f, 0.174683f, 0.978027f, 0.160767f, 0.979492f, 0.148071f, 0.981445f, 0.136230f,
+ 0.983887f, 0.124878f, 0.983887f, 0.115601f, 0.983887f, 0.107361f, 0.985840f, 0.099121f,
+ 0.987305f, 0.090942f, 0.988281f, 0.083740f, 0.989258f, 0.077148f, 0.990234f, 0.071106f,
+ 0.990723f, 0.065613f, 0.991699f, 0.060394f, 0.992188f, 0.055634f, 0.992676f, 0.051239f,
+ 0.993652f, 0.046967f, 0.994141f, 0.043091f, 0.995117f, 0.039368f, 0.995605f, 0.035858f,
+ 0.996582f, 0.032440f, 0.998047f, 0.029053f, 0.999512f, 0.025375f, 0.999512f, 0.022705f,
+ 0.999512f, 0.020432f, 0.999512f, 0.018387f, 0.999512f, 0.016541f, 0.999512f, 0.014847f,
+ 0.999512f, 0.013298f, 0.999512f, 0.011871f, 0.999512f, 0.010567f, 0.999512f, 0.009369f,
+ 0.999512f, 0.008263f, 0.999512f, 0.007259f, 0.999512f, 0.006340f, 0.999512f, 0.005501f,
+ 0.999512f, 0.004734f, 0.999512f, 0.004044f, 0.999512f, 0.003420f, 0.999512f, 0.002857f,
+ 0.999512f, 0.002356f, 0.999512f, 0.001912f, 0.999512f, 0.001520f, 0.999512f, 0.001180f,
+ 0.999512f, 0.000887f, 0.999512f, 0.000641f, 0.999512f, 0.000437f, 0.999512f, 0.000275f,
+ 0.999512f, 0.000152f, 0.999512f, 0.000067f, 0.999512f, 0.000016f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.756836f, 0.691406f, 0.863770f, 0.553711f, 0.907715f, 0.465332f,
+ 0.929688f, 0.402100f, 0.943848f, 0.353027f, 0.952637f, 0.313721f, 0.960449f, 0.281006f,
+ 0.968262f, 0.250977f, 0.968262f, 0.229614f, 0.968262f, 0.211304f, 0.976074f, 0.190552f,
+ 0.983887f, 0.170166f, 0.983887f, 0.156006f, 0.983887f, 0.143921f, 0.983887f, 0.133179f,
+ 0.983887f, 0.123535f, 0.983887f, 0.114746f, 0.983887f, 0.106750f, 0.983887f, 0.099426f,
+ 0.983887f, 0.092773f, 0.983887f, 0.086609f, 0.983887f, 0.080994f, 0.983887f, 0.075806f,
+ 0.987793f, 0.069763f, 0.993652f, 0.060974f, 0.999512f, 0.051910f, 0.999512f, 0.046509f,
+ 0.999512f, 0.042175f, 0.999512f, 0.038361f, 0.999512f, 0.034943f, 0.999512f, 0.031860f,
+ 0.999512f, 0.029022f, 0.999512f, 0.026413f, 0.999512f, 0.024017f, 0.999512f, 0.021790f,
+ 0.999512f, 0.019745f, 0.999512f, 0.017853f, 0.999512f, 0.016113f, 0.999512f, 0.014496f,
+ 0.999512f, 0.013008f, 0.999512f, 0.011635f, 0.999512f, 0.010361f, 0.999512f, 0.009193f,
+ 0.999512f, 0.008125f, 0.999512f, 0.007137f, 0.999512f, 0.006237f, 0.999512f, 0.005413f,
+ 0.999512f, 0.004662f, 0.999512f, 0.003983f, 0.999512f, 0.003368f, 0.999512f, 0.002815f,
+ 0.999512f, 0.002321f, 0.999512f, 0.001884f, 0.999512f, 0.001498f, 0.999512f, 0.001163f,
+ 0.999512f, 0.000875f, 0.999512f, 0.000631f, 0.999512f, 0.000431f, 0.999512f, 0.000271f,
+ 0.999512f, 0.000150f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.990723f,
+ 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.987305f,
+ 0.000000f, 0.986328f, 0.000000f, 0.984863f, 0.000000f, 0.981934f, 0.000000f, 0.980957f,
+ 0.000000f, 0.978516f, 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.967285f,
+ 0.000000f, 0.961426f, 0.000000f, 0.954590f, 0.000000f, 0.944824f, 0.000000f, 0.931641f,
+ 0.000000f, 0.908203f, 0.000000f, 0.867188f, 0.000000f, 0.773438f, 0.000000f, 0.395264f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996094f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f,
+ 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f,
+ 0.000000f, 0.985840f, 0.000000f, 0.984375f, 0.000000f, 0.982422f, 0.000000f, 0.980469f,
+ 0.000000f, 0.978027f, 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.967285f,
+ 0.000000f, 0.961914f, 0.000000f, 0.954590f, 0.000000f, 0.944824f, 0.000000f, 0.930176f,
+ 0.000000f, 0.908203f, 0.000000f, 0.867188f, 0.000000f, 0.772461f, 0.000000f, 0.395264f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.994141f, 0.000000f, 0.993652f,
+ 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f,
+ 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f,
+ 0.000000f, 0.985352f, 0.000000f, 0.983887f, 0.000000f, 0.982910f, 0.000000f, 0.979980f,
+ 0.000000f, 0.978027f, 0.000000f, 0.975098f, 0.000000f, 0.971191f, 0.000000f, 0.966797f,
+ 0.000000f, 0.961426f, 0.000000f, 0.954102f, 0.000000f, 0.944336f, 0.000000f, 0.929688f,
+ 0.000000f, 0.907227f, 0.000000f, 0.866699f, 0.000007f, 0.771973f, 0.000007f, 0.395020f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f,
+ 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f,
+ 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f,
+ 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.979980f,
+ 0.000000f, 0.977051f, 0.000000f, 0.974609f, 0.000000f, 0.971191f, 0.000000f, 0.966309f,
+ 0.000000f, 0.960938f, 0.000000f, 0.953613f, 0.000000f, 0.943848f, 0.000000f, 0.929199f,
+ 0.000027f, 0.906250f, 0.000030f, 0.865723f, 0.000028f, 0.770508f, 0.000042f, 0.395264f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f,
+ 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f,
+ 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.981445f, 0.000000f, 0.980469f,
+ 0.000000f, 0.976562f, 0.000000f, 0.973633f, 0.000000f, 0.970703f, 0.000000f, 0.965820f,
+ 0.000000f, 0.960449f, 0.000011f, 0.952637f, 0.000085f, 0.942871f, 0.000094f, 0.928223f,
+ 0.000083f, 0.904785f, 0.000068f, 0.864746f, 0.000085f, 0.769043f, 0.000143f, 0.394531f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.991211f, 0.000000f, 0.990234f,
+ 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985840f,
+ 0.000000f, 0.984863f, 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.979004f,
+ 0.000000f, 0.976562f, 0.000000f, 0.973633f, 0.000036f, 0.969727f, 0.000143f, 0.964844f,
+ 0.000211f, 0.959473f, 0.000218f, 0.951660f, 0.000199f, 0.940918f, 0.000170f, 0.926758f,
+ 0.000165f, 0.903320f, 0.000172f, 0.862305f, 0.000219f, 0.767090f, 0.000369f, 0.394043f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f,
+ 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, 0.000000f, 0.989746f,
+ 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.987305f, 0.000000f, 0.985840f,
+ 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000035f, 0.980469f, 0.000132f, 0.978027f,
+ 0.000258f, 0.976074f, 0.000380f, 0.972168f, 0.000413f, 0.968750f, 0.000406f, 0.964355f,
+ 0.000374f, 0.958008f, 0.000326f, 0.951172f, 0.000273f, 0.939453f, 0.000341f, 0.924805f,
+ 0.000342f, 0.901855f, 0.000384f, 0.859863f, 0.000487f, 0.764160f, 0.000772f, 0.392578f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f,
+ 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988770f,
+ 0.000000f, 0.988281f, 0.000006f, 0.987305f, 0.000080f, 0.986328f, 0.000190f, 0.984863f,
+ 0.000316f, 0.983887f, 0.000461f, 0.981934f, 0.000606f, 0.979004f, 0.000681f, 0.977051f,
+ 0.000690f, 0.974609f, 0.000648f, 0.971680f, 0.000608f, 0.967285f, 0.000543f, 0.962891f,
+ 0.000481f, 0.956055f, 0.000492f, 0.949219f, 0.000596f, 0.937988f, 0.000579f, 0.922363f,
+ 0.000662f, 0.898438f, 0.000751f, 0.856445f, 0.000961f, 0.760254f, 0.001400f, 0.392578f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f,
+ 0.000005f, 0.991211f, 0.000077f, 0.990234f, 0.000188f, 0.989258f, 0.000316f, 0.988281f,
+ 0.000443f, 0.987793f, 0.000595f, 0.986328f, 0.000732f, 0.984863f, 0.000886f, 0.984375f,
+ 0.001008f, 0.982910f, 0.001045f, 0.980957f, 0.001004f, 0.978516f, 0.000961f, 0.976074f,
+ 0.000883f, 0.973633f, 0.000809f, 0.970215f, 0.000729f, 0.965820f, 0.000723f, 0.960938f,
+ 0.000833f, 0.955078f, 0.000936f, 0.946777f, 0.000917f, 0.935059f, 0.001021f, 0.920410f,
+ 0.001133f, 0.895508f, 0.001343f, 0.853027f, 0.001729f, 0.756348f, 0.002285f, 0.390869f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000017f, 0.994141f,
+ 0.000104f, 0.994141f, 0.000227f, 0.993652f, 0.000355f, 0.992676f, 0.000498f, 0.991211f,
+ 0.000638f, 0.990234f, 0.000788f, 0.989746f, 0.000919f, 0.988770f, 0.001076f, 0.988281f,
+ 0.001208f, 0.986816f, 0.001350f, 0.985352f, 0.001450f, 0.984375f, 0.001418f, 0.983398f,
+ 0.001376f, 0.981934f, 0.001293f, 0.979980f, 0.001182f, 0.977539f, 0.001104f, 0.974609f,
+ 0.001014f, 0.972168f, 0.001039f, 0.968750f, 0.001159f, 0.964844f, 0.001252f, 0.958984f,
+ 0.001333f, 0.953125f, 0.001381f, 0.943848f, 0.001481f, 0.932617f, 0.001649f, 0.916992f,
+ 0.001859f, 0.891602f, 0.002237f, 0.848633f, 0.002926f, 0.751953f, 0.003462f, 0.389648f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000040f, 0.995605f, 0.000153f, 0.995117f,
+ 0.000294f, 0.994629f, 0.000424f, 0.994141f, 0.000585f, 0.994141f, 0.000718f, 0.994141f,
+ 0.000878f, 0.993652f, 0.001019f, 0.993164f, 0.001146f, 0.991699f, 0.001303f, 0.990723f,
+ 0.001431f, 0.989746f, 0.001550f, 0.989258f, 0.001698f, 0.988281f, 0.001820f, 0.986816f,
+ 0.001854f, 0.985840f, 0.001832f, 0.984863f, 0.001750f, 0.983398f, 0.001624f, 0.981934f,
+ 0.001518f, 0.980469f, 0.001418f, 0.978516f, 0.001394f, 0.976562f, 0.001472f, 0.973633f,
+ 0.001552f, 0.970703f, 0.001670f, 0.966797f, 0.001740f, 0.962402f, 0.001901f, 0.957031f,
+ 0.001957f, 0.950684f, 0.002113f, 0.941406f, 0.002382f, 0.930176f, 0.002567f, 0.913086f,
+ 0.002966f, 0.887695f, 0.003582f, 0.843750f, 0.004570f, 0.747559f, 0.004940f, 0.388672f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000081f, 0.996582f, 0.000211f, 0.996094f, 0.000374f, 0.995605f,
+ 0.000513f, 0.995605f, 0.000685f, 0.995117f, 0.000832f, 0.995117f, 0.000972f, 0.994629f,
+ 0.001134f, 0.994141f, 0.001264f, 0.994141f, 0.001389f, 0.994141f, 0.001542f, 0.993164f,
+ 0.001665f, 0.992676f, 0.001765f, 0.992188f, 0.001908f, 0.991211f, 0.002033f, 0.990723f,
+ 0.002134f, 0.989746f, 0.002230f, 0.988770f, 0.002295f, 0.986816f, 0.002226f, 0.985840f,
+ 0.002102f, 0.985352f, 0.001965f, 0.983398f, 0.001889f, 0.982422f, 0.001858f, 0.980469f,
+ 0.001908f, 0.979004f, 0.002033f, 0.977051f, 0.002071f, 0.975098f, 0.002214f, 0.972168f,
+ 0.002205f, 0.968262f, 0.002514f, 0.964355f, 0.002605f, 0.960449f, 0.002708f, 0.954590f,
+ 0.003017f, 0.947754f, 0.003201f, 0.937988f, 0.003536f, 0.926758f, 0.003925f, 0.908691f,
+ 0.004589f, 0.883301f, 0.005409f, 0.838379f, 0.006878f, 0.741699f, 0.006737f, 0.386963f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000099f, 0.997070f, 0.000259f, 0.997070f, 0.000438f, 0.997070f, 0.000601f, 0.997070f,
+ 0.000766f, 0.996582f, 0.000938f, 0.995605f, 0.001068f, 0.995605f, 0.001227f, 0.995117f,
+ 0.001379f, 0.995117f, 0.001497f, 0.995117f, 0.001614f, 0.994141f, 0.001767f, 0.994141f,
+ 0.001886f, 0.994141f, 0.001980f, 0.993164f, 0.002094f, 0.992676f, 0.002230f, 0.992188f,
+ 0.002335f, 0.991699f, 0.002417f, 0.991211f, 0.002512f, 0.990723f, 0.002642f, 0.990234f,
+ 0.002687f, 0.988770f, 0.002605f, 0.987305f, 0.002457f, 0.986328f, 0.002497f, 0.985352f,
+ 0.002485f, 0.983398f, 0.002590f, 0.982422f, 0.002542f, 0.980957f, 0.002718f, 0.979004f,
+ 0.002718f, 0.977051f, 0.002857f, 0.975098f, 0.002832f, 0.973145f, 0.003160f, 0.970215f,
+ 0.003370f, 0.965820f, 0.003563f, 0.962402f, 0.003788f, 0.958008f, 0.003960f, 0.951660f,
+ 0.004429f, 0.944336f, 0.004601f, 0.935059f, 0.005222f, 0.922363f, 0.005749f, 0.904785f,
+ 0.006695f, 0.877930f, 0.007942f, 0.832031f, 0.009933f, 0.735352f, 0.008850f, 0.385742f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000068f, 0.997559f,
+ 0.000257f, 0.997559f, 0.000426f, 0.997559f, 0.000647f, 0.997559f, 0.000798f, 0.997070f,
+ 0.000993f, 0.997070f, 0.001156f, 0.996582f, 0.001273f, 0.996582f, 0.001439f, 0.996094f,
+ 0.001589f, 0.995605f, 0.001698f, 0.995117f, 0.001786f, 0.995117f, 0.001953f, 0.995117f,
+ 0.002075f, 0.994629f, 0.002165f, 0.994141f, 0.002235f, 0.994141f, 0.002382f, 0.993164f,
+ 0.002499f, 0.992676f, 0.002586f, 0.992676f, 0.002653f, 0.992188f, 0.002747f, 0.991211f,
+ 0.002876f, 0.990723f, 0.002972f, 0.990234f, 0.003042f, 0.989746f, 0.003130f, 0.988770f,
+ 0.003382f, 0.987793f, 0.003345f, 0.986816f, 0.003380f, 0.985352f, 0.003344f, 0.983887f,
+ 0.003481f, 0.982422f, 0.003477f, 0.980957f, 0.003448f, 0.979004f, 0.003578f, 0.977051f,
+ 0.003624f, 0.975098f, 0.003941f, 0.973145f, 0.004395f, 0.971191f, 0.004524f, 0.967773f,
+ 0.004875f, 0.963867f, 0.004910f, 0.959473f, 0.005322f, 0.954590f, 0.005699f, 0.948242f,
+ 0.006184f, 0.940430f, 0.006596f, 0.930664f, 0.007393f, 0.916992f, 0.008186f, 0.898926f,
+ 0.009514f, 0.871582f, 0.011200f, 0.825195f, 0.013855f, 0.728516f, 0.011299f, 0.384277f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000107f, 0.998047f,
+ 0.000353f, 0.998047f, 0.000538f, 0.998047f, 0.000793f, 0.997559f, 0.000947f, 0.997559f,
+ 0.001143f, 0.997559f, 0.001317f, 0.997559f, 0.001431f, 0.997070f, 0.001572f, 0.996582f,
+ 0.001741f, 0.996582f, 0.001854f, 0.996094f, 0.001932f, 0.995605f, 0.002066f, 0.995117f,
+ 0.002211f, 0.995117f, 0.002310f, 0.995117f, 0.002380f, 0.994629f, 0.002445f, 0.994629f,
+ 0.002605f, 0.994141f, 0.002712f, 0.993164f, 0.002789f, 0.992676f, 0.002844f, 0.992676f,
+ 0.002920f, 0.992188f, 0.003061f, 0.991699f, 0.003157f, 0.990723f, 0.003262f, 0.990234f,
+ 0.003454f, 0.989746f, 0.003700f, 0.988770f, 0.004036f, 0.988281f, 0.004314f, 0.987793f,
+ 0.004581f, 0.986328f, 0.004810f, 0.985840f, 0.004524f, 0.983887f, 0.004539f, 0.982422f,
+ 0.004456f, 0.980957f, 0.004501f, 0.979004f, 0.004814f, 0.977051f, 0.004860f, 0.975098f,
+ 0.005329f, 0.973145f, 0.005432f, 0.970703f, 0.005981f, 0.967773f, 0.006279f, 0.964844f,
+ 0.006725f, 0.961426f, 0.006977f, 0.956543f, 0.007427f, 0.950684f, 0.007912f, 0.944336f,
+ 0.008675f, 0.936035f, 0.009331f, 0.925781f, 0.010490f, 0.912109f, 0.011497f, 0.892578f,
+ 0.013527f, 0.864746f, 0.015991f, 0.818848f, 0.019104f, 0.721191f, 0.014259f, 0.382324f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000003f, 0.998535f,
+ 0.000276f, 0.998535f, 0.000565f, 0.998047f, 0.000811f, 0.998047f, 0.001026f, 0.998047f,
+ 0.001139f, 0.998047f, 0.001387f, 0.997559f, 0.001530f, 0.997559f, 0.001613f, 0.997559f,
+ 0.001790f, 0.997070f, 0.001945f, 0.996582f, 0.002035f, 0.996582f, 0.002094f, 0.996094f,
+ 0.002249f, 0.996094f, 0.002392f, 0.995605f, 0.002478f, 0.995117f, 0.002535f, 0.995117f,
+ 0.002573f, 0.994629f, 0.002760f, 0.994629f, 0.002871f, 0.994141f, 0.002941f, 0.993164f,
+ 0.002987f, 0.992676f, 0.003021f, 0.992676f, 0.003185f, 0.992188f, 0.003370f, 0.991699f,
+ 0.003599f, 0.991211f, 0.003851f, 0.990234f, 0.004078f, 0.989746f, 0.004379f, 0.989258f,
+ 0.004696f, 0.988281f, 0.004971f, 0.987793f, 0.005173f, 0.986816f, 0.005405f, 0.985840f,
+ 0.005592f, 0.984863f, 0.005917f, 0.983887f, 0.006077f, 0.982422f, 0.006153f, 0.980957f,
+ 0.006176f, 0.979004f, 0.006241f, 0.977051f, 0.006302f, 0.974609f, 0.006836f, 0.972656f,
+ 0.007092f, 0.970703f, 0.007355f, 0.967773f, 0.007927f, 0.964844f, 0.008453f, 0.961426f,
+ 0.009369f, 0.958008f, 0.009750f, 0.952637f, 0.010284f, 0.946777f, 0.011345f, 0.939941f,
+ 0.012329f, 0.931641f, 0.013527f, 0.920410f, 0.014748f, 0.906250f, 0.016464f, 0.886230f,
+ 0.018951f, 0.857422f, 0.021957f, 0.810059f, 0.025940f, 0.713379f, 0.017838f, 0.380371f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000270f, 0.998535f, 0.000660f, 0.998535f, 0.000873f, 0.998535f,
+ 0.001148f, 0.998047f, 0.001250f, 0.998047f, 0.001494f, 0.998047f, 0.001652f, 0.998047f,
+ 0.001724f, 0.997559f, 0.001864f, 0.997559f, 0.002062f, 0.997559f, 0.002151f, 0.996582f,
+ 0.002199f, 0.996582f, 0.002304f, 0.996094f, 0.002497f, 0.996094f, 0.002590f, 0.995605f,
+ 0.002642f, 0.995117f, 0.002674f, 0.995117f, 0.002823f, 0.994629f, 0.002970f, 0.994629f,
+ 0.003046f, 0.994141f, 0.003092f, 0.993652f, 0.003122f, 0.992676f, 0.003353f, 0.992676f,
+ 0.003710f, 0.992188f, 0.004009f, 0.991699f, 0.004265f, 0.991211f, 0.004498f, 0.990234f,
+ 0.004688f, 0.989746f, 0.005035f, 0.989258f, 0.005318f, 0.988281f, 0.005550f, 0.987793f,
+ 0.005772f, 0.986816f, 0.005943f, 0.985840f, 0.006241f, 0.984863f, 0.006775f, 0.984375f,
+ 0.007229f, 0.982910f, 0.007591f, 0.981934f, 0.008018f, 0.980957f, 0.008026f, 0.979004f,
+ 0.007790f, 0.976562f, 0.008087f, 0.974121f, 0.008736f, 0.972656f, 0.008942f, 0.970215f,
+ 0.009209f, 0.967285f, 0.010017f, 0.964844f, 0.010544f, 0.960938f, 0.011604f, 0.957520f,
+ 0.012337f, 0.953613f, 0.013107f, 0.948242f, 0.013680f, 0.941895f, 0.015160f, 0.934570f,
+ 0.016724f, 0.925781f, 0.018051f, 0.914062f, 0.019882f, 0.898926f, 0.022644f, 0.878418f,
+ 0.025635f, 0.848633f, 0.029648f, 0.800781f, 0.034180f, 0.704590f, 0.022018f, 0.378418f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000373f, 0.999023f,
+ 0.000812f, 0.999023f, 0.001059f, 0.998535f, 0.001294f, 0.998535f, 0.001351f, 0.998535f,
+ 0.001667f, 0.998047f, 0.001781f, 0.998047f, 0.001822f, 0.998047f, 0.002035f, 0.997559f,
+ 0.002205f, 0.997559f, 0.002264f, 0.997070f, 0.002293f, 0.996582f, 0.002464f, 0.996094f,
+ 0.002642f, 0.996094f, 0.002708f, 0.995605f, 0.002741f, 0.995605f, 0.002760f, 0.995117f,
+ 0.002972f, 0.994629f, 0.003103f, 0.994629f, 0.003208f, 0.994141f, 0.003435f, 0.993164f,
+ 0.003674f, 0.992676f, 0.004002f, 0.992188f, 0.004398f, 0.992188f, 0.004677f, 0.991699f,
+ 0.004868f, 0.991211f, 0.005108f, 0.990234f, 0.005276f, 0.989746f, 0.005554f, 0.988770f,
+ 0.005890f, 0.988281f, 0.006107f, 0.987793f, 0.006401f, 0.986816f, 0.006790f, 0.986328f,
+ 0.007160f, 0.985352f, 0.007626f, 0.984375f, 0.008057f, 0.982910f, 0.008499f, 0.981934f,
+ 0.008881f, 0.980957f, 0.009407f, 0.979492f, 0.009865f, 0.978516f, 0.010544f, 0.976074f,
+ 0.010498f, 0.974121f, 0.010765f, 0.972168f, 0.011108f, 0.969238f, 0.011467f, 0.966797f,
+ 0.012344f, 0.963867f, 0.013023f, 0.960938f, 0.013771f, 0.957031f, 0.015007f, 0.953125f,
+ 0.016052f, 0.948242f, 0.017639f, 0.943359f, 0.018082f, 0.936523f, 0.019928f, 0.928223f,
+ 0.021805f, 0.918457f, 0.023819f, 0.906738f, 0.026581f, 0.891113f, 0.029816f, 0.870117f,
+ 0.033569f, 0.839355f, 0.038696f, 0.790527f, 0.044037f, 0.695312f, 0.026749f, 0.376465f,
+ 0.000000f, 1.000000f, 0.000245f, 0.999512f, 0.000803f, 0.999023f, 0.000926f, 0.999023f,
+ 0.001336f, 0.999023f, 0.001398f, 0.998535f, 0.001638f, 0.998535f, 0.001838f, 0.998535f,
+ 0.001872f, 0.998047f, 0.001908f, 0.998047f, 0.002268f, 0.997559f, 0.002325f, 0.997070f,
+ 0.002344f, 0.996582f, 0.002382f, 0.996094f, 0.002712f, 0.996094f, 0.002777f, 0.995605f,
+ 0.002802f, 0.995605f, 0.002815f, 0.995117f, 0.003098f, 0.994629f, 0.003525f, 0.994141f,
+ 0.003832f, 0.994141f, 0.004070f, 0.993164f, 0.004311f, 0.993164f, 0.004520f, 0.992188f,
+ 0.004959f, 0.992188f, 0.005264f, 0.991211f, 0.005451f, 0.990723f, 0.005577f, 0.990234f,
+ 0.005775f, 0.989746f, 0.006027f, 0.988770f, 0.006561f, 0.988281f, 0.006958f, 0.987305f,
+ 0.007374f, 0.986328f, 0.007751f, 0.985840f, 0.008026f, 0.985352f, 0.008339f, 0.983887f,
+ 0.008965f, 0.982910f, 0.009529f, 0.981934f, 0.010063f, 0.980469f, 0.010513f, 0.979492f,
+ 0.011055f, 0.978027f, 0.011642f, 0.976562f, 0.012451f, 0.974609f, 0.013245f, 0.973633f,
+ 0.013947f, 0.971191f, 0.014046f, 0.968750f, 0.014503f, 0.965820f, 0.015038f, 0.962891f,
+ 0.015869f, 0.959473f, 0.016739f, 0.956055f, 0.018143f, 0.952148f, 0.019302f, 0.947754f,
+ 0.020859f, 0.942871f, 0.022507f, 0.937500f, 0.024368f, 0.930176f, 0.025970f, 0.920898f,
+ 0.028061f, 0.911133f, 0.031021f, 0.898438f, 0.034332f, 0.881836f, 0.038513f, 0.859375f,
+ 0.043457f, 0.828613f, 0.049591f, 0.779785f, 0.055145f, 0.685547f, 0.031860f, 0.373779f,
+ 0.000000f, 1.000000f, 0.000577f, 0.999512f, 0.000956f, 0.999023f, 0.001399f, 0.999023f,
+ 0.001432f, 0.999023f, 0.001722f, 0.998535f, 0.001894f, 0.998535f, 0.001909f, 0.998535f,
+ 0.002020f, 0.997559f, 0.002350f, 0.997070f, 0.002375f, 0.996582f, 0.002384f, 0.996582f,
+ 0.002625f, 0.996094f, 0.002811f, 0.995605f, 0.002958f, 0.995605f, 0.003267f, 0.995117f,
+ 0.003553f, 0.994629f, 0.004128f, 0.994141f, 0.004436f, 0.993652f, 0.004669f, 0.993164f,
+ 0.004810f, 0.992676f, 0.005035f, 0.992676f, 0.005444f, 0.991699f, 0.005692f, 0.990723f,
+ 0.005886f, 0.990234f, 0.006180f, 0.990234f, 0.006512f, 0.989258f, 0.006855f, 0.989258f,
+ 0.007500f, 0.987793f, 0.007988f, 0.986816f, 0.008286f, 0.986328f, 0.008606f, 0.985352f,
+ 0.008919f, 0.984863f, 0.009438f, 0.983398f, 0.010124f, 0.982422f, 0.010773f, 0.981445f,
+ 0.011215f, 0.980469f, 0.011795f, 0.979492f, 0.012459f, 0.978027f, 0.013077f, 0.976074f,
+ 0.013763f, 0.974609f, 0.014641f, 0.973145f, 0.015617f, 0.971191f, 0.016464f, 0.969238f,
+ 0.017410f, 0.967285f, 0.018036f, 0.964844f, 0.018204f, 0.961426f, 0.019211f, 0.958496f,
+ 0.020309f, 0.954590f, 0.021881f, 0.950684f, 0.022934f, 0.946289f, 0.024429f, 0.941406f,
+ 0.026596f, 0.936035f, 0.028809f, 0.929688f, 0.031281f, 0.922363f, 0.033020f, 0.912598f,
+ 0.036499f, 0.902344f, 0.039734f, 0.889160f, 0.043915f, 0.871094f, 0.048889f, 0.848633f,
+ 0.055298f, 0.816895f, 0.061951f, 0.767578f, 0.068115f, 0.675293f, 0.037598f, 0.372070f,
+ 0.000000f, 1.000000f, 0.000963f, 0.999512f, 0.000969f, 0.999023f, 0.001447f, 0.999023f,
+ 0.001451f, 0.999023f, 0.001914f, 0.998535f, 0.001927f, 0.998047f, 0.001930f, 0.997559f,
+ 0.002380f, 0.997070f, 0.002399f, 0.996582f, 0.002466f, 0.996582f, 0.002817f, 0.996094f,
+ 0.003546f, 0.995605f, 0.003870f, 0.995117f, 0.004055f, 0.994629f, 0.004333f, 0.994141f,
+ 0.004875f, 0.993652f, 0.005100f, 0.993164f, 0.005310f, 0.992676f, 0.005421f, 0.992188f,
+ 0.005520f, 0.991699f, 0.006332f, 0.990723f, 0.006786f, 0.990234f, 0.007133f, 0.989746f,
+ 0.007454f, 0.989258f, 0.007881f, 0.988281f, 0.008163f, 0.987305f, 0.008827f, 0.986328f,
+ 0.009216f, 0.985840f, 0.009750f, 0.984863f, 0.010353f, 0.983887f, 0.010826f, 0.982910f,
+ 0.011192f, 0.981934f, 0.011971f, 0.980469f, 0.012756f, 0.979492f, 0.013428f, 0.978516f,
+ 0.014076f, 0.977051f, 0.014725f, 0.975586f, 0.015457f, 0.974121f, 0.016266f, 0.972656f,
+ 0.017441f, 0.970703f, 0.018463f, 0.968750f, 0.019501f, 0.966797f, 0.020523f, 0.964844f,
+ 0.021591f, 0.961914f, 0.022903f, 0.959473f, 0.023834f, 0.956055f, 0.024933f, 0.952148f,
+ 0.026093f, 0.948242f, 0.027512f, 0.943848f, 0.029205f, 0.939453f, 0.031494f, 0.934082f,
+ 0.033783f, 0.928223f, 0.036377f, 0.921387f, 0.039734f, 0.913574f, 0.042084f, 0.903320f,
+ 0.045929f, 0.891602f, 0.050568f, 0.877930f, 0.055298f, 0.859863f, 0.061310f, 0.835938f,
+ 0.068359f, 0.803223f, 0.076477f, 0.754395f, 0.081848f, 0.663574f, 0.043427f, 0.369141f,
+ 0.000000f, 1.000000f, 0.000971f, 0.999512f, 0.000973f, 0.999023f, 0.001456f, 0.999023f,
+ 0.001457f, 0.998535f, 0.001935f, 0.997559f, 0.001939f, 0.997559f, 0.002092f, 0.997070f,
+ 0.003004f, 0.996582f, 0.003340f, 0.996582f, 0.003593f, 0.996094f, 0.004284f, 0.995117f,
+ 0.004524f, 0.994629f, 0.004623f, 0.994141f, 0.004879f, 0.993652f, 0.005444f, 0.993164f,
+ 0.005650f, 0.992676f, 0.006119f, 0.991699f, 0.006615f, 0.991211f, 0.006943f, 0.990723f,
+ 0.007660f, 0.989746f, 0.008049f, 0.989258f, 0.008415f, 0.988281f, 0.008781f, 0.987793f,
+ 0.009216f, 0.986816f, 0.009674f, 0.985840f, 0.010689f, 0.984863f, 0.011253f, 0.983887f,
+ 0.011597f, 0.983398f, 0.012230f, 0.981934f, 0.012833f, 0.980957f, 0.013466f, 0.979980f,
+ 0.014526f, 0.979004f, 0.015244f, 0.977051f, 0.016022f, 0.976074f, 0.016800f, 0.974609f,
+ 0.017502f, 0.973145f, 0.018478f, 0.971191f, 0.019547f, 0.969727f, 0.020920f, 0.967285f,
+ 0.022003f, 0.965820f, 0.022995f, 0.963379f, 0.024261f, 0.960938f, 0.025864f, 0.958496f,
+ 0.027252f, 0.956055f, 0.028931f, 0.953125f, 0.030823f, 0.949707f, 0.031403f, 0.945312f,
+ 0.032990f, 0.940918f, 0.034912f, 0.936035f, 0.037384f, 0.930664f, 0.039673f, 0.925293f,
+ 0.042664f, 0.917969f, 0.046173f, 0.911133f, 0.049896f, 0.902344f, 0.053223f, 0.892090f,
+ 0.057831f, 0.879883f, 0.063171f, 0.864746f, 0.069031f, 0.846191f, 0.076172f, 0.821777f,
+ 0.083740f, 0.788574f, 0.092651f, 0.740234f, 0.097351f, 0.652832f, 0.050079f, 0.366699f,
+ 0.000000f, 1.000000f, 0.000488f, 0.999512f, 0.000975f, 0.999023f, 0.001460f, 0.998535f,
+ 0.001460f, 0.998047f, 0.002518f, 0.997559f, 0.002815f, 0.997070f, 0.003202f, 0.997070f,
+ 0.003866f, 0.996094f, 0.004158f, 0.995605f, 0.004234f, 0.994629f, 0.004986f, 0.994141f,
+ 0.005264f, 0.993652f, 0.005692f, 0.993164f, 0.006222f, 0.992188f, 0.007107f, 0.991699f,
+ 0.007488f, 0.991211f, 0.007702f, 0.990234f, 0.008072f, 0.989258f, 0.008713f, 0.988770f,
+ 0.009651f, 0.987793f, 0.010132f, 0.986816f, 0.010620f, 0.985840f, 0.011185f, 0.984863f,
+ 0.011688f, 0.984375f, 0.012856f, 0.983398f, 0.013496f, 0.981934f, 0.014046f, 0.980469f,
+ 0.014732f, 0.979492f, 0.015579f, 0.979004f, 0.016418f, 0.977051f, 0.017563f, 0.975586f,
+ 0.018387f, 0.974609f, 0.019180f, 0.972656f, 0.020233f, 0.971191f, 0.021393f, 0.969727f,
+ 0.022507f, 0.967773f, 0.023453f, 0.966309f, 0.024918f, 0.963867f, 0.026398f, 0.961914f,
+ 0.027878f, 0.958984f, 0.029266f, 0.957031f, 0.030899f, 0.954102f, 0.032440f, 0.951172f,
+ 0.034302f, 0.948730f, 0.036621f, 0.944824f, 0.038757f, 0.941406f, 0.040710f, 0.937012f,
+ 0.042358f, 0.931641f, 0.044586f, 0.926270f, 0.047211f, 0.920410f, 0.050385f, 0.914062f,
+ 0.053802f, 0.906738f, 0.058014f, 0.898926f, 0.062286f, 0.889160f, 0.067322f, 0.878906f,
+ 0.071838f, 0.865234f, 0.078125f, 0.849609f, 0.085205f, 0.830566f, 0.093201f, 0.806152f,
+ 0.101746f, 0.773438f, 0.111084f, 0.725098f, 0.114075f, 0.639648f, 0.056793f, 0.364014f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000976f, 0.998535f, 0.002205f, 0.998535f,
+ 0.002550f, 0.998047f, 0.003315f, 0.997070f, 0.003639f, 0.996582f, 0.003796f, 0.996094f,
+ 0.004322f, 0.995117f, 0.005199f, 0.994629f, 0.005642f, 0.994141f, 0.006428f, 0.993164f,
+ 0.007088f, 0.992188f, 0.007362f, 0.991699f, 0.008125f, 0.991211f, 0.008850f, 0.989746f,
+ 0.009590f, 0.988770f, 0.010017f, 0.988281f, 0.010590f, 0.987305f, 0.011436f, 0.985840f,
+ 0.012314f, 0.984863f, 0.013145f, 0.983887f, 0.013710f, 0.983398f, 0.014374f, 0.981934f,
+ 0.015480f, 0.980469f, 0.016418f, 0.979492f, 0.017349f, 0.978027f, 0.018265f, 0.976562f,
+ 0.019119f, 0.975098f, 0.019897f, 0.974121f, 0.021240f, 0.972168f, 0.022629f, 0.970703f,
+ 0.023834f, 0.968750f, 0.024841f, 0.967285f, 0.025955f, 0.965332f, 0.027298f, 0.963379f,
+ 0.028702f, 0.961426f, 0.030472f, 0.958984f, 0.032257f, 0.956543f, 0.033752f, 0.954102f,
+ 0.035583f, 0.951172f, 0.037323f, 0.948730f, 0.039307f, 0.945312f, 0.041382f, 0.942383f,
+ 0.044037f, 0.938477f, 0.046600f, 0.934570f, 0.049225f, 0.930176f, 0.051971f, 0.925781f,
+ 0.054230f, 0.920410f, 0.056580f, 0.914551f, 0.060120f, 0.907715f, 0.064270f, 0.900879f,
+ 0.068237f, 0.892578f, 0.072754f, 0.883789f, 0.077759f, 0.874512f, 0.083923f, 0.863281f,
+ 0.089172f, 0.848633f, 0.096558f, 0.832520f, 0.104370f, 0.812988f, 0.113342f, 0.788574f,
+ 0.122498f, 0.756348f, 0.130859f, 0.708984f, 0.131836f, 0.626953f, 0.063965f, 0.361572f,
+ 0.000000f, 1.000000f, 0.000395f, 0.999512f, 0.001424f, 0.999023f, 0.002377f, 0.998535f,
+ 0.002939f, 0.997070f, 0.003412f, 0.996582f, 0.004543f, 0.995605f, 0.005405f, 0.995117f,
+ 0.006119f, 0.994141f, 0.006512f, 0.993164f, 0.007229f, 0.992676f, 0.008499f, 0.991211f,
+ 0.009064f, 0.990234f, 0.009689f, 0.989258f, 0.010941f, 0.988281f, 0.011620f, 0.987305f,
+ 0.012344f, 0.985840f, 0.012970f, 0.984863f, 0.014038f, 0.983887f, 0.015350f, 0.982422f,
+ 0.016159f, 0.980957f, 0.016708f, 0.979980f, 0.017883f, 0.979004f, 0.019211f, 0.977051f,
+ 0.020493f, 0.975586f, 0.021347f, 0.974121f, 0.022568f, 0.972656f, 0.023804f, 0.971191f,
+ 0.024948f, 0.969238f, 0.026688f, 0.967773f, 0.028137f, 0.965820f, 0.029465f, 0.963379f,
+ 0.030838f, 0.961426f, 0.032440f, 0.959961f, 0.033844f, 0.957520f, 0.035675f, 0.955078f,
+ 0.037903f, 0.952148f, 0.039825f, 0.949707f, 0.041687f, 0.947266f, 0.043823f, 0.943848f,
+ 0.045959f, 0.940918f, 0.048126f, 0.937988f, 0.050842f, 0.934082f, 0.053833f, 0.930176f,
+ 0.056641f, 0.925781f, 0.059662f, 0.921875f, 0.062805f, 0.916992f, 0.066223f, 0.912109f,
+ 0.069458f, 0.906250f, 0.072571f, 0.899414f, 0.076965f, 0.892090f, 0.081360f, 0.884277f,
+ 0.085938f, 0.875488f, 0.091248f, 0.866211f, 0.097473f, 0.856445f, 0.103882f, 0.844238f,
+ 0.110474f, 0.829590f, 0.118530f, 0.812988f, 0.126831f, 0.793457f, 0.135620f, 0.768555f,
+ 0.145020f, 0.736816f, 0.153198f, 0.691406f, 0.151123f, 0.614258f, 0.071289f, 0.359131f,
+ 0.000000f, 1.000000f, 0.000962f, 0.999512f, 0.001439f, 0.998535f, 0.002554f, 0.997559f,
+ 0.003811f, 0.997070f, 0.005028f, 0.995117f, 0.006145f, 0.994141f, 0.006886f, 0.993652f,
+ 0.008606f, 0.992188f, 0.009026f, 0.991211f, 0.009689f, 0.990234f, 0.011497f, 0.988281f,
+ 0.012352f, 0.987793f, 0.012962f, 0.986328f, 0.014587f, 0.984863f, 0.015854f, 0.983398f,
+ 0.016708f, 0.981934f, 0.017578f, 0.980469f, 0.019485f, 0.979004f, 0.020477f, 0.977539f,
+ 0.021667f, 0.976074f, 0.022995f, 0.974121f, 0.024353f, 0.972656f, 0.026062f, 0.970703f,
+ 0.027344f, 0.969238f, 0.028809f, 0.967285f, 0.030365f, 0.965332f, 0.032043f, 0.963379f,
+ 0.033508f, 0.960938f, 0.035767f, 0.958984f, 0.037415f, 0.956543f, 0.039124f, 0.954102f,
+ 0.041016f, 0.951660f, 0.043274f, 0.949219f, 0.045135f, 0.946289f, 0.048004f, 0.943359f,
+ 0.050171f, 0.940430f, 0.052429f, 0.937500f, 0.054993f, 0.934082f, 0.057465f, 0.930664f,
+ 0.060394f, 0.927246f, 0.063293f, 0.923340f, 0.066895f, 0.918945f, 0.070129f, 0.914551f,
+ 0.073547f, 0.910156f, 0.077148f, 0.905273f, 0.080933f, 0.899902f, 0.085022f, 0.894531f,
+ 0.089539f, 0.888184f, 0.093933f, 0.880371f, 0.098022f, 0.872559f, 0.103088f, 0.864258f,
+ 0.108459f, 0.855469f, 0.114746f, 0.845703f, 0.121277f, 0.834473f, 0.128906f, 0.821777f,
+ 0.136108f, 0.807617f, 0.144043f, 0.790527f, 0.153198f, 0.771484f, 0.161133f, 0.747070f,
+ 0.170654f, 0.716309f, 0.177002f, 0.673340f, 0.171265f, 0.600098f, 0.078857f, 0.355957f,
+ 0.000000f, 1.000000f, 0.001053f, 0.999023f, 0.002396f, 0.998047f, 0.003359f, 0.997070f,
+ 0.005081f, 0.996094f, 0.006599f, 0.994141f, 0.008163f, 0.992676f, 0.009956f, 0.991211f,
+ 0.011086f, 0.989746f, 0.012733f, 0.988281f, 0.013992f, 0.986328f, 0.015976f, 0.984863f,
+ 0.017044f, 0.982910f, 0.018158f, 0.981934f, 0.020569f, 0.979492f, 0.021790f, 0.978027f,
+ 0.023392f, 0.976074f, 0.024780f, 0.974121f, 0.026947f, 0.972168f, 0.028748f, 0.969727f,
+ 0.030258f, 0.968262f, 0.031952f, 0.965820f, 0.034058f, 0.963867f, 0.035858f, 0.961426f,
+ 0.037933f, 0.958984f, 0.040161f, 0.956543f, 0.041992f, 0.954590f, 0.044159f, 0.951660f,
+ 0.046661f, 0.949219f, 0.048737f, 0.946777f, 0.051392f, 0.943848f, 0.053741f, 0.940430f,
+ 0.056427f, 0.937988f, 0.058868f, 0.934570f, 0.062012f, 0.931152f, 0.064697f, 0.927734f,
+ 0.067566f, 0.924316f, 0.070435f, 0.920898f, 0.073975f, 0.916992f, 0.077271f, 0.913086f,
+ 0.080750f, 0.908691f, 0.084717f, 0.903809f, 0.088440f, 0.899414f, 0.092346f, 0.894531f,
+ 0.096375f, 0.889160f, 0.100769f, 0.883789f, 0.105652f, 0.877930f, 0.110413f, 0.871582f,
+ 0.115967f, 0.864746f, 0.120972f, 0.856934f, 0.125610f, 0.849121f, 0.131226f, 0.839844f,
+ 0.137085f, 0.830566f, 0.143677f, 0.820312f, 0.150757f, 0.808594f, 0.158813f, 0.795898f,
+ 0.166870f, 0.781738f, 0.174194f, 0.765137f, 0.182739f, 0.746094f, 0.190308f, 0.723145f,
+ 0.198608f, 0.693359f, 0.202637f, 0.653320f, 0.191772f, 0.585938f, 0.086670f, 0.351562f,
+ 0.000000f, 1.000000f, 0.001943f, 0.998535f, 0.003834f, 0.997559f, 0.005642f, 0.996094f,
+ 0.007874f, 0.994141f, 0.009254f, 0.992676f, 0.012169f, 0.989746f, 0.014473f, 0.987793f,
+ 0.016052f, 0.985352f, 0.018738f, 0.983398f, 0.020691f, 0.980957f, 0.022552f, 0.979004f,
+ 0.025436f, 0.976074f, 0.027466f, 0.973633f, 0.029816f, 0.971191f, 0.031769f, 0.969238f,
+ 0.034424f, 0.966309f, 0.036652f, 0.963867f, 0.039337f, 0.960938f, 0.041473f, 0.958496f,
+ 0.043732f, 0.956055f, 0.046631f, 0.953125f, 0.049469f, 0.950195f, 0.052277f, 0.947266f,
+ 0.054626f, 0.944336f, 0.057281f, 0.941406f, 0.059906f, 0.938477f, 0.063171f, 0.935059f,
+ 0.066528f, 0.931641f, 0.069580f, 0.928223f, 0.072571f, 0.924805f, 0.075806f, 0.921387f,
+ 0.078918f, 0.917480f, 0.082520f, 0.913574f, 0.085876f, 0.910156f, 0.089905f, 0.905762f,
+ 0.093689f, 0.901367f, 0.097412f, 0.897461f, 0.101440f, 0.893066f, 0.105408f, 0.888184f,
+ 0.109924f, 0.883301f, 0.114136f, 0.878418f, 0.118469f, 0.873047f, 0.123413f, 0.867676f,
+ 0.128418f, 0.861816f, 0.133423f, 0.855469f, 0.138672f, 0.849121f, 0.144531f, 0.842285f,
+ 0.150024f, 0.835449f, 0.155762f, 0.827637f, 0.160522f, 0.819336f, 0.166260f, 0.810059f,
+ 0.173096f, 0.799805f, 0.179810f, 0.789551f, 0.187134f, 0.777832f, 0.194458f, 0.765625f,
+ 0.202515f, 0.752441f, 0.208740f, 0.736328f, 0.215942f, 0.718750f, 0.222900f, 0.696777f,
+ 0.229248f, 0.668945f, 0.229858f, 0.632324f, 0.213501f, 0.571289f, 0.094788f, 0.347900f,
+ 0.000000f, 1.000000f, 0.003086f, 0.998047f, 0.007225f, 0.995605f, 0.009949f, 0.993164f,
+ 0.012535f, 0.991211f, 0.015930f, 0.987793f, 0.018707f, 0.984863f, 0.022659f, 0.981445f,
+ 0.026367f, 0.977539f, 0.029541f, 0.974609f, 0.033234f, 0.970703f, 0.036530f, 0.967285f,
+ 0.039795f, 0.964355f, 0.042908f, 0.960938f, 0.046173f, 0.957520f, 0.050262f, 0.953613f,
+ 0.053436f, 0.950195f, 0.056366f, 0.946777f, 0.060455f, 0.942871f, 0.064270f, 0.939453f,
+ 0.067749f, 0.935547f, 0.071045f, 0.932129f, 0.074890f, 0.928223f, 0.078186f, 0.924805f,
+ 0.082153f, 0.920898f, 0.086365f, 0.916992f, 0.090088f, 0.912598f, 0.094238f, 0.908691f,
+ 0.098083f, 0.904785f, 0.101868f, 0.900879f, 0.105530f, 0.896484f, 0.109924f, 0.892090f,
+ 0.114990f, 0.887695f, 0.119324f, 0.882812f, 0.123535f, 0.878418f, 0.127808f, 0.873535f,
+ 0.132202f, 0.869141f, 0.136475f, 0.864258f, 0.140869f, 0.859375f, 0.145874f, 0.854492f,
+ 0.151123f, 0.848633f, 0.156494f, 0.843262f, 0.161621f, 0.837402f, 0.166748f, 0.831055f,
+ 0.171875f, 0.825195f, 0.177124f, 0.818848f, 0.182983f, 0.812500f, 0.188477f, 0.805664f,
+ 0.193970f, 0.798828f, 0.200195f, 0.791016f, 0.205811f, 0.782715f, 0.211670f, 0.772949f,
+ 0.217163f, 0.763184f, 0.223633f, 0.753418f, 0.229858f, 0.742676f, 0.236572f, 0.731445f,
+ 0.242920f, 0.719238f, 0.247925f, 0.704590f, 0.254150f, 0.687500f, 0.259033f, 0.667969f,
+ 0.261230f, 0.643066f, 0.257812f, 0.610840f, 0.235962f, 0.556152f, 0.103333f, 0.343750f,
+ 0.000000f, 1.000000f, 0.006245f, 0.997070f, 0.011818f, 0.993164f, 0.018555f, 0.987793f,
+ 0.024384f, 0.982422f, 0.029861f, 0.978027f, 0.035645f, 0.972168f, 0.039703f, 0.968262f,
+ 0.046875f, 0.961914f, 0.052338f, 0.956543f, 0.058197f, 0.951660f, 0.064209f, 0.945801f,
+ 0.068970f, 0.940918f, 0.073914f, 0.935547f, 0.079529f, 0.930664f, 0.085510f, 0.925293f,
+ 0.090149f, 0.920410f, 0.094788f, 0.915527f, 0.100220f, 0.910645f, 0.105225f, 0.905762f,
+ 0.110718f, 0.900391f, 0.115540f, 0.895508f, 0.120728f, 0.890625f, 0.125732f, 0.885742f,
+ 0.130249f, 0.881348f, 0.134766f, 0.876953f, 0.140381f, 0.871582f, 0.145874f, 0.866699f,
+ 0.150757f, 0.861816f, 0.155396f, 0.856934f, 0.160522f, 0.852051f, 0.165161f, 0.847168f,
+ 0.170166f, 0.842285f, 0.174805f, 0.837402f, 0.179321f, 0.832520f, 0.184692f, 0.827637f,
+ 0.190063f, 0.822266f, 0.194946f, 0.816895f, 0.200806f, 0.811523f, 0.205566f, 0.806152f,
+ 0.210449f, 0.800781f, 0.215210f, 0.794922f, 0.219971f, 0.789551f, 0.224731f, 0.784180f,
+ 0.229370f, 0.778320f, 0.235107f, 0.772461f, 0.240723f, 0.765625f, 0.246094f, 0.758789f,
+ 0.251465f, 0.751953f, 0.256836f, 0.745117f, 0.261719f, 0.737793f, 0.265381f, 0.729492f,
+ 0.270020f, 0.720703f, 0.275146f, 0.711914f, 0.279297f, 0.702637f, 0.283691f, 0.692871f,
+ 0.289062f, 0.681641f, 0.292480f, 0.668457f, 0.295654f, 0.653809f, 0.297363f, 0.637207f,
+ 0.295654f, 0.616211f, 0.286865f, 0.588867f, 0.256836f, 0.541992f, 0.112183f, 0.339355f,
+ 0.000000f, 1.000000f, 0.015884f, 0.992676f, 0.029770f, 0.982910f, 0.042358f, 0.972656f,
+ 0.056458f, 0.961426f, 0.068359f, 0.950684f, 0.078735f, 0.941406f, 0.090088f, 0.931641f,
+ 0.099548f, 0.922363f, 0.107239f, 0.914551f, 0.119019f, 0.905273f, 0.127930f, 0.896484f,
+ 0.135010f, 0.889160f, 0.143433f, 0.881836f, 0.152466f, 0.874023f, 0.159546f, 0.866699f,
+ 0.166870f, 0.860352f, 0.173340f, 0.854004f, 0.179443f, 0.848145f, 0.186035f, 0.841797f,
+ 0.192749f, 0.835938f, 0.199341f, 0.829590f, 0.205322f, 0.824219f, 0.210938f, 0.818359f,
+ 0.215820f, 0.813477f, 0.220581f, 0.809082f, 0.225708f, 0.803711f, 0.231567f, 0.798828f,
+ 0.237183f, 0.793457f, 0.242310f, 0.788086f, 0.247192f, 0.783691f, 0.252441f, 0.778320f,
+ 0.256592f, 0.773926f, 0.260742f, 0.769043f, 0.264893f, 0.764648f, 0.269287f, 0.760254f,
+ 0.272949f, 0.755859f, 0.277100f, 0.751465f, 0.281494f, 0.747070f, 0.286133f, 0.741699f,
+ 0.290527f, 0.736816f, 0.294678f, 0.731934f, 0.298584f, 0.727051f, 0.302490f, 0.722168f,
+ 0.306396f, 0.717285f, 0.310059f, 0.711914f, 0.313477f, 0.707031f, 0.316895f, 0.702148f,
+ 0.319824f, 0.696777f, 0.322754f, 0.691406f, 0.325439f, 0.686035f, 0.327393f, 0.680176f,
+ 0.330811f, 0.671875f, 0.333984f, 0.664062f, 0.336670f, 0.656250f, 0.338623f, 0.648438f,
+ 0.340576f, 0.639160f, 0.340576f, 0.629395f, 0.340088f, 0.618164f, 0.337402f, 0.604980f,
+ 0.330811f, 0.589844f, 0.316650f, 0.567871f, 0.280762f, 0.523438f, 0.121033f, 0.335205f,
+ 0.000000f, 1.000000f, 0.076538f, 0.966309f, 0.127197f, 0.929688f, 0.163330f, 0.899902f,
+ 0.191895f, 0.874512f, 0.210693f, 0.855469f, 0.232666f, 0.834961f, 0.246704f, 0.820312f,
+ 0.258301f, 0.808105f, 0.271729f, 0.794922f, 0.281250f, 0.784668f, 0.288330f, 0.776367f,
+ 0.296387f, 0.767578f, 0.304932f, 0.759277f, 0.313477f, 0.751465f, 0.320312f, 0.744141f,
+ 0.325195f, 0.738281f, 0.330078f, 0.732910f, 0.333740f, 0.728516f, 0.338135f, 0.723633f,
+ 0.341064f, 0.719727f, 0.343262f, 0.716309f, 0.349365f, 0.711426f, 0.354248f, 0.706543f,
+ 0.358154f, 0.702637f, 0.361816f, 0.698730f, 0.364746f, 0.695312f, 0.367188f, 0.691895f,
+ 0.369141f, 0.688965f, 0.371094f, 0.686035f, 0.373535f, 0.683105f, 0.375244f, 0.680176f,
+ 0.376953f, 0.677734f, 0.378906f, 0.675293f, 0.380127f, 0.672852f, 0.381104f, 0.670410f,
+ 0.382324f, 0.667969f, 0.383545f, 0.665527f, 0.386475f, 0.662109f, 0.389160f, 0.659180f,
+ 0.391113f, 0.656250f, 0.392822f, 0.653320f, 0.394775f, 0.649902f, 0.396484f, 0.646973f,
+ 0.397705f, 0.643555f, 0.398193f, 0.640625f, 0.399170f, 0.637695f, 0.399902f, 0.634277f,
+ 0.400635f, 0.631348f, 0.400879f, 0.627930f, 0.401123f, 0.624512f, 0.401123f, 0.620605f,
+ 0.399414f, 0.615723f, 0.397949f, 0.611328f, 0.396729f, 0.606445f, 0.394531f, 0.602051f,
+ 0.391846f, 0.596680f, 0.388428f, 0.591309f, 0.383057f, 0.583984f, 0.376953f, 0.574707f,
+ 0.368408f, 0.560059f, 0.349609f, 0.540039f, 0.305664f, 0.502930f, 0.130005f, 0.332275f,
+ 0.000000f, 1.000000f, 0.301025f, 0.870605f, 0.355713f, 0.809082f, 0.382324f, 0.770508f,
+ 0.398438f, 0.743164f, 0.410156f, 0.722168f, 0.418701f, 0.706055f, 0.426514f, 0.692383f,
+ 0.432861f, 0.681152f, 0.437256f, 0.672363f, 0.440674f, 0.664551f, 0.443848f, 0.658203f,
+ 0.447266f, 0.652344f, 0.450928f, 0.645996f, 0.453613f, 0.641113f, 0.455811f, 0.636719f,
+ 0.458008f, 0.632812f, 0.460449f, 0.628906f, 0.462402f, 0.625977f, 0.464355f, 0.622559f,
+ 0.465332f, 0.619629f, 0.466553f, 0.617188f, 0.468018f, 0.614746f, 0.469727f, 0.612305f,
+ 0.470703f, 0.610352f, 0.471924f, 0.607910f, 0.472656f, 0.605957f, 0.473877f, 0.604004f,
+ 0.474609f, 0.602051f, 0.475586f, 0.600098f, 0.476807f, 0.598145f, 0.477539f, 0.596191f,
+ 0.478516f, 0.594238f, 0.479004f, 0.592285f, 0.479736f, 0.590820f, 0.480469f, 0.588867f,
+ 0.480957f, 0.586914f, 0.481445f, 0.584961f, 0.481689f, 0.583008f, 0.482666f, 0.581055f,
+ 0.482910f, 0.579102f, 0.483643f, 0.576660f, 0.484375f, 0.574707f, 0.484375f, 0.572266f,
+ 0.484619f, 0.569824f, 0.484619f, 0.567871f, 0.485107f, 0.564941f, 0.484863f, 0.562500f,
+ 0.485107f, 0.559570f, 0.485107f, 0.557129f, 0.485352f, 0.553711f, 0.485596f, 0.550293f,
+ 0.483643f, 0.545898f, 0.482422f, 0.541016f, 0.480957f, 0.536133f, 0.479248f, 0.531250f,
+ 0.476318f, 0.525879f, 0.473633f, 0.520020f, 0.468750f, 0.511719f, 0.462891f, 0.502441f,
+ 0.451904f, 0.490723f, 0.433838f, 0.472900f, 0.395508f, 0.440918f, 0.231323f, 0.295410f,
+ 0.000000f, 1.000000f, 0.307861f, 0.868164f, 0.365967f, 0.803711f, 0.396973f, 0.761719f,
+ 0.414551f, 0.732910f, 0.429932f, 0.708984f, 0.440186f, 0.691406f, 0.450928f, 0.674805f,
+ 0.458252f, 0.662109f, 0.465088f, 0.650879f, 0.471436f, 0.641602f, 0.476807f, 0.632812f,
+ 0.480469f, 0.625977f, 0.486328f, 0.618164f, 0.490234f, 0.611816f, 0.494873f, 0.605469f,
+ 0.498535f, 0.600098f, 0.500977f, 0.595215f, 0.504883f, 0.590332f, 0.507812f, 0.585938f,
+ 0.510742f, 0.582031f, 0.513184f, 0.578613f, 0.516602f, 0.574219f, 0.519043f, 0.570801f,
+ 0.520996f, 0.567383f, 0.524902f, 0.563477f, 0.527344f, 0.560059f, 0.528809f, 0.557129f,
+ 0.531250f, 0.553711f, 0.533691f, 0.550293f, 0.536133f, 0.546875f, 0.538086f, 0.543945f,
+ 0.540527f, 0.541016f, 0.541992f, 0.537598f, 0.543945f, 0.534668f, 0.546387f, 0.531250f,
+ 0.549316f, 0.528320f, 0.550293f, 0.524902f, 0.553223f, 0.521484f, 0.555176f, 0.518066f,
+ 0.556152f, 0.514648f, 0.558105f, 0.511230f, 0.561035f, 0.507324f, 0.562500f, 0.503906f,
+ 0.564453f, 0.500000f, 0.566406f, 0.495850f, 0.567871f, 0.491943f, 0.569824f, 0.487793f,
+ 0.572266f, 0.483154f, 0.573730f, 0.478271f, 0.575195f, 0.473389f, 0.577637f, 0.468262f,
+ 0.578613f, 0.462158f, 0.579102f, 0.455322f, 0.580078f, 0.448242f, 0.581543f, 0.440918f,
+ 0.582031f, 0.432861f, 0.583008f, 0.423828f, 0.582031f, 0.413330f, 0.580566f, 0.400635f,
+ 0.576172f, 0.385254f, 0.566895f, 0.364746f, 0.542969f, 0.330078f, 0.425049f, 0.213257f,
+ 0.000000f, 1.000000f, 0.313721f, 0.865723f, 0.377930f, 0.797852f, 0.411865f, 0.752930f,
+ 0.434570f, 0.720703f, 0.452148f, 0.694336f, 0.464111f, 0.674805f, 0.475342f, 0.656738f,
+ 0.485352f, 0.642090f, 0.493652f, 0.628906f, 0.501465f, 0.617676f, 0.507812f, 0.607910f,
+ 0.513672f, 0.599121f, 0.521484f, 0.589844f, 0.526367f, 0.582031f, 0.532227f, 0.574219f,
+ 0.537598f, 0.567383f, 0.542480f, 0.561035f, 0.547363f, 0.554688f, 0.551270f, 0.549316f,
+ 0.555664f, 0.543945f, 0.560059f, 0.538574f, 0.564453f, 0.533203f, 0.568848f, 0.527832f,
+ 0.571289f, 0.523438f, 0.575195f, 0.518555f, 0.578125f, 0.514160f, 0.582031f, 0.509766f,
+ 0.585938f, 0.505371f, 0.590332f, 0.500488f, 0.593262f, 0.496338f, 0.596191f, 0.491943f,
+ 0.599609f, 0.487793f, 0.602539f, 0.483398f, 0.606445f, 0.479004f, 0.608887f, 0.474609f,
+ 0.612793f, 0.469971f, 0.616699f, 0.465576f, 0.619141f, 0.460938f, 0.621582f, 0.456543f,
+ 0.625977f, 0.451660f, 0.628906f, 0.446777f, 0.631348f, 0.441895f, 0.635254f, 0.436768f,
+ 0.637695f, 0.431885f, 0.641113f, 0.426514f, 0.645508f, 0.420898f, 0.646484f, 0.415527f,
+ 0.651855f, 0.409180f, 0.653809f, 0.403320f, 0.657715f, 0.396729f, 0.660645f, 0.390137f,
+ 0.663574f, 0.383301f, 0.664551f, 0.375000f, 0.667480f, 0.366455f, 0.670898f, 0.356934f,
+ 0.673340f, 0.347168f, 0.675781f, 0.336670f, 0.678223f, 0.324951f, 0.678711f, 0.310791f,
+ 0.679688f, 0.294434f, 0.675781f, 0.271973f, 0.661133f, 0.238037f, 0.580566f, 0.145752f,
+ 0.000000f, 1.000000f, 0.321289f, 0.862793f, 0.390869f, 0.791016f, 0.428467f, 0.743164f,
+ 0.450928f, 0.709473f, 0.471924f, 0.680664f, 0.486816f, 0.658691f, 0.500977f, 0.638184f,
+ 0.511230f, 0.622070f, 0.522461f, 0.607422f, 0.531738f, 0.593750f, 0.539062f, 0.582520f,
+ 0.548340f, 0.571777f, 0.555664f, 0.561523f, 0.562988f, 0.551758f, 0.568848f, 0.542969f,
+ 0.576660f, 0.534180f, 0.581543f, 0.526855f, 0.588379f, 0.519043f, 0.593750f, 0.512207f,
+ 0.599121f, 0.505371f, 0.604004f, 0.499268f, 0.609375f, 0.492676f, 0.614746f, 0.486328f,
+ 0.618652f, 0.480713f, 0.624023f, 0.474854f, 0.627930f, 0.469238f, 0.632812f, 0.463379f,
+ 0.637695f, 0.457764f, 0.642090f, 0.452393f, 0.646484f, 0.446777f, 0.649902f, 0.441406f,
+ 0.654297f, 0.436035f, 0.657227f, 0.430908f, 0.663574f, 0.425293f, 0.666504f, 0.419922f,
+ 0.671387f, 0.414307f, 0.674805f, 0.408936f, 0.678711f, 0.403564f, 0.681641f, 0.397949f,
+ 0.686523f, 0.392334f, 0.690918f, 0.386475f, 0.693848f, 0.380615f, 0.698730f, 0.374512f,
+ 0.702148f, 0.368652f, 0.706543f, 0.362305f, 0.709961f, 0.355957f, 0.714355f, 0.349365f,
+ 0.718262f, 0.342529f, 0.721191f, 0.335693f, 0.726074f, 0.328369f, 0.729004f, 0.321289f,
+ 0.732910f, 0.313477f, 0.737793f, 0.304688f, 0.739746f, 0.294922f, 0.742676f, 0.285156f,
+ 0.747559f, 0.274658f, 0.750488f, 0.263672f, 0.753418f, 0.251953f, 0.755371f, 0.237793f,
+ 0.757324f, 0.221313f, 0.756836f, 0.200439f, 0.749023f, 0.171509f, 0.693359f, 0.097595f,
+ 0.000000f, 1.000000f, 0.328613f, 0.859863f, 0.403076f, 0.784668f, 0.442627f, 0.734863f,
+ 0.469971f, 0.697266f, 0.492432f, 0.666992f, 0.509766f, 0.642090f, 0.525391f, 0.620605f,
+ 0.538574f, 0.601562f, 0.549805f, 0.585449f, 0.561523f, 0.570312f, 0.569824f, 0.557129f,
+ 0.580078f, 0.544922f, 0.588867f, 0.533203f, 0.597168f, 0.522461f, 0.606934f, 0.511719f,
+ 0.613281f, 0.501953f, 0.620605f, 0.493164f, 0.626953f, 0.484619f, 0.633301f, 0.476562f,
+ 0.639160f, 0.468506f, 0.645996f, 0.460693f, 0.651855f, 0.453369f, 0.657227f, 0.446289f,
+ 0.662109f, 0.439453f, 0.669922f, 0.432373f, 0.673828f, 0.425781f, 0.679688f, 0.419189f,
+ 0.684082f, 0.412842f, 0.689941f, 0.406250f, 0.693848f, 0.400146f, 0.698242f, 0.394043f,
+ 0.702637f, 0.387939f, 0.708496f, 0.381348f, 0.713379f, 0.375244f, 0.717285f, 0.368896f,
+ 0.722168f, 0.363037f, 0.726074f, 0.356934f, 0.730469f, 0.350830f, 0.734375f, 0.344727f,
+ 0.739258f, 0.338135f, 0.743164f, 0.331787f, 0.747559f, 0.325684f, 0.752441f, 0.318848f,
+ 0.755371f, 0.312500f, 0.760254f, 0.305908f, 0.764648f, 0.299072f, 0.768555f, 0.291992f,
+ 0.772461f, 0.284912f, 0.776367f, 0.277832f, 0.780273f, 0.270020f, 0.785156f, 0.262451f,
+ 0.788574f, 0.254639f, 0.792480f, 0.246216f, 0.795410f, 0.236572f, 0.799805f, 0.226807f,
+ 0.802734f, 0.216675f, 0.805664f, 0.206177f, 0.809570f, 0.194580f, 0.812988f, 0.182251f,
+ 0.814941f, 0.166016f, 0.815430f, 0.148193f, 0.809082f, 0.123413f, 0.770508f, 0.067139f,
+ 0.000000f, 1.000000f, 0.338135f, 0.855469f, 0.415039f, 0.778320f, 0.458496f, 0.725586f,
+ 0.489014f, 0.685547f, 0.512695f, 0.652832f, 0.533203f, 0.625488f, 0.549805f, 0.602051f,
+ 0.564941f, 0.581543f, 0.578613f, 0.563477f, 0.589844f, 0.546875f, 0.600098f, 0.532715f,
+ 0.611816f, 0.518555f, 0.620605f, 0.505859f, 0.630859f, 0.493408f, 0.640137f, 0.481445f,
+ 0.647949f, 0.470947f, 0.656250f, 0.460449f, 0.664062f, 0.450928f, 0.671387f, 0.441650f,
+ 0.678223f, 0.432617f, 0.685059f, 0.424072f, 0.691895f, 0.416016f, 0.696289f, 0.408203f,
+ 0.703125f, 0.400146f, 0.708984f, 0.392822f, 0.715332f, 0.384766f, 0.720703f, 0.377686f,
+ 0.726074f, 0.370850f, 0.730957f, 0.363770f, 0.736328f, 0.356934f, 0.742188f, 0.350098f,
+ 0.746582f, 0.343262f, 0.750488f, 0.336670f, 0.757324f, 0.329590f, 0.760254f, 0.323242f,
+ 0.765137f, 0.316650f, 0.769043f, 0.310303f, 0.773926f, 0.303955f, 0.778320f, 0.297363f,
+ 0.783691f, 0.290283f, 0.787109f, 0.283936f, 0.791504f, 0.277344f, 0.795898f, 0.270752f,
+ 0.799805f, 0.263916f, 0.803223f, 0.257324f, 0.808594f, 0.250244f, 0.811523f, 0.243652f,
+ 0.815918f, 0.236450f, 0.820312f, 0.229126f, 0.823730f, 0.221802f, 0.828613f, 0.214600f,
+ 0.831543f, 0.206787f, 0.835938f, 0.198730f, 0.838867f, 0.190552f, 0.840820f, 0.181152f,
+ 0.844727f, 0.171387f, 0.847656f, 0.161499f, 0.850586f, 0.151001f, 0.854980f, 0.139893f,
+ 0.855957f, 0.126343f, 0.856934f, 0.111694f, 0.852539f, 0.089539f, 0.823730f, 0.046478f,
+ 0.000000f, 1.000000f, 0.344971f, 0.853027f, 0.427490f, 0.771973f, 0.474121f, 0.716309f,
+ 0.506836f, 0.673828f, 0.534668f, 0.638184f, 0.555176f, 0.609375f, 0.573730f, 0.584473f,
+ 0.590820f, 0.561523f, 0.604980f, 0.541992f, 0.618164f, 0.523926f, 0.630371f, 0.507812f,
+ 0.641602f, 0.492676f, 0.650879f, 0.479492f, 0.662109f, 0.465576f, 0.672852f, 0.452393f,
+ 0.681152f, 0.440674f, 0.689941f, 0.429443f, 0.698730f, 0.418945f, 0.705078f, 0.408936f,
+ 0.713379f, 0.399170f, 0.719727f, 0.389893f, 0.726074f, 0.380859f, 0.733398f, 0.372070f,
+ 0.739258f, 0.364014f, 0.746094f, 0.355469f, 0.751953f, 0.347656f, 0.756348f, 0.339844f,
+ 0.762695f, 0.332275f, 0.768555f, 0.324951f, 0.772949f, 0.317871f, 0.778809f, 0.310303f,
+ 0.783691f, 0.303223f, 0.788086f, 0.296387f, 0.791992f, 0.289551f, 0.798340f, 0.282715f,
+ 0.801270f, 0.276123f, 0.806152f, 0.269531f, 0.811035f, 0.262695f, 0.815430f, 0.255859f,
+ 0.819824f, 0.249146f, 0.822754f, 0.242798f, 0.827148f, 0.236328f, 0.830566f, 0.229858f,
+ 0.834473f, 0.223511f, 0.838379f, 0.216797f, 0.843262f, 0.209717f, 0.846680f, 0.203247f,
+ 0.850098f, 0.196411f, 0.854492f, 0.189453f, 0.855957f, 0.182983f, 0.860840f, 0.175781f,
+ 0.864746f, 0.168457f, 0.867676f, 0.161377f, 0.871094f, 0.153809f, 0.874023f, 0.145386f,
+ 0.875977f, 0.136475f, 0.878418f, 0.127563f, 0.881348f, 0.118164f, 0.884766f, 0.108826f,
+ 0.885742f, 0.097717f, 0.887207f, 0.084412f, 0.884766f, 0.067688f, 0.862793f, 0.033691f,
+ 0.000000f, 1.000000f, 0.353516f, 0.849121f, 0.440674f, 0.765137f, 0.490723f, 0.707031f,
+ 0.525879f, 0.661621f, 0.555176f, 0.624023f, 0.577148f, 0.593750f, 0.597656f, 0.566406f,
+ 0.616211f, 0.541992f, 0.630859f, 0.520996f, 0.645508f, 0.501465f, 0.659668f, 0.483887f,
+ 0.669922f, 0.468018f, 0.680176f, 0.453369f, 0.692871f, 0.438477f, 0.702148f, 0.424561f,
+ 0.711426f, 0.412354f, 0.720703f, 0.400146f, 0.729492f, 0.388916f, 0.736816f, 0.378174f,
+ 0.744141f, 0.367676f, 0.750977f, 0.357910f, 0.758789f, 0.348633f, 0.764648f, 0.339355f,
+ 0.771484f, 0.330566f, 0.776855f, 0.321777f, 0.783691f, 0.313477f, 0.787598f, 0.305908f,
+ 0.793945f, 0.297852f, 0.799805f, 0.290039f, 0.804688f, 0.282471f, 0.810059f, 0.275146f,
+ 0.814453f, 0.268066f, 0.818359f, 0.260986f, 0.823730f, 0.254150f, 0.828125f, 0.247437f,
+ 0.832520f, 0.240601f, 0.836914f, 0.233765f, 0.839844f, 0.227539f, 0.844238f, 0.220703f,
+ 0.848633f, 0.214233f, 0.851074f, 0.208130f, 0.854980f, 0.201904f, 0.859375f, 0.195679f,
+ 0.863770f, 0.188843f, 0.867188f, 0.182495f, 0.869629f, 0.176392f, 0.873535f, 0.170044f,
+ 0.876465f, 0.163818f, 0.878418f, 0.158081f, 0.883301f, 0.151123f, 0.886230f, 0.144653f,
+ 0.890137f, 0.137939f, 0.892578f, 0.131470f, 0.895508f, 0.124878f, 0.898438f, 0.118225f,
+ 0.899414f, 0.109985f, 0.902832f, 0.101685f, 0.904785f, 0.093628f, 0.906250f, 0.085205f,
+ 0.908691f, 0.076538f, 0.908691f, 0.064941f, 0.907715f, 0.050476f, 0.891602f, 0.025284f,
+ 0.000000f, 1.000000f, 0.361816f, 0.845703f, 0.453125f, 0.758789f, 0.507324f, 0.697266f,
+ 0.544434f, 0.649902f, 0.576172f, 0.609863f, 0.600098f, 0.577637f, 0.620605f, 0.548828f,
+ 0.640625f, 0.522949f, 0.656738f, 0.500000f, 0.671875f, 0.479980f, 0.684570f, 0.461426f,
+ 0.697266f, 0.444092f, 0.706543f, 0.428955f, 0.719238f, 0.413330f, 0.730957f, 0.398682f,
+ 0.739258f, 0.385498f, 0.748535f, 0.372803f, 0.756348f, 0.360840f, 0.764160f, 0.349854f,
+ 0.771973f, 0.338867f, 0.779297f, 0.328613f, 0.786133f, 0.318848f, 0.793457f, 0.309082f,
+ 0.799805f, 0.300049f, 0.804688f, 0.291748f, 0.810059f, 0.283203f, 0.815918f, 0.274902f,
+ 0.821777f, 0.267090f, 0.826660f, 0.259033f, 0.830566f, 0.251465f, 0.835449f, 0.244507f,
+ 0.840332f, 0.237427f, 0.844727f, 0.230347f, 0.849121f, 0.223389f, 0.853027f, 0.216675f,
+ 0.856934f, 0.209961f, 0.860840f, 0.203613f, 0.864746f, 0.197266f, 0.868652f, 0.190918f,
+ 0.872070f, 0.184814f, 0.875488f, 0.178955f, 0.878906f, 0.172363f, 0.882324f, 0.166626f,
+ 0.885742f, 0.160522f, 0.888672f, 0.154785f, 0.890625f, 0.149048f, 0.894043f, 0.143433f,
+ 0.897461f, 0.137329f, 0.900879f, 0.131348f, 0.903809f, 0.125366f, 0.906738f, 0.119751f,
+ 0.909180f, 0.113953f, 0.912109f, 0.108276f, 0.913574f, 0.102600f, 0.917969f, 0.096008f,
+ 0.918457f, 0.089355f, 0.920410f, 0.081970f, 0.920898f, 0.075317f, 0.923828f, 0.068115f,
+ 0.925781f, 0.060333f, 0.925781f, 0.051239f, 0.924805f, 0.039886f, 0.913086f, 0.018799f,
+ 0.000000f, 1.000000f, 0.369385f, 0.842773f, 0.466553f, 0.751953f, 0.522949f, 0.687988f,
+ 0.562500f, 0.638184f, 0.594727f, 0.596680f, 0.621582f, 0.562012f, 0.642578f, 0.532227f,
+ 0.663086f, 0.504883f, 0.680176f, 0.480713f, 0.694824f, 0.459473f, 0.709961f, 0.439697f,
+ 0.721191f, 0.422363f, 0.733398f, 0.405273f, 0.744141f, 0.389893f, 0.753906f, 0.375000f,
+ 0.765137f, 0.360840f, 0.775391f, 0.347168f, 0.783203f, 0.334961f, 0.789062f, 0.323730f,
+ 0.797363f, 0.312744f, 0.805664f, 0.301758f, 0.811035f, 0.291992f, 0.817871f, 0.282227f,
+ 0.822754f, 0.273193f, 0.828613f, 0.264648f, 0.834961f, 0.255615f, 0.839844f, 0.247559f,
+ 0.843750f, 0.239868f, 0.849121f, 0.231812f, 0.853027f, 0.224731f, 0.858398f, 0.217407f,
+ 0.862793f, 0.210327f, 0.866211f, 0.203491f, 0.871582f, 0.196533f, 0.874512f, 0.190186f,
+ 0.877441f, 0.184082f, 0.880371f, 0.178101f, 0.885254f, 0.171509f, 0.888184f, 0.165649f,
+ 0.891602f, 0.159546f, 0.894531f, 0.153931f, 0.897461f, 0.148193f, 0.899902f, 0.142822f,
+ 0.903320f, 0.137207f, 0.905762f, 0.131836f, 0.908691f, 0.126221f, 0.911133f, 0.121033f,
+ 0.915039f, 0.115417f, 0.916016f, 0.110413f, 0.919434f, 0.105103f, 0.921387f, 0.100159f,
+ 0.924805f, 0.094727f, 0.926270f, 0.089539f, 0.929199f, 0.084167f, 0.930664f, 0.078979f,
+ 0.932617f, 0.074280f, 0.935059f, 0.067139f, 0.935547f, 0.060852f, 0.935547f, 0.054871f,
+ 0.938477f, 0.048035f, 0.938965f, 0.041412f, 0.937500f, 0.031342f, 0.929199f, 0.014694f,
+ 0.000000f, 1.000000f, 0.377686f, 0.839844f, 0.479004f, 0.745605f, 0.538574f, 0.678711f,
+ 0.581543f, 0.626465f, 0.614746f, 0.583008f, 0.641602f, 0.546875f, 0.664551f, 0.515625f,
+ 0.684570f, 0.487549f, 0.703125f, 0.462158f, 0.717773f, 0.439941f, 0.731445f, 0.419434f,
+ 0.744629f, 0.400879f, 0.755859f, 0.383789f, 0.766602f, 0.367920f, 0.777832f, 0.352051f,
+ 0.787109f, 0.337891f, 0.795898f, 0.324219f, 0.803711f, 0.312012f, 0.812500f, 0.299805f,
+ 0.818848f, 0.288574f, 0.826660f, 0.277588f, 0.832031f, 0.268066f, 0.838379f, 0.258301f,
+ 0.844238f, 0.249023f, 0.849609f, 0.240234f, 0.855469f, 0.231567f, 0.858887f, 0.223755f,
+ 0.864258f, 0.215698f, 0.868164f, 0.208374f, 0.873535f, 0.200684f, 0.876465f, 0.193848f,
+ 0.880859f, 0.187012f, 0.884277f, 0.180298f, 0.887695f, 0.174072f, 0.891113f, 0.167847f,
+ 0.895020f, 0.161743f, 0.897949f, 0.155640f, 0.902344f, 0.149658f, 0.904785f, 0.144043f,
+ 0.907227f, 0.138794f, 0.909180f, 0.133545f, 0.913574f, 0.127930f, 0.916016f, 0.122620f,
+ 0.917480f, 0.117737f, 0.920410f, 0.112427f, 0.921875f, 0.107910f, 0.925293f, 0.103149f,
+ 0.927734f, 0.098022f, 0.929688f, 0.093140f, 0.932617f, 0.088318f, 0.934570f, 0.083740f,
+ 0.935059f, 0.079712f, 0.939453f, 0.074524f, 0.940430f, 0.069824f, 0.941895f, 0.065674f,
+ 0.944336f, 0.061157f, 0.944824f, 0.055939f, 0.946289f, 0.049988f, 0.946777f, 0.044495f,
+ 0.948242f, 0.039276f, 0.949219f, 0.033264f, 0.947754f, 0.024719f, 0.940918f, 0.010834f,
+ 0.000000f, 1.000000f, 0.385010f, 0.836914f, 0.491211f, 0.739258f, 0.553711f, 0.669434f,
+ 0.599121f, 0.614746f, 0.632812f, 0.570312f, 0.660645f, 0.532715f, 0.684570f, 0.500000f,
+ 0.705078f, 0.470703f, 0.724121f, 0.444336f, 0.740234f, 0.421143f, 0.752930f, 0.400391f,
+ 0.766113f, 0.381104f, 0.776855f, 0.363525f, 0.788574f, 0.347168f, 0.798828f, 0.331543f,
+ 0.808594f, 0.316406f, 0.816895f, 0.302979f, 0.824219f, 0.290527f, 0.833496f, 0.278076f,
+ 0.839355f, 0.266846f, 0.845703f, 0.256348f, 0.850098f, 0.246826f, 0.857910f, 0.236328f,
+ 0.861816f, 0.227539f, 0.866699f, 0.218994f, 0.871582f, 0.210571f, 0.875977f, 0.202637f,
+ 0.880859f, 0.194824f, 0.885254f, 0.187256f, 0.888672f, 0.180298f, 0.892090f, 0.173584f,
+ 0.895508f, 0.167114f, 0.899902f, 0.160645f, 0.903320f, 0.154175f, 0.906250f, 0.148315f,
+ 0.909180f, 0.142578f, 0.912109f, 0.136963f, 0.914551f, 0.131470f, 0.916992f, 0.126343f,
+ 0.920410f, 0.120789f, 0.922363f, 0.116028f, 0.924805f, 0.111023f, 0.927246f, 0.106140f,
+ 0.929199f, 0.101746f, 0.932129f, 0.096924f, 0.935059f, 0.092041f, 0.936035f, 0.087830f,
+ 0.937500f, 0.083923f, 0.941406f, 0.079102f, 0.942383f, 0.074890f, 0.944336f, 0.070923f,
+ 0.946289f, 0.066711f, 0.947266f, 0.062805f, 0.949707f, 0.058777f, 0.951172f, 0.054810f,
+ 0.953125f, 0.050873f, 0.955078f, 0.046661f, 0.955078f, 0.041931f, 0.955566f, 0.036743f,
+ 0.956055f, 0.031860f, 0.958008f, 0.026825f, 0.955078f, 0.020111f, 0.951172f, 0.008820f,
+ 0.000000f, 1.000000f, 0.394775f, 0.832520f, 0.503418f, 0.732910f, 0.569336f, 0.660645f,
+ 0.614746f, 0.604492f, 0.651367f, 0.557617f, 0.681641f, 0.518066f, 0.704102f, 0.484863f,
+ 0.726074f, 0.454590f, 0.743652f, 0.427734f, 0.759766f, 0.403564f, 0.772949f, 0.382568f,
+ 0.785156f, 0.362793f, 0.797363f, 0.344727f, 0.806152f, 0.328613f, 0.816406f, 0.312988f,
+ 0.826172f, 0.297607f, 0.833496f, 0.283936f, 0.840820f, 0.271240f, 0.848633f, 0.259033f,
+ 0.855957f, 0.247681f, 0.861328f, 0.237427f, 0.868164f, 0.226929f, 0.873535f, 0.217407f,
+ 0.877441f, 0.208496f, 0.881348f, 0.200317f, 0.887695f, 0.191650f, 0.890625f, 0.183838f,
+ 0.895020f, 0.176392f, 0.898926f, 0.169312f, 0.902344f, 0.162598f, 0.906738f, 0.155884f,
+ 0.910156f, 0.149292f, 0.913086f, 0.143066f, 0.915039f, 0.137451f, 0.916992f, 0.132202f,
+ 0.921387f, 0.126221f, 0.923828f, 0.120789f, 0.927246f, 0.115417f, 0.928711f, 0.110657f,
+ 0.929688f, 0.106506f, 0.934570f, 0.101257f, 0.936035f, 0.096313f, 0.937500f, 0.092102f,
+ 0.939453f, 0.088013f, 0.940918f, 0.083862f, 0.942871f, 0.079712f, 0.945801f, 0.075317f,
+ 0.946777f, 0.071716f, 0.949219f, 0.067688f, 0.950684f, 0.063965f, 0.952148f, 0.060364f,
+ 0.954590f, 0.056610f, 0.955566f, 0.053101f, 0.956543f, 0.049561f, 0.958984f, 0.046234f,
+ 0.959473f, 0.042725f, 0.961914f, 0.039185f, 0.961914f, 0.035492f, 0.961914f, 0.030777f,
+ 0.962402f, 0.026779f, 0.963379f, 0.021698f, 0.963867f, 0.017212f, 0.958496f, 0.006859f,
+ 0.000000f, 1.000000f, 0.404297f, 0.828613f, 0.517090f, 0.726074f, 0.583984f, 0.652344f,
+ 0.631348f, 0.593750f, 0.667480f, 0.545898f, 0.698730f, 0.504883f, 0.723145f, 0.470215f,
+ 0.744141f, 0.439453f, 0.761719f, 0.412109f, 0.777344f, 0.387695f, 0.790527f, 0.365967f,
+ 0.803711f, 0.345703f, 0.813965f, 0.327637f, 0.824707f, 0.310791f, 0.833008f, 0.295654f,
+ 0.841797f, 0.280518f, 0.850098f, 0.266357f, 0.858398f, 0.253662f, 0.864746f, 0.241577f,
+ 0.871582f, 0.230469f, 0.875977f, 0.220215f, 0.881348f, 0.209839f, 0.886230f, 0.200684f,
+ 0.892090f, 0.191772f, 0.895020f, 0.183472f, 0.900391f, 0.174927f, 0.903809f, 0.167725f,
+ 0.906250f, 0.160767f, 0.911621f, 0.153564f, 0.914551f, 0.146606f, 0.917480f, 0.140381f,
+ 0.919922f, 0.134399f, 0.922363f, 0.128784f, 0.927246f, 0.122803f, 0.929199f, 0.117249f,
+ 0.930664f, 0.112366f, 0.933105f, 0.107544f, 0.935547f, 0.102478f, 0.937988f, 0.097961f,
+ 0.939453f, 0.093384f, 0.942383f, 0.088806f, 0.944336f, 0.084595f, 0.945312f, 0.080566f,
+ 0.946777f, 0.076843f, 0.950195f, 0.072693f, 0.951660f, 0.068726f, 0.953125f, 0.065186f,
+ 0.954102f, 0.061737f, 0.955078f, 0.058441f, 0.957520f, 0.054932f, 0.958496f, 0.051636f,
+ 0.960938f, 0.048065f, 0.961426f, 0.045227f, 0.962402f, 0.042389f, 0.964844f, 0.039001f,
+ 0.965820f, 0.035736f, 0.966309f, 0.033325f, 0.968262f, 0.030426f, 0.968750f, 0.025787f,
+ 0.968262f, 0.022202f, 0.967773f, 0.018677f, 0.969238f, 0.013779f, 0.965332f, 0.005775f,
+ 0.000000f, 1.000000f, 0.411865f, 0.825684f, 0.530762f, 0.718750f, 0.599121f, 0.643066f,
+ 0.647949f, 0.583008f, 0.686523f, 0.533691f, 0.716797f, 0.491699f, 0.740234f, 0.456543f,
+ 0.760742f, 0.425293f, 0.778809f, 0.397461f, 0.794434f, 0.372314f, 0.808105f, 0.350098f,
+ 0.819336f, 0.330078f, 0.830078f, 0.311768f, 0.839355f, 0.294922f, 0.847656f, 0.279785f,
+ 0.856934f, 0.264893f, 0.864258f, 0.250732f, 0.871094f, 0.238159f, 0.877930f, 0.226074f,
+ 0.883789f, 0.214844f, 0.889648f, 0.204590f, 0.893555f, 0.195068f, 0.898926f, 0.185425f,
+ 0.902832f, 0.176880f, 0.906738f, 0.168579f, 0.911133f, 0.160889f, 0.915039f, 0.153320f,
+ 0.918457f, 0.146484f, 0.921387f, 0.139404f, 0.922852f, 0.133667f, 0.927734f, 0.126953f,
+ 0.929688f, 0.121277f, 0.932617f, 0.115906f, 0.934570f, 0.110474f, 0.937012f, 0.105347f,
+ 0.939941f, 0.100220f, 0.941406f, 0.095764f, 0.944336f, 0.091064f, 0.945801f, 0.086609f,
+ 0.947266f, 0.082581f, 0.949707f, 0.078308f, 0.951172f, 0.074463f, 0.953125f, 0.070801f,
+ 0.954590f, 0.066956f, 0.956055f, 0.063293f, 0.957031f, 0.060059f, 0.958008f, 0.057037f,
+ 0.960938f, 0.053375f, 0.962402f, 0.050232f, 0.963379f, 0.047211f, 0.963867f, 0.044464f,
+ 0.965332f, 0.041626f, 0.966797f, 0.038666f, 0.967773f, 0.036041f, 0.969727f, 0.033325f,
+ 0.970703f, 0.030609f, 0.971191f, 0.028290f, 0.972168f, 0.025726f, 0.974121f, 0.022797f,
+ 0.972656f, 0.018906f, 0.972656f, 0.015373f, 0.973633f, 0.011444f, 0.969727f, 0.004612f,
+ 0.000000f, 1.000000f, 0.421631f, 0.821777f, 0.542969f, 0.712891f, 0.614746f, 0.634277f,
+ 0.664062f, 0.573242f, 0.702148f, 0.521973f, 0.732422f, 0.479736f, 0.756348f, 0.443848f,
+ 0.777832f, 0.411865f, 0.795898f, 0.383301f, 0.810547f, 0.358154f, 0.822754f, 0.335938f,
+ 0.833984f, 0.315918f, 0.844727f, 0.297119f, 0.852539f, 0.280762f, 0.860840f, 0.265625f,
+ 0.869629f, 0.250732f, 0.876953f, 0.236938f, 0.883789f, 0.224243f, 0.890137f, 0.211914f,
+ 0.895508f, 0.201172f, 0.900391f, 0.191040f, 0.905273f, 0.181030f, 0.909180f, 0.172485f,
+ 0.913086f, 0.163818f, 0.917480f, 0.155640f, 0.920898f, 0.147827f, 0.922852f, 0.141357f,
+ 0.927246f, 0.134033f, 0.929688f, 0.127563f, 0.932129f, 0.121521f, 0.934570f, 0.115906f,
+ 0.938965f, 0.109802f, 0.939941f, 0.104736f, 0.942871f, 0.099609f, 0.944336f, 0.094849f,
+ 0.946777f, 0.090149f, 0.949219f, 0.085388f, 0.950684f, 0.081238f, 0.951660f, 0.077454f,
+ 0.954590f, 0.073242f, 0.955566f, 0.069519f, 0.957520f, 0.065735f, 0.958496f, 0.062500f,
+ 0.960938f, 0.058777f, 0.961426f, 0.055817f, 0.962402f, 0.052673f, 0.964355f, 0.049438f,
+ 0.965332f, 0.046661f, 0.967285f, 0.043732f, 0.967773f, 0.040985f, 0.969238f, 0.038422f,
+ 0.970703f, 0.035736f, 0.971680f, 0.033020f, 0.971680f, 0.031021f, 0.973145f, 0.028625f,
+ 0.974609f, 0.026321f, 0.975586f, 0.023727f, 0.976562f, 0.021774f, 0.977539f, 0.019760f,
+ 0.977051f, 0.016510f, 0.976562f, 0.012489f, 0.976562f, 0.009476f, 0.974121f, 0.003717f,
+ 0.000000f, 1.000000f, 0.428711f, 0.819336f, 0.556641f, 0.706055f, 0.628906f, 0.625977f,
+ 0.680176f, 0.562988f, 0.717773f, 0.511230f, 0.748047f, 0.468018f, 0.771973f, 0.431396f,
+ 0.791016f, 0.399902f, 0.809570f, 0.370605f, 0.824219f, 0.345459f, 0.837402f, 0.322754f,
+ 0.847168f, 0.302734f, 0.857422f, 0.284180f, 0.864258f, 0.268066f, 0.873535f, 0.251953f,
+ 0.879883f, 0.238281f, 0.887695f, 0.224243f, 0.894531f, 0.211304f, 0.899902f, 0.200073f,
+ 0.904785f, 0.188965f, 0.911133f, 0.178345f, 0.913086f, 0.169800f, 0.918945f, 0.160156f,
+ 0.922363f, 0.151978f, 0.925293f, 0.144409f, 0.929199f, 0.136963f, 0.931641f, 0.129883f,
+ 0.934570f, 0.123413f, 0.937500f, 0.117065f, 0.939941f, 0.111328f, 0.942383f, 0.105652f,
+ 0.944824f, 0.100098f, 0.946777f, 0.095215f, 0.948730f, 0.090393f, 0.951660f, 0.085693f,
+ 0.953125f, 0.081177f, 0.954590f, 0.076904f, 0.955566f, 0.073242f, 0.958008f, 0.069214f,
+ 0.960449f, 0.065125f, 0.960938f, 0.061737f, 0.961426f, 0.058807f, 0.964355f, 0.055267f,
+ 0.965820f, 0.051849f, 0.966309f, 0.049011f, 0.967773f, 0.046265f, 0.968262f, 0.043579f,
+ 0.970215f, 0.040680f, 0.971191f, 0.037964f, 0.972168f, 0.035614f, 0.972656f, 0.033478f,
+ 0.974121f, 0.031097f, 0.975586f, 0.028687f, 0.976562f, 0.026352f, 0.976562f, 0.024750f,
+ 0.978027f, 0.022507f, 0.978516f, 0.020660f, 0.979980f, 0.018646f, 0.980957f, 0.016479f,
+ 0.981445f, 0.014877f, 0.979492f, 0.011246f, 0.979492f, 0.007957f, 0.979004f, 0.003407f,
+ 0.000000f, 1.000000f, 0.437500f, 0.815918f, 0.569824f, 0.699707f, 0.643066f, 0.617676f,
+ 0.694824f, 0.553223f, 0.732910f, 0.500977f, 0.762695f, 0.457031f, 0.785645f, 0.420166f,
+ 0.804688f, 0.388184f, 0.822266f, 0.358887f, 0.837891f, 0.333252f, 0.850098f, 0.310547f,
+ 0.860352f, 0.290283f, 0.868652f, 0.272217f, 0.876953f, 0.255615f, 0.883789f, 0.240356f,
+ 0.891113f, 0.226318f, 0.898438f, 0.212769f, 0.903809f, 0.200562f, 0.909668f, 0.188354f,
+ 0.913574f, 0.178223f, 0.918945f, 0.167847f, 0.922363f, 0.158813f, 0.926758f, 0.150024f,
+ 0.930176f, 0.141846f, 0.933105f, 0.134277f, 0.936035f, 0.127197f, 0.938965f, 0.120361f,
+ 0.940918f, 0.114136f, 0.943848f, 0.108093f, 0.947266f, 0.101990f, 0.948730f, 0.096802f,
+ 0.950684f, 0.091858f, 0.953613f, 0.086609f, 0.954590f, 0.082153f, 0.956543f, 0.077759f,
+ 0.958008f, 0.073730f, 0.960449f, 0.069458f, 0.961426f, 0.065735f, 0.962402f, 0.062317f,
+ 0.965332f, 0.058472f, 0.965820f, 0.055237f, 0.966309f, 0.052521f, 0.968262f, 0.049133f,
+ 0.969727f, 0.046234f, 0.970703f, 0.043335f, 0.971680f, 0.040924f, 0.972168f, 0.038269f,
+ 0.973145f, 0.035858f, 0.974121f, 0.033569f, 0.975098f, 0.031372f, 0.977051f, 0.028717f,
+ 0.977539f, 0.026886f, 0.977539f, 0.025299f, 0.979004f, 0.023254f, 0.979980f, 0.021149f,
+ 0.980957f, 0.019135f, 0.981445f, 0.017670f, 0.982422f, 0.016006f, 0.982422f, 0.014641f,
+ 0.983398f, 0.013092f, 0.983887f, 0.009377f, 0.982910f, 0.006584f, 0.981445f, 0.003464f,
+ 0.000000f, 1.000000f, 0.447021f, 0.812012f, 0.582031f, 0.693848f, 0.657227f, 0.609375f,
+ 0.709473f, 0.543945f, 0.748047f, 0.490967f, 0.777344f, 0.446533f, 0.799316f, 0.409180f,
+ 0.817871f, 0.377197f, 0.834473f, 0.348145f, 0.849609f, 0.322021f, 0.861816f, 0.299561f,
+ 0.871094f, 0.279541f, 0.881348f, 0.260986f, 0.888184f, 0.244629f, 0.894043f, 0.229736f,
+ 0.899902f, 0.215820f, 0.906250f, 0.202881f, 0.912109f, 0.190430f, 0.917969f, 0.178589f,
+ 0.921875f, 0.168335f, 0.926270f, 0.158447f, 0.929688f, 0.149414f, 0.934082f, 0.140747f,
+ 0.936523f, 0.133057f, 0.939941f, 0.125366f, 0.942383f, 0.118530f, 0.946289f, 0.111755f,
+ 0.947754f, 0.105713f, 0.950195f, 0.099854f, 0.952637f, 0.094238f, 0.954102f, 0.089233f,
+ 0.956543f, 0.084167f, 0.958008f, 0.079529f, 0.960449f, 0.075134f, 0.961426f, 0.070801f,
+ 0.962402f, 0.067139f, 0.964844f, 0.063049f, 0.965820f, 0.059509f, 0.967285f, 0.056091f,
+ 0.968262f, 0.053009f, 0.970215f, 0.049683f, 0.971191f, 0.046600f, 0.972168f, 0.043793f,
+ 0.972656f, 0.041473f, 0.974121f, 0.038757f, 0.975586f, 0.036011f, 0.975586f, 0.033783f,
+ 0.976562f, 0.031586f, 0.977539f, 0.029465f, 0.978027f, 0.027603f, 0.979004f, 0.025604f,
+ 0.980469f, 0.023544f, 0.981445f, 0.021545f, 0.981934f, 0.019913f, 0.982422f, 0.018250f,
+ 0.982910f, 0.016953f, 0.983398f, 0.015610f, 0.984863f, 0.013802f, 0.985840f, 0.012192f,
+ 0.986328f, 0.010574f, 0.986816f, 0.009506f, 0.984863f, 0.005833f, 0.984375f, 0.002514f,
+ 0.000000f, 1.000000f, 0.456543f, 0.808105f, 0.593262f, 0.687988f, 0.671387f, 0.601562f,
+ 0.723633f, 0.535156f, 0.761230f, 0.481201f, 0.789062f, 0.437256f, 0.812012f, 0.399170f,
+ 0.831055f, 0.366455f, 0.845215f, 0.338623f, 0.860840f, 0.312012f, 0.872559f, 0.289062f,
+ 0.880859f, 0.269531f, 0.888184f, 0.251221f, 0.896973f, 0.234497f, 0.902344f, 0.220093f,
+ 0.909180f, 0.205933f, 0.914062f, 0.193726f, 0.919922f, 0.181396f, 0.925293f, 0.169800f,
+ 0.929199f, 0.159790f, 0.933105f, 0.149780f, 0.937012f, 0.140991f, 0.940918f, 0.132446f,
+ 0.942871f, 0.124939f, 0.945801f, 0.117615f, 0.948730f, 0.110779f, 0.951660f, 0.104248f,
+ 0.953125f, 0.098511f, 0.956055f, 0.092773f, 0.957520f, 0.087280f, 0.958496f, 0.082764f,
+ 0.960938f, 0.077698f, 0.962891f, 0.073120f, 0.963867f, 0.069092f, 0.965820f, 0.064941f,
+ 0.967285f, 0.061127f, 0.967773f, 0.057831f, 0.969727f, 0.054016f, 0.970703f, 0.050781f,
+ 0.971680f, 0.047760f, 0.972168f, 0.045135f, 0.974121f, 0.042206f, 0.975586f, 0.039154f,
+ 0.976074f, 0.036804f, 0.977051f, 0.034576f, 0.978027f, 0.032227f, 0.978516f, 0.030182f,
+ 0.979492f, 0.028137f, 0.980957f, 0.025925f, 0.981934f, 0.023773f, 0.981934f, 0.022247f,
+ 0.982422f, 0.020798f, 0.983398f, 0.019073f, 0.983887f, 0.017639f, 0.984375f, 0.016296f,
+ 0.985840f, 0.014397f, 0.986328f, 0.012909f, 0.986816f, 0.011711f, 0.987793f, 0.010468f,
+ 0.987305f, 0.009644f, 0.988281f, 0.008430f, 0.986816f, 0.005436f, 0.986328f, 0.001083f,
+ 0.000000f, 1.000000f, 0.464844f, 0.805176f, 0.605957f, 0.681641f, 0.683594f, 0.594238f,
+ 0.736328f, 0.526367f, 0.772949f, 0.472656f, 0.802246f, 0.427734f, 0.824219f, 0.389404f,
+ 0.841797f, 0.356934f, 0.857422f, 0.328613f, 0.869629f, 0.302979f, 0.879395f, 0.280762f,
+ 0.889648f, 0.260254f, 0.897949f, 0.242188f, 0.905273f, 0.225708f, 0.911133f, 0.211060f,
+ 0.916504f, 0.197388f, 0.921387f, 0.185181f, 0.926270f, 0.173462f, 0.930176f, 0.162476f,
+ 0.936035f, 0.151489f, 0.938965f, 0.142334f, 0.943848f, 0.133301f, 0.944824f, 0.125488f,
+ 0.947754f, 0.118042f, 0.951660f, 0.110413f, 0.952637f, 0.104309f, 0.956055f, 0.097778f,
+ 0.957520f, 0.091919f, 0.959473f, 0.086731f, 0.961426f, 0.081482f, 0.963379f, 0.076477f,
+ 0.964844f, 0.071899f, 0.965820f, 0.067871f, 0.967773f, 0.063721f, 0.969727f, 0.059448f,
+ 0.969727f, 0.056274f, 0.971680f, 0.052887f, 0.972656f, 0.049469f, 0.974121f, 0.046417f,
+ 0.975098f, 0.043365f, 0.976562f, 0.040466f, 0.976562f, 0.038116f, 0.977539f, 0.035675f,
+ 0.978516f, 0.033478f, 0.979980f, 0.030914f, 0.980957f, 0.028610f, 0.981445f, 0.026749f,
+ 0.982422f, 0.024734f, 0.982910f, 0.023010f, 0.982910f, 0.021652f, 0.983887f, 0.019958f,
+ 0.984375f, 0.018295f, 0.985840f, 0.016586f, 0.986328f, 0.014992f, 0.987305f, 0.013573f,
+ 0.987305f, 0.012466f, 0.987793f, 0.011497f, 0.988281f, 0.010406f, 0.988770f, 0.009445f,
+ 0.989258f, 0.008270f, 0.990234f, 0.007000f, 0.991211f, 0.004940f, 0.988281f, 0.001047f,
+ 0.000000f, 1.000000f, 0.473633f, 0.801758f, 0.616699f, 0.675781f, 0.695801f, 0.586914f,
+ 0.748535f, 0.518066f, 0.786133f, 0.463867f, 0.812500f, 0.419434f, 0.835449f, 0.380859f,
+ 0.852051f, 0.348389f, 0.864746f, 0.320557f, 0.877930f, 0.294678f, 0.889648f, 0.271729f,
+ 0.897949f, 0.251709f, 0.905273f, 0.234009f, 0.912598f, 0.217651f, 0.918945f, 0.202759f,
+ 0.924316f, 0.189697f, 0.927734f, 0.177490f, 0.931641f, 0.166260f, 0.936523f, 0.155396f,
+ 0.940918f, 0.144897f, 0.944824f, 0.135742f, 0.947754f, 0.126953f, 0.950684f, 0.118896f,
+ 0.953613f, 0.111450f, 0.956055f, 0.104492f, 0.958008f, 0.098206f, 0.959961f, 0.092163f,
+ 0.961914f, 0.086243f, 0.963379f, 0.081238f, 0.965332f, 0.076111f, 0.966797f, 0.071533f,
+ 0.969238f, 0.066833f, 0.969727f, 0.062805f, 0.970215f, 0.059326f, 0.972168f, 0.055359f,
+ 0.974609f, 0.051636f, 0.975098f, 0.048370f, 0.976074f, 0.045227f, 0.976562f, 0.042542f,
+ 0.977539f, 0.039825f, 0.978516f, 0.037170f, 0.980469f, 0.034485f, 0.980957f, 0.031982f,
+ 0.981934f, 0.029755f, 0.982422f, 0.027771f, 0.982422f, 0.025894f, 0.982910f, 0.024261f,
+ 0.983887f, 0.022324f, 0.984375f, 0.020706f, 0.985352f, 0.019089f, 0.986816f, 0.016953f,
+ 0.986816f, 0.015732f, 0.987305f, 0.014519f, 0.987793f, 0.013290f, 0.988281f, 0.012192f,
+ 0.988281f, 0.011436f, 0.989258f, 0.010147f, 0.989746f, 0.009201f, 0.990723f, 0.007805f,
+ 0.991699f, 0.006325f, 0.992188f, 0.005371f, 0.992676f, 0.004707f, 0.989746f, 0.001203f,
+ 0.000000f, 1.000000f, 0.483154f, 0.797852f, 0.629883f, 0.669434f, 0.708984f, 0.579590f,
+ 0.761230f, 0.510254f, 0.796387f, 0.456299f, 0.823242f, 0.411377f, 0.845215f, 0.372559f,
+ 0.862305f, 0.339600f, 0.875488f, 0.311768f, 0.886230f, 0.287354f, 0.897949f, 0.263916f,
+ 0.906738f, 0.244141f, 0.913574f, 0.226318f, 0.919434f, 0.210327f, 0.924805f, 0.195679f,
+ 0.930176f, 0.182495f, 0.933594f, 0.170654f, 0.937988f, 0.159302f, 0.939941f, 0.149780f,
+ 0.945312f, 0.139038f, 0.948730f, 0.129883f, 0.952148f, 0.121033f, 0.954590f, 0.113281f,
+ 0.957031f, 0.106079f, 0.959961f, 0.098999f, 0.961914f, 0.092712f, 0.962891f, 0.087158f,
+ 0.965820f, 0.081360f, 0.966797f, 0.076233f, 0.968750f, 0.071289f, 0.969238f, 0.067139f,
+ 0.971191f, 0.062744f, 0.973145f, 0.058472f, 0.974121f, 0.054840f, 0.975586f, 0.051025f,
+ 0.975586f, 0.048096f, 0.977539f, 0.044922f, 0.978027f, 0.041870f, 0.979980f, 0.038940f,
+ 0.980957f, 0.036041f, 0.981445f, 0.033600f, 0.981445f, 0.031525f, 0.982910f, 0.029282f,
+ 0.982910f, 0.027328f, 0.983398f, 0.025513f, 0.984375f, 0.023590f, 0.986328f, 0.021347f,
+ 0.986816f, 0.019516f, 0.986816f, 0.018127f, 0.987793f, 0.016678f, 0.987793f, 0.015381f,
+ 0.988281f, 0.014320f, 0.988770f, 0.013016f, 0.989258f, 0.011940f, 0.990234f, 0.010872f,
+ 0.990723f, 0.009674f, 0.990723f, 0.008629f, 0.992188f, 0.006966f, 0.992188f, 0.006294f,
+ 0.992676f, 0.005501f, 0.992676f, 0.005138f, 0.993164f, 0.004486f, 0.991699f, 0.001573f,
+ 0.000000f, 1.000000f, 0.491211f, 0.794922f, 0.641602f, 0.663574f, 0.721191f, 0.572266f,
+ 0.771973f, 0.503906f, 0.807129f, 0.448730f, 0.835449f, 0.403076f, 0.853027f, 0.365723f,
+ 0.871582f, 0.332031f, 0.883789f, 0.304199f, 0.894043f, 0.279785f, 0.904785f, 0.257080f,
+ 0.912109f, 0.237427f, 0.919922f, 0.219360f, 0.925781f, 0.203491f, 0.931152f, 0.189209f,
+ 0.935059f, 0.176270f, 0.938965f, 0.164307f, 0.943359f, 0.153198f, 0.945312f, 0.143799f,
+ 0.949219f, 0.134033f, 0.953125f, 0.124817f, 0.956543f, 0.116089f, 0.958984f, 0.108215f,
+ 0.961426f, 0.101074f, 0.962891f, 0.094666f, 0.965820f, 0.088013f, 0.966797f, 0.082458f,
+ 0.969238f, 0.076965f, 0.969727f, 0.072205f, 0.972656f, 0.067200f, 0.973633f, 0.062622f,
+ 0.974609f, 0.058777f, 0.975586f, 0.054871f, 0.976074f, 0.051514f, 0.978027f, 0.047882f,
+ 0.979492f, 0.044373f, 0.980469f, 0.041199f, 0.980957f, 0.038574f, 0.981445f, 0.035980f,
+ 0.982422f, 0.033478f, 0.983398f, 0.031204f, 0.983398f, 0.029175f, 0.985352f, 0.026779f,
+ 0.986328f, 0.024384f, 0.986328f, 0.022659f, 0.987305f, 0.020706f, 0.987305f, 0.019318f,
+ 0.987793f, 0.017899f, 0.987793f, 0.016479f, 0.988281f, 0.015190f, 0.989258f, 0.013985f,
+ 0.989258f, 0.012787f, 0.989746f, 0.011673f, 0.991211f, 0.010223f, 0.992188f, 0.008713f,
+ 0.992188f, 0.007851f, 0.992676f, 0.006889f, 0.992676f, 0.006378f, 0.993164f, 0.005615f,
+ 0.993652f, 0.005020f, 0.993652f, 0.004612f, 0.993652f, 0.003990f, 0.994629f, 0.002947f,
+ 0.000000f, 1.000000f, 0.500488f, 0.791504f, 0.651855f, 0.658203f, 0.732422f, 0.566406f,
+ 0.781738f, 0.497070f, 0.816895f, 0.442139f, 0.843750f, 0.396240f, 0.862305f, 0.358398f,
+ 0.879395f, 0.325195f, 0.891602f, 0.297363f, 0.902344f, 0.272705f, 0.910645f, 0.250977f,
+ 0.918945f, 0.230957f, 0.925293f, 0.213379f, 0.932129f, 0.197510f, 0.935547f, 0.183472f,
+ 0.940430f, 0.170288f, 0.943359f, 0.158813f, 0.947754f, 0.147705f, 0.950195f, 0.138184f,
+ 0.953125f, 0.128906f, 0.956543f, 0.120117f, 0.958984f, 0.112061f, 0.961914f, 0.104004f,
+ 0.963867f, 0.096863f, 0.965820f, 0.090332f, 0.967773f, 0.084351f, 0.970703f, 0.078308f,
+ 0.971191f, 0.073181f, 0.973145f, 0.068115f, 0.974121f, 0.063782f, 0.975098f, 0.059570f,
+ 0.977539f, 0.055420f, 0.978516f, 0.051300f, 0.979492f, 0.047791f, 0.979980f, 0.044556f,
+ 0.980469f, 0.041718f, 0.981934f, 0.038635f, 0.982422f, 0.036133f, 0.983887f, 0.033539f,
+ 0.984375f, 0.030914f, 0.985840f, 0.028259f, 0.986328f, 0.026077f, 0.986816f, 0.024139f,
+ 0.986816f, 0.022522f, 0.987793f, 0.020676f, 0.987793f, 0.019257f, 0.988281f, 0.017822f,
+ 0.989258f, 0.016281f, 0.989258f, 0.015053f, 0.990234f, 0.013611f, 0.991211f, 0.012207f,
+ 0.992188f, 0.010643f, 0.992676f, 0.009323f, 0.992676f, 0.008507f, 0.993164f, 0.007610f,
+ 0.993164f, 0.006977f, 0.993652f, 0.006245f, 0.993652f, 0.005745f, 0.993652f, 0.005070f,
+ 0.994141f, 0.004536f, 0.994141f, 0.004101f, 0.995117f, 0.003157f, 0.996094f, 0.001987f,
+ 0.000000f, 1.000000f, 0.510742f, 0.787109f, 0.663574f, 0.652344f, 0.743652f, 0.560059f,
+ 0.794922f, 0.489502f, 0.827148f, 0.434570f, 0.852051f, 0.389648f, 0.871094f, 0.351562f,
+ 0.886719f, 0.318848f, 0.898926f, 0.290771f, 0.908203f, 0.266602f, 0.915039f, 0.245850f,
+ 0.924316f, 0.225464f, 0.930664f, 0.207764f, 0.937012f, 0.191772f, 0.940430f, 0.178101f,
+ 0.945312f, 0.164917f, 0.948242f, 0.153442f, 0.952148f, 0.142700f, 0.954590f, 0.133423f,
+ 0.956543f, 0.124512f, 0.959473f, 0.116028f, 0.961914f, 0.108215f, 0.964844f, 0.100403f,
+ 0.967773f, 0.093201f, 0.970215f, 0.086243f, 0.971680f, 0.080444f, 0.972656f, 0.075012f,
+ 0.974121f, 0.069946f, 0.975586f, 0.065063f, 0.978027f, 0.060211f, 0.978516f, 0.056000f,
+ 0.979004f, 0.052399f, 0.980469f, 0.048584f, 0.980957f, 0.045502f, 0.982422f, 0.042084f,
+ 0.982910f, 0.039246f, 0.984863f, 0.035950f, 0.985352f, 0.033173f, 0.986328f, 0.030548f,
+ 0.986328f, 0.028473f, 0.986816f, 0.026428f, 0.987793f, 0.024429f, 0.987793f, 0.022659f,
+ 0.988770f, 0.020782f, 0.988770f, 0.019257f, 0.988770f, 0.017807f, 0.989746f, 0.016083f,
+ 0.990723f, 0.014519f, 0.992188f, 0.012581f, 0.992188f, 0.011375f, 0.992676f, 0.010284f,
+ 0.992676f, 0.009338f, 0.992676f, 0.008629f, 0.993164f, 0.007706f, 0.993164f, 0.007145f,
+ 0.993652f, 0.006336f, 0.994141f, 0.005703f, 0.994141f, 0.005177f, 0.994629f, 0.004509f,
+ 0.995117f, 0.003876f, 0.995605f, 0.003214f, 0.996582f, 0.002230f, 0.998047f, 0.000039f,
+ 0.000000f, 1.000000f, 0.519043f, 0.784180f, 0.675293f, 0.646973f, 0.755371f, 0.553223f,
+ 0.802734f, 0.483643f, 0.837402f, 0.428223f, 0.860352f, 0.383301f, 0.879395f, 0.345215f,
+ 0.892090f, 0.313721f, 0.905762f, 0.284912f, 0.914551f, 0.260498f, 0.921875f, 0.239624f,
+ 0.928711f, 0.220703f, 0.936035f, 0.202759f, 0.941895f, 0.186890f, 0.945312f, 0.172974f,
+ 0.949707f, 0.160156f, 0.952637f, 0.148682f, 0.955566f, 0.138428f, 0.958496f, 0.128784f,
+ 0.959961f, 0.120239f, 0.961914f, 0.112183f, 0.965332f, 0.104431f, 0.966797f, 0.097229f,
+ 0.969238f, 0.090088f, 0.971191f, 0.083740f, 0.973145f, 0.077698f, 0.976074f, 0.071655f,
+ 0.977051f, 0.066528f, 0.978027f, 0.061951f, 0.979004f, 0.057739f, 0.979980f, 0.053680f,
+ 0.980957f, 0.050018f, 0.982422f, 0.046143f, 0.983887f, 0.042603f, 0.984863f, 0.039093f,
+ 0.985352f, 0.036469f, 0.985840f, 0.033661f, 0.986328f, 0.031281f, 0.986816f, 0.028976f,
+ 0.987305f, 0.026855f, 0.988281f, 0.024704f, 0.988770f, 0.022858f, 0.989746f, 0.020950f,
+ 0.990234f, 0.019073f, 0.991699f, 0.017212f, 0.992188f, 0.015175f, 0.992188f, 0.013878f,
+ 0.992676f, 0.012512f, 0.992676f, 0.011513f, 0.993164f, 0.010384f, 0.993164f, 0.009560f,
+ 0.993652f, 0.008598f, 0.993652f, 0.007912f, 0.994141f, 0.007061f, 0.994141f, 0.006516f,
+ 0.994629f, 0.005733f, 0.995117f, 0.005028f, 0.995605f, 0.004395f, 0.996094f, 0.003757f,
+ 0.996094f, 0.002979f, 0.997070f, 0.002041f, 0.998535f, 0.000240f, 0.998535f, 0.000003f,
+ 0.000000f, 1.000000f, 0.527832f, 0.780762f, 0.684082f, 0.642578f, 0.764160f, 0.547852f,
+ 0.812500f, 0.477783f, 0.843750f, 0.422852f, 0.868164f, 0.377441f, 0.886230f, 0.339355f,
+ 0.899902f, 0.307617f, 0.911621f, 0.279541f, 0.920898f, 0.255127f, 0.927734f, 0.234253f,
+ 0.933105f, 0.215942f, 0.939941f, 0.198242f, 0.945312f, 0.182617f, 0.949219f, 0.168579f,
+ 0.953125f, 0.156128f, 0.957031f, 0.144409f, 0.958984f, 0.134399f, 0.960938f, 0.125122f,
+ 0.963867f, 0.116028f, 0.965332f, 0.108154f, 0.966797f, 0.101074f, 0.968750f, 0.094421f,
+ 0.970703f, 0.087952f, 0.973633f, 0.080750f, 0.975586f, 0.074829f, 0.976562f, 0.069458f,
+ 0.978027f, 0.064453f, 0.979492f, 0.059937f, 0.980957f, 0.055389f, 0.982910f, 0.050812f,
+ 0.983398f, 0.046997f, 0.984375f, 0.043518f, 0.984863f, 0.040405f, 0.985352f, 0.037506f,
+ 0.985840f, 0.034821f, 0.986816f, 0.032104f, 0.987305f, 0.029785f, 0.988281f, 0.027313f,
+ 0.989258f, 0.025101f, 0.989746f, 0.022873f, 0.991699f, 0.020355f, 0.991699f, 0.018433f,
+ 0.992188f, 0.016846f, 0.992188f, 0.015388f, 0.992676f, 0.014084f, 0.992676f, 0.012863f,
+ 0.993164f, 0.011726f, 0.993164f, 0.010712f, 0.993652f, 0.009682f, 0.993652f, 0.008865f,
+ 0.994141f, 0.007927f, 0.994141f, 0.007278f, 0.994629f, 0.006413f, 0.995117f, 0.005615f,
+ 0.995605f, 0.004871f, 0.996094f, 0.004139f, 0.996582f, 0.003366f, 0.997070f, 0.002584f,
+ 0.999023f, 0.000851f, 0.999023f, 0.000255f, 0.999023f, 0.000056f, 0.999023f, 0.000001f,
+ 0.000000f, 1.000000f, 0.536621f, 0.777344f, 0.695801f, 0.636719f, 0.774414f, 0.542480f,
+ 0.821289f, 0.471924f, 0.851562f, 0.416992f, 0.875488f, 0.371826f, 0.893066f, 0.334229f,
+ 0.905762f, 0.302490f, 0.916504f, 0.275146f, 0.926270f, 0.250244f, 0.932617f, 0.229370f,
+ 0.937500f, 0.211182f, 0.942383f, 0.194824f, 0.948730f, 0.178955f, 0.953613f, 0.164429f,
+ 0.956055f, 0.152222f, 0.958984f, 0.141113f, 0.962402f, 0.130371f, 0.964355f, 0.121338f,
+ 0.966309f, 0.112976f, 0.968262f, 0.105103f, 0.970703f, 0.097351f, 0.971680f, 0.090881f,
+ 0.972656f, 0.084961f, 0.974121f, 0.079407f, 0.976074f, 0.073608f, 0.978516f, 0.067688f,
+ 0.981445f, 0.061859f, 0.982422f, 0.057129f, 0.982910f, 0.053009f, 0.983887f, 0.049103f,
+ 0.984375f, 0.045593f, 0.985352f, 0.042145f, 0.986328f, 0.038910f, 0.987305f, 0.035889f,
+ 0.987793f, 0.033142f, 0.989258f, 0.030258f, 0.991211f, 0.027222f, 0.991211f, 0.024750f,
+ 0.991699f, 0.022583f, 0.991699f, 0.020828f, 0.992188f, 0.019012f, 0.992676f, 0.017410f,
+ 0.992676f, 0.015991f, 0.993164f, 0.014557f, 0.993164f, 0.013405f, 0.993652f, 0.012123f,
+ 0.994141f, 0.010986f, 0.994141f, 0.010017f, 0.994629f, 0.008949f, 0.995117f, 0.007988f,
+ 0.995117f, 0.007233f, 0.995605f, 0.006310f, 0.996094f, 0.005432f, 0.996582f, 0.004585f,
+ 0.997070f, 0.003532f, 0.998047f, 0.002377f, 0.999023f, 0.001024f, 0.999023f, 0.000561f,
+ 0.999023f, 0.000288f, 0.999023f, 0.000121f, 0.999023f, 0.000029f, 0.999023f, 0.000000f,
+ 0.000000f, 1.000000f, 0.546875f, 0.773438f, 0.705566f, 0.632324f, 0.782227f, 0.537598f,
+ 0.827637f, 0.467285f, 0.860352f, 0.411377f, 0.882812f, 0.366455f, 0.897949f, 0.329834f,
+ 0.912109f, 0.297363f, 0.920410f, 0.270752f, 0.929688f, 0.246704f, 0.937500f, 0.224854f,
+ 0.941895f, 0.207031f, 0.947754f, 0.190063f, 0.950684f, 0.175903f, 0.956055f, 0.161865f,
+ 0.959961f, 0.148682f, 0.962402f, 0.137695f, 0.965332f, 0.127441f, 0.968750f, 0.117493f,
+ 0.969727f, 0.109253f, 0.970703f, 0.101868f, 0.972656f, 0.094788f, 0.974121f, 0.088257f,
+ 0.976074f, 0.081970f, 0.977539f, 0.075928f, 0.978027f, 0.070923f, 0.978516f, 0.066406f,
+ 0.980957f, 0.061340f, 0.982422f, 0.056458f, 0.983398f, 0.052124f, 0.984375f, 0.048096f,
+ 0.985840f, 0.044220f, 0.987305f, 0.040497f, 0.989258f, 0.036713f, 0.989746f, 0.033386f,
+ 0.990234f, 0.030594f, 0.990723f, 0.028076f, 0.991211f, 0.025787f, 0.991699f, 0.023804f,
+ 0.991699f, 0.021835f, 0.992188f, 0.019974f, 0.992676f, 0.018265f, 0.992676f, 0.016815f,
+ 0.993164f, 0.015274f, 0.993652f, 0.013832f, 0.994141f, 0.012505f, 0.994629f, 0.011330f,
+ 0.994629f, 0.010185f, 0.995117f, 0.009026f, 0.995605f, 0.007919f, 0.996094f, 0.006863f,
+ 0.997070f, 0.005650f, 0.998047f, 0.004478f, 0.999512f, 0.002747f, 0.999512f, 0.001852f,
+ 0.999512f, 0.001303f, 0.999512f, 0.000901f, 0.999512f, 0.000597f, 0.999512f, 0.000368f,
+ 0.999512f, 0.000201f, 0.999512f, 0.000087f, 0.999512f, 0.000021f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.555664f, 0.770020f, 0.714844f, 0.627930f, 0.791992f, 0.531738f,
+ 0.837402f, 0.461670f, 0.868164f, 0.406250f, 0.888184f, 0.362061f, 0.905273f, 0.324219f,
+ 0.916016f, 0.293457f, 0.927734f, 0.265625f, 0.933594f, 0.242798f, 0.940918f, 0.221802f,
+ 0.946777f, 0.203003f, 0.952148f, 0.185913f, 0.955078f, 0.171753f, 0.957520f, 0.159058f,
+ 0.961426f, 0.146851f, 0.965332f, 0.134766f, 0.967773f, 0.124573f, 0.969727f, 0.115417f,
+ 0.972168f, 0.106750f, 0.975586f, 0.098083f, 0.976074f, 0.091064f, 0.977051f, 0.084839f,
+ 0.977539f, 0.079163f, 0.978516f, 0.073914f, 0.979004f, 0.069031f, 0.979980f, 0.064392f,
+ 0.980957f, 0.059998f, 0.982422f, 0.055725f, 0.983887f, 0.051178f, 0.986328f, 0.046539f,
+ 0.987305f, 0.042542f, 0.988281f, 0.039032f, 0.988770f, 0.035858f, 0.989258f, 0.033020f,
+ 0.990234f, 0.030258f, 0.990723f, 0.027756f, 0.991211f, 0.025452f, 0.991699f, 0.023285f,
+ 0.992188f, 0.021271f, 0.992676f, 0.019379f, 0.993164f, 0.017578f, 0.993652f, 0.015900f,
+ 0.994141f, 0.014305f, 0.995117f, 0.012695f, 0.995605f, 0.011139f, 0.996094f, 0.009712f,
+ 0.997070f, 0.008133f, 0.999023f, 0.006161f, 0.999512f, 0.004524f, 0.999512f, 0.003595f,
+ 0.999512f, 0.002872f, 0.999512f, 0.002279f, 0.999512f, 0.001782f, 0.999512f, 0.001365f,
+ 0.999512f, 0.001016f, 0.999512f, 0.000727f, 0.999512f, 0.000493f, 0.999512f, 0.000308f,
+ 0.999512f, 0.000170f, 0.999512f, 0.000074f, 0.999512f, 0.000018f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.561523f, 0.768066f, 0.722168f, 0.624512f, 0.799316f, 0.527832f,
+ 0.844238f, 0.457275f, 0.873047f, 0.402588f, 0.895508f, 0.356934f, 0.910645f, 0.320068f,
+ 0.921387f, 0.289307f, 0.930176f, 0.262451f, 0.937012f, 0.239136f, 0.944336f, 0.218628f,
+ 0.952637f, 0.197998f, 0.952637f, 0.183838f, 0.954590f, 0.171387f, 0.962402f, 0.155518f,
+ 0.968262f, 0.140869f, 0.968262f, 0.130981f, 0.968262f, 0.122559f, 0.968262f, 0.115051f,
+ 0.968262f, 0.108215f, 0.973633f, 0.099670f, 0.979980f, 0.089417f, 0.983887f, 0.079895f,
+ 0.983887f, 0.073853f, 0.983887f, 0.068726f, 0.983887f, 0.064148f, 0.983887f, 0.060028f,
+ 0.983887f, 0.056274f, 0.983887f, 0.052795f, 0.983887f, 0.049622f, 0.983887f, 0.046692f,
+ 0.983887f, 0.043976f, 0.983887f, 0.041443f, 0.983887f, 0.039124f, 0.983887f, 0.036987f,
+ 0.983887f, 0.034973f, 0.983887f, 0.033142f, 0.988770f, 0.029465f, 0.995117f, 0.023483f,
+ 0.999512f, 0.017349f, 0.999512f, 0.014488f, 0.999512f, 0.012405f, 0.999512f, 0.010712f,
+ 0.999512f, 0.009277f, 0.999512f, 0.008026f, 0.999512f, 0.006931f, 0.999512f, 0.005959f,
+ 0.999512f, 0.005089f, 0.999512f, 0.004318f, 0.999512f, 0.003630f, 0.999512f, 0.003019f,
+ 0.999512f, 0.002478f, 0.999512f, 0.002003f, 0.999512f, 0.001587f, 0.999512f, 0.001227f,
+ 0.999512f, 0.000921f, 0.999512f, 0.000663f, 0.999512f, 0.000452f, 0.999512f, 0.000283f,
+ 0.999512f, 0.000157f, 0.999512f, 0.000068f, 0.999512f, 0.000017f, 0.999512f, 0.000000f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.993652f,
+ 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990234f,
+ 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.988281f, 0.000000f, 0.987305f,
+ 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.981934f,
+ 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976074f, 0.000000f, 0.974609f,
+ 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.965332f, 0.000000f, 0.961426f,
+ 0.000000f, 0.956543f, 0.000000f, 0.951172f, 0.000000f, 0.945801f, 0.000000f, 0.935547f,
+ 0.000000f, 0.925781f, 0.000000f, 0.914062f, 0.000000f, 0.895508f, 0.000000f, 0.871094f,
+ 0.000000f, 0.834961f, 0.000000f, 0.773438f, 0.000000f, 0.648926f, 0.000000f, 0.289062f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f,
+ 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990723f,
+ 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986816f,
+ 0.000000f, 0.986328f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, 0.000000f, 0.981445f,
+ 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, 0.000000f, 0.973633f,
+ 0.000000f, 0.971680f, 0.000000f, 0.968262f, 0.000000f, 0.964844f, 0.000000f, 0.960938f,
+ 0.000000f, 0.956543f, 0.000000f, 0.950684f, 0.000000f, 0.944336f, 0.000000f, 0.936035f,
+ 0.000000f, 0.926758f, 0.000000f, 0.913086f, 0.000000f, 0.895508f, 0.000000f, 0.871582f,
+ 0.000000f, 0.834473f, 0.000000f, 0.773438f, 0.000000f, 0.649414f, 0.000000f, 0.288818f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f,
+ 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f,
+ 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987793f, 0.000000f, 0.986816f,
+ 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.982910f, 0.000000f, 0.981445f,
+ 0.000000f, 0.979492f, 0.000000f, 0.978516f, 0.000000f, 0.976074f, 0.000000f, 0.973633f,
+ 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.964844f, 0.000000f, 0.960938f,
+ 0.000000f, 0.955566f, 0.000000f, 0.951172f, 0.000000f, 0.943359f, 0.000000f, 0.936035f,
+ 0.000000f, 0.925293f, 0.000000f, 0.912598f, 0.000000f, 0.894531f, 0.000000f, 0.870605f,
+ 0.000006f, 0.833496f, 0.000010f, 0.772461f, 0.000008f, 0.648438f, 0.000008f, 0.288574f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991699f, 0.000000f, 0.990723f,
+ 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986816f,
+ 0.000000f, 0.985352f, 0.000000f, 0.983887f, 0.000000f, 0.983398f, 0.000000f, 0.981445f,
+ 0.000000f, 0.979980f, 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.973633f,
+ 0.000000f, 0.970215f, 0.000000f, 0.967773f, 0.000000f, 0.963867f, 0.000000f, 0.959961f,
+ 0.000000f, 0.955566f, 0.000000f, 0.950195f, 0.000000f, 0.943359f, 0.000000f, 0.935059f,
+ 0.000002f, 0.924316f, 0.000040f, 0.911621f, 0.000050f, 0.894531f, 0.000046f, 0.869629f,
+ 0.000037f, 0.832520f, 0.000038f, 0.771484f, 0.000034f, 0.647461f, 0.000048f, 0.288574f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992676f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f,
+ 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986328f,
+ 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.982422f, 0.000000f, 0.981445f,
+ 0.000000f, 0.979004f, 0.000000f, 0.977051f, 0.000000f, 0.975098f, 0.000000f, 0.972656f,
+ 0.000000f, 0.970215f, 0.000000f, 0.966797f, 0.000000f, 0.963867f, 0.000004f, 0.958984f,
+ 0.000046f, 0.955078f, 0.000106f, 0.948730f, 0.000137f, 0.941895f, 0.000143f, 0.934082f,
+ 0.000137f, 0.923340f, 0.000123f, 0.910156f, 0.000104f, 0.892090f, 0.000097f, 0.867676f,
+ 0.000106f, 0.830566f, 0.000104f, 0.770020f, 0.000115f, 0.645996f, 0.000159f, 0.288574f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.989746f,
+ 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985352f,
+ 0.000000f, 0.984375f, 0.000000f, 0.982910f, 0.000000f, 0.981934f, 0.000000f, 0.980469f,
+ 0.000000f, 0.979004f, 0.000006f, 0.976562f, 0.000049f, 0.974121f, 0.000107f, 0.972168f,
+ 0.000173f, 0.969727f, 0.000252f, 0.965820f, 0.000304f, 0.961914f, 0.000314f, 0.958496f,
+ 0.000311f, 0.953613f, 0.000291f, 0.947754f, 0.000272f, 0.940918f, 0.000242f, 0.932617f,
+ 0.000210f, 0.922363f, 0.000218f, 0.908203f, 0.000246f, 0.891602f, 0.000224f, 0.865723f,
+ 0.000236f, 0.828613f, 0.000253f, 0.767090f, 0.000292f, 0.643555f, 0.000375f, 0.287598f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f,
+ 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, 0.000000f, 0.989258f,
+ 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000035f, 0.985352f,
+ 0.000091f, 0.983887f, 0.000156f, 0.982422f, 0.000232f, 0.980957f, 0.000312f, 0.979492f,
+ 0.000395f, 0.978027f, 0.000480f, 0.975586f, 0.000554f, 0.973145f, 0.000570f, 0.970703f,
+ 0.000570f, 0.968750f, 0.000544f, 0.964844f, 0.000521f, 0.960938f, 0.000485f, 0.957520f,
+ 0.000441f, 0.952148f, 0.000400f, 0.945801f, 0.000381f, 0.938965f, 0.000429f, 0.930664f,
+ 0.000463f, 0.919922f, 0.000434f, 0.905762f, 0.000452f, 0.888672f, 0.000465f, 0.862793f,
+ 0.000487f, 0.825684f, 0.000551f, 0.764648f, 0.000658f, 0.641602f, 0.000727f, 0.287598f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f,
+ 0.000034f, 0.990234f, 0.000091f, 0.989746f, 0.000167f, 0.989746f, 0.000245f, 0.988281f,
+ 0.000331f, 0.987793f, 0.000414f, 0.986816f, 0.000508f, 0.985840f, 0.000592f, 0.984863f,
+ 0.000685f, 0.982910f, 0.000777f, 0.981445f, 0.000857f, 0.979980f, 0.000911f, 0.978516f,
+ 0.000914f, 0.976562f, 0.000883f, 0.975098f, 0.000852f, 0.972656f, 0.000809f, 0.970215f,
+ 0.000752f, 0.966309f, 0.000697f, 0.963867f, 0.000645f, 0.959961f, 0.000637f, 0.955566f,
+ 0.000673f, 0.950684f, 0.000732f, 0.943848f, 0.000761f, 0.937012f, 0.000726f, 0.928711f,
+ 0.000751f, 0.917480f, 0.000775f, 0.903320f, 0.000820f, 0.885254f, 0.000855f, 0.859863f,
+ 0.000935f, 0.822754f, 0.001027f, 0.761230f, 0.001259f, 0.638672f, 0.001232f, 0.287109f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f,
+ 0.000000f, 0.995605f, 0.000024f, 0.995117f, 0.000093f, 0.994629f, 0.000174f, 0.994141f,
+ 0.000262f, 0.993164f, 0.000355f, 0.992188f, 0.000454f, 0.991699f, 0.000539f, 0.990723f,
+ 0.000645f, 0.990234f, 0.000741f, 0.989746f, 0.000824f, 0.988281f, 0.000926f, 0.987793f,
+ 0.001020f, 0.986816f, 0.001103f, 0.985840f, 0.001187f, 0.984863f, 0.001285f, 0.983887f,
+ 0.001313f, 0.982422f, 0.001288f, 0.980957f, 0.001254f, 0.979004f, 0.001206f, 0.977051f,
+ 0.001139f, 0.975586f, 0.001061f, 0.973633f, 0.000997f, 0.972168f, 0.000975f, 0.967773f,
+ 0.000974f, 0.965332f, 0.001003f, 0.961914f, 0.001057f, 0.958496f, 0.001117f, 0.953125f,
+ 0.001145f, 0.948730f, 0.001167f, 0.942383f, 0.001165f, 0.934570f, 0.001213f, 0.925781f,
+ 0.001296f, 0.915039f, 0.001301f, 0.900879f, 0.001404f, 0.882324f, 0.001483f, 0.855957f,
+ 0.001650f, 0.818848f, 0.001833f, 0.757812f, 0.002214f, 0.635742f, 0.001906f, 0.287109f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000047f, 0.996094f,
+ 0.000143f, 0.996094f, 0.000244f, 0.995605f, 0.000353f, 0.995605f, 0.000449f, 0.995605f,
+ 0.000572f, 0.994629f, 0.000674f, 0.994629f, 0.000766f, 0.994141f, 0.000885f, 0.993652f,
+ 0.000984f, 0.992676f, 0.001068f, 0.991699f, 0.001168f, 0.991211f, 0.001270f, 0.990723f,
+ 0.001357f, 0.989258f, 0.001431f, 0.988281f, 0.001523f, 0.987793f, 0.001617f, 0.986816f,
+ 0.001698f, 0.985840f, 0.001721f, 0.984375f, 0.001691f, 0.983398f, 0.001654f, 0.982910f,
+ 0.001585f, 0.981445f, 0.001496f, 0.979980f, 0.001397f, 0.978027f, 0.001406f, 0.976074f,
+ 0.001396f, 0.973633f, 0.001430f, 0.972168f, 0.001470f, 0.969238f, 0.001474f, 0.966797f,
+ 0.001557f, 0.963379f, 0.001629f, 0.959961f, 0.001714f, 0.956055f, 0.001678f, 0.951660f,
+ 0.001768f, 0.945801f, 0.001828f, 0.939941f, 0.001842f, 0.932129f, 0.001952f, 0.922852f,
+ 0.002094f, 0.911133f, 0.002110f, 0.896973f, 0.002304f, 0.878418f, 0.002434f, 0.852539f,
+ 0.002714f, 0.814453f, 0.003059f, 0.752930f, 0.003597f, 0.632324f, 0.002754f, 0.286865f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000027f, 0.997559f, 0.000131f, 0.997559f, 0.000248f, 0.997070f,
+ 0.000387f, 0.997070f, 0.000514f, 0.996582f, 0.000621f, 0.996094f, 0.000764f, 0.995605f,
+ 0.000876f, 0.995605f, 0.000966f, 0.995605f, 0.001093f, 0.995605f, 0.001204f, 0.994629f,
+ 0.001294f, 0.994141f, 0.001368f, 0.993652f, 0.001486f, 0.993164f, 0.001585f, 0.992676f,
+ 0.001666f, 0.992188f, 0.001733f, 0.991699f, 0.001820f, 0.990723f, 0.001919f, 0.989258f,
+ 0.001999f, 0.988770f, 0.002064f, 0.987793f, 0.002108f, 0.987305f, 0.002106f, 0.985840f,
+ 0.002058f, 0.984375f, 0.001984f, 0.983887f, 0.001900f, 0.982422f, 0.001882f, 0.981445f,
+ 0.001940f, 0.979980f, 0.001935f, 0.978516f, 0.001980f, 0.976562f, 0.002047f, 0.974609f,
+ 0.001980f, 0.972656f, 0.002090f, 0.969727f, 0.002176f, 0.967285f, 0.002317f, 0.964844f,
+ 0.002331f, 0.961426f, 0.002422f, 0.957520f, 0.002544f, 0.953613f, 0.002468f, 0.949219f,
+ 0.002621f, 0.942871f, 0.002783f, 0.937012f, 0.002794f, 0.928711f, 0.002975f, 0.919922f,
+ 0.003170f, 0.907715f, 0.003275f, 0.893066f, 0.003574f, 0.873535f, 0.003830f, 0.847656f,
+ 0.004234f, 0.809570f, 0.004757f, 0.747559f, 0.005520f, 0.628418f, 0.003780f, 0.285889f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000102f, 0.998047f, 0.000284f, 0.998047f, 0.000417f, 0.998047f,
+ 0.000606f, 0.997559f, 0.000735f, 0.997070f, 0.000863f, 0.997070f, 0.001017f, 0.996582f,
+ 0.001127f, 0.996582f, 0.001209f, 0.996094f, 0.001348f, 0.995605f, 0.001465f, 0.995605f,
+ 0.001553f, 0.995605f, 0.001619f, 0.995117f, 0.001728f, 0.994141f, 0.001839f, 0.993652f,
+ 0.001923f, 0.993164f, 0.001987f, 0.993164f, 0.002039f, 0.992676f, 0.002150f, 0.992188f,
+ 0.002245f, 0.991211f, 0.002316f, 0.990723f, 0.002371f, 0.989746f, 0.002415f, 0.989258f,
+ 0.002478f, 0.987793f, 0.002478f, 0.987305f, 0.002476f, 0.985352f, 0.002516f, 0.984375f,
+ 0.002474f, 0.983398f, 0.002546f, 0.982422f, 0.002649f, 0.981445f, 0.002626f, 0.979980f,
+ 0.002687f, 0.978027f, 0.002762f, 0.976562f, 0.002665f, 0.975098f, 0.002789f, 0.973145f,
+ 0.003000f, 0.970703f, 0.003017f, 0.968262f, 0.003206f, 0.965332f, 0.003342f, 0.962402f,
+ 0.003263f, 0.958984f, 0.003431f, 0.955078f, 0.003626f, 0.950684f, 0.003599f, 0.945801f,
+ 0.003780f, 0.939941f, 0.004051f, 0.933105f, 0.004108f, 0.924805f, 0.004383f, 0.915527f,
+ 0.004662f, 0.903320f, 0.004910f, 0.888184f, 0.005352f, 0.868164f, 0.005867f, 0.842285f,
+ 0.006401f, 0.803711f, 0.007095f, 0.742188f, 0.008057f, 0.624023f, 0.004993f, 0.285156f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000081f, 0.998535f, 0.000302f, 0.998535f, 0.000503f, 0.998535f,
+ 0.000695f, 0.998047f, 0.000876f, 0.998047f, 0.000982f, 0.998047f, 0.001150f, 0.997559f,
+ 0.001296f, 0.997070f, 0.001388f, 0.996582f, 0.001451f, 0.996582f, 0.001623f, 0.996582f,
+ 0.001734f, 0.995605f, 0.001808f, 0.995605f, 0.001862f, 0.995605f, 0.001980f, 0.995117f,
+ 0.002098f, 0.994629f, 0.002176f, 0.994141f, 0.002234f, 0.993652f, 0.002275f, 0.993164f,
+ 0.002382f, 0.992676f, 0.002489f, 0.992188f, 0.002562f, 0.991699f, 0.002615f, 0.991211f,
+ 0.002659f, 0.990234f, 0.002787f, 0.989746f, 0.003012f, 0.989258f, 0.003216f, 0.988281f,
+ 0.003222f, 0.987305f, 0.003229f, 0.985840f, 0.003298f, 0.984375f, 0.003304f, 0.982910f,
+ 0.003435f, 0.981934f, 0.003376f, 0.980957f, 0.003464f, 0.979492f, 0.003538f, 0.978027f,
+ 0.003477f, 0.976074f, 0.003742f, 0.975098f, 0.003778f, 0.972656f, 0.003975f, 0.970703f,
+ 0.004223f, 0.968750f, 0.004154f, 0.965332f, 0.004326f, 0.962891f, 0.004601f, 0.959473f,
+ 0.004822f, 0.956055f, 0.004776f, 0.952637f, 0.005104f, 0.947754f, 0.005302f, 0.942383f,
+ 0.005474f, 0.936523f, 0.005756f, 0.928711f, 0.006172f, 0.921387f, 0.006298f, 0.910645f,
+ 0.006702f, 0.898438f, 0.007130f, 0.882812f, 0.007660f, 0.863281f, 0.008499f, 0.836426f,
+ 0.009254f, 0.797363f, 0.010170f, 0.736816f, 0.011246f, 0.618652f, 0.006378f, 0.284424f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000264f, 0.999023f,
+ 0.000602f, 0.999023f, 0.000731f, 0.998535f, 0.001012f, 0.998535f, 0.001136f, 0.998535f,
+ 0.001204f, 0.998047f, 0.001447f, 0.998047f, 0.001554f, 0.997559f, 0.001611f, 0.997070f,
+ 0.001727f, 0.996582f, 0.001894f, 0.996582f, 0.001978f, 0.996094f, 0.002029f, 0.996094f,
+ 0.002062f, 0.995605f, 0.002239f, 0.995117f, 0.002346f, 0.994629f, 0.002407f, 0.994141f,
+ 0.002447f, 0.993652f, 0.002476f, 0.993652f, 0.002623f, 0.992676f, 0.002729f, 0.992676f,
+ 0.002857f, 0.991699f, 0.003014f, 0.991211f, 0.003183f, 0.990234f, 0.003355f, 0.989746f,
+ 0.003656f, 0.989258f, 0.003870f, 0.988281f, 0.004047f, 0.987793f, 0.004227f, 0.987305f,
+ 0.004368f, 0.986328f, 0.004185f, 0.984375f, 0.004223f, 0.983398f, 0.004368f, 0.981934f,
+ 0.004330f, 0.980957f, 0.004547f, 0.979004f, 0.004528f, 0.977539f, 0.004745f, 0.976074f,
+ 0.004795f, 0.974121f, 0.005066f, 0.972168f, 0.005344f, 0.970703f, 0.005402f, 0.968262f,
+ 0.005703f, 0.966309f, 0.005959f, 0.963379f, 0.006004f, 0.959961f, 0.006271f, 0.956055f,
+ 0.006565f, 0.952637f, 0.006737f, 0.949219f, 0.007008f, 0.943848f, 0.007416f, 0.938477f,
+ 0.007626f, 0.931641f, 0.008102f, 0.924805f, 0.008652f, 0.916016f, 0.008797f, 0.905273f,
+ 0.009682f, 0.893555f, 0.010048f, 0.876953f, 0.010895f, 0.856934f, 0.012062f, 0.830078f,
+ 0.012970f, 0.790527f, 0.014359f, 0.729980f, 0.015228f, 0.614258f, 0.007942f, 0.284424f,
+ 0.000000f, 1.000000f, 0.000283f, 0.999512f, 0.000668f, 0.999023f, 0.000844f, 0.999023f,
+ 0.001106f, 0.999023f, 0.001267f, 0.998535f, 0.001311f, 0.998535f, 0.001565f, 0.998047f,
+ 0.001694f, 0.997559f, 0.001740f, 0.997559f, 0.001763f, 0.997070f, 0.002033f, 0.996582f,
+ 0.002125f, 0.996582f, 0.002167f, 0.996094f, 0.002190f, 0.996094f, 0.002348f, 0.995605f,
+ 0.002499f, 0.994629f, 0.002560f, 0.994141f, 0.002592f, 0.994141f, 0.002647f, 0.993652f,
+ 0.002880f, 0.993164f, 0.003187f, 0.992676f, 0.003418f, 0.991699f, 0.003588f, 0.991211f,
+ 0.003782f, 0.990723f, 0.003929f, 0.990234f, 0.004223f, 0.989258f, 0.004486f, 0.988281f,
+ 0.004658f, 0.987793f, 0.004787f, 0.987305f, 0.004955f, 0.986328f, 0.005135f, 0.985352f,
+ 0.005482f, 0.984375f, 0.005833f, 0.983398f, 0.005672f, 0.982422f, 0.005924f, 0.980469f,
+ 0.005871f, 0.978516f, 0.005802f, 0.977051f, 0.006145f, 0.975586f, 0.006302f, 0.973633f,
+ 0.006660f, 0.971680f, 0.006687f, 0.969727f, 0.007061f, 0.967285f, 0.007484f, 0.965820f,
+ 0.007687f, 0.962891f, 0.008286f, 0.960449f, 0.008484f, 0.957031f, 0.008606f, 0.952637f,
+ 0.009003f, 0.949219f, 0.009155f, 0.944824f, 0.009781f, 0.939453f, 0.010323f, 0.933594f,
+ 0.010620f, 0.926758f, 0.011230f, 0.919434f, 0.011917f, 0.910645f, 0.012451f, 0.899414f,
+ 0.013443f, 0.886230f, 0.014389f, 0.870605f, 0.015373f, 0.849609f, 0.016815f, 0.822266f,
+ 0.018066f, 0.782715f, 0.019653f, 0.722656f, 0.020294f, 0.608398f, 0.009796f, 0.283691f,
+ 0.000000f, 1.000000f, 0.000468f, 0.999512f, 0.000923f, 0.999023f, 0.001113f, 0.999023f,
+ 0.001366f, 0.999023f, 0.001387f, 0.998535f, 0.001693f, 0.998047f, 0.001807f, 0.997559f,
+ 0.001831f, 0.997559f, 0.001842f, 0.997070f, 0.002182f, 0.996582f, 0.002247f, 0.996094f,
+ 0.002270f, 0.996094f, 0.002281f, 0.995605f, 0.002510f, 0.995117f, 0.002722f, 0.994141f,
+ 0.002935f, 0.994141f, 0.003124f, 0.993652f, 0.003315f, 0.993652f, 0.003624f, 0.992676f,
+ 0.003979f, 0.992188f, 0.004162f, 0.991211f, 0.004307f, 0.990723f, 0.004482f, 0.990234f,
+ 0.004616f, 0.989746f, 0.004944f, 0.988770f, 0.005177f, 0.987793f, 0.005447f, 0.987305f,
+ 0.005699f, 0.986816f, 0.005943f, 0.985352f, 0.006218f, 0.984375f, 0.006699f, 0.983398f,
+ 0.007027f, 0.982422f, 0.007305f, 0.981445f, 0.007561f, 0.979980f, 0.007656f, 0.978516f,
+ 0.007450f, 0.977051f, 0.007889f, 0.974609f, 0.008018f, 0.972656f, 0.008438f, 0.971191f,
+ 0.008598f, 0.968750f, 0.009048f, 0.967285f, 0.009216f, 0.964355f, 0.009689f, 0.962402f,
+ 0.010208f, 0.958984f, 0.010872f, 0.956543f, 0.011383f, 0.953125f, 0.011360f, 0.948730f,
+ 0.011871f, 0.944336f, 0.012604f, 0.939941f, 0.013451f, 0.934570f, 0.013954f, 0.928223f,
+ 0.014702f, 0.921875f, 0.015388f, 0.913574f, 0.016068f, 0.904297f, 0.017151f, 0.893066f,
+ 0.018478f, 0.879395f, 0.019714f, 0.862793f, 0.021103f, 0.841797f, 0.022858f, 0.813477f,
+ 0.024536f, 0.773926f, 0.026413f, 0.714844f, 0.026642f, 0.602051f, 0.012016f, 0.282227f,
+ 0.000000f, 1.000000f, 0.000483f, 0.999512f, 0.000957f, 0.999023f, 0.001391f, 0.999023f,
+ 0.001421f, 0.999023f, 0.001425f, 0.998535f, 0.001857f, 0.997559f, 0.001879f, 0.997070f,
+ 0.001884f, 0.997070f, 0.001886f, 0.997070f, 0.002312f, 0.996582f, 0.002407f, 0.996094f,
+ 0.002625f, 0.995605f, 0.002810f, 0.994629f, 0.003429f, 0.994141f, 0.003607f, 0.994141f,
+ 0.003820f, 0.993652f, 0.003983f, 0.992676f, 0.004093f, 0.992188f, 0.004627f, 0.991211f,
+ 0.004807f, 0.990723f, 0.004925f, 0.990723f, 0.005051f, 0.989258f, 0.005360f, 0.988770f,
+ 0.005894f, 0.987793f, 0.006252f, 0.987305f, 0.006512f, 0.986328f, 0.006821f, 0.985352f,
+ 0.007072f, 0.984375f, 0.007339f, 0.983398f, 0.007820f, 0.982422f, 0.008232f, 0.981445f,
+ 0.008728f, 0.979980f, 0.009132f, 0.978516f, 0.009483f, 0.977539f, 0.009834f, 0.976074f,
+ 0.009956f, 0.974609f, 0.010094f, 0.972168f, 0.010612f, 0.970215f, 0.010773f, 0.967773f,
+ 0.011314f, 0.965332f, 0.011551f, 0.963379f, 0.012169f, 0.960938f, 0.012779f, 0.958008f,
+ 0.013603f, 0.955078f, 0.014061f, 0.951660f, 0.014893f, 0.948730f, 0.015343f, 0.944336f,
+ 0.015854f, 0.939453f, 0.016876f, 0.934570f, 0.017548f, 0.928711f, 0.018661f, 0.922363f,
+ 0.019592f, 0.915039f, 0.020508f, 0.906738f, 0.021973f, 0.897461f, 0.023499f, 0.885742f,
+ 0.024612f, 0.871094f, 0.026230f, 0.854492f, 0.028091f, 0.833008f, 0.030380f, 0.804199f,
+ 0.032776f, 0.765137f, 0.034912f, 0.706543f, 0.034424f, 0.596191f, 0.014549f, 0.281494f,
+ 0.000000f, 1.000000f, 0.000487f, 0.999512f, 0.000968f, 0.999023f, 0.001431f, 0.998535f,
+ 0.001442f, 0.998047f, 0.001442f, 0.998047f, 0.001902f, 0.997559f, 0.001909f, 0.997070f,
+ 0.002071f, 0.997070f, 0.002789f, 0.996094f, 0.003050f, 0.995605f, 0.003273f, 0.995117f,
+ 0.003405f, 0.994629f, 0.004002f, 0.994629f, 0.004215f, 0.993652f, 0.004314f, 0.993164f,
+ 0.004517f, 0.992676f, 0.004650f, 0.991699f, 0.005188f, 0.991211f, 0.005501f, 0.990234f,
+ 0.005878f, 0.989746f, 0.006168f, 0.988770f, 0.006428f, 0.987793f, 0.006653f, 0.987305f,
+ 0.007305f, 0.986328f, 0.007641f, 0.985352f, 0.007996f, 0.984375f, 0.008316f, 0.983398f,
+ 0.008682f, 0.982422f, 0.009125f, 0.981445f, 0.009880f, 0.979980f, 0.010239f, 0.979004f,
+ 0.010757f, 0.977539f, 0.011223f, 0.975586f, 0.011703f, 0.974609f, 0.012230f, 0.973145f,
+ 0.013145f, 0.971191f, 0.013092f, 0.969238f, 0.013313f, 0.966309f, 0.013916f, 0.964355f,
+ 0.014297f, 0.961914f, 0.014717f, 0.959473f, 0.015808f, 0.956543f, 0.016357f, 0.953125f,
+ 0.017151f, 0.950195f, 0.018295f, 0.946777f, 0.019104f, 0.942871f, 0.020248f, 0.938965f,
+ 0.020508f, 0.933594f, 0.021713f, 0.927734f, 0.022949f, 0.921875f, 0.024399f, 0.915527f,
+ 0.025558f, 0.907715f, 0.026520f, 0.898926f, 0.028717f, 0.889160f, 0.030579f, 0.876953f,
+ 0.032135f, 0.861816f, 0.035004f, 0.845215f, 0.037018f, 0.823242f, 0.039978f, 0.794922f,
+ 0.042419f, 0.755371f, 0.044800f, 0.697266f, 0.043121f, 0.589844f, 0.017395f, 0.280273f,
+ 0.000000f, 1.000000f, 0.000488f, 0.999512f, 0.000972f, 0.999023f, 0.000971f, 0.998535f,
+ 0.001451f, 0.998047f, 0.001614f, 0.997559f, 0.002438f, 0.997559f, 0.002659f, 0.996582f,
+ 0.002949f, 0.996094f, 0.003531f, 0.995605f, 0.003788f, 0.995117f, 0.003937f, 0.994629f,
+ 0.004017f, 0.994141f, 0.004654f, 0.993164f, 0.004913f, 0.992676f, 0.005222f, 0.991699f,
+ 0.005497f, 0.991211f, 0.005886f, 0.990723f, 0.006630f, 0.989746f, 0.006908f, 0.988770f,
+ 0.007088f, 0.988281f, 0.007408f, 0.986816f, 0.007881f, 0.986328f, 0.008659f, 0.985352f,
+ 0.009048f, 0.983887f, 0.009445f, 0.982910f, 0.009811f, 0.982422f, 0.010262f, 0.980957f,
+ 0.010788f, 0.979492f, 0.011696f, 0.978516f, 0.012161f, 0.977051f, 0.012642f, 0.975586f,
+ 0.013237f, 0.974609f, 0.013939f, 0.972656f, 0.014565f, 0.971191f, 0.015205f, 0.969238f,
+ 0.016235f, 0.967285f, 0.016907f, 0.965332f, 0.017075f, 0.962891f, 0.017609f, 0.959961f,
+ 0.018082f, 0.957031f, 0.018890f, 0.954590f, 0.019913f, 0.951172f, 0.021042f, 0.947754f,
+ 0.021851f, 0.944336f, 0.023163f, 0.940430f, 0.024094f, 0.936523f, 0.025558f, 0.932129f,
+ 0.026855f, 0.926758f, 0.027924f, 0.920410f, 0.029587f, 0.914551f, 0.031021f, 0.907227f,
+ 0.033051f, 0.899414f, 0.034515f, 0.890137f, 0.036804f, 0.879395f, 0.038910f, 0.866699f,
+ 0.041595f, 0.852051f, 0.044312f, 0.834473f, 0.047272f, 0.812012f, 0.050568f, 0.783691f,
+ 0.053680f, 0.745117f, 0.056000f, 0.687988f, 0.053253f, 0.582520f, 0.020523f, 0.279541f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000972f, 0.998535f, 0.001241f, 0.998535f,
+ 0.002151f, 0.998047f, 0.002401f, 0.997559f, 0.003136f, 0.996582f, 0.003218f, 0.996094f,
+ 0.003532f, 0.995605f, 0.004105f, 0.995117f, 0.004219f, 0.994141f, 0.004749f, 0.993652f,
+ 0.005089f, 0.993164f, 0.005863f, 0.992188f, 0.006104f, 0.991211f, 0.006577f, 0.990723f,
+ 0.006821f, 0.989746f, 0.007076f, 0.989258f, 0.007965f, 0.987793f, 0.008492f, 0.986816f,
+ 0.008896f, 0.986328f, 0.009338f, 0.984863f, 0.009697f, 0.983887f, 0.010536f, 0.982910f,
+ 0.011124f, 0.981934f, 0.011749f, 0.980469f, 0.012245f, 0.979492f, 0.012779f, 0.978027f,
+ 0.013306f, 0.976562f, 0.014290f, 0.975098f, 0.015060f, 0.973145f, 0.015808f, 0.971680f,
+ 0.016525f, 0.970215f, 0.017227f, 0.968750f, 0.017853f, 0.966797f, 0.019196f, 0.964355f,
+ 0.020248f, 0.962402f, 0.021164f, 0.959961f, 0.022064f, 0.958008f, 0.022339f, 0.955078f,
+ 0.023056f, 0.951660f, 0.024124f, 0.948730f, 0.025513f, 0.944824f, 0.026443f, 0.940918f,
+ 0.027924f, 0.937500f, 0.029053f, 0.933105f, 0.030701f, 0.929199f, 0.032074f, 0.924316f,
+ 0.034454f, 0.918945f, 0.035583f, 0.912109f, 0.037170f, 0.905762f, 0.039062f, 0.897949f,
+ 0.041504f, 0.890137f, 0.044312f, 0.880371f, 0.046631f, 0.868652f, 0.049683f, 0.855957f,
+ 0.052673f, 0.841309f, 0.055847f, 0.822754f, 0.059631f, 0.800293f, 0.063293f, 0.771484f,
+ 0.066772f, 0.733398f, 0.068726f, 0.677246f, 0.064270f, 0.575684f, 0.023956f, 0.278564f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001137f, 0.999023f, 0.001858f, 0.998535f,
+ 0.002251f, 0.998047f, 0.002815f, 0.997070f, 0.003128f, 0.996094f, 0.003851f, 0.995605f,
+ 0.004227f, 0.994629f, 0.004791f, 0.994141f, 0.005646f, 0.993164f, 0.005867f, 0.992676f,
+ 0.006126f, 0.991211f, 0.007118f, 0.990723f, 0.007629f, 0.990234f, 0.008102f, 0.988770f,
+ 0.008438f, 0.987793f, 0.008934f, 0.987305f, 0.009979f, 0.985840f, 0.010483f, 0.984375f,
+ 0.011017f, 0.983887f, 0.011444f, 0.982910f, 0.012100f, 0.980957f, 0.013298f, 0.979980f,
+ 0.013916f, 0.978516f, 0.014526f, 0.977051f, 0.014999f, 0.976074f, 0.015808f, 0.974121f,
+ 0.017197f, 0.972656f, 0.017990f, 0.971191f, 0.018692f, 0.969238f, 0.019516f, 0.967285f,
+ 0.020493f, 0.965820f, 0.021423f, 0.963867f, 0.022812f, 0.961426f, 0.023941f, 0.958984f,
+ 0.025085f, 0.956543f, 0.026123f, 0.954590f, 0.027451f, 0.951660f, 0.028641f, 0.949219f,
+ 0.029221f, 0.945312f, 0.030762f, 0.941406f, 0.031921f, 0.937500f, 0.033142f, 0.933594f,
+ 0.034912f, 0.929199f, 0.036346f, 0.924805f, 0.038330f, 0.920410f, 0.040619f, 0.914551f,
+ 0.042999f, 0.909180f, 0.044800f, 0.902832f, 0.046875f, 0.895020f, 0.049530f, 0.887695f,
+ 0.052032f, 0.878906f, 0.055542f, 0.868652f, 0.057953f, 0.856445f, 0.061829f, 0.843750f,
+ 0.065002f, 0.828125f, 0.068970f, 0.810059f, 0.073425f, 0.787109f, 0.077759f, 0.758789f,
+ 0.081726f, 0.721680f, 0.083008f, 0.666016f, 0.075928f, 0.567383f, 0.027557f, 0.277832f,
+ 0.000000f, 1.000000f, 0.000567f, 0.999512f, 0.000938f, 0.999023f, 0.001864f, 0.998047f,
+ 0.002388f, 0.997559f, 0.003700f, 0.996582f, 0.004051f, 0.995605f, 0.004917f, 0.994629f,
+ 0.005440f, 0.994141f, 0.005817f, 0.993164f, 0.006748f, 0.991699f, 0.007397f, 0.991211f,
+ 0.008080f, 0.990234f, 0.008881f, 0.988770f, 0.009285f, 0.987793f, 0.009972f, 0.987305f,
+ 0.010849f, 0.985352f, 0.011360f, 0.984375f, 0.012276f, 0.983398f, 0.012993f, 0.981934f,
+ 0.013771f, 0.980469f, 0.014633f, 0.979492f, 0.015686f, 0.977539f, 0.016388f, 0.976074f,
+ 0.017349f, 0.974609f, 0.018112f, 0.973145f, 0.019073f, 0.971680f, 0.019943f, 0.969727f,
+ 0.021378f, 0.967773f, 0.022430f, 0.965820f, 0.023331f, 0.963867f, 0.024429f, 0.961914f,
+ 0.025589f, 0.959961f, 0.026825f, 0.957520f, 0.028534f, 0.955078f, 0.029800f, 0.952637f,
+ 0.031235f, 0.949707f, 0.032562f, 0.947266f, 0.034027f, 0.944336f, 0.035767f, 0.941406f,
+ 0.037903f, 0.937500f, 0.038879f, 0.933105f, 0.040375f, 0.929199f, 0.041870f, 0.924316f,
+ 0.043610f, 0.920410f, 0.045807f, 0.915527f, 0.047943f, 0.909668f, 0.051025f, 0.903809f,
+ 0.053436f, 0.897461f, 0.056458f, 0.891602f, 0.058563f, 0.883301f, 0.061310f, 0.875000f,
+ 0.064819f, 0.865234f, 0.068787f, 0.854980f, 0.071655f, 0.842773f, 0.076111f, 0.829590f,
+ 0.080139f, 0.813965f, 0.084229f, 0.795898f, 0.089355f, 0.772949f, 0.093872f, 0.744629f,
+ 0.097778f, 0.708496f, 0.098633f, 0.654785f, 0.088623f, 0.559082f, 0.031372f, 0.277344f,
+ 0.000000f, 1.000000f, 0.000956f, 0.999512f, 0.001315f, 0.998535f, 0.002008f, 0.998535f,
+ 0.003145f, 0.997070f, 0.004131f, 0.996094f, 0.004803f, 0.995117f, 0.005970f, 0.993652f,
+ 0.006893f, 0.992676f, 0.007431f, 0.991699f, 0.008705f, 0.990234f, 0.009399f, 0.988770f,
+ 0.009949f, 0.988281f, 0.010689f, 0.986816f, 0.012024f, 0.985352f, 0.012749f, 0.984375f,
+ 0.013504f, 0.982910f, 0.014328f, 0.981445f, 0.015587f, 0.979980f, 0.016495f, 0.978516f,
+ 0.017456f, 0.976562f, 0.018494f, 0.975098f, 0.019836f, 0.973633f, 0.020660f, 0.971680f,
+ 0.021729f, 0.970215f, 0.023041f, 0.968262f, 0.023987f, 0.965820f, 0.025314f, 0.964355f,
+ 0.026886f, 0.961914f, 0.028061f, 0.959473f, 0.029327f, 0.957520f, 0.030899f, 0.955078f,
+ 0.032257f, 0.952637f, 0.034271f, 0.950195f, 0.035797f, 0.947266f, 0.037323f, 0.944336f,
+ 0.039032f, 0.941406f, 0.040649f, 0.938477f, 0.042786f, 0.934570f, 0.044800f, 0.931152f,
+ 0.047302f, 0.927734f, 0.048981f, 0.923340f, 0.050446f, 0.918457f, 0.052338f, 0.914062f,
+ 0.054993f, 0.908691f, 0.057343f, 0.903320f, 0.060303f, 0.896973f, 0.063416f, 0.891113f,
+ 0.066162f, 0.884277f, 0.069702f, 0.877441f, 0.072632f, 0.870117f, 0.076050f, 0.860840f,
+ 0.079773f, 0.850586f, 0.084595f, 0.839844f, 0.088684f, 0.828125f, 0.092834f, 0.813965f,
+ 0.097168f, 0.798340f, 0.102417f, 0.779297f, 0.107727f, 0.757324f, 0.111877f, 0.729492f,
+ 0.115051f, 0.694336f, 0.114868f, 0.642090f, 0.102417f, 0.551270f, 0.035492f, 0.275635f,
+ 0.000000f, 1.000000f, 0.001254f, 0.999023f, 0.002310f, 0.998535f, 0.002735f, 0.997559f,
+ 0.003590f, 0.996582f, 0.004944f, 0.995117f, 0.005917f, 0.994141f, 0.007446f, 0.992188f,
+ 0.008385f, 0.991211f, 0.009384f, 0.989746f, 0.010559f, 0.988281f, 0.012100f, 0.986816f,
+ 0.012695f, 0.985352f, 0.013489f, 0.984375f, 0.015533f, 0.981934f, 0.016342f, 0.980469f,
+ 0.017181f, 0.979004f, 0.018341f, 0.977539f, 0.019989f, 0.975098f, 0.021271f, 0.973633f,
+ 0.022461f, 0.971680f, 0.023422f, 0.970215f, 0.025162f, 0.967773f, 0.026550f, 0.965820f,
+ 0.028046f, 0.963379f, 0.029434f, 0.961426f, 0.030701f, 0.958984f, 0.032684f, 0.956543f,
+ 0.034027f, 0.954590f, 0.035553f, 0.952148f, 0.037598f, 0.949219f, 0.039246f, 0.946289f,
+ 0.041046f, 0.943848f, 0.043304f, 0.939941f, 0.045135f, 0.937500f, 0.047028f, 0.934570f,
+ 0.049347f, 0.930664f, 0.051636f, 0.927246f, 0.053894f, 0.923340f, 0.056763f, 0.919434f,
+ 0.059143f, 0.915039f, 0.061768f, 0.911133f, 0.063477f, 0.906250f, 0.066162f, 0.900391f,
+ 0.068909f, 0.894531f, 0.071655f, 0.888672f, 0.075439f, 0.882324f, 0.078613f, 0.875977f,
+ 0.082336f, 0.869141f, 0.085876f, 0.861816f, 0.090393f, 0.853516f, 0.093445f, 0.843750f,
+ 0.098389f, 0.833496f, 0.102844f, 0.822266f, 0.107727f, 0.810547f, 0.111816f, 0.796387f,
+ 0.117432f, 0.781250f, 0.122375f, 0.761719f, 0.127686f, 0.740234f, 0.131958f, 0.713867f,
+ 0.134033f, 0.679199f, 0.132446f, 0.629395f, 0.116150f, 0.541504f, 0.039612f, 0.273438f,
+ 0.000000f, 1.000000f, 0.001420f, 0.999023f, 0.002686f, 0.998047f, 0.003748f, 0.997070f,
+ 0.005245f, 0.995605f, 0.006062f, 0.994141f, 0.008064f, 0.992676f, 0.009239f, 0.990723f,
+ 0.010887f, 0.989258f, 0.012329f, 0.987305f, 0.014015f, 0.985352f, 0.014992f, 0.983887f,
+ 0.016495f, 0.981934f, 0.018387f, 0.979492f, 0.019455f, 0.978027f, 0.021225f, 0.976074f,
+ 0.022354f, 0.974121f, 0.024307f, 0.972168f, 0.026154f, 0.969238f, 0.027573f, 0.967285f,
+ 0.028946f, 0.965332f, 0.030380f, 0.962891f, 0.032928f, 0.960449f, 0.034576f, 0.957520f,
+ 0.036285f, 0.955078f, 0.037872f, 0.953125f, 0.039703f, 0.950195f, 0.041748f, 0.947754f,
+ 0.044281f, 0.944824f, 0.046265f, 0.941406f, 0.048309f, 0.937988f, 0.050415f, 0.935059f,
+ 0.052521f, 0.932129f, 0.055115f, 0.928711f, 0.057343f, 0.924805f, 0.060333f, 0.920898f,
+ 0.062927f, 0.916992f, 0.065552f, 0.913086f, 0.068176f, 0.909180f, 0.071533f, 0.904297f,
+ 0.074402f, 0.899902f, 0.077332f, 0.895508f, 0.081055f, 0.890137f, 0.083618f, 0.884277f,
+ 0.086792f, 0.877930f, 0.090393f, 0.871582f, 0.093811f, 0.864746f, 0.097351f, 0.857910f,
+ 0.101562f, 0.851074f, 0.105957f, 0.842285f, 0.110840f, 0.834473f, 0.115051f, 0.824219f,
+ 0.119568f, 0.813965f, 0.124329f, 0.802734f, 0.129761f, 0.791016f, 0.134155f, 0.776855f,
+ 0.140015f, 0.761230f, 0.145264f, 0.742676f, 0.149780f, 0.722168f, 0.153320f, 0.696289f,
+ 0.154541f, 0.663574f, 0.151978f, 0.616211f, 0.131470f, 0.533203f, 0.044464f, 0.272461f,
+ 0.000000f, 1.000000f, 0.001528f, 0.999023f, 0.003845f, 0.997070f, 0.005600f, 0.995605f,
+ 0.006886f, 0.994141f, 0.008682f, 0.992676f, 0.010101f, 0.990723f, 0.011734f, 0.988770f,
+ 0.014336f, 0.986328f, 0.016708f, 0.983398f, 0.018539f, 0.981445f, 0.020187f, 0.979004f,
+ 0.022797f, 0.976562f, 0.024429f, 0.974121f, 0.025803f, 0.972168f, 0.028259f, 0.969238f,
+ 0.030441f, 0.967285f, 0.032379f, 0.963867f, 0.034424f, 0.961426f, 0.036316f, 0.958984f,
+ 0.038300f, 0.956055f, 0.040894f, 0.953125f, 0.043427f, 0.950195f, 0.045441f, 0.947266f,
+ 0.047516f, 0.944336f, 0.049561f, 0.941406f, 0.052124f, 0.938477f, 0.055328f, 0.934570f,
+ 0.057892f, 0.931152f, 0.060272f, 0.927734f, 0.062622f, 0.924316f, 0.065247f, 0.920898f,
+ 0.068298f, 0.916992f, 0.071350f, 0.913086f, 0.074707f, 0.908691f, 0.077576f, 0.904297f,
+ 0.080627f, 0.899902f, 0.083740f, 0.895996f, 0.087280f, 0.891113f, 0.090576f, 0.886719f,
+ 0.094360f, 0.881348f, 0.098389f, 0.875977f, 0.102173f, 0.870117f, 0.105530f, 0.864746f,
+ 0.108582f, 0.857910f, 0.112732f, 0.851074f, 0.116455f, 0.844238f, 0.120972f, 0.836914f,
+ 0.125732f, 0.828613f, 0.130737f, 0.820801f, 0.135376f, 0.812012f, 0.140625f, 0.802734f,
+ 0.144897f, 0.791992f, 0.149658f, 0.781250f, 0.154785f, 0.769531f, 0.159668f, 0.755371f,
+ 0.165405f, 0.739746f, 0.170166f, 0.722168f, 0.174316f, 0.702148f, 0.176758f, 0.678711f,
+ 0.177368f, 0.646973f, 0.171387f, 0.602051f, 0.146118f, 0.523926f, 0.048859f, 0.270020f,
+ 0.000000f, 1.000000f, 0.002544f, 0.998535f, 0.004772f, 0.997070f, 0.007710f, 0.994141f,
+ 0.009491f, 0.992188f, 0.012726f, 0.989258f, 0.014473f, 0.987305f, 0.017151f, 0.983887f,
+ 0.019028f, 0.981934f, 0.022507f, 0.979004f, 0.025543f, 0.975098f, 0.027527f, 0.972656f,
+ 0.030655f, 0.969238f, 0.033142f, 0.966309f, 0.036011f, 0.962891f, 0.038300f, 0.959961f,
+ 0.041534f, 0.956543f, 0.043701f, 0.953613f, 0.046478f, 0.950195f, 0.049713f, 0.946777f,
+ 0.052704f, 0.943359f, 0.055176f, 0.939941f, 0.057617f, 0.936523f, 0.060699f, 0.933105f,
+ 0.064087f, 0.929199f, 0.066895f, 0.925293f, 0.070190f, 0.921387f, 0.073608f, 0.917480f,
+ 0.076477f, 0.913574f, 0.079346f, 0.909668f, 0.082764f, 0.905762f, 0.086243f, 0.901367f,
+ 0.090454f, 0.896484f, 0.093811f, 0.892090f, 0.097168f, 0.887695f, 0.100525f, 0.883301f,
+ 0.104004f, 0.878906f, 0.107483f, 0.874023f, 0.112305f, 0.868652f, 0.116699f, 0.862793f,
+ 0.120728f, 0.857422f, 0.124756f, 0.851562f, 0.128784f, 0.845703f, 0.133057f, 0.840332f,
+ 0.136841f, 0.833496f, 0.140747f, 0.826660f, 0.145386f, 0.818848f, 0.150269f, 0.811035f,
+ 0.154785f, 0.802734f, 0.159790f, 0.794922f, 0.164917f, 0.786133f, 0.170166f, 0.777344f,
+ 0.174194f, 0.767578f, 0.179199f, 0.756348f, 0.184692f, 0.744141f, 0.189453f, 0.730957f,
+ 0.194214f, 0.716309f, 0.197632f, 0.699707f, 0.200562f, 0.681641f, 0.201538f, 0.658691f,
+ 0.200317f, 0.628906f, 0.192017f, 0.587402f, 0.162109f, 0.514648f, 0.053925f, 0.268311f,
+ 0.000000f, 1.000000f, 0.003534f, 0.998047f, 0.007156f, 0.995605f, 0.010788f, 0.992188f,
+ 0.014999f, 0.988281f, 0.018341f, 0.984863f, 0.022064f, 0.980957f, 0.025620f, 0.977539f,
+ 0.028030f, 0.974609f, 0.032074f, 0.970215f, 0.035797f, 0.966309f, 0.039429f, 0.962402f,
+ 0.043579f, 0.958008f, 0.047577f, 0.953613f, 0.051056f, 0.949707f, 0.054382f, 0.945801f,
+ 0.058167f, 0.941406f, 0.062408f, 0.937012f, 0.065552f, 0.933105f, 0.069153f, 0.929199f,
+ 0.072632f, 0.924805f, 0.076477f, 0.920410f, 0.080505f, 0.916016f, 0.084473f, 0.911621f,
+ 0.087891f, 0.907227f, 0.091736f, 0.903320f, 0.095093f, 0.898926f, 0.099365f, 0.894531f,
+ 0.103699f, 0.889648f, 0.107544f, 0.884766f, 0.111267f, 0.880371f, 0.115479f, 0.875488f,
+ 0.119690f, 0.870605f, 0.123413f, 0.865723f, 0.127075f, 0.860840f, 0.131592f, 0.855957f,
+ 0.136230f, 0.850098f, 0.140381f, 0.844727f, 0.145508f, 0.838867f, 0.149658f, 0.833496f,
+ 0.153809f, 0.828125f, 0.158081f, 0.822266f, 0.162231f, 0.816895f, 0.167114f, 0.810547f,
+ 0.172607f, 0.803711f, 0.176514f, 0.796387f, 0.180786f, 0.788574f, 0.185547f, 0.781250f,
+ 0.189819f, 0.773438f, 0.194214f, 0.765625f, 0.198853f, 0.757324f, 0.203735f, 0.749023f,
+ 0.208740f, 0.738770f, 0.213501f, 0.728027f, 0.217529f, 0.716309f, 0.222168f, 0.705078f,
+ 0.224854f, 0.690918f, 0.228149f, 0.676758f, 0.228882f, 0.659668f, 0.228638f, 0.637695f,
+ 0.225342f, 0.610840f, 0.213379f, 0.572754f, 0.178833f, 0.505859f, 0.058899f, 0.265869f,
+ 0.000000f, 1.000000f, 0.006603f, 0.996582f, 0.011757f, 0.992188f, 0.017883f, 0.987793f,
+ 0.022705f, 0.982910f, 0.029099f, 0.977051f, 0.033783f, 0.972168f, 0.039734f, 0.966309f,
+ 0.044830f, 0.961426f, 0.049103f, 0.956543f, 0.054657f, 0.950684f, 0.059479f, 0.945801f,
+ 0.065430f, 0.939941f, 0.070129f, 0.934570f, 0.076050f, 0.928711f, 0.081177f, 0.922852f,
+ 0.085632f, 0.917969f, 0.090088f, 0.913086f, 0.095093f, 0.907715f, 0.100403f, 0.902344f,
+ 0.105591f, 0.896973f, 0.109741f, 0.892090f, 0.113770f, 0.887207f, 0.118225f, 0.882324f,
+ 0.123718f, 0.876465f, 0.128540f, 0.871094f, 0.133301f, 0.866211f, 0.137939f, 0.860840f,
+ 0.142090f, 0.855957f, 0.146118f, 0.851562f, 0.150635f, 0.846191f, 0.155273f, 0.840820f,
+ 0.160767f, 0.834961f, 0.165527f, 0.829590f, 0.169922f, 0.824219f, 0.174072f, 0.819336f,
+ 0.178223f, 0.813965f, 0.183350f, 0.808594f, 0.187378f, 0.803223f, 0.191406f, 0.797852f,
+ 0.196655f, 0.791992f, 0.201294f, 0.785645f, 0.206177f, 0.779785f, 0.210938f, 0.773438f,
+ 0.215698f, 0.767090f, 0.219482f, 0.760742f, 0.222778f, 0.753418f, 0.226440f, 0.746582f,
+ 0.230103f, 0.739746f, 0.234253f, 0.732422f, 0.239868f, 0.723633f, 0.244019f, 0.715332f,
+ 0.248169f, 0.706543f, 0.250977f, 0.696777f, 0.253418f, 0.687012f, 0.256592f, 0.676758f,
+ 0.258057f, 0.664551f, 0.259521f, 0.652344f, 0.259766f, 0.635254f, 0.258057f, 0.615723f,
+ 0.251465f, 0.591797f, 0.235229f, 0.557129f, 0.194702f, 0.497559f, 0.064148f, 0.263428f,
+ 0.000000f, 1.000000f, 0.010880f, 0.994629f, 0.020630f, 0.987793f, 0.031250f, 0.979492f,
+ 0.041138f, 0.970703f, 0.048767f, 0.962891f, 0.059021f, 0.953613f, 0.066284f, 0.946289f,
+ 0.075073f, 0.937500f, 0.082520f, 0.930176f, 0.089600f, 0.923340f, 0.097046f, 0.915527f,
+ 0.103821f, 0.908203f, 0.111206f, 0.901367f, 0.117798f, 0.894531f, 0.126099f, 0.886230f,
+ 0.132202f, 0.879883f, 0.137817f, 0.873535f, 0.143188f, 0.867676f, 0.149536f, 0.861328f,
+ 0.155640f, 0.854980f, 0.161621f, 0.848633f, 0.166992f, 0.842773f, 0.172119f, 0.837402f,
+ 0.177490f, 0.831543f, 0.181763f, 0.826660f, 0.187012f, 0.820801f, 0.192993f, 0.814941f,
+ 0.198242f, 0.809570f, 0.203003f, 0.803711f, 0.207275f, 0.798828f, 0.211792f, 0.793945f,
+ 0.216309f, 0.788574f, 0.220093f, 0.783691f, 0.223755f, 0.779297f, 0.229370f, 0.773438f,
+ 0.234009f, 0.768066f, 0.239014f, 0.762207f, 0.243042f, 0.756836f, 0.247192f, 0.751465f,
+ 0.250977f, 0.746582f, 0.254395f, 0.741211f, 0.257812f, 0.736328f, 0.262207f, 0.730957f,
+ 0.265381f, 0.725586f, 0.269043f, 0.720215f, 0.272461f, 0.712891f, 0.275635f, 0.706055f,
+ 0.278564f, 0.699707f, 0.282715f, 0.692383f, 0.285400f, 0.685547f, 0.288086f, 0.678711f,
+ 0.290771f, 0.671875f, 0.291748f, 0.664062f, 0.292480f, 0.655762f, 0.293701f, 0.646973f,
+ 0.294189f, 0.635254f, 0.294678f, 0.623047f, 0.292236f, 0.608887f, 0.287354f, 0.592773f,
+ 0.277344f, 0.572266f, 0.256348f, 0.542969f, 0.210449f, 0.488037f, 0.069641f, 0.261475f,
+ 0.000000f, 1.000000f, 0.025513f, 0.987793f, 0.045685f, 0.974121f, 0.065308f, 0.958008f,
+ 0.083191f, 0.942383f, 0.100220f, 0.927246f, 0.112793f, 0.915039f, 0.126465f, 0.902344f,
+ 0.138916f, 0.890137f, 0.148438f, 0.879883f, 0.160400f, 0.868164f, 0.170044f, 0.858887f,
+ 0.177612f, 0.850098f, 0.184937f, 0.842285f, 0.194336f, 0.833496f, 0.203857f, 0.824219f,
+ 0.210571f, 0.816895f, 0.215820f, 0.810547f, 0.222412f, 0.803711f, 0.229126f, 0.796875f,
+ 0.236084f, 0.790039f, 0.241821f, 0.783691f, 0.247314f, 0.777832f, 0.251709f, 0.771973f,
+ 0.256592f, 0.766602f, 0.260010f, 0.762207f, 0.263916f, 0.757324f, 0.269531f, 0.752441f,
+ 0.274414f, 0.746582f, 0.279297f, 0.741211f, 0.283203f, 0.736816f, 0.286621f, 0.731934f,
+ 0.290527f, 0.727539f, 0.293457f, 0.723145f, 0.296875f, 0.718750f, 0.299561f, 0.714844f,
+ 0.302002f, 0.710938f, 0.305176f, 0.707031f, 0.308105f, 0.702637f, 0.312012f, 0.697754f,
+ 0.315430f, 0.693359f, 0.318848f, 0.688477f, 0.321777f, 0.684082f, 0.324219f, 0.679688f,
+ 0.326660f, 0.674805f, 0.328613f, 0.670410f, 0.330078f, 0.666504f, 0.330811f, 0.661133f,
+ 0.331543f, 0.656250f, 0.332520f, 0.651367f, 0.333252f, 0.646484f, 0.333496f, 0.641602f,
+ 0.335938f, 0.634766f, 0.336914f, 0.627441f, 0.336426f, 0.619629f, 0.336426f, 0.611816f,
+ 0.334229f, 0.603516f, 0.331055f, 0.594238f, 0.325439f, 0.583496f, 0.316406f, 0.570801f,
+ 0.302979f, 0.553711f, 0.277588f, 0.528809f, 0.228516f, 0.474121f, 0.075195f, 0.259521f,
+ 0.000000f, 1.000000f, 0.089172f, 0.960449f, 0.145508f, 0.919434f, 0.182373f, 0.887695f,
+ 0.211060f, 0.859863f, 0.229858f, 0.839844f, 0.251465f, 0.818848f, 0.264648f, 0.802734f,
+ 0.275879f, 0.789551f, 0.289551f, 0.774902f, 0.298584f, 0.763672f, 0.304932f, 0.754883f,
+ 0.310791f, 0.747070f, 0.318115f, 0.738770f, 0.325928f, 0.729980f, 0.331055f, 0.723145f,
+ 0.336670f, 0.716797f, 0.340576f, 0.710938f, 0.344727f, 0.705566f, 0.347412f, 0.700684f,
+ 0.350342f, 0.696289f, 0.352051f, 0.692871f, 0.357910f, 0.687500f, 0.362305f, 0.682129f,
+ 0.364990f, 0.678711f, 0.368164f, 0.674316f, 0.370605f, 0.670898f, 0.373047f, 0.667480f,
+ 0.375000f, 0.664062f, 0.376221f, 0.661133f, 0.377686f, 0.658691f, 0.378174f, 0.656250f,
+ 0.379883f, 0.653320f, 0.380371f, 0.650879f, 0.381348f, 0.648438f, 0.381592f, 0.646484f,
+ 0.382568f, 0.644043f, 0.382812f, 0.641602f, 0.385254f, 0.638184f, 0.386963f, 0.635254f,
+ 0.389160f, 0.631836f, 0.390625f, 0.628906f, 0.391846f, 0.625488f, 0.392578f, 0.622559f,
+ 0.393311f, 0.619629f, 0.393555f, 0.616699f, 0.393555f, 0.613770f, 0.392578f, 0.610352f,
+ 0.391602f, 0.606934f, 0.390869f, 0.603027f, 0.389893f, 0.599609f, 0.388184f, 0.596191f,
+ 0.385986f, 0.592773f, 0.383789f, 0.588867f, 0.379883f, 0.584473f, 0.376221f, 0.579102f,
+ 0.371826f, 0.574707f, 0.364746f, 0.567871f, 0.355469f, 0.560547f, 0.345215f, 0.549805f,
+ 0.330566f, 0.533203f, 0.303223f, 0.508301f, 0.248047f, 0.460205f, 0.080750f, 0.259033f,
+ 0.000000f, 1.000000f, 0.232544f, 0.900391f, 0.298096f, 0.839844f, 0.331299f, 0.799805f,
+ 0.352295f, 0.770508f, 0.368896f, 0.747070f, 0.380371f, 0.728027f, 0.389404f, 0.713379f,
+ 0.397217f, 0.700195f, 0.403076f, 0.689453f, 0.407715f, 0.680176f, 0.413574f, 0.670898f,
+ 0.417480f, 0.663574f, 0.420410f, 0.657227f, 0.423828f, 0.651367f, 0.425537f, 0.646484f,
+ 0.428223f, 0.641602f, 0.431152f, 0.636719f, 0.434570f, 0.631836f, 0.436523f, 0.627930f,
+ 0.437500f, 0.624512f, 0.439697f, 0.621094f, 0.441406f, 0.617676f, 0.442383f, 0.614746f,
+ 0.443848f, 0.612305f, 0.445312f, 0.609375f, 0.446533f, 0.606445f, 0.446777f, 0.604004f,
+ 0.448486f, 0.601562f, 0.448975f, 0.599609f, 0.448975f, 0.597168f, 0.450439f, 0.595215f,
+ 0.451172f, 0.592773f, 0.451660f, 0.590820f, 0.452393f, 0.588379f, 0.452393f, 0.586426f,
+ 0.452881f, 0.584473f, 0.453125f, 0.582520f, 0.453613f, 0.580566f, 0.453857f, 0.578125f,
+ 0.453613f, 0.576172f, 0.453369f, 0.574219f, 0.454590f, 0.571777f, 0.454102f, 0.569824f,
+ 0.454102f, 0.567383f, 0.453613f, 0.564941f, 0.452881f, 0.562988f, 0.452881f, 0.560547f,
+ 0.450928f, 0.556641f, 0.449707f, 0.553223f, 0.448486f, 0.549805f, 0.446533f, 0.546387f,
+ 0.444580f, 0.542969f, 0.443115f, 0.539551f, 0.439941f, 0.534668f, 0.436279f, 0.529297f,
+ 0.432617f, 0.523926f, 0.426025f, 0.517090f, 0.418701f, 0.509766f, 0.407959f, 0.499756f,
+ 0.392334f, 0.485596f, 0.367188f, 0.464844f, 0.314209f, 0.421631f, 0.146484f, 0.244019f,
+ 0.000000f, 1.000000f, 0.236572f, 0.898438f, 0.304443f, 0.836426f, 0.340576f, 0.794434f,
+ 0.363770f, 0.763184f, 0.382080f, 0.737793f, 0.394287f, 0.718262f, 0.403809f, 0.702148f,
+ 0.414551f, 0.687012f, 0.420898f, 0.675293f, 0.428223f, 0.664551f, 0.434082f, 0.654785f,
+ 0.439453f, 0.645996f, 0.443848f, 0.638672f, 0.448486f, 0.631348f, 0.451904f, 0.625000f,
+ 0.456055f, 0.619141f, 0.459717f, 0.613281f, 0.463623f, 0.607910f, 0.466797f, 0.602539f,
+ 0.469971f, 0.597656f, 0.473389f, 0.592773f, 0.475586f, 0.588867f, 0.478027f, 0.584961f,
+ 0.479980f, 0.581055f, 0.482422f, 0.577637f, 0.484619f, 0.573730f, 0.486572f, 0.570312f,
+ 0.487793f, 0.567383f, 0.489990f, 0.563965f, 0.490723f, 0.561035f, 0.493652f, 0.558105f,
+ 0.495605f, 0.554688f, 0.496826f, 0.551270f, 0.497803f, 0.548828f, 0.499023f, 0.545898f,
+ 0.500977f, 0.542480f, 0.502441f, 0.539551f, 0.503906f, 0.536621f, 0.504883f, 0.533691f,
+ 0.506836f, 0.530273f, 0.508301f, 0.526855f, 0.509766f, 0.523438f, 0.510254f, 0.520508f,
+ 0.511719f, 0.517090f, 0.512207f, 0.513672f, 0.514160f, 0.509766f, 0.514648f, 0.506348f,
+ 0.514648f, 0.501465f, 0.514160f, 0.497070f, 0.514160f, 0.492432f, 0.514648f, 0.487549f,
+ 0.515137f, 0.482666f, 0.515137f, 0.477295f, 0.515137f, 0.471436f, 0.513184f, 0.464355f,
+ 0.511230f, 0.456787f, 0.507812f, 0.448730f, 0.503906f, 0.438965f, 0.497803f, 0.426514f,
+ 0.488037f, 0.411133f, 0.469727f, 0.388428f, 0.429199f, 0.347900f, 0.287354f, 0.201904f,
+ 0.000000f, 1.000000f, 0.240356f, 0.896973f, 0.311523f, 0.833008f, 0.349609f, 0.789062f,
+ 0.375732f, 0.755859f, 0.395020f, 0.729004f, 0.409668f, 0.707520f, 0.422119f, 0.689453f,
+ 0.434082f, 0.672852f, 0.442383f, 0.659668f, 0.449463f, 0.647949f, 0.457520f, 0.636719f,
+ 0.463379f, 0.626953f, 0.468750f, 0.618164f, 0.474121f, 0.610352f, 0.478760f, 0.603027f,
+ 0.483643f, 0.595703f, 0.488281f, 0.589355f, 0.492920f, 0.583008f, 0.497314f, 0.576660f,
+ 0.502441f, 0.570312f, 0.505371f, 0.564941f, 0.509277f, 0.560059f, 0.512695f, 0.554688f,
+ 0.515137f, 0.550293f, 0.518555f, 0.545898f, 0.521973f, 0.541016f, 0.524414f, 0.537109f,
+ 0.526855f, 0.532715f, 0.529785f, 0.528320f, 0.532227f, 0.524414f, 0.536133f, 0.520020f,
+ 0.539062f, 0.516113f, 0.540527f, 0.512207f, 0.542969f, 0.508301f, 0.545898f, 0.504395f,
+ 0.547852f, 0.500488f, 0.550781f, 0.496338f, 0.554199f, 0.492188f, 0.555176f, 0.488281f,
+ 0.558105f, 0.484131f, 0.561035f, 0.479736f, 0.562012f, 0.475830f, 0.563965f, 0.471680f,
+ 0.566895f, 0.467285f, 0.569336f, 0.462402f, 0.571289f, 0.457764f, 0.573730f, 0.453125f,
+ 0.576172f, 0.447998f, 0.576660f, 0.441650f, 0.577637f, 0.436035f, 0.579590f, 0.429932f,
+ 0.580566f, 0.423584f, 0.582520f, 0.416748f, 0.584961f, 0.409668f, 0.584473f, 0.401611f,
+ 0.584473f, 0.392578f, 0.584473f, 0.383057f, 0.583008f, 0.371338f, 0.581055f, 0.358154f,
+ 0.574219f, 0.341309f, 0.562500f, 0.318604f, 0.534668f, 0.279541f, 0.420898f, 0.158325f,
+ 0.000000f, 1.000000f, 0.244019f, 0.895508f, 0.317871f, 0.829590f, 0.360596f, 0.782715f,
+ 0.389648f, 0.747070f, 0.410156f, 0.718750f, 0.425781f, 0.696289f, 0.438477f, 0.677246f,
+ 0.451660f, 0.659668f, 0.460693f, 0.645020f, 0.469727f, 0.631836f, 0.479980f, 0.619141f,
+ 0.487061f, 0.607910f, 0.494141f, 0.598145f, 0.499756f, 0.588867f, 0.505371f, 0.580566f,
+ 0.511719f, 0.572754f, 0.517090f, 0.564941f, 0.522461f, 0.557129f, 0.528320f, 0.549805f,
+ 0.533203f, 0.542969f, 0.536621f, 0.537109f, 0.541992f, 0.530762f, 0.545898f, 0.524902f,
+ 0.550781f, 0.519043f, 0.555176f, 0.513672f, 0.559082f, 0.507812f, 0.561523f, 0.502930f,
+ 0.565918f, 0.498047f, 0.569824f, 0.492920f, 0.573730f, 0.487793f, 0.577148f, 0.482910f,
+ 0.581055f, 0.477783f, 0.583008f, 0.473145f, 0.587402f, 0.468262f, 0.590332f, 0.463623f,
+ 0.593750f, 0.458740f, 0.597168f, 0.453613f, 0.601074f, 0.448730f, 0.604004f, 0.443848f,
+ 0.605957f, 0.439209f, 0.609863f, 0.434082f, 0.613770f, 0.428711f, 0.615723f, 0.423828f,
+ 0.619629f, 0.418213f, 0.623047f, 0.412842f, 0.625488f, 0.407471f, 0.628906f, 0.401611f,
+ 0.631836f, 0.395752f, 0.634277f, 0.389160f, 0.635254f, 0.382324f, 0.639160f, 0.375000f,
+ 0.642090f, 0.367432f, 0.644531f, 0.360107f, 0.646484f, 0.352295f, 0.648926f, 0.343750f,
+ 0.649902f, 0.333252f, 0.652344f, 0.322998f, 0.652344f, 0.310547f, 0.652344f, 0.296631f,
+ 0.649414f, 0.280029f, 0.642090f, 0.257324f, 0.621094f, 0.220337f, 0.536621f, 0.121216f,
+ 0.000000f, 1.000000f, 0.247437f, 0.894043f, 0.325684f, 0.825195f, 0.371338f, 0.776367f,
+ 0.401855f, 0.739746f, 0.422363f, 0.710449f, 0.441650f, 0.685547f, 0.456543f, 0.664062f,
+ 0.469971f, 0.645508f, 0.480957f, 0.629395f, 0.490234f, 0.615723f, 0.501953f, 0.601074f,
+ 0.510254f, 0.589355f, 0.518066f, 0.578125f, 0.525391f, 0.567871f, 0.532227f, 0.558105f,
+ 0.539551f, 0.548828f, 0.544922f, 0.540527f, 0.551270f, 0.532227f, 0.559570f, 0.523438f,
+ 0.563965f, 0.515625f, 0.569336f, 0.508789f, 0.575195f, 0.501465f, 0.579590f, 0.495117f,
+ 0.584961f, 0.488281f, 0.589844f, 0.481934f, 0.594238f, 0.475586f, 0.599121f, 0.469482f,
+ 0.603027f, 0.463867f, 0.607910f, 0.457764f, 0.612305f, 0.451904f, 0.616699f, 0.446289f,
+ 0.620605f, 0.440430f, 0.625488f, 0.434570f, 0.628418f, 0.429443f, 0.632324f, 0.423828f,
+ 0.637695f, 0.417969f, 0.641113f, 0.412354f, 0.644531f, 0.406982f, 0.648926f, 0.401123f,
+ 0.651367f, 0.395752f, 0.656250f, 0.389893f, 0.660156f, 0.384033f, 0.663574f, 0.378174f,
+ 0.667969f, 0.372070f, 0.670898f, 0.366211f, 0.675781f, 0.359863f, 0.678711f, 0.353516f,
+ 0.683105f, 0.347168f, 0.686035f, 0.340576f, 0.688965f, 0.332520f, 0.692383f, 0.324951f,
+ 0.695312f, 0.316650f, 0.698242f, 0.308594f, 0.701660f, 0.300049f, 0.704590f, 0.291260f,
+ 0.708008f, 0.281494f, 0.709961f, 0.269775f, 0.711914f, 0.258057f, 0.713867f, 0.244141f,
+ 0.711914f, 0.227661f, 0.707520f, 0.206665f, 0.694336f, 0.173340f, 0.628906f, 0.092407f,
+ 0.000000f, 1.000000f, 0.251709f, 0.892090f, 0.334229f, 0.820801f, 0.380615f, 0.770996f,
+ 0.413330f, 0.731934f, 0.438232f, 0.700195f, 0.457275f, 0.674316f, 0.473389f, 0.651855f,
+ 0.488770f, 0.631836f, 0.501465f, 0.614258f, 0.511719f, 0.598633f, 0.524414f, 0.583496f,
+ 0.533203f, 0.569824f, 0.541992f, 0.557617f, 0.551270f, 0.545898f, 0.557617f, 0.535645f,
+ 0.566895f, 0.525391f, 0.572754f, 0.516113f, 0.580078f, 0.506836f, 0.587891f, 0.497559f,
+ 0.594238f, 0.488770f, 0.600586f, 0.480713f, 0.605957f, 0.472656f, 0.611816f, 0.465332f,
+ 0.618652f, 0.457520f, 0.623535f, 0.450684f, 0.628906f, 0.443604f, 0.633789f, 0.436768f,
+ 0.639160f, 0.430176f, 0.644531f, 0.423584f, 0.649902f, 0.416748f, 0.652344f, 0.410889f,
+ 0.658691f, 0.404053f, 0.662598f, 0.398193f, 0.666992f, 0.392090f, 0.671875f, 0.385742f,
+ 0.677246f, 0.379150f, 0.680664f, 0.373291f, 0.685059f, 0.367188f, 0.689453f, 0.361084f,
+ 0.693359f, 0.354980f, 0.698730f, 0.348633f, 0.703125f, 0.342041f, 0.706543f, 0.335938f,
+ 0.710449f, 0.329346f, 0.714355f, 0.323242f, 0.718262f, 0.316406f, 0.723145f, 0.309570f,
+ 0.727051f, 0.302979f, 0.730469f, 0.295898f, 0.734375f, 0.288330f, 0.738770f, 0.279785f,
+ 0.741699f, 0.271484f, 0.743652f, 0.263428f, 0.748535f, 0.254883f, 0.752441f, 0.245850f,
+ 0.756836f, 0.236206f, 0.757812f, 0.224976f, 0.761719f, 0.213501f, 0.762207f, 0.200195f,
+ 0.762695f, 0.185181f, 0.760742f, 0.164429f, 0.749512f, 0.136719f, 0.702148f, 0.069824f,
+ 0.000000f, 1.000000f, 0.256592f, 0.890137f, 0.341309f, 0.817383f, 0.389893f, 0.765625f,
+ 0.425049f, 0.724609f, 0.451172f, 0.691406f, 0.473145f, 0.663086f, 0.491211f, 0.638672f,
+ 0.506836f, 0.617676f, 0.520508f, 0.598633f, 0.533691f, 0.581543f, 0.545410f, 0.565430f,
+ 0.555664f, 0.550781f, 0.566406f, 0.537598f, 0.575684f, 0.524902f, 0.583496f, 0.513672f,
+ 0.592773f, 0.502441f, 0.600586f, 0.492188f, 0.606445f, 0.482666f, 0.616699f, 0.471680f,
+ 0.623535f, 0.462158f, 0.630859f, 0.453369f, 0.637207f, 0.444580f, 0.644043f, 0.436035f,
+ 0.649414f, 0.428223f, 0.655762f, 0.420166f, 0.661133f, 0.412598f, 0.666016f, 0.405518f,
+ 0.673340f, 0.397949f, 0.679199f, 0.390381f, 0.683594f, 0.383545f, 0.687500f, 0.376953f,
+ 0.693848f, 0.369873f, 0.697754f, 0.363281f, 0.702637f, 0.356689f, 0.708984f, 0.349854f,
+ 0.712891f, 0.343018f, 0.718262f, 0.336426f, 0.721680f, 0.330322f, 0.726562f, 0.323730f,
+ 0.730469f, 0.317383f, 0.735840f, 0.310303f, 0.740234f, 0.303711f, 0.744629f, 0.297363f,
+ 0.748047f, 0.290771f, 0.753418f, 0.283936f, 0.757324f, 0.277344f, 0.761719f, 0.270264f,
+ 0.765625f, 0.263428f, 0.770508f, 0.256104f, 0.773926f, 0.249268f, 0.776855f, 0.240845f,
+ 0.780762f, 0.232422f, 0.783691f, 0.224487f, 0.787598f, 0.215942f, 0.791992f, 0.207031f,
+ 0.795410f, 0.197632f, 0.798340f, 0.187744f, 0.800293f, 0.176392f, 0.802734f, 0.164917f,
+ 0.803223f, 0.149902f, 0.802246f, 0.132690f, 0.793457f, 0.107910f, 0.758301f, 0.053741f,
+ 0.000000f, 1.000000f, 0.261963f, 0.887695f, 0.349365f, 0.812988f, 0.400391f, 0.759277f,
+ 0.437256f, 0.716309f, 0.466309f, 0.681641f, 0.488770f, 0.651855f, 0.507812f, 0.626465f,
+ 0.526367f, 0.603516f, 0.541016f, 0.583008f, 0.554688f, 0.564941f, 0.566895f, 0.547852f,
+ 0.579590f, 0.531738f, 0.589355f, 0.517578f, 0.599609f, 0.503906f, 0.609863f, 0.491211f,
+ 0.618164f, 0.479736f, 0.626465f, 0.468262f, 0.634766f, 0.458008f, 0.643555f, 0.446777f,
+ 0.650391f, 0.436768f, 0.658691f, 0.426758f, 0.666504f, 0.417480f, 0.672852f, 0.408447f,
+ 0.679199f, 0.399414f, 0.685547f, 0.391357f, 0.692383f, 0.383057f, 0.699219f, 0.375000f,
+ 0.702637f, 0.367432f, 0.708496f, 0.359619f, 0.715332f, 0.351807f, 0.719238f, 0.344971f,
+ 0.724609f, 0.337891f, 0.730957f, 0.330566f, 0.735352f, 0.323486f, 0.740723f, 0.316406f,
+ 0.745605f, 0.309570f, 0.750000f, 0.302979f, 0.754883f, 0.296143f, 0.758789f, 0.289795f,
+ 0.764648f, 0.282715f, 0.769043f, 0.275635f, 0.772949f, 0.269287f, 0.776367f, 0.262695f,
+ 0.780762f, 0.256104f, 0.785645f, 0.249512f, 0.790527f, 0.242432f, 0.794434f, 0.235596f,
+ 0.798340f, 0.228882f, 0.802246f, 0.221924f, 0.808105f, 0.214722f, 0.809570f, 0.207520f,
+ 0.813477f, 0.199341f, 0.816895f, 0.190918f, 0.820312f, 0.182739f, 0.823242f, 0.174683f,
+ 0.827148f, 0.165894f, 0.830566f, 0.157104f, 0.832520f, 0.146240f, 0.835449f, 0.135132f,
+ 0.836426f, 0.122559f, 0.835938f, 0.107117f, 0.829590f, 0.086182f, 0.802734f, 0.041168f,
+ 0.000000f, 1.000000f, 0.266357f, 0.885742f, 0.358154f, 0.808594f, 0.411377f, 0.752930f,
+ 0.449951f, 0.708496f, 0.480957f, 0.671875f, 0.504883f, 0.640137f, 0.525879f, 0.613281f,
+ 0.544434f, 0.589355f, 0.561035f, 0.567383f, 0.575684f, 0.547852f, 0.589355f, 0.530273f,
+ 0.600098f, 0.513672f, 0.613281f, 0.497559f, 0.624023f, 0.483154f, 0.633789f, 0.469971f,
+ 0.642578f, 0.457275f, 0.651367f, 0.445312f, 0.660156f, 0.434082f, 0.669922f, 0.422363f,
+ 0.677246f, 0.411621f, 0.685059f, 0.401611f, 0.693848f, 0.391113f, 0.701172f, 0.381348f,
+ 0.706055f, 0.372803f, 0.713379f, 0.363770f, 0.719727f, 0.355225f, 0.725586f, 0.346680f,
+ 0.731934f, 0.338623f, 0.738281f, 0.330322f, 0.743652f, 0.322754f, 0.747559f, 0.315674f,
+ 0.754883f, 0.307617f, 0.760254f, 0.300293f, 0.764160f, 0.293213f, 0.769531f, 0.285889f,
+ 0.774902f, 0.279053f, 0.778809f, 0.272217f, 0.783203f, 0.265625f, 0.789062f, 0.258301f,
+ 0.792969f, 0.251465f, 0.797363f, 0.244995f, 0.801758f, 0.238403f, 0.805664f, 0.231934f,
+ 0.809082f, 0.225586f, 0.815430f, 0.218506f, 0.818359f, 0.211914f, 0.822266f, 0.205078f,
+ 0.826660f, 0.198730f, 0.830566f, 0.192139f, 0.834473f, 0.185181f, 0.838379f, 0.178589f,
+ 0.840332f, 0.171021f, 0.843750f, 0.162842f, 0.847656f, 0.155151f, 0.849609f, 0.147583f,
+ 0.853516f, 0.139404f, 0.857422f, 0.131104f, 0.859375f, 0.121948f, 0.861328f, 0.111755f,
+ 0.862305f, 0.100891f, 0.862793f, 0.088318f, 0.858887f, 0.068481f, 0.835449f, 0.032043f,
+ 0.000000f, 1.000000f, 0.270020f, 0.884766f, 0.364746f, 0.805176f, 0.421631f, 0.746582f,
+ 0.463379f, 0.700195f, 0.493652f, 0.662598f, 0.520996f, 0.628906f, 0.543945f, 0.600098f,
+ 0.562012f, 0.575195f, 0.579590f, 0.552246f, 0.594727f, 0.531738f, 0.610840f, 0.512695f,
+ 0.622559f, 0.495361f, 0.635742f, 0.478516f, 0.646973f, 0.463135f, 0.656738f, 0.449219f,
+ 0.666992f, 0.435547f, 0.675781f, 0.422852f, 0.685059f, 0.411133f, 0.693848f, 0.399414f,
+ 0.702148f, 0.387939f, 0.709961f, 0.377197f, 0.718262f, 0.366211f, 0.725586f, 0.356445f,
+ 0.732422f, 0.346924f, 0.739746f, 0.337646f, 0.746094f, 0.328857f, 0.752441f, 0.319824f,
+ 0.757324f, 0.311768f, 0.764648f, 0.303467f, 0.769043f, 0.295654f, 0.774902f, 0.287842f,
+ 0.780273f, 0.280273f, 0.787109f, 0.272461f, 0.789551f, 0.265625f, 0.794922f, 0.258301f,
+ 0.799805f, 0.251465f, 0.805176f, 0.244385f, 0.809082f, 0.237427f, 0.813965f, 0.230835f,
+ 0.818359f, 0.223999f, 0.822754f, 0.217407f, 0.825195f, 0.211426f, 0.830078f, 0.204712f,
+ 0.835449f, 0.197998f, 0.838379f, 0.191650f, 0.842285f, 0.185303f, 0.846680f, 0.178955f,
+ 0.849121f, 0.172974f, 0.853516f, 0.166748f, 0.857422f, 0.159912f, 0.861328f, 0.153320f,
+ 0.864746f, 0.147217f, 0.867188f, 0.139404f, 0.868652f, 0.132812f, 0.872070f, 0.125000f,
+ 0.875000f, 0.117737f, 0.878906f, 0.110168f, 0.881348f, 0.102722f, 0.882324f, 0.093018f,
+ 0.884766f, 0.083496f, 0.883301f, 0.071716f, 0.882812f, 0.056458f, 0.862793f, 0.025955f,
+ 0.000000f, 1.000000f, 0.274414f, 0.882812f, 0.373779f, 0.800293f, 0.433594f, 0.739746f,
+ 0.476318f, 0.691895f, 0.507812f, 0.652832f, 0.537109f, 0.617676f, 0.560547f, 0.587891f,
+ 0.581055f, 0.561035f, 0.599121f, 0.537109f, 0.614746f, 0.515625f, 0.629883f, 0.495850f,
+ 0.644043f, 0.477295f, 0.656738f, 0.459717f, 0.668457f, 0.443848f, 0.679199f, 0.428711f,
+ 0.689941f, 0.414551f, 0.699219f, 0.401611f, 0.708496f, 0.389160f, 0.716309f, 0.377197f,
+ 0.725586f, 0.365479f, 0.734375f, 0.354004f, 0.741211f, 0.343018f, 0.749023f, 0.332764f,
+ 0.755371f, 0.323242f, 0.763184f, 0.313232f, 0.770508f, 0.303955f, 0.774902f, 0.295654f,
+ 0.781738f, 0.286621f, 0.786621f, 0.278809f, 0.793457f, 0.270508f, 0.798340f, 0.262695f,
+ 0.803223f, 0.255127f, 0.808594f, 0.247559f, 0.813965f, 0.240356f, 0.816895f, 0.233643f,
+ 0.823242f, 0.226318f, 0.827637f, 0.219482f, 0.831543f, 0.212646f, 0.834961f, 0.206299f,
+ 0.839844f, 0.199707f, 0.843262f, 0.193359f, 0.847656f, 0.187134f, 0.852051f, 0.180542f,
+ 0.856934f, 0.174316f, 0.858887f, 0.168335f, 0.863770f, 0.162231f, 0.865234f, 0.156616f,
+ 0.870117f, 0.150879f, 0.874023f, 0.144043f, 0.877441f, 0.138306f, 0.880371f, 0.132324f,
+ 0.883789f, 0.126587f, 0.884766f, 0.120605f, 0.888672f, 0.113098f, 0.891113f, 0.106262f,
+ 0.893066f, 0.099670f, 0.895996f, 0.092957f, 0.897949f, 0.086548f, 0.899414f, 0.077881f,
+ 0.901367f, 0.069031f, 0.901855f, 0.058929f, 0.898926f, 0.045105f, 0.885742f, 0.021057f,
+ 0.000000f, 1.000000f, 0.280029f, 0.880371f, 0.381104f, 0.796875f, 0.444336f, 0.733887f,
+ 0.489014f, 0.684082f, 0.522461f, 0.642578f, 0.551758f, 0.606445f, 0.577148f, 0.575195f,
+ 0.598145f, 0.547363f, 0.618652f, 0.521973f, 0.634766f, 0.499756f, 0.648926f, 0.479248f,
+ 0.663086f, 0.460205f, 0.677734f, 0.441406f, 0.689453f, 0.425049f, 0.700195f, 0.409424f,
+ 0.710449f, 0.394775f, 0.721191f, 0.381104f, 0.729492f, 0.368164f, 0.738770f, 0.355957f,
+ 0.746582f, 0.344482f, 0.755859f, 0.332275f, 0.764160f, 0.320801f, 0.770508f, 0.310791f,
+ 0.777832f, 0.300781f, 0.785156f, 0.290771f, 0.791504f, 0.281250f, 0.797363f, 0.272705f,
+ 0.802246f, 0.264404f, 0.808594f, 0.255859f, 0.813965f, 0.247437f, 0.819336f, 0.239868f,
+ 0.823730f, 0.232300f, 0.828125f, 0.224976f, 0.833984f, 0.217773f, 0.837402f, 0.210815f,
+ 0.842773f, 0.203857f, 0.846680f, 0.197144f, 0.851074f, 0.190430f, 0.853516f, 0.184692f,
+ 0.860352f, 0.177734f, 0.861816f, 0.171997f, 0.867676f, 0.165527f, 0.869141f, 0.159912f,
+ 0.873535f, 0.153931f, 0.876465f, 0.148315f, 0.880371f, 0.142456f, 0.883301f, 0.136963f,
+ 0.887207f, 0.131104f, 0.890625f, 0.125366f, 0.893066f, 0.120178f, 0.895996f, 0.114868f,
+ 0.898438f, 0.109558f, 0.903320f, 0.103455f, 0.903809f, 0.097290f, 0.905762f, 0.091064f,
+ 0.907715f, 0.085571f, 0.910156f, 0.079102f, 0.914551f, 0.072266f, 0.914551f, 0.066528f,
+ 0.915039f, 0.058411f, 0.917480f, 0.049927f, 0.914062f, 0.038879f, 0.903320f, 0.016357f,
+ 0.000000f, 1.000000f, 0.283447f, 0.879395f, 0.390381f, 0.791992f, 0.454834f, 0.727539f,
+ 0.501465f, 0.675781f, 0.538086f, 0.632324f, 0.568848f, 0.595215f, 0.593750f, 0.562500f,
+ 0.615234f, 0.534180f, 0.635742f, 0.507812f, 0.653320f, 0.484131f, 0.668457f, 0.462891f,
+ 0.682617f, 0.443115f, 0.697266f, 0.424072f, 0.708984f, 0.406982f, 0.720215f, 0.390625f,
+ 0.730957f, 0.375977f, 0.740234f, 0.362061f, 0.749512f, 0.348633f, 0.757812f, 0.336182f,
+ 0.766113f, 0.324219f, 0.775879f, 0.312012f, 0.783691f, 0.300537f, 0.789551f, 0.290283f,
+ 0.797852f, 0.279785f, 0.804688f, 0.269775f, 0.810547f, 0.260742f, 0.815430f, 0.252197f,
+ 0.820801f, 0.243408f, 0.827637f, 0.234741f, 0.832520f, 0.226807f, 0.837402f, 0.219360f,
+ 0.842773f, 0.211792f, 0.846191f, 0.204712f, 0.852539f, 0.197021f, 0.854980f, 0.190674f,
+ 0.860840f, 0.183716f, 0.863770f, 0.177368f, 0.867188f, 0.171265f, 0.872559f, 0.164917f,
+ 0.875488f, 0.158813f, 0.879395f, 0.152710f, 0.881348f, 0.147217f, 0.885742f, 0.141602f,
+ 0.888672f, 0.136230f, 0.892578f, 0.130371f, 0.895020f, 0.125366f, 0.897949f, 0.119873f,
+ 0.901367f, 0.114807f, 0.903809f, 0.109680f, 0.906738f, 0.104797f, 0.910156f, 0.099487f,
+ 0.912109f, 0.094666f, 0.916016f, 0.089294f, 0.916992f, 0.084778f, 0.919434f, 0.078430f,
+ 0.920410f, 0.072815f, 0.923340f, 0.066650f, 0.923828f, 0.061829f, 0.927734f, 0.055756f,
+ 0.927734f, 0.048950f, 0.928223f, 0.041290f, 0.926758f, 0.031555f, 0.917969f, 0.013451f,
+ 0.000000f, 1.000000f, 0.287109f, 0.877930f, 0.398926f, 0.787598f, 0.465332f, 0.721680f,
+ 0.513672f, 0.667480f, 0.552246f, 0.622559f, 0.583984f, 0.583984f, 0.610352f, 0.550293f,
+ 0.632812f, 0.520508f, 0.652832f, 0.493896f, 0.670410f, 0.469727f, 0.687012f, 0.446777f,
+ 0.700684f, 0.427246f, 0.716797f, 0.406982f, 0.728516f, 0.389404f, 0.739258f, 0.373047f,
+ 0.750000f, 0.357666f, 0.759766f, 0.343262f, 0.768555f, 0.329834f, 0.776367f, 0.317383f,
+ 0.785156f, 0.305176f, 0.793945f, 0.293213f, 0.801270f, 0.281738f, 0.809082f, 0.270752f,
+ 0.814941f, 0.260742f, 0.822266f, 0.250732f, 0.827148f, 0.241821f, 0.833984f, 0.232910f,
+ 0.838867f, 0.224121f, 0.844238f, 0.215698f, 0.848633f, 0.208252f, 0.853516f, 0.200562f,
+ 0.858398f, 0.193237f, 0.863770f, 0.185913f, 0.867188f, 0.179077f, 0.871094f, 0.172607f,
+ 0.874512f, 0.166260f, 0.879395f, 0.159790f, 0.882812f, 0.153809f, 0.885742f, 0.147827f,
+ 0.890625f, 0.141968f, 0.892578f, 0.136475f, 0.895996f, 0.131226f, 0.898926f, 0.125732f,
+ 0.903320f, 0.120300f, 0.905273f, 0.115295f, 0.907715f, 0.110413f, 0.910156f, 0.105652f,
+ 0.914062f, 0.100647f, 0.916992f, 0.095520f, 0.918945f, 0.091248f, 0.921875f, 0.086487f,
+ 0.923340f, 0.082458f, 0.926270f, 0.077637f, 0.929199f, 0.072815f, 0.929688f, 0.068237f,
+ 0.930664f, 0.063293f, 0.933105f, 0.057434f, 0.934570f, 0.052734f, 0.936035f, 0.047668f,
+ 0.938477f, 0.041992f, 0.937012f, 0.034790f, 0.937012f, 0.025848f, 0.929688f, 0.011162f,
+ 0.000000f, 1.000000f, 0.293945f, 0.874512f, 0.406738f, 0.783691f, 0.476562f, 0.714844f,
+ 0.527832f, 0.659180f, 0.566895f, 0.612793f, 0.598633f, 0.573242f, 0.626953f, 0.538086f,
+ 0.649414f, 0.507324f, 0.668945f, 0.480469f, 0.688965f, 0.454590f, 0.704590f, 0.431885f,
+ 0.719727f, 0.410645f, 0.732422f, 0.391602f, 0.745605f, 0.373291f, 0.757812f, 0.355957f,
+ 0.768066f, 0.340820f, 0.777344f, 0.325928f, 0.786133f, 0.312500f, 0.794434f, 0.299805f,
+ 0.802246f, 0.287354f, 0.809082f, 0.276123f, 0.817383f, 0.264404f, 0.825684f, 0.253174f,
+ 0.831055f, 0.243286f, 0.837402f, 0.233398f, 0.843750f, 0.224365f, 0.849609f, 0.215332f,
+ 0.855469f, 0.206665f, 0.858398f, 0.198975f, 0.862793f, 0.191528f, 0.869629f, 0.183472f,
+ 0.872070f, 0.176392f, 0.877441f, 0.169312f, 0.880859f, 0.163086f, 0.884277f, 0.156860f,
+ 0.889160f, 0.150269f, 0.892578f, 0.143921f, 0.895996f, 0.138306f, 0.897461f, 0.133179f,
+ 0.902832f, 0.127441f, 0.905273f, 0.121887f, 0.908203f, 0.116760f, 0.910645f, 0.111816f,
+ 0.913574f, 0.107056f, 0.916504f, 0.102173f, 0.919434f, 0.097473f, 0.922363f, 0.092957f,
+ 0.923828f, 0.088318f, 0.925781f, 0.084412f, 0.930176f, 0.079895f, 0.931641f, 0.075378f,
+ 0.933105f, 0.071472f, 0.935547f, 0.067566f, 0.938477f, 0.063354f, 0.939941f, 0.059479f,
+ 0.940918f, 0.054382f, 0.941406f, 0.049774f, 0.943359f, 0.044891f, 0.945312f, 0.040375f,
+ 0.946777f, 0.035645f, 0.946777f, 0.029800f, 0.946289f, 0.022919f, 0.940430f, 0.009216f,
+ 0.000000f, 1.000000f, 0.298584f, 0.873047f, 0.415771f, 0.779297f, 0.487549f, 0.708496f,
+ 0.539551f, 0.651367f, 0.581055f, 0.603027f, 0.613770f, 0.562500f, 0.642090f, 0.526367f,
+ 0.666016f, 0.494629f, 0.685547f, 0.466797f, 0.705078f, 0.440674f, 0.722168f, 0.416992f,
+ 0.736816f, 0.395752f, 0.750000f, 0.376465f, 0.762695f, 0.357422f, 0.772949f, 0.340576f,
+ 0.783203f, 0.324951f, 0.793945f, 0.309814f, 0.802734f, 0.296143f, 0.811035f, 0.283203f,
+ 0.818359f, 0.270996f, 0.824707f, 0.259766f, 0.833008f, 0.248169f, 0.839844f, 0.237305f,
+ 0.846680f, 0.226929f, 0.852539f, 0.217529f, 0.857422f, 0.208496f, 0.863281f, 0.199341f,
+ 0.867676f, 0.191284f, 0.872070f, 0.183594f, 0.876465f, 0.175903f, 0.881836f, 0.168213f,
+ 0.885254f, 0.161621f, 0.888672f, 0.155151f, 0.893066f, 0.148560f, 0.897461f, 0.141846f,
+ 0.900391f, 0.136230f, 0.903320f, 0.130371f, 0.906250f, 0.125366f, 0.910156f, 0.119385f,
+ 0.913086f, 0.114075f, 0.916504f, 0.109070f, 0.917969f, 0.104614f, 0.920898f, 0.100342f,
+ 0.924805f, 0.094727f, 0.925781f, 0.090393f, 0.927246f, 0.086670f, 0.931152f, 0.082275f,
+ 0.934082f, 0.077698f, 0.935547f, 0.073975f, 0.937012f, 0.070129f, 0.938965f, 0.066467f,
+ 0.942383f, 0.062408f, 0.943359f, 0.058899f, 0.946289f, 0.055145f, 0.947754f, 0.051483f,
+ 0.948730f, 0.048096f, 0.949219f, 0.043121f, 0.950195f, 0.039001f, 0.952637f, 0.034546f,
+ 0.952637f, 0.030472f, 0.954590f, 0.026276f, 0.953125f, 0.019043f, 0.948730f, 0.007641f,
+ 0.000000f, 1.000000f, 0.302246f, 0.871582f, 0.424805f, 0.774414f, 0.500488f, 0.701172f,
+ 0.553711f, 0.643066f, 0.594727f, 0.593750f, 0.628418f, 0.552246f, 0.657227f, 0.515137f,
+ 0.682129f, 0.482178f, 0.702637f, 0.453613f, 0.720703f, 0.427246f, 0.737305f, 0.403076f,
+ 0.752441f, 0.381592f, 0.764648f, 0.362061f, 0.777832f, 0.342773f, 0.788574f, 0.325928f,
+ 0.798828f, 0.309570f, 0.809082f, 0.294434f, 0.817383f, 0.281006f, 0.825684f, 0.267578f,
+ 0.832520f, 0.255859f, 0.839844f, 0.244385f, 0.846191f, 0.233521f, 0.852539f, 0.222900f,
+ 0.858887f, 0.212646f, 0.865234f, 0.202515f, 0.870605f, 0.193726f, 0.875000f, 0.185425f,
+ 0.880371f, 0.177124f, 0.884766f, 0.169312f, 0.888672f, 0.161987f, 0.893555f, 0.154785f,
+ 0.896484f, 0.148315f, 0.901367f, 0.141602f, 0.904785f, 0.135254f, 0.906738f, 0.129639f,
+ 0.910156f, 0.124146f, 0.913574f, 0.118347f, 0.916992f, 0.112732f, 0.918457f, 0.107910f,
+ 0.920898f, 0.103455f, 0.925293f, 0.097900f, 0.926758f, 0.093689f, 0.930664f, 0.089172f,
+ 0.932129f, 0.084839f, 0.934570f, 0.080688f, 0.936523f, 0.076660f, 0.938965f, 0.072815f,
+ 0.941406f, 0.068726f, 0.942871f, 0.065186f, 0.944824f, 0.061890f, 0.947266f, 0.058167f,
+ 0.948730f, 0.054657f, 0.950684f, 0.051483f, 0.952148f, 0.048157f, 0.954102f, 0.045074f,
+ 0.956055f, 0.041779f, 0.956543f, 0.037933f, 0.957031f, 0.033966f, 0.958008f, 0.029770f,
+ 0.958984f, 0.026154f, 0.960938f, 0.022034f, 0.958496f, 0.016129f, 0.956055f, 0.006180f,
+ 0.000000f, 1.000000f, 0.307617f, 0.869629f, 0.433105f, 0.770020f, 0.510254f, 0.695312f,
+ 0.565918f, 0.634766f, 0.608887f, 0.584473f, 0.642578f, 0.541504f, 0.672363f, 0.503418f,
+ 0.696777f, 0.470459f, 0.718262f, 0.440674f, 0.736328f, 0.414307f, 0.751953f, 0.390137f,
+ 0.767578f, 0.367920f, 0.780762f, 0.348389f, 0.793457f, 0.329102f, 0.804199f, 0.311523f,
+ 0.813477f, 0.295410f, 0.822754f, 0.280762f, 0.831543f, 0.266602f, 0.839355f, 0.253662f,
+ 0.845703f, 0.242065f, 0.853516f, 0.230103f, 0.859375f, 0.219604f, 0.864746f, 0.209595f,
+ 0.871582f, 0.198975f, 0.877441f, 0.189331f, 0.881348f, 0.180908f, 0.886719f, 0.172241f,
+ 0.892090f, 0.164062f, 0.895020f, 0.156982f, 0.899902f, 0.149658f, 0.903809f, 0.142578f,
+ 0.907227f, 0.135986f, 0.910156f, 0.130005f, 0.913574f, 0.124207f, 0.917969f, 0.117737f,
+ 0.918945f, 0.112793f, 0.921875f, 0.107849f, 0.925781f, 0.102234f, 0.927734f, 0.097534f,
+ 0.930176f, 0.092896f, 0.932617f, 0.088623f, 0.935547f, 0.083984f, 0.937500f, 0.079895f,
+ 0.939941f, 0.075806f, 0.941895f, 0.072021f, 0.944336f, 0.068237f, 0.946777f, 0.064392f,
+ 0.948242f, 0.061005f, 0.949219f, 0.057953f, 0.952148f, 0.054352f, 0.953125f, 0.051086f,
+ 0.954590f, 0.048065f, 0.956055f, 0.045380f, 0.958496f, 0.041901f, 0.959473f, 0.039215f,
+ 0.961426f, 0.036530f, 0.962402f, 0.033875f, 0.963379f, 0.029465f, 0.962891f, 0.026260f,
+ 0.965332f, 0.022217f, 0.964844f, 0.018738f, 0.966309f, 0.013618f, 0.961914f, 0.006100f,
+ 0.000000f, 1.000000f, 0.312988f, 0.867188f, 0.442139f, 0.765625f, 0.521973f, 0.688477f,
+ 0.579102f, 0.626465f, 0.622070f, 0.575195f, 0.656250f, 0.531250f, 0.687012f, 0.492432f,
+ 0.710449f, 0.459229f, 0.731934f, 0.428711f, 0.751465f, 0.401611f, 0.765625f, 0.377686f,
+ 0.782227f, 0.354736f, 0.794922f, 0.334961f, 0.805664f, 0.316162f, 0.817383f, 0.298096f,
+ 0.826172f, 0.282471f, 0.834961f, 0.267578f, 0.843262f, 0.253662f, 0.850098f, 0.240967f,
+ 0.857910f, 0.228760f, 0.864746f, 0.217285f, 0.869141f, 0.207520f, 0.875488f, 0.197144f,
+ 0.881836f, 0.186890f, 0.885742f, 0.178101f, 0.892090f, 0.168701f, 0.896973f, 0.160400f,
+ 0.900391f, 0.152832f, 0.904785f, 0.145508f, 0.909668f, 0.137817f, 0.911621f, 0.131958f,
+ 0.916992f, 0.125244f, 0.918945f, 0.119263f, 0.922363f, 0.113464f, 0.925293f, 0.108093f,
+ 0.928223f, 0.102966f, 0.931152f, 0.097778f, 0.933594f, 0.092896f, 0.935547f, 0.088440f,
+ 0.937988f, 0.084106f, 0.940430f, 0.079651f, 0.941895f, 0.075623f, 0.943848f, 0.071899f,
+ 0.946777f, 0.067932f, 0.948242f, 0.064331f, 0.949707f, 0.061005f, 0.952637f, 0.057281f,
+ 0.954102f, 0.054382f, 0.956055f, 0.051056f, 0.957520f, 0.047974f, 0.958496f, 0.045074f,
+ 0.959961f, 0.042633f, 0.962402f, 0.039520f, 0.963379f, 0.036713f, 0.964844f, 0.034271f,
+ 0.966309f, 0.031860f, 0.967773f, 0.029099f, 0.969238f, 0.026581f, 0.968262f, 0.022797f,
+ 0.969238f, 0.019196f, 0.969727f, 0.016022f, 0.969727f, 0.012421f, 0.968262f, 0.004559f,
+ 0.000000f, 1.000000f, 0.317871f, 0.865234f, 0.450195f, 0.761719f, 0.533203f, 0.682129f,
+ 0.589844f, 0.619141f, 0.636230f, 0.565918f, 0.671387f, 0.520996f, 0.701172f, 0.481689f,
+ 0.725098f, 0.447754f, 0.746582f, 0.417236f, 0.764160f, 0.390137f, 0.781250f, 0.365234f,
+ 0.793945f, 0.342773f, 0.807129f, 0.322510f, 0.817383f, 0.304199f, 0.829590f, 0.286133f,
+ 0.837891f, 0.270264f, 0.847656f, 0.254883f, 0.855469f, 0.241455f, 0.863281f, 0.228516f,
+ 0.868652f, 0.217041f, 0.874512f, 0.206055f, 0.880859f, 0.195312f, 0.886230f, 0.185547f,
+ 0.891113f, 0.176514f, 0.897949f, 0.166382f, 0.900879f, 0.158203f, 0.906738f, 0.149780f,
+ 0.910156f, 0.142334f, 0.913574f, 0.135254f, 0.917480f, 0.128296f, 0.920898f, 0.121826f,
+ 0.923828f, 0.115967f, 0.927246f, 0.109680f, 0.928711f, 0.104614f, 0.932617f, 0.098999f,
+ 0.935059f, 0.094055f, 0.937988f, 0.089172f, 0.939453f, 0.084778f, 0.941406f, 0.080566f,
+ 0.945801f, 0.075806f, 0.946777f, 0.072083f, 0.947754f, 0.068542f, 0.950195f, 0.064819f,
+ 0.952637f, 0.060852f, 0.953613f, 0.057831f, 0.955078f, 0.054840f, 0.957520f, 0.051239f,
+ 0.958984f, 0.048096f, 0.959473f, 0.045776f, 0.962891f, 0.042450f, 0.964355f, 0.039673f,
+ 0.964844f, 0.037445f, 0.966309f, 0.034851f, 0.967773f, 0.032349f, 0.969238f, 0.029907f,
+ 0.970215f, 0.027863f, 0.971191f, 0.025635f, 0.973633f, 0.023224f, 0.973633f, 0.020294f,
+ 0.973145f, 0.016800f, 0.973633f, 0.014168f, 0.974121f, 0.010277f, 0.972168f, 0.004128f,
+ 0.000000f, 1.000000f, 0.323975f, 0.862793f, 0.459229f, 0.757324f, 0.543945f, 0.675781f,
+ 0.604004f, 0.610840f, 0.649414f, 0.557129f, 0.683594f, 0.512207f, 0.714355f, 0.471680f,
+ 0.737305f, 0.437256f, 0.758789f, 0.406250f, 0.777832f, 0.378662f, 0.793945f, 0.353760f,
+ 0.806641f, 0.331299f, 0.819336f, 0.311035f, 0.831055f, 0.292725f, 0.840820f, 0.274902f,
+ 0.850586f, 0.258545f, 0.858887f, 0.243774f, 0.866699f, 0.230469f, 0.872559f, 0.217651f,
+ 0.879395f, 0.205933f, 0.886719f, 0.194336f, 0.888184f, 0.185303f, 0.895996f, 0.174683f,
+ 0.898926f, 0.166382f, 0.905762f, 0.156982f, 0.909668f, 0.148315f, 0.913574f, 0.140625f,
+ 0.918457f, 0.132690f, 0.921387f, 0.126099f, 0.925293f, 0.119263f, 0.928223f, 0.113037f,
+ 0.930664f, 0.107239f, 0.933594f, 0.101562f, 0.937012f, 0.096191f, 0.939453f, 0.091064f,
+ 0.941895f, 0.086182f, 0.944336f, 0.081787f, 0.946289f, 0.077332f, 0.948242f, 0.073059f,
+ 0.950684f, 0.069092f, 0.952148f, 0.065308f, 0.953125f, 0.062042f, 0.956055f, 0.058167f,
+ 0.957031f, 0.055084f, 0.959473f, 0.051697f, 0.960938f, 0.048889f, 0.962891f, 0.045746f,
+ 0.964355f, 0.042847f, 0.964355f, 0.040771f, 0.966309f, 0.037872f, 0.968750f, 0.035156f,
+ 0.968750f, 0.033020f, 0.970703f, 0.030548f, 0.971680f, 0.028488f, 0.972656f, 0.026535f,
+ 0.974609f, 0.024033f, 0.975098f, 0.022125f, 0.976074f, 0.020737f, 0.977539f, 0.018311f,
+ 0.977539f, 0.014984f, 0.977051f, 0.011566f, 0.976562f, 0.008926f, 0.976562f, 0.003054f,
+ 0.000000f, 1.000000f, 0.327881f, 0.861328f, 0.469482f, 0.751953f, 0.553711f, 0.669922f,
+ 0.614746f, 0.603516f, 0.661133f, 0.548340f, 0.696777f, 0.501953f, 0.726562f, 0.461914f,
+ 0.750488f, 0.427002f, 0.770020f, 0.396240f, 0.790527f, 0.367676f, 0.803711f, 0.343750f,
+ 0.818848f, 0.320557f, 0.830566f, 0.300293f, 0.840820f, 0.281494f, 0.849121f, 0.265137f,
+ 0.859863f, 0.248413f, 0.868164f, 0.233643f, 0.875977f, 0.219727f, 0.883301f, 0.207520f,
+ 0.888672f, 0.195557f, 0.895020f, 0.184814f, 0.899414f, 0.174683f, 0.904297f, 0.165283f,
+ 0.907227f, 0.156982f, 0.911621f, 0.148438f, 0.916992f, 0.139893f, 0.921387f, 0.131836f,
+ 0.924805f, 0.124634f, 0.928223f, 0.117859f, 0.932129f, 0.111084f, 0.935547f, 0.105042f,
+ 0.937988f, 0.099487f, 0.940430f, 0.093994f, 0.943359f, 0.088562f, 0.945312f, 0.084045f,
+ 0.947754f, 0.079285f, 0.949707f, 0.074890f, 0.952148f, 0.070740f, 0.953125f, 0.067139f,
+ 0.956543f, 0.062744f, 0.957031f, 0.059448f, 0.958984f, 0.056000f, 0.960449f, 0.052704f,
+ 0.961914f, 0.049561f, 0.963867f, 0.046539f, 0.965332f, 0.043732f, 0.966309f, 0.041138f,
+ 0.968262f, 0.038544f, 0.969727f, 0.035736f, 0.970703f, 0.033447f, 0.971191f, 0.031616f,
+ 0.973633f, 0.029068f, 0.974121f, 0.026810f, 0.975098f, 0.025009f, 0.976562f, 0.022949f,
+ 0.977539f, 0.021301f, 0.978516f, 0.019516f, 0.979980f, 0.017151f, 0.980957f, 0.015793f,
+ 0.981934f, 0.014244f, 0.980469f, 0.010727f, 0.980957f, 0.006546f, 0.980469f, 0.003933f,
+ 0.000000f, 1.000000f, 0.332764f, 0.859375f, 0.478516f, 0.747559f, 0.565918f, 0.663086f,
+ 0.626465f, 0.596191f, 0.672852f, 0.540039f, 0.708008f, 0.493652f, 0.738770f, 0.452393f,
+ 0.763672f, 0.416748f, 0.783203f, 0.385986f, 0.800293f, 0.358154f, 0.815430f, 0.333252f,
+ 0.829590f, 0.310303f, 0.842285f, 0.290039f, 0.852051f, 0.271240f, 0.861816f, 0.254150f,
+ 0.869629f, 0.239136f, 0.877441f, 0.223877f, 0.885254f, 0.210205f, 0.891113f, 0.197998f,
+ 0.897461f, 0.186279f, 0.902344f, 0.175903f, 0.907227f, 0.165771f, 0.911621f, 0.156616f,
+ 0.916016f, 0.147949f, 0.919434f, 0.139893f, 0.923828f, 0.132324f, 0.928223f, 0.124207f,
+ 0.931152f, 0.117249f, 0.935059f, 0.110474f, 0.937988f, 0.104004f, 0.940430f, 0.098206f,
+ 0.943848f, 0.092346f, 0.945801f, 0.087219f, 0.947754f, 0.082458f, 0.951172f, 0.077393f,
+ 0.952148f, 0.073242f, 0.955078f, 0.068909f, 0.957031f, 0.064697f, 0.958008f, 0.061249f,
+ 0.959961f, 0.057831f, 0.962402f, 0.053864f, 0.963379f, 0.050842f, 0.964844f, 0.047913f,
+ 0.966309f, 0.044800f, 0.967773f, 0.041931f, 0.968750f, 0.039337f, 0.970703f, 0.036804f,
+ 0.971191f, 0.034515f, 0.972656f, 0.032318f, 0.974609f, 0.029572f, 0.975098f, 0.027725f,
+ 0.976074f, 0.025833f, 0.977051f, 0.024002f, 0.978516f, 0.022171f, 0.979492f, 0.020050f,
+ 0.980469f, 0.018234f, 0.981445f, 0.016830f, 0.981934f, 0.015442f, 0.982910f, 0.014137f,
+ 0.984375f, 0.012009f, 0.984863f, 0.009422f, 0.982910f, 0.006298f, 0.982422f, 0.003025f,
+ 0.000000f, 1.000000f, 0.338135f, 0.856934f, 0.487061f, 0.743164f, 0.576660f, 0.656738f,
+ 0.638184f, 0.588379f, 0.686035f, 0.531738f, 0.720215f, 0.484619f, 0.750488f, 0.443359f,
+ 0.774414f, 0.407715f, 0.795410f, 0.376709f, 0.812500f, 0.348633f, 0.826660f, 0.323975f,
+ 0.838867f, 0.301270f, 0.851074f, 0.280273f, 0.861328f, 0.261719f, 0.870605f, 0.245117f,
+ 0.877930f, 0.229980f, 0.885254f, 0.215576f, 0.892578f, 0.201660f, 0.898926f, 0.189453f,
+ 0.905273f, 0.177734f, 0.910156f, 0.167358f, 0.914551f, 0.157471f, 0.918457f, 0.148804f,
+ 0.922852f, 0.139893f, 0.925781f, 0.132446f, 0.930176f, 0.124695f, 0.932129f, 0.118042f,
+ 0.936523f, 0.110596f, 0.940918f, 0.103638f, 0.943359f, 0.097717f, 0.946289f, 0.091736f,
+ 0.948242f, 0.086548f, 0.950684f, 0.081299f, 0.953613f, 0.076416f, 0.955566f, 0.071777f,
+ 0.957031f, 0.067810f, 0.959473f, 0.063477f, 0.960938f, 0.059662f, 0.962402f, 0.056183f,
+ 0.964355f, 0.052795f, 0.966309f, 0.049347f, 0.967285f, 0.046387f, 0.969238f, 0.043182f,
+ 0.969727f, 0.040741f, 0.970703f, 0.038177f, 0.972656f, 0.035431f, 0.974121f, 0.032867f,
+ 0.974609f, 0.030884f, 0.975586f, 0.028732f, 0.976562f, 0.026794f, 0.978516f, 0.024948f,
+ 0.979980f, 0.022446f, 0.979980f, 0.021027f, 0.981445f, 0.019119f, 0.981934f, 0.017761f,
+ 0.982910f, 0.016373f, 0.983398f, 0.014824f, 0.985352f, 0.012970f, 0.985840f, 0.011520f,
+ 0.986328f, 0.010490f, 0.986816f, 0.009224f, 0.986328f, 0.005840f, 0.986328f, 0.001069f,
+ 0.000000f, 1.000000f, 0.343994f, 0.854492f, 0.495605f, 0.738281f, 0.586914f, 0.650879f,
+ 0.651367f, 0.580566f, 0.698730f, 0.523438f, 0.734375f, 0.475342f, 0.761230f, 0.434814f,
+ 0.786133f, 0.398926f, 0.805176f, 0.367188f, 0.823242f, 0.338867f, 0.836914f, 0.314209f,
+ 0.848633f, 0.292480f, 0.860840f, 0.271484f, 0.870117f, 0.253174f, 0.877930f, 0.236572f,
+ 0.886719f, 0.221191f, 0.892578f, 0.207642f, 0.900879f, 0.193604f, 0.906738f, 0.181396f,
+ 0.911621f, 0.170166f, 0.916504f, 0.159668f, 0.920898f, 0.150391f, 0.925293f, 0.141235f,
+ 0.928711f, 0.133057f, 0.932617f, 0.125244f, 0.934570f, 0.118225f, 0.938477f, 0.111328f,
+ 0.941406f, 0.104858f, 0.945312f, 0.098022f, 0.948242f, 0.091980f, 0.951172f, 0.086060f,
+ 0.953125f, 0.080811f, 0.954590f, 0.076233f, 0.958008f, 0.071106f, 0.959961f, 0.066650f,
+ 0.961914f, 0.062683f, 0.962891f, 0.058899f, 0.965820f, 0.054993f, 0.966797f, 0.051422f,
+ 0.968262f, 0.048309f, 0.969238f, 0.045349f, 0.970703f, 0.042419f, 0.972656f, 0.039337f,
+ 0.973633f, 0.036652f, 0.974609f, 0.034241f, 0.975098f, 0.032104f, 0.976562f, 0.029892f,
+ 0.978027f, 0.027725f, 0.979492f, 0.025360f, 0.979980f, 0.023514f, 0.980957f, 0.021729f,
+ 0.981934f, 0.020126f, 0.982422f, 0.018860f, 0.983887f, 0.017105f, 0.984375f, 0.015640f,
+ 0.986328f, 0.013519f, 0.986328f, 0.012535f, 0.986816f, 0.011215f, 0.987305f, 0.010269f,
+ 0.988281f, 0.009048f, 0.989746f, 0.007778f, 0.990234f, 0.005577f, 0.988281f, 0.001070f,
+ 0.000000f, 1.000000f, 0.349854f, 0.852539f, 0.504883f, 0.733887f, 0.597656f, 0.645020f,
+ 0.662109f, 0.573730f, 0.708496f, 0.516113f, 0.745117f, 0.467529f, 0.773438f, 0.426025f,
+ 0.795898f, 0.390137f, 0.814453f, 0.359131f, 0.832031f, 0.331055f, 0.845703f, 0.305908f,
+ 0.858398f, 0.283691f, 0.869141f, 0.263916f, 0.878906f, 0.244995f, 0.887695f, 0.228149f,
+ 0.894531f, 0.213135f, 0.900391f, 0.199707f, 0.906250f, 0.186890f, 0.913086f, 0.174194f,
+ 0.917969f, 0.163208f, 0.922363f, 0.152832f, 0.927246f, 0.143066f, 0.931641f, 0.134399f,
+ 0.934570f, 0.126343f, 0.937988f, 0.118835f, 0.940430f, 0.111694f, 0.942871f, 0.105530f,
+ 0.946289f, 0.098877f, 0.948242f, 0.093445f, 0.951660f, 0.087158f, 0.955078f, 0.081238f,
+ 0.957520f, 0.075745f, 0.959473f, 0.071350f, 0.961914f, 0.066650f, 0.963379f, 0.062286f,
+ 0.965332f, 0.058044f, 0.966309f, 0.054749f, 0.968262f, 0.051086f, 0.970215f, 0.047638f,
+ 0.971191f, 0.044403f, 0.973145f, 0.041199f, 0.973633f, 0.038696f, 0.975098f, 0.036163f,
+ 0.976074f, 0.033661f, 0.977051f, 0.031342f, 0.979004f, 0.028595f, 0.979492f, 0.026642f,
+ 0.980957f, 0.024536f, 0.980957f, 0.023056f, 0.981934f, 0.021393f, 0.982910f, 0.019638f,
+ 0.984375f, 0.017868f, 0.985840f, 0.015839f, 0.986328f, 0.014481f, 0.986816f, 0.013329f,
+ 0.987305f, 0.012222f, 0.988281f, 0.011002f, 0.988770f, 0.010025f, 0.989258f, 0.008797f,
+ 0.990723f, 0.007423f, 0.991699f, 0.005798f, 0.992188f, 0.005005f, 0.990234f, 0.001524f,
+ 0.000000f, 1.000000f, 0.354492f, 0.850586f, 0.512695f, 0.729980f, 0.608887f, 0.638184f,
+ 0.672852f, 0.566895f, 0.720215f, 0.507812f, 0.755371f, 0.459473f, 0.783203f, 0.417969f,
+ 0.806152f, 0.381836f, 0.825195f, 0.350586f, 0.841309f, 0.322510f, 0.855469f, 0.297852f,
+ 0.867188f, 0.275635f, 0.876465f, 0.255859f, 0.886230f, 0.237793f, 0.894043f, 0.221191f,
+ 0.901367f, 0.206177f, 0.907715f, 0.192261f, 0.913086f, 0.179932f, 0.919434f, 0.167969f,
+ 0.924316f, 0.156860f, 0.928711f, 0.146484f, 0.933105f, 0.137085f, 0.936523f, 0.128296f,
+ 0.939453f, 0.120544f, 0.943848f, 0.112793f, 0.945312f, 0.106079f, 0.948242f, 0.099670f,
+ 0.951172f, 0.093689f, 0.953125f, 0.087952f, 0.954590f, 0.082947f, 0.958008f, 0.077271f,
+ 0.960938f, 0.071838f, 0.962891f, 0.066895f, 0.964355f, 0.062622f, 0.966797f, 0.058441f,
+ 0.967773f, 0.054688f, 0.970703f, 0.050415f, 0.971680f, 0.047180f, 0.972656f, 0.044159f,
+ 0.974609f, 0.041016f, 0.975098f, 0.038391f, 0.978027f, 0.035156f, 0.978027f, 0.032745f,
+ 0.979492f, 0.030182f, 0.979980f, 0.028275f, 0.980957f, 0.026199f, 0.981445f, 0.024445f,
+ 0.983398f, 0.022293f, 0.983887f, 0.020523f, 0.985840f, 0.018219f, 0.985840f, 0.016907f,
+ 0.986816f, 0.015411f, 0.987305f, 0.014198f, 0.987793f, 0.013115f, 0.988281f, 0.011971f,
+ 0.989258f, 0.010750f, 0.990234f, 0.009499f, 0.992188f, 0.007675f, 0.991699f, 0.006729f,
+ 0.992188f, 0.005875f, 0.992676f, 0.005150f, 0.993164f, 0.004486f, 0.992676f, 0.002670f,
+ 0.000000f, 1.000000f, 0.359863f, 0.848633f, 0.523438f, 0.724609f, 0.617676f, 0.632812f,
+ 0.682617f, 0.560059f, 0.728516f, 0.501465f, 0.765137f, 0.451904f, 0.793457f, 0.410156f,
+ 0.816406f, 0.374268f, 0.832520f, 0.343506f, 0.849609f, 0.314941f, 0.862305f, 0.291016f,
+ 0.875000f, 0.268066f, 0.884277f, 0.248413f, 0.892578f, 0.230835f, 0.901367f, 0.214111f,
+ 0.907227f, 0.199341f, 0.914062f, 0.185547f, 0.918945f, 0.173340f, 0.924316f, 0.161987f,
+ 0.929688f, 0.151245f, 0.934082f, 0.140747f, 0.937500f, 0.131714f, 0.941895f, 0.122803f,
+ 0.944824f, 0.114929f, 0.948730f, 0.107605f, 0.950195f, 0.100891f, 0.952148f, 0.094727f,
+ 0.955078f, 0.088806f, 0.957031f, 0.083252f, 0.958984f, 0.078064f, 0.960938f, 0.073486f,
+ 0.962891f, 0.068909f, 0.966797f, 0.063354f, 0.967773f, 0.059082f, 0.970215f, 0.054871f,
+ 0.971680f, 0.051239f, 0.972656f, 0.047607f, 0.975098f, 0.044067f, 0.976562f, 0.040588f,
+ 0.977539f, 0.037720f, 0.978516f, 0.034973f, 0.979980f, 0.032471f, 0.980469f, 0.030273f,
+ 0.981934f, 0.027878f, 0.982422f, 0.025864f, 0.984863f, 0.023132f, 0.984863f, 0.021423f,
+ 0.985840f, 0.019531f, 0.986328f, 0.018112f, 0.986816f, 0.016693f, 0.987305f, 0.015427f,
+ 0.988281f, 0.013962f, 0.989258f, 0.012756f, 0.989746f, 0.011421f, 0.991699f, 0.009712f,
+ 0.992188f, 0.008286f, 0.992676f, 0.007282f, 0.992676f, 0.006523f, 0.992676f, 0.005974f,
+ 0.993164f, 0.005268f, 0.993652f, 0.004604f, 0.994629f, 0.003599f, 0.996094f, 0.002056f,
+ 0.000000f, 1.000000f, 0.366699f, 0.845703f, 0.532227f, 0.720215f, 0.628418f, 0.626953f,
+ 0.693848f, 0.553223f, 0.740234f, 0.494141f, 0.774414f, 0.445068f, 0.801758f, 0.403320f,
+ 0.823242f, 0.367432f, 0.842285f, 0.335449f, 0.857910f, 0.307861f, 0.871094f, 0.283203f,
+ 0.880859f, 0.261963f, 0.892090f, 0.241577f, 0.899414f, 0.224121f, 0.905762f, 0.208618f,
+ 0.915039f, 0.192871f, 0.919922f, 0.179443f, 0.925781f, 0.166870f, 0.929688f, 0.156006f,
+ 0.934082f, 0.145630f, 0.937500f, 0.136353f, 0.942871f, 0.126709f, 0.946289f, 0.117920f,
+ 0.948730f, 0.110229f, 0.951660f, 0.103088f, 0.955078f, 0.095886f, 0.957520f, 0.089783f,
+ 0.958984f, 0.084351f, 0.960938f, 0.079041f, 0.963867f, 0.073486f, 0.965332f, 0.069031f,
+ 0.965820f, 0.065063f, 0.967285f, 0.061066f, 0.970703f, 0.056763f, 0.973145f, 0.052124f,
+ 0.974609f, 0.047943f, 0.976074f, 0.044434f, 0.977051f, 0.041290f, 0.978516f, 0.038208f,
+ 0.979492f, 0.035522f, 0.980957f, 0.032837f, 0.983398f, 0.029755f, 0.983887f, 0.027161f,
+ 0.984863f, 0.025040f, 0.985352f, 0.023071f, 0.986328f, 0.021347f, 0.986328f, 0.019760f,
+ 0.987305f, 0.018021f, 0.988281f, 0.016464f, 0.988770f, 0.015030f, 0.990234f, 0.013283f,
+ 0.991211f, 0.011444f, 0.991699f, 0.010017f, 0.992188f, 0.008942f, 0.992188f, 0.008217f,
+ 0.992676f, 0.007336f, 0.993164f, 0.006538f, 0.993652f, 0.005810f, 0.994141f, 0.005104f,
+ 0.994629f, 0.004375f, 0.995117f, 0.003656f, 0.996582f, 0.002283f, 0.998535f, 0.000016f,
+ 0.000000f, 1.000000f, 0.372559f, 0.843262f, 0.540527f, 0.715820f, 0.638672f, 0.621094f,
+ 0.704590f, 0.546875f, 0.750000f, 0.487305f, 0.785645f, 0.437500f, 0.812988f, 0.395508f,
+ 0.833496f, 0.359619f, 0.851074f, 0.328613f, 0.864746f, 0.301514f, 0.877930f, 0.276855f,
+ 0.888184f, 0.255127f, 0.897461f, 0.235962f, 0.906738f, 0.217529f, 0.913086f, 0.202271f,
+ 0.918945f, 0.187744f, 0.925293f, 0.174316f, 0.931152f, 0.161621f, 0.934570f, 0.150757f,
+ 0.939453f, 0.140015f, 0.941895f, 0.131226f, 0.945312f, 0.122803f, 0.950195f, 0.113892f,
+ 0.953125f, 0.106018f, 0.955566f, 0.098877f, 0.958984f, 0.091980f, 0.960938f, 0.085510f,
+ 0.962891f, 0.080017f, 0.964355f, 0.074890f, 0.966309f, 0.070007f, 0.968750f, 0.065186f,
+ 0.970215f, 0.060699f, 0.970703f, 0.057068f, 0.971680f, 0.053589f, 0.972656f, 0.050354f,
+ 0.974609f, 0.047058f, 0.977051f, 0.043060f, 0.979980f, 0.038910f, 0.980957f, 0.035583f,
+ 0.981934f, 0.032776f, 0.982910f, 0.030228f, 0.983887f, 0.027878f, 0.984863f, 0.025711f,
+ 0.985840f, 0.023590f, 0.986816f, 0.021484f, 0.987793f, 0.019531f, 0.988770f, 0.017654f,
+ 0.990723f, 0.015228f, 0.991211f, 0.013527f, 0.991699f, 0.012215f, 0.991699f, 0.011169f,
+ 0.992188f, 0.010063f, 0.992676f, 0.009056f, 0.993164f, 0.008133f, 0.993652f, 0.007294f,
+ 0.994141f, 0.006493f, 0.994629f, 0.005669f, 0.995117f, 0.004833f, 0.995605f, 0.004032f,
+ 0.996582f, 0.002949f, 0.999023f, 0.000812f, 0.999023f, 0.000101f, 0.999023f, 0.000001f,
+ 0.000000f, 1.000000f, 0.377686f, 0.841309f, 0.549316f, 0.711426f, 0.649902f, 0.615234f,
+ 0.712891f, 0.541016f, 0.759766f, 0.480469f, 0.793945f, 0.430908f, 0.820801f, 0.388672f,
+ 0.841797f, 0.353027f, 0.858887f, 0.321777f, 0.872070f, 0.295166f, 0.883789f, 0.270752f,
+ 0.895020f, 0.249268f, 0.905273f, 0.229370f, 0.910645f, 0.212891f, 0.919434f, 0.196289f,
+ 0.924316f, 0.182129f, 0.930176f, 0.168823f, 0.933594f, 0.157715f, 0.939941f, 0.145996f,
+ 0.943848f, 0.135254f, 0.946777f, 0.126099f, 0.950195f, 0.117737f, 0.953613f, 0.109436f,
+ 0.955566f, 0.102539f, 0.957031f, 0.096375f, 0.961426f, 0.089172f, 0.965820f, 0.081909f,
+ 0.966797f, 0.076172f, 0.968750f, 0.070923f, 0.969727f, 0.066345f, 0.971680f, 0.061951f,
+ 0.973145f, 0.057678f, 0.975098f, 0.053467f, 0.976562f, 0.049377f, 0.977051f, 0.046234f,
+ 0.977539f, 0.043427f, 0.978027f, 0.040863f, 0.979004f, 0.038330f, 0.979492f, 0.036011f,
+ 0.981934f, 0.032745f, 0.984375f, 0.029495f, 0.985840f, 0.026550f, 0.988770f, 0.023163f,
+ 0.989258f, 0.020752f, 0.989746f, 0.018799f, 0.990234f, 0.017090f, 0.990723f, 0.015549f,
+ 0.991211f, 0.014122f, 0.991699f, 0.012810f, 0.992188f, 0.011581f, 0.992676f, 0.010429f,
+ 0.993652f, 0.009186f, 0.994141f, 0.008095f, 0.994629f, 0.007080f, 0.995605f, 0.006016f,
+ 0.996094f, 0.004925f, 0.997559f, 0.003551f, 0.999512f, 0.001453f, 0.999512f, 0.000681f,
+ 0.999512f, 0.000327f, 0.999512f, 0.000131f, 0.999512f, 0.000030f, 0.999512f, 0.000000f,
+ 0.000000f, 1.000000f, 0.381104f, 0.839844f, 0.556152f, 0.708496f, 0.657715f, 0.610352f,
+ 0.722656f, 0.534668f, 0.766602f, 0.475586f, 0.801270f, 0.425537f, 0.828125f, 0.383057f,
+ 0.849609f, 0.346680f, 0.865723f, 0.315918f, 0.880371f, 0.288330f, 0.891602f, 0.265137f,
+ 0.900391f, 0.243896f, 0.909180f, 0.224731f, 0.916992f, 0.207275f, 0.921387f, 0.192505f,
+ 0.929688f, 0.177612f, 0.937012f, 0.162964f, 0.937012f, 0.153320f, 0.942871f, 0.142700f,
+ 0.949707f, 0.130981f, 0.952637f, 0.120728f, 0.952637f, 0.113953f, 0.952637f, 0.108093f,
+ 0.958496f, 0.100281f, 0.964844f, 0.091125f, 0.968262f, 0.082703f, 0.968262f, 0.077515f,
+ 0.968262f, 0.073181f, 0.968262f, 0.069336f, 0.968262f, 0.065918f, 0.968262f, 0.062805f,
+ 0.973145f, 0.058167f, 0.979004f, 0.051331f, 0.983887f, 0.044220f, 0.983887f, 0.040466f,
+ 0.983887f, 0.037598f, 0.983887f, 0.035156f, 0.983887f, 0.033020f, 0.983887f, 0.031143f,
+ 0.983887f, 0.029434f, 0.983887f, 0.027908f, 0.983887f, 0.026505f, 0.983887f, 0.025238f,
+ 0.983887f, 0.024078f, 0.983887f, 0.023026f, 0.983887f, 0.022079f, 0.983887f, 0.021210f,
+ 0.990723f, 0.017212f, 0.999512f, 0.010246f, 0.999512f, 0.006580f, 0.999512f, 0.004841f,
+ 0.999512f, 0.003675f, 0.999512f, 0.002810f, 0.999512f, 0.002134f, 0.999512f, 0.001597f,
+ 0.999512f, 0.001167f, 0.999512f, 0.000822f, 0.999512f, 0.000550f, 0.999512f, 0.000340f,
+ 0.999512f, 0.000185f, 0.999512f, 0.000080f, 0.999512f, 0.000019f, 0.999512f, 0.000000f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f,
+ 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987793f,
+ 0.000000f, 0.986816f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.983398f,
+ 0.000000f, 0.981445f, 0.000000f, 0.979980f, 0.000000f, 0.979004f, 0.000000f, 0.976562f,
+ 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.970215f, 0.000000f, 0.967773f,
+ 0.000000f, 0.965332f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.954590f,
+ 0.000000f, 0.949707f, 0.000000f, 0.944336f, 0.000000f, 0.937988f, 0.000000f, 0.932617f,
+ 0.000000f, 0.925293f, 0.000000f, 0.916016f, 0.000000f, 0.904785f, 0.000000f, 0.892090f,
+ 0.000000f, 0.875977f, 0.000000f, 0.855957f, 0.000000f, 0.830566f, 0.000000f, 0.797363f,
+ 0.000000f, 0.747070f, 0.000000f, 0.670898f, 0.000000f, 0.535645f, 0.000000f, 0.219482f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.993652f,
+ 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f,
+ 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987793f,
+ 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.982910f,
+ 0.000000f, 0.981445f, 0.000000f, 0.979980f, 0.000000f, 0.978516f, 0.000000f, 0.976562f,
+ 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.970215f, 0.000000f, 0.967773f,
+ 0.000000f, 0.964355f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.954102f,
+ 0.000000f, 0.949707f, 0.000000f, 0.944336f, 0.000000f, 0.938965f, 0.000000f, 0.932129f,
+ 0.000000f, 0.924316f, 0.000000f, 0.915039f, 0.000000f, 0.904785f, 0.000000f, 0.892090f,
+ 0.000000f, 0.875977f, 0.000000f, 0.856445f, 0.000000f, 0.830566f, 0.000000f, 0.796387f,
+ 0.000000f, 0.747070f, 0.000000f, 0.670898f, 0.000001f, 0.535156f, 0.000001f, 0.218628f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f,
+ 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.990723f,
+ 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987793f,
+ 0.000000f, 0.986816f, 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f,
+ 0.000000f, 0.980957f, 0.000000f, 0.979980f, 0.000000f, 0.978027f, 0.000000f, 0.976074f,
+ 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.966797f,
+ 0.000000f, 0.963867f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.953125f,
+ 0.000000f, 0.949219f, 0.000000f, 0.943848f, 0.000000f, 0.937500f, 0.000000f, 0.931641f,
+ 0.000000f, 0.924316f, 0.000000f, 0.915039f, 0.000000f, 0.904297f, 0.000000f, 0.891113f,
+ 0.000000f, 0.875977f, 0.000000f, 0.855957f, 0.000014f, 0.829590f, 0.000017f, 0.795898f,
+ 0.000014f, 0.746094f, 0.000009f, 0.669922f, 0.000010f, 0.535156f, 0.000010f, 0.218384f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f,
+ 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990234f,
+ 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.988281f, 0.000000f, 0.987305f,
+ 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f,
+ 0.000000f, 0.980957f, 0.000000f, 0.979004f, 0.000000f, 0.978027f, 0.000000f, 0.975586f,
+ 0.000000f, 0.973633f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.966309f,
+ 0.000000f, 0.963379f, 0.000000f, 0.960938f, 0.000000f, 0.956543f, 0.000000f, 0.953125f,
+ 0.000000f, 0.948242f, 0.000000f, 0.943359f, 0.000000f, 0.937012f, 0.000008f, 0.930664f,
+ 0.000034f, 0.922852f, 0.000065f, 0.914062f, 0.000075f, 0.902832f, 0.000074f, 0.890625f,
+ 0.000069f, 0.875000f, 0.000061f, 0.854492f, 0.000051f, 0.828125f, 0.000052f, 0.793945f,
+ 0.000049f, 0.745605f, 0.000045f, 0.668945f, 0.000046f, 0.534180f, 0.000053f, 0.218262f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993652f,
+ 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.991211f,
+ 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986816f,
+ 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, 0.000000f, 0.981934f,
+ 0.000000f, 0.980957f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, 0.000000f, 0.975098f,
+ 0.000000f, 0.973145f, 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000013f, 0.965820f,
+ 0.000042f, 0.962891f, 0.000078f, 0.959473f, 0.000117f, 0.956055f, 0.000164f, 0.951660f,
+ 0.000198f, 0.946777f, 0.000209f, 0.942383f, 0.000209f, 0.937012f, 0.000202f, 0.929199f,
+ 0.000189f, 0.922363f, 0.000174f, 0.912598f, 0.000156f, 0.901855f, 0.000138f, 0.889160f,
+ 0.000139f, 0.873047f, 0.000157f, 0.852539f, 0.000139f, 0.826660f, 0.000142f, 0.792480f,
+ 0.000139f, 0.744141f, 0.000136f, 0.667969f, 0.000144f, 0.532715f, 0.000154f, 0.218384f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, 0.000000f, 0.990234f,
+ 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986328f,
+ 0.000000f, 0.985352f, 0.000000f, 0.983398f, 0.000013f, 0.982422f, 0.000042f, 0.981934f,
+ 0.000083f, 0.979980f, 0.000126f, 0.978027f, 0.000174f, 0.976074f, 0.000223f, 0.974609f,
+ 0.000277f, 0.972656f, 0.000325f, 0.970215f, 0.000384f, 0.967285f, 0.000425f, 0.964844f,
+ 0.000434f, 0.961914f, 0.000435f, 0.958984f, 0.000422f, 0.955078f, 0.000404f, 0.950684f,
+ 0.000386f, 0.945801f, 0.000355f, 0.940430f, 0.000329f, 0.935059f, 0.000301f, 0.927734f,
+ 0.000294f, 0.919922f, 0.000316f, 0.911133f, 0.000342f, 0.899414f, 0.000317f, 0.886719f,
+ 0.000304f, 0.871094f, 0.000316f, 0.850586f, 0.000306f, 0.824219f, 0.000306f, 0.790039f,
+ 0.000317f, 0.741699f, 0.000325f, 0.665527f, 0.000368f, 0.531738f, 0.000336f, 0.218750f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.992188f,
+ 0.000000f, 0.991699f, 0.000009f, 0.991211f, 0.000045f, 0.990234f, 0.000088f, 0.989258f,
+ 0.000141f, 0.988770f, 0.000193f, 0.988281f, 0.000254f, 0.986816f, 0.000309f, 0.985352f,
+ 0.000371f, 0.984375f, 0.000433f, 0.983398f, 0.000489f, 0.981934f, 0.000550f, 0.980469f,
+ 0.000613f, 0.978516f, 0.000669f, 0.977539f, 0.000721f, 0.975586f, 0.000754f, 0.973145f,
+ 0.000756f, 0.971191f, 0.000737f, 0.969238f, 0.000710f, 0.966309f, 0.000686f, 0.963379f,
+ 0.000653f, 0.960449f, 0.000606f, 0.957031f, 0.000570f, 0.953125f, 0.000548f, 0.949219f,
+ 0.000551f, 0.944336f, 0.000556f, 0.938965f, 0.000592f, 0.933105f, 0.000615f, 0.926758f,
+ 0.000588f, 0.917480f, 0.000569f, 0.908691f, 0.000591f, 0.897949f, 0.000594f, 0.884277f,
+ 0.000582f, 0.868164f, 0.000609f, 0.848145f, 0.000600f, 0.822266f, 0.000624f, 0.787598f,
+ 0.000664f, 0.738770f, 0.000690f, 0.664062f, 0.000762f, 0.530273f, 0.000609f, 0.218628f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f,
+ 0.000000f, 0.996094f, 0.000009f, 0.996094f, 0.000054f, 0.995605f, 0.000109f, 0.994629f,
+ 0.000180f, 0.993652f, 0.000247f, 0.993164f, 0.000314f, 0.992676f, 0.000393f, 0.992188f,
+ 0.000460f, 0.990723f, 0.000523f, 0.990234f, 0.000603f, 0.989258f, 0.000671f, 0.988770f,
+ 0.000731f, 0.988281f, 0.000796f, 0.987305f, 0.000869f, 0.985840f, 0.000931f, 0.984863f,
+ 0.000986f, 0.983887f, 0.001042f, 0.982422f, 0.001111f, 0.980957f, 0.001141f, 0.979004f,
+ 0.001129f, 0.977539f, 0.001094f, 0.976562f, 0.001068f, 0.974609f, 0.001030f, 0.971680f,
+ 0.000982f, 0.970215f, 0.000919f, 0.967285f, 0.000896f, 0.965332f, 0.000896f, 0.961914f,
+ 0.000907f, 0.958496f, 0.000920f, 0.955566f, 0.000946f, 0.952148f, 0.000954f, 0.946777f,
+ 0.000996f, 0.942383f, 0.000986f, 0.937012f, 0.000992f, 0.930664f, 0.000962f, 0.923828f,
+ 0.000999f, 0.915039f, 0.001023f, 0.906250f, 0.001049f, 0.895020f, 0.001014f, 0.880859f,
+ 0.001073f, 0.864746f, 0.001107f, 0.844727f, 0.001101f, 0.818359f, 0.001165f, 0.784668f,
+ 0.001243f, 0.735352f, 0.001321f, 0.661133f, 0.001458f, 0.528320f, 0.000982f, 0.218750f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000040f, 0.997559f,
+ 0.000125f, 0.997070f, 0.000202f, 0.996582f, 0.000307f, 0.996582f, 0.000395f, 0.996094f,
+ 0.000472f, 0.996094f, 0.000576f, 0.995117f, 0.000659f, 0.994629f, 0.000728f, 0.994141f,
+ 0.000812f, 0.993652f, 0.000898f, 0.993164f, 0.000970f, 0.992188f, 0.001029f, 0.991211f,
+ 0.001099f, 0.990723f, 0.001179f, 0.989258f, 0.001245f, 0.988770f, 0.001302f, 0.988281f,
+ 0.001349f, 0.986816f, 0.001421f, 0.985840f, 0.001489f, 0.984863f, 0.001543f, 0.984375f,
+ 0.001539f, 0.983398f, 0.001496f, 0.981445f, 0.001463f, 0.979980f, 0.001421f, 0.978027f,
+ 0.001372f, 0.976562f, 0.001354f, 0.974609f, 0.001354f, 0.972656f, 0.001341f, 0.971191f,
+ 0.001372f, 0.968262f, 0.001408f, 0.965820f, 0.001438f, 0.962891f, 0.001471f, 0.960938f,
+ 0.001439f, 0.956543f, 0.001493f, 0.953613f, 0.001564f, 0.949219f, 0.001599f, 0.944824f,
+ 0.001520f, 0.940430f, 0.001563f, 0.934570f, 0.001614f, 0.928223f, 0.001697f, 0.920898f,
+ 0.001627f, 0.912598f, 0.001644f, 0.902832f, 0.001767f, 0.892090f, 0.001718f, 0.877930f,
+ 0.001780f, 0.861328f, 0.001869f, 0.840820f, 0.001884f, 0.814941f, 0.002008f, 0.780273f,
+ 0.002163f, 0.731934f, 0.002293f, 0.658203f, 0.002483f, 0.526367f, 0.001459f, 0.218140f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000059f, 0.998535f, 0.000189f, 0.998535f,
+ 0.000311f, 0.998047f, 0.000439f, 0.997559f, 0.000566f, 0.997559f, 0.000655f, 0.997070f,
+ 0.000767f, 0.996582f, 0.000879f, 0.996582f, 0.000962f, 0.996094f, 0.001024f, 0.995605f,
+ 0.001130f, 0.995117f, 0.001223f, 0.994629f, 0.001292f, 0.994141f, 0.001348f, 0.993652f,
+ 0.001412f, 0.993164f, 0.001506f, 0.992676f, 0.001577f, 0.991699f, 0.001634f, 0.990234f,
+ 0.001678f, 0.989746f, 0.001728f, 0.988770f, 0.001814f, 0.988281f, 0.001879f, 0.986816f,
+ 0.001928f, 0.985840f, 0.001916f, 0.984863f, 0.001863f, 0.983887f, 0.001880f, 0.982910f,
+ 0.001885f, 0.981445f, 0.001899f, 0.979980f, 0.001921f, 0.978516f, 0.001940f, 0.977051f,
+ 0.001894f, 0.974609f, 0.001963f, 0.973145f, 0.002008f, 0.971191f, 0.002060f, 0.969238f,
+ 0.001989f, 0.967285f, 0.002029f, 0.963867f, 0.002153f, 0.961426f, 0.002289f, 0.958008f,
+ 0.002226f, 0.955078f, 0.002268f, 0.951172f, 0.002287f, 0.946777f, 0.002346f, 0.942871f,
+ 0.002325f, 0.937012f, 0.002436f, 0.931641f, 0.002487f, 0.925293f, 0.002548f, 0.917969f,
+ 0.002508f, 0.909180f, 0.002623f, 0.898926f, 0.002729f, 0.888184f, 0.002832f, 0.874512f,
+ 0.002817f, 0.857422f, 0.002996f, 0.836426f, 0.003170f, 0.811035f, 0.003237f, 0.775391f,
+ 0.003504f, 0.727539f, 0.003695f, 0.654297f, 0.003901f, 0.523926f, 0.002045f, 0.217896f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000162f, 0.999023f,
+ 0.000390f, 0.999023f, 0.000528f, 0.998535f, 0.000705f, 0.998535f, 0.000843f, 0.998047f,
+ 0.000922f, 0.997559f, 0.001056f, 0.997559f, 0.001181f, 0.997070f, 0.001257f, 0.996582f,
+ 0.001308f, 0.996582f, 0.001427f, 0.995605f, 0.001532f, 0.995605f, 0.001599f, 0.995117f,
+ 0.001647f, 0.994141f, 0.001682f, 0.994141f, 0.001808f, 0.993652f, 0.001889f, 0.992676f,
+ 0.001945f, 0.992676f, 0.001984f, 0.991699f, 0.002012f, 0.991211f, 0.002106f, 0.990234f,
+ 0.002188f, 0.989258f, 0.002283f, 0.988281f, 0.002369f, 0.986816f, 0.002407f, 0.986328f,
+ 0.002399f, 0.984375f, 0.002512f, 0.983887f, 0.002523f, 0.982422f, 0.002562f, 0.980957f,
+ 0.002609f, 0.979980f, 0.002539f, 0.979004f, 0.002550f, 0.977051f, 0.002666f, 0.975098f,
+ 0.002747f, 0.973633f, 0.002701f, 0.971191f, 0.002817f, 0.969238f, 0.002935f, 0.967285f,
+ 0.003052f, 0.964844f, 0.003050f, 0.961914f, 0.003138f, 0.958984f, 0.003212f, 0.955566f,
+ 0.003294f, 0.952637f, 0.003185f, 0.948242f, 0.003323f, 0.944336f, 0.003508f, 0.939453f,
+ 0.003599f, 0.934570f, 0.003523f, 0.928223f, 0.003628f, 0.921875f, 0.003771f, 0.914062f,
+ 0.003790f, 0.905273f, 0.003918f, 0.895508f, 0.004101f, 0.883789f, 0.004288f, 0.869629f,
+ 0.004326f, 0.852051f, 0.004604f, 0.832031f, 0.004807f, 0.805664f, 0.004974f, 0.770508f,
+ 0.005367f, 0.722656f, 0.005646f, 0.649902f, 0.005753f, 0.521484f, 0.002733f, 0.217651f,
+ 0.000000f, 1.000000f, 0.000283f, 0.999512f, 0.000583f, 0.999023f, 0.000735f, 0.999023f,
+ 0.000912f, 0.999023f, 0.001087f, 0.998535f, 0.001146f, 0.998047f, 0.001266f, 0.997559f,
+ 0.001438f, 0.997070f, 0.001505f, 0.997070f, 0.001540f, 0.997070f, 0.001649f, 0.996094f,
+ 0.001796f, 0.995605f, 0.001860f, 0.995117f, 0.001897f, 0.995117f, 0.001920f, 0.994629f,
+ 0.002056f, 0.994141f, 0.002159f, 0.993164f, 0.002211f, 0.992676f, 0.002254f, 0.992188f,
+ 0.002344f, 0.991211f, 0.002481f, 0.990723f, 0.002724f, 0.989746f, 0.002876f, 0.989258f,
+ 0.003019f, 0.988281f, 0.003061f, 0.987305f, 0.003113f, 0.985840f, 0.003176f, 0.984863f,
+ 0.003315f, 0.983887f, 0.003281f, 0.981934f, 0.003330f, 0.980957f, 0.003260f, 0.979980f,
+ 0.003338f, 0.978027f, 0.003477f, 0.976562f, 0.003523f, 0.975586f, 0.003693f, 0.973145f,
+ 0.003826f, 0.971680f, 0.003952f, 0.969727f, 0.003883f, 0.966797f, 0.004040f, 0.964355f,
+ 0.004261f, 0.962402f, 0.004181f, 0.959473f, 0.004276f, 0.956055f, 0.004398f, 0.953125f,
+ 0.004566f, 0.949219f, 0.004517f, 0.945312f, 0.004738f, 0.940430f, 0.004936f, 0.935547f,
+ 0.005054f, 0.930664f, 0.005051f, 0.924316f, 0.005234f, 0.917969f, 0.005444f, 0.910156f,
+ 0.005726f, 0.900879f, 0.005711f, 0.890625f, 0.005913f, 0.878418f, 0.006268f, 0.865234f,
+ 0.006367f, 0.847168f, 0.006763f, 0.826172f, 0.007072f, 0.799805f, 0.007370f, 0.765137f,
+ 0.007851f, 0.717285f, 0.008171f, 0.645508f, 0.008095f, 0.519043f, 0.003527f, 0.217285f,
+ 0.000000f, 1.000000f, 0.000454f, 0.999512f, 0.000876f, 0.999023f, 0.000887f, 0.999023f,
+ 0.001265f, 0.998535f, 0.001296f, 0.998047f, 0.001307f, 0.998047f, 0.001639f, 0.997070f,
+ 0.001685f, 0.997070f, 0.001702f, 0.997070f, 0.001711f, 0.996094f, 0.002014f, 0.995605f,
+ 0.002060f, 0.995117f, 0.002081f, 0.995117f, 0.002098f, 0.994629f, 0.002354f, 0.993652f,
+ 0.002579f, 0.992676f, 0.002739f, 0.992188f, 0.002876f, 0.991699f, 0.002989f, 0.991211f,
+ 0.003126f, 0.990234f, 0.003471f, 0.989746f, 0.003611f, 0.988770f, 0.003761f, 0.987793f,
+ 0.003876f, 0.986816f, 0.003967f, 0.986328f, 0.003990f, 0.985352f, 0.004181f, 0.983398f,
+ 0.004204f, 0.981934f, 0.004349f, 0.980957f, 0.004303f, 0.979492f, 0.004467f, 0.978027f,
+ 0.004406f, 0.976562f, 0.004726f, 0.974609f, 0.004894f, 0.973145f, 0.004879f, 0.971191f,
+ 0.005127f, 0.969238f, 0.005325f, 0.967285f, 0.005226f, 0.964355f, 0.005489f, 0.961914f,
+ 0.005699f, 0.958984f, 0.005936f, 0.956543f, 0.005852f, 0.953125f, 0.006084f, 0.949707f,
+ 0.006226f, 0.945801f, 0.006596f, 0.941895f, 0.006546f, 0.937012f, 0.006844f, 0.931641f,
+ 0.007099f, 0.926270f, 0.006989f, 0.920410f, 0.007378f, 0.913086f, 0.007694f, 0.904785f,
+ 0.008011f, 0.895996f, 0.008156f, 0.885254f, 0.008377f, 0.873047f, 0.008972f, 0.859375f,
+ 0.009071f, 0.840820f, 0.009613f, 0.820312f, 0.010048f, 0.793945f, 0.010605f, 0.759277f,
+ 0.011101f, 0.711426f, 0.011467f, 0.641602f, 0.010971f, 0.515137f, 0.004417f, 0.216675f,
+ 0.000000f, 1.000000f, 0.000478f, 0.999512f, 0.000937f, 0.999023f, 0.000935f, 0.999023f,
+ 0.001370f, 0.998047f, 0.001376f, 0.998047f, 0.001375f, 0.997559f, 0.001784f, 0.997070f,
+ 0.001797f, 0.997070f, 0.001800f, 0.996094f, 0.002129f, 0.995605f, 0.002331f, 0.995117f,
+ 0.002481f, 0.995117f, 0.002640f, 0.994141f, 0.002777f, 0.993164f, 0.003212f, 0.992676f,
+ 0.003407f, 0.992188f, 0.003534f, 0.991211f, 0.003628f, 0.990234f, 0.003759f, 0.990234f,
+ 0.004135f, 0.989258f, 0.004288f, 0.988281f, 0.004436f, 0.986816f, 0.004650f, 0.986328f,
+ 0.004868f, 0.985840f, 0.005051f, 0.984375f, 0.005493f, 0.983398f, 0.005547f, 0.982422f,
+ 0.005554f, 0.980469f, 0.005535f, 0.978516f, 0.005722f, 0.977539f, 0.005684f, 0.975586f,
+ 0.006145f, 0.974121f, 0.006226f, 0.972656f, 0.006470f, 0.970215f, 0.006695f, 0.968750f,
+ 0.006741f, 0.966309f, 0.007027f, 0.964355f, 0.007431f, 0.961914f, 0.007450f, 0.958984f,
+ 0.007687f, 0.955566f, 0.007912f, 0.952637f, 0.008232f, 0.949707f, 0.008224f, 0.945801f,
+ 0.008514f, 0.942383f, 0.008972f, 0.937500f, 0.009079f, 0.932617f, 0.009254f, 0.927246f,
+ 0.009735f, 0.921875f, 0.009949f, 0.915039f, 0.010292f, 0.907227f, 0.010796f, 0.899414f,
+ 0.011063f, 0.890137f, 0.011391f, 0.879395f, 0.011749f, 0.867188f, 0.012482f, 0.852539f,
+ 0.012627f, 0.834473f, 0.013458f, 0.813477f, 0.014153f, 0.787109f, 0.014656f, 0.751953f,
+ 0.015251f, 0.705566f, 0.015533f, 0.635742f, 0.014473f, 0.512207f, 0.005421f, 0.216675f,
+ 0.000000f, 1.000000f, 0.000485f, 0.999512f, 0.000958f, 0.999023f, 0.000955f, 0.998535f,
+ 0.001413f, 0.998047f, 0.001412f, 0.997559f, 0.001410f, 0.997559f, 0.001955f, 0.996582f,
+ 0.002161f, 0.996094f, 0.002302f, 0.995605f, 0.002899f, 0.995117f, 0.003059f, 0.994629f,
+ 0.003204f, 0.993652f, 0.003359f, 0.993164f, 0.003462f, 0.992676f, 0.003925f, 0.991699f,
+ 0.004097f, 0.990723f, 0.004242f, 0.990234f, 0.004421f, 0.989746f, 0.004589f, 0.988770f,
+ 0.005215f, 0.987305f, 0.005451f, 0.986816f, 0.005676f, 0.985840f, 0.005856f, 0.984375f,
+ 0.006008f, 0.983398f, 0.006287f, 0.982910f, 0.006908f, 0.981445f, 0.007187f, 0.979980f,
+ 0.007233f, 0.978516f, 0.007252f, 0.976562f, 0.007294f, 0.975098f, 0.007553f, 0.973633f,
+ 0.007935f, 0.971191f, 0.008286f, 0.969238f, 0.008316f, 0.967285f, 0.008659f, 0.965332f,
+ 0.009064f, 0.963379f, 0.009216f, 0.960938f, 0.009903f, 0.958496f, 0.010216f, 0.955566f,
+ 0.010025f, 0.951660f, 0.010536f, 0.948730f, 0.010933f, 0.945312f, 0.011009f, 0.941406f,
+ 0.011765f, 0.937500f, 0.012001f, 0.932617f, 0.012581f, 0.927246f, 0.012665f, 0.921875f,
+ 0.013222f, 0.916016f, 0.013664f, 0.909668f, 0.014168f, 0.901855f, 0.014641f, 0.892578f,
+ 0.015327f, 0.883789f, 0.015610f, 0.872559f, 0.016205f, 0.859863f, 0.017136f, 0.844727f,
+ 0.017776f, 0.827148f, 0.018494f, 0.805664f, 0.019348f, 0.779785f, 0.020172f, 0.744629f,
+ 0.020935f, 0.698242f, 0.020721f, 0.629395f, 0.018860f, 0.508789f, 0.006603f, 0.216309f,
+ 0.000000f, 1.000000f, 0.000487f, 0.999512f, 0.000967f, 0.999023f, 0.000965f, 0.998535f,
+ 0.001539f, 0.998047f, 0.001799f, 0.997559f, 0.001986f, 0.997070f, 0.002672f, 0.996094f,
+ 0.002831f, 0.995605f, 0.002928f, 0.995117f, 0.003559f, 0.994141f, 0.003691f, 0.993652f,
+ 0.003765f, 0.993164f, 0.003956f, 0.992676f, 0.004223f, 0.991699f, 0.004860f, 0.990234f,
+ 0.005089f, 0.989746f, 0.005314f, 0.989258f, 0.005600f, 0.987793f, 0.005814f, 0.987305f,
+ 0.006371f, 0.986328f, 0.006638f, 0.984863f, 0.006969f, 0.983887f, 0.007313f, 0.982910f,
+ 0.007584f, 0.981445f, 0.008240f, 0.980469f, 0.008545f, 0.979004f, 0.008865f, 0.977539f,
+ 0.009293f, 0.976074f, 0.009712f, 0.974609f, 0.009514f, 0.972656f, 0.009903f, 0.970703f,
+ 0.010307f, 0.968262f, 0.010475f, 0.966309f, 0.010971f, 0.963867f, 0.011154f, 0.961914f,
+ 0.011650f, 0.959473f, 0.012138f, 0.957520f, 0.012650f, 0.953613f, 0.013351f, 0.951172f,
+ 0.013626f, 0.947754f, 0.013710f, 0.943848f, 0.014153f, 0.940430f, 0.014900f, 0.936523f,
+ 0.015396f, 0.931641f, 0.016159f, 0.927246f, 0.016464f, 0.921875f, 0.016968f, 0.916016f,
+ 0.017761f, 0.910156f, 0.018387f, 0.902832f, 0.018799f, 0.895020f, 0.019791f, 0.886230f,
+ 0.020660f, 0.876465f, 0.021423f, 0.865234f, 0.022202f, 0.852539f, 0.023148f, 0.836914f,
+ 0.024643f, 0.819336f, 0.025253f, 0.797852f, 0.026154f, 0.771484f, 0.026993f, 0.736816f,
+ 0.028061f, 0.691406f, 0.027481f, 0.624023f, 0.024109f, 0.504395f, 0.007988f, 0.216431f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000641f, 0.999023f, 0.001480f, 0.998535f,
+ 0.002151f, 0.997559f, 0.002422f, 0.997070f, 0.002567f, 0.996582f, 0.003101f, 0.995605f,
+ 0.003361f, 0.995117f, 0.003481f, 0.994629f, 0.003693f, 0.993652f, 0.004490f, 0.992676f,
+ 0.004822f, 0.991699f, 0.005047f, 0.991211f, 0.005234f, 0.990234f, 0.005955f, 0.989258f,
+ 0.006237f, 0.988281f, 0.006535f, 0.987305f, 0.006855f, 0.986816f, 0.007160f, 0.985352f,
+ 0.007912f, 0.983887f, 0.008301f, 0.982910f, 0.008652f, 0.981934f, 0.009003f, 0.980469f,
+ 0.009377f, 0.979492f, 0.010094f, 0.977539f, 0.010635f, 0.976562f, 0.011108f, 0.974609f,
+ 0.011559f, 0.973145f, 0.012016f, 0.971680f, 0.012405f, 0.969727f, 0.012703f, 0.967773f,
+ 0.013062f, 0.964844f, 0.013649f, 0.962891f, 0.013824f, 0.959961f, 0.014381f, 0.958008f,
+ 0.014755f, 0.955078f, 0.015732f, 0.952148f, 0.016190f, 0.949219f, 0.016968f, 0.946289f,
+ 0.017807f, 0.942871f, 0.017776f, 0.938965f, 0.018433f, 0.935059f, 0.019348f, 0.930664f,
+ 0.020157f, 0.925781f, 0.020996f, 0.920898f, 0.021469f, 0.915527f, 0.022171f, 0.909668f,
+ 0.022995f, 0.902832f, 0.024292f, 0.895508f, 0.025345f, 0.887207f, 0.026260f, 0.878418f,
+ 0.027206f, 0.868164f, 0.028427f, 0.856934f, 0.029480f, 0.843262f, 0.030853f, 0.828125f,
+ 0.032440f, 0.810547f, 0.033112f, 0.788086f, 0.034393f, 0.762695f, 0.035583f, 0.728027f,
+ 0.036316f, 0.682617f, 0.035217f, 0.617188f, 0.030334f, 0.500000f, 0.009575f, 0.216064f,
+ 0.000000f, 1.000000f, 0.000355f, 0.999512f, 0.001255f, 0.999023f, 0.001830f, 0.998047f,
+ 0.002186f, 0.997559f, 0.002739f, 0.996582f, 0.002975f, 0.996094f, 0.003380f, 0.995605f,
+ 0.004112f, 0.994141f, 0.004375f, 0.993652f, 0.004822f, 0.992676f, 0.005524f, 0.991699f,
+ 0.005753f, 0.990723f, 0.006027f, 0.990234f, 0.006519f, 0.988770f, 0.007431f, 0.987793f,
+ 0.007736f, 0.986816f, 0.008003f, 0.985840f, 0.008316f, 0.984375f, 0.008934f, 0.983398f,
+ 0.009850f, 0.981934f, 0.010246f, 0.980469f, 0.010574f, 0.979492f, 0.011040f, 0.978027f,
+ 0.011658f, 0.976562f, 0.012680f, 0.974609f, 0.013138f, 0.973145f, 0.013611f, 0.971191f,
+ 0.014229f, 0.969727f, 0.014847f, 0.968262f, 0.015526f, 0.965820f, 0.016571f, 0.963867f,
+ 0.016586f, 0.960938f, 0.016968f, 0.958496f, 0.017715f, 0.956055f, 0.018051f, 0.953125f,
+ 0.018951f, 0.950195f, 0.019867f, 0.946777f, 0.020782f, 0.943848f, 0.021393f, 0.939941f,
+ 0.022385f, 0.937012f, 0.023422f, 0.933594f, 0.023590f, 0.928711f, 0.024963f, 0.923828f,
+ 0.025940f, 0.918945f, 0.026672f, 0.913574f, 0.028107f, 0.908203f, 0.028854f, 0.901855f,
+ 0.029846f, 0.895020f, 0.031525f, 0.887207f, 0.032776f, 0.878418f, 0.033539f, 0.869141f,
+ 0.034943f, 0.858887f, 0.036438f, 0.847656f, 0.038147f, 0.833496f, 0.039795f, 0.818359f,
+ 0.041443f, 0.800293f, 0.042603f, 0.778320f, 0.044464f, 0.752930f, 0.045349f, 0.718750f,
+ 0.045929f, 0.674316f, 0.044189f, 0.610352f, 0.037537f, 0.496582f, 0.011375f, 0.216064f,
+ 0.000000f, 1.000000f, 0.000735f, 0.999512f, 0.000921f, 0.999023f, 0.001794f, 0.998047f,
+ 0.002518f, 0.997070f, 0.002863f, 0.996582f, 0.003952f, 0.995605f, 0.004242f, 0.994629f,
+ 0.004845f, 0.993652f, 0.005505f, 0.992676f, 0.005920f, 0.991699f, 0.006683f, 0.990723f,
+ 0.007084f, 0.989258f, 0.007664f, 0.988281f, 0.008087f, 0.987305f, 0.008934f, 0.985840f,
+ 0.009399f, 0.984375f, 0.009872f, 0.983887f, 0.010544f, 0.982422f, 0.011024f, 0.980957f,
+ 0.011963f, 0.979004f, 0.012581f, 0.977539f, 0.013084f, 0.976562f, 0.013832f, 0.974609f,
+ 0.014404f, 0.973145f, 0.015488f, 0.971191f, 0.016220f, 0.969238f, 0.016861f, 0.967285f,
+ 0.017471f, 0.965820f, 0.018417f, 0.963379f, 0.019241f, 0.961426f, 0.020401f, 0.958984f,
+ 0.021332f, 0.956543f, 0.021469f, 0.953613f, 0.021942f, 0.950684f, 0.023056f, 0.947754f,
+ 0.023697f, 0.944336f, 0.025192f, 0.940430f, 0.025955f, 0.937012f, 0.027100f, 0.933594f,
+ 0.027939f, 0.930176f, 0.029221f, 0.926270f, 0.030334f, 0.921875f, 0.031616f, 0.916016f,
+ 0.032837f, 0.911133f, 0.033813f, 0.905273f, 0.035217f, 0.899414f, 0.036774f, 0.893555f,
+ 0.037659f, 0.885742f, 0.039612f, 0.877441f, 0.041382f, 0.869141f, 0.042450f, 0.859375f,
+ 0.044891f, 0.849121f, 0.046265f, 0.837402f, 0.048096f, 0.823242f, 0.050262f, 0.807617f,
+ 0.052155f, 0.789551f, 0.053284f, 0.768066f, 0.055817f, 0.742188f, 0.056824f, 0.708984f,
+ 0.057190f, 0.665527f, 0.054596f, 0.603516f, 0.045319f, 0.492188f, 0.013229f, 0.215332f,
+ 0.000000f, 1.000000f, 0.000934f, 0.999023f, 0.001148f, 0.998535f, 0.002024f, 0.998047f,
+ 0.002687f, 0.997070f, 0.003914f, 0.996094f, 0.004650f, 0.994141f, 0.005211f, 0.994141f,
+ 0.005894f, 0.992676f, 0.006775f, 0.991211f, 0.007172f, 0.990234f, 0.007748f, 0.989258f,
+ 0.008934f, 0.987793f, 0.009369f, 0.986328f, 0.009979f, 0.985352f, 0.011055f, 0.983398f,
+ 0.011513f, 0.982422f, 0.012329f, 0.980957f, 0.013000f, 0.979004f, 0.013741f, 0.978027f,
+ 0.014748f, 0.976074f, 0.015320f, 0.974609f, 0.016357f, 0.972656f, 0.017105f, 0.970703f,
+ 0.017838f, 0.968750f, 0.019135f, 0.966797f, 0.019913f, 0.964844f, 0.020676f, 0.962891f,
+ 0.021820f, 0.960449f, 0.022766f, 0.958008f, 0.024200f, 0.955566f, 0.025208f, 0.953125f,
+ 0.026184f, 0.950684f, 0.027283f, 0.947754f, 0.027756f, 0.944336f, 0.028671f, 0.940918f,
+ 0.030365f, 0.937500f, 0.031235f, 0.933594f, 0.032257f, 0.929688f, 0.033600f, 0.925781f,
+ 0.035065f, 0.922363f, 0.036407f, 0.917480f, 0.038574f, 0.912598f, 0.039642f, 0.907227f,
+ 0.040833f, 0.901367f, 0.042450f, 0.895508f, 0.044098f, 0.889648f, 0.046112f, 0.882812f,
+ 0.047974f, 0.875488f, 0.049896f, 0.866699f, 0.051941f, 0.857910f, 0.053986f, 0.848633f,
+ 0.055481f, 0.837402f, 0.057922f, 0.825195f, 0.060852f, 0.811523f, 0.062683f, 0.795410f,
+ 0.064941f, 0.777832f, 0.067017f, 0.757324f, 0.068665f, 0.730957f, 0.069763f, 0.698242f,
+ 0.069580f, 0.656250f, 0.065613f, 0.595215f, 0.053711f, 0.486572f, 0.015366f, 0.214600f,
+ 0.000000f, 1.000000f, 0.000858f, 0.999512f, 0.001794f, 0.998535f, 0.002520f, 0.997559f,
+ 0.002977f, 0.996582f, 0.004337f, 0.995117f, 0.005489f, 0.993652f, 0.006302f, 0.992676f,
+ 0.007290f, 0.991211f, 0.008499f, 0.989746f, 0.008911f, 0.988770f, 0.009445f, 0.987305f,
+ 0.011124f, 0.985840f, 0.011757f, 0.983887f, 0.012253f, 0.982910f, 0.013069f, 0.980957f,
+ 0.014503f, 0.979492f, 0.015312f, 0.977051f, 0.016159f, 0.976074f, 0.016953f, 0.974121f,
+ 0.018097f, 0.972168f, 0.019211f, 0.970215f, 0.020325f, 0.968262f, 0.021149f, 0.965820f,
+ 0.022156f, 0.964355f, 0.023560f, 0.961426f, 0.024460f, 0.959473f, 0.025833f, 0.957031f,
+ 0.027039f, 0.954102f, 0.028168f, 0.952148f, 0.029831f, 0.949219f, 0.030991f, 0.946289f,
+ 0.032227f, 0.943848f, 0.033722f, 0.940430f, 0.035248f, 0.937012f, 0.035980f, 0.933594f,
+ 0.037506f, 0.929199f, 0.039062f, 0.925293f, 0.040283f, 0.921387f, 0.041504f, 0.916992f,
+ 0.043640f, 0.912598f, 0.045135f, 0.907715f, 0.047607f, 0.902344f, 0.049683f, 0.897461f,
+ 0.050781f, 0.891113f, 0.052704f, 0.885254f, 0.054474f, 0.878418f, 0.056885f, 0.871094f,
+ 0.060059f, 0.863770f, 0.061310f, 0.854492f, 0.063721f, 0.845703f, 0.066345f, 0.836426f,
+ 0.068298f, 0.824707f, 0.071350f, 0.812988f, 0.074036f, 0.798340f, 0.076355f, 0.782715f,
+ 0.078796f, 0.765137f, 0.081299f, 0.745117f, 0.083557f, 0.718750f, 0.084473f, 0.687500f,
+ 0.083252f, 0.646484f, 0.077881f, 0.586914f, 0.063232f, 0.482422f, 0.017685f, 0.213745f,
+ 0.000000f, 1.000000f, 0.001359f, 0.999023f, 0.002169f, 0.998047f, 0.003540f, 0.996582f,
+ 0.003876f, 0.996094f, 0.005264f, 0.994141f, 0.006310f, 0.993164f, 0.007359f, 0.991699f,
+ 0.009186f, 0.989258f, 0.009979f, 0.988281f, 0.011093f, 0.986328f, 0.011971f, 0.984863f,
+ 0.013268f, 0.982910f, 0.014565f, 0.980957f, 0.015312f, 0.979492f, 0.016327f, 0.978027f,
+ 0.018097f, 0.975586f, 0.019119f, 0.973633f, 0.020050f, 0.971680f, 0.020950f, 0.970215f,
+ 0.022568f, 0.967285f, 0.024017f, 0.964844f, 0.025223f, 0.962402f, 0.026306f, 0.960449f,
+ 0.027466f, 0.958496f, 0.029068f, 0.955566f, 0.030731f, 0.953125f, 0.032196f, 0.950195f,
+ 0.033478f, 0.947266f, 0.034943f, 0.944336f, 0.036713f, 0.941406f, 0.038208f, 0.938477f,
+ 0.039795f, 0.935059f, 0.041840f, 0.931152f, 0.043579f, 0.927734f, 0.045319f, 0.924316f,
+ 0.046722f, 0.919922f, 0.048157f, 0.915527f, 0.049622f, 0.911133f, 0.052094f, 0.906250f,
+ 0.053894f, 0.900879f, 0.056152f, 0.895996f, 0.058502f, 0.890625f, 0.060913f, 0.885254f,
+ 0.062988f, 0.879395f, 0.064880f, 0.873047f, 0.067749f, 0.865723f, 0.070068f, 0.857910f,
+ 0.073242f, 0.850098f, 0.075073f, 0.841309f, 0.078125f, 0.832031f, 0.080688f, 0.822266f,
+ 0.083252f, 0.810547f, 0.087158f, 0.797852f, 0.089722f, 0.784180f, 0.092163f, 0.768555f,
+ 0.094910f, 0.751465f, 0.097168f, 0.730957f, 0.099060f, 0.705566f, 0.099915f, 0.675293f,
+ 0.097839f, 0.635742f, 0.091858f, 0.579102f, 0.073059f, 0.477051f, 0.019882f, 0.212280f,
+ 0.000000f, 1.000000f, 0.001362f, 0.999023f, 0.002325f, 0.998047f, 0.004128f, 0.996582f,
+ 0.005375f, 0.995117f, 0.006443f, 0.993652f, 0.007488f, 0.991699f, 0.009224f, 0.989746f,
+ 0.011116f, 0.987305f, 0.012489f, 0.986328f, 0.013626f, 0.983887f, 0.015244f, 0.981934f,
+ 0.016678f, 0.979492f, 0.017624f, 0.978027f, 0.019348f, 0.975586f, 0.020630f, 0.973145f,
+ 0.022202f, 0.971191f, 0.023865f, 0.968262f, 0.024963f, 0.966309f, 0.026428f, 0.964355f,
+ 0.028244f, 0.961426f, 0.030136f, 0.958496f, 0.031403f, 0.956055f, 0.032806f, 0.953613f,
+ 0.034119f, 0.950684f, 0.036438f, 0.947754f, 0.038391f, 0.944336f, 0.040070f, 0.941406f,
+ 0.041656f, 0.938477f, 0.043335f, 0.935547f, 0.045410f, 0.932129f, 0.047516f, 0.928223f,
+ 0.049835f, 0.924316f, 0.051788f, 0.920898f, 0.053864f, 0.916992f, 0.055847f, 0.913086f,
+ 0.058380f, 0.908691f, 0.059692f, 0.904297f, 0.062195f, 0.898926f, 0.064331f, 0.893555f,
+ 0.066833f, 0.888184f, 0.068970f, 0.882812f, 0.072083f, 0.877441f, 0.074402f, 0.871582f,
+ 0.077332f, 0.865723f, 0.080078f, 0.858398f, 0.082642f, 0.850586f, 0.085205f, 0.842773f,
+ 0.088684f, 0.834473f, 0.092224f, 0.826660f, 0.094116f, 0.816895f, 0.097839f, 0.806152f,
+ 0.101135f, 0.795410f, 0.104187f, 0.782227f, 0.107483f, 0.768555f, 0.109863f, 0.753906f,
+ 0.112488f, 0.737305f, 0.114929f, 0.716309f, 0.116516f, 0.691406f, 0.116882f, 0.663086f,
+ 0.113464f, 0.625000f, 0.105530f, 0.569336f, 0.083435f, 0.471436f, 0.022491f, 0.211182f,
+ 0.000000f, 1.000000f, 0.002094f, 0.998535f, 0.003090f, 0.997559f, 0.005455f, 0.995605f,
+ 0.007267f, 0.993652f, 0.008560f, 0.991699f, 0.009834f, 0.989746f, 0.011719f, 0.987793f,
+ 0.012741f, 0.986328f, 0.015282f, 0.983398f, 0.017609f, 0.980469f, 0.018875f, 0.978516f,
+ 0.021103f, 0.975586f, 0.022339f, 0.973145f, 0.024857f, 0.970703f, 0.026581f, 0.967773f,
+ 0.028137f, 0.964844f, 0.029907f, 0.962402f, 0.031952f, 0.959473f, 0.033630f, 0.956543f,
+ 0.035675f, 0.953613f, 0.037811f, 0.950684f, 0.039337f, 0.947754f, 0.041168f, 0.944824f,
+ 0.043427f, 0.941406f, 0.046204f, 0.937988f, 0.048157f, 0.934570f, 0.050018f, 0.931152f,
+ 0.051910f, 0.927734f, 0.053955f, 0.924316f, 0.057037f, 0.919922f, 0.059662f, 0.916016f,
+ 0.061920f, 0.912109f, 0.064270f, 0.908203f, 0.066528f, 0.903809f, 0.068848f, 0.899902f,
+ 0.072144f, 0.895020f, 0.074951f, 0.890137f, 0.077271f, 0.884277f, 0.079651f, 0.878906f,
+ 0.082031f, 0.873047f, 0.084961f, 0.867676f, 0.087891f, 0.861816f, 0.090881f, 0.855469f,
+ 0.094727f, 0.848633f, 0.097778f, 0.841797f, 0.100586f, 0.833984f, 0.104187f, 0.826172f,
+ 0.107117f, 0.817871f, 0.110535f, 0.809570f, 0.113342f, 0.799316f, 0.117310f, 0.789062f,
+ 0.121033f, 0.777832f, 0.123718f, 0.765137f, 0.126953f, 0.752441f, 0.129517f, 0.737793f,
+ 0.132568f, 0.720703f, 0.134521f, 0.700684f, 0.134888f, 0.676758f, 0.135010f, 0.649902f,
+ 0.130249f, 0.614258f, 0.120850f, 0.560059f, 0.094421f, 0.466797f, 0.025146f, 0.210083f,
+ 0.000000f, 1.000000f, 0.002527f, 0.998535f, 0.004539f, 0.996582f, 0.006218f, 0.994629f,
+ 0.008965f, 0.992188f, 0.011086f, 0.989746f, 0.013046f, 0.987305f, 0.015526f, 0.984375f,
+ 0.016754f, 0.982422f, 0.019302f, 0.979492f, 0.022369f, 0.975586f, 0.024353f, 0.973145f,
+ 0.026764f, 0.970215f, 0.029572f, 0.966797f, 0.031311f, 0.963867f, 0.034027f, 0.960449f,
+ 0.035706f, 0.958008f, 0.038391f, 0.954102f, 0.040985f, 0.950684f, 0.042938f, 0.947266f,
+ 0.045349f, 0.943848f, 0.047760f, 0.940918f, 0.050201f, 0.937012f, 0.052917f, 0.933105f,
+ 0.055176f, 0.929688f, 0.057831f, 0.925781f, 0.060547f, 0.921875f, 0.062744f, 0.918457f,
+ 0.065796f, 0.914062f, 0.068481f, 0.910156f, 0.071960f, 0.905762f, 0.074524f, 0.900879f,
+ 0.077148f, 0.896973f, 0.079712f, 0.892578f, 0.082458f, 0.888184f, 0.086426f, 0.882812f,
+ 0.089478f, 0.877930f, 0.092957f, 0.872559f, 0.095581f, 0.867188f, 0.098267f, 0.861816f,
+ 0.100952f, 0.855957f, 0.104126f, 0.850098f, 0.107727f, 0.843262f, 0.111694f, 0.836426f,
+ 0.114990f, 0.829102f, 0.118652f, 0.822754f, 0.121948f, 0.815430f, 0.125000f, 0.807129f,
+ 0.127930f, 0.798828f, 0.132202f, 0.789551f, 0.136475f, 0.780273f, 0.139404f, 0.769531f,
+ 0.142944f, 0.758789f, 0.145874f, 0.747070f, 0.149170f, 0.734375f, 0.151611f, 0.720215f,
+ 0.154175f, 0.703125f, 0.155396f, 0.684082f, 0.156128f, 0.662598f, 0.153809f, 0.636230f,
+ 0.147827f, 0.602051f, 0.135620f, 0.549805f, 0.105591f, 0.460693f, 0.027939f, 0.209229f,
+ 0.000000f, 1.000000f, 0.003227f, 0.998047f, 0.006054f, 0.995605f, 0.008911f, 0.993164f,
+ 0.011330f, 0.990234f, 0.014748f, 0.986816f, 0.017776f, 0.983398f, 0.020035f, 0.980469f,
+ 0.023392f, 0.977051f, 0.025986f, 0.973633f, 0.028366f, 0.970215f, 0.031219f, 0.966797f,
+ 0.034973f, 0.962402f, 0.038177f, 0.958496f, 0.040833f, 0.955078f, 0.043762f, 0.951172f,
+ 0.047180f, 0.946777f, 0.050049f, 0.942871f, 0.052460f, 0.939453f, 0.055725f, 0.935547f,
+ 0.058777f, 0.931641f, 0.061584f, 0.927246f, 0.065125f, 0.922852f, 0.067749f, 0.918945f,
+ 0.070801f, 0.915039f, 0.073425f, 0.910645f, 0.077271f, 0.905762f, 0.080688f, 0.901367f,
+ 0.083679f, 0.896484f, 0.086609f, 0.892578f, 0.090393f, 0.887695f, 0.093262f, 0.883301f,
+ 0.096252f, 0.878906f, 0.100037f, 0.873535f, 0.103760f, 0.868164f, 0.107483f, 0.862793f,
+ 0.111206f, 0.857422f, 0.114502f, 0.852539f, 0.117798f, 0.847168f, 0.120667f, 0.841797f,
+ 0.123901f, 0.834961f, 0.128052f, 0.828125f, 0.131836f, 0.821289f, 0.135498f, 0.814453f,
+ 0.138794f, 0.807617f, 0.142578f, 0.800781f, 0.145874f, 0.793945f, 0.149536f, 0.786133f,
+ 0.153931f, 0.776855f, 0.157715f, 0.768066f, 0.161499f, 0.758789f, 0.164062f, 0.748535f,
+ 0.167480f, 0.737793f, 0.170410f, 0.727539f, 0.172607f, 0.714844f, 0.175659f, 0.700684f,
+ 0.177246f, 0.684570f, 0.178467f, 0.666992f, 0.177979f, 0.646973f, 0.173706f, 0.622559f,
+ 0.166504f, 0.588867f, 0.151367f, 0.540039f, 0.117126f, 0.455078f, 0.030991f, 0.207886f,
+ 0.000000f, 1.000000f, 0.003941f, 0.998047f, 0.007965f, 0.994629f, 0.012810f, 0.990234f,
+ 0.015900f, 0.987305f, 0.020020f, 0.982422f, 0.023926f, 0.978516f, 0.028427f, 0.974121f,
+ 0.032104f, 0.969727f, 0.034668f, 0.965820f, 0.039307f, 0.960938f, 0.042694f, 0.956543f,
+ 0.045502f, 0.952637f, 0.050079f, 0.947754f, 0.054504f, 0.942383f, 0.058533f, 0.937988f,
+ 0.062378f, 0.933105f, 0.065735f, 0.928711f, 0.069275f, 0.924316f, 0.073608f, 0.918945f,
+ 0.077271f, 0.914062f, 0.080750f, 0.909668f, 0.083801f, 0.905273f, 0.087280f, 0.900879f,
+ 0.091797f, 0.895508f, 0.095703f, 0.890137f, 0.099915f, 0.885254f, 0.103210f, 0.880371f,
+ 0.106445f, 0.875488f, 0.110046f, 0.871094f, 0.114319f, 0.865723f, 0.118469f, 0.860352f,
+ 0.122131f, 0.854980f, 0.126099f, 0.849609f, 0.129517f, 0.844238f, 0.133911f, 0.838867f,
+ 0.137329f, 0.833984f, 0.140747f, 0.828613f, 0.145386f, 0.822266f, 0.149292f, 0.816406f,
+ 0.152588f, 0.809570f, 0.156372f, 0.802734f, 0.160156f, 0.796387f, 0.163330f, 0.790039f,
+ 0.166992f, 0.783691f, 0.170288f, 0.776855f, 0.175415f, 0.769043f, 0.179443f, 0.760742f,
+ 0.182251f, 0.752441f, 0.185669f, 0.743652f, 0.189087f, 0.735352f, 0.191528f, 0.726074f,
+ 0.194702f, 0.716309f, 0.197510f, 0.706055f, 0.199585f, 0.692383f, 0.202026f, 0.679688f,
+ 0.202515f, 0.665039f, 0.202271f, 0.648926f, 0.199585f, 0.630371f, 0.194946f, 0.608398f,
+ 0.185913f, 0.574707f, 0.168701f, 0.530273f, 0.128662f, 0.450195f, 0.033966f, 0.206177f,
+ 0.000000f, 1.000000f, 0.005634f, 0.997070f, 0.011589f, 0.992676f, 0.017899f, 0.987305f,
+ 0.024048f, 0.981445f, 0.028473f, 0.976562f, 0.034271f, 0.970703f, 0.039368f, 0.964844f,
+ 0.044189f, 0.959961f, 0.049896f, 0.953613f, 0.054504f, 0.947754f, 0.058929f, 0.942871f,
+ 0.063904f, 0.937012f, 0.069275f, 0.931152f, 0.074341f, 0.925293f, 0.078308f, 0.920410f,
+ 0.084534f, 0.913574f, 0.089050f, 0.907715f, 0.093750f, 0.902344f, 0.097900f, 0.896973f,
+ 0.102356f, 0.892090f, 0.106873f, 0.886230f, 0.111450f, 0.880859f, 0.116272f, 0.875000f,
+ 0.120483f, 0.869629f, 0.124512f, 0.864258f, 0.128052f, 0.859375f, 0.132446f, 0.854492f,
+ 0.137207f, 0.848633f, 0.142090f, 0.842773f, 0.145874f, 0.837402f, 0.150513f, 0.831543f,
+ 0.154053f, 0.826660f, 0.157593f, 0.821777f, 0.161133f, 0.816895f, 0.166504f, 0.810059f,
+ 0.170898f, 0.804199f, 0.175049f, 0.798340f, 0.179199f, 0.792480f, 0.182861f, 0.786621f,
+ 0.186401f, 0.781250f, 0.189941f, 0.774902f, 0.192871f, 0.768555f, 0.196533f, 0.761719f,
+ 0.200439f, 0.754883f, 0.204468f, 0.747559f, 0.208496f, 0.740234f, 0.211670f, 0.733398f,
+ 0.214600f, 0.725586f, 0.216919f, 0.717773f, 0.219604f, 0.710449f, 0.222168f, 0.702637f,
+ 0.224731f, 0.691406f, 0.227661f, 0.681152f, 0.228516f, 0.669922f, 0.230103f, 0.658691f,
+ 0.228516f, 0.645020f, 0.227051f, 0.630859f, 0.222534f, 0.613770f, 0.217285f, 0.590820f,
+ 0.205688f, 0.561035f, 0.185181f, 0.519531f, 0.140747f, 0.444824f, 0.037323f, 0.205322f,
+ 0.000000f, 1.000000f, 0.009445f, 0.995117f, 0.018661f, 0.988281f, 0.026978f, 0.980957f,
+ 0.035095f, 0.973633f, 0.043243f, 0.965820f, 0.050293f, 0.958496f, 0.058136f, 0.950195f,
+ 0.065308f, 0.942871f, 0.071960f, 0.935547f, 0.079224f, 0.927734f, 0.085815f, 0.920410f,
+ 0.091431f, 0.914062f, 0.096924f, 0.907715f, 0.104065f, 0.899902f, 0.109802f, 0.893066f,
+ 0.116577f, 0.886230f, 0.121277f, 0.880371f, 0.127319f, 0.873047f, 0.133301f, 0.866699f,
+ 0.139160f, 0.859863f, 0.143921f, 0.854492f, 0.148315f, 0.848633f, 0.152588f, 0.843262f,
+ 0.158691f, 0.836426f, 0.163940f, 0.830566f, 0.168457f, 0.824707f, 0.172852f, 0.818848f,
+ 0.177490f, 0.813477f, 0.181152f, 0.808105f, 0.185181f, 0.803223f, 0.190063f, 0.797363f,
+ 0.194824f, 0.791504f, 0.199097f, 0.785645f, 0.203369f, 0.780273f, 0.207764f, 0.774902f,
+ 0.211182f, 0.769531f, 0.214844f, 0.764160f, 0.218018f, 0.759277f, 0.221069f, 0.754395f,
+ 0.226440f, 0.748047f, 0.230347f, 0.741699f, 0.232788f, 0.734863f, 0.235962f, 0.728516f,
+ 0.239014f, 0.722656f, 0.241821f, 0.716309f, 0.244629f, 0.709961f, 0.247559f, 0.704102f,
+ 0.249634f, 0.697754f, 0.251465f, 0.689941f, 0.254150f, 0.681641f, 0.256592f, 0.673828f,
+ 0.257812f, 0.664551f, 0.258545f, 0.655273f, 0.259277f, 0.646484f, 0.258057f, 0.635742f,
+ 0.255615f, 0.625000f, 0.252441f, 0.612793f, 0.248169f, 0.594727f, 0.240601f, 0.573730f,
+ 0.226685f, 0.547363f, 0.202026f, 0.510254f, 0.152832f, 0.439941f, 0.040558f, 0.203491f,
+ 0.000000f, 1.000000f, 0.016251f, 0.992188f, 0.029617f, 0.982422f, 0.044098f, 0.970215f,
+ 0.057495f, 0.958008f, 0.069092f, 0.947266f, 0.080139f, 0.936523f, 0.090027f, 0.926758f,
+ 0.101013f, 0.915039f, 0.109863f, 0.906250f, 0.117981f, 0.896973f, 0.127808f, 0.886719f,
+ 0.135620f, 0.878418f, 0.142822f, 0.870117f, 0.149292f, 0.862305f, 0.157104f, 0.854004f,
+ 0.163696f, 0.846680f, 0.170532f, 0.838867f, 0.175903f, 0.832520f, 0.182251f, 0.825684f,
+ 0.189575f, 0.817383f, 0.195190f, 0.811035f, 0.200317f, 0.804688f, 0.205322f, 0.798828f,
+ 0.209839f, 0.793457f, 0.213867f, 0.787598f, 0.218872f, 0.782227f, 0.223877f, 0.775879f,
+ 0.229126f, 0.770020f, 0.233521f, 0.764160f, 0.237427f, 0.758789f, 0.241333f, 0.753906f,
+ 0.244385f, 0.749023f, 0.248047f, 0.744629f, 0.250732f, 0.740234f, 0.255127f, 0.734375f,
+ 0.259766f, 0.728516f, 0.263184f, 0.723145f, 0.266357f, 0.718262f, 0.269531f, 0.713379f,
+ 0.272949f, 0.708496f, 0.275391f, 0.703613f, 0.277100f, 0.698730f, 0.278564f, 0.693359f,
+ 0.280029f, 0.688477f, 0.281982f, 0.683105f, 0.285645f, 0.676270f, 0.288086f, 0.669922f,
+ 0.290039f, 0.664062f, 0.291016f, 0.657227f, 0.291260f, 0.650879f, 0.292236f, 0.644043f,
+ 0.292480f, 0.637207f, 0.291260f, 0.630371f, 0.289551f, 0.622559f, 0.286621f, 0.614258f,
+ 0.284668f, 0.602051f, 0.281494f, 0.589355f, 0.274414f, 0.574707f, 0.263184f, 0.556641f,
+ 0.246582f, 0.534180f, 0.219238f, 0.500488f, 0.164551f, 0.435059f, 0.044220f, 0.202881f,
+ 0.000000f, 1.000000f, 0.033203f, 0.984375f, 0.058105f, 0.966797f, 0.081970f, 0.947266f,
+ 0.102905f, 0.928223f, 0.121643f, 0.911133f, 0.136230f, 0.895996f, 0.151611f, 0.880859f,
+ 0.164185f, 0.867676f, 0.173218f, 0.856934f, 0.186157f, 0.843750f, 0.196167f, 0.833008f,
+ 0.204224f, 0.823730f, 0.211060f, 0.815430f, 0.221313f, 0.804199f, 0.228027f, 0.796387f,
+ 0.235229f, 0.788574f, 0.239746f, 0.782227f, 0.245605f, 0.775391f, 0.252197f, 0.768066f,
+ 0.259277f, 0.760254f, 0.264404f, 0.753418f, 0.268799f, 0.747559f, 0.273438f, 0.741699f,
+ 0.277100f, 0.736816f, 0.281006f, 0.731934f, 0.283203f, 0.727539f, 0.287109f, 0.722656f,
+ 0.292725f, 0.716797f, 0.296631f, 0.710938f, 0.299805f, 0.706543f, 0.303223f, 0.702148f,
+ 0.305664f, 0.697754f, 0.308105f, 0.693848f, 0.310059f, 0.689941f, 0.312256f, 0.686035f,
+ 0.314209f, 0.682129f, 0.315674f, 0.679199f, 0.317627f, 0.675293f, 0.321289f, 0.669922f,
+ 0.324219f, 0.665527f, 0.326172f, 0.661133f, 0.328125f, 0.656738f, 0.328613f, 0.651855f,
+ 0.329346f, 0.647461f, 0.329834f, 0.643066f, 0.330811f, 0.638672f, 0.330811f, 0.634277f,
+ 0.331055f, 0.630371f, 0.330322f, 0.626465f, 0.328369f, 0.621582f, 0.327637f, 0.616699f,
+ 0.327393f, 0.609863f, 0.326416f, 0.602051f, 0.324219f, 0.594727f, 0.320312f, 0.585938f,
+ 0.315674f, 0.577637f, 0.310059f, 0.567383f, 0.300293f, 0.555176f, 0.286621f, 0.540527f,
+ 0.266113f, 0.520996f, 0.235718f, 0.492432f, 0.179077f, 0.423584f, 0.047668f, 0.202271f,
+ 0.000000f, 1.000000f, 0.087769f, 0.961426f, 0.142700f, 0.920898f, 0.180664f, 0.887695f,
+ 0.209106f, 0.859863f, 0.227783f, 0.838867f, 0.248413f, 0.817383f, 0.261963f, 0.801270f,
+ 0.273926f, 0.786621f, 0.285889f, 0.771973f, 0.295898f, 0.759766f, 0.302002f, 0.750488f,
+ 0.308350f, 0.741699f, 0.316162f, 0.732422f, 0.324463f, 0.722656f, 0.329346f, 0.714844f,
+ 0.333984f, 0.708496f, 0.337891f, 0.702637f, 0.340332f, 0.697266f, 0.344238f, 0.692383f,
+ 0.346436f, 0.687500f, 0.349121f, 0.683105f, 0.353271f, 0.677734f, 0.356689f, 0.672363f,
+ 0.360840f, 0.667480f, 0.362793f, 0.663574f, 0.364990f, 0.659668f, 0.367188f, 0.655762f,
+ 0.368896f, 0.652344f, 0.370361f, 0.648926f, 0.371826f, 0.645996f, 0.372314f, 0.643066f,
+ 0.374023f, 0.640137f, 0.374756f, 0.637207f, 0.375244f, 0.634766f, 0.375000f, 0.632812f,
+ 0.375488f, 0.630371f, 0.375977f, 0.627930f, 0.377686f, 0.624512f, 0.378662f, 0.621094f,
+ 0.379883f, 0.618164f, 0.380859f, 0.614746f, 0.381348f, 0.611816f, 0.381104f, 0.608887f,
+ 0.380127f, 0.605469f, 0.380127f, 0.601562f, 0.378906f, 0.598145f, 0.378418f, 0.595215f,
+ 0.376709f, 0.591797f, 0.375244f, 0.588867f, 0.372559f, 0.584961f, 0.369873f, 0.580566f,
+ 0.367188f, 0.577148f, 0.362549f, 0.572266f, 0.357666f, 0.567871f, 0.351562f, 0.562500f,
+ 0.345459f, 0.557129f, 0.335693f, 0.549316f, 0.323242f, 0.540527f, 0.308594f, 0.527344f,
+ 0.288574f, 0.507324f, 0.255859f, 0.475830f, 0.193481f, 0.413818f, 0.051056f, 0.202271f,
+ 0.000000f, 1.000000f, 0.172485f, 0.925293f, 0.241333f, 0.869629f, 0.279541f, 0.829590f,
+ 0.305664f, 0.798828f, 0.324463f, 0.774414f, 0.339844f, 0.754395f, 0.350586f, 0.737305f,
+ 0.359619f, 0.723145f, 0.367676f, 0.710449f, 0.374756f, 0.699707f, 0.380371f, 0.689453f,
+ 0.385742f, 0.680664f, 0.389160f, 0.673340f, 0.394775f, 0.666016f, 0.397705f, 0.659180f,
+ 0.401367f, 0.653320f, 0.404053f, 0.647949f, 0.405762f, 0.643066f, 0.408691f, 0.638184f,
+ 0.410889f, 0.634277f, 0.413330f, 0.629395f, 0.414795f, 0.625488f, 0.417480f, 0.621582f,
+ 0.418457f, 0.618164f, 0.420166f, 0.614746f, 0.420654f, 0.611816f, 0.422852f, 0.608398f,
+ 0.423584f, 0.605469f, 0.424561f, 0.602539f, 0.425049f, 0.600098f, 0.425293f, 0.597656f,
+ 0.427002f, 0.595215f, 0.427246f, 0.592285f, 0.427002f, 0.590332f, 0.427246f, 0.587891f,
+ 0.427979f, 0.585449f, 0.428223f, 0.583496f, 0.427979f, 0.581055f, 0.427979f, 0.579102f,
+ 0.428467f, 0.576172f, 0.427979f, 0.574219f, 0.427734f, 0.571777f, 0.427002f, 0.569824f,
+ 0.426025f, 0.566895f, 0.425293f, 0.563477f, 0.424072f, 0.560547f, 0.422363f, 0.557617f,
+ 0.420898f, 0.554688f, 0.418945f, 0.552246f, 0.417236f, 0.548828f, 0.414062f, 0.544434f,
+ 0.411133f, 0.540527f, 0.407715f, 0.536133f, 0.403076f, 0.531250f, 0.397949f, 0.525879f,
+ 0.391602f, 0.519531f, 0.383301f, 0.511719f, 0.372803f, 0.502441f, 0.357910f, 0.490479f,
+ 0.337646f, 0.473633f, 0.305420f, 0.446533f, 0.244385f, 0.391846f, 0.092896f, 0.199219f,
+ 0.000000f, 1.000000f, 0.175415f, 0.923828f, 0.244263f, 0.868164f, 0.284668f, 0.826660f,
+ 0.313232f, 0.794434f, 0.332764f, 0.769043f, 0.348145f, 0.748047f, 0.361816f, 0.729492f,
+ 0.371582f, 0.714355f, 0.380859f, 0.700684f, 0.388428f, 0.688965f, 0.395508f, 0.677734f,
+ 0.401855f, 0.667969f, 0.406006f, 0.659668f, 0.411865f, 0.651367f, 0.416260f, 0.644043f,
+ 0.420410f, 0.637207f, 0.423828f, 0.631348f, 0.427246f, 0.625488f, 0.430420f, 0.620117f,
+ 0.432861f, 0.615234f, 0.436768f, 0.609863f, 0.439697f, 0.604980f, 0.442139f, 0.600098f,
+ 0.444336f, 0.595703f, 0.447021f, 0.591797f, 0.448242f, 0.587891f, 0.451172f, 0.583984f,
+ 0.452637f, 0.580566f, 0.454834f, 0.576660f, 0.456299f, 0.573242f, 0.457520f, 0.570312f,
+ 0.459717f, 0.566406f, 0.460938f, 0.563477f, 0.461670f, 0.560547f, 0.462891f, 0.557129f,
+ 0.464111f, 0.554199f, 0.465576f, 0.551270f, 0.466064f, 0.548340f, 0.467041f, 0.544922f,
+ 0.468506f, 0.541992f, 0.468750f, 0.539062f, 0.469238f, 0.536133f, 0.469727f, 0.532715f,
+ 0.470459f, 0.529785f, 0.469482f, 0.525391f, 0.469238f, 0.521484f, 0.469238f, 0.517578f,
+ 0.468750f, 0.513672f, 0.467773f, 0.510254f, 0.467773f, 0.505859f, 0.466797f, 0.500977f,
+ 0.465088f, 0.495605f, 0.462891f, 0.490479f, 0.460205f, 0.484619f, 0.457031f, 0.477539f,
+ 0.452637f, 0.469727f, 0.446777f, 0.460693f, 0.440186f, 0.450439f, 0.428711f, 0.437500f,
+ 0.413330f, 0.419678f, 0.387695f, 0.393311f, 0.335938f, 0.341797f, 0.192627f, 0.175903f,
+ 0.000000f, 1.000000f, 0.176514f, 0.923828f, 0.248413f, 0.865723f, 0.291016f, 0.823242f,
+ 0.320068f, 0.789551f, 0.342529f, 0.762695f, 0.357666f, 0.741211f, 0.373047f, 0.721191f,
+ 0.384521f, 0.704590f, 0.395020f, 0.689941f, 0.403076f, 0.677246f, 0.411377f, 0.665527f,
+ 0.417969f, 0.654785f, 0.424561f, 0.645020f, 0.431641f, 0.635742f, 0.436279f, 0.627441f,
+ 0.441895f, 0.619629f, 0.445557f, 0.612793f, 0.449707f, 0.606445f, 0.453369f, 0.600586f,
+ 0.457031f, 0.594727f, 0.461426f, 0.588867f, 0.464600f, 0.583008f, 0.467529f, 0.578125f,
+ 0.471436f, 0.572754f, 0.474365f, 0.567871f, 0.476562f, 0.563477f, 0.480225f, 0.559082f,
+ 0.482178f, 0.554199f, 0.483887f, 0.550293f, 0.487061f, 0.546387f, 0.489258f, 0.542480f,
+ 0.492188f, 0.538086f, 0.494385f, 0.533691f, 0.495850f, 0.530273f, 0.497314f, 0.526855f,
+ 0.500000f, 0.522461f, 0.501465f, 0.519043f, 0.503418f, 0.515137f, 0.505371f, 0.511230f,
+ 0.506836f, 0.507812f, 0.508301f, 0.503906f, 0.509766f, 0.500000f, 0.511719f, 0.496094f,
+ 0.512695f, 0.492188f, 0.514648f, 0.487305f, 0.514648f, 0.482422f, 0.515625f, 0.477539f,
+ 0.515625f, 0.472900f, 0.515625f, 0.468262f, 0.518066f, 0.462891f, 0.518066f, 0.457520f,
+ 0.517090f, 0.450928f, 0.517090f, 0.444580f, 0.516113f, 0.437988f, 0.515137f, 0.429932f,
+ 0.513184f, 0.421631f, 0.509766f, 0.411865f, 0.504395f, 0.399902f, 0.496826f, 0.385986f,
+ 0.484863f, 0.367676f, 0.465576f, 0.340820f, 0.424072f, 0.293701f, 0.297119f, 0.152222f,
+ 0.000000f, 1.000000f, 0.178955f, 0.922852f, 0.252930f, 0.863281f, 0.296875f, 0.819336f,
+ 0.328125f, 0.784668f, 0.350830f, 0.756836f, 0.369629f, 0.732910f, 0.385986f, 0.711914f,
+ 0.399170f, 0.694336f, 0.409912f, 0.678711f, 0.418213f, 0.665527f, 0.427734f, 0.652344f,
+ 0.435791f, 0.640625f, 0.442139f, 0.630859f, 0.448730f, 0.621094f, 0.456299f, 0.611328f,
+ 0.461670f, 0.603027f, 0.466797f, 0.595215f, 0.470947f, 0.587891f, 0.476562f, 0.581055f,
+ 0.480713f, 0.574219f, 0.485352f, 0.567871f, 0.490479f, 0.561035f, 0.493896f, 0.555176f,
+ 0.498047f, 0.549316f, 0.501465f, 0.543945f, 0.504395f, 0.539062f, 0.508789f, 0.533203f,
+ 0.511719f, 0.528320f, 0.514648f, 0.523438f, 0.518555f, 0.518555f, 0.520996f, 0.513672f,
+ 0.523926f, 0.509277f, 0.526855f, 0.504395f, 0.529785f, 0.500000f, 0.532227f, 0.495850f,
+ 0.534668f, 0.491211f, 0.538574f, 0.486328f, 0.540527f, 0.481934f, 0.542969f, 0.477539f,
+ 0.545898f, 0.473145f, 0.547852f, 0.468506f, 0.549805f, 0.464111f, 0.553223f, 0.458984f,
+ 0.555176f, 0.454346f, 0.557129f, 0.449463f, 0.558594f, 0.443604f, 0.559570f, 0.437988f,
+ 0.561523f, 0.432617f, 0.562988f, 0.426514f, 0.566406f, 0.420410f, 0.566406f, 0.414551f,
+ 0.567871f, 0.407715f, 0.568359f, 0.400146f, 0.568359f, 0.392822f, 0.569336f, 0.384277f,
+ 0.568848f, 0.374512f, 0.566406f, 0.364014f, 0.563965f, 0.351807f, 0.559082f, 0.337402f,
+ 0.550781f, 0.319092f, 0.536133f, 0.292480f, 0.504395f, 0.249023f, 0.398926f, 0.127197f,
+ 0.000000f, 1.000000f, 0.180176f, 0.922363f, 0.257812f, 0.860840f, 0.304443f, 0.815430f,
+ 0.337402f, 0.778809f, 0.361328f, 0.749512f, 0.380859f, 0.725098f, 0.397217f, 0.703613f,
+ 0.410645f, 0.685059f, 0.423096f, 0.668457f, 0.433350f, 0.653809f, 0.443359f, 0.640137f,
+ 0.453857f, 0.626953f, 0.460205f, 0.615723f, 0.468018f, 0.605469f, 0.476074f, 0.595215f,
+ 0.481934f, 0.585938f, 0.488037f, 0.577148f, 0.493652f, 0.568848f, 0.499756f, 0.561523f,
+ 0.503906f, 0.553711f, 0.508301f, 0.547363f, 0.515137f, 0.539551f, 0.519531f, 0.532715f,
+ 0.524902f, 0.525879f, 0.528809f, 0.520020f, 0.533203f, 0.513672f, 0.536621f, 0.507812f,
+ 0.540527f, 0.501953f, 0.543945f, 0.496826f, 0.547852f, 0.491211f, 0.552734f, 0.485840f,
+ 0.556152f, 0.480225f, 0.559570f, 0.475098f, 0.562500f, 0.469971f, 0.565430f, 0.465088f,
+ 0.570801f, 0.459473f, 0.573730f, 0.454102f, 0.576172f, 0.449219f, 0.579590f, 0.443848f,
+ 0.582520f, 0.438965f, 0.586426f, 0.433350f, 0.588867f, 0.428467f, 0.591797f, 0.423096f,
+ 0.595703f, 0.417480f, 0.598145f, 0.412109f, 0.600586f, 0.406250f, 0.603027f, 0.399902f,
+ 0.605469f, 0.393311f, 0.607422f, 0.386963f, 0.610352f, 0.380127f, 0.613281f, 0.373047f,
+ 0.615723f, 0.366455f, 0.615723f, 0.358154f, 0.617676f, 0.350098f, 0.620117f, 0.340820f,
+ 0.620117f, 0.330566f, 0.620605f, 0.320068f, 0.619141f, 0.307373f, 0.618164f, 0.292725f,
+ 0.612305f, 0.273926f, 0.601562f, 0.249756f, 0.576660f, 0.209717f, 0.489502f, 0.105347f,
+ 0.000000f, 1.000000f, 0.182373f, 0.921387f, 0.262695f, 0.858398f, 0.311768f, 0.810547f,
+ 0.345947f, 0.773438f, 0.371094f, 0.743164f, 0.391602f, 0.717285f, 0.408936f, 0.695312f,
+ 0.424561f, 0.674805f, 0.437744f, 0.657715f, 0.448975f, 0.641113f, 0.459717f, 0.626953f,
+ 0.469482f, 0.613770f, 0.479004f, 0.601074f, 0.487305f, 0.589355f, 0.494873f, 0.578613f,
+ 0.502441f, 0.568359f, 0.508789f, 0.559082f, 0.516113f, 0.549805f, 0.521484f, 0.541504f,
+ 0.527344f, 0.533203f, 0.532715f, 0.525879f, 0.538574f, 0.518066f, 0.545898f, 0.509766f,
+ 0.550293f, 0.502930f, 0.554688f, 0.496094f, 0.561035f, 0.489014f, 0.564453f, 0.482666f,
+ 0.570312f, 0.476074f, 0.574219f, 0.469727f, 0.578613f, 0.463867f, 0.583496f, 0.457764f,
+ 0.587402f, 0.451416f, 0.590820f, 0.445801f, 0.595703f, 0.439941f, 0.599121f, 0.434326f,
+ 0.604004f, 0.428467f, 0.607422f, 0.422607f, 0.611816f, 0.416748f, 0.614746f, 0.411377f,
+ 0.618652f, 0.405518f, 0.622070f, 0.399902f, 0.626953f, 0.393799f, 0.629883f, 0.387939f,
+ 0.633789f, 0.382324f, 0.636719f, 0.376221f, 0.641113f, 0.369873f, 0.642090f, 0.363525f,
+ 0.645508f, 0.356201f, 0.649414f, 0.348877f, 0.651855f, 0.341797f, 0.655273f, 0.334473f,
+ 0.658203f, 0.327148f, 0.661133f, 0.318848f, 0.662598f, 0.310059f, 0.665039f, 0.300781f,
+ 0.667480f, 0.290527f, 0.668945f, 0.279541f, 0.668457f, 0.267334f, 0.668457f, 0.252441f,
+ 0.663574f, 0.234863f, 0.657715f, 0.211548f, 0.638184f, 0.175049f, 0.567871f, 0.086548f,
+ 0.000000f, 1.000000f, 0.185059f, 0.919922f, 0.267822f, 0.855469f, 0.317627f, 0.807129f,
+ 0.353760f, 0.769043f, 0.380859f, 0.736816f, 0.404053f, 0.708984f, 0.420654f, 0.686035f,
+ 0.437500f, 0.665527f, 0.451904f, 0.646484f, 0.465088f, 0.628906f, 0.476074f, 0.613770f,
+ 0.487305f, 0.599121f, 0.496826f, 0.586426f, 0.505371f, 0.574219f, 0.514648f, 0.562012f,
+ 0.523438f, 0.550781f, 0.531250f, 0.540527f, 0.536621f, 0.531250f, 0.543945f, 0.521973f,
+ 0.551758f, 0.512207f, 0.556152f, 0.504883f, 0.563965f, 0.496094f, 0.570312f, 0.487549f,
+ 0.575684f, 0.479736f, 0.581543f, 0.471924f, 0.587402f, 0.464600f, 0.592285f, 0.457520f,
+ 0.598145f, 0.450195f, 0.602051f, 0.443604f, 0.607910f, 0.436768f, 0.613770f, 0.429932f,
+ 0.617676f, 0.423584f, 0.622070f, 0.417236f, 0.626465f, 0.410889f, 0.630859f, 0.404785f,
+ 0.635254f, 0.398438f, 0.640137f, 0.392090f, 0.645020f, 0.385498f, 0.646973f, 0.380127f,
+ 0.652832f, 0.373779f, 0.657227f, 0.367432f, 0.661133f, 0.361084f, 0.664551f, 0.354736f,
+ 0.668945f, 0.348633f, 0.672852f, 0.342041f, 0.676270f, 0.335693f, 0.680176f, 0.328857f,
+ 0.684570f, 0.321289f, 0.687012f, 0.313721f, 0.690918f, 0.306152f, 0.693848f, 0.298828f,
+ 0.697266f, 0.291016f, 0.701660f, 0.282959f, 0.704102f, 0.273438f, 0.706055f, 0.264160f,
+ 0.709473f, 0.254395f, 0.709473f, 0.243408f, 0.712891f, 0.231323f, 0.711914f, 0.217041f,
+ 0.709961f, 0.200317f, 0.706055f, 0.178955f, 0.690430f, 0.145874f, 0.636719f, 0.071045f,
+ 0.000000f, 1.000000f, 0.187134f, 0.918945f, 0.273193f, 0.852539f, 0.324707f, 0.803223f,
+ 0.360840f, 0.764160f, 0.391357f, 0.729980f, 0.414307f, 0.701660f, 0.434814f, 0.676758f,
+ 0.451172f, 0.654785f, 0.465820f, 0.635254f, 0.481201f, 0.616699f, 0.492920f, 0.600098f,
+ 0.503906f, 0.584961f, 0.515625f, 0.570801f, 0.524414f, 0.558105f, 0.533203f, 0.545898f,
+ 0.542969f, 0.533691f, 0.551270f, 0.522461f, 0.559082f, 0.511719f, 0.566895f, 0.501465f,
+ 0.573730f, 0.492188f, 0.580566f, 0.483398f, 0.587402f, 0.474609f, 0.595215f, 0.465088f,
+ 0.602051f, 0.456787f, 0.606445f, 0.448730f, 0.613281f, 0.440430f, 0.620117f, 0.432373f,
+ 0.624512f, 0.425293f, 0.629883f, 0.417725f, 0.635742f, 0.410645f, 0.642090f, 0.403076f,
+ 0.644531f, 0.396729f, 0.651855f, 0.389404f, 0.655762f, 0.382812f, 0.660645f, 0.376221f,
+ 0.666016f, 0.369141f, 0.670898f, 0.362549f, 0.674805f, 0.356201f, 0.679199f, 0.349609f,
+ 0.683594f, 0.343506f, 0.689453f, 0.336182f, 0.692383f, 0.330078f, 0.697754f, 0.323242f,
+ 0.701172f, 0.316895f, 0.706543f, 0.310059f, 0.709961f, 0.303467f, 0.714355f, 0.296387f,
+ 0.718262f, 0.289062f, 0.721191f, 0.281250f, 0.724609f, 0.273682f, 0.729004f, 0.265869f,
+ 0.732910f, 0.258301f, 0.735840f, 0.250244f, 0.739746f, 0.240845f, 0.742676f, 0.231689f,
+ 0.745605f, 0.222168f, 0.748535f, 0.211792f, 0.750488f, 0.199585f, 0.751953f, 0.186157f,
+ 0.750488f, 0.171021f, 0.746094f, 0.151123f, 0.734375f, 0.120911f, 0.691406f, 0.058105f,
+ 0.000000f, 1.000000f, 0.189819f, 0.917969f, 0.275879f, 0.851562f, 0.331055f, 0.799805f,
+ 0.370117f, 0.758301f, 0.400879f, 0.723633f, 0.426025f, 0.693359f, 0.446533f, 0.667480f,
+ 0.465332f, 0.644531f, 0.480225f, 0.624023f, 0.496582f, 0.604492f, 0.509766f, 0.586914f,
+ 0.521973f, 0.570801f, 0.533203f, 0.555664f, 0.542969f, 0.541992f, 0.553223f, 0.528809f,
+ 0.562988f, 0.516113f, 0.572266f, 0.503906f, 0.580566f, 0.492920f, 0.589355f, 0.481934f,
+ 0.597168f, 0.471924f, 0.603516f, 0.462646f, 0.611328f, 0.452881f, 0.618652f, 0.443359f,
+ 0.625977f, 0.434326f, 0.632324f, 0.425537f, 0.638672f, 0.416748f, 0.644531f, 0.408447f,
+ 0.649902f, 0.400635f, 0.657715f, 0.392334f, 0.662598f, 0.385010f, 0.667969f, 0.377441f,
+ 0.673340f, 0.369873f, 0.678711f, 0.363037f, 0.684082f, 0.355957f, 0.688965f, 0.348633f,
+ 0.694336f, 0.341553f, 0.698730f, 0.334717f, 0.704590f, 0.327881f, 0.708496f, 0.321289f,
+ 0.713867f, 0.314453f, 0.718750f, 0.307373f, 0.722656f, 0.300537f, 0.728027f, 0.293945f,
+ 0.730469f, 0.287842f, 0.735840f, 0.280518f, 0.741211f, 0.273438f, 0.745117f, 0.266846f,
+ 0.750000f, 0.259766f, 0.752930f, 0.251709f, 0.756348f, 0.244263f, 0.760742f, 0.236328f,
+ 0.764160f, 0.228516f, 0.768066f, 0.220459f, 0.770996f, 0.212646f, 0.774902f, 0.202881f,
+ 0.776855f, 0.193726f, 0.780762f, 0.184082f, 0.782715f, 0.171997f, 0.782227f, 0.160522f,
+ 0.783691f, 0.146240f, 0.781738f, 0.127808f, 0.773438f, 0.101501f, 0.738281f, 0.046478f,
+ 0.000000f, 1.000000f, 0.193359f, 0.916016f, 0.280273f, 0.849121f, 0.338867f, 0.795410f,
+ 0.378906f, 0.752930f, 0.411377f, 0.716309f, 0.437012f, 0.686035f, 0.459473f, 0.658203f,
+ 0.478760f, 0.634277f, 0.495605f, 0.612305f, 0.511719f, 0.591797f, 0.525879f, 0.573730f,
+ 0.538574f, 0.557129f, 0.552246f, 0.540527f, 0.562500f, 0.525879f, 0.572754f, 0.512207f,
+ 0.583008f, 0.499023f, 0.593262f, 0.485840f, 0.601562f, 0.474365f, 0.611328f, 0.462646f,
+ 0.617676f, 0.452393f, 0.626465f, 0.441895f, 0.633301f, 0.432373f, 0.641113f, 0.422119f,
+ 0.648926f, 0.412354f, 0.655762f, 0.403076f, 0.663574f, 0.393555f, 0.668945f, 0.385498f,
+ 0.675781f, 0.376709f, 0.682617f, 0.368652f, 0.687988f, 0.360352f, 0.695312f, 0.352539f,
+ 0.698730f, 0.345215f, 0.704102f, 0.337646f, 0.711426f, 0.329834f, 0.715332f, 0.322754f,
+ 0.720215f, 0.315430f, 0.725586f, 0.308350f, 0.730469f, 0.301270f, 0.735352f, 0.294434f,
+ 0.740723f, 0.287598f, 0.745605f, 0.280273f, 0.750000f, 0.273682f, 0.754883f, 0.266846f,
+ 0.758301f, 0.260254f, 0.764160f, 0.253174f, 0.768066f, 0.246460f, 0.773438f, 0.239380f,
+ 0.776855f, 0.232788f, 0.779785f, 0.225586f, 0.784180f, 0.217529f, 0.787598f, 0.209961f,
+ 0.791504f, 0.202271f, 0.795898f, 0.194336f, 0.799316f, 0.186279f, 0.802734f, 0.178345f,
+ 0.805176f, 0.168945f, 0.808594f, 0.159424f, 0.811035f, 0.149048f, 0.812012f, 0.137939f,
+ 0.812988f, 0.124817f, 0.811523f, 0.108582f, 0.805176f, 0.085022f, 0.776855f, 0.038177f,
+ 0.000000f, 1.000000f, 0.195190f, 0.915527f, 0.286133f, 0.846191f, 0.344727f, 0.791992f,
+ 0.388428f, 0.746582f, 0.420898f, 0.709961f, 0.447754f, 0.677734f, 0.470703f, 0.649414f,
+ 0.492676f, 0.623535f, 0.511230f, 0.600586f, 0.526855f, 0.580078f, 0.541992f, 0.560547f,
+ 0.555176f, 0.542969f, 0.568848f, 0.525391f, 0.581543f, 0.509766f, 0.591797f, 0.495605f,
+ 0.602051f, 0.482422f, 0.613281f, 0.468262f, 0.622559f, 0.456055f, 0.630859f, 0.443848f,
+ 0.640137f, 0.432373f, 0.647461f, 0.421875f, 0.655273f, 0.411621f, 0.663574f, 0.401123f,
+ 0.670898f, 0.391602f, 0.678223f, 0.381348f, 0.686035f, 0.371826f, 0.692383f, 0.362793f,
+ 0.699707f, 0.354004f, 0.705078f, 0.345703f, 0.711914f, 0.336914f, 0.717773f, 0.329102f,
+ 0.724121f, 0.321045f, 0.727539f, 0.313721f, 0.734863f, 0.305664f, 0.741211f, 0.298096f,
+ 0.745117f, 0.290771f, 0.749512f, 0.283691f, 0.755859f, 0.276611f, 0.759277f, 0.269775f,
+ 0.765137f, 0.262451f, 0.770996f, 0.255371f, 0.774414f, 0.248779f, 0.778809f, 0.242065f,
+ 0.784668f, 0.235474f, 0.788574f, 0.228271f, 0.793945f, 0.221191f, 0.796875f, 0.215210f,
+ 0.801270f, 0.208374f, 0.806152f, 0.201416f, 0.809082f, 0.193970f, 0.812012f, 0.186279f,
+ 0.816406f, 0.178589f, 0.819824f, 0.171387f, 0.822754f, 0.163940f, 0.827148f, 0.156128f,
+ 0.829590f, 0.147339f, 0.833008f, 0.138184f, 0.834473f, 0.129883f, 0.836426f, 0.118469f,
+ 0.837891f, 0.106628f, 0.836426f, 0.092163f, 0.831055f, 0.071899f, 0.808105f, 0.031708f,
+ 0.000000f, 1.000000f, 0.196777f, 0.915039f, 0.291260f, 0.843750f, 0.351074f, 0.787598f,
+ 0.397217f, 0.741699f, 0.431152f, 0.703125f, 0.458984f, 0.669922f, 0.484375f, 0.639648f,
+ 0.507324f, 0.612793f, 0.525879f, 0.588867f, 0.541992f, 0.567871f, 0.559082f, 0.546875f,
+ 0.571289f, 0.529297f, 0.586914f, 0.510742f, 0.598633f, 0.494629f, 0.610840f, 0.479248f,
+ 0.621094f, 0.465332f, 0.631836f, 0.450928f, 0.642090f, 0.437988f, 0.651367f, 0.425293f,
+ 0.660645f, 0.413330f, 0.669922f, 0.402344f, 0.676758f, 0.391357f, 0.684082f, 0.381104f,
+ 0.692383f, 0.371094f, 0.700684f, 0.360596f, 0.708496f, 0.350342f, 0.714355f, 0.341309f,
+ 0.722168f, 0.332275f, 0.728027f, 0.323486f, 0.732910f, 0.314941f, 0.740234f, 0.306641f,
+ 0.746094f, 0.298584f, 0.750977f, 0.290771f, 0.757324f, 0.282959f, 0.764160f, 0.275146f,
+ 0.766602f, 0.268311f, 0.772461f, 0.260742f, 0.778320f, 0.253418f, 0.783203f, 0.246460f,
+ 0.787598f, 0.239380f, 0.792969f, 0.232422f, 0.796387f, 0.226196f, 0.801270f, 0.219238f,
+ 0.806641f, 0.212402f, 0.810547f, 0.205811f, 0.814941f, 0.198975f, 0.819336f, 0.192749f,
+ 0.822266f, 0.186768f, 0.828125f, 0.179321f, 0.831543f, 0.172974f, 0.833984f, 0.165649f,
+ 0.837402f, 0.158203f, 0.840332f, 0.151489f, 0.845215f, 0.143799f, 0.848633f, 0.136353f,
+ 0.851074f, 0.129517f, 0.853027f, 0.120483f, 0.856934f, 0.112244f, 0.856445f, 0.102600f,
+ 0.858887f, 0.091309f, 0.858398f, 0.079041f, 0.854980f, 0.060913f, 0.836426f, 0.027008f,
+ 0.000000f, 1.000000f, 0.197632f, 0.915039f, 0.295654f, 0.841309f, 0.357666f, 0.784180f,
+ 0.405273f, 0.735840f, 0.441895f, 0.695801f, 0.471924f, 0.661133f, 0.497803f, 0.630371f,
+ 0.521973f, 0.602051f, 0.541016f, 0.577148f, 0.558594f, 0.554688f, 0.575684f, 0.533203f,
+ 0.589355f, 0.514648f, 0.603516f, 0.496582f, 0.617188f, 0.479248f, 0.627930f, 0.463379f,
+ 0.640137f, 0.448486f, 0.651855f, 0.433838f, 0.662598f, 0.420166f, 0.671875f, 0.406982f,
+ 0.679688f, 0.395020f, 0.688965f, 0.383301f, 0.696777f, 0.372070f, 0.705566f, 0.361084f,
+ 0.712402f, 0.351562f, 0.721191f, 0.340820f, 0.728027f, 0.330322f, 0.735840f, 0.321045f,
+ 0.741699f, 0.311768f, 0.749023f, 0.302490f, 0.754883f, 0.293945f, 0.761230f, 0.285400f,
+ 0.767578f, 0.277588f, 0.772461f, 0.269287f, 0.777832f, 0.261719f, 0.784668f, 0.253662f,
+ 0.788086f, 0.246704f, 0.792969f, 0.239746f, 0.798828f, 0.232178f, 0.803223f, 0.225098f,
+ 0.807617f, 0.218384f, 0.813477f, 0.211548f, 0.816406f, 0.205200f, 0.822266f, 0.198364f,
+ 0.826172f, 0.191895f, 0.830078f, 0.185303f, 0.833984f, 0.179199f, 0.837402f, 0.172974f,
+ 0.842285f, 0.166748f, 0.846680f, 0.160034f, 0.850586f, 0.153687f, 0.852539f, 0.147705f,
+ 0.855957f, 0.140381f, 0.858887f, 0.133667f, 0.863281f, 0.126221f, 0.865723f, 0.119873f,
+ 0.869141f, 0.113281f, 0.871094f, 0.105591f, 0.874023f, 0.096863f, 0.875977f, 0.088867f,
+ 0.876953f, 0.079041f, 0.877441f, 0.067261f, 0.875000f, 0.051941f, 0.858887f, 0.023010f,
+ 0.000000f, 1.000000f, 0.200562f, 0.914062f, 0.301758f, 0.837891f, 0.366699f, 0.778809f,
+ 0.414307f, 0.730469f, 0.452148f, 0.688965f, 0.483154f, 0.652832f, 0.511719f, 0.620605f,
+ 0.534180f, 0.592285f, 0.554688f, 0.566406f, 0.574219f, 0.542480f, 0.591309f, 0.520508f,
+ 0.606445f, 0.500488f, 0.621094f, 0.481689f, 0.634766f, 0.464111f, 0.645996f, 0.447754f,
+ 0.657715f, 0.432129f, 0.669434f, 0.417480f, 0.679199f, 0.403564f, 0.690430f, 0.389404f,
+ 0.698730f, 0.377197f, 0.708008f, 0.365234f, 0.716309f, 0.353516f, 0.723145f, 0.342773f,
+ 0.732422f, 0.332031f, 0.740723f, 0.321777f, 0.748047f, 0.311279f, 0.753906f, 0.301758f,
+ 0.762207f, 0.291992f, 0.768555f, 0.282715f, 0.773926f, 0.274414f, 0.780273f, 0.265869f,
+ 0.786133f, 0.257812f, 0.792480f, 0.249268f, 0.796875f, 0.241821f, 0.801758f, 0.234375f,
+ 0.807129f, 0.226929f, 0.812012f, 0.219849f, 0.817383f, 0.212769f, 0.822754f, 0.205444f,
+ 0.825684f, 0.199219f, 0.831055f, 0.192627f, 0.834961f, 0.186035f, 0.839355f, 0.179565f,
+ 0.843750f, 0.173340f, 0.847656f, 0.166992f, 0.851562f, 0.161255f, 0.855469f, 0.154907f,
+ 0.860352f, 0.148926f, 0.862793f, 0.142822f, 0.867188f, 0.137085f, 0.870117f, 0.131592f,
+ 0.873535f, 0.124878f, 0.876465f, 0.117676f, 0.877930f, 0.111755f, 0.881348f, 0.105347f,
+ 0.884766f, 0.098877f, 0.887695f, 0.092346f, 0.889160f, 0.084900f, 0.892090f, 0.076965f,
+ 0.893066f, 0.068054f, 0.893555f, 0.058258f, 0.888672f, 0.044098f, 0.879395f, 0.018127f,
+ 0.000000f, 1.000000f, 0.203247f, 0.912598f, 0.306396f, 0.835938f, 0.373047f, 0.775391f,
+ 0.423096f, 0.724609f, 0.463379f, 0.681641f, 0.495605f, 0.644531f, 0.523438f, 0.611328f,
+ 0.548340f, 0.581543f, 0.569336f, 0.555176f, 0.589844f, 0.530273f, 0.606445f, 0.507812f,
+ 0.622559f, 0.487061f, 0.637207f, 0.467529f, 0.651367f, 0.449219f, 0.664062f, 0.432129f,
+ 0.675293f, 0.416504f, 0.686523f, 0.401611f, 0.698242f, 0.386719f, 0.708008f, 0.372803f,
+ 0.716797f, 0.360107f, 0.727051f, 0.347168f, 0.734375f, 0.335938f, 0.742676f, 0.324707f,
+ 0.750488f, 0.313965f, 0.757812f, 0.303955f, 0.765625f, 0.293213f, 0.772461f, 0.283447f,
+ 0.780762f, 0.273682f, 0.786133f, 0.264648f, 0.791992f, 0.255859f, 0.798340f, 0.247559f,
+ 0.804688f, 0.239014f, 0.809082f, 0.231079f, 0.814941f, 0.223511f, 0.818848f, 0.216309f,
+ 0.825684f, 0.208740f, 0.830078f, 0.201538f, 0.833496f, 0.194946f, 0.839355f, 0.187744f,
+ 0.841309f, 0.181885f, 0.848633f, 0.174927f, 0.851074f, 0.168701f, 0.855957f, 0.162354f,
+ 0.859375f, 0.156616f, 0.862793f, 0.150757f, 0.867676f, 0.144775f, 0.871094f, 0.139038f,
+ 0.875000f, 0.133179f, 0.878906f, 0.127563f, 0.880371f, 0.122559f, 0.885254f, 0.116638f,
+ 0.888184f, 0.111267f, 0.890137f, 0.104492f, 0.892578f, 0.098938f, 0.895508f, 0.092896f,
+ 0.899902f, 0.086243f, 0.900391f, 0.080933f, 0.902832f, 0.074402f, 0.905273f, 0.066711f,
+ 0.906250f, 0.059174f, 0.905273f, 0.050293f, 0.905762f, 0.036987f, 0.895996f, 0.014900f,
+ 0.000000f, 1.000000f, 0.206665f, 0.911133f, 0.309814f, 0.833984f, 0.380127f, 0.770996f,
+ 0.432861f, 0.718750f, 0.473145f, 0.674805f, 0.506836f, 0.636230f, 0.536621f, 0.602051f,
+ 0.562012f, 0.571289f, 0.583984f, 0.543457f, 0.603516f, 0.518066f, 0.622070f, 0.495361f,
+ 0.637695f, 0.473877f, 0.653320f, 0.453613f, 0.666504f, 0.435303f, 0.681152f, 0.417236f,
+ 0.693848f, 0.400635f, 0.704102f, 0.385498f, 0.714844f, 0.370850f, 0.726562f, 0.356201f,
+ 0.733887f, 0.343506f, 0.744629f, 0.330322f, 0.751953f, 0.319092f, 0.759766f, 0.307617f,
+ 0.768555f, 0.296631f, 0.774414f, 0.286621f, 0.782227f, 0.276367f, 0.789062f, 0.266357f,
+ 0.797363f, 0.256348f, 0.802246f, 0.247437f, 0.808105f, 0.238770f, 0.814453f, 0.230347f,
+ 0.820801f, 0.221802f, 0.825195f, 0.214233f, 0.830566f, 0.206665f, 0.835449f, 0.199341f,
+ 0.841797f, 0.191650f, 0.844727f, 0.185059f, 0.848633f, 0.178711f, 0.853516f, 0.171997f,
+ 0.858887f, 0.165405f, 0.862305f, 0.159180f, 0.867676f, 0.153076f, 0.869629f, 0.147339f,
+ 0.873535f, 0.141602f, 0.877930f, 0.135742f, 0.881348f, 0.130005f, 0.885742f, 0.124634f,
+ 0.887695f, 0.119629f, 0.892090f, 0.114075f, 0.894531f, 0.108948f, 0.898438f, 0.103516f,
+ 0.899902f, 0.098877f, 0.903320f, 0.093567f, 0.905762f, 0.087585f, 0.908691f, 0.081299f,
+ 0.910156f, 0.076050f, 0.912598f, 0.070740f, 0.914551f, 0.065125f, 0.916504f, 0.057892f,
+ 0.916504f, 0.052368f, 0.917969f, 0.042908f, 0.916992f, 0.032013f, 0.909180f, 0.013008f,
+ 0.000000f, 1.000000f, 0.208984f, 0.910156f, 0.316895f, 0.830078f, 0.388916f, 0.766113f,
+ 0.442871f, 0.712402f, 0.485840f, 0.666992f, 0.520508f, 0.627441f, 0.547363f, 0.593262f,
+ 0.575195f, 0.561035f, 0.598633f, 0.532227f, 0.619141f, 0.505859f, 0.636719f, 0.482666f,
+ 0.654297f, 0.460449f, 0.668457f, 0.439941f, 0.684082f, 0.420898f, 0.697266f, 0.402588f,
+ 0.709961f, 0.385742f, 0.719727f, 0.370361f, 0.730957f, 0.355469f, 0.741211f, 0.341064f,
+ 0.750488f, 0.327881f, 0.760742f, 0.314697f, 0.767578f, 0.302979f, 0.776855f, 0.291260f,
+ 0.784180f, 0.280518f, 0.791504f, 0.270264f, 0.795898f, 0.260986f, 0.804688f, 0.250000f,
+ 0.812988f, 0.240234f, 0.817871f, 0.231323f, 0.823242f, 0.222900f, 0.829590f, 0.214478f,
+ 0.835938f, 0.205688f, 0.839844f, 0.198608f, 0.845215f, 0.191162f, 0.851074f, 0.183472f,
+ 0.854980f, 0.176636f, 0.859375f, 0.170044f, 0.863281f, 0.163696f, 0.868164f, 0.156982f,
+ 0.872070f, 0.150757f, 0.874512f, 0.145264f, 0.879395f, 0.138916f, 0.883301f, 0.133545f,
+ 0.886719f, 0.127808f, 0.889648f, 0.122498f, 0.893555f, 0.117065f, 0.896484f, 0.112427f,
+ 0.900879f, 0.106750f, 0.903320f, 0.101929f, 0.906250f, 0.096985f, 0.908691f, 0.092651f,
+ 0.912598f, 0.087524f, 0.915039f, 0.082886f, 0.917480f, 0.077515f, 0.917969f, 0.072449f,
+ 0.921875f, 0.067017f, 0.922852f, 0.061737f, 0.924805f, 0.057281f, 0.927734f, 0.051392f,
+ 0.927246f, 0.044800f, 0.929199f, 0.037720f, 0.928223f, 0.028305f, 0.922363f, 0.011879f,
+ 0.000000f, 1.000000f, 0.210205f, 0.910156f, 0.322754f, 0.827637f, 0.395996f, 0.761719f,
+ 0.452148f, 0.707031f, 0.495361f, 0.660156f, 0.531250f, 0.619141f, 0.561523f, 0.583008f,
+ 0.588867f, 0.550781f, 0.612305f, 0.520996f, 0.632812f, 0.494629f, 0.651855f, 0.469971f,
+ 0.668457f, 0.447510f, 0.685059f, 0.426270f, 0.698730f, 0.407227f, 0.712891f, 0.388428f,
+ 0.725586f, 0.371338f, 0.734863f, 0.355957f, 0.745117f, 0.341064f, 0.756348f, 0.326416f,
+ 0.765625f, 0.312744f, 0.775391f, 0.299805f, 0.783203f, 0.287354f, 0.792969f, 0.275879f,
+ 0.797852f, 0.265381f, 0.805664f, 0.254883f, 0.812988f, 0.244995f, 0.818359f, 0.235596f,
+ 0.826172f, 0.225708f, 0.832031f, 0.216553f, 0.838379f, 0.207764f, 0.843262f, 0.199707f,
+ 0.848633f, 0.191528f, 0.854492f, 0.183960f, 0.857910f, 0.176880f, 0.863770f, 0.169189f,
+ 0.867188f, 0.162964f, 0.871582f, 0.156372f, 0.876953f, 0.149780f, 0.880371f, 0.143433f,
+ 0.884766f, 0.137573f, 0.886230f, 0.132568f, 0.892090f, 0.126099f, 0.894531f, 0.120911f,
+ 0.898438f, 0.115662f, 0.900879f, 0.110901f, 0.904785f, 0.105591f, 0.907715f, 0.100586f,
+ 0.910645f, 0.096008f, 0.913086f, 0.091370f, 0.916016f, 0.087036f, 0.920410f, 0.082031f,
+ 0.921875f, 0.077637f, 0.922852f, 0.074280f, 0.928223f, 0.068970f, 0.928223f, 0.064087f,
+ 0.930176f, 0.059387f, 0.932129f, 0.054382f, 0.934570f, 0.049408f, 0.936035f, 0.044891f,
+ 0.936523f, 0.038910f, 0.937988f, 0.032257f, 0.936523f, 0.024109f, 0.932129f, 0.010178f,
+ 0.000000f, 1.000000f, 0.214600f, 0.907715f, 0.327393f, 0.825195f, 0.404297f, 0.757324f,
+ 0.460693f, 0.701172f, 0.506348f, 0.652832f, 0.543457f, 0.610840f, 0.575195f, 0.573242f,
+ 0.602051f, 0.540527f, 0.625488f, 0.510742f, 0.646484f, 0.483398f, 0.666016f, 0.458008f,
+ 0.681152f, 0.435791f, 0.700195f, 0.413086f, 0.713379f, 0.394043f, 0.726562f, 0.375488f,
+ 0.739746f, 0.357910f, 0.750488f, 0.341797f, 0.762207f, 0.326172f, 0.770996f, 0.312500f,
+ 0.782227f, 0.298096f, 0.790527f, 0.285400f, 0.797363f, 0.273438f, 0.805176f, 0.261719f,
+ 0.812988f, 0.250732f, 0.819336f, 0.240723f, 0.826660f, 0.230469f, 0.833496f, 0.221191f,
+ 0.837891f, 0.212280f, 0.845703f, 0.202759f, 0.851562f, 0.193970f, 0.855957f, 0.186157f,
+ 0.861816f, 0.178101f, 0.867676f, 0.170410f, 0.869629f, 0.163696f, 0.875977f, 0.156372f,
+ 0.879395f, 0.150146f, 0.884277f, 0.143433f, 0.888184f, 0.137207f, 0.891113f, 0.131470f,
+ 0.894531f, 0.125977f, 0.899414f, 0.120056f, 0.902344f, 0.114685f, 0.905762f, 0.109619f,
+ 0.908203f, 0.105042f, 0.912109f, 0.099854f, 0.915527f, 0.094604f, 0.916504f, 0.090820f,
+ 0.921387f, 0.086182f, 0.922852f, 0.081482f, 0.925293f, 0.077515f, 0.927734f, 0.073608f,
+ 0.930176f, 0.069397f, 0.933594f, 0.065125f, 0.935547f, 0.061493f, 0.938477f, 0.057404f,
+ 0.938965f, 0.052643f, 0.940430f, 0.047821f, 0.941895f, 0.043549f, 0.944824f, 0.038879f,
+ 0.945801f, 0.034454f, 0.945801f, 0.028198f, 0.945801f, 0.021210f, 0.942383f, 0.007812f,
+ 0.000000f, 1.000000f, 0.215454f, 0.907715f, 0.333008f, 0.822266f, 0.411133f, 0.752930f,
+ 0.470459f, 0.694824f, 0.516602f, 0.645508f, 0.554199f, 0.602539f, 0.587891f, 0.563965f,
+ 0.614746f, 0.530273f, 0.638672f, 0.499756f, 0.660156f, 0.472168f, 0.681152f, 0.446045f,
+ 0.696777f, 0.423096f, 0.714355f, 0.400635f, 0.728027f, 0.380615f, 0.738770f, 0.363037f,
+ 0.753418f, 0.344727f, 0.764648f, 0.328125f, 0.776367f, 0.312500f, 0.784180f, 0.298828f,
+ 0.795410f, 0.284668f, 0.803711f, 0.271729f, 0.812500f, 0.259521f, 0.819336f, 0.248291f,
+ 0.825684f, 0.237305f, 0.832520f, 0.227051f, 0.839844f, 0.216919f, 0.845215f, 0.208130f,
+ 0.851074f, 0.199219f, 0.857422f, 0.190063f, 0.863281f, 0.181641f, 0.867676f, 0.173828f,
+ 0.874512f, 0.165405f, 0.877441f, 0.158447f, 0.881836f, 0.151367f, 0.885742f, 0.144775f,
+ 0.890625f, 0.137939f, 0.893066f, 0.132446f, 0.897949f, 0.126099f, 0.900879f, 0.120605f,
+ 0.906250f, 0.114685f, 0.908203f, 0.109619f, 0.910645f, 0.105225f, 0.915527f, 0.099243f,
+ 0.916504f, 0.095093f, 0.920898f, 0.090454f, 0.924316f, 0.085571f, 0.925781f, 0.081482f,
+ 0.928223f, 0.077515f, 0.931641f, 0.073120f, 0.933594f, 0.069214f, 0.935547f, 0.065674f,
+ 0.938965f, 0.061676f, 0.940918f, 0.057983f, 0.942871f, 0.054504f, 0.945801f, 0.050690f,
+ 0.946777f, 0.047211f, 0.948242f, 0.042480f, 0.949219f, 0.038391f, 0.951172f, 0.034058f,
+ 0.952148f, 0.029922f, 0.953613f, 0.024521f, 0.953125f, 0.018356f, 0.950195f, 0.006660f,
+ 0.000000f, 1.000000f, 0.219482f, 0.905762f, 0.338623f, 0.819336f, 0.420166f, 0.748047f,
+ 0.480713f, 0.688477f, 0.527344f, 0.638184f, 0.567383f, 0.593750f, 0.599121f, 0.555664f,
+ 0.628418f, 0.520508f, 0.651855f, 0.489502f, 0.673828f, 0.460938f, 0.692871f, 0.434814f,
+ 0.711426f, 0.410889f, 0.727539f, 0.388672f, 0.741699f, 0.368408f, 0.752930f, 0.350342f,
+ 0.768066f, 0.331787f, 0.778320f, 0.315674f, 0.789551f, 0.299805f, 0.797363f, 0.285889f,
+ 0.807129f, 0.272461f, 0.815918f, 0.259277f, 0.824707f, 0.246826f, 0.832031f, 0.235474f,
+ 0.837891f, 0.224854f, 0.845215f, 0.214111f, 0.852051f, 0.204468f, 0.856934f, 0.195801f,
+ 0.862305f, 0.186646f, 0.867188f, 0.178833f, 0.873535f, 0.170288f, 0.879395f, 0.161743f,
+ 0.883301f, 0.154297f, 0.887695f, 0.147339f, 0.892090f, 0.140503f, 0.897461f, 0.133423f,
+ 0.899414f, 0.127808f, 0.904297f, 0.121887f, 0.907715f, 0.115662f, 0.910156f, 0.110596f,
+ 0.914062f, 0.105469f, 0.917480f, 0.099854f, 0.919922f, 0.095276f, 0.922852f, 0.090698f,
+ 0.926270f, 0.085815f, 0.928223f, 0.081787f, 0.931152f, 0.077393f, 0.933105f, 0.073608f,
+ 0.936035f, 0.069580f, 0.938965f, 0.065552f, 0.939941f, 0.062225f, 0.944336f, 0.058228f,
+ 0.945801f, 0.054840f, 0.946777f, 0.051666f, 0.950195f, 0.048096f, 0.952148f, 0.044830f,
+ 0.953125f, 0.042023f, 0.955566f, 0.037872f, 0.956055f, 0.033844f, 0.956543f, 0.030136f,
+ 0.958984f, 0.025681f, 0.959961f, 0.022354f, 0.958496f, 0.015495f, 0.957520f, 0.006104f,
+ 0.000000f, 1.000000f, 0.221680f, 0.904785f, 0.343262f, 0.816895f, 0.427979f, 0.743652f,
+ 0.489014f, 0.683105f, 0.538574f, 0.630859f, 0.578613f, 0.585938f, 0.612793f, 0.545410f,
+ 0.640137f, 0.510742f, 0.664062f, 0.479004f, 0.687500f, 0.449951f, 0.706055f, 0.424072f,
+ 0.724609f, 0.399414f, 0.739258f, 0.377441f, 0.754395f, 0.356445f, 0.767090f, 0.337891f,
+ 0.779785f, 0.320068f, 0.792480f, 0.302979f, 0.801758f, 0.287598f, 0.810547f, 0.273682f,
+ 0.820312f, 0.259766f, 0.828125f, 0.247681f, 0.836914f, 0.234741f, 0.843262f, 0.223633f,
+ 0.850586f, 0.212402f, 0.856445f, 0.202637f, 0.861328f, 0.193359f, 0.868164f, 0.183716f,
+ 0.873047f, 0.175659f, 0.877930f, 0.167480f, 0.882812f, 0.159790f, 0.887695f, 0.151611f,
+ 0.893555f, 0.144287f, 0.897949f, 0.136841f, 0.900879f, 0.130493f, 0.906250f, 0.123779f,
+ 0.908691f, 0.117920f, 0.911621f, 0.112488f, 0.916504f, 0.106506f, 0.918457f, 0.101440f,
+ 0.921875f, 0.096497f, 0.925781f, 0.091125f, 0.927734f, 0.086975f, 0.931152f, 0.082336f,
+ 0.933594f, 0.077942f, 0.936035f, 0.073975f, 0.937988f, 0.070068f, 0.940430f, 0.066162f,
+ 0.943359f, 0.062286f, 0.945312f, 0.058868f, 0.947754f, 0.055481f, 0.950195f, 0.051758f,
+ 0.951172f, 0.048920f, 0.953613f, 0.045898f, 0.956543f, 0.042297f, 0.957031f, 0.039734f,
+ 0.959961f, 0.036743f, 0.961914f, 0.033630f, 0.962402f, 0.030350f, 0.962891f, 0.026260f,
+ 0.964355f, 0.022385f, 0.964844f, 0.018661f, 0.965332f, 0.013443f, 0.963379f, 0.005283f,
+ 0.000000f, 1.000000f, 0.223877f, 0.904297f, 0.349854f, 0.813477f, 0.434814f, 0.739258f,
+ 0.498047f, 0.677246f, 0.548340f, 0.624023f, 0.588867f, 0.578125f, 0.624023f, 0.537109f,
+ 0.653320f, 0.500488f, 0.677734f, 0.468506f, 0.699707f, 0.439453f, 0.719238f, 0.412842f,
+ 0.737305f, 0.388184f, 0.753906f, 0.365723f, 0.767578f, 0.344971f, 0.780273f, 0.326172f,
+ 0.791016f, 0.308594f, 0.802734f, 0.291992f, 0.812012f, 0.276611f, 0.822754f, 0.261719f,
+ 0.830566f, 0.248657f, 0.838379f, 0.236084f, 0.846680f, 0.223877f, 0.854492f, 0.212402f,
+ 0.860352f, 0.201660f, 0.865234f, 0.192017f, 0.874023f, 0.181885f, 0.876953f, 0.173462f,
+ 0.883789f, 0.164673f, 0.887695f, 0.156860f, 0.891113f, 0.150146f, 0.896973f, 0.141968f,
+ 0.900391f, 0.135010f, 0.905762f, 0.127808f, 0.909180f, 0.121338f, 0.913574f, 0.114990f,
+ 0.916992f, 0.109131f, 0.920410f, 0.103577f, 0.923828f, 0.098083f, 0.927246f, 0.093140f,
+ 0.929688f, 0.088196f, 0.932617f, 0.083618f, 0.935547f, 0.079041f, 0.937988f, 0.074890f,
+ 0.940430f, 0.070740f, 0.943359f, 0.066895f, 0.945312f, 0.063049f, 0.946777f, 0.059570f,
+ 0.949219f, 0.056183f, 0.951172f, 0.052826f, 0.953613f, 0.049438f, 0.955566f, 0.046600f,
+ 0.957520f, 0.043365f, 0.958496f, 0.040771f, 0.961914f, 0.037384f, 0.962891f, 0.034882f,
+ 0.963867f, 0.032532f, 0.966797f, 0.029526f, 0.968262f, 0.027039f, 0.967773f, 0.023560f,
+ 0.969238f, 0.019897f, 0.969238f, 0.016190f, 0.970215f, 0.012489f, 0.969238f, 0.004246f,
+ 0.000000f, 1.000000f, 0.226807f, 0.902832f, 0.354980f, 0.811035f, 0.444092f, 0.734375f,
+ 0.508301f, 0.670898f, 0.559570f, 0.616699f, 0.599609f, 0.569824f, 0.634766f, 0.528320f,
+ 0.666016f, 0.491211f, 0.689941f, 0.458740f, 0.711426f, 0.429688f, 0.731934f, 0.402344f,
+ 0.749512f, 0.377686f, 0.765625f, 0.354736f, 0.779297f, 0.334473f, 0.792480f, 0.314697f,
+ 0.802734f, 0.297363f, 0.813477f, 0.281250f, 0.823730f, 0.265625f, 0.833496f, 0.250732f,
+ 0.842285f, 0.237671f, 0.850586f, 0.224976f, 0.855957f, 0.213989f, 0.863770f, 0.202026f,
+ 0.872070f, 0.191406f, 0.876465f, 0.181274f, 0.883301f, 0.172119f, 0.886719f, 0.163452f,
+ 0.892090f, 0.155273f, 0.896484f, 0.147339f, 0.900391f, 0.140137f, 0.905273f, 0.132935f,
+ 0.908203f, 0.126709f, 0.913574f, 0.119446f, 0.917969f, 0.112915f, 0.920898f, 0.107056f,
+ 0.924805f, 0.101074f, 0.927734f, 0.095703f, 0.931152f, 0.090576f, 0.934570f, 0.085388f,
+ 0.936523f, 0.080933f, 0.939453f, 0.076599f, 0.942383f, 0.071960f, 0.943848f, 0.068298f,
+ 0.947266f, 0.064209f, 0.948730f, 0.060516f, 0.950684f, 0.057098f, 0.953613f, 0.053650f,
+ 0.954590f, 0.050446f, 0.956543f, 0.047424f, 0.958984f, 0.044250f, 0.960938f, 0.041382f,
+ 0.962891f, 0.038391f, 0.963867f, 0.036011f, 0.965820f, 0.033325f, 0.967773f, 0.030518f,
+ 0.969238f, 0.028290f, 0.970215f, 0.026047f, 0.972656f, 0.023544f, 0.974121f, 0.020996f,
+ 0.973145f, 0.017822f, 0.974121f, 0.013947f, 0.975098f, 0.009872f, 0.974121f, 0.003941f,
+ 0.000000f, 1.000000f, 0.229126f, 0.901855f, 0.361572f, 0.807617f, 0.450928f, 0.729980f,
+ 0.518555f, 0.665039f, 0.570801f, 0.609375f, 0.612305f, 0.561523f, 0.646973f, 0.519531f,
+ 0.678223f, 0.481934f, 0.702148f, 0.449219f, 0.724121f, 0.419189f, 0.743652f, 0.392090f,
+ 0.760254f, 0.367432f, 0.775391f, 0.344727f, 0.790527f, 0.323975f, 0.804688f, 0.303955f,
+ 0.815430f, 0.286621f, 0.824707f, 0.270508f, 0.835449f, 0.255371f, 0.843262f, 0.241211f,
+ 0.852051f, 0.227295f, 0.859863f, 0.214844f, 0.865723f, 0.203735f, 0.871582f, 0.193115f,
+ 0.878906f, 0.182129f, 0.885254f, 0.172241f, 0.890625f, 0.162720f, 0.895996f, 0.154297f,
+ 0.900391f, 0.146118f, 0.904785f, 0.138550f, 0.909180f, 0.131348f, 0.913574f, 0.124451f,
+ 0.916016f, 0.118408f, 0.920898f, 0.112122f, 0.923828f, 0.105774f, 0.928223f, 0.099609f,
+ 0.931641f, 0.093750f, 0.933594f, 0.089050f, 0.937988f, 0.083374f, 0.939941f, 0.078735f,
+ 0.942383f, 0.074524f, 0.945801f, 0.069702f, 0.946289f, 0.066467f, 0.950195f, 0.061890f,
+ 0.951660f, 0.058624f, 0.955078f, 0.054688f, 0.956055f, 0.051697f, 0.958008f, 0.048462f,
+ 0.960449f, 0.045135f, 0.962402f, 0.042114f, 0.963379f, 0.039734f, 0.965820f, 0.036774f,
+ 0.967285f, 0.033936f, 0.968750f, 0.031799f, 0.970215f, 0.029282f, 0.971680f, 0.027344f,
+ 0.973633f, 0.024445f, 0.974609f, 0.022675f, 0.975586f, 0.020599f, 0.977539f, 0.018616f,
+ 0.979492f, 0.015884f, 0.978516f, 0.012421f, 0.978027f, 0.008774f, 0.979492f, 0.003914f,
+ 0.000000f, 1.000000f, 0.232178f, 0.900879f, 0.367432f, 0.804688f, 0.460205f, 0.725098f,
+ 0.526855f, 0.659180f, 0.581543f, 0.602051f, 0.623535f, 0.553223f, 0.658203f, 0.511230f,
+ 0.689453f, 0.472900f, 0.714844f, 0.439209f, 0.736328f, 0.409424f, 0.754883f, 0.382568f,
+ 0.773926f, 0.356934f, 0.788574f, 0.334473f, 0.800293f, 0.314209f, 0.812500f, 0.294922f,
+ 0.825684f, 0.276367f, 0.836426f, 0.260010f, 0.844727f, 0.245483f, 0.853027f, 0.231323f,
+ 0.861328f, 0.218018f, 0.869141f, 0.205444f, 0.875977f, 0.194092f, 0.881348f, 0.183594f,
+ 0.887207f, 0.173706f, 0.893066f, 0.163940f, 0.898438f, 0.154419f, 0.904297f, 0.145752f,
+ 0.908203f, 0.137817f, 0.912598f, 0.130493f, 0.916504f, 0.123413f, 0.919434f, 0.116943f,
+ 0.923340f, 0.110474f, 0.926270f, 0.104736f, 0.929199f, 0.099243f, 0.934082f, 0.093018f,
+ 0.937500f, 0.087524f, 0.939941f, 0.082397f, 0.943848f, 0.077271f, 0.945312f, 0.072815f,
+ 0.948242f, 0.068481f, 0.951172f, 0.064148f, 0.953613f, 0.060181f, 0.955566f, 0.056610f,
+ 0.957031f, 0.053436f, 0.959961f, 0.049469f, 0.961426f, 0.046600f, 0.963379f, 0.043518f,
+ 0.965332f, 0.040527f, 0.967285f, 0.037750f, 0.967773f, 0.035156f, 0.969238f, 0.033020f,
+ 0.971191f, 0.030273f, 0.972656f, 0.027939f, 0.974609f, 0.025482f, 0.975586f, 0.023697f,
+ 0.977051f, 0.021652f, 0.979004f, 0.019363f, 0.979980f, 0.017212f, 0.980957f, 0.015762f,
+ 0.981934f, 0.014084f, 0.983887f, 0.011299f, 0.982910f, 0.007217f, 0.982422f, 0.003099f,
+ 0.000000f, 1.000000f, 0.236328f, 0.898926f, 0.373291f, 0.801758f, 0.466797f, 0.721191f,
+ 0.538086f, 0.652344f, 0.590332f, 0.595703f, 0.634277f, 0.545898f, 0.670410f, 0.502441f,
+ 0.699707f, 0.464600f, 0.724121f, 0.430908f, 0.747070f, 0.400146f, 0.768066f, 0.372070f,
+ 0.783203f, 0.347412f, 0.797852f, 0.324951f, 0.812012f, 0.303955f, 0.824219f, 0.284668f,
+ 0.834473f, 0.267822f, 0.845703f, 0.250977f, 0.854492f, 0.235840f, 0.861328f, 0.222656f,
+ 0.869141f, 0.209595f, 0.876953f, 0.196899f, 0.885254f, 0.185303f, 0.889648f, 0.175049f,
+ 0.895020f, 0.165039f, 0.900391f, 0.156128f, 0.905762f, 0.146729f, 0.912109f, 0.137939f,
+ 0.915039f, 0.130249f, 0.919434f, 0.122803f, 0.922363f, 0.116150f, 0.926758f, 0.109314f,
+ 0.929199f, 0.103760f, 0.932617f, 0.097595f, 0.936035f, 0.092468f, 0.938477f, 0.087097f,
+ 0.941406f, 0.082275f, 0.945312f, 0.076782f, 0.948730f, 0.071716f, 0.951172f, 0.067261f,
+ 0.953125f, 0.063110f, 0.956543f, 0.058868f, 0.958008f, 0.055115f, 0.959961f, 0.051788f,
+ 0.961914f, 0.048309f, 0.964844f, 0.044891f, 0.966309f, 0.041840f, 0.967285f, 0.039368f,
+ 0.968750f, 0.036591f, 0.970703f, 0.033936f, 0.972656f, 0.031036f, 0.974609f, 0.028870f,
+ 0.975098f, 0.026840f, 0.977051f, 0.024567f, 0.978027f, 0.022522f, 0.979980f, 0.020142f,
+ 0.979980f, 0.018600f, 0.981445f, 0.016800f, 0.982422f, 0.015289f, 0.985352f, 0.013023f,
+ 0.985840f, 0.011269f, 0.986328f, 0.009911f, 0.985840f, 0.007294f, 0.986816f, 0.001528f,
+ 0.000000f, 1.000000f, 0.238525f, 0.897949f, 0.378418f, 0.799316f, 0.475342f, 0.716309f,
+ 0.546875f, 0.646973f, 0.601562f, 0.588379f, 0.644531f, 0.538086f, 0.681152f, 0.494141f,
+ 0.710938f, 0.455322f, 0.735840f, 0.421387f, 0.757324f, 0.391113f, 0.777832f, 0.363281f,
+ 0.793945f, 0.338623f, 0.807617f, 0.315918f, 0.821289f, 0.295410f, 0.834473f, 0.275879f,
+ 0.844238f, 0.258545f, 0.854004f, 0.242676f, 0.863281f, 0.227173f, 0.870605f, 0.213623f,
+ 0.878418f, 0.200928f, 0.885254f, 0.188843f, 0.891602f, 0.177246f, 0.898438f, 0.166626f,
+ 0.901855f, 0.157471f, 0.907227f, 0.148193f, 0.912109f, 0.139771f, 0.916992f, 0.131592f,
+ 0.921387f, 0.123474f, 0.926270f, 0.115784f, 0.929688f, 0.109314f, 0.933594f, 0.102722f,
+ 0.937012f, 0.096619f, 0.939453f, 0.091309f, 0.942383f, 0.085938f, 0.944824f, 0.080933f,
+ 0.947266f, 0.076416f, 0.948730f, 0.072327f, 0.953613f, 0.066895f, 0.955078f, 0.062927f,
+ 0.958008f, 0.058441f, 0.960449f, 0.054565f, 0.963379f, 0.050385f, 0.964355f, 0.047333f,
+ 0.966309f, 0.044037f, 0.967773f, 0.041168f, 0.970703f, 0.037689f, 0.972168f, 0.035034f,
+ 0.973633f, 0.032440f, 0.974609f, 0.030289f, 0.976074f, 0.027878f, 0.977539f, 0.025436f,
+ 0.979004f, 0.023041f, 0.980469f, 0.021194f, 0.980957f, 0.019592f, 0.982422f, 0.017700f,
+ 0.983887f, 0.015991f, 0.985352f, 0.013802f, 0.986328f, 0.012321f, 0.986816f, 0.011200f,
+ 0.988281f, 0.009804f, 0.988770f, 0.008263f, 0.991211f, 0.005661f, 0.988770f, 0.001611f,
+ 0.000000f, 1.000000f, 0.241333f, 0.896973f, 0.385742f, 0.795410f, 0.485596f, 0.710449f,
+ 0.557617f, 0.640625f, 0.610840f, 0.582031f, 0.654297f, 0.530762f, 0.691895f, 0.486084f,
+ 0.720703f, 0.447754f, 0.746094f, 0.413330f, 0.767578f, 0.382568f, 0.788086f, 0.354492f,
+ 0.803223f, 0.329834f, 0.817871f, 0.307373f, 0.830566f, 0.286377f, 0.842285f, 0.267822f,
+ 0.854004f, 0.249878f, 0.861816f, 0.234131f, 0.870605f, 0.219849f, 0.880371f, 0.205078f,
+ 0.887207f, 0.192505f, 0.892578f, 0.181152f, 0.898438f, 0.170410f, 0.904297f, 0.159790f,
+ 0.909668f, 0.149780f, 0.914062f, 0.140991f, 0.919922f, 0.132202f, 0.923340f, 0.124878f,
+ 0.927246f, 0.117859f, 0.931641f, 0.110107f, 0.935547f, 0.103210f, 0.940430f, 0.096497f,
+ 0.941895f, 0.090942f, 0.944824f, 0.085388f, 0.948730f, 0.079956f, 0.949707f, 0.075562f,
+ 0.952148f, 0.070984f, 0.954102f, 0.066833f, 0.957031f, 0.062500f, 0.958496f, 0.058807f,
+ 0.961914f, 0.054749f, 0.963867f, 0.050842f, 0.967285f, 0.046600f, 0.968750f, 0.043152f,
+ 0.970215f, 0.040070f, 0.972168f, 0.037079f, 0.973145f, 0.034576f, 0.976074f, 0.031586f,
+ 0.977539f, 0.028717f, 0.978516f, 0.026489f, 0.979980f, 0.024384f, 0.980469f, 0.022659f,
+ 0.981934f, 0.020569f, 0.983887f, 0.018402f, 0.985352f, 0.016235f, 0.985840f, 0.014786f,
+ 0.986816f, 0.013382f, 0.987305f, 0.012222f, 0.988281f, 0.010643f, 0.989746f, 0.009056f,
+ 0.991699f, 0.006828f, 0.992188f, 0.005764f, 0.992676f, 0.004990f, 0.993652f, 0.003448f,
+ 0.000000f, 1.000000f, 0.243042f, 0.896484f, 0.391113f, 0.792480f, 0.492676f, 0.706055f,
+ 0.565918f, 0.635254f, 0.621582f, 0.574707f, 0.666504f, 0.522949f, 0.702148f, 0.478271f,
+ 0.730469f, 0.439697f, 0.756836f, 0.404541f, 0.778320f, 0.374023f, 0.795410f, 0.346924f,
+ 0.812500f, 0.321533f, 0.827637f, 0.298340f, 0.840332f, 0.278320f, 0.851562f, 0.259277f,
+ 0.860840f, 0.242432f, 0.870605f, 0.226318f, 0.878906f, 0.211426f, 0.886230f, 0.198364f,
+ 0.893066f, 0.185791f, 0.899902f, 0.173584f, 0.905762f, 0.163086f, 0.910645f, 0.152954f,
+ 0.916504f, 0.143677f, 0.921875f, 0.134033f, 0.925781f, 0.125977f, 0.929688f, 0.118408f,
+ 0.933594f, 0.111023f, 0.936523f, 0.104736f, 0.939453f, 0.098572f, 0.943848f, 0.091736f,
+ 0.946777f, 0.085815f, 0.949707f, 0.080322f, 0.953125f, 0.074768f, 0.955566f, 0.070190f,
+ 0.957031f, 0.065918f, 0.958496f, 0.061981f, 0.961914f, 0.057526f, 0.963379f, 0.053833f,
+ 0.964844f, 0.050659f, 0.966309f, 0.047791f, 0.968262f, 0.044586f, 0.972168f, 0.040314f,
+ 0.974121f, 0.036652f, 0.975098f, 0.033936f, 0.976562f, 0.031250f, 0.978027f, 0.028748f,
+ 0.979980f, 0.026230f, 0.981445f, 0.023804f, 0.983398f, 0.021057f, 0.984375f, 0.019104f,
+ 0.985352f, 0.017395f, 0.986328f, 0.015854f, 0.986816f, 0.014481f, 0.988281f, 0.012825f,
+ 0.989746f, 0.011124f, 0.991699f, 0.008858f, 0.992188f, 0.007614f, 0.992676f, 0.006672f,
+ 0.993164f, 0.005848f, 0.994141f, 0.004837f, 0.995117f, 0.003674f, 0.997070f, 0.001191f,
+ 0.000000f, 1.000000f, 0.246826f, 0.895020f, 0.397217f, 0.789551f, 0.500000f, 0.701660f,
+ 0.575195f, 0.628906f, 0.631836f, 0.567871f, 0.675293f, 0.516113f, 0.711914f, 0.470947f,
+ 0.742188f, 0.431152f, 0.766602f, 0.396729f, 0.787109f, 0.366211f, 0.805664f, 0.338379f,
+ 0.821289f, 0.313477f, 0.835938f, 0.290527f, 0.847168f, 0.270752f, 0.859375f, 0.251465f,
+ 0.869141f, 0.234863f, 0.877441f, 0.218872f, 0.885742f, 0.204712f, 0.894531f, 0.190918f,
+ 0.899902f, 0.178589f, 0.905762f, 0.167358f, 0.912109f, 0.156616f, 0.917480f, 0.146362f,
+ 0.922852f, 0.136841f, 0.926270f, 0.128784f, 0.931152f, 0.120789f, 0.935059f, 0.112854f,
+ 0.938965f, 0.105469f, 0.942871f, 0.098572f, 0.945312f, 0.092285f, 0.947754f, 0.086792f,
+ 0.950195f, 0.081665f, 0.953125f, 0.076660f, 0.957031f, 0.070801f, 0.959961f, 0.065796f,
+ 0.961426f, 0.061523f, 0.963867f, 0.057251f, 0.967285f, 0.052887f, 0.968262f, 0.049133f,
+ 0.969238f, 0.046051f, 0.971191f, 0.043121f, 0.972168f, 0.040375f, 0.973633f, 0.037689f,
+ 0.975586f, 0.034943f, 0.977051f, 0.032074f, 0.979492f, 0.028976f, 0.980957f, 0.026245f,
+ 0.982422f, 0.023773f, 0.983887f, 0.021606f, 0.985352f, 0.019318f, 0.986816f, 0.017227f,
+ 0.988281f, 0.015045f, 0.990234f, 0.012520f, 0.991211f, 0.010956f, 0.991699f, 0.009674f,
+ 0.992188f, 0.008583f, 0.992676f, 0.007614f, 0.993652f, 0.006512f, 0.994141f, 0.005569f,
+ 0.995117f, 0.004410f, 0.996582f, 0.002855f, 0.999023f, 0.000214f, 0.999023f, 0.000002f,
+ 0.000000f, 1.000000f, 0.249512f, 0.893555f, 0.403564f, 0.786621f, 0.508301f, 0.697266f,
+ 0.583496f, 0.624023f, 0.641113f, 0.561523f, 0.685059f, 0.509277f, 0.720215f, 0.464600f,
+ 0.749512f, 0.424561f, 0.776367f, 0.389160f, 0.796387f, 0.358398f, 0.816895f, 0.330078f,
+ 0.832031f, 0.305176f, 0.846191f, 0.282959f, 0.854004f, 0.263916f, 0.866211f, 0.244507f,
+ 0.876953f, 0.227539f, 0.884277f, 0.212402f, 0.893066f, 0.197998f, 0.899902f, 0.184692f,
+ 0.905273f, 0.172485f, 0.912109f, 0.161255f, 0.920898f, 0.149536f, 0.920898f, 0.141113f,
+ 0.927246f, 0.132202f, 0.933594f, 0.122498f, 0.937012f, 0.114014f, 0.937012f, 0.108704f,
+ 0.942383f, 0.101929f, 0.948730f, 0.093689f, 0.952637f, 0.085876f, 0.952637f, 0.081421f,
+ 0.952637f, 0.077759f, 0.952637f, 0.074646f, 0.960938f, 0.067627f, 0.968262f, 0.059875f,
+ 0.968262f, 0.055359f, 0.968262f, 0.052246f, 0.968262f, 0.049744f, 0.968262f, 0.047577f,
+ 0.968262f, 0.045715f, 0.969238f, 0.043945f, 0.977051f, 0.037750f, 0.983887f, 0.030899f,
+ 0.983887f, 0.027618f, 0.983887f, 0.025513f, 0.983887f, 0.023895f, 0.983887f, 0.022568f,
+ 0.983887f, 0.021454f, 0.983887f, 0.020508f, 0.983887f, 0.019684f, 0.983887f, 0.018967f,
+ 0.983887f, 0.018341f, 0.983887f, 0.017807f, 0.991211f, 0.013176f, 0.999512f, 0.005295f,
+ 0.999512f, 0.002834f, 0.999512f, 0.001688f, 0.999512f, 0.001009f, 0.999512f, 0.000575f,
+ 0.999512f, 0.000294f, 0.999512f, 0.000121f, 0.999512f, 0.000028f, 0.999512f, 0.000000f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.993164f,
+ 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.989746f,
+ 0.000000f, 0.988281f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, 0.000000f, 0.985352f,
+ 0.000000f, 0.983887f, 0.000000f, 0.981934f, 0.000000f, 0.981445f, 0.000000f, 0.979980f,
+ 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.974121f, 0.000000f, 0.971680f,
+ 0.000000f, 0.970215f, 0.000000f, 0.967285f, 0.000000f, 0.963867f, 0.000000f, 0.962402f,
+ 0.000000f, 0.958008f, 0.000000f, 0.955566f, 0.000000f, 0.951172f, 0.000000f, 0.947266f,
+ 0.000000f, 0.942871f, 0.000000f, 0.937988f, 0.000000f, 0.932617f, 0.000000f, 0.926758f,
+ 0.000000f, 0.919922f, 0.000000f, 0.912109f, 0.000000f, 0.903809f, 0.000000f, 0.894531f,
+ 0.000000f, 0.882812f, 0.000000f, 0.869629f, 0.000000f, 0.854492f, 0.000000f, 0.836426f,
+ 0.000000f, 0.815430f, 0.000000f, 0.789551f, 0.000000f, 0.756348f, 0.000000f, 0.714844f,
+ 0.000000f, 0.657715f, 0.000000f, 0.574707f, 0.000000f, 0.441650f, 0.000000f, 0.173096f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.995605f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989258f,
+ 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f,
+ 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.979492f,
+ 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.973633f, 0.000000f, 0.972168f,
+ 0.000000f, 0.969238f, 0.000000f, 0.967285f, 0.000000f, 0.964355f, 0.000000f, 0.960938f,
+ 0.000000f, 0.958984f, 0.000000f, 0.954590f, 0.000000f, 0.951660f, 0.000000f, 0.946777f,
+ 0.000000f, 0.942871f, 0.000000f, 0.937500f, 0.000000f, 0.932617f, 0.000000f, 0.926270f,
+ 0.000000f, 0.918945f, 0.000000f, 0.911621f, 0.000000f, 0.902832f, 0.000000f, 0.893066f,
+ 0.000000f, 0.882324f, 0.000000f, 0.869629f, 0.000000f, 0.854492f, 0.000000f, 0.836426f,
+ 0.000000f, 0.815430f, 0.000000f, 0.789062f, 0.000000f, 0.756348f, 0.000000f, 0.714844f,
+ 0.000000f, 0.657715f, 0.000002f, 0.574707f, 0.000001f, 0.441162f, 0.000001f, 0.172607f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.992676f,
+ 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f,
+ 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985840f, 0.000000f, 0.984863f,
+ 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.980469f, 0.000000f, 0.979004f,
+ 0.000000f, 0.977051f, 0.000000f, 0.976074f, 0.000000f, 0.973633f, 0.000000f, 0.971191f,
+ 0.000000f, 0.969238f, 0.000000f, 0.966797f, 0.000000f, 0.964355f, 0.000000f, 0.960938f,
+ 0.000000f, 0.957520f, 0.000000f, 0.955078f, 0.000000f, 0.950684f, 0.000000f, 0.946777f,
+ 0.000000f, 0.941895f, 0.000000f, 0.937500f, 0.000000f, 0.931641f, 0.000000f, 0.925781f,
+ 0.000000f, 0.918945f, 0.000000f, 0.911133f, 0.000000f, 0.902344f, 0.000000f, 0.893066f,
+ 0.000000f, 0.881836f, 0.000000f, 0.868652f, 0.000006f, 0.853516f, 0.000021f, 0.835449f,
+ 0.000025f, 0.814941f, 0.000024f, 0.788086f, 0.000022f, 0.755371f, 0.000017f, 0.713379f,
+ 0.000017f, 0.656738f, 0.000013f, 0.574219f, 0.000012f, 0.441406f, 0.000011f, 0.172363f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f,
+ 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.989258f,
+ 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985840f, 0.000000f, 0.984375f,
+ 0.000000f, 0.983398f, 0.000000f, 0.981934f, 0.000000f, 0.980469f, 0.000000f, 0.978516f,
+ 0.000000f, 0.977051f, 0.000000f, 0.975098f, 0.000000f, 0.973145f, 0.000000f, 0.971191f,
+ 0.000000f, 0.968262f, 0.000000f, 0.965820f, 0.000000f, 0.963867f, 0.000000f, 0.960449f,
+ 0.000000f, 0.957031f, 0.000000f, 0.953613f, 0.000000f, 0.950195f, 0.000000f, 0.945801f,
+ 0.000009f, 0.941406f, 0.000026f, 0.936035f, 0.000048f, 0.931152f, 0.000073f, 0.924316f,
+ 0.000097f, 0.917480f, 0.000107f, 0.910645f, 0.000108f, 0.901367f, 0.000107f, 0.892090f,
+ 0.000100f, 0.880371f, 0.000094f, 0.867676f, 0.000084f, 0.852051f, 0.000074f, 0.834473f,
+ 0.000066f, 0.813965f, 0.000078f, 0.787109f, 0.000069f, 0.754395f, 0.000066f, 0.712402f,
+ 0.000062f, 0.655762f, 0.000056f, 0.573730f, 0.000055f, 0.440918f, 0.000051f, 0.171875f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994629f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f,
+ 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988770f,
+ 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.984375f,
+ 0.000000f, 0.982910f, 0.000000f, 0.980957f, 0.000000f, 0.979492f, 0.000000f, 0.978516f,
+ 0.000003f, 0.976074f, 0.000018f, 0.974609f, 0.000040f, 0.972656f, 0.000065f, 0.970215f,
+ 0.000095f, 0.967773f, 0.000124f, 0.965332f, 0.000157f, 0.962402f, 0.000191f, 0.959961f,
+ 0.000222f, 0.956055f, 0.000260f, 0.953125f, 0.000280f, 0.948730f, 0.000285f, 0.945312f,
+ 0.000286f, 0.939941f, 0.000278f, 0.935059f, 0.000265f, 0.929199f, 0.000256f, 0.923828f,
+ 0.000238f, 0.916504f, 0.000219f, 0.908691f, 0.000203f, 0.899902f, 0.000193f, 0.890625f,
+ 0.000199f, 0.878906f, 0.000218f, 0.866211f, 0.000208f, 0.851074f, 0.000190f, 0.833008f,
+ 0.000186f, 0.812012f, 0.000184f, 0.785156f, 0.000179f, 0.752930f, 0.000172f, 0.710938f,
+ 0.000172f, 0.654297f, 0.000162f, 0.572754f, 0.000171f, 0.439697f, 0.000136f, 0.171265f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994141f,
+ 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.991699f,
+ 0.000000f, 0.991211f, 0.000001f, 0.990234f, 0.000020f, 0.989746f, 0.000047f, 0.988281f,
+ 0.000083f, 0.986816f, 0.000118f, 0.985840f, 0.000156f, 0.984863f, 0.000199f, 0.983398f,
+ 0.000236f, 0.981934f, 0.000278f, 0.980957f, 0.000322f, 0.979004f, 0.000361f, 0.977051f,
+ 0.000398f, 0.975586f, 0.000444f, 0.973633f, 0.000485f, 0.971680f, 0.000521f, 0.969238f,
+ 0.000553f, 0.966797f, 0.000566f, 0.964355f, 0.000563f, 0.961426f, 0.000548f, 0.958496f,
+ 0.000531f, 0.955566f, 0.000514f, 0.951172f, 0.000490f, 0.947266f, 0.000461f, 0.943359f,
+ 0.000429f, 0.938965f, 0.000421f, 0.933105f, 0.000422f, 0.928711f, 0.000425f, 0.921875f,
+ 0.000435f, 0.915039f, 0.000459f, 0.907227f, 0.000445f, 0.897949f, 0.000417f, 0.888672f,
+ 0.000412f, 0.877441f, 0.000429f, 0.863770f, 0.000413f, 0.848145f, 0.000400f, 0.831055f,
+ 0.000413f, 0.809570f, 0.000418f, 0.783203f, 0.000386f, 0.750488f, 0.000401f, 0.708984f,
+ 0.000384f, 0.652832f, 0.000400f, 0.571777f, 0.000402f, 0.438965f, 0.000273f, 0.171997f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000026f, 0.995605f, 0.000076f, 0.995117f, 0.000120f, 0.994141f,
+ 0.000180f, 0.993652f, 0.000231f, 0.992676f, 0.000284f, 0.991699f, 0.000344f, 0.991211f,
+ 0.000395f, 0.990723f, 0.000439f, 0.989746f, 0.000499f, 0.988770f, 0.000552f, 0.987793f,
+ 0.000598f, 0.986328f, 0.000638f, 0.985352f, 0.000692f, 0.983398f, 0.000742f, 0.982422f,
+ 0.000785f, 0.981445f, 0.000823f, 0.979492f, 0.000862f, 0.978027f, 0.000911f, 0.976074f,
+ 0.000926f, 0.974121f, 0.000916f, 0.972656f, 0.000890f, 0.970703f, 0.000864f, 0.967773f,
+ 0.000838f, 0.965332f, 0.000805f, 0.962891f, 0.000776f, 0.959961f, 0.000764f, 0.957031f,
+ 0.000768f, 0.953613f, 0.000766f, 0.949707f, 0.000777f, 0.945801f, 0.000794f, 0.941406f,
+ 0.000806f, 0.937012f, 0.000798f, 0.931641f, 0.000804f, 0.925781f, 0.000805f, 0.919434f,
+ 0.000810f, 0.912598f, 0.000813f, 0.904785f, 0.000785f, 0.895508f, 0.000799f, 0.886230f,
+ 0.000808f, 0.874512f, 0.000813f, 0.861328f, 0.000775f, 0.846191f, 0.000789f, 0.828125f,
+ 0.000801f, 0.806641f, 0.000812f, 0.780762f, 0.000786f, 0.747559f, 0.000817f, 0.706055f,
+ 0.000783f, 0.649902f, 0.000838f, 0.569824f, 0.000832f, 0.438477f, 0.000481f, 0.171509f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000021f, 0.998535f, 0.000090f, 0.998047f,
+ 0.000177f, 0.997559f, 0.000250f, 0.997070f, 0.000344f, 0.997070f, 0.000415f, 0.996582f,
+ 0.000479f, 0.995605f, 0.000565f, 0.995117f, 0.000632f, 0.995117f, 0.000685f, 0.994141f,
+ 0.000743f, 0.993164f, 0.000816f, 0.992188f, 0.000875f, 0.991211f, 0.000922f, 0.990723f,
+ 0.000961f, 0.989746f, 0.001023f, 0.988770f, 0.001081f, 0.987793f, 0.001128f, 0.987305f,
+ 0.001166f, 0.985352f, 0.001198f, 0.984375f, 0.001249f, 0.982910f, 0.001302f, 0.981445f,
+ 0.001317f, 0.979980f, 0.001296f, 0.978516f, 0.001256f, 0.977051f, 0.001225f, 0.975098f,
+ 0.001225f, 0.972656f, 0.001233f, 0.971191f, 0.001237f, 0.968750f, 0.001248f, 0.966309f,
+ 0.001211f, 0.963867f, 0.001237f, 0.960938f, 0.001268f, 0.958008f, 0.001292f, 0.955078f,
+ 0.001320f, 0.951660f, 0.001269f, 0.947754f, 0.001301f, 0.943848f, 0.001354f, 0.938965f,
+ 0.001381f, 0.935059f, 0.001392f, 0.929688f, 0.001324f, 0.923340f, 0.001329f, 0.916992f,
+ 0.001383f, 0.909668f, 0.001422f, 0.902344f, 0.001340f, 0.893066f, 0.001359f, 0.882812f,
+ 0.001376f, 0.871582f, 0.001421f, 0.858398f, 0.001361f, 0.842773f, 0.001387f, 0.824707f,
+ 0.001410f, 0.803223f, 0.001449f, 0.777344f, 0.001432f, 0.744629f, 0.001457f, 0.703613f,
+ 0.001539f, 0.647461f, 0.001521f, 0.567871f, 0.001505f, 0.437256f, 0.000751f, 0.171509f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000033f, 0.999023f, 0.000168f, 0.999023f,
+ 0.000345f, 0.998535f, 0.000432f, 0.998535f, 0.000581f, 0.998047f, 0.000674f, 0.997559f,
+ 0.000732f, 0.997070f, 0.000844f, 0.996582f, 0.000932f, 0.996582f, 0.000991f, 0.996094f,
+ 0.001032f, 0.995117f, 0.001120f, 0.995117f, 0.001198f, 0.994629f, 0.001252f, 0.993652f,
+ 0.001290f, 0.992676f, 0.001320f, 0.991699f, 0.001404f, 0.991211f, 0.001468f, 0.989258f,
+ 0.001512f, 0.988770f, 0.001544f, 0.988281f, 0.001569f, 0.986816f, 0.001620f, 0.985352f,
+ 0.001697f, 0.984863f, 0.001737f, 0.983398f, 0.001743f, 0.981934f, 0.001749f, 0.980469f,
+ 0.001726f, 0.978516f, 0.001767f, 0.977051f, 0.001804f, 0.975098f, 0.001835f, 0.973633f,
+ 0.001862f, 0.972168f, 0.001804f, 0.969238f, 0.001812f, 0.966797f, 0.001865f, 0.964844f,
+ 0.001929f, 0.961914f, 0.001898f, 0.959473f, 0.001972f, 0.956055f, 0.002037f, 0.953125f,
+ 0.002056f, 0.949707f, 0.002104f, 0.945801f, 0.002031f, 0.941406f, 0.002075f, 0.937012f,
+ 0.002115f, 0.931641f, 0.002157f, 0.926758f, 0.002066f, 0.920410f, 0.002131f, 0.913574f,
+ 0.002180f, 0.907227f, 0.002230f, 0.898438f, 0.002258f, 0.889648f, 0.002159f, 0.879395f,
+ 0.002251f, 0.867676f, 0.002285f, 0.854492f, 0.002348f, 0.838867f, 0.002274f, 0.821289f,
+ 0.002338f, 0.799316f, 0.002428f, 0.773438f, 0.002401f, 0.741699f, 0.002459f, 0.699707f,
+ 0.002590f, 0.644531f, 0.002565f, 0.564941f, 0.002457f, 0.436035f, 0.001085f, 0.171509f,
+ 0.000000f, 1.000000f, 0.000326f, 0.999512f, 0.000606f, 0.999023f, 0.000679f, 0.999023f,
+ 0.000867f, 0.998535f, 0.000974f, 0.998047f, 0.001014f, 0.998047f, 0.001128f, 0.997070f,
+ 0.001255f, 0.997070f, 0.001306f, 0.996582f, 0.001332f, 0.996094f, 0.001404f, 0.995117f,
+ 0.001533f, 0.994629f, 0.001585f, 0.994141f, 0.001615f, 0.993164f, 0.001633f, 0.992676f,
+ 0.001713f, 0.992188f, 0.001810f, 0.991211f, 0.001877f, 0.990234f, 0.001957f, 0.989258f,
+ 0.002033f, 0.987793f, 0.002115f, 0.986816f, 0.002268f, 0.985840f, 0.002331f, 0.984375f,
+ 0.002363f, 0.982910f, 0.002380f, 0.981934f, 0.002356f, 0.980957f, 0.002365f, 0.979492f,
+ 0.002472f, 0.977539f, 0.002438f, 0.975586f, 0.002480f, 0.973633f, 0.002535f, 0.971680f,
+ 0.002594f, 0.969727f, 0.002539f, 0.967773f, 0.002703f, 0.965332f, 0.002815f, 0.962402f,
+ 0.002903f, 0.960449f, 0.002934f, 0.957031f, 0.002836f, 0.954102f, 0.002890f, 0.950684f,
+ 0.002998f, 0.946777f, 0.003069f, 0.942871f, 0.002993f, 0.938477f, 0.003071f, 0.934082f,
+ 0.003115f, 0.929199f, 0.003164f, 0.923340f, 0.003290f, 0.917480f, 0.003218f, 0.910156f,
+ 0.003286f, 0.903320f, 0.003365f, 0.895020f, 0.003380f, 0.886230f, 0.003332f, 0.875488f,
+ 0.003494f, 0.863770f, 0.003576f, 0.850098f, 0.003597f, 0.834961f, 0.003561f, 0.816895f,
+ 0.003735f, 0.795410f, 0.003809f, 0.769531f, 0.003807f, 0.736816f, 0.003897f, 0.696289f,
+ 0.004066f, 0.641602f, 0.004017f, 0.562500f, 0.003731f, 0.434814f, 0.001482f, 0.172119f,
+ 0.000000f, 1.000000f, 0.000448f, 0.999512f, 0.000846f, 0.999023f, 0.000846f, 0.999023f,
+ 0.001189f, 0.998047f, 0.001211f, 0.998047f, 0.001214f, 0.997559f, 0.001500f, 0.996582f,
+ 0.001541f, 0.996582f, 0.001554f, 0.995605f, 0.001558f, 0.995117f, 0.001799f, 0.994629f,
+ 0.001853f, 0.994141f, 0.001926f, 0.993164f, 0.002012f, 0.992676f, 0.002098f, 0.992188f,
+ 0.002409f, 0.991211f, 0.002525f, 0.990234f, 0.002636f, 0.989258f, 0.002729f, 0.988281f,
+ 0.002769f, 0.986816f, 0.002920f, 0.985840f, 0.003025f, 0.984375f, 0.003069f, 0.982910f,
+ 0.003019f, 0.981445f, 0.003075f, 0.980469f, 0.003147f, 0.979004f, 0.003260f, 0.977539f,
+ 0.003376f, 0.976074f, 0.003471f, 0.973633f, 0.003443f, 0.972168f, 0.003523f, 0.969727f,
+ 0.003605f, 0.967773f, 0.003799f, 0.965332f, 0.003809f, 0.962891f, 0.003918f, 0.959961f,
+ 0.003990f, 0.957520f, 0.004040f, 0.954590f, 0.003922f, 0.951172f, 0.004013f, 0.947754f,
+ 0.004292f, 0.943848f, 0.004372f, 0.939453f, 0.004467f, 0.935547f, 0.004387f, 0.931152f,
+ 0.004406f, 0.925781f, 0.004528f, 0.919922f, 0.004787f, 0.913574f, 0.004635f, 0.906738f,
+ 0.004753f, 0.898926f, 0.004871f, 0.891113f, 0.005024f, 0.881348f, 0.004959f, 0.871094f,
+ 0.005142f, 0.858887f, 0.005264f, 0.845703f, 0.005363f, 0.830078f, 0.005356f, 0.812012f,
+ 0.005600f, 0.790039f, 0.005707f, 0.763672f, 0.005745f, 0.731934f, 0.005917f, 0.691895f,
+ 0.006096f, 0.637695f, 0.005943f, 0.560059f, 0.005348f, 0.432861f, 0.001945f, 0.172241f,
+ 0.000000f, 1.000000f, 0.000475f, 0.999512f, 0.000919f, 0.999023f, 0.000911f, 0.998535f,
+ 0.001319f, 0.998047f, 0.001321f, 0.997559f, 0.001315f, 0.997070f, 0.001681f, 0.996582f,
+ 0.001736f, 0.995605f, 0.001840f, 0.995117f, 0.001937f, 0.994629f, 0.002386f, 0.994141f,
+ 0.002514f, 0.993164f, 0.002598f, 0.992188f, 0.002716f, 0.991699f, 0.002808f, 0.990723f,
+ 0.003187f, 0.990234f, 0.003286f, 0.989258f, 0.003387f, 0.987793f, 0.003479f, 0.986816f,
+ 0.003534f, 0.986328f, 0.003813f, 0.984375f, 0.003986f, 0.982910f, 0.004002f, 0.981445f,
+ 0.004108f, 0.979980f, 0.004066f, 0.978516f, 0.004135f, 0.977539f, 0.004498f, 0.975586f,
+ 0.004513f, 0.973633f, 0.004650f, 0.971680f, 0.004791f, 0.969727f, 0.004761f, 0.967285f,
+ 0.004883f, 0.964844f, 0.005177f, 0.962891f, 0.005322f, 0.959961f, 0.005276f, 0.957520f,
+ 0.005344f, 0.954102f, 0.005501f, 0.951660f, 0.005692f, 0.948242f, 0.005737f, 0.944336f,
+ 0.005913f, 0.940430f, 0.005962f, 0.935547f, 0.006123f, 0.931641f, 0.006100f, 0.926758f,
+ 0.006302f, 0.921387f, 0.006462f, 0.916016f, 0.006653f, 0.909180f, 0.006672f, 0.902344f,
+ 0.006710f, 0.894043f, 0.006927f, 0.885742f, 0.007126f, 0.876953f, 0.007107f, 0.866211f,
+ 0.007381f, 0.853516f, 0.007553f, 0.839844f, 0.007690f, 0.824707f, 0.007744f, 0.806641f,
+ 0.008064f, 0.784668f, 0.008255f, 0.759277f, 0.008331f, 0.727051f, 0.008553f, 0.686523f,
+ 0.008720f, 0.633301f, 0.008400f, 0.557129f, 0.007336f, 0.431152f, 0.002468f, 0.171631f,
+ 0.000000f, 1.000000f, 0.000484f, 0.999512f, 0.000948f, 0.998535f, 0.000941f, 0.998535f,
+ 0.001380f, 0.997559f, 0.001490f, 0.997070f, 0.001662f, 0.997070f, 0.002186f, 0.995605f,
+ 0.002361f, 0.995117f, 0.002472f, 0.994629f, 0.002554f, 0.994141f, 0.003077f, 0.993164f,
+ 0.003181f, 0.992188f, 0.003248f, 0.991699f, 0.003347f, 0.990723f, 0.003517f, 0.989746f,
+ 0.004032f, 0.988770f, 0.004196f, 0.987305f, 0.004333f, 0.986816f, 0.004528f, 0.985352f,
+ 0.004707f, 0.984863f, 0.005169f, 0.983398f, 0.005051f, 0.981445f, 0.005215f, 0.979492f,
+ 0.005272f, 0.978516f, 0.005455f, 0.976562f, 0.005444f, 0.975098f, 0.005920f, 0.972656f,
+ 0.006084f, 0.971191f, 0.006104f, 0.968750f, 0.006344f, 0.967285f, 0.006546f, 0.964844f,
+ 0.006474f, 0.962402f, 0.006859f, 0.959473f, 0.007065f, 0.957031f, 0.007252f, 0.954102f,
+ 0.007290f, 0.951172f, 0.007435f, 0.948242f, 0.007648f, 0.944336f, 0.007698f, 0.940430f,
+ 0.007927f, 0.936035f, 0.008286f, 0.932129f, 0.008354f, 0.927246f, 0.008583f, 0.922363f,
+ 0.008568f, 0.916992f, 0.008904f, 0.910645f, 0.009140f, 0.904297f, 0.009460f, 0.896973f,
+ 0.009415f, 0.889160f, 0.009567f, 0.880371f, 0.009941f, 0.871582f, 0.010284f, 0.859863f,
+ 0.010338f, 0.847656f, 0.010643f, 0.834473f, 0.010971f, 0.818848f, 0.011017f, 0.799805f,
+ 0.011360f, 0.778320f, 0.011566f, 0.752441f, 0.011681f, 0.721680f, 0.012024f, 0.681641f,
+ 0.012032f, 0.627930f, 0.011436f, 0.553711f, 0.009796f, 0.429932f, 0.003063f, 0.171631f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000536f, 0.999023f, 0.001241f, 0.998535f,
+ 0.001919f, 0.997559f, 0.002066f, 0.997070f, 0.002249f, 0.996094f, 0.002773f, 0.995117f,
+ 0.002897f, 0.995117f, 0.003038f, 0.993652f, 0.003145f, 0.993164f, 0.003710f, 0.992188f,
+ 0.003944f, 0.991211f, 0.004177f, 0.990234f, 0.004353f, 0.989746f, 0.004490f, 0.988281f,
+ 0.005058f, 0.987305f, 0.005283f, 0.985840f, 0.005486f, 0.984863f, 0.005726f, 0.983887f,
+ 0.005947f, 0.982422f, 0.006504f, 0.980957f, 0.006786f, 0.979492f, 0.006882f, 0.978027f,
+ 0.006939f, 0.976074f, 0.006973f, 0.974121f, 0.007202f, 0.972656f, 0.007584f, 0.970215f,
+ 0.007896f, 0.968262f, 0.008217f, 0.966309f, 0.008278f, 0.964355f, 0.008560f, 0.961914f,
+ 0.008827f, 0.959961f, 0.009064f, 0.956055f, 0.009338f, 0.953125f, 0.009682f, 0.950195f,
+ 0.009605f, 0.946777f, 0.009979f, 0.943848f, 0.010170f, 0.940430f, 0.010704f, 0.936035f,
+ 0.010712f, 0.931641f, 0.011086f, 0.927246f, 0.011314f, 0.922363f, 0.011543f, 0.916992f,
+ 0.011566f, 0.911621f, 0.012276f, 0.905273f, 0.012535f, 0.898438f, 0.012772f, 0.891113f,
+ 0.013008f, 0.883301f, 0.013107f, 0.874512f, 0.013748f, 0.864746f, 0.014168f, 0.853516f,
+ 0.014252f, 0.841309f, 0.014610f, 0.827637f, 0.015007f, 0.812012f, 0.015266f, 0.793457f,
+ 0.015625f, 0.771484f, 0.016022f, 0.746582f, 0.016068f, 0.715332f, 0.016403f, 0.676270f,
+ 0.016129f, 0.623047f, 0.015282f, 0.549316f, 0.012604f, 0.427490f, 0.003716f, 0.171753f,
+ 0.000000f, 1.000000f, 0.000288f, 0.999512f, 0.001102f, 0.998535f, 0.001709f, 0.998047f,
+ 0.001948f, 0.997559f, 0.002539f, 0.996582f, 0.002581f, 0.995605f, 0.002890f, 0.995117f,
+ 0.003614f, 0.993652f, 0.003788f, 0.993164f, 0.003986f, 0.992188f, 0.004730f, 0.991211f,
+ 0.004944f, 0.990234f, 0.005127f, 0.989258f, 0.005333f, 0.988281f, 0.005642f, 0.987305f,
+ 0.006416f, 0.985352f, 0.006668f, 0.984375f, 0.006882f, 0.982910f, 0.007092f, 0.981934f,
+ 0.007473f, 0.980469f, 0.008240f, 0.978516f, 0.008575f, 0.977539f, 0.008842f, 0.975586f,
+ 0.008911f, 0.974121f, 0.009033f, 0.971680f, 0.009590f, 0.969727f, 0.009995f, 0.966797f,
+ 0.010078f, 0.965332f, 0.010414f, 0.962402f, 0.010857f, 0.960938f, 0.010994f, 0.958008f,
+ 0.011803f, 0.955566f, 0.012283f, 0.953125f, 0.012177f, 0.948730f, 0.012512f, 0.945801f,
+ 0.012978f, 0.942871f, 0.013008f, 0.938965f, 0.013618f, 0.935547f, 0.014084f, 0.931152f,
+ 0.014565f, 0.926270f, 0.014694f, 0.921387f, 0.015221f, 0.916992f, 0.015495f, 0.912109f,
+ 0.015930f, 0.906250f, 0.016449f, 0.898926f, 0.016724f, 0.892090f, 0.017242f, 0.884766f,
+ 0.017517f, 0.876465f, 0.017975f, 0.868164f, 0.018616f, 0.857422f, 0.019424f, 0.847168f,
+ 0.019226f, 0.833496f, 0.019821f, 0.819824f, 0.020325f, 0.804688f, 0.021072f, 0.786133f,
+ 0.021332f, 0.764160f, 0.021835f, 0.739258f, 0.021790f, 0.708984f, 0.021942f, 0.669434f,
+ 0.021606f, 0.618652f, 0.020065f, 0.545898f, 0.016052f, 0.425293f, 0.004490f, 0.171631f,
+ 0.000000f, 1.000000f, 0.000446f, 0.999512f, 0.000862f, 0.999023f, 0.001550f, 0.998047f,
+ 0.002325f, 0.996582f, 0.003046f, 0.996094f, 0.003458f, 0.995117f, 0.003769f, 0.994141f,
+ 0.004398f, 0.993164f, 0.004520f, 0.992188f, 0.005066f, 0.991211f, 0.005371f, 0.989746f,
+ 0.006062f, 0.988770f, 0.006344f, 0.987793f, 0.006741f, 0.986328f, 0.007118f, 0.985352f,
+ 0.007866f, 0.983398f, 0.008179f, 0.981934f, 0.008545f, 0.980957f, 0.008957f, 0.979492f,
+ 0.009407f, 0.978027f, 0.010155f, 0.976074f, 0.010597f, 0.974609f, 0.011009f, 0.972656f,
+ 0.011414f, 0.971191f, 0.011948f, 0.968750f, 0.012283f, 0.966309f, 0.012512f, 0.963379f,
+ 0.013039f, 0.961426f, 0.013199f, 0.958984f, 0.013664f, 0.956543f, 0.014351f, 0.954102f,
+ 0.014992f, 0.950684f, 0.015579f, 0.947754f, 0.015945f, 0.944824f, 0.016144f, 0.941406f,
+ 0.016571f, 0.937500f, 0.017303f, 0.934082f, 0.017868f, 0.929688f, 0.018448f, 0.925293f,
+ 0.018921f, 0.920898f, 0.019226f, 0.915527f, 0.019669f, 0.910645f, 0.020538f, 0.905762f,
+ 0.021179f, 0.898926f, 0.021774f, 0.892090f, 0.022369f, 0.885254f, 0.022797f, 0.876953f,
+ 0.023514f, 0.869629f, 0.023956f, 0.860352f, 0.024673f, 0.849121f, 0.025650f, 0.838867f,
+ 0.025833f, 0.825684f, 0.026703f, 0.812500f, 0.027405f, 0.797363f, 0.027893f, 0.777832f,
+ 0.028412f, 0.756348f, 0.028931f, 0.731445f, 0.028992f, 0.701660f, 0.029083f, 0.662598f,
+ 0.028183f, 0.612305f, 0.025726f, 0.541992f, 0.020248f, 0.422852f, 0.005386f, 0.170776f,
+ 0.000000f, 1.000000f, 0.000475f, 0.999512f, 0.001075f, 0.998535f, 0.001766f, 0.998047f,
+ 0.002970f, 0.996582f, 0.003218f, 0.995605f, 0.004227f, 0.994141f, 0.004513f, 0.993164f,
+ 0.004906f, 0.992188f, 0.005661f, 0.991211f, 0.006229f, 0.989746f, 0.006573f, 0.988770f,
+ 0.007462f, 0.986816f, 0.007774f, 0.986328f, 0.008362f, 0.984375f, 0.008781f, 0.982910f,
+ 0.009712f, 0.981445f, 0.010094f, 0.979980f, 0.010437f, 0.978516f, 0.011124f, 0.976562f,
+ 0.011696f, 0.974609f, 0.012619f, 0.972656f, 0.013031f, 0.971191f, 0.013542f, 0.969238f,
+ 0.014267f, 0.967285f, 0.014839f, 0.965332f, 0.015839f, 0.962891f, 0.015930f, 0.959961f,
+ 0.016495f, 0.957520f, 0.016785f, 0.954590f, 0.017273f, 0.952148f, 0.017990f, 0.949219f,
+ 0.019150f, 0.945801f, 0.019592f, 0.942383f, 0.020325f, 0.939453f, 0.020813f, 0.936035f,
+ 0.021103f, 0.932129f, 0.021927f, 0.927734f, 0.022690f, 0.923340f, 0.023621f, 0.918945f,
+ 0.024399f, 0.914062f, 0.024979f, 0.909180f, 0.025269f, 0.903809f, 0.026291f, 0.897949f,
+ 0.027725f, 0.891602f, 0.027832f, 0.884277f, 0.028778f, 0.876953f, 0.029572f, 0.869141f,
+ 0.030411f, 0.861328f, 0.031143f, 0.851562f, 0.032379f, 0.840820f, 0.033051f, 0.829590f,
+ 0.034546f, 0.817871f, 0.034546f, 0.803223f, 0.035492f, 0.787598f, 0.036530f, 0.769043f,
+ 0.036896f, 0.747559f, 0.037354f, 0.723145f, 0.037445f, 0.693848f, 0.037262f, 0.655273f,
+ 0.035919f, 0.605957f, 0.032410f, 0.537598f, 0.025040f, 0.420166f, 0.006405f, 0.169922f,
+ 0.000000f, 1.000000f, 0.000810f, 0.999512f, 0.001663f, 0.998535f, 0.002178f, 0.997070f,
+ 0.003160f, 0.996094f, 0.003994f, 0.995117f, 0.004765f, 0.993652f, 0.005657f, 0.992188f,
+ 0.005947f, 0.991211f, 0.007175f, 0.989746f, 0.007793f, 0.987793f, 0.008133f, 0.987305f,
+ 0.008522f, 0.985352f, 0.009468f, 0.984375f, 0.010422f, 0.981934f, 0.010834f, 0.980957f,
+ 0.011375f, 0.979004f, 0.012360f, 0.977539f, 0.013077f, 0.975098f, 0.013786f, 0.973145f,
+ 0.014420f, 0.971191f, 0.015457f, 0.969238f, 0.016006f, 0.967285f, 0.016632f, 0.965332f,
+ 0.017654f, 0.962891f, 0.018356f, 0.960449f, 0.019516f, 0.958008f, 0.020264f, 0.955566f,
+ 0.020676f, 0.952637f, 0.021103f, 0.950195f, 0.021927f, 0.946289f, 0.022476f, 0.942871f,
+ 0.023788f, 0.939941f, 0.024689f, 0.936523f, 0.025269f, 0.932617f, 0.026245f, 0.929688f,
+ 0.027145f, 0.925293f, 0.027786f, 0.920898f, 0.029022f, 0.916016f, 0.029602f, 0.911133f,
+ 0.030792f, 0.906738f, 0.031738f, 0.901855f, 0.032379f, 0.895996f, 0.033386f, 0.889160f,
+ 0.035004f, 0.882812f, 0.035614f, 0.875488f, 0.036652f, 0.868164f, 0.037872f, 0.860352f,
+ 0.038635f, 0.851562f, 0.039917f, 0.842285f, 0.041046f, 0.831055f, 0.042206f, 0.819824f,
+ 0.043549f, 0.807617f, 0.043823f, 0.793945f, 0.045197f, 0.777832f, 0.046478f, 0.759277f,
+ 0.046997f, 0.738770f, 0.047516f, 0.714844f, 0.047272f, 0.685547f, 0.046875f, 0.647949f,
+ 0.044891f, 0.600098f, 0.040253f, 0.532715f, 0.030396f, 0.418213f, 0.007557f, 0.169556f,
+ 0.000000f, 1.000000f, 0.001188f, 0.999023f, 0.002018f, 0.998047f, 0.002728f, 0.997070f,
+ 0.003435f, 0.996094f, 0.004341f, 0.994629f, 0.005997f, 0.992676f, 0.006424f, 0.991699f,
+ 0.007351f, 0.989746f, 0.008430f, 0.988281f, 0.009476f, 0.986328f, 0.010025f, 0.984863f,
+ 0.010468f, 0.983398f, 0.012100f, 0.981445f, 0.012764f, 0.979492f, 0.013359f, 0.978027f,
+ 0.013947f, 0.976074f, 0.015038f, 0.974121f, 0.016205f, 0.971680f, 0.016998f, 0.969238f,
+ 0.017731f, 0.967773f, 0.018860f, 0.965332f, 0.019608f, 0.962891f, 0.020798f, 0.960938f,
+ 0.021729f, 0.958008f, 0.022629f, 0.955566f, 0.023453f, 0.953125f, 0.024811f, 0.950195f,
+ 0.025650f, 0.947266f, 0.026718f, 0.944336f, 0.027481f, 0.940430f, 0.028198f, 0.936523f,
+ 0.029358f, 0.933105f, 0.030426f, 0.929688f, 0.031189f, 0.925781f, 0.032440f, 0.921875f,
+ 0.034058f, 0.917480f, 0.035034f, 0.913086f, 0.036224f, 0.907715f, 0.037323f, 0.902832f,
+ 0.038116f, 0.897461f, 0.039551f, 0.892578f, 0.040955f, 0.886230f, 0.042114f, 0.879883f,
+ 0.043701f, 0.873047f, 0.045258f, 0.866211f, 0.045715f, 0.858398f, 0.047424f, 0.850586f,
+ 0.048584f, 0.841797f, 0.050507f, 0.831543f, 0.051636f, 0.820801f, 0.052887f, 0.809570f,
+ 0.054169f, 0.796875f, 0.054565f, 0.783203f, 0.057098f, 0.767578f, 0.058075f, 0.749512f,
+ 0.058228f, 0.728516f, 0.058594f, 0.705078f, 0.058472f, 0.676270f, 0.057526f, 0.639648f,
+ 0.054688f, 0.593262f, 0.048767f, 0.528320f, 0.036438f, 0.414551f, 0.008743f, 0.169189f,
+ 0.000000f, 1.000000f, 0.001243f, 0.999023f, 0.002176f, 0.998047f, 0.003443f, 0.996582f,
+ 0.004551f, 0.995117f, 0.005215f, 0.993652f, 0.006969f, 0.992188f, 0.007889f, 0.990234f,
+ 0.008766f, 0.988770f, 0.010063f, 0.986328f, 0.011078f, 0.984375f, 0.012253f, 0.982910f,
+ 0.013084f, 0.980957f, 0.014412f, 0.978516f, 0.015640f, 0.976562f, 0.016357f, 0.974609f,
+ 0.017090f, 0.972656f, 0.018646f, 0.970215f, 0.019958f, 0.967285f, 0.020889f, 0.965332f,
+ 0.021698f, 0.962891f, 0.022583f, 0.960449f, 0.024109f, 0.958008f, 0.025620f, 0.954590f,
+ 0.026688f, 0.951660f, 0.027710f, 0.949219f, 0.028763f, 0.946777f, 0.030243f, 0.943359f,
+ 0.031555f, 0.940430f, 0.033203f, 0.937012f, 0.034119f, 0.933594f, 0.035004f, 0.929199f,
+ 0.036377f, 0.925293f, 0.037292f, 0.921387f, 0.038788f, 0.917480f, 0.040314f, 0.913086f,
+ 0.041870f, 0.908203f, 0.043457f, 0.903809f, 0.045105f, 0.898926f, 0.046112f, 0.893555f,
+ 0.047058f, 0.888184f, 0.049011f, 0.881836f, 0.050690f, 0.875977f, 0.052032f, 0.869629f,
+ 0.053558f, 0.862305f, 0.055359f, 0.854980f, 0.056946f, 0.848145f, 0.058167f, 0.839355f,
+ 0.060425f, 0.829590f, 0.062256f, 0.819824f, 0.063782f, 0.809570f, 0.065002f, 0.797852f,
+ 0.066345f, 0.785645f, 0.068237f, 0.771973f, 0.069458f, 0.755371f, 0.070862f, 0.738281f,
+ 0.071411f, 0.718262f, 0.071350f, 0.695312f, 0.071289f, 0.666992f, 0.069702f, 0.631348f,
+ 0.065674f, 0.585938f, 0.058075f, 0.522461f, 0.042969f, 0.412109f, 0.010139f, 0.168335f,
+ 0.000000f, 1.000000f, 0.001281f, 0.999023f, 0.002378f, 0.998047f, 0.004543f, 0.995605f,
+ 0.005272f, 0.994629f, 0.006863f, 0.992188f, 0.007767f, 0.990723f, 0.008728f, 0.989258f,
+ 0.011147f, 0.986328f, 0.011955f, 0.984375f, 0.013680f, 0.981934f, 0.014473f, 0.980469f,
+ 0.016312f, 0.977539f, 0.017792f, 0.975098f, 0.018646f, 0.972656f, 0.020065f, 0.970703f,
+ 0.021378f, 0.968262f, 0.022583f, 0.965332f, 0.024460f, 0.962402f, 0.025589f, 0.959961f,
+ 0.026550f, 0.957520f, 0.028015f, 0.955078f, 0.029785f, 0.951660f, 0.031433f, 0.948242f,
+ 0.032684f, 0.944824f, 0.033905f, 0.942383f, 0.035126f, 0.939453f, 0.037231f, 0.936035f,
+ 0.039124f, 0.932129f, 0.040619f, 0.928223f, 0.042084f, 0.924805f, 0.043213f, 0.921387f,
+ 0.044739f, 0.916992f, 0.046173f, 0.912598f, 0.047668f, 0.907715f, 0.049805f, 0.902832f,
+ 0.051178f, 0.897949f, 0.053009f, 0.893066f, 0.054901f, 0.888184f, 0.056427f, 0.883301f,
+ 0.058411f, 0.876953f, 0.060242f, 0.870605f, 0.062134f, 0.864258f, 0.064392f, 0.857422f,
+ 0.065735f, 0.850586f, 0.067444f, 0.843262f, 0.069702f, 0.835449f, 0.071228f, 0.826172f,
+ 0.073730f, 0.817383f, 0.075745f, 0.807617f, 0.077148f, 0.796875f, 0.078979f, 0.786133f,
+ 0.080261f, 0.773438f, 0.082642f, 0.759277f, 0.083801f, 0.743164f, 0.085144f, 0.726562f,
+ 0.085022f, 0.707031f, 0.085144f, 0.685059f, 0.084473f, 0.656250f, 0.082336f, 0.622070f,
+ 0.077576f, 0.578613f, 0.068237f, 0.516113f, 0.049774f, 0.409424f, 0.011513f, 0.166992f,
+ 0.000000f, 1.000000f, 0.001935f, 0.998535f, 0.003147f, 0.997559f, 0.005421f, 0.995117f,
+ 0.006699f, 0.993652f, 0.008888f, 0.990723f, 0.009850f, 0.989258f, 0.011070f, 0.987305f,
+ 0.012955f, 0.984375f, 0.015015f, 0.981934f, 0.016357f, 0.979492f, 0.018280f, 0.976562f,
+ 0.019836f, 0.973633f, 0.021439f, 0.971191f, 0.022964f, 0.968262f, 0.024841f, 0.965820f,
+ 0.026581f, 0.962891f, 0.027924f, 0.959473f, 0.029587f, 0.956543f, 0.031311f, 0.953613f,
+ 0.032776f, 0.951172f, 0.034698f, 0.947266f, 0.036194f, 0.943848f, 0.038544f, 0.940430f,
+ 0.039978f, 0.937500f, 0.041412f, 0.934082f, 0.043518f, 0.930664f, 0.045776f, 0.926270f,
+ 0.047852f, 0.922363f, 0.049561f, 0.918945f, 0.051270f, 0.915039f, 0.052979f, 0.911133f,
+ 0.055023f, 0.906738f, 0.057007f, 0.901367f, 0.059021f, 0.895996f, 0.060638f, 0.891113f,
+ 0.062683f, 0.886230f, 0.064331f, 0.881348f, 0.066833f, 0.876465f, 0.069153f, 0.870605f,
+ 0.071594f, 0.864258f, 0.073364f, 0.857422f, 0.075134f, 0.851074f, 0.078003f, 0.844727f,
+ 0.079773f, 0.837891f, 0.081787f, 0.830566f, 0.083984f, 0.821289f, 0.087280f, 0.812988f,
+ 0.088318f, 0.803223f, 0.091064f, 0.793457f, 0.092896f, 0.783691f, 0.094116f, 0.772461f,
+ 0.096375f, 0.759766f, 0.098450f, 0.745605f, 0.099182f, 0.729980f, 0.100830f, 0.714355f,
+ 0.100647f, 0.695312f, 0.100586f, 0.673340f, 0.100037f, 0.645996f, 0.096619f, 0.613281f,
+ 0.089966f, 0.571289f, 0.078857f, 0.510254f, 0.057251f, 0.405762f, 0.013077f, 0.166992f,
+ 0.000000f, 1.000000f, 0.001826f, 0.998535f, 0.003975f, 0.997070f, 0.006042f, 0.994629f,
+ 0.008217f, 0.992188f, 0.010422f, 0.989746f, 0.012428f, 0.987305f, 0.014282f, 0.984375f,
+ 0.016586f, 0.980957f, 0.017685f, 0.979004f, 0.019562f, 0.976074f, 0.022491f, 0.972168f,
+ 0.024750f, 0.968750f, 0.026108f, 0.966309f, 0.028549f, 0.962891f, 0.030518f, 0.959473f,
+ 0.033020f, 0.956055f, 0.034546f, 0.952637f, 0.036438f, 0.949707f, 0.038910f, 0.946289f,
+ 0.041168f, 0.941895f, 0.042938f, 0.938477f, 0.045044f, 0.935059f, 0.047211f, 0.931641f,
+ 0.048889f, 0.928223f, 0.051270f, 0.923828f, 0.053650f, 0.919922f, 0.056091f, 0.915527f,
+ 0.058472f, 0.911133f, 0.060394f, 0.907227f, 0.062347f, 0.903809f, 0.064819f, 0.898926f,
+ 0.067932f, 0.893555f, 0.069824f, 0.888672f, 0.072083f, 0.883301f, 0.073975f, 0.877930f,
+ 0.075867f, 0.873047f, 0.078125f, 0.868164f, 0.081421f, 0.861816f, 0.084106f, 0.855957f,
+ 0.086670f, 0.849609f, 0.088623f, 0.843262f, 0.090515f, 0.836426f, 0.093262f, 0.829590f,
+ 0.095703f, 0.822754f, 0.098572f, 0.814453f, 0.100952f, 0.805664f, 0.103760f, 0.797363f,
+ 0.105103f, 0.788086f, 0.108276f, 0.778809f, 0.110046f, 0.769043f, 0.112244f, 0.757324f,
+ 0.114197f, 0.744629f, 0.115601f, 0.730957f, 0.117188f, 0.716797f, 0.117920f, 0.700684f,
+ 0.117981f, 0.683594f, 0.117432f, 0.660645f, 0.115784f, 0.634766f, 0.111145f, 0.603516f,
+ 0.103088f, 0.563965f, 0.090149f, 0.503418f, 0.065125f, 0.402832f, 0.014748f, 0.165771f,
+ 0.000000f, 1.000000f, 0.002945f, 0.998047f, 0.005276f, 0.995605f, 0.008133f, 0.993164f,
+ 0.010643f, 0.990234f, 0.013069f, 0.987305f, 0.015381f, 0.984375f, 0.018494f, 0.980469f,
+ 0.020065f, 0.978027f, 0.022415f, 0.975098f, 0.025131f, 0.970703f, 0.027893f, 0.967285f,
+ 0.030487f, 0.963379f, 0.032684f, 0.960449f, 0.035889f, 0.956055f, 0.038727f, 0.951660f,
+ 0.040588f, 0.948242f, 0.042786f, 0.944824f, 0.045593f, 0.940918f, 0.048126f, 0.936523f,
+ 0.051117f, 0.932129f, 0.053101f, 0.928223f, 0.055481f, 0.924805f, 0.058197f, 0.920898f,
+ 0.061066f, 0.915527f, 0.063782f, 0.911133f, 0.065979f, 0.907227f, 0.068176f, 0.902832f,
+ 0.071289f, 0.898438f, 0.073547f, 0.894043f, 0.076721f, 0.888672f, 0.079651f, 0.883789f,
+ 0.082642f, 0.878906f, 0.085510f, 0.874023f, 0.087585f, 0.869141f, 0.089661f, 0.863770f,
+ 0.092163f, 0.857910f, 0.094971f, 0.851562f, 0.098633f, 0.845215f, 0.101440f, 0.838867f,
+ 0.104248f, 0.833496f, 0.106628f, 0.827148f, 0.108704f, 0.820801f, 0.111511f, 0.812988f,
+ 0.114929f, 0.805176f, 0.117371f, 0.797363f, 0.120239f, 0.789062f, 0.122620f, 0.780762f,
+ 0.124634f, 0.772461f, 0.126709f, 0.762695f, 0.129395f, 0.752441f, 0.131104f, 0.740723f,
+ 0.133789f, 0.729004f, 0.134888f, 0.716309f, 0.136353f, 0.702148f, 0.135986f, 0.687012f,
+ 0.136108f, 0.669434f, 0.134888f, 0.647461f, 0.132324f, 0.623047f, 0.126709f, 0.593750f,
+ 0.117493f, 0.556641f, 0.102234f, 0.497070f, 0.073120f, 0.399658f, 0.016556f, 0.165283f,
+ 0.000000f, 1.000000f, 0.003525f, 0.997559f, 0.006729f, 0.995117f, 0.009232f, 0.992188f,
+ 0.013802f, 0.987793f, 0.016479f, 0.984863f, 0.019440f, 0.980469f, 0.023453f, 0.976074f,
+ 0.025757f, 0.973145f, 0.029373f, 0.968750f, 0.032471f, 0.964355f, 0.034485f, 0.960938f,
+ 0.037811f, 0.956543f, 0.041779f, 0.951660f, 0.044952f, 0.947266f, 0.048035f, 0.942871f,
+ 0.050629f, 0.938965f, 0.053925f, 0.933594f, 0.057800f, 0.928711f, 0.060211f, 0.924805f,
+ 0.062927f, 0.920410f, 0.065674f, 0.916504f, 0.069397f, 0.911133f, 0.072510f, 0.906250f,
+ 0.075623f, 0.901367f, 0.078552f, 0.896973f, 0.081055f, 0.892578f, 0.083923f, 0.888184f,
+ 0.087830f, 0.882324f, 0.091064f, 0.876953f, 0.094238f, 0.872070f, 0.097046f, 0.867188f,
+ 0.099731f, 0.862305f, 0.103333f, 0.856934f, 0.106018f, 0.852051f, 0.109253f, 0.845703f,
+ 0.112244f, 0.839355f, 0.115234f, 0.833496f, 0.118225f, 0.827148f, 0.121155f, 0.820801f,
+ 0.124023f, 0.814941f, 0.126465f, 0.809082f, 0.130249f, 0.801758f, 0.132690f, 0.793945f,
+ 0.135864f, 0.786133f, 0.139404f, 0.778809f, 0.141724f, 0.770996f, 0.143311f, 0.762695f,
+ 0.146240f, 0.754883f, 0.148315f, 0.744141f, 0.151367f, 0.734375f, 0.153076f, 0.723633f,
+ 0.154785f, 0.712402f, 0.155273f, 0.700195f, 0.156006f, 0.687012f, 0.155640f, 0.672363f,
+ 0.155762f, 0.654785f, 0.153687f, 0.634277f, 0.149902f, 0.611328f, 0.142578f, 0.583008f,
+ 0.132080f, 0.547363f, 0.114807f, 0.490479f, 0.081726f, 0.396973f, 0.018372f, 0.164429f,
+ 0.000000f, 1.000000f, 0.004353f, 0.997559f, 0.009270f, 0.993164f, 0.013527f, 0.989258f,
+ 0.017075f, 0.985352f, 0.021469f, 0.980957f, 0.025726f, 0.975586f, 0.028534f, 0.972168f,
+ 0.034210f, 0.965820f, 0.037933f, 0.960938f, 0.041351f, 0.956543f, 0.045013f, 0.951660f,
+ 0.049316f, 0.946289f, 0.052612f, 0.941406f, 0.056610f, 0.936523f, 0.061157f, 0.931152f,
+ 0.065063f, 0.925293f, 0.068542f, 0.919922f, 0.071716f, 0.915527f, 0.075745f, 0.910645f,
+ 0.079102f, 0.905273f, 0.083496f, 0.899414f, 0.086914f, 0.894531f, 0.090271f, 0.889160f,
+ 0.093506f, 0.884766f, 0.096741f, 0.879883f, 0.100525f, 0.874512f, 0.104614f, 0.868652f,
+ 0.108521f, 0.862793f, 0.111572f, 0.857910f, 0.114868f, 0.852539f, 0.117798f, 0.847656f,
+ 0.120667f, 0.843262f, 0.125488f, 0.836426f, 0.129395f, 0.830566f, 0.132568f, 0.824707f,
+ 0.135620f, 0.818848f, 0.137817f, 0.812500f, 0.141602f, 0.806641f, 0.144165f, 0.800781f,
+ 0.147461f, 0.793945f, 0.151489f, 0.787109f, 0.154297f, 0.780273f, 0.157837f, 0.772949f,
+ 0.159668f, 0.765625f, 0.162720f, 0.758301f, 0.164673f, 0.751465f, 0.166992f, 0.743652f,
+ 0.170532f, 0.734375f, 0.172729f, 0.724609f, 0.174561f, 0.714844f, 0.176636f, 0.705078f,
+ 0.177002f, 0.694336f, 0.177856f, 0.684082f, 0.177002f, 0.671387f, 0.177124f, 0.655762f,
+ 0.177002f, 0.639648f, 0.172607f, 0.620117f, 0.168457f, 0.599121f, 0.159668f, 0.573730f,
+ 0.148071f, 0.537598f, 0.127197f, 0.482666f, 0.089905f, 0.394287f, 0.020325f, 0.162964f,
+ 0.000000f, 1.000000f, 0.005520f, 0.997070f, 0.011871f, 0.991699f, 0.017593f, 0.986328f,
+ 0.023010f, 0.980957f, 0.028946f, 0.974609f, 0.034088f, 0.969238f, 0.039368f, 0.962891f,
+ 0.044708f, 0.957031f, 0.049316f, 0.951660f, 0.054657f, 0.945312f, 0.059570f, 0.938477f,
+ 0.063782f, 0.933105f, 0.067322f, 0.928223f, 0.073242f, 0.921387f, 0.077698f, 0.915527f,
+ 0.082825f, 0.909180f, 0.086914f, 0.903809f, 0.091370f, 0.897949f, 0.096802f, 0.891113f,
+ 0.101196f, 0.885254f, 0.104492f, 0.879883f, 0.108582f, 0.874512f, 0.112061f, 0.869629f,
+ 0.117065f, 0.863281f, 0.121521f, 0.857422f, 0.125244f, 0.851562f, 0.129272f, 0.845703f,
+ 0.132446f, 0.840820f, 0.136353f, 0.835938f, 0.140015f, 0.830078f, 0.144287f, 0.823730f,
+ 0.148438f, 0.817871f, 0.152588f, 0.812012f, 0.155762f, 0.806641f, 0.159180f, 0.801270f,
+ 0.162109f, 0.795898f, 0.164062f, 0.790527f, 0.168701f, 0.782715f, 0.172241f, 0.775879f,
+ 0.175781f, 0.769531f, 0.178467f, 0.763184f, 0.181274f, 0.757324f, 0.184570f, 0.750977f,
+ 0.186768f, 0.744141f, 0.188599f, 0.737305f, 0.192139f, 0.729004f, 0.194580f, 0.720703f,
+ 0.196533f, 0.711914f, 0.198608f, 0.703613f, 0.199463f, 0.694824f, 0.200806f, 0.686035f,
+ 0.200684f, 0.676758f, 0.201172f, 0.665527f, 0.201538f, 0.652832f, 0.200684f, 0.638672f,
+ 0.198242f, 0.623535f, 0.193604f, 0.606934f, 0.187256f, 0.587402f, 0.176758f, 0.563477f,
+ 0.163208f, 0.526367f, 0.140381f, 0.476318f, 0.098877f, 0.390625f, 0.022156f, 0.161621f,
+ 0.000000f, 1.000000f, 0.008011f, 0.995605f, 0.015991f, 0.989258f, 0.024277f, 0.982422f,
+ 0.032227f, 0.974609f, 0.039429f, 0.967285f, 0.046875f, 0.958984f, 0.053802f, 0.951660f,
+ 0.059113f, 0.945312f, 0.067200f, 0.936523f, 0.072510f, 0.930176f, 0.078186f, 0.923340f,
+ 0.084900f, 0.915039f, 0.091064f, 0.907715f, 0.095947f, 0.901367f, 0.100586f, 0.895508f,
+ 0.106262f, 0.888184f, 0.112976f, 0.880371f, 0.118164f, 0.874023f, 0.122742f, 0.868164f,
+ 0.127075f, 0.862305f, 0.132446f, 0.855469f, 0.137329f, 0.848633f, 0.142456f, 0.842285f,
+ 0.146851f, 0.836426f, 0.150513f, 0.831055f, 0.154663f, 0.825684f, 0.158813f, 0.819824f,
+ 0.163452f, 0.813477f, 0.168335f, 0.807129f, 0.172119f, 0.801270f, 0.175659f, 0.795898f,
+ 0.179565f, 0.790527f, 0.182983f, 0.785645f, 0.185669f, 0.780762f, 0.190186f, 0.773926f,
+ 0.194214f, 0.768066f, 0.197632f, 0.762207f, 0.201050f, 0.755371f, 0.203735f, 0.749023f,
+ 0.206055f, 0.743652f, 0.208374f, 0.738281f, 0.210815f, 0.732422f, 0.213989f, 0.726074f,
+ 0.217773f, 0.718750f, 0.219116f, 0.710938f, 0.221558f, 0.703613f, 0.223145f, 0.696777f,
+ 0.225220f, 0.689453f, 0.226074f, 0.682129f, 0.226685f, 0.674805f, 0.226562f, 0.666992f,
+ 0.227173f, 0.656250f, 0.227661f, 0.645020f, 0.226318f, 0.633789f, 0.223999f, 0.621094f,
+ 0.220337f, 0.607910f, 0.213867f, 0.593750f, 0.205811f, 0.575684f, 0.196045f, 0.549316f,
+ 0.180542f, 0.517090f, 0.153687f, 0.469971f, 0.107910f, 0.387939f, 0.024536f, 0.161499f,
+ 0.000000f, 1.000000f, 0.013008f, 0.993164f, 0.024948f, 0.984375f, 0.035583f, 0.974609f,
+ 0.045288f, 0.965820f, 0.056854f, 0.954590f, 0.064941f, 0.945801f, 0.074707f, 0.935547f,
+ 0.083252f, 0.926270f, 0.090027f, 0.917969f, 0.099426f, 0.907715f, 0.106506f, 0.899414f,
+ 0.114075f, 0.891113f, 0.119995f, 0.883789f, 0.128662f, 0.874023f, 0.134277f, 0.866699f,
+ 0.140259f, 0.859863f, 0.144653f, 0.853516f, 0.151978f, 0.845215f, 0.158203f, 0.837402f,
+ 0.164551f, 0.830078f, 0.169189f, 0.823730f, 0.173584f, 0.817871f, 0.177246f, 0.812500f,
+ 0.183716f, 0.805176f, 0.188354f, 0.798340f, 0.192871f, 0.792480f, 0.197510f, 0.786133f,
+ 0.201416f, 0.780762f, 0.204346f, 0.775879f, 0.207886f, 0.770996f, 0.212036f, 0.765137f,
+ 0.216553f, 0.758789f, 0.220337f, 0.752930f, 0.224487f, 0.747070f, 0.227539f, 0.741699f,
+ 0.230103f, 0.736816f, 0.233154f, 0.731934f, 0.236206f, 0.727051f, 0.237305f, 0.722168f,
+ 0.240723f, 0.715332f, 0.243530f, 0.708984f, 0.245972f, 0.702637f, 0.249268f, 0.696777f,
+ 0.250977f, 0.690430f, 0.251709f, 0.685059f, 0.252686f, 0.678711f, 0.253662f, 0.673340f,
+ 0.254395f, 0.666992f, 0.254639f, 0.659668f, 0.256104f, 0.650879f, 0.256104f, 0.642090f,
+ 0.255371f, 0.633789f, 0.253906f, 0.624023f, 0.251465f, 0.615234f, 0.247437f, 0.604492f,
+ 0.241943f, 0.592773f, 0.233765f, 0.580078f, 0.227051f, 0.560059f, 0.215332f, 0.536621f,
+ 0.196411f, 0.506836f, 0.167358f, 0.463135f, 0.116577f, 0.385254f, 0.026627f, 0.160400f,
+ 0.000000f, 1.000000f, 0.020325f, 0.990234f, 0.037689f, 0.977539f, 0.054382f, 0.963379f,
+ 0.070068f, 0.948730f, 0.082825f, 0.936035f, 0.096680f, 0.922363f, 0.105896f, 0.912109f,
+ 0.119446f, 0.897949f, 0.129272f, 0.887207f, 0.137817f, 0.877441f, 0.148438f, 0.865723f,
+ 0.156494f, 0.856445f, 0.163086f, 0.848145f, 0.171021f, 0.839355f, 0.179810f, 0.829102f,
+ 0.185669f, 0.821777f, 0.192017f, 0.813965f, 0.196533f, 0.807617f, 0.202026f, 0.800781f,
+ 0.209717f, 0.791992f, 0.216187f, 0.784668f, 0.220459f, 0.777832f, 0.224854f, 0.771973f,
+ 0.229004f, 0.766113f, 0.233032f, 0.761230f, 0.236694f, 0.755371f, 0.242554f, 0.748535f,
+ 0.247070f, 0.742188f, 0.250244f, 0.736816f, 0.253418f, 0.731934f, 0.256592f, 0.727051f,
+ 0.259277f, 0.722168f, 0.261963f, 0.717773f, 0.264160f, 0.713867f, 0.267822f, 0.708496f,
+ 0.270996f, 0.702637f, 0.274170f, 0.697266f, 0.277344f, 0.691895f, 0.279053f, 0.687500f,
+ 0.280518f, 0.682129f, 0.281250f, 0.677734f, 0.281982f, 0.672852f, 0.283691f, 0.667969f,
+ 0.283936f, 0.664062f, 0.285645f, 0.658691f, 0.286377f, 0.651855f, 0.287354f, 0.645508f,
+ 0.287842f, 0.639160f, 0.288330f, 0.632812f, 0.286865f, 0.625977f, 0.285400f, 0.619141f,
+ 0.283691f, 0.612793f, 0.280273f, 0.604980f, 0.276367f, 0.597656f, 0.270752f, 0.589355f,
+ 0.265625f, 0.575684f, 0.258789f, 0.562012f, 0.249146f, 0.544434f, 0.234009f, 0.523926f,
+ 0.212524f, 0.496826f, 0.180420f, 0.457275f, 0.125854f, 0.384766f, 0.028809f, 0.160034f,
+ 0.000000f, 1.000000f, 0.036621f, 0.982910f, 0.065308f, 0.962402f, 0.089172f, 0.941895f,
+ 0.112122f, 0.920898f, 0.131836f, 0.902344f, 0.146484f, 0.887207f, 0.161621f, 0.870605f,
+ 0.175415f, 0.856445f, 0.184570f, 0.845215f, 0.197998f, 0.830566f, 0.207642f, 0.819336f,
+ 0.215698f, 0.809570f, 0.222412f, 0.801270f, 0.231323f, 0.790039f, 0.240112f, 0.780762f,
+ 0.245728f, 0.772461f, 0.250488f, 0.765625f, 0.255615f, 0.758789f, 0.261230f, 0.751953f,
+ 0.266846f, 0.744141f, 0.272705f, 0.736816f, 0.277832f, 0.730469f, 0.280762f, 0.725098f,
+ 0.285156f, 0.719238f, 0.287842f, 0.714844f, 0.290039f, 0.710449f, 0.293457f, 0.705078f,
+ 0.298340f, 0.698730f, 0.301514f, 0.693848f, 0.304199f, 0.688965f, 0.306885f, 0.684570f,
+ 0.309326f, 0.680176f, 0.311035f, 0.676270f, 0.312988f, 0.672363f, 0.313721f, 0.668945f,
+ 0.314941f, 0.665527f, 0.316162f, 0.662109f, 0.318115f, 0.658203f, 0.320557f, 0.652832f,
+ 0.322021f, 0.647949f, 0.322510f, 0.643066f, 0.322998f, 0.638672f, 0.324219f, 0.634277f,
+ 0.324463f, 0.629883f, 0.324219f, 0.625977f, 0.323730f, 0.622070f, 0.322021f, 0.617676f,
+ 0.320801f, 0.613770f, 0.319092f, 0.609375f, 0.316162f, 0.604492f, 0.313232f, 0.599609f,
+ 0.311279f, 0.591309f, 0.309082f, 0.583008f, 0.304443f, 0.574707f, 0.299072f, 0.565430f,
+ 0.291992f, 0.555664f, 0.283691f, 0.544434f, 0.269775f, 0.529785f, 0.253174f, 0.513184f,
+ 0.229248f, 0.489746f, 0.194092f, 0.453857f, 0.136475f, 0.373291f, 0.031067f, 0.160278f,
+ 0.000000f, 1.000000f, 0.077332f, 0.965332f, 0.129028f, 0.927734f, 0.164673f, 0.896973f,
+ 0.193481f, 0.869141f, 0.213257f, 0.847656f, 0.234131f, 0.825684f, 0.247192f, 0.809082f,
+ 0.260010f, 0.793457f, 0.272949f, 0.778320f, 0.282471f, 0.766113f, 0.290527f, 0.755371f,
+ 0.296875f, 0.746094f, 0.303955f, 0.735840f, 0.311768f, 0.726074f, 0.316650f, 0.718262f,
+ 0.322021f, 0.710938f, 0.326172f, 0.704102f, 0.330078f, 0.697754f, 0.333252f, 0.691895f,
+ 0.335693f, 0.687012f, 0.338135f, 0.682129f, 0.343262f, 0.675781f, 0.346436f, 0.670410f,
+ 0.349854f, 0.665039f, 0.352783f, 0.660156f, 0.354980f, 0.655762f, 0.356201f, 0.651855f,
+ 0.358398f, 0.647949f, 0.359863f, 0.644043f, 0.360840f, 0.640625f, 0.362061f, 0.637695f,
+ 0.363525f, 0.634766f, 0.363281f, 0.631836f, 0.363525f, 0.629395f, 0.364014f, 0.626465f,
+ 0.364014f, 0.624023f, 0.363770f, 0.621582f, 0.365479f, 0.618164f, 0.365723f, 0.614258f,
+ 0.366455f, 0.611328f, 0.365479f, 0.607910f, 0.365234f, 0.604004f, 0.364990f, 0.600586f,
+ 0.364014f, 0.597168f, 0.363037f, 0.593750f, 0.361816f, 0.590820f, 0.359375f, 0.586914f,
+ 0.357666f, 0.583008f, 0.354980f, 0.578613f, 0.351807f, 0.574707f, 0.347656f, 0.570312f,
+ 0.343262f, 0.565918f, 0.337891f, 0.560059f, 0.331543f, 0.554688f, 0.323975f, 0.548340f,
+ 0.314697f, 0.540527f, 0.303711f, 0.531738f, 0.288330f, 0.520020f, 0.270264f, 0.503906f,
+ 0.245972f, 0.479248f, 0.209229f, 0.440430f, 0.148438f, 0.366943f, 0.033234f, 0.160889f,
+ 0.000000f, 1.000000f, 0.124634f, 0.945312f, 0.188721f, 0.896973f, 0.229736f, 0.858887f,
+ 0.258301f, 0.828125f, 0.279541f, 0.803223f, 0.296387f, 0.782227f, 0.311035f, 0.763672f,
+ 0.322021f, 0.748047f, 0.332275f, 0.733887f, 0.339844f, 0.722168f, 0.347412f, 0.710938f,
+ 0.353516f, 0.701172f, 0.358643f, 0.692383f, 0.363770f, 0.683594f, 0.368652f, 0.675781f,
+ 0.372559f, 0.668945f, 0.376465f, 0.662598f, 0.379883f, 0.656738f, 0.382080f, 0.650879f,
+ 0.384521f, 0.645996f, 0.386719f, 0.641113f, 0.389160f, 0.636719f, 0.391846f, 0.631836f,
+ 0.394287f, 0.627441f, 0.395752f, 0.623535f, 0.397217f, 0.619629f, 0.398193f, 0.616211f,
+ 0.399414f, 0.612793f, 0.401123f, 0.608887f, 0.401611f, 0.605957f, 0.402100f, 0.603516f,
+ 0.403809f, 0.600098f, 0.403320f, 0.597656f, 0.404053f, 0.594727f, 0.404297f, 0.591797f,
+ 0.404541f, 0.589355f, 0.404297f, 0.586914f, 0.404297f, 0.584473f, 0.404541f, 0.581543f,
+ 0.404053f, 0.579102f, 0.403320f, 0.577148f, 0.401855f, 0.573730f, 0.401123f, 0.570312f,
+ 0.399658f, 0.567383f, 0.398682f, 0.564453f, 0.396729f, 0.561523f, 0.394531f, 0.558594f,
+ 0.392578f, 0.554688f, 0.390137f, 0.550781f, 0.386963f, 0.547363f, 0.382568f, 0.542969f,
+ 0.379150f, 0.538574f, 0.373535f, 0.533203f, 0.367676f, 0.526855f, 0.360840f, 0.520508f,
+ 0.352051f, 0.512695f, 0.341309f, 0.502930f, 0.327881f, 0.491211f, 0.310303f, 0.476807f,
+ 0.285156f, 0.454590f, 0.249146f, 0.420654f, 0.187378f, 0.354736f, 0.060944f, 0.163208f,
+ 0.000000f, 1.000000f, 0.125732f, 0.944824f, 0.191284f, 0.895508f, 0.233521f, 0.856445f,
+ 0.263184f, 0.825195f, 0.285645f, 0.799316f, 0.303711f, 0.777344f, 0.318848f, 0.758301f,
+ 0.329834f, 0.742676f, 0.341309f, 0.727539f, 0.349609f, 0.714355f, 0.357910f, 0.702637f,
+ 0.365234f, 0.691895f, 0.370605f, 0.682617f, 0.376709f, 0.673340f, 0.382568f, 0.665039f,
+ 0.387207f, 0.657227f, 0.390381f, 0.650879f, 0.394775f, 0.643555f, 0.398926f, 0.637207f,
+ 0.401611f, 0.631836f, 0.405029f, 0.626465f, 0.407227f, 0.621094f, 0.410889f, 0.616211f,
+ 0.413574f, 0.610840f, 0.415771f, 0.606445f, 0.418457f, 0.601562f, 0.418701f, 0.598145f,
+ 0.421631f, 0.593750f, 0.423096f, 0.589844f, 0.424561f, 0.585938f, 0.425781f, 0.583008f,
+ 0.427734f, 0.579102f, 0.428955f, 0.575684f, 0.429688f, 0.572266f, 0.431152f, 0.568848f,
+ 0.432129f, 0.565918f, 0.432617f, 0.562500f, 0.433105f, 0.559570f, 0.433838f, 0.556152f,
+ 0.434082f, 0.553223f, 0.434326f, 0.550293f, 0.434326f, 0.546387f, 0.434326f, 0.542480f,
+ 0.434326f, 0.538574f, 0.433350f, 0.535156f, 0.432861f, 0.531250f, 0.432129f, 0.527832f,
+ 0.431396f, 0.522949f, 0.429199f, 0.518555f, 0.427002f, 0.514160f, 0.424805f, 0.509277f,
+ 0.421631f, 0.503906f, 0.418701f, 0.498047f, 0.414551f, 0.491211f, 0.408936f, 0.484375f,
+ 0.401611f, 0.475586f, 0.393799f, 0.465576f, 0.382324f, 0.453125f, 0.368652f, 0.437988f,
+ 0.347168f, 0.416260f, 0.315430f, 0.383789f, 0.259033f, 0.322510f, 0.129639f, 0.150024f,
+ 0.000000f, 1.000000f, 0.126465f, 0.944824f, 0.193848f, 0.894043f, 0.237061f, 0.854492f,
+ 0.268311f, 0.822266f, 0.291748f, 0.795410f, 0.310303f, 0.772949f, 0.327148f, 0.752441f,
+ 0.339111f, 0.735352f, 0.350342f, 0.720215f, 0.360107f, 0.706543f, 0.368652f, 0.694336f,
+ 0.376953f, 0.682617f, 0.384033f, 0.671875f, 0.389893f, 0.663086f, 0.396973f, 0.653320f,
+ 0.401367f, 0.645508f, 0.405762f, 0.637695f, 0.411133f, 0.629883f, 0.417236f, 0.622559f,
+ 0.419922f, 0.616211f, 0.424072f, 0.610352f, 0.427734f, 0.604004f, 0.430908f, 0.599121f,
+ 0.434570f, 0.592773f, 0.437500f, 0.587891f, 0.440186f, 0.582520f, 0.442139f, 0.578125f,
+ 0.446289f, 0.573242f, 0.447510f, 0.568848f, 0.449219f, 0.564941f, 0.451416f, 0.560547f,
+ 0.453857f, 0.556641f, 0.454834f, 0.552734f, 0.457275f, 0.548828f, 0.458740f, 0.544922f,
+ 0.460205f, 0.541016f, 0.461914f, 0.537109f, 0.462891f, 0.533691f, 0.464111f, 0.529785f,
+ 0.465820f, 0.526367f, 0.466553f, 0.522461f, 0.467285f, 0.519043f, 0.467529f, 0.514160f,
+ 0.468262f, 0.509277f, 0.468506f, 0.504883f, 0.468506f, 0.500977f, 0.469238f, 0.496826f,
+ 0.468994f, 0.491699f, 0.468262f, 0.486328f, 0.467041f, 0.481445f, 0.466309f, 0.476318f,
+ 0.464111f, 0.469727f, 0.462158f, 0.463135f, 0.458740f, 0.455811f, 0.455322f, 0.447754f,
+ 0.450684f, 0.438721f, 0.444824f, 0.427734f, 0.437012f, 0.415039f, 0.424316f, 0.399414f,
+ 0.407227f, 0.378174f, 0.381592f, 0.346680f, 0.332275f, 0.290283f, 0.208618f, 0.136841f,
+ 0.000000f, 1.000000f, 0.127686f, 0.943848f, 0.196655f, 0.892578f, 0.240479f, 0.852539f,
+ 0.272949f, 0.819336f, 0.297607f, 0.791504f, 0.317627f, 0.767578f, 0.334229f, 0.747070f,
+ 0.348145f, 0.729004f, 0.360107f, 0.712891f, 0.370605f, 0.698242f, 0.380859f, 0.684570f,
+ 0.391357f, 0.671875f, 0.398193f, 0.660645f, 0.404297f, 0.650879f, 0.411865f, 0.640625f,
+ 0.417725f, 0.631836f, 0.422607f, 0.623535f, 0.427979f, 0.615723f, 0.433838f, 0.607910f,
+ 0.437744f, 0.601074f, 0.441650f, 0.594727f, 0.445557f, 0.588379f, 0.449219f, 0.582520f,
+ 0.454102f, 0.575684f, 0.458008f, 0.570312f, 0.460938f, 0.564453f, 0.463867f, 0.559570f,
+ 0.468018f, 0.553711f, 0.471191f, 0.548340f, 0.473877f, 0.543457f, 0.476562f, 0.539062f,
+ 0.479004f, 0.534180f, 0.481934f, 0.529297f, 0.483887f, 0.524902f, 0.485352f, 0.520996f,
+ 0.488037f, 0.516602f, 0.490479f, 0.511719f, 0.492432f, 0.507812f, 0.494873f, 0.503418f,
+ 0.496582f, 0.499268f, 0.498291f, 0.494873f, 0.499512f, 0.490723f, 0.501465f, 0.485596f,
+ 0.501953f, 0.480469f, 0.502930f, 0.475586f, 0.503906f, 0.470947f, 0.505859f, 0.465576f,
+ 0.506348f, 0.460449f, 0.506836f, 0.454346f, 0.506836f, 0.448242f, 0.505859f, 0.442627f,
+ 0.505859f, 0.435547f, 0.505371f, 0.427979f, 0.503906f, 0.420654f, 0.501953f, 0.412109f,
+ 0.498291f, 0.402100f, 0.494385f, 0.391113f, 0.487549f, 0.377686f, 0.478516f, 0.361084f,
+ 0.466064f, 0.340576f, 0.442871f, 0.310547f, 0.402588f, 0.258301f, 0.290527f, 0.122314f,
+ 0.000000f, 1.000000f, 0.127686f, 0.944336f, 0.198120f, 0.892090f, 0.244385f, 0.850098f,
+ 0.277100f, 0.816895f, 0.303711f, 0.787598f, 0.325195f, 0.762695f, 0.344238f, 0.740234f,
+ 0.357666f, 0.721680f, 0.371582f, 0.704102f, 0.383057f, 0.688965f, 0.393311f, 0.674805f,
+ 0.401367f, 0.662598f, 0.410889f, 0.650391f, 0.417725f, 0.639648f, 0.426514f, 0.628906f,
+ 0.432373f, 0.619629f, 0.438232f, 0.610352f, 0.444580f, 0.602051f, 0.451904f, 0.593262f,
+ 0.456055f, 0.585449f, 0.461182f, 0.578125f, 0.465576f, 0.571289f, 0.469727f, 0.564941f,
+ 0.474854f, 0.558105f, 0.479736f, 0.551270f, 0.482666f, 0.545410f, 0.486816f, 0.539551f,
+ 0.491211f, 0.533691f, 0.494629f, 0.527832f, 0.497559f, 0.522461f, 0.500977f, 0.517090f,
+ 0.503906f, 0.511719f, 0.507812f, 0.506348f, 0.509766f, 0.501465f, 0.512207f, 0.497314f,
+ 0.517090f, 0.491699f, 0.519531f, 0.486572f, 0.521973f, 0.481934f, 0.523926f, 0.477051f,
+ 0.526855f, 0.472168f, 0.529297f, 0.467529f, 0.531738f, 0.462646f, 0.534668f, 0.457275f,
+ 0.536133f, 0.451416f, 0.537109f, 0.446045f, 0.538574f, 0.440430f, 0.541504f, 0.434814f,
+ 0.542480f, 0.428955f, 0.543945f, 0.422607f, 0.544922f, 0.416260f, 0.545898f, 0.409424f,
+ 0.547363f, 0.402588f, 0.546387f, 0.394287f, 0.546387f, 0.385986f, 0.544922f, 0.376709f,
+ 0.544434f, 0.366699f, 0.541504f, 0.354492f, 0.537109f, 0.341309f, 0.531250f, 0.325684f,
+ 0.520996f, 0.304932f, 0.503906f, 0.276123f, 0.468750f, 0.228271f, 0.369873f, 0.107666f,
+ 0.000000f, 1.000000f, 0.128662f, 0.943848f, 0.200928f, 0.890625f, 0.248047f, 0.848145f,
+ 0.283447f, 0.812500f, 0.311523f, 0.782227f, 0.333252f, 0.756836f, 0.351074f, 0.734375f,
+ 0.367920f, 0.714355f, 0.382080f, 0.696289f, 0.393555f, 0.680664f, 0.404785f, 0.665527f,
+ 0.415039f, 0.651855f, 0.425293f, 0.639160f, 0.432861f, 0.627441f, 0.441406f, 0.616211f,
+ 0.448242f, 0.605957f, 0.455811f, 0.596191f, 0.461426f, 0.587891f, 0.468018f, 0.578613f,
+ 0.473877f, 0.570312f, 0.480225f, 0.562012f, 0.485352f, 0.554199f, 0.489258f, 0.547363f,
+ 0.494873f, 0.540527f, 0.500488f, 0.532715f, 0.504883f, 0.525879f, 0.509766f, 0.519531f,
+ 0.513672f, 0.513184f, 0.518066f, 0.506836f, 0.522461f, 0.500977f, 0.524902f, 0.495361f,
+ 0.529785f, 0.489258f, 0.533203f, 0.483643f, 0.537598f, 0.477783f, 0.540039f, 0.472656f,
+ 0.543945f, 0.467041f, 0.546875f, 0.461670f, 0.550781f, 0.456055f, 0.553711f, 0.450928f,
+ 0.556641f, 0.445557f, 0.560059f, 0.439941f, 0.562988f, 0.434570f, 0.565918f, 0.428955f,
+ 0.569336f, 0.423096f, 0.569824f, 0.416992f, 0.573242f, 0.410645f, 0.576172f, 0.404297f,
+ 0.577637f, 0.397949f, 0.580078f, 0.391846f, 0.581543f, 0.384766f, 0.582520f, 0.377441f,
+ 0.585938f, 0.369385f, 0.585449f, 0.361572f, 0.586914f, 0.352783f, 0.586914f, 0.343506f,
+ 0.587891f, 0.333008f, 0.585938f, 0.320557f, 0.583984f, 0.307617f, 0.578613f, 0.291504f,
+ 0.571777f, 0.271729f, 0.557129f, 0.243896f, 0.527832f, 0.199463f, 0.445557f, 0.093689f,
+ 0.000000f, 1.000000f, 0.129517f, 0.943359f, 0.203003f, 0.889648f, 0.252930f, 0.845215f,
+ 0.290039f, 0.808105f, 0.318115f, 0.777832f, 0.339844f, 0.751953f, 0.360107f, 0.728516f,
+ 0.377197f, 0.707520f, 0.392090f, 0.688477f, 0.405518f, 0.671387f, 0.417725f, 0.655762f,
+ 0.428223f, 0.641602f, 0.437988f, 0.628418f, 0.446533f, 0.616211f, 0.456543f, 0.604004f,
+ 0.464355f, 0.592773f, 0.472656f, 0.582031f, 0.478271f, 0.573242f, 0.487305f, 0.562988f,
+ 0.492188f, 0.554199f, 0.499268f, 0.545410f, 0.504883f, 0.537109f, 0.509766f, 0.529785f,
+ 0.515625f, 0.521973f, 0.521973f, 0.514160f, 0.526367f, 0.506836f, 0.531738f, 0.500000f,
+ 0.536133f, 0.492676f, 0.542480f, 0.485840f, 0.545898f, 0.479492f, 0.550293f, 0.473145f,
+ 0.554688f, 0.466797f, 0.558594f, 0.460693f, 0.563477f, 0.454346f, 0.566406f, 0.448730f,
+ 0.571777f, 0.442383f, 0.574219f, 0.436768f, 0.578613f, 0.430664f, 0.582031f, 0.424805f,
+ 0.585938f, 0.419189f, 0.590332f, 0.413086f, 0.593262f, 0.406982f, 0.596680f, 0.401367f,
+ 0.600098f, 0.395264f, 0.602539f, 0.388916f, 0.605469f, 0.381836f, 0.609375f, 0.375000f,
+ 0.611816f, 0.368408f, 0.614258f, 0.361572f, 0.617188f, 0.354736f, 0.619629f, 0.346436f,
+ 0.622559f, 0.338379f, 0.624512f, 0.330566f, 0.624512f, 0.321045f, 0.626465f, 0.311768f,
+ 0.626953f, 0.300537f, 0.626953f, 0.288818f, 0.626465f, 0.275391f, 0.623047f, 0.260254f,
+ 0.617188f, 0.240234f, 0.606934f, 0.214233f, 0.584473f, 0.173584f, 0.513672f, 0.080017f,
+ 0.000000f, 1.000000f, 0.130615f, 0.942871f, 0.206787f, 0.887207f, 0.257568f, 0.842285f,
+ 0.295166f, 0.805176f, 0.323975f, 0.773926f, 0.347656f, 0.746582f, 0.368896f, 0.722168f,
+ 0.387939f, 0.699707f, 0.403320f, 0.680176f, 0.417236f, 0.662598f, 0.428955f, 0.646484f,
+ 0.442139f, 0.630859f, 0.452393f, 0.617188f, 0.461670f, 0.603516f, 0.471191f, 0.591309f,
+ 0.480713f, 0.579590f, 0.488525f, 0.568359f, 0.495361f, 0.558594f, 0.503906f, 0.547852f,
+ 0.512207f, 0.538086f, 0.518066f, 0.529297f, 0.524414f, 0.520020f, 0.530273f, 0.511719f,
+ 0.535645f, 0.503906f, 0.541992f, 0.495850f, 0.548340f, 0.488037f, 0.553223f, 0.480225f,
+ 0.559082f, 0.472412f, 0.564941f, 0.465088f, 0.569336f, 0.458008f, 0.574219f, 0.451660f,
+ 0.580566f, 0.444092f, 0.583008f, 0.437988f, 0.588867f, 0.431152f, 0.592773f, 0.424805f,
+ 0.597168f, 0.418701f, 0.602539f, 0.411865f, 0.605469f, 0.405762f, 0.609375f, 0.399658f,
+ 0.614258f, 0.393311f, 0.618164f, 0.386719f, 0.622559f, 0.380615f, 0.626953f, 0.374268f,
+ 0.630371f, 0.367920f, 0.633301f, 0.361816f, 0.637695f, 0.353760f, 0.641113f, 0.346924f,
+ 0.643555f, 0.339844f, 0.647461f, 0.332520f, 0.650879f, 0.325684f, 0.652832f, 0.317627f,
+ 0.656250f, 0.308838f, 0.658691f, 0.300537f, 0.660156f, 0.291504f, 0.663086f, 0.281738f,
+ 0.665039f, 0.270996f, 0.666016f, 0.260010f, 0.665527f, 0.246460f, 0.664062f, 0.231323f,
+ 0.660645f, 0.212646f, 0.651855f, 0.188354f, 0.633301f, 0.151489f, 0.574219f, 0.069397f,
+ 0.000000f, 1.000000f, 0.132568f, 0.941895f, 0.209839f, 0.885742f, 0.261719f, 0.840332f,
+ 0.300293f, 0.802246f, 0.330322f, 0.769531f, 0.357178f, 0.740234f, 0.378174f, 0.715332f,
+ 0.396729f, 0.692871f, 0.414307f, 0.671875f, 0.429688f, 0.653320f, 0.442139f, 0.636230f,
+ 0.454590f, 0.620605f, 0.466064f, 0.605469f, 0.477295f, 0.591309f, 0.487305f, 0.578613f,
+ 0.496338f, 0.565918f, 0.505371f, 0.554199f, 0.512695f, 0.543457f, 0.521484f, 0.533203f,
+ 0.529297f, 0.521973f, 0.536133f, 0.512695f, 0.543457f, 0.503418f, 0.549805f, 0.494385f,
+ 0.556152f, 0.485840f, 0.562012f, 0.477539f, 0.568848f, 0.468750f, 0.575684f, 0.460449f,
+ 0.582031f, 0.452393f, 0.586914f, 0.444580f, 0.592773f, 0.437256f, 0.598145f, 0.429932f,
+ 0.603516f, 0.422363f, 0.609375f, 0.415283f, 0.613770f, 0.408447f, 0.618164f, 0.401611f,
+ 0.622559f, 0.395020f, 0.627930f, 0.387695f, 0.632812f, 0.381104f, 0.636719f, 0.375000f,
+ 0.641602f, 0.368164f, 0.646484f, 0.361328f, 0.650391f, 0.354736f, 0.653809f, 0.348633f,
+ 0.659180f, 0.341553f, 0.663086f, 0.335205f, 0.667480f, 0.327393f, 0.670410f, 0.320312f,
+ 0.674316f, 0.312744f, 0.677734f, 0.305420f, 0.681152f, 0.297852f, 0.685547f, 0.290283f,
+ 0.687988f, 0.281494f, 0.690918f, 0.272705f, 0.694824f, 0.264160f, 0.696777f, 0.254150f,
+ 0.698242f, 0.244019f, 0.699707f, 0.232178f, 0.699707f, 0.219727f, 0.700684f, 0.204956f,
+ 0.698730f, 0.187744f, 0.692383f, 0.165527f, 0.677734f, 0.130981f, 0.627441f, 0.059204f,
+ 0.000000f, 1.000000f, 0.133301f, 0.941895f, 0.213013f, 0.883789f, 0.265381f, 0.837891f,
+ 0.305420f, 0.798828f, 0.337158f, 0.765137f, 0.364990f, 0.734863f, 0.386475f, 0.708984f,
+ 0.406006f, 0.685547f, 0.424072f, 0.664062f, 0.439941f, 0.644531f, 0.454590f, 0.626465f,
+ 0.468506f, 0.609375f, 0.479492f, 0.594238f, 0.492188f, 0.579102f, 0.501465f, 0.565918f,
+ 0.511719f, 0.552734f, 0.522461f, 0.540039f, 0.531738f, 0.528320f, 0.538574f, 0.517578f,
+ 0.547363f, 0.506348f, 0.554199f, 0.496338f, 0.563477f, 0.485840f, 0.570312f, 0.476807f,
+ 0.576660f, 0.467529f, 0.583496f, 0.458740f, 0.590332f, 0.449951f, 0.596680f, 0.441406f,
+ 0.603516f, 0.432373f, 0.608887f, 0.424316f, 0.615723f, 0.416260f, 0.621094f, 0.408691f,
+ 0.627441f, 0.400879f, 0.632324f, 0.393311f, 0.637695f, 0.386230f, 0.642090f, 0.379150f,
+ 0.648926f, 0.371338f, 0.652344f, 0.364746f, 0.657715f, 0.357666f, 0.662109f, 0.350830f,
+ 0.668457f, 0.343750f, 0.672363f, 0.336914f, 0.677246f, 0.330078f, 0.681152f, 0.323486f,
+ 0.685547f, 0.316650f, 0.690918f, 0.309570f, 0.694824f, 0.302734f, 0.698730f, 0.294678f,
+ 0.702148f, 0.287109f, 0.705566f, 0.279785f, 0.709961f, 0.271973f, 0.714844f, 0.264404f,
+ 0.716797f, 0.256348f, 0.721191f, 0.247192f, 0.724121f, 0.238525f, 0.727539f, 0.229248f,
+ 0.729004f, 0.218506f, 0.731445f, 0.207642f, 0.733887f, 0.196533f, 0.733887f, 0.181641f,
+ 0.732910f, 0.165039f, 0.727539f, 0.144409f, 0.716797f, 0.114136f, 0.676758f, 0.050964f,
+ 0.000000f, 1.000000f, 0.134399f, 0.941406f, 0.215210f, 0.882812f, 0.270264f, 0.835449f,
+ 0.312256f, 0.794434f, 0.344238f, 0.760254f, 0.372803f, 0.729492f, 0.396240f, 0.702637f,
+ 0.416748f, 0.677734f, 0.435303f, 0.655762f, 0.451660f, 0.635254f, 0.467529f, 0.616211f,
+ 0.480713f, 0.599121f, 0.493896f, 0.582520f, 0.506348f, 0.566895f, 0.517578f, 0.552734f,
+ 0.526855f, 0.539551f, 0.537598f, 0.526367f, 0.547852f, 0.513672f, 0.555664f, 0.502441f,
+ 0.564941f, 0.490723f, 0.573242f, 0.479980f, 0.581543f, 0.469238f, 0.588867f, 0.459229f,
+ 0.596191f, 0.449707f, 0.603516f, 0.440430f, 0.609863f, 0.431396f, 0.617676f, 0.422363f,
+ 0.625000f, 0.412842f, 0.631348f, 0.404541f, 0.637207f, 0.395996f, 0.644043f, 0.387695f,
+ 0.648926f, 0.380127f, 0.655273f, 0.371826f, 0.660156f, 0.364746f, 0.666016f, 0.356934f,
+ 0.671875f, 0.349365f, 0.677734f, 0.342041f, 0.681152f, 0.334961f, 0.686523f, 0.327881f,
+ 0.692871f, 0.320801f, 0.697266f, 0.313477f, 0.701660f, 0.306396f, 0.707031f, 0.299805f,
+ 0.710938f, 0.292725f, 0.716309f, 0.285400f, 0.721191f, 0.278564f, 0.725586f, 0.271240f,
+ 0.729004f, 0.263428f, 0.732910f, 0.255859f, 0.737305f, 0.247803f, 0.741211f, 0.240356f,
+ 0.745117f, 0.232300f, 0.748047f, 0.224121f, 0.751953f, 0.214844f, 0.756348f, 0.205933f,
+ 0.756836f, 0.196167f, 0.760254f, 0.185547f, 0.762207f, 0.174072f, 0.762695f, 0.160645f,
+ 0.762207f, 0.145752f, 0.759277f, 0.127075f, 0.750977f, 0.098389f, 0.716797f, 0.042633f,
+ 0.000000f, 1.000000f, 0.136841f, 0.939941f, 0.216919f, 0.882324f, 0.274414f, 0.832520f,
+ 0.317383f, 0.791016f, 0.353027f, 0.754883f, 0.380127f, 0.724121f, 0.405273f, 0.695801f,
+ 0.426758f, 0.670410f, 0.447021f, 0.646973f, 0.463867f, 0.625977f, 0.479980f, 0.606445f,
+ 0.494385f, 0.587891f, 0.507812f, 0.570801f, 0.521973f, 0.554688f, 0.532715f, 0.540039f,
+ 0.542480f, 0.525879f, 0.554688f, 0.511719f, 0.564453f, 0.499023f, 0.573730f, 0.486816f,
+ 0.583008f, 0.475098f, 0.591309f, 0.463623f, 0.600098f, 0.452393f, 0.609375f, 0.441650f,
+ 0.616211f, 0.432129f, 0.624023f, 0.422119f, 0.630371f, 0.412842f, 0.636719f, 0.403809f,
+ 0.645996f, 0.393799f, 0.651855f, 0.384766f, 0.659180f, 0.375977f, 0.665039f, 0.367920f,
+ 0.670898f, 0.359131f, 0.677246f, 0.351074f, 0.682617f, 0.343506f, 0.688965f, 0.335693f,
+ 0.694336f, 0.327881f, 0.700684f, 0.320312f, 0.704102f, 0.313232f, 0.709961f, 0.305908f,
+ 0.716309f, 0.298340f, 0.720703f, 0.291260f, 0.726074f, 0.283936f, 0.730469f, 0.277344f,
+ 0.734863f, 0.270264f, 0.740234f, 0.262939f, 0.745117f, 0.255859f, 0.749023f, 0.249268f,
+ 0.753418f, 0.241333f, 0.757812f, 0.233398f, 0.760742f, 0.225952f, 0.766113f, 0.218140f,
+ 0.769531f, 0.210449f, 0.773926f, 0.202759f, 0.775391f, 0.193970f, 0.780273f, 0.184814f,
+ 0.783691f, 0.175537f, 0.785156f, 0.165771f, 0.787598f, 0.154907f, 0.789551f, 0.142700f,
+ 0.790039f, 0.128906f, 0.788086f, 0.110474f, 0.780273f, 0.086975f, 0.752930f, 0.036133f,
+ 0.000000f, 1.000000f, 0.138306f, 0.939453f, 0.219360f, 0.881348f, 0.279053f, 0.830078f,
+ 0.323486f, 0.787598f, 0.359863f, 0.750488f, 0.389893f, 0.717285f, 0.415039f, 0.688965f,
+ 0.438232f, 0.662109f, 0.457275f, 0.638672f, 0.475098f, 0.616699f, 0.492676f, 0.596191f,
+ 0.508301f, 0.577148f, 0.522949f, 0.559082f, 0.536133f, 0.542480f, 0.546875f, 0.526855f,
+ 0.559570f, 0.512207f, 0.569824f, 0.498535f, 0.581543f, 0.484131f, 0.592285f, 0.471436f,
+ 0.601562f, 0.459229f, 0.609863f, 0.447510f, 0.619629f, 0.435791f, 0.627930f, 0.424805f,
+ 0.635254f, 0.414795f, 0.642578f, 0.404297f, 0.650879f, 0.394287f, 0.656250f, 0.385498f,
+ 0.665039f, 0.375244f, 0.672852f, 0.365723f, 0.679199f, 0.357178f, 0.686035f, 0.348145f,
+ 0.692383f, 0.339355f, 0.698242f, 0.331299f, 0.703613f, 0.323242f, 0.709961f, 0.315430f,
+ 0.716797f, 0.307129f, 0.721191f, 0.299805f, 0.726074f, 0.292236f, 0.733398f, 0.284668f,
+ 0.736328f, 0.277588f, 0.742676f, 0.270020f, 0.748047f, 0.262939f, 0.751465f, 0.256348f,
+ 0.757324f, 0.249023f, 0.763672f, 0.241333f, 0.766113f, 0.235352f, 0.771484f, 0.228027f,
+ 0.776855f, 0.221191f, 0.778809f, 0.213257f, 0.783691f, 0.205322f, 0.787598f, 0.197876f,
+ 0.792480f, 0.190186f, 0.796387f, 0.182739f, 0.798828f, 0.174805f, 0.803223f, 0.165405f,
+ 0.805664f, 0.157227f, 0.809082f, 0.147827f, 0.811035f, 0.137695f, 0.813477f, 0.125977f,
+ 0.813477f, 0.113586f, 0.812012f, 0.096863f, 0.805664f, 0.073975f, 0.784668f, 0.031372f,
+ 0.000000f, 1.000000f, 0.138794f, 0.939453f, 0.224365f, 0.878418f, 0.282959f, 0.827637f,
+ 0.329102f, 0.783691f, 0.366699f, 0.745605f, 0.397461f, 0.712402f, 0.424316f, 0.682129f,
+ 0.447510f, 0.654785f, 0.470459f, 0.629395f, 0.489014f, 0.606934f, 0.505859f, 0.585938f,
+ 0.521484f, 0.565918f, 0.536133f, 0.547363f, 0.550293f, 0.530273f, 0.563477f, 0.513672f,
+ 0.575684f, 0.498535f, 0.585938f, 0.484619f, 0.598145f, 0.469727f, 0.607910f, 0.456787f,
+ 0.617676f, 0.443848f, 0.626465f, 0.431885f, 0.637207f, 0.419434f, 0.645508f, 0.408203f,
+ 0.654785f, 0.397461f, 0.660645f, 0.386963f, 0.669434f, 0.376709f, 0.675781f, 0.367432f,
+ 0.684570f, 0.357422f, 0.691406f, 0.347412f, 0.698730f, 0.338623f, 0.705566f, 0.329346f,
+ 0.712402f, 0.320312f, 0.718262f, 0.312012f, 0.723633f, 0.303955f, 0.730469f, 0.295654f,
+ 0.736328f, 0.287842f, 0.742676f, 0.279785f, 0.746094f, 0.272705f, 0.752930f, 0.264893f,
+ 0.757812f, 0.257812f, 0.763184f, 0.250000f, 0.769043f, 0.243286f, 0.772949f, 0.236450f,
+ 0.778809f, 0.229004f, 0.783691f, 0.222168f, 0.787598f, 0.215210f, 0.791016f, 0.208862f,
+ 0.797852f, 0.201538f, 0.801270f, 0.194458f, 0.804199f, 0.186890f, 0.809570f, 0.179443f,
+ 0.812012f, 0.172485f, 0.816895f, 0.164429f, 0.820801f, 0.156982f, 0.823242f, 0.148804f,
+ 0.826172f, 0.140747f, 0.829590f, 0.131836f, 0.832031f, 0.121643f, 0.833984f, 0.111877f,
+ 0.834473f, 0.100220f, 0.833008f, 0.084961f, 0.828613f, 0.065186f, 0.809570f, 0.026352f,
+ 0.000000f, 1.000000f, 0.140015f, 0.938965f, 0.226318f, 0.877441f, 0.288818f, 0.824219f,
+ 0.335449f, 0.779785f, 0.373779f, 0.741211f, 0.406006f, 0.706543f, 0.435059f, 0.674805f,
+ 0.458740f, 0.646973f, 0.481445f, 0.620605f, 0.500000f, 0.597656f, 0.517578f, 0.575684f,
+ 0.535156f, 0.554688f, 0.550781f, 0.535645f, 0.563965f, 0.518066f, 0.577637f, 0.500977f,
+ 0.589844f, 0.485352f, 0.602051f, 0.470459f, 0.613770f, 0.455566f, 0.623535f, 0.441895f,
+ 0.634277f, 0.428467f, 0.643555f, 0.416260f, 0.654297f, 0.403809f, 0.663086f, 0.391846f,
+ 0.671875f, 0.380615f, 0.681152f, 0.369629f, 0.686523f, 0.359619f, 0.695312f, 0.349854f,
+ 0.701172f, 0.340088f, 0.710449f, 0.329834f, 0.717773f, 0.320557f, 0.724121f, 0.311523f,
+ 0.730957f, 0.302246f, 0.737305f, 0.293945f, 0.743164f, 0.285645f, 0.749512f, 0.277100f,
+ 0.754883f, 0.269287f, 0.761230f, 0.261230f, 0.766113f, 0.254150f, 0.771973f, 0.246216f,
+ 0.777832f, 0.238770f, 0.782715f, 0.231812f, 0.787109f, 0.224731f, 0.792480f, 0.217773f,
+ 0.797852f, 0.210693f, 0.801758f, 0.203735f, 0.807617f, 0.197021f, 0.811035f, 0.190674f,
+ 0.815430f, 0.183716f, 0.820801f, 0.176880f, 0.823730f, 0.170044f, 0.827148f, 0.162720f,
+ 0.830566f, 0.155273f, 0.834961f, 0.148071f, 0.839355f, 0.141113f, 0.842285f, 0.134399f,
+ 0.845215f, 0.125366f, 0.848633f, 0.117004f, 0.850098f, 0.108765f, 0.852051f, 0.099304f,
+ 0.853516f, 0.087769f, 0.853516f, 0.074890f, 0.850098f, 0.056458f, 0.834473f, 0.023911f,
+ 0.000000f, 1.000000f, 0.141235f, 0.938477f, 0.229614f, 0.875977f, 0.292725f, 0.822266f,
+ 0.341797f, 0.775879f, 0.381836f, 0.735840f, 0.414062f, 0.700195f, 0.444092f, 0.667969f,
+ 0.468994f, 0.638672f, 0.492432f, 0.612305f, 0.512207f, 0.587891f, 0.530762f, 0.565430f,
+ 0.548828f, 0.543945f, 0.563965f, 0.524414f, 0.578613f, 0.505859f, 0.592285f, 0.488525f,
+ 0.605957f, 0.471924f, 0.618164f, 0.456299f, 0.630371f, 0.441406f, 0.640625f, 0.427002f,
+ 0.652344f, 0.413086f, 0.662109f, 0.400635f, 0.670410f, 0.388428f, 0.680176f, 0.375977f,
+ 0.688477f, 0.364990f, 0.697266f, 0.353271f, 0.705566f, 0.342773f, 0.712891f, 0.332764f,
+ 0.719727f, 0.322998f, 0.728027f, 0.312988f, 0.734863f, 0.303711f, 0.742188f, 0.293945f,
+ 0.749023f, 0.284912f, 0.755859f, 0.276123f, 0.761230f, 0.267822f, 0.768066f, 0.259277f,
+ 0.772461f, 0.251709f, 0.779297f, 0.243652f, 0.785156f, 0.236206f, 0.789551f, 0.228882f,
+ 0.795410f, 0.221191f, 0.799805f, 0.214355f, 0.804688f, 0.207520f, 0.810059f, 0.200317f,
+ 0.815430f, 0.193604f, 0.819336f, 0.186646f, 0.823242f, 0.180542f, 0.828613f, 0.173828f,
+ 0.833496f, 0.166992f, 0.837891f, 0.160889f, 0.841309f, 0.154663f, 0.845703f, 0.147705f,
+ 0.847656f, 0.140381f, 0.852051f, 0.133301f, 0.854980f, 0.126831f, 0.858398f, 0.120117f,
+ 0.861328f, 0.112610f, 0.864258f, 0.104553f, 0.867676f, 0.096863f, 0.868652f, 0.087402f,
+ 0.870117f, 0.078186f, 0.869141f, 0.066406f, 0.868652f, 0.049530f, 0.854004f, 0.019684f,
+ 0.000000f, 1.000000f, 0.141724f, 0.938477f, 0.232910f, 0.874023f, 0.298096f, 0.819336f,
+ 0.347656f, 0.771973f, 0.388184f, 0.730957f, 0.423340f, 0.694336f, 0.453613f, 0.660645f,
+ 0.479492f, 0.630859f, 0.503906f, 0.603516f, 0.524902f, 0.578125f, 0.543457f, 0.554688f,
+ 0.562500f, 0.532715f, 0.577148f, 0.513184f, 0.592773f, 0.493896f, 0.607910f, 0.475586f,
+ 0.621094f, 0.458496f, 0.633301f, 0.442871f, 0.644043f, 0.427979f, 0.656250f, 0.413086f,
+ 0.667480f, 0.398682f, 0.677734f, 0.385498f, 0.687988f, 0.373047f, 0.696777f, 0.360596f,
+ 0.704590f, 0.349121f, 0.714355f, 0.337158f, 0.721680f, 0.326660f, 0.729980f, 0.316406f,
+ 0.737793f, 0.306152f, 0.743652f, 0.297119f, 0.751953f, 0.287109f, 0.759277f, 0.277588f,
+ 0.766113f, 0.268311f, 0.770996f, 0.260010f, 0.778809f, 0.250977f, 0.784180f, 0.242920f,
+ 0.790039f, 0.234985f, 0.794922f, 0.227539f, 0.802734f, 0.219360f, 0.806152f, 0.212280f,
+ 0.812012f, 0.204956f, 0.816895f, 0.197998f, 0.820801f, 0.191406f, 0.826660f, 0.184082f,
+ 0.830078f, 0.177979f, 0.835938f, 0.171021f, 0.839844f, 0.164917f, 0.844238f, 0.158569f,
+ 0.849121f, 0.152100f, 0.853516f, 0.145996f, 0.856445f, 0.140381f, 0.861816f, 0.133911f,
+ 0.863770f, 0.126953f, 0.866699f, 0.120483f, 0.870605f, 0.114136f, 0.874023f, 0.107361f,
+ 0.876953f, 0.100830f, 0.878418f, 0.093567f, 0.882324f, 0.085754f, 0.884277f, 0.078369f,
+ 0.885254f, 0.068787f, 0.887207f, 0.057587f, 0.884277f, 0.043793f, 0.875000f, 0.016937f,
+ 0.000000f, 1.000000f, 0.143066f, 0.937500f, 0.235352f, 0.872559f, 0.302002f, 0.816895f,
+ 0.354004f, 0.768066f, 0.395996f, 0.726074f, 0.432373f, 0.687500f, 0.463623f, 0.653809f,
+ 0.490479f, 0.622559f, 0.514648f, 0.594727f, 0.535645f, 0.569336f, 0.557617f, 0.544434f,
+ 0.575195f, 0.522461f, 0.591309f, 0.501465f, 0.606445f, 0.481934f, 0.621582f, 0.463379f,
+ 0.635254f, 0.446289f, 0.647461f, 0.429443f, 0.660156f, 0.413818f, 0.672363f, 0.398682f,
+ 0.684082f, 0.384033f, 0.693359f, 0.370850f, 0.704102f, 0.357910f, 0.712891f, 0.345703f,
+ 0.721680f, 0.333984f, 0.729492f, 0.322021f, 0.737305f, 0.311279f, 0.746094f, 0.300537f,
+ 0.754883f, 0.290283f, 0.760254f, 0.281006f, 0.766602f, 0.271973f, 0.774414f, 0.261963f,
+ 0.783203f, 0.252197f, 0.788086f, 0.244141f, 0.794434f, 0.235596f, 0.801758f, 0.226685f,
+ 0.806152f, 0.219482f, 0.811523f, 0.211548f, 0.818359f, 0.203857f, 0.821777f, 0.196899f,
+ 0.828125f, 0.189697f, 0.832031f, 0.182861f, 0.835938f, 0.176270f, 0.841309f, 0.169434f,
+ 0.846191f, 0.162964f, 0.850098f, 0.157104f, 0.854980f, 0.150269f, 0.858887f, 0.144409f,
+ 0.863281f, 0.138428f, 0.866699f, 0.132812f, 0.870605f, 0.126953f, 0.875000f, 0.120972f,
+ 0.878418f, 0.115234f, 0.879883f, 0.109131f, 0.883789f, 0.102234f, 0.886719f, 0.096008f,
+ 0.890137f, 0.089905f, 0.894043f, 0.084045f, 0.895996f, 0.076233f, 0.897461f, 0.068970f,
+ 0.899414f, 0.060028f, 0.899902f, 0.050995f, 0.898438f, 0.037994f, 0.891602f, 0.014374f,
+ 0.000000f, 1.000000f, 0.145142f, 0.936523f, 0.239258f, 0.870605f, 0.307861f, 0.813477f,
+ 0.360352f, 0.764160f, 0.404053f, 0.720703f, 0.441650f, 0.681641f, 0.473877f, 0.646484f,
+ 0.500977f, 0.615234f, 0.526367f, 0.585449f, 0.548828f, 0.559082f, 0.568848f, 0.534668f,
+ 0.587402f, 0.511719f, 0.604980f, 0.489990f, 0.621582f, 0.469971f, 0.636230f, 0.450684f,
+ 0.649414f, 0.433594f, 0.662109f, 0.416260f, 0.675293f, 0.400391f, 0.686035f, 0.385498f,
+ 0.698730f, 0.370361f, 0.708496f, 0.356689f, 0.717773f, 0.343994f, 0.728027f, 0.331299f,
+ 0.737305f, 0.319092f, 0.746094f, 0.307373f, 0.753906f, 0.296143f, 0.762207f, 0.285400f,
+ 0.769531f, 0.275146f, 0.776367f, 0.265625f, 0.782715f, 0.256592f, 0.790527f, 0.247070f,
+ 0.796387f, 0.238159f, 0.803711f, 0.229004f, 0.809082f, 0.220825f, 0.814941f, 0.212280f,
+ 0.820801f, 0.204590f, 0.825684f, 0.197144f, 0.832031f, 0.189453f, 0.836426f, 0.182373f,
+ 0.841309f, 0.175903f, 0.846191f, 0.168701f, 0.851074f, 0.162109f, 0.854980f, 0.155762f,
+ 0.859863f, 0.149414f, 0.863281f, 0.143677f, 0.867676f, 0.137329f, 0.872070f, 0.131592f,
+ 0.875000f, 0.126221f, 0.881348f, 0.119995f, 0.882812f, 0.114868f, 0.887695f, 0.109253f,
+ 0.890625f, 0.104370f, 0.894531f, 0.097961f, 0.895996f, 0.091980f, 0.898926f, 0.086060f,
+ 0.902344f, 0.080261f, 0.905762f, 0.074219f, 0.908203f, 0.067993f, 0.908691f, 0.061157f,
+ 0.912598f, 0.053375f, 0.913574f, 0.045044f, 0.911133f, 0.033325f, 0.904785f, 0.012718f,
+ 0.000000f, 1.000000f, 0.146484f, 0.936035f, 0.240601f, 0.870117f, 0.311035f, 0.811523f,
+ 0.367188f, 0.760254f, 0.412109f, 0.715332f, 0.448975f, 0.675781f, 0.483398f, 0.639160f,
+ 0.511230f, 0.606934f, 0.537109f, 0.577148f, 0.560059f, 0.549805f, 0.581055f, 0.524414f,
+ 0.601562f, 0.500488f, 0.619141f, 0.478760f, 0.635254f, 0.458008f, 0.650879f, 0.438232f,
+ 0.664062f, 0.420654f, 0.677246f, 0.403320f, 0.689453f, 0.387207f, 0.700684f, 0.372070f,
+ 0.712891f, 0.357422f, 0.722168f, 0.343018f, 0.733398f, 0.329590f, 0.742188f, 0.317139f,
+ 0.750488f, 0.305420f, 0.760742f, 0.292969f, 0.769531f, 0.281738f, 0.775391f, 0.271729f,
+ 0.783203f, 0.260742f, 0.791016f, 0.251221f, 0.797852f, 0.241943f, 0.804199f, 0.232910f,
+ 0.810059f, 0.224365f, 0.817383f, 0.215088f, 0.823242f, 0.206787f, 0.829102f, 0.198486f,
+ 0.834473f, 0.190796f, 0.840332f, 0.183350f, 0.845703f, 0.175781f, 0.850586f, 0.168945f,
+ 0.854980f, 0.162476f, 0.860352f, 0.155151f, 0.863770f, 0.149170f, 0.867676f, 0.143433f,
+ 0.874023f, 0.136719f, 0.875977f, 0.131104f, 0.880859f, 0.125244f, 0.883789f, 0.120178f,
+ 0.888672f, 0.114197f, 0.892090f, 0.108887f, 0.895996f, 0.103577f, 0.898438f, 0.098999f,
+ 0.902832f, 0.093079f, 0.905273f, 0.088623f, 0.907715f, 0.083313f, 0.910645f, 0.077087f,
+ 0.913574f, 0.071411f, 0.915527f, 0.066528f, 0.919922f, 0.059998f, 0.918945f, 0.054810f,
+ 0.921875f, 0.047058f, 0.922363f, 0.039581f, 0.922852f, 0.028900f, 0.917480f, 0.011467f,
+ 0.000000f, 1.000000f, 0.146973f, 0.936035f, 0.245117f, 0.867676f, 0.316650f, 0.808594f,
+ 0.372559f, 0.756348f, 0.419434f, 0.710449f, 0.458740f, 0.669434f, 0.492676f, 0.632324f,
+ 0.522461f, 0.598633f, 0.549316f, 0.567871f, 0.573242f, 0.539551f, 0.594727f, 0.513672f,
+ 0.613770f, 0.489990f, 0.631836f, 0.467529f, 0.648438f, 0.446533f, 0.664062f, 0.427002f,
+ 0.677734f, 0.408447f, 0.690918f, 0.391357f, 0.703125f, 0.374512f, 0.714844f, 0.358887f,
+ 0.726562f, 0.343994f, 0.737305f, 0.329590f, 0.747070f, 0.316162f, 0.757324f, 0.303467f,
+ 0.765137f, 0.291748f, 0.774414f, 0.279541f, 0.783203f, 0.268311f, 0.791016f, 0.257568f,
+ 0.797852f, 0.247192f, 0.804688f, 0.237915f, 0.812500f, 0.227905f, 0.817871f, 0.219360f,
+ 0.822266f, 0.211304f, 0.831055f, 0.201904f, 0.835938f, 0.193970f, 0.841309f, 0.185913f,
+ 0.848145f, 0.177734f, 0.852539f, 0.170654f, 0.857422f, 0.163208f, 0.862305f, 0.156738f,
+ 0.866699f, 0.150024f, 0.872070f, 0.143311f, 0.875488f, 0.137451f, 0.880859f, 0.131226f,
+ 0.884766f, 0.125244f, 0.887695f, 0.119751f, 0.891113f, 0.114868f, 0.895996f, 0.108765f,
+ 0.898926f, 0.103760f, 0.902344f, 0.098755f, 0.906250f, 0.093750f, 0.910645f, 0.088501f,
+ 0.912109f, 0.084106f, 0.916016f, 0.079773f, 0.919434f, 0.074585f, 0.920410f, 0.069763f,
+ 0.923340f, 0.063965f, 0.926270f, 0.058655f, 0.927734f, 0.053741f, 0.930664f, 0.048218f,
+ 0.931641f, 0.041534f, 0.933105f, 0.034637f, 0.932129f, 0.025131f, 0.928711f, 0.010117f,
+ 0.000000f, 1.000000f, 0.148193f, 0.935547f, 0.248779f, 0.865723f, 0.322021f, 0.805176f,
+ 0.379150f, 0.752441f, 0.427734f, 0.705078f, 0.469238f, 0.662598f, 0.503418f, 0.625000f,
+ 0.534180f, 0.590820f, 0.561035f, 0.559570f, 0.585449f, 0.530273f, 0.606445f, 0.503906f,
+ 0.626465f, 0.479492f, 0.644531f, 0.456543f, 0.663574f, 0.434326f, 0.677246f, 0.415039f,
+ 0.690430f, 0.396484f, 0.704590f, 0.378662f, 0.717285f, 0.362061f, 0.729004f, 0.345947f,
+ 0.740234f, 0.331299f, 0.750488f, 0.317139f, 0.762207f, 0.302979f, 0.769531f, 0.290527f,
+ 0.779297f, 0.278320f, 0.788086f, 0.266602f, 0.795898f, 0.255859f, 0.804688f, 0.244385f,
+ 0.811035f, 0.234375f, 0.817871f, 0.224609f, 0.825195f, 0.214966f, 0.830078f, 0.206543f,
+ 0.835938f, 0.198242f, 0.842285f, 0.189819f, 0.847656f, 0.181885f, 0.854492f, 0.173584f,
+ 0.860352f, 0.165649f, 0.864258f, 0.158813f, 0.870117f, 0.151733f, 0.874512f, 0.144653f,
+ 0.878418f, 0.138550f, 0.882324f, 0.132446f, 0.888184f, 0.126099f, 0.890137f, 0.120605f,
+ 0.895020f, 0.114868f, 0.897949f, 0.109680f, 0.903320f, 0.104126f, 0.905273f, 0.098938f,
+ 0.908203f, 0.094788f, 0.913086f, 0.089050f, 0.915527f, 0.084595f, 0.918945f, 0.080139f,
+ 0.922363f, 0.075439f, 0.924316f, 0.071228f, 0.928223f, 0.066833f, 0.931152f, 0.062439f,
+ 0.932617f, 0.057434f, 0.935059f, 0.052216f, 0.937012f, 0.047180f, 0.939453f, 0.042236f,
+ 0.941895f, 0.037201f, 0.941406f, 0.030228f, 0.942383f, 0.022018f, 0.938965f, 0.009247f,
+ 0.000000f, 1.000000f, 0.149658f, 0.935059f, 0.251465f, 0.864746f, 0.327393f, 0.802246f,
+ 0.386963f, 0.747559f, 0.437500f, 0.699219f, 0.478027f, 0.656250f, 0.512207f, 0.618164f,
+ 0.545410f, 0.582031f, 0.572266f, 0.550293f, 0.597168f, 0.520996f, 0.617188f, 0.494629f,
+ 0.639648f, 0.468750f, 0.657715f, 0.445557f, 0.674805f, 0.423828f, 0.690430f, 0.403564f,
+ 0.705078f, 0.384521f, 0.718750f, 0.366211f, 0.730469f, 0.350098f, 0.743164f, 0.333496f,
+ 0.754395f, 0.318604f, 0.763672f, 0.304688f, 0.774902f, 0.290771f, 0.783203f, 0.277832f,
+ 0.791992f, 0.265625f, 0.800781f, 0.253906f, 0.808105f, 0.243652f, 0.815918f, 0.232300f,
+ 0.822266f, 0.222534f, 0.831055f, 0.212036f, 0.835938f, 0.203369f, 0.842773f, 0.194458f,
+ 0.848145f, 0.186035f, 0.853516f, 0.178101f, 0.859863f, 0.170532f, 0.865234f, 0.162476f,
+ 0.870605f, 0.154785f, 0.875977f, 0.147949f, 0.879883f, 0.140869f, 0.885254f, 0.134033f,
+ 0.888184f, 0.128540f, 0.895508f, 0.121582f, 0.897461f, 0.115967f, 0.900391f, 0.111206f,
+ 0.905762f, 0.104736f, 0.908203f, 0.099854f, 0.911621f, 0.095276f, 0.916504f, 0.089600f,
+ 0.917969f, 0.085327f, 0.921387f, 0.080933f, 0.925293f, 0.075928f, 0.927734f, 0.072021f,
+ 0.931152f, 0.067566f, 0.933594f, 0.063538f, 0.936035f, 0.059662f, 0.939453f, 0.055511f,
+ 0.941406f, 0.051605f, 0.942871f, 0.046936f, 0.944824f, 0.041626f, 0.946289f, 0.037415f,
+ 0.949219f, 0.032440f, 0.949219f, 0.026672f, 0.950684f, 0.019394f, 0.947754f, 0.007217f,
+ 0.000000f, 1.000000f, 0.151489f, 0.934082f, 0.255127f, 0.862793f, 0.331787f, 0.799805f,
+ 0.393066f, 0.743652f, 0.444336f, 0.693848f, 0.486328f, 0.649902f, 0.522949f, 0.610352f,
+ 0.554688f, 0.574707f, 0.584473f, 0.541016f, 0.607422f, 0.512207f, 0.631348f, 0.484131f,
+ 0.652344f, 0.458496f, 0.670410f, 0.434814f, 0.687012f, 0.413086f, 0.702148f, 0.392578f,
+ 0.717285f, 0.373291f, 0.730957f, 0.354980f, 0.743164f, 0.338135f, 0.754883f, 0.322266f,
+ 0.766602f, 0.306641f, 0.775879f, 0.292480f, 0.786621f, 0.279053f, 0.794922f, 0.266357f,
+ 0.805176f, 0.253418f, 0.812988f, 0.242188f, 0.819336f, 0.231567f, 0.826660f, 0.221069f,
+ 0.834961f, 0.210693f, 0.841797f, 0.200928f, 0.846680f, 0.192139f, 0.854980f, 0.182617f,
+ 0.858887f, 0.174805f, 0.865234f, 0.166748f, 0.870117f, 0.159302f, 0.874023f, 0.152222f,
+ 0.880371f, 0.145142f, 0.886230f, 0.137329f, 0.890137f, 0.131104f, 0.895996f, 0.123962f,
+ 0.898926f, 0.118225f, 0.903320f, 0.112427f, 0.907227f, 0.106445f, 0.909668f, 0.101562f,
+ 0.914551f, 0.095886f, 0.916992f, 0.091309f, 0.921387f, 0.086060f, 0.923828f, 0.081604f,
+ 0.927246f, 0.077209f, 0.930176f, 0.072632f, 0.932617f, 0.068604f, 0.935547f, 0.064636f,
+ 0.938965f, 0.060486f, 0.941406f, 0.056458f, 0.944336f, 0.052948f, 0.946777f, 0.049133f,
+ 0.948242f, 0.045837f, 0.952148f, 0.041809f, 0.952637f, 0.037231f, 0.954102f, 0.032837f,
+ 0.955566f, 0.028427f, 0.957520f, 0.023804f, 0.958008f, 0.016418f, 0.956543f, 0.006493f,
+ 0.000000f, 1.000000f, 0.151978f, 0.934082f, 0.257812f, 0.861328f, 0.337158f, 0.796387f,
+ 0.401123f, 0.739258f, 0.452148f, 0.688965f, 0.495850f, 0.643555f, 0.532715f, 0.603027f,
+ 0.565430f, 0.566406f, 0.593750f, 0.533203f, 0.620605f, 0.502441f, 0.642578f, 0.474609f,
+ 0.662598f, 0.448975f, 0.682617f, 0.424561f, 0.698730f, 0.402588f, 0.714355f, 0.382080f,
+ 0.730957f, 0.361572f, 0.743652f, 0.343506f, 0.756348f, 0.326416f, 0.766602f, 0.310547f,
+ 0.778320f, 0.295166f, 0.788574f, 0.281006f, 0.798828f, 0.267090f, 0.807617f, 0.254883f,
+ 0.816406f, 0.242554f, 0.824219f, 0.231201f, 0.832031f, 0.219727f, 0.838867f, 0.209717f,
+ 0.845703f, 0.200073f, 0.852539f, 0.190308f, 0.859375f, 0.180908f, 0.863770f, 0.172607f,
+ 0.871094f, 0.164185f, 0.875977f, 0.156128f, 0.880371f, 0.149292f, 0.885742f, 0.141846f,
+ 0.889648f, 0.135376f, 0.895020f, 0.128540f, 0.899902f, 0.121704f, 0.904297f, 0.115173f,
+ 0.908203f, 0.109375f, 0.912109f, 0.103638f, 0.915039f, 0.098206f, 0.919434f, 0.092773f,
+ 0.922363f, 0.088074f, 0.926270f, 0.082886f, 0.929688f, 0.078186f, 0.932129f, 0.074097f,
+ 0.934570f, 0.069885f, 0.937500f, 0.065552f, 0.940918f, 0.061493f, 0.943359f, 0.057678f,
+ 0.945801f, 0.054138f, 0.948242f, 0.050293f, 0.950195f, 0.047058f, 0.953125f, 0.043488f,
+ 0.956055f, 0.039917f, 0.957520f, 0.037048f, 0.960938f, 0.033264f, 0.960938f, 0.029175f,
+ 0.963379f, 0.024429f, 0.963379f, 0.020630f, 0.965332f, 0.014359f, 0.963867f, 0.005737f,
+ 0.000000f, 1.000000f, 0.154053f, 0.933105f, 0.260986f, 0.859863f, 0.342041f, 0.793457f,
+ 0.406982f, 0.735352f, 0.460693f, 0.683105f, 0.504395f, 0.637207f, 0.543945f, 0.595703f,
+ 0.575684f, 0.558594f, 0.604004f, 0.524902f, 0.630859f, 0.493408f, 0.654297f, 0.464600f,
+ 0.673828f, 0.438965f, 0.695312f, 0.414062f, 0.710938f, 0.392334f, 0.726074f, 0.371094f,
+ 0.742188f, 0.351074f, 0.755859f, 0.332520f, 0.768555f, 0.315430f, 0.778320f, 0.299805f,
+ 0.790039f, 0.284180f, 0.801758f, 0.269775f, 0.810059f, 0.256348f, 0.818848f, 0.243652f,
+ 0.825684f, 0.232422f, 0.835938f, 0.219849f, 0.841797f, 0.209595f, 0.850098f, 0.198853f,
+ 0.854980f, 0.189819f, 0.862793f, 0.180176f, 0.868652f, 0.171265f, 0.874512f, 0.162476f,
+ 0.880859f, 0.154297f, 0.884766f, 0.146851f, 0.890137f, 0.139160f, 0.894531f, 0.132446f,
+ 0.899414f, 0.125610f, 0.902832f, 0.119873f, 0.907227f, 0.113647f, 0.912109f, 0.107483f,
+ 0.916016f, 0.101196f, 0.919922f, 0.095642f, 0.924316f, 0.090027f, 0.927246f, 0.085022f,
+ 0.930664f, 0.080200f, 0.934082f, 0.075562f, 0.936523f, 0.071167f, 0.940430f, 0.066650f,
+ 0.941406f, 0.063049f, 0.944824f, 0.058929f, 0.947266f, 0.055206f, 0.949707f, 0.051575f,
+ 0.953613f, 0.047729f, 0.954590f, 0.044525f, 0.957031f, 0.041412f, 0.959961f, 0.037964f,
+ 0.961914f, 0.035004f, 0.963867f, 0.032135f, 0.966309f, 0.028809f, 0.968262f, 0.026031f,
+ 0.968262f, 0.021774f, 0.969238f, 0.017258f, 0.971191f, 0.012901f, 0.971191f, 0.004601f,
+ 0.000000f, 1.000000f, 0.154663f, 0.933105f, 0.264160f, 0.857910f, 0.348389f, 0.790039f,
+ 0.415283f, 0.730469f, 0.468750f, 0.677734f, 0.514648f, 0.630371f, 0.552734f, 0.588867f,
+ 0.586914f, 0.550293f, 0.615723f, 0.515625f, 0.643066f, 0.484375f, 0.666016f, 0.455566f,
+ 0.685547f, 0.429443f, 0.705078f, 0.404541f, 0.722656f, 0.381592f, 0.737793f, 0.360840f,
+ 0.752930f, 0.341064f, 0.766602f, 0.322266f, 0.778809f, 0.305176f, 0.790527f, 0.289062f,
+ 0.800293f, 0.273926f, 0.810547f, 0.259521f, 0.822266f, 0.245728f, 0.829102f, 0.233521f,
+ 0.837402f, 0.221436f, 0.844727f, 0.210449f, 0.853516f, 0.199219f, 0.860352f, 0.188843f,
+ 0.866211f, 0.179321f, 0.871582f, 0.170410f, 0.877441f, 0.161987f, 0.884277f, 0.153442f,
+ 0.889648f, 0.145142f, 0.894531f, 0.137451f, 0.899902f, 0.130249f, 0.903320f, 0.123535f,
+ 0.907715f, 0.117004f, 0.911621f, 0.111023f, 0.915039f, 0.105286f, 0.918457f, 0.099854f,
+ 0.923828f, 0.093994f, 0.926758f, 0.088501f, 0.931152f, 0.082947f, 0.934570f, 0.078064f,
+ 0.937988f, 0.073120f, 0.939941f, 0.068909f, 0.944824f, 0.064209f, 0.945801f, 0.060516f,
+ 0.949707f, 0.056488f, 0.951660f, 0.052734f, 0.954590f, 0.049194f, 0.956055f, 0.045837f,
+ 0.958984f, 0.042358f, 0.961426f, 0.039032f, 0.962402f, 0.036591f, 0.965820f, 0.033020f,
+ 0.966797f, 0.030685f, 0.969238f, 0.027573f, 0.972656f, 0.024414f, 0.973145f, 0.022232f,
+ 0.975098f, 0.019608f, 0.976562f, 0.014435f, 0.976074f, 0.010353f, 0.976562f, 0.003431f,
+ 0.000000f, 1.000000f, 0.156128f, 0.932129f, 0.267578f, 0.856445f, 0.353027f, 0.787109f,
+ 0.419922f, 0.727051f, 0.476074f, 0.672852f, 0.522949f, 0.624512f, 0.562988f, 0.581055f,
+ 0.597656f, 0.542480f, 0.627930f, 0.506836f, 0.654297f, 0.475342f, 0.676758f, 0.446045f,
+ 0.697754f, 0.419434f, 0.716797f, 0.394775f, 0.735352f, 0.371582f, 0.751953f, 0.349609f,
+ 0.765625f, 0.330078f, 0.778320f, 0.312012f, 0.789551f, 0.295166f, 0.800781f, 0.279053f,
+ 0.811523f, 0.263916f, 0.822266f, 0.249268f, 0.830078f, 0.236328f, 0.839844f, 0.223511f,
+ 0.847656f, 0.211548f, 0.855469f, 0.200317f, 0.861816f, 0.190063f, 0.868652f, 0.180176f,
+ 0.875977f, 0.170044f, 0.881348f, 0.161133f, 0.886230f, 0.152710f, 0.892090f, 0.144653f,
+ 0.895996f, 0.137451f, 0.902832f, 0.129395f, 0.906250f, 0.122375f, 0.912109f, 0.115112f,
+ 0.915527f, 0.109192f, 0.920410f, 0.102905f, 0.922852f, 0.097534f, 0.926270f, 0.092102f,
+ 0.930664f, 0.086914f, 0.932129f, 0.082336f, 0.937500f, 0.076965f, 0.940918f, 0.071777f,
+ 0.944336f, 0.067139f, 0.947266f, 0.062683f, 0.950195f, 0.058319f, 0.951660f, 0.054840f,
+ 0.955078f, 0.050842f, 0.958008f, 0.046997f, 0.960449f, 0.043640f, 0.961426f, 0.040894f,
+ 0.965332f, 0.036987f, 0.966797f, 0.034485f, 0.968262f, 0.031738f, 0.970703f, 0.028824f,
+ 0.972656f, 0.026047f, 0.974121f, 0.023590f, 0.976074f, 0.021194f, 0.978516f, 0.018341f,
+ 0.979492f, 0.016159f, 0.981445f, 0.013855f, 0.982422f, 0.008255f, 0.982422f, 0.003952f,
+ 0.000000f, 1.000000f, 0.157715f, 0.931641f, 0.271729f, 0.854492f, 0.358154f, 0.784668f,
+ 0.428223f, 0.721680f, 0.485840f, 0.666504f, 0.532227f, 0.617676f, 0.574219f, 0.573242f,
+ 0.606934f, 0.534668f, 0.637695f, 0.499023f, 0.665039f, 0.466309f, 0.688477f, 0.437012f,
+ 0.708984f, 0.409912f, 0.728027f, 0.385010f, 0.745605f, 0.361816f, 0.760742f, 0.340820f,
+ 0.774414f, 0.320801f, 0.788574f, 0.302246f, 0.801270f, 0.284912f, 0.812012f, 0.269043f,
+ 0.822754f, 0.253662f, 0.831055f, 0.240356f, 0.840820f, 0.226562f, 0.849121f, 0.213989f,
+ 0.856445f, 0.202759f, 0.864746f, 0.191162f, 0.871094f, 0.180664f, 0.876953f, 0.171143f,
+ 0.883789f, 0.161865f, 0.890137f, 0.152832f, 0.895020f, 0.144165f, 0.900879f, 0.135986f,
+ 0.906250f, 0.128418f, 0.908691f, 0.122192f, 0.914062f, 0.115112f, 0.918945f, 0.108215f,
+ 0.922852f, 0.101807f, 0.927734f, 0.095520f, 0.931641f, 0.090149f, 0.934570f, 0.084656f,
+ 0.937012f, 0.079956f, 0.939453f, 0.075500f, 0.942871f, 0.070679f, 0.945801f, 0.066650f,
+ 0.948730f, 0.062134f, 0.953613f, 0.056915f, 0.955078f, 0.053375f, 0.958008f, 0.049438f,
+ 0.961426f, 0.045441f, 0.962891f, 0.042084f, 0.965332f, 0.038757f, 0.967773f, 0.035767f,
+ 0.970215f, 0.032501f, 0.972168f, 0.029587f, 0.973633f, 0.027298f, 0.975586f, 0.024780f,
+ 0.978027f, 0.021866f, 0.979492f, 0.019547f, 0.980957f, 0.017548f, 0.982422f, 0.015434f,
+ 0.985352f, 0.012390f, 0.986328f, 0.010490f, 0.987793f, 0.008591f, 0.987305f, 0.001606f,
+ 0.000000f, 1.000000f, 0.158203f, 0.931641f, 0.274902f, 0.852539f, 0.364990f, 0.780762f,
+ 0.436279f, 0.717285f, 0.493408f, 0.661133f, 0.541504f, 0.611328f, 0.582031f, 0.566895f,
+ 0.618164f, 0.526855f, 0.648926f, 0.490967f, 0.674805f, 0.458008f, 0.698730f, 0.428223f,
+ 0.719238f, 0.400879f, 0.737793f, 0.375732f, 0.756348f, 0.352295f, 0.770996f, 0.331055f,
+ 0.785156f, 0.311523f, 0.799316f, 0.292480f, 0.809570f, 0.275879f, 0.822754f, 0.259277f,
+ 0.832031f, 0.244995f, 0.842285f, 0.230469f, 0.849121f, 0.217651f, 0.858398f, 0.205200f,
+ 0.865723f, 0.193604f, 0.872559f, 0.182739f, 0.879883f, 0.172607f, 0.886230f, 0.162476f,
+ 0.892090f, 0.153198f, 0.896973f, 0.144775f, 0.902832f, 0.136719f, 0.908691f, 0.128662f,
+ 0.914551f, 0.120911f, 0.917480f, 0.113953f, 0.921387f, 0.107544f, 0.925781f, 0.101135f,
+ 0.929199f, 0.095764f, 0.933105f, 0.089844f, 0.937012f, 0.083679f, 0.940430f, 0.078430f,
+ 0.944336f, 0.073486f, 0.946777f, 0.068665f, 0.949707f, 0.064392f, 0.951660f, 0.060516f,
+ 0.955566f, 0.056305f, 0.957031f, 0.052887f, 0.959473f, 0.049347f, 0.962891f, 0.045135f,
+ 0.966797f, 0.040771f, 0.968262f, 0.037537f, 0.970215f, 0.034515f, 0.972656f, 0.031403f,
+ 0.975586f, 0.028259f, 0.977051f, 0.025391f, 0.978027f, 0.023224f, 0.979980f, 0.020966f,
+ 0.981445f, 0.018677f, 0.984375f, 0.015701f, 0.985352f, 0.013809f, 0.986816f, 0.011986f,
+ 0.988281f, 0.010277f, 0.990723f, 0.007851f, 0.991699f, 0.005585f, 0.992676f, 0.003571f,
+ 0.000000f, 1.000000f, 0.161133f, 0.929688f, 0.278809f, 0.850586f, 0.370605f, 0.777344f,
+ 0.442383f, 0.712891f, 0.501465f, 0.655762f, 0.551758f, 0.604980f, 0.591797f, 0.559570f,
+ 0.628418f, 0.519043f, 0.658691f, 0.482422f, 0.685059f, 0.449707f, 0.709961f, 0.419189f,
+ 0.729980f, 0.391846f, 0.749512f, 0.366455f, 0.766113f, 0.343262f, 0.782715f, 0.321777f,
+ 0.795898f, 0.302002f, 0.810059f, 0.283447f, 0.819824f, 0.267090f, 0.830566f, 0.250732f,
+ 0.840332f, 0.236206f, 0.851074f, 0.221558f, 0.858398f, 0.209595f, 0.866699f, 0.196655f,
+ 0.874512f, 0.185181f, 0.880371f, 0.175049f, 0.888184f, 0.164062f, 0.893555f, 0.154907f,
+ 0.899414f, 0.145752f, 0.904785f, 0.137451f, 0.911133f, 0.128784f, 0.915039f, 0.121338f,
+ 0.919922f, 0.114441f, 0.923828f, 0.107666f, 0.928223f, 0.101013f, 0.932617f, 0.094666f,
+ 0.937012f, 0.088318f, 0.939941f, 0.083069f, 0.942871f, 0.078186f, 0.946289f, 0.073181f,
+ 0.949219f, 0.068359f, 0.952637f, 0.063416f, 0.955566f, 0.059052f, 0.959473f, 0.054321f,
+ 0.961426f, 0.050507f, 0.963379f, 0.047089f, 0.965332f, 0.043854f, 0.967773f, 0.040588f,
+ 0.969727f, 0.037262f, 0.970703f, 0.034882f, 0.974121f, 0.031403f, 0.976562f, 0.028198f,
+ 0.979004f, 0.024948f, 0.981934f, 0.021439f, 0.983398f, 0.019058f, 0.984863f, 0.017044f,
+ 0.986328f, 0.014915f, 0.987793f, 0.012901f, 0.990234f, 0.010391f, 0.991699f, 0.008072f,
+ 0.992676f, 0.006798f, 0.993652f, 0.005573f, 0.994629f, 0.004089f, 0.998535f, 0.000090f,
+ 0.000000f, 1.000000f, 0.161743f, 0.929688f, 0.280762f, 0.849609f, 0.374268f, 0.775391f,
+ 0.449463f, 0.708984f, 0.509277f, 0.650879f, 0.560547f, 0.598633f, 0.601074f, 0.553223f,
+ 0.636719f, 0.511719f, 0.667969f, 0.474854f, 0.696289f, 0.440918f, 0.718750f, 0.411377f,
+ 0.739258f, 0.383545f, 0.758789f, 0.358154f, 0.775879f, 0.335205f, 0.789551f, 0.314209f,
+ 0.803711f, 0.293945f, 0.817871f, 0.274658f, 0.831055f, 0.257324f, 0.838379f, 0.243164f,
+ 0.849609f, 0.227295f, 0.859375f, 0.213867f, 0.866699f, 0.200928f, 0.874023f, 0.189331f,
+ 0.882324f, 0.177490f, 0.889160f, 0.166626f, 0.895508f, 0.156982f, 0.901855f, 0.147339f,
+ 0.905273f, 0.139038f, 0.912109f, 0.130493f, 0.919434f, 0.121643f, 0.920898f, 0.114746f,
+ 0.925293f, 0.108765f, 0.931152f, 0.101074f, 0.936523f, 0.093201f, 0.936523f, 0.088928f,
+ 0.939941f, 0.084900f, 0.946289f, 0.077881f, 0.952637f, 0.070312f, 0.952637f, 0.066406f,
+ 0.952637f, 0.063599f, 0.952637f, 0.061371f, 0.960938f, 0.055145f, 0.968262f, 0.047913f,
+ 0.968262f, 0.044189f, 0.968262f, 0.041840f, 0.968262f, 0.040070f, 0.968262f, 0.038635f,
+ 0.971680f, 0.036346f, 0.979004f, 0.030014f, 0.983887f, 0.023743f, 0.983887f, 0.021423f,
+ 0.983887f, 0.019958f, 0.983887f, 0.018890f, 0.983887f, 0.018082f, 0.983887f, 0.017456f,
+ 0.983887f, 0.016953f, 0.987305f, 0.015465f, 0.999512f, 0.005238f, 0.999512f, 0.001760f,
+ 0.999512f, 0.000720f, 0.999512f, 0.000257f, 0.999512f, 0.000054f, 0.999512f, 0.000001f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f,
+ 0.000000f, 0.992188f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f,
+ 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000000f, 0.985352f, 0.000000f, 0.984375f,
+ 0.000000f, 0.982910f, 0.000000f, 0.979980f, 0.000000f, 0.978516f, 0.000000f, 0.977539f,
+ 0.000000f, 0.974609f, 0.000000f, 0.972656f, 0.000000f, 0.971191f, 0.000000f, 0.968262f,
+ 0.000000f, 0.965820f, 0.000000f, 0.963379f, 0.000000f, 0.959961f, 0.000000f, 0.956543f,
+ 0.000000f, 0.953613f, 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.942383f,
+ 0.000000f, 0.936523f, 0.000000f, 0.932617f, 0.000000f, 0.926270f, 0.000000f, 0.920410f,
+ 0.000000f, 0.914062f, 0.000000f, 0.907227f, 0.000000f, 0.899902f, 0.000000f, 0.891602f,
+ 0.000000f, 0.881836f, 0.000000f, 0.871582f, 0.000000f, 0.860352f, 0.000000f, 0.847168f,
+ 0.000000f, 0.832520f, 0.000000f, 0.816406f, 0.000000f, 0.796875f, 0.000000f, 0.774902f,
+ 0.000000f, 0.749023f, 0.000000f, 0.717773f, 0.000000f, 0.680664f, 0.000000f, 0.633789f,
+ 0.000000f, 0.574219f, 0.000000f, 0.492676f, 0.000000f, 0.367188f, 0.000000f, 0.140137f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.992676f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.988770f,
+ 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.983887f,
+ 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.978516f, 0.000000f, 0.976562f,
+ 0.000000f, 0.975098f, 0.000000f, 0.973145f, 0.000000f, 0.970703f, 0.000000f, 0.968262f,
+ 0.000000f, 0.965332f, 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f,
+ 0.000000f, 0.953613f, 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.941406f,
+ 0.000000f, 0.937012f, 0.000000f, 0.931641f, 0.000000f, 0.927246f, 0.000000f, 0.920410f,
+ 0.000000f, 0.914062f, 0.000000f, 0.907227f, 0.000000f, 0.899902f, 0.000000f, 0.891602f,
+ 0.000000f, 0.881836f, 0.000000f, 0.871094f, 0.000000f, 0.859375f, 0.000000f, 0.847168f,
+ 0.000000f, 0.832520f, 0.000000f, 0.815918f, 0.000000f, 0.796387f, 0.000000f, 0.774902f,
+ 0.000000f, 0.749512f, 0.000000f, 0.718262f, 0.000000f, 0.680176f, 0.000000f, 0.633789f,
+ 0.000002f, 0.574219f, 0.000002f, 0.492432f, 0.000001f, 0.367920f, 0.000001f, 0.139648f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992676f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.988770f,
+ 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.984863f, 0.000000f, 0.983398f,
+ 0.000000f, 0.981934f, 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976562f,
+ 0.000000f, 0.974609f, 0.000000f, 0.972656f, 0.000000f, 0.970703f, 0.000000f, 0.967773f,
+ 0.000000f, 0.965332f, 0.000000f, 0.962402f, 0.000000f, 0.959473f, 0.000000f, 0.957031f,
+ 0.000000f, 0.952637f, 0.000000f, 0.949219f, 0.000000f, 0.944824f, 0.000000f, 0.940918f,
+ 0.000000f, 0.936523f, 0.000000f, 0.931641f, 0.000000f, 0.925781f, 0.000000f, 0.919922f,
+ 0.000000f, 0.913574f, 0.000000f, 0.906738f, 0.000000f, 0.899414f, 0.000000f, 0.890625f,
+ 0.000000f, 0.880859f, 0.000004f, 0.870605f, 0.000015f, 0.859375f, 0.000028f, 0.846680f,
+ 0.000034f, 0.832031f, 0.000036f, 0.814941f, 0.000035f, 0.795898f, 0.000032f, 0.773926f,
+ 0.000029f, 0.748535f, 0.000024f, 0.717285f, 0.000021f, 0.679688f, 0.000022f, 0.633301f,
+ 0.000019f, 0.573730f, 0.000018f, 0.492188f, 0.000014f, 0.367432f, 0.000011f, 0.139648f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f,
+ 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989258f, 0.000000f, 0.988770f,
+ 0.000000f, 0.987305f, 0.000000f, 0.985840f, 0.000000f, 0.984375f, 0.000000f, 0.983398f,
+ 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.978516f, 0.000000f, 0.976074f,
+ 0.000000f, 0.974121f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.967773f,
+ 0.000000f, 0.964355f, 0.000000f, 0.961426f, 0.000000f, 0.959473f, 0.000005f, 0.955566f,
+ 0.000016f, 0.952148f, 0.000031f, 0.948242f, 0.000048f, 0.943848f, 0.000066f, 0.939941f,
+ 0.000086f, 0.935547f, 0.000106f, 0.930664f, 0.000126f, 0.924805f, 0.000143f, 0.918945f,
+ 0.000147f, 0.912598f, 0.000148f, 0.905762f, 0.000146f, 0.897949f, 0.000139f, 0.889648f,
+ 0.000134f, 0.880371f, 0.000125f, 0.869629f, 0.000114f, 0.858398f, 0.000105f, 0.845215f,
+ 0.000097f, 0.830566f, 0.000101f, 0.813477f, 0.000109f, 0.794922f, 0.000100f, 0.772949f,
+ 0.000091f, 0.747070f, 0.000092f, 0.716309f, 0.000082f, 0.679199f, 0.000078f, 0.632324f,
+ 0.000073f, 0.572266f, 0.000067f, 0.491211f, 0.000064f, 0.367188f, 0.000046f, 0.139771f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f,
+ 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f,
+ 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f,
+ 0.000000f, 0.986816f, 0.000003f, 0.985840f, 0.000017f, 0.984375f, 0.000034f, 0.982422f,
+ 0.000059f, 0.980469f, 0.000081f, 0.979492f, 0.000108f, 0.977051f, 0.000135f, 0.975586f,
+ 0.000159f, 0.973633f, 0.000188f, 0.970703f, 0.000216f, 0.968750f, 0.000242f, 0.966309f,
+ 0.000268f, 0.964355f, 0.000298f, 0.960449f, 0.000324f, 0.957520f, 0.000348f, 0.954590f,
+ 0.000363f, 0.950684f, 0.000369f, 0.947266f, 0.000365f, 0.942871f, 0.000354f, 0.938965f,
+ 0.000342f, 0.934082f, 0.000332f, 0.929199f, 0.000316f, 0.923828f, 0.000298f, 0.917969f,
+ 0.000277f, 0.911133f, 0.000274f, 0.904297f, 0.000273f, 0.896973f, 0.000276f, 0.888184f,
+ 0.000283f, 0.878418f, 0.000287f, 0.868164f, 0.000278f, 0.856445f, 0.000261f, 0.843262f,
+ 0.000258f, 0.829102f, 0.000255f, 0.812012f, 0.000248f, 0.792969f, 0.000238f, 0.770996f,
+ 0.000245f, 0.745605f, 0.000226f, 0.714355f, 0.000214f, 0.677246f, 0.000220f, 0.631348f,
+ 0.000199f, 0.571777f, 0.000197f, 0.490234f, 0.000181f, 0.367188f, 0.000111f, 0.140015f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000018f, 0.995117f,
+ 0.000054f, 0.994141f, 0.000086f, 0.993164f, 0.000131f, 0.992676f, 0.000169f, 0.991699f,
+ 0.000204f, 0.990723f, 0.000250f, 0.989746f, 0.000289f, 0.988281f, 0.000323f, 0.987305f,
+ 0.000360f, 0.985840f, 0.000401f, 0.984863f, 0.000437f, 0.983398f, 0.000468f, 0.981934f,
+ 0.000498f, 0.979980f, 0.000537f, 0.978027f, 0.000571f, 0.976562f, 0.000600f, 0.974609f,
+ 0.000626f, 0.972168f, 0.000655f, 0.969727f, 0.000681f, 0.967773f, 0.000682f, 0.964844f,
+ 0.000671f, 0.962891f, 0.000651f, 0.959961f, 0.000630f, 0.956543f, 0.000613f, 0.952637f,
+ 0.000592f, 0.950195f, 0.000583f, 0.945312f, 0.000580f, 0.941406f, 0.000566f, 0.937500f,
+ 0.000577f, 0.932617f, 0.000588f, 0.927246f, 0.000599f, 0.921875f, 0.000609f, 0.916016f,
+ 0.000589f, 0.909180f, 0.000587f, 0.901855f, 0.000588f, 0.894531f, 0.000590f, 0.885742f,
+ 0.000592f, 0.876953f, 0.000561f, 0.866211f, 0.000566f, 0.854004f, 0.000570f, 0.841309f,
+ 0.000570f, 0.826660f, 0.000523f, 0.809570f, 0.000534f, 0.790527f, 0.000535f, 0.768555f,
+ 0.000530f, 0.743164f, 0.000490f, 0.712402f, 0.000494f, 0.675781f, 0.000496f, 0.629883f,
+ 0.000460f, 0.569824f, 0.000465f, 0.489746f, 0.000431f, 0.366455f, 0.000215f, 0.140747f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000034f, 0.998535f, 0.000105f, 0.998047f, 0.000179f, 0.998047f, 0.000242f, 0.997559f,
+ 0.000321f, 0.996582f, 0.000377f, 0.996582f, 0.000422f, 0.995605f, 0.000494f, 0.994629f,
+ 0.000547f, 0.993652f, 0.000589f, 0.993164f, 0.000623f, 0.991699f, 0.000685f, 0.990723f,
+ 0.000732f, 0.990723f, 0.000769f, 0.988770f, 0.000799f, 0.987793f, 0.000833f, 0.986816f,
+ 0.000883f, 0.984863f, 0.000921f, 0.983887f, 0.000951f, 0.982422f, 0.000976f, 0.980957f,
+ 0.000995f, 0.979004f, 0.001040f, 0.977051f, 0.001049f, 0.975586f, 0.001035f, 0.973633f,
+ 0.001019f, 0.971191f, 0.001002f, 0.968750f, 0.000999f, 0.965820f, 0.001013f, 0.963867f,
+ 0.001028f, 0.960938f, 0.001037f, 0.958496f, 0.001012f, 0.955078f, 0.001016f, 0.951172f,
+ 0.001028f, 0.947754f, 0.001055f, 0.944336f, 0.001077f, 0.939941f, 0.001045f, 0.935547f,
+ 0.001066f, 0.930664f, 0.001074f, 0.925293f, 0.001094f, 0.919434f, 0.001105f, 0.913574f,
+ 0.001054f, 0.906738f, 0.001059f, 0.899902f, 0.001075f, 0.892090f, 0.001079f, 0.883301f,
+ 0.001099f, 0.873535f, 0.001040f, 0.862793f, 0.001047f, 0.851562f, 0.001040f, 0.838867f,
+ 0.001055f, 0.823730f, 0.001065f, 0.807617f, 0.001009f, 0.787598f, 0.001009f, 0.766113f,
+ 0.000999f, 0.741211f, 0.000970f, 0.709961f, 0.000968f, 0.672852f, 0.000961f, 0.628418f,
+ 0.000938f, 0.568848f, 0.000925f, 0.488281f, 0.000850f, 0.365967f, 0.000363f, 0.140503f,
+ 0.000000f, 1.000000f, 0.000159f, 0.999512f, 0.000322f, 0.999023f, 0.000437f, 0.999023f,
+ 0.000506f, 0.998047f, 0.000640f, 0.998047f, 0.000697f, 0.997559f, 0.000728f, 0.996582f,
+ 0.000842f, 0.996582f, 0.000903f, 0.995605f, 0.000939f, 0.995117f, 0.000962f, 0.994629f,
+ 0.001044f, 0.993652f, 0.001104f, 0.992188f, 0.001141f, 0.991211f, 0.001163f, 0.990234f,
+ 0.001180f, 0.989258f, 0.001251f, 0.988281f, 0.001302f, 0.986816f, 0.001332f, 0.985352f,
+ 0.001365f, 0.984863f, 0.001410f, 0.982422f, 0.001454f, 0.980957f, 0.001515f, 0.979492f,
+ 0.001533f, 0.977539f, 0.001535f, 0.976562f, 0.001536f, 0.973633f, 0.001531f, 0.972168f,
+ 0.001554f, 0.969238f, 0.001606f, 0.967285f, 0.001576f, 0.964355f, 0.001588f, 0.961914f,
+ 0.001604f, 0.958984f, 0.001631f, 0.956543f, 0.001665f, 0.953125f, 0.001682f, 0.949219f,
+ 0.001745f, 0.945801f, 0.001764f, 0.941406f, 0.001770f, 0.937988f, 0.001768f, 0.933105f,
+ 0.001692f, 0.928223f, 0.001762f, 0.922852f, 0.001799f, 0.917480f, 0.001817f, 0.911133f,
+ 0.001830f, 0.904297f, 0.001735f, 0.896973f, 0.001764f, 0.889160f, 0.001809f, 0.880371f,
+ 0.001825f, 0.870605f, 0.001841f, 0.860352f, 0.001757f, 0.848633f, 0.001757f, 0.835449f,
+ 0.001792f, 0.820801f, 0.001830f, 0.804199f, 0.001735f, 0.785156f, 0.001721f, 0.763184f,
+ 0.001768f, 0.737793f, 0.001708f, 0.707031f, 0.001700f, 0.670410f, 0.001710f, 0.625488f,
+ 0.001684f, 0.566895f, 0.001637f, 0.487061f, 0.001467f, 0.365479f, 0.000550f, 0.140625f,
+ 0.000000f, 1.000000f, 0.000398f, 0.999512f, 0.000719f, 0.999023f, 0.000721f, 0.998535f,
+ 0.000972f, 0.998047f, 0.001002f, 0.997559f, 0.001008f, 0.997070f, 0.001189f, 0.996582f,
+ 0.001245f, 0.995605f, 0.001262f, 0.995117f, 0.001267f, 0.994629f, 0.001390f, 0.993652f,
+ 0.001467f, 0.992676f, 0.001500f, 0.992188f, 0.001550f, 0.990723f, 0.001600f, 0.989258f,
+ 0.001768f, 0.988770f, 0.001886f, 0.986816f, 0.001955f, 0.985840f, 0.002018f, 0.984375f,
+ 0.002026f, 0.982910f, 0.002022f, 0.982422f, 0.002131f, 0.979980f, 0.002163f, 0.978027f,
+ 0.002172f, 0.976074f, 0.002174f, 0.974121f, 0.002144f, 0.972168f, 0.002174f, 0.970215f,
+ 0.002327f, 0.967773f, 0.002388f, 0.964844f, 0.002445f, 0.962891f, 0.002411f, 0.959961f,
+ 0.002460f, 0.957031f, 0.002493f, 0.954102f, 0.002602f, 0.950684f, 0.002548f, 0.947266f,
+ 0.002590f, 0.942871f, 0.002619f, 0.938965f, 0.002628f, 0.935059f, 0.002674f, 0.930664f,
+ 0.002651f, 0.924805f, 0.002707f, 0.919922f, 0.002745f, 0.914062f, 0.002783f, 0.907715f,
+ 0.002790f, 0.900879f, 0.002678f, 0.894043f, 0.002783f, 0.885742f, 0.002857f, 0.876465f,
+ 0.002838f, 0.867188f, 0.002850f, 0.856445f, 0.002769f, 0.844727f, 0.002859f, 0.832031f,
+ 0.002855f, 0.816895f, 0.002897f, 0.800293f, 0.002804f, 0.781738f, 0.002853f, 0.760254f,
+ 0.002888f, 0.733887f, 0.002911f, 0.704590f, 0.002857f, 0.667969f, 0.002806f, 0.623047f,
+ 0.002777f, 0.564453f, 0.002665f, 0.485840f, 0.002314f, 0.364746f, 0.000779f, 0.141357f,
+ 0.000000f, 1.000000f, 0.000458f, 0.999512f, 0.000860f, 0.999023f, 0.000844f, 0.998535f,
+ 0.001191f, 0.998047f, 0.001191f, 0.997070f, 0.001182f, 0.997070f, 0.001469f, 0.996094f,
+ 0.001523f, 0.995117f, 0.001595f, 0.994629f, 0.001656f, 0.993652f, 0.001976f, 0.992676f,
+ 0.002085f, 0.991699f, 0.002150f, 0.990723f, 0.002230f, 0.990234f, 0.002295f, 0.988770f,
+ 0.002563f, 0.987305f, 0.002615f, 0.985840f, 0.002647f, 0.984375f, 0.002672f, 0.982910f,
+ 0.002666f, 0.981445f, 0.002691f, 0.979980f, 0.002972f, 0.978516f, 0.002972f, 0.976074f,
+ 0.003031f, 0.974609f, 0.003077f, 0.972168f, 0.003109f, 0.970703f, 0.003077f, 0.968262f,
+ 0.003345f, 0.965820f, 0.003441f, 0.962891f, 0.003519f, 0.960449f, 0.003437f, 0.957520f,
+ 0.003479f, 0.954590f, 0.003502f, 0.951172f, 0.003717f, 0.947754f, 0.003807f, 0.944336f,
+ 0.003733f, 0.940430f, 0.003765f, 0.936035f, 0.003820f, 0.932129f, 0.003891f, 0.927246f,
+ 0.004089f, 0.922363f, 0.003960f, 0.916016f, 0.004005f, 0.910645f, 0.004082f, 0.904297f,
+ 0.004158f, 0.897949f, 0.003998f, 0.890137f, 0.004150f, 0.881836f, 0.004223f, 0.872559f,
+ 0.004307f, 0.863281f, 0.004295f, 0.852539f, 0.004208f, 0.840820f, 0.004330f, 0.827637f,
+ 0.004326f, 0.812500f, 0.004425f, 0.795898f, 0.004318f, 0.776855f, 0.004375f, 0.755859f,
+ 0.004440f, 0.729980f, 0.004501f, 0.700195f, 0.004417f, 0.664062f, 0.004387f, 0.620117f,
+ 0.004280f, 0.562012f, 0.004047f, 0.484131f, 0.003397f, 0.363770f, 0.001074f, 0.141235f,
+ 0.000000f, 1.000000f, 0.000478f, 0.999512f, 0.000919f, 0.998535f, 0.000904f, 0.998535f,
+ 0.001349f, 0.997070f, 0.001458f, 0.997070f, 0.001559f, 0.996094f, 0.002010f, 0.995117f,
+ 0.002132f, 0.994629f, 0.002201f, 0.993652f, 0.002274f, 0.993164f, 0.002676f, 0.991699f,
+ 0.002764f, 0.990723f, 0.002811f, 0.989746f, 0.002909f, 0.988770f, 0.003040f, 0.987793f,
+ 0.003410f, 0.985840f, 0.003479f, 0.984375f, 0.003542f, 0.982910f, 0.003590f, 0.981445f,
+ 0.003674f, 0.979980f, 0.003641f, 0.978516f, 0.003983f, 0.976562f, 0.004086f, 0.974609f,
+ 0.004101f, 0.972656f, 0.004211f, 0.970215f, 0.004318f, 0.968262f, 0.004429f, 0.966309f,
+ 0.004593f, 0.963379f, 0.004669f, 0.960449f, 0.004787f, 0.957520f, 0.004868f, 0.955078f,
+ 0.004803f, 0.951660f, 0.004902f, 0.948730f, 0.005169f, 0.944824f, 0.005283f, 0.940918f,
+ 0.005405f, 0.937012f, 0.005348f, 0.932617f, 0.005363f, 0.928223f, 0.005447f, 0.923828f,
+ 0.005737f, 0.918457f, 0.005589f, 0.912598f, 0.005718f, 0.906250f, 0.005817f, 0.900391f,
+ 0.005882f, 0.893066f, 0.005898f, 0.886230f, 0.005989f, 0.877441f, 0.006130f, 0.868164f,
+ 0.006207f, 0.858398f, 0.006210f, 0.848145f, 0.006134f, 0.835938f, 0.006302f, 0.822754f,
+ 0.006485f, 0.807617f, 0.006466f, 0.791016f, 0.006367f, 0.772461f, 0.006432f, 0.751465f,
+ 0.006565f, 0.725586f, 0.006630f, 0.695801f, 0.006512f, 0.660156f, 0.006451f, 0.616699f,
+ 0.006264f, 0.559570f, 0.005821f, 0.482666f, 0.004738f, 0.363037f, 0.001392f, 0.140747f,
+ 0.000000f, 1.000000f, 0.000486f, 0.999512f, 0.001115f, 0.998535f, 0.001320f, 0.998047f,
+ 0.001421f, 0.997070f, 0.002012f, 0.996094f, 0.002111f, 0.996094f, 0.002163f, 0.994629f,
+ 0.002686f, 0.993652f, 0.002804f, 0.993164f, 0.002930f, 0.991699f, 0.003035f, 0.991211f,
+ 0.003607f, 0.989258f, 0.003769f, 0.988770f, 0.003878f, 0.987305f, 0.004002f, 0.986328f,
+ 0.004433f, 0.984863f, 0.004650f, 0.982910f, 0.004658f, 0.981445f, 0.004810f, 0.979492f,
+ 0.004826f, 0.978027f, 0.004917f, 0.976074f, 0.005276f, 0.974121f, 0.005463f, 0.972168f,
+ 0.005630f, 0.970215f, 0.005650f, 0.968262f, 0.005741f, 0.965820f, 0.006119f, 0.963379f,
+ 0.006325f, 0.960449f, 0.006336f, 0.957520f, 0.006454f, 0.954590f, 0.006588f, 0.951660f,
+ 0.006676f, 0.948730f, 0.006870f, 0.944824f, 0.007099f, 0.941406f, 0.007175f, 0.937012f,
+ 0.007301f, 0.933105f, 0.007301f, 0.929199f, 0.007362f, 0.924316f, 0.007454f, 0.919434f,
+ 0.007896f, 0.914062f, 0.008125f, 0.908203f, 0.007851f, 0.901855f, 0.008072f, 0.895020f,
+ 0.008247f, 0.888672f, 0.008469f, 0.880859f, 0.008415f, 0.872070f, 0.008560f, 0.863281f,
+ 0.008682f, 0.853027f, 0.008728f, 0.842285f, 0.008667f, 0.831055f, 0.008972f, 0.817383f,
+ 0.009171f, 0.802734f, 0.009171f, 0.786133f, 0.009056f, 0.767090f, 0.009224f, 0.746094f,
+ 0.009338f, 0.720703f, 0.009399f, 0.690918f, 0.009277f, 0.656250f, 0.009209f, 0.613281f,
+ 0.008881f, 0.556152f, 0.008018f, 0.479980f, 0.006344f, 0.361572f, 0.001750f, 0.140137f,
+ 0.000000f, 1.000000f, 0.000346f, 0.999512f, 0.001137f, 0.998535f, 0.001666f, 0.997559f,
+ 0.001896f, 0.997070f, 0.002428f, 0.995605f, 0.002546f, 0.995117f, 0.002865f, 0.994141f,
+ 0.003471f, 0.992676f, 0.003632f, 0.991699f, 0.003733f, 0.991211f, 0.003986f, 0.989746f,
+ 0.004597f, 0.988281f, 0.004780f, 0.986816f, 0.004925f, 0.985840f, 0.005161f, 0.984375f,
+ 0.005806f, 0.982910f, 0.006012f, 0.980957f, 0.006207f, 0.979980f, 0.006275f, 0.977539f,
+ 0.006344f, 0.976074f, 0.006508f, 0.973633f, 0.007065f, 0.971680f, 0.007107f, 0.969238f,
+ 0.007320f, 0.967285f, 0.007576f, 0.965332f, 0.007610f, 0.962891f, 0.008110f, 0.959961f,
+ 0.008354f, 0.957031f, 0.008522f, 0.954102f, 0.008598f, 0.951172f, 0.008766f, 0.948242f,
+ 0.008957f, 0.945312f, 0.009407f, 0.941406f, 0.009468f, 0.937012f, 0.009689f, 0.933105f,
+ 0.009804f, 0.928711f, 0.009987f, 0.924316f, 0.010010f, 0.920410f, 0.010437f, 0.914551f,
+ 0.010651f, 0.908691f, 0.010902f, 0.903320f, 0.010994f, 0.896973f, 0.010918f, 0.890137f,
+ 0.011215f, 0.883301f, 0.011658f, 0.875488f, 0.011513f, 0.866211f, 0.011780f, 0.856934f,
+ 0.012001f, 0.847656f, 0.012184f, 0.836914f, 0.012245f, 0.825195f, 0.012466f, 0.811523f,
+ 0.012611f, 0.796387f, 0.012634f, 0.779785f, 0.012840f, 0.761719f, 0.012894f, 0.740723f,
+ 0.012962f, 0.715332f, 0.012917f, 0.686035f, 0.012718f, 0.651855f, 0.012573f, 0.608887f,
+ 0.012062f, 0.553223f, 0.010689f, 0.478271f, 0.008224f, 0.360596f, 0.002150f, 0.138794f,
+ 0.000000f, 1.000000f, 0.000445f, 0.999512f, 0.000841f, 0.998535f, 0.001440f, 0.997559f,
+ 0.002459f, 0.996094f, 0.003067f, 0.995117f, 0.003235f, 0.994629f, 0.003654f, 0.993164f,
+ 0.004238f, 0.991699f, 0.004494f, 0.990723f, 0.004860f, 0.989746f, 0.005138f, 0.988281f,
+ 0.005749f, 0.986816f, 0.005981f, 0.985352f, 0.006237f, 0.984375f, 0.006649f, 0.982422f,
+ 0.006897f, 0.980957f, 0.007587f, 0.979004f, 0.007866f, 0.977539f, 0.008148f, 0.975586f,
+ 0.008362f, 0.974121f, 0.008499f, 0.971191f, 0.009018f, 0.968750f, 0.009354f, 0.966309f,
+ 0.009430f, 0.963867f, 0.009689f, 0.962402f, 0.010170f, 0.959473f, 0.010666f, 0.956543f,
+ 0.010933f, 0.953613f, 0.011169f, 0.950195f, 0.011406f, 0.947266f, 0.011528f, 0.944336f,
+ 0.011856f, 0.940430f, 0.012527f, 0.936523f, 0.012489f, 0.932129f, 0.012817f, 0.928223f,
+ 0.013138f, 0.924316f, 0.013268f, 0.919434f, 0.013329f, 0.914551f, 0.014114f, 0.909180f,
+ 0.014297f, 0.902832f, 0.014488f, 0.896973f, 0.014915f, 0.891113f, 0.014633f, 0.883789f,
+ 0.014999f, 0.876953f, 0.015823f, 0.869141f, 0.015915f, 0.859863f, 0.015991f, 0.851074f,
+ 0.016205f, 0.840820f, 0.016357f, 0.830566f, 0.016586f, 0.818359f, 0.016861f, 0.804199f,
+ 0.017090f, 0.789551f, 0.017365f, 0.773926f, 0.017380f, 0.755371f, 0.017532f, 0.733887f,
+ 0.017487f, 0.708984f, 0.017639f, 0.681152f, 0.017044f, 0.646484f, 0.016693f, 0.604492f,
+ 0.015839f, 0.549316f, 0.013962f, 0.476074f, 0.010414f, 0.359375f, 0.002602f, 0.138428f,
+ 0.000000f, 1.000000f, 0.000567f, 0.999512f, 0.001287f, 0.998535f, 0.001986f, 0.997559f,
+ 0.003025f, 0.996094f, 0.003273f, 0.995117f, 0.003963f, 0.993652f, 0.004589f, 0.992188f,
+ 0.004883f, 0.991211f, 0.005531f, 0.989746f, 0.006042f, 0.987793f, 0.006466f, 0.986328f,
+ 0.007206f, 0.984863f, 0.007431f, 0.983398f, 0.007710f, 0.981934f, 0.008362f, 0.979980f,
+ 0.008751f, 0.978516f, 0.009453f, 0.976074f, 0.009796f, 0.974609f, 0.010170f, 0.973145f,
+ 0.010765f, 0.970703f, 0.010979f, 0.968262f, 0.011597f, 0.965332f, 0.012001f, 0.963379f,
+ 0.012146f, 0.960449f, 0.012527f, 0.958496f, 0.012993f, 0.955078f, 0.013840f, 0.952148f,
+ 0.014061f, 0.949219f, 0.014412f, 0.946289f, 0.014709f, 0.942871f, 0.014755f, 0.938965f,
+ 0.015503f, 0.935547f, 0.016220f, 0.931641f, 0.016678f, 0.927246f, 0.016678f, 0.922852f,
+ 0.017090f, 0.918457f, 0.017548f, 0.914062f, 0.017929f, 0.908203f, 0.018402f, 0.902344f,
+ 0.018784f, 0.896973f, 0.019119f, 0.890625f, 0.019592f, 0.884277f, 0.019775f, 0.877930f,
+ 0.020081f, 0.870117f, 0.020844f, 0.861816f, 0.021286f, 0.853516f, 0.021210f, 0.843750f,
+ 0.021576f, 0.833496f, 0.022064f, 0.823730f, 0.022598f, 0.811035f, 0.022675f, 0.796875f,
+ 0.023010f, 0.782715f, 0.023300f, 0.766602f, 0.023331f, 0.748535f, 0.023422f, 0.727051f,
+ 0.023621f, 0.702637f, 0.023300f, 0.674805f, 0.022552f, 0.641602f, 0.022049f, 0.599609f,
+ 0.020660f, 0.545898f, 0.017868f, 0.473389f, 0.013100f, 0.357910f, 0.003113f, 0.138184f,
+ 0.000000f, 1.000000f, 0.000884f, 0.999023f, 0.001711f, 0.998047f, 0.001951f, 0.997070f,
+ 0.003389f, 0.995605f, 0.004044f, 0.994141f, 0.004463f, 0.993164f, 0.005726f, 0.991211f,
+ 0.006020f, 0.989746f, 0.006794f, 0.988770f, 0.007607f, 0.986328f, 0.007980f, 0.984375f,
+ 0.008392f, 0.983398f, 0.009178f, 0.981445f, 0.009590f, 0.979980f, 0.010414f, 0.977539f,
+ 0.010872f, 0.975586f, 0.011703f, 0.973633f, 0.012115f, 0.971680f, 0.012619f, 0.969727f,
+ 0.013443f, 0.967285f, 0.013969f, 0.964844f, 0.014908f, 0.962402f, 0.014900f, 0.959473f,
+ 0.015396f, 0.957031f, 0.016006f, 0.953613f, 0.016602f, 0.950684f, 0.017349f, 0.947266f,
+ 0.017944f, 0.944336f, 0.018280f, 0.940918f, 0.018692f, 0.937988f, 0.019394f, 0.934082f,
+ 0.019684f, 0.929688f, 0.020737f, 0.925293f, 0.021286f, 0.921387f, 0.021835f, 0.916992f,
+ 0.021912f, 0.912109f, 0.022522f, 0.907715f, 0.023224f, 0.901855f, 0.023865f, 0.895996f,
+ 0.024429f, 0.889648f, 0.024933f, 0.883789f, 0.025391f, 0.877441f, 0.025742f, 0.871094f,
+ 0.026443f, 0.862305f, 0.027206f, 0.853516f, 0.027985f, 0.845703f, 0.027512f, 0.835938f,
+ 0.028564f, 0.826172f, 0.028915f, 0.815430f, 0.029648f, 0.802734f, 0.029831f, 0.789062f,
+ 0.030258f, 0.774414f, 0.030441f, 0.758789f, 0.030350f, 0.741211f, 0.030777f, 0.719727f,
+ 0.030792f, 0.695801f, 0.030304f, 0.668457f, 0.029510f, 0.635742f, 0.028397f, 0.593750f,
+ 0.026428f, 0.541016f, 0.022705f, 0.470947f, 0.016251f, 0.356689f, 0.003714f, 0.137451f,
+ 0.000000f, 1.000000f, 0.000584f, 0.999512f, 0.002298f, 0.997559f, 0.002819f, 0.997070f,
+ 0.003706f, 0.995117f, 0.004578f, 0.993652f, 0.005592f, 0.991699f, 0.006565f, 0.990234f,
+ 0.007416f, 0.988281f, 0.007896f, 0.987305f, 0.009377f, 0.984375f, 0.009865f, 0.982422f,
+ 0.010300f, 0.981445f, 0.011208f, 0.979492f, 0.011887f, 0.977051f, 0.012871f, 0.974609f,
+ 0.013397f, 0.972656f, 0.013908f, 0.970703f, 0.014862f, 0.968262f, 0.015945f, 0.965820f,
+ 0.016617f, 0.962891f, 0.017258f, 0.960449f, 0.018311f, 0.958008f, 0.018890f, 0.955566f,
+ 0.019394f, 0.952637f, 0.020203f, 0.948730f, 0.020676f, 0.945312f, 0.021805f, 0.942383f,
+ 0.022247f, 0.938477f, 0.022995f, 0.935547f, 0.023529f, 0.932129f, 0.024750f, 0.927734f,
+ 0.025192f, 0.923340f, 0.025940f, 0.918457f, 0.026810f, 0.914551f, 0.027481f, 0.910156f,
+ 0.027878f, 0.905762f, 0.028824f, 0.899902f, 0.029724f, 0.894043f, 0.030685f, 0.888184f,
+ 0.031128f, 0.882324f, 0.031830f, 0.875977f, 0.032349f, 0.869629f, 0.033325f, 0.861816f,
+ 0.033875f, 0.854004f, 0.034576f, 0.845215f, 0.035461f, 0.836914f, 0.036560f, 0.828125f,
+ 0.036255f, 0.817871f, 0.037048f, 0.806152f, 0.038361f, 0.793945f, 0.038666f, 0.780762f,
+ 0.038910f, 0.766602f, 0.039032f, 0.750977f, 0.039368f, 0.732910f, 0.039459f, 0.711914f,
+ 0.039429f, 0.688477f, 0.038910f, 0.661621f, 0.037628f, 0.630371f, 0.036163f, 0.588867f,
+ 0.033325f, 0.537598f, 0.028214f, 0.468262f, 0.019897f, 0.354980f, 0.004387f, 0.137207f,
+ 0.000000f, 1.000000f, 0.000891f, 0.999023f, 0.002415f, 0.997559f, 0.003820f, 0.996094f,
+ 0.004219f, 0.994629f, 0.005196f, 0.993164f, 0.006588f, 0.990723f, 0.008102f, 0.988770f,
+ 0.008575f, 0.986816f, 0.009933f, 0.984863f, 0.010605f, 0.982910f, 0.012047f, 0.980469f,
+ 0.012604f, 0.978516f, 0.013466f, 0.976562f, 0.014641f, 0.973633f, 0.015793f, 0.971191f,
+ 0.016373f, 0.968750f, 0.017044f, 0.966797f, 0.018417f, 0.964355f, 0.019623f, 0.960938f,
+ 0.020416f, 0.958008f, 0.021164f, 0.955566f, 0.021912f, 0.953125f, 0.023056f, 0.950195f,
+ 0.024231f, 0.946777f, 0.025192f, 0.943359f, 0.025818f, 0.939453f, 0.026382f, 0.936035f,
+ 0.027679f, 0.932617f, 0.028244f, 0.928711f, 0.029495f, 0.924805f, 0.030594f, 0.920410f,
+ 0.031647f, 0.916504f, 0.032593f, 0.911621f, 0.033081f, 0.906738f, 0.034149f, 0.902344f,
+ 0.035248f, 0.897461f, 0.036316f, 0.891602f, 0.037109f, 0.885742f, 0.038513f, 0.879883f,
+ 0.039307f, 0.873535f, 0.039673f, 0.867188f, 0.040680f, 0.860352f, 0.041687f, 0.852539f,
+ 0.042542f, 0.844727f, 0.043793f, 0.836426f, 0.044586f, 0.827637f, 0.045471f, 0.818359f,
+ 0.045532f, 0.808594f, 0.047180f, 0.796875f, 0.048004f, 0.784668f, 0.048340f, 0.771484f,
+ 0.048523f, 0.757324f, 0.049103f, 0.742188f, 0.049530f, 0.724121f, 0.049683f, 0.703125f,
+ 0.049164f, 0.680664f, 0.048218f, 0.654297f, 0.046448f, 0.623047f, 0.044464f, 0.582520f,
+ 0.041016f, 0.532715f, 0.034302f, 0.465332f, 0.024048f, 0.353760f, 0.005123f, 0.136719f,
+ 0.000000f, 1.000000f, 0.001649f, 0.998535f, 0.002653f, 0.997559f, 0.003967f, 0.995605f,
+ 0.005466f, 0.993652f, 0.006485f, 0.991699f, 0.007828f, 0.989746f, 0.009010f, 0.987793f,
+ 0.010452f, 0.985352f, 0.012352f, 0.982422f, 0.013054f, 0.979980f, 0.014214f, 0.978027f,
+ 0.015335f, 0.975586f, 0.016678f, 0.972656f, 0.017548f, 0.970215f, 0.019211f, 0.967285f,
+ 0.020004f, 0.964844f, 0.020721f, 0.962891f, 0.022217f, 0.958984f, 0.023972f, 0.956055f,
+ 0.024918f, 0.953125f, 0.025787f, 0.950195f, 0.026688f, 0.947754f, 0.028519f, 0.943848f,
+ 0.029663f, 0.940430f, 0.031082f, 0.937012f, 0.031830f, 0.933105f, 0.032562f, 0.929688f,
+ 0.033691f, 0.925781f, 0.035278f, 0.921387f, 0.036530f, 0.916504f, 0.037811f, 0.912109f,
+ 0.038727f, 0.908203f, 0.040344f, 0.903809f, 0.041077f, 0.898926f, 0.042023f, 0.893555f,
+ 0.043884f, 0.888184f, 0.045135f, 0.882324f, 0.045746f, 0.876465f, 0.047089f, 0.870117f,
+ 0.048584f, 0.864746f, 0.049011f, 0.857910f, 0.050323f, 0.850098f, 0.052094f, 0.842773f,
+ 0.052979f, 0.834473f, 0.054321f, 0.826172f, 0.054962f, 0.817383f, 0.056122f, 0.808594f,
+ 0.057281f, 0.798340f, 0.057892f, 0.786133f, 0.058990f, 0.773926f, 0.059723f, 0.761719f,
+ 0.059998f, 0.747559f, 0.060394f, 0.732910f, 0.060944f, 0.714355f, 0.060608f, 0.694336f,
+ 0.060394f, 0.672363f, 0.058990f, 0.646973f, 0.056885f, 0.615723f, 0.054199f, 0.576660f,
+ 0.049194f, 0.527832f, 0.041016f, 0.462158f, 0.028503f, 0.352051f, 0.005947f, 0.136230f,
+ 0.000000f, 1.000000f, 0.001497f, 0.998535f, 0.003502f, 0.997070f, 0.004753f, 0.995117f,
+ 0.006893f, 0.992676f, 0.008080f, 0.990234f, 0.009911f, 0.987793f, 0.010658f, 0.985840f,
+ 0.012436f, 0.983398f, 0.014671f, 0.979980f, 0.015594f, 0.978027f, 0.017273f, 0.975098f,
+ 0.018555f, 0.972168f, 0.020477f, 0.968750f, 0.021515f, 0.965820f, 0.022858f, 0.963379f,
+ 0.024246f, 0.960449f, 0.025681f, 0.957031f, 0.027191f, 0.953613f, 0.029160f, 0.950195f,
+ 0.030243f, 0.947266f, 0.031281f, 0.944336f, 0.032684f, 0.940918f, 0.034790f, 0.936523f,
+ 0.036102f, 0.933105f, 0.037720f, 0.929199f, 0.038940f, 0.925781f, 0.040161f, 0.922363f,
+ 0.041534f, 0.917480f, 0.043030f, 0.912598f, 0.044830f, 0.907715f, 0.045929f, 0.903320f,
+ 0.047363f, 0.898926f, 0.048859f, 0.894531f, 0.050537f, 0.889648f, 0.051971f, 0.883301f,
+ 0.053345f, 0.877441f, 0.054749f, 0.872070f, 0.056091f, 0.866211f, 0.057312f, 0.859863f,
+ 0.058716f, 0.854004f, 0.060486f, 0.846680f, 0.061951f, 0.838867f, 0.063354f, 0.831055f,
+ 0.065125f, 0.823730f, 0.066040f, 0.815430f, 0.067017f, 0.807129f, 0.068054f, 0.796875f,
+ 0.069946f, 0.786621f, 0.070374f, 0.774902f, 0.072144f, 0.763672f, 0.072388f, 0.750977f,
+ 0.072632f, 0.737793f, 0.073303f, 0.722168f, 0.073547f, 0.704590f, 0.073547f, 0.685059f,
+ 0.072021f, 0.663086f, 0.070496f, 0.639160f, 0.068604f, 0.608398f, 0.064697f, 0.570312f,
+ 0.058472f, 0.523438f, 0.048737f, 0.458496f, 0.033386f, 0.349854f, 0.006901f, 0.135986f,
+ 0.000000f, 1.000000f, 0.002352f, 0.998047f, 0.004051f, 0.996582f, 0.006329f, 0.994141f,
+ 0.007641f, 0.992188f, 0.009933f, 0.988770f, 0.011406f, 0.986328f, 0.013268f, 0.983887f,
+ 0.014984f, 0.980957f, 0.016663f, 0.977539f, 0.019104f, 0.974609f, 0.020081f, 0.971680f,
+ 0.022980f, 0.967285f, 0.024582f, 0.964355f, 0.026245f, 0.960938f, 0.027771f, 0.958008f,
+ 0.029709f, 0.954590f, 0.031464f, 0.950684f, 0.033142f, 0.947266f, 0.034454f, 0.943848f,
+ 0.036621f, 0.939941f, 0.038086f, 0.936523f, 0.039948f, 0.932617f, 0.041840f, 0.928223f,
+ 0.044128f, 0.924316f, 0.045563f, 0.920410f, 0.046997f, 0.916992f, 0.048950f, 0.912598f,
+ 0.051483f, 0.907715f, 0.052490f, 0.902832f, 0.054199f, 0.897949f, 0.055817f, 0.893066f,
+ 0.057068f, 0.888672f, 0.059265f, 0.883789f, 0.061432f, 0.877930f, 0.063354f, 0.872559f,
+ 0.064636f, 0.866211f, 0.066162f, 0.860352f, 0.067749f, 0.854980f, 0.069641f, 0.849121f,
+ 0.071167f, 0.841309f, 0.073364f, 0.833984f, 0.074890f, 0.826660f, 0.076477f, 0.819336f,
+ 0.078064f, 0.811523f, 0.079346f, 0.803711f, 0.080505f, 0.794922f, 0.082031f, 0.784180f,
+ 0.083984f, 0.773926f, 0.085083f, 0.763672f, 0.085693f, 0.751465f, 0.086121f, 0.739746f,
+ 0.086609f, 0.726562f, 0.087463f, 0.710449f, 0.087646f, 0.693848f, 0.087036f, 0.675293f,
+ 0.085266f, 0.654785f, 0.083252f, 0.631348f, 0.080750f, 0.600098f, 0.075928f, 0.563965f,
+ 0.068420f, 0.518555f, 0.056946f, 0.454102f, 0.038483f, 0.347900f, 0.007858f, 0.135254f,
+ 0.000000f, 1.000000f, 0.002439f, 0.998535f, 0.004707f, 0.996094f, 0.007305f, 0.993164f,
+ 0.009239f, 0.990723f, 0.011810f, 0.987305f, 0.014412f, 0.983887f, 0.016037f, 0.981445f,
+ 0.018570f, 0.977051f, 0.020294f, 0.974121f, 0.022430f, 0.971191f, 0.025345f, 0.966797f,
+ 0.027817f, 0.962891f, 0.030121f, 0.958984f, 0.031433f, 0.955566f, 0.033508f, 0.952148f,
+ 0.036346f, 0.947266f, 0.038422f, 0.943359f, 0.040344f, 0.939453f, 0.041809f, 0.936523f,
+ 0.044434f, 0.932129f, 0.046875f, 0.927246f, 0.049011f, 0.923340f, 0.050720f, 0.919434f,
+ 0.053223f, 0.915039f, 0.054840f, 0.911133f, 0.057068f, 0.906250f, 0.059387f, 0.901367f,
+ 0.061646f, 0.896973f, 0.063904f, 0.892090f, 0.065430f, 0.886719f, 0.066895f, 0.882324f,
+ 0.069092f, 0.876953f, 0.071289f, 0.871094f, 0.074158f, 0.865234f, 0.075867f, 0.859375f,
+ 0.078308f, 0.854004f, 0.079285f, 0.848145f, 0.080994f, 0.842285f, 0.083862f, 0.835449f,
+ 0.086243f, 0.828125f, 0.087585f, 0.820801f, 0.089966f, 0.813477f, 0.091187f, 0.806152f,
+ 0.092896f, 0.798340f, 0.094604f, 0.791016f, 0.096069f, 0.780762f, 0.098022f, 0.770996f,
+ 0.099365f, 0.760742f, 0.100098f, 0.750977f, 0.101135f, 0.739258f, 0.102356f, 0.729004f,
+ 0.103210f, 0.714355f, 0.103210f, 0.698730f, 0.102417f, 0.682617f, 0.101868f, 0.664551f,
+ 0.099792f, 0.645508f, 0.097229f, 0.621094f, 0.093933f, 0.591797f, 0.087463f, 0.556641f,
+ 0.078369f, 0.513184f, 0.065491f, 0.449707f, 0.044067f, 0.346436f, 0.008972f, 0.134521f,
+ 0.000000f, 1.000000f, 0.003529f, 0.997559f, 0.005974f, 0.995117f, 0.009094f, 0.991699f,
+ 0.011642f, 0.988770f, 0.014702f, 0.984863f, 0.017014f, 0.981445f, 0.020248f, 0.977539f,
+ 0.022858f, 0.973145f, 0.025253f, 0.969727f, 0.027954f, 0.965820f, 0.030640f, 0.960938f,
+ 0.033264f, 0.957031f, 0.035858f, 0.953125f, 0.038605f, 0.948730f, 0.041321f, 0.943848f,
+ 0.044556f, 0.939453f, 0.046326f, 0.935547f, 0.048950f, 0.931152f, 0.051178f, 0.927246f,
+ 0.054169f, 0.921875f, 0.057037f, 0.916992f, 0.059387f, 0.912598f, 0.061249f, 0.908691f,
+ 0.063049f, 0.904785f, 0.066833f, 0.898926f, 0.069458f, 0.893555f, 0.071594f, 0.889160f,
+ 0.074036f, 0.884277f, 0.076477f, 0.879395f, 0.078918f, 0.875000f, 0.080994f, 0.869141f,
+ 0.083435f, 0.862793f, 0.086060f, 0.857422f, 0.088440f, 0.851074f, 0.091003f, 0.845703f,
+ 0.092834f, 0.840332f, 0.094604f, 0.834961f, 0.097046f, 0.827637f, 0.099915f, 0.820312f,
+ 0.101990f, 0.812988f, 0.104065f, 0.806152f, 0.105774f, 0.799316f, 0.107361f, 0.792480f,
+ 0.109558f, 0.784668f, 0.111511f, 0.774902f, 0.113464f, 0.766113f, 0.115112f, 0.756348f,
+ 0.116272f, 0.747070f, 0.117432f, 0.737305f, 0.117615f, 0.727051f, 0.119019f, 0.714355f,
+ 0.119812f, 0.700684f, 0.119629f, 0.686035f, 0.119202f, 0.671387f, 0.117493f, 0.654297f,
+ 0.114807f, 0.635742f, 0.112305f, 0.611816f, 0.107849f, 0.583984f, 0.100586f, 0.549805f,
+ 0.089844f, 0.508301f, 0.074646f, 0.445312f, 0.049500f, 0.344727f, 0.009995f, 0.133423f,
+ 0.000000f, 1.000000f, 0.004250f, 0.997070f, 0.007221f, 0.994141f, 0.010933f, 0.990723f,
+ 0.014549f, 0.986328f, 0.017883f, 0.982422f, 0.020493f, 0.978516f, 0.024826f, 0.973145f,
+ 0.027710f, 0.969238f, 0.030869f, 0.964844f, 0.034729f, 0.958984f, 0.038239f, 0.954102f,
+ 0.040649f, 0.950195f, 0.043274f, 0.946289f, 0.047821f, 0.939453f, 0.050964f, 0.934570f,
+ 0.053497f, 0.930664f, 0.056427f, 0.925781f, 0.059631f, 0.920410f, 0.063293f, 0.915039f,
+ 0.066406f, 0.910156f, 0.068665f, 0.905762f, 0.071655f, 0.900879f, 0.073975f, 0.895996f,
+ 0.077148f, 0.890625f, 0.080872f, 0.884766f, 0.083618f, 0.879395f, 0.086304f, 0.875000f,
+ 0.088501f, 0.870117f, 0.091248f, 0.865723f, 0.094971f, 0.858887f, 0.097839f, 0.853516f,
+ 0.099976f, 0.847656f, 0.102356f, 0.841797f, 0.105164f, 0.835938f, 0.107422f, 0.830566f,
+ 0.109802f, 0.824219f, 0.113098f, 0.817871f, 0.115723f, 0.811035f, 0.117920f, 0.803711f,
+ 0.120361f, 0.797363f, 0.122375f, 0.790527f, 0.123962f, 0.784180f, 0.125977f, 0.776367f,
+ 0.128540f, 0.767578f, 0.130493f, 0.758789f, 0.132568f, 0.750977f, 0.133667f, 0.741699f,
+ 0.134888f, 0.732910f, 0.135742f, 0.723633f, 0.136719f, 0.712402f, 0.137451f, 0.699707f,
+ 0.137817f, 0.687500f, 0.137085f, 0.673340f, 0.136108f, 0.659180f, 0.133911f, 0.643555f,
+ 0.130981f, 0.624023f, 0.127563f, 0.601074f, 0.121948f, 0.574707f, 0.113342f, 0.542969f,
+ 0.100891f, 0.503418f, 0.083862f, 0.440430f, 0.055878f, 0.343750f, 0.011185f, 0.132202f,
+ 0.000000f, 1.000000f, 0.005173f, 0.997070f, 0.009926f, 0.992676f, 0.013885f, 0.988770f,
+ 0.018921f, 0.983398f, 0.022049f, 0.979004f, 0.026917f, 0.973145f, 0.031281f, 0.967773f,
+ 0.034454f, 0.963379f, 0.038971f, 0.957520f, 0.043365f, 0.951660f, 0.046631f, 0.946777f,
+ 0.050751f, 0.941406f, 0.054413f, 0.935547f, 0.057861f, 0.930176f, 0.062195f, 0.924316f,
+ 0.065369f, 0.919434f, 0.069702f, 0.913086f, 0.073853f, 0.907227f, 0.076843f, 0.901855f,
+ 0.080200f, 0.896973f, 0.083008f, 0.892090f, 0.086792f, 0.886230f, 0.090820f, 0.879883f,
+ 0.093872f, 0.874512f, 0.097290f, 0.869141f, 0.100220f, 0.864258f, 0.102966f, 0.859375f,
+ 0.106567f, 0.853027f, 0.109802f, 0.847168f, 0.113708f, 0.841309f, 0.116699f, 0.835938f,
+ 0.119202f, 0.830566f, 0.121277f, 0.825195f, 0.123718f, 0.819824f, 0.127686f, 0.812500f,
+ 0.130615f, 0.805176f, 0.133301f, 0.799316f, 0.135864f, 0.793457f, 0.138306f, 0.787109f,
+ 0.139893f, 0.780273f, 0.142212f, 0.774414f, 0.145264f, 0.766113f, 0.147217f, 0.758301f,
+ 0.149414f, 0.750488f, 0.151733f, 0.742188f, 0.152222f, 0.734375f, 0.153931f, 0.726562f,
+ 0.154297f, 0.718262f, 0.156250f, 0.707520f, 0.157349f, 0.696289f, 0.157104f, 0.684570f,
+ 0.157593f, 0.673340f, 0.155640f, 0.660645f, 0.154419f, 0.647461f, 0.151489f, 0.631836f,
+ 0.148682f, 0.611816f, 0.143799f, 0.590332f, 0.137329f, 0.565918f, 0.126709f, 0.535645f,
+ 0.112793f, 0.496826f, 0.093506f, 0.435303f, 0.062134f, 0.342285f, 0.012444f, 0.131714f,
+ 0.000000f, 1.000000f, 0.006569f, 0.996094f, 0.012505f, 0.991211f, 0.017624f, 0.985352f,
+ 0.023590f, 0.979980f, 0.028275f, 0.974121f, 0.033844f, 0.967773f, 0.038513f, 0.961914f,
+ 0.044373f, 0.955078f, 0.049347f, 0.948242f, 0.053589f, 0.942871f, 0.058655f, 0.936035f,
+ 0.063782f, 0.929199f, 0.068542f, 0.923340f, 0.071411f, 0.917969f, 0.075806f, 0.912109f,
+ 0.081299f, 0.904785f, 0.085266f, 0.898438f, 0.089966f, 0.892578f, 0.093567f, 0.887207f,
+ 0.097473f, 0.881348f, 0.102356f, 0.874512f, 0.106567f, 0.868164f, 0.109802f, 0.862793f,
+ 0.112976f, 0.857422f, 0.116394f, 0.852051f, 0.120117f, 0.845703f, 0.124756f, 0.838867f,
+ 0.128052f, 0.833496f, 0.131226f, 0.828125f, 0.135132f, 0.822266f, 0.137695f, 0.817383f,
+ 0.140503f, 0.812500f, 0.144409f, 0.805176f, 0.147095f, 0.798828f, 0.150757f, 0.791504f,
+ 0.152954f, 0.785645f, 0.155762f, 0.779785f, 0.157959f, 0.774414f, 0.160645f, 0.769043f,
+ 0.162842f, 0.761230f, 0.166138f, 0.753418f, 0.168213f, 0.746094f, 0.170532f, 0.739258f,
+ 0.172363f, 0.732422f, 0.173218f, 0.724609f, 0.174683f, 0.717773f, 0.175659f, 0.709961f,
+ 0.176758f, 0.699707f, 0.178589f, 0.689941f, 0.178589f, 0.679688f, 0.177856f, 0.669434f,
+ 0.177124f, 0.658691f, 0.174927f, 0.647949f, 0.172729f, 0.634766f, 0.170776f, 0.617676f,
+ 0.166870f, 0.600098f, 0.160645f, 0.579590f, 0.152466f, 0.557129f, 0.140869f, 0.529785f,
+ 0.125854f, 0.489014f, 0.104065f, 0.431885f, 0.068237f, 0.339844f, 0.013725f, 0.130493f,
+ 0.000000f, 1.000000f, 0.007759f, 0.995605f, 0.015671f, 0.989258f, 0.023575f, 0.981445f,
+ 0.029465f, 0.975586f, 0.037933f, 0.966797f, 0.043427f, 0.960449f, 0.050018f, 0.952148f,
+ 0.056335f, 0.944824f, 0.062500f, 0.937988f, 0.068481f, 0.930176f, 0.074158f, 0.922363f,
+ 0.079895f, 0.915527f, 0.084900f, 0.909668f, 0.090332f, 0.901367f, 0.095703f, 0.894043f,
+ 0.100891f, 0.887695f, 0.104919f, 0.881836f, 0.109680f, 0.875000f, 0.115845f, 0.866699f,
+ 0.120544f, 0.860352f, 0.124084f, 0.854492f, 0.128784f, 0.848633f, 0.131958f, 0.843262f,
+ 0.136841f, 0.835938f, 0.141357f, 0.829590f, 0.145264f, 0.823242f, 0.149414f, 0.817383f,
+ 0.152466f, 0.812012f, 0.155029f, 0.807129f, 0.159058f, 0.800781f, 0.163452f, 0.794434f,
+ 0.167358f, 0.788086f, 0.170410f, 0.782227f, 0.172974f, 0.776855f, 0.175781f, 0.770508f,
+ 0.177979f, 0.765137f, 0.179688f, 0.759766f, 0.183594f, 0.752441f, 0.186890f, 0.745605f,
+ 0.190186f, 0.739258f, 0.191528f, 0.732422f, 0.193237f, 0.726074f, 0.194580f, 0.719727f,
+ 0.196289f, 0.713867f, 0.196655f, 0.707031f, 0.199219f, 0.698242f, 0.200073f, 0.689453f,
+ 0.200806f, 0.681152f, 0.201050f, 0.671875f, 0.200928f, 0.663574f, 0.200195f, 0.654785f,
+ 0.197754f, 0.644531f, 0.195801f, 0.633789f, 0.193848f, 0.619141f, 0.190430f, 0.604004f,
+ 0.185303f, 0.587891f, 0.177979f, 0.569824f, 0.168091f, 0.548340f, 0.154663f, 0.521973f,
+ 0.138916f, 0.481201f, 0.114075f, 0.427246f, 0.075012f, 0.338623f, 0.015144f, 0.130371f,
+ 0.000000f, 1.000000f, 0.009789f, 0.995117f, 0.020401f, 0.986816f, 0.030792f, 0.977539f,
+ 0.040192f, 0.967773f, 0.048706f, 0.958984f, 0.057617f, 0.949219f, 0.065247f, 0.940430f,
+ 0.071655f, 0.932617f, 0.080688f, 0.922363f, 0.088257f, 0.914062f, 0.093506f, 0.906738f,
+ 0.101685f, 0.897461f, 0.107361f, 0.889648f, 0.114380f, 0.881348f, 0.118652f, 0.874512f,
+ 0.125122f, 0.866699f, 0.131348f, 0.858398f, 0.136230f, 0.851562f, 0.141479f, 0.844727f,
+ 0.146362f, 0.838379f, 0.151367f, 0.831055f, 0.156128f, 0.823730f, 0.161987f, 0.816895f,
+ 0.165771f, 0.811035f, 0.169556f, 0.805176f, 0.172974f, 0.799805f, 0.176514f, 0.793945f,
+ 0.181519f, 0.786621f, 0.185181f, 0.780273f, 0.189453f, 0.774414f, 0.192749f, 0.768555f,
+ 0.195923f, 0.763184f, 0.198120f, 0.758789f, 0.200439f, 0.754395f, 0.205200f, 0.747070f,
+ 0.207642f, 0.740234f, 0.210571f, 0.733887f, 0.212524f, 0.728027f, 0.214844f, 0.722168f,
+ 0.217285f, 0.716797f, 0.218384f, 0.711426f, 0.218872f, 0.706055f, 0.220215f, 0.699219f,
+ 0.223633f, 0.691406f, 0.224609f, 0.684082f, 0.225464f, 0.676758f, 0.225952f, 0.669922f,
+ 0.225098f, 0.662109f, 0.224731f, 0.655273f, 0.223755f, 0.647949f, 0.221069f, 0.639160f,
+ 0.220337f, 0.627441f, 0.219238f, 0.616211f, 0.215454f, 0.603516f, 0.210205f, 0.590820f,
+ 0.203491f, 0.576172f, 0.195312f, 0.559570f, 0.183350f, 0.540527f, 0.170532f, 0.511230f,
+ 0.151855f, 0.473877f, 0.124939f, 0.422363f, 0.081238f, 0.337402f, 0.016525f, 0.129395f,
+ 0.000000f, 1.000000f, 0.015991f, 0.991211f, 0.029984f, 0.980469f, 0.042206f, 0.969727f,
+ 0.054382f, 0.958496f, 0.067261f, 0.945801f, 0.076294f, 0.935547f, 0.086426f, 0.923828f,
+ 0.097046f, 0.913086f, 0.104065f, 0.904297f, 0.114136f, 0.892578f, 0.122681f, 0.883301f,
+ 0.128784f, 0.875000f, 0.135620f, 0.866211f, 0.143311f, 0.856445f, 0.151489f, 0.847168f,
+ 0.156494f, 0.839844f, 0.162476f, 0.833008f, 0.167847f, 0.825195f, 0.173706f, 0.816895f,
+ 0.179810f, 0.809570f, 0.185547f, 0.801758f, 0.189575f, 0.796387f, 0.193604f, 0.790039f,
+ 0.199219f, 0.782715f, 0.203369f, 0.775879f, 0.208008f, 0.769531f, 0.212158f, 0.763184f,
+ 0.214844f, 0.757812f, 0.218140f, 0.752930f, 0.220947f, 0.748047f, 0.224243f, 0.742188f,
+ 0.228516f, 0.735352f, 0.231812f, 0.729492f, 0.234497f, 0.724609f, 0.237915f, 0.719238f,
+ 0.239868f, 0.714355f, 0.241211f, 0.708984f, 0.242310f, 0.704102f, 0.242920f, 0.700195f,
+ 0.246338f, 0.692383f, 0.249023f, 0.686523f, 0.250000f, 0.680176f, 0.250977f, 0.674316f,
+ 0.251953f, 0.667969f, 0.251953f, 0.662598f, 0.251709f, 0.656250f, 0.251221f, 0.650879f,
+ 0.249878f, 0.645020f, 0.249634f, 0.637207f, 0.248657f, 0.627930f, 0.247070f, 0.618652f,
+ 0.244629f, 0.609375f, 0.241211f, 0.599609f, 0.235840f, 0.588867f, 0.230469f, 0.578125f,
+ 0.222046f, 0.565918f, 0.212280f, 0.551270f, 0.202393f, 0.528809f, 0.186279f, 0.500488f,
+ 0.165771f, 0.466797f, 0.135498f, 0.418213f, 0.088379f, 0.337646f, 0.017944f, 0.129150f,
+ 0.000000f, 1.000000f, 0.022446f, 0.989258f, 0.041748f, 0.974609f, 0.060333f, 0.958984f,
+ 0.077515f, 0.942871f, 0.090454f, 0.929199f, 0.105896f, 0.914551f, 0.115723f, 0.902832f,
+ 0.130127f, 0.887695f, 0.140137f, 0.876465f, 0.147583f, 0.866699f, 0.159058f, 0.853516f,
+ 0.167236f, 0.843750f, 0.174194f, 0.834961f, 0.182129f, 0.825195f, 0.189453f, 0.815430f,
+ 0.197632f, 0.806152f, 0.202881f, 0.798828f, 0.208008f, 0.791992f, 0.212891f, 0.784668f,
+ 0.219360f, 0.776367f, 0.225342f, 0.768555f, 0.230591f, 0.761719f, 0.234497f, 0.755859f,
+ 0.238281f, 0.749512f, 0.241333f, 0.744141f, 0.244507f, 0.738281f, 0.250244f, 0.731445f,
+ 0.253662f, 0.725098f, 0.257324f, 0.719238f, 0.259766f, 0.714355f, 0.262451f, 0.709961f,
+ 0.265137f, 0.705078f, 0.266602f, 0.701172f, 0.268066f, 0.697266f, 0.270752f, 0.691406f,
+ 0.273926f, 0.685547f, 0.276611f, 0.680176f, 0.277344f, 0.675293f, 0.278320f, 0.669922f,
+ 0.280029f, 0.665039f, 0.280518f, 0.660645f, 0.280518f, 0.656250f, 0.280273f, 0.651855f,
+ 0.279541f, 0.647461f, 0.280029f, 0.641602f, 0.280273f, 0.634277f, 0.279785f, 0.627441f,
+ 0.279297f, 0.621582f, 0.277832f, 0.614258f, 0.275391f, 0.607422f, 0.272705f, 0.600586f,
+ 0.268555f, 0.593750f, 0.262939f, 0.585449f, 0.256592f, 0.577148f, 0.248901f, 0.567383f,
+ 0.242676f, 0.552246f, 0.232422f, 0.534668f, 0.220215f, 0.515137f, 0.202515f, 0.491211f,
+ 0.178955f, 0.459961f, 0.145630f, 0.415039f, 0.094482f, 0.337158f, 0.019440f, 0.129517f,
+ 0.000000f, 1.000000f, 0.036499f, 0.982422f, 0.064636f, 0.962402f, 0.089783f, 0.941406f,
+ 0.112305f, 0.920410f, 0.131470f, 0.901367f, 0.147095f, 0.885254f, 0.162354f, 0.868652f,
+ 0.175903f, 0.854004f, 0.186157f, 0.841797f, 0.197632f, 0.828125f, 0.207886f, 0.815430f,
+ 0.216431f, 0.805176f, 0.222778f, 0.796387f, 0.231812f, 0.785156f, 0.240356f, 0.774902f,
+ 0.246094f, 0.767090f, 0.251709f, 0.759277f, 0.255859f, 0.752441f, 0.261963f, 0.744141f,
+ 0.267090f, 0.736328f, 0.272217f, 0.729492f, 0.276367f, 0.723145f, 0.280273f, 0.716797f,
+ 0.283203f, 0.711426f, 0.286865f, 0.706055f, 0.288574f, 0.702148f, 0.292480f, 0.696289f,
+ 0.296143f, 0.689941f, 0.298828f, 0.684570f, 0.301758f, 0.679688f, 0.303711f, 0.674805f,
+ 0.305664f, 0.670410f, 0.307373f, 0.666504f, 0.308594f, 0.662598f, 0.309326f, 0.659180f,
+ 0.311035f, 0.655273f, 0.311035f, 0.652344f, 0.311523f, 0.648438f, 0.311523f, 0.643066f,
+ 0.313477f, 0.637695f, 0.313965f, 0.633301f, 0.314453f, 0.628906f, 0.313965f, 0.624512f,
+ 0.312744f, 0.619629f, 0.312012f, 0.614746f, 0.310791f, 0.610840f, 0.308105f, 0.605957f,
+ 0.305664f, 0.601074f, 0.302979f, 0.595703f, 0.299561f, 0.591309f, 0.295410f, 0.585449f,
+ 0.291504f, 0.576660f, 0.286377f, 0.567383f, 0.281494f, 0.558105f, 0.273682f, 0.547363f,
+ 0.264160f, 0.535156f, 0.251709f, 0.521484f, 0.237427f, 0.505371f, 0.217651f, 0.484375f,
+ 0.191772f, 0.456299f, 0.155762f, 0.413818f, 0.103394f, 0.327637f, 0.020920f, 0.129517f,
+ 0.000000f, 1.000000f, 0.062744f, 0.971680f, 0.109253f, 0.938477f, 0.143555f, 0.908691f,
+ 0.170654f, 0.883301f, 0.191650f, 0.861328f, 0.211426f, 0.840332f, 0.226929f, 0.822754f,
+ 0.239746f, 0.807617f, 0.252197f, 0.791992f, 0.261719f, 0.779297f, 0.270996f, 0.767090f,
+ 0.278320f, 0.757324f, 0.286133f, 0.746094f, 0.293945f, 0.735840f, 0.299561f, 0.727051f,
+ 0.305908f, 0.718262f, 0.310547f, 0.710938f, 0.314453f, 0.704102f, 0.318848f, 0.697754f,
+ 0.321777f, 0.691406f, 0.324463f, 0.686035f, 0.328125f, 0.680176f, 0.331543f, 0.673828f,
+ 0.335449f, 0.668457f, 0.338379f, 0.663086f, 0.340332f, 0.658203f, 0.342285f, 0.653809f,
+ 0.343506f, 0.649414f, 0.345703f, 0.645020f, 0.346436f, 0.641602f, 0.348877f, 0.637695f,
+ 0.348389f, 0.634277f, 0.349854f, 0.631348f, 0.349365f, 0.627930f, 0.349854f, 0.625000f,
+ 0.350098f, 0.622070f, 0.349854f, 0.619141f, 0.349854f, 0.616211f, 0.349365f, 0.612305f,
+ 0.349365f, 0.607910f, 0.348633f, 0.604492f, 0.347900f, 0.600586f, 0.346924f, 0.597656f,
+ 0.345459f, 0.593750f, 0.343506f, 0.589355f, 0.342041f, 0.585449f, 0.338623f, 0.581543f,
+ 0.335938f, 0.577148f, 0.332764f, 0.572754f, 0.328613f, 0.567871f, 0.323242f, 0.562012f,
+ 0.317139f, 0.556152f, 0.311035f, 0.550293f, 0.303955f, 0.542969f, 0.293945f, 0.534180f,
+ 0.283203f, 0.524902f, 0.269287f, 0.513672f, 0.252686f, 0.499023f, 0.231812f, 0.478516f,
+ 0.205200f, 0.448975f, 0.167847f, 0.403320f, 0.111633f, 0.322510f, 0.022476f, 0.130615f,
+ 0.000000f, 1.000000f, 0.089050f, 0.959961f, 0.144531f, 0.919922f, 0.183838f, 0.885742f,
+ 0.213135f, 0.856445f, 0.236572f, 0.831543f, 0.255615f, 0.810059f, 0.270996f, 0.791504f,
+ 0.284180f, 0.774414f, 0.294434f, 0.760254f, 0.304688f, 0.746582f, 0.313232f, 0.734863f,
+ 0.320801f, 0.723633f, 0.327881f, 0.713379f, 0.333252f, 0.704102f, 0.339355f, 0.695312f,
+ 0.343506f, 0.687500f, 0.348633f, 0.680176f, 0.353027f, 0.672852f, 0.355469f, 0.666992f,
+ 0.358887f, 0.660645f, 0.362305f, 0.654785f, 0.365479f, 0.649414f, 0.367188f, 0.644531f,
+ 0.368652f, 0.640137f, 0.371582f, 0.634766f, 0.374023f, 0.629883f, 0.375244f, 0.625977f,
+ 0.376709f, 0.622070f, 0.378662f, 0.617676f, 0.378906f, 0.614746f, 0.380127f, 0.610840f,
+ 0.380859f, 0.607422f, 0.381104f, 0.604492f, 0.381592f, 0.601074f, 0.381592f, 0.598145f,
+ 0.382324f, 0.595215f, 0.381836f, 0.592285f, 0.381348f, 0.589355f, 0.381104f, 0.586914f,
+ 0.379883f, 0.583496f, 0.379639f, 0.580078f, 0.377930f, 0.576660f, 0.376221f, 0.573730f,
+ 0.374756f, 0.570801f, 0.373047f, 0.566406f, 0.370605f, 0.562988f, 0.367920f, 0.559570f,
+ 0.364258f, 0.555176f, 0.361816f, 0.550781f, 0.356934f, 0.545898f, 0.353027f, 0.541016f,
+ 0.347168f, 0.535645f, 0.340576f, 0.529297f, 0.333496f, 0.521973f, 0.323975f, 0.513184f,
+ 0.314209f, 0.503906f, 0.300781f, 0.491943f, 0.285400f, 0.477295f, 0.265137f, 0.458008f,
+ 0.238403f, 0.431396f, 0.201050f, 0.390625f, 0.141724f, 0.316162f, 0.040771f, 0.134888f,
+ 0.000000f, 1.000000f, 0.089539f, 0.959961f, 0.146240f, 0.919434f, 0.186401f, 0.884277f,
+ 0.216553f, 0.854492f, 0.239990f, 0.829590f, 0.259766f, 0.807129f, 0.275879f, 0.787598f,
+ 0.290527f, 0.770508f, 0.301270f, 0.755371f, 0.311523f, 0.741211f, 0.321045f, 0.728516f,
+ 0.328857f, 0.717285f, 0.336914f, 0.706055f, 0.343262f, 0.696289f, 0.350586f, 0.687012f,
+ 0.354736f, 0.678711f, 0.359619f, 0.670898f, 0.364746f, 0.663086f, 0.367920f, 0.656738f,
+ 0.372070f, 0.649902f, 0.375488f, 0.643555f, 0.378662f, 0.637695f, 0.381836f, 0.631836f,
+ 0.383789f, 0.627441f, 0.387451f, 0.621582f, 0.390137f, 0.616699f, 0.391602f, 0.611816f,
+ 0.394287f, 0.607422f, 0.395508f, 0.603027f, 0.396729f, 0.599121f, 0.397949f, 0.595215f,
+ 0.400391f, 0.590820f, 0.400879f, 0.587402f, 0.402100f, 0.583496f, 0.402588f, 0.580566f,
+ 0.403564f, 0.576660f, 0.404297f, 0.573242f, 0.404541f, 0.570312f, 0.404785f, 0.566895f,
+ 0.404785f, 0.563477f, 0.404297f, 0.559082f, 0.403809f, 0.555176f, 0.402832f, 0.551758f,
+ 0.402100f, 0.548828f, 0.401367f, 0.543945f, 0.399170f, 0.540039f, 0.398193f, 0.535645f,
+ 0.395264f, 0.531250f, 0.392822f, 0.526367f, 0.389404f, 0.520996f, 0.386230f, 0.515625f,
+ 0.382080f, 0.509277f, 0.377197f, 0.501953f, 0.371338f, 0.494141f, 0.365234f, 0.485840f,
+ 0.356201f, 0.475830f, 0.344238f, 0.463379f, 0.331055f, 0.448242f, 0.313477f, 0.429688f,
+ 0.289795f, 0.403564f, 0.254395f, 0.364502f, 0.199097f, 0.296631f, 0.088806f, 0.127441f,
+ 0.000000f, 1.000000f, 0.089294f, 0.960449f, 0.147583f, 0.918945f, 0.188965f, 0.882812f,
+ 0.219849f, 0.853027f, 0.243652f, 0.827148f, 0.264648f, 0.804199f, 0.281006f, 0.784180f,
+ 0.295654f, 0.766113f, 0.307861f, 0.750000f, 0.319580f, 0.735352f, 0.328857f, 0.722168f,
+ 0.337891f, 0.710449f, 0.345703f, 0.698730f, 0.353271f, 0.688477f, 0.359863f, 0.678711f,
+ 0.364746f, 0.670410f, 0.372070f, 0.661133f, 0.376953f, 0.652832f, 0.380859f, 0.645996f,
+ 0.385254f, 0.638672f, 0.389648f, 0.631836f, 0.393555f, 0.625488f, 0.396729f, 0.619141f,
+ 0.399170f, 0.613770f, 0.403564f, 0.607910f, 0.407471f, 0.602051f, 0.409424f, 0.597168f,
+ 0.412598f, 0.591797f, 0.414307f, 0.586914f, 0.417236f, 0.582031f, 0.418945f, 0.577637f,
+ 0.421387f, 0.573242f, 0.422607f, 0.568848f, 0.424072f, 0.564941f, 0.425293f, 0.561035f,
+ 0.427246f, 0.556641f, 0.427734f, 0.553223f, 0.428955f, 0.549316f, 0.429443f, 0.545410f,
+ 0.430420f, 0.541992f, 0.430664f, 0.537109f, 0.430420f, 0.532715f, 0.429932f, 0.528809f,
+ 0.430420f, 0.524902f, 0.430420f, 0.520508f, 0.429443f, 0.515625f, 0.428711f, 0.510254f,
+ 0.427246f, 0.506348f, 0.424805f, 0.500488f, 0.423828f, 0.495361f, 0.420654f, 0.488525f,
+ 0.417480f, 0.482422f, 0.414551f, 0.474854f, 0.409424f, 0.467041f, 0.404053f, 0.457520f,
+ 0.395996f, 0.446777f, 0.388184f, 0.435547f, 0.376709f, 0.419922f, 0.360840f, 0.401611f,
+ 0.339844f, 0.375977f, 0.309570f, 0.339355f, 0.257812f, 0.275879f, 0.147339f, 0.119812f,
+ 0.000000f, 1.000000f, 0.089600f, 0.960449f, 0.147949f, 0.918457f, 0.189697f, 0.882324f,
+ 0.222778f, 0.851074f, 0.248657f, 0.824219f, 0.269531f, 0.800781f, 0.286621f, 0.780273f,
+ 0.301025f, 0.761719f, 0.316406f, 0.744629f, 0.327881f, 0.729492f, 0.336670f, 0.715820f,
+ 0.347168f, 0.703125f, 0.355469f, 0.690918f, 0.363770f, 0.679688f, 0.370850f, 0.669434f,
+ 0.376709f, 0.660156f, 0.383545f, 0.650879f, 0.390137f, 0.642090f, 0.395264f, 0.633789f,
+ 0.399902f, 0.626465f, 0.405518f, 0.618652f, 0.408936f, 0.612305f, 0.413330f, 0.605469f,
+ 0.416992f, 0.599609f, 0.420166f, 0.593750f, 0.424316f, 0.587402f, 0.427734f, 0.581543f,
+ 0.430176f, 0.576172f, 0.433350f, 0.570801f, 0.436279f, 0.565430f, 0.437988f, 0.561035f,
+ 0.441162f, 0.555664f, 0.443359f, 0.551270f, 0.444336f, 0.546875f, 0.447510f, 0.542480f,
+ 0.449219f, 0.537598f, 0.450684f, 0.533691f, 0.452148f, 0.529297f, 0.454346f, 0.524902f,
+ 0.455566f, 0.520508f, 0.457275f, 0.515625f, 0.457275f, 0.510742f, 0.457520f, 0.506348f,
+ 0.458740f, 0.501465f, 0.459229f, 0.496826f, 0.459229f, 0.491699f, 0.458252f, 0.486328f,
+ 0.458496f, 0.480957f, 0.457520f, 0.475098f, 0.457031f, 0.468750f, 0.454834f, 0.462158f,
+ 0.453369f, 0.455322f, 0.450439f, 0.447266f, 0.447510f, 0.438965f, 0.442871f, 0.429199f,
+ 0.436523f, 0.418945f, 0.430176f, 0.406494f, 0.420898f, 0.391357f, 0.408203f, 0.372559f,
+ 0.390381f, 0.348145f, 0.363281f, 0.313232f, 0.317627f, 0.253662f, 0.211304f, 0.111877f,
+ 0.000000f, 1.000000f, 0.090027f, 0.959961f, 0.149902f, 0.917480f, 0.192383f, 0.880859f,
+ 0.224854f, 0.849609f, 0.251953f, 0.821777f, 0.273926f, 0.797363f, 0.292236f, 0.775879f,
+ 0.309326f, 0.756836f, 0.322510f, 0.739258f, 0.336670f, 0.722656f, 0.347412f, 0.708008f,
+ 0.357178f, 0.694824f, 0.365967f, 0.682617f, 0.375488f, 0.670410f, 0.382324f, 0.660156f,
+ 0.388916f, 0.650391f, 0.396484f, 0.640625f, 0.402100f, 0.631836f, 0.408936f, 0.622559f,
+ 0.413086f, 0.615234f, 0.418457f, 0.606934f, 0.423340f, 0.600098f, 0.428711f, 0.592285f,
+ 0.432861f, 0.585449f, 0.436035f, 0.580078f, 0.441162f, 0.572754f, 0.445068f, 0.566406f,
+ 0.449463f, 0.560059f, 0.452637f, 0.554199f, 0.455322f, 0.548828f, 0.458252f, 0.543457f,
+ 0.461182f, 0.538086f, 0.465088f, 0.532715f, 0.467041f, 0.527832f, 0.469238f, 0.522949f,
+ 0.472412f, 0.518066f, 0.473389f, 0.513672f, 0.476562f, 0.508301f, 0.478271f, 0.503906f,
+ 0.480713f, 0.499023f, 0.483398f, 0.493896f, 0.483887f, 0.488770f, 0.485352f, 0.483398f,
+ 0.486084f, 0.478516f, 0.487305f, 0.472900f, 0.488525f, 0.467529f, 0.489746f, 0.461670f,
+ 0.488770f, 0.455811f, 0.490967f, 0.449463f, 0.488525f, 0.442627f, 0.489258f, 0.436035f,
+ 0.487549f, 0.428223f, 0.486084f, 0.420654f, 0.485107f, 0.411377f, 0.481934f, 0.401367f,
+ 0.477295f, 0.390869f, 0.472168f, 0.377686f, 0.464355f, 0.363037f, 0.454590f, 0.344727f,
+ 0.439209f, 0.320801f, 0.416748f, 0.287354f, 0.375244f, 0.232056f, 0.277344f, 0.102173f,
+ 0.000000f, 1.000000f, 0.090820f, 0.959473f, 0.151245f, 0.916504f, 0.194946f, 0.879395f,
+ 0.228638f, 0.847168f, 0.256592f, 0.818848f, 0.278809f, 0.793945f, 0.299316f, 0.770996f,
+ 0.316895f, 0.750488f, 0.331055f, 0.732910f, 0.344971f, 0.716309f, 0.356201f, 0.701172f,
+ 0.366211f, 0.687500f, 0.376709f, 0.674316f, 0.384521f, 0.662598f, 0.393066f, 0.651367f,
+ 0.400879f, 0.640625f, 0.408691f, 0.630371f, 0.415039f, 0.621094f, 0.422119f, 0.611328f,
+ 0.427490f, 0.603027f, 0.434082f, 0.594238f, 0.440186f, 0.586426f, 0.444336f, 0.578613f,
+ 0.449219f, 0.571289f, 0.453125f, 0.564941f, 0.458252f, 0.558105f, 0.463135f, 0.551270f,
+ 0.466797f, 0.544922f, 0.471436f, 0.538086f, 0.475586f, 0.531738f, 0.478760f, 0.525879f,
+ 0.482666f, 0.520020f, 0.485840f, 0.514160f, 0.488770f, 0.509277f, 0.491211f, 0.503906f,
+ 0.494385f, 0.498291f, 0.498047f, 0.492920f, 0.500977f, 0.487549f, 0.502930f, 0.482422f,
+ 0.505859f, 0.477295f, 0.508301f, 0.472168f, 0.509766f, 0.466797f, 0.511719f, 0.460693f,
+ 0.513672f, 0.455078f, 0.515625f, 0.448975f, 0.517578f, 0.443115f, 0.518555f, 0.437500f,
+ 0.519043f, 0.430908f, 0.521484f, 0.424072f, 0.521484f, 0.417236f, 0.521973f, 0.409668f,
+ 0.520996f, 0.402100f, 0.521484f, 0.393555f, 0.520020f, 0.384277f, 0.518066f, 0.374023f,
+ 0.514648f, 0.363037f, 0.511230f, 0.349609f, 0.506348f, 0.335205f, 0.497803f, 0.317383f,
+ 0.485596f, 0.294434f, 0.466064f, 0.262695f, 0.430908f, 0.210815f, 0.341797f, 0.092590f,
+ 0.000000f, 1.000000f, 0.090942f, 0.959473f, 0.152100f, 0.916504f, 0.197632f, 0.877441f,
+ 0.232910f, 0.844727f, 0.260498f, 0.815918f, 0.285645f, 0.789062f, 0.305664f, 0.766602f,
+ 0.323486f, 0.746094f, 0.338379f, 0.727539f, 0.352051f, 0.710449f, 0.364502f, 0.694824f,
+ 0.376221f, 0.680176f, 0.386230f, 0.666504f, 0.396240f, 0.653809f, 0.405518f, 0.641602f,
+ 0.414062f, 0.629883f, 0.422119f, 0.619629f, 0.428955f, 0.609375f, 0.435547f, 0.600098f,
+ 0.441406f, 0.590820f, 0.447998f, 0.582031f, 0.454834f, 0.573242f, 0.461182f, 0.564941f,
+ 0.466309f, 0.557129f, 0.470459f, 0.550293f, 0.476074f, 0.542480f, 0.480225f, 0.535645f,
+ 0.485352f, 0.528809f, 0.489990f, 0.521973f, 0.495605f, 0.514648f, 0.499023f, 0.508301f,
+ 0.502441f, 0.502441f, 0.507324f, 0.495850f, 0.510742f, 0.490234f, 0.513184f, 0.484619f,
+ 0.517090f, 0.478516f, 0.520996f, 0.472656f, 0.524414f, 0.466797f, 0.526855f, 0.461670f,
+ 0.530762f, 0.455811f, 0.533691f, 0.450195f, 0.536621f, 0.444336f, 0.538574f, 0.438232f,
+ 0.541016f, 0.431885f, 0.543945f, 0.425537f, 0.545898f, 0.419189f, 0.547363f, 0.413086f,
+ 0.549316f, 0.406250f, 0.551758f, 0.398682f, 0.553223f, 0.391602f, 0.553711f, 0.384033f,
+ 0.555176f, 0.375977f, 0.555176f, 0.367432f, 0.555664f, 0.358154f, 0.555176f, 0.347656f,
+ 0.553223f, 0.336182f, 0.551758f, 0.323486f, 0.547363f, 0.308838f, 0.539551f, 0.290527f,
+ 0.531250f, 0.268555f, 0.514648f, 0.238770f, 0.484131f, 0.189941f, 0.405762f, 0.083618f,
+ 0.000000f, 1.000000f, 0.091248f, 0.959473f, 0.154053f, 0.915039f, 0.199951f, 0.876465f,
+ 0.236572f, 0.841797f, 0.265869f, 0.812012f, 0.290283f, 0.786133f, 0.311035f, 0.762695f,
+ 0.329102f, 0.741699f, 0.346436f, 0.721680f, 0.359619f, 0.704590f, 0.373779f, 0.687500f,
+ 0.386475f, 0.671875f, 0.396973f, 0.658203f, 0.406250f, 0.645508f, 0.416016f, 0.632324f,
+ 0.425049f, 0.620605f, 0.434570f, 0.609375f, 0.442627f, 0.598145f, 0.450439f, 0.587891f,
+ 0.456299f, 0.578613f, 0.463867f, 0.568848f, 0.471191f, 0.560059f, 0.476318f, 0.551758f,
+ 0.483398f, 0.542969f, 0.487305f, 0.535156f, 0.494629f, 0.527344f, 0.498291f, 0.520508f,
+ 0.503906f, 0.512207f, 0.509277f, 0.504883f, 0.515137f, 0.497559f, 0.518555f, 0.490967f,
+ 0.523438f, 0.484375f, 0.527344f, 0.477783f, 0.532227f, 0.470947f, 0.536133f, 0.465088f,
+ 0.539551f, 0.458740f, 0.544434f, 0.452148f, 0.547852f, 0.446533f, 0.550781f, 0.440430f,
+ 0.555176f, 0.434082f, 0.558105f, 0.428223f, 0.561523f, 0.422119f, 0.565918f, 0.415771f,
+ 0.566895f, 0.409180f, 0.571289f, 0.402100f, 0.573730f, 0.395508f, 0.576172f, 0.389160f,
+ 0.579102f, 0.382568f, 0.581543f, 0.374268f, 0.583496f, 0.366943f, 0.584961f, 0.359131f,
+ 0.586426f, 0.350830f, 0.588867f, 0.341797f, 0.588867f, 0.332520f, 0.588867f, 0.321777f,
+ 0.587891f, 0.310791f, 0.586914f, 0.297607f, 0.584473f, 0.282715f, 0.578613f, 0.265869f,
+ 0.572266f, 0.244873f, 0.559082f, 0.216064f, 0.533203f, 0.171753f, 0.463867f, 0.074585f,
+ 0.000000f, 1.000000f, 0.091492f, 0.959473f, 0.155640f, 0.914062f, 0.203247f, 0.874023f,
+ 0.241089f, 0.839355f, 0.270264f, 0.809082f, 0.295654f, 0.782715f, 0.316895f, 0.758301f,
+ 0.337402f, 0.735840f, 0.355225f, 0.715332f, 0.369385f, 0.697266f, 0.382324f, 0.680664f,
+ 0.395264f, 0.664551f, 0.406494f, 0.650391f, 0.417969f, 0.635742f, 0.429443f, 0.622070f,
+ 0.437256f, 0.610352f, 0.446777f, 0.598145f, 0.455322f, 0.586914f, 0.464600f, 0.576172f,
+ 0.471680f, 0.565918f, 0.479004f, 0.556152f, 0.485596f, 0.546875f, 0.491943f, 0.537598f,
+ 0.500000f, 0.528320f, 0.505859f, 0.520020f, 0.511230f, 0.512207f, 0.515625f, 0.504395f,
+ 0.522461f, 0.496338f, 0.528320f, 0.488281f, 0.534180f, 0.480713f, 0.538574f, 0.473389f,
+ 0.544922f, 0.466064f, 0.548340f, 0.459229f, 0.553711f, 0.452148f, 0.557129f, 0.445801f,
+ 0.562988f, 0.438965f, 0.566895f, 0.431885f, 0.570312f, 0.426025f, 0.575195f, 0.419434f,
+ 0.579102f, 0.412842f, 0.582520f, 0.406738f, 0.587891f, 0.399902f, 0.590820f, 0.393799f,
+ 0.594727f, 0.386719f, 0.597168f, 0.379883f, 0.600586f, 0.372559f, 0.604492f, 0.365479f,
+ 0.607910f, 0.358643f, 0.609863f, 0.351074f, 0.612793f, 0.343018f, 0.614746f, 0.334717f,
+ 0.617676f, 0.326416f, 0.619629f, 0.317139f, 0.620117f, 0.307861f, 0.622070f, 0.297119f,
+ 0.623047f, 0.286377f, 0.622559f, 0.273193f, 0.621094f, 0.259277f, 0.618164f, 0.243042f,
+ 0.611816f, 0.222168f, 0.601562f, 0.194824f, 0.579102f, 0.152832f, 0.520508f, 0.066284f,
+ 0.000000f, 1.000000f, 0.092529f, 0.958984f, 0.156982f, 0.913574f, 0.205566f, 0.873047f,
+ 0.243896f, 0.837402f, 0.274414f, 0.806641f, 0.301514f, 0.778809f, 0.323975f, 0.753418f,
+ 0.343750f, 0.730469f, 0.361816f, 0.709961f, 0.378418f, 0.690918f, 0.392578f, 0.673340f,
+ 0.406006f, 0.656250f, 0.417480f, 0.641602f, 0.428955f, 0.626953f, 0.440674f, 0.612793f,
+ 0.450684f, 0.599609f, 0.459717f, 0.587402f, 0.469727f, 0.575684f, 0.478271f, 0.564453f,
+ 0.486084f, 0.553711f, 0.493896f, 0.542969f, 0.500977f, 0.533691f, 0.508301f, 0.523926f,
+ 0.516602f, 0.513672f, 0.522461f, 0.505371f, 0.528809f, 0.496826f, 0.535156f, 0.488281f,
+ 0.541016f, 0.480469f, 0.547363f, 0.471680f, 0.553223f, 0.463379f, 0.559082f, 0.455811f,
+ 0.563477f, 0.448486f, 0.569336f, 0.440918f, 0.574219f, 0.433350f, 0.578613f, 0.426758f,
+ 0.584473f, 0.419434f, 0.589844f, 0.412109f, 0.592773f, 0.405762f, 0.598633f, 0.398682f,
+ 0.602051f, 0.392090f, 0.608398f, 0.385010f, 0.611328f, 0.378662f, 0.615723f, 0.371826f,
+ 0.620117f, 0.365234f, 0.624023f, 0.357666f, 0.626465f, 0.350098f, 0.631348f, 0.342529f,
+ 0.634766f, 0.335693f, 0.638672f, 0.328125f, 0.640625f, 0.319580f, 0.643555f, 0.311523f,
+ 0.645996f, 0.303223f, 0.649414f, 0.293457f, 0.651367f, 0.284424f, 0.653320f, 0.273926f,
+ 0.654297f, 0.262939f, 0.655762f, 0.250244f, 0.654785f, 0.236572f, 0.652344f, 0.220337f,
+ 0.648438f, 0.201172f, 0.639160f, 0.175293f, 0.622070f, 0.137085f, 0.569336f, 0.059753f,
+ 0.000000f, 1.000000f, 0.093201f, 0.958496f, 0.159180f, 0.912109f, 0.208008f, 0.871582f,
+ 0.246216f, 0.835938f, 0.278320f, 0.804199f, 0.306641f, 0.774902f, 0.330811f, 0.748535f,
+ 0.351074f, 0.726074f, 0.368896f, 0.704590f, 0.386963f, 0.684082f, 0.401611f, 0.666016f,
+ 0.415283f, 0.648926f, 0.429199f, 0.632324f, 0.441162f, 0.617188f, 0.451660f, 0.603027f,
+ 0.462891f, 0.589355f, 0.473389f, 0.576172f, 0.482910f, 0.563965f, 0.491455f, 0.552734f,
+ 0.500977f, 0.541016f, 0.507812f, 0.530273f, 0.517090f, 0.519531f, 0.524414f, 0.509766f,
+ 0.533203f, 0.499512f, 0.539062f, 0.490479f, 0.546387f, 0.481201f, 0.553223f, 0.472412f,
+ 0.557617f, 0.464355f, 0.566895f, 0.454834f, 0.572266f, 0.446533f, 0.579102f, 0.438232f,
+ 0.583496f, 0.430664f, 0.590332f, 0.422607f, 0.595215f, 0.415039f, 0.600098f, 0.407715f,
+ 0.605957f, 0.400146f, 0.611328f, 0.392578f, 0.616699f, 0.385498f, 0.620605f, 0.378906f,
+ 0.625488f, 0.371338f, 0.629883f, 0.364502f, 0.635742f, 0.357422f, 0.639160f, 0.350830f,
+ 0.645508f, 0.343018f, 0.648438f, 0.336426f, 0.652832f, 0.328369f, 0.655273f, 0.320801f,
+ 0.659668f, 0.313477f, 0.663574f, 0.305664f, 0.668457f, 0.297607f, 0.669922f, 0.289551f,
+ 0.673828f, 0.280762f, 0.677734f, 0.271729f, 0.680176f, 0.261719f, 0.681641f, 0.251953f,
+ 0.683105f, 0.240967f, 0.686035f, 0.228760f, 0.686523f, 0.215088f, 0.684570f, 0.200439f,
+ 0.681152f, 0.180908f, 0.674316f, 0.157593f, 0.660156f, 0.123230f, 0.616211f, 0.052734f,
+ 0.000000f, 1.000000f, 0.093262f, 0.958496f, 0.161377f, 0.911133f, 0.211060f, 0.869629f,
+ 0.250244f, 0.833496f, 0.284424f, 0.799805f, 0.312012f, 0.770996f, 0.335938f, 0.744629f,
+ 0.357910f, 0.720215f, 0.376953f, 0.698242f, 0.395264f, 0.677246f, 0.411621f, 0.658203f,
+ 0.426270f, 0.640137f, 0.439697f, 0.623535f, 0.453369f, 0.607422f, 0.464844f, 0.593262f,
+ 0.475098f, 0.579102f, 0.486328f, 0.565430f, 0.497314f, 0.552246f, 0.506348f, 0.540039f,
+ 0.515625f, 0.528320f, 0.524414f, 0.517090f, 0.533691f, 0.505859f, 0.540039f, 0.496094f,
+ 0.549805f, 0.484863f, 0.557129f, 0.475098f, 0.562988f, 0.466064f, 0.571777f, 0.456299f,
+ 0.576660f, 0.447754f, 0.584473f, 0.438721f, 0.591309f, 0.429688f, 0.597656f, 0.420898f,
+ 0.604004f, 0.412842f, 0.609375f, 0.404785f, 0.615234f, 0.396484f, 0.621094f, 0.388916f,
+ 0.626465f, 0.381104f, 0.633301f, 0.373535f, 0.637207f, 0.366211f, 0.643066f, 0.358887f,
+ 0.647949f, 0.351318f, 0.654297f, 0.343750f, 0.657227f, 0.337158f, 0.663086f, 0.329834f,
+ 0.667480f, 0.322510f, 0.673828f, 0.315186f, 0.675781f, 0.307861f, 0.680176f, 0.299805f,
+ 0.685059f, 0.292236f, 0.688965f, 0.284424f, 0.693359f, 0.276367f, 0.696289f, 0.268066f,
+ 0.699707f, 0.259277f, 0.704590f, 0.250244f, 0.706055f, 0.241089f, 0.708984f, 0.231323f,
+ 0.711914f, 0.220581f, 0.712402f, 0.209106f, 0.713867f, 0.196167f, 0.714355f, 0.181396f,
+ 0.713379f, 0.163940f, 0.708008f, 0.141846f, 0.696289f, 0.109558f, 0.657715f, 0.046295f,
+ 0.000000f, 1.000000f, 0.093384f, 0.958496f, 0.162109f, 0.910645f, 0.212891f, 0.868652f,
+ 0.255371f, 0.830566f, 0.288818f, 0.797363f, 0.318359f, 0.767090f, 0.343262f, 0.739746f,
+ 0.365479f, 0.714844f, 0.386719f, 0.691406f, 0.403809f, 0.670410f, 0.421875f, 0.650879f,
+ 0.436279f, 0.632324f, 0.451416f, 0.614258f, 0.464355f, 0.598633f, 0.477051f, 0.583008f,
+ 0.488770f, 0.567871f, 0.499756f, 0.554199f, 0.511230f, 0.540527f, 0.520996f, 0.527344f,
+ 0.530273f, 0.515625f, 0.540039f, 0.503418f, 0.548340f, 0.492432f, 0.556641f, 0.481689f,
+ 0.565918f, 0.470703f, 0.574219f, 0.460449f, 0.580566f, 0.450684f, 0.588379f, 0.440674f,
+ 0.595215f, 0.431396f, 0.603027f, 0.422607f, 0.609863f, 0.413086f, 0.616211f, 0.404297f,
+ 0.621582f, 0.395996f, 0.630371f, 0.386475f, 0.636230f, 0.378418f, 0.640625f, 0.370850f,
+ 0.647949f, 0.362549f, 0.652832f, 0.354736f, 0.659180f, 0.346924f, 0.663086f, 0.340088f,
+ 0.670898f, 0.331543f, 0.675781f, 0.324219f, 0.680176f, 0.317139f, 0.685059f, 0.310059f,
+ 0.691406f, 0.302246f, 0.695312f, 0.295166f, 0.699707f, 0.287842f, 0.704102f, 0.279785f,
+ 0.708496f, 0.271729f, 0.711914f, 0.264160f, 0.717285f, 0.255859f, 0.721191f, 0.248413f,
+ 0.724609f, 0.239380f, 0.728027f, 0.230347f, 0.732910f, 0.221680f, 0.734863f, 0.211792f,
+ 0.737305f, 0.201782f, 0.739746f, 0.189697f, 0.740234f, 0.178223f, 0.741699f, 0.164062f,
+ 0.741211f, 0.147095f, 0.736328f, 0.127441f, 0.728027f, 0.096802f, 0.696777f, 0.040192f,
+ 0.000000f, 1.000000f, 0.095032f, 0.957520f, 0.163330f, 0.910156f, 0.215698f, 0.867188f,
+ 0.258789f, 0.828125f, 0.293213f, 0.794434f, 0.323486f, 0.763184f, 0.349365f, 0.735352f,
+ 0.373779f, 0.708984f, 0.394287f, 0.685547f, 0.414062f, 0.663086f, 0.430420f, 0.643066f,
+ 0.447510f, 0.623535f, 0.461914f, 0.605957f, 0.475830f, 0.588867f, 0.488770f, 0.572754f,
+ 0.502441f, 0.557129f, 0.513672f, 0.542969f, 0.524414f, 0.529297f, 0.535645f, 0.515137f,
+ 0.545898f, 0.502930f, 0.554199f, 0.490723f, 0.564941f, 0.478516f, 0.572754f, 0.467529f,
+ 0.581055f, 0.457031f, 0.590820f, 0.445312f, 0.598145f, 0.435303f, 0.607422f, 0.424805f,
+ 0.613281f, 0.415527f, 0.619141f, 0.406494f, 0.628418f, 0.396973f, 0.635254f, 0.387207f,
+ 0.642090f, 0.378418f, 0.648926f, 0.369385f, 0.655762f, 0.360840f, 0.661133f, 0.352539f,
+ 0.667969f, 0.344482f, 0.673828f, 0.336182f, 0.678711f, 0.328613f, 0.685059f, 0.320801f,
+ 0.690918f, 0.312988f, 0.695801f, 0.305420f, 0.701660f, 0.297607f, 0.705566f, 0.291016f,
+ 0.711426f, 0.283203f, 0.716309f, 0.275635f, 0.723145f, 0.268311f, 0.726562f, 0.260986f,
+ 0.730469f, 0.252686f, 0.735840f, 0.244385f, 0.739746f, 0.236938f, 0.743164f, 0.229248f,
+ 0.747559f, 0.220825f, 0.751953f, 0.211792f, 0.755859f, 0.202637f, 0.757324f, 0.194458f,
+ 0.761230f, 0.183594f, 0.764160f, 0.172974f, 0.766602f, 0.161621f, 0.768066f, 0.148315f,
+ 0.767578f, 0.132935f, 0.763672f, 0.114380f, 0.756836f, 0.086060f, 0.730469f, 0.035767f,
+ 0.000000f, 1.000000f, 0.097534f, 0.956055f, 0.164307f, 0.910156f, 0.219727f, 0.865234f,
+ 0.261963f, 0.826172f, 0.299316f, 0.790527f, 0.329834f, 0.758789f, 0.357178f, 0.729980f,
+ 0.380127f, 0.704102f, 0.403076f, 0.679199f, 0.422607f, 0.656738f, 0.439697f, 0.635742f,
+ 0.457764f, 0.615723f, 0.472168f, 0.597168f, 0.487305f, 0.579102f, 0.500977f, 0.562500f,
+ 0.513184f, 0.546875f, 0.527344f, 0.531738f, 0.537598f, 0.517090f, 0.549316f, 0.503418f,
+ 0.558594f, 0.490723f, 0.569336f, 0.478027f, 0.578613f, 0.465576f, 0.589355f, 0.453369f,
+ 0.596680f, 0.442627f, 0.607422f, 0.430664f, 0.614746f, 0.420166f, 0.623535f, 0.409668f,
+ 0.631836f, 0.399414f, 0.638184f, 0.390137f, 0.645020f, 0.381104f, 0.652832f, 0.370850f,
+ 0.661621f, 0.361572f, 0.666992f, 0.352783f, 0.674316f, 0.343506f, 0.680664f, 0.335205f,
+ 0.687012f, 0.326660f, 0.693359f, 0.318359f, 0.698242f, 0.310791f, 0.705078f, 0.302490f,
+ 0.710938f, 0.294922f, 0.716309f, 0.286865f, 0.721680f, 0.279297f, 0.726074f, 0.272217f,
+ 0.732910f, 0.264160f, 0.737305f, 0.257324f, 0.742188f, 0.249756f, 0.748047f, 0.242676f,
+ 0.751953f, 0.234619f, 0.756348f, 0.226562f, 0.761230f, 0.218872f, 0.765137f, 0.211060f,
+ 0.770020f, 0.203003f, 0.773926f, 0.194336f, 0.775879f, 0.185913f, 0.780762f, 0.176880f,
+ 0.784180f, 0.166870f, 0.788574f, 0.156982f, 0.788574f, 0.146240f, 0.791016f, 0.133057f,
+ 0.791992f, 0.119263f, 0.789062f, 0.101868f, 0.782227f, 0.077637f, 0.762695f, 0.031021f,
+ 0.000000f, 1.000000f, 0.097351f, 0.956543f, 0.166748f, 0.908691f, 0.221558f, 0.863770f,
+ 0.266113f, 0.823730f, 0.302734f, 0.788086f, 0.335693f, 0.754883f, 0.363037f, 0.725586f,
+ 0.388916f, 0.697754f, 0.411621f, 0.672363f, 0.432617f, 0.648926f, 0.450684f, 0.627441f,
+ 0.468506f, 0.606934f, 0.484863f, 0.587402f, 0.499756f, 0.569336f, 0.513184f, 0.552246f,
+ 0.527344f, 0.535645f, 0.539551f, 0.520508f, 0.551758f, 0.505371f, 0.563965f, 0.490967f,
+ 0.574707f, 0.477295f, 0.584473f, 0.464600f, 0.594238f, 0.451904f, 0.604492f, 0.439453f,
+ 0.613770f, 0.427734f, 0.622559f, 0.416748f, 0.631836f, 0.405029f, 0.640625f, 0.394531f,
+ 0.648438f, 0.384033f, 0.654785f, 0.374512f, 0.663086f, 0.364746f, 0.669922f, 0.355225f,
+ 0.678223f, 0.345459f, 0.687012f, 0.335938f, 0.692871f, 0.326904f, 0.697754f, 0.318604f,
+ 0.706055f, 0.309326f, 0.711914f, 0.301270f, 0.717773f, 0.292969f, 0.723633f, 0.285156f,
+ 0.730469f, 0.277100f, 0.734863f, 0.269531f, 0.741211f, 0.261719f, 0.747070f, 0.254395f,
+ 0.751465f, 0.246948f, 0.757324f, 0.239258f, 0.761719f, 0.232300f, 0.767578f, 0.225098f,
+ 0.772461f, 0.217407f, 0.776367f, 0.209839f, 0.781250f, 0.201660f, 0.785156f, 0.194092f,
+ 0.790039f, 0.186035f, 0.794922f, 0.178467f, 0.797852f, 0.169800f, 0.800781f, 0.161255f,
+ 0.806152f, 0.152466f, 0.807129f, 0.142822f, 0.810059f, 0.132080f, 0.813477f, 0.120728f,
+ 0.812500f, 0.107483f, 0.812012f, 0.090820f, 0.807129f, 0.068665f, 0.789551f, 0.027405f,
+ 0.000000f, 1.000000f, 0.098022f, 0.956543f, 0.168701f, 0.907227f, 0.224121f, 0.862305f,
+ 0.269531f, 0.821289f, 0.307861f, 0.784668f, 0.340576f, 0.751465f, 0.370850f, 0.720215f,
+ 0.396973f, 0.691895f, 0.419678f, 0.666504f, 0.440430f, 0.642578f, 0.461670f, 0.619629f,
+ 0.479492f, 0.598145f, 0.496582f, 0.578125f, 0.511719f, 0.559570f, 0.526367f, 0.541992f,
+ 0.539551f, 0.525391f, 0.552246f, 0.509277f, 0.566406f, 0.493408f, 0.577637f, 0.479248f,
+ 0.589355f, 0.464600f, 0.599609f, 0.451416f, 0.608887f, 0.438965f, 0.620117f, 0.425537f,
+ 0.629395f, 0.413574f, 0.638184f, 0.402344f, 0.648926f, 0.390381f, 0.657715f, 0.379639f,
+ 0.664062f, 0.369141f, 0.672363f, 0.358643f, 0.681152f, 0.348389f, 0.687988f, 0.339111f,
+ 0.694824f, 0.330078f, 0.703613f, 0.319824f, 0.709961f, 0.310791f, 0.716797f, 0.301758f,
+ 0.723145f, 0.293213f, 0.729492f, 0.284668f, 0.735840f, 0.276367f, 0.741211f, 0.268555f,
+ 0.748535f, 0.260254f, 0.753906f, 0.252686f, 0.759766f, 0.244873f, 0.764160f, 0.237793f,
+ 0.770996f, 0.229858f, 0.775391f, 0.222656f, 0.780273f, 0.215454f, 0.785645f, 0.208374f,
+ 0.791016f, 0.200928f, 0.795898f, 0.193848f, 0.799316f, 0.186157f, 0.804199f, 0.178101f,
+ 0.808594f, 0.170532f, 0.813477f, 0.162842f, 0.816895f, 0.155762f, 0.820312f, 0.146851f,
+ 0.823730f, 0.138184f, 0.825684f, 0.129028f, 0.830566f, 0.119080f, 0.831055f, 0.108643f,
+ 0.831543f, 0.096436f, 0.832031f, 0.081421f, 0.829102f, 0.061523f, 0.813477f, 0.023743f,
+ 0.000000f, 1.000000f, 0.096558f, 0.957520f, 0.170044f, 0.906738f, 0.227783f, 0.859863f,
+ 0.273926f, 0.818848f, 0.312988f, 0.781250f, 0.347412f, 0.746582f, 0.377441f, 0.715332f,
+ 0.405029f, 0.686523f, 0.429199f, 0.659668f, 0.450439f, 0.635254f, 0.470215f, 0.611816f,
+ 0.489990f, 0.589844f, 0.506836f, 0.569336f, 0.522461f, 0.550293f, 0.538086f, 0.531738f,
+ 0.552246f, 0.514160f, 0.565430f, 0.498047f, 0.578613f, 0.481934f, 0.590332f, 0.467529f,
+ 0.602539f, 0.452637f, 0.614746f, 0.438477f, 0.623535f, 0.425537f, 0.634766f, 0.412354f,
+ 0.645020f, 0.399658f, 0.654297f, 0.387939f, 0.663574f, 0.376221f, 0.672363f, 0.365234f,
+ 0.681152f, 0.354004f, 0.689453f, 0.343506f, 0.698242f, 0.333252f, 0.705566f, 0.323486f,
+ 0.711426f, 0.314453f, 0.719238f, 0.304688f, 0.727051f, 0.294922f, 0.733398f, 0.286377f,
+ 0.741211f, 0.277100f, 0.747559f, 0.268311f, 0.753418f, 0.260498f, 0.758789f, 0.252441f,
+ 0.765625f, 0.244263f, 0.771973f, 0.236206f, 0.775391f, 0.229248f, 0.782227f, 0.221191f,
+ 0.787598f, 0.214111f, 0.792969f, 0.206543f, 0.797363f, 0.199829f, 0.803223f, 0.192505f,
+ 0.808105f, 0.185425f, 0.812988f, 0.178467f, 0.817383f, 0.172119f, 0.821289f, 0.163696f,
+ 0.825684f, 0.156250f, 0.830566f, 0.148804f, 0.833984f, 0.141846f, 0.837891f, 0.133545f,
+ 0.840820f, 0.125122f, 0.844238f, 0.117432f, 0.847168f, 0.107483f, 0.849609f, 0.097961f,
+ 0.850586f, 0.086731f, 0.852539f, 0.072998f, 0.849121f, 0.053864f, 0.836426f, 0.021317f,
+ 0.000000f, 1.000000f, 0.096985f, 0.957520f, 0.172363f, 0.905762f, 0.229614f, 0.859375f,
+ 0.277832f, 0.816406f, 0.318115f, 0.777832f, 0.353516f, 0.742676f, 0.384766f, 0.709961f,
+ 0.411865f, 0.680664f, 0.437500f, 0.653320f, 0.460449f, 0.627441f, 0.480957f, 0.603516f,
+ 0.499268f, 0.581543f, 0.519043f, 0.560059f, 0.535645f, 0.540039f, 0.550781f, 0.521484f,
+ 0.564941f, 0.503906f, 0.580078f, 0.486572f, 0.592285f, 0.470703f, 0.604492f, 0.455078f,
+ 0.617676f, 0.439941f, 0.628906f, 0.425537f, 0.640137f, 0.411865f, 0.649902f, 0.399170f,
+ 0.660156f, 0.385986f, 0.669922f, 0.374023f, 0.679199f, 0.362305f, 0.687988f, 0.351074f,
+ 0.697754f, 0.339355f, 0.704102f, 0.329102f, 0.713867f, 0.318359f, 0.722168f, 0.308350f,
+ 0.727539f, 0.299316f, 0.735352f, 0.289795f, 0.743652f, 0.279785f, 0.750977f, 0.270996f,
+ 0.756836f, 0.261963f, 0.763672f, 0.253174f, 0.770020f, 0.244873f, 0.775391f, 0.237183f,
+ 0.781738f, 0.228760f, 0.789062f, 0.220947f, 0.791992f, 0.213867f, 0.799316f, 0.206055f,
+ 0.805664f, 0.198608f, 0.808105f, 0.192139f, 0.813965f, 0.184692f, 0.819824f, 0.177856f,
+ 0.824219f, 0.170776f, 0.829590f, 0.164062f, 0.833984f, 0.157593f, 0.838379f, 0.150391f,
+ 0.841797f, 0.143066f, 0.844727f, 0.136108f, 0.850098f, 0.128418f, 0.854004f, 0.121460f,
+ 0.857422f, 0.113831f, 0.860840f, 0.105225f, 0.863770f, 0.097351f, 0.864746f, 0.088013f,
+ 0.867188f, 0.077576f, 0.867676f, 0.065186f, 0.868164f, 0.047791f, 0.855957f, 0.018372f,
+ 0.000000f, 1.000000f, 0.097534f, 0.957031f, 0.172974f, 0.905273f, 0.233032f, 0.856934f,
+ 0.282471f, 0.813477f, 0.324219f, 0.773926f, 0.360107f, 0.738281f, 0.391846f, 0.705078f,
+ 0.419678f, 0.674805f, 0.447021f, 0.645996f, 0.469727f, 0.620605f, 0.491455f, 0.595703f,
+ 0.511719f, 0.572754f, 0.529297f, 0.550781f, 0.545898f, 0.530762f, 0.562500f, 0.511719f,
+ 0.579102f, 0.492676f, 0.593750f, 0.474854f, 0.605957f, 0.458984f, 0.619629f, 0.442871f,
+ 0.630859f, 0.427734f, 0.642090f, 0.413330f, 0.655273f, 0.398682f, 0.665527f, 0.385498f,
+ 0.675293f, 0.372803f, 0.684570f, 0.360596f, 0.694336f, 0.348145f, 0.702637f, 0.337158f,
+ 0.711914f, 0.325684f, 0.720703f, 0.314453f, 0.729004f, 0.304199f, 0.736328f, 0.293945f,
+ 0.743652f, 0.284424f, 0.750488f, 0.274902f, 0.758301f, 0.265869f, 0.765625f, 0.256348f,
+ 0.773438f, 0.247559f, 0.779785f, 0.238403f, 0.785645f, 0.230347f, 0.791504f, 0.222412f,
+ 0.798340f, 0.213745f, 0.801758f, 0.206909f, 0.809082f, 0.199097f, 0.813965f, 0.192017f,
+ 0.819336f, 0.184326f, 0.825195f, 0.177612f, 0.830078f, 0.170654f, 0.835449f, 0.163696f,
+ 0.839844f, 0.157227f, 0.843750f, 0.150879f, 0.849609f, 0.144043f, 0.854492f, 0.137573f,
+ 0.857422f, 0.131104f, 0.861328f, 0.124023f, 0.865234f, 0.116577f, 0.867676f, 0.109924f,
+ 0.872070f, 0.103149f, 0.875488f, 0.094849f, 0.877930f, 0.087708f, 0.880371f, 0.078979f,
+ 0.882812f, 0.069092f, 0.883789f, 0.058105f, 0.881348f, 0.042664f, 0.875000f, 0.016068f,
+ 0.000000f, 1.000000f, 0.098633f, 0.956543f, 0.175781f, 0.903809f, 0.235596f, 0.855957f,
+ 0.286865f, 0.811035f, 0.329346f, 0.770996f, 0.366699f, 0.733887f, 0.398682f, 0.700195f,
+ 0.428955f, 0.668457f, 0.455566f, 0.639648f, 0.479004f, 0.612793f, 0.500977f, 0.587891f,
+ 0.522949f, 0.563477f, 0.541504f, 0.541504f, 0.558594f, 0.520508f, 0.576172f, 0.500488f,
+ 0.591309f, 0.481689f, 0.605957f, 0.464355f, 0.619629f, 0.447266f, 0.633301f, 0.430908f,
+ 0.646973f, 0.415039f, 0.656738f, 0.400635f, 0.669434f, 0.385986f, 0.679199f, 0.372559f,
+ 0.688965f, 0.359863f, 0.698730f, 0.347412f, 0.708496f, 0.334717f, 0.718262f, 0.322998f,
+ 0.727539f, 0.311768f, 0.736328f, 0.300781f, 0.743164f, 0.290527f, 0.751953f, 0.279785f,
+ 0.758789f, 0.270020f, 0.767090f, 0.260742f, 0.771973f, 0.251953f, 0.779297f, 0.242798f,
+ 0.788574f, 0.233398f, 0.793945f, 0.224854f, 0.800781f, 0.216187f, 0.807129f, 0.208252f,
+ 0.812012f, 0.200317f, 0.818359f, 0.192749f, 0.824707f, 0.185181f, 0.828613f, 0.178101f,
+ 0.833984f, 0.171021f, 0.839355f, 0.164185f, 0.844238f, 0.157471f, 0.848633f, 0.150757f,
+ 0.853027f, 0.144653f, 0.858887f, 0.137939f, 0.863281f, 0.131470f, 0.867676f, 0.125488f,
+ 0.871582f, 0.119629f, 0.875977f, 0.112793f, 0.878906f, 0.105774f, 0.881348f, 0.099548f,
+ 0.886719f, 0.092590f, 0.889160f, 0.086121f, 0.891113f, 0.078796f, 0.895508f, 0.069946f,
+ 0.895508f, 0.062012f, 0.897949f, 0.051208f, 0.896973f, 0.038055f, 0.893066f, 0.013466f,
+ 0.000000f, 1.000000f, 0.100159f, 0.955566f, 0.176392f, 0.903320f, 0.239258f, 0.853516f,
+ 0.291016f, 0.808105f, 0.335693f, 0.766602f, 0.372803f, 0.729492f, 0.405762f, 0.694824f,
+ 0.436035f, 0.662598f, 0.463623f, 0.633301f, 0.489502f, 0.605469f, 0.511230f, 0.579590f,
+ 0.532715f, 0.555176f, 0.551758f, 0.532715f, 0.571289f, 0.510742f, 0.588379f, 0.490234f,
+ 0.604004f, 0.471191f, 0.617188f, 0.453369f, 0.632324f, 0.435791f, 0.645020f, 0.419189f,
+ 0.658691f, 0.403564f, 0.670410f, 0.388184f, 0.682617f, 0.373779f, 0.693359f, 0.359863f,
+ 0.703125f, 0.346680f, 0.712402f, 0.334229f, 0.724121f, 0.321289f, 0.732910f, 0.309570f,
+ 0.740234f, 0.298584f, 0.749512f, 0.287598f, 0.758301f, 0.276855f, 0.765625f, 0.266357f,
+ 0.772949f, 0.256348f, 0.782227f, 0.246582f, 0.787598f, 0.237915f, 0.793945f, 0.229248f,
+ 0.801758f, 0.220337f, 0.807617f, 0.211670f, 0.813965f, 0.203247f, 0.821289f, 0.194824f,
+ 0.826660f, 0.187134f, 0.831543f, 0.179810f, 0.838379f, 0.172241f, 0.843262f, 0.165039f,
+ 0.847656f, 0.158325f, 0.853516f, 0.151489f, 0.857422f, 0.144897f, 0.862305f, 0.138428f,
+ 0.866699f, 0.132690f, 0.871582f, 0.125977f, 0.876465f, 0.120117f, 0.879395f, 0.114685f,
+ 0.885254f, 0.107971f, 0.889160f, 0.102600f, 0.891113f, 0.096558f, 0.895020f, 0.089722f,
+ 0.898926f, 0.083252f, 0.901367f, 0.077332f, 0.905273f, 0.071045f, 0.906738f, 0.062805f,
+ 0.910645f, 0.054810f, 0.910156f, 0.046295f, 0.911133f, 0.033295f, 0.906250f, 0.012779f,
+ 0.000000f, 1.000000f, 0.101318f, 0.955078f, 0.177979f, 0.902832f, 0.242188f, 0.852051f,
+ 0.294434f, 0.806152f, 0.340088f, 0.763672f, 0.378906f, 0.725098f, 0.414307f, 0.689453f,
+ 0.445557f, 0.656738f, 0.473633f, 0.625977f, 0.498047f, 0.598145f, 0.521484f, 0.571289f,
+ 0.543945f, 0.545898f, 0.562988f, 0.523438f, 0.583496f, 0.500977f, 0.598633f, 0.480957f,
+ 0.614746f, 0.461182f, 0.630371f, 0.442383f, 0.645508f, 0.424561f, 0.660156f, 0.407227f,
+ 0.671875f, 0.391602f, 0.685547f, 0.375732f, 0.696777f, 0.361572f, 0.706543f, 0.347656f,
+ 0.718262f, 0.333984f, 0.726562f, 0.321289f, 0.737305f, 0.308838f, 0.746094f, 0.296875f,
+ 0.756348f, 0.285156f, 0.764160f, 0.274170f, 0.770996f, 0.264404f, 0.779785f, 0.253418f,
+ 0.787598f, 0.243408f, 0.795410f, 0.233765f, 0.802246f, 0.224609f, 0.807129f, 0.216309f,
+ 0.815430f, 0.207397f, 0.820312f, 0.199341f, 0.826660f, 0.191162f, 0.834961f, 0.182251f,
+ 0.839844f, 0.174927f, 0.844238f, 0.167480f, 0.851074f, 0.160034f, 0.856445f, 0.152954f,
+ 0.860352f, 0.146484f, 0.865723f, 0.139771f, 0.870605f, 0.133179f, 0.874023f, 0.127686f,
+ 0.879883f, 0.121033f, 0.884766f, 0.114929f, 0.887207f, 0.109680f, 0.892578f, 0.103516f,
+ 0.895996f, 0.098083f, 0.899902f, 0.092773f, 0.904297f, 0.087219f, 0.907715f, 0.080933f,
+ 0.909180f, 0.075745f, 0.913574f, 0.068542f, 0.915527f, 0.063354f, 0.919434f, 0.056274f,
+ 0.920410f, 0.049133f, 0.922852f, 0.040192f, 0.923340f, 0.029037f, 0.918945f, 0.010727f,
+ 0.000000f, 1.000000f, 0.101074f, 0.955566f, 0.181641f, 0.900879f, 0.244019f, 0.850586f,
+ 0.299316f, 0.803223f, 0.346680f, 0.759766f, 0.386475f, 0.720215f, 0.422119f, 0.683594f,
+ 0.453125f, 0.650391f, 0.481689f, 0.619141f, 0.508789f, 0.589844f, 0.532227f, 0.562988f,
+ 0.555176f, 0.537598f, 0.575195f, 0.513672f, 0.594238f, 0.491455f, 0.611816f, 0.470215f,
+ 0.627930f, 0.450195f, 0.643555f, 0.431396f, 0.659180f, 0.412842f, 0.672363f, 0.396240f,
+ 0.684570f, 0.379883f, 0.697266f, 0.364258f, 0.708984f, 0.349609f, 0.720703f, 0.335205f,
+ 0.731934f, 0.321777f, 0.740723f, 0.308838f, 0.750488f, 0.296387f, 0.759277f, 0.284668f,
+ 0.768555f, 0.272705f, 0.778809f, 0.261230f, 0.785156f, 0.251465f, 0.793457f, 0.241089f,
+ 0.800293f, 0.231201f, 0.809082f, 0.221191f, 0.814941f, 0.212280f, 0.821289f, 0.203613f,
+ 0.829102f, 0.194702f, 0.833496f, 0.187134f, 0.839844f, 0.179321f, 0.846680f, 0.170776f,
+ 0.852051f, 0.163330f, 0.858398f, 0.155518f, 0.862305f, 0.148560f, 0.868164f, 0.141724f,
+ 0.873047f, 0.135254f, 0.877930f, 0.128418f, 0.881836f, 0.122742f, 0.887207f, 0.116272f,
+ 0.891602f, 0.110535f, 0.894043f, 0.105164f, 0.900391f, 0.099365f, 0.903809f, 0.093689f,
+ 0.907227f, 0.089172f, 0.911621f, 0.082947f, 0.915039f, 0.078430f, 0.918457f, 0.073120f,
+ 0.920898f, 0.067749f, 0.924316f, 0.061584f, 0.926270f, 0.055939f, 0.930664f, 0.049683f,
+ 0.932129f, 0.043274f, 0.934082f, 0.035919f, 0.934082f, 0.025879f, 0.931152f, 0.010231f,
+ 0.000000f, 1.000000f, 0.101440f, 0.955078f, 0.181763f, 0.900879f, 0.247925f, 0.848633f,
+ 0.303467f, 0.800781f, 0.351562f, 0.756348f, 0.393311f, 0.715820f, 0.429199f, 0.678711f,
+ 0.462646f, 0.644043f, 0.491455f, 0.612305f, 0.518555f, 0.582520f, 0.542969f, 0.554688f,
+ 0.564941f, 0.529297f, 0.586914f, 0.504395f, 0.605469f, 0.481689f, 0.624023f, 0.459961f,
+ 0.639648f, 0.439941f, 0.656738f, 0.420410f, 0.671387f, 0.402344f, 0.683594f, 0.385254f,
+ 0.698242f, 0.368164f, 0.709961f, 0.352783f, 0.721680f, 0.337891f, 0.733887f, 0.323242f,
+ 0.743652f, 0.310059f, 0.752930f, 0.296875f, 0.763184f, 0.284180f, 0.772461f, 0.272217f,
+ 0.782715f, 0.260742f, 0.790527f, 0.249634f, 0.797852f, 0.239136f, 0.805664f, 0.228760f,
+ 0.812012f, 0.219727f, 0.820801f, 0.209717f, 0.826660f, 0.200562f, 0.834961f, 0.191284f,
+ 0.839844f, 0.183350f, 0.845703f, 0.175293f, 0.852539f, 0.167358f, 0.856934f, 0.160278f,
+ 0.864746f, 0.152344f, 0.868652f, 0.145020f, 0.874512f, 0.137695f, 0.880371f, 0.131226f,
+ 0.885254f, 0.124084f, 0.887207f, 0.119202f, 0.894043f, 0.111816f, 0.897461f, 0.106445f,
+ 0.903809f, 0.100586f, 0.905762f, 0.095093f, 0.909180f, 0.090454f, 0.915039f, 0.084290f,
+ 0.916992f, 0.079895f, 0.922363f, 0.074341f, 0.924805f, 0.070007f, 0.928711f, 0.064880f,
+ 0.931641f, 0.060455f, 0.934570f, 0.055267f, 0.937012f, 0.049316f, 0.938965f, 0.043762f,
+ 0.942383f, 0.038239f, 0.943359f, 0.031235f, 0.945801f, 0.022858f, 0.943359f, 0.008293f,
+ 0.000000f, 1.000000f, 0.101990f, 0.955078f, 0.184082f, 0.899414f, 0.251709f, 0.846680f,
+ 0.308105f, 0.797363f, 0.358398f, 0.751953f, 0.399414f, 0.710938f, 0.436523f, 0.673340f,
+ 0.469238f, 0.638184f, 0.500000f, 0.605469f, 0.527832f, 0.575195f, 0.553223f, 0.546387f,
+ 0.575684f, 0.520020f, 0.595703f, 0.496094f, 0.617676f, 0.471924f, 0.635254f, 0.450195f,
+ 0.652832f, 0.429443f, 0.667480f, 0.410400f, 0.682617f, 0.391846f, 0.697754f, 0.373535f,
+ 0.710938f, 0.356934f, 0.724121f, 0.341064f, 0.734375f, 0.326416f, 0.745605f, 0.312012f,
+ 0.755859f, 0.298340f, 0.765625f, 0.285400f, 0.776367f, 0.272461f, 0.785645f, 0.260254f,
+ 0.794922f, 0.249023f, 0.802246f, 0.238403f, 0.811035f, 0.227417f, 0.818359f, 0.217041f,
+ 0.825195f, 0.207764f, 0.831543f, 0.198608f, 0.839355f, 0.189331f, 0.846191f, 0.180420f,
+ 0.851562f, 0.172119f, 0.858887f, 0.163818f, 0.863281f, 0.156372f, 0.870117f, 0.149170f,
+ 0.874512f, 0.141968f, 0.878906f, 0.135742f, 0.886230f, 0.127563f, 0.890137f, 0.121521f,
+ 0.895996f, 0.114380f, 0.899414f, 0.108704f, 0.904785f, 0.102539f, 0.908203f, 0.097107f,
+ 0.913086f, 0.091370f, 0.916016f, 0.086487f, 0.920410f, 0.081055f, 0.923828f, 0.076172f,
+ 0.926758f, 0.071655f, 0.930664f, 0.066711f, 0.933594f, 0.062225f, 0.937500f, 0.057587f,
+ 0.939941f, 0.053406f, 0.944336f, 0.048767f, 0.946289f, 0.044495f, 0.949219f, 0.038361f,
+ 0.951660f, 0.032867f, 0.953125f, 0.027573f, 0.953613f, 0.019714f, 0.954102f, 0.007561f,
+ 0.000000f, 1.000000f, 0.103210f, 0.954102f, 0.184937f, 0.898926f, 0.254639f, 0.844727f,
+ 0.312012f, 0.794922f, 0.362549f, 0.749023f, 0.405273f, 0.707031f, 0.444092f, 0.667969f,
+ 0.479248f, 0.631348f, 0.510742f, 0.598145f, 0.537109f, 0.567383f, 0.562988f, 0.538574f,
+ 0.586426f, 0.511719f, 0.608398f, 0.486328f, 0.627930f, 0.462891f, 0.645508f, 0.440674f,
+ 0.662598f, 0.419922f, 0.679688f, 0.399658f, 0.694824f, 0.381104f, 0.709961f, 0.363037f,
+ 0.723633f, 0.345947f, 0.735352f, 0.330566f, 0.745117f, 0.315430f, 0.757812f, 0.300781f,
+ 0.768066f, 0.287354f, 0.777832f, 0.273926f, 0.788574f, 0.261230f, 0.797852f, 0.249390f,
+ 0.806152f, 0.237671f, 0.812988f, 0.227539f, 0.822754f, 0.216431f, 0.829102f, 0.206665f,
+ 0.837402f, 0.196167f, 0.843262f, 0.187866f, 0.850098f, 0.178345f, 0.856934f, 0.170532f,
+ 0.863281f, 0.161499f, 0.869141f, 0.153809f, 0.875000f, 0.145874f, 0.880371f, 0.138794f,
+ 0.885254f, 0.131714f, 0.889648f, 0.125488f, 0.895020f, 0.118896f, 0.899414f, 0.112488f,
+ 0.904785f, 0.105896f, 0.909668f, 0.099670f, 0.914551f, 0.093872f, 0.917969f, 0.088379f,
+ 0.922363f, 0.083069f, 0.925781f, 0.077759f, 0.929199f, 0.073120f, 0.932617f, 0.068115f,
+ 0.936523f, 0.063599f, 0.939941f, 0.058990f, 0.943359f, 0.054779f, 0.946777f, 0.050354f,
+ 0.948730f, 0.046722f, 0.952148f, 0.042236f, 0.955566f, 0.038208f, 0.958984f, 0.034027f,
+ 0.959473f, 0.028656f, 0.962402f, 0.022903f, 0.964355f, 0.017456f, 0.962891f, 0.006824f,
+ 0.000000f, 1.000000f, 0.103149f, 0.954590f, 0.187622f, 0.897949f, 0.257568f, 0.843262f,
+ 0.317871f, 0.791992f, 0.369629f, 0.744629f, 0.412842f, 0.702148f, 0.453125f, 0.661621f,
+ 0.487061f, 0.625488f, 0.518066f, 0.591797f, 0.546875f, 0.560059f, 0.573730f, 0.530273f,
+ 0.596191f, 0.503418f, 0.619141f, 0.477051f, 0.639160f, 0.453125f, 0.659180f, 0.430420f,
+ 0.674805f, 0.409424f, 0.691406f, 0.389404f, 0.706055f, 0.370361f, 0.720703f, 0.352539f,
+ 0.733887f, 0.335449f, 0.746582f, 0.319580f, 0.756348f, 0.304932f, 0.770020f, 0.289551f,
+ 0.781738f, 0.275391f, 0.790527f, 0.263428f, 0.799316f, 0.250488f, 0.809082f, 0.238403f,
+ 0.817383f, 0.227417f, 0.825684f, 0.215942f, 0.833008f, 0.205811f, 0.839844f, 0.196167f,
+ 0.848145f, 0.186157f, 0.854492f, 0.177002f, 0.861328f, 0.168213f, 0.867676f, 0.159668f,
+ 0.873047f, 0.152100f, 0.879395f, 0.144165f, 0.885254f, 0.136353f, 0.890137f, 0.129150f,
+ 0.895996f, 0.122375f, 0.900391f, 0.115967f, 0.904785f, 0.109680f, 0.909180f, 0.103760f,
+ 0.913574f, 0.097961f, 0.918945f, 0.091736f, 0.922363f, 0.085876f, 0.926758f, 0.080383f,
+ 0.930664f, 0.075012f, 0.935059f, 0.070068f, 0.938477f, 0.065186f, 0.942383f, 0.060944f,
+ 0.944824f, 0.056366f, 0.948730f, 0.051880f, 0.951172f, 0.047943f, 0.953613f, 0.044098f,
+ 0.957520f, 0.040131f, 0.960449f, 0.036285f, 0.962402f, 0.032806f, 0.965820f, 0.028778f,
+ 0.968750f, 0.025314f, 0.970215f, 0.019409f, 0.971191f, 0.013916f, 0.971680f, 0.004665f,
+ 0.000000f, 1.000000f, 0.104492f, 0.953613f, 0.189575f, 0.896973f, 0.261230f, 0.840820f,
+ 0.322021f, 0.789062f, 0.375244f, 0.741211f, 0.421143f, 0.696777f, 0.459717f, 0.656738f,
+ 0.496582f, 0.618652f, 0.529297f, 0.583984f, 0.558105f, 0.551758f, 0.583008f, 0.522461f,
+ 0.607422f, 0.494385f, 0.631348f, 0.468262f, 0.650879f, 0.443604f, 0.667969f, 0.421143f,
+ 0.685547f, 0.399902f, 0.704102f, 0.379639f, 0.719238f, 0.360352f, 0.733398f, 0.342041f,
+ 0.746094f, 0.325439f, 0.758301f, 0.309082f, 0.769531f, 0.293945f, 0.781250f, 0.279053f,
+ 0.791016f, 0.265625f, 0.801758f, 0.252197f, 0.811035f, 0.239746f, 0.819336f, 0.228149f,
+ 0.828125f, 0.216675f, 0.835449f, 0.206299f, 0.844727f, 0.195557f, 0.852051f, 0.185425f,
+ 0.858398f, 0.176147f, 0.864258f, 0.167725f, 0.871582f, 0.158569f, 0.877930f, 0.149902f,
+ 0.883301f, 0.142334f, 0.888672f, 0.134766f, 0.893555f, 0.127930f, 0.899414f, 0.120667f,
+ 0.905273f, 0.113342f, 0.910645f, 0.106750f, 0.914551f, 0.100708f, 0.919434f, 0.094727f,
+ 0.921875f, 0.089539f, 0.926270f, 0.084106f, 0.930176f, 0.079163f, 0.935059f, 0.073425f,
+ 0.939941f, 0.067627f, 0.943359f, 0.063049f, 0.946289f, 0.058472f, 0.950195f, 0.053711f,
+ 0.952637f, 0.049927f, 0.956055f, 0.045410f, 0.958496f, 0.041595f, 0.961426f, 0.038086f,
+ 0.964844f, 0.033997f, 0.967285f, 0.030716f, 0.970215f, 0.027283f, 0.972656f, 0.023804f,
+ 0.974609f, 0.020844f, 0.979004f, 0.016663f, 0.978027f, 0.011475f, 0.979980f, 0.004517f,
+ 0.000000f, 1.000000f, 0.103699f, 0.954590f, 0.191895f, 0.895508f, 0.263916f, 0.839355f,
+ 0.325439f, 0.786621f, 0.379150f, 0.737793f, 0.427002f, 0.692383f, 0.467773f, 0.650879f,
+ 0.503418f, 0.612793f, 0.537109f, 0.577637f, 0.566406f, 0.544434f, 0.594238f, 0.514160f,
+ 0.618164f, 0.485840f, 0.641113f, 0.459229f, 0.661133f, 0.434814f, 0.680664f, 0.411377f,
+ 0.698242f, 0.389648f, 0.713379f, 0.369629f, 0.729492f, 0.350098f, 0.743164f, 0.332031f,
+ 0.757324f, 0.314941f, 0.768555f, 0.298828f, 0.780762f, 0.283447f, 0.791992f, 0.269043f,
+ 0.802734f, 0.255127f, 0.812500f, 0.242188f, 0.820801f, 0.230103f, 0.830566f, 0.217773f,
+ 0.839355f, 0.206665f, 0.846680f, 0.196045f, 0.854004f, 0.185669f, 0.860840f, 0.176147f,
+ 0.867676f, 0.167114f, 0.875488f, 0.157715f, 0.879883f, 0.149658f, 0.886719f, 0.141235f,
+ 0.892578f, 0.133545f, 0.899414f, 0.125488f, 0.902832f, 0.118835f, 0.909668f, 0.111755f,
+ 0.913086f, 0.105652f, 0.917969f, 0.099609f, 0.923340f, 0.092896f, 0.926758f, 0.087158f,
+ 0.931641f, 0.081299f, 0.935059f, 0.076233f, 0.938477f, 0.071289f, 0.942383f, 0.066467f,
+ 0.944336f, 0.062439f, 0.950195f, 0.057098f, 0.954102f, 0.051971f, 0.957520f, 0.047729f,
+ 0.960938f, 0.043304f, 0.963379f, 0.039429f, 0.966309f, 0.035736f, 0.970215f, 0.031647f,
+ 0.972168f, 0.028305f, 0.974609f, 0.025269f, 0.977539f, 0.021774f, 0.979492f, 0.018845f,
+ 0.981445f, 0.016144f, 0.984863f, 0.012421f, 0.986328f, 0.009705f, 0.987793f, 0.002100f,
+ 0.000000f, 1.000000f, 0.104919f, 0.953613f, 0.193481f, 0.895020f, 0.266113f, 0.837891f,
+ 0.330811f, 0.783203f, 0.385986f, 0.733398f, 0.433105f, 0.687988f, 0.476074f, 0.645020f,
+ 0.513184f, 0.606445f, 0.546387f, 0.570312f, 0.576172f, 0.537109f, 0.604492f, 0.505859f,
+ 0.628906f, 0.477295f, 0.651855f, 0.450439f, 0.672363f, 0.425537f, 0.690918f, 0.401855f,
+ 0.708984f, 0.380127f, 0.726074f, 0.359375f, 0.741699f, 0.340088f, 0.754883f, 0.322266f,
+ 0.767090f, 0.305176f, 0.780762f, 0.288574f, 0.791016f, 0.273926f, 0.803711f, 0.258789f,
+ 0.813477f, 0.245483f, 0.822754f, 0.232300f, 0.831055f, 0.220459f, 0.841309f, 0.208008f,
+ 0.848633f, 0.197388f, 0.856934f, 0.186523f, 0.864258f, 0.176392f, 0.870117f, 0.167236f,
+ 0.878418f, 0.157593f, 0.883789f, 0.148926f, 0.890625f, 0.140747f, 0.896973f, 0.132690f,
+ 0.902344f, 0.124878f, 0.906738f, 0.117554f, 0.911133f, 0.111084f, 0.916504f, 0.104431f,
+ 0.922363f, 0.097473f, 0.927246f, 0.091187f, 0.931641f, 0.085327f, 0.935059f, 0.080139f,
+ 0.938965f, 0.074890f, 0.942871f, 0.069336f, 0.946289f, 0.064331f, 0.950684f, 0.059265f,
+ 0.954102f, 0.054565f, 0.957031f, 0.050537f, 0.959473f, 0.046753f, 0.962891f, 0.042542f,
+ 0.965332f, 0.039246f, 0.969238f, 0.034851f, 0.973633f, 0.030243f, 0.976074f, 0.026428f,
+ 0.978516f, 0.023300f, 0.980469f, 0.020340f, 0.984375f, 0.016403f, 0.985840f, 0.014069f,
+ 0.987793f, 0.011551f, 0.991211f, 0.008347f, 0.992676f, 0.005676f, 0.994141f, 0.003460f,
+ 0.000000f, 1.000000f, 0.106079f, 0.953125f, 0.194214f, 0.894531f, 0.270264f, 0.836426f,
+ 0.335205f, 0.781250f, 0.390625f, 0.729980f, 0.439697f, 0.683105f, 0.483398f, 0.639648f,
+ 0.521484f, 0.600098f, 0.555664f, 0.563477f, 0.586914f, 0.529297f, 0.615234f, 0.498047f,
+ 0.637695f, 0.469482f, 0.662598f, 0.441650f, 0.682129f, 0.416748f, 0.701660f, 0.393066f,
+ 0.720703f, 0.370850f, 0.736816f, 0.349854f, 0.752930f, 0.330322f, 0.767578f, 0.312256f,
+ 0.778809f, 0.295654f, 0.788086f, 0.280029f, 0.802246f, 0.263672f, 0.814941f, 0.249023f,
+ 0.821289f, 0.236816f, 0.833008f, 0.222778f, 0.842285f, 0.211182f, 0.849609f, 0.199097f,
+ 0.858398f, 0.188477f, 0.865723f, 0.177612f, 0.873047f, 0.167603f, 0.880371f, 0.158203f,
+ 0.888184f, 0.148926f, 0.893066f, 0.140869f, 0.898926f, 0.132446f, 0.904785f, 0.124023f,
+ 0.909668f, 0.117615f, 0.916016f, 0.109924f, 0.920898f, 0.102356f, 0.922852f, 0.097961f,
+ 0.930176f, 0.090576f, 0.936523f, 0.082825f, 0.936523f, 0.078857f, 0.940430f, 0.074707f,
+ 0.947754f, 0.067871f, 0.952637f, 0.061066f, 0.952637f, 0.057983f, 0.952637f, 0.055847f,
+ 0.960938f, 0.049866f, 0.968262f, 0.042328f, 0.968262f, 0.038971f, 0.968262f, 0.037048f,
+ 0.968262f, 0.035675f, 0.974609f, 0.031281f, 0.983887f, 0.022980f, 0.983887f, 0.019745f,
+ 0.983887f, 0.018219f, 0.983887f, 0.017288f, 0.983887f, 0.016663f, 0.985840f, 0.015717f,
+ 0.999512f, 0.003330f, 0.999512f, 0.000731f, 0.999512f, 0.000126f, 0.999512f, 0.000002f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, 0.000000f, 0.989258f,
+ 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.985352f, 0.000000f, 0.983398f,
+ 0.000000f, 0.982422f, 0.000000f, 0.979980f, 0.000000f, 0.978027f, 0.000000f, 0.976562f,
+ 0.000000f, 0.973633f, 0.000000f, 0.971680f, 0.000000f, 0.968750f, 0.000000f, 0.966309f,
+ 0.000000f, 0.963379f, 0.000000f, 0.960938f, 0.000000f, 0.957031f, 0.000000f, 0.953613f,
+ 0.000000f, 0.950195f, 0.000000f, 0.946289f, 0.000000f, 0.941895f, 0.000000f, 0.937988f,
+ 0.000000f, 0.932617f, 0.000000f, 0.927734f, 0.000000f, 0.922363f, 0.000000f, 0.916992f,
+ 0.000000f, 0.910645f, 0.000000f, 0.904785f, 0.000000f, 0.896484f, 0.000000f, 0.888672f,
+ 0.000000f, 0.879883f, 0.000000f, 0.870605f, 0.000000f, 0.861328f, 0.000000f, 0.851074f,
+ 0.000000f, 0.838867f, 0.000000f, 0.825684f, 0.000000f, 0.811523f, 0.000000f, 0.795898f,
+ 0.000000f, 0.778320f, 0.000000f, 0.758301f, 0.000000f, 0.736328f, 0.000000f, 0.711426f,
+ 0.000000f, 0.682617f, 0.000000f, 0.648926f, 0.000000f, 0.608887f, 0.000000f, 0.561523f,
+ 0.000000f, 0.501465f, 0.000000f, 0.423096f, 0.000000f, 0.310791f, 0.000000f, 0.118774f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, 0.000000f, 0.989746f,
+ 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985840f, 0.000000f, 0.983887f,
+ 0.000000f, 0.981445f, 0.000000f, 0.980469f, 0.000000f, 0.978027f, 0.000000f, 0.976074f,
+ 0.000000f, 0.974121f, 0.000000f, 0.971191f, 0.000000f, 0.969238f, 0.000000f, 0.965820f,
+ 0.000000f, 0.963867f, 0.000000f, 0.960449f, 0.000000f, 0.957520f, 0.000000f, 0.953613f,
+ 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.941895f, 0.000000f, 0.937988f,
+ 0.000000f, 0.933105f, 0.000000f, 0.927734f, 0.000000f, 0.922363f, 0.000000f, 0.916504f,
+ 0.000000f, 0.910645f, 0.000000f, 0.903809f, 0.000000f, 0.895996f, 0.000000f, 0.888672f,
+ 0.000000f, 0.879883f, 0.000000f, 0.871094f, 0.000000f, 0.861328f, 0.000000f, 0.851074f,
+ 0.000000f, 0.838867f, 0.000000f, 0.825684f, 0.000000f, 0.811523f, 0.000000f, 0.795898f,
+ 0.000000f, 0.778320f, 0.000000f, 0.758301f, 0.000000f, 0.736328f, 0.000000f, 0.710938f,
+ 0.000000f, 0.682617f, 0.000000f, 0.648438f, 0.000003f, 0.608887f, 0.000004f, 0.561523f,
+ 0.000003f, 0.501953f, 0.000002f, 0.423584f, 0.000002f, 0.311523f, 0.000001f, 0.119202f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f,
+ 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.989258f,
+ 0.000000f, 0.987793f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, 0.000000f, 0.983398f,
+ 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.978027f, 0.000000f, 0.976074f,
+ 0.000000f, 0.973145f, 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.965820f,
+ 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, 0.000000f, 0.953125f,
+ 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.941406f, 0.000000f, 0.937012f,
+ 0.000000f, 0.932129f, 0.000000f, 0.926758f, 0.000000f, 0.921387f, 0.000000f, 0.916016f,
+ 0.000000f, 0.910156f, 0.000000f, 0.902832f, 0.000000f, 0.895508f, 0.000005f, 0.887695f,
+ 0.000013f, 0.879395f, 0.000022f, 0.870605f, 0.000033f, 0.860840f, 0.000044f, 0.849609f,
+ 0.000048f, 0.837891f, 0.000049f, 0.824707f, 0.000049f, 0.810547f, 0.000046f, 0.794922f,
+ 0.000044f, 0.777832f, 0.000040f, 0.757812f, 0.000035f, 0.735352f, 0.000031f, 0.710449f,
+ 0.000033f, 0.682129f, 0.000032f, 0.647949f, 0.000028f, 0.608398f, 0.000026f, 0.561035f,
+ 0.000024f, 0.501465f, 0.000020f, 0.422852f, 0.000016f, 0.311279f, 0.000011f, 0.119324f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f,
+ 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.995117f, 0.000000f, 0.993652f,
+ 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.989258f,
+ 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.982910f,
+ 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.977051f, 0.000000f, 0.975098f,
+ 0.000000f, 0.972656f, 0.000002f, 0.970215f, 0.000010f, 0.967773f, 0.000020f, 0.965332f,
+ 0.000034f, 0.962402f, 0.000047f, 0.959473f, 0.000064f, 0.956055f, 0.000079f, 0.952148f,
+ 0.000095f, 0.948730f, 0.000112f, 0.944336f, 0.000129f, 0.940918f, 0.000145f, 0.936035f,
+ 0.000163f, 0.931152f, 0.000180f, 0.926270f, 0.000187f, 0.920410f, 0.000191f, 0.915039f,
+ 0.000190f, 0.908691f, 0.000185f, 0.902344f, 0.000178f, 0.894531f, 0.000173f, 0.886719f,
+ 0.000164f, 0.878418f, 0.000154f, 0.869141f, 0.000142f, 0.859375f, 0.000137f, 0.848633f,
+ 0.000136f, 0.836914f, 0.000138f, 0.823730f, 0.000144f, 0.809570f, 0.000141f, 0.793945f,
+ 0.000132f, 0.776855f, 0.000121f, 0.756836f, 0.000122f, 0.734375f, 0.000119f, 0.709473f,
+ 0.000110f, 0.681152f, 0.000106f, 0.646973f, 0.000101f, 0.607422f, 0.000095f, 0.560547f,
+ 0.000085f, 0.500977f, 0.000079f, 0.422852f, 0.000066f, 0.310791f, 0.000038f, 0.118713f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f,
+ 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000001f, 0.993652f,
+ 0.000014f, 0.992676f, 0.000038f, 0.990723f, 0.000059f, 0.989746f, 0.000087f, 0.988281f,
+ 0.000112f, 0.987305f, 0.000136f, 0.985352f, 0.000165f, 0.983398f, 0.000191f, 0.982422f,
+ 0.000213f, 0.980469f, 0.000240f, 0.979004f, 0.000266f, 0.976074f, 0.000289f, 0.974121f,
+ 0.000310f, 0.972168f, 0.000333f, 0.969727f, 0.000359f, 0.966797f, 0.000381f, 0.964355f,
+ 0.000400f, 0.960938f, 0.000417f, 0.958008f, 0.000437f, 0.954590f, 0.000443f, 0.951172f,
+ 0.000439f, 0.947266f, 0.000429f, 0.943359f, 0.000414f, 0.939453f, 0.000404f, 0.935059f,
+ 0.000389f, 0.929688f, 0.000377f, 0.924805f, 0.000367f, 0.919434f, 0.000362f, 0.913574f,
+ 0.000366f, 0.907227f, 0.000373f, 0.900879f, 0.000381f, 0.893555f, 0.000372f, 0.885254f,
+ 0.000376f, 0.876953f, 0.000374f, 0.867676f, 0.000368f, 0.857910f, 0.000369f, 0.846680f,
+ 0.000346f, 0.834961f, 0.000344f, 0.821777f, 0.000348f, 0.808105f, 0.000345f, 0.791992f,
+ 0.000345f, 0.774902f, 0.000314f, 0.754883f, 0.000312f, 0.732910f, 0.000311f, 0.708008f,
+ 0.000304f, 0.679688f, 0.000272f, 0.645996f, 0.000271f, 0.606445f, 0.000267f, 0.559570f,
+ 0.000230f, 0.500000f, 0.000226f, 0.422119f, 0.000194f, 0.310547f, 0.000089f, 0.118958f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000004f, 0.999023f,
+ 0.000049f, 0.998047f, 0.000116f, 0.997559f, 0.000161f, 0.997070f, 0.000219f, 0.997070f,
+ 0.000268f, 0.995605f, 0.000304f, 0.994141f, 0.000349f, 0.994141f, 0.000395f, 0.992676f,
+ 0.000430f, 0.991699f, 0.000457f, 0.990723f, 0.000491f, 0.988770f, 0.000532f, 0.987793f,
+ 0.000563f, 0.986328f, 0.000588f, 0.984863f, 0.000607f, 0.982910f, 0.000638f, 0.980957f,
+ 0.000672f, 0.979492f, 0.000698f, 0.977539f, 0.000718f, 0.975586f, 0.000734f, 0.972656f,
+ 0.000751f, 0.970703f, 0.000769f, 0.968262f, 0.000764f, 0.965820f, 0.000755f, 0.962891f,
+ 0.000746f, 0.959961f, 0.000739f, 0.957031f, 0.000741f, 0.953125f, 0.000755f, 0.949707f,
+ 0.000765f, 0.946289f, 0.000748f, 0.941895f, 0.000752f, 0.937988f, 0.000752f, 0.933105f,
+ 0.000764f, 0.928711f, 0.000785f, 0.922852f, 0.000763f, 0.916992f, 0.000774f, 0.911621f,
+ 0.000782f, 0.905762f, 0.000781f, 0.898438f, 0.000790f, 0.891113f, 0.000754f, 0.883789f,
+ 0.000756f, 0.875000f, 0.000765f, 0.865723f, 0.000762f, 0.855469f, 0.000761f, 0.845215f,
+ 0.000772f, 0.833496f, 0.000726f, 0.819824f, 0.000721f, 0.806152f, 0.000715f, 0.790039f,
+ 0.000713f, 0.772949f, 0.000667f, 0.752930f, 0.000661f, 0.730957f, 0.000654f, 0.706543f,
+ 0.000633f, 0.678223f, 0.000607f, 0.644043f, 0.000587f, 0.604980f, 0.000575f, 0.558105f,
+ 0.000537f, 0.499512f, 0.000507f, 0.421875f, 0.000431f, 0.310547f, 0.000169f, 0.118103f,
+ 0.000000f, 1.000000f, 0.000213f, 0.999512f, 0.000377f, 0.999023f, 0.000426f, 0.998535f,
+ 0.000521f, 0.998047f, 0.000593f, 0.997070f, 0.000622f, 0.997070f, 0.000648f, 0.996094f,
+ 0.000748f, 0.995117f, 0.000783f, 0.994141f, 0.000803f, 0.993164f, 0.000814f, 0.992188f,
+ 0.000896f, 0.990723f, 0.000933f, 0.989746f, 0.000953f, 0.988770f, 0.000966f, 0.986816f,
+ 0.000974f, 0.985840f, 0.001040f, 0.983887f, 0.001085f, 0.982422f, 0.001128f, 0.979980f,
+ 0.001166f, 0.978516f, 0.001181f, 0.976074f, 0.001194f, 0.974609f, 0.001233f, 0.971680f,
+ 0.001244f, 0.969727f, 0.001245f, 0.966309f, 0.001249f, 0.964355f, 0.001251f, 0.961914f,
+ 0.001231f, 0.958008f, 0.001264f, 0.955078f, 0.001286f, 0.951660f, 0.001309f, 0.947754f,
+ 0.001332f, 0.944336f, 0.001299f, 0.939941f, 0.001328f, 0.935547f, 0.001386f, 0.931152f,
+ 0.001400f, 0.926270f, 0.001399f, 0.920898f, 0.001336f, 0.915039f, 0.001348f, 0.909180f,
+ 0.001355f, 0.903320f, 0.001403f, 0.895996f, 0.001408f, 0.888672f, 0.001418f, 0.880371f,
+ 0.001347f, 0.872070f, 0.001354f, 0.863770f, 0.001344f, 0.853516f, 0.001376f, 0.842285f,
+ 0.001389f, 0.830078f, 0.001316f, 0.817383f, 0.001289f, 0.803223f, 0.001275f, 0.787598f,
+ 0.001319f, 0.770020f, 0.001247f, 0.750488f, 0.001211f, 0.728516f, 0.001207f, 0.704102f,
+ 0.001219f, 0.675781f, 0.001157f, 0.642090f, 0.001116f, 0.603516f, 0.001091f, 0.557129f,
+ 0.001042f, 0.498291f, 0.000967f, 0.421631f, 0.000803f, 0.309570f, 0.000277f, 0.117859f,
+ 0.000000f, 1.000000f, 0.000393f, 0.999512f, 0.000695f, 0.999023f, 0.000679f, 0.998535f,
+ 0.000913f, 0.997559f, 0.000922f, 0.997070f, 0.000916f, 0.996582f, 0.001082f, 0.995605f,
+ 0.001120f, 0.994629f, 0.001123f, 0.993652f, 0.001124f, 0.992676f, 0.001147f, 0.991211f,
+ 0.001364f, 0.989746f, 0.001415f, 0.988770f, 0.001466f, 0.987305f, 0.001504f, 0.986328f,
+ 0.001543f, 0.984863f, 0.001739f, 0.982422f, 0.001755f, 0.980957f, 0.001754f, 0.979004f,
+ 0.001742f, 0.977051f, 0.001738f, 0.975098f, 0.001844f, 0.972656f, 0.001879f, 0.970215f,
+ 0.001865f, 0.967773f, 0.001899f, 0.964844f, 0.001923f, 0.962402f, 0.001947f, 0.959473f,
+ 0.002068f, 0.957031f, 0.002052f, 0.952637f, 0.002098f, 0.949219f, 0.002125f, 0.945801f,
+ 0.002134f, 0.941895f, 0.002144f, 0.937988f, 0.002151f, 0.933105f, 0.002190f, 0.928711f,
+ 0.002205f, 0.923828f, 0.002234f, 0.917969f, 0.002247f, 0.912598f, 0.002159f, 0.906738f,
+ 0.002224f, 0.899902f, 0.002279f, 0.893555f, 0.002281f, 0.885254f, 0.002283f, 0.877930f,
+ 0.002186f, 0.869141f, 0.002214f, 0.860352f, 0.002239f, 0.850098f, 0.002266f, 0.838867f,
+ 0.002253f, 0.827148f, 0.002184f, 0.813965f, 0.002188f, 0.800781f, 0.002146f, 0.784668f,
+ 0.002188f, 0.767090f, 0.002102f, 0.747559f, 0.002113f, 0.726074f, 0.002066f, 0.701172f,
+ 0.002077f, 0.672852f, 0.001999f, 0.639648f, 0.001946f, 0.601562f, 0.001884f, 0.555176f,
+ 0.001818f, 0.496582f, 0.001650f, 0.420898f, 0.001338f, 0.309082f, 0.000412f, 0.117065f,
+ 0.000000f, 1.000000f, 0.000453f, 0.999512f, 0.000836f, 0.998535f, 0.000809f, 0.998535f,
+ 0.001129f, 0.997070f, 0.001140f, 0.996582f, 0.001184f, 0.995605f, 0.001510f, 0.995117f,
+ 0.001587f, 0.993652f, 0.001655f, 0.993164f, 0.001698f, 0.992188f, 0.001737f, 0.991211f,
+ 0.002052f, 0.989258f, 0.002102f, 0.987793f, 0.002134f, 0.986328f, 0.002151f, 0.984863f,
+ 0.002186f, 0.983398f, 0.002422f, 0.981445f, 0.002457f, 0.979004f, 0.002485f, 0.977539f,
+ 0.002527f, 0.975586f, 0.002520f, 0.973145f, 0.002733f, 0.971191f, 0.002773f, 0.968262f,
+ 0.002817f, 0.965820f, 0.002806f, 0.962891f, 0.002872f, 0.960449f, 0.002928f, 0.957031f,
+ 0.003124f, 0.954102f, 0.003059f, 0.950684f, 0.003065f, 0.946289f, 0.003115f, 0.942871f,
+ 0.003168f, 0.939453f, 0.003214f, 0.935547f, 0.003252f, 0.930176f, 0.003292f, 0.925293f,
+ 0.003325f, 0.920410f, 0.003378f, 0.915527f, 0.003378f, 0.909180f, 0.003294f, 0.903809f,
+ 0.003424f, 0.896973f, 0.003445f, 0.889648f, 0.003454f, 0.882812f, 0.003500f, 0.874023f,
+ 0.003395f, 0.865723f, 0.003397f, 0.856445f, 0.003529f, 0.846191f, 0.003490f, 0.835449f,
+ 0.003540f, 0.823242f, 0.003410f, 0.810547f, 0.003418f, 0.796387f, 0.003439f, 0.780762f,
+ 0.003439f, 0.763184f, 0.003458f, 0.744141f, 0.003349f, 0.722656f, 0.003296f, 0.698242f,
+ 0.003302f, 0.669922f, 0.003210f, 0.637695f, 0.003138f, 0.599609f, 0.003012f, 0.553711f,
+ 0.002899f, 0.495117f, 0.002596f, 0.419678f, 0.002045f, 0.309082f, 0.000576f, 0.116577f,
+ 0.000000f, 1.000000f, 0.000477f, 0.999512f, 0.000981f, 0.998535f, 0.001089f, 0.997559f,
+ 0.001572f, 0.997070f, 0.001649f, 0.995605f, 0.001740f, 0.995117f, 0.001783f, 0.994141f,
+ 0.002174f, 0.992676f, 0.002256f, 0.991699f, 0.002323f, 0.990723f, 0.002399f, 0.989746f,
+ 0.002783f, 0.987793f, 0.002913f, 0.986328f, 0.002974f, 0.984863f, 0.003019f, 0.983398f,
+ 0.003029f, 0.981445f, 0.003357f, 0.979492f, 0.003387f, 0.977539f, 0.003469f, 0.975586f,
+ 0.003550f, 0.973145f, 0.003618f, 0.971680f, 0.003819f, 0.968262f, 0.003937f, 0.966309f,
+ 0.004044f, 0.963379f, 0.004009f, 0.960449f, 0.004063f, 0.957520f, 0.004089f, 0.955078f,
+ 0.004349f, 0.951172f, 0.004467f, 0.947754f, 0.004406f, 0.943848f, 0.004490f, 0.939941f,
+ 0.004532f, 0.936035f, 0.004581f, 0.932617f, 0.004776f, 0.927246f, 0.004749f, 0.921875f,
+ 0.004829f, 0.916992f, 0.004860f, 0.911621f, 0.004929f, 0.906250f, 0.004925f, 0.899902f,
+ 0.004986f, 0.893066f, 0.005043f, 0.885742f, 0.005135f, 0.878418f, 0.005077f, 0.870117f,
+ 0.005157f, 0.861816f, 0.005005f, 0.852539f, 0.005207f, 0.842285f, 0.005173f, 0.831055f,
+ 0.005226f, 0.819336f, 0.005089f, 0.807129f, 0.005100f, 0.792480f, 0.005142f, 0.777344f,
+ 0.005219f, 0.759277f, 0.005215f, 0.740234f, 0.005085f, 0.718750f, 0.004978f, 0.694824f,
+ 0.005047f, 0.666992f, 0.004879f, 0.634277f, 0.004753f, 0.596680f, 0.004562f, 0.552246f,
+ 0.004345f, 0.493164f, 0.003832f, 0.418701f, 0.002930f, 0.308838f, 0.000769f, 0.116272f,
+ 0.000000f, 1.000000f, 0.000282f, 0.999512f, 0.000995f, 0.998535f, 0.001504f, 0.997559f,
+ 0.001652f, 0.996582f, 0.002146f, 0.995605f, 0.002218f, 0.994629f, 0.002407f, 0.993164f,
+ 0.002937f, 0.992188f, 0.003057f, 0.990723f, 0.003138f, 0.989746f, 0.003263f, 0.988281f,
+ 0.003778f, 0.986328f, 0.003914f, 0.985352f, 0.003979f, 0.983398f, 0.004017f, 0.981934f,
+ 0.004196f, 0.979980f, 0.004566f, 0.977051f, 0.004677f, 0.975586f, 0.004684f, 0.973633f,
+ 0.004791f, 0.971191f, 0.004940f, 0.969238f, 0.005283f, 0.966309f, 0.005383f, 0.963379f,
+ 0.005474f, 0.960449f, 0.005562f, 0.958008f, 0.005547f, 0.954590f, 0.005672f, 0.951660f,
+ 0.006042f, 0.948242f, 0.006157f, 0.944336f, 0.006275f, 0.940918f, 0.006168f, 0.937012f,
+ 0.006260f, 0.932617f, 0.006359f, 0.928711f, 0.006763f, 0.923828f, 0.006607f, 0.917969f,
+ 0.006710f, 0.912598f, 0.006847f, 0.907715f, 0.006886f, 0.901855f, 0.006866f, 0.895996f,
+ 0.007076f, 0.888672f, 0.007156f, 0.881348f, 0.007236f, 0.874023f, 0.007214f, 0.865723f,
+ 0.007278f, 0.856934f, 0.007214f, 0.848145f, 0.007423f, 0.837402f, 0.007500f, 0.826660f,
+ 0.007488f, 0.814453f, 0.007477f, 0.801758f, 0.007385f, 0.788086f, 0.007580f, 0.772461f,
+ 0.007542f, 0.754883f, 0.007519f, 0.735840f, 0.007351f, 0.714844f, 0.007244f, 0.691406f,
+ 0.007301f, 0.663086f, 0.007065f, 0.631348f, 0.006859f, 0.593750f, 0.006638f, 0.548828f,
+ 0.006199f, 0.491943f, 0.005409f, 0.417969f, 0.004044f, 0.307861f, 0.000988f, 0.116150f,
+ 0.000000f, 1.000000f, 0.000416f, 0.999512f, 0.001246f, 0.998047f, 0.001812f, 0.997070f,
+ 0.002235f, 0.996094f, 0.002787f, 0.994629f, 0.002903f, 0.993652f, 0.003218f, 0.992188f,
+ 0.003752f, 0.990723f, 0.003929f, 0.989258f, 0.004066f, 0.988770f, 0.004398f, 0.986816f,
+ 0.004913f, 0.984863f, 0.005085f, 0.983398f, 0.005280f, 0.981445f, 0.005344f, 0.980469f,
+ 0.005562f, 0.977539f, 0.006077f, 0.975586f, 0.006165f, 0.973145f, 0.006344f, 0.970703f,
+ 0.006363f, 0.968750f, 0.006638f, 0.966797f, 0.007126f, 0.963379f, 0.007183f, 0.960449f,
+ 0.007305f, 0.957520f, 0.007446f, 0.954590f, 0.007561f, 0.952148f, 0.007690f, 0.948242f,
+ 0.008148f, 0.944336f, 0.008247f, 0.940430f, 0.008415f, 0.937012f, 0.008415f, 0.932617f,
+ 0.008461f, 0.928711f, 0.008682f, 0.924316f, 0.009125f, 0.918945f, 0.009361f, 0.914551f,
+ 0.009125f, 0.908203f, 0.009300f, 0.902832f, 0.009430f, 0.897461f, 0.009567f, 0.891113f,
+ 0.009903f, 0.883789f, 0.009819f, 0.875977f, 0.009933f, 0.868652f, 0.010048f, 0.860840f,
+ 0.010078f, 0.852539f, 0.010025f, 0.842773f, 0.010269f, 0.832031f, 0.010483f, 0.821289f,
+ 0.010399f, 0.809570f, 0.010475f, 0.796875f, 0.010269f, 0.783203f, 0.010544f, 0.767090f,
+ 0.010506f, 0.749512f, 0.010475f, 0.730957f, 0.010284f, 0.709961f, 0.010139f, 0.687012f,
+ 0.010170f, 0.658691f, 0.010056f, 0.627441f, 0.009567f, 0.590820f, 0.009186f, 0.546387f,
+ 0.008476f, 0.489502f, 0.007278f, 0.416260f, 0.005318f, 0.307129f, 0.001243f, 0.115601f,
+ 0.000000f, 1.000000f, 0.000625f, 0.999023f, 0.001251f, 0.998047f, 0.001865f, 0.997070f,
+ 0.002825f, 0.995605f, 0.003040f, 0.994141f, 0.003670f, 0.993164f, 0.004150f, 0.991211f,
+ 0.004387f, 0.989746f, 0.004986f, 0.988281f, 0.005157f, 0.987305f, 0.005672f, 0.984863f,
+ 0.006329f, 0.982910f, 0.006519f, 0.981445f, 0.006733f, 0.979492f, 0.007145f, 0.978027f,
+ 0.007488f, 0.975586f, 0.007965f, 0.972656f, 0.008080f, 0.970703f, 0.008194f, 0.968262f,
+ 0.008408f, 0.965820f, 0.008705f, 0.962891f, 0.009369f, 0.960449f, 0.009583f, 0.957031f,
+ 0.009590f, 0.954102f, 0.009750f, 0.951172f, 0.009995f, 0.948242f, 0.010399f, 0.944336f,
+ 0.010735f, 0.939941f, 0.011032f, 0.936523f, 0.011139f, 0.932617f, 0.011307f, 0.928711f,
+ 0.011345f, 0.924316f, 0.011658f, 0.919434f, 0.012161f, 0.914062f, 0.012413f, 0.908691f,
+ 0.012482f, 0.903809f, 0.012383f, 0.897461f, 0.012657f, 0.892090f, 0.012939f, 0.885254f,
+ 0.013252f, 0.877930f, 0.013252f, 0.870605f, 0.013458f, 0.863281f, 0.013542f, 0.854980f,
+ 0.013565f, 0.846680f, 0.013870f, 0.837402f, 0.014122f, 0.826660f, 0.014137f, 0.814941f,
+ 0.014069f, 0.803711f, 0.014244f, 0.791504f, 0.014053f, 0.777832f, 0.014359f, 0.761230f,
+ 0.014397f, 0.744629f, 0.014259f, 0.726074f, 0.013985f, 0.705078f, 0.013992f, 0.682129f,
+ 0.013863f, 0.654297f, 0.013588f, 0.623535f, 0.012993f, 0.587402f, 0.012375f, 0.543457f,
+ 0.011284f, 0.487305f, 0.009521f, 0.415283f, 0.006786f, 0.306152f, 0.001522f, 0.115051f,
+ 0.000000f, 1.000000f, 0.000866f, 0.999023f, 0.001698f, 0.998047f, 0.001885f, 0.997070f,
+ 0.003201f, 0.995117f, 0.003843f, 0.993652f, 0.004532f, 0.992188f, 0.005310f, 0.990234f,
+ 0.005554f, 0.988281f, 0.006248f, 0.987305f, 0.006554f, 0.985352f, 0.007202f, 0.982910f,
+ 0.007526f, 0.980957f, 0.008217f, 0.979004f, 0.008461f, 0.977539f, 0.009148f, 0.975098f,
+ 0.009514f, 0.972656f, 0.010246f, 0.970215f, 0.010414f, 0.967773f, 0.010567f, 0.965332f,
+ 0.010765f, 0.962402f, 0.011398f, 0.958984f, 0.012177f, 0.956543f, 0.012344f, 0.953613f,
+ 0.012703f, 0.950684f, 0.012642f, 0.947266f, 0.013260f, 0.943359f, 0.013603f, 0.939453f,
+ 0.014374f, 0.936035f, 0.014343f, 0.931641f, 0.014671f, 0.927734f, 0.014786f, 0.923828f,
+ 0.015388f, 0.919434f, 0.015480f, 0.913574f, 0.016022f, 0.908691f, 0.016312f, 0.903320f,
+ 0.016617f, 0.897949f, 0.016464f, 0.892578f, 0.016663f, 0.886230f, 0.017334f, 0.879395f,
+ 0.017639f, 0.872070f, 0.017914f, 0.864746f, 0.017868f, 0.856934f, 0.018188f, 0.849121f,
+ 0.018311f, 0.840332f, 0.018845f, 0.830566f, 0.018753f, 0.819824f, 0.018906f, 0.809082f,
+ 0.019180f, 0.797852f, 0.019028f, 0.785156f, 0.018890f, 0.770996f, 0.019348f, 0.754883f,
+ 0.019165f, 0.738281f, 0.019211f, 0.720703f, 0.018875f, 0.700684f, 0.018753f, 0.676758f,
+ 0.018509f, 0.649414f, 0.017914f, 0.618652f, 0.017090f, 0.583984f, 0.016174f, 0.540039f,
+ 0.014565f, 0.484863f, 0.012260f, 0.414062f, 0.008507f, 0.305664f, 0.001861f, 0.115173f,
+ 0.000000f, 1.000000f, 0.000689f, 0.999023f, 0.001837f, 0.997559f, 0.002485f, 0.996582f,
+ 0.004116f, 0.994141f, 0.004837f, 0.992676f, 0.005306f, 0.991211f, 0.006657f, 0.988770f,
+ 0.006920f, 0.986816f, 0.007256f, 0.985840f, 0.008247f, 0.983398f, 0.009026f, 0.980469f,
+ 0.009415f, 0.978516f, 0.010208f, 0.976562f, 0.010506f, 0.975098f, 0.011497f, 0.971680f,
+ 0.011940f, 0.969238f, 0.012360f, 0.967285f, 0.013184f, 0.964844f, 0.013390f, 0.961914f,
+ 0.014107f, 0.958496f, 0.014626f, 0.955566f, 0.014908f, 0.952148f, 0.015747f, 0.948730f,
+ 0.016006f, 0.945801f, 0.016449f, 0.942871f, 0.017059f, 0.938965f, 0.017471f, 0.934570f,
+ 0.018219f, 0.930664f, 0.018753f, 0.926758f, 0.018753f, 0.922363f, 0.019150f, 0.918457f,
+ 0.019821f, 0.913086f, 0.020370f, 0.908203f, 0.020813f, 0.902344f, 0.021149f, 0.896973f,
+ 0.021500f, 0.892090f, 0.021881f, 0.886719f, 0.021973f, 0.879395f, 0.022507f, 0.872559f,
+ 0.023361f, 0.865723f, 0.023468f, 0.857910f, 0.023575f, 0.850586f, 0.023666f, 0.842285f,
+ 0.024216f, 0.833496f, 0.024689f, 0.823242f, 0.024750f, 0.812500f, 0.025024f, 0.802246f,
+ 0.025116f, 0.790527f, 0.024918f, 0.778320f, 0.025497f, 0.764648f, 0.025543f, 0.749023f,
+ 0.025467f, 0.731934f, 0.025192f, 0.714355f, 0.024734f, 0.694824f, 0.024826f, 0.670898f,
+ 0.024200f, 0.644043f, 0.023590f, 0.614746f, 0.022217f, 0.580078f, 0.020889f, 0.536133f,
+ 0.018845f, 0.482910f, 0.015434f, 0.412354f, 0.010551f, 0.304932f, 0.002214f, 0.114929f,
+ 0.000000f, 1.000000f, 0.000901f, 0.999023f, 0.002457f, 0.997070f, 0.003334f, 0.995605f,
+ 0.004200f, 0.993652f, 0.005501f, 0.991699f, 0.006760f, 0.989746f, 0.007309f, 0.987793f,
+ 0.008553f, 0.985352f, 0.008965f, 0.983887f, 0.009796f, 0.981445f, 0.011185f, 0.978516f,
+ 0.011658f, 0.976074f, 0.012054f, 0.974121f, 0.013275f, 0.971191f, 0.014259f, 0.968262f,
+ 0.014786f, 0.965820f, 0.015343f, 0.963379f, 0.016205f, 0.960449f, 0.016830f, 0.958008f,
+ 0.018005f, 0.954590f, 0.018219f, 0.950684f, 0.018814f, 0.947754f, 0.019562f, 0.943848f,
+ 0.020126f, 0.941406f, 0.020767f, 0.937012f, 0.021805f, 0.933105f, 0.022095f, 0.929199f,
+ 0.022949f, 0.924316f, 0.023438f, 0.920410f, 0.024078f, 0.916992f, 0.024429f, 0.911621f,
+ 0.025360f, 0.906250f, 0.025787f, 0.901367f, 0.026672f, 0.895996f, 0.026978f, 0.890137f,
+ 0.027405f, 0.885254f, 0.027908f, 0.879395f, 0.028702f, 0.872070f, 0.028824f, 0.864746f,
+ 0.029800f, 0.857910f, 0.030472f, 0.851074f, 0.030029f, 0.842773f, 0.030579f, 0.835449f,
+ 0.031372f, 0.825195f, 0.031952f, 0.815430f, 0.032257f, 0.805176f, 0.032318f, 0.794434f,
+ 0.032440f, 0.783691f, 0.032684f, 0.771484f, 0.033081f, 0.756836f, 0.032959f, 0.741211f,
+ 0.033051f, 0.725586f, 0.032562f, 0.707520f, 0.032104f, 0.688965f, 0.031982f, 0.665039f,
+ 0.031219f, 0.638672f, 0.030167f, 0.609863f, 0.028336f, 0.576172f, 0.026566f, 0.532715f,
+ 0.023865f, 0.479980f, 0.019318f, 0.411133f, 0.012985f, 0.303955f, 0.002634f, 0.114685f,
+ 0.000000f, 1.000000f, 0.001308f, 0.999023f, 0.002726f, 0.997070f, 0.003922f, 0.995117f,
+ 0.005405f, 0.992676f, 0.006302f, 0.991211f, 0.007633f, 0.988770f, 0.009079f, 0.986328f,
+ 0.009987f, 0.983887f, 0.010948f, 0.981934f, 0.012169f, 0.978516f, 0.013710f, 0.975586f,
+ 0.014236f, 0.973145f, 0.014786f, 0.971191f, 0.015945f, 0.968262f, 0.017136f, 0.964844f,
+ 0.018158f, 0.961914f, 0.018784f, 0.958984f, 0.019379f, 0.956543f, 0.021011f, 0.953125f,
+ 0.022156f, 0.949219f, 0.022919f, 0.945801f, 0.023376f, 0.942383f, 0.024261f, 0.938965f,
+ 0.024841f, 0.935547f, 0.026016f, 0.931152f, 0.026947f, 0.926758f, 0.027771f, 0.922852f,
+ 0.028519f, 0.918457f, 0.029099f, 0.914062f, 0.029800f, 0.909668f, 0.030807f, 0.904297f,
+ 0.031677f, 0.898926f, 0.032440f, 0.894043f, 0.033325f, 0.888184f, 0.033783f, 0.883301f,
+ 0.034363f, 0.877441f, 0.035187f, 0.870605f, 0.036224f, 0.863770f, 0.036743f, 0.856934f,
+ 0.037384f, 0.849609f, 0.037994f, 0.842773f, 0.038391f, 0.835449f, 0.038879f, 0.826172f,
+ 0.039673f, 0.816406f, 0.040466f, 0.807129f, 0.040619f, 0.796875f, 0.040741f, 0.786133f,
+ 0.040985f, 0.775879f, 0.041412f, 0.762695f, 0.041656f, 0.748535f, 0.041656f, 0.733398f,
+ 0.041534f, 0.718262f, 0.041260f, 0.701172f, 0.040710f, 0.681641f, 0.040253f, 0.658203f,
+ 0.039368f, 0.632812f, 0.037720f, 0.604492f, 0.035461f, 0.571777f, 0.033234f, 0.528320f,
+ 0.029312f, 0.476807f, 0.023666f, 0.409912f, 0.015686f, 0.302734f, 0.003113f, 0.114014f,
+ 0.000000f, 1.000000f, 0.001520f, 0.998535f, 0.003132f, 0.996582f, 0.004364f, 0.994629f,
+ 0.006840f, 0.992188f, 0.007355f, 0.990234f, 0.009117f, 0.987305f, 0.010681f, 0.984375f,
+ 0.011765f, 0.981934f, 0.013313f, 0.979004f, 0.015030f, 0.975586f, 0.015717f, 0.973145f,
+ 0.017303f, 0.970215f, 0.018082f, 0.967285f, 0.019623f, 0.963867f, 0.020920f, 0.960449f,
+ 0.022079f, 0.957031f, 0.022842f, 0.954590f, 0.023926f, 0.951172f, 0.025742f, 0.947266f,
+ 0.026627f, 0.943848f, 0.027893f, 0.940430f, 0.028748f, 0.937012f, 0.029297f, 0.933594f,
+ 0.030792f, 0.928711f, 0.031860f, 0.923828f, 0.033203f, 0.919922f, 0.033936f, 0.915527f,
+ 0.034882f, 0.911621f, 0.035706f, 0.907227f, 0.037140f, 0.901367f, 0.038086f, 0.895996f,
+ 0.039246f, 0.890625f, 0.039917f, 0.885742f, 0.041199f, 0.880371f, 0.041809f, 0.875000f,
+ 0.042755f, 0.868652f, 0.043671f, 0.861328f, 0.044861f, 0.854980f, 0.045258f, 0.848145f,
+ 0.046417f, 0.840820f, 0.046875f, 0.833984f, 0.047974f, 0.826172f, 0.048035f, 0.816406f,
+ 0.049469f, 0.807617f, 0.050140f, 0.797852f, 0.050690f, 0.788086f, 0.050751f, 0.777832f,
+ 0.050964f, 0.767090f, 0.051758f, 0.753418f, 0.052185f, 0.740234f, 0.052185f, 0.725586f,
+ 0.051666f, 0.710449f, 0.050812f, 0.693848f, 0.050995f, 0.673828f, 0.050201f, 0.651367f,
+ 0.048279f, 0.626465f, 0.046448f, 0.599609f, 0.043793f, 0.566895f, 0.040619f, 0.524414f,
+ 0.035828f, 0.473877f, 0.028412f, 0.407959f, 0.018784f, 0.301758f, 0.003656f, 0.113647f,
+ 0.000000f, 1.000000f, 0.001997f, 0.998047f, 0.004101f, 0.996094f, 0.005878f, 0.993652f,
+ 0.007580f, 0.991211f, 0.009117f, 0.988770f, 0.010918f, 0.985352f, 0.012657f, 0.982422f,
+ 0.013374f, 0.979980f, 0.016479f, 0.976074f, 0.017838f, 0.972656f, 0.019165f, 0.969727f,
+ 0.020401f, 0.966797f, 0.022507f, 0.962891f, 0.023956f, 0.958984f, 0.024918f, 0.955566f,
+ 0.026688f, 0.952148f, 0.027557f, 0.949219f, 0.029297f, 0.944824f, 0.030762f, 0.941406f,
+ 0.032288f, 0.937500f, 0.033661f, 0.933594f, 0.034668f, 0.930176f, 0.036285f, 0.925781f,
+ 0.038025f, 0.920898f, 0.038971f, 0.916504f, 0.040222f, 0.912109f, 0.041351f, 0.907715f,
+ 0.042145f, 0.903809f, 0.044281f, 0.898438f, 0.045654f, 0.892578f, 0.046814f, 0.887207f,
+ 0.047852f, 0.881836f, 0.048828f, 0.876953f, 0.050201f, 0.871582f, 0.051270f, 0.865234f,
+ 0.052460f, 0.858398f, 0.054016f, 0.852051f, 0.054779f, 0.845215f, 0.055725f, 0.838379f,
+ 0.056549f, 0.831543f, 0.057220f, 0.824219f, 0.058624f, 0.815430f, 0.060364f, 0.807129f,
+ 0.060150f, 0.796875f, 0.061310f, 0.788574f, 0.061615f, 0.778809f, 0.061951f, 0.769043f,
+ 0.062347f, 0.756836f, 0.063110f, 0.744141f, 0.063477f, 0.730957f, 0.063110f, 0.716797f,
+ 0.062622f, 0.701660f, 0.062012f, 0.686035f, 0.061523f, 0.665527f, 0.060364f, 0.643555f,
+ 0.058685f, 0.620605f, 0.055817f, 0.594238f, 0.052704f, 0.561035f, 0.048828f, 0.520020f,
+ 0.042694f, 0.470703f, 0.034027f, 0.406982f, 0.022079f, 0.300537f, 0.004261f, 0.112915f,
+ 0.000000f, 1.000000f, 0.002422f, 0.997559f, 0.004318f, 0.996094f, 0.007160f, 0.992676f,
+ 0.009003f, 0.990234f, 0.011192f, 0.987305f, 0.013687f, 0.983398f, 0.014633f, 0.980469f,
+ 0.016739f, 0.977051f, 0.018387f, 0.973145f, 0.020813f, 0.969238f, 0.022720f, 0.966309f,
+ 0.024506f, 0.962402f, 0.026947f, 0.957520f, 0.028625f, 0.954102f, 0.030121f, 0.950684f,
+ 0.031158f, 0.947266f, 0.033844f, 0.942383f, 0.035553f, 0.937988f, 0.037201f, 0.934082f,
+ 0.038849f, 0.930176f, 0.040405f, 0.926270f, 0.041931f, 0.922363f, 0.043945f, 0.917480f,
+ 0.045715f, 0.913086f, 0.047516f, 0.908203f, 0.048615f, 0.903320f, 0.049561f, 0.898926f,
+ 0.051392f, 0.894043f, 0.053375f, 0.888184f, 0.055237f, 0.882812f, 0.056763f, 0.877441f,
+ 0.057678f, 0.872070f, 0.058807f, 0.867188f, 0.060486f, 0.861816f, 0.062134f, 0.854980f,
+ 0.063843f, 0.847656f, 0.064941f, 0.840820f, 0.066040f, 0.834473f, 0.067078f, 0.828125f,
+ 0.068176f, 0.821777f, 0.069458f, 0.812988f, 0.070801f, 0.804199f, 0.072205f, 0.795898f,
+ 0.072144f, 0.787109f, 0.073547f, 0.777832f, 0.073853f, 0.768555f, 0.074646f, 0.758789f,
+ 0.075439f, 0.746094f, 0.075928f, 0.734375f, 0.076172f, 0.721680f, 0.075806f, 0.708496f,
+ 0.074463f, 0.693848f, 0.074341f, 0.676758f, 0.073669f, 0.657227f, 0.071838f, 0.636230f,
+ 0.069824f, 0.614258f, 0.066406f, 0.588379f, 0.062683f, 0.554688f, 0.057495f, 0.515137f,
+ 0.050079f, 0.467773f, 0.039795f, 0.403809f, 0.025620f, 0.299561f, 0.004860f, 0.112427f,
+ 0.000000f, 1.000000f, 0.002733f, 0.998047f, 0.005219f, 0.995605f, 0.008324f, 0.991699f,
+ 0.010338f, 0.988770f, 0.013313f, 0.984863f, 0.015511f, 0.981445f, 0.018005f, 0.977539f,
+ 0.020462f, 0.973145f, 0.022751f, 0.969238f, 0.024414f, 0.965820f, 0.026947f, 0.961914f,
+ 0.029602f, 0.957031f, 0.032257f, 0.952637f, 0.034058f, 0.948242f, 0.036194f, 0.944336f,
+ 0.038116f, 0.939941f, 0.040558f, 0.935059f, 0.042877f, 0.930664f, 0.044708f, 0.926270f,
+ 0.046051f, 0.922852f, 0.048584f, 0.917969f, 0.050842f, 0.912598f, 0.052826f, 0.907715f,
+ 0.054749f, 0.903320f, 0.056702f, 0.898926f, 0.058563f, 0.894531f, 0.059937f, 0.888672f,
+ 0.062317f, 0.883301f, 0.063721f, 0.877930f, 0.065857f, 0.872070f, 0.067810f, 0.867188f,
+ 0.069092f, 0.862305f, 0.070251f, 0.856445f, 0.072754f, 0.849121f, 0.074585f, 0.842773f,
+ 0.076111f, 0.836426f, 0.077576f, 0.830078f, 0.078674f, 0.823242f, 0.079773f, 0.817383f,
+ 0.081726f, 0.809082f, 0.083374f, 0.801270f, 0.084534f, 0.792480f, 0.085632f, 0.784180f,
+ 0.086670f, 0.776367f, 0.086609f, 0.767090f, 0.088013f, 0.758301f, 0.088806f, 0.746582f,
+ 0.089233f, 0.735352f, 0.089539f, 0.723633f, 0.089966f, 0.711426f, 0.089172f, 0.698730f,
+ 0.088257f, 0.684570f, 0.088196f, 0.666992f, 0.086670f, 0.648438f, 0.084778f, 0.628906f,
+ 0.081238f, 0.606934f, 0.077209f, 0.582520f, 0.073242f, 0.548828f, 0.067078f, 0.510742f,
+ 0.058258f, 0.464844f, 0.046326f, 0.399902f, 0.029572f, 0.299561f, 0.005589f, 0.111450f,
+ 0.000000f, 1.000000f, 0.003691f, 0.997070f, 0.006359f, 0.994629f, 0.009880f, 0.990723f,
+ 0.012497f, 0.987305f, 0.016006f, 0.982422f, 0.018814f, 0.978027f, 0.021103f, 0.975098f,
+ 0.024994f, 0.969238f, 0.027466f, 0.965332f, 0.029770f, 0.960938f, 0.032043f, 0.956543f,
+ 0.035645f, 0.951172f, 0.038147f, 0.946289f, 0.040985f, 0.941895f, 0.043304f, 0.937500f,
+ 0.046326f, 0.931641f, 0.048462f, 0.927246f, 0.050964f, 0.922363f, 0.053406f, 0.917969f,
+ 0.055298f, 0.913086f, 0.057861f, 0.907715f, 0.060944f, 0.902344f, 0.063049f, 0.897461f,
+ 0.065125f, 0.893066f, 0.066772f, 0.888672f, 0.069946f, 0.882812f, 0.072571f, 0.876953f,
+ 0.074524f, 0.871582f, 0.076355f, 0.866211f, 0.078247f, 0.860840f, 0.080017f, 0.855469f,
+ 0.082214f, 0.849609f, 0.084534f, 0.843262f, 0.086243f, 0.836426f, 0.088623f, 0.830078f,
+ 0.089783f, 0.823730f, 0.091675f, 0.817871f, 0.092468f, 0.812012f, 0.094727f, 0.804199f,
+ 0.096558f, 0.795410f, 0.098328f, 0.787598f, 0.099365f, 0.780273f, 0.100342f, 0.771973f,
+ 0.101074f, 0.764648f, 0.101746f, 0.755859f, 0.103333f, 0.745117f, 0.104065f, 0.734375f,
+ 0.104736f, 0.723633f, 0.104736f, 0.712891f, 0.104431f, 0.701172f, 0.103455f, 0.689453f,
+ 0.102905f, 0.673828f, 0.102051f, 0.656738f, 0.100220f, 0.639160f, 0.097534f, 0.620605f,
+ 0.093872f, 0.600098f, 0.089661f, 0.574707f, 0.084412f, 0.542480f, 0.076843f, 0.505859f,
+ 0.066467f, 0.461426f, 0.053345f, 0.397217f, 0.033508f, 0.298096f, 0.006302f, 0.110352f,
+ 0.000000f, 1.000000f, 0.004448f, 0.996582f, 0.007580f, 0.993652f, 0.011833f, 0.989258f,
+ 0.015114f, 0.985352f, 0.019333f, 0.979492f, 0.022400f, 0.975586f, 0.026123f, 0.970215f,
+ 0.029907f, 0.964844f, 0.032623f, 0.960449f, 0.035736f, 0.955078f, 0.039642f, 0.949219f,
+ 0.042419f, 0.944824f, 0.045105f, 0.939941f, 0.048584f, 0.935059f, 0.052551f, 0.928711f,
+ 0.055420f, 0.922852f, 0.058197f, 0.917969f, 0.060883f, 0.913086f, 0.063110f, 0.908203f,
+ 0.066895f, 0.901855f, 0.069702f, 0.896484f, 0.072144f, 0.891113f, 0.074890f, 0.886230f,
+ 0.077087f, 0.881836f, 0.080078f, 0.875977f, 0.083496f, 0.869629f, 0.085938f, 0.863770f,
+ 0.088318f, 0.858887f, 0.090271f, 0.854004f, 0.092224f, 0.848633f, 0.094849f, 0.841797f,
+ 0.097290f, 0.834961f, 0.099731f, 0.829102f, 0.101746f, 0.822754f, 0.103821f, 0.816895f,
+ 0.105042f, 0.811035f, 0.106873f, 0.805176f, 0.109436f, 0.797363f, 0.110840f, 0.789062f,
+ 0.113586f, 0.782227f, 0.114624f, 0.774414f, 0.115479f, 0.767090f, 0.116394f, 0.759766f,
+ 0.117371f, 0.751953f, 0.119263f, 0.741699f, 0.119995f, 0.731445f, 0.121216f, 0.722168f,
+ 0.121033f, 0.711914f, 0.120300f, 0.701660f, 0.120117f, 0.690918f, 0.119629f, 0.677246f,
+ 0.118835f, 0.662109f, 0.117188f, 0.646973f, 0.114441f, 0.630371f, 0.111694f, 0.612793f,
+ 0.107605f, 0.593750f, 0.102661f, 0.566406f, 0.096191f, 0.536133f, 0.087524f, 0.500977f,
+ 0.075256f, 0.458740f, 0.060059f, 0.393066f, 0.038086f, 0.298340f, 0.007027f, 0.109375f,
+ 0.000000f, 1.000000f, 0.005013f, 0.996582f, 0.009384f, 0.992676f, 0.013985f, 0.987793f,
+ 0.018478f, 0.982422f, 0.023056f, 0.976562f, 0.026917f, 0.972168f, 0.032440f, 0.964844f,
+ 0.035583f, 0.959473f, 0.038879f, 0.955078f, 0.043518f, 0.948242f, 0.048096f, 0.941895f,
+ 0.051117f, 0.937012f, 0.054321f, 0.931641f, 0.058868f, 0.924316f, 0.062134f, 0.918945f,
+ 0.066101f, 0.913086f, 0.069092f, 0.907715f, 0.073059f, 0.901855f, 0.076721f, 0.895020f,
+ 0.079895f, 0.889160f, 0.083008f, 0.883789f, 0.085876f, 0.878906f, 0.088623f, 0.873535f,
+ 0.092407f, 0.866699f, 0.095459f, 0.861328f, 0.098083f, 0.855469f, 0.101135f, 0.850098f,
+ 0.103516f, 0.845215f, 0.106018f, 0.839844f, 0.108887f, 0.833008f, 0.112366f, 0.826172f,
+ 0.114563f, 0.819824f, 0.116638f, 0.813965f, 0.118652f, 0.808594f, 0.120972f, 0.802734f,
+ 0.122803f, 0.796387f, 0.125366f, 0.788086f, 0.127686f, 0.781250f, 0.129395f, 0.774414f,
+ 0.130737f, 0.767578f, 0.132568f, 0.760742f, 0.133667f, 0.753906f, 0.134888f, 0.746094f,
+ 0.135986f, 0.736328f, 0.137695f, 0.727539f, 0.137817f, 0.718262f, 0.138184f, 0.708984f,
+ 0.138184f, 0.700195f, 0.137451f, 0.690430f, 0.137451f, 0.678223f, 0.137085f, 0.665039f,
+ 0.135376f, 0.650879f, 0.133179f, 0.636719f, 0.130615f, 0.622559f, 0.126343f, 0.605469f,
+ 0.121338f, 0.583496f, 0.116455f, 0.558594f, 0.108276f, 0.529785f, 0.097961f, 0.496826f,
+ 0.084595f, 0.455811f, 0.067871f, 0.390381f, 0.042236f, 0.295898f, 0.007912f, 0.108582f,
+ 0.000000f, 1.000000f, 0.006454f, 0.995605f, 0.011932f, 0.990723f, 0.017227f, 0.985840f,
+ 0.023407f, 0.979004f, 0.028214f, 0.973145f, 0.033173f, 0.966309f, 0.038757f, 0.959473f,
+ 0.042969f, 0.953613f, 0.048706f, 0.946289f, 0.053802f, 0.939453f, 0.056763f, 0.934082f,
+ 0.062012f, 0.927246f, 0.067139f, 0.919922f, 0.070740f, 0.913574f, 0.074524f, 0.907715f,
+ 0.077759f, 0.902832f, 0.083557f, 0.894531f, 0.087952f, 0.887695f, 0.091370f, 0.881836f,
+ 0.095032f, 0.875977f, 0.097656f, 0.871094f, 0.101685f, 0.864258f, 0.105957f, 0.856934f,
+ 0.109802f, 0.851074f, 0.112488f, 0.845703f, 0.115112f, 0.840332f, 0.118469f, 0.835449f,
+ 0.121765f, 0.828613f, 0.125366f, 0.821777f, 0.128052f, 0.815918f, 0.130737f, 0.810059f,
+ 0.133179f, 0.804199f, 0.135132f, 0.798340f, 0.136841f, 0.793457f, 0.140869f, 0.785645f,
+ 0.143311f, 0.778809f, 0.145508f, 0.771484f, 0.147095f, 0.765137f, 0.148804f, 0.758789f,
+ 0.149902f, 0.752441f, 0.151123f, 0.746094f, 0.153320f, 0.737793f, 0.154419f, 0.729004f,
+ 0.155762f, 0.720703f, 0.156982f, 0.712402f, 0.156982f, 0.704590f, 0.156616f, 0.696289f,
+ 0.156616f, 0.687988f, 0.155518f, 0.676270f, 0.155762f, 0.664062f, 0.154785f, 0.651855f,
+ 0.152832f, 0.639648f, 0.150024f, 0.626465f, 0.145752f, 0.612305f, 0.141602f, 0.596680f,
+ 0.137085f, 0.573730f, 0.129883f, 0.549805f, 0.121460f, 0.523926f, 0.109680f, 0.492676f,
+ 0.094177f, 0.450928f, 0.075134f, 0.387207f, 0.047089f, 0.296143f, 0.008751f, 0.107971f,
+ 0.000000f, 1.000000f, 0.007488f, 0.995605f, 0.015404f, 0.988770f, 0.021408f, 0.982422f,
+ 0.028671f, 0.975098f, 0.035034f, 0.967773f, 0.041779f, 0.959961f, 0.046570f, 0.953125f,
+ 0.053497f, 0.944824f, 0.059540f, 0.937012f, 0.064270f, 0.930176f, 0.070251f, 0.922852f,
+ 0.075256f, 0.915039f, 0.080994f, 0.907715f, 0.085083f, 0.901367f, 0.089844f, 0.894531f,
+ 0.095093f, 0.886230f, 0.099243f, 0.879883f, 0.104248f, 0.873047f, 0.108032f, 0.867188f,
+ 0.112305f, 0.860840f, 0.117432f, 0.852539f, 0.120911f, 0.846191f, 0.124756f, 0.840332f,
+ 0.127930f, 0.834473f, 0.131470f, 0.829102f, 0.135254f, 0.822754f, 0.139526f, 0.815430f,
+ 0.143188f, 0.809082f, 0.146240f, 0.803711f, 0.148682f, 0.798340f, 0.151123f, 0.793457f,
+ 0.153564f, 0.787598f, 0.156982f, 0.780273f, 0.159912f, 0.772949f, 0.162231f, 0.767090f,
+ 0.164673f, 0.760742f, 0.166748f, 0.754883f, 0.167725f, 0.749023f, 0.169067f, 0.743164f,
+ 0.172241f, 0.735840f, 0.173218f, 0.727539f, 0.175537f, 0.720215f, 0.175903f, 0.712891f,
+ 0.176392f, 0.705078f, 0.176880f, 0.698242f, 0.177002f, 0.690918f, 0.175781f, 0.682617f,
+ 0.176636f, 0.671387f, 0.176147f, 0.662109f, 0.175415f, 0.650391f, 0.173584f, 0.640137f,
+ 0.170166f, 0.628906f, 0.166260f, 0.616699f, 0.162354f, 0.603027f, 0.158569f, 0.583984f,
+ 0.151978f, 0.564453f, 0.144531f, 0.542969f, 0.133789f, 0.517578f, 0.121094f, 0.488525f,
+ 0.104858f, 0.445068f, 0.083130f, 0.384033f, 0.051697f, 0.294922f, 0.009659f, 0.107117f,
+ 0.000000f, 1.000000f, 0.009659f, 0.994629f, 0.018875f, 0.986816f, 0.027817f, 0.978516f,
+ 0.034943f, 0.971191f, 0.044312f, 0.960449f, 0.050873f, 0.952637f, 0.059174f, 0.943359f,
+ 0.065857f, 0.934570f, 0.072449f, 0.927246f, 0.079468f, 0.917480f, 0.085876f, 0.909180f,
+ 0.091919f, 0.901367f, 0.096252f, 0.895020f, 0.103882f, 0.885254f, 0.109009f, 0.877441f,
+ 0.114685f, 0.870117f, 0.118774f, 0.863770f, 0.123291f, 0.856445f, 0.129883f, 0.848145f,
+ 0.134521f, 0.840820f, 0.139282f, 0.833984f, 0.142700f, 0.828125f, 0.145752f, 0.822754f,
+ 0.151245f, 0.814453f, 0.155151f, 0.808105f, 0.159180f, 0.801270f, 0.162354f, 0.795898f,
+ 0.165527f, 0.790039f, 0.168457f, 0.785156f, 0.171387f, 0.778809f, 0.175293f, 0.771973f,
+ 0.179443f, 0.765625f, 0.181396f, 0.759277f, 0.183594f, 0.753906f, 0.185181f, 0.748047f,
+ 0.187134f, 0.742676f, 0.188721f, 0.737793f, 0.191772f, 0.729980f, 0.192993f, 0.722656f,
+ 0.195068f, 0.715820f, 0.196655f, 0.709473f, 0.197388f, 0.702637f, 0.197876f, 0.696777f,
+ 0.197876f, 0.690430f, 0.197754f, 0.684082f, 0.198486f, 0.673828f, 0.198608f, 0.665039f,
+ 0.197998f, 0.655762f, 0.197266f, 0.647461f, 0.194458f, 0.637207f, 0.191772f, 0.627930f,
+ 0.188477f, 0.618164f, 0.184692f, 0.605469f, 0.180420f, 0.589844f, 0.174927f, 0.572754f,
+ 0.168091f, 0.555176f, 0.158691f, 0.535156f, 0.147095f, 0.512695f, 0.132202f, 0.483887f,
+ 0.115540f, 0.439209f, 0.091309f, 0.381348f, 0.056702f, 0.294922f, 0.010612f, 0.106750f,
+ 0.000000f, 1.000000f, 0.011765f, 0.993652f, 0.023361f, 0.984863f, 0.035400f, 0.973633f,
+ 0.046143f, 0.962402f, 0.055176f, 0.953125f, 0.065430f, 0.941895f, 0.073853f, 0.932129f,
+ 0.080811f, 0.923828f, 0.090820f, 0.911621f, 0.098145f, 0.902832f, 0.104797f, 0.894531f,
+ 0.112366f, 0.884766f, 0.119812f, 0.875000f, 0.125488f, 0.867188f, 0.130737f, 0.859863f,
+ 0.137207f, 0.851074f, 0.143677f, 0.842285f, 0.148926f, 0.834473f, 0.153320f, 0.828125f,
+ 0.158081f, 0.821289f, 0.162964f, 0.813965f, 0.168945f, 0.805176f, 0.173706f, 0.798340f,
+ 0.177246f, 0.791992f, 0.181152f, 0.786133f, 0.183960f, 0.780762f, 0.187622f, 0.774902f,
+ 0.192017f, 0.767578f, 0.196411f, 0.761230f, 0.198853f, 0.754883f, 0.201660f, 0.749512f,
+ 0.204468f, 0.744629f, 0.206665f, 0.739258f, 0.208130f, 0.734863f, 0.210449f, 0.727539f,
+ 0.213745f, 0.720703f, 0.215820f, 0.714355f, 0.217651f, 0.708496f, 0.218262f, 0.703125f,
+ 0.219116f, 0.697266f, 0.220337f, 0.691895f, 0.219604f, 0.686523f, 0.220825f, 0.679199f,
+ 0.221802f, 0.671875f, 0.222412f, 0.663574f, 0.222168f, 0.656250f, 0.220947f, 0.648438f,
+ 0.219482f, 0.641113f, 0.217163f, 0.633301f, 0.213623f, 0.625000f, 0.210449f, 0.616699f,
+ 0.208130f, 0.604004f, 0.204102f, 0.590820f, 0.199097f, 0.577148f, 0.192993f, 0.562988f,
+ 0.184082f, 0.546875f, 0.173218f, 0.529297f, 0.160400f, 0.508301f, 0.145996f, 0.474609f,
+ 0.126465f, 0.432861f, 0.099487f, 0.378174f, 0.061523f, 0.294922f, 0.011581f, 0.106689f,
+ 0.000000f, 1.000000f, 0.017303f, 0.990723f, 0.031982f, 0.979492f, 0.046143f, 0.966797f,
+ 0.059052f, 0.954590f, 0.071777f, 0.940918f, 0.082031f, 0.929688f, 0.093140f, 0.917480f,
+ 0.103699f, 0.905762f, 0.111877f, 0.895996f, 0.121826f, 0.883789f, 0.130615f, 0.873047f,
+ 0.138306f, 0.864258f, 0.144775f, 0.855469f, 0.153809f, 0.844238f, 0.159302f, 0.835938f,
+ 0.165405f, 0.827637f, 0.170532f, 0.820801f, 0.177490f, 0.811523f, 0.183350f, 0.803223f,
+ 0.188965f, 0.795410f, 0.192993f, 0.788574f, 0.196899f, 0.782227f, 0.201660f, 0.776367f,
+ 0.206543f, 0.768066f, 0.210327f, 0.761230f, 0.215332f, 0.753906f, 0.218628f, 0.748535f,
+ 0.221313f, 0.742676f, 0.223877f, 0.737793f, 0.226807f, 0.732910f, 0.229248f, 0.727051f,
+ 0.232666f, 0.720703f, 0.236084f, 0.714355f, 0.238770f, 0.708984f, 0.239990f, 0.704102f,
+ 0.240723f, 0.698730f, 0.242432f, 0.693848f, 0.243164f, 0.688965f, 0.243530f, 0.685059f,
+ 0.244507f, 0.677734f, 0.246338f, 0.670898f, 0.247803f, 0.664551f, 0.247314f, 0.657715f,
+ 0.247192f, 0.652832f, 0.246338f, 0.645996f, 0.244751f, 0.640137f, 0.243042f, 0.633789f,
+ 0.240479f, 0.627930f, 0.238159f, 0.619141f, 0.236694f, 0.609375f, 0.233643f, 0.599121f,
+ 0.229492f, 0.589355f, 0.223389f, 0.578125f, 0.217163f, 0.566895f, 0.209351f, 0.554199f,
+ 0.199463f, 0.540527f, 0.187622f, 0.523438f, 0.174927f, 0.496582f, 0.158691f, 0.465576f,
+ 0.137207f, 0.427979f, 0.108276f, 0.376709f, 0.066467f, 0.295654f, 0.012627f, 0.106445f,
+ 0.000000f, 1.000000f, 0.022964f, 0.988281f, 0.042114f, 0.974121f, 0.061371f, 0.957520f,
+ 0.078979f, 0.940918f, 0.093079f, 0.926758f, 0.106934f, 0.911621f, 0.118469f, 0.899414f,
+ 0.131714f, 0.884766f, 0.142334f, 0.872559f, 0.150879f, 0.861816f, 0.161987f, 0.849121f,
+ 0.170288f, 0.838379f, 0.177368f, 0.829590f, 0.184692f, 0.819336f, 0.193359f, 0.808594f,
+ 0.199829f, 0.799805f, 0.205688f, 0.791504f, 0.210205f, 0.784668f, 0.216675f, 0.776367f,
+ 0.222534f, 0.767578f, 0.227417f, 0.760254f, 0.231567f, 0.753418f, 0.236206f, 0.746582f,
+ 0.240479f, 0.740234f, 0.242310f, 0.735352f, 0.247314f, 0.729004f, 0.250488f, 0.721680f,
+ 0.254395f, 0.715332f, 0.257324f, 0.709473f, 0.260010f, 0.704102f, 0.261963f, 0.699707f,
+ 0.263672f, 0.695312f, 0.264893f, 0.690918f, 0.266602f, 0.687012f, 0.268799f, 0.681641f,
+ 0.269531f, 0.675293f, 0.271973f, 0.669434f, 0.272705f, 0.664062f, 0.273682f, 0.659180f,
+ 0.274170f, 0.654785f, 0.273682f, 0.649414f, 0.272949f, 0.644531f, 0.272705f, 0.640625f,
+ 0.270264f, 0.635742f, 0.269531f, 0.629883f, 0.268555f, 0.622070f, 0.267578f, 0.615234f,
+ 0.265137f, 0.607910f, 0.261963f, 0.600586f, 0.259277f, 0.593750f, 0.253906f, 0.584961f,
+ 0.248901f, 0.576660f, 0.242310f, 0.567871f, 0.234375f, 0.557617f, 0.225952f, 0.546387f,
+ 0.216797f, 0.528320f, 0.205078f, 0.508789f, 0.190674f, 0.486816f, 0.172241f, 0.459229f,
+ 0.148315f, 0.424561f, 0.116272f, 0.375488f, 0.071289f, 0.296875f, 0.013588f, 0.106506f,
+ 0.000000f, 1.000000f, 0.032379f, 0.984375f, 0.059143f, 0.964844f, 0.083252f, 0.944824f,
+ 0.105103f, 0.924316f, 0.124756f, 0.904785f, 0.139648f, 0.889648f, 0.154907f, 0.872559f,
+ 0.167969f, 0.858398f, 0.178223f, 0.846191f, 0.191162f, 0.831055f, 0.201294f, 0.818848f,
+ 0.208862f, 0.808594f, 0.216919f, 0.798340f, 0.225098f, 0.787109f, 0.233032f, 0.776855f,
+ 0.239502f, 0.768066f, 0.244751f, 0.760254f, 0.250000f, 0.752441f, 0.254639f, 0.745117f,
+ 0.260986f, 0.736328f, 0.265381f, 0.728516f, 0.270264f, 0.721680f, 0.273438f, 0.715332f,
+ 0.277832f, 0.709473f, 0.280518f, 0.703613f, 0.282471f, 0.699219f, 0.286133f, 0.692871f,
+ 0.289307f, 0.686523f, 0.291504f, 0.681641f, 0.294678f, 0.675781f, 0.295898f, 0.671387f,
+ 0.297852f, 0.666992f, 0.299072f, 0.662598f, 0.300293f, 0.658691f, 0.301025f, 0.654785f,
+ 0.300537f, 0.651855f, 0.300537f, 0.647949f, 0.301025f, 0.643066f, 0.301758f, 0.637207f,
+ 0.301514f, 0.632324f, 0.302002f, 0.627930f, 0.301025f, 0.622070f, 0.300537f, 0.617188f,
+ 0.298340f, 0.612305f, 0.297363f, 0.607910f, 0.294434f, 0.602539f, 0.291748f, 0.597168f,
+ 0.288330f, 0.591797f, 0.283936f, 0.585938f, 0.280029f, 0.580078f, 0.273193f, 0.573242f,
+ 0.269043f, 0.563965f, 0.262695f, 0.553711f, 0.254883f, 0.541992f, 0.246216f, 0.529785f,
+ 0.234619f, 0.515625f, 0.221802f, 0.499268f, 0.205200f, 0.479980f, 0.184692f, 0.454834f,
+ 0.158569f, 0.422363f, 0.124268f, 0.375488f, 0.078003f, 0.288086f, 0.014595f, 0.107117f,
+ 0.000000f, 1.000000f, 0.049713f, 0.977051f, 0.088806f, 0.949219f, 0.119446f, 0.922852f,
+ 0.145874f, 0.898438f, 0.166016f, 0.878418f, 0.185425f, 0.857910f, 0.201050f, 0.840820f,
+ 0.215088f, 0.824707f, 0.228394f, 0.808594f, 0.239136f, 0.794922f, 0.248413f, 0.782715f,
+ 0.257568f, 0.771484f, 0.264893f, 0.760254f, 0.272705f, 0.750000f, 0.280273f, 0.739258f,
+ 0.286133f, 0.730469f, 0.291260f, 0.722168f, 0.296387f, 0.714844f, 0.301025f, 0.707031f,
+ 0.303955f, 0.701172f, 0.308594f, 0.694336f, 0.311768f, 0.687988f, 0.315186f, 0.681152f,
+ 0.317871f, 0.675781f, 0.321045f, 0.669922f, 0.324707f, 0.664062f, 0.326660f, 0.659180f,
+ 0.329102f, 0.653809f, 0.329590f, 0.649902f, 0.331055f, 0.645508f, 0.332275f, 0.641602f,
+ 0.333252f, 0.637695f, 0.333496f, 0.633789f, 0.334229f, 0.630371f, 0.334229f, 0.626953f,
+ 0.333740f, 0.624023f, 0.334229f, 0.620605f, 0.333252f, 0.616699f, 0.333008f, 0.612305f,
+ 0.332275f, 0.608398f, 0.330566f, 0.604980f, 0.329590f, 0.600098f, 0.328125f, 0.596191f,
+ 0.326172f, 0.592285f, 0.323486f, 0.587891f, 0.320312f, 0.583008f, 0.317139f, 0.578125f,
+ 0.313721f, 0.573242f, 0.309082f, 0.567871f, 0.303955f, 0.561035f, 0.298096f, 0.555176f,
+ 0.291504f, 0.547852f, 0.283447f, 0.540039f, 0.274170f, 0.530762f, 0.263672f, 0.520508f,
+ 0.250977f, 0.508301f, 0.236572f, 0.493652f, 0.218506f, 0.475586f, 0.196777f, 0.451660f,
+ 0.169800f, 0.417969f, 0.134155f, 0.368164f, 0.084351f, 0.283936f, 0.015701f, 0.108337f,
+ 0.000000f, 1.000000f, 0.062988f, 0.971191f, 0.108582f, 0.938965f, 0.144531f, 0.908691f,
+ 0.173096f, 0.882324f, 0.196289f, 0.858398f, 0.214600f, 0.837891f, 0.231689f, 0.818848f,
+ 0.246094f, 0.801758f, 0.259033f, 0.786133f, 0.269775f, 0.771973f, 0.279053f, 0.759277f,
+ 0.289062f, 0.747070f, 0.296387f, 0.736328f, 0.303467f, 0.725586f, 0.309082f, 0.716797f,
+ 0.315186f, 0.707520f, 0.320312f, 0.699219f, 0.325195f, 0.691406f, 0.329834f, 0.684082f,
+ 0.333496f, 0.677246f, 0.336914f, 0.670898f, 0.340332f, 0.664551f, 0.343994f, 0.658203f,
+ 0.345703f, 0.652832f, 0.348633f, 0.647461f, 0.351074f, 0.642578f, 0.352295f, 0.637695f,
+ 0.355225f, 0.632812f, 0.355957f, 0.628418f, 0.356445f, 0.624512f, 0.358398f, 0.620117f,
+ 0.358887f, 0.616211f, 0.359131f, 0.612793f, 0.359863f, 0.609375f, 0.360352f, 0.605469f,
+ 0.359619f, 0.602539f, 0.359619f, 0.599121f, 0.359619f, 0.595703f, 0.358154f, 0.591797f,
+ 0.356934f, 0.588379f, 0.355469f, 0.584961f, 0.355469f, 0.581055f, 0.352295f, 0.577148f,
+ 0.350342f, 0.573730f, 0.347656f, 0.569824f, 0.345459f, 0.565430f, 0.341797f, 0.560547f,
+ 0.337891f, 0.555664f, 0.333252f, 0.550781f, 0.328125f, 0.544434f, 0.322510f, 0.538574f,
+ 0.315186f, 0.531250f, 0.308350f, 0.523926f, 0.299805f, 0.514648f, 0.289551f, 0.504883f,
+ 0.277344f, 0.492676f, 0.262207f, 0.477539f, 0.245728f, 0.459717f, 0.223145f, 0.436035f,
+ 0.196167f, 0.404785f, 0.160156f, 0.358643f, 0.107544f, 0.280273f, 0.028214f, 0.113586f,
+ 0.000000f, 1.000000f, 0.062988f, 0.971191f, 0.109253f, 0.938477f, 0.145508f, 0.908203f,
+ 0.174438f, 0.881348f, 0.198975f, 0.856934f, 0.217773f, 0.835938f, 0.235596f, 0.816406f,
+ 0.250244f, 0.798828f, 0.263672f, 0.782715f, 0.275146f, 0.768066f, 0.284912f, 0.754883f,
+ 0.293945f, 0.743164f, 0.303223f, 0.730957f, 0.310791f, 0.720215f, 0.316895f, 0.710449f,
+ 0.323242f, 0.701172f, 0.328857f, 0.692383f, 0.334473f, 0.684082f, 0.338867f, 0.676758f,
+ 0.343994f, 0.668457f, 0.347656f, 0.662109f, 0.351074f, 0.655273f, 0.355225f, 0.649414f,
+ 0.357178f, 0.643066f, 0.360107f, 0.637695f, 0.363281f, 0.632324f, 0.365723f, 0.626465f,
+ 0.368652f, 0.621094f, 0.370605f, 0.616211f, 0.371582f, 0.611816f, 0.373535f, 0.607422f,
+ 0.374756f, 0.603027f, 0.375732f, 0.599121f, 0.376465f, 0.595215f, 0.376953f, 0.591309f,
+ 0.377686f, 0.587891f, 0.377930f, 0.583984f, 0.378418f, 0.580566f, 0.377930f, 0.576172f,
+ 0.377441f, 0.572266f, 0.376465f, 0.568848f, 0.376465f, 0.564453f, 0.374512f, 0.560059f,
+ 0.373535f, 0.555664f, 0.371338f, 0.551758f, 0.369385f, 0.546875f, 0.366455f, 0.541992f,
+ 0.363525f, 0.536621f, 0.359619f, 0.531250f, 0.356201f, 0.525391f, 0.350830f, 0.518555f,
+ 0.345459f, 0.511230f, 0.339600f, 0.503906f, 0.331055f, 0.494141f, 0.322754f, 0.483398f,
+ 0.312500f, 0.471924f, 0.299316f, 0.457031f, 0.283936f, 0.439453f, 0.264160f, 0.416504f,
+ 0.238525f, 0.386230f, 0.204834f, 0.341553f, 0.151611f, 0.267334f, 0.062408f, 0.109009f,
+ 0.000000f, 1.000000f, 0.062744f, 0.971680f, 0.110352f, 0.937988f, 0.147095f, 0.907227f,
+ 0.175415f, 0.880859f, 0.201660f, 0.855469f, 0.221558f, 0.833496f, 0.239258f, 0.813965f,
+ 0.254395f, 0.795898f, 0.267578f, 0.779785f, 0.280273f, 0.764648f, 0.291260f, 0.750488f,
+ 0.300537f, 0.738281f, 0.308838f, 0.726074f, 0.317383f, 0.714844f, 0.324707f, 0.704102f,
+ 0.331787f, 0.694336f, 0.337891f, 0.685059f, 0.344238f, 0.676270f, 0.348145f, 0.668945f,
+ 0.355225f, 0.660156f, 0.358154f, 0.653320f, 0.362549f, 0.646484f, 0.366943f, 0.639160f,
+ 0.370361f, 0.632812f, 0.373535f, 0.626953f, 0.376709f, 0.621094f, 0.379883f, 0.615234f,
+ 0.381836f, 0.609863f, 0.385010f, 0.604004f, 0.386963f, 0.599121f, 0.389893f, 0.594238f,
+ 0.391113f, 0.589844f, 0.392334f, 0.584961f, 0.394043f, 0.580566f, 0.395264f, 0.576172f,
+ 0.396973f, 0.572266f, 0.396973f, 0.568359f, 0.398438f, 0.563965f, 0.399414f, 0.559570f,
+ 0.398682f, 0.554688f, 0.398193f, 0.550781f, 0.398926f, 0.545898f, 0.398438f, 0.541992f,
+ 0.397217f, 0.536621f, 0.396484f, 0.532227f, 0.394531f, 0.527344f, 0.393311f, 0.521973f,
+ 0.390625f, 0.516602f, 0.388184f, 0.510742f, 0.385254f, 0.503906f, 0.381104f, 0.497070f,
+ 0.376221f, 0.489746f, 0.370361f, 0.481201f, 0.364746f, 0.472412f, 0.356934f, 0.461426f,
+ 0.347900f, 0.449219f, 0.335938f, 0.435059f, 0.323486f, 0.417725f, 0.305176f, 0.395752f,
+ 0.281738f, 0.366211f, 0.250000f, 0.324463f, 0.198730f, 0.255127f, 0.105286f, 0.104431f,
+ 0.000000f, 1.000000f, 0.062866f, 0.971680f, 0.111023f, 0.937500f, 0.148315f, 0.906738f,
+ 0.178101f, 0.878906f, 0.203369f, 0.854004f, 0.224976f, 0.831543f, 0.242676f, 0.811523f,
+ 0.259766f, 0.792480f, 0.272705f, 0.775879f, 0.285645f, 0.760254f, 0.297119f, 0.746094f,
+ 0.307373f, 0.732910f, 0.316650f, 0.720215f, 0.324951f, 0.708496f, 0.333252f, 0.697754f,
+ 0.341064f, 0.687500f, 0.346680f, 0.677734f, 0.353516f, 0.668945f, 0.359375f, 0.660156f,
+ 0.365234f, 0.651367f, 0.368896f, 0.644043f, 0.374268f, 0.636230f, 0.379150f, 0.628906f,
+ 0.383789f, 0.621582f, 0.386963f, 0.615234f, 0.391113f, 0.608887f, 0.395020f, 0.602539f,
+ 0.398193f, 0.596680f, 0.401611f, 0.590332f, 0.403809f, 0.585449f, 0.405518f, 0.580566f,
+ 0.409180f, 0.574707f, 0.410156f, 0.570312f, 0.412354f, 0.565430f, 0.414062f, 0.560547f,
+ 0.415527f, 0.556152f, 0.416992f, 0.551758f, 0.418213f, 0.547363f, 0.419678f, 0.542969f,
+ 0.419678f, 0.538086f, 0.420166f, 0.533691f, 0.420898f, 0.528320f, 0.420898f, 0.523926f,
+ 0.420166f, 0.518555f, 0.419678f, 0.513672f, 0.419434f, 0.508301f, 0.418457f, 0.502441f,
+ 0.416748f, 0.496826f, 0.415283f, 0.490723f, 0.412842f, 0.483398f, 0.410645f, 0.476074f,
+ 0.406250f, 0.468750f, 0.401855f, 0.459717f, 0.398682f, 0.450928f, 0.390625f, 0.439453f,
+ 0.383301f, 0.427490f, 0.373047f, 0.412842f, 0.361816f, 0.395996f, 0.345947f, 0.374268f,
+ 0.325684f, 0.346436f, 0.296387f, 0.305664f, 0.248291f, 0.240967f, 0.154663f, 0.099915f,
+ 0.000000f, 1.000000f, 0.063293f, 0.971191f, 0.111023f, 0.937988f, 0.149170f, 0.906250f,
+ 0.179932f, 0.877930f, 0.205811f, 0.852539f, 0.226929f, 0.830078f, 0.246582f, 0.808594f,
+ 0.263672f, 0.789551f, 0.277344f, 0.772461f, 0.291748f, 0.755859f, 0.303711f, 0.741211f,
+ 0.314209f, 0.727539f, 0.324951f, 0.714355f, 0.333252f, 0.702148f, 0.343018f, 0.689941f,
+ 0.350586f, 0.679199f, 0.358154f, 0.668945f, 0.364014f, 0.660156f, 0.370850f, 0.650391f,
+ 0.376465f, 0.642090f, 0.381592f, 0.633789f, 0.387451f, 0.625488f, 0.392090f, 0.618164f,
+ 0.396484f, 0.610840f, 0.400879f, 0.604004f, 0.404297f, 0.597656f, 0.407715f, 0.591309f,
+ 0.412109f, 0.584961f, 0.416260f, 0.578125f, 0.418701f, 0.572754f, 0.421631f, 0.566895f,
+ 0.425537f, 0.561035f, 0.426758f, 0.556152f, 0.428955f, 0.550781f, 0.432129f, 0.545410f,
+ 0.433838f, 0.540527f, 0.436523f, 0.535645f, 0.438232f, 0.530762f, 0.440918f, 0.525391f,
+ 0.441162f, 0.520996f, 0.442139f, 0.515625f, 0.442139f, 0.510254f, 0.443848f, 0.504883f,
+ 0.444824f, 0.500000f, 0.444092f, 0.494629f, 0.444824f, 0.488770f, 0.444336f, 0.482666f,
+ 0.443359f, 0.476562f, 0.442871f, 0.469971f, 0.442383f, 0.462646f, 0.439697f, 0.455322f,
+ 0.437012f, 0.447021f, 0.433350f, 0.438721f, 0.429199f, 0.428223f, 0.424072f, 0.417725f,
+ 0.418945f, 0.405518f, 0.410400f, 0.391357f, 0.399658f, 0.373779f, 0.386475f, 0.352539f,
+ 0.367920f, 0.325684f, 0.341797f, 0.287842f, 0.298340f, 0.226685f, 0.206909f, 0.094177f,
+ 0.000000f, 1.000000f, 0.063416f, 0.971191f, 0.112122f, 0.937012f, 0.149780f, 0.905762f,
+ 0.181885f, 0.876953f, 0.208618f, 0.850586f, 0.231323f, 0.827148f, 0.251221f, 0.805664f,
+ 0.268555f, 0.785645f, 0.283936f, 0.768066f, 0.298340f, 0.750977f, 0.310791f, 0.735352f,
+ 0.322510f, 0.720703f, 0.332275f, 0.707520f, 0.343018f, 0.694824f, 0.352051f, 0.683105f,
+ 0.359619f, 0.671875f, 0.367188f, 0.661621f, 0.373535f, 0.651855f, 0.381592f, 0.641602f,
+ 0.387207f, 0.633301f, 0.393799f, 0.624023f, 0.399170f, 0.615723f, 0.404053f, 0.608398f,
+ 0.409424f, 0.600098f, 0.414062f, 0.592773f, 0.418213f, 0.585938f, 0.421875f, 0.579102f,
+ 0.427246f, 0.571777f, 0.431396f, 0.564941f, 0.435547f, 0.558594f, 0.437744f, 0.552734f,
+ 0.442139f, 0.546875f, 0.445312f, 0.541016f, 0.447754f, 0.535645f, 0.450439f, 0.529785f,
+ 0.453125f, 0.524414f, 0.455811f, 0.519043f, 0.458252f, 0.514160f, 0.460449f, 0.508789f,
+ 0.462891f, 0.503418f, 0.463623f, 0.497803f, 0.465332f, 0.492188f, 0.467041f, 0.486572f,
+ 0.468262f, 0.480957f, 0.468262f, 0.475586f, 0.469727f, 0.469238f, 0.470215f, 0.462891f,
+ 0.470703f, 0.456055f, 0.469238f, 0.449219f, 0.469727f, 0.442139f, 0.468506f, 0.434326f,
+ 0.467285f, 0.425781f, 0.463867f, 0.416748f, 0.461426f, 0.406494f, 0.458984f, 0.396240f,
+ 0.451660f, 0.383057f, 0.446533f, 0.369385f, 0.437256f, 0.352295f, 0.426514f, 0.331543f,
+ 0.409668f, 0.305420f, 0.386963f, 0.269287f, 0.346924f, 0.211426f, 0.261230f, 0.088196f,
+ 0.000000f, 1.000000f, 0.064514f, 0.970215f, 0.113281f, 0.936523f, 0.151855f, 0.904785f,
+ 0.183105f, 0.875977f, 0.210693f, 0.849121f, 0.235352f, 0.824219f, 0.255371f, 0.802246f,
+ 0.273682f, 0.782227f, 0.290771f, 0.763184f, 0.304443f, 0.746094f, 0.316650f, 0.730469f,
+ 0.328369f, 0.715820f, 0.340088f, 0.702148f, 0.350586f, 0.688965f, 0.359131f, 0.676758f,
+ 0.368408f, 0.665039f, 0.376709f, 0.653809f, 0.384033f, 0.643555f, 0.391357f, 0.633789f,
+ 0.397461f, 0.624512f, 0.405518f, 0.614258f, 0.411377f, 0.605469f, 0.416992f, 0.597168f,
+ 0.422607f, 0.589355f, 0.427979f, 0.581055f, 0.432373f, 0.573730f, 0.437744f, 0.566406f,
+ 0.442627f, 0.559570f, 0.446777f, 0.552246f, 0.451416f, 0.545410f, 0.455566f, 0.538574f,
+ 0.460205f, 0.532227f, 0.462402f, 0.525879f, 0.465576f, 0.520508f, 0.469238f, 0.514160f,
+ 0.472168f, 0.508301f, 0.475098f, 0.502441f, 0.477783f, 0.497559f, 0.480957f, 0.491455f,
+ 0.484619f, 0.485596f, 0.486084f, 0.480469f, 0.487549f, 0.474121f, 0.489746f, 0.467773f,
+ 0.491211f, 0.461670f, 0.493408f, 0.456055f, 0.494141f, 0.449707f, 0.495605f, 0.442383f,
+ 0.496826f, 0.435791f, 0.496582f, 0.428711f, 0.496826f, 0.421875f, 0.496582f, 0.412842f,
+ 0.496582f, 0.404297f, 0.495850f, 0.395508f, 0.492676f, 0.385254f, 0.489990f, 0.374023f,
+ 0.486572f, 0.360840f, 0.481201f, 0.348145f, 0.474365f, 0.330566f, 0.465332f, 0.310791f,
+ 0.451660f, 0.285645f, 0.430908f, 0.250488f, 0.395752f, 0.196655f, 0.314941f, 0.082642f,
+ 0.000000f, 1.000000f, 0.064331f, 0.970703f, 0.113464f, 0.936523f, 0.153320f, 0.903809f,
+ 0.186401f, 0.874023f, 0.213989f, 0.846680f, 0.238770f, 0.821777f, 0.260742f, 0.798340f,
+ 0.278320f, 0.778809f, 0.295654f, 0.759277f, 0.309082f, 0.742676f, 0.323975f, 0.725586f,
+ 0.335938f, 0.710449f, 0.346436f, 0.696777f, 0.357666f, 0.683105f, 0.367920f, 0.669922f,
+ 0.377686f, 0.657227f, 0.386475f, 0.645996f, 0.394531f, 0.634766f, 0.403076f, 0.624512f,
+ 0.409180f, 0.614746f, 0.416748f, 0.604492f, 0.423096f, 0.595703f, 0.429688f, 0.586426f,
+ 0.435059f, 0.578613f, 0.442627f, 0.569336f, 0.446777f, 0.561523f, 0.452148f, 0.553711f,
+ 0.456787f, 0.546875f, 0.462402f, 0.539062f, 0.467773f, 0.531738f, 0.471436f, 0.524902f,
+ 0.475586f, 0.518066f, 0.481201f, 0.510742f, 0.483643f, 0.504883f, 0.488281f, 0.498535f,
+ 0.492432f, 0.491943f, 0.494141f, 0.486328f, 0.498047f, 0.480225f, 0.501465f, 0.474121f,
+ 0.505371f, 0.467773f, 0.508789f, 0.461914f, 0.509277f, 0.456055f, 0.512207f, 0.449463f,
+ 0.514648f, 0.442627f, 0.517090f, 0.436523f, 0.518555f, 0.430176f, 0.520996f, 0.422607f,
+ 0.521973f, 0.415771f, 0.522949f, 0.408447f, 0.523926f, 0.400391f, 0.525391f, 0.391846f,
+ 0.525391f, 0.383545f, 0.524902f, 0.373779f, 0.523926f, 0.363770f, 0.521484f, 0.352295f,
+ 0.520020f, 0.340332f, 0.515625f, 0.325928f, 0.510742f, 0.309570f, 0.502930f, 0.290039f,
+ 0.491455f, 0.265381f, 0.473389f, 0.233521f, 0.442383f, 0.181519f, 0.370117f, 0.076660f,
+ 0.000000f, 1.000000f, 0.064087f, 0.971191f, 0.113586f, 0.936523f, 0.154785f, 0.902832f,
+ 0.189209f, 0.872070f, 0.218018f, 0.844238f, 0.242920f, 0.818848f, 0.263428f, 0.796387f,
+ 0.282227f, 0.775391f, 0.299561f, 0.756348f, 0.314941f, 0.737793f, 0.330322f, 0.720703f,
+ 0.343506f, 0.704590f, 0.355225f, 0.689941f, 0.366943f, 0.675781f, 0.376709f, 0.662598f,
+ 0.387207f, 0.649902f, 0.395996f, 0.638184f, 0.405273f, 0.625977f, 0.412354f, 0.616211f,
+ 0.421631f, 0.604492f, 0.429199f, 0.594727f, 0.436035f, 0.584961f, 0.443359f, 0.575684f,
+ 0.448975f, 0.566895f, 0.456787f, 0.557617f, 0.460938f, 0.549805f, 0.468750f, 0.541016f,
+ 0.473145f, 0.533203f, 0.477783f, 0.525879f, 0.483887f, 0.518066f, 0.488037f, 0.510254f,
+ 0.492676f, 0.503418f, 0.497803f, 0.496094f, 0.502930f, 0.488770f, 0.506348f, 0.482666f,
+ 0.511230f, 0.475830f, 0.514648f, 0.469727f, 0.518555f, 0.462891f, 0.521484f, 0.456787f,
+ 0.525391f, 0.450439f, 0.529785f, 0.443848f, 0.532715f, 0.437988f, 0.535645f, 0.430664f,
+ 0.537598f, 0.423828f, 0.540039f, 0.417236f, 0.543457f, 0.410645f, 0.545898f, 0.402832f,
+ 0.547852f, 0.395752f, 0.550293f, 0.388184f, 0.550781f, 0.380127f, 0.552246f, 0.371826f,
+ 0.552734f, 0.362305f, 0.553711f, 0.353271f, 0.553711f, 0.342773f, 0.553223f, 0.332031f,
+ 0.551758f, 0.319336f, 0.548828f, 0.305176f, 0.545898f, 0.289795f, 0.540039f, 0.270020f,
+ 0.529297f, 0.246948f, 0.513184f, 0.216187f, 0.487549f, 0.167358f, 0.422119f, 0.069885f,
+ 0.000000f, 1.000000f, 0.063843f, 0.971191f, 0.115173f, 0.935547f, 0.156616f, 0.901855f,
+ 0.192017f, 0.870117f, 0.220093f, 0.842773f, 0.246338f, 0.816895f, 0.268066f, 0.793457f,
+ 0.287598f, 0.771973f, 0.305420f, 0.751953f, 0.322510f, 0.732910f, 0.336670f, 0.715820f,
+ 0.350830f, 0.698730f, 0.364014f, 0.683105f, 0.375000f, 0.668945f, 0.386475f, 0.654785f,
+ 0.396729f, 0.642578f, 0.407715f, 0.628906f, 0.415771f, 0.617676f, 0.423584f, 0.606445f,
+ 0.433350f, 0.595215f, 0.439941f, 0.584961f, 0.448975f, 0.574219f, 0.455566f, 0.564453f,
+ 0.462402f, 0.555176f, 0.469727f, 0.545898f, 0.476318f, 0.537109f, 0.481689f, 0.528809f,
+ 0.488770f, 0.520020f, 0.493652f, 0.512207f, 0.499512f, 0.504395f, 0.504883f, 0.496338f,
+ 0.510254f, 0.488525f, 0.515625f, 0.480713f, 0.520996f, 0.473633f, 0.524902f, 0.466797f,
+ 0.530273f, 0.459473f, 0.534180f, 0.452637f, 0.538086f, 0.446045f, 0.542969f, 0.438965f,
+ 0.546387f, 0.432861f, 0.550781f, 0.425781f, 0.553711f, 0.419678f, 0.558105f, 0.412598f,
+ 0.561035f, 0.404785f, 0.564453f, 0.397949f, 0.567383f, 0.390869f, 0.570312f, 0.383789f,
+ 0.572754f, 0.375732f, 0.575195f, 0.367920f, 0.577148f, 0.360107f, 0.580566f, 0.350830f,
+ 0.581543f, 0.342773f, 0.582520f, 0.332520f, 0.582520f, 0.322510f, 0.583496f, 0.310791f,
+ 0.583008f, 0.298828f, 0.580078f, 0.285156f, 0.578613f, 0.269287f, 0.573730f, 0.251221f,
+ 0.565430f, 0.229004f, 0.554688f, 0.198730f, 0.529785f, 0.154053f, 0.471924f, 0.063538f,
+ 0.000000f, 1.000000f, 0.063843f, 0.971191f, 0.116028f, 0.935059f, 0.159546f, 0.899902f,
+ 0.193848f, 0.869141f, 0.223999f, 0.840820f, 0.249268f, 0.814941f, 0.272461f, 0.790527f,
+ 0.293213f, 0.768066f, 0.312500f, 0.747070f, 0.329590f, 0.727539f, 0.343994f, 0.709961f,
+ 0.357666f, 0.693848f, 0.371582f, 0.677246f, 0.384766f, 0.662109f, 0.395996f, 0.647461f,
+ 0.406250f, 0.634277f, 0.417236f, 0.621094f, 0.425293f, 0.609375f, 0.435547f, 0.596680f,
+ 0.446045f, 0.584961f, 0.453125f, 0.574707f, 0.460938f, 0.563965f, 0.469971f, 0.553223f,
+ 0.477051f, 0.543457f, 0.483887f, 0.534180f, 0.491699f, 0.524414f, 0.497559f, 0.515625f,
+ 0.503906f, 0.506836f, 0.509277f, 0.498779f, 0.516113f, 0.490479f, 0.521973f, 0.481934f,
+ 0.527344f, 0.473877f, 0.533691f, 0.465576f, 0.538574f, 0.458008f, 0.542969f, 0.450684f,
+ 0.548828f, 0.443359f, 0.553223f, 0.436035f, 0.558105f, 0.429199f, 0.563965f, 0.421631f,
+ 0.567383f, 0.415039f, 0.571777f, 0.407715f, 0.575195f, 0.401367f, 0.580566f, 0.394043f,
+ 0.583984f, 0.386475f, 0.587402f, 0.379150f, 0.590820f, 0.371826f, 0.595215f, 0.364258f,
+ 0.597656f, 0.356445f, 0.599121f, 0.348633f, 0.604492f, 0.340088f, 0.605469f, 0.331299f,
+ 0.608887f, 0.322021f, 0.608398f, 0.312744f, 0.611816f, 0.302490f, 0.612305f, 0.291260f,
+ 0.612305f, 0.279297f, 0.611816f, 0.266113f, 0.610352f, 0.250244f, 0.606445f, 0.232788f,
+ 0.601562f, 0.211060f, 0.590820f, 0.182739f, 0.570312f, 0.140747f, 0.519043f, 0.057953f,
+ 0.000000f, 1.000000f, 0.064270f, 0.971191f, 0.117493f, 0.934082f, 0.160645f, 0.899414f,
+ 0.195190f, 0.868164f, 0.227295f, 0.838867f, 0.253174f, 0.812012f, 0.277588f, 0.787109f,
+ 0.297607f, 0.764648f, 0.317627f, 0.743164f, 0.335449f, 0.723633f, 0.350586f, 0.705078f,
+ 0.364990f, 0.687500f, 0.379883f, 0.670898f, 0.392090f, 0.655273f, 0.405762f, 0.640137f,
+ 0.416016f, 0.625977f, 0.426758f, 0.612793f, 0.437500f, 0.600098f, 0.448242f, 0.586914f,
+ 0.456543f, 0.575684f, 0.465820f, 0.563965f, 0.473877f, 0.553223f, 0.481201f, 0.542969f,
+ 0.490723f, 0.531738f, 0.497559f, 0.522461f, 0.505371f, 0.512207f, 0.512695f, 0.502441f,
+ 0.519043f, 0.493896f, 0.525879f, 0.484619f, 0.532715f, 0.476318f, 0.538574f, 0.467529f,
+ 0.544922f, 0.458984f, 0.551270f, 0.450684f, 0.558105f, 0.442383f, 0.561035f, 0.435059f,
+ 0.567383f, 0.427246f, 0.572754f, 0.419189f, 0.578125f, 0.412109f, 0.582520f, 0.404785f,
+ 0.588379f, 0.397217f, 0.592285f, 0.390137f, 0.597168f, 0.383057f, 0.602051f, 0.375488f,
+ 0.605469f, 0.369141f, 0.610352f, 0.360352f, 0.612793f, 0.353027f, 0.618164f, 0.344971f,
+ 0.621094f, 0.337402f, 0.625000f, 0.329102f, 0.628418f, 0.320312f, 0.631348f, 0.312256f,
+ 0.633301f, 0.302490f, 0.637207f, 0.293701f, 0.638672f, 0.282959f, 0.640137f, 0.271973f,
+ 0.641602f, 0.259766f, 0.641113f, 0.247437f, 0.640137f, 0.231689f, 0.637695f, 0.214966f,
+ 0.634277f, 0.194214f, 0.625488f, 0.167847f, 0.607422f, 0.128784f, 0.563965f, 0.054199f,
+ 0.000000f, 1.000000f, 0.064270f, 0.971191f, 0.118652f, 0.933105f, 0.161499f, 0.898926f,
+ 0.197510f, 0.867188f, 0.228516f, 0.837402f, 0.257324f, 0.809082f, 0.281250f, 0.784180f,
+ 0.302979f, 0.761230f, 0.322998f, 0.739258f, 0.341797f, 0.718262f, 0.357666f, 0.699707f,
+ 0.373535f, 0.681152f, 0.387207f, 0.664551f, 0.401855f, 0.647949f, 0.413818f, 0.632812f,
+ 0.425781f, 0.618164f, 0.437988f, 0.604004f, 0.448242f, 0.590820f, 0.459961f, 0.577637f,
+ 0.468994f, 0.565430f, 0.479248f, 0.552734f, 0.487549f, 0.541992f, 0.496338f, 0.531250f,
+ 0.504883f, 0.520020f, 0.511719f, 0.510254f, 0.519531f, 0.500000f, 0.527832f, 0.489746f,
+ 0.535156f, 0.480469f, 0.541504f, 0.470947f, 0.547852f, 0.462402f, 0.554688f, 0.453613f,
+ 0.562988f, 0.444092f, 0.568848f, 0.435547f, 0.575195f, 0.427002f, 0.580078f, 0.418945f,
+ 0.586914f, 0.410889f, 0.590820f, 0.403320f, 0.597168f, 0.395264f, 0.602051f, 0.387939f,
+ 0.608887f, 0.379883f, 0.613281f, 0.372559f, 0.618164f, 0.365234f, 0.623535f, 0.357422f,
+ 0.628418f, 0.350342f, 0.632324f, 0.342529f, 0.635254f, 0.334961f, 0.640625f, 0.326416f,
+ 0.645020f, 0.318604f, 0.648926f, 0.310547f, 0.651367f, 0.302246f, 0.656250f, 0.292725f,
+ 0.659180f, 0.283936f, 0.661621f, 0.274658f, 0.664551f, 0.263916f, 0.667480f, 0.253418f,
+ 0.668945f, 0.241577f, 0.669922f, 0.229248f, 0.670410f, 0.214844f, 0.669434f, 0.198364f,
+ 0.664551f, 0.178589f, 0.658203f, 0.153564f, 0.644043f, 0.117371f, 0.605957f, 0.046814f,
+ 0.000000f, 1.000000f, 0.065063f, 0.970703f, 0.119690f, 0.932617f, 0.162720f, 0.898438f,
+ 0.199585f, 0.865723f, 0.232910f, 0.834473f, 0.260254f, 0.807129f, 0.285889f, 0.781250f,
+ 0.309082f, 0.756836f, 0.328613f, 0.734863f, 0.348145f, 0.713379f, 0.365234f, 0.693848f,
+ 0.381836f, 0.675293f, 0.396729f, 0.657227f, 0.410645f, 0.641113f, 0.423828f, 0.625000f,
+ 0.436768f, 0.609863f, 0.448730f, 0.595215f, 0.460938f, 0.581055f, 0.470459f, 0.568359f,
+ 0.480957f, 0.555176f, 0.490723f, 0.543457f, 0.500977f, 0.531250f, 0.508789f, 0.519531f,
+ 0.519043f, 0.508301f, 0.526855f, 0.497559f, 0.535156f, 0.487305f, 0.541992f, 0.477295f,
+ 0.550781f, 0.467041f, 0.558105f, 0.457031f, 0.564453f, 0.448242f, 0.571777f, 0.438721f,
+ 0.579102f, 0.429688f, 0.585449f, 0.421143f, 0.592285f, 0.411865f, 0.597656f, 0.403320f,
+ 0.605469f, 0.395020f, 0.610840f, 0.386719f, 0.616211f, 0.378662f, 0.621094f, 0.371094f,
+ 0.628906f, 0.362549f, 0.632812f, 0.355225f, 0.638184f, 0.347900f, 0.644043f, 0.339844f,
+ 0.648926f, 0.332275f, 0.654785f, 0.324707f, 0.657715f, 0.316895f, 0.663086f, 0.308350f,
+ 0.667480f, 0.300293f, 0.671387f, 0.292236f, 0.675293f, 0.283936f, 0.680176f, 0.274658f,
+ 0.683105f, 0.266113f, 0.686523f, 0.256348f, 0.689941f, 0.246704f, 0.692383f, 0.235474f,
+ 0.693848f, 0.224609f, 0.696289f, 0.212524f, 0.697266f, 0.198486f, 0.695801f, 0.182617f,
+ 0.693848f, 0.163330f, 0.689941f, 0.140869f, 0.678711f, 0.106812f, 0.645020f, 0.043213f,
+ 0.000000f, 1.000000f, 0.065430f, 0.970215f, 0.120850f, 0.932129f, 0.163452f, 0.897949f,
+ 0.202393f, 0.864258f, 0.236206f, 0.832520f, 0.264893f, 0.804199f, 0.290527f, 0.777832f,
+ 0.312988f, 0.753418f, 0.334961f, 0.730469f, 0.354248f, 0.708496f, 0.372803f, 0.687988f,
+ 0.389160f, 0.669434f, 0.404297f, 0.650879f, 0.420166f, 0.633789f, 0.433105f, 0.617676f,
+ 0.447266f, 0.601562f, 0.459717f, 0.586426f, 0.471191f, 0.572266f, 0.481934f, 0.558594f,
+ 0.493164f, 0.544922f, 0.503418f, 0.532227f, 0.512695f, 0.520508f, 0.523438f, 0.507812f,
+ 0.531250f, 0.497070f, 0.542480f, 0.484863f, 0.548340f, 0.475098f, 0.558594f, 0.464111f,
+ 0.564941f, 0.454102f, 0.574219f, 0.443359f, 0.581543f, 0.433594f, 0.587891f, 0.424805f,
+ 0.595215f, 0.415283f, 0.603027f, 0.406006f, 0.611328f, 0.396240f, 0.616699f, 0.387939f,
+ 0.622559f, 0.379150f, 0.629395f, 0.370605f, 0.635254f, 0.362305f, 0.641113f, 0.354248f,
+ 0.647949f, 0.346191f, 0.652832f, 0.338135f, 0.658691f, 0.330322f, 0.664062f, 0.322754f,
+ 0.669922f, 0.314453f, 0.674316f, 0.307373f, 0.680176f, 0.299316f, 0.683594f, 0.291016f,
+ 0.688477f, 0.282471f, 0.693848f, 0.274170f, 0.696777f, 0.266602f, 0.701660f, 0.257568f,
+ 0.706055f, 0.248047f, 0.710449f, 0.239014f, 0.712891f, 0.229370f, 0.716797f, 0.219116f,
+ 0.719238f, 0.208374f, 0.720215f, 0.196045f, 0.723145f, 0.182739f, 0.723145f, 0.167969f,
+ 0.722168f, 0.150391f, 0.718262f, 0.128662f, 0.709961f, 0.096558f, 0.679688f, 0.039581f,
+ 0.000000f, 1.000000f, 0.066101f, 0.969727f, 0.121155f, 0.932617f, 0.165527f, 0.896973f,
+ 0.205322f, 0.861816f, 0.238281f, 0.831543f, 0.268311f, 0.801758f, 0.294678f, 0.774902f,
+ 0.319336f, 0.749512f, 0.341309f, 0.725586f, 0.361572f, 0.703125f, 0.380371f, 0.682617f,
+ 0.396973f, 0.663086f, 0.413330f, 0.644043f, 0.428467f, 0.626465f, 0.445068f, 0.609375f,
+ 0.458252f, 0.592773f, 0.470947f, 0.577637f, 0.481201f, 0.563477f, 0.493896f, 0.548340f,
+ 0.504883f, 0.535156f, 0.516113f, 0.521973f, 0.526855f, 0.509277f, 0.536621f, 0.496826f,
+ 0.544922f, 0.485107f, 0.554688f, 0.473389f, 0.563965f, 0.461914f, 0.572754f, 0.451172f,
+ 0.581543f, 0.440430f, 0.590332f, 0.429932f, 0.597168f, 0.419922f, 0.604980f, 0.410156f,
+ 0.612793f, 0.400391f, 0.619141f, 0.391602f, 0.627930f, 0.381592f, 0.634766f, 0.372314f,
+ 0.640625f, 0.363770f, 0.647949f, 0.354492f, 0.655273f, 0.345947f, 0.659668f, 0.337891f,
+ 0.666016f, 0.329590f, 0.672852f, 0.321289f, 0.677734f, 0.313721f, 0.683594f, 0.305664f,
+ 0.689941f, 0.297363f, 0.694824f, 0.289795f, 0.700195f, 0.282227f, 0.706055f, 0.274414f,
+ 0.709961f, 0.265625f, 0.714355f, 0.257324f, 0.719727f, 0.249023f, 0.723633f, 0.240845f,
+ 0.728027f, 0.231323f, 0.731445f, 0.223022f, 0.736328f, 0.212891f, 0.740234f, 0.202759f,
+ 0.743164f, 0.191772f, 0.746094f, 0.181030f, 0.747070f, 0.168701f, 0.748535f, 0.154297f,
+ 0.748047f, 0.137207f, 0.745117f, 0.116882f, 0.737305f, 0.087463f, 0.713867f, 0.035583f,
+ 0.000000f, 1.000000f, 0.066650f, 0.969238f, 0.121887f, 0.932129f, 0.168335f, 0.895020f,
+ 0.207153f, 0.861328f, 0.241699f, 0.828613f, 0.272217f, 0.798828f, 0.300537f, 0.770996f,
+ 0.323975f, 0.745605f, 0.348633f, 0.720703f, 0.368652f, 0.698242f, 0.387451f, 0.677246f,
+ 0.405029f, 0.656738f, 0.422852f, 0.637207f, 0.437256f, 0.619141f, 0.452881f, 0.601562f,
+ 0.467285f, 0.584961f, 0.480225f, 0.568848f, 0.493652f, 0.553223f, 0.505859f, 0.539062f,
+ 0.517578f, 0.524414f, 0.528320f, 0.511230f, 0.539062f, 0.498047f, 0.549805f, 0.485352f,
+ 0.559570f, 0.472900f, 0.570312f, 0.460938f, 0.578125f, 0.449463f, 0.587402f, 0.438232f,
+ 0.596680f, 0.427002f, 0.604980f, 0.416748f, 0.613281f, 0.405762f, 0.621094f, 0.395996f,
+ 0.627930f, 0.386230f, 0.636719f, 0.376465f, 0.643555f, 0.367188f, 0.651367f, 0.357422f,
+ 0.657227f, 0.348633f, 0.665527f, 0.339111f, 0.673340f, 0.330322f, 0.677246f, 0.322266f,
+ 0.684082f, 0.313721f, 0.691406f, 0.305176f, 0.696777f, 0.297119f, 0.702637f, 0.289062f,
+ 0.708008f, 0.281006f, 0.714844f, 0.272705f, 0.720215f, 0.265381f, 0.725098f, 0.257568f,
+ 0.730469f, 0.249390f, 0.735352f, 0.240723f, 0.740234f, 0.232910f, 0.744141f, 0.224365f,
+ 0.750000f, 0.215576f, 0.753906f, 0.206299f, 0.757324f, 0.197632f, 0.761719f, 0.187622f,
+ 0.763672f, 0.177734f, 0.767578f, 0.166504f, 0.770020f, 0.154297f, 0.771484f, 0.141113f,
+ 0.771973f, 0.125244f, 0.770020f, 0.106323f, 0.763672f, 0.078552f, 0.744141f, 0.031311f,
+ 0.000000f, 1.000000f, 0.068359f, 0.968262f, 0.123169f, 0.931641f, 0.169067f, 0.894531f,
+ 0.209961f, 0.859375f, 0.243896f, 0.827637f, 0.276855f, 0.795898f, 0.305664f, 0.767578f,
+ 0.329834f, 0.741211f, 0.353027f, 0.716797f, 0.375488f, 0.692871f, 0.395264f, 0.670898f,
+ 0.413330f, 0.650391f, 0.430176f, 0.630859f, 0.448486f, 0.611328f, 0.463135f, 0.593262f,
+ 0.477783f, 0.576660f, 0.491943f, 0.559570f, 0.505859f, 0.543945f, 0.518066f, 0.528809f,
+ 0.528809f, 0.514648f, 0.540527f, 0.500488f, 0.552246f, 0.487061f, 0.562012f, 0.474365f,
+ 0.573730f, 0.460938f, 0.582520f, 0.449219f, 0.593262f, 0.436768f, 0.602539f, 0.425293f,
+ 0.612793f, 0.413818f, 0.618652f, 0.404053f, 0.628906f, 0.392090f, 0.637695f, 0.381592f,
+ 0.645508f, 0.371582f, 0.653320f, 0.361816f, 0.657715f, 0.353516f, 0.667969f, 0.342529f,
+ 0.675781f, 0.333252f, 0.682617f, 0.323975f, 0.688965f, 0.315186f, 0.696289f, 0.306152f,
+ 0.703613f, 0.297607f, 0.709961f, 0.289062f, 0.715332f, 0.281006f, 0.720703f, 0.273193f,
+ 0.728027f, 0.264648f, 0.732910f, 0.256836f, 0.738770f, 0.249390f, 0.745117f, 0.241089f,
+ 0.749512f, 0.233643f, 0.754883f, 0.225220f, 0.760254f, 0.216675f, 0.764648f, 0.208252f,
+ 0.769531f, 0.200195f, 0.773926f, 0.191895f, 0.778320f, 0.182373f, 0.781738f, 0.173096f,
+ 0.785156f, 0.163330f, 0.788574f, 0.153442f, 0.791016f, 0.141113f, 0.793945f, 0.129028f,
+ 0.794922f, 0.114624f, 0.793457f, 0.096802f, 0.789062f, 0.071899f, 0.771973f, 0.028336f,
+ 0.000000f, 1.000000f, 0.068176f, 0.968750f, 0.123291f, 0.931641f, 0.171997f, 0.893066f,
+ 0.212891f, 0.857422f, 0.247803f, 0.824707f, 0.279541f, 0.793945f, 0.309570f, 0.764648f,
+ 0.335938f, 0.737305f, 0.360107f, 0.711914f, 0.382568f, 0.687500f, 0.402588f, 0.665527f,
+ 0.422852f, 0.643555f, 0.439453f, 0.623535f, 0.457275f, 0.604004f, 0.473633f, 0.584961f,
+ 0.488770f, 0.567871f, 0.503418f, 0.550781f, 0.516602f, 0.534668f, 0.528809f, 0.519043f,
+ 0.542480f, 0.503418f, 0.554199f, 0.489502f, 0.564941f, 0.476074f, 0.575684f, 0.462402f,
+ 0.587402f, 0.448975f, 0.597656f, 0.436523f, 0.607422f, 0.424316f, 0.618164f, 0.412109f,
+ 0.626953f, 0.400635f, 0.635254f, 0.389893f, 0.644531f, 0.378906f, 0.652832f, 0.368164f,
+ 0.660645f, 0.357910f, 0.669434f, 0.347412f, 0.676758f, 0.338135f, 0.684082f, 0.328613f,
+ 0.692871f, 0.318359f, 0.698242f, 0.309570f, 0.706543f, 0.299805f, 0.713867f, 0.291016f,
+ 0.719238f, 0.282715f, 0.726074f, 0.273926f, 0.733398f, 0.265381f, 0.738281f, 0.257812f,
+ 0.745117f, 0.249390f, 0.751465f, 0.241211f, 0.756836f, 0.233521f, 0.762695f, 0.225708f,
+ 0.768555f, 0.217651f, 0.772949f, 0.210693f, 0.779297f, 0.201782f, 0.783203f, 0.193604f,
+ 0.788086f, 0.185181f, 0.792969f, 0.177246f, 0.796875f, 0.168335f, 0.801758f, 0.159302f,
+ 0.805176f, 0.150635f, 0.808105f, 0.140015f, 0.811035f, 0.129517f, 0.814453f, 0.117981f,
+ 0.815918f, 0.103760f, 0.814941f, 0.087219f, 0.812500f, 0.064514f, 0.797852f, 0.024719f,
+ 0.000000f, 1.000000f, 0.067627f, 0.969727f, 0.123962f, 0.930664f, 0.171997f, 0.893066f,
+ 0.213989f, 0.856934f, 0.251221f, 0.822754f, 0.284668f, 0.791016f, 0.313721f, 0.761230f,
+ 0.342041f, 0.732910f, 0.365479f, 0.707520f, 0.388672f, 0.682617f, 0.410889f, 0.659180f,
+ 0.431885f, 0.636719f, 0.448730f, 0.616211f, 0.466553f, 0.596680f, 0.482422f, 0.577637f,
+ 0.496826f, 0.560059f, 0.512695f, 0.541992f, 0.527344f, 0.524902f, 0.541504f, 0.508789f,
+ 0.553711f, 0.493896f, 0.566895f, 0.479004f, 0.577637f, 0.465088f, 0.589355f, 0.450684f,
+ 0.600098f, 0.437988f, 0.611328f, 0.424316f, 0.622559f, 0.411621f, 0.631836f, 0.400146f,
+ 0.641113f, 0.387939f, 0.650879f, 0.376465f, 0.658691f, 0.365723f, 0.668945f, 0.354248f,
+ 0.676758f, 0.343994f, 0.685547f, 0.333496f, 0.692871f, 0.323486f, 0.700195f, 0.314209f,
+ 0.708984f, 0.304199f, 0.715820f, 0.295166f, 0.723145f, 0.285156f, 0.730469f, 0.276123f,
+ 0.736816f, 0.267822f, 0.743164f, 0.258789f, 0.750488f, 0.250244f, 0.757812f, 0.242310f,
+ 0.761719f, 0.234375f, 0.769043f, 0.225952f, 0.774414f, 0.218506f, 0.779785f, 0.210938f,
+ 0.785156f, 0.203003f, 0.791504f, 0.195312f, 0.797363f, 0.187988f, 0.801270f, 0.179565f,
+ 0.806152f, 0.171509f, 0.811523f, 0.162964f, 0.815918f, 0.155151f, 0.818359f, 0.146973f,
+ 0.823242f, 0.137207f, 0.828613f, 0.128174f, 0.830078f, 0.117920f, 0.832520f, 0.106873f,
+ 0.834961f, 0.093811f, 0.835938f, 0.078918f, 0.833984f, 0.058533f, 0.821777f, 0.022888f,
+ 0.000000f, 1.000000f, 0.067932f, 0.969238f, 0.125488f, 0.929688f, 0.175171f, 0.891113f,
+ 0.217529f, 0.854492f, 0.254150f, 0.820801f, 0.287109f, 0.788574f, 0.319092f, 0.757812f,
+ 0.348633f, 0.728516f, 0.372803f, 0.702148f, 0.396729f, 0.676758f, 0.418457f, 0.653320f,
+ 0.438721f, 0.630371f, 0.458252f, 0.608887f, 0.476562f, 0.588379f, 0.493652f, 0.568848f,
+ 0.509766f, 0.550293f, 0.524902f, 0.532227f, 0.539551f, 0.515137f, 0.552734f, 0.499023f,
+ 0.567383f, 0.483154f, 0.579102f, 0.468018f, 0.591797f, 0.453125f, 0.603516f, 0.439453f,
+ 0.614258f, 0.425537f, 0.625488f, 0.412354f, 0.636230f, 0.399658f, 0.645996f, 0.387451f,
+ 0.654297f, 0.375977f, 0.665527f, 0.363281f, 0.675293f, 0.352051f, 0.682617f, 0.341553f,
+ 0.691895f, 0.330566f, 0.701660f, 0.319580f, 0.708496f, 0.309570f, 0.716309f, 0.299805f,
+ 0.722656f, 0.290527f, 0.731445f, 0.281006f, 0.739258f, 0.271484f, 0.746582f, 0.261719f,
+ 0.753906f, 0.253174f, 0.759277f, 0.244507f, 0.767090f, 0.235840f, 0.771973f, 0.228027f,
+ 0.779297f, 0.219482f, 0.784668f, 0.211670f, 0.791504f, 0.203735f, 0.797363f, 0.196411f,
+ 0.802734f, 0.188354f, 0.808594f, 0.181152f, 0.813477f, 0.173950f, 0.818848f, 0.166138f,
+ 0.823242f, 0.158447f, 0.828125f, 0.149902f, 0.833496f, 0.141846f, 0.836914f, 0.134766f,
+ 0.840820f, 0.125366f, 0.844238f, 0.116882f, 0.847656f, 0.107178f, 0.852051f, 0.096863f,
+ 0.853516f, 0.084900f, 0.854980f, 0.071045f, 0.854004f, 0.052765f, 0.845215f, 0.020370f,
+ 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.126465f, 0.929688f, 0.176270f, 0.890625f,
+ 0.219116f, 0.853516f, 0.257568f, 0.818359f, 0.294189f, 0.784668f, 0.324219f, 0.754395f,
+ 0.353027f, 0.725098f, 0.378906f, 0.697754f, 0.403564f, 0.671875f, 0.426514f, 0.646973f,
+ 0.448242f, 0.623535f, 0.466309f, 0.602051f, 0.486572f, 0.581055f, 0.503906f, 0.560547f,
+ 0.519043f, 0.541992f, 0.535645f, 0.523438f, 0.550781f, 0.505859f, 0.564941f, 0.489258f,
+ 0.579102f, 0.472900f, 0.592285f, 0.457275f, 0.604980f, 0.442139f, 0.615234f, 0.428467f,
+ 0.627441f, 0.414062f, 0.638672f, 0.400635f, 0.649414f, 0.387451f, 0.660645f, 0.374512f,
+ 0.669922f, 0.362793f, 0.680176f, 0.350586f, 0.689941f, 0.338867f, 0.699219f, 0.327881f,
+ 0.705078f, 0.317627f, 0.715820f, 0.306152f, 0.725098f, 0.295410f, 0.730957f, 0.286377f,
+ 0.739746f, 0.276123f, 0.746582f, 0.267090f, 0.754883f, 0.257568f, 0.762207f, 0.248291f,
+ 0.768066f, 0.239502f, 0.777344f, 0.230103f, 0.781250f, 0.222412f, 0.788574f, 0.213745f,
+ 0.796387f, 0.205322f, 0.800293f, 0.198120f, 0.806641f, 0.190186f, 0.813965f, 0.182251f,
+ 0.817871f, 0.175049f, 0.823730f, 0.167725f, 0.829590f, 0.160278f, 0.835449f, 0.152832f,
+ 0.838867f, 0.146484f, 0.844727f, 0.137695f, 0.849121f, 0.129883f, 0.852539f, 0.123169f,
+ 0.857910f, 0.114807f, 0.861328f, 0.106140f, 0.865234f, 0.096985f, 0.868652f, 0.087036f,
+ 0.870605f, 0.076904f, 0.871582f, 0.063538f, 0.872070f, 0.046936f, 0.864746f, 0.018570f,
+ 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.127197f, 0.929199f, 0.177124f, 0.890137f,
+ 0.222656f, 0.851562f, 0.262207f, 0.815918f, 0.297119f, 0.782227f, 0.328857f, 0.750977f,
+ 0.358398f, 0.721191f, 0.386230f, 0.692383f, 0.411377f, 0.666016f, 0.434326f, 0.641113f,
+ 0.455566f, 0.617676f, 0.476074f, 0.594727f, 0.496094f, 0.572754f, 0.513184f, 0.552734f,
+ 0.530762f, 0.533203f, 0.547363f, 0.514160f, 0.562988f, 0.496094f, 0.576660f, 0.479248f,
+ 0.590820f, 0.462402f, 0.604004f, 0.446533f, 0.616211f, 0.431641f, 0.629883f, 0.416504f,
+ 0.641602f, 0.402344f, 0.652344f, 0.388672f, 0.664062f, 0.375488f, 0.674805f, 0.362305f,
+ 0.683594f, 0.350098f, 0.693359f, 0.338379f, 0.704102f, 0.326172f, 0.713379f, 0.314697f,
+ 0.721680f, 0.303711f, 0.729980f, 0.293945f, 0.738770f, 0.282715f, 0.746582f, 0.272705f,
+ 0.755371f, 0.262695f, 0.761230f, 0.253662f, 0.770020f, 0.244141f, 0.776367f, 0.235596f,
+ 0.783203f, 0.226196f, 0.791504f, 0.217041f, 0.797852f, 0.208618f, 0.803223f, 0.200684f,
+ 0.811523f, 0.191772f, 0.816406f, 0.184570f, 0.821777f, 0.176880f, 0.828613f, 0.168945f,
+ 0.833496f, 0.161865f, 0.839355f, 0.154785f, 0.844727f, 0.147339f, 0.850586f, 0.140381f,
+ 0.854492f, 0.133911f, 0.860840f, 0.126465f, 0.864258f, 0.118774f, 0.868164f, 0.111755f,
+ 0.872559f, 0.103699f, 0.876465f, 0.096558f, 0.881348f, 0.087158f, 0.883789f, 0.079224f,
+ 0.886719f, 0.068542f, 0.888184f, 0.057404f, 0.889648f, 0.041260f, 0.882812f, 0.016769f,
+ 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.128052f, 0.928711f, 0.180054f, 0.888184f,
+ 0.224487f, 0.850586f, 0.264648f, 0.813965f, 0.301758f, 0.779297f, 0.334473f, 0.747070f,
+ 0.364746f, 0.716797f, 0.391357f, 0.688477f, 0.416992f, 0.661133f, 0.441650f, 0.635254f,
+ 0.466064f, 0.609863f, 0.485596f, 0.587891f, 0.505371f, 0.565430f, 0.523438f, 0.544434f,
+ 0.541992f, 0.523926f, 0.557617f, 0.504883f, 0.572754f, 0.486816f, 0.587402f, 0.469482f,
+ 0.602539f, 0.452393f, 0.614746f, 0.437012f, 0.628906f, 0.420654f, 0.641113f, 0.405762f,
+ 0.653809f, 0.391113f, 0.665527f, 0.376953f, 0.678223f, 0.363037f, 0.687500f, 0.350586f,
+ 0.699219f, 0.337402f, 0.708008f, 0.325684f, 0.717285f, 0.313965f, 0.727051f, 0.302490f,
+ 0.736816f, 0.290771f, 0.743652f, 0.280762f, 0.753906f, 0.270020f, 0.761230f, 0.259766f,
+ 0.770020f, 0.249878f, 0.776855f, 0.240112f, 0.784668f, 0.230957f, 0.791504f, 0.221924f,
+ 0.796875f, 0.213867f, 0.806641f, 0.204102f, 0.812988f, 0.195679f, 0.817383f, 0.187988f,
+ 0.825684f, 0.179199f, 0.831543f, 0.171509f, 0.837402f, 0.164307f, 0.843262f, 0.156250f,
+ 0.848145f, 0.149536f, 0.853516f, 0.142578f, 0.859863f, 0.135010f, 0.864258f, 0.128784f,
+ 0.869629f, 0.121704f, 0.875000f, 0.114990f, 0.878906f, 0.109009f, 0.883301f, 0.101196f,
+ 0.887207f, 0.093689f, 0.892090f, 0.086487f, 0.895508f, 0.079102f, 0.898438f, 0.070251f,
+ 0.901855f, 0.061432f, 0.905273f, 0.050354f, 0.905762f, 0.036346f, 0.900391f, 0.013496f,
+ 0.000000f, 1.000000f, 0.068542f, 0.969238f, 0.129272f, 0.928223f, 0.179810f, 0.888672f,
+ 0.228149f, 0.848145f, 0.269531f, 0.811035f, 0.306152f, 0.776367f, 0.338623f, 0.743652f,
+ 0.370850f, 0.712402f, 0.399902f, 0.682617f, 0.426514f, 0.654785f, 0.450684f, 0.628418f,
+ 0.472168f, 0.604004f, 0.494873f, 0.580078f, 0.515625f, 0.557129f, 0.533691f, 0.535645f,
+ 0.550781f, 0.515625f, 0.568359f, 0.495850f, 0.584473f, 0.477295f, 0.600098f, 0.459473f,
+ 0.614746f, 0.441895f, 0.628906f, 0.425293f, 0.642578f, 0.409424f, 0.655762f, 0.394043f,
+ 0.667969f, 0.379395f, 0.679199f, 0.365234f, 0.690430f, 0.352051f, 0.700684f, 0.338379f,
+ 0.711914f, 0.325684f, 0.721191f, 0.313477f, 0.731445f, 0.301270f, 0.740234f, 0.290283f,
+ 0.750488f, 0.278809f, 0.759277f, 0.267822f, 0.767090f, 0.257324f, 0.775391f, 0.247681f,
+ 0.783691f, 0.237305f, 0.791016f, 0.227539f, 0.799316f, 0.218262f, 0.806641f, 0.209106f,
+ 0.811523f, 0.200928f, 0.818359f, 0.192505f, 0.826172f, 0.183716f, 0.833496f, 0.175293f,
+ 0.839355f, 0.166870f, 0.845215f, 0.159424f, 0.852051f, 0.151733f, 0.857910f, 0.144165f,
+ 0.860840f, 0.137939f, 0.867676f, 0.130371f, 0.873047f, 0.123840f, 0.877930f, 0.117249f,
+ 0.883301f, 0.110352f, 0.887207f, 0.104614f, 0.893555f, 0.097595f, 0.897461f, 0.091553f,
+ 0.900879f, 0.084900f, 0.904785f, 0.077393f, 0.910645f, 0.069885f, 0.912109f, 0.063721f,
+ 0.915527f, 0.054260f, 0.918945f, 0.044922f, 0.918945f, 0.032166f, 0.916504f, 0.011772f,
+ 0.000000f, 1.000000f, 0.069641f, 0.968262f, 0.129395f, 0.928223f, 0.182739f, 0.886719f,
+ 0.228882f, 0.847656f, 0.272217f, 0.809082f, 0.310547f, 0.773438f, 0.343994f, 0.740234f,
+ 0.377930f, 0.707031f, 0.405518f, 0.678223f, 0.433105f, 0.649414f, 0.458252f, 0.622559f,
+ 0.483154f, 0.596680f, 0.504395f, 0.572266f, 0.524414f, 0.549805f, 0.543945f, 0.527344f,
+ 0.562988f, 0.506348f, 0.580078f, 0.486572f, 0.596680f, 0.467285f, 0.611816f, 0.448975f,
+ 0.627441f, 0.431396f, 0.641113f, 0.414795f, 0.655762f, 0.398438f, 0.667969f, 0.383301f,
+ 0.680664f, 0.367920f, 0.693359f, 0.353760f, 0.702637f, 0.340576f, 0.714355f, 0.326904f,
+ 0.724121f, 0.314209f, 0.735352f, 0.301270f, 0.745605f, 0.289307f, 0.754395f, 0.277832f,
+ 0.763184f, 0.266602f, 0.770996f, 0.255859f, 0.782227f, 0.244873f, 0.789551f, 0.234863f,
+ 0.796387f, 0.225464f, 0.805176f, 0.215454f, 0.813477f, 0.206055f, 0.819336f, 0.197021f,
+ 0.825684f, 0.188354f, 0.833496f, 0.179932f, 0.838867f, 0.172241f, 0.846680f, 0.163696f,
+ 0.853027f, 0.155518f, 0.857422f, 0.148438f, 0.865723f, 0.139893f, 0.869629f, 0.133545f,
+ 0.875488f, 0.125977f, 0.881348f, 0.119385f, 0.885742f, 0.113098f, 0.892578f, 0.105774f,
+ 0.895020f, 0.100403f, 0.900879f, 0.093567f, 0.904785f, 0.088013f, 0.909668f, 0.081787f,
+ 0.913574f, 0.076172f, 0.917969f, 0.069458f, 0.921875f, 0.062408f, 0.924805f, 0.055573f,
+ 0.929199f, 0.048553f, 0.931152f, 0.038879f, 0.933105f, 0.028000f, 0.931152f, 0.010727f,
+ 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.131348f, 0.926758f, 0.184448f, 0.886230f,
+ 0.232788f, 0.845215f, 0.277100f, 0.806641f, 0.314941f, 0.770020f, 0.351562f, 0.735840f,
+ 0.382568f, 0.703613f, 0.413818f, 0.672852f, 0.441650f, 0.643555f, 0.466553f, 0.616211f,
+ 0.490723f, 0.589844f, 0.514648f, 0.564941f, 0.534668f, 0.541016f, 0.553711f, 0.519531f,
+ 0.572754f, 0.498291f, 0.591797f, 0.477539f, 0.607422f, 0.458008f, 0.624023f, 0.439453f,
+ 0.639648f, 0.421387f, 0.653320f, 0.404785f, 0.666992f, 0.388184f, 0.681152f, 0.372070f,
+ 0.693359f, 0.356934f, 0.705566f, 0.342529f, 0.716309f, 0.328857f, 0.728027f, 0.315186f,
+ 0.735840f, 0.302979f, 0.747559f, 0.289795f, 0.758301f, 0.277588f, 0.768555f, 0.265869f,
+ 0.776367f, 0.254639f, 0.785156f, 0.243896f, 0.794434f, 0.233398f, 0.801758f, 0.223267f,
+ 0.810059f, 0.213135f, 0.816895f, 0.203735f, 0.824707f, 0.194946f, 0.832031f, 0.185547f,
+ 0.839844f, 0.176758f, 0.846191f, 0.168213f, 0.852051f, 0.160522f, 0.858887f, 0.152344f,
+ 0.863281f, 0.145508f, 0.871582f, 0.136841f, 0.876953f, 0.129761f, 0.883301f, 0.122131f,
+ 0.888184f, 0.115479f, 0.893555f, 0.108765f, 0.897949f, 0.102417f, 0.903809f, 0.095947f,
+ 0.907715f, 0.089905f, 0.912109f, 0.084167f, 0.917480f, 0.078003f, 0.921875f, 0.072632f,
+ 0.925781f, 0.066895f, 0.930664f, 0.061249f, 0.934570f, 0.055664f, 0.937500f, 0.048309f,
+ 0.940430f, 0.041870f, 0.943359f, 0.034607f, 0.945312f, 0.024429f, 0.944824f, 0.008392f,
+ 0.000000f, 1.000000f, 0.068909f, 0.969238f, 0.131470f, 0.927246f, 0.186523f, 0.884766f,
+ 0.235718f, 0.843262f, 0.278564f, 0.804688f, 0.318604f, 0.767578f, 0.355469f, 0.732422f,
+ 0.389648f, 0.698730f, 0.419922f, 0.667480f, 0.448975f, 0.637695f, 0.474854f, 0.609375f,
+ 0.500488f, 0.583008f, 0.521484f, 0.558105f, 0.545410f, 0.533691f, 0.565430f, 0.510742f,
+ 0.583984f, 0.489014f, 0.601562f, 0.468506f, 0.618652f, 0.448730f, 0.634766f, 0.429932f,
+ 0.650391f, 0.411377f, 0.665527f, 0.393799f, 0.679688f, 0.377197f, 0.693848f, 0.361328f,
+ 0.706055f, 0.346191f, 0.716797f, 0.332031f, 0.729004f, 0.317383f, 0.739746f, 0.304199f,
+ 0.750000f, 0.291260f, 0.761230f, 0.278076f, 0.771484f, 0.266113f, 0.779785f, 0.254639f,
+ 0.789062f, 0.243408f, 0.797852f, 0.232300f, 0.807129f, 0.221680f, 0.812988f, 0.212402f,
+ 0.823242f, 0.201660f, 0.829590f, 0.192871f, 0.837891f, 0.182861f, 0.845703f, 0.174561f,
+ 0.851074f, 0.166138f, 0.859375f, 0.157104f, 0.864258f, 0.149170f, 0.871094f, 0.141357f,
+ 0.875977f, 0.134155f, 0.882324f, 0.126831f, 0.888672f, 0.119995f, 0.895020f, 0.112488f,
+ 0.900391f, 0.105408f, 0.905762f, 0.098694f, 0.910156f, 0.092529f, 0.914551f, 0.086304f,
+ 0.919922f, 0.080200f, 0.924316f, 0.074646f, 0.928223f, 0.069153f, 0.932617f, 0.063721f,
+ 0.937500f, 0.058228f, 0.940918f, 0.052948f, 0.945312f, 0.047882f, 0.949219f, 0.042603f,
+ 0.951660f, 0.035553f, 0.955078f, 0.028717f, 0.957031f, 0.020462f, 0.957031f, 0.007118f,
+ 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.133423f, 0.925781f, 0.188354f, 0.883789f,
+ 0.238892f, 0.841797f, 0.282959f, 0.802246f, 0.323730f, 0.764160f, 0.362305f, 0.728027f,
+ 0.395264f, 0.694336f, 0.426514f, 0.662598f, 0.455811f, 0.632324f, 0.483398f, 0.603027f,
+ 0.507812f, 0.576172f, 0.533203f, 0.549805f, 0.553223f, 0.525879f, 0.574707f, 0.502930f,
+ 0.594727f, 0.480225f, 0.613281f, 0.458984f, 0.629883f, 0.438965f, 0.646484f, 0.419922f,
+ 0.662109f, 0.401611f, 0.678223f, 0.383545f, 0.692383f, 0.366699f, 0.704102f, 0.351074f,
+ 0.718262f, 0.335693f, 0.728516f, 0.321045f, 0.741699f, 0.306396f, 0.752441f, 0.292725f,
+ 0.764160f, 0.279541f, 0.772461f, 0.267578f, 0.782715f, 0.254883f, 0.792969f, 0.243408f,
+ 0.801270f, 0.232300f, 0.811035f, 0.221069f, 0.818359f, 0.211060f, 0.827637f, 0.200684f,
+ 0.834961f, 0.190918f, 0.842285f, 0.181763f, 0.850098f, 0.172485f, 0.857422f, 0.163452f,
+ 0.864746f, 0.154907f, 0.869141f, 0.147217f, 0.876953f, 0.139038f, 0.882812f, 0.131348f,
+ 0.889160f, 0.123474f, 0.895020f, 0.116455f, 0.899414f, 0.109741f, 0.905273f, 0.103210f,
+ 0.909668f, 0.097107f, 0.916016f, 0.089844f, 0.921387f, 0.083374f, 0.926758f, 0.077271f,
+ 0.930176f, 0.071411f, 0.935547f, 0.065491f, 0.938965f, 0.060455f, 0.944336f, 0.054901f,
+ 0.947754f, 0.049988f, 0.951660f, 0.044952f, 0.955078f, 0.040405f, 0.959473f, 0.035278f,
+ 0.962402f, 0.030823f, 0.965820f, 0.024307f, 0.968262f, 0.016586f, 0.969238f, 0.006050f,
+ 0.000000f, 1.000000f, 0.070435f, 0.968262f, 0.133301f, 0.926270f, 0.189941f, 0.882812f,
+ 0.241577f, 0.840332f, 0.286133f, 0.799805f, 0.327881f, 0.761230f, 0.366699f, 0.724609f,
+ 0.401855f, 0.689941f, 0.433838f, 0.657227f, 0.464355f, 0.625977f, 0.491211f, 0.597168f,
+ 0.518066f, 0.568848f, 0.541016f, 0.542969f, 0.564453f, 0.517578f, 0.585938f, 0.493896f,
+ 0.604492f, 0.471680f, 0.624023f, 0.449951f, 0.641113f, 0.429688f, 0.657715f, 0.410156f,
+ 0.674316f, 0.391357f, 0.688965f, 0.373779f, 0.703613f, 0.356689f, 0.716797f, 0.340576f,
+ 0.729980f, 0.324707f, 0.740723f, 0.310303f, 0.753906f, 0.295654f, 0.764160f, 0.282227f,
+ 0.774902f, 0.268799f, 0.786133f, 0.256104f, 0.794922f, 0.244141f, 0.803711f, 0.232910f,
+ 0.813477f, 0.221191f, 0.822266f, 0.210571f, 0.830566f, 0.200195f, 0.839355f, 0.189697f,
+ 0.846191f, 0.180420f, 0.854492f, 0.171021f, 0.862305f, 0.161743f, 0.868164f, 0.153564f,
+ 0.874023f, 0.145386f, 0.882812f, 0.136475f, 0.889160f, 0.128784f, 0.894043f, 0.121399f,
+ 0.898926f, 0.114563f, 0.905273f, 0.107117f, 0.910645f, 0.100281f, 0.916504f, 0.093262f,
+ 0.921387f, 0.087036f, 0.926758f, 0.080872f, 0.930176f, 0.075684f, 0.935547f, 0.069397f,
+ 0.940430f, 0.063232f, 0.945801f, 0.057404f, 0.949707f, 0.052155f, 0.953613f, 0.047241f,
+ 0.957031f, 0.042328f, 0.961426f, 0.037659f, 0.965332f, 0.032745f, 0.968750f, 0.028534f,
+ 0.972168f, 0.023834f, 0.976074f, 0.019577f, 0.978516f, 0.013664f, 0.980469f, 0.005028f,
+ 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.134644f, 0.925293f, 0.192261f, 0.881348f,
+ 0.243896f, 0.838379f, 0.290283f, 0.797363f, 0.333740f, 0.757812f, 0.372070f, 0.720703f,
+ 0.408936f, 0.685059f, 0.441406f, 0.651855f, 0.472412f, 0.620117f, 0.499756f, 0.590332f,
+ 0.525879f, 0.562012f, 0.550781f, 0.535156f, 0.573730f, 0.509766f, 0.594727f, 0.485840f,
+ 0.616211f, 0.462646f, 0.633789f, 0.441162f, 0.651855f, 0.420410f, 0.668945f, 0.400635f,
+ 0.684570f, 0.381836f, 0.700195f, 0.363770f, 0.714844f, 0.346436f, 0.728516f, 0.330078f,
+ 0.740234f, 0.314697f, 0.753906f, 0.299316f, 0.765625f, 0.285156f, 0.776367f, 0.271484f,
+ 0.787598f, 0.258057f, 0.796387f, 0.245850f, 0.806641f, 0.233643f, 0.816406f, 0.222046f,
+ 0.825684f, 0.210693f, 0.833984f, 0.199829f, 0.841797f, 0.190063f, 0.850098f, 0.179565f,
+ 0.858398f, 0.170288f, 0.865723f, 0.160889f, 0.873535f, 0.151611f, 0.878906f, 0.143677f,
+ 0.886719f, 0.135132f, 0.892090f, 0.127319f, 0.898926f, 0.119263f, 0.903809f, 0.112488f,
+ 0.911621f, 0.104736f, 0.916504f, 0.097778f, 0.922363f, 0.090942f, 0.925781f, 0.085022f,
+ 0.931641f, 0.078979f, 0.936523f, 0.072266f, 0.940918f, 0.066589f, 0.945801f, 0.060669f,
+ 0.949219f, 0.055847f, 0.953613f, 0.050964f, 0.958496f, 0.045593f, 0.962891f, 0.040070f,
+ 0.967285f, 0.034668f, 0.970703f, 0.030228f, 0.974609f, 0.025726f, 0.978516f, 0.021210f,
+ 0.981445f, 0.017456f, 0.985352f, 0.012962f, 0.988281f, 0.009377f, 0.991211f, 0.003784f,
+ 0.000000f, 1.000000f, 0.071289f, 0.967773f, 0.134644f, 0.925293f, 0.193848f, 0.880371f,
+ 0.246460f, 0.836914f, 0.293945f, 0.794922f, 0.338379f, 0.754883f, 0.377686f, 0.716797f,
+ 0.413574f, 0.681152f, 0.447998f, 0.646973f, 0.478027f, 0.614746f, 0.507324f, 0.583984f,
+ 0.536133f, 0.554688f, 0.558594f, 0.528320f, 0.583984f, 0.501465f, 0.604492f, 0.477783f,
+ 0.625977f, 0.454346f, 0.645020f, 0.432129f, 0.663086f, 0.411133f, 0.680176f, 0.391113f,
+ 0.695801f, 0.372314f, 0.710938f, 0.354248f, 0.724609f, 0.337402f, 0.738281f, 0.320312f,
+ 0.752930f, 0.303955f, 0.766602f, 0.288818f, 0.775879f, 0.275635f, 0.786621f, 0.261475f,
+ 0.799805f, 0.247559f, 0.807129f, 0.236450f, 0.817871f, 0.223389f, 0.829102f, 0.211426f,
+ 0.835449f, 0.201050f, 0.846191f, 0.189575f, 0.852051f, 0.180176f, 0.861816f, 0.169678f,
+ 0.868164f, 0.160645f, 0.876465f, 0.151367f, 0.882812f, 0.142578f, 0.889160f, 0.134155f,
+ 0.896484f, 0.125977f, 0.904785f, 0.117371f, 0.907715f, 0.111206f, 0.914551f, 0.103333f,
+ 0.920898f, 0.095520f, 0.924805f, 0.090332f, 0.931641f, 0.082886f, 0.936523f, 0.075745f,
+ 0.937988f, 0.072388f, 0.946289f, 0.064758f, 0.952637f, 0.057343f, 0.952637f, 0.054260f,
+ 0.958496f, 0.049530f, 0.968262f, 0.040955f, 0.968262f, 0.036835f, 0.968262f, 0.034943f,
+ 0.974609f, 0.030457f, 0.983887f, 0.021042f, 0.983887f, 0.018127f, 0.983887f, 0.016891f,
+ 0.983887f, 0.016220f, 0.999512f, 0.003506f, 0.999512f, 0.000325f, 0.999512f, 0.000003f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995605f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.992188f,
+ 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985352f,
+ 0.000000f, 0.983887f, 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.976562f,
+ 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.969727f, 0.000000f, 0.965820f,
+ 0.000000f, 0.963379f, 0.000000f, 0.959473f, 0.000000f, 0.957031f, 0.000000f, 0.952637f,
+ 0.000000f, 0.949219f, 0.000000f, 0.945312f, 0.000000f, 0.939941f, 0.000000f, 0.936035f,
+ 0.000000f, 0.931152f, 0.000000f, 0.925781f, 0.000000f, 0.920410f, 0.000000f, 0.915527f,
+ 0.000000f, 0.908691f, 0.000000f, 0.901855f, 0.000000f, 0.895020f, 0.000000f, 0.887695f,
+ 0.000000f, 0.879883f, 0.000000f, 0.871582f, 0.000000f, 0.862305f, 0.000000f, 0.852539f,
+ 0.000000f, 0.842285f, 0.000000f, 0.831543f, 0.000000f, 0.819824f, 0.000000f, 0.806152f,
+ 0.000000f, 0.792480f, 0.000000f, 0.776855f, 0.000000f, 0.761230f, 0.000000f, 0.742676f,
+ 0.000000f, 0.723145f, 0.000000f, 0.701172f, 0.000000f, 0.676758f, 0.000000f, 0.650391f,
+ 0.000000f, 0.620117f, 0.000000f, 0.585449f, 0.000000f, 0.544922f, 0.000000f, 0.498535f,
+ 0.000000f, 0.441650f, 0.000000f, 0.368652f, 0.000000f, 0.267822f, 0.000000f, 0.102722f,
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.992676f, 0.000000f, 0.991211f,
+ 0.000000f, 0.990723f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985352f,
+ 0.000000f, 0.983398f, 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.977051f,
+ 0.000000f, 0.974121f, 0.000000f, 0.972168f, 0.000000f, 0.969238f, 0.000000f, 0.966797f,
+ 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, 0.000000f, 0.952637f,
+ 0.000000f, 0.949219f, 0.000000f, 0.944824f, 0.000000f, 0.940430f, 0.000000f, 0.935547f,
+ 0.000000f, 0.931152f, 0.000000f, 0.925781f, 0.000000f, 0.919922f, 0.000000f, 0.915039f,
+ 0.000000f, 0.908691f, 0.000000f, 0.901855f, 0.000000f, 0.894531f, 0.000000f, 0.887207f,
+ 0.000000f, 0.879395f, 0.000000f, 0.871094f, 0.000000f, 0.861816f, 0.000000f, 0.852051f,
+ 0.000000f, 0.841797f, 0.000000f, 0.831055f, 0.000000f, 0.819336f, 0.000000f, 0.806152f,
+ 0.000000f, 0.792480f, 0.000000f, 0.776855f, 0.000000f, 0.760742f, 0.000000f, 0.742676f,
+ 0.000000f, 0.723145f, 0.000000f, 0.701172f, 0.000000f, 0.676758f, 0.000002f, 0.649902f,
+ 0.000005f, 0.620117f, 0.000005f, 0.584961f, 0.000005f, 0.544922f, 0.000004f, 0.498535f,
+ 0.000003f, 0.441406f, 0.000003f, 0.367920f, 0.000002f, 0.267578f, 0.000001f, 0.103210f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f,
+ 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.991211f,
+ 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.986816f, 0.000000f, 0.984863f,
+ 0.000000f, 0.983398f, 0.000000f, 0.980957f, 0.000000f, 0.979004f, 0.000000f, 0.976074f,
+ 0.000000f, 0.973633f, 0.000000f, 0.971680f, 0.000000f, 0.968750f, 0.000000f, 0.965820f,
+ 0.000000f, 0.962891f, 0.000000f, 0.959473f, 0.000000f, 0.955566f, 0.000000f, 0.952148f,
+ 0.000000f, 0.948242f, 0.000000f, 0.944336f, 0.000000f, 0.940430f, 0.000000f, 0.935059f,
+ 0.000000f, 0.930176f, 0.000000f, 0.925293f, 0.000000f, 0.919922f, 0.000001f, 0.914062f,
+ 0.000005f, 0.907715f, 0.000012f, 0.901367f, 0.000019f, 0.894043f, 0.000027f, 0.886719f,
+ 0.000035f, 0.878906f, 0.000045f, 0.870605f, 0.000054f, 0.861328f, 0.000062f, 0.851562f,
+ 0.000064f, 0.841309f, 0.000064f, 0.830078f, 0.000064f, 0.818848f, 0.000061f, 0.806152f,
+ 0.000058f, 0.791504f, 0.000055f, 0.776855f, 0.000050f, 0.759766f, 0.000046f, 0.742188f,
+ 0.000042f, 0.722656f, 0.000042f, 0.700684f, 0.000046f, 0.676270f, 0.000042f, 0.649414f,
+ 0.000038f, 0.620117f, 0.000037f, 0.584473f, 0.000032f, 0.544434f, 0.000030f, 0.498047f,
+ 0.000026f, 0.441162f, 0.000022f, 0.368164f, 0.000019f, 0.267334f, 0.000010f, 0.102539f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f,
+ 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f,
+ 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f,
+ 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.984375f,
+ 0.000003f, 0.982422f, 0.000012f, 0.980469f, 0.000022f, 0.978516f, 0.000036f, 0.975586f,
+ 0.000050f, 0.973633f, 0.000063f, 0.970703f, 0.000080f, 0.968262f, 0.000094f, 0.964844f,
+ 0.000107f, 0.961914f, 0.000124f, 0.958496f, 0.000139f, 0.955078f, 0.000153f, 0.951660f,
+ 0.000166f, 0.947754f, 0.000183f, 0.943359f, 0.000197f, 0.938965f, 0.000211f, 0.934082f,
+ 0.000222f, 0.929199f, 0.000230f, 0.924316f, 0.000232f, 0.918945f, 0.000230f, 0.912598f,
+ 0.000224f, 0.906738f, 0.000216f, 0.899902f, 0.000210f, 0.893066f, 0.000202f, 0.885254f,
+ 0.000191f, 0.877441f, 0.000182f, 0.869141f, 0.000180f, 0.860352f, 0.000180f, 0.850098f,
+ 0.000182f, 0.839844f, 0.000184f, 0.829102f, 0.000187f, 0.817871f, 0.000189f, 0.804688f,
+ 0.000175f, 0.790527f, 0.000168f, 0.775391f, 0.000165f, 0.758789f, 0.000168f, 0.740723f,
+ 0.000168f, 0.721680f, 0.000150f, 0.699707f, 0.000149f, 0.675293f, 0.000142f, 0.648926f,
+ 0.000145f, 0.618652f, 0.000124f, 0.583984f, 0.000121f, 0.543945f, 0.000115f, 0.497803f,
+ 0.000098f, 0.440186f, 0.000092f, 0.367920f, 0.000071f, 0.267090f, 0.000031f, 0.102356f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000001f, 0.998047f, 0.000025f, 0.997559f, 0.000063f, 0.996094f, 0.000091f, 0.995117f,
+ 0.000127f, 0.994141f, 0.000159f, 0.992676f, 0.000184f, 0.991699f, 0.000213f, 0.990234f,
+ 0.000244f, 0.988770f, 0.000268f, 0.986816f, 0.000287f, 0.985352f, 0.000311f, 0.983887f,
+ 0.000338f, 0.981934f, 0.000360f, 0.979492f, 0.000377f, 0.977539f, 0.000392f, 0.975098f,
+ 0.000415f, 0.972168f, 0.000437f, 0.969727f, 0.000454f, 0.967285f, 0.000469f, 0.963867f,
+ 0.000481f, 0.960938f, 0.000495f, 0.957520f, 0.000501f, 0.954102f, 0.000497f, 0.950195f,
+ 0.000487f, 0.946777f, 0.000476f, 0.941895f, 0.000469f, 0.937500f, 0.000468f, 0.933105f,
+ 0.000470f, 0.927734f, 0.000473f, 0.922852f, 0.000474f, 0.917480f, 0.000476f, 0.911133f,
+ 0.000478f, 0.905273f, 0.000470f, 0.898438f, 0.000479f, 0.891602f, 0.000485f, 0.883789f,
+ 0.000486f, 0.876465f, 0.000486f, 0.867676f, 0.000487f, 0.858398f, 0.000466f, 0.849121f,
+ 0.000467f, 0.838379f, 0.000468f, 0.827637f, 0.000468f, 0.816406f, 0.000463f, 0.803223f,
+ 0.000435f, 0.788574f, 0.000437f, 0.773926f, 0.000432f, 0.757324f, 0.000427f, 0.739746f,
+ 0.000419f, 0.720215f, 0.000387f, 0.698242f, 0.000385f, 0.674316f, 0.000373f, 0.647461f,
+ 0.000362f, 0.617676f, 0.000329f, 0.583008f, 0.000320f, 0.542969f, 0.000300f, 0.497559f,
+ 0.000266f, 0.440186f, 0.000244f, 0.367920f, 0.000195f, 0.267334f, 0.000071f, 0.102478f,
+ 0.000000f, 1.000000f, 0.000163f, 0.999512f, 0.000284f, 0.999023f, 0.000322f, 0.998535f,
+ 0.000390f, 0.997559f, 0.000446f, 0.996582f, 0.000468f, 0.996094f, 0.000480f, 0.995117f,
+ 0.000559f, 0.993164f, 0.000587f, 0.992676f, 0.000602f, 0.991211f, 0.000611f, 0.989746f,
+ 0.000666f, 0.988281f, 0.000695f, 0.986328f, 0.000711f, 0.984863f, 0.000721f, 0.982910f,
+ 0.000727f, 0.980957f, 0.000771f, 0.978516f, 0.000804f, 0.976074f, 0.000835f, 0.973633f,
+ 0.000859f, 0.971680f, 0.000866f, 0.968750f, 0.000858f, 0.965820f, 0.000897f, 0.962402f,
+ 0.000907f, 0.959473f, 0.000910f, 0.956055f, 0.000895f, 0.952148f, 0.000893f, 0.949219f,
+ 0.000887f, 0.944824f, 0.000919f, 0.940918f, 0.000936f, 0.935547f, 0.000953f, 0.931641f,
+ 0.000932f, 0.926270f, 0.000944f, 0.920898f, 0.000958f, 0.916016f, 0.000992f, 0.909668f,
+ 0.001000f, 0.903320f, 0.000954f, 0.896484f, 0.000952f, 0.889648f, 0.000958f, 0.882324f,
+ 0.000962f, 0.874023f, 0.000989f, 0.865723f, 0.000987f, 0.856934f, 0.000939f, 0.846680f,
+ 0.000939f, 0.836426f, 0.000934f, 0.825684f, 0.000918f, 0.813965f, 0.000944f, 0.800781f,
+ 0.000895f, 0.786621f, 0.000877f, 0.771973f, 0.000869f, 0.755371f, 0.000849f, 0.738281f,
+ 0.000871f, 0.718750f, 0.000816f, 0.696289f, 0.000781f, 0.672852f, 0.000767f, 0.646484f,
+ 0.000762f, 0.616699f, 0.000692f, 0.581543f, 0.000667f, 0.541992f, 0.000639f, 0.496582f,
+ 0.000575f, 0.439209f, 0.000523f, 0.367188f, 0.000407f, 0.267578f, 0.000128f, 0.101868f,
+ 0.000000f, 1.000000f, 0.000358f, 0.999512f, 0.000612f, 0.998535f, 0.000588f, 0.998535f,
+ 0.000780f, 0.997070f, 0.000782f, 0.996582f, 0.000771f, 0.995605f, 0.000897f, 0.994629f,
+ 0.000930f, 0.993164f, 0.000935f, 0.991211f, 0.000952f, 0.990723f, 0.000975f, 0.988770f,
+ 0.001143f, 0.987305f, 0.001187f, 0.985352f, 0.001217f, 0.983398f, 0.001245f, 0.981934f,
+ 0.001275f, 0.979980f, 0.001399f, 0.977051f, 0.001397f, 0.974609f, 0.001397f, 0.972168f,
+ 0.001394f, 0.969727f, 0.001391f, 0.967773f, 0.001451f, 0.963867f, 0.001482f, 0.960938f,
+ 0.001512f, 0.958008f, 0.001531f, 0.954102f, 0.001549f, 0.950684f, 0.001515f, 0.946777f,
+ 0.001597f, 0.943359f, 0.001645f, 0.938477f, 0.001668f, 0.933594f, 0.001675f, 0.929199f,
+ 0.001617f, 0.924316f, 0.001619f, 0.918945f, 0.001625f, 0.913574f, 0.001703f, 0.907227f,
+ 0.001728f, 0.900879f, 0.001737f, 0.894043f, 0.001659f, 0.887207f, 0.001665f, 0.879883f,
+ 0.001655f, 0.872070f, 0.001730f, 0.863281f, 0.001733f, 0.854004f, 0.001653f, 0.843750f,
+ 0.001659f, 0.833984f, 0.001629f, 0.823242f, 0.001668f, 0.811523f, 0.001670f, 0.798828f,
+ 0.001593f, 0.784180f, 0.001596f, 0.770020f, 0.001554f, 0.752930f, 0.001526f, 0.735840f,
+ 0.001560f, 0.716309f, 0.001481f, 0.694824f, 0.001433f, 0.670898f, 0.001390f, 0.644043f,
+ 0.001403f, 0.614746f, 0.001324f, 0.580566f, 0.001235f, 0.541016f, 0.001184f, 0.496094f,
+ 0.001082f, 0.438721f, 0.000964f, 0.367188f, 0.000731f, 0.266357f, 0.000206f, 0.101624f,
+ 0.000000f, 1.000000f, 0.000436f, 0.999512f, 0.000781f, 0.998535f, 0.000744f, 0.997559f,
+ 0.001057f, 0.996582f, 0.001103f, 0.995605f, 0.001136f, 0.994629f, 0.001171f, 0.994141f,
+ 0.001474f, 0.992188f, 0.001503f, 0.990723f, 0.001531f, 0.989258f, 0.001568f, 0.987793f,
+ 0.001811f, 0.985840f, 0.001837f, 0.984375f, 0.001862f, 0.982422f, 0.001885f, 0.980469f,
+ 0.001904f, 0.978516f, 0.002110f, 0.975586f, 0.002098f, 0.973145f, 0.002125f, 0.970703f,
+ 0.002155f, 0.967773f, 0.002172f, 0.965332f, 0.002342f, 0.962402f, 0.002340f, 0.958496f,
+ 0.002382f, 0.955566f, 0.002436f, 0.952148f, 0.002466f, 0.948242f, 0.002483f, 0.944824f,
+ 0.002539f, 0.940430f, 0.002563f, 0.936035f, 0.002596f, 0.931152f, 0.002623f, 0.926270f,
+ 0.002653f, 0.921387f, 0.002586f, 0.916504f, 0.002697f, 0.910645f, 0.002726f, 0.904785f,
+ 0.002726f, 0.897949f, 0.002762f, 0.891113f, 0.002682f, 0.884277f, 0.002682f, 0.876953f,
+ 0.002764f, 0.869141f, 0.002762f, 0.860352f, 0.002775f, 0.851074f, 0.002785f, 0.841309f,
+ 0.002693f, 0.831055f, 0.002645f, 0.820312f, 0.002720f, 0.808594f, 0.002716f, 0.794922f,
+ 0.002718f, 0.781738f, 0.002617f, 0.766602f, 0.002560f, 0.750488f, 0.002514f, 0.733398f,
+ 0.002567f, 0.713867f, 0.002470f, 0.692383f, 0.002403f, 0.668457f, 0.002317f, 0.642578f,
+ 0.002331f, 0.612793f, 0.002230f, 0.578613f, 0.002100f, 0.539551f, 0.001986f, 0.495117f,
+ 0.001828f, 0.437744f, 0.001591f, 0.366455f, 0.001179f, 0.266602f, 0.000311f, 0.100708f,
+ 0.000000f, 1.000000f, 0.000562f, 0.999023f, 0.001087f, 0.998047f, 0.001167f, 0.997559f,
+ 0.001545f, 0.996582f, 0.001648f, 0.995117f, 0.001674f, 0.994141f, 0.001679f, 0.993164f,
+ 0.002090f, 0.991211f, 0.002174f, 0.990234f, 0.002226f, 0.988281f, 0.002283f, 0.986328f,
+ 0.002634f, 0.984863f, 0.002668f, 0.982422f, 0.002708f, 0.980469f, 0.002739f, 0.979004f,
+ 0.002733f, 0.976562f, 0.003048f, 0.973633f, 0.003136f, 0.971191f, 0.003130f, 0.968750f,
+ 0.003168f, 0.965820f, 0.003208f, 0.963379f, 0.003485f, 0.959961f, 0.003578f, 0.956543f,
+ 0.003546f, 0.952637f, 0.003571f, 0.949707f, 0.003595f, 0.946289f, 0.003649f, 0.942383f,
+ 0.003769f, 0.937500f, 0.003860f, 0.933105f, 0.003901f, 0.928223f, 0.003929f, 0.923828f,
+ 0.003929f, 0.918457f, 0.003866f, 0.913086f, 0.004047f, 0.907227f, 0.004105f, 0.900879f,
+ 0.004093f, 0.895020f, 0.004139f, 0.887695f, 0.004177f, 0.881348f, 0.004047f, 0.873535f,
+ 0.004208f, 0.865723f, 0.004192f, 0.856445f, 0.004234f, 0.847656f, 0.004219f, 0.837891f,
+ 0.004108f, 0.827637f, 0.004116f, 0.817383f, 0.004177f, 0.805176f, 0.004166f, 0.791992f,
+ 0.004154f, 0.777832f, 0.004036f, 0.763184f, 0.003960f, 0.747559f, 0.003979f, 0.729980f,
+ 0.003979f, 0.710449f, 0.003859f, 0.689453f, 0.003752f, 0.665527f, 0.003664f, 0.640137f,
+ 0.003653f, 0.610840f, 0.003494f, 0.576660f, 0.003300f, 0.537598f, 0.003094f, 0.493896f,
+ 0.002893f, 0.437256f, 0.002426f, 0.366211f, 0.001757f, 0.265869f, 0.000430f, 0.100830f,
+ 0.000000f, 1.000000f, 0.000334f, 0.999512f, 0.001054f, 0.998047f, 0.001493f, 0.997070f,
+ 0.001719f, 0.995605f, 0.002230f, 0.994141f, 0.002279f, 0.993652f, 0.002474f, 0.991699f,
+ 0.002930f, 0.990234f, 0.002981f, 0.988770f, 0.003071f, 0.987305f, 0.003239f, 0.985352f,
+ 0.003639f, 0.982910f, 0.003712f, 0.980957f, 0.003738f, 0.978516f, 0.003807f, 0.977051f,
+ 0.003975f, 0.975098f, 0.004288f, 0.971680f, 0.004372f, 0.968750f, 0.004478f, 0.966309f,
+ 0.004475f, 0.963867f, 0.004536f, 0.960938f, 0.004906f, 0.957031f, 0.004997f, 0.953613f,
+ 0.004993f, 0.950195f, 0.005058f, 0.946289f, 0.005131f, 0.942871f, 0.005177f, 0.939453f,
+ 0.005489f, 0.934570f, 0.005463f, 0.929688f, 0.005554f, 0.924805f, 0.005608f, 0.919922f,
+ 0.005676f, 0.915527f, 0.005661f, 0.909668f, 0.005836f, 0.903809f, 0.005894f, 0.896973f,
+ 0.005974f, 0.890625f, 0.005943f, 0.884277f, 0.005997f, 0.876953f, 0.005852f, 0.869629f,
+ 0.006119f, 0.861328f, 0.006168f, 0.852539f, 0.006149f, 0.843750f, 0.006111f, 0.833984f,
+ 0.006023f, 0.823730f, 0.006008f, 0.813477f, 0.006111f, 0.800781f, 0.006161f, 0.787598f,
+ 0.006119f, 0.774414f, 0.005974f, 0.759766f, 0.005947f, 0.744629f, 0.005978f, 0.726562f,
+ 0.005928f, 0.707031f, 0.005718f, 0.686035f, 0.005585f, 0.663086f, 0.005436f, 0.637695f,
+ 0.005413f, 0.607910f, 0.005184f, 0.574707f, 0.004887f, 0.536133f, 0.004562f, 0.492432f,
+ 0.004215f, 0.435303f, 0.003492f, 0.365723f, 0.002497f, 0.265625f, 0.000574f, 0.100403f,
+ 0.000000f, 1.000000f, 0.000472f, 0.999023f, 0.001438f, 0.997559f, 0.002029f, 0.996582f,
+ 0.002350f, 0.994629f, 0.002920f, 0.993652f, 0.003023f, 0.992676f, 0.003340f, 0.990723f,
+ 0.003897f, 0.988770f, 0.004021f, 0.987305f, 0.004108f, 0.985840f, 0.004410f, 0.983887f,
+ 0.004959f, 0.981445f, 0.005058f, 0.979004f, 0.005089f, 0.976562f, 0.005119f, 0.974609f,
+ 0.005417f, 0.972168f, 0.005920f, 0.969727f, 0.005951f, 0.966309f, 0.006046f, 0.963379f,
+ 0.006165f, 0.960938f, 0.006268f, 0.958008f, 0.006714f, 0.954102f, 0.006840f, 0.950195f,
+ 0.006977f, 0.947266f, 0.006966f, 0.943359f, 0.006981f, 0.939453f, 0.007202f, 0.935547f,
+ 0.007645f, 0.930664f, 0.007660f, 0.926270f, 0.007641f, 0.920898f, 0.007767f, 0.916504f,
+ 0.007809f, 0.911133f, 0.007881f, 0.906250f, 0.008125f, 0.899414f, 0.008232f, 0.893066f,
+ 0.008293f, 0.886230f, 0.008392f, 0.879883f, 0.008324f, 0.873047f, 0.008263f, 0.865723f,
+ 0.008553f, 0.856445f, 0.008675f, 0.848145f, 0.008606f, 0.838867f, 0.008652f, 0.829590f,
+ 0.008492f, 0.819336f, 0.008453f, 0.809082f, 0.008789f, 0.796387f, 0.008720f, 0.783203f,
+ 0.008652f, 0.770508f, 0.008461f, 0.755859f, 0.008423f, 0.740234f, 0.008492f, 0.722168f,
+ 0.008423f, 0.703125f, 0.008331f, 0.682617f, 0.008049f, 0.659668f, 0.007721f, 0.635254f,
+ 0.007732f, 0.605469f, 0.007339f, 0.572266f, 0.006920f, 0.534668f, 0.006493f, 0.490723f,
+ 0.005875f, 0.434326f, 0.004822f, 0.365234f, 0.003347f, 0.265625f, 0.000737f, 0.099487f,
+ 0.000000f, 1.000000f, 0.000788f, 0.999023f, 0.001456f, 0.997559f, 0.002056f, 0.996094f,
+ 0.003193f, 0.994141f, 0.003294f, 0.993164f, 0.003887f, 0.991699f, 0.004456f, 0.989258f,
+ 0.004616f, 0.987305f, 0.005211f, 0.985840f, 0.005360f, 0.984375f, 0.005871f, 0.981445f,
+ 0.006081f, 0.979492f, 0.006680f, 0.977051f, 0.006763f, 0.975098f, 0.006824f, 0.972168f,
+ 0.007336f, 0.969238f, 0.007793f, 0.966309f, 0.007996f, 0.963867f, 0.008034f, 0.960938f,
+ 0.008163f, 0.958008f, 0.008591f, 0.954590f, 0.008636f, 0.950684f, 0.009171f, 0.947266f,
+ 0.009262f, 0.943359f, 0.009415f, 0.939453f, 0.009445f, 0.936035f, 0.009689f, 0.931152f,
+ 0.010193f, 0.926270f, 0.010422f, 0.921875f, 0.010239f, 0.916504f, 0.010422f, 0.911621f,
+ 0.010582f, 0.907227f, 0.010811f, 0.900879f, 0.011162f, 0.895020f, 0.011177f, 0.888184f,
+ 0.011299f, 0.881836f, 0.011360f, 0.875000f, 0.011337f, 0.868164f, 0.011528f, 0.860840f,
+ 0.011803f, 0.852051f, 0.011810f, 0.842773f, 0.011841f, 0.833984f, 0.011818f, 0.824707f,
+ 0.011780f, 0.814941f, 0.011787f, 0.804199f, 0.012024f, 0.791016f, 0.011925f, 0.778320f,
+ 0.011841f, 0.765137f, 0.011696f, 0.750488f, 0.011627f, 0.736328f, 0.011749f, 0.718262f,
+ 0.011559f, 0.698730f, 0.011452f, 0.678711f, 0.011124f, 0.656250f, 0.010750f, 0.632324f,
+ 0.010605f, 0.602051f, 0.010086f, 0.569336f, 0.009506f, 0.532715f, 0.008842f, 0.488770f,
+ 0.007866f, 0.433105f, 0.006378f, 0.364014f, 0.004341f, 0.264893f, 0.000914f, 0.099304f,
+ 0.000000f, 1.000000f, 0.001091f, 0.999023f, 0.002075f, 0.997559f, 0.002211f, 0.996582f,
+ 0.003613f, 0.994141f, 0.004295f, 0.992188f, 0.004448f, 0.990723f, 0.005737f, 0.987793f,
+ 0.005981f, 0.985840f, 0.006618f, 0.983887f, 0.006832f, 0.982422f, 0.007587f, 0.979492f,
+ 0.007866f, 0.977051f, 0.008545f, 0.974609f, 0.008766f, 0.972656f, 0.009003f, 0.969727f,
+ 0.009537f, 0.966309f, 0.009811f, 0.963379f, 0.010338f, 0.959961f, 0.010597f, 0.957520f,
+ 0.010696f, 0.954590f, 0.011238f, 0.950195f, 0.011566f, 0.946777f, 0.011963f, 0.942871f,
+ 0.012199f, 0.938965f, 0.012314f, 0.935547f, 0.012581f, 0.932129f, 0.013023f, 0.926758f,
+ 0.013382f, 0.921387f, 0.013657f, 0.916992f, 0.013939f, 0.912109f, 0.013710f, 0.906738f,
+ 0.013931f, 0.901855f, 0.014526f, 0.895996f, 0.014885f, 0.889160f, 0.015030f, 0.882812f,
+ 0.014931f, 0.876465f, 0.015053f, 0.870117f, 0.015160f, 0.862793f, 0.015488f, 0.854492f,
+ 0.015686f, 0.846191f, 0.015747f, 0.837402f, 0.015915f, 0.828613f, 0.015762f, 0.818848f,
+ 0.015778f, 0.809082f, 0.015854f, 0.797852f, 0.016068f, 0.785645f, 0.016037f, 0.772949f,
+ 0.016052f, 0.760254f, 0.015930f, 0.746582f, 0.015656f, 0.731445f, 0.015717f, 0.712891f,
+ 0.015579f, 0.694336f, 0.015274f, 0.674316f, 0.014870f, 0.652832f, 0.014488f, 0.627930f,
+ 0.014114f, 0.598145f, 0.013412f, 0.566406f, 0.012589f, 0.530273f, 0.011642f, 0.486328f,
+ 0.010262f, 0.431396f, 0.008263f, 0.364258f, 0.005493f, 0.263916f, 0.001109f, 0.098450f,
+ 0.000000f, 1.000000f, 0.000887f, 0.999023f, 0.002274f, 0.997070f, 0.002935f, 0.995605f,
+ 0.004227f, 0.993164f, 0.005424f, 0.991211f, 0.005623f, 0.989746f, 0.006866f, 0.986816f,
+ 0.007545f, 0.984375f, 0.007835f, 0.982422f, 0.008629f, 0.979980f, 0.009605f, 0.976562f,
+ 0.009987f, 0.974121f, 0.010300f, 0.972168f, 0.011017f, 0.969727f, 0.011658f, 0.966309f,
+ 0.012405f, 0.963379f, 0.012512f, 0.959961f, 0.013245f, 0.957031f, 0.013420f, 0.953613f,
+ 0.014008f, 0.950195f, 0.014595f, 0.946289f, 0.014938f, 0.942383f, 0.015572f, 0.938477f,
+ 0.015671f, 0.934570f, 0.016022f, 0.931152f, 0.016342f, 0.926270f, 0.017090f, 0.921387f,
+ 0.017593f, 0.916504f, 0.017731f, 0.911133f, 0.018051f, 0.906738f, 0.018311f, 0.902344f,
+ 0.018265f, 0.895996f, 0.018906f, 0.889648f, 0.019638f, 0.883789f, 0.019684f, 0.876953f,
+ 0.019699f, 0.870605f, 0.019760f, 0.863770f, 0.019989f, 0.857422f, 0.020355f, 0.848633f,
+ 0.020813f, 0.839844f, 0.020859f, 0.831055f, 0.020889f, 0.822754f, 0.021042f, 0.813965f,
+ 0.020935f, 0.803711f, 0.020981f, 0.791992f, 0.021332f, 0.779785f, 0.021301f, 0.767578f,
+ 0.021164f, 0.754883f, 0.020874f, 0.741211f, 0.020737f, 0.725098f, 0.020935f, 0.708008f,
+ 0.020584f, 0.689453f, 0.020172f, 0.669922f, 0.019409f, 0.648438f, 0.019043f, 0.623535f,
+ 0.018585f, 0.594727f, 0.017471f, 0.563477f, 0.016266f, 0.527832f, 0.015045f, 0.483643f,
+ 0.013084f, 0.430176f, 0.010391f, 0.363281f, 0.006832f, 0.263428f, 0.001331f, 0.098022f,
+ 0.000000f, 1.000000f, 0.001259f, 0.998535f, 0.003033f, 0.996582f, 0.003775f, 0.995117f,
+ 0.004944f, 0.992188f, 0.006237f, 0.990234f, 0.007256f, 0.987793f, 0.008118f, 0.984863f,
+ 0.009392f, 0.981934f, 0.009758f, 0.980469f, 0.010361f, 0.977539f, 0.011642f, 0.974121f,
+ 0.012421f, 0.971680f, 0.012856f, 0.968750f, 0.013634f, 0.966309f, 0.014641f, 0.962402f,
+ 0.015503f, 0.958984f, 0.015991f, 0.956055f, 0.016663f, 0.953125f, 0.016922f, 0.949707f,
+ 0.017654f, 0.945312f, 0.018555f, 0.940918f, 0.018921f, 0.937500f, 0.019653f, 0.933594f,
+ 0.020020f, 0.929688f, 0.020142f, 0.925781f, 0.021118f, 0.920410f, 0.021744f, 0.915527f,
+ 0.022202f, 0.910645f, 0.022766f, 0.905762f, 0.023041f, 0.901367f, 0.023315f, 0.895996f,
+ 0.023865f, 0.889648f, 0.024246f, 0.882812f, 0.025085f, 0.876953f, 0.025406f, 0.870605f,
+ 0.025391f, 0.864258f, 0.025574f, 0.857910f, 0.026077f, 0.850098f, 0.026520f, 0.841797f,
+ 0.027039f, 0.833496f, 0.026947f, 0.824707f, 0.027023f, 0.815918f, 0.027145f, 0.807129f,
+ 0.027176f, 0.796387f, 0.027832f, 0.785645f, 0.027771f, 0.773438f, 0.027725f, 0.761230f,
+ 0.027512f, 0.748535f, 0.027176f, 0.735840f, 0.027298f, 0.719238f, 0.027191f, 0.702148f,
+ 0.026810f, 0.684570f, 0.026154f, 0.665039f, 0.025360f, 0.644531f, 0.024689f, 0.619141f,
+ 0.023865f, 0.590820f, 0.022659f, 0.560547f, 0.020828f, 0.525391f, 0.019165f, 0.481445f,
+ 0.016571f, 0.427979f, 0.012985f, 0.362305f, 0.008476f, 0.262939f, 0.001597f, 0.097290f,
+ 0.000000f, 1.000000f, 0.001215f, 0.998535f, 0.002966f, 0.996582f, 0.004471f, 0.994141f,
+ 0.006348f, 0.991211f, 0.006783f, 0.989258f, 0.008652f, 0.986328f, 0.010139f, 0.982910f,
+ 0.010628f, 0.980957f, 0.011955f, 0.978027f, 0.012970f, 0.974121f, 0.013916f, 0.971191f,
+ 0.015312f, 0.967773f, 0.015778f, 0.965332f, 0.016647f, 0.962402f, 0.018127f, 0.958008f,
+ 0.019104f, 0.954590f, 0.019699f, 0.951660f, 0.020248f, 0.948730f, 0.021149f, 0.944824f,
+ 0.022171f, 0.939941f, 0.022995f, 0.935547f, 0.023636f, 0.932129f, 0.024063f, 0.928223f,
+ 0.025055f, 0.924316f, 0.025681f, 0.919434f, 0.026321f, 0.914062f, 0.027374f, 0.909180f,
+ 0.027756f, 0.904297f, 0.028427f, 0.899414f, 0.028946f, 0.894531f, 0.029587f, 0.888672f,
+ 0.030380f, 0.882324f, 0.030975f, 0.876465f, 0.031433f, 0.869629f, 0.032043f, 0.863770f,
+ 0.032440f, 0.857910f, 0.032379f, 0.850586f, 0.033142f, 0.842285f, 0.033813f, 0.833984f,
+ 0.034424f, 0.825684f, 0.034698f, 0.817871f, 0.034424f, 0.809082f, 0.034393f, 0.800293f,
+ 0.035187f, 0.789062f, 0.035370f, 0.778320f, 0.035187f, 0.766113f, 0.035187f, 0.754395f,
+ 0.035034f, 0.742676f, 0.034882f, 0.729004f, 0.034790f, 0.712891f, 0.034607f, 0.695801f,
+ 0.034119f, 0.678711f, 0.033356f, 0.660156f, 0.032043f, 0.640137f, 0.031403f, 0.614258f,
+ 0.030273f, 0.586914f, 0.028503f, 0.557129f, 0.026123f, 0.522461f, 0.024094f, 0.478516f,
+ 0.020691f, 0.426514f, 0.016129f, 0.361816f, 0.010269f, 0.261963f, 0.001909f, 0.096802f,
+ 0.000000f, 1.000000f, 0.001688f, 0.998535f, 0.003967f, 0.996094f, 0.005096f, 0.993652f,
+ 0.007088f, 0.990723f, 0.008499f, 0.987793f, 0.009575f, 0.984863f, 0.011612f, 0.981445f,
+ 0.013092f, 0.978516f, 0.014122f, 0.975586f, 0.016022f, 0.971191f, 0.017105f, 0.967773f,
+ 0.018188f, 0.964844f, 0.019211f, 0.961914f, 0.020569f, 0.957520f, 0.021713f, 0.953613f,
+ 0.022903f, 0.950195f, 0.024002f, 0.946777f, 0.024643f, 0.943848f, 0.025986f, 0.938965f,
+ 0.027405f, 0.934570f, 0.028336f, 0.930176f, 0.029129f, 0.926270f, 0.029633f, 0.922363f,
+ 0.030853f, 0.918457f, 0.031982f, 0.912598f, 0.032776f, 0.907227f, 0.033752f, 0.901855f,
+ 0.034393f, 0.897461f, 0.035217f, 0.892578f, 0.035645f, 0.887207f, 0.037079f, 0.880859f,
+ 0.038025f, 0.874512f, 0.038635f, 0.868164f, 0.039124f, 0.862793f, 0.039490f, 0.855957f,
+ 0.040222f, 0.850098f, 0.040802f, 0.842285f, 0.041626f, 0.833984f, 0.042206f, 0.826172f,
+ 0.042755f, 0.817871f, 0.042786f, 0.810059f, 0.042999f, 0.801758f, 0.043488f, 0.791992f,
+ 0.044128f, 0.781250f, 0.044067f, 0.770020f, 0.044434f, 0.759277f, 0.044220f, 0.747559f,
+ 0.044037f, 0.736328f, 0.043915f, 0.721680f, 0.043518f, 0.705566f, 0.043243f, 0.689453f,
+ 0.042297f, 0.672363f, 0.041443f, 0.655273f, 0.040222f, 0.634277f, 0.039429f, 0.608887f,
+ 0.037537f, 0.582520f, 0.035492f, 0.553711f, 0.032471f, 0.520508f, 0.029556f, 0.475342f,
+ 0.025238f, 0.425049f, 0.019531f, 0.361572f, 0.012436f, 0.261719f, 0.002287f, 0.096252f,
+ 0.000000f, 1.000000f, 0.002026f, 0.998535f, 0.004211f, 0.995605f, 0.006321f, 0.992676f,
+ 0.008430f, 0.989258f, 0.009537f, 0.987305f, 0.012123f, 0.982910f, 0.013802f, 0.979004f,
+ 0.014915f, 0.976074f, 0.017014f, 0.972168f, 0.019089f, 0.967773f, 0.020798f, 0.964355f,
+ 0.021545f, 0.960938f, 0.023483f, 0.957031f, 0.025116f, 0.952637f, 0.026413f, 0.948730f,
+ 0.027725f, 0.944824f, 0.028946f, 0.941406f, 0.030060f, 0.937500f, 0.031647f, 0.932617f,
+ 0.033417f, 0.927734f, 0.034393f, 0.924316f, 0.035156f, 0.919434f, 0.036041f, 0.915527f,
+ 0.037323f, 0.910156f, 0.039398f, 0.904785f, 0.040192f, 0.899902f, 0.041321f, 0.895020f,
+ 0.041809f, 0.889648f, 0.042908f, 0.885254f, 0.044250f, 0.878906f, 0.045258f, 0.872070f,
+ 0.046509f, 0.866211f, 0.047211f, 0.860352f, 0.047852f, 0.854492f, 0.048523f, 0.848145f,
+ 0.049225f, 0.840820f, 0.050781f, 0.833496f, 0.050842f, 0.824707f, 0.051666f, 0.817383f,
+ 0.052246f, 0.810059f, 0.052795f, 0.802246f, 0.052704f, 0.793457f, 0.053589f, 0.782715f,
+ 0.054291f, 0.772461f, 0.054321f, 0.762207f, 0.054626f, 0.751465f, 0.053680f, 0.740234f,
+ 0.053711f, 0.728516f, 0.053711f, 0.713379f, 0.053680f, 0.698730f, 0.053070f, 0.683105f,
+ 0.051941f, 0.666504f, 0.050507f, 0.649414f, 0.049438f, 0.627441f, 0.048187f, 0.603516f,
+ 0.045776f, 0.577637f, 0.042877f, 0.549805f, 0.039459f, 0.516602f, 0.035889f, 0.472656f,
+ 0.030350f, 0.422607f, 0.023346f, 0.361084f, 0.014725f, 0.261230f, 0.002661f, 0.095459f,
+ 0.000000f, 1.000000f, 0.002241f, 0.998047f, 0.004997f, 0.995117f, 0.007359f, 0.991699f,
+ 0.009644f, 0.988281f, 0.011307f, 0.985352f, 0.014214f, 0.980957f, 0.016434f, 0.976562f,
+ 0.017715f, 0.973633f, 0.019943f, 0.968750f, 0.021881f, 0.964844f, 0.024170f, 0.960449f,
+ 0.025940f, 0.957031f, 0.027649f, 0.952148f, 0.030365f, 0.947266f, 0.031433f, 0.943359f,
+ 0.032806f, 0.939453f, 0.034180f, 0.936035f, 0.036652f, 0.930176f, 0.038208f, 0.925781f,
+ 0.039703f, 0.921387f, 0.041199f, 0.916992f, 0.042603f, 0.912598f, 0.043945f, 0.907227f,
+ 0.045563f, 0.901855f, 0.047302f, 0.895996f, 0.048462f, 0.891602f, 0.049683f, 0.886719f,
+ 0.050537f, 0.882324f, 0.051666f, 0.875977f, 0.053680f, 0.869141f, 0.055054f, 0.863281f,
+ 0.055908f, 0.856934f, 0.056885f, 0.851074f, 0.057587f, 0.845703f, 0.058746f, 0.838867f,
+ 0.060211f, 0.831055f, 0.061005f, 0.823242f, 0.062225f, 0.816406f, 0.062103f, 0.808105f,
+ 0.063232f, 0.801270f, 0.063416f, 0.793457f, 0.064331f, 0.783203f, 0.065002f, 0.773438f,
+ 0.065308f, 0.763184f, 0.065430f, 0.753418f, 0.065491f, 0.743164f, 0.065002f, 0.732910f,
+ 0.065308f, 0.719238f, 0.065125f, 0.705566f, 0.064575f, 0.691406f, 0.063660f, 0.675781f,
+ 0.062469f, 0.660156f, 0.060822f, 0.643555f, 0.059601f, 0.621094f, 0.057831f, 0.598145f,
+ 0.054871f, 0.573242f, 0.051208f, 0.545898f, 0.047241f, 0.511719f, 0.042572f, 0.469727f,
+ 0.036285f, 0.421387f, 0.027420f, 0.360107f, 0.017288f, 0.260986f, 0.003103f, 0.094543f,
+ 0.000000f, 1.000000f, 0.002699f, 0.997559f, 0.006077f, 0.994629f, 0.009171f, 0.990234f,
+ 0.011162f, 0.986816f, 0.013596f, 0.982910f, 0.016663f, 0.978516f, 0.019119f, 0.974121f,
+ 0.021225f, 0.970215f, 0.024506f, 0.964844f, 0.026108f, 0.960938f, 0.028091f, 0.957031f,
+ 0.030945f, 0.951660f, 0.033508f, 0.946289f, 0.035614f, 0.941895f, 0.037628f, 0.937500f,
+ 0.039154f, 0.933105f, 0.041046f, 0.928223f, 0.044006f, 0.922363f, 0.045685f, 0.917480f,
+ 0.047302f, 0.913574f, 0.048950f, 0.909180f, 0.051056f, 0.904297f, 0.053192f, 0.898438f,
+ 0.054688f, 0.893066f, 0.056091f, 0.887695f, 0.057556f, 0.882324f, 0.059143f, 0.877930f,
+ 0.060638f, 0.872070f, 0.062439f, 0.865723f, 0.064087f, 0.858887f, 0.065552f, 0.853516f,
+ 0.066956f, 0.848145f, 0.067444f, 0.841797f, 0.068420f, 0.835938f, 0.070801f, 0.827637f,
+ 0.071838f, 0.820312f, 0.072632f, 0.812988f, 0.073853f, 0.806152f, 0.074402f, 0.799805f,
+ 0.074829f, 0.791992f, 0.076172f, 0.782715f, 0.076843f, 0.772949f, 0.076965f, 0.763184f,
+ 0.077759f, 0.754395f, 0.077820f, 0.744629f, 0.077698f, 0.734863f, 0.077454f, 0.723145f,
+ 0.077576f, 0.709961f, 0.077209f, 0.696777f, 0.076416f, 0.683105f, 0.075439f, 0.668945f,
+ 0.073669f, 0.654297f, 0.072144f, 0.635254f, 0.070801f, 0.614258f, 0.067993f, 0.592285f,
+ 0.064514f, 0.568359f, 0.060272f, 0.542480f, 0.055481f, 0.506836f, 0.049927f, 0.466309f,
+ 0.042175f, 0.419678f, 0.032379f, 0.357422f, 0.019928f, 0.260498f, 0.003540f, 0.093628f,
+ 0.000000f, 1.000000f, 0.003256f, 0.997559f, 0.006847f, 0.994141f, 0.010422f, 0.989258f,
+ 0.013496f, 0.985352f, 0.016830f, 0.980469f, 0.019699f, 0.975586f, 0.022263f, 0.971680f,
+ 0.025574f, 0.966309f, 0.028839f, 0.960449f, 0.031555f, 0.956055f, 0.033203f, 0.952148f,
+ 0.036865f, 0.945801f, 0.039795f, 0.939941f, 0.042084f, 0.935547f, 0.044250f, 0.931152f,
+ 0.046997f, 0.925293f, 0.049561f, 0.919434f, 0.051514f, 0.914551f, 0.054230f, 0.909668f,
+ 0.055603f, 0.905273f, 0.057739f, 0.900391f, 0.060455f, 0.894043f, 0.063110f, 0.888184f,
+ 0.064941f, 0.883301f, 0.066467f, 0.878418f, 0.067993f, 0.873047f, 0.070129f, 0.866699f,
+ 0.072388f, 0.860352f, 0.073975f, 0.854492f, 0.075989f, 0.849121f, 0.077209f, 0.842773f,
+ 0.078308f, 0.837402f, 0.080078f, 0.831543f, 0.081604f, 0.823730f, 0.083374f, 0.816406f,
+ 0.084717f, 0.809570f, 0.085938f, 0.802734f, 0.086609f, 0.795898f, 0.087463f, 0.789551f,
+ 0.088318f, 0.780273f, 0.089722f, 0.770996f, 0.090332f, 0.762207f, 0.090820f, 0.753906f,
+ 0.091003f, 0.744141f, 0.091064f, 0.735840f, 0.090942f, 0.726074f, 0.091064f, 0.712891f,
+ 0.091064f, 0.700684f, 0.090698f, 0.687988f, 0.089600f, 0.675781f, 0.087585f, 0.661133f,
+ 0.086060f, 0.646973f, 0.084717f, 0.627441f, 0.082092f, 0.607422f, 0.078857f, 0.585938f,
+ 0.074951f, 0.563965f, 0.069641f, 0.538574f, 0.064758f, 0.502441f, 0.057800f, 0.463135f,
+ 0.048431f, 0.417725f, 0.037231f, 0.354248f, 0.022766f, 0.260010f, 0.004044f, 0.092957f,
+ 0.000000f, 1.000000f, 0.004089f, 0.997070f, 0.007858f, 0.993164f, 0.012085f, 0.988281f,
+ 0.015350f, 0.984375f, 0.019882f, 0.977539f, 0.023315f, 0.973145f, 0.026230f, 0.968262f,
+ 0.030502f, 0.961426f, 0.034058f, 0.956055f, 0.036469f, 0.951660f, 0.040192f, 0.945312f,
+ 0.043549f, 0.939453f, 0.046143f, 0.934082f, 0.049530f, 0.928711f, 0.052307f, 0.923340f,
+ 0.055603f, 0.916992f, 0.058990f, 0.910645f, 0.061035f, 0.905762f, 0.063416f, 0.900879f,
+ 0.065857f, 0.895508f, 0.068848f, 0.888672f, 0.071289f, 0.883301f, 0.074219f, 0.877930f,
+ 0.076172f, 0.872559f, 0.077698f, 0.868164f, 0.080444f, 0.862305f, 0.082703f, 0.854980f,
+ 0.084900f, 0.848633f, 0.086853f, 0.843262f, 0.088440f, 0.837891f, 0.090454f, 0.832520f,
+ 0.091736f, 0.825684f, 0.094299f, 0.818359f, 0.096008f, 0.811523f, 0.097412f, 0.804688f,
+ 0.099121f, 0.797852f, 0.099670f, 0.791504f, 0.100525f, 0.785156f, 0.102234f, 0.776855f,
+ 0.103638f, 0.768066f, 0.104187f, 0.758789f, 0.105408f, 0.751465f, 0.105469f, 0.743164f,
+ 0.105408f, 0.734863f, 0.105164f, 0.726074f, 0.106140f, 0.713867f, 0.106079f, 0.702148f,
+ 0.105347f, 0.690430f, 0.104614f, 0.678711f, 0.102539f, 0.666992f, 0.100891f, 0.654297f,
+ 0.099426f, 0.637207f, 0.097229f, 0.619141f, 0.094910f, 0.601074f, 0.090759f, 0.580566f,
+ 0.085449f, 0.559082f, 0.080078f, 0.531738f, 0.074158f, 0.498047f, 0.065735f, 0.460938f,
+ 0.055634f, 0.416260f, 0.042633f, 0.351807f, 0.025879f, 0.259033f, 0.004566f, 0.092041f,
+ 0.000000f, 1.000000f, 0.005260f, 0.996582f, 0.009384f, 0.992188f, 0.014206f, 0.986816f,
+ 0.018677f, 0.981445f, 0.023102f, 0.975098f, 0.027206f, 0.969727f, 0.031616f, 0.962891f,
+ 0.036011f, 0.957031f, 0.039642f, 0.951172f, 0.043304f, 0.945312f, 0.048096f, 0.937988f,
+ 0.051025f, 0.932129f, 0.054565f, 0.926758f, 0.057892f, 0.921387f, 0.062286f, 0.914062f,
+ 0.065186f, 0.907715f, 0.068726f, 0.901855f, 0.071777f, 0.896484f, 0.074036f, 0.890625f,
+ 0.077881f, 0.883789f, 0.081482f, 0.877441f, 0.083679f, 0.872070f, 0.085815f, 0.867188f,
+ 0.088684f, 0.861816f, 0.091553f, 0.854980f, 0.094543f, 0.848633f, 0.097473f, 0.842773f,
+ 0.099365f, 0.836426f, 0.101074f, 0.831055f, 0.102600f, 0.826172f, 0.105530f, 0.818848f,
+ 0.107971f, 0.812012f, 0.109802f, 0.804688f, 0.111511f, 0.798340f, 0.112732f, 0.792480f,
+ 0.114319f, 0.786133f, 0.115051f, 0.780273f, 0.116821f, 0.770996f, 0.118408f, 0.763184f,
+ 0.119385f, 0.755371f, 0.120850f, 0.748047f, 0.120728f, 0.739746f, 0.121338f, 0.733398f,
+ 0.120667f, 0.724121f, 0.121277f, 0.712891f, 0.122314f, 0.702637f, 0.121582f, 0.691895f,
+ 0.120728f, 0.681152f, 0.118896f, 0.669922f, 0.117249f, 0.659668f, 0.116089f, 0.644531f,
+ 0.113770f, 0.627441f, 0.111023f, 0.611328f, 0.107544f, 0.593750f, 0.102783f, 0.575195f,
+ 0.096802f, 0.554688f, 0.091309f, 0.524902f, 0.083984f, 0.493652f, 0.074524f, 0.457275f,
+ 0.062195f, 0.414551f, 0.048340f, 0.349854f, 0.029022f, 0.258545f, 0.005138f, 0.091736f,
+ 0.000000f, 1.000000f, 0.006630f, 0.995605f, 0.012138f, 0.990234f, 0.016922f, 0.984863f,
+ 0.022842f, 0.978027f, 0.028015f, 0.971191f, 0.031555f, 0.966309f, 0.037872f, 0.958008f,
+ 0.042908f, 0.951172f, 0.046295f, 0.946289f, 0.051910f, 0.937500f, 0.056549f, 0.930664f,
+ 0.060028f, 0.924805f, 0.064087f, 0.918457f, 0.068787f, 0.910156f, 0.073181f, 0.903809f,
+ 0.076599f, 0.897949f, 0.079407f, 0.892578f, 0.084045f, 0.884766f, 0.087769f, 0.877930f,
+ 0.091492f, 0.871582f, 0.094360f, 0.865723f, 0.097473f, 0.859863f, 0.099976f, 0.854492f,
+ 0.103882f, 0.847168f, 0.107056f, 0.840820f, 0.110107f, 0.834961f, 0.112244f, 0.829590f,
+ 0.115173f, 0.824219f, 0.116638f, 0.818359f, 0.119202f, 0.811035f, 0.122314f, 0.804199f,
+ 0.124573f, 0.797363f, 0.126953f, 0.791992f, 0.127808f, 0.785645f, 0.129150f, 0.780273f,
+ 0.131226f, 0.772949f, 0.133179f, 0.765137f, 0.135132f, 0.757324f, 0.135742f, 0.750000f,
+ 0.136353f, 0.743164f, 0.137329f, 0.735840f, 0.137207f, 0.729004f, 0.137939f, 0.720215f,
+ 0.138672f, 0.710449f, 0.138672f, 0.700684f, 0.138550f, 0.690430f, 0.137695f, 0.681641f,
+ 0.136108f, 0.671387f, 0.134399f, 0.661621f, 0.133301f, 0.648926f, 0.131348f, 0.633789f,
+ 0.129028f, 0.619141f, 0.125244f, 0.603516f, 0.120789f, 0.587402f, 0.115417f, 0.569336f,
+ 0.109741f, 0.546875f, 0.103027f, 0.519531f, 0.094360f, 0.488770f, 0.083557f, 0.454346f,
+ 0.069702f, 0.413330f, 0.054138f, 0.347656f, 0.032196f, 0.257812f, 0.005753f, 0.091309f,
+ 0.000000f, 1.000000f, 0.007626f, 0.995117f, 0.014359f, 0.988770f, 0.020340f, 0.983398f,
+ 0.027176f, 0.975098f, 0.032959f, 0.968262f, 0.038818f, 0.959961f, 0.044983f, 0.952148f,
+ 0.049652f, 0.945801f, 0.056732f, 0.936523f, 0.062103f, 0.929199f, 0.066406f, 0.922363f,
+ 0.070862f, 0.915527f, 0.076416f, 0.907227f, 0.081909f, 0.899414f, 0.085571f, 0.893066f,
+ 0.088562f, 0.887695f, 0.093628f, 0.879395f, 0.098511f, 0.871582f, 0.103333f, 0.864746f,
+ 0.106262f, 0.858887f, 0.109497f, 0.853516f, 0.113525f, 0.845703f, 0.117676f, 0.838379f,
+ 0.120483f, 0.832520f, 0.124146f, 0.826172f, 0.126709f, 0.820801f, 0.128662f, 0.815918f,
+ 0.131958f, 0.809082f, 0.136108f, 0.801758f, 0.137939f, 0.794922f, 0.140015f, 0.789062f,
+ 0.142700f, 0.783203f, 0.144409f, 0.777832f, 0.145264f, 0.772461f, 0.148071f, 0.764160f,
+ 0.150757f, 0.756836f, 0.151855f, 0.750000f, 0.153442f, 0.743164f, 0.154175f, 0.736816f,
+ 0.154297f, 0.730469f, 0.154907f, 0.724609f, 0.156128f, 0.714355f, 0.156616f, 0.705566f,
+ 0.157471f, 0.697266f, 0.155762f, 0.687988f, 0.155762f, 0.679688f, 0.154419f, 0.671387f,
+ 0.152588f, 0.662598f, 0.151489f, 0.649902f, 0.149414f, 0.636719f, 0.147339f, 0.623535f,
+ 0.143921f, 0.610352f, 0.140015f, 0.596680f, 0.134644f, 0.581055f, 0.128296f, 0.562500f,
+ 0.122559f, 0.539062f, 0.114868f, 0.513184f, 0.104797f, 0.484619f, 0.092407f, 0.452393f,
+ 0.077332f, 0.410156f, 0.060272f, 0.344971f, 0.035950f, 0.258545f, 0.006393f, 0.090515f,
+ 0.000000f, 1.000000f, 0.009056f, 0.994629f, 0.016968f, 0.987305f, 0.024200f, 0.979980f,
+ 0.032990f, 0.971191f, 0.039520f, 0.962891f, 0.046753f, 0.954102f, 0.053284f, 0.946289f,
+ 0.059784f, 0.937012f, 0.067017f, 0.928223f, 0.072510f, 0.920410f, 0.078369f, 0.912598f,
+ 0.084839f, 0.903320f, 0.090271f, 0.895996f, 0.094482f, 0.889160f, 0.100464f, 0.880859f,
+ 0.106018f, 0.872070f, 0.110352f, 0.864746f, 0.114807f, 0.858398f, 0.118713f, 0.852051f,
+ 0.123413f, 0.844238f, 0.127930f, 0.836426f, 0.132324f, 0.829102f, 0.135986f, 0.822754f,
+ 0.138672f, 0.817383f, 0.141602f, 0.812012f, 0.145508f, 0.804688f, 0.149292f, 0.797363f,
+ 0.152344f, 0.791016f, 0.155640f, 0.785156f, 0.157959f, 0.779785f, 0.159424f, 0.774414f,
+ 0.160645f, 0.769043f, 0.164795f, 0.761230f, 0.166748f, 0.753906f, 0.168457f, 0.747559f,
+ 0.170410f, 0.741211f, 0.171509f, 0.735352f, 0.172485f, 0.729004f, 0.172607f, 0.723633f,
+ 0.173828f, 0.715820f, 0.175415f, 0.707031f, 0.176270f, 0.699707f, 0.176147f, 0.691406f,
+ 0.175659f, 0.684082f, 0.174683f, 0.677246f, 0.173462f, 0.668945f, 0.171875f, 0.660156f,
+ 0.171143f, 0.648926f, 0.169189f, 0.637207f, 0.166870f, 0.625977f, 0.164062f, 0.614258f,
+ 0.159790f, 0.602051f, 0.154175f, 0.589355f, 0.148438f, 0.574219f, 0.143188f, 0.552734f,
+ 0.136230f, 0.531250f, 0.126953f, 0.507812f, 0.115540f, 0.481201f, 0.101746f, 0.450195f,
+ 0.086182f, 0.404541f, 0.066711f, 0.342529f, 0.039337f, 0.258057f, 0.007034f, 0.090088f,
+ 0.000000f, 1.000000f, 0.010162f, 0.994141f, 0.020432f, 0.985352f, 0.030762f, 0.975586f,
+ 0.038666f, 0.967773f, 0.048370f, 0.956055f, 0.056427f, 0.947754f, 0.064941f, 0.936523f,
+ 0.072571f, 0.927734f, 0.078918f, 0.919434f, 0.086853f, 0.908691f, 0.094116f, 0.899414f,
+ 0.099731f, 0.891602f, 0.105408f, 0.884277f, 0.112793f, 0.873535f, 0.118591f, 0.865234f,
+ 0.124329f, 0.857910f, 0.128418f, 0.850586f, 0.133667f, 0.842773f, 0.138550f, 0.834473f,
+ 0.143799f, 0.826660f, 0.148926f, 0.819824f, 0.151733f, 0.813477f, 0.155151f, 0.808105f,
+ 0.159912f, 0.799316f, 0.164307f, 0.792480f, 0.167358f, 0.785645f, 0.171021f, 0.779785f,
+ 0.173218f, 0.774414f, 0.175293f, 0.769531f, 0.178467f, 0.763184f, 0.182129f, 0.755859f,
+ 0.183960f, 0.749512f, 0.186279f, 0.742676f, 0.188477f, 0.736816f, 0.189697f, 0.731934f,
+ 0.190552f, 0.726562f, 0.191162f, 0.721191f, 0.193726f, 0.712891f, 0.194824f, 0.705566f,
+ 0.195435f, 0.698242f, 0.196533f, 0.691895f, 0.196411f, 0.685059f, 0.195557f, 0.678223f,
+ 0.194458f, 0.672363f, 0.193237f, 0.666016f, 0.192627f, 0.654297f, 0.191772f, 0.644531f,
+ 0.190063f, 0.635742f, 0.187500f, 0.625488f, 0.184082f, 0.616211f, 0.180298f, 0.605469f,
+ 0.175049f, 0.594727f, 0.170166f, 0.580566f, 0.164795f, 0.562500f, 0.158325f, 0.544434f,
+ 0.149292f, 0.524414f, 0.139404f, 0.503418f, 0.126099f, 0.478271f, 0.111084f, 0.447510f,
+ 0.094971f, 0.399414f, 0.072998f, 0.340576f, 0.042816f, 0.258545f, 0.007729f, 0.089966f,
+ 0.000000f, 1.000000f, 0.012421f, 0.993652f, 0.025009f, 0.983398f, 0.037354f, 0.971680f,
+ 0.048065f, 0.960449f, 0.058807f, 0.949707f, 0.069641f, 0.937500f, 0.078369f, 0.927246f,
+ 0.085449f, 0.918457f, 0.096130f, 0.905273f, 0.103760f, 0.895508f, 0.110352f, 0.887695f,
+ 0.118469f, 0.876465f, 0.125854f, 0.866699f, 0.132202f, 0.857910f, 0.138184f, 0.850586f,
+ 0.144043f, 0.840820f, 0.150757f, 0.832031f, 0.155884f, 0.823730f, 0.161011f, 0.816406f,
+ 0.165039f, 0.810059f, 0.169556f, 0.802734f, 0.175659f, 0.793457f, 0.179565f, 0.786133f,
+ 0.184204f, 0.779297f, 0.186768f, 0.773926f, 0.189453f, 0.768066f, 0.192261f, 0.762695f,
+ 0.197144f, 0.754395f, 0.199829f, 0.748047f, 0.203247f, 0.742188f, 0.205322f, 0.736816f,
+ 0.207397f, 0.731445f, 0.208374f, 0.726562f, 0.210205f, 0.721191f, 0.212036f, 0.713867f,
+ 0.214478f, 0.707520f, 0.215820f, 0.701172f, 0.217163f, 0.694824f, 0.217041f, 0.688965f,
+ 0.217285f, 0.683105f, 0.216675f, 0.677734f, 0.216064f, 0.671875f, 0.216431f, 0.665039f,
+ 0.215942f, 0.656250f, 0.214355f, 0.647949f, 0.214233f, 0.640625f, 0.211914f, 0.631836f,
+ 0.209229f, 0.624023f, 0.205200f, 0.615234f, 0.200928f, 0.606445f, 0.197144f, 0.597168f,
+ 0.192627f, 0.582520f, 0.187134f, 0.567871f, 0.180542f, 0.553223f, 0.172729f, 0.537109f,
+ 0.163452f, 0.520020f, 0.151001f, 0.499268f, 0.137207f, 0.475586f, 0.122070f, 0.438721f,
+ 0.103760f, 0.395020f, 0.079346f, 0.339355f, 0.046722f, 0.260010f, 0.008469f, 0.090271f,
+ 0.000000f, 1.000000f, 0.017120f, 0.990723f, 0.032562f, 0.978516f, 0.046265f, 0.965820f,
+ 0.059692f, 0.953125f, 0.073059f, 0.938965f, 0.083679f, 0.927734f, 0.094666f, 0.915039f,
+ 0.105530f, 0.902832f, 0.114868f, 0.892090f, 0.124268f, 0.879883f, 0.132935f, 0.869141f,
+ 0.140137f, 0.859863f, 0.146851f, 0.850586f, 0.155396f, 0.839355f, 0.162842f, 0.829590f,
+ 0.168945f, 0.821777f, 0.174316f, 0.813965f, 0.180664f, 0.804688f, 0.186035f, 0.795410f,
+ 0.191772f, 0.787598f, 0.196289f, 0.780273f, 0.199219f, 0.774414f, 0.203857f, 0.767578f,
+ 0.208252f, 0.759766f, 0.213501f, 0.751953f, 0.216309f, 0.745605f, 0.219971f, 0.739258f,
+ 0.222778f, 0.733398f, 0.224731f, 0.728516f, 0.226685f, 0.724121f, 0.229614f, 0.717773f,
+ 0.232178f, 0.711426f, 0.234375f, 0.705078f, 0.236328f, 0.699219f, 0.237305f, 0.693359f,
+ 0.238159f, 0.688477f, 0.239014f, 0.684082f, 0.238647f, 0.679199f, 0.238525f, 0.674805f,
+ 0.239624f, 0.667480f, 0.239746f, 0.660156f, 0.240112f, 0.653320f, 0.239502f, 0.646484f,
+ 0.237793f, 0.640137f, 0.236084f, 0.633301f, 0.234131f, 0.627441f, 0.230347f, 0.620117f,
+ 0.227051f, 0.613770f, 0.223999f, 0.604492f, 0.220581f, 0.593750f, 0.216064f, 0.582520f,
+ 0.211304f, 0.571289f, 0.204102f, 0.559082f, 0.196045f, 0.545410f, 0.187378f, 0.530762f,
+ 0.176147f, 0.514160f, 0.163452f, 0.495605f, 0.150024f, 0.466064f, 0.133667f, 0.432373f,
+ 0.112976f, 0.392334f, 0.085876f, 0.338867f, 0.050323f, 0.260742f, 0.009201f, 0.090271f,
+ 0.000000f, 1.000000f, 0.021469f, 0.988770f, 0.040436f, 0.975098f, 0.058228f, 0.959473f,
+ 0.075134f, 0.942871f, 0.089233f, 0.928711f, 0.104126f, 0.913574f, 0.114685f, 0.901855f,
+ 0.128662f, 0.885742f, 0.138184f, 0.874023f, 0.146973f, 0.863281f, 0.158691f, 0.849609f,
+ 0.166992f, 0.839355f, 0.174438f, 0.829590f, 0.181763f, 0.819336f, 0.189941f, 0.808594f,
+ 0.196533f, 0.798828f, 0.202393f, 0.790527f, 0.207764f, 0.782715f, 0.213257f, 0.774902f,
+ 0.219727f, 0.765625f, 0.224731f, 0.757324f, 0.229248f, 0.750000f, 0.233032f, 0.743164f,
+ 0.236694f, 0.737305f, 0.239990f, 0.731445f, 0.243652f, 0.724609f, 0.246704f, 0.717773f,
+ 0.250732f, 0.711426f, 0.252686f, 0.705566f, 0.255371f, 0.699707f, 0.257080f, 0.694824f,
+ 0.258789f, 0.689941f, 0.259766f, 0.685547f, 0.260498f, 0.682129f, 0.262207f, 0.675293f,
+ 0.263428f, 0.668945f, 0.263916f, 0.663574f, 0.264893f, 0.658203f, 0.265137f, 0.652832f,
+ 0.264404f, 0.647461f, 0.263672f, 0.643066f, 0.262207f, 0.637695f, 0.260742f, 0.632812f,
+ 0.258301f, 0.627930f, 0.255859f, 0.621582f, 0.254883f, 0.613770f, 0.251953f, 0.605957f,
+ 0.249023f, 0.597168f, 0.244507f, 0.588867f, 0.239746f, 0.580078f, 0.234863f, 0.570801f,
+ 0.227783f, 0.561035f, 0.221069f, 0.550293f, 0.211548f, 0.539062f, 0.200928f, 0.525391f,
+ 0.190674f, 0.505371f, 0.177734f, 0.483398f, 0.163086f, 0.458496f, 0.144531f, 0.428223f,
+ 0.121338f, 0.389893f, 0.092224f, 0.339111f, 0.053864f, 0.261963f, 0.009865f, 0.090210f,
+ 0.000000f, 1.000000f, 0.027863f, 0.986328f, 0.051727f, 0.968750f, 0.073486f, 0.950195f,
+ 0.094482f, 0.931152f, 0.112671f, 0.913086f, 0.127808f, 0.897461f, 0.142578f, 0.880859f,
+ 0.155762f, 0.867188f, 0.165771f, 0.854492f, 0.178467f, 0.839355f, 0.189209f, 0.826660f,
+ 0.197021f, 0.816406f, 0.205200f, 0.806152f, 0.213867f, 0.794434f, 0.221924f, 0.783691f,
+ 0.229370f, 0.773926f, 0.234741f, 0.765137f, 0.239014f, 0.757812f, 0.245483f, 0.749023f,
+ 0.250977f, 0.740234f, 0.255859f, 0.732422f, 0.261719f, 0.724609f, 0.264160f, 0.718750f,
+ 0.267578f, 0.712402f, 0.270752f, 0.706543f, 0.273193f, 0.700684f, 0.276855f, 0.694336f,
+ 0.278809f, 0.688965f, 0.281982f, 0.682129f, 0.284180f, 0.677246f, 0.285645f, 0.671875f,
+ 0.287109f, 0.666992f, 0.288086f, 0.662598f, 0.288818f, 0.658203f, 0.289795f, 0.654297f,
+ 0.289551f, 0.649414f, 0.288574f, 0.645508f, 0.288330f, 0.641113f, 0.289551f, 0.635254f,
+ 0.288574f, 0.629883f, 0.287354f, 0.624512f, 0.286621f, 0.619141f, 0.285400f, 0.613281f,
+ 0.282471f, 0.607910f, 0.280273f, 0.602539f, 0.277344f, 0.596680f, 0.273926f, 0.590820f,
+ 0.268799f, 0.583496f, 0.263916f, 0.577637f, 0.257568f, 0.570312f, 0.251465f, 0.562012f,
+ 0.245728f, 0.551270f, 0.237549f, 0.539551f, 0.228638f, 0.526855f, 0.218628f, 0.512207f,
+ 0.206299f, 0.495850f, 0.192383f, 0.477051f, 0.175415f, 0.453857f, 0.154907f, 0.425537f,
+ 0.129883f, 0.389404f, 0.098389f, 0.339600f, 0.059204f, 0.255127f, 0.010590f, 0.091003f,
+ 0.000000f, 1.000000f, 0.038086f, 0.981934f, 0.070557f, 0.958496f, 0.097351f, 0.936523f,
+ 0.120850f, 0.914551f, 0.139771f, 0.896484f, 0.159546f, 0.875977f, 0.174927f, 0.859375f,
+ 0.188965f, 0.842773f, 0.202393f, 0.827637f, 0.213989f, 0.813477f, 0.224365f, 0.800293f,
+ 0.232910f, 0.789062f, 0.242065f, 0.776855f, 0.250244f, 0.766113f, 0.258301f, 0.755371f,
+ 0.264893f, 0.745605f, 0.271484f, 0.736328f, 0.276367f, 0.728516f, 0.281738f, 0.720215f,
+ 0.286133f, 0.712891f, 0.290283f, 0.705566f, 0.293457f, 0.698730f, 0.298340f, 0.691406f,
+ 0.300781f, 0.685059f, 0.303467f, 0.679199f, 0.306396f, 0.672852f, 0.309814f, 0.666992f,
+ 0.311523f, 0.661621f, 0.312256f, 0.657227f, 0.314453f, 0.651855f, 0.315674f, 0.647461f,
+ 0.316162f, 0.643555f, 0.317871f, 0.638672f, 0.317383f, 0.635254f, 0.317627f, 0.631348f,
+ 0.317627f, 0.627930f, 0.316895f, 0.623535f, 0.315674f, 0.619629f, 0.315918f, 0.614746f,
+ 0.314209f, 0.610840f, 0.312012f, 0.605957f, 0.310303f, 0.602051f, 0.308350f, 0.596680f,
+ 0.305664f, 0.592285f, 0.302002f, 0.586914f, 0.298584f, 0.581543f, 0.295166f, 0.575684f,
+ 0.290039f, 0.569336f, 0.285400f, 0.562988f, 0.279297f, 0.556152f, 0.272705f, 0.547852f,
+ 0.264648f, 0.539062f, 0.255615f, 0.529297f, 0.244995f, 0.517578f, 0.234375f, 0.505371f,
+ 0.220093f, 0.490234f, 0.204834f, 0.473145f, 0.186279f, 0.451660f, 0.165039f, 0.423828f,
+ 0.139038f, 0.386963f, 0.106506f, 0.334961f, 0.063965f, 0.250977f, 0.011330f, 0.091614f,
+ 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.081604f, 0.953125f, 0.112366f, 0.928223f,
+ 0.138062f, 0.904297f, 0.159912f, 0.882812f, 0.179199f, 0.862793f, 0.195801f, 0.844727f,
+ 0.210449f, 0.828125f, 0.224609f, 0.812012f, 0.236084f, 0.797852f, 0.247192f, 0.784180f,
+ 0.256104f, 0.771973f, 0.265137f, 0.759766f, 0.273193f, 0.749023f, 0.280273f, 0.738770f,
+ 0.286621f, 0.729004f, 0.292725f, 0.719727f, 0.298340f, 0.710938f, 0.303711f, 0.702637f,
+ 0.308350f, 0.694824f, 0.312500f, 0.687500f, 0.316650f, 0.680176f, 0.319336f, 0.674316f,
+ 0.323242f, 0.667480f, 0.325928f, 0.661621f, 0.328613f, 0.655762f, 0.330322f, 0.650391f,
+ 0.333008f, 0.644531f, 0.334229f, 0.640137f, 0.336670f, 0.634766f, 0.337158f, 0.630371f,
+ 0.337646f, 0.626465f, 0.338867f, 0.622070f, 0.338867f, 0.618164f, 0.338623f, 0.614258f,
+ 0.339355f, 0.610352f, 0.339111f, 0.606445f, 0.337158f, 0.602539f, 0.336914f, 0.598145f,
+ 0.335449f, 0.594238f, 0.333984f, 0.590332f, 0.331787f, 0.585938f, 0.330322f, 0.582031f,
+ 0.327148f, 0.576660f, 0.323486f, 0.572266f, 0.320312f, 0.567383f, 0.316406f, 0.561523f,
+ 0.311768f, 0.555664f, 0.305908f, 0.549316f, 0.300293f, 0.542969f, 0.293457f, 0.534668f,
+ 0.285645f, 0.526367f, 0.277100f, 0.517090f, 0.267334f, 0.506836f, 0.255615f, 0.493896f,
+ 0.242676f, 0.478760f, 0.227295f, 0.461426f, 0.209229f, 0.440674f, 0.187744f, 0.413086f,
+ 0.160889f, 0.377686f, 0.126831f, 0.327637f, 0.081909f, 0.249390f, 0.020020f, 0.096985f,
+ 0.000000f, 1.000000f, 0.045471f, 0.978516f, 0.081543f, 0.953125f, 0.111755f, 0.928223f,
+ 0.138550f, 0.904297f, 0.161499f, 0.882324f, 0.180908f, 0.861816f, 0.198364f, 0.843262f,
+ 0.213135f, 0.826172f, 0.227173f, 0.810059f, 0.240112f, 0.794922f, 0.250488f, 0.781738f,
+ 0.260010f, 0.768555f, 0.269775f, 0.756348f, 0.278320f, 0.744629f, 0.285400f, 0.734375f,
+ 0.293457f, 0.723633f, 0.299561f, 0.714355f, 0.305908f, 0.705078f, 0.310791f, 0.697266f,
+ 0.315918f, 0.688965f, 0.321045f, 0.681152f, 0.325684f, 0.673340f, 0.328125f, 0.666992f,
+ 0.332275f, 0.660156f, 0.335449f, 0.653809f, 0.339111f, 0.647461f, 0.341064f, 0.642090f,
+ 0.345215f, 0.635254f, 0.346680f, 0.630371f, 0.348389f, 0.625000f, 0.350098f, 0.620117f,
+ 0.350586f, 0.615723f, 0.352295f, 0.611328f, 0.353271f, 0.606934f, 0.353271f, 0.602539f,
+ 0.353760f, 0.598633f, 0.354736f, 0.594238f, 0.353760f, 0.589844f, 0.353027f, 0.585938f,
+ 0.352783f, 0.581543f, 0.351807f, 0.577148f, 0.349609f, 0.572754f, 0.348877f, 0.567871f,
+ 0.346191f, 0.562988f, 0.343994f, 0.558105f, 0.340332f, 0.552734f, 0.337402f, 0.546875f,
+ 0.334229f, 0.541016f, 0.328125f, 0.534668f, 0.324463f, 0.527832f, 0.318848f, 0.519531f,
+ 0.311523f, 0.510742f, 0.303467f, 0.500977f, 0.294678f, 0.490723f, 0.285400f, 0.478271f,
+ 0.272705f, 0.463623f, 0.258545f, 0.446533f, 0.241699f, 0.425537f, 0.221436f, 0.399414f,
+ 0.196045f, 0.365479f, 0.163086f, 0.318359f, 0.116211f, 0.243164f, 0.045105f, 0.094666f,
+ 0.000000f, 1.000000f, 0.044952f, 0.979004f, 0.081909f, 0.953125f, 0.113342f, 0.927246f,
+ 0.139648f, 0.903320f, 0.162842f, 0.881348f, 0.181763f, 0.861328f, 0.200806f, 0.841797f,
+ 0.216553f, 0.823730f, 0.229736f, 0.808105f, 0.242676f, 0.792969f, 0.253906f, 0.778809f,
+ 0.265381f, 0.765137f, 0.274658f, 0.752441f, 0.283936f, 0.740723f, 0.291748f, 0.729980f,
+ 0.299561f, 0.719238f, 0.306885f, 0.708984f, 0.312744f, 0.700195f, 0.318115f, 0.691406f,
+ 0.324219f, 0.682617f, 0.329346f, 0.674316f, 0.333496f, 0.666992f, 0.338135f, 0.659668f,
+ 0.342041f, 0.652344f, 0.345703f, 0.645508f, 0.349365f, 0.639160f, 0.351807f, 0.633301f,
+ 0.355713f, 0.626953f, 0.358154f, 0.621094f, 0.360352f, 0.615234f, 0.363525f, 0.609375f,
+ 0.363770f, 0.604980f, 0.366211f, 0.600098f, 0.367432f, 0.595215f, 0.368652f, 0.590820f,
+ 0.369141f, 0.586426f, 0.370605f, 0.582031f, 0.370361f, 0.577637f, 0.370117f, 0.572754f,
+ 0.370117f, 0.567871f, 0.369629f, 0.563477f, 0.368652f, 0.558594f, 0.367676f, 0.553711f,
+ 0.367188f, 0.548340f, 0.364502f, 0.542969f, 0.362061f, 0.537598f, 0.359863f, 0.531738f,
+ 0.357178f, 0.524902f, 0.353760f, 0.518066f, 0.348877f, 0.510254f, 0.343994f, 0.502441f,
+ 0.338135f, 0.493408f, 0.331543f, 0.483887f, 0.323242f, 0.472900f, 0.314697f, 0.460693f,
+ 0.303467f, 0.446289f, 0.291504f, 0.429443f, 0.275879f, 0.409424f, 0.256592f, 0.383545f,
+ 0.233032f, 0.351562f, 0.200806f, 0.305908f, 0.154297f, 0.234253f, 0.076416f, 0.092346f,
+ 0.000000f, 1.000000f, 0.044891f, 0.979004f, 0.082153f, 0.953125f, 0.114136f, 0.926758f,
+ 0.141357f, 0.902344f, 0.163818f, 0.880371f, 0.185181f, 0.859375f, 0.203003f, 0.839844f,
+ 0.220337f, 0.821777f, 0.233521f, 0.805176f, 0.246460f, 0.790039f, 0.259277f, 0.774902f,
+ 0.270752f, 0.761719f, 0.280029f, 0.748535f, 0.289551f, 0.736328f, 0.298096f, 0.725098f,
+ 0.306885f, 0.713867f, 0.312988f, 0.704102f, 0.319336f, 0.694336f, 0.326172f, 0.684570f,
+ 0.333008f, 0.675781f, 0.337402f, 0.667480f, 0.342773f, 0.659668f, 0.347168f, 0.651855f,
+ 0.352295f, 0.644531f, 0.357178f, 0.636719f, 0.361572f, 0.629883f, 0.364014f, 0.623535f,
+ 0.367676f, 0.617188f, 0.371094f, 0.610352f, 0.374023f, 0.604492f, 0.377441f, 0.598633f,
+ 0.378418f, 0.593262f, 0.381104f, 0.587891f, 0.382568f, 0.582520f, 0.384521f, 0.577637f,
+ 0.386230f, 0.572754f, 0.387451f, 0.567871f, 0.387695f, 0.563477f, 0.387695f, 0.558594f,
+ 0.388184f, 0.553223f, 0.388672f, 0.548340f, 0.388672f, 0.543457f, 0.387451f, 0.538086f,
+ 0.387207f, 0.532715f, 0.385254f, 0.526855f, 0.384521f, 0.521484f, 0.381592f, 0.515137f,
+ 0.379639f, 0.508301f, 0.376709f, 0.501953f, 0.372803f, 0.494385f, 0.370361f, 0.486572f,
+ 0.364746f, 0.477295f, 0.358887f, 0.467773f, 0.351318f, 0.456543f, 0.343750f, 0.444336f,
+ 0.334229f, 0.430420f, 0.322754f, 0.413086f, 0.309326f, 0.392578f, 0.291016f, 0.368408f,
+ 0.269531f, 0.336670f, 0.239380f, 0.292969f, 0.194336f, 0.225342f, 0.113770f, 0.089355f,
+ 0.000000f, 1.000000f, 0.045258f, 0.979004f, 0.082520f, 0.953125f, 0.114197f, 0.927246f,
+ 0.142090f, 0.902344f, 0.165527f, 0.879395f, 0.186890f, 0.857910f, 0.205933f, 0.838379f,
+ 0.222778f, 0.820312f, 0.237427f, 0.802734f, 0.250488f, 0.787109f, 0.263428f, 0.771973f,
+ 0.274414f, 0.757812f, 0.284912f, 0.744629f, 0.296143f, 0.731934f, 0.303467f, 0.720215f,
+ 0.312500f, 0.708984f, 0.320312f, 0.698242f, 0.327881f, 0.687988f, 0.334717f, 0.678223f,
+ 0.341553f, 0.668945f, 0.347168f, 0.660156f, 0.352783f, 0.651367f, 0.359131f, 0.642578f,
+ 0.362793f, 0.635254f, 0.368896f, 0.626953f, 0.372070f, 0.620117f, 0.376221f, 0.613281f,
+ 0.378906f, 0.606934f, 0.383057f, 0.600098f, 0.387207f, 0.593750f, 0.390381f, 0.587402f,
+ 0.392822f, 0.581543f, 0.395020f, 0.576172f, 0.397217f, 0.570801f, 0.399414f, 0.565430f,
+ 0.400635f, 0.560547f, 0.403564f, 0.555176f, 0.404541f, 0.550293f, 0.405762f, 0.545410f,
+ 0.406738f, 0.539551f, 0.406494f, 0.534180f, 0.406738f, 0.529297f, 0.406494f, 0.523926f,
+ 0.407715f, 0.517578f, 0.406494f, 0.512207f, 0.406006f, 0.505371f, 0.404541f, 0.499023f,
+ 0.403564f, 0.492432f, 0.401123f, 0.485107f, 0.398438f, 0.477783f, 0.395508f, 0.468994f,
+ 0.390625f, 0.459717f, 0.385986f, 0.450439f, 0.380859f, 0.439697f, 0.374023f, 0.427002f,
+ 0.365234f, 0.413086f, 0.355957f, 0.396484f, 0.343018f, 0.376709f, 0.327637f, 0.352539f,
+ 0.307373f, 0.322510f, 0.278320f, 0.280762f, 0.236084f, 0.215210f, 0.155151f, 0.085266f,
+ 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.082703f, 0.952637f, 0.115356f, 0.926270f,
+ 0.142578f, 0.901855f, 0.167725f, 0.877930f, 0.188232f, 0.856934f, 0.208618f, 0.836426f,
+ 0.225220f, 0.817871f, 0.240601f, 0.800293f, 0.254639f, 0.784180f, 0.268311f, 0.768555f,
+ 0.279785f, 0.753906f, 0.291016f, 0.740234f, 0.301758f, 0.727051f, 0.311768f, 0.714355f,
+ 0.320068f, 0.702637f, 0.328857f, 0.691406f, 0.336670f, 0.681152f, 0.343994f, 0.670898f,
+ 0.350098f, 0.661133f, 0.356201f, 0.652344f, 0.362061f, 0.643555f, 0.368652f, 0.634766f,
+ 0.373291f, 0.626953f, 0.378418f, 0.618652f, 0.383301f, 0.611328f, 0.388184f, 0.604004f,
+ 0.392090f, 0.597168f, 0.395508f, 0.590332f, 0.399414f, 0.583496f, 0.402832f, 0.576660f,
+ 0.407227f, 0.570312f, 0.409424f, 0.564453f, 0.412598f, 0.558594f, 0.415039f, 0.553223f,
+ 0.417725f, 0.547363f, 0.420654f, 0.541504f, 0.421631f, 0.536133f, 0.423584f, 0.531250f,
+ 0.424805f, 0.525391f, 0.425781f, 0.519531f, 0.426758f, 0.514160f, 0.427246f, 0.508789f,
+ 0.427490f, 0.501953f, 0.427734f, 0.496338f, 0.427002f, 0.489746f, 0.427490f, 0.483643f,
+ 0.426025f, 0.476318f, 0.425293f, 0.468750f, 0.423096f, 0.461182f, 0.420410f, 0.452148f,
+ 0.419434f, 0.443604f, 0.414307f, 0.433105f, 0.408691f, 0.422363f, 0.403564f, 0.409424f,
+ 0.396240f, 0.395752f, 0.387207f, 0.378662f, 0.377197f, 0.360352f, 0.364014f, 0.337646f,
+ 0.343506f, 0.307617f, 0.318604f, 0.267090f, 0.277588f, 0.205688f, 0.199707f, 0.082336f,
+ 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.083618f, 0.952148f, 0.116028f, 0.925781f,
+ 0.143921f, 0.900879f, 0.168701f, 0.877930f, 0.191162f, 0.854980f, 0.210693f, 0.834473f,
+ 0.228516f, 0.815918f, 0.244507f, 0.797363f, 0.259277f, 0.780762f, 0.273682f, 0.764160f,
+ 0.285889f, 0.749023f, 0.297852f, 0.734863f, 0.308350f, 0.721680f, 0.318359f, 0.708984f,
+ 0.326904f, 0.697266f, 0.336182f, 0.685547f, 0.343994f, 0.674805f, 0.350586f, 0.665039f,
+ 0.358398f, 0.654785f, 0.365234f, 0.645020f, 0.371826f, 0.635742f, 0.378418f, 0.626953f,
+ 0.384277f, 0.618164f, 0.389648f, 0.610352f, 0.395020f, 0.602051f, 0.400879f, 0.593750f,
+ 0.404053f, 0.586914f, 0.409180f, 0.579590f, 0.414795f, 0.571777f, 0.416992f, 0.565430f,
+ 0.421387f, 0.558594f, 0.424316f, 0.552246f, 0.427979f, 0.545898f, 0.431152f, 0.540039f,
+ 0.433105f, 0.534180f, 0.436035f, 0.528320f, 0.439209f, 0.522461f, 0.440918f, 0.517090f,
+ 0.443115f, 0.511230f, 0.444580f, 0.504883f, 0.446533f, 0.498535f, 0.446777f, 0.493164f,
+ 0.448975f, 0.486572f, 0.449707f, 0.479980f, 0.449463f, 0.474121f, 0.449219f, 0.467041f,
+ 0.449951f, 0.459473f, 0.449219f, 0.451904f, 0.447754f, 0.444092f, 0.446045f, 0.435059f,
+ 0.444092f, 0.425537f, 0.440918f, 0.415039f, 0.437256f, 0.404785f, 0.433350f, 0.392090f,
+ 0.427002f, 0.378174f, 0.419678f, 0.362549f, 0.409668f, 0.343262f, 0.398438f, 0.320557f,
+ 0.381104f, 0.292236f, 0.357910f, 0.254395f, 0.320557f, 0.194824f, 0.244629f, 0.078430f,
+ 0.000000f, 1.000000f, 0.045349f, 0.979004f, 0.083618f, 0.952148f, 0.116882f, 0.925781f,
+ 0.145386f, 0.899902f, 0.171143f, 0.875977f, 0.194336f, 0.853516f, 0.214111f, 0.832520f,
+ 0.232422f, 0.812500f, 0.249756f, 0.793457f, 0.263916f, 0.776855f, 0.278320f, 0.760254f,
+ 0.291260f, 0.745117f, 0.303467f, 0.730957f, 0.313232f, 0.717773f, 0.325439f, 0.704102f,
+ 0.333984f, 0.692383f, 0.343750f, 0.680176f, 0.351807f, 0.668945f, 0.359131f, 0.658691f,
+ 0.367188f, 0.647461f, 0.374512f, 0.637695f, 0.382568f, 0.627441f, 0.387939f, 0.618652f,
+ 0.395752f, 0.608887f, 0.400391f, 0.601074f, 0.406494f, 0.592285f, 0.411865f, 0.584473f,
+ 0.416748f, 0.576660f, 0.420166f, 0.569824f, 0.427246f, 0.561523f, 0.430420f, 0.554199f,
+ 0.435791f, 0.546875f, 0.439453f, 0.540039f, 0.442627f, 0.533691f, 0.446777f, 0.527344f,
+ 0.449951f, 0.520996f, 0.452881f, 0.514648f, 0.455566f, 0.508789f, 0.458984f, 0.502441f,
+ 0.460938f, 0.497070f, 0.463135f, 0.490479f, 0.466309f, 0.483398f, 0.467285f, 0.477783f,
+ 0.469238f, 0.471436f, 0.469971f, 0.464355f, 0.471680f, 0.457275f, 0.471436f, 0.450439f,
+ 0.473389f, 0.443115f, 0.473145f, 0.434814f, 0.472656f, 0.426514f, 0.472168f, 0.417969f,
+ 0.470459f, 0.408447f, 0.469238f, 0.398438f, 0.466797f, 0.387451f, 0.462646f, 0.375000f,
+ 0.458496f, 0.360840f, 0.451660f, 0.345459f, 0.443848f, 0.326416f, 0.432129f, 0.305420f,
+ 0.418701f, 0.276855f, 0.396973f, 0.240356f, 0.362061f, 0.183716f, 0.291260f, 0.074280f,
+ 0.000000f, 1.000000f, 0.045197f, 0.979004f, 0.083923f, 0.952148f, 0.117310f, 0.925293f,
+ 0.146118f, 0.899902f, 0.172729f, 0.875000f, 0.196045f, 0.851562f, 0.216919f, 0.830078f,
+ 0.235474f, 0.810059f, 0.252930f, 0.791504f, 0.268555f, 0.773926f, 0.282227f, 0.757324f,
+ 0.296631f, 0.741699f, 0.308594f, 0.727051f, 0.319580f, 0.712891f, 0.330078f, 0.699707f,
+ 0.341064f, 0.686523f, 0.350830f, 0.674316f, 0.359375f, 0.662598f, 0.369385f, 0.650879f,
+ 0.377441f, 0.639648f, 0.384521f, 0.629395f, 0.391357f, 0.620117f, 0.398682f, 0.610352f,
+ 0.406006f, 0.600586f, 0.411133f, 0.592285f, 0.417725f, 0.583008f, 0.424561f, 0.574219f,
+ 0.430664f, 0.565430f, 0.434814f, 0.558105f, 0.439453f, 0.550781f, 0.445312f, 0.542480f,
+ 0.450439f, 0.535156f, 0.454102f, 0.528320f, 0.458008f, 0.520996f, 0.462646f, 0.514160f,
+ 0.466797f, 0.507324f, 0.469238f, 0.500977f, 0.473145f, 0.494385f, 0.476807f, 0.488037f,
+ 0.479492f, 0.481934f, 0.482666f, 0.476074f, 0.484619f, 0.468506f, 0.487549f, 0.461670f,
+ 0.489990f, 0.455078f, 0.491943f, 0.448486f, 0.493652f, 0.440918f, 0.494873f, 0.434082f,
+ 0.495850f, 0.425781f, 0.496338f, 0.418213f, 0.497070f, 0.409668f, 0.497314f, 0.400635f,
+ 0.496826f, 0.390869f, 0.496094f, 0.380615f, 0.492188f, 0.369629f, 0.491455f, 0.357178f,
+ 0.487793f, 0.343506f, 0.482666f, 0.327881f, 0.476074f, 0.309814f, 0.467529f, 0.288818f,
+ 0.453857f, 0.262451f, 0.435303f, 0.226807f, 0.404053f, 0.174072f, 0.338623f, 0.069580f,
+ 0.000000f, 1.000000f, 0.044922f, 0.979004f, 0.084167f, 0.952148f, 0.118835f, 0.923828f,
+ 0.148438f, 0.897949f, 0.174683f, 0.873047f, 0.198853f, 0.849609f, 0.220459f, 0.828125f,
+ 0.238281f, 0.808105f, 0.256836f, 0.788574f, 0.272705f, 0.770996f, 0.287598f, 0.753906f,
+ 0.301270f, 0.737793f, 0.313965f, 0.722656f, 0.326660f, 0.707520f, 0.337646f, 0.693848f,
+ 0.348389f, 0.680664f, 0.359131f, 0.667480f, 0.368652f, 0.655762f, 0.377441f, 0.644043f,
+ 0.385986f, 0.632812f, 0.394043f, 0.622070f, 0.401123f, 0.611816f, 0.409912f, 0.601074f,
+ 0.416504f, 0.591797f, 0.423584f, 0.582031f, 0.429932f, 0.573242f, 0.437012f, 0.563965f,
+ 0.442627f, 0.555664f, 0.447998f, 0.547363f, 0.453613f, 0.539062f, 0.458984f, 0.531250f,
+ 0.464355f, 0.522949f, 0.469238f, 0.515625f, 0.474121f, 0.507812f, 0.478271f, 0.500977f,
+ 0.483154f, 0.493652f, 0.487549f, 0.486816f, 0.491211f, 0.479980f, 0.493408f, 0.474121f,
+ 0.497559f, 0.467285f, 0.501953f, 0.460449f, 0.504395f, 0.453125f, 0.507324f, 0.446289f,
+ 0.510254f, 0.439209f, 0.512695f, 0.432129f, 0.514648f, 0.424561f, 0.516602f, 0.417480f,
+ 0.519043f, 0.409424f, 0.520508f, 0.401367f, 0.521484f, 0.392334f, 0.521973f, 0.384033f,
+ 0.522461f, 0.373535f, 0.521484f, 0.363525f, 0.520996f, 0.352783f, 0.520020f, 0.340332f,
+ 0.517090f, 0.326904f, 0.513184f, 0.311279f, 0.507812f, 0.293457f, 0.500488f, 0.273193f,
+ 0.489746f, 0.247192f, 0.474121f, 0.213501f, 0.446777f, 0.163452f, 0.384521f, 0.065186f,
+ 0.000000f, 1.000000f, 0.045074f, 0.979004f, 0.084778f, 0.951660f, 0.119507f, 0.923828f,
+ 0.150513f, 0.896484f, 0.177490f, 0.871582f, 0.201416f, 0.848145f, 0.222900f, 0.826172f,
+ 0.241821f, 0.805664f, 0.259521f, 0.786621f, 0.276855f, 0.767578f, 0.292725f, 0.750488f,
+ 0.307617f, 0.733398f, 0.320312f, 0.717773f, 0.333252f, 0.702637f, 0.345215f, 0.688477f,
+ 0.355469f, 0.674805f, 0.366699f, 0.662109f, 0.377686f, 0.648926f, 0.386719f, 0.637207f,
+ 0.395508f, 0.625488f, 0.404053f, 0.614258f, 0.412598f, 0.603516f, 0.420654f, 0.592773f,
+ 0.427246f, 0.583008f, 0.435547f, 0.572754f, 0.442627f, 0.562988f, 0.449219f, 0.554199f,
+ 0.455811f, 0.544922f, 0.461914f, 0.536133f, 0.467529f, 0.527832f, 0.472656f, 0.519531f,
+ 0.479492f, 0.511230f, 0.484619f, 0.502930f, 0.489990f, 0.495361f, 0.493896f, 0.488281f,
+ 0.500488f, 0.479980f, 0.502930f, 0.473389f, 0.508301f, 0.466064f, 0.512695f, 0.458984f,
+ 0.516113f, 0.451904f, 0.520996f, 0.445068f, 0.524902f, 0.437988f, 0.527832f, 0.430664f,
+ 0.529785f, 0.423584f, 0.532715f, 0.416260f, 0.536621f, 0.408447f, 0.538574f, 0.400635f,
+ 0.541504f, 0.392578f, 0.543457f, 0.384277f, 0.544922f, 0.375488f, 0.546387f, 0.366455f,
+ 0.547852f, 0.356445f, 0.547852f, 0.346924f, 0.547852f, 0.335693f, 0.546387f, 0.322998f,
+ 0.546387f, 0.309326f, 0.542969f, 0.294922f, 0.539551f, 0.277588f, 0.533203f, 0.257080f,
+ 0.523926f, 0.233521f, 0.510254f, 0.201050f, 0.485596f, 0.152466f, 0.430420f, 0.061676f,
+ 0.000000f, 1.000000f, 0.045410f, 0.979004f, 0.085999f, 0.950684f, 0.120483f, 0.923340f,
+ 0.151611f, 0.895996f, 0.178467f, 0.871094f, 0.203125f, 0.847168f, 0.225220f, 0.824707f,
+ 0.246094f, 0.803223f, 0.263916f, 0.783691f, 0.281982f, 0.764160f, 0.297363f, 0.746582f,
+ 0.312256f, 0.729492f, 0.326416f, 0.712891f, 0.338135f, 0.698242f, 0.351807f, 0.683105f,
+ 0.363281f, 0.668945f, 0.375000f, 0.655273f, 0.385010f, 0.642578f, 0.394287f, 0.630371f,
+ 0.405029f, 0.617676f, 0.413818f, 0.606445f, 0.422607f, 0.594727f, 0.430664f, 0.583984f,
+ 0.438232f, 0.573730f, 0.446777f, 0.563477f, 0.453857f, 0.553223f, 0.460938f, 0.543945f,
+ 0.467773f, 0.534668f, 0.475586f, 0.524902f, 0.480469f, 0.516602f, 0.488037f, 0.507324f,
+ 0.494385f, 0.498779f, 0.500000f, 0.490723f, 0.504883f, 0.482666f, 0.510254f, 0.474609f,
+ 0.516113f, 0.466553f, 0.520996f, 0.458984f, 0.524902f, 0.451904f, 0.530273f, 0.444336f,
+ 0.535156f, 0.436768f, 0.538574f, 0.429688f, 0.543945f, 0.422363f, 0.547852f, 0.415283f,
+ 0.549805f, 0.407471f, 0.554199f, 0.399902f, 0.558105f, 0.391846f, 0.560547f, 0.384521f,
+ 0.563477f, 0.375977f, 0.566895f, 0.367432f, 0.569336f, 0.358398f, 0.569824f, 0.349854f,
+ 0.572754f, 0.339600f, 0.573242f, 0.329834f, 0.575195f, 0.318115f, 0.574707f, 0.306396f,
+ 0.574707f, 0.292969f, 0.572754f, 0.278564f, 0.569336f, 0.261963f, 0.564453f, 0.241943f,
+ 0.557617f, 0.218750f, 0.544922f, 0.188232f, 0.523926f, 0.142822f, 0.474609f, 0.057129f,
+ 0.000000f, 1.000000f, 0.045532f, 0.978516f, 0.085083f, 0.951660f, 0.122375f, 0.921387f,
+ 0.152954f, 0.895508f, 0.179932f, 0.870117f, 0.205566f, 0.845215f, 0.227783f, 0.822754f,
+ 0.248169f, 0.801270f, 0.269287f, 0.779785f, 0.286377f, 0.760742f, 0.302490f, 0.742676f,
+ 0.318359f, 0.725098f, 0.332520f, 0.708496f, 0.346680f, 0.692383f, 0.358643f, 0.677734f,
+ 0.371338f, 0.662598f, 0.382568f, 0.648926f, 0.393311f, 0.635742f, 0.403564f, 0.622559f,
+ 0.414551f, 0.609863f, 0.422852f, 0.598633f, 0.432861f, 0.586914f, 0.440918f, 0.575684f,
+ 0.450928f, 0.563965f, 0.458740f, 0.553711f, 0.467529f, 0.543457f, 0.474609f, 0.533203f,
+ 0.481689f, 0.523438f, 0.489258f, 0.514160f, 0.494873f, 0.504883f, 0.502441f, 0.495850f,
+ 0.507324f, 0.487549f, 0.514160f, 0.478516f, 0.521973f, 0.469238f, 0.526367f, 0.461426f,
+ 0.532227f, 0.453125f, 0.537598f, 0.445068f, 0.542480f, 0.437500f, 0.548828f, 0.429199f,
+ 0.553223f, 0.421875f, 0.558105f, 0.414551f, 0.562012f, 0.406738f, 0.568359f, 0.399170f,
+ 0.570801f, 0.391846f, 0.575195f, 0.383789f, 0.579102f, 0.375488f, 0.582520f, 0.367920f,
+ 0.586426f, 0.359375f, 0.588867f, 0.351074f, 0.591797f, 0.341797f, 0.593262f, 0.333252f,
+ 0.597656f, 0.322754f, 0.599609f, 0.312500f, 0.600586f, 0.301514f, 0.601074f, 0.289795f,
+ 0.600586f, 0.276611f, 0.600586f, 0.262207f, 0.599609f, 0.245850f, 0.596191f, 0.226929f,
+ 0.590820f, 0.204346f, 0.580078f, 0.175659f, 0.561035f, 0.133545f, 0.517090f, 0.051941f,
+ 0.000000f, 1.000000f, 0.045349f, 0.979004f, 0.085999f, 0.950684f, 0.122986f, 0.921387f,
+ 0.153931f, 0.895020f, 0.182373f, 0.868652f, 0.206543f, 0.844727f, 0.230835f, 0.820801f,
+ 0.252930f, 0.798340f, 0.272461f, 0.777832f, 0.290283f, 0.757812f, 0.308105f, 0.738770f,
+ 0.323730f, 0.720703f, 0.338623f, 0.703613f, 0.352051f, 0.687500f, 0.366699f, 0.671875f,
+ 0.378418f, 0.656738f, 0.391357f, 0.642090f, 0.403076f, 0.628418f, 0.412842f, 0.615234f,
+ 0.424072f, 0.602051f, 0.433350f, 0.590332f, 0.443115f, 0.578125f, 0.452393f, 0.566406f,
+ 0.461670f, 0.555176f, 0.469727f, 0.543945f, 0.478027f, 0.533691f, 0.487061f, 0.522949f,
+ 0.494873f, 0.512207f, 0.502441f, 0.502930f, 0.509766f, 0.492920f, 0.514648f, 0.484375f,
+ 0.522949f, 0.474609f, 0.529297f, 0.466064f, 0.537109f, 0.456543f, 0.542480f, 0.447998f,
+ 0.548340f, 0.439453f, 0.555176f, 0.430908f, 0.560547f, 0.422852f, 0.566406f, 0.414795f,
+ 0.571289f, 0.406738f, 0.576660f, 0.399170f, 0.581055f, 0.391602f, 0.586914f, 0.383545f,
+ 0.592285f, 0.375977f, 0.595215f, 0.367920f, 0.600098f, 0.359131f, 0.604004f, 0.351318f,
+ 0.607910f, 0.343262f, 0.611328f, 0.334229f, 0.615234f, 0.324951f, 0.618652f, 0.315918f,
+ 0.621582f, 0.305908f, 0.624023f, 0.295898f, 0.625000f, 0.285156f, 0.627441f, 0.273438f,
+ 0.628418f, 0.260742f, 0.628418f, 0.247070f, 0.627441f, 0.231201f, 0.625000f, 0.212646f,
+ 0.621094f, 0.191284f, 0.613281f, 0.163086f, 0.596680f, 0.123291f, 0.557617f, 0.049377f,
+ 0.000000f, 1.000000f, 0.045166f, 0.979004f, 0.087402f, 0.949707f, 0.123779f, 0.921387f,
+ 0.155640f, 0.893555f, 0.184082f, 0.867676f, 0.210815f, 0.841797f, 0.234497f, 0.818359f,
+ 0.256348f, 0.796387f, 0.275635f, 0.774902f, 0.295654f, 0.753906f, 0.312744f, 0.735352f,
+ 0.328857f, 0.716797f, 0.344727f, 0.699219f, 0.359863f, 0.682129f, 0.373291f, 0.666504f,
+ 0.386230f, 0.651367f, 0.399414f, 0.636230f, 0.410889f, 0.621582f, 0.422119f, 0.607910f,
+ 0.432861f, 0.594727f, 0.443604f, 0.582031f, 0.455322f, 0.569336f, 0.464844f, 0.557129f,
+ 0.473389f, 0.545410f, 0.482910f, 0.534180f, 0.491699f, 0.522949f, 0.500000f, 0.512207f,
+ 0.508301f, 0.501465f, 0.515625f, 0.491943f, 0.523926f, 0.481445f, 0.531250f, 0.471436f,
+ 0.538086f, 0.462402f, 0.543945f, 0.453125f, 0.552734f, 0.443604f, 0.559082f, 0.434570f,
+ 0.564453f, 0.425781f, 0.571289f, 0.417236f, 0.578125f, 0.408203f, 0.583008f, 0.400635f,
+ 0.589355f, 0.391846f, 0.595215f, 0.383789f, 0.600586f, 0.376221f, 0.606445f, 0.367920f,
+ 0.611816f, 0.359863f, 0.616699f, 0.352539f, 0.620117f, 0.343506f, 0.625000f, 0.334961f,
+ 0.628418f, 0.326904f, 0.633789f, 0.318359f, 0.637695f, 0.308838f, 0.641602f, 0.299805f,
+ 0.644531f, 0.289795f, 0.649414f, 0.279297f, 0.650879f, 0.269043f, 0.652832f, 0.257812f,
+ 0.654297f, 0.245117f, 0.655273f, 0.231323f, 0.655273f, 0.216064f, 0.654297f, 0.198608f,
+ 0.649414f, 0.178223f, 0.644531f, 0.151367f, 0.631348f, 0.114319f, 0.596680f, 0.045013f,
+ 0.000000f, 1.000000f, 0.045441f, 0.979004f, 0.087891f, 0.949707f, 0.123840f, 0.921387f,
+ 0.156616f, 0.893555f, 0.185913f, 0.866211f, 0.212646f, 0.840820f, 0.237183f, 0.816406f,
+ 0.259277f, 0.793945f, 0.281006f, 0.770996f, 0.299072f, 0.751465f, 0.317383f, 0.731445f,
+ 0.335449f, 0.711914f, 0.351562f, 0.694336f, 0.366211f, 0.677246f, 0.381592f, 0.660156f,
+ 0.394287f, 0.644531f, 0.406494f, 0.629883f, 0.420410f, 0.614258f, 0.431885f, 0.600586f,
+ 0.443604f, 0.586426f, 0.454346f, 0.573730f, 0.465088f, 0.560547f, 0.476074f, 0.548340f,
+ 0.485352f, 0.536133f, 0.494873f, 0.523926f, 0.502930f, 0.513184f, 0.512207f, 0.501953f,
+ 0.520996f, 0.490723f, 0.528320f, 0.480713f, 0.538086f, 0.469971f, 0.545410f, 0.459717f,
+ 0.552734f, 0.450195f, 0.559082f, 0.440674f, 0.567383f, 0.431152f, 0.575195f, 0.421143f,
+ 0.582520f, 0.411865f, 0.588867f, 0.403076f, 0.595703f, 0.394043f, 0.600586f, 0.385986f,
+ 0.607422f, 0.376953f, 0.613281f, 0.368652f, 0.619141f, 0.360596f, 0.624512f, 0.352539f,
+ 0.630371f, 0.344238f, 0.635254f, 0.336426f, 0.640625f, 0.327881f, 0.645996f, 0.318848f,
+ 0.650391f, 0.310547f, 0.655762f, 0.301758f, 0.659180f, 0.292725f, 0.663574f, 0.283447f,
+ 0.666992f, 0.274414f, 0.670410f, 0.263672f, 0.673828f, 0.253662f, 0.677246f, 0.242065f,
+ 0.681152f, 0.229858f, 0.681152f, 0.216797f, 0.682129f, 0.202271f, 0.681641f, 0.185425f,
+ 0.679199f, 0.165161f, 0.674316f, 0.140747f, 0.663086f, 0.105713f, 0.632812f, 0.041473f,
+ 0.000000f, 1.000000f, 0.045746f, 0.979004f, 0.088867f, 0.949219f, 0.124817f, 0.920898f,
+ 0.157837f, 0.892578f, 0.189331f, 0.864258f, 0.215332f, 0.838867f, 0.240723f, 0.814453f,
+ 0.262939f, 0.791016f, 0.284668f, 0.769043f, 0.305176f, 0.747070f, 0.323242f, 0.727051f,
+ 0.340576f, 0.708008f, 0.358643f, 0.688965f, 0.372559f, 0.671875f, 0.387939f, 0.654785f,
+ 0.402588f, 0.638184f, 0.416748f, 0.622559f, 0.429199f, 0.607422f, 0.441895f, 0.592773f,
+ 0.453125f, 0.578613f, 0.466309f, 0.564453f, 0.475830f, 0.551758f, 0.486084f, 0.539062f,
+ 0.497070f, 0.526367f, 0.505859f, 0.514648f, 0.516113f, 0.502441f, 0.525879f, 0.490723f,
+ 0.534668f, 0.479980f, 0.543945f, 0.468750f, 0.550293f, 0.458740f, 0.559570f, 0.447754f,
+ 0.567383f, 0.437744f, 0.577148f, 0.427002f, 0.582520f, 0.418213f, 0.589844f, 0.408447f,
+ 0.599121f, 0.398193f, 0.604004f, 0.389648f, 0.613281f, 0.379883f, 0.618164f, 0.371338f,
+ 0.625000f, 0.362305f, 0.631348f, 0.353760f, 0.637207f, 0.345459f, 0.643555f, 0.336914f,
+ 0.648926f, 0.328613f, 0.655762f, 0.320557f, 0.661133f, 0.312256f, 0.666504f, 0.303467f,
+ 0.669922f, 0.294922f, 0.676758f, 0.285889f, 0.681152f, 0.277100f, 0.685547f, 0.267578f,
+ 0.689453f, 0.258301f, 0.693848f, 0.248413f, 0.697266f, 0.238037f, 0.699707f, 0.227173f,
+ 0.703613f, 0.215576f, 0.704590f, 0.202881f, 0.707031f, 0.188232f, 0.706543f, 0.172241f,
+ 0.705566f, 0.153564f, 0.702637f, 0.130493f, 0.694336f, 0.097473f, 0.667969f, 0.037659f,
+ 0.000000f, 1.000000f, 0.046051f, 0.978516f, 0.089478f, 0.948730f, 0.125610f, 0.920410f,
+ 0.159546f, 0.891113f, 0.189697f, 0.863770f, 0.217651f, 0.837891f, 0.243774f, 0.812500f,
+ 0.266846f, 0.788574f, 0.289307f, 0.765625f, 0.310059f, 0.743652f, 0.329102f, 0.723145f,
+ 0.347168f, 0.703125f, 0.362793f, 0.685059f, 0.381348f, 0.665527f, 0.394775f, 0.648926f,
+ 0.410156f, 0.632324f, 0.425537f, 0.615723f, 0.437500f, 0.600586f, 0.451904f, 0.584961f,
+ 0.462402f, 0.570801f, 0.474854f, 0.556641f, 0.486328f, 0.542969f, 0.498047f, 0.529297f,
+ 0.508301f, 0.516602f, 0.518066f, 0.504395f, 0.529785f, 0.491699f, 0.538086f, 0.480469f,
+ 0.546875f, 0.468994f, 0.556641f, 0.457275f, 0.566406f, 0.446045f, 0.574707f, 0.435791f,
+ 0.583008f, 0.425049f, 0.591309f, 0.414551f, 0.599121f, 0.404541f, 0.606445f, 0.395264f,
+ 0.614746f, 0.385010f, 0.620605f, 0.375977f, 0.629395f, 0.365967f, 0.636230f, 0.356689f,
+ 0.642090f, 0.348145f, 0.649414f, 0.338867f, 0.656250f, 0.330078f, 0.661133f, 0.322266f,
+ 0.667480f, 0.313232f, 0.674805f, 0.304688f, 0.681152f, 0.296387f, 0.686035f, 0.288086f,
+ 0.690918f, 0.279541f, 0.696289f, 0.270020f, 0.702148f, 0.261230f, 0.706543f, 0.252686f,
+ 0.711426f, 0.243042f, 0.716309f, 0.233032f, 0.719727f, 0.223022f, 0.723633f, 0.213013f,
+ 0.726074f, 0.200928f, 0.728516f, 0.188721f, 0.730957f, 0.175537f, 0.732422f, 0.159790f,
+ 0.732910f, 0.142212f, 0.729980f, 0.119690f, 0.723145f, 0.088623f, 0.700684f, 0.034241f,
+ 0.000000f, 1.000000f, 0.046570f, 0.978027f, 0.089539f, 0.949219f, 0.125732f, 0.920410f,
+ 0.161377f, 0.890137f, 0.191650f, 0.862793f, 0.220947f, 0.835449f, 0.245361f, 0.810547f,
+ 0.271240f, 0.785645f, 0.292480f, 0.762695f, 0.315186f, 0.740234f, 0.333984f, 0.719238f,
+ 0.352539f, 0.699219f, 0.370605f, 0.679199f, 0.386719f, 0.661133f, 0.404053f, 0.642578f,
+ 0.418945f, 0.625488f, 0.432861f, 0.608887f, 0.447266f, 0.592773f, 0.460693f, 0.577148f,
+ 0.473389f, 0.562500f, 0.483887f, 0.548340f, 0.497070f, 0.534180f, 0.508301f, 0.520508f,
+ 0.519043f, 0.507324f, 0.531738f, 0.493896f, 0.541504f, 0.481689f, 0.551758f, 0.469482f,
+ 0.561035f, 0.457520f, 0.570312f, 0.446289f, 0.580566f, 0.434570f, 0.588867f, 0.423828f,
+ 0.597168f, 0.412842f, 0.605469f, 0.402344f, 0.614258f, 0.391846f, 0.622070f, 0.381836f,
+ 0.630371f, 0.371826f, 0.637207f, 0.362305f, 0.645508f, 0.352295f, 0.653320f, 0.342529f,
+ 0.659668f, 0.333496f, 0.666992f, 0.324463f, 0.673828f, 0.315430f, 0.679199f, 0.307129f,
+ 0.687012f, 0.297852f, 0.693848f, 0.289062f, 0.699219f, 0.281250f, 0.704590f, 0.272461f,
+ 0.711914f, 0.264160f, 0.716309f, 0.255371f, 0.722656f, 0.245850f, 0.726074f, 0.237549f,
+ 0.731934f, 0.228394f, 0.736328f, 0.218262f, 0.741211f, 0.208740f, 0.745117f, 0.197998f,
+ 0.750000f, 0.187256f, 0.752441f, 0.175171f, 0.755371f, 0.161987f, 0.756348f, 0.148071f,
+ 0.756836f, 0.131104f, 0.755371f, 0.109680f, 0.749512f, 0.081421f, 0.732422f, 0.030914f,
+ 0.000000f, 1.000000f, 0.047852f, 0.977051f, 0.089905f, 0.949219f, 0.128540f, 0.918457f,
+ 0.161499f, 0.890137f, 0.193604f, 0.861328f, 0.222656f, 0.833984f, 0.249634f, 0.808105f,
+ 0.274902f, 0.783203f, 0.298828f, 0.758789f, 0.318604f, 0.736816f, 0.339844f, 0.714844f,
+ 0.359131f, 0.694336f, 0.376465f, 0.674316f, 0.394775f, 0.655273f, 0.410645f, 0.636719f,
+ 0.426270f, 0.619629f, 0.442139f, 0.602051f, 0.456055f, 0.585938f, 0.469971f, 0.569824f,
+ 0.483887f, 0.554199f, 0.496826f, 0.539062f, 0.508301f, 0.524902f, 0.520020f, 0.510742f,
+ 0.532715f, 0.497070f, 0.541992f, 0.484375f, 0.553711f, 0.471191f, 0.563477f, 0.458740f,
+ 0.574707f, 0.446533f, 0.583984f, 0.434570f, 0.593750f, 0.422607f, 0.604492f, 0.411133f,
+ 0.612793f, 0.400635f, 0.620117f, 0.390137f, 0.629883f, 0.378662f, 0.637695f, 0.368408f,
+ 0.645020f, 0.358643f, 0.654297f, 0.348389f, 0.661133f, 0.339111f, 0.670410f, 0.328613f,
+ 0.676758f, 0.319336f, 0.684570f, 0.310059f, 0.691895f, 0.300537f, 0.698242f, 0.291992f,
+ 0.704102f, 0.283203f, 0.711426f, 0.274170f, 0.718262f, 0.265869f, 0.723633f, 0.257568f,
+ 0.729980f, 0.249023f, 0.736328f, 0.240723f, 0.741211f, 0.231201f, 0.747070f, 0.222168f,
+ 0.751953f, 0.213623f, 0.757812f, 0.204468f, 0.760254f, 0.194702f, 0.766113f, 0.184570f,
+ 0.770996f, 0.173340f, 0.772949f, 0.162354f, 0.777832f, 0.149902f, 0.779785f, 0.136108f,
+ 0.781250f, 0.120544f, 0.781738f, 0.101074f, 0.777832f, 0.074951f, 0.762207f, 0.028259f,
+ 0.000000f, 1.000000f, 0.048309f, 0.977051f, 0.089539f, 0.949219f, 0.129517f, 0.917969f,
+ 0.163574f, 0.889160f, 0.196167f, 0.859863f, 0.225220f, 0.832520f, 0.251953f, 0.806152f,
+ 0.279053f, 0.780273f, 0.301758f, 0.756348f, 0.323975f, 0.733398f, 0.345215f, 0.711426f,
+ 0.364746f, 0.689453f, 0.384766f, 0.668945f, 0.401123f, 0.649902f, 0.419922f, 0.630371f,
+ 0.434570f, 0.612793f, 0.450439f, 0.595215f, 0.466064f, 0.578125f, 0.479736f, 0.561523f,
+ 0.493408f, 0.545898f, 0.505859f, 0.530762f, 0.519531f, 0.515625f, 0.532227f, 0.501465f,
+ 0.543945f, 0.487549f, 0.555664f, 0.473633f, 0.567383f, 0.460693f, 0.577148f, 0.447998f,
+ 0.586426f, 0.435791f, 0.597656f, 0.423096f, 0.606934f, 0.411621f, 0.617676f, 0.399414f,
+ 0.625488f, 0.388672f, 0.635254f, 0.377197f, 0.645020f, 0.366211f, 0.653809f, 0.355469f,
+ 0.660645f, 0.345459f, 0.670410f, 0.334961f, 0.676758f, 0.325684f, 0.687500f, 0.314941f,
+ 0.694336f, 0.305176f, 0.700195f, 0.296143f, 0.709473f, 0.286133f, 0.715332f, 0.277344f,
+ 0.721680f, 0.268555f, 0.729492f, 0.259766f, 0.735840f, 0.250977f, 0.743164f, 0.242432f,
+ 0.748047f, 0.234131f, 0.753906f, 0.225952f, 0.761230f, 0.217163f, 0.765137f, 0.208130f,
+ 0.770996f, 0.199341f, 0.776855f, 0.190063f, 0.781738f, 0.180908f, 0.786621f, 0.170898f,
+ 0.791992f, 0.160645f, 0.794922f, 0.150146f, 0.798828f, 0.138184f, 0.801758f, 0.125244f,
+ 0.802246f, 0.110352f, 0.802734f, 0.092957f, 0.802734f, 0.068115f, 0.788086f, 0.025894f,
+ 0.000000f, 1.000000f, 0.048248f, 0.977539f, 0.089661f, 0.949219f, 0.129028f, 0.918457f,
+ 0.165649f, 0.887695f, 0.196777f, 0.859375f, 0.229126f, 0.830078f, 0.257080f, 0.803223f,
+ 0.281494f, 0.777832f, 0.307129f, 0.752441f, 0.330322f, 0.729004f, 0.350830f, 0.706543f,
+ 0.372559f, 0.684570f, 0.390625f, 0.664062f, 0.409424f, 0.643555f, 0.427002f, 0.624512f,
+ 0.444336f, 0.605957f, 0.459717f, 0.587891f, 0.475098f, 0.570312f, 0.490234f, 0.553711f,
+ 0.504395f, 0.537109f, 0.518066f, 0.521484f, 0.531250f, 0.506348f, 0.543457f, 0.492188f,
+ 0.556152f, 0.477539f, 0.567383f, 0.463867f, 0.579590f, 0.449951f, 0.589844f, 0.437256f,
+ 0.601562f, 0.424072f, 0.611816f, 0.411621f, 0.621582f, 0.399414f, 0.630859f, 0.387939f,
+ 0.641602f, 0.375977f, 0.649902f, 0.364502f, 0.659668f, 0.353516f, 0.669922f, 0.342773f,
+ 0.677246f, 0.332031f, 0.686523f, 0.321289f, 0.694336f, 0.311523f, 0.700684f, 0.302246f,
+ 0.710938f, 0.291504f, 0.716797f, 0.282227f, 0.725586f, 0.272217f, 0.733398f, 0.262939f,
+ 0.738770f, 0.254639f, 0.746582f, 0.245239f, 0.752930f, 0.236694f, 0.760254f, 0.228027f,
+ 0.766602f, 0.219482f, 0.771973f, 0.211426f, 0.779785f, 0.202393f, 0.786133f, 0.194458f,
+ 0.790039f, 0.185669f, 0.795410f, 0.176270f, 0.800293f, 0.167847f, 0.806641f, 0.158081f,
+ 0.811035f, 0.147949f, 0.815918f, 0.138184f, 0.818848f, 0.127075f, 0.822266f, 0.114990f,
+ 0.825684f, 0.101196f, 0.826172f, 0.084473f, 0.824219f, 0.061249f, 0.814941f, 0.023315f,
+ 0.000000f, 1.000000f, 0.047913f, 0.977539f, 0.091736f, 0.947754f, 0.129639f, 0.918457f,
+ 0.166504f, 0.887207f, 0.200928f, 0.856934f, 0.230225f, 0.829102f, 0.259277f, 0.801270f,
+ 0.286621f, 0.774902f, 0.311279f, 0.749512f, 0.333740f, 0.726074f, 0.356201f, 0.702637f,
+ 0.377930f, 0.680176f, 0.397705f, 0.658691f, 0.416504f, 0.638184f, 0.434326f, 0.618652f,
+ 0.452881f, 0.598633f, 0.468506f, 0.580566f, 0.484863f, 0.562988f, 0.499023f, 0.545898f,
+ 0.514160f, 0.529297f, 0.527344f, 0.513184f, 0.541504f, 0.497559f, 0.555664f, 0.482178f,
+ 0.567383f, 0.467773f, 0.580566f, 0.453369f, 0.592285f, 0.439453f, 0.604492f, 0.426025f,
+ 0.614746f, 0.413330f, 0.624023f, 0.400635f, 0.635254f, 0.387695f, 0.645508f, 0.375732f,
+ 0.656250f, 0.363770f, 0.665527f, 0.352295f, 0.674316f, 0.340820f, 0.682617f, 0.330566f,
+ 0.692383f, 0.319092f, 0.701172f, 0.308594f, 0.710449f, 0.298096f, 0.716797f, 0.288818f,
+ 0.725098f, 0.278564f, 0.734863f, 0.268066f, 0.741211f, 0.259277f, 0.749512f, 0.249268f,
+ 0.756348f, 0.240356f, 0.764160f, 0.231201f, 0.770020f, 0.222534f, 0.776855f, 0.213989f,
+ 0.784180f, 0.205200f, 0.790527f, 0.197021f, 0.796387f, 0.189209f, 0.802246f, 0.180420f,
+ 0.809570f, 0.172363f, 0.814941f, 0.162964f, 0.818359f, 0.154907f, 0.825195f, 0.145508f,
+ 0.828613f, 0.136475f, 0.834473f, 0.126465f, 0.839355f, 0.115967f, 0.842285f, 0.104614f,
+ 0.844727f, 0.091492f, 0.847168f, 0.076538f, 0.847168f, 0.055756f, 0.838379f, 0.021713f,
+ 0.000000f, 1.000000f, 0.047516f, 0.978027f, 0.091431f, 0.948242f, 0.131836f, 0.916992f,
+ 0.168091f, 0.886230f, 0.200684f, 0.856934f, 0.234253f, 0.826660f, 0.262207f, 0.799316f,
+ 0.290771f, 0.771973f, 0.315918f, 0.746582f, 0.339844f, 0.722168f, 0.362061f, 0.698242f,
+ 0.384521f, 0.675293f, 0.404541f, 0.653320f, 0.424561f, 0.632324f, 0.442627f, 0.612305f,
+ 0.461670f, 0.592285f, 0.477783f, 0.573242f, 0.494629f, 0.555176f, 0.509766f, 0.537598f,
+ 0.524902f, 0.520508f, 0.540039f, 0.503906f, 0.553223f, 0.488525f, 0.566406f, 0.473145f,
+ 0.578613f, 0.458252f, 0.592285f, 0.443359f, 0.604492f, 0.428955f, 0.616699f, 0.415283f,
+ 0.626465f, 0.402100f, 0.639160f, 0.388672f, 0.649414f, 0.376465f, 0.659668f, 0.364014f,
+ 0.670410f, 0.351562f, 0.678223f, 0.340332f, 0.689941f, 0.328369f, 0.698730f, 0.317383f,
+ 0.708496f, 0.306396f, 0.716309f, 0.295898f, 0.725586f, 0.284912f, 0.732910f, 0.274902f,
+ 0.742676f, 0.264893f, 0.748535f, 0.255859f, 0.757812f, 0.245850f, 0.765625f, 0.235718f,
+ 0.771973f, 0.227051f, 0.781250f, 0.217163f, 0.787598f, 0.208740f, 0.793457f, 0.200439f,
+ 0.800293f, 0.191528f, 0.808105f, 0.183105f, 0.813965f, 0.175049f, 0.819824f, 0.166748f,
+ 0.825684f, 0.159058f, 0.833008f, 0.150391f, 0.836426f, 0.142334f, 0.842773f, 0.133301f,
+ 0.847168f, 0.124451f, 0.851562f, 0.115479f, 0.856934f, 0.105164f, 0.860840f, 0.094604f,
+ 0.864258f, 0.082886f, 0.865234f, 0.068848f, 0.868652f, 0.049683f, 0.861328f, 0.018021f,
+ 0.000000f, 1.000000f, 0.047729f, 0.978027f, 0.091614f, 0.948242f, 0.132446f, 0.916504f,
+ 0.169434f, 0.885742f, 0.204468f, 0.854492f, 0.235474f, 0.825195f, 0.265869f, 0.796875f,
+ 0.293701f, 0.769531f, 0.319580f, 0.743164f, 0.344971f, 0.717773f, 0.368408f, 0.693848f,
+ 0.390137f, 0.670410f, 0.411621f, 0.647949f, 0.432861f, 0.625977f, 0.452148f, 0.605469f,
+ 0.469238f, 0.585449f, 0.487305f, 0.566406f, 0.503906f, 0.547363f, 0.518555f, 0.529785f,
+ 0.533203f, 0.512695f, 0.547852f, 0.496094f, 0.563477f, 0.479492f, 0.577148f, 0.463623f,
+ 0.590820f, 0.448486f, 0.603027f, 0.433350f, 0.616211f, 0.419189f, 0.626953f, 0.405273f,
+ 0.640625f, 0.390869f, 0.651367f, 0.377930f, 0.663086f, 0.364502f, 0.673828f, 0.352051f,
+ 0.683594f, 0.340088f, 0.693359f, 0.327881f, 0.703125f, 0.316650f, 0.714355f, 0.304688f,
+ 0.723145f, 0.293701f, 0.730957f, 0.283203f, 0.740234f, 0.272705f, 0.750000f, 0.261719f,
+ 0.757324f, 0.252197f, 0.765625f, 0.241943f, 0.772461f, 0.232910f, 0.781250f, 0.223145f,
+ 0.788086f, 0.213745f, 0.796387f, 0.204346f, 0.803711f, 0.195190f, 0.810059f, 0.187012f,
+ 0.816895f, 0.178101f, 0.824219f, 0.169800f, 0.831543f, 0.161377f, 0.836426f, 0.153809f,
+ 0.842285f, 0.145996f, 0.848633f, 0.137939f, 0.855469f, 0.130127f, 0.860840f, 0.121704f,
+ 0.863770f, 0.113342f, 0.869629f, 0.104309f, 0.873535f, 0.095337f, 0.879395f, 0.084961f,
+ 0.881836f, 0.074402f, 0.885254f, 0.061340f, 0.886719f, 0.044281f, 0.882324f, 0.017151f,
+ 0.000000f, 1.000000f, 0.047424f, 0.978027f, 0.092041f, 0.947754f, 0.133057f, 0.916016f,
+ 0.170532f, 0.884766f, 0.205933f, 0.854004f, 0.238892f, 0.823730f, 0.269043f, 0.794434f,
+ 0.298340f, 0.766602f, 0.324463f, 0.740234f, 0.349365f, 0.714355f, 0.373779f, 0.689453f,
+ 0.397217f, 0.665527f, 0.419189f, 0.642090f, 0.438477f, 0.620605f, 0.459229f, 0.599121f,
+ 0.477295f, 0.578613f, 0.495605f, 0.559082f, 0.512695f, 0.540039f, 0.530273f, 0.521484f,
+ 0.545898f, 0.503418f, 0.561035f, 0.486572f, 0.575195f, 0.469727f, 0.590332f, 0.453369f,
+ 0.604004f, 0.437988f, 0.616699f, 0.423096f, 0.628906f, 0.408447f, 0.642090f, 0.393799f,
+ 0.652832f, 0.380127f, 0.665527f, 0.366455f, 0.676270f, 0.353271f, 0.686523f, 0.341064f,
+ 0.697266f, 0.328125f, 0.707520f, 0.316162f, 0.718262f, 0.304199f, 0.728516f, 0.292480f,
+ 0.736816f, 0.281738f, 0.747070f, 0.270264f, 0.754395f, 0.260010f, 0.764160f, 0.249512f,
+ 0.772461f, 0.239380f, 0.781738f, 0.229126f, 0.788574f, 0.219604f, 0.796387f, 0.210327f,
+ 0.802734f, 0.201416f, 0.811035f, 0.192017f, 0.819824f, 0.182495f, 0.826172f, 0.174072f,
+ 0.833984f, 0.165161f, 0.838379f, 0.157349f, 0.847656f, 0.148560f, 0.852051f, 0.141113f,
+ 0.858887f, 0.133179f, 0.864258f, 0.125366f, 0.871094f, 0.117981f, 0.875977f, 0.110535f,
+ 0.881348f, 0.102539f, 0.886230f, 0.093567f, 0.891113f, 0.085266f, 0.896484f, 0.076294f,
+ 0.899902f, 0.066223f, 0.901855f, 0.055237f, 0.906738f, 0.039246f, 0.902344f, 0.014061f,
+ 0.000000f, 1.000000f, 0.047272f, 0.978027f, 0.093018f, 0.947266f, 0.134399f, 0.915527f,
+ 0.172729f, 0.883301f, 0.207520f, 0.852539f, 0.241577f, 0.821777f, 0.272949f, 0.792480f,
+ 0.301270f, 0.764160f, 0.330811f, 0.735840f, 0.356689f, 0.709961f, 0.381592f, 0.684570f,
+ 0.404053f, 0.660156f, 0.426270f, 0.636719f, 0.447998f, 0.614258f, 0.467773f, 0.592773f,
+ 0.487549f, 0.571777f, 0.506348f, 0.551270f, 0.523438f, 0.531738f, 0.539551f, 0.513184f,
+ 0.556152f, 0.495361f, 0.570801f, 0.477783f, 0.585938f, 0.460693f, 0.601562f, 0.443848f,
+ 0.616211f, 0.427734f, 0.629883f, 0.412598f, 0.641602f, 0.397949f, 0.652832f, 0.383545f,
+ 0.666016f, 0.369141f, 0.678223f, 0.355225f, 0.690430f, 0.342041f, 0.701660f, 0.328857f,
+ 0.711914f, 0.316650f, 0.721680f, 0.304443f, 0.731445f, 0.292236f, 0.743164f, 0.280518f,
+ 0.752441f, 0.269043f, 0.759766f, 0.258789f, 0.770020f, 0.247437f, 0.779297f, 0.236938f,
+ 0.786621f, 0.227051f, 0.795410f, 0.217041f, 0.803223f, 0.207031f, 0.811523f, 0.197632f,
+ 0.818359f, 0.188477f, 0.826172f, 0.179688f, 0.834473f, 0.170288f, 0.841309f, 0.161865f,
+ 0.847656f, 0.153076f, 0.854492f, 0.144653f, 0.861816f, 0.136597f, 0.867188f, 0.128906f,
+ 0.874512f, 0.120544f, 0.879883f, 0.113647f, 0.885254f, 0.106201f, 0.890137f, 0.099121f,
+ 0.898926f, 0.090759f, 0.901367f, 0.085083f, 0.906250f, 0.075439f, 0.912109f, 0.066650f,
+ 0.916992f, 0.058655f, 0.919434f, 0.047668f, 0.922852f, 0.034393f, 0.922363f, 0.013527f,
+ 0.000000f, 1.000000f, 0.048004f, 0.977539f, 0.093628f, 0.946777f, 0.135254f, 0.915039f,
+ 0.174438f, 0.882324f, 0.210327f, 0.850586f, 0.244751f, 0.819336f, 0.275635f, 0.790039f,
+ 0.307129f, 0.760254f, 0.335449f, 0.732422f, 0.361816f, 0.706055f, 0.386719f, 0.680176f,
+ 0.410400f, 0.655273f, 0.432861f, 0.631836f, 0.455078f, 0.608398f, 0.475586f, 0.586426f,
+ 0.495605f, 0.564941f, 0.514160f, 0.544434f, 0.532227f, 0.524414f, 0.550781f, 0.504883f,
+ 0.567871f, 0.486328f, 0.583496f, 0.468750f, 0.598145f, 0.451416f, 0.612793f, 0.434570f,
+ 0.627441f, 0.418701f, 0.640625f, 0.402832f, 0.654297f, 0.387451f, 0.667480f, 0.372559f,
+ 0.679199f, 0.358398f, 0.690430f, 0.344727f, 0.703125f, 0.330566f, 0.713867f, 0.317627f,
+ 0.725586f, 0.305176f, 0.735352f, 0.292480f, 0.745605f, 0.280518f, 0.754883f, 0.268799f,
+ 0.766602f, 0.257080f, 0.774414f, 0.246582f, 0.782715f, 0.235718f, 0.792969f, 0.225342f,
+ 0.802246f, 0.214478f, 0.809570f, 0.204956f, 0.817383f, 0.195312f, 0.827148f, 0.185303f,
+ 0.833496f, 0.176147f, 0.841797f, 0.166870f, 0.848145f, 0.158325f, 0.854980f, 0.150269f,
+ 0.862305f, 0.141479f, 0.871094f, 0.132690f, 0.875488f, 0.124817f, 0.883789f, 0.116272f,
+ 0.887695f, 0.109802f, 0.895020f, 0.101440f, 0.901367f, 0.094666f, 0.906250f, 0.087646f,
+ 0.912109f, 0.080322f, 0.917969f, 0.073486f, 0.923340f, 0.066406f, 0.926270f, 0.058746f,
+ 0.930664f, 0.050201f, 0.935059f, 0.041504f, 0.938965f, 0.029541f, 0.938965f, 0.010628f,
+ 0.000000f, 1.000000f, 0.048798f, 0.977051f, 0.092773f, 0.947754f, 0.135986f, 0.914551f,
+ 0.175415f, 0.881836f, 0.212524f, 0.849121f, 0.247314f, 0.817871f, 0.280029f, 0.787109f,
+ 0.310059f, 0.758301f, 0.337646f, 0.729980f, 0.365479f, 0.702637f, 0.392090f, 0.675781f,
+ 0.417480f, 0.650391f, 0.441162f, 0.625977f, 0.461670f, 0.602539f, 0.485107f, 0.579590f,
+ 0.504883f, 0.557617f, 0.523438f, 0.536621f, 0.541992f, 0.516602f, 0.559082f, 0.497070f,
+ 0.576172f, 0.478271f, 0.592773f, 0.459961f, 0.609375f, 0.441895f, 0.625000f, 0.424561f,
+ 0.640137f, 0.408203f, 0.653809f, 0.392334f, 0.666016f, 0.377197f, 0.678711f, 0.362305f,
+ 0.691406f, 0.347900f, 0.703125f, 0.333496f, 0.716797f, 0.319336f, 0.727051f, 0.306641f,
+ 0.738770f, 0.293701f, 0.747559f, 0.281494f, 0.759277f, 0.269043f, 0.768555f, 0.257324f,
+ 0.781250f, 0.245239f, 0.787598f, 0.235229f, 0.797363f, 0.223877f, 0.807617f, 0.212891f,
+ 0.813965f, 0.203491f, 0.824219f, 0.192871f, 0.833984f, 0.182861f, 0.840332f, 0.173584f,
+ 0.847168f, 0.164795f, 0.855469f, 0.155518f, 0.863770f, 0.146118f, 0.869141f, 0.138306f,
+ 0.876465f, 0.130005f, 0.882812f, 0.122070f, 0.890137f, 0.113831f, 0.896484f, 0.105835f,
+ 0.903809f, 0.097900f, 0.908691f, 0.090881f, 0.914062f, 0.083740f, 0.920898f, 0.076721f,
+ 0.926270f, 0.069824f, 0.931152f, 0.063232f, 0.937012f, 0.056519f, 0.941895f, 0.049957f,
+ 0.946289f, 0.042999f, 0.950684f, 0.034088f, 0.955078f, 0.024399f, 0.956055f, 0.008232f,
+ 0.000000f, 1.000000f, 0.048370f, 0.977539f, 0.094666f, 0.946289f, 0.137939f, 0.913086f,
+ 0.176147f, 0.881348f, 0.214966f, 0.847656f, 0.251465f, 0.815430f, 0.282959f, 0.785156f,
+ 0.315186f, 0.754395f, 0.343750f, 0.726074f, 0.372559f, 0.697754f, 0.398926f, 0.670898f,
+ 0.424072f, 0.645020f, 0.449219f, 0.620117f, 0.470947f, 0.596191f, 0.493164f, 0.572754f,
+ 0.512695f, 0.550781f, 0.532227f, 0.529785f, 0.552246f, 0.508789f, 0.571289f, 0.488281f,
+ 0.588379f, 0.468994f, 0.604492f, 0.450684f, 0.621094f, 0.432617f, 0.636230f, 0.415527f,
+ 0.649902f, 0.398682f, 0.664062f, 0.382568f, 0.678223f, 0.366699f, 0.692383f, 0.351318f,
+ 0.704102f, 0.337158f, 0.716309f, 0.322754f, 0.728516f, 0.308838f, 0.740234f, 0.295410f,
+ 0.750977f, 0.282471f, 0.761719f, 0.270020f, 0.772949f, 0.257568f, 0.782715f, 0.245850f,
+ 0.792969f, 0.234375f, 0.801758f, 0.223389f, 0.811523f, 0.212280f, 0.820312f, 0.201660f,
+ 0.827637f, 0.191772f, 0.837891f, 0.181396f, 0.846680f, 0.171509f, 0.853027f, 0.162720f,
+ 0.862305f, 0.152954f, 0.868652f, 0.144287f, 0.875977f, 0.135620f, 0.882812f, 0.127197f,
+ 0.891113f, 0.118408f, 0.896973f, 0.110596f, 0.902832f, 0.102966f, 0.909180f, 0.095642f,
+ 0.916504f, 0.087952f, 0.923828f, 0.079956f, 0.928223f, 0.073242f, 0.934570f, 0.066040f,
+ 0.938965f, 0.059753f, 0.943848f, 0.053253f, 0.949707f, 0.046722f, 0.955078f, 0.040619f,
+ 0.960449f, 0.034271f, 0.965820f, 0.027802f, 0.969238f, 0.018631f, 0.970215f, 0.006660f,
+ 0.000000f, 1.000000f, 0.048035f, 0.977539f, 0.095276f, 0.946289f, 0.138306f, 0.913086f,
+ 0.178833f, 0.879395f, 0.217773f, 0.846191f, 0.253174f, 0.813965f, 0.286865f, 0.782227f,
+ 0.319092f, 0.751465f, 0.349854f, 0.722168f, 0.377686f, 0.693848f, 0.405029f, 0.666016f,
+ 0.430908f, 0.640137f, 0.455566f, 0.614746f, 0.478760f, 0.589844f, 0.500488f, 0.566406f,
+ 0.522949f, 0.543457f, 0.542480f, 0.521484f, 0.561035f, 0.500488f, 0.580078f, 0.480469f,
+ 0.598145f, 0.460693f, 0.614746f, 0.441895f, 0.630859f, 0.423828f, 0.646484f, 0.406250f,
+ 0.660156f, 0.389404f, 0.675781f, 0.372559f, 0.690918f, 0.356445f, 0.704102f, 0.341064f,
+ 0.717285f, 0.326416f, 0.729492f, 0.312012f, 0.741699f, 0.297852f, 0.752930f, 0.284912f,
+ 0.763672f, 0.271484f, 0.774902f, 0.258789f, 0.785645f, 0.246704f, 0.795898f, 0.234741f,
+ 0.805664f, 0.223145f, 0.816406f, 0.211548f, 0.823730f, 0.201294f, 0.833984f, 0.190308f,
+ 0.842773f, 0.179932f, 0.850098f, 0.170654f, 0.858398f, 0.160645f, 0.865723f, 0.151489f,
+ 0.874512f, 0.142456f, 0.882812f, 0.132935f, 0.888184f, 0.125122f, 0.895996f, 0.116394f,
+ 0.903809f, 0.108032f, 0.910645f, 0.100220f, 0.916504f, 0.092651f, 0.922852f, 0.084961f,
+ 0.930176f, 0.076965f, 0.935059f, 0.070496f, 0.940430f, 0.063599f, 0.944824f, 0.057953f,
+ 0.953125f, 0.049774f, 0.958496f, 0.043243f, 0.963867f, 0.036804f, 0.969238f, 0.030823f,
+ 0.973145f, 0.025299f, 0.978027f, 0.019104f, 0.982910f, 0.013573f, 0.985352f, 0.004253f,
+ 0.000000f, 1.000000f, 0.049408f, 0.977051f, 0.094910f, 0.946289f, 0.138184f, 0.913574f,
+ 0.179688f, 0.879395f, 0.220215f, 0.844727f, 0.255371f, 0.812012f, 0.289551f, 0.780762f,
+ 0.323242f, 0.749023f, 0.353760f, 0.719238f, 0.382324f, 0.690430f, 0.411377f, 0.661621f,
+ 0.439209f, 0.634277f, 0.461426f, 0.609375f, 0.487793f, 0.583496f, 0.508301f, 0.560059f,
+ 0.532227f, 0.536621f, 0.551758f, 0.514160f, 0.570801f, 0.492920f, 0.589844f, 0.472412f,
+ 0.608398f, 0.452393f, 0.625000f, 0.433105f, 0.641602f, 0.414551f, 0.657715f, 0.396729f,
+ 0.672852f, 0.379150f, 0.688477f, 0.362305f, 0.703613f, 0.346191f, 0.716309f, 0.331055f,
+ 0.729004f, 0.316406f, 0.739258f, 0.302246f, 0.753418f, 0.287354f, 0.766602f, 0.273193f,
+ 0.776367f, 0.261230f, 0.786621f, 0.248291f, 0.799316f, 0.235229f, 0.807617f, 0.224731f,
+ 0.817871f, 0.212280f, 0.829102f, 0.200684f, 0.835938f, 0.190674f, 0.846680f, 0.179321f,
+ 0.853516f, 0.170044f, 0.863770f, 0.159302f, 0.871582f, 0.150269f, 0.879883f, 0.140503f,
+ 0.888184f, 0.131592f, 0.895020f, 0.122803f, 0.902344f, 0.114258f, 0.908691f, 0.106384f,
+ 0.915527f, 0.098022f, 0.920898f, 0.090515f, 0.929199f, 0.082642f, 0.936523f, 0.074036f,
+ 0.939941f, 0.069031f, 0.948730f, 0.060455f, 0.952637f, 0.053833f, 0.958496f, 0.048523f,
+ 0.968262f, 0.038727f, 0.968262f, 0.035004f, 0.974121f, 0.030151f, 0.983887f, 0.019562f,
+ 0.983887f, 0.017029f, 0.983887f, 0.016098f, 0.999512f, 0.000947f, 0.999512f, 0.000007f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f,
+ 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.990234f, 0.000000f, 0.988770f,
+ 0.000000f, 0.986816f, 0.000000f, 0.984375f, 0.000000f, 0.982422f, 0.000000f, 0.979492f,
+ 0.000000f, 0.977539f, 0.000000f, 0.974609f, 0.000000f, 0.971680f, 0.000000f, 0.968750f,
+ 0.000000f, 0.964844f, 0.000000f, 0.961914f, 0.000000f, 0.958496f, 0.000000f, 0.954590f,
+ 0.000000f, 0.950684f, 0.000000f, 0.946289f, 0.000000f, 0.941406f, 0.000000f, 0.937012f,
+ 0.000000f, 0.932129f, 0.000000f, 0.927246f, 0.000000f, 0.920898f, 0.000000f, 0.915039f,
+ 0.000000f, 0.909180f, 0.000000f, 0.902344f, 0.000000f, 0.895996f, 0.000000f, 0.889160f,
+ 0.000000f, 0.881348f, 0.000000f, 0.873047f, 0.000000f, 0.864746f, 0.000000f, 0.855469f,
+ 0.000000f, 0.846191f, 0.000000f, 0.836426f, 0.000000f, 0.825684f, 0.000000f, 0.814453f,
+ 0.000000f, 0.802246f, 0.000000f, 0.789062f, 0.000000f, 0.775879f, 0.000000f, 0.761719f,
+ 0.000000f, 0.745605f, 0.000000f, 0.729004f, 0.000000f, 0.709961f, 0.000000f, 0.691406f,
+ 0.000000f, 0.670898f, 0.000000f, 0.646973f, 0.000000f, 0.622070f, 0.000000f, 0.594238f,
+ 0.000000f, 0.564941f, 0.000000f, 0.529297f, 0.000000f, 0.489746f, 0.000000f, 0.445312f,
+ 0.000000f, 0.391113f, 0.000000f, 0.323730f, 0.000000f, 0.234131f, 0.000000f, 0.089417f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.994629f,
+ 0.000000f, 0.993652f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.988770f,
+ 0.000000f, 0.986816f, 0.000000f, 0.984375f, 0.000000f, 0.981934f, 0.000000f, 0.979980f,
+ 0.000000f, 0.977051f, 0.000000f, 0.974609f, 0.000000f, 0.971680f, 0.000000f, 0.968262f,
+ 0.000000f, 0.965332f, 0.000000f, 0.961914f, 0.000000f, 0.958008f, 0.000000f, 0.954102f,
+ 0.000000f, 0.950195f, 0.000000f, 0.946289f, 0.000000f, 0.940918f, 0.000000f, 0.936523f,
+ 0.000000f, 0.932129f, 0.000000f, 0.926758f, 0.000000f, 0.920898f, 0.000000f, 0.915039f,
+ 0.000000f, 0.908691f, 0.000000f, 0.902344f, 0.000000f, 0.895996f, 0.000000f, 0.888672f,
+ 0.000000f, 0.880859f, 0.000000f, 0.872559f, 0.000000f, 0.864258f, 0.000000f, 0.854980f,
+ 0.000000f, 0.846191f, 0.000000f, 0.836426f, 0.000000f, 0.825195f, 0.000000f, 0.813965f,
+ 0.000000f, 0.801758f, 0.000000f, 0.789062f, 0.000000f, 0.775879f, 0.000000f, 0.761230f,
+ 0.000000f, 0.745117f, 0.000000f, 0.728516f, 0.000000f, 0.709961f, 0.000000f, 0.691406f,
+ 0.000002f, 0.670410f, 0.000005f, 0.646973f, 0.000007f, 0.622070f, 0.000007f, 0.594238f,
+ 0.000007f, 0.564941f, 0.000006f, 0.529297f, 0.000005f, 0.489990f, 0.000004f, 0.445557f,
+ 0.000004f, 0.391846f, 0.000003f, 0.324463f, 0.000002f, 0.234131f, 0.000001f, 0.089661f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f,
+ 0.000000f, 0.993164f, 0.000000f, 0.991699f, 0.000000f, 0.989746f, 0.000000f, 0.988281f,
+ 0.000000f, 0.985840f, 0.000000f, 0.983887f, 0.000000f, 0.981445f, 0.000000f, 0.979492f,
+ 0.000000f, 0.976562f, 0.000000f, 0.974121f, 0.000000f, 0.971191f, 0.000000f, 0.967773f,
+ 0.000000f, 0.964844f, 0.000000f, 0.961426f, 0.000000f, 0.957520f, 0.000000f, 0.953613f,
+ 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.940430f, 0.000000f, 0.936035f,
+ 0.000004f, 0.931641f, 0.000008f, 0.926270f, 0.000015f, 0.920410f, 0.000021f, 0.914551f,
+ 0.000028f, 0.908203f, 0.000035f, 0.901855f, 0.000043f, 0.895020f, 0.000051f, 0.888184f,
+ 0.000058f, 0.880371f, 0.000067f, 0.872070f, 0.000075f, 0.863281f, 0.000079f, 0.854492f,
+ 0.000080f, 0.845215f, 0.000080f, 0.835449f, 0.000079f, 0.825195f, 0.000075f, 0.812988f,
+ 0.000073f, 0.801270f, 0.000069f, 0.789062f, 0.000065f, 0.774902f, 0.000060f, 0.760742f,
+ 0.000057f, 0.744629f, 0.000056f, 0.727539f, 0.000057f, 0.710449f, 0.000059f, 0.690918f,
+ 0.000057f, 0.669922f, 0.000052f, 0.646484f, 0.000048f, 0.621582f, 0.000049f, 0.593750f,
+ 0.000044f, 0.564453f, 0.000042f, 0.528809f, 0.000038f, 0.489502f, 0.000034f, 0.445312f,
+ 0.000030f, 0.391113f, 0.000026f, 0.323975f, 0.000019f, 0.233887f, 0.000008f, 0.089050f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.997559f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994141f,
+ 0.000000f, 0.992188f, 0.000009f, 0.991211f, 0.000024f, 0.989258f, 0.000037f, 0.987793f,
+ 0.000054f, 0.985840f, 0.000070f, 0.982910f, 0.000083f, 0.981445f, 0.000101f, 0.979004f,
+ 0.000117f, 0.976074f, 0.000130f, 0.973633f, 0.000143f, 0.970215f, 0.000160f, 0.967285f,
+ 0.000174f, 0.963867f, 0.000186f, 0.960938f, 0.000197f, 0.957031f, 0.000211f, 0.953125f,
+ 0.000225f, 0.949219f, 0.000237f, 0.944336f, 0.000247f, 0.939941f, 0.000256f, 0.935059f,
+ 0.000266f, 0.930176f, 0.000268f, 0.925293f, 0.000266f, 0.919434f, 0.000260f, 0.913574f,
+ 0.000252f, 0.907227f, 0.000244f, 0.900879f, 0.000238f, 0.894043f, 0.000236f, 0.887207f,
+ 0.000232f, 0.879395f, 0.000230f, 0.871094f, 0.000229f, 0.862793f, 0.000233f, 0.854004f,
+ 0.000238f, 0.844727f, 0.000242f, 0.834473f, 0.000234f, 0.823730f, 0.000230f, 0.812012f,
+ 0.000226f, 0.799805f, 0.000228f, 0.787598f, 0.000228f, 0.773926f, 0.000227f, 0.759766f,
+ 0.000212f, 0.743652f, 0.000209f, 0.726562f, 0.000208f, 0.709473f, 0.000208f, 0.690430f,
+ 0.000202f, 0.668945f, 0.000182f, 0.645508f, 0.000180f, 0.621094f, 0.000175f, 0.593750f,
+ 0.000169f, 0.563477f, 0.000148f, 0.528809f, 0.000142f, 0.489014f, 0.000134f, 0.445312f,
+ 0.000112f, 0.390869f, 0.000100f, 0.324219f, 0.000075f, 0.233398f, 0.000025f, 0.088928f,
+ 0.000000f, 1.000000f, 0.000054f, 0.999512f, 0.000113f, 0.999023f, 0.000167f, 0.998535f,
+ 0.000189f, 0.997070f, 0.000246f, 0.996094f, 0.000273f, 0.995117f, 0.000290f, 0.993652f,
+ 0.000325f, 0.992188f, 0.000354f, 0.990234f, 0.000372f, 0.988770f, 0.000384f, 0.986816f,
+ 0.000405f, 0.984863f, 0.000433f, 0.982422f, 0.000450f, 0.980469f, 0.000462f, 0.977539f,
+ 0.000470f, 0.975098f, 0.000484f, 0.972168f, 0.000509f, 0.969238f, 0.000523f, 0.965820f,
+ 0.000534f, 0.962891f, 0.000546f, 0.959473f, 0.000547f, 0.956055f, 0.000560f, 0.951660f,
+ 0.000568f, 0.947754f, 0.000567f, 0.942871f, 0.000567f, 0.938965f, 0.000565f, 0.934082f,
+ 0.000562f, 0.928711f, 0.000576f, 0.923828f, 0.000587f, 0.917969f, 0.000571f, 0.911621f,
+ 0.000574f, 0.905762f, 0.000578f, 0.899414f, 0.000585f, 0.893066f, 0.000604f, 0.885254f,
+ 0.000618f, 0.877930f, 0.000595f, 0.869629f, 0.000592f, 0.860840f, 0.000587f, 0.852051f,
+ 0.000584f, 0.843262f, 0.000597f, 0.833008f, 0.000576f, 0.822266f, 0.000570f, 0.810547f,
+ 0.000566f, 0.798828f, 0.000563f, 0.786133f, 0.000557f, 0.772949f, 0.000562f, 0.758301f,
+ 0.000527f, 0.742188f, 0.000520f, 0.726074f, 0.000510f, 0.708008f, 0.000502f, 0.688965f,
+ 0.000501f, 0.667969f, 0.000459f, 0.644531f, 0.000446f, 0.620117f, 0.000430f, 0.592773f,
+ 0.000426f, 0.562500f, 0.000376f, 0.528320f, 0.000356f, 0.488770f, 0.000336f, 0.444824f,
+ 0.000289f, 0.390869f, 0.000256f, 0.323975f, 0.000186f, 0.233765f, 0.000055f, 0.088806f,
+ 0.000000f, 1.000000f, 0.000290f, 0.999512f, 0.000479f, 0.998535f, 0.000458f, 0.997559f,
+ 0.000594f, 0.997070f, 0.000597f, 0.995605f, 0.000589f, 0.994629f, 0.000578f, 0.993164f,
+ 0.000700f, 0.991699f, 0.000701f, 0.989746f, 0.000705f, 0.987793f, 0.000717f, 0.986328f,
+ 0.000832f, 0.983887f, 0.000863f, 0.980957f, 0.000886f, 0.979492f, 0.000904f, 0.976562f,
+ 0.000924f, 0.973633f, 0.001012f, 0.970703f, 0.001016f, 0.967773f, 0.001011f, 0.964844f,
+ 0.001012f, 0.961426f, 0.000993f, 0.958008f, 0.000986f, 0.954102f, 0.001061f, 0.950195f,
+ 0.001078f, 0.945801f, 0.001095f, 0.941895f, 0.001074f, 0.936523f, 0.001083f, 0.932129f,
+ 0.001089f, 0.927246f, 0.001166f, 0.921387f, 0.001181f, 0.916016f, 0.001144f, 0.910156f,
+ 0.001142f, 0.903809f, 0.001140f, 0.897461f, 0.001143f, 0.890625f, 0.001197f, 0.883301f,
+ 0.001204f, 0.875488f, 0.001161f, 0.867188f, 0.001157f, 0.859375f, 0.001145f, 0.850098f,
+ 0.001142f, 0.841309f, 0.001189f, 0.831055f, 0.001193f, 0.820312f, 0.001132f, 0.808594f,
+ 0.001108f, 0.796387f, 0.001103f, 0.784668f, 0.001098f, 0.770996f, 0.001127f, 0.756348f,
+ 0.001060f, 0.740234f, 0.001034f, 0.724121f, 0.001017f, 0.706543f, 0.000998f, 0.687988f,
+ 0.001012f, 0.666504f, 0.000923f, 0.643066f, 0.000898f, 0.618652f, 0.000873f, 0.591797f,
+ 0.000868f, 0.561523f, 0.000779f, 0.527344f, 0.000734f, 0.487793f, 0.000689f, 0.444580f,
+ 0.000599f, 0.389893f, 0.000523f, 0.323730f, 0.000373f, 0.233398f, 0.000099f, 0.089417f,
+ 0.000000f, 1.000000f, 0.000400f, 0.999023f, 0.000689f, 0.998047f, 0.000645f, 0.997559f,
+ 0.000905f, 0.996094f, 0.000939f, 0.995117f, 0.000952f, 0.994141f, 0.000978f, 0.992676f,
+ 0.001211f, 0.990234f, 0.001227f, 0.988770f, 0.001247f, 0.986816f, 0.001269f, 0.985352f,
+ 0.001455f, 0.982422f, 0.001476f, 0.979980f, 0.001487f, 0.977539f, 0.001502f, 0.975098f,
+ 0.001516f, 0.973145f, 0.001651f, 0.968750f, 0.001658f, 0.966309f, 0.001681f, 0.962891f,
+ 0.001699f, 0.959961f, 0.001675f, 0.956055f, 0.001800f, 0.952148f, 0.001839f, 0.948242f,
+ 0.001871f, 0.943848f, 0.001901f, 0.939453f, 0.001863f, 0.935059f, 0.001866f, 0.929688f,
+ 0.001955f, 0.925293f, 0.001974f, 0.919434f, 0.001995f, 0.913574f, 0.002020f, 0.908203f,
+ 0.001972f, 0.901367f, 0.001980f, 0.895020f, 0.001961f, 0.888672f, 0.002048f, 0.880859f,
+ 0.002071f, 0.873535f, 0.002018f, 0.865234f, 0.002022f, 0.856445f, 0.001982f, 0.847656f,
+ 0.001980f, 0.838867f, 0.002050f, 0.828125f, 0.002064f, 0.817871f, 0.001986f, 0.806152f,
+ 0.001945f, 0.794434f, 0.001921f, 0.782227f, 0.001959f, 0.769043f, 0.001961f, 0.753906f,
+ 0.001888f, 0.738770f, 0.001832f, 0.722168f, 0.001790f, 0.704590f, 0.001757f, 0.686035f,
+ 0.001786f, 0.664551f, 0.001705f, 0.641602f, 0.001612f, 0.617188f, 0.001554f, 0.590820f,
+ 0.001547f, 0.560547f, 0.001420f, 0.525879f, 0.001320f, 0.487549f, 0.001236f, 0.444092f,
+ 0.001087f, 0.389893f, 0.000926f, 0.323975f, 0.000646f, 0.233643f, 0.000157f, 0.088928f,
+ 0.000000f, 1.000000f, 0.000587f, 0.999023f, 0.001062f, 0.998047f, 0.001081f, 0.997070f,
+ 0.001424f, 0.995605f, 0.001475f, 0.994141f, 0.001475f, 0.992676f, 0.001491f, 0.991699f,
+ 0.001861f, 0.989258f, 0.001906f, 0.987305f, 0.001948f, 0.985840f, 0.001966f, 0.983887f,
+ 0.002239f, 0.980957f, 0.002279f, 0.978516f, 0.002285f, 0.976074f, 0.002308f, 0.973633f,
+ 0.002323f, 0.971191f, 0.002596f, 0.967773f, 0.002604f, 0.963867f, 0.002636f, 0.960938f,
+ 0.002666f, 0.958008f, 0.002708f, 0.954102f, 0.002844f, 0.950195f, 0.002907f, 0.945801f,
+ 0.002932f, 0.941406f, 0.002943f, 0.937012f, 0.002970f, 0.932617f, 0.002930f, 0.928223f,
+ 0.003109f, 0.922363f, 0.003160f, 0.916992f, 0.003153f, 0.910645f, 0.003172f, 0.904785f,
+ 0.003120f, 0.898926f, 0.003136f, 0.892578f, 0.003147f, 0.885742f, 0.003265f, 0.877930f,
+ 0.003284f, 0.870117f, 0.003296f, 0.862305f, 0.003214f, 0.853516f, 0.003225f, 0.845215f,
+ 0.003166f, 0.835938f, 0.003283f, 0.825195f, 0.003279f, 0.814941f, 0.003195f, 0.803711f,
+ 0.003191f, 0.791992f, 0.003122f, 0.779785f, 0.003168f, 0.766113f, 0.003157f, 0.751953f,
+ 0.003057f, 0.736328f, 0.002977f, 0.719727f, 0.002920f, 0.702637f, 0.002855f, 0.684082f,
+ 0.002897f, 0.662598f, 0.002787f, 0.639648f, 0.002647f, 0.615234f, 0.002542f, 0.588867f,
+ 0.002527f, 0.559082f, 0.002344f, 0.524902f, 0.002171f, 0.486572f, 0.002010f, 0.443848f,
+ 0.001811f, 0.389404f, 0.001480f, 0.323242f, 0.001016f, 0.233276f, 0.000229f, 0.088867f,
+ 0.000000f, 1.000000f, 0.000327f, 0.999023f, 0.001012f, 0.997559f, 0.001468f, 0.996582f,
+ 0.001693f, 0.995117f, 0.002108f, 0.993164f, 0.002146f, 0.991699f, 0.002295f, 0.990234f,
+ 0.002686f, 0.988281f, 0.002760f, 0.986328f, 0.002800f, 0.984375f, 0.002920f, 0.982422f,
+ 0.003242f, 0.979004f, 0.003294f, 0.976562f, 0.003368f, 0.974121f, 0.003374f, 0.971680f,
+ 0.003489f, 0.968750f, 0.003803f, 0.965332f, 0.003891f, 0.961914f, 0.003895f, 0.958008f,
+ 0.003929f, 0.955078f, 0.003956f, 0.952148f, 0.004257f, 0.947266f, 0.004269f, 0.943359f,
+ 0.004345f, 0.938477f, 0.004395f, 0.934570f, 0.004387f, 0.929688f, 0.004433f, 0.924805f,
+ 0.004612f, 0.918945f, 0.004677f, 0.913574f, 0.004688f, 0.907715f, 0.004730f, 0.901855f,
+ 0.004765f, 0.895996f, 0.004665f, 0.889648f, 0.004887f, 0.882324f, 0.004883f, 0.874512f,
+ 0.004932f, 0.867188f, 0.004917f, 0.859375f, 0.004841f, 0.850586f, 0.004833f, 0.841797f,
+ 0.004807f, 0.832520f, 0.004986f, 0.821777f, 0.004955f, 0.811523f, 0.004833f, 0.800293f,
+ 0.004814f, 0.789062f, 0.004726f, 0.776855f, 0.004807f, 0.763184f, 0.004787f, 0.748535f,
+ 0.004654f, 0.732910f, 0.004623f, 0.717285f, 0.004509f, 0.700195f, 0.004387f, 0.681641f,
+ 0.004436f, 0.660156f, 0.004265f, 0.637695f, 0.004120f, 0.613770f, 0.003937f, 0.587891f,
+ 0.003866f, 0.557129f, 0.003656f, 0.523438f, 0.003355f, 0.485596f, 0.003040f, 0.442871f,
+ 0.002743f, 0.388428f, 0.002197f, 0.323486f, 0.001485f, 0.232666f, 0.000321f, 0.089050f,
+ 0.000000f, 1.000000f, 0.000594f, 0.999023f, 0.001543f, 0.997559f, 0.002008f, 0.996094f,
+ 0.002377f, 0.994141f, 0.002901f, 0.992188f, 0.002945f, 0.990723f, 0.003237f, 0.988770f,
+ 0.003736f, 0.986816f, 0.003828f, 0.984863f, 0.003881f, 0.982910f, 0.004097f, 0.979980f,
+ 0.004555f, 0.977539f, 0.004597f, 0.974609f, 0.004696f, 0.972168f, 0.004784f, 0.969727f,
+ 0.004951f, 0.966309f, 0.005341f, 0.962402f, 0.005440f, 0.958984f, 0.005455f, 0.956055f,
+ 0.005497f, 0.952148f, 0.005569f, 0.948730f, 0.005840f, 0.944824f, 0.006130f, 0.939453f,
+ 0.006111f, 0.935059f, 0.006203f, 0.930664f, 0.006264f, 0.926270f, 0.006260f, 0.921875f,
+ 0.006573f, 0.916016f, 0.006634f, 0.909668f, 0.006733f, 0.904297f, 0.006706f, 0.897949f,
+ 0.006767f, 0.892090f, 0.006645f, 0.885742f, 0.007000f, 0.878418f, 0.007069f, 0.870605f,
+ 0.007053f, 0.862793f, 0.007092f, 0.855469f, 0.007069f, 0.847168f, 0.006927f, 0.838379f,
+ 0.007217f, 0.829102f, 0.007172f, 0.818359f, 0.007126f, 0.808105f, 0.007095f, 0.797363f,
+ 0.006981f, 0.785645f, 0.006851f, 0.773438f, 0.007057f, 0.759766f, 0.006981f, 0.745117f,
+ 0.006924f, 0.729980f, 0.006699f, 0.713867f, 0.006546f, 0.697266f, 0.006569f, 0.678711f,
+ 0.006435f, 0.657227f, 0.006199f, 0.635254f, 0.005989f, 0.611328f, 0.005718f, 0.586426f,
+ 0.005638f, 0.555664f, 0.005310f, 0.521973f, 0.004852f, 0.484619f, 0.004410f, 0.442627f,
+ 0.003910f, 0.387695f, 0.003103f, 0.323486f, 0.002079f, 0.231812f, 0.000437f, 0.088501f,
+ 0.000000f, 1.000000f, 0.000842f, 0.999023f, 0.001601f, 0.997070f, 0.002188f, 0.995605f,
+ 0.003227f, 0.993164f, 0.003399f, 0.991699f, 0.003914f, 0.989746f, 0.004398f, 0.987305f,
+ 0.004604f, 0.985352f, 0.005123f, 0.982910f, 0.005222f, 0.980957f, 0.005692f, 0.978516f,
+ 0.005787f, 0.975586f, 0.006268f, 0.972168f, 0.006329f, 0.969727f, 0.006454f, 0.967285f,
+ 0.006855f, 0.963379f, 0.007244f, 0.959473f, 0.007401f, 0.956055f, 0.007504f, 0.952637f,
+ 0.007519f, 0.949219f, 0.007637f, 0.945312f, 0.007980f, 0.940430f, 0.008423f, 0.936523f,
+ 0.008354f, 0.931641f, 0.008461f, 0.927246f, 0.008560f, 0.922852f, 0.008690f, 0.917480f,
+ 0.009163f, 0.911621f, 0.009155f, 0.905762f, 0.009224f, 0.899902f, 0.009323f, 0.894043f,
+ 0.009277f, 0.888184f, 0.009407f, 0.882324f, 0.009659f, 0.874023f, 0.009796f, 0.866211f,
+ 0.009727f, 0.858398f, 0.009811f, 0.850586f, 0.009758f, 0.842773f, 0.009644f, 0.834961f,
+ 0.010002f, 0.824219f, 0.009933f, 0.813965f, 0.009964f, 0.803711f, 0.009933f, 0.792969f,
+ 0.009727f, 0.781250f, 0.009659f, 0.770020f, 0.009827f, 0.755371f, 0.009743f, 0.741211f,
+ 0.009651f, 0.726562f, 0.009392f, 0.710938f, 0.009132f, 0.694824f, 0.009201f, 0.675293f,
+ 0.009056f, 0.654297f, 0.008705f, 0.632812f, 0.008377f, 0.609375f, 0.007980f, 0.583984f,
+ 0.007843f, 0.553223f, 0.007362f, 0.520020f, 0.006710f, 0.483643f, 0.006084f, 0.441162f,
+ 0.005352f, 0.386963f, 0.004211f, 0.322510f, 0.002754f, 0.231689f, 0.000555f, 0.088196f,
+ 0.000000f, 1.000000f, 0.001199f, 0.998535f, 0.001856f, 0.997070f, 0.002905f, 0.995117f,
+ 0.003901f, 0.992676f, 0.004478f, 0.990723f, 0.005035f, 0.988770f, 0.005505f, 0.985840f,
+ 0.006081f, 0.983398f, 0.006638f, 0.980957f, 0.006805f, 0.979004f, 0.007263f, 0.976074f,
+ 0.007786f, 0.972656f, 0.008293f, 0.969727f, 0.008400f, 0.966797f, 0.008461f, 0.964355f,
+ 0.009155f, 0.959961f, 0.009377f, 0.956543f, 0.009758f, 0.952637f, 0.009972f, 0.949219f,
+ 0.010078f, 0.945801f, 0.010284f, 0.941406f, 0.010689f, 0.936523f, 0.011162f, 0.932129f,
+ 0.011368f, 0.927734f, 0.011230f, 0.923340f, 0.011398f, 0.918457f, 0.011879f, 0.913574f,
+ 0.012062f, 0.907227f, 0.012398f, 0.901367f, 0.012383f, 0.895508f, 0.012451f, 0.889648f,
+ 0.012566f, 0.883789f, 0.012810f, 0.876953f, 0.013092f, 0.869629f, 0.013123f, 0.861816f,
+ 0.013290f, 0.854492f, 0.013168f, 0.846191f, 0.013191f, 0.838379f, 0.013115f, 0.829590f,
+ 0.013580f, 0.819336f, 0.013618f, 0.809570f, 0.013489f, 0.799316f, 0.013374f, 0.788574f,
+ 0.013107f, 0.777344f, 0.013306f, 0.765137f, 0.013374f, 0.751465f, 0.013237f, 0.737305f,
+ 0.013016f, 0.722656f, 0.012726f, 0.707520f, 0.012398f, 0.691406f, 0.012527f, 0.671875f,
+ 0.012276f, 0.650879f, 0.011787f, 0.629883f, 0.011375f, 0.606934f, 0.010841f, 0.581543f,
+ 0.010605f, 0.551270f, 0.009911f, 0.518066f, 0.009056f, 0.481934f, 0.008156f, 0.439209f,
+ 0.007133f, 0.385986f, 0.005486f, 0.322266f, 0.003534f, 0.231201f, 0.000685f, 0.087402f,
+ 0.000000f, 1.000000f, 0.001122f, 0.998535f, 0.002628f, 0.996582f, 0.003237f, 0.994629f,
+ 0.004601f, 0.991699f, 0.005741f, 0.989258f, 0.005901f, 0.987305f, 0.007145f, 0.983887f,
+ 0.007790f, 0.980957f, 0.008018f, 0.979004f, 0.008659f, 0.976562f, 0.009377f, 0.973145f,
+ 0.010048f, 0.969727f, 0.010307f, 0.967285f, 0.010864f, 0.963867f, 0.011108f, 0.960449f,
+ 0.011986f, 0.956543f, 0.012207f, 0.952637f, 0.012863f, 0.949219f, 0.012848f, 0.945312f,
+ 0.013107f, 0.941895f, 0.013664f, 0.937012f, 0.014084f, 0.932129f, 0.014572f, 0.927246f,
+ 0.014801f, 0.922852f, 0.014999f, 0.918945f, 0.014900f, 0.914062f, 0.015617f, 0.907715f,
+ 0.015976f, 0.902344f, 0.016327f, 0.896484f, 0.016342f, 0.890625f, 0.016373f, 0.884766f,
+ 0.016434f, 0.878906f, 0.016968f, 0.871094f, 0.017136f, 0.863770f, 0.017426f, 0.856445f,
+ 0.017410f, 0.849121f, 0.017441f, 0.841309f, 0.017426f, 0.833496f, 0.017822f, 0.824219f,
+ 0.017883f, 0.813965f, 0.017944f, 0.803711f, 0.017868f, 0.793945f, 0.017822f, 0.783691f,
+ 0.017654f, 0.772949f, 0.017700f, 0.759766f, 0.017715f, 0.746582f, 0.017563f, 0.732422f,
+ 0.017349f, 0.718262f, 0.016953f, 0.703613f, 0.016571f, 0.687500f, 0.016663f, 0.667480f,
+ 0.016159f, 0.647461f, 0.015793f, 0.626465f, 0.015045f, 0.604492f, 0.014397f, 0.578613f,
+ 0.013908f, 0.548340f, 0.012947f, 0.516113f, 0.011795f, 0.480469f, 0.010681f, 0.437744f,
+ 0.009186f, 0.385010f, 0.007019f, 0.322510f, 0.004486f, 0.231201f, 0.000840f, 0.086182f,
+ 0.000000f, 1.000000f, 0.001562f, 0.998535f, 0.003016f, 0.996094f, 0.003725f, 0.994629f,
+ 0.005463f, 0.990723f, 0.006287f, 0.988770f, 0.007427f, 0.985840f, 0.008575f, 0.982422f,
+ 0.009804f, 0.979492f, 0.010109f, 0.977051f, 0.010483f, 0.974121f, 0.011909f, 0.969727f,
+ 0.012657f, 0.966309f, 0.013023f, 0.963867f, 0.013741f, 0.960449f, 0.014297f, 0.956543f,
+ 0.014893f, 0.952637f, 0.015625f, 0.948730f, 0.015854f, 0.944824f, 0.016586f, 0.941406f,
+ 0.016937f, 0.937012f, 0.017578f, 0.932129f, 0.018219f, 0.927246f, 0.018372f, 0.922852f,
+ 0.018921f, 0.917969f, 0.019180f, 0.913574f, 0.019669f, 0.908691f, 0.020218f, 0.902344f,
+ 0.020538f, 0.896484f, 0.021225f, 0.891113f, 0.021149f, 0.885254f, 0.021286f, 0.879395f,
+ 0.021515f, 0.872559f, 0.022141f, 0.865234f, 0.022308f, 0.857910f, 0.022522f, 0.850586f,
+ 0.022629f, 0.843262f, 0.022736f, 0.835938f, 0.022537f, 0.827637f, 0.023331f, 0.817871f,
+ 0.023315f, 0.808105f, 0.023376f, 0.798340f, 0.023117f, 0.788574f, 0.023041f, 0.778320f,
+ 0.022858f, 0.768066f, 0.023010f, 0.754395f, 0.023224f, 0.741211f, 0.022888f, 0.727539f,
+ 0.022522f, 0.713867f, 0.021866f, 0.699219f, 0.021835f, 0.682617f, 0.021667f, 0.663086f,
+ 0.021057f, 0.643555f, 0.020325f, 0.623535f, 0.019501f, 0.601562f, 0.018707f, 0.575195f,
+ 0.017914f, 0.545410f, 0.016632f, 0.514160f, 0.015022f, 0.479492f, 0.013664f, 0.435791f,
+ 0.011627f, 0.384521f, 0.008766f, 0.322266f, 0.005531f, 0.230347f, 0.001017f, 0.085449f,
+ 0.000000f, 1.000000f, 0.001565f, 0.998535f, 0.003548f, 0.996094f, 0.004803f, 0.993652f,
+ 0.006626f, 0.989746f, 0.007435f, 0.987793f, 0.008812f, 0.984375f, 0.010437f, 0.979980f,
+ 0.011238f, 0.977051f, 0.012505f, 0.974121f, 0.013237f, 0.970703f, 0.014847f, 0.966797f,
+ 0.015343f, 0.963379f, 0.016144f, 0.959961f, 0.016541f, 0.957031f, 0.018036f, 0.952148f,
+ 0.018906f, 0.948242f, 0.019608f, 0.944336f, 0.019928f, 0.940430f, 0.020584f, 0.936523f,
+ 0.021576f, 0.931641f, 0.022156f, 0.926758f, 0.022903f, 0.921387f, 0.023300f, 0.917480f,
+ 0.023849f, 0.913086f, 0.024063f, 0.908203f, 0.025177f, 0.902344f, 0.026001f, 0.896484f,
+ 0.026001f, 0.890137f, 0.026688f, 0.884766f, 0.027115f, 0.879395f, 0.026993f, 0.873535f,
+ 0.027878f, 0.866211f, 0.028305f, 0.858887f, 0.028580f, 0.852051f, 0.029007f, 0.844238f,
+ 0.028885f, 0.836914f, 0.028793f, 0.830078f, 0.029510f, 0.821289f, 0.029755f, 0.811523f,
+ 0.030136f, 0.802246f, 0.030014f, 0.792480f, 0.029861f, 0.782715f, 0.029663f, 0.772949f,
+ 0.029831f, 0.762207f, 0.029831f, 0.748535f, 0.029739f, 0.735840f, 0.029343f, 0.722656f,
+ 0.028915f, 0.709473f, 0.028275f, 0.694824f, 0.028061f, 0.677246f, 0.027786f, 0.658691f,
+ 0.027008f, 0.639648f, 0.026138f, 0.620117f, 0.024826f, 0.598633f, 0.023987f, 0.571777f,
+ 0.022766f, 0.542969f, 0.020981f, 0.512207f, 0.019073f, 0.478027f, 0.017105f, 0.434082f,
+ 0.014404f, 0.382812f, 0.010895f, 0.322510f, 0.006779f, 0.230347f, 0.001223f, 0.084961f,
+ 0.000000f, 1.000000f, 0.001669f, 0.998535f, 0.003778f, 0.995605f, 0.005211f, 0.992676f,
+ 0.007935f, 0.988770f, 0.009338f, 0.985840f, 0.010193f, 0.982422f, 0.012466f, 0.978027f,
+ 0.013901f, 0.974609f, 0.014366f, 0.972168f, 0.016434f, 0.966797f, 0.017426f, 0.963379f,
+ 0.018829f, 0.959473f, 0.019730f, 0.956055f, 0.020538f, 0.952148f, 0.021805f, 0.947754f,
+ 0.023224f, 0.943359f, 0.024200f, 0.939453f, 0.024612f, 0.935547f, 0.025192f, 0.931152f,
+ 0.026642f, 0.925781f, 0.027664f, 0.920898f, 0.028488f, 0.916016f, 0.028809f, 0.911621f,
+ 0.029770f, 0.907227f, 0.030457f, 0.901367f, 0.031464f, 0.895508f, 0.032318f, 0.889648f,
+ 0.032562f, 0.884277f, 0.033112f, 0.878418f, 0.033478f, 0.872559f, 0.034363f, 0.866699f,
+ 0.034698f, 0.858398f, 0.035614f, 0.852051f, 0.035736f, 0.844727f, 0.036346f, 0.837891f,
+ 0.036469f, 0.831055f, 0.036346f, 0.823242f, 0.037079f, 0.813477f, 0.037598f, 0.804688f,
+ 0.037933f, 0.795410f, 0.037476f, 0.786133f, 0.037415f, 0.776855f, 0.037231f, 0.767578f,
+ 0.037598f, 0.754883f, 0.037354f, 0.742188f, 0.037262f, 0.729492f, 0.036743f, 0.717285f,
+ 0.036316f, 0.704102f, 0.035858f, 0.689941f, 0.035431f, 0.671387f, 0.034821f, 0.653809f,
+ 0.033936f, 0.635742f, 0.032593f, 0.616211f, 0.030960f, 0.595215f, 0.030136f, 0.568359f,
+ 0.028427f, 0.539551f, 0.026245f, 0.509766f, 0.023666f, 0.476562f, 0.021240f, 0.431885f,
+ 0.017776f, 0.381836f, 0.013306f, 0.322021f, 0.008209f, 0.230225f, 0.001459f, 0.084290f,
+ 0.000000f, 1.000000f, 0.001827f, 0.998535f, 0.005047f, 0.994629f, 0.007000f, 0.991211f,
+ 0.009064f, 0.987793f, 0.010567f, 0.984375f, 0.012871f, 0.979980f, 0.014038f, 0.976562f,
+ 0.016022f, 0.972656f, 0.017563f, 0.968750f, 0.019684f, 0.963379f, 0.021286f, 0.959473f,
+ 0.022369f, 0.955566f, 0.023438f, 0.952148f, 0.025162f, 0.946777f, 0.026611f, 0.942383f,
+ 0.028183f, 0.937988f, 0.028885f, 0.934082f, 0.029938f, 0.930664f, 0.031235f, 0.925293f,
+ 0.032684f, 0.919434f, 0.033630f, 0.914551f, 0.034729f, 0.909668f, 0.035248f, 0.905762f,
+ 0.035797f, 0.900391f, 0.037567f, 0.894043f, 0.038605f, 0.888184f, 0.039307f, 0.882812f,
+ 0.040070f, 0.876953f, 0.040314f, 0.872070f, 0.041016f, 0.865723f, 0.042450f, 0.858398f,
+ 0.043365f, 0.851562f, 0.043488f, 0.843750f, 0.044189f, 0.837402f, 0.044525f, 0.830566f,
+ 0.044647f, 0.824219f, 0.045227f, 0.814941f, 0.045959f, 0.805664f, 0.046387f, 0.796875f,
+ 0.046204f, 0.788574f, 0.046539f, 0.779785f, 0.046204f, 0.770508f, 0.046387f, 0.759766f,
+ 0.046570f, 0.747559f, 0.046509f, 0.735840f, 0.046204f, 0.723145f, 0.045837f, 0.711426f,
+ 0.044891f, 0.699219f, 0.044495f, 0.683594f, 0.043854f, 0.666016f, 0.043121f, 0.648926f,
+ 0.041809f, 0.631348f, 0.040222f, 0.612793f, 0.038391f, 0.590332f, 0.037079f, 0.564453f,
+ 0.034943f, 0.537109f, 0.032379f, 0.507812f, 0.028885f, 0.475342f, 0.025864f, 0.429688f,
+ 0.021500f, 0.380615f, 0.015945f, 0.321777f, 0.009758f, 0.229370f, 0.001731f, 0.083496f,
+ 0.000000f, 1.000000f, 0.002783f, 0.997559f, 0.005577f, 0.994141f, 0.007812f, 0.990723f,
+ 0.010483f, 0.986816f, 0.012062f, 0.983398f, 0.014725f, 0.978027f, 0.017319f, 0.973633f,
+ 0.018478f, 0.969727f, 0.020584f, 0.965332f, 0.023178f, 0.959961f, 0.025238f, 0.955566f,
+ 0.026505f, 0.951660f, 0.027969f, 0.947266f, 0.030487f, 0.941406f, 0.032104f, 0.936523f,
+ 0.033356f, 0.932617f, 0.034607f, 0.928223f, 0.036163f, 0.923828f, 0.037964f, 0.917969f,
+ 0.039307f, 0.913086f, 0.040588f, 0.907715f, 0.041443f, 0.903320f, 0.042419f, 0.898438f,
+ 0.044098f, 0.892578f, 0.045685f, 0.886230f, 0.046814f, 0.880371f, 0.047333f, 0.875000f,
+ 0.048370f, 0.869629f, 0.048828f, 0.864258f, 0.050385f, 0.856934f, 0.051239f, 0.849609f,
+ 0.052368f, 0.843262f, 0.053314f, 0.836426f, 0.053040f, 0.829590f, 0.054077f, 0.823730f,
+ 0.054504f, 0.814941f, 0.055359f, 0.806641f, 0.055878f, 0.797852f, 0.056152f, 0.789062f,
+ 0.056152f, 0.781250f, 0.056274f, 0.772461f, 0.056000f, 0.763184f, 0.056763f, 0.751465f,
+ 0.056610f, 0.740234f, 0.056488f, 0.729004f, 0.056030f, 0.717285f, 0.055145f, 0.705566f,
+ 0.054169f, 0.692871f, 0.054047f, 0.676758f, 0.053192f, 0.660156f, 0.052032f, 0.643555f,
+ 0.050323f, 0.626465f, 0.048279f, 0.608398f, 0.046814f, 0.585449f, 0.044647f, 0.560059f,
+ 0.042236f, 0.533691f, 0.038666f, 0.505371f, 0.034912f, 0.472412f, 0.031082f, 0.427734f,
+ 0.025772f, 0.380371f, 0.019012f, 0.321777f, 0.011581f, 0.229980f, 0.002018f, 0.082336f,
+ 0.000000f, 1.000000f, 0.003298f, 0.997070f, 0.006264f, 0.993652f, 0.008881f, 0.989746f,
+ 0.012100f, 0.985352f, 0.014313f, 0.981445f, 0.017776f, 0.975586f, 0.019714f, 0.971191f,
+ 0.021927f, 0.967285f, 0.024277f, 0.961426f, 0.027039f, 0.956055f, 0.029388f, 0.951660f,
+ 0.031143f, 0.947266f, 0.033844f, 0.941406f, 0.035645f, 0.936035f, 0.037964f, 0.930664f,
+ 0.039337f, 0.926270f, 0.040619f, 0.922363f, 0.043152f, 0.916016f, 0.045349f, 0.910156f,
+ 0.046814f, 0.905273f, 0.048218f, 0.900879f, 0.049377f, 0.896484f, 0.051117f, 0.889648f,
+ 0.052612f, 0.883301f, 0.054382f, 0.877930f, 0.055756f, 0.872070f, 0.056580f, 0.867188f,
+ 0.057404f, 0.861816f, 0.058929f, 0.854980f, 0.060638f, 0.847656f, 0.061646f, 0.841309f,
+ 0.062225f, 0.834473f, 0.063354f, 0.828125f, 0.063660f, 0.822266f, 0.064331f, 0.814453f,
+ 0.065979f, 0.806152f, 0.066284f, 0.797363f, 0.066406f, 0.789062f, 0.067322f, 0.781250f,
+ 0.067139f, 0.773926f, 0.067078f, 0.765625f, 0.067383f, 0.753906f, 0.067688f, 0.743164f,
+ 0.067749f, 0.732910f, 0.067383f, 0.721680f, 0.066528f, 0.710938f, 0.065735f, 0.699707f,
+ 0.065247f, 0.685059f, 0.064880f, 0.669922f, 0.063538f, 0.654297f, 0.062073f, 0.638184f,
+ 0.059814f, 0.622070f, 0.057617f, 0.604492f, 0.056122f, 0.580566f, 0.052917f, 0.555664f,
+ 0.049835f, 0.530762f, 0.045776f, 0.502930f, 0.041260f, 0.468262f, 0.036835f, 0.425781f,
+ 0.030258f, 0.379150f, 0.022263f, 0.322021f, 0.013573f, 0.229248f, 0.002316f, 0.081360f,
+ 0.000000f, 1.000000f, 0.003561f, 0.997070f, 0.007156f, 0.993164f, 0.010612f, 0.988281f,
+ 0.014122f, 0.983887f, 0.016617f, 0.979004f, 0.020523f, 0.973145f, 0.023422f, 0.968262f,
+ 0.025726f, 0.963867f, 0.029572f, 0.957031f, 0.031586f, 0.951660f, 0.034027f, 0.947266f,
+ 0.036560f, 0.941895f, 0.039612f, 0.935059f, 0.042511f, 0.929688f, 0.044067f, 0.924805f,
+ 0.046448f, 0.920410f, 0.048859f, 0.914062f, 0.050842f, 0.908203f, 0.053650f, 0.902344f,
+ 0.055206f, 0.897461f, 0.056335f, 0.893066f, 0.058716f, 0.887207f, 0.061005f, 0.880859f,
+ 0.062408f, 0.874512f, 0.063965f, 0.868652f, 0.065552f, 0.863770f, 0.066467f, 0.858887f,
+ 0.068359f, 0.852051f, 0.069702f, 0.844727f, 0.071289f, 0.838379f, 0.072754f, 0.832031f,
+ 0.073669f, 0.825684f, 0.074219f, 0.819336f, 0.075256f, 0.812988f, 0.076050f, 0.804199f,
+ 0.077515f, 0.795898f, 0.078308f, 0.788574f, 0.078613f, 0.780762f, 0.078796f, 0.772949f,
+ 0.078918f, 0.766113f, 0.080017f, 0.755859f, 0.080200f, 0.745117f, 0.080139f, 0.734863f,
+ 0.080078f, 0.724609f, 0.079163f, 0.714355f, 0.078430f, 0.704590f, 0.077454f, 0.691406f,
+ 0.077209f, 0.677734f, 0.076233f, 0.662598f, 0.074829f, 0.648926f, 0.072632f, 0.632812f,
+ 0.070129f, 0.617676f, 0.067993f, 0.597656f, 0.065552f, 0.575195f, 0.062286f, 0.551758f,
+ 0.057983f, 0.526855f, 0.053223f, 0.500977f, 0.048401f, 0.464600f, 0.042664f, 0.423828f,
+ 0.035034f, 0.377930f, 0.025772f, 0.319092f, 0.015602f, 0.228149f, 0.002670f, 0.080383f,
+ 0.000000f, 1.000000f, 0.004112f, 0.996582f, 0.008255f, 0.992676f, 0.012413f, 0.986816f,
+ 0.016052f, 0.982422f, 0.019943f, 0.976074f, 0.023285f, 0.970703f, 0.026810f, 0.965820f,
+ 0.030579f, 0.958496f, 0.033691f, 0.953125f, 0.037384f, 0.947266f, 0.039032f, 0.942871f,
+ 0.043030f, 0.935059f, 0.046204f, 0.929199f, 0.049713f, 0.923340f, 0.051880f, 0.918457f,
+ 0.054718f, 0.912109f, 0.057709f, 0.905273f, 0.059967f, 0.899414f, 0.061676f, 0.894531f,
+ 0.064148f, 0.889160f, 0.066162f, 0.883789f, 0.068848f, 0.876953f, 0.071350f, 0.871094f,
+ 0.073486f, 0.865234f, 0.074829f, 0.859863f, 0.075806f, 0.854980f, 0.078308f, 0.848145f,
+ 0.080627f, 0.841309f, 0.082092f, 0.833984f, 0.083191f, 0.828125f, 0.084839f, 0.822266f,
+ 0.085815f, 0.816406f, 0.086609f, 0.810059f, 0.088196f, 0.801270f, 0.089783f, 0.793945f,
+ 0.090210f, 0.786133f, 0.091125f, 0.778809f, 0.091736f, 0.771973f, 0.091553f, 0.764648f,
+ 0.092224f, 0.754883f, 0.093079f, 0.745117f, 0.093140f, 0.735352f, 0.093201f, 0.726562f,
+ 0.092651f, 0.716797f, 0.091797f, 0.707520f, 0.091370f, 0.696777f, 0.090515f, 0.682617f,
+ 0.089661f, 0.669434f, 0.088318f, 0.655762f, 0.086060f, 0.642578f, 0.084045f, 0.627930f,
+ 0.081116f, 0.611816f, 0.079163f, 0.591797f, 0.075562f, 0.569824f, 0.072144f, 0.548340f,
+ 0.067139f, 0.524414f, 0.061523f, 0.499268f, 0.056396f, 0.461914f, 0.049164f, 0.421631f,
+ 0.040161f, 0.376953f, 0.030151f, 0.317139f, 0.017792f, 0.228027f, 0.003069f, 0.079773f,
+ 0.000000f, 1.000000f, 0.005325f, 0.996094f, 0.009186f, 0.992188f, 0.014565f, 0.985840f,
+ 0.018402f, 0.980469f, 0.023132f, 0.973633f, 0.027496f, 0.967285f, 0.030396f, 0.962402f,
+ 0.035278f, 0.954590f, 0.039673f, 0.948242f, 0.042419f, 0.942871f, 0.046692f, 0.935547f,
+ 0.050446f, 0.928223f, 0.053772f, 0.922363f, 0.056091f, 0.917480f, 0.060211f, 0.910645f,
+ 0.064026f, 0.902832f, 0.067261f, 0.896484f, 0.070068f, 0.891113f, 0.071838f, 0.885742f,
+ 0.073975f, 0.880371f, 0.078003f, 0.872559f, 0.080627f, 0.866699f, 0.082458f, 0.860840f,
+ 0.085022f, 0.855469f, 0.086670f, 0.851074f, 0.088562f, 0.843262f, 0.091431f, 0.835938f,
+ 0.093506f, 0.830078f, 0.095276f, 0.823730f, 0.096313f, 0.818359f, 0.097229f, 0.812500f,
+ 0.099304f, 0.806152f, 0.100830f, 0.797363f, 0.102783f, 0.790039f, 0.103333f, 0.782715f,
+ 0.104858f, 0.776367f, 0.104614f, 0.769043f, 0.105286f, 0.763184f, 0.106323f, 0.753418f,
+ 0.106995f, 0.744141f, 0.107483f, 0.734863f, 0.107544f, 0.726074f, 0.106689f, 0.717285f,
+ 0.106262f, 0.708984f, 0.104980f, 0.699707f, 0.105103f, 0.686035f, 0.104309f, 0.673828f,
+ 0.102844f, 0.661621f, 0.100952f, 0.648926f, 0.098694f, 0.636230f, 0.095947f, 0.623047f,
+ 0.093689f, 0.604492f, 0.090698f, 0.584961f, 0.086853f, 0.565430f, 0.082336f, 0.544434f,
+ 0.076477f, 0.521973f, 0.070312f, 0.493408f, 0.064026f, 0.458008f, 0.056061f, 0.419922f,
+ 0.045807f, 0.376953f, 0.034241f, 0.314941f, 0.020111f, 0.228149f, 0.003462f, 0.079407f,
+ 0.000000f, 1.000000f, 0.005852f, 0.995605f, 0.010582f, 0.991211f, 0.016800f, 0.984375f,
+ 0.021683f, 0.978027f, 0.027328f, 0.970703f, 0.031464f, 0.964355f, 0.037018f, 0.957031f,
+ 0.041718f, 0.949707f, 0.045441f, 0.943359f, 0.049408f, 0.937012f, 0.054260f, 0.928711f,
+ 0.058807f, 0.921387f, 0.062225f, 0.915527f, 0.065979f, 0.909180f, 0.069702f, 0.901367f,
+ 0.074585f, 0.894043f, 0.077026f, 0.888184f, 0.080322f, 0.882324f, 0.083740f, 0.875488f,
+ 0.086914f, 0.868164f, 0.090393f, 0.861816f, 0.092834f, 0.855469f, 0.095032f, 0.850586f,
+ 0.096741f, 0.845703f, 0.100525f, 0.837891f, 0.103394f, 0.831055f, 0.105347f, 0.824219f,
+ 0.107239f, 0.818359f, 0.109253f, 0.812988f, 0.110413f, 0.807617f, 0.112305f, 0.800293f,
+ 0.114746f, 0.791992f, 0.116638f, 0.785645f, 0.117371f, 0.778320f, 0.118530f, 0.772461f,
+ 0.119019f, 0.766113f, 0.119690f, 0.760254f, 0.120850f, 0.750488f, 0.122131f, 0.741699f,
+ 0.121765f, 0.733398f, 0.122681f, 0.725098f, 0.122437f, 0.717285f, 0.121521f, 0.709473f,
+ 0.120728f, 0.700195f, 0.120483f, 0.688477f, 0.120422f, 0.677246f, 0.118835f, 0.666016f,
+ 0.116638f, 0.653809f, 0.114502f, 0.642578f, 0.111633f, 0.630859f, 0.108765f, 0.614258f,
+ 0.106445f, 0.596680f, 0.102844f, 0.579102f, 0.098145f, 0.560059f, 0.092346f, 0.540039f,
+ 0.085815f, 0.519531f, 0.079895f, 0.488037f, 0.072266f, 0.454590f, 0.062988f, 0.418213f,
+ 0.051239f, 0.376709f, 0.038727f, 0.312744f, 0.022507f, 0.227539f, 0.003885f, 0.078247f,
+ 0.000000f, 1.000000f, 0.007130f, 0.995117f, 0.013252f, 0.988770f, 0.019928f, 0.982422f,
+ 0.025421f, 0.974609f, 0.031860f, 0.967773f, 0.036316f, 0.960938f, 0.043030f, 0.951660f,
+ 0.048309f, 0.944824f, 0.052460f, 0.938477f, 0.058411f, 0.928711f, 0.063599f, 0.921387f,
+ 0.067261f, 0.914551f, 0.071167f, 0.908203f, 0.076721f, 0.898926f, 0.081360f, 0.891602f,
+ 0.084412f, 0.885742f, 0.088318f, 0.879395f, 0.092712f, 0.871094f, 0.097046f, 0.863770f,
+ 0.100891f, 0.856445f, 0.103210f, 0.850586f, 0.105957f, 0.845215f, 0.108948f, 0.839355f,
+ 0.112183f, 0.831543f, 0.115601f, 0.824707f, 0.118591f, 0.818359f, 0.120361f, 0.812988f,
+ 0.121704f, 0.807129f, 0.123474f, 0.801758f, 0.126709f, 0.793457f, 0.129028f, 0.786621f,
+ 0.130737f, 0.779785f, 0.131958f, 0.773438f, 0.133667f, 0.767578f, 0.133911f, 0.761719f,
+ 0.135132f, 0.754883f, 0.137085f, 0.745605f, 0.137451f, 0.737793f, 0.138062f, 0.729980f,
+ 0.138794f, 0.723145f, 0.138062f, 0.715332f, 0.137207f, 0.708008f, 0.137085f, 0.699219f,
+ 0.137329f, 0.688477f, 0.136475f, 0.677734f, 0.135376f, 0.667480f, 0.133179f, 0.657227f,
+ 0.130859f, 0.646484f, 0.128174f, 0.636230f, 0.125610f, 0.622070f, 0.123047f, 0.605957f,
+ 0.119141f, 0.589355f, 0.114807f, 0.572754f, 0.109802f, 0.555664f, 0.103394f, 0.537598f,
+ 0.096680f, 0.512207f, 0.089478f, 0.482910f, 0.080872f, 0.451660f, 0.069946f, 0.416748f,
+ 0.056976f, 0.376709f, 0.043182f, 0.310059f, 0.025070f, 0.227783f, 0.004345f, 0.077881f,
+ 0.000000f, 1.000000f, 0.008400f, 0.994629f, 0.015465f, 0.987793f, 0.022263f, 0.980957f,
+ 0.030548f, 0.971191f, 0.036316f, 0.964355f, 0.043182f, 0.955078f, 0.049866f, 0.946777f,
+ 0.054840f, 0.939941f, 0.061798f, 0.929688f, 0.067383f, 0.921387f, 0.073120f, 0.914062f,
+ 0.077820f, 0.906738f, 0.084167f, 0.896973f, 0.088623f, 0.889160f, 0.093201f, 0.882324f,
+ 0.097534f, 0.875977f, 0.101990f, 0.867188f, 0.106934f, 0.859375f, 0.110901f, 0.852051f,
+ 0.114319f, 0.845703f, 0.117432f, 0.839844f, 0.121460f, 0.831543f, 0.125000f, 0.824707f,
+ 0.128906f, 0.817383f, 0.131470f, 0.811523f, 0.134399f, 0.806152f, 0.135864f, 0.801270f,
+ 0.139160f, 0.793457f, 0.141602f, 0.786133f, 0.144043f, 0.779297f, 0.146240f, 0.773438f,
+ 0.147827f, 0.767578f, 0.148926f, 0.761719f, 0.149780f, 0.756348f, 0.151733f, 0.747559f,
+ 0.153198f, 0.740234f, 0.154663f, 0.732910f, 0.154785f, 0.726074f, 0.155029f, 0.719238f,
+ 0.154785f, 0.712402f, 0.153198f, 0.706543f, 0.154541f, 0.695801f, 0.154541f, 0.686523f,
+ 0.153931f, 0.676758f, 0.152588f, 0.667480f, 0.150635f, 0.658691f, 0.148682f, 0.649414f,
+ 0.146240f, 0.640625f, 0.143433f, 0.625977f, 0.140625f, 0.611816f, 0.137695f, 0.598145f,
+ 0.133423f, 0.583008f, 0.127563f, 0.568359f, 0.121460f, 0.551758f, 0.114868f, 0.532227f,
+ 0.108032f, 0.505371f, 0.100159f, 0.479248f, 0.089661f, 0.449463f, 0.077454f, 0.416016f,
+ 0.063354f, 0.373779f, 0.048187f, 0.308594f, 0.027634f, 0.228149f, 0.004814f, 0.077515f,
+ 0.000000f, 1.000000f, 0.009140f, 0.994629f, 0.018646f, 0.985840f, 0.026642f, 0.977539f,
+ 0.035187f, 0.968262f, 0.042419f, 0.959473f, 0.051025f, 0.949707f, 0.057281f, 0.941406f,
+ 0.064514f, 0.931152f, 0.071899f, 0.921875f, 0.077393f, 0.914551f, 0.084167f, 0.904785f,
+ 0.091309f, 0.895020f, 0.096375f, 0.887207f, 0.101562f, 0.879883f, 0.106445f, 0.871582f,
+ 0.112427f, 0.862305f, 0.117676f, 0.854004f, 0.121643f, 0.847168f, 0.125244f, 0.840820f,
+ 0.130371f, 0.833008f, 0.135742f, 0.824219f, 0.138794f, 0.817383f, 0.142456f, 0.810547f,
+ 0.145020f, 0.804688f, 0.148193f, 0.798828f, 0.150879f, 0.791992f, 0.155029f, 0.784180f,
+ 0.157837f, 0.777832f, 0.160156f, 0.771973f, 0.162476f, 0.766113f, 0.163574f, 0.760742f,
+ 0.164673f, 0.755371f, 0.167236f, 0.747559f, 0.168945f, 0.740234f, 0.170776f, 0.732910f,
+ 0.171753f, 0.726562f, 0.171753f, 0.720703f, 0.172485f, 0.714355f, 0.171997f, 0.708984f,
+ 0.171997f, 0.700195f, 0.172974f, 0.691406f, 0.172363f, 0.682617f, 0.172241f, 0.674805f,
+ 0.171387f, 0.666992f, 0.168945f, 0.658691f, 0.166992f, 0.650879f, 0.164185f, 0.641113f,
+ 0.162109f, 0.627930f, 0.159668f, 0.615234f, 0.156006f, 0.603516f, 0.151978f, 0.590820f,
+ 0.146606f, 0.577148f, 0.140625f, 0.563477f, 0.134155f, 0.546875f, 0.127563f, 0.523926f,
+ 0.119690f, 0.500488f, 0.109924f, 0.475830f, 0.098633f, 0.447754f, 0.085083f, 0.415527f,
+ 0.070312f, 0.367920f, 0.053162f, 0.306885f, 0.030350f, 0.228882f, 0.005295f, 0.077148f,
+ 0.000000f, 1.000000f, 0.011208f, 0.993652f, 0.021729f, 0.984375f, 0.031860f, 0.974121f,
+ 0.040680f, 0.965332f, 0.050781f, 0.953613f, 0.058533f, 0.944824f, 0.067810f, 0.933105f,
+ 0.075439f, 0.923340f, 0.082581f, 0.915039f, 0.090027f, 0.904297f, 0.097961f, 0.894043f,
+ 0.104736f, 0.885254f, 0.109985f, 0.877930f, 0.116516f, 0.867188f, 0.123535f, 0.857422f,
+ 0.128906f, 0.849609f, 0.132324f, 0.843262f, 0.138794f, 0.833984f, 0.143677f, 0.825195f,
+ 0.149048f, 0.817383f, 0.152710f, 0.810547f, 0.157471f, 0.803223f, 0.159790f, 0.797852f,
+ 0.164307f, 0.789062f, 0.167847f, 0.781738f, 0.171265f, 0.774902f, 0.174316f, 0.769043f,
+ 0.176636f, 0.763672f, 0.178467f, 0.758789f, 0.180786f, 0.752441f, 0.184082f, 0.744629f,
+ 0.185425f, 0.737305f, 0.187622f, 0.731445f, 0.189087f, 0.726074f, 0.189453f, 0.719727f,
+ 0.190186f, 0.714355f, 0.189453f, 0.709473f, 0.191650f, 0.700684f, 0.192261f, 0.692871f,
+ 0.192383f, 0.685547f, 0.191772f, 0.678223f, 0.191040f, 0.671387f, 0.189575f, 0.664062f,
+ 0.187622f, 0.657715f, 0.184937f, 0.649902f, 0.183716f, 0.639160f, 0.182007f, 0.628418f,
+ 0.179199f, 0.617676f, 0.175903f, 0.606934f, 0.171143f, 0.595703f, 0.166504f, 0.583984f,
+ 0.159912f, 0.571777f, 0.154175f, 0.556641f, 0.147827f, 0.537109f, 0.139893f, 0.517578f,
+ 0.131226f, 0.496338f, 0.120361f, 0.473145f, 0.107727f, 0.445801f, 0.092651f, 0.413330f,
+ 0.077454f, 0.364014f, 0.058197f, 0.306152f, 0.032990f, 0.229370f, 0.005756f, 0.076660f,
+ 0.000000f, 1.000000f, 0.012024f, 0.993652f, 0.024628f, 0.983398f, 0.037384f, 0.971191f,
+ 0.048859f, 0.958984f, 0.059052f, 0.948730f, 0.069397f, 0.936523f, 0.079529f, 0.925293f,
+ 0.086853f, 0.916504f, 0.097656f, 0.902832f, 0.105103f, 0.893066f, 0.112366f, 0.884277f,
+ 0.120667f, 0.872559f, 0.127808f, 0.862793f, 0.134155f, 0.854004f, 0.139648f, 0.845703f,
+ 0.146362f, 0.835938f, 0.153320f, 0.826660f, 0.158325f, 0.818359f, 0.163330f, 0.810547f,
+ 0.167114f, 0.803711f, 0.172607f, 0.795410f, 0.176636f, 0.787598f, 0.181519f, 0.779297f,
+ 0.185181f, 0.772461f, 0.188477f, 0.766113f, 0.191040f, 0.760742f, 0.193726f, 0.754883f,
+ 0.197266f, 0.747070f, 0.200684f, 0.739746f, 0.202637f, 0.733887f, 0.205200f, 0.728516f,
+ 0.206421f, 0.723145f, 0.206909f, 0.717773f, 0.207397f, 0.712891f, 0.210083f, 0.705566f,
+ 0.211060f, 0.697754f, 0.211670f, 0.691895f, 0.212158f, 0.685059f, 0.211914f, 0.679199f,
+ 0.211304f, 0.672852f, 0.210083f, 0.667480f, 0.208862f, 0.661621f, 0.207153f, 0.652832f,
+ 0.206909f, 0.644043f, 0.204956f, 0.635254f, 0.202271f, 0.626465f, 0.199707f, 0.617188f,
+ 0.196411f, 0.608398f, 0.191650f, 0.599121f, 0.186890f, 0.589355f, 0.180664f, 0.578613f,
+ 0.175415f, 0.562988f, 0.169189f, 0.546875f, 0.162231f, 0.530762f, 0.152710f, 0.512207f,
+ 0.142578f, 0.492188f, 0.130615f, 0.469971f, 0.116455f, 0.444336f, 0.102051f, 0.405762f,
+ 0.084717f, 0.361084f, 0.063049f, 0.305908f, 0.035797f, 0.230713f, 0.006294f, 0.076782f,
+ 0.000000f, 1.000000f, 0.015854f, 0.991211f, 0.030777f, 0.979004f, 0.044312f, 0.966797f,
+ 0.057495f, 0.954590f, 0.070068f, 0.940918f, 0.081421f, 0.929199f, 0.092346f, 0.916016f,
+ 0.103149f, 0.903809f, 0.111877f, 0.893555f, 0.121765f, 0.880859f, 0.130371f, 0.869629f,
+ 0.138428f, 0.859863f, 0.145996f, 0.850098f, 0.153442f, 0.838867f, 0.160767f, 0.829102f,
+ 0.166992f, 0.819824f, 0.172241f, 0.812500f, 0.178711f, 0.802734f, 0.184448f, 0.793457f,
+ 0.189697f, 0.785156f, 0.194336f, 0.777832f, 0.198364f, 0.770508f, 0.201416f, 0.765137f,
+ 0.206665f, 0.756348f, 0.210571f, 0.748535f, 0.214600f, 0.741211f, 0.217041f, 0.734863f,
+ 0.219604f, 0.729004f, 0.221802f, 0.724121f, 0.224121f, 0.718750f, 0.225586f, 0.712891f,
+ 0.228760f, 0.706055f, 0.229858f, 0.700195f, 0.230713f, 0.693848f, 0.231689f, 0.688477f,
+ 0.232788f, 0.683105f, 0.231934f, 0.677734f, 0.231934f, 0.672852f, 0.230957f, 0.667480f,
+ 0.231323f, 0.659668f, 0.230835f, 0.652344f, 0.229126f, 0.645508f, 0.228516f, 0.638672f,
+ 0.226074f, 0.630859f, 0.223267f, 0.624023f, 0.219849f, 0.616699f, 0.216431f, 0.609375f,
+ 0.212036f, 0.601562f, 0.207642f, 0.591309f, 0.202515f, 0.579102f, 0.197998f, 0.566406f,
+ 0.191040f, 0.553223f, 0.184082f, 0.539062f, 0.175293f, 0.523926f, 0.165527f, 0.507324f,
+ 0.153687f, 0.489014f, 0.140747f, 0.468018f, 0.127563f, 0.436768f, 0.111816f, 0.401611f,
+ 0.092285f, 0.359863f, 0.068115f, 0.305908f, 0.038666f, 0.232422f, 0.006775f, 0.076782f,
+ 0.000000f, 1.000000f, 0.018921f, 0.990234f, 0.035980f, 0.977539f, 0.052704f, 0.962402f,
+ 0.068909f, 0.946777f, 0.082764f, 0.933105f, 0.095703f, 0.918945f, 0.106995f, 0.906738f,
+ 0.119934f, 0.891602f, 0.130371f, 0.879883f, 0.139893f, 0.868652f, 0.150513f, 0.854980f,
+ 0.159058f, 0.844238f, 0.166626f, 0.833984f, 0.174805f, 0.823730f, 0.182739f, 0.812500f,
+ 0.189453f, 0.802734f, 0.195801f, 0.793457f, 0.201660f, 0.785156f, 0.206787f, 0.777344f,
+ 0.213379f, 0.767578f, 0.219238f, 0.759277f, 0.222534f, 0.751953f, 0.226685f, 0.744629f,
+ 0.229858f, 0.738281f, 0.233643f, 0.731934f, 0.236572f, 0.724609f, 0.241211f, 0.716797f,
+ 0.244019f, 0.710449f, 0.245972f, 0.704102f, 0.248291f, 0.698730f, 0.249756f, 0.693359f,
+ 0.251465f, 0.688477f, 0.251709f, 0.684082f, 0.251709f, 0.679688f, 0.252441f, 0.673340f,
+ 0.254395f, 0.666992f, 0.254150f, 0.661621f, 0.253662f, 0.655762f, 0.253418f, 0.649902f,
+ 0.252930f, 0.644531f, 0.250977f, 0.639160f, 0.248901f, 0.633301f, 0.247192f, 0.627441f,
+ 0.243896f, 0.621094f, 0.241699f, 0.614258f, 0.238403f, 0.605469f, 0.234863f, 0.596680f,
+ 0.231201f, 0.587402f, 0.225708f, 0.578125f, 0.220337f, 0.567871f, 0.213867f, 0.557129f,
+ 0.207275f, 0.546387f, 0.198364f, 0.533203f, 0.188599f, 0.519531f, 0.177856f, 0.504395f,
+ 0.166748f, 0.482910f, 0.153564f, 0.459229f, 0.138184f, 0.431152f, 0.120300f, 0.398193f,
+ 0.098999f, 0.358398f, 0.073364f, 0.306885f, 0.040985f, 0.233398f, 0.007290f, 0.077026f,
+ 0.000000f, 1.000000f, 0.023407f, 0.987793f, 0.043671f, 0.973145f, 0.063416f, 0.956543f,
+ 0.082153f, 0.938965f, 0.098206f, 0.922852f, 0.112915f, 0.908203f, 0.127319f, 0.892090f,
+ 0.140137f, 0.877930f, 0.151245f, 0.865723f, 0.162598f, 0.851562f, 0.173706f, 0.838379f,
+ 0.181763f, 0.827637f, 0.190796f, 0.816406f, 0.199951f, 0.804199f, 0.207886f, 0.793945f,
+ 0.214478f, 0.784180f, 0.221436f, 0.774902f, 0.227051f, 0.766113f, 0.233032f, 0.757324f,
+ 0.237671f, 0.748535f, 0.243530f, 0.739746f, 0.248047f, 0.732422f, 0.251953f, 0.725098f,
+ 0.255371f, 0.718262f, 0.258545f, 0.712402f, 0.262451f, 0.705566f, 0.264648f, 0.699219f,
+ 0.268066f, 0.691895f, 0.270508f, 0.685547f, 0.271973f, 0.680176f, 0.274414f, 0.674316f,
+ 0.275391f, 0.669434f, 0.275879f, 0.664551f, 0.277100f, 0.659668f, 0.276855f, 0.654785f,
+ 0.277100f, 0.650391f, 0.276367f, 0.645996f, 0.275635f, 0.641113f, 0.274902f, 0.634766f,
+ 0.274170f, 0.628906f, 0.272217f, 0.623047f, 0.270020f, 0.617676f, 0.268555f, 0.611328f,
+ 0.265381f, 0.605469f, 0.262207f, 0.598633f, 0.258301f, 0.592285f, 0.253662f, 0.584961f,
+ 0.249146f, 0.577637f, 0.243286f, 0.569336f, 0.236572f, 0.561035f, 0.229370f, 0.551270f,
+ 0.221802f, 0.539062f, 0.213257f, 0.525391f, 0.203247f, 0.510742f, 0.192139f, 0.494141f,
+ 0.179688f, 0.475342f, 0.165405f, 0.453613f, 0.148315f, 0.428223f, 0.129028f, 0.396973f,
+ 0.106262f, 0.358643f, 0.078552f, 0.308350f, 0.045227f, 0.227417f, 0.007805f, 0.077332f,
+ 0.000000f, 1.000000f, 0.028732f, 0.985840f, 0.054169f, 0.967773f, 0.077515f, 0.948242f,
+ 0.098267f, 0.929199f, 0.117065f, 0.911621f, 0.134155f, 0.893555f, 0.149414f, 0.877441f,
+ 0.163452f, 0.861816f, 0.176758f, 0.846680f, 0.189087f, 0.832520f, 0.199585f, 0.819824f,
+ 0.209351f, 0.807617f, 0.218628f, 0.795410f, 0.227295f, 0.783691f, 0.234985f, 0.773438f,
+ 0.241943f, 0.763184f, 0.249756f, 0.752930f, 0.254883f, 0.744141f, 0.260742f, 0.735352f,
+ 0.265381f, 0.727539f, 0.270264f, 0.719238f, 0.275635f, 0.710938f, 0.279297f, 0.703613f,
+ 0.283691f, 0.696289f, 0.287109f, 0.689453f, 0.288818f, 0.683594f, 0.292969f, 0.676758f,
+ 0.294189f, 0.670898f, 0.296631f, 0.665039f, 0.298096f, 0.659668f, 0.299805f, 0.654785f,
+ 0.300049f, 0.649902f, 0.300537f, 0.645996f, 0.301270f, 0.641113f, 0.301270f, 0.637207f,
+ 0.300049f, 0.632812f, 0.299805f, 0.627930f, 0.299072f, 0.623535f, 0.296875f, 0.618652f,
+ 0.296387f, 0.613770f, 0.293701f, 0.608887f, 0.291504f, 0.604004f, 0.289307f, 0.598145f,
+ 0.285156f, 0.592773f, 0.281494f, 0.586426f, 0.278076f, 0.580078f, 0.272461f, 0.573242f,
+ 0.267090f, 0.565918f, 0.261963f, 0.558594f, 0.253662f, 0.549316f, 0.246704f, 0.540039f,
+ 0.238037f, 0.529297f, 0.228394f, 0.517090f, 0.218018f, 0.504395f, 0.206421f, 0.489258f,
+ 0.191406f, 0.471191f, 0.176270f, 0.451416f, 0.157837f, 0.426758f, 0.137573f, 0.396729f,
+ 0.113403f, 0.357666f, 0.084412f, 0.304443f, 0.049072f, 0.224609f, 0.008316f, 0.078186f,
+ 0.000000f, 1.000000f, 0.032104f, 0.984863f, 0.060852f, 0.964355f, 0.085754f, 0.943848f,
+ 0.107727f, 0.923828f, 0.129028f, 0.904297f, 0.147339f, 0.885742f, 0.163208f, 0.868652f,
+ 0.178467f, 0.852051f, 0.191772f, 0.836914f, 0.204468f, 0.822266f, 0.215332f, 0.808594f,
+ 0.224976f, 0.796387f, 0.235107f, 0.784180f, 0.244507f, 0.771973f, 0.251953f, 0.761230f,
+ 0.259766f, 0.750488f, 0.265625f, 0.740723f, 0.271729f, 0.731445f, 0.278809f, 0.722168f,
+ 0.283691f, 0.713867f, 0.288818f, 0.705566f, 0.292480f, 0.698242f, 0.297119f, 0.690430f,
+ 0.301025f, 0.683105f, 0.304443f, 0.676270f, 0.307129f, 0.669922f, 0.309326f, 0.664062f,
+ 0.312500f, 0.657227f, 0.314453f, 0.651855f, 0.315918f, 0.645996f, 0.317627f, 0.641602f,
+ 0.317871f, 0.636719f, 0.318604f, 0.631836f, 0.319092f, 0.627441f, 0.319824f, 0.623047f,
+ 0.319336f, 0.619141f, 0.318604f, 0.613770f, 0.317139f, 0.609863f, 0.316406f, 0.605469f,
+ 0.314453f, 0.600586f, 0.312744f, 0.595703f, 0.310547f, 0.591309f, 0.306885f, 0.585938f,
+ 0.303711f, 0.580566f, 0.300293f, 0.574707f, 0.295898f, 0.568848f, 0.291748f, 0.562500f,
+ 0.285889f, 0.555176f, 0.280273f, 0.547363f, 0.272949f, 0.539062f, 0.265869f, 0.530273f,
+ 0.257080f, 0.520020f, 0.247803f, 0.508301f, 0.237305f, 0.495605f, 0.224976f, 0.480469f,
+ 0.210938f, 0.463135f, 0.195435f, 0.443115f, 0.177246f, 0.419189f, 0.156250f, 0.388916f,
+ 0.131104f, 0.351318f, 0.101135f, 0.299805f, 0.063171f, 0.223633f, 0.014900f, 0.084656f,
+ 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.061432f, 0.963867f, 0.086670f, 0.943359f,
+ 0.109070f, 0.923340f, 0.129272f, 0.903809f, 0.147827f, 0.885254f, 0.165161f, 0.867676f,
+ 0.179688f, 0.851562f, 0.193970f, 0.835449f, 0.206543f, 0.820801f, 0.218628f, 0.806641f,
+ 0.229248f, 0.793945f, 0.238892f, 0.781250f, 0.247681f, 0.769531f, 0.256104f, 0.757812f,
+ 0.264160f, 0.747559f, 0.270996f, 0.736816f, 0.278320f, 0.727051f, 0.283691f, 0.718262f,
+ 0.290283f, 0.708984f, 0.294922f, 0.700684f, 0.299316f, 0.692871f, 0.304443f, 0.684570f,
+ 0.308350f, 0.677246f, 0.312500f, 0.669922f, 0.315918f, 0.663086f, 0.317871f, 0.657227f,
+ 0.321045f, 0.650879f, 0.323730f, 0.644531f, 0.326904f, 0.638184f, 0.328125f, 0.633301f,
+ 0.329346f, 0.627930f, 0.330322f, 0.623047f, 0.330811f, 0.618164f, 0.332031f, 0.613770f,
+ 0.331787f, 0.609375f, 0.331543f, 0.604492f, 0.331299f, 0.599609f, 0.330322f, 0.595215f,
+ 0.328613f, 0.590332f, 0.328613f, 0.585449f, 0.326172f, 0.580566f, 0.323486f, 0.575195f,
+ 0.320801f, 0.569336f, 0.317871f, 0.563477f, 0.313965f, 0.557129f, 0.311279f, 0.550781f,
+ 0.305420f, 0.543457f, 0.300293f, 0.535645f, 0.294434f, 0.527832f, 0.287354f, 0.518066f,
+ 0.280518f, 0.508301f, 0.271484f, 0.497070f, 0.261475f, 0.484131f, 0.250244f, 0.469238f,
+ 0.236816f, 0.452393f, 0.221802f, 0.432861f, 0.205078f, 0.408936f, 0.184937f, 0.380127f,
+ 0.160278f, 0.343262f, 0.129395f, 0.293701f, 0.089783f, 0.219971f, 0.032715f, 0.083496f,
+ 0.000000f, 1.000000f, 0.032227f, 0.984375f, 0.060944f, 0.964355f, 0.086853f, 0.943359f,
+ 0.110291f, 0.922363f, 0.130615f, 0.902832f, 0.149170f, 0.884766f, 0.165649f, 0.867188f,
+ 0.180908f, 0.850586f, 0.196045f, 0.833984f, 0.208618f, 0.819336f, 0.220825f, 0.804688f,
+ 0.232300f, 0.791016f, 0.242920f, 0.778320f, 0.251221f, 0.766602f, 0.260498f, 0.754883f,
+ 0.268311f, 0.743652f, 0.276367f, 0.733398f, 0.283203f, 0.723145f, 0.289307f, 0.713867f,
+ 0.295654f, 0.704590f, 0.301025f, 0.695801f, 0.306396f, 0.687500f, 0.312012f, 0.679199f,
+ 0.315674f, 0.671387f, 0.319824f, 0.664062f, 0.324463f, 0.656738f, 0.327637f, 0.649902f,
+ 0.330566f, 0.643555f, 0.333984f, 0.636719f, 0.337402f, 0.630371f, 0.338379f, 0.625000f,
+ 0.340576f, 0.619629f, 0.342041f, 0.614258f, 0.343018f, 0.609375f, 0.344727f, 0.604004f,
+ 0.344727f, 0.599609f, 0.345459f, 0.595215f, 0.344971f, 0.589355f, 0.344727f, 0.584473f,
+ 0.344482f, 0.580078f, 0.343750f, 0.574219f, 0.341797f, 0.568848f, 0.340332f, 0.563965f,
+ 0.338135f, 0.558105f, 0.335693f, 0.551758f, 0.333008f, 0.545410f, 0.329346f, 0.538574f,
+ 0.325195f, 0.531250f, 0.320801f, 0.523438f, 0.315674f, 0.514648f, 0.309326f, 0.505371f,
+ 0.302734f, 0.495361f, 0.294922f, 0.484131f, 0.286377f, 0.471191f, 0.275879f, 0.456543f,
+ 0.263672f, 0.439453f, 0.250977f, 0.420410f, 0.233887f, 0.397217f, 0.214600f, 0.368652f,
+ 0.191040f, 0.332764f, 0.161011f, 0.285889f, 0.120117f, 0.213135f, 0.056519f, 0.080872f,
+ 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.060913f, 0.964355f, 0.087158f, 0.943359f,
+ 0.110718f, 0.922363f, 0.131714f, 0.902344f, 0.150635f, 0.883789f, 0.167603f, 0.865723f,
+ 0.183350f, 0.849121f, 0.198486f, 0.832520f, 0.211426f, 0.817383f, 0.224121f, 0.802734f,
+ 0.235474f, 0.789062f, 0.245728f, 0.776367f, 0.255615f, 0.763184f, 0.265381f, 0.751953f,
+ 0.273193f, 0.740234f, 0.281738f, 0.729492f, 0.288330f, 0.719238f, 0.295898f, 0.708984f,
+ 0.302246f, 0.699707f, 0.308594f, 0.690430f, 0.314453f, 0.681641f, 0.319092f, 0.673340f,
+ 0.324219f, 0.665039f, 0.328857f, 0.657227f, 0.333252f, 0.649902f, 0.336426f, 0.643066f,
+ 0.340332f, 0.635742f, 0.344482f, 0.628906f, 0.346924f, 0.622559f, 0.349609f, 0.616211f,
+ 0.352051f, 0.610352f, 0.353516f, 0.604980f, 0.355469f, 0.599121f, 0.356689f, 0.594238f,
+ 0.358643f, 0.588867f, 0.359375f, 0.583984f, 0.359863f, 0.578613f, 0.360352f, 0.572754f,
+ 0.360107f, 0.567871f, 0.360107f, 0.562012f, 0.359131f, 0.556641f, 0.358398f, 0.550781f,
+ 0.356934f, 0.544434f, 0.354980f, 0.538086f, 0.352539f, 0.531738f, 0.349365f, 0.524902f,
+ 0.346680f, 0.518066f, 0.342529f, 0.509277f, 0.337891f, 0.501465f, 0.332764f, 0.491943f,
+ 0.326660f, 0.481689f, 0.320312f, 0.470703f, 0.311523f, 0.458008f, 0.302734f, 0.444336f,
+ 0.291748f, 0.427490f, 0.278809f, 0.408936f, 0.263428f, 0.386230f, 0.244507f, 0.358398f,
+ 0.222168f, 0.324219f, 0.193359f, 0.278076f, 0.152344f, 0.208496f, 0.085327f, 0.079407f,
+ 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.061218f, 0.964355f, 0.087158f, 0.943359f,
+ 0.110657f, 0.922363f, 0.132690f, 0.902344f, 0.151001f, 0.883301f, 0.169067f, 0.864746f,
+ 0.185425f, 0.847656f, 0.200806f, 0.831055f, 0.213989f, 0.815918f, 0.226440f, 0.800781f,
+ 0.238525f, 0.786621f, 0.248901f, 0.773438f, 0.260498f, 0.760254f, 0.268555f, 0.748535f,
+ 0.277588f, 0.736816f, 0.287354f, 0.725098f, 0.294434f, 0.714844f, 0.302246f, 0.704102f,
+ 0.309814f, 0.694336f, 0.315918f, 0.684570f, 0.321289f, 0.676270f, 0.326904f, 0.666992f,
+ 0.332764f, 0.658691f, 0.337646f, 0.650391f, 0.341553f, 0.643066f, 0.347168f, 0.634766f,
+ 0.350586f, 0.627441f, 0.354736f, 0.620605f, 0.358643f, 0.613281f, 0.362061f, 0.606445f,
+ 0.363525f, 0.601074f, 0.366699f, 0.594238f, 0.369141f, 0.588379f, 0.370117f, 0.583496f,
+ 0.372559f, 0.577637f, 0.373535f, 0.572754f, 0.375244f, 0.567383f, 0.375000f, 0.561523f,
+ 0.375488f, 0.555664f, 0.375977f, 0.550781f, 0.375488f, 0.544434f, 0.374756f, 0.538574f,
+ 0.374512f, 0.532715f, 0.372803f, 0.526367f, 0.371094f, 0.519531f, 0.369385f, 0.512695f,
+ 0.366455f, 0.504883f, 0.362793f, 0.496582f, 0.358887f, 0.488770f, 0.354492f, 0.479492f,
+ 0.349854f, 0.468506f, 0.344482f, 0.457764f, 0.337158f, 0.444336f, 0.329346f, 0.430664f,
+ 0.318848f, 0.414307f, 0.307373f, 0.395752f, 0.292969f, 0.373535f, 0.276123f, 0.347168f,
+ 0.254639f, 0.313721f, 0.226685f, 0.268799f, 0.186768f, 0.202637f, 0.117493f, 0.077942f,
+ 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.061310f, 0.964355f, 0.087585f, 0.942871f,
+ 0.111755f, 0.921875f, 0.132812f, 0.901855f, 0.153564f, 0.881836f, 0.170166f, 0.863770f,
+ 0.187378f, 0.846191f, 0.202271f, 0.830078f, 0.217163f, 0.813477f, 0.229492f, 0.798340f,
+ 0.242065f, 0.784180f, 0.254150f, 0.770020f, 0.264160f, 0.757324f, 0.274414f, 0.744629f,
+ 0.283936f, 0.732422f, 0.292236f, 0.721191f, 0.301025f, 0.709961f, 0.308594f, 0.699219f,
+ 0.316406f, 0.688965f, 0.323730f, 0.678711f, 0.329590f, 0.669434f, 0.335449f, 0.660156f,
+ 0.341797f, 0.651367f, 0.347412f, 0.643066f, 0.351807f, 0.634766f, 0.357178f, 0.626465f,
+ 0.361084f, 0.619141f, 0.364258f, 0.612793f, 0.368164f, 0.605469f, 0.372559f, 0.598145f,
+ 0.375732f, 0.591797f, 0.379150f, 0.584961f, 0.381348f, 0.579102f, 0.382568f, 0.573730f,
+ 0.385498f, 0.567383f, 0.387451f, 0.562012f, 0.389648f, 0.556152f, 0.390381f, 0.550293f,
+ 0.391113f, 0.544434f, 0.391846f, 0.539062f, 0.392090f, 0.533203f, 0.392334f, 0.526367f,
+ 0.392090f, 0.520508f, 0.392334f, 0.513184f, 0.390625f, 0.506348f, 0.389404f, 0.499268f,
+ 0.387695f, 0.491699f, 0.385498f, 0.483643f, 0.382080f, 0.474609f, 0.377930f, 0.465576f,
+ 0.373779f, 0.455078f, 0.368652f, 0.443848f, 0.362061f, 0.431885f, 0.354736f, 0.417480f,
+ 0.347168f, 0.401611f, 0.335449f, 0.382568f, 0.323486f, 0.361328f, 0.307373f, 0.335205f,
+ 0.287109f, 0.303223f, 0.261719f, 0.260498f, 0.222290f, 0.195557f, 0.152588f, 0.075867f,
+ 0.000000f, 1.000000f, 0.032227f, 0.984863f, 0.062134f, 0.963379f, 0.088196f, 0.942383f,
+ 0.112488f, 0.921387f, 0.134033f, 0.901367f, 0.154907f, 0.880859f, 0.172363f, 0.862793f,
+ 0.189575f, 0.845215f, 0.203979f, 0.828125f, 0.218994f, 0.812012f, 0.233765f, 0.795898f,
+ 0.246338f, 0.781250f, 0.258301f, 0.767090f, 0.268799f, 0.753418f, 0.279053f, 0.740723f,
+ 0.289551f, 0.727539f, 0.299072f, 0.715820f, 0.307373f, 0.704590f, 0.314941f, 0.693848f,
+ 0.322510f, 0.683594f, 0.329102f, 0.673828f, 0.337158f, 0.663574f, 0.344238f, 0.653809f,
+ 0.349609f, 0.645020f, 0.354980f, 0.636230f, 0.360840f, 0.627930f, 0.366211f, 0.619629f,
+ 0.371094f, 0.611816f, 0.375244f, 0.604492f, 0.379150f, 0.597168f, 0.383545f, 0.589844f,
+ 0.387451f, 0.582520f, 0.391846f, 0.575684f, 0.394287f, 0.568848f, 0.396240f, 0.562988f,
+ 0.399658f, 0.556641f, 0.402100f, 0.550293f, 0.404053f, 0.544922f, 0.405762f, 0.539062f,
+ 0.406982f, 0.532227f, 0.407959f, 0.526367f, 0.409180f, 0.520508f, 0.409912f, 0.513672f,
+ 0.409912f, 0.507324f, 0.410645f, 0.500977f, 0.409912f, 0.493896f, 0.409180f, 0.486816f,
+ 0.408203f, 0.478271f, 0.406494f, 0.469727f, 0.403564f, 0.460449f, 0.400391f, 0.451904f,
+ 0.397217f, 0.440918f, 0.393799f, 0.429688f, 0.387939f, 0.418213f, 0.381592f, 0.404053f,
+ 0.375000f, 0.388428f, 0.364746f, 0.369873f, 0.353027f, 0.349365f, 0.339355f, 0.323975f,
+ 0.320801f, 0.292725f, 0.296875f, 0.250977f, 0.258545f, 0.188599f, 0.190674f, 0.073059f,
+ 0.000000f, 1.000000f, 0.032257f, 0.984863f, 0.062073f, 0.963379f, 0.088806f, 0.942383f,
+ 0.111633f, 0.921875f, 0.135376f, 0.900391f, 0.154785f, 0.880859f, 0.173706f, 0.862305f,
+ 0.190796f, 0.843750f, 0.207642f, 0.826172f, 0.222412f, 0.809570f, 0.236816f, 0.793457f,
+ 0.249512f, 0.778320f, 0.262207f, 0.763184f, 0.273926f, 0.749512f, 0.284912f, 0.736328f,
+ 0.295410f, 0.723633f, 0.304443f, 0.711914f, 0.313721f, 0.700195f, 0.322021f, 0.688965f,
+ 0.329346f, 0.678223f, 0.337402f, 0.667969f, 0.345215f, 0.657715f, 0.352051f, 0.647949f,
+ 0.357666f, 0.638672f, 0.364014f, 0.629883f, 0.371094f, 0.620117f, 0.375000f, 0.612793f,
+ 0.381592f, 0.604004f, 0.385498f, 0.596191f, 0.391602f, 0.587891f, 0.395996f, 0.580078f,
+ 0.399902f, 0.572754f, 0.403564f, 0.565430f, 0.407471f, 0.558594f, 0.410400f, 0.552246f,
+ 0.413330f, 0.545898f, 0.416748f, 0.539551f, 0.418945f, 0.533203f, 0.420654f, 0.527832f,
+ 0.423096f, 0.520996f, 0.425293f, 0.514160f, 0.427002f, 0.507324f, 0.427490f, 0.500977f,
+ 0.428467f, 0.494141f, 0.429443f, 0.487793f, 0.429932f, 0.479736f, 0.429199f, 0.472412f,
+ 0.428223f, 0.465088f, 0.427734f, 0.456299f, 0.427002f, 0.447266f, 0.423828f, 0.437744f,
+ 0.421631f, 0.427734f, 0.418457f, 0.415771f, 0.414307f, 0.403809f, 0.408447f, 0.390137f,
+ 0.401855f, 0.374268f, 0.394531f, 0.356934f, 0.383545f, 0.336670f, 0.371338f, 0.311768f,
+ 0.354248f, 0.281006f, 0.331787f, 0.241089f, 0.296143f, 0.181763f, 0.230469f, 0.069702f,
+ 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.061951f, 0.963867f, 0.088989f, 0.942383f,
+ 0.112976f, 0.920898f, 0.136108f, 0.899414f, 0.156616f, 0.879883f, 0.175293f, 0.860840f,
+ 0.194214f, 0.841309f, 0.211182f, 0.823242f, 0.226440f, 0.806152f, 0.241089f, 0.790039f,
+ 0.254150f, 0.774902f, 0.266846f, 0.760254f, 0.278076f, 0.746582f, 0.289307f, 0.732910f,
+ 0.299805f, 0.720215f, 0.309814f, 0.708008f, 0.319336f, 0.695801f, 0.329102f, 0.684082f,
+ 0.336670f, 0.672852f, 0.344727f, 0.662109f, 0.352539f, 0.651855f, 0.359619f, 0.641602f,
+ 0.367432f, 0.631348f, 0.374512f, 0.622070f, 0.380127f, 0.613281f, 0.385742f, 0.604492f,
+ 0.391113f, 0.595703f, 0.396484f, 0.587402f, 0.401611f, 0.579590f, 0.406006f, 0.571777f,
+ 0.411865f, 0.563477f, 0.416260f, 0.555664f, 0.420410f, 0.548828f, 0.424072f, 0.541504f,
+ 0.427490f, 0.534668f, 0.430664f, 0.527832f, 0.434326f, 0.521484f, 0.436768f, 0.515137f,
+ 0.440674f, 0.508301f, 0.441895f, 0.501953f, 0.443359f, 0.495361f, 0.446289f, 0.488770f,
+ 0.447754f, 0.480957f, 0.447998f, 0.474365f, 0.449463f, 0.466797f, 0.449951f, 0.458984f,
+ 0.449951f, 0.451172f, 0.448975f, 0.442383f, 0.448975f, 0.433350f, 0.446777f, 0.423584f,
+ 0.446045f, 0.413330f, 0.442627f, 0.401855f, 0.440186f, 0.389648f, 0.435303f, 0.376221f,
+ 0.429443f, 0.360840f, 0.422363f, 0.343262f, 0.414062f, 0.323242f, 0.402100f, 0.299072f,
+ 0.387207f, 0.270264f, 0.367432f, 0.231201f, 0.334229f, 0.173828f, 0.270752f, 0.066895f,
+ 0.000000f, 1.000000f, 0.032349f, 0.984375f, 0.061493f, 0.964355f, 0.088989f, 0.942383f,
+ 0.114197f, 0.920410f, 0.137085f, 0.899414f, 0.157959f, 0.878418f, 0.178711f, 0.858398f,
+ 0.197266f, 0.839355f, 0.212891f, 0.821777f, 0.229248f, 0.804688f, 0.243896f, 0.788574f,
+ 0.257812f, 0.772461f, 0.270264f, 0.758301f, 0.281982f, 0.743652f, 0.294189f, 0.729492f,
+ 0.304932f, 0.716309f, 0.315674f, 0.703613f, 0.324463f, 0.691406f, 0.335938f, 0.678711f,
+ 0.344238f, 0.667480f, 0.351807f, 0.656738f, 0.359863f, 0.645508f, 0.368164f, 0.634766f,
+ 0.376465f, 0.624512f, 0.382080f, 0.615723f, 0.389404f, 0.605957f, 0.395508f, 0.596680f,
+ 0.401367f, 0.587891f, 0.407471f, 0.579102f, 0.414062f, 0.569824f, 0.418457f, 0.562012f,
+ 0.424561f, 0.553711f, 0.429688f, 0.545898f, 0.433594f, 0.538574f, 0.437744f, 0.530762f,
+ 0.441895f, 0.523926f, 0.445801f, 0.516602f, 0.450684f, 0.509277f, 0.452881f, 0.502930f,
+ 0.456543f, 0.496094f, 0.458984f, 0.489502f, 0.460693f, 0.482422f, 0.463135f, 0.475342f,
+ 0.465576f, 0.468262f, 0.466064f, 0.461182f, 0.468994f, 0.452881f, 0.470215f, 0.444824f,
+ 0.470703f, 0.437256f, 0.471680f, 0.427979f, 0.471191f, 0.418701f, 0.470215f, 0.409668f,
+ 0.469482f, 0.398682f, 0.466797f, 0.387695f, 0.465332f, 0.375488f, 0.462646f, 0.362305f,
+ 0.456543f, 0.346924f, 0.451904f, 0.329590f, 0.443848f, 0.310547f, 0.434570f, 0.287109f,
+ 0.420654f, 0.258301f, 0.401855f, 0.221558f, 0.372070f, 0.166260f, 0.311035f, 0.064758f,
+ 0.000000f, 1.000000f, 0.031952f, 0.984863f, 0.061584f, 0.964355f, 0.089539f, 0.941895f,
+ 0.115112f, 0.919922f, 0.138184f, 0.897949f, 0.160400f, 0.876953f, 0.180542f, 0.856934f,
+ 0.198242f, 0.838379f, 0.216187f, 0.819824f, 0.230835f, 0.803223f, 0.246094f, 0.786621f,
+ 0.260498f, 0.770508f, 0.274170f, 0.754883f, 0.286621f, 0.740234f, 0.300049f, 0.725586f,
+ 0.310791f, 0.711914f, 0.322266f, 0.698242f, 0.331299f, 0.686035f, 0.341797f, 0.673340f,
+ 0.350342f, 0.662109f, 0.360107f, 0.650391f, 0.367920f, 0.639648f, 0.376953f, 0.628418f,
+ 0.384033f, 0.618652f, 0.391357f, 0.608398f, 0.399170f, 0.598145f, 0.406982f, 0.588379f,
+ 0.412598f, 0.579102f, 0.419434f, 0.569824f, 0.424072f, 0.561523f, 0.430176f, 0.552734f,
+ 0.436035f, 0.544434f, 0.442383f, 0.535645f, 0.446533f, 0.527832f, 0.451904f, 0.519531f,
+ 0.455078f, 0.512695f, 0.460938f, 0.504883f, 0.465088f, 0.497803f, 0.468262f, 0.490967f,
+ 0.472900f, 0.483398f, 0.476562f, 0.476562f, 0.478760f, 0.469482f, 0.481445f, 0.462158f,
+ 0.484375f, 0.454590f, 0.486572f, 0.447021f, 0.488281f, 0.439209f, 0.490723f, 0.431396f,
+ 0.490967f, 0.423096f, 0.492676f, 0.414062f, 0.494141f, 0.404541f, 0.494141f, 0.395020f,
+ 0.493408f, 0.384766f, 0.493408f, 0.373779f, 0.489746f, 0.361572f, 0.488770f, 0.348145f,
+ 0.485107f, 0.332764f, 0.480469f, 0.316162f, 0.472900f, 0.297119f, 0.465332f, 0.274414f,
+ 0.454102f, 0.246948f, 0.436279f, 0.211060f, 0.408936f, 0.158203f, 0.352051f, 0.061707f,
+ 0.000000f, 1.000000f, 0.031860f, 0.984863f, 0.062103f, 0.963867f, 0.089905f, 0.941406f,
+ 0.115967f, 0.918945f, 0.139648f, 0.896973f, 0.162598f, 0.875488f, 0.181763f, 0.855957f,
+ 0.200928f, 0.836914f, 0.217651f, 0.818848f, 0.234985f, 0.800781f, 0.249878f, 0.784180f,
+ 0.264648f, 0.767578f, 0.278809f, 0.751953f, 0.292480f, 0.735840f, 0.304443f, 0.721680f,
+ 0.316895f, 0.707520f, 0.327393f, 0.694336f, 0.338135f, 0.681152f, 0.348145f, 0.668945f,
+ 0.358154f, 0.656250f, 0.367920f, 0.644531f, 0.377441f, 0.632812f, 0.384766f, 0.622070f,
+ 0.392822f, 0.611328f, 0.401367f, 0.600586f, 0.409424f, 0.590332f, 0.416748f, 0.580566f,
+ 0.423584f, 0.570801f, 0.431152f, 0.561035f, 0.437012f, 0.551758f, 0.443359f, 0.542969f,
+ 0.448486f, 0.534668f, 0.454346f, 0.525879f, 0.461182f, 0.517090f, 0.465332f, 0.509277f,
+ 0.470703f, 0.500977f, 0.475098f, 0.493408f, 0.479980f, 0.485840f, 0.484375f, 0.478516f,
+ 0.488281f, 0.470947f, 0.492920f, 0.463623f, 0.496826f, 0.456787f, 0.498779f, 0.448730f,
+ 0.501953f, 0.440918f, 0.504883f, 0.433594f, 0.507812f, 0.425537f, 0.509766f, 0.417236f,
+ 0.512207f, 0.408203f, 0.514160f, 0.400146f, 0.514648f, 0.390381f, 0.516602f, 0.380371f,
+ 0.515625f, 0.370361f, 0.516602f, 0.358643f, 0.515625f, 0.346436f, 0.514160f, 0.333740f,
+ 0.511719f, 0.319092f, 0.509277f, 0.302490f, 0.502441f, 0.284424f, 0.496094f, 0.262207f,
+ 0.484619f, 0.235474f, 0.472168f, 0.201050f, 0.446777f, 0.150513f, 0.394043f, 0.058258f,
+ 0.000000f, 1.000000f, 0.032166f, 0.984863f, 0.061920f, 0.963867f, 0.090759f, 0.940918f,
+ 0.116943f, 0.917969f, 0.140381f, 0.896484f, 0.162720f, 0.875488f, 0.183472f, 0.854980f,
+ 0.202637f, 0.835449f, 0.220215f, 0.817383f, 0.237549f, 0.798828f, 0.253418f, 0.781738f,
+ 0.268311f, 0.764648f, 0.283203f, 0.748047f, 0.296875f, 0.732910f, 0.309326f, 0.718262f,
+ 0.321289f, 0.704102f, 0.334473f, 0.689453f, 0.344238f, 0.676270f, 0.354736f, 0.663574f,
+ 0.365967f, 0.650879f, 0.375732f, 0.638672f, 0.384033f, 0.626953f, 0.393311f, 0.615234f,
+ 0.403076f, 0.603516f, 0.411377f, 0.592773f, 0.419678f, 0.582520f, 0.426025f, 0.572266f,
+ 0.434570f, 0.562012f, 0.440674f, 0.552734f, 0.449219f, 0.542480f, 0.455566f, 0.533203f,
+ 0.461670f, 0.524414f, 0.467285f, 0.515625f, 0.475098f, 0.506348f, 0.480225f, 0.498291f,
+ 0.486084f, 0.489502f, 0.490234f, 0.481689f, 0.495361f, 0.473877f, 0.500000f, 0.465820f,
+ 0.503906f, 0.458496f, 0.509766f, 0.450439f, 0.513672f, 0.443115f, 0.517578f, 0.435547f,
+ 0.520996f, 0.427002f, 0.523438f, 0.419434f, 0.527832f, 0.411621f, 0.529785f, 0.402588f,
+ 0.532715f, 0.394287f, 0.535156f, 0.385254f, 0.537598f, 0.375977f, 0.539551f, 0.365967f,
+ 0.540527f, 0.355957f, 0.540527f, 0.344482f, 0.541016f, 0.332764f, 0.539551f, 0.319824f,
+ 0.538086f, 0.305908f, 0.536621f, 0.288818f, 0.532227f, 0.271240f, 0.526855f, 0.249512f,
+ 0.518555f, 0.223755f, 0.504883f, 0.190186f, 0.482178f, 0.142944f, 0.436279f, 0.055878f,
+ 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.062805f, 0.963379f, 0.090637f, 0.940918f,
+ 0.118896f, 0.916992f, 0.141602f, 0.895996f, 0.165039f, 0.874023f, 0.185791f, 0.854004f,
+ 0.204712f, 0.834473f, 0.223145f, 0.814941f, 0.240356f, 0.796387f, 0.257080f, 0.778809f,
+ 0.272461f, 0.761719f, 0.287354f, 0.745117f, 0.300781f, 0.729492f, 0.315430f, 0.714355f,
+ 0.327148f, 0.699219f, 0.339355f, 0.685059f, 0.351562f, 0.670898f, 0.362061f, 0.658203f,
+ 0.373047f, 0.645020f, 0.383545f, 0.632324f, 0.393799f, 0.620117f, 0.403809f, 0.607910f,
+ 0.411133f, 0.597168f, 0.420166f, 0.585938f, 0.429932f, 0.574219f, 0.437012f, 0.563965f,
+ 0.445312f, 0.553711f, 0.452148f, 0.543457f, 0.459717f, 0.533691f, 0.467529f, 0.523926f,
+ 0.474365f, 0.514160f, 0.480469f, 0.505371f, 0.487793f, 0.496338f, 0.493896f, 0.487061f,
+ 0.499268f, 0.478516f, 0.505859f, 0.469482f, 0.511230f, 0.461670f, 0.516602f, 0.453369f,
+ 0.521484f, 0.445312f, 0.526367f, 0.437500f, 0.531250f, 0.429688f, 0.535156f, 0.422119f,
+ 0.538574f, 0.414062f, 0.543457f, 0.405273f, 0.547363f, 0.397217f, 0.551270f, 0.388916f,
+ 0.553223f, 0.379883f, 0.555664f, 0.371338f, 0.559570f, 0.361328f, 0.561523f, 0.351318f,
+ 0.563477f, 0.341064f, 0.565918f, 0.329834f, 0.565918f, 0.317871f, 0.564941f, 0.305420f,
+ 0.564941f, 0.291260f, 0.563965f, 0.274902f, 0.560547f, 0.258057f, 0.556152f, 0.237305f,
+ 0.550293f, 0.213013f, 0.539062f, 0.180786f, 0.519043f, 0.135864f, 0.474854f, 0.052826f,
+ 0.000000f, 1.000000f, 0.032440f, 0.984375f, 0.063049f, 0.963379f, 0.092773f, 0.939453f,
+ 0.118774f, 0.916992f, 0.142944f, 0.895508f, 0.166138f, 0.873535f, 0.187744f, 0.852539f,
+ 0.206665f, 0.833008f, 0.227295f, 0.812500f, 0.243774f, 0.793945f, 0.260254f, 0.776855f,
+ 0.275879f, 0.759277f, 0.291504f, 0.742188f, 0.307617f, 0.725098f, 0.319580f, 0.710449f,
+ 0.333984f, 0.694824f, 0.344727f, 0.681152f, 0.358643f, 0.666016f, 0.369629f, 0.652344f,
+ 0.381836f, 0.639160f, 0.391602f, 0.626465f, 0.401367f, 0.613770f, 0.412109f, 0.601074f,
+ 0.420654f, 0.589844f, 0.429443f, 0.578613f, 0.438232f, 0.566895f, 0.447510f, 0.555664f,
+ 0.456055f, 0.544922f, 0.464355f, 0.534180f, 0.471191f, 0.524414f, 0.480713f, 0.513672f,
+ 0.487061f, 0.504395f, 0.493652f, 0.494873f, 0.500977f, 0.485596f, 0.507324f, 0.476318f,
+ 0.514160f, 0.466797f, 0.520020f, 0.458008f, 0.525879f, 0.449463f, 0.532715f, 0.440430f,
+ 0.537109f, 0.432617f, 0.543457f, 0.424072f, 0.548828f, 0.416016f, 0.553223f, 0.408203f,
+ 0.558594f, 0.400146f, 0.562012f, 0.391602f, 0.565918f, 0.382568f, 0.570801f, 0.374268f,
+ 0.575195f, 0.365234f, 0.577637f, 0.356445f, 0.581543f, 0.346436f, 0.584473f, 0.337402f,
+ 0.585938f, 0.326416f, 0.589355f, 0.315674f, 0.589355f, 0.303955f, 0.590820f, 0.291260f,
+ 0.590820f, 0.277588f, 0.590332f, 0.262207f, 0.589355f, 0.244873f, 0.585938f, 0.224609f,
+ 0.580078f, 0.201416f, 0.570801f, 0.170776f, 0.554199f, 0.127808f, 0.515137f, 0.048737f,
+ 0.000000f, 1.000000f, 0.032379f, 0.984375f, 0.063538f, 0.962891f, 0.093689f, 0.938965f,
+ 0.119202f, 0.916992f, 0.144165f, 0.894531f, 0.166870f, 0.873047f, 0.189453f, 0.851562f,
+ 0.209839f, 0.830566f, 0.229370f, 0.811035f, 0.247192f, 0.791992f, 0.264404f, 0.773438f,
+ 0.281006f, 0.755859f, 0.296631f, 0.738281f, 0.312012f, 0.722168f, 0.324707f, 0.706543f,
+ 0.340576f, 0.690430f, 0.352295f, 0.675293f, 0.364502f, 0.661133f, 0.376221f, 0.646973f,
+ 0.388428f, 0.633301f, 0.399170f, 0.620117f, 0.409668f, 0.607422f, 0.420654f, 0.594238f,
+ 0.430176f, 0.582031f, 0.439697f, 0.570312f, 0.448975f, 0.558594f, 0.457764f, 0.547852f,
+ 0.467529f, 0.535645f, 0.475586f, 0.525391f, 0.484131f, 0.514648f, 0.491699f, 0.504395f,
+ 0.499756f, 0.494141f, 0.508789f, 0.483643f, 0.514160f, 0.474854f, 0.521973f, 0.464844f,
+ 0.528320f, 0.455566f, 0.535645f, 0.446045f, 0.542480f, 0.436768f, 0.548340f, 0.428223f,
+ 0.555176f, 0.419189f, 0.560059f, 0.411133f, 0.565918f, 0.402588f, 0.570801f, 0.394043f,
+ 0.577148f, 0.385986f, 0.581055f, 0.377930f, 0.586426f, 0.368164f, 0.590820f, 0.359619f,
+ 0.596191f, 0.350830f, 0.598145f, 0.342041f, 0.603027f, 0.332275f, 0.605957f, 0.322266f,
+ 0.609375f, 0.312012f, 0.613281f, 0.301514f, 0.614258f, 0.289551f, 0.616211f, 0.277100f,
+ 0.617676f, 0.264160f, 0.618652f, 0.249512f, 0.616699f, 0.231812f, 0.615234f, 0.212524f,
+ 0.610352f, 0.189819f, 0.602051f, 0.160278f, 0.589355f, 0.119446f, 0.553223f, 0.046387f,
+ 0.000000f, 1.000000f, 0.031982f, 0.984863f, 0.063782f, 0.962402f, 0.093689f, 0.939453f,
+ 0.120239f, 0.916504f, 0.145142f, 0.894043f, 0.169434f, 0.871582f, 0.190674f, 0.850098f,
+ 0.213013f, 0.829102f, 0.231201f, 0.809570f, 0.249634f, 0.790039f, 0.268555f, 0.770996f,
+ 0.284668f, 0.753418f, 0.300293f, 0.735840f, 0.316895f, 0.718262f, 0.331055f, 0.702148f,
+ 0.344482f, 0.686523f, 0.358154f, 0.670898f, 0.372314f, 0.655762f, 0.384033f, 0.641602f,
+ 0.396484f, 0.627441f, 0.408936f, 0.613281f, 0.419678f, 0.600098f, 0.430176f, 0.587402f,
+ 0.439453f, 0.575195f, 0.449463f, 0.562500f, 0.459717f, 0.550293f, 0.469971f, 0.538574f,
+ 0.479004f, 0.527344f, 0.486816f, 0.516113f, 0.496338f, 0.505371f, 0.504395f, 0.494629f,
+ 0.512695f, 0.483887f, 0.521484f, 0.473389f, 0.528809f, 0.463135f, 0.535645f, 0.453857f,
+ 0.543457f, 0.444092f, 0.551270f, 0.434326f, 0.558105f, 0.424561f, 0.564453f, 0.415527f,
+ 0.570801f, 0.406494f, 0.576172f, 0.397705f, 0.582520f, 0.388916f, 0.588867f, 0.380127f,
+ 0.595703f, 0.371582f, 0.600586f, 0.363281f, 0.606445f, 0.354492f, 0.610352f, 0.345459f,
+ 0.615723f, 0.336426f, 0.619629f, 0.327637f, 0.623535f, 0.317627f, 0.627930f, 0.307861f,
+ 0.631348f, 0.297363f, 0.635254f, 0.286865f, 0.638184f, 0.275635f, 0.641113f, 0.263184f,
+ 0.642578f, 0.249878f, 0.643555f, 0.235352f, 0.643555f, 0.218994f, 0.643066f, 0.200684f,
+ 0.640137f, 0.178589f, 0.633301f, 0.151367f, 0.621582f, 0.112854f, 0.590332f, 0.044617f,
+ 0.000000f, 1.000000f, 0.031830f, 0.984863f, 0.065002f, 0.961426f, 0.093323f, 0.939453f,
+ 0.120544f, 0.916504f, 0.146118f, 0.893555f, 0.170532f, 0.870605f, 0.192017f, 0.849609f,
+ 0.214478f, 0.827637f, 0.235474f, 0.806641f, 0.253662f, 0.787109f, 0.271240f, 0.768555f,
+ 0.288574f, 0.750000f, 0.305908f, 0.731934f, 0.321045f, 0.714844f, 0.336182f, 0.698242f,
+ 0.351318f, 0.681641f, 0.364990f, 0.666016f, 0.378906f, 0.650879f, 0.390625f, 0.635742f,
+ 0.403076f, 0.621582f, 0.416016f, 0.607422f, 0.427734f, 0.593750f, 0.438477f, 0.580078f,
+ 0.448975f, 0.567383f, 0.461426f, 0.554199f, 0.470215f, 0.542480f, 0.480713f, 0.530273f,
+ 0.489502f, 0.518555f, 0.499756f, 0.506348f, 0.508301f, 0.495850f, 0.517578f, 0.484131f,
+ 0.525879f, 0.473633f, 0.533691f, 0.463135f, 0.542480f, 0.452393f, 0.550293f, 0.442139f,
+ 0.558105f, 0.432129f, 0.565430f, 0.422607f, 0.573242f, 0.412354f, 0.581543f, 0.402832f,
+ 0.586914f, 0.393555f, 0.594727f, 0.384033f, 0.599121f, 0.375977f, 0.606934f, 0.366211f,
+ 0.612793f, 0.357666f, 0.619629f, 0.348633f, 0.625000f, 0.340332f, 0.629395f, 0.331299f,
+ 0.636230f, 0.321777f, 0.641113f, 0.312500f, 0.645508f, 0.303467f, 0.649902f, 0.293457f,
+ 0.653809f, 0.283447f, 0.657227f, 0.272705f, 0.661621f, 0.261230f, 0.664062f, 0.249023f,
+ 0.667969f, 0.236450f, 0.669434f, 0.222290f, 0.670898f, 0.207031f, 0.670410f, 0.188599f,
+ 0.667969f, 0.167603f, 0.663574f, 0.141479f, 0.653320f, 0.104431f, 0.627441f, 0.040070f,
+ 0.000000f, 1.000000f, 0.032135f, 0.984863f, 0.065613f, 0.961426f, 0.093323f, 0.939941f,
+ 0.121582f, 0.916016f, 0.148560f, 0.892090f, 0.172119f, 0.869629f, 0.194824f, 0.847656f,
+ 0.217041f, 0.826172f, 0.236938f, 0.805664f, 0.256592f, 0.785645f, 0.275635f, 0.765137f,
+ 0.292969f, 0.746582f, 0.310059f, 0.728516f, 0.326660f, 0.710938f, 0.342285f, 0.693848f,
+ 0.356445f, 0.677246f, 0.371338f, 0.660645f, 0.385742f, 0.645508f, 0.398438f, 0.630371f,
+ 0.411621f, 0.615234f, 0.424316f, 0.600586f, 0.436279f, 0.586426f, 0.448242f, 0.573242f,
+ 0.459961f, 0.560059f, 0.471191f, 0.546387f, 0.480957f, 0.534180f, 0.491211f, 0.521484f,
+ 0.501953f, 0.508789f, 0.510742f, 0.497559f, 0.520996f, 0.485840f, 0.529785f, 0.474609f,
+ 0.540039f, 0.463135f, 0.546387f, 0.452637f, 0.556641f, 0.441406f, 0.564941f, 0.430664f,
+ 0.572266f, 0.420898f, 0.580566f, 0.410400f, 0.589355f, 0.400391f, 0.596191f, 0.390625f,
+ 0.602539f, 0.380859f, 0.611328f, 0.370850f, 0.617188f, 0.361816f, 0.625977f, 0.352295f,
+ 0.630371f, 0.343750f, 0.637207f, 0.334717f, 0.643555f, 0.325684f, 0.649902f, 0.316650f,
+ 0.655762f, 0.307373f, 0.660156f, 0.298096f, 0.666016f, 0.288330f, 0.671387f, 0.279053f,
+ 0.675781f, 0.268799f, 0.680176f, 0.258301f, 0.685059f, 0.247192f, 0.686523f, 0.235718f,
+ 0.690918f, 0.223145f, 0.693359f, 0.208984f, 0.694336f, 0.194458f, 0.695801f, 0.176758f,
+ 0.696777f, 0.157349f, 0.693359f, 0.131958f, 0.684570f, 0.097412f, 0.661133f, 0.037842f,
+ 0.000000f, 1.000000f, 0.032623f, 0.984375f, 0.064941f, 0.961914f, 0.094177f, 0.938965f,
+ 0.122559f, 0.915039f, 0.148560f, 0.891602f, 0.172485f, 0.869141f, 0.196777f, 0.846191f,
+ 0.219849f, 0.824219f, 0.239868f, 0.803711f, 0.260498f, 0.782715f, 0.279541f, 0.762695f,
+ 0.298340f, 0.743652f, 0.314697f, 0.725098f, 0.330811f, 0.707031f, 0.347900f, 0.689453f,
+ 0.362061f, 0.672852f, 0.378662f, 0.655762f, 0.392090f, 0.640137f, 0.405762f, 0.624512f,
+ 0.418457f, 0.609375f, 0.432129f, 0.594727f, 0.445801f, 0.580078f, 0.457520f, 0.565918f,
+ 0.469971f, 0.551758f, 0.480469f, 0.538574f, 0.491699f, 0.525391f, 0.503418f, 0.512207f,
+ 0.513672f, 0.500000f, 0.522461f, 0.488281f, 0.532715f, 0.476074f, 0.543457f, 0.464355f,
+ 0.551758f, 0.452881f, 0.562012f, 0.441406f, 0.569336f, 0.430664f, 0.580078f, 0.419434f,
+ 0.586426f, 0.409180f, 0.596191f, 0.398193f, 0.603516f, 0.388428f, 0.611816f, 0.377930f,
+ 0.620605f, 0.367432f, 0.628418f, 0.357910f, 0.634766f, 0.348389f, 0.642090f, 0.339111f,
+ 0.648926f, 0.329346f, 0.655762f, 0.320312f, 0.662109f, 0.311279f, 0.667969f, 0.302246f,
+ 0.675293f, 0.293213f, 0.680176f, 0.283936f, 0.686035f, 0.273926f, 0.691895f, 0.264404f,
+ 0.696289f, 0.254395f, 0.701172f, 0.243896f, 0.708008f, 0.232788f, 0.710938f, 0.221558f,
+ 0.714355f, 0.209351f, 0.718750f, 0.195801f, 0.721191f, 0.181641f, 0.722168f, 0.165527f,
+ 0.723633f, 0.146851f, 0.721191f, 0.123413f, 0.714355f, 0.091125f, 0.694336f, 0.035065f,
+ 0.000000f, 1.000000f, 0.033020f, 0.983887f, 0.065308f, 0.961914f, 0.094727f, 0.938965f,
+ 0.123535f, 0.914551f, 0.149902f, 0.891602f, 0.175659f, 0.867188f, 0.199585f, 0.844727f,
+ 0.221313f, 0.823242f, 0.243652f, 0.800781f, 0.262939f, 0.780762f, 0.282959f, 0.760254f,
+ 0.300293f, 0.741211f, 0.319336f, 0.721680f, 0.337646f, 0.702637f, 0.353271f, 0.685547f,
+ 0.369141f, 0.667480f, 0.385010f, 0.650879f, 0.400146f, 0.634277f, 0.414551f, 0.618164f,
+ 0.428955f, 0.602539f, 0.440918f, 0.587891f, 0.454346f, 0.572754f, 0.466797f, 0.558594f,
+ 0.479248f, 0.544434f, 0.491211f, 0.530273f, 0.502441f, 0.517090f, 0.512695f, 0.504395f,
+ 0.523926f, 0.491455f, 0.535156f, 0.478516f, 0.544922f, 0.466797f, 0.554199f, 0.454590f,
+ 0.564941f, 0.442383f, 0.574219f, 0.430908f, 0.584473f, 0.419189f, 0.592773f, 0.408691f,
+ 0.603027f, 0.396973f, 0.612793f, 0.385742f, 0.620117f, 0.375732f, 0.625488f, 0.366211f,
+ 0.636719f, 0.354980f, 0.643555f, 0.345215f, 0.651855f, 0.334717f, 0.659668f, 0.324951f,
+ 0.667969f, 0.315186f, 0.673340f, 0.306152f, 0.679688f, 0.297363f, 0.687500f, 0.287598f,
+ 0.694824f, 0.278320f, 0.701660f, 0.269287f, 0.707031f, 0.259766f, 0.712402f, 0.249878f,
+ 0.718750f, 0.240234f, 0.722656f, 0.230103f, 0.728516f, 0.219116f, 0.733398f, 0.207886f,
+ 0.737793f, 0.196899f, 0.742676f, 0.183472f, 0.744629f, 0.169678f, 0.748047f, 0.154053f,
+ 0.747559f, 0.136230f, 0.748535f, 0.113220f, 0.744141f, 0.082703f, 0.728027f, 0.031616f,
+ 0.000000f, 1.000000f, 0.033752f, 0.983398f, 0.065613f, 0.961914f, 0.095276f, 0.938477f,
+ 0.124146f, 0.914062f, 0.150757f, 0.890625f, 0.176392f, 0.866699f, 0.200439f, 0.844238f,
+ 0.224243f, 0.821289f, 0.245117f, 0.799805f, 0.267090f, 0.778320f, 0.286621f, 0.758301f,
+ 0.306641f, 0.737305f, 0.323730f, 0.718262f, 0.342285f, 0.699219f, 0.359375f, 0.681152f,
+ 0.375977f, 0.663086f, 0.391602f, 0.645996f, 0.407227f, 0.628906f, 0.422119f, 0.612305f,
+ 0.435547f, 0.596680f, 0.448730f, 0.581543f, 0.462891f, 0.565918f, 0.475830f, 0.551270f,
+ 0.488037f, 0.536621f, 0.501465f, 0.522461f, 0.513184f, 0.508301f, 0.524902f, 0.495117f,
+ 0.536621f, 0.481689f, 0.546387f, 0.469482f, 0.557129f, 0.456543f, 0.568359f, 0.443848f,
+ 0.578613f, 0.431885f, 0.588867f, 0.419922f, 0.599121f, 0.407959f, 0.607422f, 0.396729f,
+ 0.616699f, 0.385498f, 0.626953f, 0.374268f, 0.634766f, 0.363525f, 0.643066f, 0.352783f,
+ 0.652344f, 0.342529f, 0.660156f, 0.332031f, 0.668945f, 0.321533f, 0.677246f, 0.311279f,
+ 0.685059f, 0.301758f, 0.691406f, 0.291992f, 0.699219f, 0.282715f, 0.706543f, 0.272949f,
+ 0.712891f, 0.263916f, 0.721191f, 0.254395f, 0.726562f, 0.245850f, 0.731934f, 0.235962f,
+ 0.739258f, 0.225464f, 0.745117f, 0.215942f, 0.750000f, 0.205566f, 0.755859f, 0.194336f,
+ 0.760254f, 0.183350f, 0.765137f, 0.171387f, 0.769043f, 0.158081f, 0.772461f, 0.142822f,
+ 0.773438f, 0.125977f, 0.774414f, 0.105103f, 0.771484f, 0.077087f, 0.757812f, 0.028961f,
+ 0.000000f, 1.000000f, 0.033691f, 0.983398f, 0.065063f, 0.962402f, 0.096558f, 0.937500f,
+ 0.125366f, 0.913574f, 0.152954f, 0.888672f, 0.177856f, 0.866211f, 0.202881f, 0.842285f,
+ 0.226318f, 0.819336f, 0.249023f, 0.797363f, 0.270508f, 0.775879f, 0.290771f, 0.754883f,
+ 0.309814f, 0.734375f, 0.330811f, 0.713867f, 0.347412f, 0.695801f, 0.364746f, 0.676758f,
+ 0.382324f, 0.658691f, 0.398438f, 0.640625f, 0.413818f, 0.623535f, 0.429688f, 0.606934f,
+ 0.443848f, 0.590332f, 0.458496f, 0.574219f, 0.472412f, 0.559082f, 0.485596f, 0.543457f,
+ 0.499023f, 0.528809f, 0.512207f, 0.514160f, 0.522949f, 0.500488f, 0.535156f, 0.486572f,
+ 0.547363f, 0.472900f, 0.558594f, 0.459473f, 0.570312f, 0.446533f, 0.580566f, 0.433838f,
+ 0.590820f, 0.421387f, 0.603027f, 0.408936f, 0.611328f, 0.397217f, 0.622559f, 0.385254f,
+ 0.631348f, 0.373779f, 0.641113f, 0.362549f, 0.650391f, 0.351562f, 0.659668f, 0.340088f,
+ 0.667480f, 0.329834f, 0.676270f, 0.319336f, 0.684570f, 0.309082f, 0.694824f, 0.297852f,
+ 0.701660f, 0.288086f, 0.709473f, 0.278320f, 0.717773f, 0.268311f, 0.723633f, 0.259277f,
+ 0.731445f, 0.249512f, 0.738770f, 0.240234f, 0.746094f, 0.230713f, 0.751953f, 0.222412f,
+ 0.758789f, 0.211792f, 0.765137f, 0.201660f, 0.772461f, 0.191772f, 0.776855f, 0.181396f,
+ 0.782227f, 0.170288f, 0.787598f, 0.158203f, 0.791016f, 0.145630f, 0.795410f, 0.131836f,
+ 0.797852f, 0.116455f, 0.800781f, 0.096130f, 0.798340f, 0.071167f, 0.787109f, 0.025589f,
+ 0.000000f, 1.000000f, 0.034302f, 0.983398f, 0.065308f, 0.962402f, 0.096863f, 0.937500f,
+ 0.125610f, 0.913086f, 0.153076f, 0.889160f, 0.179688f, 0.864746f, 0.204712f, 0.841309f,
+ 0.228760f, 0.817871f, 0.252441f, 0.794922f, 0.273438f, 0.773438f, 0.294922f, 0.751953f,
+ 0.314697f, 0.731445f, 0.334473f, 0.710938f, 0.354004f, 0.691406f, 0.369873f, 0.672363f,
+ 0.388184f, 0.653809f, 0.404541f, 0.635742f, 0.421875f, 0.617676f, 0.438965f, 0.600098f,
+ 0.452637f, 0.583496f, 0.466797f, 0.567383f, 0.481201f, 0.551270f, 0.495361f, 0.536133f,
+ 0.508301f, 0.520996f, 0.521973f, 0.506348f, 0.535156f, 0.491211f, 0.547852f, 0.477539f,
+ 0.558594f, 0.463867f, 0.569824f, 0.450195f, 0.582031f, 0.436768f, 0.593262f, 0.423584f,
+ 0.604492f, 0.410645f, 0.615723f, 0.398193f, 0.626953f, 0.385986f, 0.634277f, 0.374512f,
+ 0.646484f, 0.362061f, 0.656250f, 0.350586f, 0.665527f, 0.339111f, 0.675781f, 0.328125f,
+ 0.685059f, 0.316650f, 0.693359f, 0.306152f, 0.701660f, 0.295654f, 0.710449f, 0.285156f,
+ 0.719238f, 0.274658f, 0.726562f, 0.264648f, 0.734375f, 0.254639f, 0.743164f, 0.244751f,
+ 0.750977f, 0.234985f, 0.757324f, 0.226074f, 0.764648f, 0.216553f, 0.772949f, 0.206909f,
+ 0.780762f, 0.197876f, 0.784180f, 0.188477f, 0.791016f, 0.178223f, 0.798340f, 0.167847f,
+ 0.804688f, 0.157349f, 0.810547f, 0.146118f, 0.814453f, 0.134033f, 0.818848f, 0.120789f,
+ 0.821289f, 0.106506f, 0.824219f, 0.088257f, 0.825195f, 0.063965f, 0.814941f, 0.023544f,
+ 0.000000f, 1.000000f, 0.033966f, 0.983887f, 0.066040f, 0.961426f, 0.096497f, 0.937988f,
+ 0.126831f, 0.912598f, 0.153931f, 0.888672f, 0.181152f, 0.863770f, 0.207153f, 0.839355f,
+ 0.231567f, 0.815918f, 0.253418f, 0.793945f, 0.277100f, 0.770996f, 0.299072f, 0.749023f,
+ 0.319336f, 0.728027f, 0.339844f, 0.707031f, 0.358643f, 0.687012f, 0.376221f, 0.667969f,
+ 0.395020f, 0.648438f, 0.412109f, 0.630371f, 0.427734f, 0.612305f, 0.446289f, 0.594238f,
+ 0.461914f, 0.577148f, 0.475830f, 0.560547f, 0.490479f, 0.544434f, 0.504883f, 0.528320f,
+ 0.518555f, 0.512695f, 0.532227f, 0.498047f, 0.544922f, 0.483398f, 0.557617f, 0.468506f,
+ 0.571289f, 0.453857f, 0.583496f, 0.440186f, 0.595215f, 0.426758f, 0.605957f, 0.413574f,
+ 0.617676f, 0.400391f, 0.630859f, 0.386963f, 0.638672f, 0.375244f, 0.651367f, 0.362305f,
+ 0.661133f, 0.350586f, 0.671387f, 0.338867f, 0.681641f, 0.326904f, 0.689453f, 0.315674f,
+ 0.699707f, 0.304443f, 0.708984f, 0.293213f, 0.719238f, 0.282227f, 0.726074f, 0.272217f,
+ 0.735352f, 0.261719f, 0.744141f, 0.251221f, 0.753418f, 0.240356f, 0.762207f, 0.230713f,
+ 0.768066f, 0.221313f, 0.775879f, 0.211792f, 0.782715f, 0.202393f, 0.791504f, 0.192505f,
+ 0.798340f, 0.183960f, 0.805176f, 0.174316f, 0.811523f, 0.165283f, 0.818359f, 0.154419f,
+ 0.824219f, 0.144897f, 0.830078f, 0.134155f, 0.834961f, 0.123047f, 0.840332f, 0.110107f,
+ 0.844238f, 0.096313f, 0.846680f, 0.080017f, 0.848145f, 0.057251f, 0.842285f, 0.023071f,
+ 0.000000f, 1.000000f, 0.033997f, 0.983887f, 0.066833f, 0.960938f, 0.097168f, 0.937500f,
+ 0.127563f, 0.912109f, 0.155396f, 0.887695f, 0.183105f, 0.862793f, 0.208984f, 0.838379f,
+ 0.233887f, 0.814453f, 0.257812f, 0.791016f, 0.280518f, 0.768066f, 0.301758f, 0.746582f,
+ 0.323975f, 0.724609f, 0.344971f, 0.703613f, 0.364258f, 0.683105f, 0.383301f, 0.663086f,
+ 0.401611f, 0.644043f, 0.419189f, 0.625000f, 0.436768f, 0.606445f, 0.452393f, 0.588867f,
+ 0.468750f, 0.570801f, 0.484619f, 0.553711f, 0.500488f, 0.536621f, 0.516113f, 0.520508f,
+ 0.530273f, 0.504395f, 0.543945f, 0.489258f, 0.557129f, 0.474121f, 0.569824f, 0.459229f,
+ 0.583008f, 0.444580f, 0.595703f, 0.430420f, 0.607910f, 0.416748f, 0.620117f, 0.402832f,
+ 0.631836f, 0.389893f, 0.641602f, 0.376953f, 0.653320f, 0.363770f, 0.664551f, 0.351318f,
+ 0.675293f, 0.338867f, 0.687012f, 0.326416f, 0.695801f, 0.315430f, 0.706055f, 0.303223f,
+ 0.714355f, 0.292480f, 0.725586f, 0.280762f, 0.734863f, 0.269775f, 0.743164f, 0.259033f,
+ 0.751953f, 0.248657f, 0.761230f, 0.238159f, 0.770508f, 0.227783f, 0.778809f, 0.217407f,
+ 0.786621f, 0.207520f, 0.795410f, 0.197510f, 0.802246f, 0.188232f, 0.809082f, 0.178833f,
+ 0.816895f, 0.169800f, 0.823730f, 0.160522f, 0.830078f, 0.151611f, 0.839355f, 0.141724f,
+ 0.842773f, 0.132080f, 0.850586f, 0.121460f, 0.855469f, 0.111450f, 0.861328f, 0.099548f,
+ 0.866211f, 0.086487f, 0.869141f, 0.072083f, 0.872070f, 0.051971f, 0.868164f, 0.019196f,
+ 0.000000f, 1.000000f, 0.034058f, 0.983887f, 0.067078f, 0.960938f, 0.098328f, 0.936523f,
+ 0.128906f, 0.911133f, 0.156494f, 0.886719f, 0.184204f, 0.861816f, 0.211792f, 0.836914f,
+ 0.236084f, 0.812988f, 0.261719f, 0.788574f, 0.284424f, 0.765625f, 0.306152f, 0.743652f,
+ 0.328613f, 0.721191f, 0.349609f, 0.699707f, 0.369141f, 0.679199f, 0.389893f, 0.658203f,
+ 0.408447f, 0.638672f, 0.426514f, 0.619141f, 0.442871f, 0.600586f, 0.461182f, 0.582031f,
+ 0.478027f, 0.563965f, 0.495361f, 0.546387f, 0.509766f, 0.529297f, 0.523926f, 0.513184f,
+ 0.539551f, 0.496826f, 0.554199f, 0.480957f, 0.567383f, 0.465576f, 0.580566f, 0.450439f,
+ 0.595215f, 0.435059f, 0.608398f, 0.420898f, 0.619629f, 0.406982f, 0.631836f, 0.393066f,
+ 0.644531f, 0.378906f, 0.656738f, 0.365967f, 0.666992f, 0.353027f, 0.679199f, 0.340088f,
+ 0.690430f, 0.327148f, 0.699707f, 0.315430f, 0.711426f, 0.302979f, 0.721191f, 0.291504f,
+ 0.730957f, 0.279541f, 0.741211f, 0.268066f, 0.750000f, 0.257324f, 0.760254f, 0.246216f,
+ 0.768066f, 0.235474f, 0.778320f, 0.224731f, 0.785645f, 0.214966f, 0.795898f, 0.204224f,
+ 0.802734f, 0.194336f, 0.812500f, 0.184082f, 0.818848f, 0.174683f, 0.827637f, 0.164795f,
+ 0.835449f, 0.155762f, 0.842285f, 0.146606f, 0.849609f, 0.137817f, 0.856934f, 0.128662f,
+ 0.863281f, 0.119934f, 0.869629f, 0.109497f, 0.875977f, 0.099609f, 0.881836f, 0.089417f,
+ 0.887695f, 0.076904f, 0.891602f, 0.063049f, 0.895508f, 0.044708f, 0.893555f, 0.016769f,
+ 0.000000f, 1.000000f, 0.033264f, 0.984375f, 0.066284f, 0.961914f, 0.098633f, 0.936523f,
+ 0.128906f, 0.911621f, 0.158203f, 0.886230f, 0.186279f, 0.860352f, 0.213501f, 0.835449f,
+ 0.239624f, 0.811035f, 0.263672f, 0.787109f, 0.288086f, 0.763184f, 0.310303f, 0.740723f,
+ 0.333252f, 0.717773f, 0.355469f, 0.695801f, 0.375000f, 0.674805f, 0.395020f, 0.654297f,
+ 0.414062f, 0.634277f, 0.432861f, 0.613770f, 0.450439f, 0.595215f, 0.469238f, 0.575684f,
+ 0.485840f, 0.557617f, 0.502930f, 0.540039f, 0.519043f, 0.522461f, 0.533691f, 0.505371f,
+ 0.549316f, 0.488770f, 0.563477f, 0.472656f, 0.578125f, 0.456787f, 0.592285f, 0.441162f,
+ 0.606445f, 0.425781f, 0.620117f, 0.410889f, 0.633301f, 0.396729f, 0.644043f, 0.382812f,
+ 0.656250f, 0.368896f, 0.669434f, 0.354980f, 0.683105f, 0.341309f, 0.692383f, 0.329102f,
+ 0.703125f, 0.316162f, 0.715820f, 0.303467f, 0.725098f, 0.291504f, 0.737305f, 0.279053f,
+ 0.746582f, 0.267578f, 0.754883f, 0.256592f, 0.766113f, 0.244629f, 0.775391f, 0.233643f,
+ 0.785645f, 0.222778f, 0.794434f, 0.212036f, 0.803223f, 0.201294f, 0.812500f, 0.191040f,
+ 0.819824f, 0.181519f, 0.829590f, 0.171143f, 0.837402f, 0.161377f, 0.845215f, 0.151367f,
+ 0.852539f, 0.142212f, 0.861816f, 0.132690f, 0.867188f, 0.124573f, 0.874512f, 0.115173f,
+ 0.881836f, 0.106506f, 0.888672f, 0.097778f, 0.895508f, 0.087830f, 0.902344f, 0.077271f,
+ 0.908203f, 0.067383f, 0.913086f, 0.054840f, 0.916504f, 0.039185f, 0.916504f, 0.014191f,
+ 0.000000f, 1.000000f, 0.033478f, 0.984375f, 0.066833f, 0.961426f, 0.098694f, 0.936523f,
+ 0.130005f, 0.910645f, 0.159424f, 0.885254f, 0.187866f, 0.859375f, 0.215088f, 0.834473f,
+ 0.241333f, 0.809082f, 0.266602f, 0.785156f, 0.290771f, 0.761230f, 0.314941f, 0.737305f,
+ 0.336670f, 0.715332f, 0.359375f, 0.692383f, 0.380859f, 0.670410f, 0.400146f, 0.649902f,
+ 0.422119f, 0.628418f, 0.440674f, 0.608398f, 0.459717f, 0.588867f, 0.477783f, 0.569336f,
+ 0.494629f, 0.550781f, 0.511719f, 0.532227f, 0.526855f, 0.515137f, 0.542480f, 0.498047f,
+ 0.559082f, 0.480957f, 0.574219f, 0.464111f, 0.589355f, 0.447754f, 0.603027f, 0.432129f,
+ 0.618164f, 0.416504f, 0.632812f, 0.401123f, 0.644043f, 0.386963f, 0.657715f, 0.372314f,
+ 0.670898f, 0.358154f, 0.682617f, 0.344727f, 0.695312f, 0.330566f, 0.707520f, 0.317383f,
+ 0.719238f, 0.304688f, 0.729004f, 0.291992f, 0.740234f, 0.279541f, 0.751465f, 0.267090f,
+ 0.761230f, 0.255371f, 0.771973f, 0.243774f, 0.782227f, 0.232300f, 0.790527f, 0.221436f,
+ 0.801758f, 0.209717f, 0.810547f, 0.199585f, 0.818359f, 0.189087f, 0.828125f, 0.178467f,
+ 0.836426f, 0.168091f, 0.846191f, 0.158203f, 0.852539f, 0.149292f, 0.861816f, 0.138794f,
+ 0.871094f, 0.128784f, 0.876465f, 0.120483f, 0.885254f, 0.110779f, 0.894043f, 0.101440f,
+ 0.899902f, 0.093384f, 0.907715f, 0.084656f, 0.914551f, 0.076172f, 0.920898f, 0.067810f,
+ 0.926758f, 0.057373f, 0.933105f, 0.046234f, 0.937012f, 0.032898f, 0.937988f, 0.011459f,
+ 0.000000f, 1.000000f, 0.033630f, 0.983887f, 0.067444f, 0.960938f, 0.098999f, 0.936523f,
+ 0.129883f, 0.910645f, 0.160889f, 0.883789f, 0.189819f, 0.858398f, 0.217163f, 0.833008f,
+ 0.244019f, 0.807617f, 0.270752f, 0.782227f, 0.296143f, 0.757812f, 0.319092f, 0.734375f,
+ 0.342529f, 0.710938f, 0.364014f, 0.688477f, 0.385986f, 0.666504f, 0.407959f, 0.644531f,
+ 0.427246f, 0.624023f, 0.447754f, 0.603027f, 0.466553f, 0.583008f, 0.484375f, 0.563477f,
+ 0.501465f, 0.544922f, 0.520508f, 0.525879f, 0.539062f, 0.506836f, 0.555664f, 0.489258f,
+ 0.571289f, 0.471924f, 0.586426f, 0.455078f, 0.601562f, 0.438477f, 0.616699f, 0.422363f,
+ 0.631348f, 0.406738f, 0.645996f, 0.391357f, 0.657715f, 0.376953f, 0.668945f, 0.362793f,
+ 0.683105f, 0.347900f, 0.695801f, 0.333496f, 0.709473f, 0.319336f, 0.721680f, 0.306152f,
+ 0.732422f, 0.293945f, 0.741699f, 0.281006f, 0.754395f, 0.267578f, 0.766113f, 0.255371f,
+ 0.776855f, 0.243774f, 0.785645f, 0.232300f, 0.796875f, 0.220093f, 0.806641f, 0.208984f,
+ 0.816406f, 0.197876f, 0.825684f, 0.187134f, 0.835449f, 0.176392f, 0.845215f, 0.165771f,
+ 0.853027f, 0.155762f, 0.862305f, 0.145752f, 0.871094f, 0.135498f, 0.879395f, 0.125732f,
+ 0.886230f, 0.116943f, 0.894531f, 0.107727f, 0.903320f, 0.098267f, 0.911133f, 0.088867f,
+ 0.917969f, 0.080261f, 0.924805f, 0.071716f, 0.931641f, 0.063538f, 0.938477f, 0.055145f,
+ 0.945312f, 0.046967f, 0.951172f, 0.038208f, 0.956055f, 0.026398f, 0.960449f, 0.009575f,
+ 0.000000f, 1.000000f, 0.034332f, 0.983887f, 0.066467f, 0.961914f, 0.099854f, 0.936035f,
+ 0.131104f, 0.910156f, 0.162109f, 0.883301f, 0.191162f, 0.857422f, 0.219360f, 0.831543f,
+ 0.247070f, 0.805664f, 0.273926f, 0.780273f, 0.298828f, 0.755371f, 0.322754f, 0.731934f,
+ 0.347168f, 0.708008f, 0.370850f, 0.684082f, 0.392822f, 0.661621f, 0.413330f, 0.640137f,
+ 0.435303f, 0.618652f, 0.455078f, 0.597656f, 0.473877f, 0.577148f, 0.493896f, 0.556641f,
+ 0.512207f, 0.537109f, 0.530762f, 0.518066f, 0.548340f, 0.499512f, 0.564453f, 0.481689f,
+ 0.581055f, 0.464111f, 0.597168f, 0.446777f, 0.611816f, 0.430176f, 0.626465f, 0.413574f,
+ 0.642090f, 0.397461f, 0.655762f, 0.382080f, 0.670410f, 0.366699f, 0.682617f, 0.351807f,
+ 0.697266f, 0.337158f, 0.710449f, 0.322754f, 0.722656f, 0.309082f, 0.733398f, 0.295654f,
+ 0.746582f, 0.282227f, 0.758301f, 0.269043f, 0.769531f, 0.256104f, 0.780273f, 0.244141f,
+ 0.791016f, 0.231934f, 0.801758f, 0.219849f, 0.811035f, 0.208374f, 0.821777f, 0.197021f,
+ 0.831055f, 0.186035f, 0.842285f, 0.174561f, 0.850586f, 0.164062f, 0.860840f, 0.153442f,
+ 0.868652f, 0.143311f, 0.877441f, 0.133545f, 0.886719f, 0.123291f, 0.894531f, 0.113953f,
+ 0.901367f, 0.105103f, 0.911621f, 0.095093f, 0.919434f, 0.085938f, 0.926270f, 0.077271f,
+ 0.934570f, 0.068787f, 0.941895f, 0.059631f, 0.949219f, 0.051025f, 0.956055f, 0.042542f,
+ 0.963867f, 0.034424f, 0.969727f, 0.027069f, 0.976074f, 0.018982f, 0.980469f, 0.005779f,
+ 0.000000f, 1.000000f, 0.034424f, 0.983887f, 0.066284f, 0.961914f, 0.100586f, 0.935547f,
+ 0.132080f, 0.909668f, 0.162842f, 0.882812f, 0.192383f, 0.856445f, 0.221924f, 0.829590f,
+ 0.250000f, 0.803223f, 0.276611f, 0.778320f, 0.301758f, 0.753418f, 0.328613f, 0.728027f,
+ 0.350342f, 0.705078f, 0.375977f, 0.680176f, 0.397461f, 0.658203f, 0.421631f, 0.634766f,
+ 0.441650f, 0.613281f, 0.461182f, 0.592285f, 0.483643f, 0.570801f, 0.502441f, 0.550293f,
+ 0.520996f, 0.530273f, 0.538574f, 0.511230f, 0.556152f, 0.492676f, 0.574219f, 0.474121f,
+ 0.591797f, 0.455811f, 0.607422f, 0.438232f, 0.623535f, 0.421143f, 0.639648f, 0.404297f,
+ 0.655273f, 0.387939f, 0.668457f, 0.372314f, 0.682129f, 0.356934f, 0.695801f, 0.341797f,
+ 0.708496f, 0.327393f, 0.721680f, 0.312500f, 0.735840f, 0.297852f, 0.750000f, 0.284180f,
+ 0.759766f, 0.271729f, 0.770020f, 0.258301f, 0.784180f, 0.244629f, 0.796875f, 0.232422f,
+ 0.803223f, 0.220947f, 0.816406f, 0.208008f, 0.828613f, 0.196289f, 0.835449f, 0.185547f,
+ 0.847656f, 0.173462f, 0.856445f, 0.163574f, 0.865723f, 0.152222f, 0.876465f, 0.141602f,
+ 0.883789f, 0.131714f, 0.894043f, 0.121216f, 0.902344f, 0.111694f, 0.910645f, 0.101868f,
+ 0.920410f, 0.091797f, 0.927246f, 0.083313f, 0.936523f, 0.073181f, 0.942383f, 0.065674f,
+ 0.952637f, 0.055176f, 0.957031f, 0.049164f, 0.968262f, 0.037628f, 0.968262f, 0.033844f,
+ 0.983887f, 0.020599f, 0.983887f, 0.016708f, 0.996582f, 0.005913f, 0.999512f, 0.000015f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998047f,
+ 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.993164f,
+ 0.000000f, 0.990723f, 0.000000f, 0.989258f, 0.000000f, 0.986816f, 0.000000f, 0.984375f,
+ 0.000000f, 0.982422f, 0.000000f, 0.979492f, 0.000000f, 0.975586f, 0.000000f, 0.973633f,
+ 0.000000f, 0.970215f, 0.000000f, 0.966309f, 0.000000f, 0.961914f, 0.000000f, 0.958984f,
+ 0.000000f, 0.954590f, 0.000000f, 0.950195f, 0.000000f, 0.945312f, 0.000000f, 0.940430f,
+ 0.000000f, 0.935547f, 0.000000f, 0.930176f, 0.000000f, 0.924805f, 0.000000f, 0.918945f,
+ 0.000000f, 0.912598f, 0.000000f, 0.906250f, 0.000000f, 0.899414f, 0.000000f, 0.892090f,
+ 0.000000f, 0.884766f, 0.000000f, 0.876953f, 0.000000f, 0.869141f, 0.000000f, 0.860840f,
+ 0.000000f, 0.851562f, 0.000000f, 0.841797f, 0.000000f, 0.832031f, 0.000000f, 0.821777f,
+ 0.000000f, 0.811523f, 0.000000f, 0.799805f, 0.000000f, 0.787598f, 0.000000f, 0.774902f,
+ 0.000000f, 0.761230f, 0.000000f, 0.747070f, 0.000000f, 0.732910f, 0.000000f, 0.717773f,
+ 0.000000f, 0.700195f, 0.000000f, 0.682617f, 0.000000f, 0.663086f, 0.000000f, 0.643066f,
+ 0.000000f, 0.622070f, 0.000000f, 0.597656f, 0.000000f, 0.572266f, 0.000000f, 0.544922f,
+ 0.000000f, 0.515625f, 0.000000f, 0.480957f, 0.000000f, 0.444092f, 0.000000f, 0.401367f,
+ 0.000000f, 0.351074f, 0.000000f, 0.289551f, 0.000000f, 0.207397f, 0.000000f, 0.080261f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f,
+ 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.000000f, 0.992676f,
+ 0.000000f, 0.991211f, 0.000000f, 0.988770f, 0.000000f, 0.986816f, 0.000000f, 0.984375f,
+ 0.000000f, 0.981934f, 0.000000f, 0.979492f, 0.000000f, 0.976074f, 0.000000f, 0.973145f,
+ 0.000000f, 0.969727f, 0.000000f, 0.966309f, 0.000000f, 0.961914f, 0.000000f, 0.958496f,
+ 0.000000f, 0.954590f, 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.940430f,
+ 0.000000f, 0.935059f, 0.000000f, 0.929688f, 0.000000f, 0.924316f, 0.000000f, 0.918457f,
+ 0.000000f, 0.912598f, 0.000000f, 0.906250f, 0.000000f, 0.899414f, 0.000000f, 0.892090f,
+ 0.000000f, 0.884277f, 0.000000f, 0.876953f, 0.000000f, 0.869141f, 0.000000f, 0.860352f,
+ 0.000000f, 0.851562f, 0.000000f, 0.841797f, 0.000000f, 0.832031f, 0.000000f, 0.821777f,
+ 0.000000f, 0.811035f, 0.000000f, 0.799805f, 0.000000f, 0.787598f, 0.000000f, 0.774902f,
+ 0.000000f, 0.761230f, 0.000000f, 0.747070f, 0.000000f, 0.732910f, 0.000000f, 0.717285f,
+ 0.000001f, 0.699707f, 0.000004f, 0.682617f, 0.000007f, 0.662598f, 0.000009f, 0.643066f,
+ 0.000009f, 0.622070f, 0.000009f, 0.597656f, 0.000009f, 0.572266f, 0.000008f, 0.544922f,
+ 0.000007f, 0.516113f, 0.000006f, 0.481689f, 0.000006f, 0.443604f, 0.000005f, 0.402100f,
+ 0.000004f, 0.351562f, 0.000003f, 0.289062f, 0.000002f, 0.207764f, 0.000001f, 0.079895f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998047f,
+ 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.994141f, 0.000000f, 0.992676f,
+ 0.000000f, 0.990723f, 0.000000f, 0.988770f, 0.000000f, 0.986328f, 0.000000f, 0.984375f,
+ 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.975586f, 0.000000f, 0.972168f,
+ 0.000000f, 0.969238f, 0.000000f, 0.965820f, 0.000000f, 0.961914f, 0.000000f, 0.958008f,
+ 0.000002f, 0.953613f, 0.000007f, 0.949707f, 0.000012f, 0.944824f, 0.000018f, 0.939941f,
+ 0.000024f, 0.934570f, 0.000031f, 0.929199f, 0.000038f, 0.923340f, 0.000044f, 0.917480f,
+ 0.000052f, 0.911621f, 0.000059f, 0.905762f, 0.000066f, 0.898438f, 0.000072f, 0.891602f,
+ 0.000080f, 0.883789f, 0.000087f, 0.875977f, 0.000093f, 0.868164f, 0.000095f, 0.859863f,
+ 0.000096f, 0.850586f, 0.000096f, 0.841309f, 0.000093f, 0.831543f, 0.000090f, 0.821289f,
+ 0.000087f, 0.810059f, 0.000084f, 0.799316f, 0.000079f, 0.787109f, 0.000073f, 0.773926f,
+ 0.000072f, 0.760742f, 0.000072f, 0.747070f, 0.000073f, 0.732422f, 0.000073f, 0.716309f,
+ 0.000074f, 0.699707f, 0.000072f, 0.681641f, 0.000067f, 0.663086f, 0.000064f, 0.643066f,
+ 0.000062f, 0.621582f, 0.000062f, 0.597168f, 0.000057f, 0.571777f, 0.000056f, 0.544434f,
+ 0.000053f, 0.515625f, 0.000048f, 0.481445f, 0.000044f, 0.443359f, 0.000042f, 0.401855f,
+ 0.000034f, 0.350830f, 0.000030f, 0.288818f, 0.000019f, 0.207642f, 0.000006f, 0.079651f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000003f, 0.998047f,
+ 0.000020f, 0.997070f, 0.000045f, 0.995605f, 0.000063f, 0.994141f, 0.000085f, 0.992188f,
+ 0.000104f, 0.990234f, 0.000119f, 0.988281f, 0.000136f, 0.985840f, 0.000154f, 0.983398f,
+ 0.000168f, 0.980957f, 0.000179f, 0.978027f, 0.000192f, 0.975098f, 0.000208f, 0.971680f,
+ 0.000221f, 0.968262f, 0.000231f, 0.964844f, 0.000239f, 0.960938f, 0.000250f, 0.957031f,
+ 0.000263f, 0.953125f, 0.000273f, 0.948242f, 0.000282f, 0.944336f, 0.000288f, 0.938965f,
+ 0.000292f, 0.934082f, 0.000296f, 0.928223f, 0.000294f, 0.922852f, 0.000290f, 0.916992f,
+ 0.000287f, 0.911133f, 0.000285f, 0.904785f, 0.000280f, 0.897461f, 0.000284f, 0.890137f,
+ 0.000287f, 0.882812f, 0.000288f, 0.875000f, 0.000289f, 0.867188f, 0.000290f, 0.858398f,
+ 0.000281f, 0.849609f, 0.000287f, 0.839844f, 0.000291f, 0.830566f, 0.000292f, 0.820312f,
+ 0.000292f, 0.809570f, 0.000291f, 0.797852f, 0.000276f, 0.786133f, 0.000277f, 0.773438f,
+ 0.000278f, 0.759766f, 0.000278f, 0.746094f, 0.000274f, 0.731445f, 0.000252f, 0.715820f,
+ 0.000254f, 0.698730f, 0.000252f, 0.681152f, 0.000248f, 0.662109f, 0.000243f, 0.642578f,
+ 0.000218f, 0.621094f, 0.000218f, 0.597168f, 0.000210f, 0.571289f, 0.000203f, 0.544434f,
+ 0.000191f, 0.515137f, 0.000172f, 0.480957f, 0.000160f, 0.443115f, 0.000149f, 0.401611f,
+ 0.000123f, 0.350830f, 0.000106f, 0.288818f, 0.000073f, 0.207642f, 0.000020f, 0.079895f,
+ 0.000000f, 1.000000f, 0.000185f, 0.999512f, 0.000298f, 0.998535f, 0.000294f, 0.997559f,
+ 0.000370f, 0.996094f, 0.000383f, 0.994629f, 0.000383f, 0.993164f, 0.000381f, 0.991699f,
+ 0.000452f, 0.989258f, 0.000458f, 0.987305f, 0.000459f, 0.984863f, 0.000458f, 0.982910f,
+ 0.000511f, 0.979492f, 0.000525f, 0.976562f, 0.000539f, 0.974121f, 0.000551f, 0.970703f,
+ 0.000565f, 0.967285f, 0.000621f, 0.963867f, 0.000637f, 0.959961f, 0.000641f, 0.955566f,
+ 0.000637f, 0.951660f, 0.000631f, 0.947266f, 0.000626f, 0.942871f, 0.000665f, 0.937500f,
+ 0.000668f, 0.932129f, 0.000652f, 0.926758f, 0.000655f, 0.920898f, 0.000660f, 0.915527f,
+ 0.000666f, 0.909668f, 0.000706f, 0.902832f, 0.000720f, 0.895996f, 0.000705f, 0.888672f,
+ 0.000704f, 0.881348f, 0.000700f, 0.874023f, 0.000696f, 0.865723f, 0.000721f, 0.857422f,
+ 0.000701f, 0.848145f, 0.000705f, 0.838867f, 0.000701f, 0.829102f, 0.000694f, 0.818848f,
+ 0.000688f, 0.808594f, 0.000710f, 0.796875f, 0.000680f, 0.784668f, 0.000670f, 0.771973f,
+ 0.000663f, 0.758789f, 0.000656f, 0.745117f, 0.000648f, 0.730469f, 0.000666f, 0.714844f,
+ 0.000614f, 0.697754f, 0.000600f, 0.680176f, 0.000590f, 0.661133f, 0.000580f, 0.641602f,
+ 0.000583f, 0.620117f, 0.000522f, 0.596191f, 0.000506f, 0.570801f, 0.000488f, 0.544434f,
+ 0.000480f, 0.514648f, 0.000417f, 0.480713f, 0.000394f, 0.443115f, 0.000362f, 0.401855f,
+ 0.000302f, 0.350830f, 0.000257f, 0.289062f, 0.000174f, 0.206909f, 0.000042f, 0.080078f,
+ 0.000000f, 1.000000f, 0.000337f, 0.999023f, 0.000554f, 0.998047f, 0.000512f, 0.997070f,
+ 0.000679f, 0.995605f, 0.000685f, 0.994141f, 0.000697f, 0.992188f, 0.000701f, 0.990723f,
+ 0.000876f, 0.988281f, 0.000892f, 0.986328f, 0.000899f, 0.984375f, 0.000913f, 0.981934f,
+ 0.001050f, 0.978516f, 0.001065f, 0.976074f, 0.001062f, 0.972656f, 0.001066f, 0.969727f,
+ 0.001066f, 0.965820f, 0.001171f, 0.962402f, 0.001182f, 0.958008f, 0.001184f, 0.954102f,
+ 0.001179f, 0.949707f, 0.001186f, 0.945801f, 0.001189f, 0.941406f, 0.001287f, 0.936035f,
+ 0.001306f, 0.930664f, 0.001294f, 0.925293f, 0.001304f, 0.919434f, 0.001305f, 0.914062f,
+ 0.001305f, 0.908203f, 0.001375f, 0.900879f, 0.001380f, 0.894043f, 0.001350f, 0.886719f,
+ 0.001364f, 0.879395f, 0.001354f, 0.872070f, 0.001351f, 0.864258f, 0.001410f, 0.854980f,
+ 0.001416f, 0.846191f, 0.001375f, 0.836426f, 0.001357f, 0.826660f, 0.001353f, 0.816895f,
+ 0.001342f, 0.807129f, 0.001385f, 0.795410f, 0.001338f, 0.782715f, 0.001338f, 0.770020f,
+ 0.001292f, 0.757324f, 0.001280f, 0.743164f, 0.001266f, 0.729492f, 0.001297f, 0.713379f,
+ 0.001238f, 0.696289f, 0.001184f, 0.678711f, 0.001159f, 0.660156f, 0.001134f, 0.640625f,
+ 0.001145f, 0.618652f, 0.001055f, 0.595215f, 0.001001f, 0.570312f, 0.000966f, 0.543457f,
+ 0.000953f, 0.514160f, 0.000840f, 0.479980f, 0.000782f, 0.442383f, 0.000719f, 0.401611f,
+ 0.000603f, 0.350098f, 0.000506f, 0.289307f, 0.000332f, 0.207275f, 0.000074f, 0.079468f,
+ 0.000000f, 1.000000f, 0.000518f, 0.999023f, 0.000906f, 0.997559f, 0.000903f, 0.996582f,
+ 0.001175f, 0.994629f, 0.001205f, 0.993652f, 0.001199f, 0.991699f, 0.001201f, 0.989746f,
+ 0.001484f, 0.987305f, 0.001515f, 0.984863f, 0.001541f, 0.982422f, 0.001551f, 0.980469f,
+ 0.001749f, 0.977051f, 0.001771f, 0.974121f, 0.001785f, 0.971191f, 0.001799f, 0.967773f,
+ 0.001780f, 0.964355f, 0.001976f, 0.959961f, 0.002014f, 0.956543f, 0.002035f, 0.952148f,
+ 0.002056f, 0.948242f, 0.002037f, 0.943848f, 0.002047f, 0.939453f, 0.002216f, 0.933594f,
+ 0.002234f, 0.928223f, 0.002243f, 0.922852f, 0.002201f, 0.916992f, 0.002226f, 0.911621f,
+ 0.002224f, 0.905762f, 0.002361f, 0.898926f, 0.002377f, 0.891602f, 0.002323f, 0.884766f,
+ 0.002340f, 0.877441f, 0.002316f, 0.869629f, 0.002314f, 0.862305f, 0.002420f, 0.853027f,
+ 0.002436f, 0.844238f, 0.002373f, 0.834473f, 0.002373f, 0.825195f, 0.002335f, 0.814941f,
+ 0.002304f, 0.804688f, 0.002392f, 0.793457f, 0.002390f, 0.780762f, 0.002316f, 0.768555f,
+ 0.002264f, 0.755371f, 0.002218f, 0.742188f, 0.002239f, 0.728027f, 0.002245f, 0.711426f,
+ 0.002165f, 0.694824f, 0.002094f, 0.677246f, 0.002018f, 0.659180f, 0.001966f, 0.639648f,
+ 0.001995f, 0.617676f, 0.001859f, 0.594238f, 0.001762f, 0.568848f, 0.001684f, 0.542480f,
+ 0.001666f, 0.513184f, 0.001490f, 0.478760f, 0.001363f, 0.441895f, 0.001249f, 0.401367f,
+ 0.001061f, 0.350342f, 0.000866f, 0.289062f, 0.000556f, 0.206787f, 0.000117f, 0.078979f,
+ 0.000000f, 1.000000f, 0.000760f, 0.999023f, 0.001332f, 0.997070f, 0.001328f, 0.996094f,
+ 0.001492f, 0.994141f, 0.001834f, 0.992676f, 0.001856f, 0.990723f, 0.001965f, 0.988770f,
+ 0.002293f, 0.985840f, 0.002340f, 0.983887f, 0.002354f, 0.981445f, 0.002365f, 0.979004f,
+ 0.002703f, 0.975098f, 0.002726f, 0.972168f, 0.002771f, 0.968750f, 0.002802f, 0.965820f,
+ 0.002825f, 0.962402f, 0.003088f, 0.958008f, 0.003153f, 0.954102f, 0.003189f, 0.949707f,
+ 0.003204f, 0.945801f, 0.003216f, 0.941406f, 0.003246f, 0.936523f, 0.003475f, 0.931152f,
+ 0.003502f, 0.925781f, 0.003517f, 0.920410f, 0.003540f, 0.915039f, 0.003492f, 0.909668f,
+ 0.003565f, 0.902832f, 0.003706f, 0.895996f, 0.003731f, 0.889160f, 0.003752f, 0.881836f,
+ 0.003683f, 0.874512f, 0.003696f, 0.867676f, 0.003693f, 0.859375f, 0.003820f, 0.850098f,
+ 0.003847f, 0.841309f, 0.003754f, 0.832031f, 0.003759f, 0.822266f, 0.003698f, 0.812988f,
+ 0.003683f, 0.802246f, 0.003784f, 0.790527f, 0.003775f, 0.778320f, 0.003683f, 0.766113f,
+ 0.003603f, 0.752930f, 0.003542f, 0.739746f, 0.003592f, 0.725586f, 0.003561f, 0.709473f,
+ 0.003452f, 0.692871f, 0.003357f, 0.675293f, 0.003233f, 0.657227f, 0.003132f, 0.638672f,
+ 0.003176f, 0.615723f, 0.002989f, 0.592773f, 0.002840f, 0.568359f, 0.002689f, 0.541992f,
+ 0.002653f, 0.511719f, 0.002439f, 0.478760f, 0.002193f, 0.441895f, 0.001974f, 0.401123f,
+ 0.001719f, 0.349121f, 0.001345f, 0.288574f, 0.000865f, 0.206299f, 0.000174f, 0.078552f,
+ 0.000000f, 1.000000f, 0.000584f, 0.999023f, 0.001467f, 0.997070f, 0.001897f, 0.995605f,
+ 0.002226f, 0.993652f, 0.002655f, 0.991699f, 0.002668f, 0.989746f, 0.002922f, 0.987305f,
+ 0.003340f, 0.984375f, 0.003370f, 0.981934f, 0.003416f, 0.979980f, 0.003435f, 0.977539f,
+ 0.003956f, 0.973145f, 0.004028f, 0.970215f, 0.004055f, 0.966797f, 0.004105f, 0.963379f,
+ 0.004257f, 0.960449f, 0.004597f, 0.955566f, 0.004604f, 0.951172f, 0.004665f, 0.947266f,
+ 0.004723f, 0.943359f, 0.004742f, 0.938965f, 0.004845f, 0.933594f, 0.005104f, 0.927734f,
+ 0.005180f, 0.922852f, 0.005192f, 0.916992f, 0.005230f, 0.912109f, 0.005150f, 0.906250f,
+ 0.005314f, 0.899902f, 0.005489f, 0.892578f, 0.005543f, 0.885742f, 0.005539f, 0.878906f,
+ 0.005474f, 0.872070f, 0.005474f, 0.864258f, 0.005520f, 0.855957f, 0.005726f, 0.847168f,
+ 0.005707f, 0.838379f, 0.005699f, 0.829102f, 0.005589f, 0.819336f, 0.005505f, 0.810059f,
+ 0.005581f, 0.799316f, 0.005684f, 0.787109f, 0.005650f, 0.775879f, 0.005516f, 0.763184f,
+ 0.005386f, 0.750488f, 0.005295f, 0.737305f, 0.005390f, 0.722656f, 0.005352f, 0.706543f,
+ 0.005177f, 0.690430f, 0.005039f, 0.673340f, 0.004902f, 0.655762f, 0.004784f, 0.636719f,
+ 0.004765f, 0.613770f, 0.004570f, 0.590820f, 0.004318f, 0.566895f, 0.004059f, 0.541016f,
+ 0.003971f, 0.510742f, 0.003651f, 0.477295f, 0.003283f, 0.441162f, 0.002920f, 0.401123f,
+ 0.002542f, 0.348877f, 0.001953f, 0.289062f, 0.001245f, 0.206177f, 0.000248f, 0.078003f,
+ 0.000000f, 1.000000f, 0.000916f, 0.998535f, 0.002106f, 0.996582f, 0.002583f, 0.995117f,
+ 0.003138f, 0.992676f, 0.003239f, 0.990723f, 0.003679f, 0.988281f, 0.003891f, 0.985840f,
+ 0.004288f, 0.982910f, 0.004719f, 0.979980f, 0.004738f, 0.977539f, 0.004902f, 0.974609f,
+ 0.005215f, 0.970703f, 0.005634f, 0.967285f, 0.005722f, 0.964355f, 0.005714f, 0.960938f,
+ 0.006035f, 0.957031f, 0.006458f, 0.952637f, 0.006542f, 0.948242f, 0.006550f, 0.943848f,
+ 0.006618f, 0.940430f, 0.006676f, 0.936035f, 0.006981f, 0.930176f, 0.007221f, 0.924316f,
+ 0.007290f, 0.918945f, 0.007370f, 0.914062f, 0.007359f, 0.908691f, 0.007412f, 0.903320f,
+ 0.007557f, 0.895996f, 0.007835f, 0.889160f, 0.007828f, 0.882324f, 0.007881f, 0.875488f,
+ 0.007858f, 0.868652f, 0.007793f, 0.861328f, 0.007980f, 0.852539f, 0.008125f, 0.843262f,
+ 0.008156f, 0.834473f, 0.008118f, 0.825684f, 0.007973f, 0.816406f, 0.007935f, 0.806641f,
+ 0.007988f, 0.795898f, 0.008095f, 0.784180f, 0.008041f, 0.772461f, 0.007866f, 0.760254f,
+ 0.007805f, 0.748047f, 0.007648f, 0.734863f, 0.007763f, 0.719727f, 0.007629f, 0.704102f,
+ 0.007427f, 0.687988f, 0.007202f, 0.670898f, 0.007019f, 0.653809f, 0.006924f, 0.634277f,
+ 0.006840f, 0.611816f, 0.006519f, 0.588867f, 0.006172f, 0.565430f, 0.005829f, 0.540039f,
+ 0.005642f, 0.509277f, 0.005196f, 0.476074f, 0.004684f, 0.440674f, 0.004120f, 0.400391f,
+ 0.003605f, 0.348145f, 0.002705f, 0.289062f, 0.001725f, 0.205566f, 0.000326f, 0.077332f,
+ 0.000000f, 1.000000f, 0.001302f, 0.998535f, 0.001939f, 0.996582f, 0.002926f, 0.994629f,
+ 0.003897f, 0.991211f, 0.004383f, 0.988770f, 0.004898f, 0.986816f, 0.005314f, 0.983887f,
+ 0.005802f, 0.980957f, 0.006329f, 0.978516f, 0.006432f, 0.976074f, 0.006756f, 0.972168f,
+ 0.007172f, 0.968262f, 0.007656f, 0.964844f, 0.007710f, 0.961426f, 0.007797f, 0.958496f,
+ 0.008072f, 0.953613f, 0.008446f, 0.949219f, 0.008881f, 0.944824f, 0.009026f, 0.940918f,
+ 0.008965f, 0.936523f, 0.009109f, 0.932129f, 0.009590f, 0.926270f, 0.009941f, 0.920898f,
+ 0.009941f, 0.915527f, 0.010002f, 0.910156f, 0.010109f, 0.905273f, 0.010208f, 0.899414f,
+ 0.010445f, 0.892090f, 0.010719f, 0.884766f, 0.010773f, 0.877930f, 0.010765f, 0.871582f,
+ 0.010803f, 0.864746f, 0.010658f, 0.857422f, 0.010979f, 0.848145f, 0.011276f, 0.839355f,
+ 0.011192f, 0.830566f, 0.011116f, 0.821777f, 0.010918f, 0.812500f, 0.010918f, 0.803223f,
+ 0.011047f, 0.791992f, 0.011230f, 0.780762f, 0.011131f, 0.769043f, 0.010994f, 0.757324f,
+ 0.010757f, 0.744629f, 0.010490f, 0.732422f, 0.010696f, 0.716309f, 0.010574f, 0.700684f,
+ 0.010399f, 0.685059f, 0.010048f, 0.668457f, 0.009720f, 0.651855f, 0.009651f, 0.631348f,
+ 0.009384f, 0.609375f, 0.008987f, 0.587402f, 0.008461f, 0.563965f, 0.007965f, 0.539062f,
+ 0.007744f, 0.507812f, 0.007160f, 0.474854f, 0.006374f, 0.439697f, 0.005653f, 0.399414f,
+ 0.004845f, 0.348389f, 0.003616f, 0.288818f, 0.002266f, 0.205444f, 0.000417f, 0.076965f,
+ 0.000000f, 1.000000f, 0.001271f, 0.998535f, 0.002785f, 0.996094f, 0.003345f, 0.994141f,
+ 0.004704f, 0.990234f, 0.005741f, 0.987793f, 0.005882f, 0.985840f, 0.007034f, 0.981445f,
+ 0.007622f, 0.978516f, 0.007812f, 0.976074f, 0.008369f, 0.973145f, 0.009026f, 0.969238f,
+ 0.009521f, 0.965332f, 0.009666f, 0.961914f, 0.010216f, 0.958496f, 0.010292f, 0.955078f,
+ 0.010887f, 0.950195f, 0.011253f, 0.945312f, 0.011703f, 0.940918f, 0.011879f, 0.937012f,
+ 0.012062f, 0.933594f, 0.012314f, 0.927734f, 0.012794f, 0.921875f, 0.013214f, 0.916504f,
+ 0.013321f, 0.911621f, 0.013275f, 0.905762f, 0.013367f, 0.900879f, 0.013672f, 0.894043f,
+ 0.014053f, 0.887207f, 0.014336f, 0.880371f, 0.014351f, 0.873535f, 0.014389f, 0.867188f,
+ 0.014389f, 0.860840f, 0.014565f, 0.852539f, 0.014717f, 0.843262f, 0.015007f, 0.834961f,
+ 0.014885f, 0.826172f, 0.014946f, 0.817871f, 0.014816f, 0.809082f, 0.014755f, 0.798828f,
+ 0.014931f, 0.787598f, 0.014984f, 0.775879f, 0.014824f, 0.764648f, 0.014648f, 0.753418f,
+ 0.014351f, 0.741699f, 0.014252f, 0.728516f, 0.014442f, 0.712891f, 0.014107f, 0.697754f,
+ 0.013870f, 0.682129f, 0.013451f, 0.666016f, 0.012978f, 0.649414f, 0.012909f, 0.628418f,
+ 0.012581f, 0.607422f, 0.012024f, 0.585449f, 0.011368f, 0.562500f, 0.010658f, 0.537598f,
+ 0.010315f, 0.506348f, 0.009468f, 0.473877f, 0.008453f, 0.439209f, 0.007465f, 0.397949f,
+ 0.006321f, 0.346924f, 0.004692f, 0.289307f, 0.002895f, 0.205200f, 0.000525f, 0.077087f,
+ 0.000000f, 1.000000f, 0.001298f, 0.998535f, 0.002880f, 0.995605f, 0.003941f, 0.993652f,
+ 0.005333f, 0.989746f, 0.006458f, 0.986816f, 0.007507f, 0.984375f, 0.008331f, 0.979980f,
+ 0.009392f, 0.976074f, 0.010002f, 0.973145f, 0.010216f, 0.970703f, 0.011642f, 0.965820f,
+ 0.012321f, 0.961914f, 0.012520f, 0.958496f, 0.013039f, 0.955078f, 0.013443f, 0.951172f,
+ 0.014153f, 0.945801f, 0.014717f, 0.941406f, 0.014832f, 0.937012f, 0.015358f, 0.933105f,
+ 0.015556f, 0.929199f, 0.016205f, 0.922852f, 0.016617f, 0.916992f, 0.016907f, 0.912109f,
+ 0.017319f, 0.906738f, 0.017288f, 0.901367f, 0.017395f, 0.896484f, 0.018051f, 0.889160f,
+ 0.018356f, 0.881836f, 0.018784f, 0.875488f, 0.018707f, 0.869141f, 0.018784f, 0.862305f,
+ 0.018646f, 0.855957f, 0.019257f, 0.847168f, 0.019287f, 0.838379f, 0.019608f, 0.830078f,
+ 0.019562f, 0.821777f, 0.019424f, 0.812988f, 0.019257f, 0.804688f, 0.019501f, 0.793945f,
+ 0.019638f, 0.783203f, 0.019638f, 0.771973f, 0.019455f, 0.760742f, 0.019241f, 0.749512f,
+ 0.018829f, 0.738281f, 0.018860f, 0.724121f, 0.018814f, 0.708984f, 0.018555f, 0.694336f,
+ 0.018188f, 0.679199f, 0.017502f, 0.663086f, 0.016983f, 0.646484f, 0.016953f, 0.625488f,
+ 0.016357f, 0.604492f, 0.015564f, 0.583496f, 0.014771f, 0.561035f, 0.013977f, 0.535156f,
+ 0.013329f, 0.504395f, 0.012230f, 0.472900f, 0.010811f, 0.438477f, 0.009567f, 0.396729f,
+ 0.008011f, 0.346436f, 0.005909f, 0.289307f, 0.003656f, 0.205444f, 0.000666f, 0.076050f,
+ 0.000000f, 1.000000f, 0.001846f, 0.998047f, 0.003963f, 0.994629f, 0.005146f, 0.992676f,
+ 0.007011f, 0.988281f, 0.007751f, 0.985352f, 0.008919f, 0.982422f, 0.010635f, 0.977539f,
+ 0.011368f, 0.974609f, 0.012535f, 0.970703f, 0.012993f, 0.967285f, 0.014397f, 0.962402f,
+ 0.015129f, 0.958496f, 0.015839f, 0.954590f, 0.016174f, 0.951660f, 0.017059f, 0.946289f,
+ 0.018036f, 0.941406f, 0.018646f, 0.937012f, 0.018951f, 0.933105f, 0.019424f, 0.928223f,
+ 0.020035f, 0.923828f, 0.020828f, 0.917480f, 0.021347f, 0.912109f, 0.021484f, 0.906738f,
+ 0.022110f, 0.901367f, 0.022217f, 0.896973f, 0.022507f, 0.890137f, 0.023163f, 0.883301f,
+ 0.023697f, 0.876953f, 0.024002f, 0.870117f, 0.024048f, 0.863770f, 0.024078f, 0.857422f,
+ 0.024353f, 0.850098f, 0.024689f, 0.841309f, 0.025238f, 0.833496f, 0.025223f, 0.824707f,
+ 0.025223f, 0.816406f, 0.024948f, 0.808105f, 0.024918f, 0.799805f, 0.025223f, 0.788574f,
+ 0.025162f, 0.777832f, 0.025391f, 0.767090f, 0.025040f, 0.756348f, 0.024734f, 0.745605f,
+ 0.024139f, 0.733887f, 0.024445f, 0.718750f, 0.024231f, 0.704590f, 0.023773f, 0.690430f,
+ 0.023224f, 0.675781f, 0.022522f, 0.660156f, 0.021912f, 0.642578f, 0.021744f, 0.622070f,
+ 0.021027f, 0.602051f, 0.019913f, 0.581543f, 0.018753f, 0.559082f, 0.017868f, 0.532227f,
+ 0.016953f, 0.502441f, 0.015442f, 0.471191f, 0.013618f, 0.437256f, 0.012192f, 0.395752f,
+ 0.010048f, 0.345947f, 0.007343f, 0.289062f, 0.004478f, 0.204834f, 0.000809f, 0.075439f,
+ 0.000000f, 1.000000f, 0.002016f, 0.998047f, 0.004318f, 0.994629f, 0.005547f, 0.992188f,
+ 0.008095f, 0.987305f, 0.009377f, 0.983887f, 0.010376f, 0.980469f, 0.012512f, 0.975586f,
+ 0.014168f, 0.971680f, 0.015022f, 0.968262f, 0.016296f, 0.963379f, 0.017456f, 0.958496f,
+ 0.018723f, 0.954590f, 0.019531f, 0.950684f, 0.019943f, 0.947754f, 0.021530f, 0.941895f,
+ 0.022537f, 0.936523f, 0.022919f, 0.932129f, 0.023560f, 0.928223f, 0.024002f, 0.924316f,
+ 0.025040f, 0.917480f, 0.026154f, 0.912109f, 0.026779f, 0.906738f, 0.027023f, 0.901367f,
+ 0.027573f, 0.896484f, 0.027817f, 0.891113f, 0.028946f, 0.884277f, 0.029190f, 0.876953f,
+ 0.029846f, 0.870605f, 0.030014f, 0.864746f, 0.030365f, 0.858398f, 0.030334f, 0.852051f,
+ 0.031067f, 0.843262f, 0.031464f, 0.834961f, 0.031677f, 0.827148f, 0.031830f, 0.819336f,
+ 0.031860f, 0.811523f, 0.031647f, 0.803223f, 0.031982f, 0.793457f, 0.032227f, 0.783203f,
+ 0.032043f, 0.771973f, 0.032104f, 0.762207f, 0.031616f, 0.751465f, 0.031311f, 0.741211f,
+ 0.031281f, 0.728516f, 0.031097f, 0.714355f, 0.030777f, 0.700195f, 0.030090f, 0.686523f,
+ 0.029510f, 0.672363f, 0.028305f, 0.657227f, 0.028168f, 0.638672f, 0.027420f, 0.618652f,
+ 0.026443f, 0.599121f, 0.025192f, 0.579102f, 0.023529f, 0.557129f, 0.022720f, 0.529785f,
+ 0.021179f, 0.500000f, 0.019348f, 0.470215f, 0.017075f, 0.436768f, 0.015137f, 0.393799f,
+ 0.012459f, 0.345215f, 0.008987f, 0.289062f, 0.005451f, 0.205078f, 0.000969f, 0.074890f,
+ 0.000000f, 1.000000f, 0.002222f, 0.998047f, 0.004772f, 0.994141f, 0.006283f, 0.991211f,
+ 0.008919f, 0.986328f, 0.011200f, 0.982422f, 0.013168f, 0.977539f, 0.014603f, 0.973633f,
+ 0.016479f, 0.969238f, 0.017822f, 0.965332f, 0.020096f, 0.959473f, 0.021118f, 0.954590f,
+ 0.022385f, 0.950684f, 0.023361f, 0.946777f, 0.024658f, 0.941895f, 0.025955f, 0.936523f,
+ 0.027344f, 0.931641f, 0.028122f, 0.927246f, 0.028870f, 0.922852f, 0.029419f, 0.917969f,
+ 0.031189f, 0.911621f, 0.032013f, 0.906250f, 0.032623f, 0.900391f, 0.033417f, 0.895508f,
+ 0.033508f, 0.890625f, 0.034821f, 0.884277f, 0.035767f, 0.877441f, 0.036621f, 0.871094f,
+ 0.036682f, 0.864258f, 0.037292f, 0.858887f, 0.037537f, 0.852539f, 0.038025f, 0.845215f,
+ 0.038727f, 0.836426f, 0.039093f, 0.828613f, 0.039276f, 0.821289f, 0.039673f, 0.813477f,
+ 0.039276f, 0.805664f, 0.039612f, 0.797852f, 0.039886f, 0.786621f, 0.040039f, 0.776367f,
+ 0.039948f, 0.767090f, 0.039886f, 0.756836f, 0.039551f, 0.747070f, 0.038940f, 0.736816f,
+ 0.039001f, 0.722656f, 0.038727f, 0.708984f, 0.038300f, 0.695312f, 0.037445f, 0.682129f,
+ 0.036530f, 0.668457f, 0.035614f, 0.653809f, 0.034912f, 0.634277f, 0.034241f, 0.615234f,
+ 0.032776f, 0.596191f, 0.031311f, 0.576660f, 0.029327f, 0.555176f, 0.028137f, 0.526855f,
+ 0.026276f, 0.498779f, 0.023758f, 0.468994f, 0.020996f, 0.437012f, 0.018600f, 0.392334f,
+ 0.015228f, 0.345215f, 0.010918f, 0.289307f, 0.006634f, 0.204834f, 0.001159f, 0.074524f,
+ 0.000000f, 1.000000f, 0.002541f, 0.997559f, 0.005898f, 0.993652f, 0.008385f, 0.989258f,
+ 0.010857f, 0.984863f, 0.012863f, 0.981445f, 0.015221f, 0.975586f, 0.017654f, 0.970703f,
+ 0.018692f, 0.966797f, 0.020630f, 0.962402f, 0.023270f, 0.956055f, 0.025604f, 0.950684f,
+ 0.026642f, 0.946289f, 0.027634f, 0.942871f, 0.030014f, 0.936523f, 0.031433f, 0.930664f,
+ 0.032532f, 0.926270f, 0.033997f, 0.921387f, 0.034821f, 0.917969f, 0.036072f, 0.911133f,
+ 0.037476f, 0.905273f, 0.038757f, 0.899414f, 0.039642f, 0.894531f, 0.040314f, 0.889160f,
+ 0.040955f, 0.884277f, 0.042450f, 0.876953f, 0.043488f, 0.870117f, 0.044250f, 0.863770f,
+ 0.045105f, 0.858398f, 0.044952f, 0.852051f, 0.045837f, 0.846191f, 0.046600f, 0.837402f,
+ 0.047058f, 0.829102f, 0.047760f, 0.822266f, 0.048065f, 0.814453f, 0.048187f, 0.807129f,
+ 0.048004f, 0.800293f, 0.048401f, 0.789551f, 0.048950f, 0.780273f, 0.049316f, 0.770508f,
+ 0.049103f, 0.761230f, 0.048615f, 0.751465f, 0.047943f, 0.741699f, 0.047791f, 0.729492f,
+ 0.047577f, 0.716309f, 0.047333f, 0.703613f, 0.046906f, 0.690918f, 0.045654f, 0.678223f,
+ 0.044434f, 0.664551f, 0.043915f, 0.647949f, 0.042816f, 0.629883f, 0.041626f, 0.611328f,
+ 0.039948f, 0.593262f, 0.037872f, 0.574219f, 0.035919f, 0.551270f, 0.034271f, 0.523926f,
+ 0.031830f, 0.496094f, 0.028732f, 0.467529f, 0.025284f, 0.436035f, 0.022461f, 0.390869f,
+ 0.018234f, 0.343994f, 0.013084f, 0.290039f, 0.007851f, 0.203613f, 0.001363f, 0.073547f,
+ 0.000000f, 1.000000f, 0.003119f, 0.997070f, 0.006718f, 0.993164f, 0.009628f, 0.988281f,
+ 0.012733f, 0.983398f, 0.014343f, 0.979980f, 0.017624f, 0.973633f, 0.020187f, 0.968262f,
+ 0.022675f, 0.963867f, 0.024384f, 0.958008f, 0.027664f, 0.951660f, 0.029388f, 0.947266f,
+ 0.031342f, 0.942383f, 0.032898f, 0.937012f, 0.035187f, 0.930664f, 0.037292f, 0.925293f,
+ 0.038818f, 0.920410f, 0.039948f, 0.916016f, 0.041504f, 0.910645f, 0.043610f, 0.903809f,
+ 0.044739f, 0.897949f, 0.045929f, 0.893066f, 0.047241f, 0.887695f, 0.048340f, 0.883301f,
+ 0.049377f, 0.875488f, 0.050659f, 0.869141f, 0.052094f, 0.862793f, 0.052856f, 0.856445f,
+ 0.053619f, 0.851074f, 0.053925f, 0.845703f, 0.054901f, 0.836914f, 0.056519f, 0.829590f,
+ 0.056824f, 0.821777f, 0.057007f, 0.814453f, 0.057678f, 0.808105f, 0.057404f, 0.800781f,
+ 0.058014f, 0.791504f, 0.058533f, 0.782227f, 0.058807f, 0.772949f, 0.058990f, 0.763672f,
+ 0.058624f, 0.754883f, 0.057983f, 0.745605f, 0.057739f, 0.735840f, 0.057831f, 0.722656f,
+ 0.057770f, 0.710449f, 0.057159f, 0.698730f, 0.056122f, 0.686035f, 0.054626f, 0.673828f,
+ 0.053436f, 0.660645f, 0.052734f, 0.642578f, 0.051666f, 0.625000f, 0.049957f, 0.607910f,
+ 0.047760f, 0.589844f, 0.045410f, 0.571777f, 0.043457f, 0.547363f, 0.040985f, 0.520996f,
+ 0.038025f, 0.494385f, 0.034271f, 0.466309f, 0.030258f, 0.433594f, 0.026794f, 0.389648f,
+ 0.021698f, 0.343750f, 0.015495f, 0.290771f, 0.009254f, 0.203125f, 0.001593f, 0.072693f,
+ 0.000000f, 1.000000f, 0.003414f, 0.996582f, 0.007236f, 0.992676f, 0.011124f, 0.986816f,
+ 0.014381f, 0.982422f, 0.016602f, 0.978027f, 0.020721f, 0.970703f, 0.023529f, 0.965332f,
+ 0.025726f, 0.960938f, 0.029190f, 0.953613f, 0.031433f, 0.948242f, 0.034515f, 0.942871f,
+ 0.036224f, 0.937988f, 0.039001f, 0.931152f, 0.041901f, 0.924316f, 0.043274f, 0.919434f,
+ 0.045441f, 0.914551f, 0.046600f, 0.910156f, 0.049103f, 0.902832f, 0.051208f, 0.896484f,
+ 0.053223f, 0.891113f, 0.054291f, 0.886230f, 0.055664f, 0.880859f, 0.057007f, 0.874023f,
+ 0.059204f, 0.867188f, 0.059906f, 0.860840f, 0.061798f, 0.854980f, 0.062378f, 0.849121f,
+ 0.062744f, 0.844238f, 0.064148f, 0.836426f, 0.065430f, 0.828613f, 0.066528f, 0.820801f,
+ 0.067505f, 0.814453f, 0.067444f, 0.807617f, 0.067749f, 0.800781f, 0.068176f, 0.793457f,
+ 0.069336f, 0.783691f, 0.069641f, 0.774414f, 0.069702f, 0.765625f, 0.069397f, 0.757324f,
+ 0.068970f, 0.748535f, 0.068665f, 0.740234f, 0.068909f, 0.727539f, 0.068787f, 0.715820f,
+ 0.068176f, 0.704102f, 0.067139f, 0.692871f, 0.065979f, 0.681152f, 0.064636f, 0.669434f,
+ 0.063660f, 0.653809f, 0.062683f, 0.637207f, 0.060883f, 0.620605f, 0.058838f, 0.604004f,
+ 0.056274f, 0.586914f, 0.053406f, 0.568848f, 0.051361f, 0.542969f, 0.048340f, 0.517578f,
+ 0.044708f, 0.492676f, 0.040283f, 0.465576f, 0.035980f, 0.430664f, 0.031464f, 0.388184f,
+ 0.025360f, 0.343262f, 0.017883f, 0.291260f, 0.010696f, 0.202881f, 0.001856f, 0.072144f,
+ 0.000000f, 1.000000f, 0.004360f, 0.996094f, 0.008430f, 0.992188f, 0.012947f, 0.985840f,
+ 0.016388f, 0.980957f, 0.019348f, 0.975098f, 0.024017f, 0.968262f, 0.026917f, 0.962891f,
+ 0.030121f, 0.957520f, 0.033203f, 0.949707f, 0.037048f, 0.943359f, 0.038940f, 0.938477f,
+ 0.041809f, 0.932617f, 0.045410f, 0.924805f, 0.048187f, 0.918945f, 0.050842f, 0.913086f,
+ 0.052185f, 0.908691f, 0.055511f, 0.901367f, 0.057404f, 0.894531f, 0.059570f, 0.889160f,
+ 0.061798f, 0.883301f, 0.063049f, 0.878906f, 0.064697f, 0.872559f, 0.067261f, 0.864746f,
+ 0.069092f, 0.858398f, 0.070435f, 0.853027f, 0.071594f, 0.847168f, 0.072632f, 0.841797f,
+ 0.073975f, 0.834961f, 0.075623f, 0.826660f, 0.077026f, 0.819824f, 0.078003f, 0.812988f,
+ 0.078308f, 0.806152f, 0.079163f, 0.800293f, 0.079041f, 0.792480f, 0.080139f, 0.783691f,
+ 0.081482f, 0.774902f, 0.081421f, 0.766602f, 0.081299f, 0.757812f, 0.080811f, 0.750488f,
+ 0.080811f, 0.742676f, 0.080994f, 0.731445f, 0.080811f, 0.719727f, 0.080688f, 0.708984f,
+ 0.079712f, 0.698242f, 0.078308f, 0.687012f, 0.076965f, 0.676758f, 0.075623f, 0.663086f,
+ 0.074646f, 0.646973f, 0.072754f, 0.631836f, 0.070862f, 0.616211f, 0.068481f, 0.600586f,
+ 0.065247f, 0.584473f, 0.062561f, 0.562500f, 0.059814f, 0.539551f, 0.056091f, 0.515625f,
+ 0.051666f, 0.490479f, 0.046753f, 0.464355f, 0.041748f, 0.427490f, 0.036346f, 0.386719f,
+ 0.029175f, 0.343262f, 0.021042f, 0.288818f, 0.012299f, 0.203003f, 0.002108f, 0.070984f,
+ 0.000000f, 1.000000f, 0.004745f, 0.996094f, 0.009407f, 0.991699f, 0.014153f, 0.984863f,
+ 0.018326f, 0.979492f, 0.022720f, 0.972168f, 0.027298f, 0.965820f, 0.030807f, 0.959961f,
+ 0.034576f, 0.952637f, 0.038940f, 0.945801f, 0.041931f, 0.939453f, 0.044830f, 0.934570f,
+ 0.048767f, 0.925781f, 0.052521f, 0.918945f, 0.055420f, 0.912598f, 0.057861f, 0.907227f,
+ 0.061035f, 0.900391f, 0.063660f, 0.893066f, 0.066895f, 0.886719f, 0.069153f, 0.880859f,
+ 0.070557f, 0.875977f, 0.073242f, 0.870117f, 0.075867f, 0.862793f, 0.078064f, 0.855957f,
+ 0.079712f, 0.849609f, 0.081238f, 0.844238f, 0.082458f, 0.839355f, 0.084229f, 0.832520f,
+ 0.086426f, 0.824219f, 0.087891f, 0.817383f, 0.088806f, 0.810547f, 0.089722f, 0.804688f,
+ 0.090271f, 0.798340f, 0.091003f, 0.791504f, 0.093018f, 0.782715f, 0.092896f, 0.773926f,
+ 0.093750f, 0.766602f, 0.094116f, 0.758789f, 0.094238f, 0.751465f, 0.093262f, 0.743652f,
+ 0.093445f, 0.733398f, 0.093872f, 0.722656f, 0.093567f, 0.712402f, 0.092651f, 0.702148f,
+ 0.091553f, 0.692383f, 0.090027f, 0.681641f, 0.088440f, 0.670898f, 0.087402f, 0.655273f,
+ 0.086304f, 0.641113f, 0.084229f, 0.626465f, 0.081421f, 0.612305f, 0.078552f, 0.596680f,
+ 0.075012f, 0.580566f, 0.072510f, 0.558105f, 0.068970f, 0.535645f, 0.064514f, 0.512695f,
+ 0.059235f, 0.489014f, 0.053314f, 0.463867f, 0.048309f, 0.424561f, 0.041534f, 0.385254f,
+ 0.033173f, 0.343018f, 0.024246f, 0.286133f, 0.014030f, 0.202759f, 0.002388f, 0.070007f,
+ 0.000000f, 1.000000f, 0.005783f, 0.995605f, 0.010551f, 0.990723f, 0.016327f, 0.983398f,
+ 0.021011f, 0.978027f, 0.026352f, 0.969727f, 0.031097f, 0.962891f, 0.034790f, 0.957520f,
+ 0.040161f, 0.948242f, 0.044769f, 0.940918f, 0.047974f, 0.935547f, 0.052094f, 0.927246f,
+ 0.056610f, 0.919434f, 0.060028f, 0.912598f, 0.063110f, 0.906738f, 0.066467f, 0.900391f,
+ 0.070557f, 0.891602f, 0.073975f, 0.884766f, 0.076782f, 0.878906f, 0.079102f, 0.873047f,
+ 0.081482f, 0.866699f, 0.084717f, 0.859375f, 0.087708f, 0.852539f, 0.089233f, 0.846680f,
+ 0.091370f, 0.841309f, 0.092957f, 0.835938f, 0.094849f, 0.828613f, 0.097229f, 0.821289f,
+ 0.099365f, 0.813965f, 0.100464f, 0.808105f, 0.101807f, 0.801758f, 0.102173f, 0.795898f,
+ 0.103821f, 0.789062f, 0.105042f, 0.780273f, 0.106018f, 0.772461f, 0.106995f, 0.765625f,
+ 0.106750f, 0.757812f, 0.107361f, 0.750488f, 0.106995f, 0.744141f, 0.107239f, 0.733887f,
+ 0.107605f, 0.723633f, 0.107544f, 0.714355f, 0.106873f, 0.704590f, 0.105347f, 0.695312f,
+ 0.103943f, 0.686035f, 0.102478f, 0.675781f, 0.102295f, 0.662598f, 0.100342f, 0.647949f,
+ 0.098328f, 0.635742f, 0.095703f, 0.621582f, 0.092529f, 0.607910f, 0.089111f, 0.593750f,
+ 0.086121f, 0.573730f, 0.082764f, 0.553223f, 0.078003f, 0.531738f, 0.073059f, 0.510742f,
+ 0.067383f, 0.488525f, 0.061157f, 0.458496f, 0.054871f, 0.421875f, 0.047150f, 0.384766f,
+ 0.037567f, 0.343750f, 0.027527f, 0.283203f, 0.015640f, 0.202515f, 0.002684f, 0.069092f,
+ 0.000000f, 1.000000f, 0.006943f, 0.995117f, 0.011772f, 0.989746f, 0.018341f, 0.982422f,
+ 0.023682f, 0.975098f, 0.030090f, 0.967285f, 0.034973f, 0.960449f, 0.040741f, 0.951660f,
+ 0.045776f, 0.943848f, 0.050415f, 0.937012f, 0.055145f, 0.929199f, 0.059967f, 0.920898f,
+ 0.064270f, 0.913574f, 0.068359f, 0.906738f, 0.071777f, 0.899902f, 0.076660f, 0.891113f,
+ 0.079834f, 0.883789f, 0.084229f, 0.876953f, 0.087097f, 0.870605f, 0.090149f, 0.863770f,
+ 0.093933f, 0.855957f, 0.096619f, 0.849121f, 0.099792f, 0.843262f, 0.101624f, 0.837402f,
+ 0.103638f, 0.832520f, 0.106689f, 0.824219f, 0.109009f, 0.816406f, 0.110779f, 0.810059f,
+ 0.112732f, 0.804199f, 0.114075f, 0.798340f, 0.115295f, 0.792969f, 0.116638f, 0.785156f,
+ 0.118103f, 0.777344f, 0.120239f, 0.769531f, 0.120483f, 0.762695f, 0.121033f, 0.755859f,
+ 0.120789f, 0.750000f, 0.121094f, 0.743164f, 0.121887f, 0.732910f, 0.121826f, 0.723633f,
+ 0.121704f, 0.714355f, 0.120911f, 0.706055f, 0.120544f, 0.697754f, 0.118774f, 0.688965f,
+ 0.117371f, 0.679199f, 0.116821f, 0.666992f, 0.115173f, 0.654297f, 0.113037f, 0.641602f,
+ 0.110596f, 0.629395f, 0.107971f, 0.617188f, 0.104004f, 0.604492f, 0.100769f, 0.586426f,
+ 0.097229f, 0.567383f, 0.093262f, 0.548828f, 0.087952f, 0.529297f, 0.082031f, 0.508789f,
+ 0.075012f, 0.486572f, 0.069092f, 0.453857f, 0.061462f, 0.419922f, 0.053040f, 0.384766f,
+ 0.042084f, 0.344482f, 0.031250f, 0.281006f, 0.017685f, 0.203247f, 0.002993f, 0.068542f,
+ 0.000000f, 1.000000f, 0.007553f, 0.994629f, 0.013931f, 0.988281f, 0.020828f, 0.980957f,
+ 0.028076f, 0.972656f, 0.033905f, 0.964844f, 0.039520f, 0.957520f, 0.046295f, 0.947266f,
+ 0.051849f, 0.939453f, 0.056702f, 0.932617f, 0.063232f, 0.922363f, 0.068420f, 0.914551f,
+ 0.072693f, 0.907227f, 0.077637f, 0.899414f, 0.082764f, 0.890625f, 0.087341f, 0.882812f,
+ 0.091309f, 0.875488f, 0.094238f, 0.869141f, 0.099609f, 0.860840f, 0.102783f, 0.853027f,
+ 0.106628f, 0.845703f, 0.109863f, 0.838867f, 0.112000f, 0.833984f, 0.114929f, 0.827637f,
+ 0.118225f, 0.818848f, 0.121094f, 0.812012f, 0.123657f, 0.805664f, 0.125610f, 0.799805f,
+ 0.126465f, 0.794922f, 0.128418f, 0.788574f, 0.130615f, 0.780762f, 0.132568f, 0.772949f,
+ 0.133667f, 0.766113f, 0.134766f, 0.759277f, 0.135254f, 0.753418f, 0.135254f, 0.747559f,
+ 0.136230f, 0.739746f, 0.136963f, 0.730469f, 0.137939f, 0.722168f, 0.137207f, 0.713867f,
+ 0.136475f, 0.706055f, 0.135498f, 0.698242f, 0.134521f, 0.690918f, 0.133179f, 0.680664f,
+ 0.132324f, 0.668945f, 0.131104f, 0.657715f, 0.128784f, 0.646484f, 0.126709f, 0.635742f,
+ 0.123413f, 0.624023f, 0.119751f, 0.612793f, 0.116821f, 0.597168f, 0.113403f, 0.579590f,
+ 0.109070f, 0.562988f, 0.103882f, 0.544922f, 0.098328f, 0.526367f, 0.091003f, 0.506348f,
+ 0.084290f, 0.480469f, 0.077454f, 0.450439f, 0.069031f, 0.418945f, 0.058624f, 0.383789f,
+ 0.046387f, 0.343994f, 0.034790f, 0.279297f, 0.019684f, 0.203613f, 0.003374f, 0.068787f,
+ 0.000000f, 1.000000f, 0.008575f, 0.994141f, 0.016556f, 0.986816f, 0.023254f, 0.979980f,
+ 0.031891f, 0.969238f, 0.038269f, 0.962402f, 0.045532f, 0.952148f, 0.052307f, 0.943359f,
+ 0.058289f, 0.935547f, 0.065796f, 0.924805f, 0.072205f, 0.916016f, 0.076782f, 0.908691f,
+ 0.081970f, 0.900391f, 0.088379f, 0.890137f, 0.093567f, 0.881836f, 0.097717f, 0.875000f,
+ 0.102112f, 0.868164f, 0.107178f, 0.858398f, 0.111755f, 0.850098f, 0.116394f, 0.842773f,
+ 0.120056f, 0.835938f, 0.122803f, 0.830078f, 0.126709f, 0.821289f, 0.129883f, 0.813965f,
+ 0.133301f, 0.807129f, 0.136353f, 0.800781f, 0.137573f, 0.795898f, 0.140137f, 0.790039f,
+ 0.142334f, 0.782227f, 0.145020f, 0.774902f, 0.147095f, 0.767578f, 0.148682f, 0.761719f,
+ 0.149536f, 0.755371f, 0.149902f, 0.750488f, 0.150391f, 0.744141f, 0.152344f, 0.734863f,
+ 0.152832f, 0.727051f, 0.153687f, 0.719727f, 0.153076f, 0.711914f, 0.153076f, 0.705566f,
+ 0.152100f, 0.698242f, 0.150269f, 0.690918f, 0.150269f, 0.680176f, 0.149414f, 0.669922f,
+ 0.148071f, 0.660156f, 0.145874f, 0.649902f, 0.143188f, 0.639648f, 0.140259f, 0.629883f,
+ 0.136353f, 0.619141f, 0.133423f, 0.604980f, 0.130371f, 0.590332f, 0.126343f, 0.574219f,
+ 0.121277f, 0.558105f, 0.114929f, 0.541504f, 0.108276f, 0.523926f, 0.101257f, 0.503906f,
+ 0.094116f, 0.475586f, 0.085876f, 0.447998f, 0.075989f, 0.417725f, 0.064819f, 0.383789f,
+ 0.051666f, 0.341553f, 0.038544f, 0.277588f, 0.021500f, 0.203857f, 0.003771f, 0.068604f,
+ 0.000000f, 1.000000f, 0.009750f, 0.994141f, 0.018921f, 0.985352f, 0.026566f, 0.977051f,
+ 0.036346f, 0.967285f, 0.043640f, 0.958008f, 0.052460f, 0.947266f, 0.058868f, 0.939453f,
+ 0.067261f, 0.928223f, 0.074036f, 0.918457f, 0.080383f, 0.910645f, 0.086243f, 0.901367f,
+ 0.093628f, 0.891113f, 0.099304f, 0.881836f, 0.105225f, 0.874023f, 0.110413f, 0.865723f,
+ 0.115784f, 0.855957f, 0.121155f, 0.847656f, 0.125610f, 0.840332f, 0.129272f, 0.833496f,
+ 0.133667f, 0.825684f, 0.138550f, 0.816406f, 0.142700f, 0.808594f, 0.146118f, 0.801758f,
+ 0.148438f, 0.796387f, 0.151001f, 0.790527f, 0.154297f, 0.782715f, 0.156860f, 0.775391f,
+ 0.160156f, 0.768555f, 0.161621f, 0.762695f, 0.163086f, 0.756348f, 0.164429f, 0.750977f,
+ 0.165283f, 0.746094f, 0.166992f, 0.737305f, 0.168823f, 0.729980f, 0.169434f, 0.722656f,
+ 0.170166f, 0.715820f, 0.169800f, 0.709473f, 0.169312f, 0.703125f, 0.168091f, 0.696777f,
+ 0.168335f, 0.687988f, 0.167603f, 0.678711f, 0.167236f, 0.669434f, 0.165405f, 0.660645f,
+ 0.162842f, 0.651855f, 0.160034f, 0.643066f, 0.157349f, 0.634766f, 0.154419f, 0.624512f,
+ 0.151611f, 0.609863f, 0.147705f, 0.596191f, 0.143555f, 0.582520f, 0.138672f, 0.568359f,
+ 0.132812f, 0.553711f, 0.125977f, 0.538574f, 0.118958f, 0.521484f, 0.112061f, 0.497070f,
+ 0.104309f, 0.472412f, 0.094727f, 0.446045f, 0.083557f, 0.416748f, 0.070740f, 0.383301f,
+ 0.057739f, 0.336914f, 0.042694f, 0.277588f, 0.023712f, 0.205078f, 0.004120f, 0.067993f,
+ 0.000000f, 1.000000f, 0.010826f, 0.993652f, 0.021271f, 0.984375f, 0.031647f, 0.973633f,
+ 0.040100f, 0.965332f, 0.050293f, 0.953125f, 0.058868f, 0.943848f, 0.067932f, 0.932617f,
+ 0.075684f, 0.922363f, 0.083252f, 0.913086f, 0.091064f, 0.901855f, 0.099304f, 0.891602f,
+ 0.105530f, 0.882812f, 0.110718f, 0.875000f, 0.118652f, 0.863770f, 0.125244f, 0.854004f,
+ 0.130005f, 0.846191f, 0.135132f, 0.838379f, 0.140015f, 0.829590f, 0.145264f, 0.820312f,
+ 0.150391f, 0.812012f, 0.154541f, 0.804688f, 0.157837f, 0.798340f, 0.161255f, 0.791992f,
+ 0.165771f, 0.782715f, 0.168823f, 0.775391f, 0.172363f, 0.768066f, 0.174683f, 0.762207f,
+ 0.175903f, 0.757324f, 0.178711f, 0.751465f, 0.180420f, 0.745117f, 0.182495f, 0.737305f,
+ 0.184326f, 0.729980f, 0.185547f, 0.724121f, 0.186401f, 0.717773f, 0.186890f, 0.711914f,
+ 0.186768f, 0.706055f, 0.185913f, 0.700684f, 0.186401f, 0.691895f, 0.186279f, 0.683105f,
+ 0.186035f, 0.675781f, 0.184814f, 0.667969f, 0.182739f, 0.660645f, 0.180786f, 0.652832f,
+ 0.178101f, 0.645020f, 0.175293f, 0.636719f, 0.173462f, 0.625000f, 0.170166f, 0.612793f,
+ 0.166382f, 0.601074f, 0.162476f, 0.589355f, 0.156860f, 0.577148f, 0.151245f, 0.564453f,
+ 0.144653f, 0.550781f, 0.138184f, 0.534668f, 0.131104f, 0.514160f, 0.123291f, 0.492676f,
+ 0.113892f, 0.468994f, 0.102905f, 0.443604f, 0.091064f, 0.415771f, 0.077271f, 0.382812f,
+ 0.063293f, 0.333496f, 0.046753f, 0.277100f, 0.025787f, 0.206421f, 0.004452f, 0.067383f,
+ 0.000000f, 1.000000f, 0.011368f, 0.993652f, 0.023193f, 0.983887f, 0.035919f, 0.972168f,
+ 0.046143f, 0.960938f, 0.056976f, 0.949707f, 0.067261f, 0.937988f, 0.076233f, 0.927246f,
+ 0.084839f, 0.916992f, 0.095093f, 0.904297f, 0.103088f, 0.894043f, 0.110657f, 0.884766f,
+ 0.118469f, 0.873047f, 0.125732f, 0.862793f, 0.132935f, 0.853027f, 0.138794f, 0.845215f,
+ 0.145142f, 0.834961f, 0.150879f, 0.825684f, 0.157104f, 0.816406f, 0.162476f, 0.808105f,
+ 0.166138f, 0.801758f, 0.171021f, 0.792969f, 0.175293f, 0.784180f, 0.180542f, 0.775879f,
+ 0.183838f, 0.769043f, 0.186523f, 0.762695f, 0.189087f, 0.756836f, 0.192261f, 0.750488f,
+ 0.194702f, 0.742676f, 0.197998f, 0.735840f, 0.199829f, 0.729492f, 0.201050f, 0.723633f,
+ 0.202393f, 0.717773f, 0.203613f, 0.712402f, 0.203613f, 0.707520f, 0.204468f, 0.700195f,
+ 0.205811f, 0.692871f, 0.205322f, 0.686035f, 0.204834f, 0.679199f, 0.204712f, 0.672363f,
+ 0.202515f, 0.665527f, 0.201538f, 0.659180f, 0.198608f, 0.652344f, 0.197144f, 0.643555f,
+ 0.195679f, 0.634277f, 0.192993f, 0.624512f, 0.189453f, 0.614746f, 0.185669f, 0.604492f,
+ 0.181152f, 0.594727f, 0.176636f, 0.584473f, 0.170532f, 0.573242f, 0.164185f, 0.561523f,
+ 0.158203f, 0.543945f, 0.151245f, 0.526367f, 0.142700f, 0.507324f, 0.133911f, 0.487793f,
+ 0.123474f, 0.466064f, 0.111938f, 0.442139f, 0.098450f, 0.415283f, 0.084839f, 0.376221f,
+ 0.069519f, 0.331543f, 0.050629f, 0.277100f, 0.027802f, 0.207153f, 0.004837f, 0.067444f,
+ 0.000000f, 1.000000f, 0.013916f, 0.991699f, 0.027954f, 0.980469f, 0.040405f, 0.969238f,
+ 0.052277f, 0.957520f, 0.065369f, 0.943848f, 0.075928f, 0.932617f, 0.086914f, 0.919922f,
+ 0.096985f, 0.908203f, 0.106384f, 0.897461f, 0.116028f, 0.885254f, 0.124451f, 0.873535f,
+ 0.132935f, 0.863281f, 0.140259f, 0.853516f, 0.148193f, 0.842285f, 0.155884f, 0.832031f,
+ 0.162476f, 0.822754f, 0.166626f, 0.814941f, 0.173828f, 0.804688f, 0.180176f, 0.795410f,
+ 0.185669f, 0.786133f, 0.189453f, 0.778809f, 0.194336f, 0.770996f, 0.197144f, 0.764648f,
+ 0.201538f, 0.755859f, 0.206787f, 0.748047f, 0.209473f, 0.740723f, 0.212524f, 0.733887f,
+ 0.214844f, 0.728027f, 0.216309f, 0.722656f, 0.218262f, 0.717285f, 0.219971f, 0.710938f,
+ 0.221069f, 0.704102f, 0.223511f, 0.697266f, 0.223999f, 0.691406f, 0.224121f, 0.685547f,
+ 0.224121f, 0.679688f, 0.223877f, 0.674316f, 0.222412f, 0.668457f, 0.221191f, 0.663086f,
+ 0.220825f, 0.655273f, 0.219727f, 0.646973f, 0.217407f, 0.640137f, 0.215820f, 0.632324f,
+ 0.212769f, 0.624512f, 0.209473f, 0.616211f, 0.205200f, 0.607910f, 0.201294f, 0.599121f,
+ 0.195679f, 0.589844f, 0.190186f, 0.578125f, 0.185669f, 0.564941f, 0.179443f, 0.550781f,
+ 0.172119f, 0.536133f, 0.163696f, 0.520508f, 0.155396f, 0.503418f, 0.144409f, 0.484619f,
+ 0.133179f, 0.464355f, 0.120605f, 0.442139f, 0.107605f, 0.409424f, 0.092712f, 0.372803f,
+ 0.075195f, 0.330322f, 0.054901f, 0.278076f, 0.029694f, 0.208252f, 0.005230f, 0.067566f,
+ 0.000000f, 1.000000f, 0.016098f, 0.991699f, 0.031250f, 0.979492f, 0.046326f, 0.966797f,
+ 0.060455f, 0.952637f, 0.073181f, 0.939453f, 0.086975f, 0.925293f, 0.096802f, 0.914551f,
+ 0.109863f, 0.899414f, 0.120483f, 0.887695f, 0.129639f, 0.875977f, 0.139648f, 0.863281f,
+ 0.148682f, 0.851562f, 0.157471f, 0.841309f, 0.164429f, 0.831055f, 0.171875f, 0.820312f,
+ 0.179565f, 0.810059f, 0.186646f, 0.800781f, 0.192627f, 0.791504f, 0.197876f, 0.782715f,
+ 0.203613f, 0.772949f, 0.209839f, 0.763672f, 0.213379f, 0.755859f, 0.218750f, 0.748047f,
+ 0.221802f, 0.741211f, 0.224976f, 0.734863f, 0.229248f, 0.727051f, 0.231812f, 0.719727f,
+ 0.234985f, 0.712891f, 0.237549f, 0.706055f, 0.238770f, 0.700684f, 0.240723f, 0.694824f,
+ 0.242310f, 0.689941f, 0.242310f, 0.685547f, 0.242310f, 0.680176f, 0.243408f, 0.673828f,
+ 0.242920f, 0.667969f, 0.242676f, 0.661133f, 0.242188f, 0.654785f, 0.241577f, 0.648438f,
+ 0.239868f, 0.642090f, 0.237793f, 0.635742f, 0.235352f, 0.629395f, 0.232300f, 0.622559f,
+ 0.229004f, 0.615723f, 0.225586f, 0.607910f, 0.221680f, 0.598145f, 0.217407f, 0.588867f,
+ 0.212280f, 0.578125f, 0.206787f, 0.567383f, 0.201050f, 0.556152f, 0.193604f, 0.544434f,
+ 0.185669f, 0.530762f, 0.176270f, 0.516113f, 0.166992f, 0.500977f, 0.155273f, 0.483398f,
+ 0.144165f, 0.460449f, 0.131104f, 0.434814f, 0.116577f, 0.405273f, 0.099976f, 0.371094f,
+ 0.080994f, 0.330566f, 0.058533f, 0.279053f, 0.031921f, 0.210205f, 0.005592f, 0.067871f,
+ 0.000000f, 1.000000f, 0.018982f, 0.990234f, 0.036041f, 0.977539f, 0.053192f, 0.962891f,
+ 0.069458f, 0.947754f, 0.084351f, 0.932129f, 0.097961f, 0.918945f, 0.111328f, 0.904297f,
+ 0.123291f, 0.890625f, 0.135498f, 0.877930f, 0.146240f, 0.864258f, 0.156860f, 0.851562f,
+ 0.166138f, 0.840332f, 0.174927f, 0.829102f, 0.183105f, 0.817383f, 0.191650f, 0.806641f,
+ 0.199341f, 0.795898f, 0.206055f, 0.787109f, 0.212524f, 0.777344f, 0.218750f, 0.768066f,
+ 0.224609f, 0.758789f, 0.229980f, 0.749512f, 0.235107f, 0.741211f, 0.238892f, 0.733398f,
+ 0.243286f, 0.725098f, 0.246582f, 0.718750f, 0.249023f, 0.712402f, 0.252930f, 0.704590f,
+ 0.255615f, 0.697266f, 0.258545f, 0.690918f, 0.260010f, 0.684570f, 0.261475f, 0.679199f,
+ 0.262939f, 0.673340f, 0.263672f, 0.668457f, 0.264404f, 0.663086f, 0.263184f, 0.658203f,
+ 0.262695f, 0.653320f, 0.262939f, 0.647949f, 0.261719f, 0.642090f, 0.260010f, 0.636230f,
+ 0.259033f, 0.629883f, 0.256836f, 0.623535f, 0.253906f, 0.616699f, 0.251709f, 0.610840f,
+ 0.248047f, 0.603027f, 0.244263f, 0.595703f, 0.239258f, 0.588379f, 0.234497f, 0.580078f,
+ 0.228760f, 0.570801f, 0.221802f, 0.561035f, 0.214844f, 0.550781f, 0.206787f, 0.540039f,
+ 0.198364f, 0.525879f, 0.190063f, 0.510742f, 0.179443f, 0.494385f, 0.167969f, 0.476318f,
+ 0.155396f, 0.455322f, 0.141113f, 0.430664f, 0.125122f, 0.403076f, 0.106934f, 0.369873f,
+ 0.086731f, 0.331055f, 0.062683f, 0.281006f, 0.035004f, 0.205078f, 0.005989f, 0.068420f,
+ 0.000000f, 1.000000f, 0.022034f, 0.988770f, 0.041840f, 0.974609f, 0.061157f, 0.958008f,
+ 0.079163f, 0.941895f, 0.096313f, 0.925293f, 0.111877f, 0.909668f, 0.126099f, 0.895020f,
+ 0.139404f, 0.880371f, 0.152100f, 0.866211f, 0.163940f, 0.852051f, 0.175537f, 0.839355f,
+ 0.185669f, 0.827148f, 0.195190f, 0.814941f, 0.203491f, 0.803223f, 0.212524f, 0.791504f,
+ 0.220337f, 0.780762f, 0.226685f, 0.770996f, 0.234497f, 0.760742f, 0.241089f, 0.751465f,
+ 0.246460f, 0.742188f, 0.251953f, 0.733398f, 0.256836f, 0.725098f, 0.260254f, 0.717285f,
+ 0.265137f, 0.708984f, 0.269531f, 0.701172f, 0.272705f, 0.694336f, 0.274414f, 0.687988f,
+ 0.277588f, 0.681152f, 0.279541f, 0.674805f, 0.281494f, 0.668945f, 0.283203f, 0.663086f,
+ 0.283447f, 0.658203f, 0.284180f, 0.653320f, 0.284424f, 0.648926f, 0.284668f, 0.643555f,
+ 0.283936f, 0.638184f, 0.283203f, 0.633789f, 0.281982f, 0.627930f, 0.280029f, 0.623535f,
+ 0.278564f, 0.617188f, 0.276123f, 0.611816f, 0.272949f, 0.606445f, 0.269287f, 0.600098f,
+ 0.265137f, 0.592773f, 0.260986f, 0.586426f, 0.256592f, 0.578613f, 0.250977f, 0.570801f,
+ 0.244629f, 0.562012f, 0.238159f, 0.552734f, 0.230957f, 0.541992f, 0.222046f, 0.531250f,
+ 0.213623f, 0.518555f, 0.203369f, 0.504883f, 0.191772f, 0.489502f, 0.179565f, 0.472412f,
+ 0.165649f, 0.452148f, 0.151245f, 0.429932f, 0.133789f, 0.402832f, 0.114746f, 0.371094f,
+ 0.092896f, 0.331055f, 0.067444f, 0.278320f, 0.037933f, 0.202637f, 0.006348f, 0.068604f,
+ 0.000000f, 1.000000f, 0.023560f, 0.988281f, 0.045685f, 0.972656f, 0.066162f, 0.955566f,
+ 0.085266f, 0.938477f, 0.102783f, 0.922363f, 0.119019f, 0.905762f, 0.134399f, 0.890137f,
+ 0.149048f, 0.874512f, 0.162354f, 0.859863f, 0.174438f, 0.846191f, 0.186646f, 0.832031f,
+ 0.196655f, 0.819336f, 0.206299f, 0.807129f, 0.216187f, 0.794922f, 0.224243f, 0.783691f,
+ 0.232910f, 0.772461f, 0.239502f, 0.762207f, 0.247314f, 0.751953f, 0.254395f, 0.742188f,
+ 0.259521f, 0.732910f, 0.265381f, 0.723633f, 0.270020f, 0.715332f, 0.275635f, 0.707031f,
+ 0.280273f, 0.698730f, 0.282715f, 0.691895f, 0.286621f, 0.684082f, 0.289795f, 0.677246f,
+ 0.291748f, 0.670898f, 0.295410f, 0.664062f, 0.296631f, 0.658203f, 0.297607f, 0.652832f,
+ 0.298828f, 0.647461f, 0.300781f, 0.641602f, 0.300293f, 0.637207f, 0.301270f, 0.632324f,
+ 0.300049f, 0.626953f, 0.299072f, 0.622559f, 0.298828f, 0.617188f, 0.296631f, 0.612305f,
+ 0.294189f, 0.607422f, 0.292236f, 0.601562f, 0.289307f, 0.595703f, 0.285889f, 0.589844f,
+ 0.282959f, 0.583984f, 0.277588f, 0.577148f, 0.273438f, 0.569824f, 0.267578f, 0.562500f,
+ 0.261475f, 0.553711f, 0.255371f, 0.544922f, 0.246948f, 0.534180f, 0.239136f, 0.524414f,
+ 0.230591f, 0.511719f, 0.220581f, 0.498779f, 0.208496f, 0.483154f, 0.196411f, 0.466797f,
+ 0.182251f, 0.446777f, 0.167236f, 0.424316f, 0.149780f, 0.397461f, 0.130005f, 0.365723f,
+ 0.107483f, 0.326416f, 0.080872f, 0.274902f, 0.048859f, 0.201416f, 0.011032f, 0.073975f,
+ 0.000000f, 1.000000f, 0.023407f, 0.988281f, 0.045624f, 0.972656f, 0.066101f, 0.955566f,
+ 0.085083f, 0.938477f, 0.102844f, 0.921875f, 0.119690f, 0.905273f, 0.135620f, 0.889160f,
+ 0.149658f, 0.874023f, 0.163940f, 0.858887f, 0.175537f, 0.845215f, 0.187622f, 0.831055f,
+ 0.199097f, 0.817871f, 0.209229f, 0.805176f, 0.218628f, 0.792969f, 0.227783f, 0.781250f,
+ 0.236084f, 0.770508f, 0.244141f, 0.759277f, 0.250977f, 0.749023f, 0.258057f, 0.739258f,
+ 0.265137f, 0.729492f, 0.270508f, 0.720215f, 0.276123f, 0.711426f, 0.281494f, 0.702637f,
+ 0.284668f, 0.695312f, 0.289795f, 0.686523f, 0.293945f, 0.679199f, 0.297363f, 0.671875f,
+ 0.300049f, 0.665039f, 0.303711f, 0.658203f, 0.304688f, 0.652344f, 0.307373f, 0.645996f,
+ 0.309082f, 0.640137f, 0.309570f, 0.635254f, 0.310547f, 0.629883f, 0.311523f, 0.624512f,
+ 0.311523f, 0.619629f, 0.310303f, 0.614258f, 0.310303f, 0.609375f, 0.308594f, 0.604004f,
+ 0.307617f, 0.598633f, 0.305908f, 0.592773f, 0.303467f, 0.587402f, 0.300293f, 0.581543f,
+ 0.297852f, 0.574707f, 0.292969f, 0.567871f, 0.289062f, 0.561035f, 0.284180f, 0.553223f,
+ 0.278809f, 0.544922f, 0.272705f, 0.535645f, 0.266113f, 0.525879f, 0.258545f, 0.515137f,
+ 0.250488f, 0.502930f, 0.240967f, 0.489746f, 0.230347f, 0.475342f, 0.218384f, 0.458496f,
+ 0.205322f, 0.439209f, 0.190063f, 0.416992f, 0.173706f, 0.391602f, 0.153809f, 0.359863f,
+ 0.131592f, 0.322021f, 0.104431f, 0.271729f, 0.070129f, 0.199585f, 0.024445f, 0.074219f,
+ 0.000000f, 1.000000f, 0.022964f, 0.988770f, 0.045502f, 0.973145f, 0.066467f, 0.955566f,
+ 0.085938f, 0.937988f, 0.103394f, 0.921875f, 0.120728f, 0.904785f, 0.136108f, 0.889160f,
+ 0.150391f, 0.873535f, 0.164429f, 0.858398f, 0.177856f, 0.843750f, 0.189941f, 0.830078f,
+ 0.200317f, 0.816895f, 0.211548f, 0.803711f, 0.221313f, 0.791504f, 0.231323f, 0.779297f,
+ 0.239014f, 0.768066f, 0.247314f, 0.756836f, 0.255859f, 0.746094f, 0.261963f, 0.736328f,
+ 0.269531f, 0.726074f, 0.275635f, 0.716797f, 0.281494f, 0.707520f, 0.286377f, 0.698730f,
+ 0.291504f, 0.690430f, 0.296631f, 0.682129f, 0.301270f, 0.674316f, 0.305176f, 0.666504f,
+ 0.308350f, 0.659180f, 0.311035f, 0.653320f, 0.313965f, 0.645996f, 0.316406f, 0.639648f,
+ 0.318359f, 0.633301f, 0.319336f, 0.627930f, 0.321289f, 0.622070f, 0.321777f, 0.616699f,
+ 0.322754f, 0.611816f, 0.322510f, 0.606445f, 0.322510f, 0.601074f, 0.322266f, 0.595703f,
+ 0.320312f, 0.589844f, 0.319580f, 0.583984f, 0.317383f, 0.578125f, 0.314697f, 0.572266f,
+ 0.312500f, 0.565918f, 0.309814f, 0.559082f, 0.306152f, 0.551270f, 0.301758f, 0.543457f,
+ 0.297119f, 0.535156f, 0.291504f, 0.525879f, 0.285400f, 0.516113f, 0.277588f, 0.505371f,
+ 0.270508f, 0.493652f, 0.261719f, 0.480469f, 0.251709f, 0.466064f, 0.241089f, 0.449463f,
+ 0.228027f, 0.430420f, 0.214600f, 0.408936f, 0.197876f, 0.383545f, 0.179321f, 0.353027f,
+ 0.156616f, 0.315186f, 0.130371f, 0.266357f, 0.094299f, 0.195435f, 0.042755f, 0.071960f,
+ 0.000000f, 1.000000f, 0.023224f, 0.988770f, 0.045227f, 0.973145f, 0.066589f, 0.955566f,
+ 0.085999f, 0.938477f, 0.104614f, 0.921387f, 0.121094f, 0.904785f, 0.137451f, 0.888184f,
+ 0.151855f, 0.872559f, 0.166870f, 0.857422f, 0.179199f, 0.842773f, 0.191284f, 0.829102f,
+ 0.203735f, 0.814941f, 0.214600f, 0.801758f, 0.224731f, 0.789062f, 0.233154f, 0.777344f,
+ 0.243164f, 0.765137f, 0.251221f, 0.753906f, 0.259277f, 0.743652f, 0.267822f, 0.732422f,
+ 0.273682f, 0.722656f, 0.281006f, 0.712891f, 0.287109f, 0.703613f, 0.292480f, 0.694336f,
+ 0.298340f, 0.685547f, 0.303955f, 0.677246f, 0.307861f, 0.669434f, 0.312500f, 0.661133f,
+ 0.315430f, 0.653809f, 0.318359f, 0.646973f, 0.322266f, 0.639648f, 0.325195f, 0.632812f,
+ 0.327881f, 0.626465f, 0.329346f, 0.620605f, 0.331787f, 0.614258f, 0.332764f, 0.608887f,
+ 0.334473f, 0.603516f, 0.334473f, 0.598145f, 0.333984f, 0.592285f, 0.334961f, 0.586426f,
+ 0.333984f, 0.580566f, 0.333252f, 0.575195f, 0.332275f, 0.568359f, 0.330811f, 0.562500f,
+ 0.328125f, 0.555664f, 0.325684f, 0.548828f, 0.322754f, 0.540527f, 0.319336f, 0.533203f,
+ 0.314941f, 0.524414f, 0.310547f, 0.515137f, 0.305176f, 0.505371f, 0.299072f, 0.494629f,
+ 0.291992f, 0.482666f, 0.284424f, 0.469971f, 0.275146f, 0.455322f, 0.264404f, 0.439209f,
+ 0.252930f, 0.420654f, 0.239380f, 0.399414f, 0.224243f, 0.375000f, 0.206055f, 0.345215f,
+ 0.183228f, 0.308838f, 0.157104f, 0.261719f, 0.120361f, 0.193237f, 0.064697f, 0.072388f,
+ 0.000000f, 1.000000f, 0.023453f, 0.988281f, 0.045319f, 0.973145f, 0.066528f, 0.955566f,
+ 0.086365f, 0.937988f, 0.105164f, 0.920898f, 0.121643f, 0.904297f, 0.138306f, 0.887695f,
+ 0.153076f, 0.872070f, 0.167725f, 0.856934f, 0.180786f, 0.841797f, 0.193237f, 0.827637f,
+ 0.205078f, 0.813477f, 0.216064f, 0.800293f, 0.226562f, 0.787598f, 0.237915f, 0.774902f,
+ 0.246704f, 0.763184f, 0.256348f, 0.750977f, 0.262939f, 0.740234f, 0.271729f, 0.729492f,
+ 0.279541f, 0.719238f, 0.285645f, 0.709473f, 0.291748f, 0.699707f, 0.299316f, 0.689941f,
+ 0.304932f, 0.680664f, 0.309814f, 0.672363f, 0.315430f, 0.663574f, 0.319336f, 0.655762f,
+ 0.324463f, 0.647461f, 0.327637f, 0.640625f, 0.332031f, 0.632812f, 0.334717f, 0.625977f,
+ 0.337891f, 0.618652f, 0.340088f, 0.612305f, 0.343018f, 0.605957f, 0.344482f, 0.600098f,
+ 0.346436f, 0.594238f, 0.347656f, 0.588379f, 0.347656f, 0.582520f, 0.348877f, 0.576172f,
+ 0.348633f, 0.570801f, 0.347656f, 0.564453f, 0.347168f, 0.558105f, 0.345703f, 0.551758f,
+ 0.344727f, 0.544922f, 0.342529f, 0.538086f, 0.340820f, 0.530762f, 0.337402f, 0.522461f,
+ 0.334229f, 0.514160f, 0.329590f, 0.505371f, 0.324463f, 0.495361f, 0.318848f, 0.484863f,
+ 0.312744f, 0.472900f, 0.305664f, 0.460205f, 0.297363f, 0.445801f, 0.287598f, 0.430176f,
+ 0.276367f, 0.411865f, 0.264404f, 0.391113f, 0.249756f, 0.367432f, 0.232666f, 0.338135f,
+ 0.211670f, 0.301514f, 0.184692f, 0.255859f, 0.148438f, 0.188721f, 0.090271f, 0.070923f,
+ 0.000000f, 1.000000f, 0.023575f, 0.988281f, 0.045563f, 0.972656f, 0.066711f, 0.955566f,
+ 0.086243f, 0.938477f, 0.105103f, 0.920898f, 0.123169f, 0.903809f, 0.138916f, 0.887207f,
+ 0.154419f, 0.871094f, 0.168701f, 0.855957f, 0.182983f, 0.840332f, 0.195435f, 0.826172f,
+ 0.207397f, 0.812012f, 0.219360f, 0.798340f, 0.230347f, 0.785156f, 0.240479f, 0.772461f,
+ 0.250488f, 0.760254f, 0.259766f, 0.748535f, 0.268555f, 0.736816f, 0.275879f, 0.726074f,
+ 0.284424f, 0.715332f, 0.291504f, 0.705078f, 0.298828f, 0.694824f, 0.305908f, 0.685059f,
+ 0.310791f, 0.676270f, 0.316650f, 0.666992f, 0.323242f, 0.657715f, 0.327637f, 0.648926f,
+ 0.332275f, 0.641113f, 0.337158f, 0.633301f, 0.340576f, 0.625977f, 0.344482f, 0.618164f,
+ 0.348877f, 0.610840f, 0.351318f, 0.604004f, 0.353760f, 0.597656f, 0.356445f, 0.591309f,
+ 0.357910f, 0.585449f, 0.359619f, 0.579590f, 0.360596f, 0.573730f, 0.361328f, 0.567383f,
+ 0.362061f, 0.561035f, 0.361328f, 0.555176f, 0.361816f, 0.548828f, 0.361328f, 0.541992f,
+ 0.361084f, 0.535645f, 0.358887f, 0.527832f, 0.357666f, 0.520508f, 0.354492f, 0.512207f,
+ 0.351807f, 0.504395f, 0.347900f, 0.495117f, 0.343994f, 0.485107f, 0.340088f, 0.474854f,
+ 0.334473f, 0.462402f, 0.327637f, 0.449463f, 0.320557f, 0.435303f, 0.312012f, 0.420166f,
+ 0.301758f, 0.402100f, 0.290039f, 0.381592f, 0.276611f, 0.358398f, 0.260254f, 0.329834f,
+ 0.239746f, 0.294922f, 0.214111f, 0.250244f, 0.178711f, 0.184326f, 0.118408f, 0.069946f,
+ 0.000000f, 1.000000f, 0.023590f, 0.988281f, 0.045593f, 0.973145f, 0.066833f, 0.955566f,
+ 0.086975f, 0.937988f, 0.105957f, 0.920410f, 0.124084f, 0.903320f, 0.140015f, 0.886719f,
+ 0.155884f, 0.870605f, 0.169800f, 0.854980f, 0.184814f, 0.839355f, 0.197998f, 0.824707f,
+ 0.210327f, 0.810059f, 0.222290f, 0.796387f, 0.233887f, 0.783203f, 0.244385f, 0.770020f,
+ 0.253662f, 0.757812f, 0.263184f, 0.745605f, 0.272949f, 0.733887f, 0.281738f, 0.722168f,
+ 0.290039f, 0.710938f, 0.298340f, 0.699707f, 0.305420f, 0.689453f, 0.312256f, 0.679688f,
+ 0.318359f, 0.670410f, 0.324951f, 0.660645f, 0.330811f, 0.651855f, 0.335693f, 0.643066f,
+ 0.341064f, 0.634766f, 0.345703f, 0.626465f, 0.349121f, 0.619141f, 0.354248f, 0.611328f,
+ 0.357910f, 0.604004f, 0.362061f, 0.596191f, 0.363770f, 0.589844f, 0.366699f, 0.583496f,
+ 0.368896f, 0.577148f, 0.370850f, 0.571289f, 0.374023f, 0.564453f, 0.374756f, 0.558105f,
+ 0.376465f, 0.551758f, 0.376709f, 0.545410f, 0.376465f, 0.539062f, 0.376709f, 0.532227f,
+ 0.376709f, 0.524902f, 0.375977f, 0.517090f, 0.375244f, 0.509277f, 0.373535f, 0.501465f,
+ 0.370850f, 0.493164f, 0.368164f, 0.483643f, 0.365234f, 0.473877f, 0.359619f, 0.464111f,
+ 0.355957f, 0.451904f, 0.350342f, 0.439453f, 0.343750f, 0.425537f, 0.335693f, 0.410156f,
+ 0.327148f, 0.392334f, 0.316162f, 0.372559f, 0.303711f, 0.349121f, 0.288086f, 0.321045f,
+ 0.269043f, 0.287598f, 0.244263f, 0.244507f, 0.209106f, 0.180664f, 0.149292f, 0.068176f,
+ 0.000000f, 1.000000f, 0.023499f, 0.988281f, 0.045319f, 0.973145f, 0.067078f, 0.955078f,
+ 0.087463f, 0.937500f, 0.107056f, 0.919922f, 0.123840f, 0.903320f, 0.139893f, 0.886719f,
+ 0.156006f, 0.870117f, 0.171753f, 0.853516f, 0.186523f, 0.838379f, 0.200073f, 0.823242f,
+ 0.212891f, 0.808594f, 0.225220f, 0.793945f, 0.237061f, 0.780273f, 0.247925f, 0.767578f,
+ 0.257324f, 0.754395f, 0.269287f, 0.741211f, 0.276367f, 0.729980f, 0.287842f, 0.718262f,
+ 0.294922f, 0.707031f, 0.302979f, 0.696289f, 0.310791f, 0.685547f, 0.318848f, 0.675293f,
+ 0.325195f, 0.666016f, 0.332520f, 0.655762f, 0.336914f, 0.646973f, 0.343506f, 0.637695f,
+ 0.349365f, 0.628906f, 0.354248f, 0.620605f, 0.359131f, 0.612305f, 0.363281f, 0.604492f,
+ 0.368164f, 0.596680f, 0.371826f, 0.588867f, 0.375000f, 0.582031f, 0.379150f, 0.574707f,
+ 0.381592f, 0.567871f, 0.384521f, 0.561035f, 0.387695f, 0.554199f, 0.388916f, 0.548340f,
+ 0.390381f, 0.541504f, 0.391357f, 0.535156f, 0.392090f, 0.528320f, 0.393311f, 0.520996f,
+ 0.392822f, 0.514160f, 0.393066f, 0.506836f, 0.391602f, 0.499023f, 0.391602f, 0.490967f,
+ 0.388916f, 0.482178f, 0.387939f, 0.472900f, 0.385498f, 0.462891f, 0.381348f, 0.452393f,
+ 0.377686f, 0.441162f, 0.372803f, 0.428223f, 0.366699f, 0.414551f, 0.359619f, 0.399658f,
+ 0.352295f, 0.382324f, 0.342773f, 0.362305f, 0.330322f, 0.339600f, 0.317139f, 0.312988f,
+ 0.298096f, 0.280273f, 0.274902f, 0.236816f, 0.241821f, 0.175659f, 0.181885f, 0.066345f,
+ 0.000000f, 1.000000f, 0.023575f, 0.988281f, 0.045929f, 0.972656f, 0.067505f, 0.955078f,
+ 0.087769f, 0.937500f, 0.106750f, 0.919922f, 0.124634f, 0.902344f, 0.142212f, 0.885254f,
+ 0.158447f, 0.868652f, 0.173218f, 0.852539f, 0.187988f, 0.836914f, 0.203003f, 0.820801f,
+ 0.215820f, 0.806152f, 0.228760f, 0.791504f, 0.240479f, 0.777832f, 0.250977f, 0.764648f,
+ 0.262451f, 0.750977f, 0.272461f, 0.738770f, 0.281982f, 0.726562f, 0.291748f, 0.714355f,
+ 0.299316f, 0.703613f, 0.309082f, 0.692383f, 0.317139f, 0.681641f, 0.324707f, 0.670898f,
+ 0.331787f, 0.661133f, 0.337646f, 0.651367f, 0.344482f, 0.641602f, 0.351562f, 0.632324f,
+ 0.358154f, 0.622559f, 0.363281f, 0.613770f, 0.368896f, 0.604980f, 0.373291f, 0.597168f,
+ 0.379150f, 0.588867f, 0.382812f, 0.580566f, 0.387207f, 0.572754f, 0.390381f, 0.565918f,
+ 0.393066f, 0.559082f, 0.396729f, 0.552246f, 0.400146f, 0.545410f, 0.402832f, 0.538574f,
+ 0.404053f, 0.531738f, 0.406006f, 0.524902f, 0.407471f, 0.518066f, 0.409424f, 0.510254f,
+ 0.409424f, 0.503418f, 0.409912f, 0.496094f, 0.410156f, 0.487793f, 0.409912f, 0.479492f,
+ 0.408691f, 0.471436f, 0.407227f, 0.461914f, 0.405029f, 0.451660f, 0.403076f, 0.441162f,
+ 0.399414f, 0.430176f, 0.395264f, 0.417236f, 0.390869f, 0.403809f, 0.384033f, 0.388916f,
+ 0.378662f, 0.371826f, 0.369141f, 0.352539f, 0.358154f, 0.330078f, 0.345947f, 0.304199f,
+ 0.329102f, 0.272217f, 0.307129f, 0.230713f, 0.274658f, 0.171143f, 0.216431f, 0.064514f,
+ 0.000000f, 1.000000f, 0.023270f, 0.988770f, 0.045654f, 0.972656f, 0.067322f, 0.955566f,
+ 0.087585f, 0.937500f, 0.107178f, 0.919434f, 0.125488f, 0.901855f, 0.143433f, 0.884277f,
+ 0.160034f, 0.867676f, 0.174927f, 0.851562f, 0.190796f, 0.834473f, 0.204468f, 0.819336f,
+ 0.217651f, 0.804199f, 0.230469f, 0.790039f, 0.242798f, 0.775879f, 0.256104f, 0.761719f,
+ 0.266113f, 0.749023f, 0.276855f, 0.735840f, 0.286377f, 0.724121f, 0.296631f, 0.711426f,
+ 0.305176f, 0.699707f, 0.314209f, 0.688477f, 0.322754f, 0.677246f, 0.331055f, 0.666504f,
+ 0.338867f, 0.655762f, 0.346191f, 0.645508f, 0.353271f, 0.635254f, 0.359619f, 0.625977f,
+ 0.366943f, 0.616211f, 0.372314f, 0.606934f, 0.378662f, 0.598145f, 0.383301f, 0.589844f,
+ 0.387695f, 0.582031f, 0.393555f, 0.573242f, 0.398438f, 0.564941f, 0.401855f, 0.557617f,
+ 0.405762f, 0.549805f, 0.409912f, 0.542480f, 0.413330f, 0.535156f, 0.416016f, 0.528320f,
+ 0.418945f, 0.521973f, 0.421143f, 0.514648f, 0.423096f, 0.506836f, 0.424316f, 0.500488f,
+ 0.425293f, 0.492676f, 0.426514f, 0.485107f, 0.428467f, 0.476562f, 0.428223f, 0.468018f,
+ 0.426758f, 0.459717f, 0.426025f, 0.450439f, 0.427002f, 0.440674f, 0.425293f, 0.429688f,
+ 0.421631f, 0.418701f, 0.418457f, 0.405762f, 0.414795f, 0.392334f, 0.409668f, 0.377686f,
+ 0.403809f, 0.361084f, 0.395996f, 0.342041f, 0.386719f, 0.320312f, 0.375000f, 0.294678f,
+ 0.359375f, 0.262939f, 0.338623f, 0.223511f, 0.308105f, 0.164795f, 0.251465f, 0.062103f,
+ 0.000000f, 1.000000f, 0.023148f, 0.988770f, 0.046021f, 0.972656f, 0.067383f, 0.955566f,
+ 0.088318f, 0.937012f, 0.108032f, 0.918945f, 0.126587f, 0.901367f, 0.144409f, 0.883789f,
+ 0.161255f, 0.866211f, 0.177734f, 0.849121f, 0.191406f, 0.833984f, 0.207642f, 0.817383f,
+ 0.221191f, 0.802734f, 0.234009f, 0.788086f, 0.246826f, 0.773438f, 0.257324f, 0.760254f,
+ 0.269531f, 0.746582f, 0.280762f, 0.733398f, 0.291504f, 0.720215f, 0.301025f, 0.708008f,
+ 0.311035f, 0.695801f, 0.320557f, 0.684082f, 0.329102f, 0.672363f, 0.338135f, 0.661133f,
+ 0.346680f, 0.650391f, 0.354492f, 0.639648f, 0.361328f, 0.629883f, 0.367920f, 0.619629f,
+ 0.374756f, 0.610352f, 0.380859f, 0.600586f, 0.387695f, 0.591797f, 0.393311f, 0.582520f,
+ 0.399170f, 0.573730f, 0.405029f, 0.564453f, 0.409668f, 0.556641f, 0.414062f, 0.548340f,
+ 0.418945f, 0.540527f, 0.422607f, 0.532715f, 0.426270f, 0.525879f, 0.430420f, 0.518555f,
+ 0.433350f, 0.511230f, 0.436035f, 0.503906f, 0.438721f, 0.496094f, 0.440430f, 0.489258f,
+ 0.442627f, 0.481445f, 0.444580f, 0.473389f, 0.445312f, 0.465332f, 0.447266f, 0.456787f,
+ 0.447510f, 0.447998f, 0.446777f, 0.438721f, 0.446533f, 0.428711f, 0.445068f, 0.417725f,
+ 0.443848f, 0.406738f, 0.441650f, 0.394287f, 0.438721f, 0.381104f, 0.434570f, 0.366699f,
+ 0.429443f, 0.349854f, 0.423096f, 0.331299f, 0.413818f, 0.310547f, 0.404297f, 0.285156f,
+ 0.390869f, 0.254883f, 0.371338f, 0.215698f, 0.342773f, 0.159912f, 0.289062f, 0.060211f,
+ 0.000000f, 1.000000f, 0.023102f, 0.988770f, 0.046082f, 0.972656f, 0.067627f, 0.955078f,
+ 0.088745f, 0.937012f, 0.108459f, 0.918945f, 0.127930f, 0.899902f, 0.146362f, 0.882324f,
+ 0.163696f, 0.864746f, 0.178589f, 0.848633f, 0.195435f, 0.831543f, 0.208496f, 0.816895f,
+ 0.222290f, 0.801270f, 0.235962f, 0.786133f, 0.249146f, 0.771484f, 0.262939f, 0.756836f,
+ 0.273926f, 0.743652f, 0.284668f, 0.729980f, 0.296875f, 0.716797f, 0.306885f, 0.703613f,
+ 0.317383f, 0.691406f, 0.326660f, 0.679688f, 0.334961f, 0.667969f, 0.343750f, 0.656738f,
+ 0.352783f, 0.645996f, 0.360596f, 0.634766f, 0.369141f, 0.624023f, 0.376709f, 0.613770f,
+ 0.384033f, 0.603516f, 0.390625f, 0.593750f, 0.396973f, 0.583984f, 0.403564f, 0.574707f,
+ 0.408936f, 0.565918f, 0.414551f, 0.557129f, 0.420166f, 0.548340f, 0.426514f, 0.539551f,
+ 0.431152f, 0.531250f, 0.435791f, 0.522949f, 0.440186f, 0.515625f, 0.443359f, 0.508301f,
+ 0.447754f, 0.500488f, 0.451416f, 0.493164f, 0.454346f, 0.485352f, 0.457275f, 0.477783f,
+ 0.459961f, 0.470215f, 0.461670f, 0.461914f, 0.463379f, 0.453857f, 0.465576f, 0.445068f,
+ 0.466064f, 0.435791f, 0.466553f, 0.427002f, 0.467529f, 0.416748f, 0.467529f, 0.406738f,
+ 0.465820f, 0.395264f, 0.465332f, 0.382812f, 0.462891f, 0.369385f, 0.460205f, 0.354980f,
+ 0.455322f, 0.338379f, 0.451172f, 0.321289f, 0.442871f, 0.299561f, 0.434326f, 0.275391f,
+ 0.420898f, 0.245605f, 0.403320f, 0.208374f, 0.377441f, 0.154297f, 0.325928f, 0.058807f,
+ 0.000000f, 1.000000f, 0.022980f, 0.988770f, 0.046143f, 0.972168f, 0.068359f, 0.954590f,
+ 0.089783f, 0.936035f, 0.109497f, 0.917969f, 0.129028f, 0.898926f, 0.146606f, 0.881836f,
+ 0.164307f, 0.864258f, 0.180664f, 0.847656f, 0.196045f, 0.831543f, 0.211426f, 0.814941f,
+ 0.225586f, 0.799316f, 0.239868f, 0.784180f, 0.253174f, 0.769043f, 0.265381f, 0.754883f,
+ 0.277832f, 0.740234f, 0.289551f, 0.726562f, 0.300293f, 0.713379f, 0.311523f, 0.700684f,
+ 0.322266f, 0.687500f, 0.332031f, 0.675781f, 0.341553f, 0.663574f, 0.350586f, 0.651855f,
+ 0.360107f, 0.640137f, 0.368652f, 0.628906f, 0.377441f, 0.617676f, 0.384766f, 0.607422f,
+ 0.392090f, 0.597168f, 0.400391f, 0.586914f, 0.407471f, 0.576660f, 0.413574f, 0.567383f,
+ 0.420898f, 0.557617f, 0.426270f, 0.548340f, 0.432373f, 0.539551f, 0.437988f, 0.530762f,
+ 0.443848f, 0.521973f, 0.448730f, 0.513672f, 0.452637f, 0.505859f, 0.457275f, 0.497803f,
+ 0.462158f, 0.489746f, 0.466064f, 0.482422f, 0.470947f, 0.474854f, 0.473877f, 0.466064f,
+ 0.476074f, 0.458496f, 0.479492f, 0.450439f, 0.482422f, 0.441406f, 0.484863f, 0.433105f,
+ 0.485840f, 0.423828f, 0.487061f, 0.414551f, 0.488037f, 0.404541f, 0.488525f, 0.393799f,
+ 0.487549f, 0.382324f, 0.487793f, 0.370850f, 0.486084f, 0.357178f, 0.484375f, 0.343750f,
+ 0.480469f, 0.327393f, 0.475830f, 0.309570f, 0.471436f, 0.289551f, 0.463379f, 0.265381f,
+ 0.451904f, 0.237427f, 0.436768f, 0.200684f, 0.411865f, 0.148315f, 0.364258f, 0.057251f,
+ 0.000000f, 1.000000f, 0.023148f, 0.988770f, 0.046234f, 0.972168f, 0.068176f, 0.954590f,
+ 0.088684f, 0.937012f, 0.110352f, 0.916992f, 0.130005f, 0.898926f, 0.148071f, 0.880859f,
+ 0.166260f, 0.863281f, 0.181763f, 0.847168f, 0.197998f, 0.830078f, 0.213257f, 0.813965f,
+ 0.227783f, 0.797852f, 0.243042f, 0.781738f, 0.256592f, 0.766602f, 0.269287f, 0.751953f,
+ 0.281494f, 0.737793f, 0.293945f, 0.723633f, 0.305908f, 0.709961f, 0.317139f, 0.696777f,
+ 0.328369f, 0.683105f, 0.336914f, 0.671387f, 0.347900f, 0.658691f, 0.358154f, 0.646484f,
+ 0.367432f, 0.634766f, 0.375488f, 0.624023f, 0.384277f, 0.612305f, 0.394043f, 0.601074f,
+ 0.402100f, 0.589844f, 0.409668f, 0.579590f, 0.417236f, 0.569824f, 0.423584f, 0.560059f,
+ 0.431396f, 0.549805f, 0.437744f, 0.540039f, 0.443848f, 0.530762f, 0.450439f, 0.521973f,
+ 0.456055f, 0.512695f, 0.461426f, 0.503906f, 0.467529f, 0.495361f, 0.472412f, 0.487061f,
+ 0.477051f, 0.479004f, 0.480957f, 0.471191f, 0.485840f, 0.463135f, 0.490479f, 0.454834f,
+ 0.492676f, 0.446777f, 0.497070f, 0.437988f, 0.500000f, 0.429443f, 0.502441f, 0.420898f,
+ 0.504883f, 0.411621f, 0.507324f, 0.402588f, 0.508789f, 0.392334f, 0.510742f, 0.381348f,
+ 0.511230f, 0.370605f, 0.510254f, 0.358398f, 0.510742f, 0.345459f, 0.509766f, 0.331543f,
+ 0.507324f, 0.315918f, 0.503906f, 0.298096f, 0.499268f, 0.278809f, 0.492188f, 0.255127f,
+ 0.482422f, 0.228027f, 0.467773f, 0.192993f, 0.447754f, 0.142578f, 0.401123f, 0.054169f,
+ 0.000000f, 1.000000f, 0.023102f, 0.988770f, 0.046387f, 0.972656f, 0.068909f, 0.954102f,
+ 0.091064f, 0.935059f, 0.111694f, 0.916504f, 0.130493f, 0.898438f, 0.148438f, 0.880859f,
+ 0.165771f, 0.863281f, 0.183716f, 0.845703f, 0.199463f, 0.829102f, 0.216797f, 0.811523f,
+ 0.231079f, 0.795410f, 0.245972f, 0.779297f, 0.260254f, 0.764160f, 0.272705f, 0.749512f,
+ 0.285889f, 0.734863f, 0.298340f, 0.720703f, 0.311523f, 0.706055f, 0.322021f, 0.692871f,
+ 0.333740f, 0.679688f, 0.344482f, 0.666504f, 0.354492f, 0.654297f, 0.364502f, 0.641602f,
+ 0.373535f, 0.629395f, 0.383545f, 0.617676f, 0.393555f, 0.605957f, 0.402588f, 0.594727f,
+ 0.409912f, 0.583984f, 0.418945f, 0.572754f, 0.426025f, 0.562500f, 0.434570f, 0.551758f,
+ 0.441406f, 0.542480f, 0.449707f, 0.531738f, 0.456299f, 0.521973f, 0.462158f, 0.512695f,
+ 0.469482f, 0.503418f, 0.474854f, 0.494385f, 0.481201f, 0.485352f, 0.486328f, 0.476318f,
+ 0.492432f, 0.468018f, 0.498291f, 0.459473f, 0.501465f, 0.451416f, 0.507324f, 0.443359f,
+ 0.510254f, 0.434570f, 0.514648f, 0.426025f, 0.519043f, 0.416992f, 0.521484f, 0.408203f,
+ 0.524902f, 0.399170f, 0.527344f, 0.389404f, 0.528809f, 0.380127f, 0.532227f, 0.368896f,
+ 0.533691f, 0.357910f, 0.534668f, 0.346436f, 0.534668f, 0.333740f, 0.533691f, 0.319092f,
+ 0.532715f, 0.304443f, 0.529785f, 0.287109f, 0.526367f, 0.267822f, 0.521973f, 0.245483f,
+ 0.512695f, 0.218872f, 0.500488f, 0.184692f, 0.481445f, 0.136841f, 0.440674f, 0.052094f,
+ 0.000000f, 1.000000f, 0.022919f, 0.988770f, 0.046387f, 0.972168f, 0.069458f, 0.953613f,
+ 0.092285f, 0.934082f, 0.111755f, 0.916504f, 0.131104f, 0.898438f, 0.149414f, 0.880371f,
+ 0.167725f, 0.862305f, 0.185303f, 0.844727f, 0.203125f, 0.826660f, 0.218750f, 0.810059f,
+ 0.234253f, 0.793457f, 0.248413f, 0.777832f, 0.263916f, 0.761719f, 0.276367f, 0.747070f,
+ 0.290527f, 0.731934f, 0.303223f, 0.717285f, 0.314941f, 0.703125f, 0.327148f, 0.689453f,
+ 0.339111f, 0.675781f, 0.349609f, 0.662109f, 0.361572f, 0.648926f, 0.372070f, 0.636719f,
+ 0.382568f, 0.623535f, 0.392334f, 0.611816f, 0.400879f, 0.600586f, 0.409668f, 0.588867f,
+ 0.418945f, 0.577148f, 0.428955f, 0.565918f, 0.437012f, 0.555176f, 0.444824f, 0.544434f,
+ 0.453125f, 0.533691f, 0.460449f, 0.523438f, 0.467529f, 0.513672f, 0.475342f, 0.503418f,
+ 0.480957f, 0.494629f, 0.488281f, 0.484375f, 0.494629f, 0.475098f, 0.500488f, 0.465820f,
+ 0.507324f, 0.456787f, 0.512207f, 0.448486f, 0.518555f, 0.439453f, 0.522461f, 0.431396f,
+ 0.527832f, 0.422852f, 0.532715f, 0.413818f, 0.537109f, 0.404541f, 0.541016f, 0.395996f,
+ 0.544434f, 0.386719f, 0.547852f, 0.377441f, 0.549316f, 0.366943f, 0.553223f, 0.356445f,
+ 0.555664f, 0.345459f, 0.556641f, 0.333740f, 0.557617f, 0.320801f, 0.558105f, 0.307129f,
+ 0.557129f, 0.292969f, 0.557129f, 0.275391f, 0.555176f, 0.257324f, 0.549805f, 0.234863f,
+ 0.544434f, 0.209473f, 0.534180f, 0.175781f, 0.515625f, 0.130371f, 0.477783f, 0.049103f,
+ 0.000000f, 1.000000f, 0.023056f, 0.988770f, 0.046051f, 0.972656f, 0.070496f, 0.952637f,
+ 0.091858f, 0.934570f, 0.112366f, 0.916016f, 0.132202f, 0.897949f, 0.151123f, 0.879395f,
+ 0.169067f, 0.861328f, 0.187622f, 0.842773f, 0.203369f, 0.826172f, 0.220459f, 0.809082f,
+ 0.236206f, 0.792480f, 0.251221f, 0.775879f, 0.265381f, 0.759766f, 0.280273f, 0.744141f,
+ 0.294189f, 0.729004f, 0.306396f, 0.714355f, 0.320801f, 0.699219f, 0.331787f, 0.685547f,
+ 0.345215f, 0.671387f, 0.355957f, 0.657715f, 0.367432f, 0.644531f, 0.379150f, 0.631348f,
+ 0.389160f, 0.618652f, 0.399658f, 0.605957f, 0.409180f, 0.594238f, 0.419434f, 0.581543f,
+ 0.429688f, 0.569824f, 0.437988f, 0.558594f, 0.446533f, 0.547363f, 0.455322f, 0.536621f,
+ 0.464600f, 0.524902f, 0.470947f, 0.515137f, 0.480469f, 0.504395f, 0.487793f, 0.494385f,
+ 0.494873f, 0.484375f, 0.502441f, 0.474609f, 0.508301f, 0.464844f, 0.516113f, 0.455078f,
+ 0.521484f, 0.445801f, 0.528320f, 0.436768f, 0.533691f, 0.427734f, 0.539062f, 0.419189f,
+ 0.544922f, 0.410156f, 0.550293f, 0.401611f, 0.554688f, 0.392090f, 0.559570f, 0.382812f,
+ 0.564453f, 0.373779f, 0.567871f, 0.364014f, 0.570801f, 0.354248f, 0.574219f, 0.343750f,
+ 0.577637f, 0.332031f, 0.580078f, 0.320557f, 0.582520f, 0.308105f, 0.584473f, 0.294434f,
+ 0.583496f, 0.280273f, 0.583984f, 0.264160f, 0.583008f, 0.245483f, 0.579590f, 0.224854f,
+ 0.573242f, 0.199341f, 0.564941f, 0.168945f, 0.549805f, 0.124329f, 0.514648f, 0.047058f,
+ 0.000000f, 1.000000f, 0.023087f, 0.988770f, 0.047150f, 0.971680f, 0.070435f, 0.953125f,
+ 0.091675f, 0.935059f, 0.111877f, 0.916992f, 0.131836f, 0.897949f, 0.151978f, 0.878906f,
+ 0.170898f, 0.860352f, 0.188354f, 0.842285f, 0.206055f, 0.824707f, 0.222900f, 0.807129f,
+ 0.239746f, 0.789551f, 0.255127f, 0.773438f, 0.270020f, 0.757324f, 0.284668f, 0.741211f,
+ 0.297852f, 0.726074f, 0.312988f, 0.710938f, 0.324707f, 0.695801f, 0.338135f, 0.681152f,
+ 0.350830f, 0.666992f, 0.362305f, 0.653320f, 0.374756f, 0.639160f, 0.385254f, 0.626465f,
+ 0.397461f, 0.612793f, 0.408203f, 0.600098f, 0.419189f, 0.587891f, 0.428223f, 0.575684f,
+ 0.437256f, 0.563965f, 0.447266f, 0.551758f, 0.457031f, 0.540039f, 0.467529f, 0.528320f,
+ 0.474609f, 0.517578f, 0.483887f, 0.505859f, 0.491455f, 0.495850f, 0.500488f, 0.484863f,
+ 0.507812f, 0.474609f, 0.514160f, 0.464844f, 0.523926f, 0.453857f, 0.530273f, 0.444336f,
+ 0.537598f, 0.434570f, 0.543945f, 0.425049f, 0.550781f, 0.415771f, 0.556152f, 0.406738f,
+ 0.561523f, 0.397949f, 0.567871f, 0.388672f, 0.572754f, 0.380127f, 0.578613f, 0.369873f,
+ 0.583984f, 0.360596f, 0.587402f, 0.351318f, 0.592285f, 0.340820f, 0.595215f, 0.330566f,
+ 0.600586f, 0.319092f, 0.602051f, 0.307861f, 0.605957f, 0.295654f, 0.607910f, 0.281982f,
+ 0.610352f, 0.268555f, 0.610352f, 0.251953f, 0.608887f, 0.234253f, 0.607910f, 0.214111f,
+ 0.604004f, 0.190308f, 0.596680f, 0.159790f, 0.583984f, 0.117981f, 0.553711f, 0.044434f,
+ 0.000000f, 1.000000f, 0.023010f, 0.988770f, 0.047394f, 0.971191f, 0.070435f, 0.953125f,
+ 0.091614f, 0.935059f, 0.113525f, 0.915527f, 0.133789f, 0.896484f, 0.154419f, 0.876953f,
+ 0.171875f, 0.859375f, 0.190308f, 0.841309f, 0.208740f, 0.823242f, 0.225586f, 0.805176f,
+ 0.241821f, 0.788574f, 0.257568f, 0.771973f, 0.272705f, 0.755371f, 0.287354f, 0.738770f,
+ 0.302734f, 0.722656f, 0.316162f, 0.707520f, 0.330811f, 0.691895f, 0.342041f, 0.677734f,
+ 0.357666f, 0.662598f, 0.369385f, 0.648438f, 0.380859f, 0.634277f, 0.392822f, 0.621094f,
+ 0.404541f, 0.607422f, 0.415527f, 0.594238f, 0.427490f, 0.581055f, 0.436768f, 0.568848f,
+ 0.447510f, 0.556641f, 0.457031f, 0.544434f, 0.466309f, 0.532715f, 0.476807f, 0.520508f,
+ 0.486084f, 0.508789f, 0.495605f, 0.497803f, 0.503906f, 0.486816f, 0.511719f, 0.476074f,
+ 0.520020f, 0.465332f, 0.529297f, 0.454102f, 0.536133f, 0.444336f, 0.544434f, 0.433838f,
+ 0.552246f, 0.423340f, 0.559570f, 0.413330f, 0.567383f, 0.403809f, 0.572266f, 0.394775f,
+ 0.579102f, 0.385254f, 0.585449f, 0.375977f, 0.591309f, 0.366943f, 0.597656f, 0.357178f,
+ 0.603027f, 0.347412f, 0.607910f, 0.337891f, 0.612793f, 0.327637f, 0.617676f, 0.317139f,
+ 0.622559f, 0.305664f, 0.625977f, 0.294678f, 0.629395f, 0.282715f, 0.631836f, 0.269287f,
+ 0.633789f, 0.255859f, 0.634766f, 0.239868f, 0.637207f, 0.223389f, 0.635254f, 0.203979f,
+ 0.633301f, 0.180054f, 0.627930f, 0.151367f, 0.618164f, 0.111938f, 0.589355f, 0.042847f,
+ 0.000000f, 1.000000f, 0.022888f, 0.988770f, 0.048126f, 0.970703f, 0.070801f, 0.953125f,
+ 0.092102f, 0.935059f, 0.113831f, 0.915527f, 0.134766f, 0.895996f, 0.153564f, 0.877441f,
+ 0.174072f, 0.858398f, 0.192139f, 0.840332f, 0.211548f, 0.821289f, 0.228516f, 0.803711f,
+ 0.244995f, 0.786133f, 0.260986f, 0.769043f, 0.276123f, 0.752441f, 0.291504f, 0.736328f,
+ 0.307617f, 0.719727f, 0.321045f, 0.704102f, 0.335938f, 0.688477f, 0.349609f, 0.673340f,
+ 0.362305f, 0.658691f, 0.374756f, 0.644043f, 0.387451f, 0.629883f, 0.400879f, 0.615723f,
+ 0.413330f, 0.601562f, 0.424805f, 0.588379f, 0.436279f, 0.574707f, 0.446289f, 0.562500f,
+ 0.456299f, 0.549805f, 0.467285f, 0.537109f, 0.478516f, 0.524414f, 0.488037f, 0.512207f,
+ 0.498291f, 0.500488f, 0.506348f, 0.489258f, 0.516602f, 0.477295f, 0.524902f, 0.466553f,
+ 0.535156f, 0.455078f, 0.541992f, 0.444336f, 0.549805f, 0.433838f, 0.558594f, 0.423096f,
+ 0.567383f, 0.412354f, 0.575684f, 0.401611f, 0.582031f, 0.392090f, 0.590332f, 0.381836f,
+ 0.597168f, 0.372070f, 0.604004f, 0.362549f, 0.609375f, 0.353516f, 0.616699f, 0.343994f,
+ 0.622070f, 0.334229f, 0.627930f, 0.323975f, 0.632812f, 0.314209f, 0.638672f, 0.303467f,
+ 0.644043f, 0.292725f, 0.648438f, 0.281006f, 0.651855f, 0.269531f, 0.656738f, 0.256836f,
+ 0.659668f, 0.243530f, 0.662109f, 0.228027f, 0.663574f, 0.211792f, 0.663574f, 0.192383f,
+ 0.661621f, 0.171021f, 0.659668f, 0.143311f, 0.649414f, 0.104797f, 0.626953f, 0.040009f,
+ 0.000000f, 1.000000f, 0.022675f, 0.988770f, 0.047974f, 0.971191f, 0.070557f, 0.953613f,
+ 0.092834f, 0.934570f, 0.115173f, 0.914551f, 0.135132f, 0.895996f, 0.156006f, 0.876465f,
+ 0.175049f, 0.857910f, 0.194702f, 0.838379f, 0.212402f, 0.820312f, 0.230591f, 0.802246f,
+ 0.246704f, 0.784668f, 0.263916f, 0.767090f, 0.281006f, 0.750000f, 0.296875f, 0.732910f,
+ 0.310547f, 0.716797f, 0.326416f, 0.700684f, 0.341064f, 0.684570f, 0.354980f, 0.669434f,
+ 0.368896f, 0.653809f, 0.381348f, 0.639648f, 0.395508f, 0.624512f, 0.408203f, 0.609863f,
+ 0.420410f, 0.596191f, 0.430908f, 0.583008f, 0.442627f, 0.568848f, 0.454346f, 0.555664f,
+ 0.466797f, 0.542480f, 0.476807f, 0.529785f, 0.487793f, 0.517090f, 0.498291f, 0.504395f,
+ 0.507812f, 0.492432f, 0.519043f, 0.480225f, 0.527832f, 0.468506f, 0.539062f, 0.456543f,
+ 0.547852f, 0.445068f, 0.557129f, 0.434082f, 0.565430f, 0.422852f, 0.572266f, 0.412598f,
+ 0.581543f, 0.401611f, 0.590332f, 0.390625f, 0.598145f, 0.379883f, 0.606445f, 0.369629f,
+ 0.615234f, 0.359131f, 0.619141f, 0.350342f, 0.628418f, 0.339600f, 0.635254f, 0.330322f,
+ 0.642090f, 0.320557f, 0.647949f, 0.310547f, 0.652832f, 0.300537f, 0.659668f, 0.289795f,
+ 0.665039f, 0.279053f, 0.671387f, 0.267578f, 0.675781f, 0.255859f, 0.680176f, 0.243530f,
+ 0.684082f, 0.230225f, 0.686523f, 0.216187f, 0.690430f, 0.199951f, 0.690430f, 0.182495f,
+ 0.691895f, 0.161377f, 0.688477f, 0.134766f, 0.681641f, 0.098877f, 0.663086f, 0.038025f,
+ 0.000000f, 1.000000f, 0.023010f, 0.988770f, 0.048401f, 0.970703f, 0.071045f, 0.953125f,
+ 0.093140f, 0.934082f, 0.114502f, 0.915039f, 0.136597f, 0.895020f, 0.156372f, 0.875977f,
+ 0.177734f, 0.855957f, 0.195801f, 0.837402f, 0.214478f, 0.818848f, 0.233765f, 0.800293f,
+ 0.250000f, 0.782715f, 0.267578f, 0.764648f, 0.283447f, 0.747559f, 0.299316f, 0.730469f,
+ 0.315918f, 0.713379f, 0.330322f, 0.697266f, 0.346436f, 0.681152f, 0.359619f, 0.665527f,
+ 0.374512f, 0.649902f, 0.388184f, 0.634277f, 0.401611f, 0.619629f, 0.414307f, 0.604980f,
+ 0.427246f, 0.590332f, 0.439941f, 0.576660f, 0.451660f, 0.562500f, 0.464355f, 0.548828f,
+ 0.475586f, 0.535156f, 0.488037f, 0.521973f, 0.498047f, 0.509277f, 0.509277f, 0.496338f,
+ 0.520508f, 0.483643f, 0.530273f, 0.471436f, 0.541016f, 0.459229f, 0.550781f, 0.447266f,
+ 0.560547f, 0.435059f, 0.569824f, 0.423584f, 0.579590f, 0.412354f, 0.589355f, 0.400635f,
+ 0.598633f, 0.389648f, 0.604980f, 0.379639f, 0.615234f, 0.368164f, 0.623535f, 0.357178f,
+ 0.630859f, 0.346924f, 0.637695f, 0.336670f, 0.646484f, 0.326416f, 0.654297f, 0.316406f,
+ 0.661621f, 0.306396f, 0.669434f, 0.296387f, 0.674316f, 0.286621f, 0.681152f, 0.275635f,
+ 0.687500f, 0.264893f, 0.694336f, 0.253662f, 0.699219f, 0.242432f, 0.704590f, 0.230469f,
+ 0.708984f, 0.217407f, 0.711914f, 0.203613f, 0.715820f, 0.187866f, 0.718262f, 0.171265f,
+ 0.720215f, 0.150146f, 0.719238f, 0.125732f, 0.712402f, 0.092590f, 0.697754f, 0.035126f,
+ 0.000000f, 1.000000f, 0.023560f, 0.988281f, 0.048157f, 0.971191f, 0.070618f, 0.953613f,
+ 0.094360f, 0.933105f, 0.115234f, 0.914551f, 0.137451f, 0.894531f, 0.158447f, 0.875000f,
+ 0.177612f, 0.855957f, 0.198120f, 0.836426f, 0.217041f, 0.817383f, 0.234985f, 0.798828f,
+ 0.252930f, 0.780273f, 0.270508f, 0.762695f, 0.288086f, 0.745117f, 0.303467f, 0.728027f,
+ 0.320801f, 0.710449f, 0.336426f, 0.693359f, 0.350342f, 0.677734f, 0.365967f, 0.661133f,
+ 0.381104f, 0.645020f, 0.394775f, 0.629883f, 0.408691f, 0.614746f, 0.422852f, 0.599609f,
+ 0.435303f, 0.584961f, 0.448730f, 0.569824f, 0.461182f, 0.556152f, 0.474365f, 0.541992f,
+ 0.486328f, 0.527832f, 0.497803f, 0.514648f, 0.509766f, 0.500977f, 0.520020f, 0.488525f,
+ 0.531250f, 0.475098f, 0.542480f, 0.462646f, 0.551758f, 0.450439f, 0.563965f, 0.437256f,
+ 0.573242f, 0.425781f, 0.583984f, 0.413330f, 0.594238f, 0.401611f, 0.604492f, 0.389893f,
+ 0.612305f, 0.378662f, 0.621582f, 0.367432f, 0.629395f, 0.356689f, 0.640137f, 0.344971f,
+ 0.647949f, 0.334473f, 0.656738f, 0.323486f, 0.664062f, 0.312988f, 0.673340f, 0.302490f,
+ 0.679688f, 0.292725f, 0.688477f, 0.282227f, 0.695801f, 0.272217f, 0.702148f, 0.262207f,
+ 0.708496f, 0.251221f, 0.714844f, 0.240356f, 0.722168f, 0.228516f, 0.727051f, 0.217163f,
+ 0.732422f, 0.204590f, 0.736816f, 0.191528f, 0.742676f, 0.176270f, 0.744629f, 0.159912f,
+ 0.747559f, 0.140625f, 0.748047f, 0.117004f, 0.745117f, 0.085266f, 0.731445f, 0.031067f,
+ 0.000000f, 1.000000f, 0.023895f, 0.987793f, 0.048157f, 0.971191f, 0.071167f, 0.953125f,
+ 0.094788f, 0.933105f, 0.116272f, 0.914062f, 0.137939f, 0.894043f, 0.159424f, 0.874512f,
+ 0.180176f, 0.854492f, 0.199829f, 0.834961f, 0.219360f, 0.815918f, 0.237305f, 0.797363f,
+ 0.256348f, 0.778320f, 0.274170f, 0.760254f, 0.291504f, 0.742188f, 0.308105f, 0.724609f,
+ 0.323975f, 0.707520f, 0.342041f, 0.689941f, 0.356201f, 0.673828f, 0.372314f, 0.657227f,
+ 0.387207f, 0.640625f, 0.401123f, 0.625000f, 0.414795f, 0.609863f, 0.430420f, 0.593750f,
+ 0.444336f, 0.578613f, 0.457275f, 0.563477f, 0.470703f, 0.549316f, 0.483643f, 0.535156f,
+ 0.495605f, 0.520996f, 0.508301f, 0.506836f, 0.519531f, 0.493408f, 0.531250f, 0.479980f,
+ 0.543457f, 0.466797f, 0.553711f, 0.453613f, 0.565430f, 0.440674f, 0.576172f, 0.428223f,
+ 0.587402f, 0.415283f, 0.597656f, 0.403076f, 0.608887f, 0.391113f, 0.616211f, 0.379395f,
+ 0.628418f, 0.367188f, 0.636719f, 0.355713f, 0.646973f, 0.343994f, 0.656738f, 0.333252f,
+ 0.665527f, 0.321777f, 0.673340f, 0.310791f, 0.682617f, 0.299561f, 0.692383f, 0.288818f,
+ 0.699219f, 0.278564f, 0.707031f, 0.268311f, 0.715820f, 0.257568f, 0.723633f, 0.247803f,
+ 0.730469f, 0.237793f, 0.735840f, 0.226685f, 0.743652f, 0.215210f, 0.750000f, 0.203613f,
+ 0.756836f, 0.191528f, 0.761230f, 0.178467f, 0.766602f, 0.163940f, 0.770996f, 0.148804f,
+ 0.774902f, 0.130737f, 0.776855f, 0.108154f, 0.775391f, 0.079651f, 0.764648f, 0.028809f,
+ 0.000000f, 1.000000f, 0.024796f, 0.986816f, 0.047729f, 0.971680f, 0.071899f, 0.952148f,
+ 0.094849f, 0.933105f, 0.117432f, 0.913086f, 0.138184f, 0.894043f, 0.161255f, 0.872559f,
+ 0.180542f, 0.854004f, 0.200806f, 0.834473f, 0.221069f, 0.814941f, 0.240601f, 0.795410f,
+ 0.257568f, 0.777344f, 0.277100f, 0.758301f, 0.294678f, 0.739746f, 0.312256f, 0.721680f,
+ 0.328369f, 0.704590f, 0.346436f, 0.686523f, 0.360840f, 0.669922f, 0.377441f, 0.652832f,
+ 0.393799f, 0.635742f, 0.408203f, 0.620117f, 0.423096f, 0.604004f, 0.436768f, 0.588379f,
+ 0.452881f, 0.572266f, 0.466064f, 0.557617f, 0.479004f, 0.542480f, 0.492188f, 0.527832f,
+ 0.505371f, 0.513672f, 0.518066f, 0.499512f, 0.530273f, 0.485352f, 0.543457f, 0.471436f,
+ 0.554688f, 0.458008f, 0.565918f, 0.444580f, 0.578613f, 0.431152f, 0.589355f, 0.418213f,
+ 0.602051f, 0.405273f, 0.611328f, 0.393066f, 0.621094f, 0.380615f, 0.632324f, 0.368164f,
+ 0.643066f, 0.355713f, 0.653320f, 0.343994f, 0.663574f, 0.332275f, 0.672852f, 0.320557f,
+ 0.681641f, 0.309570f, 0.690918f, 0.298096f, 0.701660f, 0.286133f, 0.709961f, 0.275146f,
+ 0.720215f, 0.264404f, 0.727051f, 0.253906f, 0.735352f, 0.243652f, 0.743652f, 0.233032f,
+ 0.751953f, 0.222412f, 0.759277f, 0.212524f, 0.766113f, 0.200928f, 0.772949f, 0.189575f,
+ 0.780273f, 0.177856f, 0.786621f, 0.165283f, 0.791992f, 0.151611f, 0.796875f, 0.136719f,
+ 0.800781f, 0.120178f, 0.805664f, 0.099182f, 0.803711f, 0.072327f, 0.796875f, 0.026505f,
+ 0.000000f, 1.000000f, 0.025131f, 0.986816f, 0.048157f, 0.971680f, 0.071899f, 0.952637f,
+ 0.094910f, 0.933105f, 0.117920f, 0.913086f, 0.140625f, 0.892578f, 0.161743f, 0.872559f,
+ 0.184082f, 0.852051f, 0.203247f, 0.833008f, 0.223755f, 0.812988f, 0.242798f, 0.793945f,
+ 0.261475f, 0.774902f, 0.280029f, 0.755859f, 0.298340f, 0.737305f, 0.316406f, 0.718750f,
+ 0.333008f, 0.701172f, 0.351562f, 0.682617f, 0.366699f, 0.666016f, 0.384033f, 0.648438f,
+ 0.399414f, 0.631348f, 0.414795f, 0.615234f, 0.430420f, 0.598633f, 0.445068f, 0.583008f,
+ 0.460693f, 0.566895f, 0.474854f, 0.550781f, 0.489014f, 0.535645f, 0.501953f, 0.520996f,
+ 0.515625f, 0.505859f, 0.528809f, 0.491455f, 0.541992f, 0.477051f, 0.554688f, 0.462891f,
+ 0.566895f, 0.449219f, 0.580078f, 0.435303f, 0.589844f, 0.422363f, 0.601562f, 0.408691f,
+ 0.614746f, 0.395264f, 0.625488f, 0.382324f, 0.635742f, 0.370117f, 0.648438f, 0.356689f,
+ 0.658203f, 0.344727f, 0.669434f, 0.332520f, 0.679688f, 0.320068f, 0.689453f, 0.308350f,
+ 0.699707f, 0.296387f, 0.708496f, 0.284912f, 0.718262f, 0.273682f, 0.729004f, 0.261719f,
+ 0.737305f, 0.250977f, 0.747070f, 0.239624f, 0.755371f, 0.229248f, 0.763184f, 0.218506f,
+ 0.771973f, 0.208252f, 0.779297f, 0.197388f, 0.788574f, 0.186890f, 0.794922f, 0.175415f,
+ 0.803223f, 0.163696f, 0.809570f, 0.152344f, 0.816406f, 0.139282f, 0.822266f, 0.125366f,
+ 0.828613f, 0.109253f, 0.832031f, 0.091003f, 0.832520f, 0.065674f, 0.828613f, 0.024155f,
+ 0.000000f, 1.000000f, 0.024414f, 0.988281f, 0.048126f, 0.971191f, 0.072205f, 0.952637f,
+ 0.096008f, 0.932617f, 0.118042f, 0.913086f, 0.141113f, 0.892090f, 0.163208f, 0.871582f,
+ 0.184448f, 0.851562f, 0.204834f, 0.832031f, 0.225708f, 0.811523f, 0.245605f, 0.791992f,
+ 0.265381f, 0.772461f, 0.283936f, 0.753418f, 0.302246f, 0.734863f, 0.320557f, 0.715820f,
+ 0.338867f, 0.697754f, 0.354980f, 0.679688f, 0.372803f, 0.661621f, 0.390381f, 0.644043f,
+ 0.405762f, 0.627441f, 0.421631f, 0.610352f, 0.437500f, 0.593262f, 0.452881f, 0.576660f,
+ 0.468506f, 0.560547f, 0.481934f, 0.545410f, 0.496582f, 0.529785f, 0.510254f, 0.514160f,
+ 0.524902f, 0.499023f, 0.538086f, 0.484131f, 0.550781f, 0.469482f, 0.564453f, 0.454834f,
+ 0.578125f, 0.440430f, 0.592285f, 0.426025f, 0.602539f, 0.412842f, 0.615234f, 0.398926f,
+ 0.627930f, 0.385254f, 0.640137f, 0.371826f, 0.651855f, 0.358643f, 0.662109f, 0.346436f,
+ 0.674316f, 0.333008f, 0.684570f, 0.320801f, 0.695312f, 0.308594f, 0.706055f, 0.296143f,
+ 0.716309f, 0.284180f, 0.726562f, 0.272217f, 0.736816f, 0.260010f, 0.746094f, 0.249023f,
+ 0.756836f, 0.237305f, 0.766113f, 0.225952f, 0.773926f, 0.214966f, 0.784180f, 0.203613f,
+ 0.792480f, 0.192871f, 0.801758f, 0.182129f, 0.809082f, 0.171875f, 0.818848f, 0.160767f,
+ 0.826172f, 0.150269f, 0.833496f, 0.138184f, 0.841797f, 0.125977f, 0.846191f, 0.113586f,
+ 0.853027f, 0.098511f, 0.858398f, 0.081116f, 0.861328f, 0.058472f, 0.859375f, 0.022568f,
+ 0.000000f, 1.000000f, 0.024719f, 0.987793f, 0.048187f, 0.971191f, 0.072021f, 0.952637f,
+ 0.096375f, 0.932617f, 0.119019f, 0.912109f, 0.142334f, 0.891602f, 0.163452f, 0.871582f,
+ 0.185791f, 0.850586f, 0.207031f, 0.830566f, 0.228638f, 0.810059f, 0.247559f, 0.790527f,
+ 0.267822f, 0.770508f, 0.288330f, 0.750488f, 0.305420f, 0.732422f, 0.325195f, 0.712891f,
+ 0.343262f, 0.694336f, 0.361572f, 0.675781f, 0.378174f, 0.658203f, 0.395752f, 0.639648f,
+ 0.412598f, 0.622070f, 0.428711f, 0.605469f, 0.446289f, 0.587891f, 0.461182f, 0.571289f,
+ 0.476074f, 0.554688f, 0.490479f, 0.538574f, 0.505859f, 0.522461f, 0.520508f, 0.506836f,
+ 0.535156f, 0.491455f, 0.548828f, 0.476318f, 0.562500f, 0.461182f, 0.577148f, 0.446289f,
+ 0.589844f, 0.431641f, 0.603027f, 0.417236f, 0.617188f, 0.402832f, 0.629395f, 0.388916f,
+ 0.640625f, 0.375732f, 0.652344f, 0.361572f, 0.666504f, 0.347656f, 0.677734f, 0.335205f,
+ 0.687988f, 0.322266f, 0.700195f, 0.309082f, 0.711914f, 0.296143f, 0.722656f, 0.283936f,
+ 0.733398f, 0.271484f, 0.743652f, 0.259277f, 0.753418f, 0.247803f, 0.764648f, 0.235107f,
+ 0.774902f, 0.223633f, 0.783691f, 0.212646f, 0.794922f, 0.200684f, 0.804199f, 0.189453f,
+ 0.813477f, 0.177979f, 0.822266f, 0.167480f, 0.830078f, 0.156738f, 0.839844f, 0.145874f,
+ 0.847656f, 0.135620f, 0.856445f, 0.124817f, 0.863770f, 0.112671f, 0.872070f, 0.100769f,
+ 0.876953f, 0.087585f, 0.883301f, 0.071716f, 0.889648f, 0.052063f, 0.887207f, 0.019165f,
+ 0.000000f, 1.000000f, 0.024582f, 0.988281f, 0.049316f, 0.970703f, 0.073120f, 0.951660f,
+ 0.096436f, 0.932129f, 0.119263f, 0.912598f, 0.142822f, 0.891602f, 0.164917f, 0.870605f,
+ 0.187012f, 0.850098f, 0.209473f, 0.829102f, 0.229736f, 0.809082f, 0.250000f, 0.789062f,
+ 0.271240f, 0.768066f, 0.289795f, 0.749023f, 0.312012f, 0.728516f, 0.329102f, 0.709961f,
+ 0.348145f, 0.690918f, 0.365723f, 0.672363f, 0.383545f, 0.653809f, 0.401611f, 0.635742f,
+ 0.418457f, 0.617676f, 0.435059f, 0.600098f, 0.451660f, 0.583008f, 0.468262f, 0.565430f,
+ 0.484863f, 0.548340f, 0.500000f, 0.532227f, 0.515625f, 0.515625f, 0.530762f, 0.499756f,
+ 0.545410f, 0.483887f, 0.560059f, 0.468506f, 0.572754f, 0.453369f, 0.587402f, 0.437988f,
+ 0.601562f, 0.422852f, 0.614746f, 0.407959f, 0.629883f, 0.393066f, 0.643066f, 0.379150f,
+ 0.654297f, 0.365234f, 0.666504f, 0.351562f, 0.679688f, 0.337402f, 0.691895f, 0.323975f,
+ 0.705078f, 0.310303f, 0.715820f, 0.297607f, 0.728516f, 0.284180f, 0.738770f, 0.271729f,
+ 0.750000f, 0.259277f, 0.759766f, 0.247070f, 0.772461f, 0.234131f, 0.783203f, 0.222046f,
+ 0.793457f, 0.210449f, 0.803223f, 0.198486f, 0.812500f, 0.187134f, 0.821777f, 0.175903f,
+ 0.833496f, 0.163818f, 0.842285f, 0.152588f, 0.852539f, 0.141113f, 0.861816f, 0.130127f,
+ 0.871094f, 0.119629f, 0.878418f, 0.109436f, 0.887695f, 0.098511f, 0.895508f, 0.087219f,
+ 0.902832f, 0.074646f, 0.909668f, 0.061127f, 0.915527f, 0.043549f, 0.918945f, 0.016251f,
+ 0.000000f, 1.000000f, 0.024323f, 0.987793f, 0.048218f, 0.971680f, 0.073364f, 0.951660f,
+ 0.096436f, 0.932129f, 0.120911f, 0.911133f, 0.143921f, 0.890625f, 0.166504f, 0.869629f,
+ 0.189087f, 0.848633f, 0.210938f, 0.827637f, 0.232788f, 0.806641f, 0.254150f, 0.786133f,
+ 0.274414f, 0.766113f, 0.293701f, 0.746582f, 0.314209f, 0.726562f, 0.333008f, 0.707031f,
+ 0.352295f, 0.687500f, 0.370117f, 0.668945f, 0.389893f, 0.649414f, 0.407227f, 0.631348f,
+ 0.424072f, 0.613281f, 0.442627f, 0.595215f, 0.460693f, 0.577148f, 0.477783f, 0.559570f,
+ 0.493408f, 0.542480f, 0.509277f, 0.525391f, 0.525879f, 0.508789f, 0.541504f, 0.492188f,
+ 0.557129f, 0.476074f, 0.570312f, 0.460693f, 0.585449f, 0.444824f, 0.599121f, 0.429443f,
+ 0.612793f, 0.414307f, 0.627441f, 0.398682f, 0.642090f, 0.383789f, 0.655273f, 0.369141f,
+ 0.668945f, 0.354736f, 0.681641f, 0.340820f, 0.694336f, 0.326904f, 0.706543f, 0.313232f,
+ 0.719238f, 0.299561f, 0.731445f, 0.285889f, 0.743652f, 0.272705f, 0.754395f, 0.259521f,
+ 0.767578f, 0.246338f, 0.778809f, 0.233887f, 0.789551f, 0.221802f, 0.798828f, 0.209717f,
+ 0.811035f, 0.197021f, 0.823242f, 0.184082f, 0.833008f, 0.173096f, 0.842285f, 0.161499f,
+ 0.853027f, 0.149536f, 0.862793f, 0.138428f, 0.872559f, 0.127075f, 0.883301f, 0.115662f,
+ 0.891602f, 0.104858f, 0.899902f, 0.094177f, 0.909180f, 0.083374f, 0.918457f, 0.072998f,
+ 0.926270f, 0.062805f, 0.934570f, 0.049561f, 0.941406f, 0.035126f, 0.946777f, 0.013084f,
+ 0.000000f, 1.000000f, 0.022781f, 0.989258f, 0.048920f, 0.970703f, 0.073975f, 0.951172f,
+ 0.097534f, 0.931641f, 0.120605f, 0.911621f, 0.144531f, 0.890137f, 0.167358f, 0.869141f,
+ 0.190063f, 0.848145f, 0.212402f, 0.826660f, 0.234375f, 0.805664f, 0.256348f, 0.784668f,
+ 0.277100f, 0.764160f, 0.298340f, 0.743652f, 0.318359f, 0.723633f, 0.338135f, 0.703613f,
+ 0.357178f, 0.684082f, 0.376709f, 0.664551f, 0.395752f, 0.645508f, 0.415283f, 0.626465f,
+ 0.432129f, 0.607910f, 0.449951f, 0.589355f, 0.467773f, 0.571777f, 0.485107f, 0.553711f,
+ 0.501465f, 0.536133f, 0.518066f, 0.519043f, 0.534180f, 0.501953f, 0.549805f, 0.485352f,
+ 0.565918f, 0.468750f, 0.581543f, 0.452393f, 0.595703f, 0.436523f, 0.610840f, 0.420410f,
+ 0.626465f, 0.404785f, 0.641113f, 0.389404f, 0.654297f, 0.374512f, 0.667969f, 0.359619f,
+ 0.681641f, 0.344971f, 0.696289f, 0.330078f, 0.708984f, 0.315918f, 0.721191f, 0.302002f,
+ 0.734375f, 0.288086f, 0.747559f, 0.274170f, 0.758789f, 0.261230f, 0.771484f, 0.247559f,
+ 0.783691f, 0.234253f, 0.794434f, 0.221802f, 0.807617f, 0.208496f, 0.817383f, 0.196533f,
+ 0.829102f, 0.183838f, 0.840820f, 0.171631f, 0.851074f, 0.159302f, 0.861328f, 0.147705f,
+ 0.873535f, 0.135254f, 0.882324f, 0.124634f, 0.893066f, 0.112610f, 0.902832f, 0.101196f,
+ 0.911133f, 0.090698f, 0.921875f, 0.079346f, 0.933105f, 0.067505f, 0.940430f, 0.057343f,
+ 0.949707f, 0.046661f, 0.958496f, 0.036591f, 0.967285f, 0.025909f, 0.973633f, 0.009155f,
+ 0.000000f, 1.000000f, 0.023911f, 0.988281f, 0.049011f, 0.971191f, 0.074768f, 0.950684f,
+ 0.097229f, 0.932129f, 0.122131f, 0.910645f, 0.145508f, 0.889648f, 0.168213f, 0.868652f,
+ 0.191650f, 0.847168f, 0.214478f, 0.825684f, 0.236694f, 0.804199f, 0.258789f, 0.783203f,
+ 0.280518f, 0.762207f, 0.300781f, 0.741699f, 0.321533f, 0.721191f, 0.342529f, 0.700684f,
+ 0.361572f, 0.680664f, 0.380859f, 0.661621f, 0.401123f, 0.641602f, 0.420898f, 0.622070f,
+ 0.438477f, 0.603027f, 0.456543f, 0.584473f, 0.474365f, 0.566406f, 0.491699f, 0.548340f,
+ 0.509277f, 0.530273f, 0.526855f, 0.512207f, 0.543457f, 0.495117f, 0.559570f, 0.478027f,
+ 0.575684f, 0.461182f, 0.591797f, 0.444336f, 0.607422f, 0.427979f, 0.623047f, 0.411621f,
+ 0.638672f, 0.395752f, 0.653320f, 0.380371f, 0.667480f, 0.364990f, 0.681152f, 0.349854f,
+ 0.695312f, 0.334961f, 0.708496f, 0.320312f, 0.721191f, 0.305664f, 0.736328f, 0.290771f,
+ 0.750488f, 0.276367f, 0.763184f, 0.262939f, 0.774414f, 0.249878f, 0.786133f, 0.235962f,
+ 0.799805f, 0.221924f, 0.813965f, 0.208618f, 0.822754f, 0.197144f, 0.834473f, 0.183716f,
+ 0.847656f, 0.170288f, 0.860352f, 0.158081f, 0.868164f, 0.146606f, 0.880859f, 0.133667f,
+ 0.892578f, 0.121765f, 0.901367f, 0.110657f, 0.912598f, 0.098450f, 0.922363f, 0.087585f,
+ 0.933105f, 0.075806f, 0.942871f, 0.064697f, 0.952637f, 0.053192f, 0.963379f, 0.042450f,
+ 0.968262f, 0.033875f, 0.983887f, 0.018707f, 0.988281f, 0.013397f, 0.999512f, 0.000030f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998047f,
+ 0.000000f, 0.996582f, 0.000000f, 0.994629f, 0.000000f, 0.992188f, 0.000000f, 0.990723f,
+ 0.000000f, 0.988281f, 0.000000f, 0.985840f, 0.000000f, 0.982910f, 0.000000f, 0.979980f,
+ 0.000000f, 0.977051f, 0.000000f, 0.973145f, 0.000000f, 0.969727f, 0.000000f, 0.965332f,
+ 0.000000f, 0.961426f, 0.000000f, 0.957031f, 0.000000f, 0.952148f, 0.000000f, 0.947266f,
+ 0.000000f, 0.941895f, 0.000000f, 0.936523f, 0.000000f, 0.931152f, 0.000000f, 0.925293f,
+ 0.000000f, 0.918945f, 0.000000f, 0.912109f, 0.000000f, 0.905762f, 0.000000f, 0.898926f,
+ 0.000000f, 0.891602f, 0.000000f, 0.884277f, 0.000000f, 0.875977f, 0.000000f, 0.867676f,
+ 0.000000f, 0.859375f, 0.000000f, 0.850098f, 0.000000f, 0.841309f, 0.000000f, 0.831543f,
+ 0.000000f, 0.821289f, 0.000000f, 0.810059f, 0.000000f, 0.799316f, 0.000000f, 0.787598f,
+ 0.000000f, 0.775879f, 0.000000f, 0.764160f, 0.000000f, 0.750488f, 0.000000f, 0.736816f,
+ 0.000000f, 0.722656f, 0.000000f, 0.707520f, 0.000000f, 0.691895f, 0.000000f, 0.675781f,
+ 0.000000f, 0.658203f, 0.000000f, 0.639160f, 0.000000f, 0.620117f, 0.000000f, 0.599609f,
+ 0.000000f, 0.578613f, 0.000000f, 0.554199f, 0.000000f, 0.528809f, 0.000000f, 0.502441f,
+ 0.000000f, 0.474121f, 0.000000f, 0.441162f, 0.000000f, 0.404785f, 0.000000f, 0.365234f,
+ 0.000000f, 0.317871f, 0.000000f, 0.261230f, 0.000000f, 0.186401f, 0.000000f, 0.073303f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f,
+ 0.000000f, 0.996582f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.991211f,
+ 0.000000f, 0.988770f, 0.000000f, 0.985840f, 0.000000f, 0.982910f, 0.000000f, 0.979492f,
+ 0.000000f, 0.976562f, 0.000000f, 0.972656f, 0.000000f, 0.968750f, 0.000000f, 0.964844f,
+ 0.000000f, 0.960938f, 0.000000f, 0.957031f, 0.000000f, 0.952148f, 0.000000f, 0.946777f,
+ 0.000000f, 0.941895f, 0.000000f, 0.936035f, 0.000000f, 0.930664f, 0.000000f, 0.925293f,
+ 0.000000f, 0.918457f, 0.000000f, 0.912109f, 0.000000f, 0.905273f, 0.000000f, 0.898438f,
+ 0.000000f, 0.891602f, 0.000000f, 0.884277f, 0.000000f, 0.875488f, 0.000000f, 0.867188f,
+ 0.000000f, 0.858398f, 0.000000f, 0.849609f, 0.000000f, 0.840820f, 0.000000f, 0.831055f,
+ 0.000000f, 0.820801f, 0.000000f, 0.810059f, 0.000000f, 0.798828f, 0.000000f, 0.787598f,
+ 0.000000f, 0.775879f, 0.000000f, 0.763672f, 0.000000f, 0.750488f, 0.000000f, 0.736816f,
+ 0.000002f, 0.722168f, 0.000004f, 0.707031f, 0.000006f, 0.691895f, 0.000009f, 0.675781f,
+ 0.000011f, 0.658203f, 0.000012f, 0.639648f, 0.000012f, 0.620117f, 0.000011f, 0.599609f,
+ 0.000010f, 0.578613f, 0.000010f, 0.554199f, 0.000009f, 0.528809f, 0.000008f, 0.502441f,
+ 0.000007f, 0.474854f, 0.000008f, 0.440918f, 0.000006f, 0.404541f, 0.000006f, 0.366455f,
+ 0.000005f, 0.318359f, 0.000004f, 0.260986f, 0.000003f, 0.187012f, 0.000001f, 0.073303f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f,
+ 0.000000f, 0.995605f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.990723f,
+ 0.000000f, 0.988281f, 0.000000f, 0.985352f, 0.000000f, 0.982422f, 0.000000f, 0.979492f,
+ 0.000000f, 0.976074f, 0.000002f, 0.972656f, 0.000008f, 0.968750f, 0.000013f, 0.964844f,
+ 0.000019f, 0.960449f, 0.000026f, 0.956055f, 0.000032f, 0.951172f, 0.000040f, 0.946289f,
+ 0.000046f, 0.941406f, 0.000052f, 0.935547f, 0.000059f, 0.930176f, 0.000066f, 0.924316f,
+ 0.000073f, 0.918457f, 0.000078f, 0.911621f, 0.000085f, 0.904785f, 0.000091f, 0.897949f,
+ 0.000098f, 0.891113f, 0.000103f, 0.883301f, 0.000108f, 0.875488f, 0.000111f, 0.866699f,
+ 0.000111f, 0.858398f, 0.000110f, 0.849609f, 0.000107f, 0.840332f, 0.000103f, 0.831055f,
+ 0.000101f, 0.820312f, 0.000097f, 0.809570f, 0.000093f, 0.798340f, 0.000091f, 0.787109f,
+ 0.000090f, 0.775879f, 0.000091f, 0.763672f, 0.000090f, 0.750000f, 0.000091f, 0.736328f,
+ 0.000092f, 0.721680f, 0.000092f, 0.707031f, 0.000090f, 0.691895f, 0.000084f, 0.675293f,
+ 0.000082f, 0.657227f, 0.000081f, 0.639160f, 0.000082f, 0.619629f, 0.000080f, 0.599609f,
+ 0.000072f, 0.578613f, 0.000071f, 0.553711f, 0.000067f, 0.528809f, 0.000068f, 0.501953f,
+ 0.000064f, 0.474365f, 0.000054f, 0.440674f, 0.000052f, 0.404541f, 0.000049f, 0.365967f,
+ 0.000036f, 0.318604f, 0.000032f, 0.260742f, 0.000020f, 0.186768f, 0.000005f, 0.073242f,
+ 0.000000f, 1.000000f, 0.000043f, 0.999512f, 0.000081f, 0.998535f, 0.000108f, 0.997070f,
+ 0.000124f, 0.995605f, 0.000155f, 0.993652f, 0.000170f, 0.991699f, 0.000178f, 0.989746f,
+ 0.000201f, 0.987305f, 0.000216f, 0.984375f, 0.000226f, 0.981445f, 0.000232f, 0.979004f,
+ 0.000245f, 0.975586f, 0.000261f, 0.972168f, 0.000270f, 0.967773f, 0.000276f, 0.963867f,
+ 0.000280f, 0.959961f, 0.000290f, 0.955078f, 0.000303f, 0.950195f, 0.000311f, 0.945312f,
+ 0.000319f, 0.940430f, 0.000324f, 0.935059f, 0.000323f, 0.929688f, 0.000330f, 0.923340f,
+ 0.000333f, 0.916992f, 0.000335f, 0.910645f, 0.000334f, 0.903809f, 0.000332f, 0.896973f,
+ 0.000332f, 0.890137f, 0.000340f, 0.882324f, 0.000335f, 0.874023f, 0.000337f, 0.865723f,
+ 0.000339f, 0.856934f, 0.000343f, 0.848145f, 0.000347f, 0.839355f, 0.000354f, 0.830078f,
+ 0.000346f, 0.819336f, 0.000346f, 0.808594f, 0.000344f, 0.797363f, 0.000340f, 0.786133f,
+ 0.000340f, 0.774902f, 0.000347f, 0.762695f, 0.000331f, 0.749023f, 0.000326f, 0.734863f,
+ 0.000325f, 0.721191f, 0.000322f, 0.706055f, 0.000317f, 0.691406f, 0.000297f, 0.674805f,
+ 0.000297f, 0.656738f, 0.000291f, 0.638672f, 0.000285f, 0.619141f, 0.000276f, 0.599609f,
+ 0.000257f, 0.577637f, 0.000249f, 0.553711f, 0.000239f, 0.528320f, 0.000229f, 0.501953f,
+ 0.000222f, 0.474121f, 0.000192f, 0.440430f, 0.000177f, 0.404541f, 0.000162f, 0.366211f,
+ 0.000131f, 0.317627f, 0.000109f, 0.260498f, 0.000069f, 0.186401f, 0.000016f, 0.072571f,
+ 0.000000f, 1.000000f, 0.000240f, 0.999023f, 0.000381f, 0.998047f, 0.000352f, 0.997070f,
+ 0.000453f, 0.995117f, 0.000445f, 0.993164f, 0.000432f, 0.991211f, 0.000427f, 0.989258f,
+ 0.000529f, 0.986328f, 0.000539f, 0.983398f, 0.000548f, 0.980469f, 0.000558f, 0.977539f,
+ 0.000641f, 0.974121f, 0.000657f, 0.970215f, 0.000670f, 0.966309f, 0.000674f, 0.962891f,
+ 0.000666f, 0.958496f, 0.000720f, 0.953613f, 0.000724f, 0.948730f, 0.000719f, 0.943848f,
+ 0.000719f, 0.938965f, 0.000719f, 0.933594f, 0.000724f, 0.928223f, 0.000784f, 0.921875f,
+ 0.000794f, 0.915527f, 0.000779f, 0.909180f, 0.000781f, 0.902344f, 0.000791f, 0.895508f,
+ 0.000794f, 0.888672f, 0.000840f, 0.880859f, 0.000815f, 0.872559f, 0.000814f, 0.864258f,
+ 0.000812f, 0.855957f, 0.000812f, 0.847168f, 0.000815f, 0.838379f, 0.000852f, 0.828613f,
+ 0.000819f, 0.817871f, 0.000807f, 0.807617f, 0.000807f, 0.796875f, 0.000807f, 0.785645f,
+ 0.000801f, 0.773926f, 0.000828f, 0.761230f, 0.000789f, 0.748047f, 0.000767f, 0.734375f,
+ 0.000766f, 0.720215f, 0.000756f, 0.705566f, 0.000741f, 0.690918f, 0.000760f, 0.673828f,
+ 0.000701f, 0.656250f, 0.000685f, 0.637695f, 0.000669f, 0.618652f, 0.000653f, 0.599121f,
+ 0.000625f, 0.577148f, 0.000587f, 0.553223f, 0.000565f, 0.527832f, 0.000539f, 0.501465f,
+ 0.000528f, 0.473877f, 0.000452f, 0.439697f, 0.000420f, 0.403809f, 0.000381f, 0.365967f,
+ 0.000308f, 0.317871f, 0.000253f, 0.260742f, 0.000157f, 0.186401f, 0.000031f, 0.072388f,
+ 0.000000f, 1.000000f, 0.000383f, 0.999023f, 0.000658f, 0.997559f, 0.000662f, 0.996094f,
+ 0.000860f, 0.994629f, 0.000876f, 0.992188f, 0.000875f, 0.990234f, 0.000867f, 0.988770f,
+ 0.001044f, 0.984863f, 0.001068f, 0.982422f, 0.001084f, 0.979492f, 0.001096f, 0.976562f,
+ 0.001233f, 0.972656f, 0.001249f, 0.969238f, 0.001255f, 0.965332f, 0.001245f, 0.961426f,
+ 0.001245f, 0.957520f, 0.001364f, 0.952148f, 0.001392f, 0.947266f, 0.001414f, 0.942383f,
+ 0.001401f, 0.937012f, 0.001410f, 0.932129f, 0.001413f, 0.926758f, 0.001525f, 0.919922f,
+ 0.001539f, 0.913574f, 0.001513f, 0.907227f, 0.001514f, 0.900879f, 0.001509f, 0.894043f,
+ 0.001519f, 0.887207f, 0.001614f, 0.878906f, 0.001627f, 0.871094f, 0.001584f, 0.862793f,
+ 0.001567f, 0.854004f, 0.001572f, 0.845703f, 0.001568f, 0.836914f, 0.001637f, 0.826660f,
+ 0.001644f, 0.816895f, 0.001596f, 0.806152f, 0.001570f, 0.794922f, 0.001554f, 0.784180f,
+ 0.001540f, 0.772949f, 0.001595f, 0.760254f, 0.001542f, 0.746582f, 0.001506f, 0.733398f,
+ 0.001476f, 0.719238f, 0.001456f, 0.704590f, 0.001433f, 0.689941f, 0.001471f, 0.672852f,
+ 0.001373f, 0.655273f, 0.001327f, 0.636719f, 0.001291f, 0.618164f, 0.001261f, 0.598633f,
+ 0.001273f, 0.576660f, 0.001151f, 0.552734f, 0.001091f, 0.527344f, 0.001044f, 0.501465f,
+ 0.001024f, 0.473145f, 0.000885f, 0.439453f, 0.000810f, 0.404053f, 0.000731f, 0.365967f,
+ 0.000594f, 0.317139f, 0.000479f, 0.260986f, 0.000290f, 0.185913f, 0.000055f, 0.072205f,
+ 0.000000f, 1.000000f, 0.000665f, 0.998535f, 0.001108f, 0.997070f, 0.001078f, 0.995605f,
+ 0.001183f, 0.993652f, 0.001465f, 0.991699f, 0.001467f, 0.989746f, 0.001527f, 0.987305f,
+ 0.001788f, 0.983887f, 0.001810f, 0.980469f, 0.001819f, 0.978027f, 0.001825f, 0.975098f,
+ 0.002068f, 0.970703f, 0.002083f, 0.966797f, 0.002113f, 0.963379f, 0.002136f, 0.959473f,
+ 0.002121f, 0.955566f, 0.002344f, 0.950195f, 0.002380f, 0.944824f, 0.002407f, 0.940430f,
+ 0.002377f, 0.935059f, 0.002382f, 0.929688f, 0.002417f, 0.924316f, 0.002584f, 0.917969f,
+ 0.002621f, 0.911621f, 0.002634f, 0.905273f, 0.002584f, 0.898926f, 0.002573f, 0.892090f,
+ 0.002617f, 0.885254f, 0.002737f, 0.876953f, 0.002756f, 0.869141f, 0.002714f, 0.860352f,
+ 0.002716f, 0.852539f, 0.002682f, 0.843750f, 0.002665f, 0.835449f, 0.002785f, 0.824707f,
+ 0.002800f, 0.814453f, 0.002737f, 0.803711f, 0.002689f, 0.792969f, 0.002657f, 0.782715f,
+ 0.002623f, 0.771484f, 0.002718f, 0.758301f, 0.002647f, 0.745117f, 0.002590f, 0.731445f,
+ 0.002539f, 0.717773f, 0.002491f, 0.703613f, 0.002455f, 0.688477f, 0.002506f, 0.671387f,
+ 0.002419f, 0.653809f, 0.002304f, 0.635742f, 0.002209f, 0.617188f, 0.002146f, 0.597656f,
+ 0.002169f, 0.575195f, 0.002022f, 0.551758f, 0.001869f, 0.527344f, 0.001777f, 0.501465f,
+ 0.001743f, 0.472412f, 0.001549f, 0.439209f, 0.001372f, 0.403809f, 0.001231f, 0.366211f,
+ 0.001015f, 0.317627f, 0.000793f, 0.261230f, 0.000472f, 0.185547f, 0.000089f, 0.071411f,
+ 0.000000f, 1.000000f, 0.000511f, 0.998535f, 0.001285f, 0.997070f, 0.001654f, 0.995117f,
+ 0.001899f, 0.992676f, 0.002253f, 0.990234f, 0.002249f, 0.988281f, 0.002424f, 0.985352f,
+ 0.002768f, 0.982422f, 0.002787f, 0.979492f, 0.002794f, 0.976562f, 0.002808f, 0.974121f,
+ 0.003235f, 0.968750f, 0.003250f, 0.964844f, 0.003298f, 0.960938f, 0.003326f, 0.957031f,
+ 0.003334f, 0.953125f, 0.003654f, 0.947754f, 0.003704f, 0.942871f, 0.003731f, 0.937988f,
+ 0.003765f, 0.933105f, 0.003729f, 0.927734f, 0.003851f, 0.921875f, 0.004032f, 0.915039f,
+ 0.004082f, 0.909180f, 0.004101f, 0.902832f, 0.004047f, 0.895996f, 0.004066f, 0.889648f,
+ 0.004128f, 0.882324f, 0.004284f, 0.874023f, 0.004318f, 0.866211f, 0.004318f, 0.857910f,
+ 0.004253f, 0.849609f, 0.004208f, 0.841797f, 0.004238f, 0.832520f, 0.004372f, 0.822266f,
+ 0.004372f, 0.812500f, 0.004295f, 0.801758f, 0.004227f, 0.791016f, 0.004211f, 0.780762f,
+ 0.004169f, 0.769043f, 0.004265f, 0.755859f, 0.004242f, 0.743164f, 0.004139f, 0.729492f,
+ 0.004044f, 0.716309f, 0.003922f, 0.702148f, 0.003960f, 0.686523f, 0.003929f, 0.669922f,
+ 0.003799f, 0.652344f, 0.003635f, 0.634766f, 0.003494f, 0.616211f, 0.003368f, 0.597168f,
+ 0.003389f, 0.574219f, 0.003183f, 0.550293f, 0.002970f, 0.525879f, 0.002785f, 0.500977f,
+ 0.002716f, 0.471680f, 0.002438f, 0.438965f, 0.002150f, 0.403564f, 0.001896f, 0.366211f,
+ 0.001602f, 0.316895f, 0.001202f, 0.261475f, 0.000722f, 0.185059f, 0.000137f, 0.071045f,
+ 0.000000f, 1.000000f, 0.000868f, 0.998535f, 0.001947f, 0.996094f, 0.002363f, 0.994629f,
+ 0.002825f, 0.991211f, 0.003231f, 0.988770f, 0.003258f, 0.986816f, 0.003414f, 0.984375f,
+ 0.003702f, 0.980469f, 0.004047f, 0.977051f, 0.004097f, 0.974609f, 0.004158f, 0.971191f,
+ 0.004467f, 0.966797f, 0.004810f, 0.962891f, 0.004799f, 0.958496f, 0.004841f, 0.955078f,
+ 0.004944f, 0.950684f, 0.005356f, 0.944824f, 0.005440f, 0.939941f, 0.005493f, 0.935059f,
+ 0.005497f, 0.930176f, 0.005550f, 0.925293f, 0.005707f, 0.918457f, 0.005974f, 0.912109f,
+ 0.005993f, 0.905762f, 0.006039f, 0.899902f, 0.006046f, 0.893555f, 0.005966f, 0.887207f,
+ 0.006180f, 0.879395f, 0.006344f, 0.871094f, 0.006348f, 0.863281f, 0.006348f, 0.855469f,
+ 0.006279f, 0.847168f, 0.006264f, 0.839355f, 0.006348f, 0.829590f, 0.006474f, 0.819336f,
+ 0.006462f, 0.809570f, 0.006344f, 0.799316f, 0.006317f, 0.789062f, 0.006210f, 0.778320f,
+ 0.006241f, 0.766602f, 0.006332f, 0.753418f, 0.006252f, 0.740723f, 0.006111f, 0.727051f,
+ 0.005966f, 0.714355f, 0.005840f, 0.700684f, 0.005886f, 0.684570f, 0.005795f, 0.667969f,
+ 0.005604f, 0.650879f, 0.005424f, 0.633301f, 0.005203f, 0.614746f, 0.005043f, 0.595215f,
+ 0.005001f, 0.572754f, 0.004692f, 0.549805f, 0.004417f, 0.525391f, 0.004093f, 0.500000f,
+ 0.003971f, 0.470459f, 0.003572f, 0.438232f, 0.003149f, 0.403320f, 0.002739f, 0.366699f,
+ 0.002323f, 0.316162f, 0.001709f, 0.261475f, 0.001044f, 0.185669f, 0.000188f, 0.070312f,
+ 0.000000f, 1.000000f, 0.001301f, 0.998535f, 0.001880f, 0.996094f, 0.002771f, 0.993652f,
+ 0.003651f, 0.990234f, 0.004047f, 0.987793f, 0.004498f, 0.985352f, 0.004833f, 0.981934f,
+ 0.005249f, 0.978516f, 0.005646f, 0.975098f, 0.005669f, 0.972168f, 0.005970f, 0.968262f,
+ 0.006287f, 0.963867f, 0.006695f, 0.959473f, 0.006775f, 0.956055f, 0.006760f, 0.951660f,
+ 0.007030f, 0.947266f, 0.007313f, 0.941895f, 0.007607f, 0.936523f, 0.007675f, 0.931641f,
+ 0.007744f, 0.926758f, 0.007744f, 0.922363f, 0.008095f, 0.915527f, 0.008392f, 0.908691f,
+ 0.008453f, 0.902832f, 0.008469f, 0.896484f, 0.008507f, 0.890625f, 0.008392f, 0.884277f,
+ 0.008728f, 0.875488f, 0.008919f, 0.867676f, 0.008980f, 0.859863f, 0.008949f, 0.852051f,
+ 0.008820f, 0.844238f, 0.008789f, 0.836426f, 0.008965f, 0.826172f, 0.009178f, 0.816406f,
+ 0.009132f, 0.806152f, 0.009079f, 0.796387f, 0.008911f, 0.786133f, 0.008759f, 0.776367f,
+ 0.008827f, 0.763672f, 0.008911f, 0.750488f, 0.008835f, 0.738281f, 0.008629f, 0.725098f,
+ 0.008408f, 0.712402f, 0.008224f, 0.698730f, 0.008354f, 0.682617f, 0.008179f, 0.666016f,
+ 0.007904f, 0.648926f, 0.007645f, 0.631348f, 0.007317f, 0.613770f, 0.007168f, 0.593750f,
+ 0.007042f, 0.571289f, 0.006683f, 0.548828f, 0.006203f, 0.524902f, 0.005756f, 0.500000f,
+ 0.005562f, 0.469727f, 0.005039f, 0.437256f, 0.004406f, 0.403320f, 0.003811f, 0.366211f,
+ 0.003242f, 0.316406f, 0.002337f, 0.261475f, 0.001417f, 0.185059f, 0.000250f, 0.069946f,
+ 0.000000f, 1.000000f, 0.001305f, 0.998535f, 0.002796f, 0.995605f, 0.003759f, 0.993164f,
+ 0.004532f, 0.989258f, 0.005486f, 0.986328f, 0.005547f, 0.983887f, 0.006359f, 0.979492f,
+ 0.007092f, 0.976074f, 0.007229f, 0.973145f, 0.007645f, 0.969727f, 0.007950f, 0.965332f,
+ 0.008621f, 0.960449f, 0.009010f, 0.956543f, 0.009109f, 0.952637f, 0.009224f, 0.949219f,
+ 0.009575f, 0.943359f, 0.010010f, 0.938477f, 0.010345f, 0.933105f, 0.010384f, 0.928223f,
+ 0.010475f, 0.923340f, 0.010666f, 0.918457f, 0.011108f, 0.911133f, 0.011414f, 0.904785f,
+ 0.011459f, 0.898926f, 0.011513f, 0.893066f, 0.011513f, 0.886719f, 0.011612f, 0.879883f,
+ 0.011932f, 0.871582f, 0.012199f, 0.863770f, 0.012169f, 0.856445f, 0.012184f, 0.848633f,
+ 0.012146f, 0.841309f, 0.011993f, 0.833008f, 0.012367f, 0.822754f, 0.012474f, 0.812988f,
+ 0.012390f, 0.803223f, 0.012299f, 0.792969f, 0.012085f, 0.783203f, 0.011978f, 0.773438f,
+ 0.012169f, 0.760742f, 0.012199f, 0.747559f, 0.012032f, 0.735352f, 0.011703f, 0.722656f,
+ 0.011536f, 0.709961f, 0.011276f, 0.697266f, 0.011368f, 0.679688f, 0.011154f, 0.663574f,
+ 0.010765f, 0.646973f, 0.010376f, 0.629883f, 0.010002f, 0.612793f, 0.009781f, 0.592285f,
+ 0.009514f, 0.569824f, 0.009041f, 0.547363f, 0.008453f, 0.524414f, 0.007805f, 0.499756f,
+ 0.007500f, 0.468506f, 0.006767f, 0.436523f, 0.005943f, 0.402588f, 0.005157f, 0.365234f,
+ 0.004299f, 0.315430f, 0.003090f, 0.261719f, 0.001874f, 0.184937f, 0.000340f, 0.069336f,
+ 0.000000f, 1.000000f, 0.001388f, 0.998047f, 0.002949f, 0.995117f, 0.003960f, 0.992676f,
+ 0.005760f, 0.987793f, 0.006760f, 0.984863f, 0.007267f, 0.981934f, 0.008400f, 0.977539f,
+ 0.008934f, 0.973633f, 0.009468f, 0.970215f, 0.009995f, 0.967285f, 0.010574f, 0.962402f,
+ 0.011307f, 0.957031f, 0.011543f, 0.953613f, 0.011986f, 0.949219f, 0.012039f, 0.945312f,
+ 0.012878f, 0.939941f, 0.013222f, 0.934082f, 0.013702f, 0.929688f, 0.013824f, 0.924805f,
+ 0.013779f, 0.919922f, 0.014191f, 0.913574f, 0.014801f, 0.907227f, 0.014854f, 0.900879f,
+ 0.015144f, 0.894531f, 0.015190f, 0.888672f, 0.015099f, 0.882812f, 0.015526f, 0.875488f,
+ 0.015915f, 0.867676f, 0.016144f, 0.859863f, 0.016144f, 0.852539f, 0.016068f, 0.844727f,
+ 0.015961f, 0.837402f, 0.016113f, 0.828613f, 0.016434f, 0.818359f, 0.016525f, 0.808594f,
+ 0.016479f, 0.799316f, 0.016281f, 0.790039f, 0.016129f, 0.780273f, 0.016037f, 0.769531f,
+ 0.016159f, 0.756836f, 0.016113f, 0.744629f, 0.015869f, 0.732422f, 0.015640f, 0.720215f,
+ 0.015244f, 0.707520f, 0.014992f, 0.693359f, 0.015114f, 0.676758f, 0.014694f, 0.660645f,
+ 0.014343f, 0.645020f, 0.013794f, 0.628418f, 0.013161f, 0.611328f, 0.012917f, 0.589355f,
+ 0.012550f, 0.567871f, 0.011826f, 0.545410f, 0.011040f, 0.522949f, 0.010208f, 0.499268f,
+ 0.009827f, 0.467041f, 0.008827f, 0.436035f, 0.007713f, 0.402832f, 0.006733f, 0.363525f,
+ 0.005547f, 0.315430f, 0.003967f, 0.261475f, 0.002380f, 0.184937f, 0.000430f, 0.068237f,
+ 0.000000f, 1.000000f, 0.001554f, 0.998047f, 0.003771f, 0.994141f, 0.005260f, 0.991211f,
+ 0.006737f, 0.986816f, 0.008194f, 0.983398f, 0.009239f, 0.979980f, 0.010109f, 0.975586f,
+ 0.011467f, 0.970703f, 0.012070f, 0.967285f, 0.012260f, 0.964355f, 0.013695f, 0.958984f,
+ 0.014343f, 0.954102f, 0.014755f, 0.949707f, 0.014999f, 0.945801f, 0.015686f, 0.941406f,
+ 0.016403f, 0.935059f, 0.017197f, 0.930176f, 0.017258f, 0.925293f, 0.017776f, 0.920410f,
+ 0.017960f, 0.916016f, 0.018463f, 0.908691f, 0.018951f, 0.902344f, 0.019348f, 0.896484f,
+ 0.019699f, 0.890137f, 0.019699f, 0.884766f, 0.019653f, 0.878906f, 0.020340f, 0.870117f,
+ 0.020752f, 0.862793f, 0.020828f, 0.854980f, 0.020935f, 0.847656f, 0.020737f, 0.840820f,
+ 0.020737f, 0.833496f, 0.021194f, 0.823242f, 0.021225f, 0.813965f, 0.021484f, 0.804688f,
+ 0.021271f, 0.795410f, 0.021011f, 0.786133f, 0.020889f, 0.776855f, 0.020905f, 0.765137f,
+ 0.021057f, 0.752930f, 0.020874f, 0.741211f, 0.020584f, 0.729004f, 0.020233f, 0.717773f,
+ 0.019592f, 0.705078f, 0.019577f, 0.689941f, 0.019516f, 0.673828f, 0.019012f, 0.658203f,
+ 0.018417f, 0.642578f, 0.017761f, 0.626953f, 0.016922f, 0.609375f, 0.016739f, 0.587402f,
+ 0.016174f, 0.565918f, 0.015182f, 0.543945f, 0.014122f, 0.522461f, 0.013283f, 0.497070f,
+ 0.012520f, 0.465820f, 0.011261f, 0.435303f, 0.009857f, 0.403076f, 0.008575f, 0.362793f,
+ 0.007057f, 0.315186f, 0.004986f, 0.262207f, 0.002995f, 0.185425f, 0.000528f, 0.067444f,
+ 0.000000f, 1.000000f, 0.002249f, 0.997559f, 0.004627f, 0.993652f, 0.005775f, 0.991211f,
+ 0.008293f, 0.985840f, 0.009468f, 0.981934f, 0.010590f, 0.979004f, 0.012863f, 0.972656f,
+ 0.013573f, 0.968262f, 0.014664f, 0.964844f, 0.015450f, 0.960449f, 0.016556f, 0.955078f,
+ 0.017975f, 0.950195f, 0.018661f, 0.946289f, 0.018860f, 0.942383f, 0.019928f, 0.936523f,
+ 0.020767f, 0.930664f, 0.021362f, 0.925781f, 0.021942f, 0.920410f, 0.022369f, 0.916016f,
+ 0.022751f, 0.910156f, 0.023743f, 0.903809f, 0.024002f, 0.896973f, 0.024597f, 0.891602f,
+ 0.025009f, 0.885742f, 0.024994f, 0.880371f, 0.025375f, 0.873047f, 0.026062f, 0.865234f,
+ 0.026337f, 0.857422f, 0.026459f, 0.850586f, 0.026566f, 0.843262f, 0.026550f, 0.836426f,
+ 0.026581f, 0.828125f, 0.027206f, 0.818359f, 0.027161f, 0.809082f, 0.027283f, 0.799805f,
+ 0.026978f, 0.791504f, 0.026810f, 0.782715f, 0.026505f, 0.773438f, 0.026749f, 0.760742f,
+ 0.026764f, 0.748535f, 0.026611f, 0.737305f, 0.026108f, 0.725586f, 0.025650f, 0.714844f,
+ 0.024933f, 0.702637f, 0.025146f, 0.686523f, 0.024811f, 0.670898f, 0.024063f, 0.655273f,
+ 0.023361f, 0.640625f, 0.022400f, 0.625000f, 0.021805f, 0.605957f, 0.021347f, 0.584961f,
+ 0.020370f, 0.563965f, 0.019135f, 0.542969f, 0.017868f, 0.521484f, 0.016830f, 0.494385f,
+ 0.015762f, 0.464844f, 0.014183f, 0.434326f, 0.012291f, 0.402588f, 0.010735f, 0.361084f,
+ 0.008743f, 0.314697f, 0.006134f, 0.262451f, 0.003664f, 0.184448f, 0.000638f, 0.066772f,
+ 0.000000f, 1.000000f, 0.002054f, 0.998047f, 0.005222f, 0.993164f, 0.006458f, 0.990723f,
+ 0.009277f, 0.984863f, 0.011032f, 0.980469f, 0.012871f, 0.976074f, 0.014778f, 0.970215f,
+ 0.016830f, 0.965332f, 0.017563f, 0.961914f, 0.019226f, 0.956543f, 0.020554f, 0.951172f,
+ 0.021362f, 0.946289f, 0.022537f, 0.941895f, 0.023254f, 0.937988f, 0.024429f, 0.931641f,
+ 0.025772f, 0.925781f, 0.026566f, 0.920410f, 0.027069f, 0.916016f, 0.027344f, 0.911621f,
+ 0.028687f, 0.904297f, 0.029526f, 0.897461f, 0.030212f, 0.892090f, 0.030380f, 0.885742f,
+ 0.030716f, 0.880859f, 0.031097f, 0.875488f, 0.031891f, 0.866699f, 0.032410f, 0.859375f,
+ 0.032959f, 0.852051f, 0.032928f, 0.845215f, 0.033264f, 0.838867f, 0.033051f, 0.832031f,
+ 0.033630f, 0.822266f, 0.033997f, 0.812500f, 0.034210f, 0.804199f, 0.034180f, 0.795410f,
+ 0.033936f, 0.787109f, 0.033417f, 0.778809f, 0.033661f, 0.767578f, 0.033844f, 0.755859f,
+ 0.033630f, 0.744629f, 0.033234f, 0.733398f, 0.032776f, 0.722168f, 0.032074f, 0.711426f,
+ 0.031616f, 0.697266f, 0.031464f, 0.682129f, 0.031067f, 0.667480f, 0.030090f, 0.652832f,
+ 0.029144f, 0.638184f, 0.027969f, 0.623047f, 0.027359f, 0.603027f, 0.026703f, 0.582520f,
+ 0.025375f, 0.562500f, 0.023758f, 0.541504f, 0.022186f, 0.520508f, 0.021103f, 0.492920f,
+ 0.019562f, 0.463379f, 0.017548f, 0.434082f, 0.015221f, 0.402344f, 0.013191f, 0.360596f,
+ 0.010681f, 0.314209f, 0.007496f, 0.263184f, 0.004452f, 0.183594f, 0.000767f, 0.065796f,
+ 0.000000f, 1.000000f, 0.002428f, 0.997559f, 0.005573f, 0.993164f, 0.008026f, 0.989258f,
+ 0.010979f, 0.983398f, 0.013222f, 0.979004f, 0.015213f, 0.973633f, 0.017471f, 0.967773f,
+ 0.019196f, 0.963379f, 0.020935f, 0.958984f, 0.022690f, 0.952637f, 0.024796f, 0.946777f,
+ 0.026001f, 0.941895f, 0.027252f, 0.937500f, 0.028152f, 0.932617f, 0.029953f, 0.926270f,
+ 0.030746f, 0.920898f, 0.032166f, 0.915527f, 0.032654f, 0.911133f, 0.033539f, 0.905273f,
+ 0.034729f, 0.898438f, 0.036102f, 0.891602f, 0.036713f, 0.885742f, 0.037415f, 0.880859f,
+ 0.037323f, 0.875488f, 0.038544f, 0.868164f, 0.039368f, 0.860352f, 0.039795f, 0.853516f,
+ 0.040222f, 0.846680f, 0.040436f, 0.839844f, 0.040680f, 0.833984f, 0.041046f, 0.825195f,
+ 0.041534f, 0.815918f, 0.041901f, 0.807129f, 0.042023f, 0.798828f, 0.041504f, 0.791016f,
+ 0.041595f, 0.782227f, 0.041443f, 0.773438f, 0.041718f, 0.761719f, 0.041656f, 0.750488f,
+ 0.041321f, 0.739746f, 0.040985f, 0.729492f, 0.040100f, 0.718750f, 0.039337f, 0.708496f,
+ 0.039307f, 0.692871f, 0.038727f, 0.678223f, 0.038208f, 0.664062f, 0.036987f, 0.650391f,
+ 0.035736f, 0.635742f, 0.034393f, 0.620117f, 0.033875f, 0.599609f, 0.032745f, 0.580078f,
+ 0.031097f, 0.560547f, 0.029327f, 0.540527f, 0.027054f, 0.520508f, 0.025848f, 0.490234f,
+ 0.023834f, 0.461670f, 0.021332f, 0.433350f, 0.018372f, 0.402344f, 0.016144f, 0.359131f,
+ 0.012894f, 0.313721f, 0.009102f, 0.264160f, 0.005341f, 0.182739f, 0.000927f, 0.064758f,
+ 0.000000f, 1.000000f, 0.002878f, 0.997559f, 0.006504f, 0.992676f, 0.009315f, 0.987793f,
+ 0.012947f, 0.981934f, 0.015312f, 0.977539f, 0.017731f, 0.971191f, 0.020447f, 0.965332f,
+ 0.022369f, 0.960449f, 0.023743f, 0.956543f, 0.027145f, 0.948242f, 0.028946f, 0.942383f,
+ 0.030807f, 0.937500f, 0.031708f, 0.933594f, 0.034027f, 0.926270f, 0.035736f, 0.920410f,
+ 0.037018f, 0.915039f, 0.037964f, 0.910645f, 0.038910f, 0.905762f, 0.040680f, 0.898438f,
+ 0.041992f, 0.891602f, 0.043213f, 0.885742f, 0.043793f, 0.880371f, 0.044373f, 0.875000f,
+ 0.045227f, 0.869629f, 0.046204f, 0.860840f, 0.047607f, 0.853516f, 0.048126f, 0.847168f,
+ 0.048370f, 0.840820f, 0.048767f, 0.834473f, 0.048706f, 0.827637f, 0.049896f, 0.818359f,
+ 0.050446f, 0.809570f, 0.050720f, 0.801270f, 0.050568f, 0.793457f, 0.050323f, 0.785645f,
+ 0.050049f, 0.777832f, 0.050476f, 0.766602f, 0.050598f, 0.755859f, 0.050629f, 0.746094f,
+ 0.050049f, 0.735840f, 0.049408f, 0.725586f, 0.048431f, 0.715332f, 0.048218f, 0.702637f,
+ 0.048035f, 0.688477f, 0.046997f, 0.674316f, 0.046051f, 0.660645f, 0.044861f, 0.647461f,
+ 0.043060f, 0.633789f, 0.041901f, 0.615723f, 0.040985f, 0.596191f, 0.039429f, 0.577148f,
+ 0.037567f, 0.558594f, 0.035339f, 0.540039f, 0.032837f, 0.516113f, 0.031128f, 0.487793f,
+ 0.028809f, 0.461182f, 0.025543f, 0.432617f, 0.022003f, 0.402832f, 0.019440f, 0.357910f,
+ 0.015465f, 0.313965f, 0.010681f, 0.264404f, 0.006344f, 0.182617f, 0.001092f, 0.064209f,
+ 0.000000f, 1.000000f, 0.003632f, 0.996582f, 0.007587f, 0.992188f, 0.010414f, 0.986328f,
+ 0.014725f, 0.980469f, 0.017197f, 0.976074f, 0.020142f, 0.968750f, 0.023468f, 0.962891f,
+ 0.025879f, 0.958008f, 0.028595f, 0.951172f, 0.030853f, 0.944824f, 0.033691f, 0.938477f,
+ 0.035583f, 0.934082f, 0.037842f, 0.927734f, 0.039734f, 0.920898f, 0.041992f, 0.914551f,
+ 0.043793f, 0.909180f, 0.044800f, 0.904785f, 0.046661f, 0.898926f, 0.048096f, 0.891602f,
+ 0.049866f, 0.884766f, 0.050751f, 0.879395f, 0.051941f, 0.874023f, 0.052490f, 0.869141f,
+ 0.054169f, 0.861328f, 0.055359f, 0.854004f, 0.056305f, 0.846680f, 0.057098f, 0.840332f,
+ 0.057495f, 0.834961f, 0.057800f, 0.828613f, 0.058685f, 0.819824f, 0.059479f, 0.811035f,
+ 0.060120f, 0.803223f, 0.060242f, 0.795410f, 0.060333f, 0.788086f, 0.059753f, 0.780762f,
+ 0.060242f, 0.770996f, 0.060242f, 0.760254f, 0.060455f, 0.750000f, 0.060059f, 0.740723f,
+ 0.059387f, 0.730469f, 0.058685f, 0.721680f, 0.057800f, 0.710449f, 0.057587f, 0.696289f,
+ 0.056915f, 0.683105f, 0.056030f, 0.669922f, 0.054504f, 0.657715f, 0.053131f, 0.644531f,
+ 0.051422f, 0.630371f, 0.050293f, 0.611328f, 0.048889f, 0.593262f, 0.047058f, 0.575195f,
+ 0.044586f, 0.557129f, 0.041656f, 0.538086f, 0.039398f, 0.512695f, 0.037201f, 0.486572f,
+ 0.033936f, 0.459717f, 0.030258f, 0.432373f, 0.026291f, 0.400879f, 0.022949f, 0.356445f,
+ 0.018234f, 0.313721f, 0.012558f, 0.265137f, 0.007404f, 0.182617f, 0.001262f, 0.063599f,
+ 0.000000f, 1.000000f, 0.004120f, 0.996094f, 0.008354f, 0.991699f, 0.012260f, 0.985352f,
+ 0.016769f, 0.979492f, 0.019363f, 0.974609f, 0.023438f, 0.966309f, 0.026428f, 0.960938f,
+ 0.029419f, 0.955078f, 0.032990f, 0.947266f, 0.036072f, 0.940430f, 0.038086f, 0.935059f,
+ 0.040924f, 0.929688f, 0.043762f, 0.921875f, 0.046936f, 0.914551f, 0.048859f, 0.909180f,
+ 0.050446f, 0.903809f, 0.051880f, 0.899414f, 0.054321f, 0.891113f, 0.056641f, 0.884277f,
+ 0.058228f, 0.878418f, 0.059387f, 0.873047f, 0.060181f, 0.868164f, 0.062256f, 0.860840f,
+ 0.063416f, 0.853027f, 0.064941f, 0.846191f, 0.065857f, 0.840332f, 0.066772f, 0.834473f,
+ 0.067139f, 0.828613f, 0.068298f, 0.820312f, 0.069092f, 0.812012f, 0.070190f, 0.804199f,
+ 0.070251f, 0.796387f, 0.070618f, 0.789551f, 0.070251f, 0.782715f, 0.070618f, 0.773926f,
+ 0.071106f, 0.763184f, 0.070984f, 0.753418f, 0.071045f, 0.744141f, 0.070435f, 0.735352f,
+ 0.069702f, 0.726074f, 0.068787f, 0.717285f, 0.068542f, 0.703613f, 0.067932f, 0.690918f,
+ 0.066772f, 0.678711f, 0.065796f, 0.666504f, 0.063721f, 0.654297f, 0.062164f, 0.642090f,
+ 0.060852f, 0.624512f, 0.059387f, 0.606934f, 0.057251f, 0.590332f, 0.055054f, 0.572754f,
+ 0.052002f, 0.555664f, 0.048828f, 0.536621f, 0.046387f, 0.509766f, 0.043457f, 0.484375f,
+ 0.039734f, 0.458984f, 0.035187f, 0.432861f, 0.031067f, 0.397705f, 0.026810f, 0.355713f,
+ 0.021164f, 0.313965f, 0.014526f, 0.266602f, 0.008568f, 0.182129f, 0.001485f, 0.063538f,
+ 0.000000f, 1.000000f, 0.004551f, 0.996094f, 0.009392f, 0.991211f, 0.013962f, 0.983887f,
+ 0.017792f, 0.978516f, 0.022156f, 0.971191f, 0.026657f, 0.964355f, 0.030258f, 0.958008f,
+ 0.033203f, 0.952148f, 0.037201f, 0.943848f, 0.040710f, 0.937012f, 0.044250f, 0.931152f,
+ 0.046509f, 0.924316f, 0.050598f, 0.916016f, 0.053192f, 0.909180f, 0.056091f, 0.903320f,
+ 0.057648f, 0.897949f, 0.060669f, 0.890625f, 0.063293f, 0.883301f, 0.064880f, 0.877441f,
+ 0.067139f, 0.871582f, 0.068604f, 0.866699f, 0.069702f, 0.859863f, 0.072205f, 0.852051f,
+ 0.074036f, 0.845215f, 0.075134f, 0.838379f, 0.076111f, 0.833496f, 0.077271f, 0.827637f,
+ 0.078186f, 0.820312f, 0.079224f, 0.811523f, 0.080261f, 0.804199f, 0.080994f, 0.796875f,
+ 0.081299f, 0.790039f, 0.081299f, 0.783691f, 0.081482f, 0.775879f, 0.082214f, 0.765137f,
+ 0.082520f, 0.756836f, 0.082764f, 0.747070f, 0.082214f, 0.738770f, 0.081543f, 0.730469f,
+ 0.080566f, 0.721680f, 0.080139f, 0.709961f, 0.079895f, 0.697266f, 0.078735f, 0.685547f,
+ 0.077271f, 0.673828f, 0.076050f, 0.662598f, 0.073669f, 0.650879f, 0.072266f, 0.636719f,
+ 0.070679f, 0.620117f, 0.068787f, 0.603516f, 0.066345f, 0.587402f, 0.063354f, 0.570801f,
+ 0.059723f, 0.554199f, 0.057007f, 0.531250f, 0.053925f, 0.506836f, 0.049957f, 0.482666f,
+ 0.045593f, 0.458496f, 0.040375f, 0.431885f, 0.035828f, 0.394531f, 0.030869f, 0.355225f,
+ 0.024323f, 0.314941f, 0.017105f, 0.262695f, 0.009865f, 0.182373f, 0.001684f, 0.062286f,
+ 0.000000f, 1.000000f, 0.005116f, 0.995605f, 0.010109f, 0.990723f, 0.015930f, 0.982910f,
+ 0.020416f, 0.977051f, 0.024887f, 0.969238f, 0.030289f, 0.961426f, 0.034027f, 0.956055f,
+ 0.038147f, 0.947754f, 0.042694f, 0.939453f, 0.046021f, 0.933105f, 0.049103f, 0.927246f,
+ 0.053406f, 0.917969f, 0.057281f, 0.910645f, 0.060638f, 0.904297f, 0.062927f, 0.898438f,
+ 0.066040f, 0.890625f, 0.069458f, 0.882324f, 0.071777f, 0.875977f, 0.074585f, 0.869629f,
+ 0.076416f, 0.864746f, 0.078430f, 0.858398f, 0.081116f, 0.850586f, 0.082764f, 0.843750f,
+ 0.084961f, 0.837402f, 0.085999f, 0.831543f, 0.086853f, 0.826172f, 0.088196f, 0.819336f,
+ 0.090210f, 0.810547f, 0.091370f, 0.803223f, 0.092224f, 0.796387f, 0.092285f, 0.790039f,
+ 0.093140f, 0.783691f, 0.093140f, 0.776367f, 0.094177f, 0.766113f, 0.094727f, 0.757812f,
+ 0.094849f, 0.749512f, 0.094421f, 0.741211f, 0.094238f, 0.732910f, 0.093140f, 0.725098f,
+ 0.092529f, 0.713867f, 0.092285f, 0.702148f, 0.091431f, 0.690918f, 0.090271f, 0.680176f,
+ 0.088379f, 0.669434f, 0.086548f, 0.658691f, 0.084290f, 0.646973f, 0.083191f, 0.630371f,
+ 0.081299f, 0.614746f, 0.078918f, 0.600098f, 0.075500f, 0.584473f, 0.072266f, 0.569336f,
+ 0.068359f, 0.551270f, 0.065552f, 0.527832f, 0.061829f, 0.504395f, 0.057281f, 0.481689f,
+ 0.051941f, 0.457520f, 0.045990f, 0.432373f, 0.041321f, 0.392822f, 0.035065f, 0.354736f,
+ 0.027573f, 0.314941f, 0.019547f, 0.259033f, 0.011169f, 0.182983f, 0.001916f, 0.061859f,
+ 0.000000f, 1.000000f, 0.006191f, 0.995117f, 0.011017f, 0.990723f, 0.017899f, 0.981934f,
+ 0.022003f, 0.976562f, 0.028793f, 0.966309f, 0.032928f, 0.959961f, 0.037384f, 0.953125f,
+ 0.043152f, 0.943359f, 0.047943f, 0.935547f, 0.051788f, 0.929688f, 0.056061f, 0.920898f,
+ 0.060486f, 0.912598f, 0.064880f, 0.904785f, 0.067993f, 0.898926f, 0.071533f, 0.891602f,
+ 0.075378f, 0.882812f, 0.078735f, 0.875488f, 0.082092f, 0.868652f, 0.084045f, 0.863281f,
+ 0.086487f, 0.856934f, 0.089417f, 0.848633f, 0.092346f, 0.841797f, 0.094604f, 0.835449f,
+ 0.095642f, 0.830078f, 0.097473f, 0.824219f, 0.099304f, 0.816406f, 0.101074f, 0.808594f,
+ 0.102478f, 0.801758f, 0.104187f, 0.794922f, 0.104309f, 0.789062f, 0.105164f, 0.782715f,
+ 0.105164f, 0.775879f, 0.106873f, 0.766113f, 0.107544f, 0.757812f, 0.107605f, 0.749512f,
+ 0.107605f, 0.742676f, 0.107117f, 0.735352f, 0.106262f, 0.727539f, 0.105835f, 0.716797f,
+ 0.105896f, 0.706055f, 0.104858f, 0.695312f, 0.103638f, 0.685547f, 0.102295f, 0.675293f,
+ 0.100159f, 0.666016f, 0.097900f, 0.654785f, 0.096436f, 0.639160f, 0.094910f, 0.625000f,
+ 0.092041f, 0.610352f, 0.089050f, 0.596680f, 0.085388f, 0.582031f, 0.081604f, 0.567383f,
+ 0.077942f, 0.545410f, 0.074585f, 0.524414f, 0.069946f, 0.502930f, 0.064758f, 0.480225f,
+ 0.058472f, 0.457031f, 0.052612f, 0.427246f, 0.046936f, 0.391602f, 0.039703f, 0.354736f,
+ 0.031036f, 0.315918f, 0.022400f, 0.257080f, 0.012619f, 0.183350f, 0.002148f, 0.061646f,
+ 0.000000f, 1.000000f, 0.006817f, 0.995117f, 0.012398f, 0.989258f, 0.019669f, 0.980957f,
+ 0.024902f, 0.974121f, 0.031738f, 0.964355f, 0.037354f, 0.957520f, 0.042908f, 0.948242f,
+ 0.048340f, 0.939941f, 0.053680f, 0.932617f, 0.057648f, 0.924805f, 0.063416f, 0.915039f,
+ 0.067627f, 0.907715f, 0.072266f, 0.899902f, 0.076172f, 0.893066f, 0.081116f, 0.883301f,
+ 0.085388f, 0.875000f, 0.088745f, 0.868652f, 0.091675f, 0.862305f, 0.094788f, 0.854980f,
+ 0.098633f, 0.846191f, 0.101318f, 0.839355f, 0.103577f, 0.833008f, 0.106140f, 0.827148f,
+ 0.107727f, 0.822266f, 0.109985f, 0.813965f, 0.112549f, 0.806152f, 0.114563f, 0.798828f,
+ 0.115540f, 0.792969f, 0.117065f, 0.787109f, 0.116943f, 0.781738f, 0.118591f, 0.773438f,
+ 0.119934f, 0.765137f, 0.120544f, 0.756836f, 0.121277f, 0.750000f, 0.121155f, 0.742676f,
+ 0.120300f, 0.735840f, 0.119812f, 0.729492f, 0.120056f, 0.717773f, 0.119690f, 0.708008f,
+ 0.119141f, 0.698242f, 0.117920f, 0.689453f, 0.116821f, 0.680176f, 0.114380f, 0.670898f,
+ 0.112244f, 0.661133f, 0.110962f, 0.646484f, 0.109131f, 0.633301f, 0.106567f, 0.620117f,
+ 0.103149f, 0.606445f, 0.099426f, 0.593262f, 0.095703f, 0.580078f, 0.091797f, 0.561523f,
+ 0.088196f, 0.541504f, 0.083618f, 0.521484f, 0.078247f, 0.500488f, 0.072266f, 0.479492f,
+ 0.065491f, 0.457031f, 0.059631f, 0.423828f, 0.052521f, 0.390381f, 0.044403f, 0.354980f,
+ 0.034576f, 0.315674f, 0.025177f, 0.255127f, 0.014053f, 0.183350f, 0.002422f, 0.061646f,
+ 0.000000f, 1.000000f, 0.007477f, 0.994629f, 0.014580f, 0.987305f, 0.021271f, 0.980469f,
+ 0.028717f, 0.970703f, 0.034760f, 0.962891f, 0.040588f, 0.955566f, 0.048798f, 0.944336f,
+ 0.054474f, 0.936523f, 0.058929f, 0.929688f, 0.065491f, 0.918457f, 0.071106f, 0.909668f,
+ 0.075867f, 0.902344f, 0.080261f, 0.894531f, 0.086365f, 0.884277f, 0.090149f, 0.876465f,
+ 0.095154f, 0.868652f, 0.098572f, 0.862305f, 0.101868f, 0.854004f, 0.106812f, 0.845215f,
+ 0.110413f, 0.837402f, 0.113098f, 0.831055f, 0.116028f, 0.825195f, 0.117920f, 0.818848f,
+ 0.121521f, 0.810059f, 0.123779f, 0.803223f, 0.125732f, 0.796875f, 0.127686f, 0.790527f,
+ 0.128662f, 0.785156f, 0.129395f, 0.779297f, 0.131958f, 0.770508f, 0.133423f, 0.762207f,
+ 0.134155f, 0.755371f, 0.134888f, 0.749023f, 0.134888f, 0.742188f, 0.134888f, 0.736328f,
+ 0.134399f, 0.728027f, 0.134644f, 0.718262f, 0.134888f, 0.708984f, 0.134033f, 0.700195f,
+ 0.132812f, 0.691895f, 0.131592f, 0.684082f, 0.129761f, 0.675293f, 0.127319f, 0.665039f,
+ 0.126221f, 0.652344f, 0.124207f, 0.640137f, 0.121277f, 0.627930f, 0.118408f, 0.615723f,
+ 0.114990f, 0.603516f, 0.110474f, 0.591309f, 0.106873f, 0.574707f, 0.102905f, 0.555664f,
+ 0.098206f, 0.537109f, 0.093018f, 0.518555f, 0.086853f, 0.499268f, 0.080017f, 0.479248f,
+ 0.073364f, 0.452637f, 0.066711f, 0.422119f, 0.058594f, 0.389893f, 0.049225f, 0.354980f,
+ 0.038177f, 0.316406f, 0.028336f, 0.254150f, 0.015450f, 0.183838f, 0.002693f, 0.061462f,
+ 0.000000f, 1.000000f, 0.008354f, 0.994629f, 0.015961f, 0.986816f, 0.023605f, 0.979492f,
+ 0.031921f, 0.968750f, 0.038483f, 0.961426f, 0.046234f, 0.950684f, 0.053558f, 0.941406f,
+ 0.059143f, 0.934082f, 0.066406f, 0.922852f, 0.073486f, 0.913574f, 0.078979f, 0.905273f,
+ 0.084167f, 0.896973f, 0.090210f, 0.886719f, 0.096008f, 0.877441f, 0.100464f, 0.870117f,
+ 0.104309f, 0.863281f, 0.109802f, 0.853027f, 0.114563f, 0.844727f, 0.118225f, 0.836914f,
+ 0.122681f, 0.829590f, 0.125244f, 0.823730f, 0.128784f, 0.814941f, 0.132690f, 0.806641f,
+ 0.134888f, 0.799805f, 0.137939f, 0.793457f, 0.139893f, 0.787598f, 0.141602f, 0.782715f,
+ 0.143433f, 0.774414f, 0.145386f, 0.766602f, 0.146729f, 0.759766f, 0.147949f, 0.753418f,
+ 0.148682f, 0.747070f, 0.148804f, 0.741211f, 0.148926f, 0.735352f, 0.149536f, 0.725098f,
+ 0.150635f, 0.717285f, 0.150024f, 0.708984f, 0.149536f, 0.701172f, 0.148682f, 0.693848f,
+ 0.146729f, 0.686035f, 0.144775f, 0.678711f, 0.143311f, 0.666992f, 0.142334f, 0.655762f,
+ 0.140015f, 0.645020f, 0.137329f, 0.634277f, 0.134399f, 0.623047f, 0.130859f, 0.612305f,
+ 0.126587f, 0.600586f, 0.122620f, 0.584961f, 0.118958f, 0.567871f, 0.114075f, 0.551270f,
+ 0.108887f, 0.534180f, 0.102661f, 0.517090f, 0.095764f, 0.498535f, 0.088257f, 0.477295f,
+ 0.081665f, 0.448730f, 0.073486f, 0.419922f, 0.064331f, 0.388428f, 0.053955f, 0.354736f,
+ 0.042419f, 0.314209f, 0.031403f, 0.253174f, 0.017044f, 0.184692f, 0.002956f, 0.061035f,
+ 0.000000f, 1.000000f, 0.009033f, 0.994629f, 0.018036f, 0.985840f, 0.026031f, 0.977051f,
+ 0.035248f, 0.967773f, 0.042816f, 0.958008f, 0.051422f, 0.947754f, 0.058624f, 0.938965f,
+ 0.066345f, 0.927734f, 0.074097f, 0.917480f, 0.080078f, 0.909180f, 0.087097f, 0.899902f,
+ 0.094360f, 0.888672f, 0.099976f, 0.880371f, 0.105713f, 0.872070f, 0.110474f, 0.863281f,
+ 0.116028f, 0.853516f, 0.121643f, 0.844238f, 0.126831f, 0.836426f, 0.130859f, 0.829590f,
+ 0.134766f, 0.820801f, 0.139404f, 0.812012f, 0.142700f, 0.804199f, 0.146973f, 0.797363f,
+ 0.149170f, 0.790527f, 0.150757f, 0.785156f, 0.154541f, 0.777344f, 0.157104f, 0.769531f,
+ 0.159424f, 0.763184f, 0.161133f, 0.755859f, 0.161743f, 0.750000f, 0.162964f, 0.744629f,
+ 0.163330f, 0.739258f, 0.164307f, 0.730469f, 0.165283f, 0.722656f, 0.165771f, 0.714844f,
+ 0.165649f, 0.708008f, 0.165039f, 0.701660f, 0.164062f, 0.694336f, 0.162476f, 0.687500f,
+ 0.161743f, 0.678223f, 0.160767f, 0.667969f, 0.158813f, 0.658203f, 0.156616f, 0.648438f,
+ 0.153931f, 0.639160f, 0.150757f, 0.629395f, 0.147095f, 0.619141f, 0.143188f, 0.607910f,
+ 0.139771f, 0.592773f, 0.135498f, 0.578125f, 0.130981f, 0.563477f, 0.125244f, 0.547852f,
+ 0.119202f, 0.532227f, 0.112183f, 0.515625f, 0.104919f, 0.497559f, 0.097717f, 0.471680f,
+ 0.089905f, 0.445557f, 0.080811f, 0.417969f, 0.070679f, 0.388428f, 0.058960f, 0.354980f,
+ 0.047211f, 0.310059f, 0.034393f, 0.252441f, 0.018539f, 0.185547f, 0.003244f, 0.061188f,
+ 0.000000f, 1.000000f, 0.009888f, 0.994141f, 0.019958f, 0.985352f, 0.029358f, 0.975098f,
+ 0.038239f, 0.966309f, 0.048859f, 0.954102f, 0.056885f, 0.944824f, 0.065552f, 0.933594f,
+ 0.073547f, 0.923340f, 0.081238f, 0.914551f, 0.088806f, 0.903320f, 0.097168f, 0.892090f,
+ 0.103149f, 0.883789f, 0.109131f, 0.875488f, 0.117065f, 0.863770f, 0.123047f, 0.854004f,
+ 0.128418f, 0.845703f, 0.133179f, 0.837402f, 0.138794f, 0.828613f, 0.144409f, 0.818848f,
+ 0.148926f, 0.810059f, 0.153564f, 0.802246f, 0.157471f, 0.795410f, 0.160034f, 0.789062f,
+ 0.164307f, 0.779785f, 0.167603f, 0.771973f, 0.170044f, 0.765137f, 0.172607f, 0.758789f,
+ 0.174316f, 0.752930f, 0.176514f, 0.747559f, 0.177368f, 0.740234f, 0.179077f, 0.732910f,
+ 0.180664f, 0.725586f, 0.181396f, 0.718750f, 0.181396f, 0.712402f, 0.181885f, 0.706543f,
+ 0.180786f, 0.700195f, 0.179810f, 0.694336f, 0.179077f, 0.685547f, 0.178833f, 0.676270f,
+ 0.177734f, 0.667969f, 0.175659f, 0.659180f, 0.173462f, 0.650879f, 0.171143f, 0.642578f,
+ 0.167725f, 0.634277f, 0.163940f, 0.624512f, 0.161255f, 0.611816f, 0.158081f, 0.599609f,
+ 0.153320f, 0.586426f, 0.148438f, 0.573242f, 0.143188f, 0.560059f, 0.136230f, 0.545898f,
+ 0.129883f, 0.531250f, 0.122375f, 0.512695f, 0.115662f, 0.490967f, 0.107544f, 0.467529f,
+ 0.098450f, 0.443115f, 0.088379f, 0.417236f, 0.076660f, 0.388184f, 0.064453f, 0.355713f,
+ 0.051910f, 0.307373f, 0.037720f, 0.252930f, 0.020309f, 0.187012f, 0.003546f, 0.060883f,
+ 0.000000f, 1.000000f, 0.010391f, 0.994141f, 0.021210f, 0.985352f, 0.032745f, 0.974121f,
+ 0.042908f, 0.962891f, 0.053345f, 0.952148f, 0.062500f, 0.940918f, 0.072205f, 0.929688f,
+ 0.080505f, 0.920410f, 0.090271f, 0.907227f, 0.097961f, 0.897461f, 0.105774f, 0.887695f,
+ 0.114502f, 0.876465f, 0.121704f, 0.865723f, 0.128662f, 0.855957f, 0.134521f, 0.847656f,
+ 0.140625f, 0.837402f, 0.146851f, 0.827148f, 0.153076f, 0.817871f, 0.157959f, 0.809570f,
+ 0.162964f, 0.802246f, 0.167480f, 0.793457f, 0.172241f, 0.784180f, 0.175903f, 0.776367f,
+ 0.180054f, 0.768555f, 0.183228f, 0.761719f, 0.185791f, 0.755371f, 0.188232f, 0.748535f,
+ 0.191162f, 0.740723f, 0.192871f, 0.734375f, 0.195679f, 0.727539f, 0.195801f, 0.721680f,
+ 0.196777f, 0.715820f, 0.197510f, 0.709961f, 0.197388f, 0.704590f, 0.197021f, 0.696777f,
+ 0.197632f, 0.688965f, 0.197266f, 0.681641f, 0.196411f, 0.674316f, 0.194946f, 0.666992f,
+ 0.193604f, 0.659668f, 0.191162f, 0.652832f, 0.188110f, 0.645508f, 0.185913f, 0.636230f,
+ 0.182983f, 0.625488f, 0.179443f, 0.615234f, 0.176025f, 0.604492f, 0.171753f, 0.593750f,
+ 0.166138f, 0.582031f, 0.161011f, 0.570312f, 0.154907f, 0.557617f, 0.148071f, 0.543945f,
+ 0.141357f, 0.524902f, 0.134033f, 0.505859f, 0.125977f, 0.486084f, 0.117004f, 0.464844f,
+ 0.106873f, 0.441650f, 0.095703f, 0.416748f, 0.083252f, 0.388916f, 0.070435f, 0.349854f,
+ 0.056671f, 0.305908f, 0.040863f, 0.253662f, 0.021820f, 0.188477f, 0.003828f, 0.060883f,
+ 0.000000f, 1.000000f, 0.012199f, 0.992676f, 0.024460f, 0.982910f, 0.035431f, 0.972168f,
+ 0.047913f, 0.960449f, 0.058899f, 0.948730f, 0.069214f, 0.937500f, 0.079407f, 0.925781f,
+ 0.089722f, 0.913574f, 0.098389f, 0.903320f, 0.107483f, 0.891602f, 0.116760f, 0.879883f,
+ 0.124756f, 0.869629f, 0.131836f, 0.859863f, 0.140503f, 0.848145f, 0.147949f, 0.837891f,
+ 0.154785f, 0.828125f, 0.160400f, 0.819336f, 0.166992f, 0.809570f, 0.172974f, 0.799316f,
+ 0.178345f, 0.790527f, 0.183105f, 0.782227f, 0.186890f, 0.774902f, 0.191162f, 0.767578f,
+ 0.195435f, 0.758789f, 0.199951f, 0.750000f, 0.202515f, 0.742676f, 0.205566f, 0.735352f,
+ 0.207886f, 0.729004f, 0.209595f, 0.723145f, 0.210449f, 0.717773f, 0.213257f, 0.710938f,
+ 0.213989f, 0.704102f, 0.214722f, 0.697266f, 0.215088f, 0.690918f, 0.215332f, 0.685059f,
+ 0.215088f, 0.678711f, 0.213867f, 0.672852f, 0.212280f, 0.666504f, 0.210693f, 0.661133f,
+ 0.209106f, 0.651855f, 0.207520f, 0.644043f, 0.204834f, 0.635254f, 0.202148f, 0.626953f,
+ 0.198486f, 0.617676f, 0.194946f, 0.608398f, 0.190552f, 0.598633f, 0.185181f, 0.588379f,
+ 0.179443f, 0.577637f, 0.173584f, 0.564941f, 0.167969f, 0.550293f, 0.160767f, 0.535156f,
+ 0.154175f, 0.519043f, 0.145386f, 0.501953f, 0.136597f, 0.483643f, 0.126465f, 0.463379f,
+ 0.114807f, 0.441406f, 0.102905f, 0.417236f, 0.090820f, 0.384766f, 0.076904f, 0.347168f,
+ 0.061798f, 0.305420f, 0.043976f, 0.254150f, 0.023560f, 0.189575f, 0.004086f, 0.060669f,
+ 0.000000f, 1.000000f, 0.013603f, 0.992676f, 0.026031f, 0.982422f, 0.039551f, 0.970703f,
+ 0.052856f, 0.958008f, 0.064270f, 0.945801f, 0.076294f, 0.933105f, 0.087158f, 0.921875f,
+ 0.097717f, 0.908691f, 0.108765f, 0.896484f, 0.117859f, 0.885254f, 0.128052f, 0.873047f,
+ 0.136353f, 0.861816f, 0.145264f, 0.851562f, 0.153564f, 0.840820f, 0.160889f, 0.829102f,
+ 0.168213f, 0.818848f, 0.174927f, 0.809082f, 0.181885f, 0.799316f, 0.187744f, 0.790527f,
+ 0.193726f, 0.780273f, 0.199341f, 0.771484f, 0.203613f, 0.762695f, 0.207886f, 0.754883f,
+ 0.212280f, 0.747070f, 0.215332f, 0.740234f, 0.219849f, 0.731934f, 0.223267f, 0.724121f,
+ 0.225830f, 0.717285f, 0.227417f, 0.710449f, 0.229248f, 0.704590f, 0.230347f, 0.698730f,
+ 0.231445f, 0.692871f, 0.231445f, 0.687500f, 0.232056f, 0.681641f, 0.231934f, 0.674805f,
+ 0.231201f, 0.668457f, 0.230835f, 0.661621f, 0.229858f, 0.654785f, 0.228394f, 0.647949f,
+ 0.226440f, 0.640625f, 0.224365f, 0.634277f, 0.221436f, 0.626953f, 0.217041f, 0.619141f,
+ 0.213623f, 0.610840f, 0.209473f, 0.602051f, 0.204712f, 0.591309f, 0.200073f, 0.581055f,
+ 0.194702f, 0.569336f, 0.188599f, 0.557129f, 0.181274f, 0.543945f, 0.173828f, 0.530273f,
+ 0.165649f, 0.515137f, 0.156250f, 0.499268f, 0.146484f, 0.482178f, 0.135376f, 0.462891f,
+ 0.124146f, 0.438477f, 0.111877f, 0.412109f, 0.098328f, 0.381348f, 0.083130f, 0.346191f,
+ 0.066162f, 0.305664f, 0.047180f, 0.255615f, 0.025009f, 0.190796f, 0.004433f, 0.061157f,
+ 0.000000f, 1.000000f, 0.015060f, 0.991699f, 0.029160f, 0.981445f, 0.043610f, 0.968750f,
+ 0.057648f, 0.955566f, 0.071167f, 0.942383f, 0.083618f, 0.929688f, 0.095642f, 0.916016f,
+ 0.108215f, 0.903320f, 0.117920f, 0.891602f, 0.129883f, 0.877930f, 0.139404f, 0.866211f,
+ 0.148560f, 0.854492f, 0.157837f, 0.843750f, 0.166382f, 0.832031f, 0.175171f, 0.820801f,
+ 0.182983f, 0.810059f, 0.190186f, 0.799805f, 0.196289f, 0.790039f, 0.202271f, 0.780273f,
+ 0.209106f, 0.770020f, 0.214966f, 0.760742f, 0.220215f, 0.751465f, 0.225220f, 0.743164f,
+ 0.229492f, 0.734863f, 0.233643f, 0.726562f, 0.236816f, 0.719727f, 0.240479f, 0.712402f,
+ 0.243042f, 0.704590f, 0.245728f, 0.697754f, 0.247070f, 0.690918f, 0.249023f, 0.684570f,
+ 0.250488f, 0.679199f, 0.250732f, 0.673340f, 0.250488f, 0.667969f, 0.250732f, 0.662109f,
+ 0.249634f, 0.656738f, 0.248657f, 0.650879f, 0.247681f, 0.645020f, 0.245850f, 0.638184f,
+ 0.243896f, 0.631836f, 0.240601f, 0.624023f, 0.237915f, 0.617188f, 0.234009f, 0.609375f,
+ 0.230469f, 0.601074f, 0.226196f, 0.592773f, 0.221069f, 0.583496f, 0.214844f, 0.574219f,
+ 0.209595f, 0.563965f, 0.202271f, 0.552734f, 0.194824f, 0.541016f, 0.186279f, 0.527832f,
+ 0.177490f, 0.512207f, 0.168091f, 0.495850f, 0.157349f, 0.477539f, 0.145752f, 0.457031f,
+ 0.134033f, 0.434570f, 0.120422f, 0.409180f, 0.105530f, 0.380127f, 0.089111f, 0.346436f,
+ 0.071106f, 0.306641f, 0.050690f, 0.257324f, 0.027359f, 0.186646f, 0.004692f, 0.061188f,
+ 0.000000f, 1.000000f, 0.016144f, 0.991699f, 0.032501f, 0.979004f, 0.048553f, 0.965332f,
+ 0.063599f, 0.951660f, 0.077332f, 0.938965f, 0.092041f, 0.923828f, 0.105225f, 0.910645f,
+ 0.117493f, 0.896973f, 0.130371f, 0.883301f, 0.141113f, 0.870605f, 0.152344f, 0.857910f,
+ 0.162231f, 0.845703f, 0.172363f, 0.833496f, 0.181885f, 0.821777f, 0.190674f, 0.810059f,
+ 0.198364f, 0.799316f, 0.206909f, 0.788086f, 0.213257f, 0.778320f, 0.220947f, 0.768066f,
+ 0.226440f, 0.758789f, 0.232666f, 0.749023f, 0.237305f, 0.740234f, 0.242798f, 0.730957f,
+ 0.247314f, 0.722656f, 0.251465f, 0.714355f, 0.255615f, 0.706543f, 0.258789f, 0.699219f,
+ 0.261719f, 0.691895f, 0.264404f, 0.685059f, 0.266113f, 0.678711f, 0.267334f, 0.672363f,
+ 0.268311f, 0.666992f, 0.269287f, 0.661133f, 0.268799f, 0.656250f, 0.268799f, 0.650391f,
+ 0.268311f, 0.645020f, 0.266602f, 0.639648f, 0.265381f, 0.633789f, 0.263672f, 0.627930f,
+ 0.260498f, 0.621582f, 0.257812f, 0.615234f, 0.254639f, 0.608398f, 0.250488f, 0.601562f,
+ 0.246582f, 0.593750f, 0.241455f, 0.585449f, 0.235840f, 0.576660f, 0.230103f, 0.567383f,
+ 0.223511f, 0.557617f, 0.216187f, 0.546387f, 0.208496f, 0.534668f, 0.200073f, 0.521973f,
+ 0.190063f, 0.507324f, 0.179810f, 0.491699f, 0.168457f, 0.474121f, 0.156372f, 0.455078f,
+ 0.142822f, 0.433350f, 0.128418f, 0.408447f, 0.112305f, 0.380127f, 0.094971f, 0.346680f,
+ 0.075867f, 0.306885f, 0.054291f, 0.255615f, 0.029739f, 0.184692f, 0.005028f, 0.062134f,
+ 0.000000f, 1.000000f, 0.017303f, 0.991211f, 0.034760f, 0.978516f, 0.050659f, 0.965332f,
+ 0.066528f, 0.951172f, 0.081360f, 0.937012f, 0.096375f, 0.922363f, 0.109497f, 0.908691f,
+ 0.122620f, 0.894531f, 0.135376f, 0.880859f, 0.148071f, 0.867188f, 0.158325f, 0.854492f,
+ 0.169922f, 0.841309f, 0.179565f, 0.829102f, 0.189697f, 0.816895f, 0.198242f, 0.805664f,
+ 0.207397f, 0.793945f, 0.216675f, 0.782715f, 0.221802f, 0.772949f, 0.230469f, 0.761719f,
+ 0.237183f, 0.751953f, 0.242676f, 0.742188f, 0.248535f, 0.733398f, 0.254395f, 0.724121f,
+ 0.258789f, 0.715332f, 0.263916f, 0.707031f, 0.267334f, 0.698730f, 0.270752f, 0.690918f,
+ 0.273926f, 0.684082f, 0.276611f, 0.676758f, 0.278809f, 0.669922f, 0.280273f, 0.664062f,
+ 0.281738f, 0.657715f, 0.281982f, 0.652344f, 0.283203f, 0.646484f, 0.281982f, 0.641602f,
+ 0.282227f, 0.635742f, 0.281494f, 0.630371f, 0.279541f, 0.625000f, 0.278076f, 0.619141f,
+ 0.275146f, 0.613281f, 0.272949f, 0.606934f, 0.269043f, 0.600586f, 0.265381f, 0.593750f,
+ 0.260986f, 0.586426f, 0.255859f, 0.578125f, 0.251465f, 0.570312f, 0.244995f, 0.561035f,
+ 0.238647f, 0.551270f, 0.231812f, 0.541016f, 0.223389f, 0.529297f, 0.214233f, 0.516602f,
+ 0.204712f, 0.502441f, 0.195190f, 0.487305f, 0.183350f, 0.470459f, 0.171021f, 0.451172f,
+ 0.157471f, 0.429688f, 0.142334f, 0.405029f, 0.125977f, 0.377197f, 0.107971f, 0.343750f,
+ 0.088074f, 0.304199f, 0.065125f, 0.253662f, 0.038574f, 0.183838f, 0.008568f, 0.066162f,
+ 0.000000f, 1.000000f, 0.017303f, 0.991211f, 0.034607f, 0.978516f, 0.050690f, 0.965332f,
+ 0.066711f, 0.951172f, 0.081970f, 0.936523f, 0.096313f, 0.922363f, 0.110413f, 0.907715f,
+ 0.123901f, 0.893555f, 0.136475f, 0.880371f, 0.148682f, 0.866699f, 0.159546f, 0.854004f,
+ 0.170410f, 0.840820f, 0.181519f, 0.828125f, 0.192017f, 0.815430f, 0.201050f, 0.804199f,
+ 0.209717f, 0.792480f, 0.218018f, 0.781250f, 0.226196f, 0.770508f, 0.233032f, 0.760254f,
+ 0.240723f, 0.749512f, 0.247559f, 0.739746f, 0.253174f, 0.729980f, 0.258545f, 0.721191f,
+ 0.263916f, 0.711914f, 0.268311f, 0.703613f, 0.273438f, 0.695312f, 0.277344f, 0.687012f,
+ 0.280029f, 0.679688f, 0.282959f, 0.672363f, 0.286133f, 0.665039f, 0.288086f, 0.658691f,
+ 0.289551f, 0.652832f, 0.290283f, 0.646484f, 0.291504f, 0.641113f, 0.291992f, 0.635742f,
+ 0.291992f, 0.629883f, 0.291260f, 0.624023f, 0.290039f, 0.618652f, 0.288818f, 0.612305f,
+ 0.286865f, 0.606445f, 0.284668f, 0.600098f, 0.281494f, 0.594238f, 0.278809f, 0.586426f,
+ 0.274414f, 0.579590f, 0.270752f, 0.571289f, 0.265625f, 0.563477f, 0.260010f, 0.553711f,
+ 0.254639f, 0.544434f, 0.247681f, 0.533691f, 0.240479f, 0.522461f, 0.231934f, 0.510254f,
+ 0.222778f, 0.496338f, 0.212891f, 0.481201f, 0.202148f, 0.464600f, 0.190186f, 0.446045f,
+ 0.177002f, 0.424561f, 0.162964f, 0.400879f, 0.146484f, 0.373047f, 0.128052f, 0.340088f,
+ 0.108032f, 0.301758f, 0.083984f, 0.251709f, 0.054810f, 0.182495f, 0.018692f, 0.068237f,
+ 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.034637f, 0.978516f, 0.051056f, 0.965332f,
+ 0.066589f, 0.951172f, 0.082703f, 0.936035f, 0.096252f, 0.922363f, 0.111145f, 0.907715f,
+ 0.124268f, 0.894043f, 0.136963f, 0.879883f, 0.149414f, 0.866211f, 0.161987f, 0.853027f,
+ 0.172363f, 0.839844f, 0.182861f, 0.827148f, 0.192627f, 0.814941f, 0.202759f, 0.802734f,
+ 0.211670f, 0.791016f, 0.221558f, 0.779297f, 0.229126f, 0.768555f, 0.237183f, 0.757812f,
+ 0.244141f, 0.747070f, 0.251221f, 0.737305f, 0.257568f, 0.727539f, 0.263184f, 0.718262f,
+ 0.268799f, 0.708984f, 0.273682f, 0.700195f, 0.278564f, 0.691406f, 0.282715f, 0.683594f,
+ 0.286865f, 0.675293f, 0.289551f, 0.667969f, 0.293213f, 0.660645f, 0.295898f, 0.653320f,
+ 0.298096f, 0.646973f, 0.299072f, 0.641113f, 0.300293f, 0.635254f, 0.301270f, 0.629395f,
+ 0.301514f, 0.624023f, 0.301514f, 0.617188f, 0.300781f, 0.611816f, 0.299805f, 0.605957f,
+ 0.298584f, 0.599609f, 0.296875f, 0.593262f, 0.294434f, 0.586426f, 0.291748f, 0.579102f,
+ 0.288818f, 0.572266f, 0.284668f, 0.563965f, 0.280029f, 0.556152f, 0.275879f, 0.546875f,
+ 0.269531f, 0.537109f, 0.264160f, 0.526855f, 0.256348f, 0.515625f, 0.250000f, 0.503418f,
+ 0.241333f, 0.489746f, 0.231567f, 0.474365f, 0.221436f, 0.458496f, 0.210083f, 0.439697f,
+ 0.197388f, 0.419189f, 0.183105f, 0.395508f, 0.167847f, 0.368896f, 0.149902f, 0.336426f,
+ 0.129272f, 0.297852f, 0.104980f, 0.248901f, 0.074402f, 0.180786f, 0.032623f, 0.065308f,
+ 0.000000f, 1.000000f, 0.017410f, 0.991211f, 0.034210f, 0.979004f, 0.050873f, 0.965332f,
+ 0.066772f, 0.951172f, 0.082520f, 0.936035f, 0.097351f, 0.921875f, 0.111328f, 0.907715f,
+ 0.124817f, 0.893555f, 0.137817f, 0.879395f, 0.150757f, 0.865723f, 0.162598f, 0.852539f,
+ 0.174316f, 0.839355f, 0.185303f, 0.825684f, 0.195312f, 0.813477f, 0.205444f, 0.801270f,
+ 0.215088f, 0.789551f, 0.224121f, 0.778320f, 0.231323f, 0.767090f, 0.240601f, 0.755859f,
+ 0.248047f, 0.745117f, 0.254395f, 0.734863f, 0.261230f, 0.725098f, 0.267090f, 0.715332f,
+ 0.273682f, 0.706055f, 0.279053f, 0.696777f, 0.283691f, 0.687988f, 0.288330f, 0.679688f,
+ 0.293213f, 0.670898f, 0.297119f, 0.663086f, 0.300049f, 0.655762f, 0.303711f, 0.648438f,
+ 0.306152f, 0.641602f, 0.308350f, 0.634766f, 0.309570f, 0.628906f, 0.311035f, 0.622559f,
+ 0.311035f, 0.617188f, 0.312012f, 0.610840f, 0.312012f, 0.604492f, 0.311768f, 0.598633f,
+ 0.310791f, 0.592285f, 0.309570f, 0.585938f, 0.307617f, 0.579102f, 0.305664f, 0.572266f,
+ 0.302490f, 0.564453f, 0.298828f, 0.556641f, 0.296143f, 0.548340f, 0.291260f, 0.539551f,
+ 0.286377f, 0.529297f, 0.281494f, 0.519531f, 0.274658f, 0.507812f, 0.268066f, 0.495850f,
+ 0.260498f, 0.482422f, 0.250732f, 0.467285f, 0.241821f, 0.451172f, 0.230957f, 0.432617f,
+ 0.219360f, 0.411621f, 0.205322f, 0.388672f, 0.189941f, 0.361816f, 0.172119f, 0.330322f,
+ 0.152100f, 0.293213f, 0.127319f, 0.244873f, 0.095825f, 0.178711f, 0.049957f, 0.065735f,
+ 0.000000f, 1.000000f, 0.017456f, 0.991211f, 0.034058f, 0.979004f, 0.050537f, 0.965332f,
+ 0.066895f, 0.951172f, 0.082397f, 0.936523f, 0.097656f, 0.921875f, 0.111877f, 0.907715f,
+ 0.125488f, 0.893066f, 0.139038f, 0.878906f, 0.151611f, 0.865234f, 0.164062f, 0.851562f,
+ 0.175293f, 0.838379f, 0.186401f, 0.825195f, 0.197266f, 0.812500f, 0.207886f, 0.799805f,
+ 0.217163f, 0.788086f, 0.225586f, 0.776367f, 0.234985f, 0.765137f, 0.243774f, 0.753418f,
+ 0.251709f, 0.743164f, 0.258301f, 0.732422f, 0.266357f, 0.721680f, 0.272461f, 0.711914f,
+ 0.278320f, 0.702637f, 0.284424f, 0.693359f, 0.289551f, 0.684082f, 0.295410f, 0.675293f,
+ 0.300293f, 0.666992f, 0.303223f, 0.658691f, 0.306885f, 0.650879f, 0.310791f, 0.643066f,
+ 0.312988f, 0.636230f, 0.316406f, 0.628906f, 0.318604f, 0.622070f, 0.320068f, 0.616211f,
+ 0.322021f, 0.609863f, 0.323242f, 0.603516f, 0.322998f, 0.597168f, 0.323486f, 0.590820f,
+ 0.323486f, 0.583984f, 0.321777f, 0.578125f, 0.321533f, 0.570801f, 0.320312f, 0.563477f,
+ 0.317383f, 0.555664f, 0.315674f, 0.548340f, 0.311279f, 0.539551f, 0.308594f, 0.530273f,
+ 0.303467f, 0.520508f, 0.298584f, 0.510254f, 0.292969f, 0.499512f, 0.286377f, 0.487549f,
+ 0.279541f, 0.474609f, 0.271240f, 0.459961f, 0.262207f, 0.443359f, 0.251953f, 0.426270f,
+ 0.240967f, 0.406006f, 0.227417f, 0.383301f, 0.212891f, 0.357422f, 0.195557f, 0.326172f,
+ 0.175781f, 0.289551f, 0.150757f, 0.242554f, 0.118347f, 0.176025f, 0.069946f, 0.064331f,
+ 0.000000f, 1.000000f, 0.017212f, 0.991211f, 0.034332f, 0.979004f, 0.050720f, 0.965332f,
+ 0.067261f, 0.950684f, 0.083008f, 0.936035f, 0.097900f, 0.921387f, 0.112122f, 0.907715f,
+ 0.126099f, 0.893066f, 0.139648f, 0.878418f, 0.152710f, 0.864258f, 0.164917f, 0.851074f,
+ 0.177246f, 0.836914f, 0.187500f, 0.824707f, 0.199219f, 0.811035f, 0.209229f, 0.798828f,
+ 0.219604f, 0.786621f, 0.229004f, 0.774414f, 0.238525f, 0.762695f, 0.246704f, 0.751465f,
+ 0.255371f, 0.740234f, 0.262207f, 0.729980f, 0.270264f, 0.719238f, 0.278076f, 0.708984f,
+ 0.284424f, 0.698730f, 0.289795f, 0.689453f, 0.296143f, 0.680176f, 0.301270f, 0.670898f,
+ 0.304932f, 0.662598f, 0.311035f, 0.653809f, 0.315430f, 0.645508f, 0.318848f, 0.637695f,
+ 0.323242f, 0.629395f, 0.326904f, 0.621582f, 0.329102f, 0.614746f, 0.330322f, 0.608398f,
+ 0.333008f, 0.601562f, 0.333984f, 0.595703f, 0.334961f, 0.588867f, 0.335693f, 0.582520f,
+ 0.335938f, 0.576172f, 0.335449f, 0.569336f, 0.333984f, 0.562500f, 0.333496f, 0.555664f,
+ 0.332520f, 0.547852f, 0.329346f, 0.540039f, 0.326904f, 0.531250f, 0.324219f, 0.521973f,
+ 0.320312f, 0.513184f, 0.315918f, 0.502930f, 0.311279f, 0.492188f, 0.304932f, 0.479980f,
+ 0.298828f, 0.467529f, 0.291504f, 0.452881f, 0.282471f, 0.437012f, 0.273926f, 0.419189f,
+ 0.262207f, 0.399170f, 0.250244f, 0.376953f, 0.236206f, 0.351318f, 0.220337f, 0.321045f,
+ 0.199829f, 0.284668f, 0.175781f, 0.238403f, 0.143066f, 0.173706f, 0.092285f, 0.063904f,
+ 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.034607f, 0.978516f, 0.050629f, 0.965332f,
+ 0.067017f, 0.951172f, 0.083618f, 0.936035f, 0.098633f, 0.921387f, 0.112732f, 0.906738f,
+ 0.127319f, 0.892090f, 0.140503f, 0.877930f, 0.153442f, 0.863770f, 0.166260f, 0.850098f,
+ 0.178223f, 0.836914f, 0.190186f, 0.823242f, 0.200928f, 0.810059f, 0.211914f, 0.797363f,
+ 0.221680f, 0.785156f, 0.231567f, 0.772461f, 0.242065f, 0.760742f, 0.250488f, 0.749023f,
+ 0.259277f, 0.737305f, 0.267334f, 0.726562f, 0.274902f, 0.715820f, 0.281250f, 0.705566f,
+ 0.289307f, 0.695312f, 0.296387f, 0.685059f, 0.302734f, 0.674805f, 0.308350f, 0.665527f,
+ 0.313721f, 0.656738f, 0.319580f, 0.647461f, 0.323975f, 0.639160f, 0.327393f, 0.631348f,
+ 0.332031f, 0.623047f, 0.335205f, 0.615723f, 0.337646f, 0.608398f, 0.340576f, 0.601562f,
+ 0.343262f, 0.594727f, 0.344482f, 0.588379f, 0.346191f, 0.582031f, 0.347656f, 0.574707f,
+ 0.347656f, 0.568359f, 0.347900f, 0.561523f, 0.348389f, 0.554688f, 0.346924f, 0.547363f,
+ 0.346924f, 0.539551f, 0.344482f, 0.531738f, 0.343018f, 0.523926f, 0.340820f, 0.514160f,
+ 0.336670f, 0.504883f, 0.333252f, 0.494629f, 0.328613f, 0.483887f, 0.324219f, 0.471436f,
+ 0.318115f, 0.458740f, 0.312012f, 0.444336f, 0.303467f, 0.429199f, 0.295410f, 0.411377f,
+ 0.285156f, 0.392090f, 0.273438f, 0.370117f, 0.260254f, 0.344971f, 0.244507f, 0.315674f,
+ 0.225342f, 0.280273f, 0.201660f, 0.234497f, 0.169434f, 0.170410f, 0.117493f, 0.062866f,
+ 0.000000f, 1.000000f, 0.017044f, 0.991211f, 0.034515f, 0.978516f, 0.051208f, 0.964844f,
+ 0.067200f, 0.950684f, 0.083496f, 0.936035f, 0.099304f, 0.920898f, 0.113525f, 0.906738f,
+ 0.127930f, 0.892090f, 0.141357f, 0.877441f, 0.154419f, 0.863281f, 0.167725f, 0.849121f,
+ 0.180298f, 0.835449f, 0.191528f, 0.821777f, 0.202515f, 0.809082f, 0.214233f, 0.795410f,
+ 0.224854f, 0.782715f, 0.235474f, 0.770508f, 0.244751f, 0.758301f, 0.254150f, 0.746094f,
+ 0.262695f, 0.734863f, 0.272705f, 0.723145f, 0.280518f, 0.711914f, 0.288330f, 0.701172f,
+ 0.295166f, 0.690918f, 0.301270f, 0.681152f, 0.309082f, 0.670898f, 0.315186f, 0.661133f,
+ 0.321045f, 0.651855f, 0.324951f, 0.643555f, 0.331787f, 0.634277f, 0.335938f, 0.625977f,
+ 0.339600f, 0.618164f, 0.343262f, 0.609863f, 0.347656f, 0.602051f, 0.350830f, 0.594727f,
+ 0.353271f, 0.588379f, 0.355469f, 0.581055f, 0.357178f, 0.574707f, 0.358887f, 0.567383f,
+ 0.360352f, 0.560547f, 0.361328f, 0.553711f, 0.361328f, 0.546387f, 0.361572f, 0.539062f,
+ 0.361572f, 0.530762f, 0.361084f, 0.522949f, 0.359375f, 0.514160f, 0.356689f, 0.504883f,
+ 0.354980f, 0.495850f, 0.350830f, 0.486084f, 0.347900f, 0.475098f, 0.344238f, 0.463379f,
+ 0.337891f, 0.450439f, 0.331787f, 0.437012f, 0.325195f, 0.421387f, 0.317383f, 0.404297f,
+ 0.309082f, 0.384766f, 0.297363f, 0.363037f, 0.285156f, 0.338623f, 0.269531f, 0.309326f,
+ 0.251709f, 0.274658f, 0.228149f, 0.230713f, 0.196655f, 0.167969f, 0.145020f, 0.062622f,
+ 0.000000f, 1.000000f, 0.016602f, 0.991699f, 0.034302f, 0.979004f, 0.051178f, 0.965332f,
+ 0.067322f, 0.950684f, 0.083618f, 0.936035f, 0.098694f, 0.921387f, 0.113586f, 0.906738f,
+ 0.128174f, 0.891602f, 0.142944f, 0.876465f, 0.155762f, 0.862793f, 0.169189f, 0.848145f,
+ 0.182007f, 0.833984f, 0.193604f, 0.820801f, 0.206299f, 0.806641f, 0.217285f, 0.793457f,
+ 0.228149f, 0.780762f, 0.238647f, 0.767578f, 0.249512f, 0.755371f, 0.257812f, 0.743652f,
+ 0.266602f, 0.731934f, 0.276123f, 0.720215f, 0.283203f, 0.709473f, 0.292725f, 0.698242f,
+ 0.300537f, 0.687500f, 0.307129f, 0.677246f, 0.314453f, 0.667480f, 0.321045f, 0.657227f,
+ 0.326660f, 0.647949f, 0.332764f, 0.638672f, 0.338379f, 0.629395f, 0.343018f, 0.620605f,
+ 0.347168f, 0.612793f, 0.353271f, 0.603516f, 0.357178f, 0.595703f, 0.359619f, 0.588379f,
+ 0.363525f, 0.581055f, 0.367188f, 0.573242f, 0.369385f, 0.566406f, 0.372070f, 0.559082f,
+ 0.372803f, 0.551758f, 0.375000f, 0.544434f, 0.375000f, 0.537598f, 0.376465f, 0.530273f,
+ 0.376465f, 0.521973f, 0.375977f, 0.514160f, 0.375000f, 0.505371f, 0.374268f, 0.497314f,
+ 0.372314f, 0.487549f, 0.369629f, 0.477783f, 0.366699f, 0.465820f, 0.363525f, 0.454590f,
+ 0.358398f, 0.441406f, 0.354004f, 0.427979f, 0.347168f, 0.412842f, 0.340088f, 0.396484f,
+ 0.331787f, 0.377686f, 0.321533f, 0.356201f, 0.309326f, 0.331787f, 0.296143f, 0.303711f,
+ 0.278320f, 0.269043f, 0.256104f, 0.226440f, 0.225586f, 0.165283f, 0.173584f, 0.061523f,
+ 0.000000f, 1.000000f, 0.016647f, 0.991699f, 0.033936f, 0.979004f, 0.050934f, 0.965332f,
+ 0.067566f, 0.950684f, 0.083801f, 0.936035f, 0.099915f, 0.920410f, 0.115051f, 0.905762f,
+ 0.129272f, 0.890625f, 0.143677f, 0.876465f, 0.157593f, 0.861328f, 0.170532f, 0.847168f,
+ 0.183716f, 0.833008f, 0.196289f, 0.818359f, 0.208740f, 0.805176f, 0.219238f, 0.791992f,
+ 0.230957f, 0.778320f, 0.241821f, 0.765625f, 0.251465f, 0.753418f, 0.261475f, 0.741211f,
+ 0.271240f, 0.729004f, 0.279785f, 0.717773f, 0.289795f, 0.706055f, 0.296875f, 0.695312f,
+ 0.305176f, 0.684570f, 0.312744f, 0.673828f, 0.319824f, 0.663574f, 0.327148f, 0.653320f,
+ 0.333496f, 0.643555f, 0.340332f, 0.633301f, 0.346436f, 0.624023f, 0.352051f, 0.614746f,
+ 0.357422f, 0.605957f, 0.362549f, 0.597168f, 0.366455f, 0.588867f, 0.370850f, 0.580566f,
+ 0.374268f, 0.572754f, 0.378174f, 0.565430f, 0.381104f, 0.558105f, 0.384277f, 0.551270f,
+ 0.385498f, 0.543945f, 0.386963f, 0.537109f, 0.389893f, 0.529297f, 0.389648f, 0.521484f,
+ 0.391357f, 0.513184f, 0.392090f, 0.504395f, 0.391602f, 0.496338f, 0.390869f, 0.487549f,
+ 0.388672f, 0.478027f, 0.387207f, 0.468018f, 0.385254f, 0.456787f, 0.382568f, 0.446289f,
+ 0.379150f, 0.433105f, 0.374268f, 0.418945f, 0.368652f, 0.404541f, 0.362549f, 0.387451f,
+ 0.354980f, 0.369629f, 0.345947f, 0.348389f, 0.336182f, 0.324707f, 0.322998f, 0.297119f,
+ 0.306152f, 0.263916f, 0.285889f, 0.221436f, 0.255859f, 0.161743f, 0.203735f, 0.060760f,
+ 0.000000f, 1.000000f, 0.016815f, 0.991699f, 0.034088f, 0.979004f, 0.051514f, 0.964844f,
+ 0.068787f, 0.950195f, 0.083984f, 0.936035f, 0.099487f, 0.920898f, 0.115906f, 0.904785f,
+ 0.129517f, 0.890625f, 0.144287f, 0.875488f, 0.158936f, 0.860352f, 0.172974f, 0.845215f,
+ 0.185669f, 0.831055f, 0.197876f, 0.817383f, 0.210449f, 0.803711f, 0.221802f, 0.790527f,
+ 0.232788f, 0.777344f, 0.244385f, 0.764160f, 0.254395f, 0.751465f, 0.264404f, 0.739258f,
+ 0.274658f, 0.727051f, 0.283936f, 0.715332f, 0.293457f, 0.703613f, 0.302490f, 0.691895f,
+ 0.310303f, 0.681152f, 0.318848f, 0.669922f, 0.326172f, 0.659180f, 0.334229f, 0.648438f,
+ 0.341309f, 0.638184f, 0.347656f, 0.628418f, 0.353760f, 0.618652f, 0.361328f, 0.608887f,
+ 0.366211f, 0.600098f, 0.370361f, 0.591309f, 0.375977f, 0.582520f, 0.381592f, 0.573730f,
+ 0.384766f, 0.565918f, 0.388672f, 0.558105f, 0.392822f, 0.550293f, 0.395996f, 0.542480f,
+ 0.399414f, 0.535156f, 0.401367f, 0.527832f, 0.403320f, 0.520020f, 0.405273f, 0.512207f,
+ 0.406250f, 0.504395f, 0.407227f, 0.495850f, 0.407959f, 0.487793f, 0.408447f, 0.478271f,
+ 0.407959f, 0.468994f, 0.406250f, 0.458496f, 0.405518f, 0.447754f, 0.402588f, 0.436523f,
+ 0.399902f, 0.423828f, 0.395752f, 0.410400f, 0.392578f, 0.395996f, 0.386475f, 0.379150f,
+ 0.379150f, 0.361328f, 0.372070f, 0.341064f, 0.361816f, 0.317383f, 0.349854f, 0.290527f,
+ 0.333984f, 0.258057f, 0.315430f, 0.216797f, 0.285889f, 0.158936f, 0.235107f, 0.058167f,
+ 0.000000f, 1.000000f, 0.016891f, 0.991699f, 0.034027f, 0.979004f, 0.051239f, 0.965332f,
+ 0.068054f, 0.950195f, 0.084473f, 0.935547f, 0.100037f, 0.920410f, 0.116028f, 0.904785f,
+ 0.131470f, 0.889160f, 0.145996f, 0.874023f, 0.160278f, 0.859375f, 0.173584f, 0.845215f,
+ 0.187744f, 0.830078f, 0.199829f, 0.816406f, 0.212646f, 0.802246f, 0.224365f, 0.789062f,
+ 0.236206f, 0.775391f, 0.246460f, 0.762695f, 0.257568f, 0.749512f, 0.268311f, 0.736816f,
+ 0.278564f, 0.724609f, 0.288574f, 0.712402f, 0.298828f, 0.700195f, 0.307617f, 0.687988f,
+ 0.315918f, 0.676758f, 0.324707f, 0.665527f, 0.333008f, 0.654785f, 0.340576f, 0.644043f,
+ 0.347656f, 0.633789f, 0.354004f, 0.623535f, 0.361572f, 0.613770f, 0.367920f, 0.604004f,
+ 0.374268f, 0.594238f, 0.380127f, 0.584961f, 0.386475f, 0.575684f, 0.392334f, 0.566406f,
+ 0.395996f, 0.558105f, 0.399658f, 0.549805f, 0.403809f, 0.541992f, 0.407715f, 0.534668f,
+ 0.411865f, 0.526855f, 0.414795f, 0.519043f, 0.417236f, 0.511230f, 0.420410f, 0.502930f,
+ 0.421631f, 0.494629f, 0.423828f, 0.486572f, 0.424072f, 0.478027f, 0.425293f, 0.468750f,
+ 0.424805f, 0.458984f, 0.424805f, 0.448730f, 0.424561f, 0.438232f, 0.421875f, 0.426758f,
+ 0.420410f, 0.414307f, 0.416748f, 0.401611f, 0.414795f, 0.386230f, 0.409912f, 0.370605f,
+ 0.403564f, 0.353027f, 0.396973f, 0.332764f, 0.387207f, 0.309814f, 0.376709f, 0.283203f,
+ 0.363037f, 0.250977f, 0.344727f, 0.211914f, 0.317139f, 0.154907f, 0.268311f, 0.057495f,
+ 0.000000f, 1.000000f, 0.016891f, 0.991699f, 0.034027f, 0.979004f, 0.051636f, 0.964844f,
+ 0.067871f, 0.950684f, 0.084351f, 0.935547f, 0.101257f, 0.919434f, 0.117004f, 0.904297f,
+ 0.132812f, 0.888672f, 0.147461f, 0.873047f, 0.161621f, 0.858398f, 0.175415f, 0.843750f,
+ 0.188232f, 0.829590f, 0.199951f, 0.816406f, 0.214233f, 0.801270f, 0.226318f, 0.787598f,
+ 0.237793f, 0.774414f, 0.250732f, 0.760254f, 0.261963f, 0.747559f, 0.271729f, 0.734375f,
+ 0.283447f, 0.721680f, 0.293213f, 0.708984f, 0.303467f, 0.697266f, 0.312500f, 0.685059f,
+ 0.321289f, 0.673340f, 0.330322f, 0.661621f, 0.338867f, 0.650879f, 0.346924f, 0.639648f,
+ 0.355957f, 0.628418f, 0.363281f, 0.618164f, 0.370117f, 0.607910f, 0.375977f, 0.598145f,
+ 0.383301f, 0.587891f, 0.390869f, 0.578125f, 0.395020f, 0.569336f, 0.401611f, 0.559570f,
+ 0.406982f, 0.550781f, 0.411621f, 0.541992f, 0.416504f, 0.534180f, 0.421143f, 0.525391f,
+ 0.425049f, 0.517578f, 0.429199f, 0.509277f, 0.431396f, 0.501465f, 0.434814f, 0.493408f,
+ 0.437500f, 0.485107f, 0.438965f, 0.476807f, 0.441895f, 0.467529f, 0.442627f, 0.458984f,
+ 0.442871f, 0.449219f, 0.443359f, 0.439453f, 0.443848f, 0.427979f, 0.443115f, 0.416992f,
+ 0.441650f, 0.404785f, 0.439209f, 0.392334f, 0.437012f, 0.376953f, 0.433594f, 0.361328f,
+ 0.427490f, 0.344238f, 0.422363f, 0.324463f, 0.414307f, 0.302002f, 0.405029f, 0.276611f,
+ 0.391846f, 0.244995f, 0.374756f, 0.206055f, 0.348633f, 0.151367f, 0.302490f, 0.056274f,
+ 0.000000f, 1.000000f, 0.016785f, 0.991699f, 0.034454f, 0.979004f, 0.051300f, 0.965332f,
+ 0.068359f, 0.950195f, 0.085144f, 0.934570f, 0.101685f, 0.918945f, 0.118408f, 0.902832f,
+ 0.133423f, 0.887695f, 0.148560f, 0.873047f, 0.161987f, 0.858398f, 0.176270f, 0.843750f,
+ 0.189941f, 0.829102f, 0.204346f, 0.813965f, 0.216919f, 0.799805f, 0.229126f, 0.786133f,
+ 0.241455f, 0.772461f, 0.252686f, 0.758301f, 0.265137f, 0.745117f, 0.276611f, 0.731445f,
+ 0.286865f, 0.718750f, 0.297607f, 0.706543f, 0.308105f, 0.693359f, 0.316650f, 0.682129f,
+ 0.326172f, 0.670410f, 0.336914f, 0.657715f, 0.345703f, 0.646484f, 0.353516f, 0.635254f,
+ 0.362549f, 0.624023f, 0.370605f, 0.613281f, 0.377686f, 0.602539f, 0.385254f, 0.592285f,
+ 0.392334f, 0.582031f, 0.398926f, 0.572266f, 0.405029f, 0.562500f, 0.410645f, 0.553223f,
+ 0.417725f, 0.542969f, 0.423584f, 0.534180f, 0.428467f, 0.525391f, 0.432861f, 0.517090f,
+ 0.438477f, 0.508301f, 0.443115f, 0.500000f, 0.446045f, 0.492432f, 0.449463f, 0.483887f,
+ 0.452881f, 0.475342f, 0.455078f, 0.467041f, 0.458740f, 0.457520f, 0.459717f, 0.448486f,
+ 0.460938f, 0.438965f, 0.462646f, 0.428711f, 0.463135f, 0.418457f, 0.464355f, 0.406982f,
+ 0.462891f, 0.394531f, 0.460693f, 0.382324f, 0.459473f, 0.367432f, 0.456299f, 0.352295f,
+ 0.453369f, 0.334473f, 0.448242f, 0.315674f, 0.441162f, 0.294189f, 0.433350f, 0.268799f,
+ 0.421387f, 0.238403f, 0.405518f, 0.200195f, 0.382080f, 0.146362f, 0.337402f, 0.054291f,
+ 0.000000f, 1.000000f, 0.016983f, 0.991211f, 0.034607f, 0.978516f, 0.051331f, 0.964844f,
+ 0.068726f, 0.950195f, 0.086365f, 0.934082f, 0.102539f, 0.918457f, 0.118408f, 0.902832f,
+ 0.134033f, 0.887695f, 0.147705f, 0.873535f, 0.163452f, 0.857910f, 0.177856f, 0.842773f,
+ 0.191406f, 0.828125f, 0.204712f, 0.813477f, 0.217651f, 0.798828f, 0.231689f, 0.784180f,
+ 0.244263f, 0.770020f, 0.256348f, 0.756348f, 0.267578f, 0.743164f, 0.280273f, 0.729492f,
+ 0.290527f, 0.716797f, 0.302002f, 0.703613f, 0.312012f, 0.690918f, 0.322754f, 0.678223f,
+ 0.333008f, 0.666016f, 0.342773f, 0.653809f, 0.352539f, 0.642090f, 0.360107f, 0.630371f,
+ 0.369141f, 0.619141f, 0.379150f, 0.607422f, 0.386475f, 0.596680f, 0.393555f, 0.586426f,
+ 0.401855f, 0.575684f, 0.409180f, 0.565430f, 0.416260f, 0.555176f, 0.422363f, 0.545410f,
+ 0.429443f, 0.535645f, 0.434326f, 0.526367f, 0.439941f, 0.517090f, 0.446045f, 0.507812f,
+ 0.451904f, 0.499268f, 0.455078f, 0.491455f, 0.461670f, 0.481934f, 0.464844f, 0.474365f,
+ 0.468262f, 0.465088f, 0.471680f, 0.456543f, 0.475098f, 0.447021f, 0.477783f, 0.438232f,
+ 0.479980f, 0.428467f, 0.482422f, 0.417969f, 0.483643f, 0.407471f, 0.483643f, 0.396240f,
+ 0.484131f, 0.385010f, 0.483643f, 0.371582f, 0.482666f, 0.357910f, 0.480469f, 0.342285f,
+ 0.478516f, 0.325684f, 0.473145f, 0.306641f, 0.468506f, 0.285156f, 0.460693f, 0.260986f,
+ 0.451660f, 0.231201f, 0.436768f, 0.194458f, 0.415283f, 0.141968f, 0.373047f, 0.053589f,
+ 0.000000f, 1.000000f, 0.016998f, 0.991211f, 0.034210f, 0.979004f, 0.052094f, 0.964355f,
+ 0.069275f, 0.949219f, 0.086426f, 0.933594f, 0.102783f, 0.918457f, 0.118774f, 0.902832f,
+ 0.134521f, 0.887695f, 0.149170f, 0.872559f, 0.164673f, 0.856934f, 0.178589f, 0.842285f,
+ 0.193604f, 0.826660f, 0.208252f, 0.811035f, 0.221802f, 0.796875f, 0.234985f, 0.782227f,
+ 0.246216f, 0.769043f, 0.259033f, 0.754883f, 0.272217f, 0.740234f, 0.283447f, 0.727539f,
+ 0.295898f, 0.713379f, 0.305908f, 0.700684f, 0.317139f, 0.687500f, 0.328125f, 0.674805f,
+ 0.338135f, 0.662109f, 0.347168f, 0.650391f, 0.358154f, 0.638184f, 0.367432f, 0.625977f,
+ 0.377686f, 0.614258f, 0.385254f, 0.603027f, 0.393555f, 0.591797f, 0.402100f, 0.580566f,
+ 0.411621f, 0.569824f, 0.419189f, 0.558594f, 0.425781f, 0.548340f, 0.432861f, 0.538086f,
+ 0.439941f, 0.528320f, 0.446777f, 0.518066f, 0.453369f, 0.508301f, 0.458252f, 0.499512f,
+ 0.464111f, 0.490479f, 0.469971f, 0.481201f, 0.475342f, 0.472412f, 0.479736f, 0.464111f,
+ 0.484375f, 0.455566f, 0.488281f, 0.445801f, 0.492188f, 0.437012f, 0.496094f, 0.427002f,
+ 0.498291f, 0.417725f, 0.501465f, 0.407227f, 0.503906f, 0.396484f, 0.504883f, 0.385742f,
+ 0.506348f, 0.373535f, 0.504883f, 0.361084f, 0.506348f, 0.347656f, 0.505371f, 0.332031f,
+ 0.503418f, 0.316162f, 0.500488f, 0.297363f, 0.495117f, 0.277344f, 0.489746f, 0.252686f,
+ 0.481934f, 0.224121f, 0.468018f, 0.187988f, 0.448242f, 0.137451f, 0.409912f, 0.051300f,
+ 0.000000f, 1.000000f, 0.016922f, 0.991211f, 0.034454f, 0.978516f, 0.052185f, 0.964355f,
+ 0.070251f, 0.948242f, 0.087158f, 0.933105f, 0.104004f, 0.917969f, 0.119263f, 0.902832f,
+ 0.135132f, 0.887695f, 0.150391f, 0.872070f, 0.166138f, 0.855957f, 0.180908f, 0.840820f,
+ 0.195557f, 0.825195f, 0.209229f, 0.810547f, 0.223511f, 0.795410f, 0.235962f, 0.781250f,
+ 0.250000f, 0.766602f, 0.263184f, 0.752441f, 0.274414f, 0.738281f, 0.287354f, 0.724609f,
+ 0.298584f, 0.710938f, 0.311279f, 0.697754f, 0.321777f, 0.684570f, 0.333008f, 0.671387f,
+ 0.344238f, 0.658203f, 0.354736f, 0.645508f, 0.364258f, 0.633789f, 0.374512f, 0.621094f,
+ 0.384033f, 0.609375f, 0.393555f, 0.597168f, 0.402100f, 0.585938f, 0.410889f, 0.574707f,
+ 0.418701f, 0.563965f, 0.427979f, 0.552246f, 0.436279f, 0.541504f, 0.444092f, 0.530762f,
+ 0.451416f, 0.520508f, 0.458008f, 0.510742f, 0.465820f, 0.500000f, 0.471680f, 0.490234f,
+ 0.478027f, 0.480957f, 0.484375f, 0.471680f, 0.489502f, 0.462402f, 0.494873f, 0.453369f,
+ 0.500000f, 0.444824f, 0.504883f, 0.435059f, 0.509766f, 0.425537f, 0.513672f, 0.416504f,
+ 0.517090f, 0.406250f, 0.520508f, 0.396484f, 0.522461f, 0.385986f, 0.525879f, 0.374756f,
+ 0.527344f, 0.363281f, 0.528809f, 0.350586f, 0.529297f, 0.336914f, 0.529785f, 0.322021f,
+ 0.528809f, 0.305420f, 0.525879f, 0.288086f, 0.522461f, 0.267578f, 0.518066f, 0.244263f,
+ 0.511230f, 0.216553f, 0.500000f, 0.181641f, 0.482910f, 0.132812f, 0.446777f, 0.049377f,
+ 0.000000f, 1.000000f, 0.016632f, 0.991699f, 0.034515f, 0.978516f, 0.051971f, 0.964355f,
+ 0.070496f, 0.948242f, 0.087646f, 0.933105f, 0.103149f, 0.918457f, 0.120117f, 0.902344f,
+ 0.135864f, 0.886719f, 0.151733f, 0.871094f, 0.167358f, 0.854980f, 0.182983f, 0.839355f,
+ 0.196411f, 0.824707f, 0.210815f, 0.809570f, 0.224854f, 0.794434f, 0.239380f, 0.779297f,
+ 0.252930f, 0.764648f, 0.265381f, 0.750488f, 0.277588f, 0.736328f, 0.291748f, 0.722168f,
+ 0.303955f, 0.708008f, 0.315430f, 0.694336f, 0.327148f, 0.680664f, 0.338135f, 0.667969f,
+ 0.349609f, 0.654785f, 0.361328f, 0.641602f, 0.370850f, 0.628906f, 0.380615f, 0.616699f,
+ 0.391357f, 0.604492f, 0.400879f, 0.592285f, 0.411377f, 0.580078f, 0.420654f, 0.568359f,
+ 0.429199f, 0.556641f, 0.436523f, 0.545898f, 0.445801f, 0.534668f, 0.453857f, 0.523926f,
+ 0.462402f, 0.512695f, 0.469482f, 0.502930f, 0.478027f, 0.491943f, 0.485107f, 0.481689f,
+ 0.491699f, 0.471436f, 0.498535f, 0.461670f, 0.504395f, 0.452393f, 0.510254f, 0.442627f,
+ 0.515625f, 0.433594f, 0.521973f, 0.424316f, 0.526367f, 0.414795f, 0.530762f, 0.405273f,
+ 0.535645f, 0.395020f, 0.539062f, 0.385254f, 0.543457f, 0.374268f, 0.546875f, 0.363037f,
+ 0.549316f, 0.351807f, 0.551758f, 0.339111f, 0.552734f, 0.326416f, 0.554199f, 0.311279f,
+ 0.554199f, 0.295410f, 0.553223f, 0.278076f, 0.551270f, 0.258545f, 0.548340f, 0.235718f,
+ 0.541992f, 0.208008f, 0.531738f, 0.175049f, 0.516113f, 0.127808f, 0.482422f, 0.047516f,
+ 0.000000f, 1.000000f, 0.016479f, 0.991699f, 0.034515f, 0.978516f, 0.053406f, 0.962891f,
+ 0.070190f, 0.948730f, 0.088135f, 0.933105f, 0.103577f, 0.918457f, 0.120361f, 0.902832f,
+ 0.136719f, 0.886230f, 0.152954f, 0.870117f, 0.168457f, 0.854492f, 0.184326f, 0.838867f,
+ 0.197754f, 0.823730f, 0.212769f, 0.808594f, 0.228760f, 0.792480f, 0.241699f, 0.778320f,
+ 0.255127f, 0.763184f, 0.269043f, 0.748535f, 0.282715f, 0.733887f, 0.294434f, 0.719727f,
+ 0.307861f, 0.705078f, 0.318848f, 0.691895f, 0.332031f, 0.678223f, 0.343994f, 0.664062f,
+ 0.354492f, 0.650879f, 0.367188f, 0.637695f, 0.376953f, 0.625000f, 0.389160f, 0.611816f,
+ 0.398926f, 0.599121f, 0.408691f, 0.586914f, 0.419922f, 0.574219f, 0.428955f, 0.562988f,
+ 0.437744f, 0.550781f, 0.446533f, 0.539062f, 0.455566f, 0.527832f, 0.466309f, 0.515625f,
+ 0.473145f, 0.505371f, 0.482422f, 0.493896f, 0.490234f, 0.483154f, 0.497070f, 0.472900f,
+ 0.505371f, 0.462158f, 0.511230f, 0.452393f, 0.519043f, 0.441650f, 0.524902f, 0.432373f,
+ 0.533203f, 0.422363f, 0.537598f, 0.413086f, 0.544922f, 0.403564f, 0.549316f, 0.393066f,
+ 0.555664f, 0.383057f, 0.559570f, 0.373047f, 0.564453f, 0.362305f, 0.568359f, 0.351562f,
+ 0.570312f, 0.340332f, 0.573730f, 0.327637f, 0.576660f, 0.314697f, 0.578613f, 0.299561f,
+ 0.579590f, 0.284668f, 0.579590f, 0.268311f, 0.580078f, 0.247925f, 0.577148f, 0.226807f,
+ 0.572754f, 0.200439f, 0.563965f, 0.167725f, 0.551270f, 0.123474f, 0.520020f, 0.045990f,
+ 0.000000f, 1.000000f, 0.016113f, 0.992188f, 0.034698f, 0.978516f, 0.053680f, 0.962891f,
+ 0.071106f, 0.948242f, 0.087952f, 0.933105f, 0.103760f, 0.918457f, 0.120850f, 0.902344f,
+ 0.137939f, 0.885742f, 0.154175f, 0.869629f, 0.169434f, 0.854004f, 0.184814f, 0.838379f,
+ 0.200317f, 0.822754f, 0.216064f, 0.806641f, 0.229492f, 0.791504f, 0.244385f, 0.776367f,
+ 0.258789f, 0.761230f, 0.271729f, 0.746582f, 0.285889f, 0.731934f, 0.298584f, 0.717285f,
+ 0.311279f, 0.702637f, 0.324951f, 0.688477f, 0.337402f, 0.674316f, 0.348877f, 0.660645f,
+ 0.360840f, 0.647461f, 0.373047f, 0.633301f, 0.384277f, 0.620117f, 0.394043f, 0.607422f,
+ 0.406250f, 0.594238f, 0.416504f, 0.581543f, 0.427734f, 0.568848f, 0.437988f, 0.556641f,
+ 0.448730f, 0.543945f, 0.457031f, 0.532227f, 0.466553f, 0.520508f, 0.476562f, 0.508301f,
+ 0.485840f, 0.497070f, 0.493896f, 0.486084f, 0.502441f, 0.474854f, 0.510254f, 0.463867f,
+ 0.518555f, 0.453369f, 0.527344f, 0.441650f, 0.533691f, 0.431885f, 0.541992f, 0.421143f,
+ 0.548340f, 0.411133f, 0.555176f, 0.401367f, 0.561035f, 0.391602f, 0.568359f, 0.381592f,
+ 0.572266f, 0.371582f, 0.578613f, 0.360840f, 0.583496f, 0.350586f, 0.589844f, 0.339355f,
+ 0.593262f, 0.327393f, 0.596680f, 0.315430f, 0.600098f, 0.302490f, 0.602539f, 0.288818f,
+ 0.605469f, 0.273438f, 0.606934f, 0.256836f, 0.606934f, 0.238281f, 0.604980f, 0.217285f,
+ 0.604004f, 0.191895f, 0.597168f, 0.160522f, 0.584961f, 0.117798f, 0.556641f, 0.044098f,
+ 0.000000f, 1.000000f, 0.016373f, 0.991699f, 0.034668f, 0.978516f, 0.053589f, 0.963379f,
+ 0.070435f, 0.949219f, 0.087769f, 0.933594f, 0.104797f, 0.917480f, 0.122681f, 0.900879f,
+ 0.138794f, 0.885254f, 0.153687f, 0.870117f, 0.170044f, 0.853516f, 0.186768f, 0.836914f,
+ 0.202271f, 0.821289f, 0.217651f, 0.805664f, 0.231812f, 0.790039f, 0.246704f, 0.774414f,
+ 0.260254f, 0.759766f, 0.275391f, 0.744141f, 0.288574f, 0.729492f, 0.303467f, 0.714355f,
+ 0.315186f, 0.700195f, 0.329590f, 0.685547f, 0.341064f, 0.671387f, 0.354736f, 0.657227f,
+ 0.366455f, 0.643066f, 0.379639f, 0.629395f, 0.391846f, 0.615723f, 0.402344f, 0.602539f,
+ 0.413330f, 0.589355f, 0.424805f, 0.576172f, 0.434570f, 0.563477f, 0.445557f, 0.550781f,
+ 0.457031f, 0.538086f, 0.466553f, 0.525879f, 0.477295f, 0.513184f, 0.486816f, 0.501465f,
+ 0.496094f, 0.489502f, 0.505859f, 0.477539f, 0.515625f, 0.465820f, 0.523926f, 0.454834f,
+ 0.532715f, 0.443359f, 0.540527f, 0.432617f, 0.548828f, 0.421631f, 0.557129f, 0.410645f,
+ 0.564453f, 0.400146f, 0.572266f, 0.389404f, 0.579590f, 0.379395f, 0.585449f, 0.369873f,
+ 0.592285f, 0.359619f, 0.598633f, 0.348389f, 0.604980f, 0.337891f, 0.609375f, 0.326904f,
+ 0.615723f, 0.315186f, 0.619141f, 0.303223f, 0.623535f, 0.290283f, 0.627930f, 0.276855f,
+ 0.631348f, 0.262207f, 0.633789f, 0.246460f, 0.634766f, 0.227783f, 0.634277f, 0.207397f,
+ 0.633301f, 0.182617f, 0.627930f, 0.153076f, 0.618652f, 0.112427f, 0.597168f, 0.042389f,
+ 0.000000f, 1.000000f, 0.016586f, 0.991699f, 0.035858f, 0.977051f, 0.053131f, 0.963867f,
+ 0.070496f, 0.949219f, 0.088135f, 0.933105f, 0.105225f, 0.917480f, 0.122559f, 0.900879f,
+ 0.139160f, 0.884766f, 0.156372f, 0.868652f, 0.172485f, 0.852051f, 0.187988f, 0.836426f,
+ 0.203735f, 0.820801f, 0.219604f, 0.804199f, 0.234985f, 0.788574f, 0.248535f, 0.773438f,
+ 0.264648f, 0.757324f, 0.278809f, 0.742188f, 0.293213f, 0.726562f, 0.306885f, 0.711914f,
+ 0.321045f, 0.696777f, 0.333252f, 0.682617f, 0.346924f, 0.667969f, 0.360107f, 0.653320f,
+ 0.372314f, 0.639160f, 0.385742f, 0.625000f, 0.396484f, 0.611816f, 0.409424f, 0.597656f,
+ 0.421143f, 0.584473f, 0.433838f, 0.570312f, 0.444336f, 0.557617f, 0.456299f, 0.544434f,
+ 0.466553f, 0.531738f, 0.477295f, 0.519043f, 0.488037f, 0.506348f, 0.498779f, 0.493652f,
+ 0.508301f, 0.481689f, 0.519043f, 0.469238f, 0.527832f, 0.457520f, 0.538086f, 0.445312f,
+ 0.544922f, 0.434326f, 0.555664f, 0.422607f, 0.564453f, 0.411133f, 0.572266f, 0.400146f,
+ 0.581543f, 0.388672f, 0.588379f, 0.378418f, 0.596680f, 0.367432f, 0.603516f, 0.357178f,
+ 0.611328f, 0.346436f, 0.618652f, 0.336182f, 0.624023f, 0.324951f, 0.631348f, 0.313965f,
+ 0.637695f, 0.302246f, 0.642090f, 0.290771f, 0.646973f, 0.278076f, 0.652344f, 0.264648f,
+ 0.656738f, 0.250244f, 0.660156f, 0.234253f, 0.662598f, 0.216431f, 0.664551f, 0.197266f,
+ 0.664062f, 0.174194f, 0.661133f, 0.145386f, 0.653809f, 0.106384f, 0.632324f, 0.039246f,
+ 0.000000f, 1.000000f, 0.016739f, 0.991211f, 0.036163f, 0.977051f, 0.053284f, 0.963867f,
+ 0.071106f, 0.948730f, 0.088806f, 0.932617f, 0.105652f, 0.916992f, 0.122620f, 0.900879f,
+ 0.139771f, 0.884766f, 0.156616f, 0.867676f, 0.172852f, 0.852051f, 0.188599f, 0.835938f,
+ 0.206177f, 0.818848f, 0.220703f, 0.803223f, 0.236450f, 0.787598f, 0.252441f, 0.770996f,
+ 0.267090f, 0.755859f, 0.281006f, 0.740234f, 0.296875f, 0.724609f, 0.309570f, 0.709961f,
+ 0.324463f, 0.694336f, 0.338379f, 0.679199f, 0.351562f, 0.664551f, 0.365967f, 0.649902f,
+ 0.379150f, 0.635254f, 0.391602f, 0.621094f, 0.404297f, 0.606934f, 0.416992f, 0.592773f,
+ 0.428955f, 0.579102f, 0.441406f, 0.564941f, 0.452881f, 0.551758f, 0.464844f, 0.538086f,
+ 0.476318f, 0.524902f, 0.487549f, 0.512207f, 0.498291f, 0.499268f, 0.507812f, 0.486816f,
+ 0.519531f, 0.473633f, 0.529297f, 0.461182f, 0.540527f, 0.448730f, 0.549805f, 0.437012f,
+ 0.560547f, 0.424316f, 0.570312f, 0.412598f, 0.578613f, 0.400879f, 0.588379f, 0.389404f,
+ 0.596680f, 0.377930f, 0.606445f, 0.365967f, 0.614258f, 0.355469f, 0.622070f, 0.344238f,
+ 0.630859f, 0.333252f, 0.638672f, 0.322754f, 0.645996f, 0.312012f, 0.652832f, 0.300293f,
+ 0.660645f, 0.289062f, 0.665527f, 0.277588f, 0.671875f, 0.265137f, 0.677246f, 0.251709f,
+ 0.681641f, 0.237915f, 0.687500f, 0.222046f, 0.690918f, 0.205688f, 0.692871f, 0.186523f,
+ 0.693848f, 0.164429f, 0.692871f, 0.137451f, 0.687012f, 0.100342f, 0.670898f, 0.037354f,
+ 0.000000f, 1.000000f, 0.016800f, 0.991211f, 0.036499f, 0.977051f, 0.053680f, 0.963867f,
+ 0.070740f, 0.948730f, 0.089417f, 0.932129f, 0.106201f, 0.916992f, 0.124146f, 0.899902f,
+ 0.141357f, 0.883789f, 0.158081f, 0.867188f, 0.174316f, 0.851074f, 0.190674f, 0.834473f,
+ 0.206421f, 0.818848f, 0.223022f, 0.802246f, 0.239136f, 0.785645f, 0.254639f, 0.770020f,
+ 0.270264f, 0.753906f, 0.284180f, 0.738281f, 0.299316f, 0.722656f, 0.314453f, 0.706543f,
+ 0.328857f, 0.691406f, 0.343262f, 0.676270f, 0.358154f, 0.660645f, 0.371826f, 0.645996f,
+ 0.384521f, 0.631348f, 0.398682f, 0.616699f, 0.411621f, 0.602051f, 0.423828f, 0.587891f,
+ 0.436279f, 0.574219f, 0.449951f, 0.559570f, 0.462402f, 0.545898f, 0.473389f, 0.532227f,
+ 0.485840f, 0.518555f, 0.497559f, 0.504883f, 0.508789f, 0.491943f, 0.520996f, 0.478516f,
+ 0.531250f, 0.465820f, 0.542480f, 0.452881f, 0.553711f, 0.439697f, 0.565430f, 0.427002f,
+ 0.574707f, 0.415039f, 0.584473f, 0.402832f, 0.594727f, 0.390381f, 0.604004f, 0.378662f,
+ 0.612793f, 0.366699f, 0.623535f, 0.354492f, 0.632324f, 0.343018f, 0.641113f, 0.331543f,
+ 0.649414f, 0.320312f, 0.658691f, 0.308838f, 0.665527f, 0.298340f, 0.674805f, 0.286865f,
+ 0.682129f, 0.275391f, 0.689941f, 0.263672f, 0.695801f, 0.252197f, 0.702637f, 0.238647f,
+ 0.708496f, 0.224976f, 0.713379f, 0.209839f, 0.718262f, 0.194214f, 0.723145f, 0.175781f,
+ 0.726074f, 0.155273f, 0.725586f, 0.129150f, 0.721191f, 0.093445f, 0.708496f, 0.035828f,
+ 0.000000f, 1.000000f, 0.016815f, 0.991211f, 0.035889f, 0.978027f, 0.053314f, 0.963867f,
+ 0.072266f, 0.947754f, 0.089172f, 0.932617f, 0.106995f, 0.916504f, 0.125122f, 0.899414f,
+ 0.141357f, 0.883789f, 0.158691f, 0.866699f, 0.176025f, 0.850098f, 0.192383f, 0.833496f,
+ 0.209351f, 0.816895f, 0.225708f, 0.800781f, 0.240845f, 0.784668f, 0.257080f, 0.768066f,
+ 0.272949f, 0.751953f, 0.288574f, 0.735352f, 0.303467f, 0.720215f, 0.317871f, 0.704102f,
+ 0.333740f, 0.688477f, 0.347168f, 0.673340f, 0.362305f, 0.658203f, 0.377197f, 0.642578f,
+ 0.389404f, 0.627930f, 0.403809f, 0.612793f, 0.418457f, 0.597656f, 0.431152f, 0.583008f,
+ 0.444336f, 0.568359f, 0.457275f, 0.554199f, 0.470459f, 0.540039f, 0.482666f, 0.525879f,
+ 0.495117f, 0.512207f, 0.506836f, 0.498535f, 0.519531f, 0.484863f, 0.531250f, 0.471191f,
+ 0.544434f, 0.457275f, 0.555176f, 0.444580f, 0.565430f, 0.431641f, 0.577148f, 0.418213f,
+ 0.587402f, 0.405762f, 0.599609f, 0.392334f, 0.609375f, 0.380127f, 0.620605f, 0.367432f,
+ 0.630371f, 0.355225f, 0.639648f, 0.343262f, 0.650391f, 0.330811f, 0.658691f, 0.319336f,
+ 0.668457f, 0.306885f, 0.677734f, 0.295410f, 0.687012f, 0.283691f, 0.695801f, 0.272705f,
+ 0.704102f, 0.261475f, 0.712402f, 0.249390f, 0.719238f, 0.237183f, 0.727051f, 0.224976f,
+ 0.733887f, 0.211426f, 0.741211f, 0.197021f, 0.745117f, 0.182251f, 0.750977f, 0.164185f,
+ 0.755371f, 0.144165f, 0.757324f, 0.119934f, 0.756836f, 0.087341f, 0.747070f, 0.032013f,
+ 0.000000f, 1.000000f, 0.017166f, 0.990723f, 0.035431f, 0.978516f, 0.053558f, 0.963867f,
+ 0.071533f, 0.948242f, 0.089539f, 0.932617f, 0.107849f, 0.915527f, 0.125122f, 0.899414f,
+ 0.142334f, 0.883301f, 0.160400f, 0.865723f, 0.176636f, 0.849609f, 0.193115f, 0.833008f,
+ 0.209717f, 0.816406f, 0.227417f, 0.799316f, 0.242676f, 0.783203f, 0.260010f, 0.766113f,
+ 0.276367f, 0.750000f, 0.291748f, 0.733398f, 0.307861f, 0.717773f, 0.322266f, 0.701660f,
+ 0.338623f, 0.685547f, 0.352539f, 0.669922f, 0.367432f, 0.654785f, 0.382812f, 0.638672f,
+ 0.396973f, 0.623535f, 0.410156f, 0.608398f, 0.424561f, 0.593262f, 0.438965f, 0.578125f,
+ 0.451660f, 0.563477f, 0.465820f, 0.548340f, 0.479736f, 0.534180f, 0.492188f, 0.519531f,
+ 0.505371f, 0.504883f, 0.518555f, 0.490967f, 0.530762f, 0.477295f, 0.541992f, 0.463379f,
+ 0.555664f, 0.449463f, 0.566406f, 0.436035f, 0.579102f, 0.422363f, 0.590820f, 0.408936f,
+ 0.602539f, 0.395508f, 0.614746f, 0.382080f, 0.626465f, 0.369385f, 0.635742f, 0.356934f,
+ 0.646973f, 0.343750f, 0.657227f, 0.331299f, 0.667480f, 0.318848f, 0.678711f, 0.306396f,
+ 0.687988f, 0.294189f, 0.698730f, 0.281494f, 0.708496f, 0.269531f, 0.717773f, 0.257568f,
+ 0.727539f, 0.245850f, 0.736328f, 0.234741f, 0.744141f, 0.222900f, 0.751953f, 0.210205f,
+ 0.760254f, 0.197510f, 0.768066f, 0.183472f, 0.774902f, 0.168091f, 0.780273f, 0.151489f,
+ 0.785156f, 0.133545f, 0.788574f, 0.111023f, 0.789551f, 0.080322f, 0.783203f, 0.028793f,
+ 0.000000f, 1.000000f, 0.017410f, 0.990234f, 0.035706f, 0.978027f, 0.053162f, 0.964355f,
+ 0.072021f, 0.948242f, 0.090149f, 0.932129f, 0.107239f, 0.916016f, 0.125000f, 0.899902f,
+ 0.143311f, 0.882812f, 0.161133f, 0.865723f, 0.177490f, 0.849121f, 0.196899f, 0.831543f,
+ 0.211670f, 0.814941f, 0.230225f, 0.797852f, 0.246826f, 0.780762f, 0.263184f, 0.764160f,
+ 0.279053f, 0.748047f, 0.294434f, 0.731934f, 0.310303f, 0.715332f, 0.325684f, 0.699219f,
+ 0.341797f, 0.683105f, 0.358398f, 0.666504f, 0.371826f, 0.651367f, 0.387207f, 0.635254f,
+ 0.403076f, 0.619141f, 0.417236f, 0.604004f, 0.431152f, 0.588867f, 0.445801f, 0.573242f,
+ 0.460205f, 0.558105f, 0.474609f, 0.542969f, 0.488037f, 0.528320f, 0.502930f, 0.513184f,
+ 0.516113f, 0.498535f, 0.528809f, 0.484131f, 0.541992f, 0.469727f, 0.555664f, 0.455078f,
+ 0.568848f, 0.440918f, 0.580566f, 0.427246f, 0.592285f, 0.413574f, 0.604492f, 0.399902f,
+ 0.616211f, 0.386230f, 0.627930f, 0.372559f, 0.641113f, 0.358887f, 0.652344f, 0.345703f,
+ 0.663574f, 0.332520f, 0.674316f, 0.319580f, 0.685547f, 0.306641f, 0.696289f, 0.293701f,
+ 0.707520f, 0.281006f, 0.718750f, 0.268066f, 0.729004f, 0.255371f, 0.738770f, 0.243164f,
+ 0.748047f, 0.231323f, 0.757812f, 0.218994f, 0.767578f, 0.207275f, 0.776367f, 0.195435f,
+ 0.784180f, 0.182495f, 0.792969f, 0.169556f, 0.802734f, 0.154785f, 0.809570f, 0.138794f,
+ 0.814941f, 0.121826f, 0.820801f, 0.101318f, 0.823730f, 0.072754f, 0.820801f, 0.027664f,
+ 0.000000f, 1.000000f, 0.018005f, 0.990234f, 0.035400f, 0.978516f, 0.054352f, 0.962891f,
+ 0.071411f, 0.948730f, 0.090088f, 0.932129f, 0.108276f, 0.916016f, 0.126587f, 0.898926f,
+ 0.144775f, 0.881836f, 0.161987f, 0.864746f, 0.179077f, 0.848145f, 0.197144f, 0.831055f,
+ 0.214844f, 0.813477f, 0.230225f, 0.797363f, 0.248901f, 0.779785f, 0.264160f, 0.763184f,
+ 0.281250f, 0.746582f, 0.297363f, 0.729492f, 0.314209f, 0.712891f, 0.329590f, 0.696289f,
+ 0.346680f, 0.679688f, 0.362061f, 0.663574f, 0.378418f, 0.647461f, 0.394043f, 0.631348f,
+ 0.409180f, 0.615234f, 0.423584f, 0.599609f, 0.438965f, 0.583496f, 0.453369f, 0.568359f,
+ 0.468262f, 0.552734f, 0.482178f, 0.537598f, 0.497314f, 0.521973f, 0.512207f, 0.506836f,
+ 0.524902f, 0.492188f, 0.539062f, 0.477051f, 0.552246f, 0.462402f, 0.565918f, 0.447754f,
+ 0.580078f, 0.433105f, 0.592773f, 0.418945f, 0.604980f, 0.404785f, 0.617676f, 0.390381f,
+ 0.631836f, 0.375977f, 0.643066f, 0.362549f, 0.655273f, 0.348633f, 0.668457f, 0.334717f,
+ 0.680176f, 0.321045f, 0.692383f, 0.307617f, 0.704102f, 0.293945f, 0.716309f, 0.281250f,
+ 0.726562f, 0.267822f, 0.737793f, 0.254639f, 0.749512f, 0.242065f, 0.759766f, 0.228882f,
+ 0.770996f, 0.216064f, 0.781250f, 0.203491f, 0.791016f, 0.191162f, 0.801758f, 0.178711f,
+ 0.810547f, 0.166992f, 0.820312f, 0.154053f, 0.829102f, 0.139648f, 0.838867f, 0.125000f,
+ 0.845703f, 0.109192f, 0.853027f, 0.089905f, 0.856934f, 0.064453f, 0.855957f, 0.024933f,
+ 0.000000f, 1.000000f, 0.018250f, 0.990723f, 0.034637f, 0.979004f, 0.053894f, 0.963867f,
+ 0.073181f, 0.947266f, 0.090881f, 0.931641f, 0.109253f, 0.915039f, 0.127686f, 0.897949f,
+ 0.145020f, 0.881836f, 0.163452f, 0.864258f, 0.180908f, 0.847168f, 0.198608f, 0.830078f,
+ 0.216187f, 0.812500f, 0.232910f, 0.795898f, 0.250732f, 0.778320f, 0.268799f, 0.760742f,
+ 0.284424f, 0.744141f, 0.300049f, 0.727539f, 0.318115f, 0.710449f, 0.334961f, 0.693848f,
+ 0.350098f, 0.677246f, 0.367676f, 0.660156f, 0.383545f, 0.643555f, 0.398926f, 0.627441f,
+ 0.415527f, 0.611328f, 0.431152f, 0.595215f, 0.445801f, 0.579102f, 0.460938f, 0.562988f,
+ 0.476074f, 0.547363f, 0.490234f, 0.531738f, 0.504395f, 0.516113f, 0.520508f, 0.500488f,
+ 0.535156f, 0.485596f, 0.548828f, 0.470459f, 0.562988f, 0.455322f, 0.577148f, 0.439941f,
+ 0.591309f, 0.425049f, 0.605469f, 0.410400f, 0.618164f, 0.395752f, 0.630859f, 0.381348f,
+ 0.645020f, 0.366699f, 0.658203f, 0.352051f, 0.671875f, 0.337646f, 0.684570f, 0.323486f,
+ 0.697266f, 0.309814f, 0.708984f, 0.296143f, 0.721191f, 0.281982f, 0.734863f, 0.268311f,
+ 0.745605f, 0.254639f, 0.757324f, 0.241455f, 0.770020f, 0.227295f, 0.782227f, 0.214111f,
+ 0.793457f, 0.201416f, 0.804688f, 0.187622f, 0.816406f, 0.174438f, 0.826172f, 0.161987f,
+ 0.835938f, 0.149780f, 0.845703f, 0.137207f, 0.856934f, 0.124390f, 0.865723f, 0.110168f,
+ 0.875977f, 0.095398f, 0.884277f, 0.077576f, 0.890137f, 0.055084f, 0.891113f, 0.020645f,
+ 0.000000f, 1.000000f, 0.018402f, 0.990723f, 0.036224f, 0.977539f, 0.053894f, 0.963867f,
+ 0.072876f, 0.947754f, 0.091736f, 0.931152f, 0.109619f, 0.915039f, 0.127319f, 0.898438f,
+ 0.145142f, 0.881348f, 0.164307f, 0.863281f, 0.182251f, 0.846191f, 0.199219f, 0.829590f,
+ 0.217651f, 0.811523f, 0.235596f, 0.793945f, 0.253906f, 0.776855f, 0.270996f, 0.759277f,
+ 0.287598f, 0.742188f, 0.305420f, 0.725098f, 0.322266f, 0.708008f, 0.338867f, 0.691406f,
+ 0.355957f, 0.673828f, 0.372803f, 0.656738f, 0.388916f, 0.640137f, 0.404785f, 0.623535f,
+ 0.419922f, 0.607422f, 0.436035f, 0.590820f, 0.453125f, 0.574219f, 0.468994f, 0.558105f,
+ 0.484619f, 0.541992f, 0.499756f, 0.525391f, 0.515137f, 0.509766f, 0.530273f, 0.494141f,
+ 0.545410f, 0.478760f, 0.559082f, 0.463135f, 0.573730f, 0.447754f, 0.588867f, 0.432129f,
+ 0.603516f, 0.416992f, 0.617188f, 0.401611f, 0.631348f, 0.386475f, 0.645996f, 0.371338f,
+ 0.659668f, 0.356689f, 0.674805f, 0.341553f, 0.687988f, 0.327148f, 0.700684f, 0.312988f,
+ 0.713379f, 0.298828f, 0.725586f, 0.284180f, 0.739746f, 0.269775f, 0.753418f, 0.255371f,
+ 0.765625f, 0.241333f, 0.777832f, 0.227783f, 0.790039f, 0.213623f, 0.802734f, 0.199951f,
+ 0.815430f, 0.185791f, 0.827637f, 0.172241f, 0.838867f, 0.159424f, 0.850586f, 0.145752f,
+ 0.861328f, 0.132446f, 0.873047f, 0.119141f, 0.883301f, 0.106384f, 0.894043f, 0.093933f,
+ 0.905273f, 0.080444f, 0.914551f, 0.064392f, 0.923340f, 0.045380f, 0.929199f, 0.016312f,
+ 0.000000f, 1.000000f, 0.018188f, 0.990723f, 0.036255f, 0.977539f, 0.054260f, 0.963379f,
+ 0.073486f, 0.946777f, 0.091797f, 0.931152f, 0.109375f, 0.915039f, 0.127930f, 0.897949f,
+ 0.147095f, 0.880371f, 0.164917f, 0.863281f, 0.183350f, 0.845703f, 0.201660f, 0.828125f,
+ 0.220215f, 0.810059f, 0.238281f, 0.792480f, 0.255371f, 0.775391f, 0.272461f, 0.758301f,
+ 0.291016f, 0.740234f, 0.308350f, 0.723145f, 0.326172f, 0.705566f, 0.343262f, 0.687988f,
+ 0.360107f, 0.670898f, 0.377197f, 0.653809f, 0.393799f, 0.636719f, 0.410156f, 0.620117f,
+ 0.426514f, 0.603027f, 0.444092f, 0.585938f, 0.459473f, 0.569824f, 0.476562f, 0.552734f,
+ 0.493408f, 0.536621f, 0.508301f, 0.520020f, 0.523438f, 0.503906f, 0.539062f, 0.487793f,
+ 0.555176f, 0.471680f, 0.570312f, 0.455811f, 0.585938f, 0.439941f, 0.600586f, 0.424072f,
+ 0.616699f, 0.408447f, 0.630859f, 0.393066f, 0.644531f, 0.377686f, 0.660156f, 0.362061f,
+ 0.674316f, 0.346924f, 0.687988f, 0.332031f, 0.702637f, 0.316650f, 0.717285f, 0.301514f,
+ 0.729980f, 0.286865f, 0.744629f, 0.272217f, 0.756836f, 0.257568f, 0.771484f, 0.242920f,
+ 0.784668f, 0.228516f, 0.797363f, 0.214233f, 0.811523f, 0.199585f, 0.824707f, 0.185425f,
+ 0.836914f, 0.171387f, 0.849609f, 0.157104f, 0.861328f, 0.143433f, 0.875000f, 0.129150f,
+ 0.886719f, 0.115479f, 0.897949f, 0.102600f, 0.910645f, 0.088196f, 0.922852f, 0.074524f,
+ 0.934082f, 0.061005f, 0.945801f, 0.047729f, 0.956055f, 0.032867f, 0.963379f, 0.011261f,
+ 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.035645f, 0.978516f, 0.053741f, 0.963867f,
+ 0.073975f, 0.946777f, 0.091614f, 0.931152f, 0.109009f, 0.915527f, 0.129028f, 0.897461f,
+ 0.148804f, 0.878906f, 0.166138f, 0.862305f, 0.184204f, 0.845215f, 0.203125f, 0.827148f,
+ 0.221313f, 0.809570f, 0.240356f, 0.791504f, 0.257812f, 0.773438f, 0.275879f, 0.756348f,
+ 0.294189f, 0.738281f, 0.311523f, 0.720703f, 0.329346f, 0.703125f, 0.346924f, 0.685547f,
+ 0.364258f, 0.668457f, 0.382568f, 0.650879f, 0.399170f, 0.633301f, 0.416504f, 0.616211f,
+ 0.433838f, 0.598633f, 0.450684f, 0.581543f, 0.467773f, 0.564941f, 0.483887f, 0.547852f,
+ 0.500488f, 0.531250f, 0.516602f, 0.514160f, 0.532715f, 0.497803f, 0.549316f, 0.481445f,
+ 0.565430f, 0.465088f, 0.581055f, 0.448730f, 0.596680f, 0.432617f, 0.612305f, 0.416504f,
+ 0.627441f, 0.400391f, 0.642578f, 0.384521f, 0.657227f, 0.368896f, 0.672363f, 0.353027f,
+ 0.687988f, 0.337158f, 0.703613f, 0.321289f, 0.719238f, 0.305664f, 0.734375f, 0.290283f,
+ 0.748535f, 0.275391f, 0.762207f, 0.260498f, 0.775879f, 0.245728f, 0.789062f, 0.231079f,
+ 0.802734f, 0.215820f, 0.817383f, 0.200562f, 0.832031f, 0.185303f, 0.847168f, 0.170410f,
+ 0.860840f, 0.156006f, 0.871582f, 0.142822f, 0.884277f, 0.128174f, 0.898438f, 0.113220f,
+ 0.912109f, 0.098511f, 0.925781f, 0.084290f, 0.936523f, 0.070618f, 0.952148f, 0.055542f,
+ 0.963379f, 0.042084f, 0.975098f, 0.028702f, 0.983887f, 0.016449f, 0.999512f, 0.000059f,
+ },
+ {
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f, 0.000000f, 0.997070f,
+ 0.000000f, 0.995605f, 0.000000f, 0.993164f, 0.000000f, 0.990723f, 0.000000f, 0.988281f,
+ 0.000000f, 0.984863f, 0.000000f, 0.981445f, 0.000000f, 0.978027f, 0.000000f, 0.974609f,
+ 0.000000f, 0.970215f, 0.000000f, 0.965820f, 0.000000f, 0.960938f, 0.000000f, 0.956543f,
+ 0.000000f, 0.951660f, 0.000000f, 0.946777f, 0.000000f, 0.940430f, 0.000000f, 0.934570f,
+ 0.000000f, 0.928223f, 0.000000f, 0.921387f, 0.000000f, 0.915527f, 0.000000f, 0.908691f,
+ 0.000000f, 0.901367f, 0.000000f, 0.893555f, 0.000000f, 0.885254f, 0.000000f, 0.877441f,
+ 0.000000f, 0.869629f, 0.000000f, 0.860840f, 0.000000f, 0.852051f, 0.000000f, 0.842285f,
+ 0.000000f, 0.832520f, 0.000000f, 0.822266f, 0.000000f, 0.812500f, 0.000000f, 0.802246f,
+ 0.000000f, 0.791016f, 0.000000f, 0.778809f, 0.000000f, 0.766602f, 0.000000f, 0.754883f,
+ 0.000000f, 0.742676f, 0.000000f, 0.729492f, 0.000000f, 0.714844f, 0.000000f, 0.700684f,
+ 0.000000f, 0.685547f, 0.000000f, 0.670410f, 0.000000f, 0.654785f, 0.000000f, 0.637695f,
+ 0.000000f, 0.620117f, 0.000000f, 0.600586f, 0.000000f, 0.581055f, 0.000000f, 0.561523f,
+ 0.000000f, 0.540527f, 0.000000f, 0.516602f, 0.000000f, 0.491211f, 0.000000f, 0.465820f,
+ 0.000000f, 0.439697f, 0.000000f, 0.406738f, 0.000000f, 0.371582f, 0.000000f, 0.336182f,
+ 0.000000f, 0.291992f, 0.000000f, 0.238159f, 0.000000f, 0.169434f, 0.000000f, 0.067261f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997070f,
+ 0.000000f, 0.995117f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, 0.000000f, 0.988281f,
+ 0.000000f, 0.984863f, 0.000000f, 0.981445f, 0.000000f, 0.978027f, 0.000000f, 0.974609f,
+ 0.000000f, 0.970215f, 0.000000f, 0.965332f, 0.000000f, 0.960938f, 0.000000f, 0.956055f,
+ 0.000000f, 0.950684f, 0.000000f, 0.945801f, 0.000000f, 0.939941f, 0.000000f, 0.934082f,
+ 0.000000f, 0.927734f, 0.000000f, 0.921387f, 0.000000f, 0.915039f, 0.000000f, 0.908203f,
+ 0.000000f, 0.900879f, 0.000000f, 0.893066f, 0.000000f, 0.885254f, 0.000000f, 0.876953f,
+ 0.000000f, 0.869141f, 0.000000f, 0.860840f, 0.000000f, 0.851074f, 0.000000f, 0.841797f,
+ 0.000000f, 0.832031f, 0.000000f, 0.822266f, 0.000000f, 0.812500f, 0.000000f, 0.802246f,
+ 0.000000f, 0.790527f, 0.000000f, 0.778809f, 0.000000f, 0.766602f, 0.000001f, 0.754395f,
+ 0.000003f, 0.742188f, 0.000005f, 0.729492f, 0.000007f, 0.715332f, 0.000010f, 0.700684f,
+ 0.000012f, 0.685547f, 0.000014f, 0.670410f, 0.000014f, 0.654785f, 0.000014f, 0.637695f,
+ 0.000014f, 0.619629f, 0.000013f, 0.600098f, 0.000013f, 0.581055f, 0.000012f, 0.562012f,
+ 0.000010f, 0.540527f, 0.000009f, 0.516602f, 0.000009f, 0.491699f, 0.000010f, 0.466064f,
+ 0.000009f, 0.439697f, 0.000008f, 0.406982f, 0.000007f, 0.372314f, 0.000007f, 0.336426f,
+ 0.000005f, 0.291260f, 0.000005f, 0.237549f, 0.000003f, 0.169189f, 0.000001f, 0.067505f,
+ 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f, 0.000000f, 0.997070f,
+ 0.000000f, 0.995117f, 0.000000f, 0.992676f, 0.000000f, 0.990234f, 0.000002f, 0.987793f,
+ 0.000007f, 0.984375f, 0.000014f, 0.980957f, 0.000021f, 0.977539f, 0.000029f, 0.974121f,
+ 0.000036f, 0.969727f, 0.000043f, 0.965332f, 0.000051f, 0.960449f, 0.000058f, 0.955566f,
+ 0.000064f, 0.951172f, 0.000070f, 0.945801f, 0.000077f, 0.939941f, 0.000084f, 0.933594f,
+ 0.000089f, 0.927246f, 0.000094f, 0.920898f, 0.000100f, 0.914551f, 0.000106f, 0.908203f,
+ 0.000111f, 0.900391f, 0.000116f, 0.892578f, 0.000120f, 0.884766f, 0.000124f, 0.876953f,
+ 0.000125f, 0.869141f, 0.000124f, 0.860352f, 0.000121f, 0.851074f, 0.000117f, 0.841797f,
+ 0.000113f, 0.832031f, 0.000112f, 0.821777f, 0.000112f, 0.812012f, 0.000112f, 0.801758f,
+ 0.000109f, 0.790039f, 0.000109f, 0.778320f, 0.000110f, 0.766602f, 0.000112f, 0.754395f,
+ 0.000114f, 0.742188f, 0.000116f, 0.729492f, 0.000108f, 0.714844f, 0.000105f, 0.700195f,
+ 0.000107f, 0.685059f, 0.000107f, 0.669922f, 0.000106f, 0.654297f, 0.000099f, 0.637695f,
+ 0.000096f, 0.619141f, 0.000096f, 0.600098f, 0.000096f, 0.581055f, 0.000094f, 0.561523f,
+ 0.000083f, 0.540039f, 0.000081f, 0.516113f, 0.000080f, 0.491699f, 0.000077f, 0.465576f,
+ 0.000066f, 0.439453f, 0.000062f, 0.406738f, 0.000059f, 0.372314f, 0.000052f, 0.337158f,
+ 0.000042f, 0.291992f, 0.000035f, 0.237915f, 0.000021f, 0.169189f, 0.000004f, 0.067383f,
+ 0.000000f, 1.000000f, 0.000113f, 0.999023f, 0.000178f, 0.998047f, 0.000176f, 0.996582f,
+ 0.000218f, 0.994141f, 0.000227f, 0.992676f, 0.000228f, 0.989746f, 0.000226f, 0.987305f,
+ 0.000267f, 0.983398f, 0.000271f, 0.980469f, 0.000272f, 0.977051f, 0.000271f, 0.973145f,
+ 0.000300f, 0.968750f, 0.000308f, 0.964355f, 0.000315f, 0.959473f, 0.000322f, 0.954590f,
+ 0.000329f, 0.949707f, 0.000360f, 0.944336f, 0.000369f, 0.938477f, 0.000371f, 0.932617f,
+ 0.000369f, 0.926270f, 0.000366f, 0.919922f, 0.000363f, 0.913574f, 0.000384f, 0.906738f,
+ 0.000379f, 0.899414f, 0.000378f, 0.891602f, 0.000377f, 0.883789f, 0.000380f, 0.875977f,
+ 0.000383f, 0.868164f, 0.000405f, 0.859375f, 0.000400f, 0.850098f, 0.000404f, 0.840332f,
+ 0.000403f, 0.831055f, 0.000401f, 0.821289f, 0.000398f, 0.811523f, 0.000410f, 0.800781f,
+ 0.000398f, 0.789551f, 0.000400f, 0.777344f, 0.000398f, 0.765625f, 0.000392f, 0.753906f,
+ 0.000388f, 0.741699f, 0.000399f, 0.728516f, 0.000379f, 0.714355f, 0.000375f, 0.699707f,
+ 0.000370f, 0.684570f, 0.000365f, 0.669434f, 0.000359f, 0.654785f, 0.000348f, 0.637207f,
+ 0.000337f, 0.618652f, 0.000329f, 0.600098f, 0.000320f, 0.581055f, 0.000314f, 0.561523f,
+ 0.000294f, 0.540039f, 0.000277f, 0.516602f, 0.000267f, 0.491455f, 0.000254f, 0.465820f,
+ 0.000247f, 0.438965f, 0.000209f, 0.406494f, 0.000193f, 0.371826f, 0.000173f, 0.336914f,
+ 0.000136f, 0.292236f, 0.000110f, 0.238403f, 0.000065f, 0.169556f, 0.000012f, 0.067261f,
+ 0.000000f, 1.000000f, 0.000267f, 0.999023f, 0.000419f, 0.997559f, 0.000392f, 0.996094f,
+ 0.000529f, 0.993652f, 0.000532f, 0.991211f, 0.000531f, 0.989258f, 0.000537f, 0.986816f,
+ 0.000649f, 0.982910f, 0.000649f, 0.979004f, 0.000659f, 0.975586f, 0.000662f, 0.972168f,
+ 0.000753f, 0.967773f, 0.000757f, 0.962891f, 0.000760f, 0.958496f, 0.000763f, 0.953613f,
+ 0.000763f, 0.948730f, 0.000831f, 0.943359f, 0.000836f, 0.937012f, 0.000831f, 0.931152f,
+ 0.000835f, 0.924805f, 0.000842f, 0.918945f, 0.000849f, 0.913086f, 0.000917f, 0.905273f,
+ 0.000905f, 0.897949f, 0.000908f, 0.890625f, 0.000909f, 0.882812f, 0.000908f, 0.875000f,
+ 0.000907f, 0.867188f, 0.000958f, 0.858398f, 0.000939f, 0.849121f, 0.000937f, 0.839355f,
+ 0.000938f, 0.830078f, 0.000936f, 0.820312f, 0.000932f, 0.810547f, 0.000970f, 0.799805f,
+ 0.000943f, 0.788086f, 0.000931f, 0.776855f, 0.000926f, 0.765137f, 0.000915f, 0.752930f,
+ 0.000910f, 0.740723f, 0.000939f, 0.727539f, 0.000904f, 0.713379f, 0.000873f, 0.698730f,
+ 0.000864f, 0.684082f, 0.000851f, 0.668945f, 0.000837f, 0.654297f, 0.000821f, 0.636230f,
+ 0.000784f, 0.618164f, 0.000764f, 0.600098f, 0.000746f, 0.580566f, 0.000723f, 0.561035f,
+ 0.000697f, 0.539551f, 0.000641f, 0.515625f, 0.000615f, 0.490967f, 0.000585f, 0.465820f,
+ 0.000568f, 0.439209f, 0.000479f, 0.406494f, 0.000438f, 0.372070f, 0.000391f, 0.336426f,
+ 0.000307f, 0.291016f, 0.000244f, 0.239136f, 0.000140f, 0.169189f, 0.000023f, 0.067078f,
+ 0.000000f, 1.000000f, 0.000519f, 0.998535f, 0.000839f, 0.997070f, 0.000782f, 0.995605f,
+ 0.001030f, 0.992676f, 0.001041f, 0.990234f, 0.001035f, 0.987793f, 0.001052f, 0.985352f,
+ 0.001259f, 0.981445f, 0.001264f, 0.978516f, 0.001260f, 0.974609f, 0.001259f, 0.970703f,
+ 0.001434f, 0.965820f, 0.001449f, 0.960938f, 0.001454f, 0.957031f, 0.001442f, 0.952148f,
+ 0.001452f, 0.947754f, 0.001609f, 0.941406f, 0.001631f, 0.935547f, 0.001645f, 0.929688f,
+ 0.001622f, 0.923828f, 0.001623f, 0.917480f, 0.001636f, 0.911133f, 0.001754f, 0.903809f,
+ 0.001770f, 0.895996f, 0.001750f, 0.888672f, 0.001744f, 0.880859f, 0.001740f, 0.873535f,
+ 0.001737f, 0.865723f, 0.001850f, 0.856445f, 0.001861f, 0.847168f, 0.001822f, 0.837891f,
+ 0.001800f, 0.828613f, 0.001790f, 0.819336f, 0.001783f, 0.809082f, 0.001864f, 0.798340f,
+ 0.001823f, 0.787109f, 0.001794f, 0.775391f, 0.001772f, 0.763672f, 0.001753f, 0.751953f,
+ 0.001739f, 0.740234f, 0.001797f, 0.726562f, 0.001744f, 0.712402f, 0.001681f, 0.697754f,
+ 0.001650f, 0.683594f, 0.001621f, 0.668457f, 0.001591f, 0.653809f, 0.001631f, 0.635742f,
+ 0.001534f, 0.617676f, 0.001457f, 0.599121f, 0.001414f, 0.580078f, 0.001370f, 0.561035f,
+ 0.001341f, 0.538574f, 0.001233f, 0.515137f, 0.001164f, 0.490723f, 0.001102f, 0.465576f,
+ 0.001074f, 0.438477f, 0.000912f, 0.406006f, 0.000821f, 0.372070f, 0.000726f, 0.337402f,
+ 0.000569f, 0.290283f, 0.000445f, 0.238770f, 0.000249f, 0.169434f, 0.000040f, 0.066528f,
+ 0.000000f, 1.000000f, 0.000836f, 0.998535f, 0.001378f, 0.996582f, 0.001312f, 0.994629f,
+ 0.001456f, 0.992188f, 0.001756f, 0.989258f, 0.001740f, 0.986816f, 0.001827f, 0.983887f,
+ 0.002106f, 0.979492f, 0.002115f, 0.976074f, 0.002119f, 0.973145f, 0.002125f, 0.969727f,
+ 0.002417f, 0.963867f, 0.002443f, 0.959473f, 0.002472f, 0.954590f, 0.002464f, 0.950195f,
+ 0.002464f, 0.945312f, 0.002714f, 0.938965f, 0.002747f, 0.933594f, 0.002773f, 0.927734f,
+ 0.002750f, 0.921387f, 0.002762f, 0.915527f, 0.002811f, 0.909180f, 0.002975f, 0.901367f,
+ 0.002996f, 0.894043f, 0.002970f, 0.886719f, 0.002977f, 0.879395f, 0.002951f, 0.872070f,
+ 0.002995f, 0.863770f, 0.003126f, 0.854492f, 0.003143f, 0.845215f, 0.003096f, 0.836426f,
+ 0.003057f, 0.826660f, 0.003033f, 0.817871f, 0.003008f, 0.808594f, 0.003153f, 0.796875f,
+ 0.003159f, 0.785156f, 0.003092f, 0.774414f, 0.003038f, 0.762695f, 0.002968f, 0.750977f,
+ 0.002930f, 0.739258f, 0.003029f, 0.725098f, 0.002956f, 0.710938f, 0.002890f, 0.696777f,
+ 0.002798f, 0.682617f, 0.002728f, 0.667969f, 0.002703f, 0.652832f, 0.002743f, 0.634766f,
+ 0.002602f, 0.617188f, 0.002487f, 0.598633f, 0.002377f, 0.579590f, 0.002291f, 0.561035f,
+ 0.002310f, 0.538086f, 0.002117f, 0.514648f, 0.001955f, 0.490479f, 0.001832f, 0.466064f,
+ 0.001786f, 0.437744f, 0.001535f, 0.405762f, 0.001353f, 0.372314f, 0.001190f, 0.337402f,
+ 0.000955f, 0.290771f, 0.000717f, 0.238525f, 0.000398f, 0.169678f, 0.000067f, 0.065735f,
+ 0.000000f, 1.000000f, 0.000743f, 0.998535f, 0.001665f, 0.996094f, 0.002008f, 0.994141f,
+ 0.002346f, 0.990723f, 0.002684f, 0.987793f, 0.002678f, 0.985352f, 0.002752f, 0.981934f,
+ 0.003250f, 0.978027f, 0.003258f, 0.974121f, 0.003281f, 0.970703f, 0.003288f, 0.967773f,
+ 0.003754f, 0.961914f, 0.003803f, 0.957031f, 0.003826f, 0.952637f, 0.003841f, 0.948242f,
+ 0.003820f, 0.943359f, 0.004246f, 0.936523f, 0.004269f, 0.930664f, 0.004307f, 0.925293f,
+ 0.004322f, 0.919434f, 0.004292f, 0.913086f, 0.004463f, 0.906738f, 0.004635f, 0.898926f,
+ 0.004665f, 0.891602f, 0.004677f, 0.884277f, 0.004627f, 0.876953f, 0.004593f, 0.870117f,
+ 0.004730f, 0.861328f, 0.004879f, 0.852051f, 0.004883f, 0.843262f, 0.004814f, 0.834473f,
+ 0.004810f, 0.825195f, 0.004757f, 0.815918f, 0.004803f, 0.806152f, 0.004898f, 0.794434f,
+ 0.004890f, 0.783691f, 0.004799f, 0.771973f, 0.004723f, 0.760742f, 0.004650f, 0.750000f,
+ 0.004570f, 0.737793f, 0.004707f, 0.723633f, 0.004662f, 0.709473f, 0.004486f, 0.695801f,
+ 0.004387f, 0.681152f, 0.004253f, 0.667480f, 0.004215f, 0.651367f, 0.004227f, 0.633301f,
+ 0.004025f, 0.615723f, 0.003859f, 0.597656f, 0.003700f, 0.579590f, 0.003527f, 0.561035f,
+ 0.003540f, 0.537109f, 0.003271f, 0.514160f, 0.003042f, 0.490234f, 0.002800f, 0.465576f,
+ 0.002720f, 0.437256f, 0.002392f, 0.405273f, 0.002062f, 0.371826f, 0.001789f, 0.337646f,
+ 0.001477f, 0.290527f, 0.001062f, 0.238770f, 0.000602f, 0.169556f, 0.000105f, 0.065247f,
+ 0.000000f, 1.000000f, 0.001196f, 0.998535f, 0.002502f, 0.995117f, 0.002876f, 0.992676f,
+ 0.003199f, 0.989746f, 0.003517f, 0.986816f, 0.003880f, 0.983887f, 0.004108f, 0.979980f,
+ 0.004414f, 0.976074f, 0.004761f, 0.972168f, 0.004765f, 0.968750f, 0.004841f, 0.964844f,
+ 0.005260f, 0.959473f, 0.005539f, 0.954590f, 0.005581f, 0.950195f, 0.005604f, 0.945801f,
+ 0.005680f, 0.940430f, 0.005978f, 0.933594f, 0.006275f, 0.927734f, 0.006283f, 0.922363f,
+ 0.006325f, 0.916992f, 0.006264f, 0.910645f, 0.006573f, 0.903320f, 0.006786f, 0.895996f,
+ 0.006844f, 0.888672f, 0.006844f, 0.881836f, 0.006767f, 0.874512f, 0.006763f, 0.867676f,
+ 0.006966f, 0.858398f, 0.007133f, 0.849121f, 0.007133f, 0.840332f, 0.007122f, 0.832031f,
+ 0.007023f, 0.823242f, 0.006935f, 0.813965f, 0.007061f, 0.803711f, 0.007187f, 0.791992f,
+ 0.007160f, 0.781250f, 0.007030f, 0.770508f, 0.006893f, 0.759277f, 0.006779f, 0.748047f,
+ 0.006832f, 0.735840f, 0.006901f, 0.721680f, 0.006802f, 0.708008f, 0.006618f, 0.693848f,
+ 0.006386f, 0.680176f, 0.006229f, 0.666504f, 0.006199f, 0.649902f, 0.006168f, 0.632324f,
+ 0.005928f, 0.614746f, 0.005661f, 0.597168f, 0.005367f, 0.579102f, 0.005241f, 0.559082f,
+ 0.005116f, 0.536133f, 0.004791f, 0.513184f, 0.004398f, 0.489990f, 0.004051f, 0.465820f,
+ 0.003904f, 0.436523f, 0.003481f, 0.405273f, 0.002977f, 0.372314f, 0.002529f, 0.337891f,
+ 0.002108f, 0.290039f, 0.001489f, 0.239014f, 0.000866f, 0.169556f, 0.000147f, 0.064087f,
+ 0.000000f, 1.000000f, 0.001239f, 0.998047f, 0.002592f, 0.994629f, 0.003477f, 0.992188f,
+ 0.004539f, 0.988281f, 0.004944f, 0.984863f, 0.005348f, 0.981934f, 0.005646f, 0.978027f,
+ 0.006233f, 0.973633f, 0.006599f, 0.969727f, 0.006657f, 0.966309f, 0.006851f, 0.961914f,
+ 0.007393f, 0.956055f, 0.007782f, 0.951660f, 0.007763f, 0.947266f, 0.007820f, 0.942871f,
+ 0.008011f, 0.937500f, 0.008484f, 0.930664f, 0.008728f, 0.924805f, 0.008812f, 0.919434f,
+ 0.008797f, 0.913574f, 0.008842f, 0.908203f, 0.009239f, 0.899902f, 0.009537f, 0.892578f,
+ 0.009529f, 0.885742f, 0.009575f, 0.878906f, 0.009567f, 0.872070f, 0.009438f, 0.865234f,
+ 0.009857f, 0.855469f, 0.010017f, 0.846680f, 0.009979f, 0.837891f, 0.009949f, 0.829102f,
+ 0.009804f, 0.820312f, 0.009750f, 0.812012f, 0.009979f, 0.800781f, 0.010086f, 0.789551f,
+ 0.010002f, 0.778809f, 0.009880f, 0.768555f, 0.009697f, 0.757812f, 0.009521f, 0.746582f,
+ 0.009628f, 0.733398f, 0.009613f, 0.719727f, 0.009483f, 0.706055f, 0.009216f, 0.692383f,
+ 0.008965f, 0.679199f, 0.008644f, 0.665039f, 0.008736f, 0.647949f, 0.008537f, 0.630371f,
+ 0.008232f, 0.613281f, 0.007851f, 0.596191f, 0.007481f, 0.578613f, 0.007275f, 0.558105f,
+ 0.007076f, 0.535156f, 0.006618f, 0.512695f, 0.006111f, 0.489746f, 0.005592f, 0.465820f,
+ 0.005367f, 0.435547f, 0.004776f, 0.404053f, 0.004097f, 0.372314f, 0.003468f, 0.337158f,
+ 0.002897f, 0.290283f, 0.002012f, 0.238892f, 0.001186f, 0.169434f, 0.000203f, 0.063721f,
+ 0.000000f, 1.000000f, 0.001400f, 0.998047f, 0.003353f, 0.994141f, 0.004185f, 0.991699f,
+ 0.005409f, 0.986816f, 0.006649f, 0.982910f, 0.006687f, 0.980469f, 0.007683f, 0.975586f,
+ 0.008133f, 0.971191f, 0.008553f, 0.967773f, 0.008949f, 0.963379f, 0.009407f, 0.958496f,
+ 0.009995f, 0.953125f, 0.010132f, 0.948242f, 0.010536f, 0.943848f, 0.010490f, 0.939453f,
+ 0.010963f, 0.933594f, 0.011513f, 0.926758f, 0.011848f, 0.921387f, 0.011826f, 0.915527f,
+ 0.011894f, 0.910645f, 0.012009f, 0.904297f, 0.012459f, 0.896484f, 0.012642f, 0.889648f,
+ 0.012917f, 0.882812f, 0.012863f, 0.875977f, 0.012817f, 0.869141f, 0.012993f, 0.861816f,
+ 0.013351f, 0.852051f, 0.013504f, 0.842773f, 0.013512f, 0.834961f, 0.013420f, 0.826660f,
+ 0.013329f, 0.818359f, 0.013176f, 0.809570f, 0.013489f, 0.797852f, 0.013573f, 0.786621f,
+ 0.013420f, 0.775879f, 0.013298f, 0.766113f, 0.013046f, 0.755371f, 0.012787f, 0.745117f,
+ 0.012985f, 0.730469f, 0.012978f, 0.717285f, 0.012703f, 0.704102f, 0.012375f, 0.690918f,
+ 0.012009f, 0.677734f, 0.011658f, 0.664062f, 0.011787f, 0.645508f, 0.011467f, 0.628906f,
+ 0.011032f, 0.612305f, 0.010597f, 0.595215f, 0.010040f, 0.578125f, 0.009789f, 0.556152f,
+ 0.009453f, 0.534180f, 0.008820f, 0.511719f, 0.008179f, 0.489258f, 0.007450f, 0.465576f,
+ 0.007130f, 0.434814f, 0.006325f, 0.404297f, 0.005444f, 0.372559f, 0.004631f, 0.336426f,
+ 0.003807f, 0.289307f, 0.002638f, 0.240112f, 0.001544f, 0.168701f, 0.000274f, 0.062744f,
+ 0.000000f, 1.000000f, 0.001608f, 0.998047f, 0.003750f, 0.993652f, 0.005112f, 0.990723f,
+ 0.006462f, 0.985840f, 0.007797f, 0.981445f, 0.008713f, 0.978516f, 0.009453f, 0.973145f,
+ 0.010658f, 0.968262f, 0.011154f, 0.964355f, 0.011276f, 0.960938f, 0.012253f, 0.955078f,
+ 0.012917f, 0.949219f, 0.013412f, 0.945312f, 0.013725f, 0.940430f, 0.013863f, 0.936523f,
+ 0.014458f, 0.929199f, 0.015152f, 0.922852f, 0.015289f, 0.917480f, 0.015640f, 0.912109f,
+ 0.015541f, 0.906738f, 0.015961f, 0.899902f, 0.016388f, 0.892578f, 0.016754f, 0.885742f,
+ 0.016953f, 0.878906f, 0.016937f, 0.872070f, 0.016815f, 0.865723f, 0.017197f, 0.856934f,
+ 0.017578f, 0.848145f, 0.017807f, 0.839355f, 0.017685f, 0.831543f, 0.017548f, 0.823242f,
+ 0.017456f, 0.815430f, 0.017456f, 0.805664f, 0.017853f, 0.793945f, 0.017853f, 0.783691f,
+ 0.017624f, 0.773438f, 0.017410f, 0.763672f, 0.017059f, 0.753418f, 0.017014f, 0.741699f,
+ 0.017105f, 0.728027f, 0.017014f, 0.714844f, 0.016617f, 0.702148f, 0.016159f, 0.688965f,
+ 0.015778f, 0.676270f, 0.015427f, 0.661621f, 0.015442f, 0.644043f, 0.014977f, 0.627441f,
+ 0.014381f, 0.610840f, 0.013771f, 0.594727f, 0.013016f, 0.577637f, 0.012810f, 0.555176f,
+ 0.012276f, 0.532715f, 0.011520f, 0.511230f, 0.010567f, 0.489014f, 0.009666f, 0.465820f,
+ 0.009216f, 0.433838f, 0.008209f, 0.403809f, 0.007027f, 0.372314f, 0.006031f, 0.334961f,
+ 0.004913f, 0.289307f, 0.003365f, 0.240234f, 0.001982f, 0.167603f, 0.000346f, 0.061798f,
+ 0.000000f, 1.000000f, 0.001885f, 0.997559f, 0.004303f, 0.993164f, 0.005737f, 0.990234f,
+ 0.007801f, 0.984375f, 0.009171f, 0.980469f, 0.010170f, 0.977051f, 0.011986f, 0.970215f,
+ 0.013268f, 0.965820f, 0.013802f, 0.961426f, 0.014313f, 0.958008f, 0.015793f, 0.951172f,
+ 0.016571f, 0.945801f, 0.017059f, 0.940918f, 0.017273f, 0.937012f, 0.017807f, 0.931641f,
+ 0.018814f, 0.924805f, 0.019150f, 0.918945f, 0.019638f, 0.913574f, 0.020004f, 0.908203f,
+ 0.019943f, 0.903320f, 0.020706f, 0.895020f, 0.021225f, 0.887695f, 0.021545f, 0.881348f,
+ 0.021805f, 0.875000f, 0.021729f, 0.868164f, 0.021652f, 0.862305f, 0.022263f, 0.852539f,
+ 0.022644f, 0.843750f, 0.022537f, 0.835449f, 0.022781f, 0.827637f, 0.022568f, 0.819824f,
+ 0.022339f, 0.812500f, 0.022736f, 0.801270f, 0.022873f, 0.790527f, 0.022751f, 0.780273f,
+ 0.022614f, 0.770508f, 0.022308f, 0.760742f, 0.022003f, 0.751465f, 0.021896f, 0.738281f,
+ 0.021912f, 0.724609f, 0.021698f, 0.711914f, 0.021271f, 0.699707f, 0.020676f, 0.687500f,
+ 0.020096f, 0.675293f, 0.019913f, 0.658691f, 0.019531f, 0.641602f, 0.019119f, 0.625488f,
+ 0.018433f, 0.609863f, 0.017456f, 0.593750f, 0.016678f, 0.576660f, 0.016357f, 0.553223f,
+ 0.015587f, 0.531738f, 0.014587f, 0.510742f, 0.013428f, 0.489014f, 0.012344f, 0.464111f,
+ 0.011665f, 0.433105f, 0.010361f, 0.403809f, 0.008804f, 0.372803f, 0.007610f, 0.334473f,
+ 0.006142f, 0.288818f, 0.004189f, 0.240356f, 0.002451f, 0.166870f, 0.000427f, 0.060730f,
+ 0.000000f, 1.000000f, 0.002254f, 0.997559f, 0.005020f, 0.992676f, 0.006535f, 0.989746f,
+ 0.009361f, 0.983398f, 0.010857f, 0.979004f, 0.012276f, 0.975098f, 0.014267f, 0.968262f,
+ 0.016144f, 0.962891f, 0.017197f, 0.958496f, 0.017914f, 0.953613f, 0.019135f, 0.947266f,
+ 0.020462f, 0.941895f, 0.020981f, 0.937500f, 0.021469f, 0.933105f, 0.022339f, 0.927246f,
+ 0.023392f, 0.919922f, 0.024200f, 0.914062f, 0.024628f, 0.909180f, 0.024734f, 0.904297f,
+ 0.025467f, 0.897949f, 0.026093f, 0.889648f, 0.026794f, 0.882812f, 0.027237f, 0.876953f,
+ 0.027145f, 0.870605f, 0.027359f, 0.864746f, 0.027695f, 0.856445f, 0.028198f, 0.847168f,
+ 0.028442f, 0.839355f, 0.028412f, 0.831543f, 0.028610f, 0.823730f, 0.028366f, 0.816895f,
+ 0.028549f, 0.807617f, 0.028885f, 0.796875f, 0.028900f, 0.786621f, 0.028839f, 0.776855f,
+ 0.028412f, 0.767578f, 0.028015f, 0.757812f, 0.027695f, 0.748047f, 0.027710f, 0.734375f,
+ 0.027634f, 0.721680f, 0.027313f, 0.709473f, 0.026672f, 0.697754f, 0.025955f, 0.685547f,
+ 0.025253f, 0.673340f, 0.025208f, 0.655762f, 0.024612f, 0.639648f, 0.023865f, 0.623535f,
+ 0.022964f, 0.607910f, 0.021942f, 0.593262f, 0.021088f, 0.573242f, 0.020432f, 0.551758f,
+ 0.019470f, 0.530762f, 0.018173f, 0.509766f, 0.016678f, 0.488525f, 0.015549f, 0.461914f,
+ 0.014511f, 0.432373f, 0.012840f, 0.403076f, 0.010925f, 0.372559f, 0.009460f, 0.333496f,
+ 0.007565f, 0.288330f, 0.005146f, 0.241333f, 0.003029f, 0.166504f, 0.000531f, 0.059662f,
+ 0.000000f, 1.000000f, 0.002697f, 0.997559f, 0.005894f, 0.992188f, 0.007965f, 0.988770f,
+ 0.011200f, 0.981934f, 0.012756f, 0.977539f, 0.014572f, 0.972168f, 0.017044f, 0.965332f,
+ 0.019043f, 0.960449f, 0.020172f, 0.955566f, 0.021912f, 0.949707f, 0.023605f, 0.942871f,
+ 0.024338f, 0.937988f, 0.025742f, 0.933105f, 0.026047f, 0.929688f, 0.027542f, 0.921387f,
+ 0.028931f, 0.915039f, 0.029419f, 0.909668f, 0.029968f, 0.904785f, 0.030472f, 0.899902f,
+ 0.031525f, 0.892090f, 0.032562f, 0.884766f, 0.032806f, 0.877930f, 0.033173f, 0.872070f,
+ 0.033600f, 0.866211f, 0.033691f, 0.860352f, 0.034515f, 0.851074f, 0.035126f, 0.842773f,
+ 0.035187f, 0.834473f, 0.035370f, 0.827637f, 0.035309f, 0.820312f, 0.035095f, 0.812988f,
+ 0.035431f, 0.802246f, 0.035858f, 0.792480f, 0.035919f, 0.782715f, 0.035461f, 0.773438f,
+ 0.035248f, 0.764648f, 0.034729f, 0.755371f, 0.034698f, 0.743652f, 0.034515f, 0.730469f,
+ 0.034393f, 0.718750f, 0.033813f, 0.707031f, 0.033020f, 0.695312f, 0.032104f, 0.683594f,
+ 0.031555f, 0.669434f, 0.031250f, 0.652832f, 0.030411f, 0.637207f, 0.029556f, 0.622070f,
+ 0.028336f, 0.606934f, 0.027039f, 0.591797f, 0.026337f, 0.571289f, 0.025345f, 0.549805f,
+ 0.023926f, 0.529785f, 0.022278f, 0.509277f, 0.020416f, 0.488281f, 0.019287f, 0.459961f,
+ 0.017838f, 0.431152f, 0.015717f, 0.403076f, 0.013298f, 0.373535f, 0.011597f, 0.331787f,
+ 0.009270f, 0.288818f, 0.006207f, 0.242065f, 0.003660f, 0.166260f, 0.000636f, 0.059082f,
+ 0.000000f, 1.000000f, 0.002750f, 0.997559f, 0.006912f, 0.991699f, 0.009270f, 0.987305f,
+ 0.012810f, 0.980469f, 0.014969f, 0.975586f, 0.017136f, 0.969727f, 0.019791f, 0.962891f,
+ 0.021851f, 0.957520f, 0.023514f, 0.953125f, 0.025696f, 0.945312f, 0.027924f, 0.938965f,
+ 0.029434f, 0.933594f, 0.030167f, 0.929199f, 0.031647f, 0.923340f, 0.033417f, 0.916504f,
+ 0.034363f, 0.910645f, 0.035645f, 0.904785f, 0.036224f, 0.899902f, 0.036957f, 0.894043f,
+ 0.038116f, 0.886230f, 0.039337f, 0.878906f, 0.039978f, 0.873047f, 0.040161f, 0.867188f,
+ 0.040588f, 0.861816f, 0.041168f, 0.854004f, 0.042297f, 0.845215f, 0.042786f, 0.837402f,
+ 0.042938f, 0.830078f, 0.042969f, 0.822754f, 0.042786f, 0.816895f, 0.043030f, 0.807129f,
+ 0.043671f, 0.796875f, 0.043671f, 0.787598f, 0.043427f, 0.778320f, 0.043152f, 0.770020f,
+ 0.042938f, 0.761230f, 0.042389f, 0.751465f, 0.042480f, 0.738770f, 0.042175f, 0.726562f,
+ 0.041809f, 0.714844f, 0.041138f, 0.704102f, 0.040161f, 0.692871f, 0.038879f, 0.681641f,
+ 0.038818f, 0.665527f, 0.038269f, 0.649902f, 0.037109f, 0.635254f, 0.035828f, 0.620117f,
+ 0.034454f, 0.606445f, 0.032990f, 0.589844f, 0.032104f, 0.568359f, 0.030762f, 0.548340f,
+ 0.029068f, 0.528809f, 0.026993f, 0.508789f, 0.024857f, 0.488770f, 0.023544f, 0.458740f,
+ 0.021500f, 0.430664f, 0.019043f, 0.402832f, 0.016113f, 0.373779f, 0.013977f, 0.331055f,
+ 0.011101f, 0.289062f, 0.007458f, 0.243042f, 0.004395f, 0.166016f, 0.000759f, 0.058838f,
+ 0.000000f, 1.000000f, 0.003342f, 0.997070f, 0.007214f, 0.991699f, 0.010582f, 0.985352f,
+ 0.014206f, 0.979492f, 0.016922f, 0.974609f, 0.020294f, 0.966797f, 0.022873f, 0.960938f,
+ 0.025055f, 0.955078f, 0.027206f, 0.950195f, 0.030518f, 0.941406f, 0.032654f, 0.935059f,
+ 0.034271f, 0.930176f, 0.035461f, 0.925293f, 0.037292f, 0.917480f, 0.039520f, 0.910645f,
+ 0.041046f, 0.905273f, 0.041687f, 0.899902f, 0.042664f, 0.895020f, 0.044159f, 0.887207f,
+ 0.045685f, 0.879883f, 0.046448f, 0.874023f, 0.047577f, 0.867676f, 0.048157f, 0.862305f,
+ 0.048370f, 0.855957f, 0.049652f, 0.847168f, 0.050812f, 0.839355f, 0.051025f, 0.832031f,
+ 0.051178f, 0.825195f, 0.051544f, 0.818848f, 0.051208f, 0.811523f, 0.052032f, 0.801270f,
+ 0.052368f, 0.791504f, 0.052399f, 0.783203f, 0.052032f, 0.774414f, 0.051727f, 0.766113f,
+ 0.051117f, 0.757812f, 0.051422f, 0.745605f, 0.051208f, 0.733887f, 0.050598f, 0.723145f,
+ 0.050201f, 0.711914f, 0.049347f, 0.701660f, 0.048035f, 0.690918f, 0.047272f, 0.676758f,
+ 0.047028f, 0.662109f, 0.045715f, 0.646973f, 0.044373f, 0.632812f, 0.042908f, 0.619141f,
+ 0.041046f, 0.604980f, 0.039825f, 0.585938f, 0.038483f, 0.566406f, 0.036865f, 0.546875f,
+ 0.034668f, 0.527832f, 0.032227f, 0.508789f, 0.029953f, 0.485596f, 0.028061f, 0.456787f,
+ 0.025681f, 0.429932f, 0.022537f, 0.403564f, 0.019104f, 0.374023f, 0.016663f, 0.329834f,
+ 0.013145f, 0.288818f, 0.008850f, 0.244263f, 0.005169f, 0.165771f, 0.000897f, 0.058228f,
+ 0.000000f, 1.000000f, 0.003767f, 0.996094f, 0.008530f, 0.990723f, 0.011810f, 0.984863f,
+ 0.015808f, 0.978516f, 0.019150f, 0.973145f, 0.023117f, 0.964844f, 0.026337f, 0.958496f,
+ 0.028595f, 0.952637f, 0.031525f, 0.945312f, 0.034729f, 0.937500f, 0.037415f, 0.931641f,
+ 0.039520f, 0.925781f, 0.041077f, 0.919922f, 0.044189f, 0.911621f, 0.045837f, 0.905762f,
+ 0.047455f, 0.899902f, 0.048981f, 0.895020f, 0.050262f, 0.888672f, 0.052216f, 0.880371f,
+ 0.053955f, 0.874023f, 0.054749f, 0.867676f, 0.055725f, 0.862305f, 0.055939f, 0.856934f,
+ 0.057556f, 0.848145f, 0.058502f, 0.840332f, 0.059235f, 0.833496f, 0.060120f, 0.826660f,
+ 0.059998f, 0.820312f, 0.060028f, 0.814453f, 0.061127f, 0.804199f, 0.061829f, 0.794922f,
+ 0.061707f, 0.786133f, 0.061890f, 0.778320f, 0.061462f, 0.770508f, 0.060913f, 0.762695f,
+ 0.060852f, 0.751953f, 0.061005f, 0.740234f, 0.060730f, 0.729492f, 0.059723f, 0.719238f,
+ 0.059204f, 0.708984f, 0.057770f, 0.698730f, 0.056702f, 0.687012f, 0.056244f, 0.672363f,
+ 0.055420f, 0.658203f, 0.054047f, 0.644531f, 0.052185f, 0.630859f, 0.050629f, 0.617676f,
+ 0.048615f, 0.603027f, 0.047394f, 0.583008f, 0.045624f, 0.563477f, 0.043457f, 0.545410f,
+ 0.040833f, 0.526855f, 0.037964f, 0.508789f, 0.035645f, 0.482422f, 0.033112f, 0.455566f,
+ 0.030151f, 0.430176f, 0.026382f, 0.403320f, 0.022766f, 0.372559f, 0.019562f, 0.329102f,
+ 0.015305f, 0.289551f, 0.010284f, 0.244263f, 0.006035f, 0.166016f, 0.001036f, 0.056915f,
+ 0.000000f, 1.000000f, 0.004234f, 0.996094f, 0.009125f, 0.990723f, 0.013443f, 0.983398f,
+ 0.017822f, 0.977051f, 0.020660f, 0.972168f, 0.025879f, 0.962891f, 0.029648f, 0.956055f,
+ 0.031982f, 0.950684f, 0.036255f, 0.941406f, 0.039429f, 0.934570f, 0.042450f, 0.927734f,
+ 0.044312f, 0.922852f, 0.048187f, 0.913574f, 0.050201f, 0.906738f, 0.053040f, 0.899902f,
+ 0.054657f, 0.895020f, 0.055908f, 0.890137f, 0.058502f, 0.880859f, 0.060303f, 0.874512f,
+ 0.062164f, 0.867676f, 0.063354f, 0.862305f, 0.064209f, 0.856934f, 0.065796f, 0.849121f,
+ 0.067261f, 0.841309f, 0.068359f, 0.833984f, 0.068665f, 0.827148f, 0.069824f, 0.821289f,
+ 0.069824f, 0.815430f, 0.070312f, 0.806152f, 0.071411f, 0.797363f, 0.071899f, 0.789551f,
+ 0.072144f, 0.780762f, 0.071777f, 0.773438f, 0.071533f, 0.766602f, 0.071167f, 0.756836f,
+ 0.071167f, 0.746094f, 0.071289f, 0.735352f, 0.070984f, 0.725586f, 0.069763f, 0.715820f,
+ 0.068604f, 0.706055f, 0.067139f, 0.696777f, 0.066895f, 0.681641f, 0.066101f, 0.668457f,
+ 0.064575f, 0.654785f, 0.062744f, 0.641602f, 0.061096f, 0.629395f, 0.058716f, 0.616699f,
+ 0.057251f, 0.598145f, 0.055573f, 0.580078f, 0.053314f, 0.562012f, 0.050507f, 0.544922f,
+ 0.047333f, 0.526367f, 0.044098f, 0.507324f, 0.041687f, 0.480469f, 0.038757f, 0.455078f,
+ 0.035034f, 0.429443f, 0.030624f, 0.403320f, 0.026657f, 0.369385f, 0.022934f, 0.329102f,
+ 0.017715f, 0.290039f, 0.011932f, 0.245239f, 0.007030f, 0.166626f, 0.001216f, 0.056305f,
+ 0.000000f, 1.000000f, 0.005039f, 0.995605f, 0.009857f, 0.990234f, 0.015373f, 0.982422f,
+ 0.019577f, 0.976562f, 0.023788f, 0.969238f, 0.028442f, 0.960938f, 0.032928f, 0.954102f,
+ 0.036102f, 0.947266f, 0.040375f, 0.938477f, 0.044006f, 0.931152f, 0.047607f, 0.924805f,
+ 0.050537f, 0.916992f, 0.053864f, 0.908691f, 0.057343f, 0.901367f, 0.059540f, 0.895508f,
+ 0.062073f, 0.889648f, 0.064453f, 0.881836f, 0.067749f, 0.874023f, 0.069397f, 0.867676f,
+ 0.070923f, 0.862305f, 0.072266f, 0.856934f, 0.073730f, 0.849609f, 0.075806f, 0.841309f,
+ 0.077515f, 0.833984f, 0.078369f, 0.828125f, 0.079163f, 0.821289f, 0.079285f, 0.815918f,
+ 0.080688f, 0.807617f, 0.081726f, 0.798828f, 0.082458f, 0.790527f, 0.082581f, 0.783203f,
+ 0.082825f, 0.775879f, 0.082458f, 0.769043f, 0.082092f, 0.760742f, 0.082703f, 0.749512f,
+ 0.082153f, 0.739746f, 0.082092f, 0.729980f, 0.081238f, 0.721191f, 0.080017f, 0.711914f,
+ 0.078491f, 0.703125f, 0.078064f, 0.690430f, 0.077148f, 0.676270f, 0.075867f, 0.664062f,
+ 0.074280f, 0.651855f, 0.072144f, 0.640137f, 0.070068f, 0.627441f, 0.067932f, 0.611816f,
+ 0.066162f, 0.594727f, 0.063904f, 0.577148f, 0.061188f, 0.560547f, 0.057861f, 0.543457f,
+ 0.054413f, 0.525879f, 0.051392f, 0.503418f, 0.048370f, 0.479248f, 0.044586f, 0.453857f,
+ 0.040039f, 0.428955f, 0.034973f, 0.403809f, 0.030685f, 0.367188f, 0.026230f, 0.328857f,
+ 0.020370f, 0.291016f, 0.013924f, 0.240845f, 0.007980f, 0.166626f, 0.001383f, 0.055695f,
+ 0.000000f, 1.000000f, 0.005764f, 0.995117f, 0.010727f, 0.990234f, 0.016769f, 0.981934f,
+ 0.021439f, 0.975586f, 0.026550f, 0.966797f, 0.031952f, 0.958984f, 0.035492f, 0.953125f,
+ 0.040680f, 0.943359f, 0.045532f, 0.935059f, 0.049469f, 0.928223f, 0.052673f, 0.921875f,
+ 0.056763f, 0.912109f, 0.061493f, 0.903809f, 0.063782f, 0.896973f, 0.066895f, 0.891113f,
+ 0.069763f, 0.883301f, 0.073608f, 0.874512f, 0.075989f, 0.867676f, 0.078674f, 0.860840f,
+ 0.080200f, 0.855957f, 0.081726f, 0.849609f, 0.084290f, 0.841309f, 0.086365f, 0.833496f,
+ 0.087585f, 0.827637f, 0.089111f, 0.821289f, 0.089905f, 0.815918f, 0.090820f, 0.808105f,
+ 0.092346f, 0.799805f, 0.093506f, 0.791504f, 0.093567f, 0.784668f, 0.093811f, 0.777832f,
+ 0.093689f, 0.770996f, 0.093750f, 0.763672f, 0.094360f, 0.752930f, 0.094299f, 0.743164f,
+ 0.094055f, 0.734375f, 0.093506f, 0.725586f, 0.092468f, 0.717285f, 0.090942f, 0.708496f,
+ 0.090027f, 0.696289f, 0.089539f, 0.684082f, 0.088135f, 0.671875f, 0.086670f, 0.660645f,
+ 0.084778f, 0.648926f, 0.082092f, 0.637695f, 0.079590f, 0.625000f, 0.077942f, 0.607422f,
+ 0.075684f, 0.591309f, 0.072937f, 0.574707f, 0.069580f, 0.558594f, 0.065674f, 0.542969f,
+ 0.061829f, 0.524902f, 0.058685f, 0.500977f, 0.055206f, 0.477051f, 0.050598f, 0.453125f,
+ 0.045532f, 0.429199f, 0.039581f, 0.404785f, 0.035309f, 0.365723f, 0.029953f, 0.329346f,
+ 0.023056f, 0.291016f, 0.015854f, 0.237793f, 0.009064f, 0.166870f, 0.001560f, 0.055237f,
+ 0.000000f, 1.000000f, 0.006138f, 0.995117f, 0.011711f, 0.989258f, 0.018356f, 0.980957f,
+ 0.023132f, 0.974609f, 0.030045f, 0.964844f, 0.034698f, 0.957520f, 0.039764f, 0.950195f,
+ 0.045166f, 0.940430f, 0.050354f, 0.932129f, 0.053925f, 0.925781f, 0.058868f, 0.916504f,
+ 0.063782f, 0.907227f, 0.067871f, 0.899414f, 0.071411f, 0.893066f, 0.074951f, 0.885254f,
+ 0.079224f, 0.875977f, 0.082703f, 0.868652f, 0.085266f, 0.861328f, 0.087219f, 0.855957f,
+ 0.089966f, 0.848633f, 0.092896f, 0.840332f, 0.095032f, 0.833008f, 0.097839f, 0.826660f,
+ 0.098694f, 0.820801f, 0.099731f, 0.815430f, 0.101562f, 0.807617f, 0.103088f, 0.798828f,
+ 0.104248f, 0.791992f, 0.105103f, 0.784668f, 0.105469f, 0.778320f, 0.105347f, 0.771973f,
+ 0.105713f, 0.764648f, 0.106689f, 0.754395f, 0.106934f, 0.745605f, 0.106689f, 0.737793f,
+ 0.106262f, 0.729004f, 0.104797f, 0.721191f, 0.103760f, 0.713379f, 0.103027f, 0.701660f,
+ 0.102295f, 0.690430f, 0.101624f, 0.679199f, 0.099670f, 0.667969f, 0.097778f, 0.657227f,
+ 0.095032f, 0.646484f, 0.092468f, 0.635742f, 0.090576f, 0.619141f, 0.088501f, 0.603027f,
+ 0.085510f, 0.588379f, 0.082092f, 0.573242f, 0.078186f, 0.558105f, 0.073730f, 0.542969f,
+ 0.070312f, 0.520020f, 0.066650f, 0.497803f, 0.061981f, 0.475342f, 0.056885f, 0.452881f,
+ 0.050812f, 0.429932f, 0.045319f, 0.400635f, 0.040100f, 0.365234f, 0.033478f, 0.329102f,
+ 0.025726f, 0.291016f, 0.018326f, 0.236084f, 0.010094f, 0.166870f, 0.001750f, 0.054657f,
+ 0.000000f, 1.000000f, 0.006809f, 0.995117f, 0.012581f, 0.988770f, 0.019684f, 0.980469f,
+ 0.025528f, 0.972656f, 0.032959f, 0.963379f, 0.038269f, 0.956055f, 0.043854f, 0.946289f,
+ 0.050293f, 0.937500f, 0.055115f, 0.929688f, 0.060089f, 0.921387f, 0.065796f, 0.911133f,
+ 0.070801f, 0.902832f, 0.074585f, 0.895996f, 0.078857f, 0.888184f, 0.084106f, 0.877930f,
+ 0.087830f, 0.870117f, 0.091553f, 0.862793f, 0.094482f, 0.856445f, 0.097839f, 0.848633f,
+ 0.101135f, 0.839844f, 0.104370f, 0.832031f, 0.106140f, 0.825684f, 0.108459f, 0.819824f,
+ 0.110046f, 0.814941f, 0.111877f, 0.805664f, 0.114014f, 0.797852f, 0.115601f, 0.791504f,
+ 0.116577f, 0.784668f, 0.117249f, 0.778809f, 0.117798f, 0.772461f, 0.118103f, 0.764160f,
+ 0.118774f, 0.755371f, 0.119446f, 0.747070f, 0.119812f, 0.739258f, 0.118896f, 0.731934f,
+ 0.118347f, 0.724609f, 0.117004f, 0.717773f, 0.117126f, 0.705566f, 0.115784f, 0.694336f,
+ 0.115051f, 0.684570f, 0.113342f, 0.674316f, 0.111328f, 0.664551f, 0.108887f, 0.654785f,
+ 0.105957f, 0.643555f, 0.104248f, 0.628418f, 0.101685f, 0.613770f, 0.098999f, 0.600098f,
+ 0.095459f, 0.585938f, 0.091736f, 0.572266f, 0.087036f, 0.557129f, 0.082886f, 0.537598f,
+ 0.079224f, 0.516113f, 0.074585f, 0.495605f, 0.069092f, 0.474609f, 0.063049f, 0.453125f,
+ 0.056732f, 0.430664f, 0.050995f, 0.397949f, 0.044586f, 0.364258f, 0.037354f, 0.329346f,
+ 0.028717f, 0.292480f, 0.020645f, 0.234497f, 0.011307f, 0.167725f, 0.001945f, 0.054443f,
+ 0.000000f, 1.000000f, 0.007446f, 0.994629f, 0.014336f, 0.987305f, 0.021194f, 0.979980f,
+ 0.028076f, 0.970703f, 0.035339f, 0.962402f, 0.041168f, 0.954590f, 0.048096f, 0.943848f,
+ 0.054718f, 0.935059f, 0.059662f, 0.927734f, 0.066162f, 0.916504f, 0.072693f, 0.907715f,
+ 0.077759f, 0.899414f, 0.082092f, 0.891602f, 0.087646f, 0.880859f, 0.092712f, 0.872559f,
+ 0.096436f, 0.865234f, 0.100403f, 0.857910f, 0.104492f, 0.849121f, 0.108337f, 0.839844f,
+ 0.111755f, 0.832520f, 0.115051f, 0.825195f, 0.117798f, 0.818848f, 0.119568f, 0.812988f,
+ 0.122559f, 0.804199f, 0.124878f, 0.796875f, 0.126343f, 0.790039f, 0.127808f, 0.783691f,
+ 0.129272f, 0.778320f, 0.129395f, 0.771973f, 0.131104f, 0.763184f, 0.132080f, 0.754883f,
+ 0.132935f, 0.747559f, 0.132324f, 0.740234f, 0.132568f, 0.733398f, 0.132080f, 0.726562f,
+ 0.131226f, 0.717773f, 0.130615f, 0.708008f, 0.130249f, 0.698242f, 0.129028f, 0.688965f,
+ 0.127563f, 0.679688f, 0.125488f, 0.670410f, 0.122925f, 0.661621f, 0.120972f, 0.649902f,
+ 0.118958f, 0.636719f, 0.116211f, 0.623535f, 0.113525f, 0.610840f, 0.109741f, 0.597656f,
+ 0.105530f, 0.583984f, 0.101013f, 0.570312f, 0.097107f, 0.553223f, 0.092834f, 0.533203f,
+ 0.088257f, 0.514160f, 0.082764f, 0.494873f, 0.076660f, 0.474609f, 0.069763f, 0.453857f,
+ 0.063538f, 0.427490f, 0.057159f, 0.395996f, 0.049530f, 0.363281f, 0.041138f, 0.329102f,
+ 0.031555f, 0.292969f, 0.023087f, 0.233276f, 0.012466f, 0.168335f, 0.002146f, 0.053955f,
+ 0.000000f, 1.000000f, 0.007866f, 0.994629f, 0.015533f, 0.986816f, 0.022812f, 0.979492f,
+ 0.031311f, 0.969238f, 0.037750f, 0.961914f, 0.045288f, 0.951172f, 0.052368f, 0.941895f,
+ 0.058899f, 0.933594f, 0.066101f, 0.922363f, 0.072876f, 0.912598f, 0.078735f, 0.904785f,
+ 0.083618f, 0.895996f, 0.090881f, 0.884766f, 0.096497f, 0.875488f, 0.101318f, 0.867676f,
+ 0.105835f, 0.860840f, 0.110291f, 0.850098f, 0.115845f, 0.840820f, 0.119690f, 0.833496f,
+ 0.122620f, 0.826172f, 0.125854f, 0.819824f, 0.128906f, 0.811035f, 0.132935f, 0.802246f,
+ 0.135376f, 0.795410f, 0.137695f, 0.788574f, 0.139282f, 0.783203f, 0.140625f, 0.777344f,
+ 0.142456f, 0.769531f, 0.144287f, 0.761230f, 0.144897f, 0.753906f, 0.146118f, 0.747070f,
+ 0.145752f, 0.740723f, 0.146240f, 0.734375f, 0.145020f, 0.728027f, 0.146118f, 0.718262f,
+ 0.145630f, 0.709473f, 0.144775f, 0.700684f, 0.143555f, 0.692383f, 0.142334f, 0.683594f,
+ 0.140015f, 0.675293f, 0.137939f, 0.666992f, 0.135986f, 0.655273f, 0.133789f, 0.643066f,
+ 0.131592f, 0.630859f, 0.128174f, 0.619141f, 0.125000f, 0.607422f, 0.120667f, 0.594727f,
+ 0.116089f, 0.582520f, 0.112000f, 0.565430f, 0.107849f, 0.548340f, 0.102722f, 0.530762f,
+ 0.097229f, 0.512207f, 0.091003f, 0.494141f, 0.084351f, 0.475342f, 0.077087f, 0.453125f,
+ 0.070435f, 0.423828f, 0.062805f, 0.394287f, 0.054779f, 0.363281f, 0.045197f, 0.329834f,
+ 0.034973f, 0.291260f, 0.025497f, 0.232422f, 0.013664f, 0.169312f, 0.002337f, 0.053894f,
+ 0.000000f, 1.000000f, 0.008675f, 0.994629f, 0.016830f, 0.986816f, 0.024796f, 0.978027f,
+ 0.033447f, 0.968750f, 0.041473f, 0.958984f, 0.049957f, 0.948730f, 0.056702f, 0.939941f,
+ 0.064758f, 0.929199f, 0.071960f, 0.919434f, 0.078735f, 0.910156f, 0.085144f, 0.900391f,
+ 0.092285f, 0.889648f, 0.098633f, 0.880371f, 0.103516f, 0.872559f, 0.109558f, 0.863281f,
+ 0.115051f, 0.852539f, 0.120544f, 0.843750f, 0.125732f, 0.835449f, 0.129883f, 0.828125f,
+ 0.133789f, 0.819336f, 0.137573f, 0.810059f, 0.142456f, 0.801758f, 0.145142f, 0.794434f,
+ 0.148071f, 0.787598f, 0.149780f, 0.781738f, 0.152466f, 0.773926f, 0.154907f, 0.766113f,
+ 0.156616f, 0.759277f, 0.158325f, 0.752930f, 0.159180f, 0.746582f, 0.159180f, 0.740723f,
+ 0.159546f, 0.734863f, 0.160278f, 0.725586f, 0.160522f, 0.717773f, 0.160278f, 0.708984f,
+ 0.159912f, 0.702148f, 0.158569f, 0.694336f, 0.157227f, 0.687500f, 0.155884f, 0.680176f,
+ 0.153931f, 0.669434f, 0.152344f, 0.658691f, 0.149780f, 0.647461f, 0.147339f, 0.637207f,
+ 0.144287f, 0.626953f, 0.140625f, 0.616211f, 0.136597f, 0.604980f, 0.131958f, 0.592773f,
+ 0.128052f, 0.576660f, 0.123840f, 0.561035f, 0.118469f, 0.545410f, 0.112732f, 0.528809f,
+ 0.106262f, 0.511719f, 0.099121f, 0.494385f, 0.091797f, 0.474365f, 0.085327f, 0.447998f,
+ 0.077637f, 0.420898f, 0.069214f, 0.393311f, 0.059723f, 0.363037f, 0.049408f, 0.331055f,
+ 0.038940f, 0.287842f, 0.028168f, 0.233154f, 0.014854f, 0.169922f, 0.002617f, 0.054565f,
+ 0.000000f, 1.000000f, 0.009232f, 0.994141f, 0.018173f, 0.986328f, 0.027130f, 0.976562f,
+ 0.035339f, 0.968262f, 0.045166f, 0.957031f, 0.053101f, 0.947754f, 0.060852f, 0.937012f,
+ 0.069824f, 0.926270f, 0.077209f, 0.917480f, 0.085205f, 0.906250f, 0.092651f, 0.895508f,
+ 0.099609f, 0.886230f, 0.105286f, 0.877930f, 0.113342f, 0.866211f, 0.119629f, 0.856445f,
+ 0.125366f, 0.847168f, 0.130005f, 0.838867f, 0.135376f, 0.830078f, 0.141724f, 0.819336f,
+ 0.146484f, 0.811035f, 0.149658f, 0.802734f, 0.154053f, 0.795410f, 0.157959f, 0.788574f,
+ 0.160522f, 0.779785f, 0.164185f, 0.770996f, 0.166748f, 0.763672f, 0.169556f, 0.757324f,
+ 0.170654f, 0.750977f, 0.171265f, 0.745605f, 0.173218f, 0.738770f, 0.174316f, 0.730957f,
+ 0.175415f, 0.723145f, 0.175537f, 0.716797f, 0.175293f, 0.709473f, 0.174927f, 0.703125f,
+ 0.174072f, 0.695801f, 0.172485f, 0.689453f, 0.171265f, 0.679688f, 0.170654f, 0.670410f,
+ 0.168823f, 0.661133f, 0.165649f, 0.651855f, 0.163696f, 0.642578f, 0.160522f, 0.633301f,
+ 0.156616f, 0.623535f, 0.152954f, 0.613770f, 0.149170f, 0.600098f, 0.144775f, 0.586426f,
+ 0.140259f, 0.572266f, 0.134888f, 0.558105f, 0.129150f, 0.543457f, 0.122437f, 0.527344f,
+ 0.115417f, 0.510742f, 0.108276f, 0.491699f, 0.101013f, 0.468750f, 0.093323f, 0.444824f,
+ 0.084839f, 0.419678f, 0.075439f, 0.393066f, 0.065125f, 0.364258f, 0.053772f, 0.331787f,
+ 0.042877f, 0.285400f, 0.030746f, 0.232910f, 0.016144f, 0.171509f, 0.002817f, 0.054291f,
+ 0.000000f, 1.000000f, 0.008987f, 0.994629f, 0.018814f, 0.986328f, 0.029449f, 0.975586f,
+ 0.039124f, 0.965332f, 0.048492f, 0.956055f, 0.057098f, 0.945312f, 0.066772f, 0.934570f,
+ 0.074280f, 0.925293f, 0.084045f, 0.912598f, 0.091675f, 0.902832f, 0.099365f, 0.893066f,
+ 0.107788f, 0.881836f, 0.114929f, 0.871094f, 0.121765f, 0.860840f, 0.127930f, 0.852539f,
+ 0.135742f, 0.841309f, 0.141724f, 0.831543f, 0.147461f, 0.822266f, 0.153320f, 0.812988f,
+ 0.157593f, 0.804688f, 0.162109f, 0.796387f, 0.166870f, 0.786621f, 0.171021f, 0.777832f,
+ 0.175659f, 0.770508f, 0.178101f, 0.763184f, 0.180298f, 0.756836f, 0.182495f, 0.750000f,
+ 0.185425f, 0.741699f, 0.187256f, 0.734375f, 0.188721f, 0.727539f, 0.189697f, 0.720703f,
+ 0.189697f, 0.715332f, 0.190308f, 0.708496f, 0.189819f, 0.703125f, 0.189575f, 0.694824f,
+ 0.189819f, 0.687012f, 0.188477f, 0.679199f, 0.187012f, 0.671387f, 0.185059f, 0.663574f,
+ 0.183228f, 0.655762f, 0.179688f, 0.647461f, 0.177002f, 0.639160f, 0.173340f, 0.629395f,
+ 0.170532f, 0.618164f, 0.166992f, 0.606445f, 0.161987f, 0.593750f, 0.157104f, 0.582031f,
+ 0.151855f, 0.568848f, 0.146240f, 0.555664f, 0.139893f, 0.541504f, 0.132446f, 0.525879f,
+ 0.125977f, 0.506836f, 0.118530f, 0.486816f, 0.110352f, 0.465576f, 0.101868f, 0.443359f,
+ 0.091919f, 0.418945f, 0.081726f, 0.393555f, 0.070129f, 0.365234f, 0.058929f, 0.327393f,
+ 0.046570f, 0.283691f, 0.033203f, 0.233398f, 0.017288f, 0.172241f, 0.003036f, 0.054382f,
+ 0.000000f, 1.000000f, 0.010231f, 0.993652f, 0.020981f, 0.984863f, 0.031113f, 0.975098f,
+ 0.041016f, 0.965332f, 0.051483f, 0.954102f, 0.061768f, 0.943359f, 0.070801f, 0.932129f,
+ 0.080688f, 0.921387f, 0.089783f, 0.910645f, 0.098816f, 0.898926f, 0.107605f, 0.888184f,
+ 0.116211f, 0.877930f, 0.123169f, 0.867188f, 0.130981f, 0.855957f, 0.139282f, 0.845215f,
+ 0.145630f, 0.835449f, 0.151855f, 0.826660f, 0.157959f, 0.816406f, 0.163696f, 0.806641f,
+ 0.170410f, 0.796387f, 0.175293f, 0.787598f, 0.179565f, 0.779297f, 0.184082f, 0.771484f,
+ 0.188110f, 0.762207f, 0.192261f, 0.753906f, 0.195435f, 0.745605f, 0.197510f, 0.738770f,
+ 0.199829f, 0.731934f, 0.202271f, 0.725586f, 0.203125f, 0.719727f, 0.204346f, 0.713379f,
+ 0.205322f, 0.706055f, 0.205933f, 0.699219f, 0.205811f, 0.692383f, 0.205322f, 0.686035f,
+ 0.204346f, 0.679688f, 0.203491f, 0.672363f, 0.201904f, 0.666016f, 0.199097f, 0.658691f,
+ 0.197388f, 0.649414f, 0.194458f, 0.640137f, 0.192017f, 0.630859f, 0.188599f, 0.621582f,
+ 0.184814f, 0.610840f, 0.180176f, 0.600098f, 0.175537f, 0.589355f, 0.169800f, 0.578613f,
+ 0.163940f, 0.566406f, 0.157715f, 0.552246f, 0.151489f, 0.536621f, 0.144043f, 0.520020f,
+ 0.136719f, 0.502441f, 0.128296f, 0.484131f, 0.119812f, 0.464600f, 0.109863f, 0.442871f,
+ 0.099304f, 0.419434f, 0.088135f, 0.394775f, 0.076477f, 0.361816f, 0.064148f, 0.324951f,
+ 0.050781f, 0.284180f, 0.035797f, 0.234619f, 0.018677f, 0.174194f, 0.003256f, 0.054749f,
+ 0.000000f, 1.000000f, 0.010963f, 0.993652f, 0.021759f, 0.984863f, 0.033356f, 0.975098f,
+ 0.044403f, 0.963379f, 0.054718f, 0.953125f, 0.066101f, 0.940918f, 0.075806f, 0.930664f,
+ 0.086243f, 0.917969f, 0.096436f, 0.907227f, 0.105530f, 0.895996f, 0.114624f, 0.884277f,
+ 0.123718f, 0.872559f, 0.131958f, 0.862305f, 0.140015f, 0.851562f, 0.148682f, 0.839844f,
+ 0.156006f, 0.829102f, 0.163696f, 0.819336f, 0.169556f, 0.809570f, 0.175659f, 0.799805f,
+ 0.182373f, 0.790039f, 0.187012f, 0.780762f, 0.192505f, 0.771484f, 0.197754f, 0.762695f,
+ 0.201660f, 0.754395f, 0.205811f, 0.746582f, 0.209229f, 0.738770f, 0.211914f, 0.730957f,
+ 0.214966f, 0.722656f, 0.216675f, 0.715820f, 0.218750f, 0.708496f, 0.220215f, 0.702637f,
+ 0.221069f, 0.696289f, 0.221191f, 0.690430f, 0.221313f, 0.684570f, 0.221069f, 0.677246f,
+ 0.219849f, 0.670410f, 0.219360f, 0.663086f, 0.217041f, 0.655273f, 0.215332f, 0.648438f,
+ 0.212891f, 0.640625f, 0.210205f, 0.632324f, 0.206665f, 0.624512f, 0.202393f, 0.615723f,
+ 0.198364f, 0.606445f, 0.193604f, 0.596191f, 0.188354f, 0.584961f, 0.182861f, 0.572754f,
+ 0.176636f, 0.560059f, 0.170410f, 0.546387f, 0.163452f, 0.532227f, 0.155762f, 0.517090f,
+ 0.147217f, 0.500488f, 0.138306f, 0.483154f, 0.128540f, 0.464111f, 0.117737f, 0.443115f,
+ 0.107361f, 0.418457f, 0.095337f, 0.390625f, 0.082520f, 0.359863f, 0.069275f, 0.324707f,
+ 0.054626f, 0.284424f, 0.038544f, 0.235840f, 0.019958f, 0.175537f, 0.003546f, 0.055634f,
+ 0.000000f, 1.000000f, 0.012215f, 0.993164f, 0.023682f, 0.984375f, 0.035767f, 0.974121f,
+ 0.047485f, 0.961914f, 0.058838f, 0.950684f, 0.070312f, 0.939453f, 0.081848f, 0.927246f,
+ 0.092224f, 0.915527f, 0.102295f, 0.904297f, 0.112793f, 0.892090f, 0.122742f, 0.880371f,
+ 0.131714f, 0.869629f, 0.140503f, 0.858398f, 0.149536f, 0.846191f, 0.158081f, 0.834961f,
+ 0.165649f, 0.823730f, 0.174194f, 0.812988f, 0.181641f, 0.802734f, 0.187622f, 0.792480f,
+ 0.195312f, 0.781738f, 0.200928f, 0.771973f, 0.205933f, 0.762695f, 0.210938f, 0.753906f,
+ 0.216675f, 0.744629f, 0.220581f, 0.736328f, 0.224243f, 0.728516f, 0.227295f, 0.720703f,
+ 0.230469f, 0.712402f, 0.233398f, 0.705078f, 0.234985f, 0.698242f, 0.236206f, 0.691406f,
+ 0.236938f, 0.685547f, 0.238037f, 0.679199f, 0.237183f, 0.673340f, 0.237305f, 0.667480f,
+ 0.236694f, 0.661133f, 0.234253f, 0.655273f, 0.233154f, 0.648438f, 0.231201f, 0.640625f,
+ 0.228027f, 0.633301f, 0.225464f, 0.625000f, 0.221802f, 0.617188f, 0.217529f, 0.608398f,
+ 0.213745f, 0.599609f, 0.208252f, 0.589355f, 0.202393f, 0.579102f, 0.196655f, 0.568359f,
+ 0.189941f, 0.556152f, 0.182739f, 0.543457f, 0.174805f, 0.530273f, 0.166992f, 0.515625f,
+ 0.157471f, 0.498535f, 0.148071f, 0.480713f, 0.137939f, 0.461182f, 0.126953f, 0.439209f,
+ 0.114990f, 0.415283f, 0.102417f, 0.388672f, 0.088989f, 0.358887f, 0.074463f, 0.324951f,
+ 0.058289f, 0.285400f, 0.041046f, 0.237427f, 0.021713f, 0.171631f, 0.003746f, 0.055847f,
+ 0.000000f, 1.000000f, 0.012253f, 0.993652f, 0.025192f, 0.983398f, 0.038239f, 0.972168f,
+ 0.050659f, 0.960449f, 0.062988f, 0.948730f, 0.075439f, 0.936523f, 0.086792f, 0.924805f,
+ 0.097900f, 0.912598f, 0.109253f, 0.900391f, 0.119995f, 0.887695f, 0.130249f, 0.875977f,
+ 0.140015f, 0.864258f, 0.150269f, 0.852051f, 0.160278f, 0.840332f, 0.169067f, 0.828613f,
+ 0.177368f, 0.817383f, 0.185669f, 0.806641f, 0.193359f, 0.795898f, 0.200439f, 0.785645f,
+ 0.207642f, 0.774902f, 0.213989f, 0.765137f, 0.220703f, 0.754883f, 0.225342f, 0.745605f,
+ 0.231567f, 0.736328f, 0.234863f, 0.727539f, 0.238892f, 0.719238f, 0.242920f, 0.710938f,
+ 0.245483f, 0.703613f, 0.248901f, 0.695312f, 0.250732f, 0.688477f, 0.251709f, 0.682129f,
+ 0.253418f, 0.675293f, 0.253418f, 0.669922f, 0.253662f, 0.663574f, 0.253174f, 0.657715f,
+ 0.252686f, 0.651855f, 0.250977f, 0.645996f, 0.249268f, 0.639160f, 0.247437f, 0.632812f,
+ 0.244141f, 0.625977f, 0.240967f, 0.618164f, 0.237183f, 0.610840f, 0.232178f, 0.602051f,
+ 0.227417f, 0.593750f, 0.222168f, 0.583984f, 0.216309f, 0.574219f, 0.210327f, 0.563477f,
+ 0.203613f, 0.551758f, 0.195679f, 0.539062f, 0.186646f, 0.525879f, 0.178345f, 0.511230f,
+ 0.168701f, 0.495117f, 0.158569f, 0.477783f, 0.147583f, 0.458740f, 0.135376f, 0.437744f,
+ 0.122864f, 0.414551f, 0.109924f, 0.388916f, 0.095093f, 0.359619f, 0.079529f, 0.325684f,
+ 0.062469f, 0.286133f, 0.044067f, 0.236450f, 0.023499f, 0.169922f, 0.004017f, 0.056610f,
+ 0.000000f, 1.000000f, 0.013107f, 0.993164f, 0.026093f, 0.983398f, 0.039032f, 0.972656f,
+ 0.052094f, 0.960938f, 0.065063f, 0.948242f, 0.077698f, 0.936035f, 0.089539f, 0.923828f,
+ 0.101074f, 0.911621f, 0.113403f, 0.898438f, 0.123840f, 0.886719f, 0.134888f, 0.874023f,
+ 0.144897f, 0.861816f, 0.155396f, 0.849609f, 0.165405f, 0.837891f, 0.174805f, 0.826172f,
+ 0.183838f, 0.814453f, 0.191895f, 0.803223f, 0.200684f, 0.791992f, 0.208130f, 0.781250f,
+ 0.214966f, 0.770996f, 0.221802f, 0.760742f, 0.228638f, 0.750488f, 0.233643f, 0.741211f,
+ 0.239380f, 0.731445f, 0.243774f, 0.722656f, 0.248779f, 0.713379f, 0.252686f, 0.705566f,
+ 0.256348f, 0.697266f, 0.259277f, 0.689453f, 0.262207f, 0.682129f, 0.263672f, 0.674805f,
+ 0.264404f, 0.668457f, 0.265869f, 0.662109f, 0.266357f, 0.656250f, 0.265625f, 0.650391f,
+ 0.265137f, 0.644531f, 0.263672f, 0.638184f, 0.261963f, 0.632324f, 0.259766f, 0.625977f,
+ 0.257080f, 0.619141f, 0.254150f, 0.612305f, 0.250244f, 0.604492f, 0.246094f, 0.596191f,
+ 0.241455f, 0.588379f, 0.236572f, 0.579102f, 0.230347f, 0.569336f, 0.223999f, 0.559082f,
+ 0.216919f, 0.547852f, 0.209106f, 0.535156f, 0.200806f, 0.521973f, 0.192139f, 0.508301f,
+ 0.181885f, 0.491943f, 0.171387f, 0.475098f, 0.160400f, 0.456299f, 0.148315f, 0.435547f,
+ 0.135132f, 0.412598f, 0.121704f, 0.386963f, 0.106140f, 0.357422f, 0.090454f, 0.323975f,
+ 0.072388f, 0.284668f, 0.052643f, 0.235352f, 0.030457f, 0.169189f, 0.006878f, 0.060669f,
+ 0.000000f, 1.000000f, 0.013000f, 0.993164f, 0.026215f, 0.983398f, 0.039032f, 0.972656f,
+ 0.052002f, 0.960938f, 0.064575f, 0.948730f, 0.077454f, 0.936523f, 0.089417f, 0.923828f,
+ 0.101440f, 0.911133f, 0.113586f, 0.898438f, 0.124390f, 0.886230f, 0.135620f, 0.873535f,
+ 0.145996f, 0.861816f, 0.156494f, 0.849121f, 0.166504f, 0.837402f, 0.176147f, 0.825684f,
+ 0.184570f, 0.813965f, 0.193481f, 0.802246f, 0.201660f, 0.791504f, 0.210449f, 0.779785f,
+ 0.217285f, 0.770020f, 0.224976f, 0.758789f, 0.231201f, 0.749023f, 0.237671f, 0.738770f,
+ 0.243408f, 0.729492f, 0.248901f, 0.720215f, 0.253174f, 0.711426f, 0.257568f, 0.702637f,
+ 0.261719f, 0.693848f, 0.264160f, 0.686523f, 0.266846f, 0.678711f, 0.270508f, 0.670898f,
+ 0.271729f, 0.664551f, 0.273438f, 0.657715f, 0.273682f, 0.651855f, 0.273926f, 0.645996f,
+ 0.273193f, 0.639648f, 0.273438f, 0.633301f, 0.271240f, 0.627441f, 0.270020f, 0.620605f,
+ 0.267578f, 0.613770f, 0.265137f, 0.606934f, 0.261963f, 0.599121f, 0.258301f, 0.591309f,
+ 0.253418f, 0.582520f, 0.249268f, 0.574219f, 0.243408f, 0.563965f, 0.237061f, 0.554199f,
+ 0.230957f, 0.542969f, 0.223999f, 0.530762f, 0.216187f, 0.517578f, 0.207520f, 0.503418f,
+ 0.198242f, 0.488037f, 0.188232f, 0.471436f, 0.177246f, 0.452637f, 0.165283f, 0.432617f,
+ 0.152466f, 0.409424f, 0.138550f, 0.384277f, 0.123474f, 0.355469f, 0.107422f, 0.322266f,
+ 0.088745f, 0.283203f, 0.068054f, 0.234253f, 0.043793f, 0.168579f, 0.014336f, 0.061371f,
+ 0.000000f, 1.000000f, 0.013023f, 0.993164f, 0.026016f, 0.983398f, 0.039551f, 0.972168f,
+ 0.051727f, 0.960938f, 0.064941f, 0.948730f, 0.077148f, 0.936523f, 0.089233f, 0.923828f,
+ 0.101868f, 0.911133f, 0.113586f, 0.898438f, 0.125244f, 0.886230f, 0.135986f, 0.873535f,
+ 0.147583f, 0.860840f, 0.157715f, 0.848633f, 0.167969f, 0.836914f, 0.177368f, 0.824707f,
+ 0.186279f, 0.813477f, 0.195923f, 0.801758f, 0.204346f, 0.790039f, 0.212402f, 0.779297f,
+ 0.220215f, 0.768066f, 0.227295f, 0.757812f, 0.234497f, 0.747070f, 0.241333f, 0.737305f,
+ 0.247559f, 0.727051f, 0.252441f, 0.717773f, 0.258057f, 0.708496f, 0.262451f, 0.699707f,
+ 0.266846f, 0.691406f, 0.270508f, 0.682617f, 0.273682f, 0.674805f, 0.277100f, 0.666992f,
+ 0.278564f, 0.660156f, 0.280029f, 0.653320f, 0.281250f, 0.646973f, 0.281982f, 0.640625f,
+ 0.281982f, 0.634766f, 0.282471f, 0.627930f, 0.281006f, 0.621582f, 0.280029f, 0.615234f,
+ 0.278564f, 0.608398f, 0.276123f, 0.601562f, 0.273193f, 0.593750f, 0.269775f, 0.585938f,
+ 0.266113f, 0.577148f, 0.262451f, 0.568848f, 0.257324f, 0.559082f, 0.251221f, 0.548340f,
+ 0.246094f, 0.538086f, 0.239258f, 0.525879f, 0.231567f, 0.513184f, 0.223267f, 0.498779f,
+ 0.214844f, 0.483887f, 0.204956f, 0.467529f, 0.194336f, 0.449219f, 0.182495f, 0.428955f,
+ 0.170654f, 0.406250f, 0.156860f, 0.381104f, 0.141357f, 0.352783f, 0.125000f, 0.320068f,
+ 0.106384f, 0.281494f, 0.084900f, 0.233032f, 0.059113f, 0.168091f, 0.025330f, 0.061462f,
+ 0.000000f, 1.000000f, 0.013138f, 0.993164f, 0.025894f, 0.983398f, 0.039368f, 0.972168f,
+ 0.052155f, 0.960449f, 0.064880f, 0.948730f, 0.077698f, 0.936035f, 0.090393f, 0.923340f,
+ 0.102478f, 0.911133f, 0.113831f, 0.898438f, 0.124756f, 0.886230f, 0.136841f, 0.873047f,
+ 0.147217f, 0.861328f, 0.158325f, 0.848633f, 0.169067f, 0.836426f, 0.178955f, 0.824219f,
+ 0.188232f, 0.812012f, 0.197510f, 0.800781f, 0.206665f, 0.789062f, 0.214966f, 0.777832f,
+ 0.222656f, 0.767090f, 0.229980f, 0.756348f, 0.238281f, 0.745605f, 0.244385f, 0.735352f,
+ 0.251221f, 0.725098f, 0.256592f, 0.715332f, 0.261963f, 0.706055f, 0.267090f, 0.696777f,
+ 0.271240f, 0.688477f, 0.277100f, 0.679688f, 0.280518f, 0.671387f, 0.282227f, 0.663574f,
+ 0.285645f, 0.656250f, 0.287354f, 0.648926f, 0.289551f, 0.642090f, 0.291016f, 0.635254f,
+ 0.291016f, 0.629395f, 0.291260f, 0.622559f, 0.291016f, 0.616211f, 0.290283f, 0.609375f,
+ 0.289062f, 0.602539f, 0.287109f, 0.595215f, 0.285400f, 0.588379f, 0.282227f, 0.580078f,
+ 0.279541f, 0.571777f, 0.274658f, 0.562988f, 0.271240f, 0.553223f, 0.265625f, 0.542969f,
+ 0.259766f, 0.532715f, 0.254639f, 0.520508f, 0.247314f, 0.507812f, 0.239990f, 0.494629f,
+ 0.231323f, 0.479248f, 0.222290f, 0.462402f, 0.211914f, 0.444336f, 0.201050f, 0.424805f,
+ 0.189087f, 0.402588f, 0.175415f, 0.377686f, 0.161255f, 0.349609f, 0.144531f, 0.316650f,
+ 0.125732f, 0.277588f, 0.104248f, 0.229980f, 0.076416f, 0.165527f, 0.039185f, 0.059326f,
+ 0.000000f, 1.000000f, 0.013107f, 0.992676f, 0.026016f, 0.983398f, 0.039429f, 0.972168f,
+ 0.052490f, 0.960449f, 0.065125f, 0.948730f, 0.078064f, 0.936035f, 0.090576f, 0.923340f,
+ 0.102539f, 0.911133f, 0.114441f, 0.898438f, 0.126343f, 0.885742f, 0.137939f, 0.873047f,
+ 0.148926f, 0.860352f, 0.159302f, 0.848145f, 0.169800f, 0.835938f, 0.179443f, 0.823730f,
+ 0.189941f, 0.811523f, 0.199463f, 0.799805f, 0.208740f, 0.788086f, 0.216797f, 0.776855f,
+ 0.224976f, 0.765625f, 0.233765f, 0.754395f, 0.240601f, 0.744141f, 0.247803f, 0.733398f,
+ 0.254639f, 0.723145f, 0.260986f, 0.713379f, 0.267334f, 0.703125f, 0.272217f, 0.693848f,
+ 0.277588f, 0.684570f, 0.281494f, 0.676270f, 0.285400f, 0.667969f, 0.289062f, 0.659668f,
+ 0.292725f, 0.651367f, 0.294922f, 0.644043f, 0.298096f, 0.636719f, 0.298584f, 0.630371f,
+ 0.300781f, 0.624023f, 0.300293f, 0.617188f, 0.301514f, 0.610352f, 0.301025f, 0.603516f,
+ 0.300049f, 0.596680f, 0.299072f, 0.589355f, 0.296631f, 0.582031f, 0.294678f, 0.573730f,
+ 0.291748f, 0.565430f, 0.288574f, 0.556152f, 0.285645f, 0.547363f, 0.280029f, 0.537109f,
+ 0.275391f, 0.525879f, 0.270508f, 0.514160f, 0.263916f, 0.501465f, 0.256836f, 0.488037f,
+ 0.249268f, 0.473145f, 0.240479f, 0.456299f, 0.231079f, 0.438477f, 0.220581f, 0.419189f,
+ 0.208130f, 0.397461f, 0.195557f, 0.373047f, 0.181152f, 0.345703f, 0.164307f, 0.313477f,
+ 0.146118f, 0.275635f, 0.123596f, 0.229370f, 0.095337f, 0.164917f, 0.054840f, 0.059937f,
+ 0.000000f, 1.000000f, 0.012680f, 0.993164f, 0.025787f, 0.983887f, 0.039124f, 0.972656f,
+ 0.052582f, 0.960449f, 0.065491f, 0.948242f, 0.077576f, 0.936523f, 0.090454f, 0.923340f,
+ 0.102783f, 0.910645f, 0.115173f, 0.897949f, 0.127075f, 0.885254f, 0.138062f, 0.872559f,
+ 0.149536f, 0.860352f, 0.160767f, 0.847656f, 0.171143f, 0.834961f, 0.181885f, 0.822754f,
+ 0.191406f, 0.810547f, 0.201538f, 0.798340f, 0.210693f, 0.787109f, 0.219604f, 0.775391f,
+ 0.228027f, 0.764160f, 0.236206f, 0.752930f, 0.244507f, 0.742188f, 0.251465f, 0.731445f,
+ 0.258789f, 0.720703f, 0.264648f, 0.710938f, 0.271240f, 0.700684f, 0.276611f, 0.691406f,
+ 0.283447f, 0.681152f, 0.287598f, 0.672363f, 0.292236f, 0.663574f, 0.296143f, 0.655273f,
+ 0.301025f, 0.646973f, 0.303223f, 0.639160f, 0.305908f, 0.631836f, 0.307617f, 0.625000f,
+ 0.309570f, 0.617676f, 0.310547f, 0.611328f, 0.311523f, 0.604004f, 0.311768f, 0.597168f,
+ 0.311279f, 0.589355f, 0.310303f, 0.582031f, 0.309570f, 0.574707f, 0.308105f, 0.566895f,
+ 0.305664f, 0.558105f, 0.303467f, 0.549316f, 0.300049f, 0.540039f, 0.295898f, 0.530273f,
+ 0.291504f, 0.519531f, 0.286621f, 0.508301f, 0.280518f, 0.495850f, 0.273926f, 0.482178f,
+ 0.266357f, 0.468018f, 0.258789f, 0.451660f, 0.249390f, 0.434326f, 0.239380f, 0.415283f,
+ 0.227905f, 0.393555f, 0.215820f, 0.369873f, 0.201294f, 0.342285f, 0.185181f, 0.311035f,
+ 0.166626f, 0.273682f, 0.144653f, 0.227173f, 0.116333f, 0.162964f, 0.073181f, 0.059082f,
+ 0.000000f, 1.000000f, 0.012787f, 0.993164f, 0.025696f, 0.983887f, 0.038879f, 0.972656f,
+ 0.052216f, 0.960938f, 0.065063f, 0.948730f, 0.078064f, 0.936035f, 0.091064f, 0.923340f,
+ 0.103027f, 0.911133f, 0.115295f, 0.897949f, 0.127197f, 0.885254f, 0.138916f, 0.872559f,
+ 0.150513f, 0.859375f, 0.161377f, 0.847168f, 0.172363f, 0.834473f, 0.183350f, 0.822266f,
+ 0.193970f, 0.809570f, 0.203369f, 0.797852f, 0.213013f, 0.786133f, 0.221191f, 0.774414f,
+ 0.230469f, 0.762695f, 0.240234f, 0.750977f, 0.246948f, 0.740234f, 0.255371f, 0.729004f,
+ 0.262207f, 0.718750f, 0.269775f, 0.708008f, 0.276855f, 0.697754f, 0.282715f, 0.687500f,
+ 0.287842f, 0.678223f, 0.293945f, 0.668457f, 0.299316f, 0.659668f, 0.303223f, 0.650391f,
+ 0.308105f, 0.641602f, 0.311279f, 0.633301f, 0.313721f, 0.625977f, 0.316650f, 0.618652f,
+ 0.318848f, 0.611328f, 0.320801f, 0.604492f, 0.321045f, 0.597656f, 0.322998f, 0.590332f,
+ 0.322266f, 0.583008f, 0.322510f, 0.576172f, 0.321533f, 0.568359f, 0.321045f, 0.560547f,
+ 0.319336f, 0.552246f, 0.317139f, 0.543457f, 0.313721f, 0.533691f, 0.310303f, 0.524414f,
+ 0.306885f, 0.513672f, 0.301758f, 0.501953f, 0.297607f, 0.489990f, 0.291260f, 0.476562f,
+ 0.284424f, 0.462646f, 0.277344f, 0.446777f, 0.268066f, 0.429199f, 0.259277f, 0.410400f,
+ 0.248413f, 0.389404f, 0.236572f, 0.364990f, 0.223389f, 0.338623f, 0.207153f, 0.307129f,
+ 0.189087f, 0.269775f, 0.166626f, 0.225098f, 0.137939f, 0.162964f, 0.093628f, 0.059509f,
+ 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.026138f, 0.983398f, 0.039093f, 0.972656f,
+ 0.052246f, 0.960938f, 0.065308f, 0.948730f, 0.078552f, 0.936035f, 0.091675f, 0.923340f,
+ 0.103271f, 0.911133f, 0.116028f, 0.897949f, 0.127808f, 0.885254f, 0.139526f, 0.872070f,
+ 0.151611f, 0.859375f, 0.163208f, 0.846191f, 0.173584f, 0.833984f, 0.184937f, 0.821289f,
+ 0.194214f, 0.809082f, 0.205322f, 0.796387f, 0.214478f, 0.784668f, 0.225098f, 0.772461f,
+ 0.233765f, 0.760742f, 0.241577f, 0.749512f, 0.251709f, 0.737305f, 0.258789f, 0.726562f,
+ 0.266357f, 0.715820f, 0.274658f, 0.704590f, 0.282227f, 0.693848f, 0.288574f, 0.683594f,
+ 0.294678f, 0.673828f, 0.300537f, 0.664062f, 0.305420f, 0.655273f, 0.310303f, 0.645996f,
+ 0.314209f, 0.637695f, 0.319824f, 0.628418f, 0.322510f, 0.620605f, 0.324951f, 0.613281f,
+ 0.328125f, 0.605469f, 0.330078f, 0.598633f, 0.331543f, 0.591797f, 0.333252f, 0.583984f,
+ 0.333740f, 0.577148f, 0.334229f, 0.569824f, 0.333740f, 0.562012f, 0.333252f, 0.554199f,
+ 0.332520f, 0.545898f, 0.330322f, 0.536621f, 0.328369f, 0.527832f, 0.325928f, 0.517578f,
+ 0.322754f, 0.507324f, 0.318115f, 0.496338f, 0.315430f, 0.484131f, 0.309082f, 0.470215f,
+ 0.302979f, 0.456055f, 0.296143f, 0.440674f, 0.287842f, 0.423584f, 0.279297f, 0.404785f,
+ 0.269287f, 0.384277f, 0.257812f, 0.361084f, 0.244629f, 0.334717f, 0.229858f, 0.303955f,
+ 0.212036f, 0.267334f, 0.190186f, 0.221924f, 0.160767f, 0.160522f, 0.115051f, 0.058319f,
+ 0.000000f, 1.000000f, 0.012390f, 0.993652f, 0.025955f, 0.983398f, 0.039337f, 0.972656f,
+ 0.051727f, 0.961426f, 0.065369f, 0.948730f, 0.078430f, 0.936035f, 0.090698f, 0.923828f,
+ 0.104248f, 0.910156f, 0.116821f, 0.897461f, 0.128540f, 0.884277f, 0.140625f, 0.871582f,
+ 0.152100f, 0.858398f, 0.163818f, 0.846191f, 0.174927f, 0.833008f, 0.186523f, 0.820312f,
+ 0.196777f, 0.807617f, 0.207886f, 0.795410f, 0.217285f, 0.783203f, 0.226685f, 0.770996f,
+ 0.236694f, 0.758301f, 0.245850f, 0.747070f, 0.254883f, 0.734863f, 0.262939f, 0.724121f,
+ 0.271973f, 0.712402f, 0.279053f, 0.702148f, 0.286377f, 0.690918f, 0.292236f, 0.681152f,
+ 0.299805f, 0.670898f, 0.305420f, 0.661133f, 0.311279f, 0.651367f, 0.316895f, 0.642090f,
+ 0.321777f, 0.633301f, 0.326904f, 0.624512f, 0.330811f, 0.615723f, 0.333740f, 0.607910f,
+ 0.336670f, 0.600098f, 0.339355f, 0.592773f, 0.342285f, 0.585449f, 0.344238f, 0.578125f,
+ 0.345215f, 0.570312f, 0.345947f, 0.562988f, 0.346924f, 0.554688f, 0.345947f, 0.547363f,
+ 0.345947f, 0.538574f, 0.345459f, 0.529297f, 0.344238f, 0.520508f, 0.341309f, 0.510254f,
+ 0.338379f, 0.500000f, 0.334961f, 0.489258f, 0.331299f, 0.477051f, 0.326660f, 0.463867f,
+ 0.321045f, 0.449707f, 0.314941f, 0.434814f, 0.307617f, 0.418457f, 0.299561f, 0.399414f,
+ 0.290771f, 0.379395f, 0.279785f, 0.355957f, 0.267822f, 0.329834f, 0.253174f, 0.299805f,
+ 0.235718f, 0.264404f, 0.214233f, 0.219727f, 0.186035f, 0.159302f, 0.139648f, 0.058105f,
+ 0.000000f, 1.000000f, 0.012421f, 0.993652f, 0.026154f, 0.983398f, 0.039032f, 0.972656f,
+ 0.051605f, 0.961426f, 0.065491f, 0.948730f, 0.078247f, 0.936523f, 0.091797f, 0.922852f,
+ 0.105103f, 0.910156f, 0.116699f, 0.897461f, 0.129639f, 0.883789f, 0.141357f, 0.871094f,
+ 0.153442f, 0.857910f, 0.164917f, 0.845215f, 0.176636f, 0.832031f, 0.187866f, 0.819336f,
+ 0.199097f, 0.806152f, 0.209473f, 0.793457f, 0.219604f, 0.781250f, 0.230957f, 0.768555f,
+ 0.239746f, 0.756836f, 0.249512f, 0.744629f, 0.258301f, 0.733398f, 0.266602f, 0.722168f,
+ 0.274658f, 0.710938f, 0.282959f, 0.699707f, 0.291016f, 0.688965f, 0.298584f, 0.678223f,
+ 0.304688f, 0.667969f, 0.311035f, 0.657715f, 0.317139f, 0.647949f, 0.322754f, 0.638672f,
+ 0.328613f, 0.628906f, 0.333008f, 0.620117f, 0.338623f, 0.611328f, 0.343018f, 0.602539f,
+ 0.346680f, 0.594238f, 0.349365f, 0.586426f, 0.352783f, 0.578613f, 0.354980f, 0.571289f,
+ 0.357178f, 0.563477f, 0.358154f, 0.555664f, 0.359619f, 0.547852f, 0.359375f, 0.540039f,
+ 0.359863f, 0.531738f, 0.359863f, 0.522461f, 0.358154f, 0.513184f, 0.357666f, 0.503418f,
+ 0.354248f, 0.493408f, 0.352051f, 0.482910f, 0.348877f, 0.470459f, 0.345459f, 0.457275f,
+ 0.341064f, 0.443359f, 0.334961f, 0.428711f, 0.328613f, 0.411865f, 0.321533f, 0.394043f,
+ 0.312012f, 0.374023f, 0.301758f, 0.351562f, 0.291260f, 0.325439f, 0.276123f, 0.295654f,
+ 0.260254f, 0.260742f, 0.239014f, 0.217529f, 0.211792f, 0.156494f, 0.165283f, 0.057495f,
+ 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.025940f, 0.983398f, 0.039276f, 0.972656f,
+ 0.052155f, 0.960938f, 0.065552f, 0.948730f, 0.078430f, 0.936035f, 0.091797f, 0.922852f,
+ 0.104614f, 0.910156f, 0.117310f, 0.896973f, 0.129028f, 0.884277f, 0.142822f, 0.870117f,
+ 0.154663f, 0.857422f, 0.166504f, 0.844238f, 0.178711f, 0.830566f, 0.190063f, 0.817383f,
+ 0.200928f, 0.805176f, 0.211670f, 0.792480f, 0.222778f, 0.779785f, 0.232422f, 0.767578f,
+ 0.242310f, 0.755859f, 0.251709f, 0.743652f, 0.260742f, 0.731934f, 0.269043f, 0.720703f,
+ 0.278564f, 0.708496f, 0.287354f, 0.697754f, 0.294922f, 0.686523f, 0.302002f, 0.675781f,
+ 0.310059f, 0.665039f, 0.317139f, 0.654297f, 0.322998f, 0.644531f, 0.330078f, 0.634277f,
+ 0.336670f, 0.624023f, 0.341797f, 0.614746f, 0.347168f, 0.605957f, 0.352051f, 0.596191f,
+ 0.356445f, 0.587891f, 0.359863f, 0.579590f, 0.362549f, 0.571777f, 0.365234f, 0.564453f,
+ 0.368896f, 0.556641f, 0.370361f, 0.548340f, 0.371582f, 0.541016f, 0.373047f, 0.532227f,
+ 0.373779f, 0.523926f, 0.373535f, 0.515625f, 0.374512f, 0.505371f, 0.372559f, 0.496338f,
+ 0.371094f, 0.485840f, 0.369385f, 0.474854f, 0.366455f, 0.463135f, 0.363281f, 0.450684f,
+ 0.360107f, 0.436768f, 0.354736f, 0.422363f, 0.350098f, 0.405029f, 0.342529f, 0.387451f,
+ 0.334473f, 0.368164f, 0.325684f, 0.345947f, 0.314941f, 0.320557f, 0.302246f, 0.291504f,
+ 0.285400f, 0.257080f, 0.265381f, 0.214355f, 0.238281f, 0.155151f, 0.192993f, 0.055817f,
+ 0.000000f, 1.000000f, 0.012619f, 0.993164f, 0.025803f, 0.983887f, 0.038879f, 0.972656f,
+ 0.051758f, 0.961426f, 0.065369f, 0.948730f, 0.079041f, 0.936035f, 0.091553f, 0.923340f,
+ 0.105469f, 0.909668f, 0.117310f, 0.896973f, 0.130737f, 0.883301f, 0.143188f, 0.869629f,
+ 0.155396f, 0.856445f, 0.167969f, 0.842773f, 0.179688f, 0.829590f, 0.191162f, 0.817383f,
+ 0.202393f, 0.804199f, 0.213379f, 0.791504f, 0.224854f, 0.778809f, 0.234741f, 0.766602f,
+ 0.244751f, 0.754395f, 0.255371f, 0.741699f, 0.263428f, 0.730469f, 0.273926f, 0.718262f,
+ 0.282959f, 0.706543f, 0.291016f, 0.695312f, 0.299805f, 0.684082f, 0.308594f, 0.672363f,
+ 0.316406f, 0.661133f, 0.323242f, 0.650391f, 0.330322f, 0.640137f, 0.337402f, 0.629883f,
+ 0.343506f, 0.620117f, 0.349854f, 0.609863f, 0.354980f, 0.600586f, 0.360596f, 0.591309f,
+ 0.364502f, 0.583008f, 0.369629f, 0.573730f, 0.372803f, 0.565430f, 0.376709f, 0.557617f,
+ 0.379883f, 0.549805f, 0.382812f, 0.541016f, 0.385010f, 0.533203f, 0.386963f, 0.524414f,
+ 0.387939f, 0.516113f, 0.388428f, 0.507324f, 0.389648f, 0.498047f, 0.388184f, 0.488525f,
+ 0.388672f, 0.478760f, 0.386475f, 0.467285f, 0.385254f, 0.455811f, 0.382080f, 0.442871f,
+ 0.380127f, 0.429932f, 0.375488f, 0.415039f, 0.370605f, 0.399414f, 0.364746f, 0.381348f,
+ 0.356934f, 0.361816f, 0.348389f, 0.340576f, 0.338623f, 0.315674f, 0.327637f, 0.287354f,
+ 0.312500f, 0.253174f, 0.292969f, 0.210938f, 0.267090f, 0.152832f, 0.220703f, 0.055206f,
+ 0.000000f, 1.000000f, 0.012627f, 0.993164f, 0.025696f, 0.983887f, 0.038879f, 0.973145f,
+ 0.052155f, 0.961426f, 0.065735f, 0.948242f, 0.079651f, 0.935547f, 0.092651f, 0.922363f,
+ 0.105652f, 0.909180f, 0.118713f, 0.895996f, 0.132080f, 0.881836f, 0.145020f, 0.868652f,
+ 0.157593f, 0.855469f, 0.169189f, 0.842285f, 0.180664f, 0.829590f, 0.192749f, 0.816406f,
+ 0.203979f, 0.803711f, 0.215454f, 0.790527f, 0.225830f, 0.778320f, 0.237183f, 0.765137f,
+ 0.247681f, 0.753418f, 0.257324f, 0.740723f, 0.267090f, 0.728516f, 0.277344f, 0.716309f,
+ 0.287354f, 0.704102f, 0.297119f, 0.691895f, 0.304932f, 0.680176f, 0.312988f, 0.669434f,
+ 0.321289f, 0.658203f, 0.329346f, 0.646973f, 0.336914f, 0.636230f, 0.343994f, 0.625488f,
+ 0.350098f, 0.615723f, 0.357422f, 0.605469f, 0.363525f, 0.595215f, 0.368652f, 0.586426f,
+ 0.374512f, 0.576660f, 0.380615f, 0.566895f, 0.384521f, 0.558105f, 0.387207f, 0.550781f,
+ 0.390869f, 0.542480f, 0.395264f, 0.534180f, 0.397705f, 0.525391f, 0.399902f, 0.517578f,
+ 0.402832f, 0.508301f, 0.403809f, 0.499512f, 0.404785f, 0.489990f, 0.405029f, 0.480469f,
+ 0.405029f, 0.470459f, 0.404541f, 0.459229f, 0.403320f, 0.447998f, 0.401855f, 0.435303f,
+ 0.400146f, 0.422119f, 0.395508f, 0.407471f, 0.392578f, 0.392090f, 0.386963f, 0.375488f,
+ 0.380127f, 0.355469f, 0.373535f, 0.334473f, 0.364258f, 0.310303f, 0.352783f, 0.282471f,
+ 0.339111f, 0.248413f, 0.321289f, 0.207153f, 0.295410f, 0.150024f, 0.250977f, 0.055573f,
+ 0.000000f, 1.000000f, 0.012405f, 0.993652f, 0.026001f, 0.983398f, 0.038910f, 0.972656f,
+ 0.052338f, 0.960938f, 0.066589f, 0.947754f, 0.078979f, 0.935547f, 0.093323f, 0.922363f,
+ 0.106750f, 0.908203f, 0.119690f, 0.895020f, 0.133423f, 0.881348f, 0.145630f, 0.868164f,
+ 0.156982f, 0.855469f, 0.170288f, 0.842285f, 0.181763f, 0.829102f, 0.193481f, 0.816406f,
+ 0.205933f, 0.802734f, 0.217285f, 0.790039f, 0.227539f, 0.777344f, 0.239746f, 0.764160f,
+ 0.249634f, 0.751465f, 0.261475f, 0.738281f, 0.271729f, 0.726074f, 0.281982f, 0.713379f,
+ 0.291504f, 0.701172f, 0.299805f, 0.689453f, 0.310059f, 0.678223f, 0.319092f, 0.666016f,
+ 0.326904f, 0.654785f, 0.335205f, 0.644043f, 0.343262f, 0.632812f, 0.351318f, 0.621582f,
+ 0.358398f, 0.610840f, 0.364990f, 0.600586f, 0.372559f, 0.589844f, 0.378174f, 0.580078f,
+ 0.383789f, 0.570801f, 0.388672f, 0.561523f, 0.394287f, 0.552246f, 0.398926f, 0.543457f,
+ 0.404297f, 0.534668f, 0.406738f, 0.526367f, 0.410889f, 0.517578f, 0.413086f, 0.509277f,
+ 0.416504f, 0.500488f, 0.417969f, 0.491455f, 0.420166f, 0.481934f, 0.421631f, 0.472168f,
+ 0.422119f, 0.462158f, 0.422852f, 0.451172f, 0.421631f, 0.439941f, 0.420410f, 0.428223f,
+ 0.419922f, 0.414307f, 0.416748f, 0.400146f, 0.414307f, 0.385010f, 0.408447f, 0.367920f,
+ 0.403809f, 0.348877f, 0.397705f, 0.327881f, 0.389404f, 0.304199f, 0.378418f, 0.276611f,
+ 0.366455f, 0.244507f, 0.349121f, 0.203491f, 0.324951f, 0.147583f, 0.282471f, 0.053955f,
+ 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.025864f, 0.983887f, 0.039215f, 0.972656f,
+ 0.052826f, 0.960449f, 0.066345f, 0.947754f, 0.079773f, 0.935059f, 0.093628f, 0.921387f,
+ 0.107666f, 0.908203f, 0.120300f, 0.894531f, 0.133301f, 0.881836f, 0.145386f, 0.868652f,
+ 0.158325f, 0.854980f, 0.171143f, 0.841797f, 0.183594f, 0.828613f, 0.195923f, 0.814941f,
+ 0.207397f, 0.802246f, 0.218872f, 0.789062f, 0.231201f, 0.775391f, 0.242188f, 0.762207f,
+ 0.253418f, 0.749512f, 0.264160f, 0.736816f, 0.273438f, 0.724121f, 0.284668f, 0.711914f,
+ 0.294189f, 0.699707f, 0.305420f, 0.687500f, 0.314209f, 0.675293f, 0.323486f, 0.663574f,
+ 0.333740f, 0.651367f, 0.341309f, 0.640137f, 0.349365f, 0.628906f, 0.357666f, 0.617676f,
+ 0.364746f, 0.606445f, 0.372070f, 0.596191f, 0.379883f, 0.585449f, 0.387695f, 0.574707f,
+ 0.393311f, 0.564941f, 0.399658f, 0.554688f, 0.405762f, 0.545410f, 0.410889f, 0.535645f,
+ 0.415039f, 0.527344f, 0.419678f, 0.518555f, 0.423584f, 0.510254f, 0.427734f, 0.500488f,
+ 0.432129f, 0.491943f, 0.434326f, 0.482910f, 0.435547f, 0.473877f, 0.439209f, 0.463623f,
+ 0.439697f, 0.453125f, 0.439941f, 0.442383f, 0.440674f, 0.431152f, 0.440918f, 0.419678f,
+ 0.439697f, 0.405762f, 0.437744f, 0.392578f, 0.435791f, 0.377197f, 0.432617f, 0.360840f,
+ 0.427734f, 0.342041f, 0.422363f, 0.321777f, 0.415527f, 0.297607f, 0.406250f, 0.271240f,
+ 0.395020f, 0.239014f, 0.378418f, 0.199463f, 0.355957f, 0.145142f, 0.315918f, 0.052887f,
+ 0.000000f, 1.000000f, 0.012573f, 0.993164f, 0.025833f, 0.983398f, 0.039368f, 0.972656f,
+ 0.052643f, 0.960449f, 0.066833f, 0.947754f, 0.081299f, 0.934082f, 0.094421f, 0.920898f,
+ 0.107910f, 0.907715f, 0.120361f, 0.895020f, 0.134399f, 0.881348f, 0.146484f, 0.868164f,
+ 0.159424f, 0.854980f, 0.171631f, 0.841797f, 0.183960f, 0.828125f, 0.196045f, 0.814941f,
+ 0.209351f, 0.800781f, 0.221313f, 0.787109f, 0.233398f, 0.773926f, 0.244629f, 0.761230f,
+ 0.256104f, 0.748047f, 0.266602f, 0.735352f, 0.278320f, 0.722168f, 0.287598f, 0.709961f,
+ 0.299805f, 0.697266f, 0.309814f, 0.684570f, 0.319092f, 0.672363f, 0.328125f, 0.660156f,
+ 0.339111f, 0.648438f, 0.347656f, 0.636230f, 0.355225f, 0.625000f, 0.364746f, 0.613770f,
+ 0.373779f, 0.601562f, 0.380859f, 0.591309f, 0.388184f, 0.580078f, 0.395752f, 0.569336f,
+ 0.403076f, 0.559082f, 0.408691f, 0.549316f, 0.416016f, 0.539062f, 0.422119f, 0.528809f,
+ 0.427246f, 0.519531f, 0.432373f, 0.510254f, 0.437256f, 0.501465f, 0.441895f, 0.492676f,
+ 0.444580f, 0.483887f, 0.449219f, 0.473633f, 0.451904f, 0.464600f, 0.455322f, 0.455322f,
+ 0.457031f, 0.444580f, 0.458496f, 0.433838f, 0.460449f, 0.422607f, 0.459961f, 0.410645f,
+ 0.460205f, 0.397949f, 0.460205f, 0.383789f, 0.457520f, 0.369385f, 0.455811f, 0.352539f,
+ 0.451660f, 0.334473f, 0.448975f, 0.314453f, 0.442139f, 0.291748f, 0.434814f, 0.265625f,
+ 0.424805f, 0.234375f, 0.408936f, 0.195068f, 0.387695f, 0.141968f, 0.348633f, 0.051575f,
+ 0.000000f, 1.000000f, 0.012520f, 0.993164f, 0.025620f, 0.983887f, 0.038788f, 0.972656f,
+ 0.052856f, 0.960449f, 0.067627f, 0.946777f, 0.081360f, 0.934082f, 0.095093f, 0.920898f,
+ 0.107849f, 0.908203f, 0.121277f, 0.894531f, 0.133911f, 0.881348f, 0.146973f, 0.868164f,
+ 0.160767f, 0.854492f, 0.173584f, 0.840332f, 0.186646f, 0.826660f, 0.199097f, 0.812988f,
+ 0.211304f, 0.799805f, 0.223389f, 0.786621f, 0.234497f, 0.772949f, 0.246582f, 0.760254f,
+ 0.258789f, 0.746582f, 0.269287f, 0.733887f, 0.281738f, 0.720215f, 0.291504f, 0.707520f,
+ 0.303223f, 0.694824f, 0.312744f, 0.682129f, 0.324219f, 0.669434f, 0.334229f, 0.657227f,
+ 0.343506f, 0.645020f, 0.354004f, 0.632812f, 0.363037f, 0.620605f, 0.371094f, 0.609375f,
+ 0.379395f, 0.598145f, 0.388916f, 0.585938f, 0.396729f, 0.575195f, 0.404785f, 0.563965f,
+ 0.411865f, 0.553223f, 0.419189f, 0.542480f, 0.427002f, 0.532227f, 0.432129f, 0.522461f,
+ 0.439697f, 0.511719f, 0.445801f, 0.502441f, 0.450439f, 0.492920f, 0.454590f, 0.484131f,
+ 0.460449f, 0.474854f, 0.464111f, 0.465088f, 0.468994f, 0.455566f, 0.471436f, 0.445801f,
+ 0.474854f, 0.435059f, 0.477295f, 0.425049f, 0.479248f, 0.413330f, 0.479736f, 0.402100f,
+ 0.481445f, 0.389160f, 0.481689f, 0.375244f, 0.481689f, 0.360840f, 0.478516f, 0.344482f,
+ 0.477295f, 0.326660f, 0.474365f, 0.307129f, 0.468506f, 0.285156f, 0.462402f, 0.259033f,
+ 0.453613f, 0.228271f, 0.439453f, 0.190674f, 0.420898f, 0.137817f, 0.383301f, 0.052277f,
+ 0.000000f, 1.000000f, 0.012436f, 0.993164f, 0.025482f, 0.983887f, 0.039398f, 0.972168f,
+ 0.053711f, 0.959961f, 0.067749f, 0.946777f, 0.080383f, 0.934570f, 0.093933f, 0.921875f,
+ 0.108093f, 0.908203f, 0.121460f, 0.894531f, 0.134766f, 0.881348f, 0.148071f, 0.867676f,
+ 0.162354f, 0.853516f, 0.175049f, 0.839355f, 0.188110f, 0.825684f, 0.200073f, 0.812500f,
+ 0.213501f, 0.798828f, 0.225464f, 0.785645f, 0.237549f, 0.772461f, 0.248779f, 0.758789f,
+ 0.262207f, 0.744629f, 0.274170f, 0.731445f, 0.283936f, 0.718262f, 0.296143f, 0.705566f,
+ 0.306641f, 0.692383f, 0.317627f, 0.679688f, 0.329346f, 0.666504f, 0.338867f, 0.654297f,
+ 0.349365f, 0.641602f, 0.358398f, 0.629883f, 0.368896f, 0.617188f, 0.379150f, 0.605469f,
+ 0.389160f, 0.592773f, 0.396729f, 0.581543f, 0.404541f, 0.569824f, 0.413330f, 0.558594f,
+ 0.423096f, 0.546875f, 0.430420f, 0.536133f, 0.437012f, 0.525391f, 0.444580f, 0.514648f,
+ 0.450684f, 0.504883f, 0.457520f, 0.494629f, 0.463379f, 0.484375f, 0.469238f, 0.475098f,
+ 0.474609f, 0.465576f, 0.479980f, 0.456055f, 0.484619f, 0.446045f, 0.489014f, 0.436035f,
+ 0.492432f, 0.425537f, 0.495361f, 0.414551f, 0.498535f, 0.404297f, 0.501465f, 0.391602f,
+ 0.502441f, 0.379639f, 0.504395f, 0.366211f, 0.503418f, 0.351318f, 0.504395f, 0.336182f,
+ 0.502441f, 0.318604f, 0.500977f, 0.299561f, 0.496582f, 0.277832f, 0.491455f, 0.252930f,
+ 0.482178f, 0.223145f, 0.470947f, 0.186279f, 0.454834f, 0.134888f, 0.419189f, 0.048889f,
+ 0.000000f, 1.000000f, 0.012390f, 0.993164f, 0.025208f, 0.983887f, 0.039673f, 0.972168f,
+ 0.054291f, 0.958984f, 0.068054f, 0.946777f, 0.080444f, 0.935059f, 0.094543f, 0.921875f,
+ 0.108093f, 0.908203f, 0.121277f, 0.895020f, 0.135376f, 0.880859f, 0.148804f, 0.866699f,
+ 0.162109f, 0.853027f, 0.175659f, 0.839355f, 0.187988f, 0.826172f, 0.201050f, 0.812012f,
+ 0.214355f, 0.798340f, 0.227539f, 0.784668f, 0.240112f, 0.770020f, 0.251953f, 0.757324f,
+ 0.263916f, 0.743652f, 0.276367f, 0.729980f, 0.287842f, 0.716797f, 0.299805f, 0.703613f,
+ 0.311035f, 0.690430f, 0.322998f, 0.676758f, 0.333496f, 0.664062f, 0.344238f, 0.651367f,
+ 0.354248f, 0.638672f, 0.365479f, 0.625977f, 0.376465f, 0.612793f, 0.385986f, 0.601074f,
+ 0.395264f, 0.588867f, 0.405029f, 0.576660f, 0.413818f, 0.564453f, 0.422607f, 0.553711f,
+ 0.431152f, 0.541504f, 0.439697f, 0.530273f, 0.448730f, 0.518555f, 0.455811f, 0.507812f,
+ 0.463135f, 0.497314f, 0.471680f, 0.485840f, 0.477539f, 0.475830f, 0.484131f, 0.465820f,
+ 0.490234f, 0.456299f, 0.495605f, 0.446533f, 0.500977f, 0.436523f, 0.505859f, 0.426025f,
+ 0.511230f, 0.415771f, 0.514160f, 0.405029f, 0.518555f, 0.393799f, 0.521484f, 0.381592f,
+ 0.524414f, 0.369385f, 0.525391f, 0.355957f, 0.526855f, 0.341797f, 0.527344f, 0.326904f,
+ 0.527344f, 0.309326f, 0.527344f, 0.291016f, 0.523438f, 0.269775f, 0.520020f, 0.245728f,
+ 0.512695f, 0.216919f, 0.503418f, 0.181152f, 0.487305f, 0.130859f, 0.454834f, 0.048218f,
+ 0.000000f, 1.000000f, 0.012207f, 0.993164f, 0.025513f, 0.983887f, 0.040070f, 0.971680f,
+ 0.054382f, 0.958984f, 0.067993f, 0.946777f, 0.081482f, 0.934082f, 0.095581f, 0.920898f,
+ 0.109802f, 0.907715f, 0.122864f, 0.894043f, 0.136353f, 0.879883f, 0.150024f, 0.866211f,
+ 0.163452f, 0.852539f, 0.176758f, 0.838867f, 0.189697f, 0.825195f, 0.203247f, 0.811035f,
+ 0.215698f, 0.797363f, 0.228638f, 0.783203f, 0.242432f, 0.769531f, 0.254639f, 0.755859f,
+ 0.266846f, 0.742188f, 0.279297f, 0.728027f, 0.290527f, 0.715332f, 0.303467f, 0.701172f,
+ 0.314697f, 0.687988f, 0.326904f, 0.674316f, 0.338135f, 0.661133f, 0.349609f, 0.648438f,
+ 0.360596f, 0.635254f, 0.371338f, 0.622559f, 0.383057f, 0.609375f, 0.393066f, 0.596680f,
+ 0.402344f, 0.584473f, 0.412109f, 0.572266f, 0.422607f, 0.559570f, 0.432617f, 0.547363f,
+ 0.441162f, 0.535645f, 0.449707f, 0.523926f, 0.458496f, 0.512207f, 0.467529f, 0.500977f,
+ 0.475586f, 0.489746f, 0.484131f, 0.478271f, 0.491211f, 0.467529f, 0.498291f, 0.456787f,
+ 0.504883f, 0.446533f, 0.512207f, 0.435791f, 0.518066f, 0.426025f, 0.523926f, 0.415771f,
+ 0.527832f, 0.405273f, 0.533203f, 0.395020f, 0.538086f, 0.383057f, 0.542969f, 0.371582f,
+ 0.544922f, 0.359131f, 0.548340f, 0.346191f, 0.551758f, 0.331787f, 0.551758f, 0.316650f,
+ 0.554199f, 0.300781f, 0.554688f, 0.281982f, 0.551758f, 0.261719f, 0.549805f, 0.237671f,
+ 0.544434f, 0.209717f, 0.537598f, 0.175049f, 0.522461f, 0.127441f, 0.493896f, 0.046814f,
+ 0.000000f, 1.000000f, 0.011963f, 0.993652f, 0.025787f, 0.983398f, 0.040527f, 0.971191f,
+ 0.054321f, 0.959473f, 0.067871f, 0.947266f, 0.081543f, 0.934570f, 0.095947f, 0.920898f,
+ 0.109680f, 0.907715f, 0.123047f, 0.893555f, 0.136230f, 0.880371f, 0.150391f, 0.866211f,
+ 0.164185f, 0.852051f, 0.177490f, 0.838379f, 0.191528f, 0.823730f, 0.205933f, 0.809570f,
+ 0.218140f, 0.795898f, 0.230957f, 0.782227f, 0.244385f, 0.768066f, 0.258301f, 0.753906f,
+ 0.269043f, 0.740723f, 0.282959f, 0.726562f, 0.294189f, 0.713379f, 0.307617f, 0.699219f,
+ 0.319092f, 0.685547f, 0.330566f, 0.672363f, 0.342285f, 0.658691f, 0.354492f, 0.645508f,
+ 0.367188f, 0.631836f, 0.377197f, 0.618652f, 0.388184f, 0.605957f, 0.399658f, 0.592773f,
+ 0.410400f, 0.580078f, 0.420654f, 0.566895f, 0.430176f, 0.555176f, 0.440918f, 0.541992f,
+ 0.451172f, 0.529785f, 0.460693f, 0.517578f, 0.470215f, 0.505371f, 0.478271f, 0.493896f,
+ 0.486572f, 0.482178f, 0.495605f, 0.470703f, 0.504395f, 0.459229f, 0.512695f, 0.447754f,
+ 0.520996f, 0.436523f, 0.526855f, 0.426270f, 0.534180f, 0.415771f, 0.540039f, 0.405518f,
+ 0.546387f, 0.394531f, 0.553223f, 0.383545f, 0.559082f, 0.371826f, 0.562500f, 0.360596f,
+ 0.567871f, 0.348389f, 0.571777f, 0.335205f, 0.575195f, 0.321533f, 0.578613f, 0.306641f,
+ 0.580566f, 0.290527f, 0.580566f, 0.272705f, 0.581055f, 0.252686f, 0.579102f, 0.229614f,
+ 0.575684f, 0.202515f, 0.569336f, 0.169189f, 0.557617f, 0.121826f, 0.531250f, 0.044739f,
+ 0.000000f, 1.000000f, 0.011620f, 0.993652f, 0.025833f, 0.983398f, 0.040833f, 0.970703f,
+ 0.054504f, 0.959473f, 0.068237f, 0.947266f, 0.081787f, 0.934570f, 0.096069f, 0.920898f,
+ 0.110229f, 0.906738f, 0.124023f, 0.893066f, 0.138306f, 0.879395f, 0.152100f, 0.865723f,
+ 0.165405f, 0.852051f, 0.178467f, 0.837891f, 0.192139f, 0.823730f, 0.206055f, 0.809570f,
+ 0.220703f, 0.794922f, 0.232666f, 0.781250f, 0.246582f, 0.766602f, 0.259277f, 0.752930f,
+ 0.272949f, 0.739258f, 0.285645f, 0.724609f, 0.298828f, 0.710938f, 0.311279f, 0.697266f,
+ 0.323242f, 0.683594f, 0.335938f, 0.669434f, 0.347412f, 0.655762f, 0.360352f, 0.642090f,
+ 0.373047f, 0.628418f, 0.383545f, 0.615234f, 0.394531f, 0.602051f, 0.406006f, 0.588867f,
+ 0.418457f, 0.575195f, 0.429199f, 0.562012f, 0.439697f, 0.549805f, 0.449951f, 0.536621f,
+ 0.458740f, 0.524414f, 0.470947f, 0.511719f, 0.481445f, 0.498779f, 0.491211f, 0.486328f,
+ 0.499512f, 0.474609f, 0.509277f, 0.462646f, 0.516602f, 0.451172f, 0.526367f, 0.439209f,
+ 0.533691f, 0.427734f, 0.543945f, 0.415771f, 0.550781f, 0.405029f, 0.558594f, 0.394043f,
+ 0.565918f, 0.383301f, 0.572266f, 0.372070f, 0.578125f, 0.360840f, 0.584473f, 0.348877f,
+ 0.589844f, 0.336914f, 0.595215f, 0.323730f, 0.599121f, 0.310547f, 0.603027f, 0.295898f,
+ 0.607422f, 0.280273f, 0.608887f, 0.262939f, 0.610352f, 0.243286f, 0.609375f, 0.221436f,
+ 0.607910f, 0.194702f, 0.604492f, 0.162842f, 0.593262f, 0.118347f, 0.570312f, 0.043488f,
+ 0.000000f, 1.000000f, 0.011742f, 0.993652f, 0.026215f, 0.982910f, 0.040924f, 0.971191f,
+ 0.054016f, 0.959961f, 0.067322f, 0.947754f, 0.082031f, 0.934082f, 0.096375f, 0.920410f,
+ 0.110352f, 0.906738f, 0.124390f, 0.893555f, 0.137329f, 0.879883f, 0.152466f, 0.864746f,
+ 0.166626f, 0.851074f, 0.180298f, 0.836914f, 0.193604f, 0.823242f, 0.208008f, 0.808105f,
+ 0.221802f, 0.794434f, 0.235107f, 0.780273f, 0.247437f, 0.766602f, 0.262451f, 0.751465f,
+ 0.275635f, 0.737305f, 0.288330f, 0.723633f, 0.301758f, 0.708984f, 0.313965f, 0.695312f,
+ 0.327881f, 0.681152f, 0.340088f, 0.666992f, 0.353027f, 0.652832f, 0.364746f, 0.639160f,
+ 0.376709f, 0.625488f, 0.389893f, 0.611816f, 0.401611f, 0.598145f, 0.413330f, 0.584473f,
+ 0.426270f, 0.570801f, 0.437500f, 0.557617f, 0.449463f, 0.543945f, 0.460205f, 0.530762f,
+ 0.470215f, 0.518066f, 0.481445f, 0.504883f, 0.492188f, 0.492432f, 0.501953f, 0.479736f,
+ 0.512695f, 0.466553f, 0.522949f, 0.454346f, 0.532715f, 0.442139f, 0.540527f, 0.430176f,
+ 0.551270f, 0.417725f, 0.557617f, 0.406494f, 0.567383f, 0.394287f, 0.575684f, 0.383057f,
+ 0.583496f, 0.371582f, 0.592285f, 0.360352f, 0.599121f, 0.348877f, 0.605957f, 0.336914f,
+ 0.612305f, 0.324951f, 0.618652f, 0.312012f, 0.622559f, 0.298584f, 0.629395f, 0.284180f,
+ 0.632324f, 0.268799f, 0.636719f, 0.251953f, 0.638672f, 0.233398f, 0.641602f, 0.212036f,
+ 0.639648f, 0.187134f, 0.638184f, 0.155273f, 0.630859f, 0.112732f, 0.611816f, 0.041626f,
+ 0.000000f, 1.000000f, 0.011772f, 0.993652f, 0.026489f, 0.982422f, 0.040741f, 0.971680f,
+ 0.053833f, 0.959961f, 0.068054f, 0.947266f, 0.082886f, 0.933594f, 0.096436f, 0.920410f,
+ 0.110229f, 0.907227f, 0.123840f, 0.893555f, 0.139038f, 0.878906f, 0.152832f, 0.865234f,
+ 0.166626f, 0.851074f, 0.181641f, 0.835938f, 0.195557f, 0.821777f, 0.208130f, 0.808594f,
+ 0.223022f, 0.793457f, 0.237305f, 0.778809f, 0.249878f, 0.765137f, 0.264893f, 0.750488f,
+ 0.278320f, 0.735840f, 0.291992f, 0.721191f, 0.304688f, 0.707520f, 0.319336f, 0.692383f,
+ 0.331543f, 0.678711f, 0.344971f, 0.664551f, 0.358643f, 0.650391f, 0.369873f, 0.636230f,
+ 0.383789f, 0.622070f, 0.396484f, 0.607910f, 0.408691f, 0.594238f, 0.420654f, 0.580566f,
+ 0.433105f, 0.566406f, 0.445068f, 0.552734f, 0.457520f, 0.538574f, 0.469238f, 0.525391f,
+ 0.480713f, 0.512207f, 0.490479f, 0.499512f, 0.502930f, 0.485596f, 0.514160f, 0.472656f,
+ 0.524414f, 0.459473f, 0.535645f, 0.446289f, 0.544922f, 0.433838f, 0.555664f, 0.420654f,
+ 0.564453f, 0.408936f, 0.575195f, 0.395996f, 0.584961f, 0.383545f, 0.593750f, 0.371094f,
+ 0.604004f, 0.359131f, 0.611816f, 0.347656f, 0.620117f, 0.336182f, 0.627441f, 0.324707f,
+ 0.634766f, 0.312012f, 0.641113f, 0.300049f, 0.647949f, 0.286133f, 0.654297f, 0.271973f,
+ 0.660156f, 0.256836f, 0.664551f, 0.240845f, 0.668945f, 0.222168f, 0.671875f, 0.201904f,
+ 0.673340f, 0.177734f, 0.672363f, 0.147827f, 0.666992f, 0.106750f, 0.651367f, 0.039673f,
+ 0.000000f, 1.000000f, 0.011971f, 0.993652f, 0.026947f, 0.982422f, 0.040131f, 0.972168f,
+ 0.053833f, 0.960449f, 0.068359f, 0.946777f, 0.083008f, 0.933594f, 0.096802f, 0.920410f,
+ 0.111511f, 0.906738f, 0.125488f, 0.892578f, 0.139038f, 0.879395f, 0.153442f, 0.864746f,
+ 0.168457f, 0.850098f, 0.181641f, 0.836426f, 0.196777f, 0.821289f, 0.211792f, 0.806641f,
+ 0.224243f, 0.792480f, 0.238647f, 0.778320f, 0.252930f, 0.763184f, 0.267334f, 0.749023f,
+ 0.281006f, 0.734375f, 0.295410f, 0.719238f, 0.307617f, 0.705566f, 0.321045f, 0.691406f,
+ 0.335205f, 0.676758f, 0.348877f, 0.662109f, 0.363037f, 0.647461f, 0.375244f, 0.633789f,
+ 0.389404f, 0.618652f, 0.402100f, 0.604492f, 0.414551f, 0.590332f, 0.428223f, 0.576172f,
+ 0.441406f, 0.562012f, 0.453857f, 0.547852f, 0.465820f, 0.534180f, 0.478516f, 0.520020f,
+ 0.490479f, 0.506348f, 0.501953f, 0.492920f, 0.513184f, 0.479248f, 0.525879f, 0.465332f,
+ 0.537109f, 0.451660f, 0.548340f, 0.438477f, 0.559082f, 0.425049f, 0.569824f, 0.412354f,
+ 0.581543f, 0.398682f, 0.591309f, 0.385742f, 0.602051f, 0.373047f, 0.612793f, 0.359863f,
+ 0.621582f, 0.347412f, 0.631348f, 0.335205f, 0.638672f, 0.323730f, 0.648438f, 0.311523f,
+ 0.659180f, 0.298584f, 0.666016f, 0.285400f, 0.673340f, 0.272705f, 0.680176f, 0.259277f,
+ 0.688965f, 0.243530f, 0.693848f, 0.228271f, 0.699707f, 0.210327f, 0.703613f, 0.191040f,
+ 0.707031f, 0.168701f, 0.708984f, 0.139893f, 0.705566f, 0.101440f, 0.691406f, 0.037720f,
+ 0.000000f, 1.000000f, 0.012199f, 0.993164f, 0.027023f, 0.982910f, 0.040283f, 0.972168f,
+ 0.054169f, 0.959961f, 0.069092f, 0.946289f, 0.082886f, 0.933594f, 0.097168f, 0.920410f,
+ 0.111694f, 0.906250f, 0.126099f, 0.892578f, 0.140259f, 0.878418f, 0.155640f, 0.863770f,
+ 0.169067f, 0.849609f, 0.184570f, 0.834961f, 0.197876f, 0.820801f, 0.211792f, 0.806641f,
+ 0.226807f, 0.791504f, 0.241455f, 0.776855f, 0.254883f, 0.762695f, 0.269775f, 0.747559f,
+ 0.283691f, 0.733398f, 0.298340f, 0.717773f, 0.311279f, 0.703613f, 0.326172f, 0.688477f,
+ 0.339111f, 0.674316f, 0.353760f, 0.659668f, 0.368652f, 0.644043f, 0.380615f, 0.630371f,
+ 0.394531f, 0.615723f, 0.407959f, 0.601074f, 0.422607f, 0.586426f, 0.435059f, 0.571777f,
+ 0.447266f, 0.558105f, 0.460693f, 0.543945f, 0.473877f, 0.529297f, 0.486572f, 0.515137f,
+ 0.499756f, 0.500488f, 0.512695f, 0.486328f, 0.524902f, 0.472168f, 0.537598f, 0.458008f,
+ 0.549316f, 0.444580f, 0.560547f, 0.430664f, 0.572754f, 0.416504f, 0.584473f, 0.402832f,
+ 0.596680f, 0.389160f, 0.607910f, 0.375732f, 0.618652f, 0.362305f, 0.629395f, 0.349121f,
+ 0.640625f, 0.335693f, 0.650879f, 0.322510f, 0.662109f, 0.309326f, 0.671387f, 0.297119f,
+ 0.680664f, 0.284668f, 0.690430f, 0.271729f, 0.698730f, 0.258301f, 0.708008f, 0.244507f,
+ 0.715332f, 0.230103f, 0.722168f, 0.214722f, 0.730469f, 0.197876f, 0.735840f, 0.179321f,
+ 0.741211f, 0.157349f, 0.744141f, 0.130249f, 0.744141f, 0.094849f, 0.734863f, 0.035278f,
+ 0.000000f, 1.000000f, 0.012444f, 0.993164f, 0.027298f, 0.982422f, 0.040283f, 0.972168f,
+ 0.055054f, 0.958984f, 0.068970f, 0.946777f, 0.082336f, 0.934082f, 0.097351f, 0.919922f,
+ 0.112183f, 0.906250f, 0.126343f, 0.892578f, 0.141113f, 0.877930f, 0.155396f, 0.863770f,
+ 0.170532f, 0.848633f, 0.184448f, 0.834473f, 0.199707f, 0.820312f, 0.214355f, 0.804688f,
+ 0.228149f, 0.791016f, 0.242432f, 0.775879f, 0.256592f, 0.761230f, 0.272461f, 0.746094f,
+ 0.285645f, 0.731445f, 0.300781f, 0.716797f, 0.314453f, 0.701660f, 0.329590f, 0.687012f,
+ 0.344727f, 0.671875f, 0.357422f, 0.657227f, 0.372803f, 0.642090f, 0.387207f, 0.626953f,
+ 0.399902f, 0.612305f, 0.413086f, 0.597656f, 0.428467f, 0.583008f, 0.441162f, 0.568359f,
+ 0.455811f, 0.553223f, 0.469238f, 0.538574f, 0.482666f, 0.523926f, 0.496094f, 0.509277f,
+ 0.509277f, 0.494873f, 0.521973f, 0.480469f, 0.534668f, 0.466064f, 0.548340f, 0.451416f,
+ 0.561035f, 0.437256f, 0.573730f, 0.422607f, 0.587402f, 0.407715f, 0.600586f, 0.393799f,
+ 0.612305f, 0.379639f, 0.625488f, 0.365234f, 0.636230f, 0.351807f, 0.648438f, 0.337646f,
+ 0.659668f, 0.323730f, 0.671875f, 0.310059f, 0.682129f, 0.296387f, 0.693359f, 0.282715f,
+ 0.704590f, 0.269287f, 0.714355f, 0.256104f, 0.725098f, 0.242798f, 0.734375f, 0.229614f,
+ 0.743164f, 0.215088f, 0.752441f, 0.200073f, 0.760254f, 0.184570f, 0.768555f, 0.166260f,
+ 0.773926f, 0.145630f, 0.780762f, 0.120667f, 0.782715f, 0.086487f, 0.776367f, 0.031677f,
+ 0.000000f, 1.000000f, 0.012665f, 0.992676f, 0.026840f, 0.982910f, 0.039856f, 0.972168f,
+ 0.054871f, 0.959473f, 0.068848f, 0.946777f, 0.083618f, 0.933105f, 0.098145f, 0.919922f,
+ 0.112549f, 0.906250f, 0.127075f, 0.891602f, 0.141724f, 0.877930f, 0.156250f, 0.863281f,
+ 0.170776f, 0.849121f, 0.186401f, 0.833496f, 0.200073f, 0.819824f, 0.214600f, 0.804688f,
+ 0.229980f, 0.790039f, 0.245361f, 0.774414f, 0.259277f, 0.760254f, 0.275391f, 0.744629f,
+ 0.290039f, 0.729980f, 0.303711f, 0.714844f, 0.318604f, 0.699707f, 0.333740f, 0.684570f,
+ 0.347656f, 0.669434f, 0.362305f, 0.654785f, 0.377197f, 0.639160f, 0.391113f, 0.624023f,
+ 0.406982f, 0.608887f, 0.420166f, 0.594238f, 0.435547f, 0.578613f, 0.448730f, 0.563965f,
+ 0.463379f, 0.548828f, 0.477051f, 0.534180f, 0.491699f, 0.518555f, 0.505371f, 0.503906f,
+ 0.520020f, 0.489014f, 0.532715f, 0.473877f, 0.546875f, 0.458984f, 0.560059f, 0.444092f,
+ 0.573730f, 0.429199f, 0.587402f, 0.414307f, 0.600098f, 0.399658f, 0.614258f, 0.384766f,
+ 0.627441f, 0.370361f, 0.640137f, 0.355713f, 0.651855f, 0.341553f, 0.666016f, 0.326416f,
+ 0.679199f, 0.312012f, 0.691406f, 0.297363f, 0.702637f, 0.283447f, 0.715820f, 0.268799f,
+ 0.728516f, 0.254150f, 0.739258f, 0.240234f, 0.750000f, 0.226807f, 0.760254f, 0.213135f,
+ 0.772461f, 0.199219f, 0.782715f, 0.183716f, 0.791504f, 0.168945f, 0.801758f, 0.151123f,
+ 0.810059f, 0.132446f, 0.815918f, 0.109253f, 0.823242f, 0.079285f, 0.820312f, 0.029144f,
+ 0.000000f, 1.000000f, 0.013290f, 0.992188f, 0.026016f, 0.983887f, 0.040649f, 0.971680f,
+ 0.054962f, 0.959473f, 0.068970f, 0.946777f, 0.083130f, 0.933594f, 0.098511f, 0.919434f,
+ 0.112671f, 0.905762f, 0.128174f, 0.891602f, 0.141968f, 0.877441f, 0.157349f, 0.862793f,
+ 0.171997f, 0.848145f, 0.186646f, 0.833496f, 0.202148f, 0.818848f, 0.216797f, 0.803711f,
+ 0.231934f, 0.789062f, 0.246338f, 0.773926f, 0.261719f, 0.759277f, 0.277344f, 0.743652f,
+ 0.291992f, 0.728516f, 0.306152f, 0.713379f, 0.322510f, 0.697754f, 0.337158f, 0.682617f,
+ 0.352539f, 0.666992f, 0.367188f, 0.651855f, 0.382324f, 0.636719f, 0.397461f, 0.621094f,
+ 0.410645f, 0.605957f, 0.426270f, 0.590332f, 0.441650f, 0.575195f, 0.456299f, 0.560059f,
+ 0.471191f, 0.544434f, 0.485352f, 0.529297f, 0.499512f, 0.513672f, 0.514160f, 0.498535f,
+ 0.529297f, 0.483398f, 0.543457f, 0.468018f, 0.558594f, 0.452393f, 0.573242f, 0.437012f,
+ 0.586914f, 0.421875f, 0.601562f, 0.406494f, 0.615234f, 0.391357f, 0.629395f, 0.376221f,
+ 0.642578f, 0.360840f, 0.656250f, 0.345703f, 0.670410f, 0.330078f, 0.684570f, 0.314697f,
+ 0.698242f, 0.299805f, 0.711914f, 0.284668f, 0.725586f, 0.269775f, 0.737793f, 0.255127f,
+ 0.750000f, 0.240112f, 0.763672f, 0.224854f, 0.775879f, 0.210083f, 0.788574f, 0.195435f,
+ 0.800293f, 0.181030f, 0.812012f, 0.166504f, 0.823730f, 0.151611f, 0.834473f, 0.135010f,
+ 0.844238f, 0.117065f, 0.854980f, 0.096191f, 0.861328f, 0.069702f, 0.862793f, 0.025696f,
+ 0.000000f, 1.000000f, 0.013832f, 0.991699f, 0.026260f, 0.983398f, 0.041382f, 0.971191f,
+ 0.054626f, 0.959961f, 0.069336f, 0.946289f, 0.083618f, 0.933594f, 0.098633f, 0.919434f,
+ 0.112976f, 0.905762f, 0.128296f, 0.891602f, 0.142578f, 0.876953f, 0.158203f, 0.862793f,
+ 0.172974f, 0.847656f, 0.189087f, 0.832520f, 0.202759f, 0.818359f, 0.218384f, 0.803223f,
+ 0.234619f, 0.787598f, 0.248169f, 0.772949f, 0.264893f, 0.757324f, 0.279541f, 0.742188f,
+ 0.294678f, 0.727051f, 0.310791f, 0.710938f, 0.326660f, 0.695801f, 0.341064f, 0.680176f,
+ 0.356934f, 0.664551f, 0.371582f, 0.648926f, 0.387207f, 0.633789f, 0.402588f, 0.618164f,
+ 0.418457f, 0.602539f, 0.433105f, 0.586914f, 0.448242f, 0.571289f, 0.462891f, 0.555664f,
+ 0.478027f, 0.540039f, 0.492920f, 0.524414f, 0.508789f, 0.508789f, 0.525391f, 0.492920f,
+ 0.539551f, 0.477051f, 0.555664f, 0.461182f, 0.569824f, 0.445557f, 0.584473f, 0.429932f,
+ 0.599609f, 0.414307f, 0.614258f, 0.398438f, 0.628906f, 0.382568f, 0.644531f, 0.366455f,
+ 0.659180f, 0.350830f, 0.673828f, 0.335205f, 0.687500f, 0.319580f, 0.703125f, 0.303711f,
+ 0.717285f, 0.287842f, 0.731934f, 0.272217f, 0.746582f, 0.256592f, 0.760254f, 0.240967f,
+ 0.772949f, 0.225586f, 0.788086f, 0.209351f, 0.800781f, 0.194092f, 0.815430f, 0.178467f,
+ 0.830566f, 0.161865f, 0.842285f, 0.146606f, 0.854980f, 0.131592f, 0.868652f, 0.115723f,
+ 0.879883f, 0.100159f, 0.891113f, 0.081482f, 0.901855f, 0.057465f, 0.908203f, 0.020493f,
+ 0.000000f, 1.000000f, 0.013168f, 0.993164f, 0.026703f, 0.982910f, 0.040466f, 0.972168f,
+ 0.055054f, 0.959473f, 0.070007f, 0.946289f, 0.083313f, 0.933594f, 0.099060f, 0.919434f,
+ 0.114380f, 0.904785f, 0.128052f, 0.891602f, 0.143677f, 0.876953f, 0.159058f, 0.861816f,
+ 0.173462f, 0.847656f, 0.188965f, 0.832520f, 0.204956f, 0.817383f, 0.220825f, 0.801758f,
+ 0.235596f, 0.787109f, 0.251709f, 0.771484f, 0.266113f, 0.756348f, 0.282715f, 0.740723f,
+ 0.297852f, 0.725098f, 0.313477f, 0.709473f, 0.329834f, 0.693848f, 0.344482f, 0.678711f,
+ 0.360596f, 0.662598f, 0.375732f, 0.646973f, 0.391846f, 0.630859f, 0.407227f, 0.615234f,
+ 0.423340f, 0.599121f, 0.438965f, 0.583496f, 0.455078f, 0.567383f, 0.470947f, 0.551270f,
+ 0.486328f, 0.535645f, 0.501465f, 0.519531f, 0.518066f, 0.503418f, 0.533203f, 0.487549f,
+ 0.549316f, 0.471436f, 0.564941f, 0.455322f, 0.581055f, 0.438965f, 0.596680f, 0.422852f,
+ 0.612793f, 0.406738f, 0.628418f, 0.390381f, 0.644531f, 0.374023f, 0.660156f, 0.357666f,
+ 0.675293f, 0.341553f, 0.690918f, 0.324951f, 0.706055f, 0.308838f, 0.721191f, 0.292236f,
+ 0.737305f, 0.275879f, 0.752441f, 0.259277f, 0.768066f, 0.243042f, 0.783691f, 0.226562f,
+ 0.797363f, 0.210327f, 0.812500f, 0.193848f, 0.827637f, 0.177368f, 0.843262f, 0.160645f,
+ 0.857910f, 0.144043f, 0.872070f, 0.127686f, 0.887207f, 0.111084f, 0.902344f, 0.093933f,
+ 0.915527f, 0.077881f, 0.929688f, 0.061188f, 0.942383f, 0.042114f, 0.953125f, 0.014633f,
+ 0.000000f, 1.000000f, 0.013443f, 0.993164f, 0.026764f, 0.983398f, 0.040497f, 0.971680f,
+ 0.055206f, 0.959473f, 0.070374f, 0.945801f, 0.085266f, 0.932129f, 0.100281f, 0.918457f,
+ 0.115479f, 0.904297f, 0.130737f, 0.890137f, 0.145752f, 0.875977f, 0.161011f, 0.861328f,
+ 0.175903f, 0.846680f, 0.191528f, 0.831543f, 0.206665f, 0.816406f, 0.222168f, 0.801270f,
+ 0.237915f, 0.785645f, 0.253418f, 0.770508f, 0.269043f, 0.754883f, 0.285156f, 0.739258f,
+ 0.301270f, 0.723633f, 0.316895f, 0.708008f, 0.333252f, 0.691895f, 0.348877f, 0.676270f,
+ 0.365723f, 0.660156f, 0.381592f, 0.644043f, 0.397461f, 0.628418f, 0.413574f, 0.612305f,
+ 0.429443f, 0.596191f, 0.445557f, 0.580078f, 0.461914f, 0.563477f, 0.478027f, 0.547363f,
+ 0.494141f, 0.531250f, 0.510254f, 0.514648f, 0.526367f, 0.498535f, 0.542480f, 0.481934f,
+ 0.558594f, 0.465576f, 0.575195f, 0.448975f, 0.591309f, 0.432617f, 0.607422f, 0.416016f,
+ 0.624512f, 0.399414f, 0.641113f, 0.382568f, 0.657227f, 0.365967f, 0.673340f, 0.349121f,
+ 0.689941f, 0.332275f, 0.706543f, 0.315430f, 0.722656f, 0.298584f, 0.738770f, 0.281494f,
+ 0.754883f, 0.264648f, 0.771484f, 0.247681f, 0.787109f, 0.230591f, 0.803711f, 0.213501f,
+ 0.819336f, 0.196289f, 0.834961f, 0.179077f, 0.851562f, 0.161743f, 0.868164f, 0.144287f,
+ 0.884766f, 0.126709f, 0.901367f, 0.109131f, 0.917480f, 0.091248f, 0.935059f, 0.073059f,
+ 0.952637f, 0.054260f, 0.968262f, 0.035858f, 0.983887f, 0.017548f, 0.999512f, 0.000115f,
+ },
+};
diff --git a/source/blender/draw/engines/eevee/eevee_lut.h b/source/blender/draw/engines/eevee/eevee_lut.h
index d5dbf8ce690..8e107adfe0a 100644
--- a/source/blender/draw/engines/eevee/eevee_lut.h
+++ b/source/blender/draw/engines/eevee/eevee_lut.h
@@ -27,5 +27,5 @@ extern const float ltc_mat_ggx[64 * 64 * 4];
extern const float ltc_mag_ggx[64 * 64 * 2];
extern const float bsdf_split_sum_ggx[64 * 64 * 2];
extern const float ltc_disk_integral[64 * 64];
-extern const float btdf_split_sum_ggx[32][64 * 64];
+extern const float btdf_split_sum_ggx[16][64 * 64 * 2];
extern const float blue_noise[64 * 64][4];
diff --git a/source/blender/draw/engines/eevee/eevee_lut_gen.c b/source/blender/draw/engines/eevee/eevee_lut_gen.c
index b74cb6c7687..770134d27f9 100644
--- a/source/blender/draw/engines/eevee/eevee_lut_gen.c
+++ b/source/blender/draw/engines/eevee/eevee_lut_gen.c
@@ -22,150 +22,102 @@
* EEVEE LUT generation:
*
* Routine to generate the LUT used by eevee stored in eevee_lut.h
- * Theses functions are not to be used in the final executable.
+ * These functions are not to be used in the final executable.
*/
#include "DRW_render.h"
-#include "BLI_alloca.h"
+#include "BLI_fileops.h"
#include "BLI_rand.h"
#include "BLI_string_utils.h"
#include "eevee_private.h"
-static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h))
-{
- struct GPUTexture *tex;
- struct GPUFrameBuffer *fb = NULL;
- static float samples_len = 8192.0f;
- static float inv_samples_len = 1.0f / 8192.0f;
+#define DO_FILE_OUTPUT 0
- DRWPass *pass = DRW_pass_create("LightProbe Filtering", DRW_STATE_WRITE_COLOR);
+float *EEVEE_lut_update_ggx_brdf(int lut_size)
+{
+ DRWPass *pass = DRW_pass_create(__func__, DRW_STATE_WRITE_COLOR);
DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_lut_sh_get(), pass);
- DRW_shgroup_uniform_float(grp, "sampleCount", &samples_len, 1);
- DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_len, 1);
- DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley);
- DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter);
-
- struct GPUBatch *geom = DRW_cache_fullscreen_quad_get();
- DRW_shgroup_call(grp, geom, NULL);
-
- float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut");
-
- tex = DRW_texture_create_2d(w, h, GPU_RG16F, DRW_TEX_FILTER, (float *)texels);
-
- DRWFboTexture tex_filter = {&tex, GPU_RG16F, DRW_TEX_FILTER};
- GPU_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1);
-
+ DRW_shgroup_uniform_float_copy(grp, "sampleCount", 64.0f); /* Actual sample count is squared. */
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ GPUTexture *tex = DRW_texture_create_2d(lut_size, lut_size, GPU_RG16F, 0, NULL);
+ GPUFrameBuffer *fb = NULL;
+ GPU_framebuffer_ensure_config(&fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(tex),
+ });
GPU_framebuffer_bind(fb);
DRW_draw_pass(pass);
-
- float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut");
- GPU_framebuffer_read_color(fb, 0, 0, w, h, 3, 0, GPU_DATA_FLOAT, data);
-
- printf("{");
- for (int i = 0; i < w * h * 3; i += 3) {
- printf("%ff, %ff, ", data[i], data[i + 1]);
- i += 3;
- printf("%ff, %ff, ", data[i], data[i + 1]);
- i += 3;
- printf("%ff, %ff, ", data[i], data[i + 1]);
- i += 3;
- printf("%ff, %ff, \n", data[i], data[i + 1]);
+ GPU_FRAMEBUFFER_FREE_SAFE(fb);
+
+ float *data = GPU_texture_read(tex, GPU_DATA_FLOAT, 0);
+ GPU_texture_free(tex);
+#if DO_FILE_OUTPUT
+ /* Content is to be put inside eevee_lut.c */
+ FILE *f = BLI_fopen("bsdf_split_sum_ggx.h", "w");
+ fprintf(f, "const float bsdf_split_sum_ggx[%d * %d * 2] = {", lut_size, lut_size);
+ for (int i = 0; i < lut_size * lut_size * 2;) {
+ fprintf(f, "\n ");
+ for (int j = 0; j < 4; j++, i += 2) {
+ fprintf(f, "%ff, %ff, ", data[i], data[i + 1]);
+ }
}
- printf("}");
-
- MEM_freeN(texels);
- MEM_freeN(data);
+ fprintf(f, "\n};\n");
+ fclose(f);
+#endif
- return tex;
+ return data;
}
-static struct GPUTexture *create_ggx_refraction_lut_texture(int w, int h)
+float *EEVEE_lut_update_ggx_btdf(int lut_size, int lut_depth)
{
- struct GPUTexture *tex;
- struct GPUTexture *hammersley = create_hammersley_sample_texture(8192);
- struct GPUFrameBuffer *fb = NULL;
- static float samples_len = 8192.0f;
- static float a2 = 0.0f;
- static float inv_samples_len = 1.0f / 8192.0f;
-
- DRWPass *pass = DRW_pass_create("LightProbe Filtering", DRW_STATE_WRITE_COLOR);
+ float roughness;
+ DRWPass *pass = DRW_pass_create(__func__, DRW_STATE_WRITE_COLOR);
DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_refraction_lut_sh_get(), pass);
- DRW_shgroup_uniform_float(grp, "a2", &a2, 1);
- DRW_shgroup_uniform_float(grp, "sampleCount", &samples_len, 1);
- DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_len, 1);
- DRW_shgroup_uniform_texture(grp, "texHammersley", hammersley);
- DRW_shgroup_uniform_texture(grp, "utilTex", e_data.util_tex);
-
- struct GPUBatch *geom = DRW_cache_fullscreen_quad_get();
- DRW_shgroup_call(grp, geom, NULL);
-
- float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut");
-
- tex = DRW_texture_create_2d(w, h, GPU_R16F, DRW_TEX_FILTER, (float *)texels);
-
- DRWFboTexture tex_filter = {&tex, GPU_R16F, DRW_TEX_FILTER};
- GPU_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1);
+ DRW_shgroup_uniform_float_copy(grp, "sampleCount", 64.0f); /* Actual sample count is squared. */
+ DRW_shgroup_uniform_float(grp, "z", &roughness, 1);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+
+ GPUTexture *tex = DRW_texture_create_2d_array(lut_size, lut_size, lut_depth, GPU_RG16F, 0, NULL);
+ GPUFrameBuffer *fb = NULL;
+ for (int i = 0; i < lut_depth; i++) {
+ GPU_framebuffer_ensure_config(&fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE_LAYER(tex, i),
+ });
+ GPU_framebuffer_bind(fb);
+ roughness = i / (lut_depth - 1.0f);
+ DRW_draw_pass(pass);
+ }
- GPU_framebuffer_bind(fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fb);
- float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut");
+ float *data = GPU_texture_read(tex, GPU_DATA_FLOAT, 0);
+ GPU_texture_free(tex);
- float inc = 1.0f / 31.0f;
- float roughness = 1e-8f - inc;
+#if DO_FILE_OUTPUT
+ /* Content is to be put inside eevee_lut.c. Don't forget to format the output. */
FILE *f = BLI_fopen("btdf_split_sum_ggx.h", "w");
- fprintf(f, "static float btdf_split_sum_ggx[32][64 * 64] = {\n");
- do {
- roughness += inc;
- CLAMP(roughness, 1e-4f, 1.0f);
- a2 = powf(roughness, 4.0f);
- DRW_draw_pass(pass);
-
- GPU_framebuffer_read_data(0, 0, w, h, 3, 0, data);
-
-#if 1
- fprintf(f, "\t{\n\t\t");
- for (int i = 0; i < w * h * 3; i += 3) {
- fprintf(f, "%ff,", data[i]);
- if (((i / 3) + 1) % 12 == 0) {
- fprintf(f, "\n\t\t");
- }
- else {
- fprintf(f, " ");
- }
- }
- fprintf(f, "\n\t},\n");
-#else
- for (int i = 0; i < w * h * 3; i += 3) {
- if (data[i] < 0.01) {
- printf(" ");
- }
- else if (data[i] < 0.3) {
- printf(".");
- }
- else if (data[i] < 0.6) {
- printf("+");
- }
- else if (data[i] < 0.9) {
- printf("%%");
- }
- else {
- printf("#");
- }
- if ((i / 3 + 1) % 64 == 0) {
- printf("\n");
+ fprintf(f, "const float btdf_split_sum_ggx[%d][%d * %d * 2] = {", lut_depth, lut_size, lut_size);
+ fprintf(f, "\n ");
+ int ofs = 0;
+ for (int d = 0; d < lut_depth; d++) {
+ fprintf(f, "{\n");
+ for (int i = 0; i < lut_size * lut_size * 2;) {
+ for (int j = 0; j < 4; j++, i += 2, ofs += 2) {
+ fprintf(f, "%ff, %ff, ", data[ofs], data[ofs + 1]);
}
+ fprintf(f, "\n ");
}
-#endif
-
- } while (roughness < 1.0f);
- fprintf(f, "\n};\n");
-
+ fprintf(f, "},\n");
+ }
+ fprintf(f, "};\n");
fclose(f);
+#endif
- MEM_freeN(texels);
- MEM_freeN(data);
-
- return tex;
+ return data;
}
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 273521b0b28..9d74d916265 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -142,11 +142,20 @@ static void eevee_init_noise_texture(void)
e_data.noise_tex = DRW_texture_create_2d(64, 64, GPU_RGBA16F, 0, (float *)blue_noise);
}
+#define RUNTIME_LUT_CREATION 0
+
static void eevee_init_util_texture(void)
{
const int layers = 4 + 16;
float(*texels)[4] = MEM_mallocN(sizeof(float[4]) * 64 * 64 * layers, "utils texels");
float(*texels_layer)[4] = texels;
+#if RUNTIME_LUT_CREATION
+ float *bsdf_ggx_lut = EEVEE_lut_update_ggx_brdf(64);
+ float(*btdf_ggx_lut)[64 * 64 * 2] = (float(*)[64 * 64 * 2]) EEVEE_lut_update_ggx_btdf(64, 16);
+#else
+ const float *bsdf_ggx_lut = bsdf_split_sum_ggx;
+ const float(*btdf_ggx_lut)[64 * 64 * 2] = btdf_split_sum_ggx;
+#endif
/* Copy ltc_mat_ggx into 1st layer */
memcpy(texels_layer, ltc_mat_ggx, sizeof(float[4]) * 64 * 64);
@@ -155,8 +164,8 @@ static void eevee_init_util_texture(void)
/* Copy bsdf_split_sum_ggx into 2nd layer red and green channels.
* Copy ltc_mag_ggx into 2nd layer blue and alpha channel. */
for (int i = 0; i < 64 * 64; i++) {
- texels_layer[i][0] = bsdf_split_sum_ggx[i * 2 + 0];
- texels_layer[i][1] = bsdf_split_sum_ggx[i * 2 + 1];
+ texels_layer[i][0] = bsdf_ggx_lut[i * 2 + 0];
+ texels_layer[i][1] = bsdf_ggx_lut[i * 2 + 1];
texels_layer[i][2] = ltc_mag_ggx[i * 2 + 0];
texels_layer[i][3] = ltc_mag_ggx[i * 2 + 1];
}
@@ -183,8 +192,8 @@ static void eevee_init_util_texture(void)
/* Copy Refraction GGX LUT in layer 5 - 21 */
for (int j = 0; j < 16; j++) {
for (int i = 0; i < 64 * 64; i++) {
- texels_layer[i][0] = btdf_split_sum_ggx[j * 2][i];
- texels_layer[i][1] = 0.0; /* UNUSED */
+ texels_layer[i][0] = btdf_ggx_lut[j][i * 2 + 0];
+ texels_layer[i][1] = btdf_ggx_lut[j][i * 2 + 1];
texels_layer[i][2] = 0.0; /* UNUSED */
texels_layer[i][3] = 0.0; /* UNUSED */
}
@@ -195,6 +204,10 @@ static void eevee_init_util_texture(void)
64, 64, layers, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_WRAP, (float *)texels);
MEM_freeN(texels);
+#if RUNTIME_LUT_CREATION
+ MEM_freeN(bsdf_ggx_lut);
+ MEM_freeN(btdf_ggx_lut);
+#endif
}
void EEVEE_update_noise(EEVEE_PassList *psl, EEVEE_FramebufferList *fbl, const double offsets[3])
@@ -234,7 +247,7 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
}
{
- /* Update noise Framebuffer. */
+ /* Update noise Frame-buffer. */
GPU_framebuffer_ensure_config(
&fbl->update_noise_fb,
{GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE_LAYER(e_data.util_tex, 2)});
@@ -415,7 +428,7 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
/* Renderpass accumulation. */
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_ADD_FULL;
- /* Create an instance of each of theses passes and link them together. */
+ /* Create an instance of each of these passes and link them together. */
DRWPass *passes[] = {
psl->material_ps,
psl->material_cull_ps,
@@ -1107,4 +1120,4 @@ void EEVEE_material_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
}
}
-/* \} */
+/** \} */
diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.c b/source/blender/draw/engines/eevee/eevee_motion_blur.c
index 8dcab579603..0a79d9466e9 100644
--- a/source/blender/draw/engines/eevee/eevee_motion_blur.c
+++ b/source/blender/draw/engines/eevee/eevee_motion_blur.c
@@ -476,7 +476,7 @@ void EEVEE_motion_blur_cache_finish(EEVEE_Data *vedata)
if (vbo) {
/* Use the vbo to perform the copy on the GPU. */
GPU_vertbuf_use(vbo);
- /* Perform a copy to avoid loosing it after RE_engine_frame_set(). */
+ /* Perform a copy to avoid losing it after RE_engine_frame_set(). */
mb_geom->vbo[mb_step] = vbo = GPU_vertbuf_duplicate(vbo);
/* Find and replace "pos" attrib name. */
GPUVertFormat *format = (GPUVertFormat *)GPU_vertbuf_get_format(vbo);
diff --git a/source/blender/draw/engines/eevee/eevee_occlusion.c b/source/blender/draw/engines/eevee/eevee_occlusion.c
index fd96a076c68..a3b581357e0 100644
--- a/source/blender/draw/engines/eevee/eevee_occlusion.c
+++ b/source/blender/draw/engines/eevee/eevee_occlusion.c
@@ -273,7 +273,7 @@ void EEVEE_occlusion_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *
if (fbl->ao_accum_fb != NULL) {
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
- /* Update the min_max/horizon buffers so the refracion materials appear in it. */
+ /* Update the min_max/horizon buffers so the refraction materials appear in it. */
EEVEE_create_minmax_buffer(vedata, dtxl->depth, -1);
EEVEE_occlusion_compute(sldata, vedata, dtxl->depth, -1);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 9702db5fecc..5a93853900e 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -55,6 +55,9 @@ extern struct DrawEngineType draw_engine_eevee_type;
#define MAX_BLOOM_STEP 16
#define MAX_AOVS 64
+/* Special value chosen to not be altered by depth of field sample count. */
+#define TAA_MAX_SAMPLE 10000926
+
// #define DEBUG_SHADOW_DISTRIBUTION
/* Only define one of these. */
@@ -202,10 +205,31 @@ enum {
typedef enum EEVEE_SSRShaderOptions {
SSR_RESOLVE = (1 << 0),
SSR_FULL_TRACE = (1 << 1),
- SSR_AO = (1 << 3),
- SSR_MAX_SHADER = (1 << 4),
+ SSR_MAX_SHADER = (1 << 2),
} EEVEE_SSRShaderOptions;
+/* DOF Gather pass shader variations */
+typedef enum EEVEE_DofGatherPass {
+ DOF_GATHER_FOREGROUND = 0,
+ DOF_GATHER_BACKGROUND = 1,
+ DOF_GATHER_HOLEFILL = 2,
+
+ DOF_GATHER_MAX_PASS,
+} EEVEE_DofGatherPass;
+
+#define DOF_TILE_DIVISOR 16
+#define DOF_BOKEH_LUT_SIZE 32
+#define DOF_GATHER_RING_COUNT 5
+#define DOF_DILATE_RING_COUNT 3
+#define DOF_FAST_GATHER_COC_ERROR 0.05
+
+#define DOF_SHADER_DEFINES \
+ "#define DOF_TILE_DIVISOR " STRINGIFY(DOF_TILE_DIVISOR) "\n" \
+ "#define DOF_BOKEH_LUT_SIZE " STRINGIFY(DOF_BOKEH_LUT_SIZE) "\n" \
+ "#define DOF_GATHER_RING_COUNT " STRINGIFY(DOF_GATHER_RING_COUNT) "\n" \
+ "#define DOF_DILATE_RING_COUNT " STRINGIFY(DOF_DILATE_RING_COUNT) "\n" \
+ "#define DOF_FAST_GATHER_COC_ERROR " STRINGIFY(DOF_FAST_GATHER_COC_ERROR) "\n"
+
/* ************ PROBE UBO ************* */
/* They are the same struct as their Cache siblings.
@@ -258,8 +282,20 @@ typedef struct EEVEE_PassList {
struct DRWPass *bloom_upsample;
struct DRWPass *bloom_resolve;
struct DRWPass *bloom_accum_ps;
- struct DRWPass *dof_down;
- struct DRWPass *dof_scatter;
+ struct DRWPass *dof_setup;
+ struct DRWPass *dof_flatten_tiles;
+ struct DRWPass *dof_dilate_tiles_minmax;
+ struct DRWPass *dof_dilate_tiles_minabs;
+ struct DRWPass *dof_reduce_copy;
+ struct DRWPass *dof_downsample;
+ struct DRWPass *dof_reduce;
+ struct DRWPass *dof_bokeh;
+ struct DRWPass *dof_gather_fg;
+ struct DRWPass *dof_gather_fg_holefill;
+ struct DRWPass *dof_gather_bg;
+ struct DRWPass *dof_scatter_fg;
+ struct DRWPass *dof_scatter_bg;
+ struct DRWPass *dof_filter;
struct DRWPass *dof_resolve;
struct DRWPass *volumetric_world_ps;
struct DRWPass *volumetric_objects_ps;
@@ -339,8 +375,20 @@ typedef struct EEVEE_FramebufferList {
struct GPUFrameBuffer *sss_clear_fb;
struct GPUFrameBuffer *sss_translucency_fb;
struct GPUFrameBuffer *sss_accum_fb;
- struct GPUFrameBuffer *dof_down_fb;
- struct GPUFrameBuffer *dof_scatter_fb;
+ struct GPUFrameBuffer *dof_setup_fb;
+ struct GPUFrameBuffer *dof_flatten_tiles_fb;
+ struct GPUFrameBuffer *dof_dilate_tiles_fb;
+ struct GPUFrameBuffer *dof_downsample_fb;
+ struct GPUFrameBuffer *dof_reduce_fb;
+ struct GPUFrameBuffer *dof_reduce_copy_fb;
+ struct GPUFrameBuffer *dof_bokeh_fb;
+ struct GPUFrameBuffer *dof_gather_fg_fb;
+ struct GPUFrameBuffer *dof_filter_fg_fb;
+ struct GPUFrameBuffer *dof_gather_fg_holefill_fb;
+ struct GPUFrameBuffer *dof_gather_bg_fb;
+ struct GPUFrameBuffer *dof_filter_bg_fb;
+ struct GPUFrameBuffer *dof_scatter_fg_fb;
+ struct GPUFrameBuffer *dof_scatter_bg_fb;
struct GPUFrameBuffer *volumetric_fb;
struct GPUFrameBuffer *volumetric_scat_fb;
struct GPUFrameBuffer *volumetric_integ_fb;
@@ -390,6 +438,9 @@ typedef struct EEVEE_TextureList {
struct GPUTexture *cryptomatte;
struct GPUTexture *refract_color;
struct GPUTexture *taa_history;
+ /* Could not be pool texture because of mipmapping. */
+ struct GPUTexture *dof_reduced_color;
+ struct GPUTexture *dof_reduced_coc;
struct GPUTexture *volume_prop_scattering;
struct GPUTexture *volume_prop_extinction;
@@ -518,7 +569,7 @@ typedef struct EEVEE_LightsInfo {
struct EEVEE_Shadow shadow_data[MAX_SHADOW];
struct EEVEE_ShadowCube shadow_cube_data[MAX_SHADOW_CUBE];
struct EEVEE_ShadowCascade shadow_cascade_data[MAX_SHADOW_CASCADE];
- /* Additionnal rendering info for cascade. */
+ /* Additional rendering info for cascade. */
struct EEVEE_ShadowCascadeRender shadow_cascade_render[MAX_SHADOW_CASCADE];
/* Back index in light_data. */
uchar shadow_cube_light_indices[MAX_SHADOW_CUBE];
@@ -716,7 +767,7 @@ typedef struct EEVEE_EffectsInfo {
CameraParams past_cam_params;
CameraParams current_cam_params;
char motion_blur_step; /* Which step we are evaluating. */
- int motion_blur_max; /* Maximum distance in pixels a motion blured pixel can cover. */
+ int motion_blur_max; /* Maximum distance in pixels a motion-blurred pixel can cover. */
float motion_blur_near_far[2]; /* Camera near/far clip distances (positive). */
bool cam_params_init;
/* TODO(fclem): Only used in render mode for now.
@@ -727,16 +778,45 @@ typedef struct EEVEE_EffectsInfo {
struct GPUTexture *velocity_tiles_x_tx;
struct GPUTexture *velocity_tiles_tx;
/* Depth Of Field */
- float dof_near_far[2];
- float dof_params[2];
- float dof_bokeh[4];
- float dof_bokeh_sides[4];
- int dof_target_size[2];
- struct GPUTexture *dof_down_near; /* Textures from pool */
- struct GPUTexture *dof_down_far;
- struct GPUTexture *dof_coc;
- struct GPUTexture *dof_blur;
- struct GPUTexture *dof_blur_alpha;
+ float dof_jitter_radius;
+ float dof_jitter_blades;
+ float dof_jitter_focus;
+ int dof_jitter_ring_count;
+ float dof_coc_params[2], dof_coc_near_dist, dof_coc_far_dist;
+ float dof_bokeh_blades, dof_bokeh_rotation, dof_bokeh_aniso[2], dof_bokeh_max_size;
+ float dof_bokeh_aniso_inv[2];
+ float dof_scatter_color_threshold;
+ float dof_scatter_coc_threshold;
+ float dof_scatter_neighbor_max_color;
+ float dof_fx_max_coc;
+ float dof_denoise_factor;
+ int dof_dilate_slight_focus;
+ int dof_dilate_ring_count;
+ int dof_dilate_ring_width_multiplier;
+ int dof_reduce_steps;
+ bool dof_hq_slight_focus;
+ eGPUTextureFormat dof_color_format;
+ struct GPUTexture *dof_bg_color_tx; /* All textures from pool... */
+ struct GPUTexture *dof_bg_occlusion_tx;
+ struct GPUTexture *dof_bg_weight_tx;
+ struct GPUTexture *dof_bokeh_gather_lut_tx;
+ struct GPUTexture *dof_bokeh_scatter_lut_tx;
+ struct GPUTexture *dof_bokeh_resolve_lut_tx;
+ struct GPUTexture *dof_coc_dilated_tiles_bg_tx;
+ struct GPUTexture *dof_coc_dilated_tiles_fg_tx;
+ struct GPUTexture *dof_coc_tiles_bg_tx;
+ struct GPUTexture *dof_coc_tiles_fg_tx;
+ struct GPUTexture *dof_downsample_tx;
+ struct GPUTexture *dof_fg_color_tx;
+ struct GPUTexture *dof_fg_occlusion_tx;
+ struct GPUTexture *dof_fg_weight_tx;
+ struct GPUTexture *dof_fg_holefill_color_tx;
+ struct GPUTexture *dof_fg_holefill_weight_tx;
+ struct GPUTexture *dof_half_res_coc_tx;
+ struct GPUTexture *dof_half_res_color_tx;
+ struct GPUTexture *dof_scatter_src_tx;
+ struct GPUTexture *dof_reduce_input_coc_tx; /* Just references to actual textures. */
+ struct GPUTexture *dof_reduce_input_color_tx;
/* Alpha Checker */
float color_checker_dark[4];
float color_checker_light[4];
@@ -766,7 +846,7 @@ typedef struct EEVEE_EffectsInfo {
struct GPUTexture *source_buffer; /* latest updated texture */
struct GPUFrameBuffer *target_buffer; /* next target to render to */
struct GPUTexture *final_tx; /* Final color to transform to display color space. */
- struct GPUFrameBuffer *final_fb; /* Framebuffer with final_tx as attachment. */
+ struct GPUFrameBuffer *final_fb; /* Frame-buffer with final_tx as attachment. */
} EEVEE_EffectsInfo;
/* ***************** COMMON DATA **************** */
@@ -1002,7 +1082,8 @@ typedef struct EEVEE_PrivateData {
/** For rendering planar reflections. */
struct DRWView *planar_views[MAX_PLANAR];
- int render_tot_samples;
+ int render_timesteps;
+ int render_sample_count_per_timestep;
} EEVEE_PrivateData; /* Transient data */
/* eevee_data.c */
@@ -1110,9 +1191,16 @@ struct GPUShader *EEVEE_shaders_bloom_blit_get(bool high_quality);
struct GPUShader *EEVEE_shaders_bloom_downsample_get(bool high_quality);
struct GPUShader *EEVEE_shaders_bloom_upsample_get(bool high_quality);
struct GPUShader *EEVEE_shaders_bloom_resolve_get(bool high_quality);
-struct GPUShader *EEVEE_shaders_depth_of_field_downsample_get(bool use_alpha);
-struct GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool use_alpha);
-struct GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_alpha);
+struct GPUShader *EEVEE_shaders_depth_of_field_bokeh_get(void);
+struct GPUShader *EEVEE_shaders_depth_of_field_setup_get(void);
+struct GPUShader *EEVEE_shaders_depth_of_field_flatten_tiles_get(void);
+struct GPUShader *EEVEE_shaders_depth_of_field_dilate_tiles_get(bool pass);
+struct GPUShader *EEVEE_shaders_depth_of_field_downsample_get(void);
+struct GPUShader *EEVEE_shaders_depth_of_field_reduce_get(bool is_copy_pass);
+struct GPUShader *EEVEE_shaders_depth_of_field_gather_get(EEVEE_DofGatherPass pass, bool bokeh_tx);
+struct GPUShader *EEVEE_shaders_depth_of_field_filter_get(void);
+struct GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool is_foreground, bool bokeh_tx);
+struct GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_bokeh_tx, bool use_hq_gather);
struct GPUShader *EEVEE_shaders_effect_downsample_sh_get(void);
struct GPUShader *EEVEE_shaders_effect_downsample_cube_sh_get(void);
struct GPUShader *EEVEE_shaders_effect_minz_downlevel_sh_get(void);
@@ -1232,6 +1320,12 @@ void EEVEE_lightprobes_planar_data_from_object(Object *ob,
int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera);
void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_depth_of_field_draw(EEVEE_Data *vedata);
+bool EEVEE_depth_of_field_jitter_get(EEVEE_EffectsInfo *effects,
+ float r_jitter[2],
+ float *r_focus_distance);
+int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *effects,
+ int sample_count,
+ int *r_ring_count);
/* eevee_bloom.c */
int EEVEE_bloom_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
@@ -1345,6 +1439,7 @@ int EEVEE_renderpasses_aov_hash(const ViewLayerAOV *aov);
/* eevee_temporal_sampling.c */
void EEVEE_temporal_sampling_reset(EEVEE_Data *vedata);
void EEVEE_temporal_sampling_create_view(EEVEE_Data *vedata);
+int EEVEE_temporal_sampling_sample_count_get(const Scene *scene, const EEVEE_StorageList *stl);
int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_temporal_sampling_offset_calc(const double ht_point[2],
const float filter_size,
@@ -1422,6 +1517,10 @@ void EEVEE_lookdev_draw(EEVEE_Data *vedata);
/** eevee_engine.c */
void EEVEE_cache_populate(void *vedata, Object *ob);
+/** eevee_lut_gen.c */
+float *EEVEE_lut_update_ggx_brdf(int lut_size);
+float *EEVEE_lut_update_ggx_btdf(int lut_size, int lut_depth);
+
/* Shadow Matrix */
static const float texcomat[4][4] = {
/* From NDC to TexCo */
@@ -1431,7 +1530,7 @@ static const float texcomat[4][4] = {
{0.5f, 0.5f, 0.5f, 1.0f},
};
-/* Cubemap Matrices */
+/* Cube-map Matrices */
static const float cubefacemat[6][4][4] = {
/* Pos X */
{{0.0f, 0.0f, -1.0f, 0.0f},
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index bb974688404..bc05b7915c3 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -157,7 +157,7 @@ void EEVEE_render_view_sync(EEVEE_Data *vedata, RenderEngine *engine, struct Dep
{
EEVEE_PrivateData *g_data = vedata->stl->g_data;
- /* Set the pers & view matrix. */
+ /* Set the perspective & view matrix. */
float winmat[4][4], viewmat[4][4], viewinv[4][4];
/* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */
struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, g_data->cam_original_ob);
@@ -556,14 +556,14 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
DRW_render_instance_buffer_finish();
/* Need to be called after DRW_render_instance_buffer_finish() */
- /* Also we weed to have a correct fbo bound for DRW_hair_update */
+ /* Also we weed to have a correct FBO bound for DRW_hair_update */
GPU_framebuffer_bind(fbl->main_fb);
DRW_hair_update();
/* Sort transparents before the loop. */
DRW_pass_sort_shgroup_z(psl->transparent_pass);
- uint tot_sample = stl->g_data->render_tot_samples;
+ uint tot_sample = stl->g_data->render_sample_count_per_timestep;
uint render_samples = 0;
/* SSR needs one iteration to start properly. */
diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c
index 9b36e94a9dc..c759e426875 100644
--- a/source/blender/draw/engines/eevee/eevee_renderpasses.c
+++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c
@@ -443,15 +443,15 @@ void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
EEVEE_EffectsInfo *effects = stl->effects;
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
- /* We can only draw a single renderpass. Lightpasses also select their color pass
+ /* We can only draw a single render-pass. Light-passes also select their color pass
* (a second pass). We mask the light pass when a light pass is selected. */
const eViewLayerEEVEEPassType render_pass =
((stl->g_data->render_passes & EEVEE_RENDERPASSES_LIGHT_PASS) != 0) ?
(stl->g_data->render_passes & EEVEE_RENDERPASSES_LIGHT_PASS) :
stl->g_data->render_passes;
- bool is_valid = (render_pass & EEVEE_RENDERPASSES_ALL) > 0;
- bool needs_color_transfer = (render_pass & EEVEE_RENDERPASSES_COLOR_PASS) > 0 &&
+ bool is_valid = (render_pass & EEVEE_RENDERPASSES_ALL) != 0;
+ bool needs_color_transfer = (render_pass & EEVEE_RENDERPASSES_COLOR_PASS) != 0 &&
DRW_state_is_opengl_render();
UNUSED_VARS(needs_color_transfer);
diff --git a/source/blender/draw/engines/eevee/eevee_sampling.c b/source/blender/draw/engines/eevee/eevee_sampling.c
index 253dae79902..da4bd20106c 100644
--- a/source/blender/draw/engines/eevee/eevee_sampling.c
+++ b/source/blender/draw/engines/eevee/eevee_sampling.c
@@ -38,7 +38,7 @@ void EEVEE_sample_ball(int sample_ofs, float radius, float rsample[3])
BLI_halton_3d(ht_primes, ht_offset, sample_ofs, ht_point);
- /* Decorelate AA and shadow samples. (see T68594) */
+ /* De-correlate AA and shadow samples. (see T68594) */
ht_point[0] = fmod(ht_point[0] * 1151.0, 1.0);
ht_point[1] = fmod(ht_point[1] * 1069.0, 1.0);
ht_point[2] = fmod(ht_point[2] * 1151.0, 1.0);
@@ -69,11 +69,11 @@ void EEVEE_sample_rectangle(int sample_ofs,
BLI_halton_2d(ht_primes, ht_offset, sample_ofs, ht_point);
- /* Decorelate AA and shadow samples. (see T68594) */
+ /* De-correlate AA and shadow samples. (see T68594) */
ht_point[0] = fmod(ht_point[0] * 1151.0, 1.0);
ht_point[1] = fmod(ht_point[1] * 1069.0, 1.0);
- /* Change ditribution center to be 0,0 */
+ /* Change distribution center to be 0,0 */
ht_point[0] = (ht_point[0] > 0.5f) ? ht_point[0] - 1.0f : ht_point[0];
ht_point[1] = (ht_point[1] > 0.5f) ? ht_point[1] - 1.0f : ht_point[1];
diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
index ed7d53b51af..97255f15d9b 100644
--- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
+++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
@@ -106,7 +106,7 @@ int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
GPU_framebuffer_texture_attach(fbl->main_fb, effects->ssr_specrough_input, 2, 0);
- /* Raytracing output */
+ /* Ray-tracing output. */
effects->ssr_hit_output = DRW_texture_pool_query_2d(
tracing_res[0], tracing_res[1], GPU_RG16I, &draw_engine_eevee_type);
effects->ssr_pdf_output = DRW_texture_pool_query_2d(
@@ -143,7 +143,6 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
if ((effects->enabled_effects & EFFECT_SSR) != 0) {
EEVEE_SSRShaderOptions options = (effects->reflection_trace_full) ? SSR_FULL_TRACE : 0;
- options |= ((effects->enabled_effects & EFFECT_GTAO) != 0) ? SSR_AO : 0;
struct GPUShader *trace_shader = EEVEE_shaders_effect_screen_raytrace_sh_get(options);
struct GPUShader *resolve_shader = EEVEE_shaders_effect_screen_raytrace_sh_get(SSR_RESOLVE |
@@ -191,16 +190,19 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
DRW_shgroup_uniform_texture_ref(grp, "hitBuffer", &effects->ssr_hit_output);
DRW_shgroup_uniform_texture_ref(grp, "pdfBuffer", &effects->ssr_pdf_output);
DRW_shgroup_uniform_texture_ref(grp, "prevColorBuffer", &txl->color_double_buffer);
+ DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
+ DRW_shgroup_uniform_texture_ref(grp, "shadowCubeTexture", &sldata->shadow_cube_pool);
+ DRW_shgroup_uniform_texture_ref(grp, "shadowCascadeTexture", &sldata->shadow_cascade_pool);
+ DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
+ DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo);
+ DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo);
DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined);
DRW_shgroup_uniform_int(grp, "neighborOffset", &effects->ssr_neighbor_ofs, 1);
- if ((effects->enabled_effects & EFFECT_GTAO) != 0) {
- DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
- DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons);
- }
+ DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons);
DRW_shgroup_call(grp, quad, NULL);
}
@@ -243,13 +245,13 @@ void EEVEE_reflection_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
EEVEE_downsample_buffer(vedata, txl->color_double_buffer, 9);
/* Resolve at fullres */
- int sample = (DRW_state_is_image_render()) ? effects->taa_render_sample :
+ int samp = (DRW_state_is_image_render()) ? effects->taa_render_sample :
effects->taa_current_sample;
/* Doing a neighbor shift only after a few iteration.
* We wait for a prime number of cycles to avoid noise correlation.
* This reduces variance faster. */
- effects->ssr_neighbor_ofs = ((sample / 5) % 8) * 4;
- switch ((sample / 11) % 4) {
+ effects->ssr_neighbor_ofs = ((samp / 5) % 8) * 4;
+ switch ((samp / 11) % 4) {
case 0:
effects->ssr_halfres_ofs[0] = 0;
effects->ssr_halfres_ofs[1] = 0;
diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c
index 7a277c18f01..a3e9236dc79 100644
--- a/source/blender/draw/engines/eevee/eevee_shaders.c
+++ b/source/blender/draw/engines/eevee/eevee_shaders.c
@@ -77,15 +77,22 @@ static struct {
struct GPUShader *bloom_resolve_sh[2];
/* Depth Of Field */
- struct GPUShader *dof_downsample_sh[2];
- struct GPUShader *dof_scatter_sh[2];
- struct GPUShader *dof_resolve_sh[2];
+ struct GPUShader *dof_bokeh_sh;
+ struct GPUShader *dof_setup_sh;
+ struct GPUShader *dof_flatten_tiles_sh;
+ struct GPUShader *dof_dilate_tiles_sh[2];
+ struct GPUShader *dof_downsample_sh;
+ struct GPUShader *dof_reduce_sh[2];
+ struct GPUShader *dof_gather_sh[DOF_GATHER_MAX_PASS][2];
+ struct GPUShader *dof_filter_sh;
+ struct GPUShader *dof_scatter_sh[2][2];
+ struct GPUShader *dof_resolve_sh[2][2];
/* General purpose Shaders. */
struct GPUShader *lookdev_background;
struct GPUShader *update_noise_sh;
- /* Downsample Depth */
+ /* Down-sample Depth */
struct GPUShader *minz_downlevel_sh;
struct GPUShader *maxz_downlevel_sh;
struct GPUShader *minz_downdepth_sh;
@@ -96,7 +103,7 @@ static struct {
struct GPUShader *minz_copydepth_sh;
struct GPUShader *maxz_copydepth_sh;
- /* Simple Downsample */
+ /* Simple Down-sample */
struct GPUShader *downsample_sh;
struct GPUShader *downsample_cube_sh;
@@ -142,7 +149,6 @@ static struct {
struct GPUShader *volumetric_accum_sh;
/* Shader strings */
- char *closure_lit_lib;
char *surface_lit_frag;
char *surface_prepass_frag;
char *surface_geom_barycentric;
@@ -184,7 +190,7 @@ extern char datatoc_bsdf_common_lib_glsl[];
extern char datatoc_bsdf_lut_frag_glsl[];
extern char datatoc_bsdf_sampling_lib_glsl[];
extern char datatoc_btdf_lut_frag_glsl[];
-extern char datatoc_closure_lib_glsl[];
+extern char datatoc_closure_type_lib_glsl[];
extern char datatoc_common_uniforms_lib_glsl[];
extern char datatoc_common_utiltex_lib_glsl[];
extern char datatoc_cryptomatte_frag_glsl[];
@@ -192,8 +198,18 @@ extern char datatoc_cubemap_lib_glsl[];
extern char datatoc_default_frag_glsl[];
extern char datatoc_lookdev_world_frag_glsl[];
extern char datatoc_effect_bloom_frag_glsl[];
-extern char datatoc_effect_dof_frag_glsl[];
-extern char datatoc_effect_dof_vert_glsl[];
+extern char datatoc_effect_dof_bokeh_frag_glsl[];
+extern char datatoc_effect_dof_dilate_tiles_frag_glsl[];
+extern char datatoc_effect_dof_downsample_frag_glsl[];
+extern char datatoc_effect_dof_filter_frag_glsl[];
+extern char datatoc_effect_dof_flatten_tiles_frag_glsl[];
+extern char datatoc_effect_dof_gather_frag_glsl[];
+extern char datatoc_effect_dof_lib_glsl[];
+extern char datatoc_effect_dof_reduce_frag_glsl[];
+extern char datatoc_effect_dof_resolve_frag_glsl[];
+extern char datatoc_effect_dof_scatter_frag_glsl[];
+extern char datatoc_effect_dof_scatter_vert_glsl[];
+extern char datatoc_effect_dof_setup_frag_glsl[];
extern char datatoc_effect_downsample_cube_frag_glsl[];
extern char datatoc_effect_downsample_frag_glsl[];
extern char datatoc_effect_gtao_frag_glsl[];
@@ -224,7 +240,11 @@ extern char datatoc_lightprobe_planar_downsample_geom_glsl[];
extern char datatoc_lightprobe_planar_downsample_vert_glsl[];
extern char datatoc_lightprobe_vert_glsl[];
extern char datatoc_lights_lib_glsl[];
-extern char datatoc_closure_lit_lib_glsl[];
+extern char datatoc_closure_eval_lib_glsl[];
+extern char datatoc_closure_eval_diffuse_lib_glsl[];
+extern char datatoc_closure_eval_glossy_lib_glsl[];
+extern char datatoc_closure_eval_refraction_lib_glsl[];
+extern char datatoc_closure_eval_translucent_lib_glsl[];
extern char datatoc_ltc_lib_glsl[];
extern char datatoc_object_motion_frag_glsl[];
extern char datatoc_object_motion_vert_glsl[];
@@ -258,7 +278,7 @@ static void eevee_shader_library_ensure(void)
{
if (e_data.lib == NULL) {
e_data.lib = DRW_shader_library_create();
- /* NOTE: Theses needs to be ordered by dependencies. */
+ /* NOTE: These need to be ordered by dependencies. */
DRW_SHADER_LIB_ADD(e_data.lib, common_math_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_math_geom_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_hair_lib);
@@ -279,23 +299,14 @@ static void eevee_shader_library_ensure(void)
DRW_SHADER_LIB_ADD(e_data.lib, lights_lib);
DRW_SHADER_LIB_ADD(e_data.lib, surface_lib);
DRW_SHADER_LIB_ADD(e_data.lib, volumetric_lib);
- DRW_SHADER_LIB_ADD(e_data.lib, closure_lib);
DRW_SHADER_LIB_ADD(e_data.lib, ssr_lib);
-
- /* Add one for each Closure */
- e_data.closure_lit_lib = BLI_string_joinN(datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl,
- datatoc_closure_lit_lib_glsl);
-
- DRW_shader_library_add_file(e_data.lib, e_data.closure_lit_lib, "closure_lit_lib.glsl");
+ DRW_SHADER_LIB_ADD(e_data.lib, effect_dof_lib);
+ DRW_SHADER_LIB_ADD(e_data.lib, closure_type_lib);
+ DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_lib);
+ DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_diffuse_lib);
+ DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_glossy_lib);
+ DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_translucent_lib);
+ DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_refraction_lib);
e_data.surface_lit_frag = DRW_shader_library_create_shader_string(e_data.lib,
datatoc_surface_frag_glsl);
@@ -438,7 +449,7 @@ GPUShader *EEVEE_shaders_probe_planar_display_sh_get(void)
}
/* -------------------------------------------------------------------- */
-/** \name Downsampling
+/** \name Down-sampling
* \{ */
GPUShader *EEVEE_shaders_effect_downsample_sh_get(void)
@@ -556,11 +567,8 @@ GPUShader *EEVEE_shaders_effect_maxz_copydepth_sh_get(void)
GPUShader *EEVEE_shaders_ggx_lut_sh_get(void)
{
if (e_data.ggx_lut_sh == NULL) {
- e_data.ggx_lut_sh = DRW_shader_create_with_shaderlib(datatoc_lightprobe_vert_glsl,
- datatoc_lightprobe_geom_glsl,
- datatoc_bsdf_lut_frag_glsl,
- e_data.lib,
- "#define HAMMERSLEY_SIZE 8192\n");
+ e_data.ggx_lut_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_bsdf_lut_frag_glsl, e_data.lib, NULL);
}
return e_data.ggx_lut_sh;
}
@@ -745,9 +753,6 @@ struct GPUShader *EEVEE_shaders_effect_screen_raytrace_sh_get(EEVEE_SSRShaderOpt
if (options & SSR_FULL_TRACE) {
BLI_dynstr_append(ds_defines, "#define FULLRES\n");
}
- if (options & SSR_AO) {
- BLI_dynstr_append(ds_defines, "#define SSR_AO\n");
- }
char *ssr_define_str = BLI_dynstr_get_cstring(ds_defines);
BLI_dynstr_free(ds_defines);
@@ -1004,57 +1009,181 @@ GPUShader *EEVEE_shaders_bloom_resolve_get(bool high_quality)
return e_data.bloom_resolve_sh[index];
}
-/* \} */
+/** \} */
/* -------------------------------------------------------------------- */
/** \name Depth of field
* \{ */
-GPUShader *EEVEE_shaders_depth_of_field_downsample_get(bool use_alpha)
+GPUShader *EEVEE_shaders_depth_of_field_bokeh_get(void)
+{
+ if (e_data.dof_bokeh_sh == NULL) {
+ e_data.dof_bokeh_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_bokeh_frag_glsl, e_data.lib, DOF_SHADER_DEFINES);
+ }
+ return e_data.dof_bokeh_sh;
+}
+
+GPUShader *EEVEE_shaders_depth_of_field_setup_get(void)
+{
+ if (e_data.dof_setup_sh == NULL) {
+ e_data.dof_setup_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_setup_frag_glsl, e_data.lib, DOF_SHADER_DEFINES);
+ }
+ return e_data.dof_setup_sh;
+}
+
+GPUShader *EEVEE_shaders_depth_of_field_flatten_tiles_get(void)
+{
+ if (e_data.dof_flatten_tiles_sh == NULL) {
+ e_data.dof_flatten_tiles_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_flatten_tiles_frag_glsl, e_data.lib, DOF_SHADER_DEFINES);
+ }
+ return e_data.dof_flatten_tiles_sh;
+}
+
+GPUShader *EEVEE_shaders_depth_of_field_dilate_tiles_get(bool b_pass)
{
- int index = use_alpha ? 1 : 0;
- if (e_data.dof_downsample_sh[index] == NULL) {
- e_data.dof_downsample_sh[index] = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_dof_frag_glsl,
+ int pass = b_pass;
+ if (e_data.dof_dilate_tiles_sh[pass] == NULL) {
+ e_data.dof_dilate_tiles_sh[pass] = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_dilate_tiles_frag_glsl,
e_data.lib,
- use_alpha ? "#define USE_ALPHA_DOF\n"
- "#define STEP_DOWNSAMPLE\n" :
- "#define STEP_DOWNSAMPLE\n");
+ (pass == 0) ? DOF_SHADER_DEFINES "#define DILATE_MODE_MIN_MAX\n" :
+ DOF_SHADER_DEFINES "#define DILATE_MODE_MIN_ABS\n");
}
- return e_data.dof_downsample_sh[index];
+ return e_data.dof_dilate_tiles_sh[pass];
}
-GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool use_alpha)
+GPUShader *EEVEE_shaders_depth_of_field_downsample_get(void)
{
- int index = use_alpha ? 1 : 0;
- if (e_data.dof_scatter_sh[index] == NULL) {
- e_data.dof_scatter_sh[index] = DRW_shader_create_with_shaderlib(datatoc_effect_dof_vert_glsl,
- NULL,
- datatoc_effect_dof_frag_glsl,
- e_data.lib,
- use_alpha ?
- "#define USE_ALPHA_DOF\n"
- "#define STEP_SCATTER\n" :
- "#define STEP_SCATTER\n");
+ if (e_data.dof_downsample_sh == NULL) {
+ e_data.dof_downsample_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_downsample_frag_glsl, e_data.lib, DOF_SHADER_DEFINES);
}
- return e_data.dof_scatter_sh[index];
+ return e_data.dof_downsample_sh;
}
-GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_alpha)
+GPUShader *EEVEE_shaders_depth_of_field_reduce_get(bool b_is_copy_pass)
{
- int index = use_alpha ? 1 : 0;
- if (e_data.dof_resolve_sh[index] == NULL) {
- e_data.dof_resolve_sh[index] = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_dof_frag_glsl,
+ int is_copy_pass = b_is_copy_pass;
+ if (e_data.dof_reduce_sh[is_copy_pass] == NULL) {
+ e_data.dof_reduce_sh[is_copy_pass] = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_reduce_frag_glsl,
e_data.lib,
- use_alpha ? "#define USE_ALPHA_DOF\n"
- "#define STEP_RESOLVE\n" :
- "#define STEP_RESOLVE\n");
+ (is_copy_pass) ? DOF_SHADER_DEFINES "#define COPY_PASS\n" :
+ DOF_SHADER_DEFINES "#define REDUCE_PASS\n");
}
- return e_data.dof_resolve_sh[index];
+ return e_data.dof_reduce_sh[is_copy_pass];
}
-/* \} */
+GPUShader *EEVEE_shaders_depth_of_field_gather_get(EEVEE_DofGatherPass pass, bool b_use_bokeh_tx)
+{
+ int use_bokeh_tx = b_use_bokeh_tx;
+ if (e_data.dof_gather_sh[pass][use_bokeh_tx] == NULL) {
+ DynStr *ds = BLI_dynstr_new();
+
+ BLI_dynstr_append(ds, DOF_SHADER_DEFINES);
+
+ switch (pass) {
+ case DOF_GATHER_FOREGROUND:
+ BLI_dynstr_append(ds, "#define DOF_FOREGROUND_PASS\n");
+ break;
+ case DOF_GATHER_BACKGROUND:
+ BLI_dynstr_append(ds, "#define DOF_BACKGROUND_PASS\n");
+ break;
+ case DOF_GATHER_HOLEFILL:
+ BLI_dynstr_append(ds,
+ "#define DOF_BACKGROUND_PASS\n"
+ "#define DOF_HOLEFILL_PASS\n");
+ break;
+ default:
+ break;
+ }
+
+ if (use_bokeh_tx) {
+ BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n");
+ }
+
+ char *define = BLI_dynstr_get_cstring(ds);
+ BLI_dynstr_free(ds);
+
+ e_data.dof_gather_sh[pass][use_bokeh_tx] = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_gather_frag_glsl, e_data.lib, define);
+
+ MEM_freeN(define);
+ }
+ return e_data.dof_gather_sh[pass][use_bokeh_tx];
+}
+
+GPUShader *EEVEE_shaders_depth_of_field_filter_get(void)
+{
+ if (e_data.dof_filter_sh == NULL) {
+ e_data.dof_filter_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_filter_frag_glsl, e_data.lib, DOF_SHADER_DEFINES);
+ }
+ return e_data.dof_filter_sh;
+}
+
+GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool b_is_foreground, bool b_use_bokeh_tx)
+{
+ int is_foreground = b_is_foreground;
+ int use_bokeh_tx = b_use_bokeh_tx;
+ if (e_data.dof_scatter_sh[is_foreground][use_bokeh_tx] == NULL) {
+ DynStr *ds = BLI_dynstr_new();
+
+ BLI_dynstr_append(ds, DOF_SHADER_DEFINES);
+ BLI_dynstr_append(
+ ds, (is_foreground) ? "#define DOF_FOREGROUND_PASS\n" : "#define DOF_BACKGROUND_PASS\n");
+
+ if (use_bokeh_tx) {
+ BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n");
+ }
+
+ char *define = BLI_dynstr_get_cstring(ds);
+ BLI_dynstr_free(ds);
+
+ e_data.dof_scatter_sh[is_foreground][use_bokeh_tx] = DRW_shader_create_with_shaderlib(
+ datatoc_effect_dof_scatter_vert_glsl,
+ NULL,
+ datatoc_effect_dof_scatter_frag_glsl,
+ e_data.lib,
+ define);
+
+ MEM_freeN(define);
+ }
+ return e_data.dof_scatter_sh[is_foreground][use_bokeh_tx];
+}
+
+GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool b_use_bokeh_tx, bool b_use_hq_gather)
+{
+ int use_hq_gather = b_use_hq_gather;
+ int use_bokeh_tx = b_use_bokeh_tx;
+ if (e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather] == NULL) {
+ DynStr *ds = BLI_dynstr_new();
+
+ BLI_dynstr_append(ds, DOF_SHADER_DEFINES);
+ BLI_dynstr_append(ds, "#define DOF_RESOLVE_PASS\n");
+
+ if (use_bokeh_tx) {
+ BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n");
+ }
+
+ BLI_dynstr_appendf(ds, "#define DOF_SLIGHT_FOCUS_DENSITY %d\n", use_hq_gather ? 4 : 2);
+
+ char *define = BLI_dynstr_get_cstring(ds);
+ BLI_dynstr_free(ds);
+
+ e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather] =
+ DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_dof_resolve_frag_glsl, e_data.lib, define);
+
+ MEM_freeN(define);
+ }
+ return e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather];
+}
+
+/** \} */
Material *EEVEE_material_default_diffuse_get(void)
{
@@ -1403,7 +1532,6 @@ struct GPUMaterial *EEVEE_material_get(
void EEVEE_shaders_free(void)
{
- MEM_SAFE_FREE(e_data.closure_lit_lib);
MEM_SAFE_FREE(e_data.surface_prepass_frag);
MEM_SAFE_FREE(e_data.surface_lit_frag);
MEM_SAFE_FREE(e_data.surface_geom_barycentric);
@@ -1458,6 +1586,27 @@ void EEVEE_shaders_free(void)
DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh);
DRW_SHADER_FREE_SAFE(e_data.taa_resolve_sh);
DRW_SHADER_FREE_SAFE(e_data.taa_resolve_reproject_sh);
+ DRW_SHADER_FREE_SAFE(e_data.dof_bokeh_sh);
+ DRW_SHADER_FREE_SAFE(e_data.dof_setup_sh);
+ DRW_SHADER_FREE_SAFE(e_data.dof_flatten_tiles_sh);
+ DRW_SHADER_FREE_SAFE(e_data.dof_dilate_tiles_sh[0]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_dilate_tiles_sh[1]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh);
+ DRW_SHADER_FREE_SAFE(e_data.dof_reduce_sh[0]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_reduce_sh[1]);
+ for (int i = 0; i < DOF_GATHER_MAX_PASS; i++) {
+ DRW_SHADER_FREE_SAFE(e_data.dof_gather_sh[i][0]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_gather_sh[i][1]);
+ }
+ DRW_SHADER_FREE_SAFE(e_data.dof_filter_sh);
+ DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[0][0]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[0][1]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[1][0]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[1][1]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[0][0]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[0][1]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[1][0]);
+ DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[1][1]);
DRW_SHADER_FREE_SAFE(e_data.cryptomatte_sh[0]);
DRW_SHADER_FREE_SAFE(e_data.cryptomatte_sh[1]);
for (int i = 0; i < 2; i++) {
@@ -1465,9 +1614,6 @@ void EEVEE_shaders_free(void)
DRW_SHADER_FREE_SAFE(e_data.bloom_downsample_sh[i]);
DRW_SHADER_FREE_SAFE(e_data.bloom_upsample_sh[i]);
DRW_SHADER_FREE_SAFE(e_data.bloom_resolve_sh[i]);
- DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh[i]);
- DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[i]);
- DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[i]);
}
for (int i = 0; i < SSR_MAX_SHADER; i++) {
DRW_SHADER_FREE_SAFE(e_data.ssr_sh[i]);
diff --git a/source/blender/draw/engines/eevee/eevee_shadows.c b/source/blender/draw/engines/eevee/eevee_shadows.c
index fa5afd60235..f6fe9a76c70 100644
--- a/source/blender/draw/engines/eevee/eevee_shadows.c
+++ b/source/blender/draw/engines/eevee/eevee_shadows.c
@@ -141,7 +141,7 @@ void EEVEE_shadows_caster_register(EEVEE_ViewLayerData *sldata, Object *ob)
}
if (ob->base_flag & BASE_FROM_DUPLI) {
- /* Duplis will always refresh the shadowmaps as if they were deleted each frame. */
+ /* Duplis will always refresh the shadow-maps as if they were deleted each frame. */
/* TODO(fclem): fix this. */
update = true;
}
@@ -259,7 +259,7 @@ void EEVEE_shadows_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
BoundSphere *bsphere = linfo->shadow_bounds;
/* Search for deleted shadow casters or if shcaster WAS in shadow radius. */
for (int i = 0; i < backbuffer->count; i++) {
- /* If the shadowcaster has been deleted or updated. */
+ /* If the shadow-caster has been deleted or updated. */
if (BLI_BITMAP_TEST(backbuffer->update, i)) {
for (int j = 0; j < linfo->cube_len; j++) {
if (!BLI_BITMAP_TEST(&linfo->sh_cube_update[0], j)) {
@@ -273,7 +273,7 @@ void EEVEE_shadows_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
/* Search for updates in current shadow casters. */
bbox = frontbuffer->bbox;
for (int i = 0; i < frontbuffer->count; i++) {
- /* If the shadowcaster has been updated. */
+ /* If the shadow-caster has been updated. */
if (BLI_BITMAP_TEST(frontbuffer->update, i)) {
for (int j = 0; j < linfo->cube_len; j++) {
if (!BLI_BITMAP_TEST(&linfo->sh_cube_update[0], j)) {
@@ -412,4 +412,4 @@ void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_D
}
}
-/* \} */
+/** \} */
diff --git a/source/blender/draw/engines/eevee/eevee_shadows_cascade.c b/source/blender/draw/engines/eevee/eevee_shadows_cascade.c
index 246bc18b71a..6cb4b39fafa 100644
--- a/source/blender/draw/engines/eevee/eevee_shadows_cascade.c
+++ b/source/blender/draw/engines/eevee/eevee_shadows_cascade.c
@@ -330,7 +330,7 @@ static void eevee_shadow_cascade_setup(EEVEE_LightsInfo *linfo,
DRW_debug_sphere(center, csm_render->radius[c], dbg_col);
#endif
- /* Project into lightspace */
+ /* Project into light-space. */
mul_m4_v3(viewmat, center);
/* Snap projection center to nearest texel to cancel shimmering. */
@@ -376,7 +376,7 @@ static void eevee_shadow_cascade_setup(EEVEE_LightsInfo *linfo,
#endif
}
- /* Bias is in clipspace, divide by range. */
+ /* Bias is in clip-space, divide by range. */
shdw_data->bias = csm_render->original_bias * 0.05f / fabsf(sh_far - sh_near);
shdw_data->near = sh_near;
shdw_data->far = sh_far;
diff --git a/source/blender/draw/engines/eevee/eevee_shadows_cube.c b/source/blender/draw/engines/eevee/eevee_shadows_cube.c
index 19b86476c29..89caa0dd193 100644
--- a/source/blender/draw/engines/eevee/eevee_shadows_cube.c
+++ b/source/blender/draw/engines/eevee/eevee_shadows_cube.c
@@ -142,7 +142,7 @@ static void eevee_ensure_cube_views(
float winmat[4][4];
float side = near;
- /* TODO shadowcube array. */
+ /* TODO: shadow-cube array. */
if (true) {
/* This half texel offset is used to ensure correct filtering between faces. */
/* FIXME: This exhibit float precision issue with lower cube_res.
diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
index 456efeca0f0..97bbf37a07e 100644
--- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
+++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
@@ -142,15 +142,53 @@ void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const dou
Scene *scene = draw_ctx->scene;
RenderData *rd = &scene->r;
- float persmat[4][4], viewmat[4][4], winmat[4][4];
+ float persmat[4][4], viewmat[4][4], winmat[4][4], wininv[4][4];
DRW_view_persmat_get(NULL, persmat, false);
DRW_view_viewmat_get(NULL, viewmat, false);
DRW_view_winmat_get(NULL, winmat, false);
+ DRW_view_winmat_get(NULL, wininv, true);
float ofs[2];
EEVEE_temporal_sampling_offset_calc(ht_point, rd->gauss, ofs);
- window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]);
+ if (effects->taa_current_sample > 1) {
+ window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]);
+ }
+
+ /* Jitter is in pixel space. Focus distance in world space units. */
+ float dof_jitter[2], focus_distance;
+ if (EEVEE_depth_of_field_jitter_get(effects, dof_jitter, &focus_distance)) {
+ /* Convert to NDC space [-1..1]. */
+ dof_jitter[0] /= viewport_size[0] * 0.5f;
+ dof_jitter[1] /= viewport_size[1] * 0.5f;
+
+ /* Skew the projection matrix in the ray direction and offset it to ray origin.
+ * Make it focus at focus_distance. */
+ if (winmat[2][3] != -1.0f) {
+ /* Orthographic */
+ add_v2_v2(winmat[2], dof_jitter);
+
+ window_translate_m4(
+ winmat, persmat, dof_jitter[0] * focus_distance, dof_jitter[1] * focus_distance);
+ }
+ else {
+ /* Get focus distance in NDC. */
+ float focus_pt[3] = {0.0f, 0.0f, -focus_distance};
+ mul_project_m4_v3(winmat, focus_pt);
+ /* Get pixel footprint in view-space. */
+ float jitter_scaled[3] = {dof_jitter[0], dof_jitter[1], focus_pt[2]};
+ float center[3] = {0.0f, 0.0f, focus_pt[2]};
+ mul_project_m4_v3(wininv, jitter_scaled);
+ mul_project_m4_v3(wininv, center);
+
+ /* FIXME(fclem): The offset is noticeably large and the culling might make object pop out
+ * of the blurring radius. To fix this, use custom enlarged culling matrix. */
+ sub_v2_v2v2(jitter_scaled, jitter_scaled, center);
+ add_v2_v2(viewmat[3], jitter_scaled);
+
+ window_translate_m4(winmat, persmat, dof_jitter[0], dof_jitter[1]);
+ }
+ }
BLI_assert(effects->taa_view != NULL);
@@ -194,6 +232,21 @@ void EEVEE_temporal_sampling_create_view(EEVEE_Data *vedata)
DRW_view_clip_planes_set(effects->taa_view, NULL, 0);
}
+int EEVEE_temporal_sampling_sample_count_get(const Scene *scene, const EEVEE_StorageList *stl)
+{
+ const bool is_render = DRW_state_is_image_render();
+ int sample_count = is_render ? scene->eevee.taa_render_samples : scene->eevee.taa_samples;
+ int timesteps = is_render ? stl->g_data->render_timesteps : 1;
+
+ sample_count = max_ii(0, sample_count);
+ sample_count = (sample_count == 0) ? TAA_MAX_SAMPLE : sample_count;
+ sample_count = divide_ceil_u(sample_count, timesteps);
+
+ int dof_sample_count = EEVEE_depth_of_field_sample_count_get(stl->effects, sample_count, NULL);
+ sample_count = dof_sample_count * divide_ceil_u(sample_count, dof_sample_count);
+ return sample_count;
+}
+
int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
{
EEVEE_StorageList *stl = vedata->stl;
@@ -238,10 +291,12 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data
view_is_valid = view_is_valid && (ED_screen_animation_no_scrub(wm) == NULL);
}
- const bool first_sample_only = EEVEE_renderpasses_only_first_sample_pass_active(vedata);
- view_is_valid = view_is_valid && !first_sample_only;
- effects->taa_total_sample = first_sample_only ? 1 : scene_eval->eevee.taa_samples;
- MAX2(effects->taa_total_sample, 0);
+ effects->taa_total_sample = EEVEE_temporal_sampling_sample_count_get(scene_eval, stl);
+
+ if (EEVEE_renderpasses_only_first_sample_pass_active(vedata)) {
+ view_is_valid = false;
+ effects->taa_total_sample = 1;
+ }
/* Motion blur steps could reset the sampling when camera is animated (see T79970). */
if (!DRW_state_is_scene_render()) {
diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index 1e75968f1de..52c96bf51e7 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -853,4 +853,4 @@ void EEVEE_volumes_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_
}
}
-/* \} */
+/** \} */
diff --git a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
index 2f6f8327f58..473990e1683 100644
--- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
@@ -1,5 +1,6 @@
#pragma BLENDER_REQUIRE(common_math_lib.glsl)
+#pragma BLENDER_REQUIRE(common_math_geom_lib.glsl)
#pragma BLENDER_REQUIRE(raytrace_lib.glsl)
/* Based on Practical Realtime Strategies for Accurate Indirect Occlusion
@@ -23,10 +24,6 @@
# endif
#endif
-#define MAX_PHI_STEP 32
-#define MAX_SEARCH_ITER 32
-#define MAX_LOD 6.0
-
uniform sampler2D horizonBuffer;
/* aoSettings flags */
@@ -34,191 +31,251 @@ uniform sampler2D horizonBuffer;
#define USE_BENT_NORMAL 2
#define USE_DENOISE 4
-vec4 pack_horizons(vec4 v)
+#define MAX_LOD 6.0
+#define NO_OCCLUSION_DATA OcclusionData(vec4(M_PI, -M_PI, M_PI, -M_PI), 1.0)
+
+struct OcclusionData {
+ /* 4 horizons angles, one in each direction around the view vector to form a cross pattern. */
+ vec4 horizons;
+ /* Custom large scale occlusion. */
+ float custom_occlusion;
+};
+
+vec4 pack_occlusion_data(OcclusionData data)
{
- return v * 0.5 + 0.5;
+ return vec4(1.0 - data.horizons * vec4(1, -1, 1, -1) * M_1_PI);
}
-vec4 unpack_horizons(vec4 v)
+
+OcclusionData unpack_occlusion_data(vec4 v)
{
- return v * 2.0 - 1.0;
+ return OcclusionData((1.0 - v) * vec4(1, -1, 1, -1) * M_PI, 0.0);
}
-/* Returns maximum screen distance an AO ray can travel for a given view depth */
-vec2 get_max_dir(float view_depth)
+/* Returns maximum screen distance an AO ray can travel for a given view depth, in NDC space. */
+vec2 get_ao_area(float view_depth, float radius)
{
float homcco = ProjectionMatrix[2][3] * view_depth + ProjectionMatrix[3][3];
- float max_dist = aoDistance / homcco;
+ float max_dist = radius / homcco;
return vec2(ProjectionMatrix[0][0], ProjectionMatrix[1][1]) * max_dist;
}
+vec2 get_ao_noise(void)
+{
+ return texelfetch_noise_tex(gl_FragCoord.xy).xy;
+}
+
vec2 get_ao_dir(float jitter)
{
- /* Only half a turn because we integrate in slices. */
- jitter *= M_PI;
+ /* Only a quarter of a turn because we integrate using 2 slices.
+ * We use this instead of using utiltex circle noise to improve cache hits
+ * since all tracing direction will be in the same quadrant. */
+ jitter *= M_PI_2;
return vec2(cos(jitter), sin(jitter));
}
-void get_max_horizon_grouped(vec4 co1, vec4 co2, vec3 x, float lod, inout float h)
+/* Return horizon angle cosine. */
+float search_horizon(vec3 vI,
+ vec3 vP,
+ float noise,
+ vec2 uv_start,
+ vec2 uv_dir,
+ sampler2D depth_tx,
+ const float inverted,
+ float radius,
+ const float sample_count)
{
- int mip = int(lod) + hizMipOffset;
- co1 *= mipRatio[mip].xyxy;
- co2 *= mipRatio[mip].xyxy;
-
- float depth1 = textureLod(maxzBuffer, co1.xy, floor(lod)).r;
- float depth2 = textureLod(maxzBuffer, co1.zw, floor(lod)).r;
- float depth3 = textureLod(maxzBuffer, co2.xy, floor(lod)).r;
- float depth4 = textureLod(maxzBuffer, co2.zw, floor(lod)).r;
-
- vec4 len, s_h;
-
- vec3 s1 = get_view_space_from_depth(co1.xy, depth1); /* s View coordinate */
- vec3 omega_s1 = s1 - x;
- len.x = length(omega_s1);
- s_h.x = omega_s1.z / len.x;
-
- vec3 s2 = get_view_space_from_depth(co1.zw, depth2); /* s View coordinate */
- vec3 omega_s2 = s2 - x;
- len.y = length(omega_s2);
- s_h.y = omega_s2.z / len.y;
-
- vec3 s3 = get_view_space_from_depth(co2.xy, depth3); /* s View coordinate */
- vec3 omega_s3 = s3 - x;
- len.z = length(omega_s3);
- s_h.z = omega_s3.z / len.z;
-
- vec3 s4 = get_view_space_from_depth(co2.zw, depth4); /* s View coordinate */
- vec3 omega_s4 = s4 - x;
- len.w = length(omega_s4);
- s_h.w = omega_s4.z / len.w;
-
- /* Blend weight after half the aoDistance to fade artifacts */
- vec4 blend = saturate((1.0 - len / aoDistance) * 2.0);
-
- h = mix(h, max(h, s_h.x), blend.x);
- h = mix(h, max(h, s_h.y), blend.y);
- h = mix(h, max(h, s_h.z), blend.z);
- h = mix(h, max(h, s_h.w), blend.w);
+ float sample_count_inv = 1.0 / sample_count;
+ /* Init at cos(M_PI). */
+ float h = (inverted != 0.0) ? 1.0 : -1.0;
+
+ /* TODO(fclem) samples steps should be using the same approach as raytrace. (DDA line algo.) */
+ for (float i = 0.0; i < sample_count; i++) {
+ float t = ((i + noise) * sample_count_inv);
+ vec2 uv = uv_start + uv_dir * t;
+ float lod = min(MAX_LOD, max(i - noise, 0.0) * aoQuality);
+
+ int mip = int(lod) + hizMipOffset;
+ float depth = textureLod(depth_tx, uv * mipRatio[mip].xy, floor(lod)).r;
+
+ /* Bias depth a bit to avoid self shadowing issues. */
+ const float bias = 2.0 * 2.4e-7;
+ depth += (inverted != 0.0) ? -bias : bias;
+
+ vec3 s = get_view_space_from_depth(uv, depth);
+ vec3 omega_s = s - vP;
+ float len = length(omega_s);
+ /* Sample's horizon angle cosine. */
+ float s_h = dot(vI, omega_s / len);
+ /* Blend weight to fade artifacts. */
+ float dist_ratio = abs(len) / radius;
+ /* TODO(fclem) parameter. */
+ float dist_fac = sqr(saturate(dist_ratio * 2.0 - 1.0));
+
+ /* Thickness heuristic (Eq. 9). */
+ if (inverted != 0.0) {
+ h = min(h, s_h);
+ }
+ else {
+ /* TODO This need to take the stride distance into account. Now it works because stride is
+ * constant. */
+ if (s_h < h) {
+ /* TODO(fclem) parameter. */
+ const float thickness_fac = 0.2;
+ s_h = mix(h, s_h, thickness_fac);
+ }
+ else {
+ s_h = max(h, s_h);
+ }
+ h = mix(s_h, h, dist_fac);
+ }
+ }
+ return fast_acos(h);
}
-vec2 search_horizon_sweep(vec2 t_phi, vec3 pos, vec2 uvs, float jitter, vec2 max_dir)
+OcclusionData occlusion_search(
+ vec3 vP, sampler2D depth_tx, float radius, const float inverted, const float dir_sample_count)
{
- max_dir *= max_v2(abs(t_phi));
-
- /* Convert to pixel space. */
- t_phi /= vec2(textureSize(maxzBuffer, 0));
-
- /* Avoid division by 0 */
- t_phi += vec2(1e-5);
-
- jitter *= 0.25;
-
- /* Compute end points */
- vec2 corner1 = min(vec2(1.0) - uvs, max_dir); /* Top right */
- vec2 corner2 = max(vec2(0.0) - uvs, -max_dir); /* Bottom left */
- vec2 iter1 = corner1 / t_phi;
- vec2 iter2 = corner2 / t_phi;
-
- vec2 min_iter = max(-iter1, -iter2);
- vec2 max_iter = max(iter1, iter2);
-
- vec2 times = vec2(-min_v2(min_iter), min_v2(max_iter));
-
- vec2 h = vec2(-1.0); /* init at cos(pi) */
-
- /* This is freaking sexy optimized. */
- for (float i = 0.0, ofs = 4.0, time = -1.0; i < MAX_SEARCH_ITER && time > times.x;
- i++, time -= ofs, ofs = min(exp2(MAX_LOD) * 4.0, ofs + ofs * aoQuality)) {
- vec4 t = max(times.xxxx, vec4(time) - (vec4(0.25, 0.5, 0.75, 1.0) - jitter) * ofs);
- vec4 cos1 = uvs.xyxy + t_phi.xyxy * t.xxyy;
- vec4 cos2 = uvs.xyxy + t_phi.xyxy * t.zzww;
- float lod = min(MAX_LOD, max(i - jitter * 4.0, 0.0) * aoQuality);
- get_max_horizon_grouped(cos1, cos2, pos, lod, h.y);
+ if ((int(aoSettings) & USE_AO) == 0) {
+ return NO_OCCLUSION_DATA;
}
- for (float i = 0.0, ofs = 4.0, time = 1.0; i < MAX_SEARCH_ITER && time < times.y;
- i++, time += ofs, ofs = min(exp2(MAX_LOD) * 4.0, ofs + ofs * aoQuality)) {
- vec4 t = min(times.yyyy, vec4(time) + (vec4(0.25, 0.5, 0.75, 1.0) - jitter) * ofs);
- vec4 cos1 = uvs.xyxy + t_phi.xyxy * t.xxyy;
- vec4 cos2 = uvs.xyxy + t_phi.xyxy * t.zzww;
- float lod = min(MAX_LOD, max(i - jitter * 4.0, 0.0) * aoQuality);
- get_max_horizon_grouped(cos1, cos2, pos, lod, h.x);
+ vec2 noise = get_ao_noise();
+ vec2 area = get_ao_area(vP.z, radius);
+ vec2 dir = get_ao_dir(noise.x);
+ vec2 uv = get_uvs_from_view(vP);
+ vec3 vI = ((ProjectionMatrix[3][3] == 0.0) ? normalize(-vP) : vec3(0.0, 0.0, 1.0));
+ vec3 avg_dir = vec3(0.0);
+ float avg_apperture = 0.0;
+
+ OcclusionData data = (inverted != 0.0) ? OcclusionData(vec4(0, 0, 0, 0), 1.0) :
+ NO_OCCLUSION_DATA;
+
+ for (int i = 0; i < 2; i++) {
+ /* View > NDC > Uv space. */
+ vec2 uv_dir = dir * area * 0.5;
+ /* Offset the start one pixel to avoid self shadowing. */
+ /* TODO(fclem) Using DDA line algo should fix this. */
+ vec2 px_dir = uv_dir * textureSize(depth_tx, 0);
+ float max_px_dir = max_v2(abs(px_dir));
+ vec2 uv_ofs = (px_dir / max_px_dir) / textureSize(depth_tx, 0);
+ /* No need to trace more. */
+ uv_dir -= uv_ofs;
+
+ if (max_px_dir > 1.0) {
+ data.horizons[0 + i * 2] = search_horizon(
+ vI, vP, noise.y, uv + uv_ofs, uv_dir, depth_tx, inverted, radius, dir_sample_count);
+ data.horizons[1 + i * 2] = -search_horizon(
+ vI, vP, noise.y, uv - uv_ofs, -uv_dir, depth_tx, inverted, radius, dir_sample_count);
+ }
+ /* Rotate 90 degrees. */
+ dir = vec2(-dir.y, dir.x);
}
- return h;
+ return data;
}
-void integrate_slice(
- vec3 normal, vec2 t_phi, vec2 horizons, inout float visibility, inout vec3 bent_normal)
+vec2 clamp_horizons_to_hemisphere(vec2 horizons, float angle_N, const float inverted)
{
- /* Projecting Normal to Plane P defined by t_phi and omega_o */
- vec3 np = vec3(t_phi.y, -t_phi.x, 0.0); /* Normal vector to Integration plane */
- vec3 t = vec3(-t_phi, 0.0);
- vec3 n_proj = normal - np * dot(np, normal);
- float n_proj_len = max(1e-16, length(n_proj));
-
- float cos_n = clamp(n_proj.z / n_proj_len, -1.0, 1.0);
- float n = sign(dot(n_proj, t)) * fast_acos(cos_n); /* Angle between view vec and normal */
-
- /* (Slide 54) */
- vec2 h = fast_acos(horizons);
- h.x = -h.x;
-
- /* Clamping thetas (slide 58) */
- h.x = n + max(h.x - n, -M_PI_2);
- h.y = n + min(h.y - n, M_PI_2);
-
- /* Solving inner integral */
- vec2 h_2 = 2.0 * h;
- vec2 vd = -cos(h_2 - n) + cos_n + h_2 * sin(n);
- float vis = saturate((vd.x + vd.y) * 0.25 * n_proj_len);
-
- visibility += vis;
-
- /* O. Klehm, T. Ritschel, E. Eisemann, H.-P. Seidel
- * Bent Normals and Cones in Screen-space
- * Sec. 3.1 : Bent normals */
- float b_angle = (h.x + h.y) * 0.5;
- bent_normal += vec3(sin(b_angle) * -t_phi, cos(b_angle)) * vis;
+ /* Add a little bias to fight self shadowing. */
+ const float max_angle = M_PI_2 - 0.05;
+
+ if (inverted != 0.0) {
+ horizons.x = max(horizons.x, angle_N + max_angle);
+ horizons.y = min(horizons.y, angle_N - max_angle);
+ }
+ else {
+ horizons.x = min(horizons.x, angle_N + max_angle);
+ horizons.y = max(horizons.y, angle_N - max_angle);
+ }
+ return horizons;
}
-void gtao_deferred(
- vec3 normal, vec4 noise, float frag_depth, out float visibility, out vec3 bent_normal)
+void occlusion_eval(OcclusionData data,
+ vec3 V,
+ vec3 N,
+ vec3 Ng,
+ const float inverted,
+ out float visibility,
+ out vec3 bent_normal)
{
- /* Fetch early, hide latency! */
- vec4 horizons = texelFetch(horizonBuffer, ivec2(gl_FragCoord.xy), 0);
-
- vec4 dirs;
- dirs.xy = get_ao_dir(noise.x * 0.5);
- dirs.zw = get_ao_dir(noise.x * 0.5 + 0.5);
-
- bent_normal = normal * 1e-8;
- visibility = 1e-8;
-
- horizons = unpack_horizons(horizons);
-
- integrate_slice(normal, dirs.xy, horizons.xy, visibility, bent_normal);
- integrate_slice(normal, dirs.zw, horizons.zw, visibility, bent_normal);
+ if ((int(aoSettings) & USE_AO) == 0) {
+ visibility = data.custom_occlusion;
+ bent_normal = N;
+ return;
+ }
- bent_normal = normalize(bent_normal / visibility);
+ bool early_out = (inverted != 0.0) ? (max_v4(abs(data.horizons)) == 0.0) :
+ (min_v4(abs(data.horizons)) == M_PI);
+ if (early_out) {
+ visibility = dot(N, Ng) * 0.5 + 0.5;
+ visibility = min(visibility, data.custom_occlusion);
- visibility *= 0.5; /* We integrated 2 slices. */
-}
+ if ((int(aoSettings) & USE_BENT_NORMAL) == 0) {
+ bent_normal = N;
+ }
+ else {
+ bent_normal = normalize(N + Ng);
+ }
+ return;
+ }
-void gtao(vec3 normal, vec3 position, vec4 noise, out float visibility, out vec3 bent_normal)
-{
- vec2 uvs = get_uvs_from_view(position);
- vec2 max_dir = get_max_dir(position.z);
+ vec2 noise = get_ao_noise();
vec2 dir = get_ao_dir(noise.x);
- bent_normal = normal * 1e-8;
- visibility = 1e-8;
+ visibility = 0.0;
+ bent_normal = N * 0.001;
+
+ for (int i = 0; i < 2; i++) {
+ vec3 T = transform_direction(ViewMatrixInverse, vec3(dir, 0.0));
+ /* Setup integration domain around V. */
+ vec3 B = normalize(cross(V, T));
+ T = normalize(cross(B, V));
+
+ float proj_N_len;
+ vec3 proj_N = normalize_len(N - B * dot(N, B), proj_N_len);
+ vec3 proj_Ng = normalize(Ng - B * dot(Ng, B));
+
+ vec2 h = (i == 0) ? data.horizons.xy : data.horizons.zw;
+
+ float N_sin = dot(proj_N, T);
+ float Ng_sin = dot(proj_Ng, T);
+ float N_cos = saturate(dot(proj_N, V));
+ float Ng_cos = saturate(dot(proj_Ng, V));
+ /* Gamma, angle between normalized projected normal and view vector. */
+ float angle_Ng = sign(Ng_sin) * fast_acos(Ng_cos);
+ float angle_N = sign(N_sin) * fast_acos(N_cos);
+ /* Clamp horizons to hemisphere around shading normal. */
+ h = clamp_horizons_to_hemisphere(h, angle_N, inverted);
+
+ float bent_angle = (h.x + h.y) * 0.5;
+ /* NOTE: here we multiply z by 0.5 as it shows less difference with the geometric normal.
+ * Also modulate by projected normal length to reduce issues with slanted surfaces.
+ * All of this is ad-hoc and not really grounded. */
+ bent_normal += proj_N_len * (T * sin(bent_angle) + V * 0.5 * cos(bent_angle));
+
+ /* Clamp to geometric normal only for integral to keep smooth bent normal. */
+ /* This is done to match Cycles ground truth but adds some computation. */
+ h = clamp_horizons_to_hemisphere(h, angle_Ng, inverted);
+
+ /* Inner integral (Eq. 7). */
+ float a = dot(-cos(2.0 * h - angle_N) + N_cos + 2.0 * h * N_sin, vec2(0.25));
+ /* Correct normal not on plane (Eq. 8). */
+ visibility += proj_N_len * a;
+
+ /* Rotate 90 degrees. */
+ dir = vec2(-dir.y, dir.x);
+ }
+ /* We integrated 2 directions. */
+ visibility *= 0.5;
- /* Only trace in 2 directions. May lead to a darker result but since it's mostly for
- * alpha blended objects that will have overdraw, we limit the performance impact. */
- vec2 horizons = search_horizon_sweep(dir, position, uvs, noise.y, max_dir);
- integrate_slice(normal, dir, horizons, visibility, bent_normal);
+ visibility = min(visibility, data.custom_occlusion);
- bent_normal = normalize(bent_normal / visibility);
+ if ((int(aoSettings) & USE_BENT_NORMAL) == 0) {
+ bent_normal = N;
+ }
+ else {
+ bent_normal = normalize(mix(bent_normal, N, sqr(sqr(sqr(visibility)))));
+ }
}
/* Multibounce approximation base on surface albedo.
@@ -240,46 +297,103 @@ float gtao_multibounce(float visibility, vec3 albedo)
return max(x, ((x * a + b) * x + c) * x);
}
-float specular_occlusion(float NV, float AO, float roughness)
+float diffuse_occlusion(OcclusionData data, vec3 V, vec3 N, vec3 Ng)
{
- return saturate(pow(NV + AO, roughness) - 1.0 + AO);
+ vec3 unused;
+ float visibility;
+ occlusion_eval(data, V, N, Ng, 0.0, visibility, unused);
+ /* Scale by user factor */
+ visibility = pow(saturate(visibility), aoFactor);
+ return visibility;
}
-/* Use the right occlusion */
-float occlusion_compute(vec3 N, vec3 vpos, float user_occlusion, vec4 rand, out vec3 bent_normal)
+float diffuse_occlusion(
+ OcclusionData data, vec3 V, vec3 N, vec3 Ng, vec3 albedo, out vec3 bent_normal)
{
-#ifndef USE_REFRACTION
- if ((int(aoSettings) & USE_AO) != 0) {
- float visibility;
- vec3 vnor = mat3(ViewMatrix) * N;
+ float visibility;
+ occlusion_eval(data, V, N, Ng, 0.0, visibility, bent_normal);
-# ifdef ENABLE_DEFERED_AO
- gtao_deferred(vnor, rand, gl_FragCoord.z, visibility, bent_normal);
-# else
- gtao(vnor, vpos, rand, visibility, bent_normal);
-# endif
-
- /* Prevent some problems down the road. */
- visibility = max(1e-3, visibility);
+ visibility = gtao_multibounce(visibility, albedo);
+ /* Scale by user factor */
+ visibility = pow(saturate(visibility), aoFactor);
+ return visibility;
+}
- if ((int(aoSettings) & USE_BENT_NORMAL) != 0) {
- /* The bent normal will show the facet look of the mesh. Try to minimize this. */
- float mix_fac = visibility * visibility * visibility;
- bent_normal = normalize(mix(bent_normal, vnor, mix_fac));
+/**
+ * Approximate the area of intersection of two spherical caps
+ * radius1 : First cap’s radius (arc length in radians)
+ * radius2 : Second caps’ radius (in radians)
+ * dist : Distance between caps (radians between centers of caps)
+ * Note: Result is divided by pi to save one multiply.
+ **/
+float spherical_cap_intersection(float radius1, float radius2, float dist)
+{
+ /* From "Ambient Aperture Lighting" by Chris Oat
+ * Slide 15. */
+ float max_radius = max(radius1, radius2);
+ float min_radius = min(radius1, radius2);
+ float sum_radius = radius1 + radius2;
+ float area;
+ if (dist <= max_radius - min_radius) {
+ /* One cap in completely inside the other */
+ area = 1.0 - cos(min_radius);
+ }
+ else if (dist >= sum_radius) {
+ /* No intersection exists */
+ area = 0;
+ }
+ else {
+ float diff = max_radius - min_radius;
+ area = smoothstep(0.0, 1.0, 1.0 - saturate((dist - diff) / (sum_radius - diff)));
+ area *= 1.0 - cos(min_radius);
+ }
+ return area;
+}
- bent_normal = transform_direction(ViewMatrixInverse, bent_normal);
- }
- else {
- bent_normal = N;
- }
+float specular_occlusion(
+ OcclusionData data, vec3 V, vec3 N, float roughness, inout vec3 specular_dir)
+{
+ vec3 visibility_dir;
+ float visibility;
+ occlusion_eval(data, V, N, N, 0.0, visibility, visibility_dir);
+
+ specular_dir = normalize(mix(specular_dir, visibility_dir, roughness * (1.0 - visibility)));
+
+ /* Visibility to cone angle (eq. 18). */
+ float vis_angle = fast_acos(sqrt(1 - visibility));
+ /* Roughness to cone angle (eq. 26). */
+ float spec_angle = max(0.001, fast_acos(cone_cosine(roughness)));
+ /* Angle between cone axes. */
+ float cone_cone_dist = fast_acos(saturate(dot(visibility_dir, specular_dir)));
+ float cone_nor_dist = fast_acos(saturate(dot(N, specular_dir)));
+
+ float isect_solid_angle = spherical_cap_intersection(vis_angle, spec_angle, cone_cone_dist);
+ float specular_solid_angle = spherical_cap_intersection(M_PI_2, spec_angle, cone_nor_dist);
+ float specular_occlusion = isect_solid_angle / specular_solid_angle;
+ /* Mix because it is unstable in unoccluded areas. */
+ visibility = mix(isect_solid_angle / specular_solid_angle, 1.0, pow(visibility, 8.0));
+
+ /* Scale by user factor */
+ visibility = pow(saturate(visibility), aoFactor);
+ return visibility;
+}
- /* Scale by user factor */
- visibility = pow(visibility, aoFactor);
+/* Use the right occlusion. */
+OcclusionData occlusion_load(vec3 vP, float custom_occlusion)
+{
+ /* Default to fully openned cone. */
+ OcclusionData data = NO_OCCLUSION_DATA;
- return min(visibility, user_occlusion);
+#ifdef ENABLE_DEFERED_AO
+ if ((int(aoSettings) & USE_AO) != 0) {
+ data = unpack_occlusion_data(texelFetch(horizonBuffer, ivec2(gl_FragCoord.xy), 0));
}
+#else
+ /* For blended surfaces and */
+ data = occlusion_search(vP, maxzBuffer, aoDistance, 0.0, 8.0);
#endif
- bent_normal = N;
- return user_occlusion;
+ data.custom_occlusion = custom_occlusion;
+
+ return data;
}
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
index 3560ae62a84..bc2895ef3df 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -1,6 +1,11 @@
#pragma BLENDER_REQUIRE(common_math_lib.glsl)
+vec3 diffuse_dominant_dir(vec3 bent_normal)
+{
+ return bent_normal;
+}
+
vec3 specular_dominant_dir(vec3 N, vec3 V, float roughness)
{
vec3 R = -reflect(V, N);
@@ -15,6 +20,7 @@ float ior_from_f0(float f0)
return (-f - 1.0) / (f - 1.0);
}
+/* Simplified form of F_eta(eta, 1.0). */
float f0_from_ior(float eta)
{
float A = (eta - 1.0) / (eta + 1.0);
@@ -47,30 +53,21 @@ float F_eta(float eta, float cos_theta)
* the refracted direction */
float c = abs(cos_theta);
float g = eta * eta - 1.0 + c * c;
- float result;
-
if (g > 0.0) {
g = sqrt(g);
- vec2 g_c = vec2(g) + vec2(c, -c);
- float A = g_c.y / g_c.x;
- A *= A;
- g_c *= c;
- float B = (g_c.y - 1.0) / (g_c.x + 1.0);
- B *= B;
- result = 0.5 * A * (1.0 + B);
+ float A = (g - c) / (g + c);
+ float B = (c * (g + c) - 1.0) / (c * (g - c) + 1.0);
+ return 0.5 * A * A * (1.0 + B * B);
}
- else {
- result = 1.0; /* TIR (no refracted component) */
- }
-
- return result;
+ /* Total internal reflections. */
+ return 1.0;
}
/* Fresnel color blend base on fresnel factor */
vec3 F_color_blend(float eta, float fresnel, vec3 f0_color)
{
- float f0 = F_eta(eta, 1.0);
- float fac = saturate((fresnel - f0) / max(1e-8, 1.0 - f0));
+ float f0 = f0_from_ior(eta);
+ float fac = saturate((fresnel - f0) / (1.0 - f0));
return mix(f0_color, vec3(1.0), fac);
}
@@ -79,7 +76,7 @@ vec3 F_brdf_single_scatter(vec3 f0, vec3 f90, vec2 lut)
{
/* Unreal specular matching : if specular color is below 2% intensity,
* treat as shadowning */
- return saturate(50.0 * dot(f0, vec3(0.3, 0.6, 0.1))) * lut.y * abs(f90) + lut.x * f0;
+ return lut.y * f90 + lut.x * f0;
}
/* Multi-scattering brdf approximation from :
@@ -87,11 +84,7 @@ vec3 F_brdf_single_scatter(vec3 f0, vec3 f90, vec2 lut)
* by Carmelo J. Fdez-Agüera. */
vec3 F_brdf_multi_scatter(vec3 f0, vec3 f90, vec2 lut)
{
- vec3 FssEss = F_brdf_single_scatter(f0, f90, lut);
- /* Hack to avoid many more shader variations. */
- if (f90.g < 0.0) {
- return FssEss;
- }
+ vec3 FssEss = lut.y * f90 + lut.x * f0;
float Ess = lut.x + lut.y;
float Ems = 1.0 - Ess;
@@ -102,8 +95,6 @@ vec3 F_brdf_multi_scatter(vec3 f0, vec3 f90, vec2 lut)
return FssEss + Fms * Ems;
}
-#define F_brdf(f0, f90, lut) F_brdf_multi_scatter(f0, f90, lut)
-
/* GGX */
float D_ggx_opti(float NH, float a2)
{
@@ -144,7 +135,7 @@ void accumulate_light(vec3 light, float fac, inout vec4 accum)
accum += vec4(light, 1.0) * min(fac, (1.0 - accum.a));
}
-/* ----------- Cone Aperture Approximation --------- */
+/* ----------- Cone angle Approximation --------- */
/* Return a fitted cone angle given the input roughness */
float cone_cosine(float r)
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl
index 1e051994693..46ea8b747c8 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl
@@ -1,48 +1,57 @@
+#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
#pragma BLENDER_REQUIRE(bsdf_sampling_lib.glsl)
-out vec4 FragColor;
+uniform float sampleCount;
+
+out vec2 FragColor;
void main()
{
- vec3 N, T, B, V;
-
- float NV = (1.0 - (clamp(gl_FragCoord.y / LUT_SIZE, 1e-4, 0.9999)));
- float sqrtRoughness = clamp(gl_FragCoord.x / LUT_SIZE, 1e-4, 0.9999);
- float a = sqrtRoughness * sqrtRoughness;
- float a2 = a * a;
+ /* Make sure coordinates are covering the whole [0..1] range at texel center. */
+ float y = floor(gl_FragCoord.y) / (LUT_SIZE - 1);
+ float x = floor(gl_FragCoord.x) / (LUT_SIZE - 1);
- N = vec3(0.0, 0.0, 1.0);
- T = vec3(1.0, 0.0, 0.0);
- B = vec3(0.0, 1.0, 0.0);
- V = vec3(sqrt(1.0 - NV * NV), 0.0, NV);
+ float NV = clamp(1.0 - y * y, 1e-4, 0.9999);
+ float a = x * x;
+ float a2 = clamp(a * a, 1e-4, 0.9999);
- setup_noise();
+ vec3 V = vec3(sqrt(1.0 - NV * NV), 0.0, NV);
/* Integrating BRDF */
float brdf_accum = 0.0;
float fresnel_accum = 0.0;
- for (float i = 0; i < sampleCount; i++) {
- vec3 H = sample_ggx(i, a2, N, T, B); /* Microfacet normal */
- vec3 L = -reflect(V, H);
- float NL = L.z;
-
- if (NL > 0.0) {
- float NH = max(H.z, 0.0);
- float VH = max(dot(V, H), 0.0);
-
- float G1_v = G1_Smith_GGX(NV, a2);
- float G1_l = G1_Smith_GGX(NL, a2);
- float G_smith = 4.0 * NV * NL / (G1_v * G1_l); /* See G1_Smith_GGX for explanations. */
-
- float brdf = (G_smith * VH) / (NH * NV);
- float Fc = pow(1.0 - VH, 5.0);
-
- brdf_accum += (1.0 - Fc) * brdf;
- fresnel_accum += Fc * brdf;
+ for (float j = 0.0; j < sampleCount; j++) {
+ for (float i = 0.0; i < sampleCount; i++) {
+ vec3 Xi = (vec3(i, j, 0.0) + 0.5) / sampleCount;
+ Xi.yz = vec2(cos(Xi.y * M_2PI), sin(Xi.y * M_2PI));
+
+ vec3 H = sample_ggx(Xi, a2); /* Microfacet normal */
+ vec3 L = -reflect(V, H);
+ float NL = L.z;
+
+ if (NL > 0.0) {
+ float NH = max(H.z, 0.0);
+ float VH = max(dot(V, H), 0.0);
+
+ float G1_v = G1_Smith_GGX(NV, a2);
+ float G1_l = G1_Smith_GGX(NL, a2);
+ float G_smith = 4.0 * NV * NL / (G1_v * G1_l); /* See G1_Smith_GGX for explanations. */
+
+ float brdf = (G_smith * VH) / (NH * NV);
+
+ /* Follow maximum specular value for principled bsdf. */
+ const float specular = 1.0;
+ const float eta = (2.0 / (1.0 - sqrt(0.08 * specular))) - 1.0;
+ float fresnel = F_eta(eta, VH);
+ float Fc = F_color_blend(eta, fresnel, vec3(0)).r;
+
+ brdf_accum += (1.0 - Fc) * brdf;
+ fresnel_accum += Fc * brdf;
+ }
}
}
- brdf_accum /= sampleCount;
- fresnel_accum /= sampleCount;
+ brdf_accum /= sampleCount * sampleCount;
+ fresnel_accum /= sampleCount * sampleCount;
- FragColor = vec4(brdf_accum, fresnel_accum, 0.0, 1.0);
+ FragColor = vec2(brdf_accum, fresnel_accum);
}
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl
index 066ea58e2bf..4abc313d7e3 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl
@@ -1,21 +1,7 @@
-#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
+#pragma BLENDER_REQUIRE(bsdf_common_lib.glsl)
uniform sampler1D texHammersley;
-uniform float sampleCount;
-uniform float invSampleCount;
-
-vec2 jitternoise = vec2(0.0);
-
-#ifndef UTIL_TEX
-# define UTIL_TEX
-
-#endif /* UTIL_TEX */
-
-void setup_noise(void)
-{
- jitternoise = texelfetch_noise_tex(gl_FragCoord.xy).rg; /* Global variable */
-}
vec3 tangent_to_world(vec3 vector, vec3 N, vec3 T, vec3 B)
{
@@ -27,20 +13,11 @@ vec3 hammersley_3d(float i, float invsamplenbr)
{
vec3 Xi; /* Theta, cos(Phi), sin(Phi) */
- Xi.x = i * invsamplenbr; /* i/samples */
- Xi.x = fract(Xi.x + jitternoise.x);
-
- int u = int(mod(i + jitternoise.y * HAMMERSLEY_SIZE, HAMMERSLEY_SIZE));
-
- Xi.yz = texelFetch(texHammersley, u, 0).rg;
+ Xi.x = i * invsamplenbr;
+ Xi.yz = texelFetch(texHammersley, int(i), 0).rg;
return Xi;
}
-
-vec3 hammersley_3d(float i)
-{
- return hammersley_3d(i, invSampleCount);
-}
#endif
/* -------------- BSDFS -------------- */
@@ -57,7 +34,7 @@ float pdf_hemisphere()
vec3 sample_ggx(vec3 rand, float a2)
{
- /* Theta is the aperture angle of the cone */
+ /* Theta is the cone angle. */
float z = sqrt((1.0 - rand.x) / (1.0 + a2 * rand.x - rand.x)); /* cos theta */
float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */
float x = r * rand.y;
@@ -75,16 +52,16 @@ vec3 sample_ggx(vec3 rand, float a2, vec3 N, vec3 T, vec3 B, out float NH)
}
#ifdef HAMMERSLEY_SIZE
-vec3 sample_ggx(float nsample, float a2, vec3 N, vec3 T, vec3 B)
+vec3 sample_ggx(float nsample, float inv_sample_count, float a2, vec3 N, vec3 T, vec3 B)
{
- vec3 Xi = hammersley_3d(nsample);
+ vec3 Xi = hammersley_3d(nsample, inv_sample_count);
vec3 Ht = sample_ggx(Xi, a2);
return tangent_to_world(Ht, N, T, B);
}
-vec3 sample_hemisphere(float nsample, vec3 N, vec3 T, vec3 B)
+vec3 sample_hemisphere(float nsample, float inv_sample_count, vec3 N, vec3 T, vec3 B)
{
- vec3 Xi = hammersley_3d(nsample);
+ vec3 Xi = hammersley_3d(nsample, inv_sample_count);
float z = Xi.x; /* cos theta */
float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */
@@ -96,9 +73,9 @@ vec3 sample_hemisphere(float nsample, vec3 N, vec3 T, vec3 B)
return tangent_to_world(Ht, N, T, B);
}
-vec3 sample_cone(float nsample, float angle, vec3 N, vec3 T, vec3 B)
+vec3 sample_cone(float nsample, float inv_sample_count, float angle, vec3 N, vec3 T, vec3 B)
{
- vec3 Xi = hammersley_3d(nsample);
+ vec3 Xi = hammersley_3d(nsample, inv_sample_count);
float z = cos(angle * Xi.x); /* cos theta */
float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */
diff --git a/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl b/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl
index d815d9d4e6b..2ffe23a9197 100644
--- a/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl
@@ -1,62 +1,89 @@
+#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
#pragma BLENDER_REQUIRE(bsdf_sampling_lib.glsl)
-uniform float a2;
+uniform float sampleCount;
+uniform float z;
out vec4 FragColor;
void main()
{
- vec3 N, T, B, V;
+ float x = floor(gl_FragCoord.x) / (LUT_SIZE - 1.0);
+ float y = floor(gl_FragCoord.y) / (LUT_SIZE - 1.0);
- float x = gl_FragCoord.x / LUT_SIZE;
- float y = gl_FragCoord.y / LUT_SIZE;
- /* There is little variation if ior > 1.0 so we
- * maximize LUT precision for ior < 1.0 */
- x = x * 1.1;
- float ior = (x > 1.0) ? ior_from_f0((x - 1.0) * 10.0) : sqrt(x);
- float NV = (1.0 - (clamp(y, 1e-4, 0.9999)));
+ float ior = clamp(sqrt(x), 0.05, 0.999);
+ /* ior is sin of critical angle. */
+ float critical_cos = sqrt(1.0 - saturate(ior * ior));
- N = vec3(0.0, 0.0, 1.0);
- T = vec3(1.0, 0.0, 0.0);
- B = vec3(0.0, 1.0, 0.0);
- V = vec3(sqrt(1.0 - NV * NV), 0.0, NV);
+ y = y * 2.0 - 1.0;
+ /* Maximize texture usage on both sides of the critical angle. */
+ y *= (y > 0.0) ? (1.0 - critical_cos) : critical_cos;
+ /* Center LUT around critical angle to avoid strange interpolation issues when the critical
+ * angle is changing. */
+ y += critical_cos;
+ float NV = clamp(y, 1e-4, 0.9999);
- setup_noise();
+ float a = z * z;
+ float a2 = clamp(a * a, 1e-8, 0.9999);
+
+ vec3 V = vec3(sqrt(1.0 - NV * NV), 0.0, NV);
/* Integrating BTDF */
float btdf_accum = 0.0;
- for (float i = 0.0; i < sampleCount; i++) {
- vec3 H = sample_ggx(i, a2, N, T, B); /* Microfacet normal */
+ float fresnel_accum = 0.0;
+ for (float j = 0.0; j < sampleCount; j++) {
+ for (float i = 0.0; i < sampleCount; i++) {
+ vec3 Xi = (vec3(i, j, 0.0) + 0.5) / sampleCount;
+ Xi.yz = vec2(cos(Xi.y * M_2PI), sin(Xi.y * M_2PI));
- float VH = dot(V, H);
+ /* Microfacet normal. */
+ vec3 H = sample_ggx(Xi, a2);
- /* Check if there is total internal reflections. */
- float c = abs(VH);
- float g = ior * ior - 1.0 + c * c;
+ float VH = dot(V, H);
- float eta = 1.0 / ior;
- if (dot(H, V) < 0.0) {
- H = -H;
- eta = ior;
- }
+ /* Check if there is total internal reflections. */
+ float fresnel = F_eta(ior, VH);
+
+ fresnel_accum += fresnel;
+
+ float eta = 1.0 / ior;
+ if (dot(H, V) < 0.0) {
+ H = -H;
+ eta = ior;
+ }
- vec3 L = refract(-V, H, eta);
- float NL = -dot(N, L);
+ vec3 L = refract(-V, H, eta);
+ float NL = -L.z;
- if ((NL > 0.0) && (g > 0.0)) {
- float LH = dot(L, H);
+ if ((NL > 0.0) && (fresnel < 0.999)) {
+ float LH = dot(L, H);
- float G1_l = NL * 2.0 /
- G1_Smith_GGX(NL, a2); /* Balancing the adjustments made in G1_Smith */
+ /* Balancing the adjustments made in G1_Smith. */
+ float G1_l = NL * 2.0 / G1_Smith_GGX(NL, a2);
- /* btdf = abs(VH*LH) * (ior*ior) * D * G(V) * G(L) / (Ht2 * NV)
- * pdf = (VH * abs(LH)) * (ior*ior) * D * G(V) / (Ht2 * NV) */
- float btdf = G1_l * abs(VH * LH) / (VH * abs(LH));
+ /* btdf = abs(VH*LH) * (ior*ior) * D * G(V) * G(L) / (Ht2 * NV)
+ * pdf = (VH * abs(LH)) * (ior*ior) * D * G(V) / (Ht2 * NV) */
+ float btdf = G1_l * abs(VH * LH) / (VH * abs(LH));
- btdf_accum += btdf;
+ btdf_accum += btdf;
+ }
}
}
- btdf_accum /= sampleCount;
+ btdf_accum /= sampleCount * sampleCount;
+ fresnel_accum /= sampleCount * sampleCount;
+
+ if (z == 0.0) {
+ /* Perfect mirror. Increased precision because the roughness is clamped. */
+ fresnel_accum = F_eta(ior, NV);
+ }
+
+ if (x == 0.0) {
+ /* Special case. */
+ fresnel_accum = 1.0;
+ btdf_accum = 0.0;
+ }
- FragColor = vec4(btdf_accum, 0.0, 0.0, 1.0);
+ /* There is place to put multiscater result (which is a little bit different still)
+ * and / or lobe fitting for better sampling of */
+ FragColor = vec4(btdf_accum, fresnel_accum, 0.0, 1.0);
}
diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl
new file mode 100644
index 00000000000..c5996f5160a
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl
@@ -0,0 +1,87 @@
+#pragma BLENDER_REQUIRE(lights_lib.glsl)
+#pragma BLENDER_REQUIRE(lightprobe_lib.glsl)
+#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl)
+
+struct ClosureInputDiffuse {
+ vec3 N; /** Shading normal. */
+ vec3 albedo; /** Used for multibounce GTAO approximation. Not applied to final radiance. */
+};
+
+#define CLOSURE_INPUT_Diffuse_DEFAULT ClosureInputDiffuse(vec3(0.0), vec3(0.0))
+
+struct ClosureEvalDiffuse {
+ vec3 probe_sampling_dir; /** Direction to sample probes from. */
+ float ambient_occlusion; /** Final occlusion for distant lighting. */
+};
+
+/* Stubs. */
+#define ClosureOutputDiffuse ClosureOutput
+#define closure_Diffuse_planar_eval(cl_in, cl_eval, cl_common, data, cl_out)
+#define closure_Diffuse_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out)
+
+ClosureEvalDiffuse closure_Diffuse_eval_init(inout ClosureInputDiffuse cl_in,
+ ClosureEvalCommon cl_common,
+ out ClosureOutputDiffuse cl_out)
+{
+ cl_in.N = safe_normalize(cl_in.N);
+ cl_out.radiance = vec3(0.0);
+
+ ClosureEvalDiffuse cl_eval;
+ cl_eval.ambient_occlusion = diffuse_occlusion(cl_common.occlusion_data,
+ cl_common.V,
+ cl_in.N,
+ cl_common.Ng,
+ cl_in.albedo,
+ cl_eval.probe_sampling_dir);
+ return cl_eval;
+}
+
+void closure_Diffuse_light_eval(ClosureInputDiffuse cl_in,
+ ClosureEvalDiffuse cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosureLightData light,
+ inout ClosureOutputDiffuse cl_out)
+{
+ float radiance = light_diffuse(light.data, cl_in.N, cl_common.V, light.L);
+ /* TODO(fclem) We could try to shadow lights that are shadowless with the ambient_occlusion
+ * factor here. */
+ cl_out.radiance += light.data.l_color * (light.vis * light.contact_shadow * radiance);
+}
+
+void closure_Diffuse_grid_eval(ClosureInputDiffuse cl_in,
+ ClosureEvalDiffuse cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosureGridData grid,
+ inout ClosureOutputDiffuse cl_out)
+{
+ vec3 probe_radiance = probe_evaluate_grid(
+ grid.data, cl_common.P, cl_eval.probe_sampling_dir, grid.local_pos);
+ cl_out.radiance += grid.attenuation * probe_radiance;
+}
+
+void closure_Diffuse_indirect_end(ClosureInputDiffuse cl_in,
+ ClosureEvalDiffuse cl_eval,
+ ClosureEvalCommon cl_common,
+ inout ClosureOutputDiffuse cl_out)
+{
+ /* If not enough light has been accumulated from probes, use the world specular cubemap
+ * to fill the remaining energy needed. */
+ if (cl_common.diffuse_accum > 0.0) {
+ vec3 probe_radiance = probe_evaluate_world_diff(cl_eval.probe_sampling_dir);
+ cl_out.radiance += cl_common.diffuse_accum * probe_radiance;
+ }
+ /* Apply occlusion on radiance before the light loop. */
+ cl_out.radiance *= cl_eval.ambient_occlusion;
+}
+
+void closure_Diffuse_eval_end(ClosureInputDiffuse cl_in,
+ ClosureEvalDiffuse cl_eval,
+ ClosureEvalCommon cl_common,
+ inout ClosureOutputDiffuse cl_out)
+{
+#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND)
+ /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */
+ cl_out.radiance = vec3(0.0);
+ return;
+#endif
+}
diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl
new file mode 100644
index 00000000000..5c10a7f451f
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl
@@ -0,0 +1,140 @@
+
+#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
+#pragma BLENDER_REQUIRE(lights_lib.glsl)
+#pragma BLENDER_REQUIRE(lightprobe_lib.glsl)
+#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl)
+
+struct ClosureInputGlossy {
+ vec3 N; /** Shading normal. */
+ float roughness; /** Input roughness, not squared. */
+};
+
+#define CLOSURE_INPUT_Glossy_DEFAULT ClosureInputGlossy(vec3(0.0), 0.0)
+
+struct ClosureEvalGlossy {
+ vec4 ltc_mat; /** LTC matrix values. */
+ float ltc_brdf_scale; /** LTC BRDF scaling. */
+ vec3 probe_sampling_dir; /** Direction to sample probes from. */
+ float spec_occlusion; /** Specular Occlusion. */
+ vec3 raytrace_radiance; /** Raytrace reflection to be accumulated after occlusion. */
+};
+
+/* Stubs. */
+#define ClosureOutputGlossy ClosureOutput
+#define closure_Glossy_grid_eval(cl_in, cl_eval, cl_common, data, cl_out)
+
+#ifdef STEP_RESOLVE /* SSR */
+/* Prototype. */
+void raytrace_resolve(ClosureInputGlossy cl_in,
+ inout ClosureEvalGlossy cl_eval,
+ inout ClosureEvalCommon cl_common,
+ inout ClosureOutputGlossy cl_out);
+#endif
+
+ClosureEvalGlossy closure_Glossy_eval_init(inout ClosureInputGlossy cl_in,
+ inout ClosureEvalCommon cl_common,
+ out ClosureOutputGlossy cl_out)
+{
+ cl_in.N = safe_normalize(cl_in.N);
+ cl_in.roughness = clamp(cl_in.roughness, 1e-8, 0.9999);
+ cl_out.radiance = vec3(0.0);
+
+ float NV = dot(cl_in.N, cl_common.V);
+ vec2 lut_uv = lut_coords(NV, cl_in.roughness);
+
+ ClosureEvalGlossy cl_eval;
+ cl_eval.ltc_mat = texture(utilTex, vec3(lut_uv, LTC_MAT_LAYER));
+ cl_eval.probe_sampling_dir = specular_dominant_dir(cl_in.N, cl_common.V, sqr(cl_in.roughness));
+ cl_eval.spec_occlusion = specular_occlusion(cl_common.occlusion_data,
+ cl_common.V,
+ cl_common.N,
+ cl_in.roughness,
+ cl_eval.probe_sampling_dir);
+ cl_eval.raytrace_radiance = vec3(0.0);
+
+#ifdef STEP_RESOLVE /* SSR */
+ raytrace_resolve(cl_in, cl_eval, cl_common, cl_out);
+#endif
+
+ /* The brdf split sum LUT is applied after the radiance accumulation.
+ * Correct the LTC so that its energy is constant. */
+ /* TODO(fclem) Optimize this so that only one scale factor is stored. */
+ vec4 ltc_brdf = texture(utilTex, vec3(lut_uv, LTC_BRDF_LAYER)).barg;
+ vec2 split_sum_brdf = ltc_brdf.zw;
+ cl_eval.ltc_brdf_scale = (ltc_brdf.x + ltc_brdf.y) / (split_sum_brdf.x + split_sum_brdf.y);
+ return cl_eval;
+}
+
+void closure_Glossy_light_eval(ClosureInputGlossy cl_in,
+ ClosureEvalGlossy cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosureLightData light,
+ inout ClosureOutputGlossy cl_out)
+{
+ float radiance = light_specular(light.data, cl_eval.ltc_mat, cl_in.N, cl_common.V, light.L);
+ radiance *= cl_eval.ltc_brdf_scale;
+ cl_out.radiance += light.data.l_color *
+ (light.data.l_spec * light.vis * light.contact_shadow * radiance);
+}
+
+void closure_Glossy_planar_eval(ClosureInputGlossy cl_in,
+ ClosureEvalGlossy cl_eval,
+ inout ClosureEvalCommon cl_common,
+ ClosurePlanarData planar,
+ inout ClosureOutputGlossy cl_out)
+{
+#ifndef STEP_RESOLVE /* SSR already evaluates planar reflections. */
+ float attenuation = planar.attenuation * probe_attenuation_planar_normal_roughness(
+ planar.data, cl_in.N, cl_in.roughness);
+
+ vec3 probe_radiance = probe_evaluate_planar(
+ planar.id, planar.data, cl_common.P, cl_in.N, cl_common.V, cl_in.roughness);
+
+ cl_out.radiance = mix(cl_out.radiance, probe_radiance, attenuation);
+#endif
+}
+
+void closure_Glossy_cubemap_eval(ClosureInputGlossy cl_in,
+ ClosureEvalGlossy cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosureCubemapData cube,
+ inout ClosureOutputGlossy cl_out)
+{
+ vec3 probe_radiance = probe_evaluate_cube(
+ cube.id, cl_common.P, cl_eval.probe_sampling_dir, cl_in.roughness);
+ cl_out.radiance += cube.attenuation * probe_radiance;
+}
+
+void closure_Glossy_indirect_end(ClosureInputGlossy cl_in,
+ ClosureEvalGlossy cl_eval,
+ ClosureEvalCommon cl_common,
+ inout ClosureOutputGlossy cl_out)
+{
+ /* If not enough light has been accumulated from probes, use the world specular cubemap
+ * to fill the remaining energy needed. */
+ if (specToggle && cl_common.specular_accum > 0.0) {
+ vec3 probe_radiance = probe_evaluate_world_spec(cl_eval.probe_sampling_dir, cl_in.roughness);
+ cl_out.radiance += cl_common.specular_accum * probe_radiance;
+ }
+
+ /* Apply occlusion on distant lighting. */
+ cl_out.radiance *= cl_eval.spec_occlusion;
+ /* Apply Raytrace reflections after occlusion since they are direct, local reflections. */
+ cl_out.radiance += cl_eval.raytrace_radiance;
+}
+
+void closure_Glossy_eval_end(ClosureInputGlossy cl_in,
+ ClosureEvalGlossy cl_eval,
+ ClosureEvalCommon cl_common,
+ inout ClosureOutputGlossy cl_out)
+{
+#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND)
+ /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */
+ cl_out.radiance = vec3(0.0);
+ return;
+#endif
+
+ if (!specToggle) {
+ cl_out.radiance = vec3(0.0);
+ }
+}
diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl
new file mode 100644
index 00000000000..93492762bbe
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl
@@ -0,0 +1,324 @@
+
+#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
+#pragma BLENDER_REQUIRE(lights_lib.glsl)
+#pragma BLENDER_REQUIRE(lightprobe_lib.glsl)
+
+/**
+ * Extensive use of Macros to be able to change the maximum amount of evaluated closure easily.
+ * NOTE: GLSL does not support variadic macros.
+ *
+ * Example
+ * // Declare the cl_eval function
+ * CLOSURE_EVAL_FUNCTION_DECLARE_3(name, Diffuse, Glossy, Refraction);
+ * // Declare the inputs & outputs
+ * CLOSURE_VARS_DECLARE(Diffuse, Glossy, Refraction);
+ * // Specify inputs
+ * in_Diffuse_0.N = N;
+ * ...
+ * // Call the cl_eval function
+ * CLOSURE_EVAL_FUNCTION_3(name, Diffuse, Glossy, Refraction);
+ * // Get the cl_out
+ * closure.radiance = out_Diffuse_0.radiance + out_Glossy_1.radiance + out_Refraction_2.radiance;
+ **/
+
+#define CLOSURE_VARS_DECLARE(t0, t1, t2, t3) \
+ ClosureInputCommon in_common = CLOSURE_INPUT_COMMON_DEFAULT; \
+ ClosureInput##t0 in_##t0##_0 = CLOSURE_INPUT_##t0##_DEFAULT; \
+ ClosureInput##t1 in_##t1##_1 = CLOSURE_INPUT_##t1##_DEFAULT; \
+ ClosureInput##t2 in_##t2##_2 = CLOSURE_INPUT_##t2##_DEFAULT; \
+ ClosureInput##t3 in_##t3##_3 = CLOSURE_INPUT_##t3##_DEFAULT; \
+ ClosureOutput##t0 out_##t0##_0; \
+ ClosureOutput##t1 out_##t1##_1; \
+ ClosureOutput##t2 out_##t2##_2; \
+ ClosureOutput##t3 out_##t3##_3;
+
+#define CLOSURE_EVAL_DECLARE(t0, t1, t2, t3) \
+ ClosureEvalCommon cl_common = closure_Common_eval_init(in_common); \
+ ClosureEval##t0 eval_##t0##_0 = closure_##t0##_eval_init(in_##t0##_0, cl_common, out_##t0##_0); \
+ ClosureEval##t1 eval_##t1##_1 = closure_##t1##_eval_init(in_##t1##_1, cl_common, out_##t1##_1); \
+ ClosureEval##t2 eval_##t2##_2 = closure_##t2##_eval_init(in_##t2##_2, cl_common, out_##t2##_2); \
+ ClosureEval##t3 eval_##t3##_3 = closure_##t3##_eval_init(in_##t3##_3, cl_common, out_##t3##_3);
+
+#define CLOSURE_META_SUBROUTINE(subroutine, t0, t1, t2, t3) \
+ closure_##t0##_##subroutine(in_##t0##_0, eval_##t0##_0, cl_common, out_##t0##_0); \
+ closure_##t1##_##subroutine(in_##t1##_1, eval_##t1##_1, cl_common, out_##t1##_1); \
+ closure_##t2##_##subroutine(in_##t2##_2, eval_##t2##_2, cl_common, out_##t2##_2); \
+ closure_##t3##_##subroutine(in_##t3##_3, eval_##t3##_3, cl_common, out_##t3##_3);
+
+#define CLOSURE_META_SUBROUTINE_DATA(subroutine, sub_data, t0, t1, t2, t3) \
+ closure_##t0##_##subroutine(in_##t0##_0, eval_##t0##_0, cl_common, sub_data, out_##t0##_0); \
+ closure_##t1##_##subroutine(in_##t1##_1, eval_##t1##_1, cl_common, sub_data, out_##t1##_1); \
+ closure_##t2##_##subroutine(in_##t2##_2, eval_##t2##_2, cl_common, sub_data, out_##t2##_2); \
+ closure_##t3##_##subroutine(in_##t3##_3, eval_##t3##_3, cl_common, sub_data, out_##t3##_3);
+
+/* Inputs are inout so that callers can get the final inputs used for evaluation. */
+#define CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, t3) \
+ void closure_##name##_eval(ClosureInputCommon in_common, \
+ inout ClosureInput##t0 in_##t0##_0, \
+ inout ClosureInput##t1 in_##t1##_1, \
+ inout ClosureInput##t2 in_##t2##_2, \
+ inout ClosureInput##t3 in_##t3##_3, \
+ out ClosureOutput##t0 out_##t0##_0, \
+ out ClosureOutput##t1 out_##t1##_1, \
+ out ClosureOutput##t2 out_##t2##_2, \
+ out ClosureOutput##t3 out_##t3##_3) \
+ { \
+ CLOSURE_EVAL_DECLARE(t0, t1, t2, t3); \
+\
+ /* Starts at 1 because 0 is world cubemap. */ \
+ for (int i = 1; cl_common.specular_accum > 0.0 && i < prbNumRenderCube && i < MAX_PROBE; \
+ i++) { \
+ ClosureCubemapData cube = closure_cubemap_eval_init(i, cl_common); \
+ if (cube.attenuation > 1e-8) { \
+ CLOSURE_META_SUBROUTINE_DATA(cubemap_eval, cube, t0, t1, t2, t3); \
+ } \
+ } \
+\
+ /* Starts at 1 because 0 is world irradiance. */ \
+ for (int i = 1; cl_common.diffuse_accum > 0.0 && i < prbNumRenderGrid && i < MAX_GRID; i++) { \
+ ClosureGridData grid = closure_grid_eval_init(i, cl_common); \
+ if (grid.attenuation > 1e-8) { \
+ CLOSURE_META_SUBROUTINE_DATA(grid_eval, grid, t0, t1, t2, t3); \
+ } \
+ } \
+\
+ CLOSURE_META_SUBROUTINE(indirect_end, t0, t1, t2, t3); \
+\
+ ClosurePlanarData planar = closure_planar_eval_init(cl_common); \
+ if (planar.attenuation > 1e-8) { \
+ CLOSURE_META_SUBROUTINE_DATA(planar_eval, planar, t0, t1, t2, t3); \
+ } \
+\
+ for (int i = 0; i < laNumLight && i < MAX_LIGHT; i++) { \
+ ClosureLightData light = closure_light_eval_init(cl_common, i); \
+ if (light.vis > 1e-8) { \
+ CLOSURE_META_SUBROUTINE_DATA(light_eval, light, t0, t1, t2, t3); \
+ } \
+ } \
+\
+ CLOSURE_META_SUBROUTINE(eval_end, t0, t1, t2, t3); \
+ }
+
+#define CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, t3) \
+ closure_##name##_eval(in_common, \
+ in_##t0##_0, \
+ in_##t1##_1, \
+ in_##t2##_2, \
+ in_##t3##_3, \
+ out_##t0##_0, \
+ out_##t1##_1, \
+ out_##t2##_2, \
+ out_##t3##_3)
+
+#define CLOSURE_EVAL_FUNCTION_DECLARE_1(name, t0) \
+ CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, Dummy, Dummy, Dummy)
+#define CLOSURE_EVAL_FUNCTION_DECLARE_2(name, t0, t1) \
+ CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, Dummy, Dummy)
+#define CLOSURE_EVAL_FUNCTION_DECLARE_3(name, t0, t1, t2) \
+ CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, Dummy)
+#define CLOSURE_EVAL_FUNCTION_DECLARE_4(name, t0, t1, t2, t3) \
+ CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, t3)
+
+#define CLOSURE_VARS_DECLARE_1(t0) CLOSURE_VARS_DECLARE(t0, Dummy, Dummy, Dummy)
+#define CLOSURE_VARS_DECLARE_2(t0, t1) CLOSURE_VARS_DECLARE(t0, t1, Dummy, Dummy)
+#define CLOSURE_VARS_DECLARE_3(t0, t1, t2) CLOSURE_VARS_DECLARE(t0, t1, t2, Dummy)
+#define CLOSURE_VARS_DECLARE_4(t0, t1, t2, t3) CLOSURE_VARS_DECLARE(t0, t1, t2, t3)
+
+#define CLOSURE_EVAL_FUNCTION_1(name, t0) CLOSURE_EVAL_FUNCTION(name, t0, Dummy, Dummy, Dummy)
+#define CLOSURE_EVAL_FUNCTION_2(name, t0, t1) CLOSURE_EVAL_FUNCTION(name, t0, t1, Dummy, Dummy)
+#define CLOSURE_EVAL_FUNCTION_3(name, t0, t1, t2) CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, Dummy)
+#define CLOSURE_EVAL_FUNCTION_4(name, t0, t1, t2, t3) CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, t3)
+
+/* -------------------------------------------------------------------- */
+/** \name Dummy Closure
+ *
+ * Dummy closure type that will be optimized out by the compiler.
+ * \{ */
+
+#define ClosureInputDummy ClosureOutput
+#define ClosureOutputDummy ClosureOutput
+#define ClosureEvalDummy ClosureOutput
+#define CLOSURE_EVAL_DUMMY ClosureOutput(vec3(0))
+#define CLOSURE_INPUT_Dummy_DEFAULT CLOSURE_EVAL_DUMMY
+#define closure_Dummy_eval_init(cl_in, cl_common, cl_out) CLOSURE_EVAL_DUMMY
+#define closure_Dummy_planar_eval(cl_in, cl_eval, cl_common, data, cl_out)
+#define closure_Dummy_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out)
+#define closure_Dummy_grid_eval(cl_in, cl_eval, cl_common, data, cl_out)
+#define closure_Dummy_indirect_end(cl_in, cl_eval, cl_common, cl_out)
+#define closure_Dummy_light_eval(cl_in, cl_eval, cl_common, data, cl_out)
+#define closure_Dummy_eval_end(cl_in, cl_eval, cl_common, cl_out)
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Common cl_eval data
+ *
+ * Eval data not dependant on input parameters. All might not be used but unused ones
+ * will be optimized out.
+ * \{ */
+
+struct ClosureInputCommon {
+ /** Custom occlusion value set by the user. */
+ float occlusion;
+};
+
+#define CLOSURE_INPUT_COMMON_DEFAULT ClosureInputCommon(1.0)
+
+struct ClosureEvalCommon {
+ /** Result of SSAO. */
+ OcclusionData occlusion_data;
+ /** View vector. */
+ vec3 V;
+ /** Surface position. */
+ vec3 P;
+ /** Normal vector, always facing camera. */
+ vec3 N;
+ /** Normal vector, always facing camera. (viewspace) */
+ vec3 vN;
+ /** Surface position. (viewspace) */
+ vec3 vP;
+ /** Geometric normal, always facing camera. */
+ vec3 Ng;
+ /** Geometric normal, always facing camera. (viewspace) */
+ vec3 vNg;
+ /** Random numbers. 3 random sequences. zw is a random point on a circle. */
+ vec4 rand;
+ /** Specular probe accumulator. Shared between planar and cubemap probe. */
+ float specular_accum;
+ /** Diffuse probe accumulator. */
+ float diffuse_accum;
+ /** Viewspace depth to start raytracing from. */
+ float tracing_depth;
+};
+
+/* Common cl_out struct used by most closures. */
+struct ClosureOutput {
+ vec3 radiance;
+};
+
+/* Workaround for screenspace shadows in SSR pass. */
+float FragDepth;
+
+ClosureEvalCommon closure_Common_eval_init(ClosureInputCommon cl_in)
+{
+ ClosureEvalCommon cl_eval;
+ cl_eval.rand = texelfetch_noise_tex(gl_FragCoord.xy);
+ cl_eval.V = cameraVec(worldPosition);
+ cl_eval.P = worldPosition;
+ cl_eval.N = safe_normalize(gl_FrontFacing ? worldNormal : -worldNormal);
+ cl_eval.vN = safe_normalize(gl_FrontFacing ? viewNormal : -viewNormal);
+ cl_eval.vP = viewPosition;
+ cl_eval.Ng = safe_normalize(cross(dFdx(cl_eval.P), dFdy(cl_eval.P)));
+ cl_eval.vNg = transform_direction(ViewMatrix, cl_eval.Ng);
+ /* TODO(fclem) See if we can avoid this complicated setup. */
+#ifdef STEP_RESOLVE /* SSR */
+ cl_eval.tracing_depth = FragDepth;
+#else
+ cl_eval.tracing_depth = gl_FragCoord.z;
+#endif
+ /* Constant bias (due to depth buffer precision) */
+ /* Magic numbers for 24bits of precision.
+ * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */
+ cl_eval.tracing_depth -= mix(2.4e-7, 4.8e-7, cl_eval.tracing_depth);
+ /* Convert to view Z. */
+ cl_eval.tracing_depth = get_view_z_from_depth(cl_eval.tracing_depth);
+
+ cl_eval.occlusion_data = occlusion_load(cl_eval.vP, cl_in.occlusion);
+
+ cl_eval.specular_accum = 1.0;
+ cl_eval.diffuse_accum = 1.0;
+ return cl_eval;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Loop data
+ *
+ * Loop datas are conveniently packed into struct to make it future proof.
+ * \{ */
+
+struct ClosureLightData {
+ LightData data; /** Light Data. */
+ vec4 L; /** Non-Normalized Light Vector (surface to light) with length in W component. */
+ float vis; /** Light visibility. */
+ float contact_shadow; /** Result of contact shadow tracing. */
+};
+
+ClosureLightData closure_light_eval_init(ClosureEvalCommon cl_common, int light_id)
+{
+ ClosureLightData light;
+ light.data = lights_data[light_id];
+
+ light.L.xyz = light.data.l_position - cl_common.P;
+ light.L.w = length(light.L.xyz);
+
+ light.vis = light_visibility(light.data, cl_common.P, light.L);
+ light.contact_shadow = light_contact_shadows(light.data,
+ cl_common.P,
+ cl_common.vP,
+ cl_common.tracing_depth,
+ cl_common.vNg,
+ cl_common.rand.x,
+ light.vis);
+
+ return light;
+}
+
+struct ClosureCubemapData {
+ int id; /** Probe id. */
+ float attenuation; /** Attenuation. */
+};
+
+ClosureCubemapData closure_cubemap_eval_init(int cube_id, inout ClosureEvalCommon cl_common)
+{
+ ClosureCubemapData cube;
+ cube.id = cube_id;
+ cube.attenuation = probe_attenuation_cube(cube_id, cl_common.P);
+ cube.attenuation = min(cube.attenuation, cl_common.specular_accum);
+ cl_common.specular_accum -= cube.attenuation;
+ return cube;
+}
+
+struct ClosurePlanarData {
+ int id; /** Probe id. */
+ PlanarData data; /** planars_data[id]. */
+ float attenuation; /** Attenuation. */
+};
+
+ClosurePlanarData closure_planar_eval_init(inout ClosureEvalCommon cl_common)
+{
+ ClosurePlanarData planar;
+ planar.attenuation = 0.0;
+
+ /* Find planar with the maximum weight. TODO(fclem) */
+ for (int i = 0; i < prbNumPlanar && i < MAX_PLANAR; i++) {
+ float attenuation = probe_attenuation_planar(planars_data[i], cl_common.P);
+ if (attenuation > planar.attenuation) {
+ planar.id = i;
+ planar.attenuation = attenuation;
+ planar.data = planars_data[i];
+ }
+ }
+ return planar;
+}
+
+struct ClosureGridData {
+ int id; /** Grid id. */
+ GridData data; /** grids_data[id] */
+ float attenuation; /** Attenuation. */
+ vec3 local_pos; /** Local position inside the grid. */
+};
+
+ClosureGridData closure_grid_eval_init(int id, inout ClosureEvalCommon cl_common)
+{
+ ClosureGridData grid;
+ grid.id = id;
+ grid.data = grids_data[id];
+ grid.attenuation = probe_attenuation_grid(grid.data, cl_common.P, grid.local_pos);
+ grid.attenuation = min(grid.attenuation, cl_common.diffuse_accum);
+ cl_common.diffuse_accum -= grid.attenuation;
+ return grid;
+}
+
+/** \} */
diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl
new file mode 100644
index 00000000000..9011eea07c4
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl
@@ -0,0 +1,128 @@
+
+#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
+#pragma BLENDER_REQUIRE(lights_lib.glsl)
+#pragma BLENDER_REQUIRE(lightprobe_lib.glsl)
+#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl)
+#pragma BLENDER_REQUIRE(ssr_lib.glsl)
+
+struct ClosureInputRefraction {
+ vec3 N; /** Shading normal. */
+ float roughness; /** Input roughness, not squared. */
+ float ior; /** Index of refraction ratio. */
+};
+
+#define CLOSURE_INPUT_Refraction_DEFAULT ClosureInputRefraction(vec3(0.0), 0.0, 0.0)
+
+struct ClosureEvalRefraction {
+ vec3 P; /** LTC matrix values. */
+ vec3 ltc_brdf; /** LTC BRDF values. */
+ vec3 probe_sampling_dir; /** Direction to sample probes from. */
+ float probes_weight; /** Factor to apply to probe radiance. */
+};
+
+/* Stubs. */
+#define ClosureOutputRefraction ClosureOutput
+#define closure_Refraction_grid_eval(cl_in, cl_eval, cl_common, data, cl_out)
+
+ClosureEvalRefraction closure_Refraction_eval_init(inout ClosureInputRefraction cl_in,
+ ClosureEvalCommon cl_common,
+ out ClosureOutputRefraction cl_out)
+{
+ cl_in.N = safe_normalize(cl_in.N);
+ cl_in.roughness = clamp(cl_in.roughness, 1e-8, 0.9999);
+ cl_in.ior = max(cl_in.ior, 1e-5);
+ cl_out.radiance = vec3(0.0);
+
+ ClosureEvalRefraction cl_eval;
+ vec3 cl_V;
+ float eval_ior;
+ /* Refract the view vector using the depth heuristic.
+ * Then later Refract a second time the already refracted
+ * ray using the inverse ior. */
+ if (refractionDepth > 0.0) {
+ eval_ior = 1.0 / cl_in.ior;
+ cl_V = -refract(-cl_common.V, cl_in.N, eval_ior);
+ vec3 plane_pos = cl_common.P - cl_in.N * refractionDepth;
+ cl_eval.P = line_plane_intersect(cl_common.P, cl_V, plane_pos, cl_in.N);
+ }
+ else {
+ eval_ior = cl_in.ior;
+ cl_V = cl_common.V;
+ cl_eval.P = cl_common.P;
+ }
+
+ cl_eval.probe_sampling_dir = refraction_dominant_dir(cl_in.N, cl_V, cl_in.roughness, eval_ior);
+ cl_eval.probes_weight = 1.0;
+
+#ifdef USE_REFRACTION
+ if (ssrefractToggle && cl_in.roughness < ssrMaxRoughness + 0.2) {
+ /* Find approximated position of the 2nd refraction event. */
+ vec3 vP = (refractionDepth > 0.0) ? transform_point(ViewMatrix, cl_eval.P) : cl_common.vP;
+ vec4 ssr_output = screen_space_refraction(
+ vP, cl_in.N, cl_V, eval_ior, sqr(cl_in.roughness), cl_common.rand);
+ ssr_output.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, cl_in.roughness);
+ cl_out.radiance += ssr_output.rgb * ssr_output.a;
+ cl_eval.probes_weight -= ssr_output.a;
+ }
+#endif
+ return cl_eval;
+}
+
+void closure_Refraction_light_eval(ClosureInputRefraction cl_in,
+ ClosureEvalRefraction cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosureLightData light,
+ inout ClosureOutputRefraction cl_out)
+{
+ /* Not implemented yet. */
+}
+
+void closure_Refraction_planar_eval(ClosureInputRefraction cl_in,
+ ClosureEvalRefraction cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosurePlanarData planar,
+ inout ClosureOutputRefraction cl_out)
+{
+ /* Not implemented yet. */
+}
+
+void closure_Refraction_cubemap_eval(ClosureInputRefraction cl_in,
+ ClosureEvalRefraction cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosureCubemapData cube,
+ inout ClosureOutputRefraction cl_out)
+{
+ vec3 probe_radiance = probe_evaluate_cube(
+ cube.id, cl_eval.P, cl_eval.probe_sampling_dir, sqr(cl_in.roughness));
+ cl_out.radiance += (cube.attenuation * cl_eval.probes_weight) * probe_radiance;
+}
+
+void closure_Refraction_indirect_end(ClosureInputRefraction cl_in,
+ ClosureEvalRefraction cl_eval,
+ ClosureEvalCommon cl_common,
+ inout ClosureOutputRefraction cl_out)
+{
+ /* If not enough light has been accumulated from probes, use the world specular cubemap
+ * to fill the remaining energy needed. */
+ if (specToggle && cl_common.specular_accum > 0.0) {
+ vec3 probe_radiance = probe_evaluate_world_spec(cl_eval.probe_sampling_dir,
+ sqr(cl_in.roughness));
+ cl_out.radiance += (cl_common.specular_accum * cl_eval.probes_weight) * probe_radiance;
+ }
+}
+
+void closure_Refraction_eval_end(ClosureInputRefraction cl_in,
+ ClosureEvalRefraction cl_eval,
+ ClosureEvalCommon cl_common,
+ inout ClosureOutputRefraction cl_out)
+{
+#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND)
+ /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */
+ cl_out.radiance = vec3(0.0);
+ return;
+#endif
+
+ if (!specToggle) {
+ cl_out.radiance = vec3(0.0);
+ }
+}
diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl
new file mode 100644
index 00000000000..66c467af29b
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl
@@ -0,0 +1,71 @@
+
+#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
+#pragma BLENDER_REQUIRE(lights_lib.glsl)
+#pragma BLENDER_REQUIRE(lightprobe_lib.glsl)
+#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl)
+
+struct ClosureInputTranslucent {
+ vec3 N; /** Shading normal. */
+};
+
+#define CLOSURE_INPUT_Translucent_DEFAULT ClosureInputTranslucent(vec3(0.0))
+
+/* Stubs. */
+#define ClosureEvalTranslucent ClosureEvalDummy
+#define ClosureOutputTranslucent ClosureOutput
+#define closure_Translucent_planar_eval(cl_in, cl_eval, cl_common, data, cl_out)
+#define closure_Translucent_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out)
+
+ClosureEvalTranslucent closure_Translucent_eval_init(inout ClosureInputTranslucent cl_in,
+ ClosureEvalCommon cl_common,
+ out ClosureOutputTranslucent cl_out)
+{
+ cl_in.N = safe_normalize(cl_in.N);
+ cl_out.radiance = vec3(0.0);
+ return CLOSURE_EVAL_DUMMY;
+}
+
+void closure_Translucent_light_eval(ClosureInputTranslucent cl_in,
+ ClosureEvalTranslucent cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosureLightData light,
+ inout ClosureOutputTranslucent cl_out)
+{
+ float radiance = light_diffuse(light.data, cl_in.N, cl_common.V, light.L);
+ cl_out.radiance += light.data.l_color * (light.vis * radiance);
+}
+
+void closure_Translucent_grid_eval(ClosureInputTranslucent cl_in,
+ ClosureEvalTranslucent cl_eval,
+ ClosureEvalCommon cl_common,
+ ClosureGridData grid,
+ inout ClosureOutputTranslucent cl_out)
+{
+ vec3 probe_radiance = probe_evaluate_grid(grid.data, cl_common.P, cl_in.N, grid.local_pos);
+ cl_out.radiance += grid.attenuation * probe_radiance;
+}
+
+void closure_Translucent_indirect_end(ClosureInputTranslucent cl_in,
+ ClosureEvalTranslucent cl_eval,
+ ClosureEvalCommon cl_common,
+ inout ClosureOutputTranslucent cl_out)
+{
+ /* If not enough light has been accumulated from probes, use the world specular cubemap
+ * to fill the remaining energy needed. */
+ if (cl_common.diffuse_accum > 0.0) {
+ vec3 probe_radiance = probe_evaluate_world_diff(cl_in.N);
+ cl_out.radiance += cl_common.diffuse_accum * probe_radiance;
+ }
+}
+
+void closure_Translucent_eval_end(ClosureInputTranslucent cl_in,
+ ClosureEvalTranslucent cl_eval,
+ ClosureEvalCommon cl_common,
+ inout ClosureOutputTranslucent cl_out)
+{
+#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND)
+ /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */
+ cl_out.radiance = vec3(0.0);
+ return;
+#endif
+}
diff --git a/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl
deleted file mode 100644
index 30ce60f3ec0..00000000000
--- a/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl
+++ /dev/null
@@ -1,545 +0,0 @@
-
-#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
-#pragma BLENDER_REQUIRE(lightprobe_lib.glsl)
-#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl)
-#pragma BLENDER_REQUIRE(ssr_lib.glsl)
-
-/**
- * AUTO CONFIG
- * We include the file multiple times each time with a different configuration.
- * This leads to a lot of deadcode. Better idea would be to only generate the one needed.
- */
-#if !defined(SURFACE_DEFAULT)
-# define SURFACE_DEFAULT
-# define CLOSURE_NAME eevee_closure_default
-# define CLOSURE_DIFFUSE
-# define CLOSURE_GLOSSY
-#endif /* SURFACE_DEFAULT */
-
-#if !defined(SURFACE_DEFAULT_CLEARCOAT) && !defined(CLOSURE_NAME)
-# define SURFACE_DEFAULT_CLEARCOAT
-# define CLOSURE_NAME eevee_closure_default_clearcoat
-# define CLOSURE_DIFFUSE
-# define CLOSURE_GLOSSY
-# define CLOSURE_CLEARCOAT
-#endif /* SURFACE_DEFAULT_CLEARCOAT */
-
-#if !defined(SURFACE_PRINCIPLED) && !defined(CLOSURE_NAME)
-# define SURFACE_PRINCIPLED
-# define CLOSURE_NAME eevee_closure_principled
-# define CLOSURE_DIFFUSE
-# define CLOSURE_GLOSSY
-# define CLOSURE_CLEARCOAT
-# define CLOSURE_REFRACTION
-# define CLOSURE_SUBSURFACE
-#endif /* SURFACE_PRINCIPLED */
-
-#if !defined(SURFACE_CLEARCOAT) && !defined(CLOSURE_NAME)
-# define SURFACE_CLEARCOAT
-# define CLOSURE_NAME eevee_closure_clearcoat
-# define CLOSURE_GLOSSY
-# define CLOSURE_CLEARCOAT
-#endif /* SURFACE_CLEARCOAT */
-
-#if !defined(SURFACE_DIFFUSE) && !defined(CLOSURE_NAME)
-# define SURFACE_DIFFUSE
-# define CLOSURE_NAME eevee_closure_diffuse
-# define CLOSURE_DIFFUSE
-#endif /* SURFACE_DIFFUSE */
-
-#if !defined(SURFACE_SUBSURFACE) && !defined(CLOSURE_NAME)
-# define SURFACE_SUBSURFACE
-# define CLOSURE_NAME eevee_closure_subsurface
-# define CLOSURE_DIFFUSE
-# define CLOSURE_SUBSURFACE
-#endif /* SURFACE_SUBSURFACE */
-
-#if !defined(SURFACE_SKIN) && !defined(CLOSURE_NAME)
-# define SURFACE_SKIN
-# define CLOSURE_NAME eevee_closure_skin
-# define CLOSURE_DIFFUSE
-# define CLOSURE_SUBSURFACE
-# define CLOSURE_GLOSSY
-#endif /* SURFACE_SKIN */
-
-#if !defined(SURFACE_GLOSSY) && !defined(CLOSURE_NAME)
-# define SURFACE_GLOSSY
-# define CLOSURE_NAME eevee_closure_glossy
-# define CLOSURE_GLOSSY
-#endif /* SURFACE_GLOSSY */
-
-#if !defined(SURFACE_REFRACT) && !defined(CLOSURE_NAME)
-# define SURFACE_REFRACT
-# define CLOSURE_NAME eevee_closure_refraction
-# define CLOSURE_REFRACTION
-#endif /* SURFACE_REFRACT */
-
-#if !defined(SURFACE_GLASS) && !defined(CLOSURE_NAME)
-# define SURFACE_GLASS
-# define CLOSURE_NAME eevee_closure_glass
-# define CLOSURE_GLOSSY
-# define CLOSURE_REFRACTION
-#endif /* SURFACE_GLASS */
-
-/* Safety : CLOSURE_CLEARCOAT implies CLOSURE_GLOSSY */
-#ifdef CLOSURE_CLEARCOAT
-# ifndef CLOSURE_GLOSSY
-# define CLOSURE_GLOSSY
-# endif
-#endif /* CLOSURE_CLEARCOAT */
-
-void CLOSURE_NAME(vec3 N
-#ifdef CLOSURE_DIFFUSE
- ,
- vec3 albedo
-#endif
-#ifdef CLOSURE_GLOSSY
- ,
- vec3 f0,
- vec3 f90,
- int ssr_id
-#endif
-#if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION)
- ,
- float roughness
-#endif
-#ifdef CLOSURE_CLEARCOAT
- ,
- vec3 C_N,
- float C_intensity,
- float C_roughness
-#endif
-#if defined(CLOSURE_GLOSSY) || defined(CLOSURE_DIFFUSE)
- ,
- float ao
-#endif
-#ifdef CLOSURE_SUBSURFACE
- ,
- float sss_scale
-#endif
-#ifdef CLOSURE_REFRACTION
- ,
- float ior
-#endif
- ,
- const bool use_contact_shadows
-#ifdef CLOSURE_DIFFUSE
- ,
- out vec3 out_diff
-#endif
-#ifdef CLOSURE_GLOSSY
- ,
- out vec3 out_spec
-#endif
-#ifdef CLOSURE_REFRACTION
- ,
- out vec3 out_refr
-#endif
-#ifdef CLOSURE_GLOSSY
- ,
- out vec3 ssr_spec
-#endif
-)
-{
-#ifdef CLOSURE_DIFFUSE
- out_diff = vec3(0.0);
-#endif
-
-#ifdef CLOSURE_GLOSSY
- out_spec = vec3(0.0);
-#endif
-
-#ifdef CLOSURE_REFRACTION
- out_refr = vec3(0.0);
-#endif
-
-#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND)
- /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */
- return;
-#else
-
- /* Zero length vectors cause issues, see: T51979. */
- float len = length(N);
- if (isnan(len)) {
- return;
- }
- N /= len;
-
-# ifdef CLOSURE_CLEARCOAT
- len = length(C_N);
- if (isnan(len)) {
- return;
- }
- C_N /= len;
-# endif
-
-# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION)
- roughness = clamp(roughness, 1e-8, 0.9999);
- float roughnessSquared = roughness * roughness;
-# endif
-
-# ifdef CLOSURE_CLEARCOAT
- C_roughness = clamp(C_roughness, 1e-8, 0.9999);
- float C_roughnessSquared = C_roughness * C_roughness;
-# endif
-
- vec3 V = cameraVec;
-
- vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy);
-
- /* ---------------------------------------------------------------- */
- /* -------------------- SCENE LIGHTS LIGHTING --------------------- */
- /* ---------------------------------------------------------------- */
-
-# ifdef CLOSURE_GLOSSY
- vec2 lut_uv = lut_coords_ltc(dot(N, V), roughness);
- vec4 ltc_mat = texture(utilTex, vec3(lut_uv, 0.0)).rgba;
-# endif
-
-# ifdef CLOSURE_CLEARCOAT
- vec2 lut_uv_clear = lut_coords_ltc(dot(C_N, V), C_roughness);
- vec4 ltc_mat_clear = texture(utilTex, vec3(lut_uv_clear, 0.0)).rgba;
- vec3 out_spec_clear = vec3(0.0);
-# endif
-
- float tracing_depth = gl_FragCoord.z;
- /* Constant bias (due to depth buffer precision) */
- /* Magic numbers for 24bits of precision.
- * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */
- tracing_depth -= mix(2.4e-7, 4.8e-7, gl_FragCoord.z);
- /* Convert to view Z. */
- tracing_depth = get_view_z_from_depth(tracing_depth);
-
- vec3 true_normal = normalize(cross(dFdx(viewPosition), dFdy(viewPosition)));
-
- for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) {
- LightData ld = lights_data[i];
-
- vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */
- l_vector.xyz = ld.l_position - worldPosition;
- l_vector.w = length(l_vector.xyz);
-
- float l_vis = light_visibility(ld,
- worldPosition,
- viewPosition,
- tracing_depth,
- true_normal,
- rand.x,
- use_contact_shadows,
- l_vector);
-
- if (l_vis < 1e-8) {
- continue;
- }
-
- vec3 l_color_vis = ld.l_color * l_vis;
-
-# ifdef CLOSURE_DIFFUSE
- out_diff += l_color_vis * light_diffuse(ld, N, V, l_vector);
-# endif
-
-# ifdef CLOSURE_GLOSSY
- out_spec += l_color_vis * light_specular(ld, ltc_mat, N, V, l_vector) * ld.l_spec;
-# endif
-
-# ifdef CLOSURE_CLEARCOAT
- out_spec_clear += l_color_vis * light_specular(ld, ltc_mat_clear, C_N, V, l_vector) *
- ld.l_spec;
-# endif
- }
-
-# ifdef CLOSURE_GLOSSY
- vec2 brdf_lut_lights = texture(utilTex, vec3(lut_uv, 1.0)).ba;
- out_spec *= F_brdf(f0, f90, brdf_lut_lights.xy);
-# endif
-
-# ifdef CLOSURE_CLEARCOAT
- vec2 brdf_lut_lights_clear = texture(utilTex, vec3(lut_uv_clear, 1.0)).ba;
- out_spec_clear *= F_brdf(vec3(0.04), vec3(1.0), brdf_lut_lights_clear.xy);
- out_spec += out_spec_clear * C_intensity;
-# endif
-
- /* ---------------------------------------------------------------- */
- /* ---------------- SPECULAR ENVIRONMENT LIGHTING ----------------- */
- /* ---------------------------------------------------------------- */
-
- /* Accumulate incoming light from all sources until accumulator is full. Then apply Occlusion and
- * BRDF. */
-# ifdef CLOSURE_GLOSSY
- vec4 spec_accum = vec4(0.0);
-# endif
-
-# ifdef CLOSURE_CLEARCOAT
- vec4 C_spec_accum = vec4(0.0);
-# endif
-
-# ifdef CLOSURE_REFRACTION
- vec4 refr_accum = vec4(0.0);
-# endif
-
-# ifdef CLOSURE_GLOSSY
- /* ---------------------------- */
- /* Planar Reflections */
- /* ---------------------------- */
-
- for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar && spec_accum.a < 0.999; i++) {
- PlanarData pd = planars_data[i];
-
- /* Fade on geometric normal. */
- float fade = probe_attenuation_planar(
- pd, worldPosition, (gl_FrontFacing) ? worldNormal : -worldNormal, roughness);
-
- if (fade > 0.0) {
- if (!(ssrToggle && ssr_id == outputSsrId)) {
- vec3 spec = probe_evaluate_planar(float(i), pd, worldPosition, N, V, roughness, fade);
- accumulate_light(spec, fade, spec_accum);
- }
-
-# ifdef CLOSURE_CLEARCOAT
- vec3 C_spec = probe_evaluate_planar(float(i), pd, worldPosition, C_N, V, C_roughness, fade);
- accumulate_light(C_spec, fade, C_spec_accum);
-# endif
- }
- }
-# endif
-
-# ifdef CLOSURE_GLOSSY
- vec3 spec_dir = specular_dominant_dir(N, V, roughnessSquared);
-# endif
-
-# ifdef CLOSURE_CLEARCOAT
- vec3 C_spec_dir = specular_dominant_dir(C_N, V, C_roughnessSquared);
-# endif
-
-# ifdef CLOSURE_REFRACTION
- /* Refract the view vector using the depth heuristic.
- * Then later Refract a second time the already refracted
- * ray using the inverse ior. */
- float final_ior = (refractionDepth > 0.0) ? 1.0 / ior : ior;
- vec3 refr_V = (refractionDepth > 0.0) ? -refract(-V, N, final_ior) : V;
- vec3 refr_pos = (refractionDepth > 0.0) ?
- line_plane_intersect(
- worldPosition, refr_V, worldPosition - N * refractionDepth, N) :
- worldPosition;
- vec3 refr_dir = refraction_dominant_dir(N, refr_V, roughness, final_ior);
-# endif
-
-# ifdef CLOSURE_REFRACTION
-/* ---------------------------- */
-/* Screen Space Refraction */
-/* ---------------------------- */
-# ifdef USE_REFRACTION
- if (ssrefractToggle && roughness < ssrMaxRoughness + 0.2) {
- /* Find approximated position of the 2nd refraction event. */
- vec3 refr_vpos = (refractionDepth > 0.0) ? transform_point(ViewMatrix, refr_pos) :
- viewPosition;
- vec4 trans = screen_space_refraction(refr_vpos, N, refr_V, final_ior, roughnessSquared, rand);
- trans.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness);
- accumulate_light(trans.rgb, trans.a, refr_accum);
- }
-# endif
-
-# endif
-
- /* ---------------------------- */
- /* Specular probes */
- /* ---------------------------- */
-# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION)
-
-# if defined(CLOSURE_GLOSSY) && defined(CLOSURE_REFRACTION)
-# define GLASS_ACCUM 1
-# define ACCUM min(refr_accum.a, spec_accum.a)
-# elif defined(CLOSURE_REFRACTION)
-# define GLASS_ACCUM 0
-# define ACCUM refr_accum.a
-# else
-# define GLASS_ACCUM 0
-# define ACCUM spec_accum.a
-# endif
-
- /* Starts at 1 because 0 is world probe */
- for (int i = 1; ACCUM < 0.999 && i < prbNumRenderCube && i < MAX_PROBE; i++) {
- float fade = probe_attenuation_cube(i, worldPosition);
-
- if (fade > 0.0) {
-
-# if GLASS_ACCUM
- if (spec_accum.a < 0.999) {
-# endif
-# ifdef CLOSURE_GLOSSY
- if (!(ssrToggle && ssr_id == outputSsrId)) {
- vec3 spec = probe_evaluate_cube(i, worldPosition, spec_dir, roughness);
- accumulate_light(spec, fade, spec_accum);
- }
-# endif
-
-# ifdef CLOSURE_CLEARCOAT
- vec3 C_spec = probe_evaluate_cube(i, worldPosition, C_spec_dir, C_roughness);
- accumulate_light(C_spec, fade, C_spec_accum);
-# endif
-# if GLASS_ACCUM
- }
-# endif
-
-# if GLASS_ACCUM
- if (refr_accum.a < 0.999) {
-# endif
-# ifdef CLOSURE_REFRACTION
- vec3 trans = probe_evaluate_cube(i, refr_pos, refr_dir, roughnessSquared);
- accumulate_light(trans, fade, refr_accum);
-# endif
-# if GLASS_ACCUM
- }
-# endif
- }
- }
-
-# undef GLASS_ACCUM
-# undef ACCUM
-
-/* ---------------------------- */
-/* World Probe */
-/* ---------------------------- */
-# ifdef CLOSURE_GLOSSY
- if (spec_accum.a < 0.999) {
- if (!(ssrToggle && ssr_id == outputSsrId)) {
- vec3 spec = probe_evaluate_world_spec(spec_dir, roughness);
- accumulate_light(spec, 1.0, spec_accum);
- }
-
-# ifdef CLOSURE_CLEARCOAT
- vec3 C_spec = probe_evaluate_world_spec(C_spec_dir, C_roughness);
- accumulate_light(C_spec, 1.0, C_spec_accum);
-# endif
- }
-# endif
-
-# ifdef CLOSURE_REFRACTION
- if (refr_accum.a < 0.999) {
- vec3 trans = probe_evaluate_world_spec(refr_dir, roughnessSquared);
- accumulate_light(trans, 1.0, refr_accum);
- }
-# endif
-# endif /* Specular probes */
-
- /* ---------------------------- */
- /* Ambient Occlusion */
- /* ---------------------------- */
-# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_DIFFUSE)
- if (!use_contact_shadows) {
- /* HACK: Fix for translucent BSDF. (see T65631) */
- N = -N;
- }
- vec3 bent_normal;
- float final_ao = occlusion_compute(N, viewPosition, ao, rand, bent_normal);
- if (!use_contact_shadows) {
- N = -N;
- /* Bypass bent normal. */
- bent_normal = N;
- }
-# endif
-
- /* ---------------------------- */
- /* Specular Output */
- /* ---------------------------- */
- float NV = dot(N, V);
-# ifdef CLOSURE_GLOSSY
- vec2 uv = lut_coords(NV, roughness);
- vec2 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rg;
-
- /* This factor is outputted to be used by SSR in order
- * to match the intensity of the regular reflections. */
- ssr_spec = F_brdf(f0, f90, brdf_lut);
- float spec_occlu = specular_occlusion(NV, final_ao, roughness);
-
- /* The SSR pass recompute the occlusion to not apply it to the SSR */
- if (ssrToggle && ssr_id == outputSsrId) {
- spec_occlu = 1.0;
- }
-
- out_spec += spec_accum.rgb * ssr_spec * spec_occlu;
-# endif
-
-# ifdef CLOSURE_REFRACTION
- float btdf = get_btdf_lut(NV, roughness, ior);
-
- out_refr += refr_accum.rgb * btdf;
-
- /* Global toggle for lightprobe baking. */
- out_refr *= float(specToggle);
-# endif
-
-# ifdef CLOSURE_CLEARCOAT
- NV = dot(C_N, V);
- vec2 C_uv = lut_coords(NV, C_roughness);
- vec2 C_brdf_lut = texture(utilTex, vec3(C_uv, 1.0)).rg;
- vec3 C_fresnel = F_brdf(vec3(0.04), vec3(1.0), C_brdf_lut) *
- specular_occlusion(NV, final_ao, C_roughness);
-
- out_spec += C_spec_accum.rgb * C_fresnel * C_intensity;
-# endif
-
-# ifdef CLOSURE_GLOSSY
- /* Global toggle for lightprobe baking. */
- out_spec *= float(specToggle);
-# endif
-
- /* ---------------------------------------------------------------- */
- /* ---------------- DIFFUSE ENVIRONMENT LIGHTING ------------------ */
- /* ---------------------------------------------------------------- */
-
- /* Accumulate light from all sources until accumulator is full. Then apply Occlusion and BRDF. */
-# ifdef CLOSURE_DIFFUSE
- vec4 diff_accum = vec4(0.0);
-
- /* ---------------------------- */
- /* Irradiance Grids */
- /* ---------------------------- */
- /* Start at 1 because 0 is world irradiance */
- for (int i = 1; i < MAX_GRID && i < prbNumRenderGrid && diff_accum.a < 0.999; i++) {
- GridData gd = grids_data[i];
-
- vec3 localpos;
- float fade = probe_attenuation_grid(gd, grids_data[i].localmat, worldPosition, localpos);
-
- if (fade > 0.0) {
- vec3 diff = probe_evaluate_grid(gd, worldPosition, bent_normal, localpos);
- accumulate_light(diff, fade, diff_accum);
- }
- }
-
- /* ---------------------------- */
- /* World Diffuse */
- /* ---------------------------- */
- if (diff_accum.a < 0.999 && prbNumRenderGrid > 0) {
- vec3 diff = probe_evaluate_world_diff(bent_normal);
- accumulate_light(diff, 1.0, diff_accum);
- }
-
- out_diff += diff_accum.rgb * gtao_multibounce(final_ao, albedo);
-# endif
-#endif
-}
-
-/* Cleanup for next configuration */
-#undef CLOSURE_NAME
-
-#ifdef CLOSURE_DIFFUSE
-# undef CLOSURE_DIFFUSE
-#endif
-
-#ifdef CLOSURE_GLOSSY
-# undef CLOSURE_GLOSSY
-#endif
-
-#ifdef CLOSURE_CLEARCOAT
-# undef CLOSURE_CLEARCOAT
-#endif
-
-#ifdef CLOSURE_REFRACTION
-# undef CLOSURE_REFRACTION
-#endif
-
-#ifdef CLOSURE_SUBSURFACE
-# undef CLOSURE_SUBSURFACE
-#endif
diff --git a/source/blender/draw/engines/eevee/shaders/closure_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl
index b56a186ab3f..38ae3972aa7 100644
--- a/source/blender/draw/engines/eevee/shaders/closure_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl
@@ -147,17 +147,27 @@ Closure closure_emission(vec3 rgb)
#ifndef VOLUMETRICS
+/* Let radiance passthrough or replace it to get the BRDF and color
+ * to applied to the SSR result. */
+vec3 closure_mask_ssr_radiance(vec3 radiance, float ssr_id)
+{
+ return (ssrToggle && int(ssr_id) == outputSsrId) ? vec3(1.0) : radiance;
+}
+
void closure_load_ssr_data(
- vec3 ssr_spec, float roughness, vec3 N, vec3 viewVec, int ssr_id, inout Closure cl)
+ vec3 ssr_radiance, float roughness, vec3 N, float ssr_id, inout Closure cl)
{
/* Still encode to avoid artifacts in the SSR pass. */
vec3 vN = normalize(mat3(ViewMatrix) * N);
- cl.ssr_normal = normal_encode(vN, viewVec);
+ cl.ssr_normal = normal_encode(vN, viewCameraVec(viewPosition));
- if (ssr_id == outputSsrId) {
- cl.ssr_data = vec4(ssr_spec, roughness);
+ if (ssrToggle && int(ssr_id) == outputSsrId) {
+ cl.ssr_data = vec4(ssr_radiance, roughness);
cl.flag |= CLOSURE_SSR_FLAG;
}
+ else {
+ cl.radiance += ssr_radiance;
+ }
}
void closure_load_sss_data(
@@ -169,13 +179,11 @@ void closure_load_sss_data(
cl.sss_radius = radius;
cl.sss_albedo = sss_albedo;
cl.flag |= CLOSURE_SSS_FLAG;
- cl.radiance += render_pass_diffuse_mask(sss_albedo, vec3(0));
+ /* Irradiance will be convolved by SSSS pass. Do not add to radiance. */
+ sss_irradiance = vec3(0);
}
- else
# endif
- {
- cl.radiance += render_pass_diffuse_mask(sss_albedo, sss_irradiance * sss_albedo);
- }
+ cl.radiance += render_pass_diffuse_mask(vec3(1), sss_irradiance) * sss_albedo;
}
#endif
diff --git a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl
index 95a585f0d9c..821859b3228 100644
--- a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl
@@ -12,52 +12,95 @@ uniform sampler2DArray utilTex;
#define LUT_SIZE 64
+#define LTC_MAT_LAYER 0
+#define LTC_BRDF_LAYER 1
+#define BRDF_LUT_LAYER 1
+#define NOISE_LAYER 2
+#define LTC_DISK_LAYER 3 /* UNUSED */
+
+/* Layers 4 to 20 are for BTDF Lut. */
+const float lut_btdf_layer_first = 4.0;
+const float lut_btdf_layer_count = 16.0;
+
+/**
+ * Reminder: The 4 noise values are based of 3 uncorrelated blue noises:
+ * x : Uniformly distributed value [0..1] (noise 1).
+ * y : Uniformly distributed value [0..1] (noise 2).
+ * z,w : Uniformly distributed point on the unit circle [-1..1] (noise 3).
+ **/
#define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0)
-/* Return texture coordinates to sample Surface LUT */
-vec2 lut_coords(float cosTheta, float roughness)
+/* Return texture coordinates to sample Surface LUT. */
+vec2 lut_coords(float cos_theta, float roughness)
{
- float theta = acos(cosTheta);
- vec2 coords = vec2(roughness, theta / M_PI_2);
-
+ vec2 coords = vec2(roughness, sqrt(1.0 - cos_theta));
/* scale and bias coordinates, for correct filtered lookup */
return coords * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE;
}
-vec2 lut_coords_ltc(float cosTheta, float roughness)
+/* Returns the GGX split-sum precomputed in LUT. */
+vec2 brdf_lut(float cos_theta, float roughness)
{
- vec2 coords = vec2(roughness, sqrt(1.0 - cosTheta));
-
- /* scale and bias coordinates, for correct filtered lookup */
- return coords * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE;
+ return textureLod(utilTex, vec3(lut_coords(cos_theta, roughness), BRDF_LUT_LAYER), 0.0).rg;
}
-float get_btdf_lut(float NV, float roughness, float ior)
+/* Return texture coordinates to sample Surface LUT. */
+vec3 lut_coords_btdf(float cos_theta, float roughness, float ior)
{
- const vec3 lut_scale_bias_texel_size = vec3((LUT_SIZE - 1.0), 0.5, 1.5) / LUT_SIZE;
+ /* ior is sin of critical angle. */
+ float critical_cos = sqrt(1.0 - ior * ior);
vec3 coords;
- /* Try to compensate for the low resolution and interpolation error. */
- coords.x = (ior > 1.0) ? (0.9 + lut_scale_bias_texel_size.z) +
- (0.1 - lut_scale_bias_texel_size.z) * f0_from_ior(ior) :
- (0.9 + lut_scale_bias_texel_size.z) * ior * ior;
- coords.y = 1.0 - saturate(NV);
- coords.xy *= lut_scale_bias_texel_size.x;
- coords.xy += lut_scale_bias_texel_size.y;
+ coords.x = sqr(ior);
+ coords.y = cos_theta;
+ coords.y -= critical_cos;
+ coords.y /= (coords.y > 0.0) ? (1.0 - critical_cos) : critical_cos;
+ coords.y = coords.y * 0.5 + 0.5;
+ coords.z = roughness;
- const float lut_lvl_ofs = 4.0; /* First texture lvl of roughness. */
- const float lut_lvl_scale = 16.0; /* How many lvl of roughness in the lut. */
+ coords = saturate(coords);
- float mip = roughness * lut_lvl_scale;
- float mip_floor = floor(mip);
-
- coords.z = lut_lvl_ofs + mip_floor + 1.0;
- float btdf_high = textureLod(utilTex, coords, 0.0).r;
+ /* scale and bias coordinates, for correct filtered lookup */
+ coords.xy = coords.xy * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE;
- coords.z -= 1.0;
- float btdf_low = textureLod(utilTex, coords, 0.0).r;
+ return coords;
+}
- float btdf = (ior == 1.0) ? 1.0 : mix(btdf_low, btdf_high, mip - coords.z);
+/* Returns GGX BTDF in first component and fresnel in second. */
+vec2 btdf_lut(float cos_theta, float roughness, float ior)
+{
+ if (ior <= 1e-5) {
+ return vec2(0.0);
+ }
+
+ if (ior >= 1.0) {
+ vec2 split_sum = brdf_lut(cos_theta, roughness);
+ float f0 = f0_from_ior(ior);
+ /* Baked IOR for GGX BRDF. */
+ const float specular = 1.0;
+ const float eta_brdf = (2.0 / (1.0 - sqrt(0.08 * specular))) - 1.0;
+ /* Avoid harsh transition comming from ior == 1. */
+ float f90 = fast_sqrt(saturate(f0 / (f0_from_ior(eta_brdf) * 0.25)));
+ float fresnel = F_brdf_single_scatter(vec3(f0), vec3(f90), split_sum).r;
+ /* Setting the BTDF to one is not really important since it is only used for multiscatter
+ * and it's already quite close to ground truth. */
+ float btdf = 1.0;
+ return vec2(btdf, fresnel);
+ }
+
+ vec3 coords = lut_coords_btdf(cos_theta, roughness, ior);
+
+ float layer = coords.z * lut_btdf_layer_count;
+ float layer_floored = floor(layer);
+
+ coords.z = lut_btdf_layer_first + layer_floored;
+ vec2 btdf_low = textureLod(utilTex, coords, 0.0).rg;
+
+ coords.z += 1.0;
+ vec2 btdf_high = textureLod(utilTex, coords, 0.0).rg;
+
+ /* Manual trilinear interpolation. */
+ vec2 btdf = mix(btdf_low, btdf_high, layer - layer_floored);
return btdf;
}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
index 489e87e9a7d..33d7347a377 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
@@ -177,11 +177,11 @@ vec4 step_blit(void)
vec4 step_downsample(void)
{
#ifdef HIGH_QUALITY /* Anti flicker */
- vec3 sample = downsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
+ vec3 samp = downsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
#else
- vec3 sample = downsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
+ vec3 samp = downsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
#endif
- return vec4(sample, 1.0);
+ return vec4(samp, 1.0);
}
vec4 step_upsample(void)
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl
new file mode 100644
index 00000000000..40e4c5a313e
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl
@@ -0,0 +1,101 @@
+
+/**
+ * Bokeh Look Up Table: This outputs a radius multiplier to shape the sampling in gather pass or
+ * the scatter sprite appearance. This is only used if bokeh shape is either anamorphic or is not
+ * a perfect circle.
+ * We correct samples spacing for polygonal bokeh shapes. However, we do not for anamorphic bokeh
+ * as it is way more complex and expensive to do.
+ **/
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+uniform float bokehSides;
+uniform float bokehRotation;
+uniform vec2 bokehAnisotropyInv;
+
+in vec4 uvcoordsvar;
+
+layout(location = 0) out vec2 outGatherLut;
+layout(location = 1) out float outScatterLut;
+layout(location = 2) out float outResolveLut;
+
+float polygon_sides_length(float sides_count)
+{
+ return 2.0 * sin(M_PI / sides_count);
+}
+
+/* Returns intersection ratio between the radius edge at theta and the polygon edge.
+ * Start first corners at theta == 0. */
+float circle_to_polygon_radius(float sides_count, float theta)
+{
+ /* From Graphics Gems from CryENGINE 3 (Siggraph 2013) by Tiago Sousa (slide 36). */
+ float side_angle = M_2PI / sides_count;
+ float halfside_angle = side_angle * 0.5;
+ return cos(side_angle * 0.5) /
+ cos(theta - side_angle * floor((sides_count * theta + M_PI) / M_2PI));
+}
+
+/* Remap input angle to have homogenous spacing of points along a polygon edge.
+ * Expect theta to be in [0..2pi] range. */
+float circle_to_polygon_angle(float sides_count, float theta)
+{
+ float side_angle = M_2PI / sides_count;
+ float halfside_angle = side_angle * 0.5;
+ float side = floor(theta / side_angle);
+ /* Length of segment from center to the middle of polygon side. */
+ float adjacent = circle_to_polygon_radius(sides_count, 0.0);
+
+ /* This is the relative position of the sample on the polygon half side. */
+ float local_theta = theta - side * side_angle;
+ float ratio = (local_theta - halfside_angle) / halfside_angle;
+
+ float halfside_len = polygon_sides_length(sides_count) * 0.5;
+ float oposite = ratio * halfside_len;
+
+ /* NOTE: atan(y_over_x) has output range [-M_PI_2..M_PI_2]. */
+ float final_local_theta = atan(oposite / adjacent);
+
+ return side * side_angle + final_local_theta;
+}
+
+void main()
+{
+ /* Center uv in range [-1..1]. */
+ vec2 uv = uvcoordsvar.xy * 2.0 - 1.0;
+
+ float radius = length(uv);
+
+ vec2 texel = floor(gl_FragCoord.xy) - float(DOF_MAX_SLIGHT_FOCUS_RADIUS);
+
+ if (bokehSides > 0.0) {
+ /* NOTE: atan(y,x) has output range [-M_PI..M_PI], so add 2pi to avoid negative angles. */
+ float theta = atan(uv.y, uv.x) + M_2PI;
+ float r = length(uv);
+
+ radius /= circle_to_polygon_radius(bokehSides, theta - bokehRotation);
+
+ float theta_new = circle_to_polygon_angle(bokehSides, theta);
+ float r_new = circle_to_polygon_radius(bokehSides, theta_new);
+
+ theta_new -= bokehRotation;
+
+ uv = r_new * vec2(-cos(theta_new), sin(theta_new));
+
+ {
+ /* Slight focus distance */
+ texel *= bokehAnisotropyInv;
+ float theta = atan(texel.y, -texel.x) + M_2PI;
+ texel /= circle_to_polygon_radius(bokehSides, theta + bokehRotation);
+ }
+ }
+ else {
+ uv *= safe_rcp(length(uv));
+ }
+
+ /* For gather store the normalized UV. */
+ outGatherLut = uv;
+ /* For scatter store distance. */
+ outScatterLut = radius;
+ /* For slight focus gather store pixel perfect distance. */
+ outResolveLut = length(texel);
+}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl
new file mode 100644
index 00000000000..22e6f929f36
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl
@@ -0,0 +1,117 @@
+
+/**
+ * Tile dilate pass: Takes the 8x8 Tiles buffer and converts dilates the tiles with large CoC to
+ * their neighborhood. This pass is repeated multiple time until the maximum CoC can be covered.
+ **/
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+/* 1/16th of fullres. */
+uniform sampler2D cocTilesFgBuffer;
+uniform sampler2D cocTilesBgBuffer;
+
+uniform int ringCount;
+uniform int ringWidthMultiplier;
+uniform bool dilateSlightFocus;
+
+/* 1/16th of fullres. Same format as input. */
+layout(location = 0) out vec4 outFgCoc;
+layout(location = 1) out vec3 outBgCoc;
+
+const float tile_to_fullres_factor = float(DOF_TILE_DIVISOR);
+
+/* Error introduced by the random offset of the gathering kernel's center. */
+const float bluring_radius_error = 1.0 + 1.0 / (gather_ring_count + 0.5);
+
+void main()
+{
+ ivec2 center_tile_pos = ivec2(gl_FragCoord.xy);
+
+ CocTile ring_buckets[DOF_DILATE_RING_COUNT];
+
+ for (int ring = 0; ring < ringCount && ring < DOF_DILATE_RING_COUNT; ring++) {
+ ring_buckets[ring] = dof_coc_tile_init();
+
+ int ring_distance = ring + 1;
+ for (int sample_id = 0; sample_id < 4 * ring_distance; sample_id++) {
+ ivec2 offset = dof_square_ring_sample_offset(ring_distance, sample_id);
+
+ offset *= ringWidthMultiplier;
+
+ for (int i = 0; i < 2; i++) {
+ ivec2 adj_tile_pos = center_tile_pos + ((i == 0) ? offset : -offset);
+
+ CocTile adj_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, adj_tile_pos);
+
+#ifdef DILATE_MODE_MIN_MAX
+ /* Actually gather the "absolute" biggest coc but keeping the sign. */
+ ring_buckets[ring].fg_min_coc = min(ring_buckets[ring].fg_min_coc, adj_tile.fg_min_coc);
+ ring_buckets[ring].bg_max_coc = max(ring_buckets[ring].bg_max_coc, adj_tile.bg_max_coc);
+
+ if (dilateSlightFocus) {
+ ring_buckets[ring].fg_slight_focus_max_coc = dof_coc_max_slight_focus(
+ ring_buckets[ring].fg_slight_focus_max_coc, adj_tile.fg_slight_focus_max_coc);
+ }
+
+#else /* DILATE_MODE_MIN_ABS */
+ ring_buckets[ring].fg_max_coc = max(ring_buckets[ring].fg_max_coc, adj_tile.fg_max_coc);
+ ring_buckets[ring].bg_min_coc = min(ring_buckets[ring].bg_min_coc, adj_tile.bg_min_coc);
+
+ /* Should be tight as possible to reduce gather overhead (see slide 61). */
+ float closest_neighbor_distance = length(max(abs(vec2(offset)) - 1.0, 0.0)) *
+ tile_to_fullres_factor;
+
+ ring_buckets[ring].fg_max_intersectable_coc = max(
+ ring_buckets[ring].fg_max_intersectable_coc,
+ adj_tile.fg_max_intersectable_coc + closest_neighbor_distance);
+ ring_buckets[ring].bg_min_intersectable_coc = min(
+ ring_buckets[ring].bg_min_intersectable_coc,
+ adj_tile.bg_min_intersectable_coc + closest_neighbor_distance);
+#endif
+ }
+ }
+ }
+
+ /* Load center tile. */
+ CocTile out_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, center_tile_pos);
+
+ /* Dilate once. */
+ if (dilateSlightFocus) {
+ out_tile.fg_slight_focus_max_coc = dof_coc_max_slight_focus(
+ out_tile.fg_slight_focus_max_coc, ring_buckets[0].fg_slight_focus_max_coc);
+ }
+
+ for (int ring = 0; ring < ringCount && ring < DOF_DILATE_RING_COUNT; ring++) {
+ float ring_distance = float(ring + 1);
+
+ ring_distance = (ring_distance * ringWidthMultiplier - 1) * tile_to_fullres_factor;
+
+ /* NOTE(fclem): Unsure if both sides of the inequalities have the same unit. */
+#ifdef DILATE_MODE_MIN_MAX
+ if (-ring_buckets[ring].fg_min_coc * bluring_radius_error > ring_distance) {
+ out_tile.fg_min_coc = min(out_tile.fg_min_coc, ring_buckets[ring].fg_min_coc);
+ }
+
+ if (ring_buckets[ring].bg_max_coc * bluring_radius_error > ring_distance) {
+ out_tile.bg_max_coc = max(out_tile.bg_max_coc, ring_buckets[ring].bg_max_coc);
+ }
+
+#else /* DILATE_MODE_MIN_ABS */
+ /* Find minimum absolute CoC radii that will be intersected for the previously
+ * computed maximum CoC values. */
+ if (-out_tile.fg_min_coc * bluring_radius_error > ring_distance) {
+ out_tile.fg_max_coc = max(out_tile.fg_max_coc, ring_buckets[ring].fg_max_coc);
+ out_tile.fg_max_intersectable_coc = max(out_tile.fg_max_intersectable_coc,
+ ring_buckets[ring].fg_max_intersectable_coc);
+ }
+
+ if (out_tile.bg_max_coc * bluring_radius_error > ring_distance) {
+ out_tile.bg_min_coc = min(out_tile.bg_min_coc, ring_buckets[ring].bg_min_coc);
+ out_tile.bg_min_intersectable_coc = min(out_tile.bg_min_intersectable_coc,
+ ring_buckets[ring].bg_min_intersectable_coc);
+ }
+#endif
+ }
+
+ dof_coc_tile_store(out_tile, outFgCoc, outBgCoc);
+}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl
new file mode 100644
index 00000000000..c477e0f6eb8
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl
@@ -0,0 +1,37 @@
+
+/**
+ * Downsample pass: CoC aware downsample to quarter resolution.
+ *
+ * Pretty much identical to the setup pass but get CoC from buffer. Also does not
+ * weight luma for the bilateral weights.
+ **/
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+/* Half resolution. */
+uniform sampler2D colorBuffer;
+uniform sampler2D cocBuffer;
+
+/* Quarter resolution. */
+layout(location = 0) out vec4 outColor;
+
+void main()
+{
+ vec2 halfres_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy);
+ /* Center uv around the 4 halfres pixels. */
+ vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * halfres_texel_size;
+
+ vec4 colors[4];
+ vec4 cocs;
+ for (int i = 0; i < 4; i++) {
+ vec2 sample_uv = quad_center + quad_offsets[i] * halfres_texel_size;
+ colors[i] = textureLod(colorBuffer, sample_uv, 0.0);
+ cocs[i] = textureLod(cocBuffer, sample_uv, 0.0).r;
+ }
+
+ vec4 weights = dof_downsample_bilateral_coc_weights(cocs);
+ /* Normalize so that the sum is 1. */
+ weights *= safe_rcp(sum(weights));
+
+ outColor = weighted_sum_array(colors, weights);
+}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl
new file mode 100644
index 00000000000..8fd8215da0f
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl
@@ -0,0 +1,93 @@
+
+/**
+ * Gather Filter pass: Filter the gather pass result to reduce noise.
+ *
+ * This is a simple 3x3 median filter to avoid dilating highlights with a 3x3 max filter even if
+ * cheaper.
+ **/
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+uniform sampler2D colorBuffer;
+uniform sampler2D weightBuffer;
+
+in vec4 uvcoordsvar;
+
+layout(location = 0) out vec4 outColor;
+layout(location = 1) out float outWeight;
+
+/* From:
+ * Implementing Median Filters in XC4000E FPGAs
+ * JOHN L. SMITH, Univision Technologies Inc., Billerica, MA
+ * http://users.utcluj.ro/~baruch/resources/Image/xl23_16.pdf
+ * Figure 1 */
+
+/* Outputs low median and high value of a triple. */
+void lmh(vec4 s1, vec4 s2, vec4 s3, out vec4 l, out vec4 m, out vec4 h)
+{
+ /* From diagram, with nodes numbered from top to bottom. */
+ vec4 h1 = max(s2, s3);
+ vec4 l1 = min(s2, s3);
+
+ vec4 h2 = max(s1, l1);
+ vec4 l2 = min(s1, l1);
+
+ vec4 h3 = max(h2, h1);
+ vec4 l3 = min(h2, h1);
+
+ l = l2;
+ m = l3;
+ h = h3;
+}
+
+vec4 median_filter(sampler2D tex, vec2 uv)
+{
+ vec2 texel_size = 1.0 / vec2(textureSize(tex, 0).xy);
+ vec4 samples[9];
+ int s = 0;
+
+ const vec2 ofs[9] = vec2[9](vec2(-1, -1),
+ vec2(0, -1),
+ vec2(1, -1),
+ vec2(-1, 0),
+ vec2(0, 0),
+ vec2(1, 0),
+ vec2(-1, 1),
+ vec2(0, 1),
+ vec2(1, 1));
+
+ for (int s = 0; s < 9; s++) {
+ samples[s] = textureLod(tex, uv + ofs[s] * texel_size, 0.0);
+ }
+
+ if (no_gather_filtering) {
+ return samples[4];
+ }
+
+ for (int s = 0; s < 9; s += 3) {
+ lmh(samples[s], samples[s + 1], samples[s + 2], samples[s], samples[s + 1], samples[s + 2]);
+ }
+ /* Some aliases to better understand what's happening. */
+ vec4 L123 = samples[0 + 0], L456 = samples[3 + 0], L789 = samples[6 + 0];
+ vec4 M123 = samples[0 + 1], M456 = samples[3 + 1], M789 = samples[6 + 1];
+ vec4 H123 = samples[0 + 2], H456 = samples[3 + 2], H789 = samples[6 + 2];
+ vec4 dummy, l, m, h;
+ /* Left nodes. */
+ h = max(max(L123, L456), L789);
+ /* Right nodes. */
+ l = min(min(H123, H456), H789);
+ /* Center nodes. */
+ lmh(M123, M456, M789, dummy, m, dummy);
+ /* Last bottom nodes. */
+ lmh(l, m, h, dummy, m, dummy);
+
+ return m;
+}
+
+void main()
+{
+ /* OPTI(fclem) Could early return on some tiles. */
+
+ outColor = median_filter(colorBuffer, uvcoordsvar.xy);
+ outWeight = median_filter(weightBuffer, uvcoordsvar.xy).r;
+} \ No newline at end of file
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl
new file mode 100644
index 00000000000..bd81171c759
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl
@@ -0,0 +1,57 @@
+
+/**
+ * Tile flatten pass: Takes the halfres CoC buffer and converts it to 8x8 tiles.
+ *
+ * Output min and max values for each tile and for both foreground & background.
+ * Also outputs min intersectable CoC for the background, which is the minimum CoC
+ * that comes from the background pixels.
+ **/
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+/* Half resolution. */
+uniform sampler2D halfResCocBuffer;
+
+/* 1/8th of halfResCocBuffer resolution. So 1/16th of fullres. */
+layout(location = 0) out vec4 outFgCoc;
+layout(location = 1) out vec3 outBgCoc;
+
+const int halfres_tile_divisor = DOF_TILE_DIVISOR / 2;
+
+void main()
+{
+ ivec2 halfres_bounds = textureSize(halfResCocBuffer, 0).xy - 1;
+ ivec2 tile_co = ivec2(gl_FragCoord.xy);
+
+ CocTile tile = dof_coc_tile_init();
+
+ for (int x = 0; x < halfres_tile_divisor; x++) {
+ /* OPTI: Could be done in separate passes. */
+ for (int y = 0; y < halfres_tile_divisor; y++) {
+ ivec2 sample_texel = tile_co * halfres_tile_divisor + ivec2(x, y);
+ vec2 sample_data = texelFetch(halfResCocBuffer, min(sample_texel, halfres_bounds), 0).rg;
+ float sample_coc = sample_data.x;
+ float sample_slight_focus_coc = sample_data.y;
+
+ float fg_coc = min(sample_coc, 0.0);
+ tile.fg_min_coc = min(tile.fg_min_coc, fg_coc);
+ tile.fg_max_coc = max(tile.fg_max_coc, fg_coc);
+
+ float bg_coc = max(sample_coc, 0.0);
+ tile.bg_min_coc = min(tile.bg_min_coc, bg_coc);
+ tile.bg_max_coc = max(tile.bg_max_coc, bg_coc);
+
+ if (sample_coc > 0.0) {
+ tile.bg_min_intersectable_coc = min(tile.bg_min_intersectable_coc, bg_coc);
+ }
+ if (sample_coc < 0.0) {
+ tile.fg_max_intersectable_coc = max(tile.fg_max_intersectable_coc, fg_coc);
+ }
+
+ tile.fg_slight_focus_max_coc = dof_coc_max_slight_focus(tile.fg_slight_focus_max_coc,
+ sample_slight_focus_coc);
+ }
+ }
+
+ dof_coc_tile_store(tile, outFgCoc, outBgCoc);
+}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
deleted file mode 100644
index 9c1ca17f87c..00000000000
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
+++ /dev/null
@@ -1,254 +0,0 @@
-
-
-#pragma BLENDER_REQUIRE(common_view_lib.glsl)
-#pragma BLENDER_REQUIRE(common_math_lib.glsl)
-
-uniform sampler2D colorBuffer;
-uniform sampler2D depthBuffer;
-
-uniform vec2 dofParams;
-uniform bool unpremult;
-
-#define dof_mul dofParams.x /* distance * aperturesize * invsensorsize */
-#define dof_bias dofParams.y /* aperturesize * invsensorsize */
-
-uniform vec4 bokehParams[2];
-
-#define bokeh_rotation bokehParams[0].x
-#define bokeh_ratio bokehParams[0].y
-#define bokeh_maxsize bokehParams[0].z
-#define bokeh_sides \
- bokehParams[1] /* Polygon Bokeh shape number of sides (with precomputed vars) */
-
-uniform vec2 nearFar; /* Near & far view depths values */
-
-/* -------------- Utils ------------- */
-
-/* divide by sensor size to get the normalized size */
-#define calculate_coc(zdepth) (dof_mul / zdepth - dof_bias)
-
-#define linear_depth(z) \
- ((ProjectionMatrix[3][3] == 0.0) ? \
- (nearFar.x * nearFar.y) / (z * (nearFar.x - nearFar.y) + nearFar.y) : \
- z * (nearFar.y - nearFar.x) + nearFar.x) /* Only true for camera view! */
-
-#define weighted_sum(a, b, c, d, e) \
- (a * e.x + b * e.y + c * e.z + d * e.w) / max(1e-6, dot(e, vec4(1.0)));
-
-vec4 safe_color(vec4 c)
-{
- /* Clamp to avoid black square artifacts if a pixel goes NaN. */
- return clamp(c, vec4(0.0), vec4(1e20)); /* 1e20 arbitrary. */
-}
-
-#define THRESHOLD 1.0
-
-#ifdef STEP_DOWNSAMPLE
-
-layout(location = 0) out vec4 nearColor;
-layout(location = 1) out vec4 farColor;
-layout(location = 2) out vec2 cocData;
-
-/* Downsample the color buffer to half resolution.
- * Weight color samples by
- * Compute maximum CoC for near and far blur. */
-void main(void)
-{
- ivec4 uvs = ivec4(gl_FragCoord.xyxy) * 2 + ivec4(0, 0, 1, 1);
-
- /* custom downsampling */
- vec4 color1 = safe_color(texelFetch(colorBuffer, uvs.xy, 0));
- vec4 color2 = safe_color(texelFetch(colorBuffer, uvs.zw, 0));
- vec4 color3 = safe_color(texelFetch(colorBuffer, uvs.zy, 0));
- vec4 color4 = safe_color(texelFetch(colorBuffer, uvs.xw, 0));
-
- /* Leverage SIMD by combining 4 depth samples into a vec4 */
- vec4 depth;
- depth.r = texelFetch(depthBuffer, uvs.xy, 0).r;
- depth.g = texelFetch(depthBuffer, uvs.zw, 0).r;
- depth.b = texelFetch(depthBuffer, uvs.zy, 0).r;
- depth.a = texelFetch(depthBuffer, uvs.xw, 0).r;
-
- vec4 zdepth = linear_depth(depth);
-
- /* Compute signed CoC for each depth samples */
- vec4 coc_near = calculate_coc(zdepth);
- vec4 coc_far = -coc_near;
-
- cocData.x = max(max_v4(coc_near), 0.0);
- cocData.y = max(max_v4(coc_far), 0.0);
-
- /* now we need to write the near-far fields premultiplied by the coc
- * also use bilateral weighting by each coc values to avoid bleeding. */
- vec4 near_weights = step(THRESHOLD, coc_near) * clamp(1.0 - abs(cocData.x - coc_near), 0.0, 1.0);
- vec4 far_weights = step(THRESHOLD, coc_far) * clamp(1.0 - abs(cocData.y - coc_far), 0.0, 1.0);
-
-# ifdef USE_ALPHA_DOF
- /* Premult */
- color1.rgb *= color1.a;
- color2.rgb *= color2.a;
- color3.rgb *= color3.a;
- color4.rgb *= color4.a;
-# endif
-
- /* now write output to weighted buffers. */
- nearColor = weighted_sum(color1, color2, color3, color4, near_weights);
- farColor = weighted_sum(color1, color2, color3, color4, far_weights);
-}
-
-#elif defined(STEP_SCATTER)
-
-flat in vec4 color;
-flat in float weight;
-flat in float smoothFac;
-flat in ivec2 edge;
-/* coordinate used for calculating radius */
-in vec2 particlecoord;
-
-layout(location = 0) out vec4 fragColor;
-# ifdef USE_ALPHA_DOF
-layout(location = 1) out float fragAlpha;
-# endif
-
-/* accumulate color in the near/far blur buffers */
-void main(void)
-{
- /* Discard to avoid bleeding onto the next layer */
- if (int(gl_FragCoord.x) * edge.x + edge.y > 0) {
- discard;
- }
-
- /* Circle Dof */
- float dist = length(particlecoord);
-
- /* Outside of bokeh shape */
- if (dist > 1.0) {
- discard;
- }
-
- /* Regular Polygon Dof */
- if (bokeh_sides.x > 0.0) {
- /* Circle parametrization */
- float theta = atan(particlecoord.y, particlecoord.x) + bokeh_rotation;
-
- /* Optimized version of :
- * float denom = theta - (M_2PI / bokeh_sides) * floor((bokeh_sides * theta + M_PI) / M_2PI);
- * float r = cos(M_PI / bokeh_sides) / cos(denom); */
- float denom = theta - bokeh_sides.y * floor(bokeh_sides.z * theta + 0.5);
- float r = bokeh_sides.w / cos(denom);
-
- /* Divide circle radial coord by the shape radius for angle theta.
- * Giving us the new linear radius to the shape edge. */
- dist /= r;
-
- /* Outside of bokeh shape */
- if (dist > 1.0) {
- discard;
- }
- }
-
- fragColor = color;
-
- /* Smooth the edges a bit. This effectively reduce the bokeh shape
- * but does fade out the undersampling artifacts. */
- float shape = smoothstep(1.0, min(0.999, smoothFac), dist);
-
- fragColor *= shape;
-
-# ifdef USE_ALPHA_DOF
- fragAlpha = fragColor.a;
- fragColor.a = weight * shape;
-# endif
-}
-
-#elif defined(STEP_RESOLVE)
-
-# define MERGE_THRESHOLD 4.0
-
-uniform sampler2D scatterBuffer;
-uniform sampler2D scatterAlphaBuffer;
-
-in vec4 uvcoordsvar;
-out vec4 fragColor;
-
-vec4 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize)
-{
- /* TODO FIXME: Clamp the sample position
- * depending on the layer to avoid bleeding.
- * This is not really noticeable so leaving it as is for now. */
-
-# if 1 /* 9-tap bilinear upsampler (tent filter) */
- vec4 d = texelSize.xyxy * vec4(1, 1, -1, 0);
-
- vec4 s;
- s = textureLod(tex, uv - d.xy, 0.0);
- s += textureLod(tex, uv - d.wy, 0.0) * 2;
- s += textureLod(tex, uv - d.zy, 0.0);
-
- s += textureLod(tex, uv + d.zw, 0.0) * 2;
- s += textureLod(tex, uv, 0.0) * 4;
- s += textureLod(tex, uv + d.xw, 0.0) * 2;
-
- s += textureLod(tex, uv + d.zy, 0.0);
- s += textureLod(tex, uv + d.wy, 0.0) * 2;
- s += textureLod(tex, uv + d.xy, 0.0);
-
- return s * (1.0 / 16.0);
-# else
- /* 4-tap bilinear upsampler */
- vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1) * 0.5;
-
- vec4 s;
- s = textureLod(tex, uv + d.xy, 0.0);
- s += textureLod(tex, uv + d.zy, 0.0);
- s += textureLod(tex, uv + d.xw, 0.0);
- s += textureLod(tex, uv + d.zw, 0.0);
-
- return s * (1.0 / 4.0);
-# endif
-}
-
-/* Combine the Far and Near color buffers */
-void main(void)
-{
- vec2 uv = uvcoordsvar.xy;
- /* Recompute Near / Far CoC per pixel */
- float depth = textureLod(depthBuffer, uv, 0.0).r;
- float zdepth = linear_depth(depth);
- float coc_signed = calculate_coc(zdepth);
- float coc_far = max(-coc_signed, 0.0);
- float coc_near = max(coc_signed, 0.0);
-
- vec4 focus_col = textureLod(colorBuffer, uv, 0.0);
-
- vec2 texelSize = vec2(0.5, 1.0) / vec2(textureSize(scatterBuffer, 0));
- vec2 near_uv = uv * vec2(0.5, 1.0);
- vec2 far_uv = near_uv + vec2(0.5, 0.0);
- vec4 near_col = upsample_filter(scatterBuffer, near_uv, texelSize);
- vec4 far_col = upsample_filter(scatterBuffer, far_uv, texelSize);
-
- float far_w = far_col.a;
- float near_w = near_col.a;
- float focus_w = 1.0 - smoothstep(1.0, MERGE_THRESHOLD, abs(coc_signed));
- float inv_weight_sum = 1.0 / (near_w + focus_w + far_w);
-
- focus_col *= focus_w; /* Premul */
-
-# ifdef USE_ALPHA_DOF
- near_col.a = upsample_filter(scatterAlphaBuffer, near_uv, texelSize).r;
- far_col.a = upsample_filter(scatterAlphaBuffer, far_uv, texelSize).r;
-# endif
-
- fragColor = (far_col + near_col + focus_col) * inv_weight_sum;
-
-# ifdef USE_ALPHA_DOF
- /* Sigh... viewport expect premult output but
- * the final render output needs to be with
- * associated alpha. */
- if (unpremult) {
- fragColor.rgb /= (fragColor.a > 0.0) ? fragColor.a : 1.0;
- }
-# endif
-}
-
-#endif
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl
new file mode 100644
index 00000000000..79c95b6d433
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl
@@ -0,0 +1,293 @@
+
+/**
+ * Gather pass: Convolve foreground and background parts in separate passes.
+ *
+ * Using the min&max CoC tile buffer, we select the best apropriate method to blur the scene color.
+ * A fast gather path is taken if there is not many CoC variation inside the tile.
+ *
+ * We sample using an octaweb sampling pattern. We randomize the kernel center and each ring
+ * rotation to ensure maximum coverage.
+ **/
+
+#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+/* Mipmapped input buffers, halfres but with padding to ensure mipmap alignement. */
+uniform sampler2D colorBuffer;
+uniform sampler2D cocBuffer;
+
+/* Same input buffer but with a bilinear sampler object. */
+uniform sampler2D colorBufferBilinear;
+
+/* CoC Min&Max tile buffer at 1/16th of fullres. */
+uniform sampler2D cocTilesFgBuffer;
+uniform sampler2D cocTilesBgBuffer;
+
+uniform sampler2D bokehLut;
+
+/* Used to correct the padding in the color and CoC buffers. */
+uniform vec2 gatherInputUvCorrection;
+
+uniform vec2 gatherOutputTexelSize;
+
+uniform vec2 bokehAnisotropy;
+
+layout(location = 0) out vec4 outColor;
+layout(location = 1) out float outWeight;
+#ifndef DOF_HOLEFILL_PASS
+layout(location = 2) out vec2 outOcclusion;
+#else
+
+/* Dirty global variable that isn't used. So it should get optimized out. */
+vec2 outOcclusion;
+#endif
+
+#ifdef DOF_FOREGROUND_PASS
+const bool is_foreground = true;
+#else /* DOF_BACKGROUND_PASS */
+const bool is_foreground = false;
+#endif
+
+const float unit_ring_radius = 1.0 / float(gather_ring_count);
+const float unit_sample_radius = 1.0 / float(gather_ring_count + 0.5);
+const float large_kernel_radius = 0.5 + float(gather_ring_count);
+const float smaller_kernel_radius = 0.5 + float(gather_ring_count - gather_density_change_ring);
+/* NOTE(fclem) the bias is reducing issues with density change visible transition. */
+const float radius_downscale_factor = smaller_kernel_radius / large_kernel_radius;
+const int change_density_at_ring = (gather_ring_count - gather_density_change_ring + 1);
+const float coc_radius_error = 2.0;
+
+/* Radii needs to be halfres CoC sizes. */
+bool dof_do_density_change(float base_radius, float min_intersectable_radius)
+{
+ /* Reduce artifact for very large blur. */
+ min_intersectable_radius *= 0.1;
+
+ bool need_new_density = (base_radius * unit_ring_radius > min_intersectable_radius);
+ bool larger_than_min_density = (base_radius * radius_downscale_factor >
+ float(gather_ring_count));
+
+ return need_new_density && larger_than_min_density;
+}
+
+void dof_gather_init(float base_radius,
+ vec4 noise,
+ out vec2 center_co,
+ out float lod,
+ out float intersection_multiplier)
+{
+ /* Jitter center half a ring to reduce undersampling. */
+ vec2 jitter_ofs = 0.499 * noise.zw * sqrt(noise.x);
+#ifdef DOF_BOKEH_TEXTURE
+ jitter_ofs *= bokehAnisotropy;
+#endif
+ center_co = gl_FragCoord.xy + jitter_ofs * base_radius * unit_sample_radius;
+
+ /* TODO(fclem) Seems like the default lod selection is too big. Bias to avoid blocky moving
+ * out of focus shapes. */
+ const float lod_bias = -2.0;
+ lod = max(floor(log2(base_radius * unit_sample_radius) + 0.5) + lod_bias, 0.0);
+
+ if (no_gather_mipmaps) {
+ lod = 0.0;
+ }
+ /* (Slide 64). */
+ intersection_multiplier = pow(0.5, lod);
+}
+
+void dof_gather_accumulator(float base_radius,
+ float min_intersectable_radius,
+ const bool do_fast_gather,
+ const bool do_density_change)
+{
+ vec4 noise = no_gather_random ? vec4(0.0, 0.0, 0.0, 1.0) : texelfetch_noise_tex(gl_FragCoord.xy);
+
+ if (!do_fast_gather) {
+ /* Jitter the radius to reduce noticeable density changes. */
+ base_radius += noise.x * unit_ring_radius * base_radius;
+ }
+ else {
+ /* Jittering the radius more than we need means we are going to feather the bokeh shape half
+ * a ring. So we need to compensate for fast gather that does not check CoC intersection. */
+ base_radius += (0.5 - noise.x) * 1.5 * unit_ring_radius * base_radius;
+ }
+ /* TODO(fclem) another seed? For now Cranly-Partterson rotation with golden ratio. */
+ noise.x = fract(noise.x + 0.61803398875);
+
+ float lod, isect_mul;
+ vec2 center_co;
+ dof_gather_init(base_radius, noise, center_co, lod, isect_mul);
+
+ bool first_ring = true;
+
+ DofGatherData accum_data = GATHER_DATA_INIT;
+
+ int density_change = 0;
+ for (int ring = gather_ring_count; ring > 0; ring--) {
+ int sample_pair_count = gather_ring_density * ring;
+
+ float step_rot = M_PI / float(sample_pair_count);
+ mat2 step_rot_mat = rot2_from_angle(step_rot);
+
+ float angle_offset = noise.y * step_rot;
+ vec2 offset = vec2(cos(angle_offset), sin(angle_offset));
+
+ float ring_radius = float(ring) * unit_sample_radius * base_radius;
+
+ /* Slide 38. */
+ float bordering_radius = ring_radius +
+ (0.5 + coc_radius_error) * base_radius * unit_sample_radius;
+ DofGatherData ring_data = GATHER_DATA_INIT;
+ for (int sample_pair = 0; sample_pair < sample_pair_count; sample_pair++) {
+ offset = step_rot_mat * offset;
+
+ DofGatherData pair_data[2];
+ for (int i = 0; i < 2; i++) {
+ vec2 offset_co = ((i == 0) ? offset : -offset);
+#ifdef DOF_BOKEH_TEXTURE
+ /* Scaling to 0.25 for speed. Improves texture cache hit. */
+ offset_co = texture(bokehLut, offset_co * 0.25 + 0.5).rg;
+ offset_co *= bokehAnisotropy;
+#endif
+ vec2 sample_co = center_co + offset_co * ring_radius;
+ vec2 sample_uv = sample_co * gatherOutputTexelSize * gatherInputUvCorrection;
+ if (do_fast_gather) {
+ pair_data[i].color = dof_load_gather_color(colorBufferBilinear, sample_uv, lod);
+ }
+ else {
+ pair_data[i].color = dof_load_gather_color(colorBuffer, sample_uv, lod);
+ }
+ pair_data[i].coc = dof_load_gather_coc(cocBuffer, sample_uv, lod);
+ pair_data[i].dist = ring_radius;
+ }
+
+ dof_gather_accumulate_sample_pair(pair_data,
+ bordering_radius,
+ isect_mul,
+ first_ring,
+ do_fast_gather,
+ is_foreground,
+ ring_data,
+ accum_data);
+ }
+
+#ifdef DOF_FOREGROUND_PASS /* Reduce issue with closer foreground over distant foreground. */
+ /* TODO(fclem) this seems to not be completely correct as the issue remains. */
+ float ring_area = (sqr(float(ring) + 0.5 + coc_radius_error) -
+ sqr(float(ring) - 0.5 + coc_radius_error)) *
+ sqr(base_radius * unit_sample_radius);
+ dof_gather_ammend_weight(ring_data, ring_area);
+#endif
+
+ dof_gather_accumulate_sample_ring(
+ ring_data, sample_pair_count * 2, first_ring, do_fast_gather, is_foreground, accum_data);
+
+ first_ring = false;
+
+ if (do_density_change && (ring == change_density_at_ring) &&
+ (density_change < gather_max_density_change)) {
+ if (dof_do_density_change(base_radius, min_intersectable_radius)) {
+ base_radius *= radius_downscale_factor;
+ ring += gather_density_change_ring;
+ /* We need to account for the density change in the weights (slide 62).
+ * For that multiply old kernel data by its area divided by the new kernel area. */
+ const float outer_rings_weight = 1.0 / (radius_downscale_factor * radius_downscale_factor);
+#ifndef DOF_FOREGROUND_PASS /* Samples are already weighted per ring in foreground pass. */
+ dof_gather_ammend_weight(accum_data, outer_rings_weight);
+#endif
+ /* Re-init kernel position & sampling parameters. */
+ dof_gather_init(base_radius, noise, center_co, lod, isect_mul);
+ density_change++;
+ }
+ }
+ }
+
+ {
+ /* Center sample. */
+ vec2 sample_uv = center_co * gatherOutputTexelSize * gatherInputUvCorrection;
+ DofGatherData center_data;
+ if (do_fast_gather) {
+ center_data.color = dof_load_gather_color(colorBufferBilinear, sample_uv, lod);
+ }
+ else {
+ center_data.color = dof_load_gather_color(colorBuffer, sample_uv, lod);
+ }
+ center_data.coc = dof_load_gather_coc(cocBuffer, sample_uv, lod);
+ center_data.dist = 0.0;
+
+ /* Slide 38. */
+ float bordering_radius = (0.5 + coc_radius_error) * base_radius * unit_sample_radius;
+
+ dof_gather_accumulate_center_sample(
+ center_data, bordering_radius, do_fast_gather, is_foreground, accum_data);
+ }
+
+ int total_sample_count = dof_gather_total_sample_count_with_density_change(
+ gather_ring_count, gather_ring_density, density_change);
+ dof_gather_accumulate_resolve(total_sample_count, accum_data, outColor, outWeight, outOcclusion);
+
+#if defined(DOF_DEBUG_GATHER_PERF)
+ if (density_change > 0) {
+ float fac = saturate(float(density_change) / float(10.0));
+ outColor.rgb = avg(outColor.rgb) * neon_gradient(fac);
+ }
+ if (do_fast_gather) {
+ outColor.rgb = avg(outColor.rgb) * vec3(0.0, 1.0, 0.0);
+ }
+#elif defined(DOF_DEBUG_SCATTER_PERF)
+ outColor.rgb = avg(outColor.rgb) * vec3(0.0, 1.0, 0.0);
+#endif
+
+ /* Output premultiplied color so we can use bilinear sampler in resolve pass. */
+ outColor *= outWeight;
+}
+
+void main()
+{
+ ivec2 tile_co = ivec2(gl_FragCoord.xy / float(DOF_TILE_DIVISOR / 2));
+ CocTile coc_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, tile_co);
+ CocTilePrediction prediction = dof_coc_tile_prediction_get(coc_tile);
+
+#if defined(DOF_FOREGROUND_PASS)
+ float base_radius = -coc_tile.fg_min_coc;
+ float min_radius = -coc_tile.fg_max_coc;
+ float min_intersectable_radius = -coc_tile.fg_max_intersectable_coc;
+ bool can_early_out = !prediction.do_foreground;
+
+#elif defined(DOF_HOLEFILL_PASS)
+ float base_radius = -coc_tile.fg_min_coc;
+ float min_radius = -coc_tile.fg_max_coc;
+ float min_intersectable_radius = DOF_TILE_LARGE_COC;
+ bool can_early_out = !prediction.do_holefill;
+
+#else /* DOF_BACKGROUND_PASS */
+ float base_radius = coc_tile.bg_max_coc;
+ float min_radius = coc_tile.bg_min_coc;
+ float min_intersectable_radius = coc_tile.bg_min_intersectable_coc;
+ bool can_early_out = !prediction.do_background;
+#endif
+
+ bool do_fast_gather = dof_do_fast_gather(base_radius, min_radius, is_foreground);
+
+ /* Gather at half resolution. Divide CoC by 2. */
+ base_radius *= 0.5;
+ min_intersectable_radius *= 0.5;
+
+ bool do_density_change = dof_do_density_change(base_radius, min_intersectable_radius);
+
+ if (can_early_out) {
+ /* Early out. */
+ outColor = vec4(0.0);
+ outWeight = 0.0;
+ outOcclusion = vec2(0.0, 0.0);
+ }
+ else if (do_fast_gather) {
+ dof_gather_accumulator(base_radius, min_intersectable_radius, true, false);
+ }
+ else if (do_density_change) {
+ dof_gather_accumulator(base_radius, min_intersectable_radius, false, true);
+ }
+ else {
+ dof_gather_accumulator(base_radius, min_intersectable_radius, false, false);
+ }
+} \ No newline at end of file
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl
new file mode 100644
index 00000000000..88d83cd913a
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl
@@ -0,0 +1,631 @@
+
+#pragma BLENDER_REQUIRE(common_view_lib.glsl)
+#pragma BLENDER_REQUIRE(common_math_lib.glsl)
+
+uniform vec4 cocParams;
+
+#define cocMul cocParams[0] /* distance * aperturesize * invsensorsize */
+#define cocBias cocParams[1] /* aperturesize * invsensorsize */
+#define cocNear cocParams[2] /* Near view depths value. */
+#define cocFar cocParams[3] /* Far view depths value. */
+
+/* -------------- Debug Defines ------------- */
+
+// #define DOF_DEBUG_GATHER_PERF
+// #define DOF_DEBUG_SCATTER_PERF
+
+const bool no_smooth_intersection = false;
+const bool no_gather_occlusion = false;
+const bool no_gather_mipmaps = false;
+const bool no_gather_random = false;
+const bool no_gather_filtering = false;
+const bool no_scatter_occlusion = false;
+const bool no_scatter_pass = false;
+const bool no_foreground_pass = false;
+const bool no_background_pass = false;
+const bool no_slight_focus_pass = false;
+const bool no_focus_pass = false;
+const bool no_holefill_pass = false;
+
+/* -------------- Quality Defines ------------- */
+
+#ifdef DOF_HOLEFILL_PASS
+/* No need for very high density for holefill. */
+const int gather_ring_count = 3;
+const int gather_ring_density = 3;
+const int gather_max_density_change = 0;
+const int gather_density_change_ring = 1;
+#else
+const int gather_ring_count = DOF_GATHER_RING_COUNT;
+const int gather_ring_density = 3;
+const int gather_max_density_change = 50; /* Dictates the maximum good quality blur. */
+const int gather_density_change_ring = 1;
+#endif
+
+/* -------------- Utils ------------- */
+
+const vec2 quad_offsets[4] = vec2[4](
+ vec2(-0.5, 0.5), vec2(0.5, 0.5), vec2(0.5, -0.5), vec2(-0.5, -0.5));
+
+/* Divide by sensor size to get the normalized size. */
+#define calculate_coc_persp(zdepth) (cocMul / zdepth - cocBias)
+#define calculate_coc_ortho(zdepth) ((zdepth + cocMul / cocBias) * cocMul)
+#define calculate_coc(z) \
+ (ProjectionMatrix[3][3] == 0.0) ? calculate_coc_persp(z) : calculate_coc_ortho(z)
+
+/* Ortho conversion is only true for camera view! */
+#define linear_depth_persp(d) ((cocNear * cocFar) / (d * (cocNear - cocFar) + cocFar))
+#define linear_depth_ortho(d) (d * (cocNear - cocFar) + cocNear)
+
+#define linear_depth(d) \
+ ((ProjectionMatrix[3][3] == 0.0) ? linear_depth_persp(d) : linear_depth_ortho(d))
+
+#define dof_coc_from_zdepth(d) calculate_coc(linear_depth(d))
+
+vec4 safe_color(vec4 c)
+{
+ /* Clamp to avoid black square artifacts if a pixel goes NaN. */
+ return clamp(c, vec4(0.0), vec4(1e20)); /* 1e20 arbitrary. */
+}
+
+float dof_hdr_color_weight(vec4 color)
+{
+ /* From UE4. Very fast "luma" weighting. */
+ float luma = (color.g * 2.0) + (color.r + color.b);
+ /* TODO(fclem) Pass correct exposure. */
+ const float exposure = 1.0;
+ return 1.0 / (luma * exposure + 4.0);
+}
+
+float dof_coc_select(vec4 cocs)
+{
+ /* Select biggest coc. */
+ float selected_coc = cocs.x;
+ if (abs(cocs.y) > abs(selected_coc)) {
+ selected_coc = cocs.y;
+ }
+ if (abs(cocs.z) > abs(selected_coc)) {
+ selected_coc = cocs.z;
+ }
+ if (abs(cocs.w) > abs(selected_coc)) {
+ selected_coc = cocs.w;
+ }
+ return selected_coc;
+}
+
+/* NOTE: Do not forget to normalize weights afterwards. */
+vec4 dof_downsample_bilateral_coc_weights(vec4 cocs)
+{
+ float chosen_coc = dof_coc_select(cocs);
+
+ const float scale = 4.0; /* TODO(fclem) revisit. */
+ /* NOTE: The difference between the cocs should be inside a abs() function,
+ * but we follow UE4 implementation to improve how dithered transparency looks (see slide 19). */
+ return saturate(1.0 - (chosen_coc - cocs) * scale);
+}
+
+/* NOTE: Do not forget to normalize weights afterwards. */
+vec4 dof_downsample_bilateral_color_weights(vec4 colors[4])
+{
+ vec4 weights;
+ for (int i = 0; i < 4; i++) {
+ weights[i] = dof_hdr_color_weight(colors[i]);
+ }
+ return weights;
+}
+
+/* Makes sure the load functions distribute the energy correctly
+ * to both scatter and gather passes. */
+vec4 dof_load_gather_color(sampler2D gather_input_color_buffer, vec2 uv, float lod)
+{
+ vec4 color = textureLod(gather_input_color_buffer, uv, lod);
+ return color;
+}
+
+vec4 dof_load_scatter_color(sampler2D scatter_input_color_buffer, vec2 uv, float lod)
+{
+ vec4 color = textureLod(scatter_input_color_buffer, uv, lod);
+ return color;
+}
+
+float dof_load_gather_coc(sampler2D gather_input_coc_buffer, vec2 uv, float lod)
+{
+ float coc = textureLod(gather_input_coc_buffer, uv, lod).r;
+ /* We gather at halfres. CoC must be divided by 2 to be compared against radii. */
+ return coc * 0.5;
+}
+
+/* Distribute weights between near/slightfocus/far fields (slide 117). */
+const float layer_threshold = 4.0;
+/* Make sure it overlaps. */
+const float layer_offset_fg = 0.5 + 1.0;
+/* Extra offset for convolution layers to avoid light leaking from background. */
+const float layer_offset = 0.5 + 0.5;
+
+#define DOF_MAX_SLIGHT_FOCUS_RADIUS 5
+
+float dof_layer_weight(float coc, const bool is_foreground)
+{
+/* NOTE: These are fullres pixel CoC value. */
+#ifdef DOF_RESOLVE_PASS
+ return saturate(-abs(coc) + layer_threshold + layer_offset) *
+ float(is_foreground ? (coc <= 0.5) : (coc > -0.5));
+#else
+ coc *= 2.0; /* Account for half pixel gather. */
+ float threshold = layer_threshold - ((is_foreground) ? layer_offset_fg : layer_offset);
+ return saturate(((is_foreground) ? -coc : coc) - threshold);
+#endif
+}
+vec4 dof_layer_weight(vec4 coc)
+{
+ /* NOTE: Used for scatter pass which already flipped the sign correctly. */
+ coc *= 2.0; /* Account for half pixel gather. */
+ return saturate(coc - layer_threshold + layer_offset);
+}
+
+/* NOTE: This is halfres CoC radius. */
+float dof_sample_weight(float coc)
+{
+ /* Full intensity if CoC radius is below the pixel footprint. */
+ const float min_coc = 1.0;
+ coc = max(min_coc, abs(coc));
+ return (M_PI * min_coc * min_coc) / (M_PI * coc * coc);
+}
+vec4 dof_sample_weight(vec4 coc)
+{
+ /* Full intensity if CoC radius is below the pixel footprint. */
+ const float min_coc = 1.0;
+ coc = max(vec4(min_coc), abs(coc));
+ return (M_PI * min_coc * min_coc) / (M_PI * coc * coc);
+}
+
+/* Intersection with the center of the kernel. */
+float dof_intersection_weight(float coc, float distance_from_center, float intersection_multiplier)
+{
+ if (no_smooth_intersection) {
+ return step(0.0, (abs(coc) - distance_from_center));
+ }
+ else {
+ /* (Slide 64). */
+ return saturate((abs(coc) - distance_from_center) * intersection_multiplier + 0.5);
+ }
+}
+
+/* Returns weight of the sample for the outer bucket (containing previous rings). */
+float dof_gather_accum_weight(float coc, float bordering_radius, bool first_ring)
+{
+ /* First ring has nothing to be mixed against. */
+ if (first_ring) {
+ return 0.0;
+ }
+ return saturate(coc - bordering_radius);
+}
+
+bool dof_do_fast_gather(float max_absolute_coc, float min_absolute_coc, const bool is_foreground)
+{
+ float min_weight = dof_layer_weight((is_foreground) ? -min_absolute_coc : min_absolute_coc,
+ is_foreground);
+ if (min_weight < 1.0) {
+ return false;
+ }
+ /* FIXME(fclem): This is a workaround to fast gather triggering too early.
+ * Since we use custom opacity mask, the opacity is not given to be 100% even for
+ * after normal threshold. */
+ if (is_foreground && min_absolute_coc < layer_threshold) {
+ return false;
+ }
+ return (max_absolute_coc - min_absolute_coc) < (DOF_FAST_GATHER_COC_ERROR * max_absolute_coc);
+}
+
+/* ------------------- COC TILES UTILS ------------------- */
+
+struct CocTile {
+ float fg_min_coc;
+ float fg_max_coc;
+ float fg_max_intersectable_coc;
+ float fg_slight_focus_max_coc;
+ float bg_min_coc;
+ float bg_max_coc;
+ float bg_min_intersectable_coc;
+};
+
+struct CocTilePrediction {
+ bool do_foreground;
+ bool do_slight_focus;
+ bool do_focus;
+ bool do_background;
+ bool do_holefill;
+};
+
+/* WATCH: Might have to change depending on the texture format. */
+#define DOF_TILE_DEFOCUS 0.25
+#define DOF_TILE_FOCUS 0.0
+#define DOF_TILE_MIXED 0.75
+#define DOF_TILE_LARGE_COC 1024.0
+
+/* Init a CoC tile for reduction algorithms. */
+CocTile dof_coc_tile_init(void)
+{
+ CocTile tile;
+ tile.fg_min_coc = 0.0;
+ tile.fg_max_coc = -DOF_TILE_LARGE_COC;
+ tile.fg_max_intersectable_coc = DOF_TILE_LARGE_COC;
+ tile.fg_slight_focus_max_coc = -1.0;
+ tile.bg_min_coc = DOF_TILE_LARGE_COC;
+ tile.bg_max_coc = 0.0;
+ tile.bg_min_intersectable_coc = DOF_TILE_LARGE_COC;
+ return tile;
+}
+
+CocTile dof_coc_tile_load(sampler2D fg_buffer, sampler2D bg_buffer, ivec2 tile_co)
+{
+ ivec2 tex_size = textureSize(fg_buffer, 0).xy;
+ tile_co = clamp(tile_co, ivec2(0), tex_size - 1);
+
+ vec4 fg = texelFetch(fg_buffer, tile_co, 0);
+ vec3 bg = texelFetch(bg_buffer, tile_co, 0).xyz;
+
+ CocTile tile;
+ tile.fg_min_coc = -fg.x;
+ tile.fg_max_coc = -fg.y;
+ tile.fg_max_intersectable_coc = -fg.z;
+ tile.fg_slight_focus_max_coc = fg.w;
+ tile.bg_min_coc = bg.x;
+ tile.bg_max_coc = bg.y;
+ tile.bg_min_intersectable_coc = bg.z;
+ return tile;
+}
+
+void dof_coc_tile_store(CocTile tile, out vec4 out_fg, out vec3 out_bg)
+{
+ out_fg.x = -tile.fg_min_coc;
+ out_fg.y = -tile.fg_max_coc;
+ out_fg.z = -tile.fg_max_intersectable_coc;
+ out_fg.w = tile.fg_slight_focus_max_coc;
+ out_bg.x = tile.bg_min_coc;
+ out_bg.y = tile.bg_max_coc;
+ out_bg.z = tile.bg_min_intersectable_coc;
+}
+
+CocTilePrediction dof_coc_tile_prediction_get(CocTile tile)
+{
+ /* Based on tile value, predict what pass we need to load. */
+ CocTilePrediction predict;
+
+ predict.do_foreground = (-tile.fg_min_coc > layer_threshold - layer_offset_fg);
+ bool fg_fully_opaque = predict.do_foreground &&
+ dof_do_fast_gather(-tile.fg_min_coc, -tile.fg_max_coc, true);
+
+ predict.do_slight_focus = !fg_fully_opaque && (tile.fg_slight_focus_max_coc >= 0.5);
+ predict.do_focus = !fg_fully_opaque && (tile.fg_slight_focus_max_coc == DOF_TILE_FOCUS);
+
+ predict.do_background = !predict.do_focus && !fg_fully_opaque &&
+ (tile.bg_max_coc > layer_threshold - layer_offset);
+ bool bg_fully_opaque = predict.do_background &&
+ dof_do_fast_gather(-tile.bg_max_coc, tile.bg_min_coc, false);
+ predict.do_holefill = !predict.do_focus && !fg_fully_opaque && -tile.fg_max_coc > 0.0;
+
+#if 0 /* Debug */
+ predict.do_foreground = predict.do_background = predict.do_holefill = true;
+#endif
+ return predict;
+}
+
+/* Special function to return the correct max value of 2 slight focus coc. */
+float dof_coc_max_slight_focus(float coc1, float coc2)
+{
+ /* Do not consider values below 0.5 for expansion as they are "encoded".
+ * See setup pass shader for more infos. */
+ if ((coc1 == DOF_TILE_DEFOCUS && coc2 == DOF_TILE_FOCUS) ||
+ (coc1 == DOF_TILE_FOCUS && coc2 == DOF_TILE_DEFOCUS)) {
+ /* Tile where completely out of focus and in focus are both present.
+ * Consider as very slightly out of focus. */
+ return DOF_TILE_MIXED;
+ }
+ return max(coc1, coc2);
+}
+
+/* ------------------- GATHER UTILS ------------------- */
+
+struct DofGatherData {
+ vec4 color;
+ float weight;
+ float dist; /* TODO remove */
+ /* For scatter occlusion. */
+ float coc;
+ float coc_sqr;
+ /* For ring bucket merging. */
+ float transparency;
+
+ float layer_opacity;
+};
+
+#define GATHER_DATA_INIT DofGatherData(vec4(0.0), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
+
+void dof_gather_ammend_weight(inout DofGatherData sample_data, float weight)
+{
+ sample_data.color *= weight;
+ sample_data.coc *= weight;
+ sample_data.coc_sqr *= weight;
+ sample_data.weight *= weight;
+}
+
+void dof_gather_accumulate_sample(DofGatherData sample_data,
+ float weight,
+ inout DofGatherData accum_data)
+{
+ accum_data.color += sample_data.color * weight;
+ accum_data.coc += sample_data.coc * weight;
+ accum_data.coc_sqr += sample_data.coc * (sample_data.coc * weight);
+ accum_data.weight += weight;
+}
+
+void dof_gather_accumulate_sample_pair(DofGatherData pair_data[2],
+ float bordering_radius,
+ float intersection_multiplier,
+ bool first_ring,
+ const bool do_fast_gather,
+ const bool is_foreground,
+ inout DofGatherData ring_data,
+ inout DofGatherData accum_data)
+{
+ if (do_fast_gather) {
+ for (int i = 0; i < 2; i++) {
+ dof_gather_accumulate_sample(pair_data[i], 1.0, accum_data);
+ accum_data.layer_opacity += 1.0;
+ }
+ return;
+ }
+
+#if 0
+ const float mirroring_threshold = -layer_threshold - layer_offset;
+ /* TODO(fclem) Promote to parameter? dither with Noise? */
+ const float mirroring_min_distance = 15.0;
+ if (pair_data[0].coc < mirroring_threshold &&
+ (pair_data[1].coc - mirroring_min_distance) > pair_data[0].coc) {
+ pair_data[1].coc = pair_data[0].coc;
+ }
+ else if (pair_data[1].coc < mirroring_threshold &&
+ (pair_data[0].coc - mirroring_min_distance) > pair_data[1].coc) {
+ pair_data[0].coc = pair_data[1].coc;
+ }
+#endif
+
+ for (int i = 0; i < 2; i++) {
+ float sample_weight = dof_sample_weight(pair_data[i].coc);
+ float layer_weight = dof_layer_weight(pair_data[i].coc, is_foreground);
+ float inter_weight = dof_intersection_weight(
+ pair_data[i].coc, pair_data[i].dist, intersection_multiplier);
+ float weight = inter_weight * layer_weight * sample_weight;
+
+ /**
+ * If a CoC is larger than bordering radius we accumulate it to the general accumulator.
+ * If not, we accumulate to the ring bucket. This is to have more consistent sample occlusion.
+ **/
+ float accum_weight = dof_gather_accum_weight(pair_data[i].coc, bordering_radius, first_ring);
+ dof_gather_accumulate_sample(pair_data[i], weight * accum_weight, accum_data);
+ dof_gather_accumulate_sample(pair_data[i], weight * (1.0 - accum_weight), ring_data);
+
+ accum_data.layer_opacity += layer_weight;
+
+ if (is_foreground) {
+ ring_data.transparency += 1.0 - inter_weight * layer_weight;
+ }
+ else {
+ float coc = is_foreground ? -pair_data[i].coc : pair_data[i].coc;
+ ring_data.transparency += saturate(coc - bordering_radius);
+ }
+ }
+}
+
+void dof_gather_accumulate_sample_ring(DofGatherData ring_data,
+ int sample_count,
+ bool first_ring,
+ const bool do_fast_gather,
+ /* accum_data occludes the ring_data if true. */
+ const bool reversed_occlusion,
+ inout DofGatherData accum_data)
+{
+ if (do_fast_gather) {
+ /* Do nothing as ring_data contains nothing. All samples are already in accum_data. */
+ return;
+ }
+
+ if (first_ring) {
+ /* Layer opacity is directly accumulated into accum_data data. */
+ accum_data.color = ring_data.color;
+ accum_data.coc = ring_data.coc;
+ accum_data.coc_sqr = ring_data.coc_sqr;
+ accum_data.weight = ring_data.weight;
+
+ accum_data.transparency = ring_data.transparency / float(sample_count);
+ return;
+ }
+
+ if (ring_data.weight == 0.0) {
+ return;
+ }
+
+ float ring_avg_coc = ring_data.coc / ring_data.weight;
+ float accum_avg_coc = accum_data.coc / accum_data.weight;
+
+ /* Smooth test to set opacity to see if the ring average coc occludes the accumulation.
+ * Test is reversed to be multiplied against opacity. */
+ float ring_occlu = saturate(accum_avg_coc - ring_avg_coc);
+ /* The bias here is arbitrary. Seems to avoid weird looking foreground in most cases.
+ * We might need to make it a parameter or find a relative bias. */
+ float accum_occlu = saturate((ring_avg_coc - accum_avg_coc) * 0.1 - 1.0);
+
+#ifdef DOF_RESOLVE_PASS
+ ring_occlu = accum_occlu = 0.0;
+#endif
+
+ if (no_gather_occlusion) {
+ ring_occlu = 0.0;
+ accum_occlu = 0.0;
+ }
+
+ /* (Slide 40) */
+ float ring_opacity = saturate(1.0 - ring_data.transparency / float(sample_count));
+ float accum_opacity = 1.0 - accum_data.transparency;
+
+ if (reversed_occlusion) {
+ /* Accum_data occludes the ring. */
+ float alpha = (accum_data.weight == 0.0) ? 0.0 : accum_opacity * accum_occlu;
+ float one_minus_alpha = 1.0 - alpha;
+
+ accum_data.color += ring_data.color * one_minus_alpha;
+ accum_data.coc += ring_data.coc * one_minus_alpha;
+ accum_data.coc_sqr += ring_data.coc_sqr * one_minus_alpha;
+ accum_data.weight += ring_data.weight * one_minus_alpha;
+
+ accum_data.transparency *= 1.0 - ring_opacity;
+ }
+ else {
+ /* Ring occludes the accum_data (Same as reference). */
+ float alpha = (accum_data.weight == 0.0) ? 1.0 : (ring_opacity * ring_occlu);
+ float one_minus_alpha = 1.0 - alpha;
+
+ accum_data.color = accum_data.color * one_minus_alpha + ring_data.color;
+ accum_data.coc = accum_data.coc * one_minus_alpha + ring_data.coc;
+ accum_data.coc_sqr = accum_data.coc_sqr * one_minus_alpha + ring_data.coc_sqr;
+ accum_data.weight = accum_data.weight * one_minus_alpha + ring_data.weight;
+ }
+}
+
+/* FIXME(fclem) Seems to be wrong since it needs ringcount+1 as input for slightfocus gather. */
+int dof_gather_total_sample_count(const int ring_count, const int ring_density)
+{
+ return (ring_count * ring_count - ring_count) * ring_density + 1;
+}
+
+void dof_gather_accumulate_center_sample(DofGatherData center_data,
+ float bordering_radius,
+#ifdef DOF_RESOLVE_PASS
+ int i_radius,
+#endif
+ const bool do_fast_gather,
+ const bool is_foreground,
+ inout DofGatherData accum_data)
+{
+ float layer_weight = dof_layer_weight(center_data.coc, is_foreground);
+ float sample_weight = dof_sample_weight(center_data.coc);
+ float weight = layer_weight * sample_weight;
+ float accum_weight = dof_gather_accum_weight(center_data.coc, bordering_radius, false);
+
+ if (do_fast_gather) {
+ /* Hope for the compiler to optimize the above. */
+ layer_weight = 1.0;
+ sample_weight = 1.0;
+ accum_weight = 1.0;
+ weight = 1.0;
+ }
+
+ center_data.transparency = 1.0 - weight;
+
+ dof_gather_accumulate_sample(center_data, weight * accum_weight, accum_data);
+
+ if (!do_fast_gather) {
+#ifdef DOF_RESOLVE_PASS
+ /* NOTE(fclem): Hack to smooth transition to full in-focus opacity. */
+ int total_sample_count = dof_gather_total_sample_count(i_radius + 1, DOF_SLIGHT_FOCUS_DENSITY);
+ float fac = saturate(1.0 - abs(center_data.coc) / float(layer_threshold));
+ accum_data.layer_opacity += float(total_sample_count) * fac * fac;
+#endif
+ accum_data.layer_opacity += layer_weight;
+
+ /* Logic of dof_gather_accumulate_sample(). */
+ weight *= (1.0 - accum_weight);
+ center_data.coc_sqr = center_data.coc * (center_data.coc * weight);
+ center_data.color *= weight;
+ center_data.coc *= weight;
+ center_data.weight = weight;
+
+#ifdef DOF_FOREGROUND_PASS /* Reduce issue with closer foreground over distant foreground. */
+ float ring_area = sqr(bordering_radius);
+ dof_gather_ammend_weight(center_data, ring_area);
+#endif
+
+ /* Accumulate center as its own ring. */
+ dof_gather_accumulate_sample_ring(
+ center_data, 1, false, do_fast_gather, is_foreground, accum_data);
+ }
+}
+
+int dof_gather_total_sample_count_with_density_change(const int ring_count,
+ const int ring_density,
+ int density_change)
+{
+ int sample_count_per_density_change = dof_gather_total_sample_count(ring_count, ring_density) -
+ dof_gather_total_sample_count(
+ ring_count - gather_density_change_ring, ring_density);
+
+ return dof_gather_total_sample_count(ring_count, ring_density) +
+ sample_count_per_density_change * density_change;
+}
+
+void dof_gather_accumulate_resolve(int total_sample_count,
+ DofGatherData accum_data,
+ out vec4 out_col,
+ out float out_weight,
+ out vec2 out_occlusion)
+{
+ float weight_inv = safe_rcp(accum_data.weight);
+ out_col = accum_data.color * weight_inv;
+ out_occlusion = vec2(abs(accum_data.coc), accum_data.coc_sqr) * weight_inv;
+
+#ifdef DOF_FOREGROUND_PASS
+ out_weight = 1.0 - accum_data.transparency;
+#else
+ if (accum_data.weight > 0.0) {
+ out_weight = accum_data.layer_opacity / float(total_sample_count);
+ }
+ else {
+ out_weight = 0.0;
+ }
+#endif
+ /* Gathering may not accumulate to 1.0 alpha because of float precision. */
+ if (out_weight > 0.99) {
+ out_weight = 1.0;
+ }
+ else if (out_weight < 0.01) {
+ out_weight = 0.0;
+ }
+ /* Same thing for alpha channel. */
+ if (out_col.a > 0.99) {
+ out_col.a = 1.0;
+ }
+ else if (out_col.a < 0.01) {
+ out_col.a = 0.0;
+ }
+}
+
+ivec2 dof_square_ring_sample_offset(int ring_distance, int sample_id)
+{
+ /**
+ * Generate samples in a square pattern with the ring radius. X is the center tile.
+ *
+ * Dist1 Dist2
+ * 6 5 4 3 2
+ * 3 2 1 7 1
+ * . X 0 . X 0
+ * . . . . .
+ * . . . . .
+ *
+ * Samples are expected to be mirrored to complete the pattern.
+ **/
+ ivec2 offset;
+ if (sample_id < ring_distance) {
+ offset.x = ring_distance;
+ offset.y = sample_id;
+ }
+ else if (sample_id < ring_distance * 3) {
+ offset.x = ring_distance - sample_id + ring_distance;
+ offset.y = ring_distance;
+ }
+ else {
+ offset.x = -ring_distance;
+ offset.y = ring_distance - sample_id + 3 * ring_distance;
+ }
+ return offset;
+} \ No newline at end of file
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl
new file mode 100644
index 00000000000..51a139ad343
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl
@@ -0,0 +1,179 @@
+
+/**
+ * Reduce pass: Downsample the color buffer to generate mipmaps.
+ * Also decide if a pixel is to be convolved by scattering or gathering during the first pass.
+ **/
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+/** Inputs:
+ * COPY_PASS: Is output of setup pass (halfres) and downsample pass (quarter res).
+ * REDUCE_PASS: Is previous Gather input miplvl (halfres >> miplvl).
+ **/
+uniform sampler2D colorBuffer;
+uniform sampler2D cocBuffer;
+uniform sampler2D downsampledBuffer;
+
+uniform vec2 bokehAnisotropy;
+uniform float scatterColorThreshold;
+uniform float scatterCocThreshold;
+uniform float scatterColorNeighborMax;
+uniform float colorNeighborClamping;
+
+/** Outputs:
+ * COPY_PASS: Gather input mip0.
+ * REDUCE_PASS: Is next Gather input miplvl (halfres >> miplvl).
+ **/
+layout(location = 0) out vec4 outColor;
+layout(location = 1) out float outCoc;
+
+#ifdef COPY_PASS
+
+layout(location = 2) out vec3 outScatterColor;
+
+/* NOTE: Do not compare alpha as it is not scattered by the scatter pass. */
+float dof_scatter_neighborhood_rejection(vec3 color)
+{
+ color = min(vec3(scatterColorNeighborMax), color);
+
+ float validity = 0.0;
+
+ /* Centered in the middle of 4 quarter res texel. */
+ vec2 texel_size = 1.0 / vec2(textureSize(downsampledBuffer, 0).xy);
+ vec2 uv = (gl_FragCoord.xy * 0.5) * texel_size;
+
+ vec3 max_diff = vec3(0.0);
+ for (int i = 0; i < 4; i++) {
+ vec2 sample_uv = uv + quad_offsets[i] * texel_size;
+ vec3 ref = textureLod(downsampledBuffer, sample_uv, 0.0).rgb;
+
+ ref = min(vec3(scatterColorNeighborMax), ref);
+ float diff = max_v3(max(vec3(0.0), abs(ref - color)));
+
+ const float rejection_threshold = 0.7;
+ diff = saturate(diff / rejection_threshold - 1.0);
+ validity = max(validity, diff);
+ }
+
+ return validity;
+}
+
+/* This avoids sprite popping in and out at the screen border and
+ * drawing sprites larger than the screen. */
+float dof_scatter_screen_border_rejection(float coc, vec2 uv, vec2 screen_size)
+{
+ vec2 screen_pos = uv * screen_size;
+ float min_screen_border_distance = min_v2(min(screen_pos, screen_size - screen_pos));
+ /* Fullres to halfres CoC. */
+ coc *= 0.5;
+ /* Allow 10px transition. */
+ const float rejection_hardeness = 1.0 / 10.0;
+ return saturate((min_screen_border_distance - abs(coc)) * rejection_hardeness + 1.0);
+}
+
+float dof_scatter_luminosity_rejection(vec3 color)
+{
+ const float rejection_hardness = 1.0;
+ return saturate(max_v3(color - scatterColorThreshold) * rejection_hardness);
+}
+
+float dof_scatter_coc_radius_rejection(float coc)
+{
+ const float rejection_hardness = 0.3;
+ return saturate((abs(coc) - scatterCocThreshold) * rejection_hardness);
+}
+
+float fast_luma(vec3 color)
+{
+ return (2.0 * color.g) + color.r + color.b;
+}
+
+/* Lightweight version of neighborhood clamping found in TAA. */
+vec3 dof_neighborhood_clamping(vec3 color)
+{
+ vec2 texel_size = 1.0 / vec2(textureSize(colorBuffer, 0));
+ vec2 uv = gl_FragCoord.xy * texel_size;
+ vec4 ofs = vec4(-1, 1, -1, 1) * texel_size.xxyy;
+
+ /* Luma clamping. 3x3 square neighborhood. */
+ float c00 = fast_luma(textureLod(colorBuffer, uv + ofs.xz, 0.0).rgb);
+ float c01 = fast_luma(textureLod(colorBuffer, uv + ofs.xz * vec2(1.0, 0.0), 0.0).rgb);
+ float c02 = fast_luma(textureLod(colorBuffer, uv + ofs.xw, 0.0).rgb);
+
+ float c10 = fast_luma(textureLod(colorBuffer, uv + ofs.xz * vec2(0.0, 1.0), 0.0).rgb);
+ float c11 = fast_luma(color);
+ float c12 = fast_luma(textureLod(colorBuffer, uv + ofs.xw * vec2(0.0, 1.0), 0.0).rgb);
+
+ float c20 = fast_luma(textureLod(colorBuffer, uv + ofs.yz, 0.0).rgb);
+ float c21 = fast_luma(textureLod(colorBuffer, uv + ofs.yz * vec2(1.0, 0.0), 0.0).rgb);
+ float c22 = fast_luma(textureLod(colorBuffer, uv + ofs.yw, 0.0).rgb);
+
+ float avg_luma = avg8(c00, c01, c02, c10, c12, c20, c21, c22);
+ float max_luma = max8(c00, c01, c02, c10, c12, c20, c21, c22);
+
+ float upper_bound = mix(max_luma, avg_luma, colorNeighborClamping);
+ upper_bound = mix(c11, upper_bound, colorNeighborClamping);
+
+ float clamped_luma = min(upper_bound, c11);
+
+ return color * clamped_luma * safe_rcp(c11);
+}
+
+/* Simple copy pass where we select what pixels to scatter. Also the resolution might change.
+ * NOTE: The texture can end up being too big because of the mipmap padding. We correct for
+ * that during the convolution phase. */
+void main()
+{
+ vec2 halfres = vec2(textureSize(colorBuffer, 0).xy);
+ vec2 uv = gl_FragCoord.xy / halfres;
+
+ outColor = textureLod(colorBuffer, uv, 0.0);
+ outCoc = textureLod(cocBuffer, uv, 0.0).r;
+
+ outColor.rgb = dof_neighborhood_clamping(outColor.rgb);
+
+ /* Only scatter if luminous enough. */
+ float do_scatter = dof_scatter_luminosity_rejection(outColor.rgb);
+ /* Only scatter if CoC is big enough. */
+ do_scatter *= dof_scatter_coc_radius_rejection(outCoc);
+ /* Only scatter if CoC is not too big to avoid performance issues. */
+ do_scatter *= dof_scatter_screen_border_rejection(outCoc, uv, halfres);
+ /* Only scatter if neighborhood is different enough. */
+ do_scatter *= dof_scatter_neighborhood_rejection(outColor.rgb);
+ /* For debuging. */
+ do_scatter *= float(!no_scatter_pass);
+
+ outScatterColor = mix(vec3(0.0), outColor.rgb, do_scatter);
+ outColor.rgb = mix(outColor.rgb, vec3(0.0), do_scatter);
+
+ /* Apply energy conservation to anamorphic scattered bokeh. */
+ outScatterColor /= min_v2(bokehAnisotropy);
+}
+
+#else /* REDUCE_PASS */
+
+/* Downsample pass done for each mip starting from mip1. */
+void main()
+{
+ vec2 input_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy);
+ /* Center uv around the 4 pixels of the previous mip. */
+ vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * input_texel_size;
+
+ vec4 colors[4];
+ vec4 cocs;
+ for (int i = 0; i < 4; i++) {
+ vec2 sample_uv = quad_center + quad_offsets[i] * input_texel_size;
+ colors[i] = dof_load_gather_color(colorBuffer, sample_uv, 0.0);
+ cocs[i] = textureLod(cocBuffer, sample_uv, 0.0).r;
+ }
+
+ vec4 weights = dof_downsample_bilateral_coc_weights(cocs);
+ weights *= dof_downsample_bilateral_color_weights(colors);
+ /* Normalize so that the sum is 1. */
+ weights *= safe_rcp(sum(weights));
+
+ outColor = weighted_sum_array(colors, weights);
+ outCoc = dot(cocs, weights);
+}
+
+#endif
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl
new file mode 100644
index 00000000000..469745206e2
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl
@@ -0,0 +1,212 @@
+
+/**
+ * Recombine Pass: Load separate convolution layer and composite with self slight defocus
+ * convolution and in-focus fields.
+ *
+ * The halfres gather methods are fast but lack precision for small CoC areas. To fix this we
+ * do a bruteforce gather to have a smooth transition between in-focus and defocus regions.
+ */
+
+#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+uniform sampler2D fullResColorBuffer;
+uniform sampler2D fullResDepthBuffer;
+
+uniform sampler2D bgColorBuffer;
+uniform sampler2D bgWeightBuffer;
+uniform sampler2D bgTileBuffer;
+
+uniform sampler2D fgColorBuffer;
+uniform sampler2D fgWeightBuffer;
+uniform sampler2D fgTileBuffer;
+
+uniform sampler2D holefillColorBuffer;
+uniform sampler2D holefillWeightBuffer;
+
+uniform sampler2D bokehLut;
+
+uniform float bokehMaxSize;
+
+in vec4 uvcoordsvar;
+
+out vec4 fragColor;
+
+void dof_slight_focus_gather(float radius, out vec4 out_color, out float out_weight)
+{
+ /* offset coord to avoid correlation with sampling pattern. */
+ vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy + 7.0);
+
+ DofGatherData fg_accum = GATHER_DATA_INIT;
+ DofGatherData bg_accum = GATHER_DATA_INIT;
+
+ int i_radius = clamp(int(radius), 0, int(layer_threshold));
+ const int resolve_ring_density = DOF_SLIGHT_FOCUS_DENSITY;
+ ivec2 texel = ivec2(gl_FragCoord.xy);
+
+ bool first_ring = true;
+
+ for (int ring = i_radius; ring > 0; ring--) {
+ DofGatherData fg_ring = GATHER_DATA_INIT;
+ DofGatherData bg_ring = GATHER_DATA_INIT;
+
+ int ring_distance = ring;
+ int ring_sample_count = resolve_ring_density * ring_distance;
+ for (int sample_id = 0; sample_id < ring_sample_count; sample_id++) {
+ int s = sample_id * (4 / resolve_ring_density) +
+ int(noise.y * float((4 - resolve_ring_density) * ring_distance));
+
+ ivec2 offset = dof_square_ring_sample_offset(ring_distance, s);
+ float ring_dist = length(vec2(offset));
+
+ DofGatherData pair_data[2];
+ for (int i = 0; i < 2; i++) {
+ ivec2 sample_offset = ((i == 0) ? offset : -offset);
+ ivec2 sample_texel = texel + sample_offset;
+ /* OPTI: could precompute the factor. */
+ vec2 sample_uv = (vec2(sample_texel) + 0.5) / vec2(textureSize(fullResDepthBuffer, 0));
+ float depth = textureLod(fullResDepthBuffer, sample_uv, 0.0).r;
+ pair_data[i].color = safe_color(textureLod(fullResColorBuffer, sample_uv, 0.0));
+ pair_data[i].coc = dof_coc_from_zdepth(depth);
+ pair_data[i].dist = ring_dist;
+#ifdef DOF_BOKEH_TEXTURE
+ /* Contains subpixel distance to bokeh shape. */
+ pair_data[i].dist = texelFetch(bokehLut, sample_offset + DOF_MAX_SLIGHT_FOCUS_RADIUS, 0).r;
+#endif
+ pair_data[i].coc = clamp(pair_data[i].coc, -bokehMaxSize, bokehMaxSize);
+ }
+
+ float bordering_radius = ring_dist + 0.5;
+ const float isect_mul = 1.0;
+ dof_gather_accumulate_sample_pair(
+ pair_data, bordering_radius, isect_mul, first_ring, false, false, bg_ring, bg_accum);
+
+#ifdef DOF_BOKEH_TEXTURE
+ /* Swap distances in order to flip bokeh shape for foreground. */
+ float tmp = pair_data[0].dist;
+ pair_data[0].dist = pair_data[1].dist;
+ pair_data[1].dist = tmp;
+#endif
+ dof_gather_accumulate_sample_pair(
+ pair_data, bordering_radius, isect_mul, first_ring, false, true, fg_ring, fg_accum);
+ }
+
+ dof_gather_accumulate_sample_ring(
+ bg_ring, ring_sample_count * 2, first_ring, false, false, bg_accum);
+ dof_gather_accumulate_sample_ring(
+ fg_ring, ring_sample_count * 2, first_ring, false, true, fg_accum);
+
+ first_ring = false;
+ }
+
+ /* Center sample. */
+ vec2 sample_uv = uvcoordsvar.xy;
+ float depth = textureLod(fullResDepthBuffer, sample_uv, 0.0).r;
+ DofGatherData center_data;
+ center_data.color = safe_color(textureLod(fullResColorBuffer, sample_uv, 0.0));
+ center_data.coc = dof_coc_from_zdepth(depth);
+ center_data.coc = clamp(center_data.coc, -bokehMaxSize, bokehMaxSize);
+ center_data.dist = 0.0;
+
+ /* Slide 38. */
+ float bordering_radius = 0.5;
+
+ dof_gather_accumulate_center_sample(
+ center_data, bordering_radius, i_radius, false, true, fg_accum);
+ dof_gather_accumulate_center_sample(
+ center_data, bordering_radius, i_radius, false, false, bg_accum);
+
+ vec4 bg_col, fg_col;
+ float bg_weight, fg_weight;
+ vec2 unused_occlusion;
+
+ int total_sample_count = dof_gather_total_sample_count(i_radius + 1, resolve_ring_density);
+ dof_gather_accumulate_resolve(total_sample_count, bg_accum, bg_col, bg_weight, unused_occlusion);
+ dof_gather_accumulate_resolve(total_sample_count, fg_accum, fg_col, fg_weight, unused_occlusion);
+
+ /* Fix weighting issues on perfectly focus > slight focus transitionning areas. */
+ if (abs(center_data.coc) < 0.5) {
+ bg_col = center_data.color;
+ bg_weight = 1.0;
+ }
+
+ /* Alpha Over */
+ float alpha = 1.0 - fg_weight;
+ out_weight = bg_weight * alpha + fg_weight;
+ out_color = bg_col * bg_weight * alpha + fg_col * fg_weight;
+}
+
+void dof_resolve_load_layer(sampler2D color_tex,
+ sampler2D weight_tex,
+ out vec4 out_color,
+ out float out_weight)
+{
+ vec2 pixel_co = gl_FragCoord.xy / 2.0;
+ vec2 uv = pixel_co / textureSize(color_tex, 0).xy;
+ out_color = textureLod(color_tex, uv, 0.0);
+ out_weight = textureLod(weight_tex, uv, 0.0).r;
+}
+
+void main(void)
+{
+ ivec2 tile_co = ivec2(gl_FragCoord.xy / float(DOF_TILE_DIVISOR));
+ CocTile coc_tile = dof_coc_tile_load(fgTileBuffer, bgTileBuffer, tile_co);
+ CocTilePrediction prediction = dof_coc_tile_prediction_get(coc_tile);
+
+ fragColor = vec4(0.0);
+ float weight = 0.0;
+
+ vec4 layer_color;
+ float layer_weight;
+
+ if (!no_holefill_pass && prediction.do_holefill) {
+ dof_resolve_load_layer(holefillColorBuffer, holefillWeightBuffer, layer_color, layer_weight);
+ fragColor = layer_color * safe_rcp(layer_weight);
+ weight = float(layer_weight > 0.0);
+ }
+
+ if (!no_background_pass && prediction.do_background) {
+ dof_resolve_load_layer(bgColorBuffer, bgWeightBuffer, layer_color, layer_weight);
+ /* Always prefer background to holefill pass. */
+ layer_color *= safe_rcp(layer_weight);
+ layer_weight = float(layer_weight > 0.0);
+ /* Composite background. */
+ fragColor = fragColor * (1.0 - layer_weight) + layer_color;
+ weight = weight * (1.0 - layer_weight) + layer_weight;
+ /* Fill holes with the composited background. */
+ fragColor *= safe_rcp(weight);
+ weight = float(weight > 0.0);
+ }
+
+ if (!no_slight_focus_pass && prediction.do_slight_focus) {
+ dof_slight_focus_gather(coc_tile.fg_slight_focus_max_coc, layer_color, layer_weight);
+ /* Composite slight defocus. */
+ fragColor = fragColor * (1.0 - layer_weight) + layer_color;
+ weight = weight * (1.0 - layer_weight) + layer_weight;
+ }
+
+ if (!no_focus_pass && prediction.do_focus) {
+ layer_color = safe_color(textureLod(fullResColorBuffer, uvcoordsvar.xy, 0.0));
+ layer_weight = 1.0;
+ /* Composite in focus. */
+ fragColor = fragColor * (1.0 - layer_weight) + layer_color;
+ weight = weight * (1.0 - layer_weight) + layer_weight;
+ }
+
+ if (!no_foreground_pass && prediction.do_foreground) {
+ dof_resolve_load_layer(fgColorBuffer, fgWeightBuffer, layer_color, layer_weight);
+ /* Composite foreground. */
+ fragColor = fragColor * (1.0 - layer_weight) + layer_color;
+ }
+
+ /* Fix float precision issue in alpha compositing. */
+ if (fragColor.a > 0.99) {
+ fragColor.a = 1.0;
+ }
+
+#if 0 /* Debug */
+ if (coc_tile.fg_slight_focus_max_coc >= 0.5) {
+ fragColor.rgb *= vec3(1.0, 0.1, 0.1);
+ }
+#endif
+} \ No newline at end of file
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl
new file mode 100644
index 00000000000..704bbf6d999
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl
@@ -0,0 +1,85 @@
+
+/**
+ * Scatter pass: Use sprites to scatter the color of very bright pixel to have higher quality blur.
+ *
+ * We only scatter one triangle per sprite and one sprite per 4 pixels to reduce vertex shader
+ * invocations and overdraw.
+ **/
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+uniform sampler2D occlusionBuffer;
+uniform sampler2D bokehLut;
+
+uniform vec2 bokehAnisotropyInv;
+
+flat in vec4 color1;
+flat in vec4 color2;
+flat in vec4 color3;
+flat in vec4 color4;
+flat in vec4 weights;
+flat in vec4 cocs;
+flat in vec2 spritepos;
+flat in float spritesize; /* MaxCoC */
+
+layout(location = 0) out vec4 fragColor;
+
+float bokeh_shape(vec2 center)
+{
+ vec2 co = gl_FragCoord.xy - center;
+
+#ifdef DOF_BOKEH_TEXTURE
+ co *= bokehAnisotropyInv;
+ float texture_size = float(textureSize(bokehLut, 0).x);
+ /* Bias scale to avoid sampling at the texture's border. */
+ float scale_fac = spritesize * (float(DOF_BOKEH_LUT_SIZE) / float(DOF_BOKEH_LUT_SIZE - 1));
+ float dist = scale_fac * textureLod(bokehLut, (co / scale_fac) * 0.5 + 0.5, 0.0).r;
+#else
+ float dist = length(co);
+#endif
+
+ return dist;
+}
+
+#define linearstep(p0, p1, v) (clamp(((v) - (p0)) / abs((p1) - (p0)), 0.0, 1.0))
+
+void main(void)
+{
+ vec4 shapes;
+ for (int i = 0; i < 4; i++) {
+ shapes[i] = bokeh_shape(spritepos + quad_offsets[i]);
+ }
+ /* Becomes signed distance field in pixel units. */
+ shapes -= cocs;
+ /* Smooth the edges a bit to fade out the undersampling artifacts. */
+ shapes = 1.0 - linearstep(-0.8, 0.8, shapes);
+ /* Outside of bokeh shape. Try to avoid overloading ROPs. */
+ if (max_v4(shapes) == 0.0) {
+ discard;
+ }
+
+ if (!no_scatter_occlusion) {
+ /* Works because target is the same size as occlusionBuffer. */
+ vec2 uv = gl_FragCoord.xy / vec2(textureSize(occlusionBuffer, 0).xy);
+ vec2 occlusion_data = texture(occlusionBuffer, uv).rg;
+ /* Fix tilling artifacts. (Slide 90) */
+ const float correction_fac = 1.0 - DOF_FAST_GATHER_COC_ERROR;
+ /* Occlude the sprite with geometry from the same field
+ * using a VSM like chebychev test (slide 85). */
+ float mean = occlusion_data.x;
+ float variance = occlusion_data.x;
+ shapes *= variance * safe_rcp(variance + sqr(max(cocs * correction_fac - mean, 0.0)));
+ }
+
+ fragColor = color1 * shapes.x;
+ fragColor += color2 * shapes.y;
+ fragColor += color3 * shapes.z;
+ fragColor += color4 * shapes.w;
+
+ /* Do not accumulate alpha. This has already been accumulated by the gather pass. */
+ fragColor.a = 0.0;
+
+#ifdef DOF_DEBUG_SCATTER_PERF
+ fragColor.rgb = avg(fragColor.rgb) * vec3(1.0, 0.0, 0.0);
+#endif
+}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl
new file mode 100644
index 00000000000..276ab119fab
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl
@@ -0,0 +1,138 @@
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+uniform vec2 targetTexelSize;
+uniform int spritePerRow;
+uniform vec2 bokehAnisotropy;
+
+uniform sampler2D colorBuffer;
+uniform sampler2D cocBuffer;
+
+/* Scatter pass, calculate a triangle covering the CoC.
+ * We render to a half resolution target with double width so we can
+ * separate near and far fields. We also generate only one triangle per group of 4 pixels
+ * to limit overdraw. */
+
+flat out vec4 color1;
+flat out vec4 color2;
+flat out vec4 color3;
+flat out vec4 color4;
+flat out vec4 weights;
+flat out vec4 cocs;
+flat out vec2 spritepos;
+flat out float spritesize;
+
+/* Load 4 Circle of confusion values. texel_co is centered around the 4 taps. */
+vec4 fetch_cocs(vec2 texel_co)
+{
+ /* TODO(fclem) The textureGather(sampler, co, comp) variant isn't here on some implementations.*/
+#if 0 // GPU_ARB_texture_gather
+ vec2 uvs = texel_co / vec2(textureSize(cocBuffer, 0));
+ /* Reminder: Samples order is CW starting from top left. */
+ cocs = textureGather(cocBuffer, uvs, isForegroundPass ? 0 : 1);
+#else
+ ivec2 texel = ivec2(texel_co - 0.5);
+ vec4 cocs;
+ cocs.x = texelFetchOffset(cocBuffer, texel, 0, ivec2(0, 1)).r;
+ cocs.y = texelFetchOffset(cocBuffer, texel, 0, ivec2(1, 1)).r;
+ cocs.z = texelFetchOffset(cocBuffer, texel, 0, ivec2(1, 0)).r;
+ cocs.w = texelFetchOffset(cocBuffer, texel, 0, ivec2(0, 0)).r;
+#endif
+
+#ifdef DOF_FOREGROUND_PASS
+ cocs *= -1.0;
+#endif
+
+ cocs = max(vec4(0.0), cocs);
+ /* We are scattering at half resolution, so divide CoC by 2. */
+ return cocs * 0.5;
+}
+
+void vertex_discard()
+{
+ /* Don't produce any fragments */
+ gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
+}
+
+void main()
+{
+ ivec2 tex_size = textureSize(cocBuffer, 0);
+
+ int t_id = gl_VertexID / 3; /* Triangle Id */
+
+ /* Some math to get the target pixel. */
+ ivec2 texelco = ivec2(t_id % spritePerRow, t_id / spritePerRow) * 2;
+
+ /* Center sprite around the 4 texture taps. */
+ spritepos = vec2(texelco) + 1.0;
+
+ cocs = fetch_cocs(spritepos);
+
+ /* Early out from local CoC radius. */
+ if (all(lessThan(cocs, vec4(0.5)))) {
+ vertex_discard();
+ return;
+ }
+
+ vec2 input_texel_size = 1.0 / vec2(tex_size);
+ vec2 quad_center = spritepos * input_texel_size;
+ vec4 colors[4];
+ bool no_color = true;
+ for (int i = 0; i < 4; i++) {
+ vec2 sample_uv = quad_center + quad_offsets[i] * input_texel_size;
+
+ colors[i] = dof_load_scatter_color(colorBuffer, sample_uv, 0.0);
+ no_color = no_color && all(equal(colors[i].rgb, vec3(0.0)));
+ }
+
+ /* Early out from no color to scatter. */
+ if (no_color) {
+ vertex_discard();
+ return;
+ }
+
+ weights = dof_layer_weight(cocs) * dof_sample_weight(cocs);
+ /* Filter NaNs. */
+ weights = mix(weights, vec4(0.0), equal(cocs, vec4(0.0)));
+
+ color1 = colors[0] * weights[0];
+ color2 = colors[1] * weights[1];
+ color3 = colors[2] * weights[2];
+ color4 = colors[3] * weights[3];
+
+ /* Extend to cover at least the unit circle */
+ const float extend = (cos(M_PI / 4.0) + 1.0) * 2.0;
+ /* Crappy diagram
+ * ex 1
+ * | \
+ * | \
+ * 1 | \
+ * | \
+ * | \
+ * 0 | x \
+ * | Circle \
+ * | Origin \
+ * -1 0 --------------- 2
+ * -1 0 1 ex
+ */
+
+ /* Generate Triangle : less memory fetches from a VBO */
+ int v_id = gl_VertexID % 3; /* Vertex Id */
+ gl_Position.x = float(v_id / 2) * extend - 1.0; /* int divisor round down */
+ gl_Position.y = float(v_id % 2) * extend - 1.0;
+ gl_Position.z = 0.0;
+ gl_Position.w = 1.0;
+
+ spritesize = max_v4(cocs);
+
+ /* Add 2.5 to max_coc because the max_coc may not be centered on the sprite origin
+ * and because we smooth the bokeh shape a bit in the pixel shader. */
+ gl_Position.xy *= spritesize * bokehAnisotropy + 2.5;
+ /* Position the sprite. */
+ gl_Position.xy += spritepos;
+ /* NDC range [-1..1]. */
+ gl_Position.xy = gl_Position.xy * targetTexelSize * 2.0 - 1.0;
+
+ /* Add 2.5 for the same reason but without the ratio. */
+ spritesize += 2.5;
+}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl
new file mode 100644
index 00000000000..d1ecc0fc244
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl
@@ -0,0 +1,65 @@
+
+/**
+ * Setup pass: CoC and luma aware downsample to half resolution of the input scene color buffer.
+ *
+ * An addition to the downsample CoC, we output the maximum slight out of focus CoC to be
+ * sure we don't miss a pixel.
+ **/
+
+#pragma BLENDER_REQUIRE(effect_dof_lib.glsl)
+
+/* Full resolution. */
+uniform sampler2D colorBuffer;
+uniform sampler2D depthBuffer;
+
+uniform float bokehMaxSize;
+
+/* Half resolution. */
+layout(location = 0) out vec4 outColor;
+layout(location = 1) out vec2 outCoc; /* x: Downsample CoC, y: Max slight focus abs CoC */
+
+void main()
+{
+ vec2 fullres_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy);
+ /* Center uv around the 4 fullres pixels. */
+ vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * fullres_texel_size;
+
+ vec4 colors[4];
+ vec4 depths;
+ for (int i = 0; i < 4; i++) {
+ vec2 sample_uv = quad_center + quad_offsets[i] * fullres_texel_size;
+ colors[i] = safe_color(textureLod(colorBuffer, sample_uv, 0.0));
+ depths[i] = textureLod(depthBuffer, sample_uv, 0.0).r;
+ }
+
+ vec4 cocs = dof_coc_from_zdepth(depths);
+
+ cocs = clamp(cocs, -bokehMaxSize, bokehMaxSize);
+
+ vec4 weights = dof_downsample_bilateral_coc_weights(cocs);
+ weights *= dof_downsample_bilateral_color_weights(colors);
+ /* Normalize so that the sum is 1. */
+ weights *= safe_rcp(sum(weights));
+
+ outColor = weighted_sum_array(colors, weights);
+ outCoc.x = dot(cocs, weights);
+
+ /* Max slight focus abs CoC. */
+
+ /* Clamp to 0.5 if full in defocus to differentiate full focus tiles with coc == 0.0.
+ * This enables an optimization in the resolve pass. */
+ const vec4 threshold = vec4(layer_threshold + layer_offset);
+ cocs = abs(cocs);
+ bvec4 defocus = greaterThan(cocs, threshold);
+ bvec4 focus = lessThanEqual(cocs, vec4(0.5));
+ if (any(defocus) && any(focus)) {
+ /* For the same reason as in the flatten pass. This is a case we cannot optimize for. */
+ cocs = mix(cocs, vec4(DOF_TILE_MIXED), focus);
+ cocs = mix(cocs, vec4(DOF_TILE_MIXED), defocus);
+ }
+ else {
+ cocs = mix(cocs, vec4(DOF_TILE_FOCUS), focus);
+ cocs = mix(cocs, vec4(DOF_TILE_DEFOCUS), defocus);
+ }
+ outCoc.y = max_v4(cocs);
+}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl
deleted file mode 100644
index 6e35d4a54ae..00000000000
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl
+++ /dev/null
@@ -1,109 +0,0 @@
-
-#pragma BLENDER_REQUIRE(common_math_lib.glsl)
-
-uniform vec4 bokehParams[2];
-
-#define bokeh_rotation bokehParams[0].x
-#define bokeh_ratio bokehParams[0].y
-#define bokeh_maxsize bokehParams[0].z
-
-uniform sampler2D nearBuffer;
-uniform sampler2D farBuffer;
-uniform sampler2D cocBuffer;
-
-flat out vec4 color;
-flat out float weight;
-flat out float smoothFac;
-flat out ivec2 edge;
-out vec2 particlecoord;
-
-/* Scatter pass, calculate a triangle covering the CoC. */
-void main()
-{
- ivec2 tex_size = textureSize(cocBuffer, 0);
- /* We render to a double width texture so compute
- * the target texel size accordingly */
- vec2 texel_size = vec2(0.5, 1.0) / vec2(tex_size);
-
- int t_id = gl_VertexID / 3; /* Triangle Id */
-
- ivec2 texelco = ivec2(0);
- /* some math to get the target pixel */
- texelco.x = t_id % tex_size.x;
- texelco.y = t_id / tex_size.x;
-
- vec2 cocs = texelFetch(cocBuffer, texelco, 0).rg;
-
- bool is_near = (cocs.x > cocs.y);
- float coc = (is_near) ? cocs.x : cocs.y;
-
- /* Clamp to max size for performance */
- coc = min(coc, bokeh_maxsize);
-
- if (coc >= 1.0) {
- if (is_near) {
- color = texelFetch(nearBuffer, texelco, 0);
- }
- else {
- color = texelFetch(farBuffer, texelco, 0);
- }
- /* find the area the pixel will cover and divide the color by it */
- /* HACK: 4.0 out of nowhere (I suppose it's 4 pixels footprint for coc 0?)
- * Makes near in focus more closer to 1.0 alpha. */
- weight = 4.0 / (coc * coc * M_PI);
- color *= weight;
-
- /* Compute edge to discard fragment that does not belong to the other layer. */
- edge.x = (is_near) ? 1 : -1;
- edge.y = (is_near) ? -tex_size.x + 1 : tex_size.x;
- }
- else {
- /* Don't produce any fragments */
- color = vec4(0.0);
- gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
- return;
- }
-
- /* Generate Triangle : less memory fetches from a VBO */
- int v_id = gl_VertexID % 3; /* Vertex Id */
-
- /* Extend to cover at least the unit circle */
- const float extend = (cos(M_PI / 4.0) + 1.0) * 2.0;
- /* Crappy diagram
- * ex 1
- * | \
- * | \
- * 1 | \
- * | \
- * | \
- * 0 | x \
- * | Circle \
- * | Origin \
- * -1 0 --------------- 2
- * -1 0 1 ex
- */
- gl_Position.x = float(v_id / 2) * extend - 1.0; /* int divisor round down */
- gl_Position.y = float(v_id % 2) * extend - 1.0;
- gl_Position.z = 0.0;
- gl_Position.w = 1.0;
-
- /* Generate Triangle */
- particlecoord = gl_Position.xy;
-
- gl_Position.xy *= coc * texel_size * vec2(bokeh_ratio, 1.0);
- gl_Position.xy -= 1.0 - 0.5 * texel_size; /* NDC Bottom left */
- gl_Position.xy += (0.5 + vec2(texelco) * 2.0) * texel_size;
-
- /* Push far plane to left side. */
- if (!is_near) {
- gl_Position.x += 2.0 / 2.0;
- }
-
- /* don't do smoothing for small sprites */
- if (coc > 3.0) {
- smoothFac = 1.0 - 1.5 / coc;
- }
- else {
- smoothFac = 1.0;
- }
-}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl
index 47fe21928b3..19ae0acc443 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl
@@ -26,60 +26,99 @@ uniform sampler2D depthBuffer;
#endif
-uniform float rotationOffset;
-
-#ifdef DEBUG_AO
-
-void main()
+/* Similar to https://atyuwen.github.io/posts/normal-reconstruction/.
+ * This samples the depth buffer 4 time for each direction to get the most correct
+ * implicit normal reconstruction out of the depth buffer. */
+vec3 view_position_derivative_from_depth(vec2 uvs, vec2 ofs, vec3 vP, float depth_center)
{
- vec2 texel_size = 1.0 / vec2(textureSize(depthBuffer, 0)).xy;
- vec2 uvs = saturate(gl_FragCoord.xy * texel_size);
+ vec2 uv1 = uvs - ofs * 2.0;
+ vec2 uv2 = uvs - ofs;
+ vec2 uv3 = uvs + ofs;
+ vec2 uv4 = uvs + ofs * 2.0;
+ vec4 H;
+ H.x = gtao_textureLod(gtao_depthBuffer, uv1, 0.0).r;
+ H.y = gtao_textureLod(gtao_depthBuffer, uv2, 0.0).r;
+ H.z = gtao_textureLod(gtao_depthBuffer, uv3, 0.0).r;
+ H.w = gtao_textureLod(gtao_depthBuffer, uv4, 0.0).r;
+ /* Fix issue with depth precision. Take even larger diff. */
+ vec4 diff = abs(vec4(depth_center, H.yzw) - H.x);
+ if (max_v4(diff) < 2.4e-7 && all(lessThan(diff.xyz, diff.www))) {
+ return 0.25 * (get_view_space_from_depth(uv3, H.w) - get_view_space_from_depth(uv1, H.x));
+ }
+ /* Simplified (H.xw + 2.0 * (H.yz - H.xw)) - depth_center */
+ vec2 deltas = abs((2.0 * H.yz - H.xw) - depth_center);
+ if (deltas.x < deltas.y) {
+ return vP - get_view_space_from_depth(uv2, H.y);
+ }
+ else {
+ return get_view_space_from_depth(uv3, H.z) - vP;
+ }
+}
- float depth = textureLod(depthBuffer, uvs, 0.0).r;
+/* TODO(fclem) port to a common place for other effects to use. */
+bool reconstruct_view_position_and_normal_from_depth(vec2 texel, out vec3 vP, out vec3 vNg)
+{
+ vec2 texel_size = 1.0 / vec2(textureSize(gtao_depthBuffer, 0).xy);
+ vec2 uvs = gl_FragCoord.xy * texel_size;
+ float depth_center = gtao_textureLod(gtao_depthBuffer, uvs, 0.0).r;
- vec3 viewPosition = get_view_space_from_depth(uvs, depth);
- vec3 V = viewCameraVec;
- vec3 normal = normal_decode(texture(normalBuffer, uvs).rg, V);
+ /* Background case. */
+ if (depth_center == 1.0) {
+ return false;
+ }
- vec3 bent_normal;
- float visibility;
+ vP = get_view_space_from_depth(uvs, depth_center);
- vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy);
+ vec3 dPdx = view_position_derivative_from_depth(uvs, texel_size * vec2(1, 0), vP, depth_center);
+ vec3 dPdy = view_position_derivative_from_depth(uvs, texel_size * vec2(0, 1), vP, depth_center);
- gtao_deferred(normal, noise, depth, visibility, bent_normal);
+ vNg = safe_normalize(cross(dPdx, dPdy));
- /* Handle Background case. Prevent artifact due to uncleared Horizon Render Target. */
- FragColor = vec4((depth == 1.0) ? 0.0 : visibility);
+ return true;
}
-#else
+#ifdef DEBUG_AO
+
+in vec4 uvcoordsvar;
void main()
{
- vec2 uvs = saturate(gl_FragCoord.xy / vec2(textureSize(gtao_depthBuffer, 0).xy));
- float depth = gtao_textureLod(gtao_depthBuffer, uvs, 0.0).r;
+ vec3 vP, vNg;
- if (depth == 1.0) {
- /* Do not trace for background */
+ if (!reconstruct_view_position_and_normal_from_depth(gl_FragCoord.xy, vP, vNg)) {
+ /* Handle Background case. Prevent artifact due to uncleared Horizon Render Target. */
FragColor = vec4(0.0);
- return;
}
+ else {
+ vec3 P = transform_point(ViewMatrixInverse, vP);
+ vec3 V = cameraVec(P);
+ vec3 vV = viewCameraVec(vP);
+ vec3 vN = normal_decode(texture(normalBuffer, uvcoordsvar.xy).rg, vV);
+ vec3 N = transform_direction(ViewMatrixInverse, vN);
+ vec3 Ng = transform_direction(ViewMatrixInverse, vNg);
+
+ OcclusionData data = occlusion_load(vP, 1.0);
+
+ float visibility = diffuse_occlusion(data, V, N, Ng);
+
+ FragColor = vec4(visibility);
+ }
+}
- /* Avoid self shadowing. */
- depth = saturate(depth - 3e-6); /* Tweaked for 24bit depth buffer. */
+#else
- vec3 viewPosition = get_view_space_from_depth(uvs, depth);
- vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy);
- vec2 max_dir = get_max_dir(viewPosition.z);
- vec4 dirs;
- dirs.xy = get_ao_dir(noise.x * 0.5);
- dirs.zw = get_ao_dir(noise.x * 0.5 + 0.5);
+void main()
+{
+ vec2 uvs = gl_FragCoord.xy / vec2(textureSize(gtao_depthBuffer, 0).xy);
+ float depth = gtao_textureLod(gtao_depthBuffer, uvs, 0.0).r;
+ vec3 vP = get_view_space_from_depth(uvs, depth);
- /* Search in 4 directions. */
- FragColor.xy = search_horizon_sweep(dirs.xy, viewPosition, uvs, noise.y, max_dir);
- FragColor.zw = search_horizon_sweep(dirs.zw, viewPosition, uvs, noise.y, max_dir);
+ OcclusionData data = NO_OCCLUSION_DATA;
+ /* Do not trace for background */
+ if (depth != 1.0) {
+ data = occlusion_search(vP, maxzBuffer, aoDistance, 0.0, 8.0);
+ }
- /* Resize output for integer texture. */
- FragColor = pack_horizons(FragColor);
+ FragColor = pack_occlusion_data(data);
}
#endif
diff --git a/source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl
index 312d9f63ce0..0aa54715460 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl
@@ -60,7 +60,7 @@ vec2 sample_weights(float center_depth,
float sample_motion_length,
float offset_length)
{
- /* Clasify foreground/background. */
+ /* Classify foreground/background. */
vec2 depth_weight = depth_compare(center_depth, sample_depth);
/* Weight if sample is overlapping or under the center pixel. */
vec2 spread_weight = spread_compare(center_motion_length, sample_motion_length, offset_length);
@@ -211,16 +211,16 @@ void main()
float w = 1.0 / (50.0 * float(KERNEL) * 4.0);
accum_bg += center_color * w;
w_accum.x += w;
- /* Note: In Jimenez's presentation, they used center sample.
- * We use background color as it contains more informations for foreground
+ /* NOTE: In Jimenez's presentation, they used center sample.
+ * We use background color as it contains more information for foreground
* elements that have not enough weights.
- * Yield beter blur in complex motion. */
+ * Yield better blur in complex motion. */
center_color = accum_bg / w_accum.x;
#endif
/* Merge background. */
accum += accum_bg;
w_accum.y += w_accum.x;
- /* Balance accumulation for failled samples.
+ /* Balance accumulation for failed samples.
* We replace the missing foreground by the background. */
float blend_fac = saturate(1.0 - w_accum.y / w_accum.z);
fragColor = (accum / w_accum.z) + center_color * blend_fac;
diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
index d50a4eaea3c..a4b29d68ac4 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -2,6 +2,8 @@
#pragma BLENDER_REQUIRE(common_math_lib.glsl)
#pragma BLENDER_REQUIRE(common_math_geom_lib.glsl)
#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_lib.glsl)
#pragma BLENDER_REQUIRE(raytrace_lib.glsl)
#pragma BLENDER_REQUIRE(lightprobe_lib.glsl)
#pragma BLENDER_REQUIRE(ssr_lib.glsl)
@@ -40,15 +42,8 @@ uniform sampler2D specroughBuffer;
layout(location = 0) out ivec2 hitData;
layout(location = 1) out float pdfData;
-void do_planar_ssr(int index,
- vec3 V,
- vec3 N,
- vec3 T,
- vec3 B,
- vec3 planeNormal,
- vec3 viewPosition,
- float a2,
- vec4 rand)
+void do_planar_ssr(
+ int index, vec3 V, vec3 N, vec3 T, vec3 B, vec3 planeNormal, vec3 vP, float a2, vec4 rand)
{
float NH;
vec3 H = sample_ggx(rand.xzw, a2, N, T, B, NH); /* Microfacet normal */
@@ -73,12 +68,12 @@ void do_planar_ssr(int index,
* below the reflection plane). This way it's garanted that the hit will
* be in front of the camera. That let us tag the bad rays with a negative
* sign in the Z component. */
- vec3 hit_pos = raycast(index, viewPosition, R * 1e16, 1e16, rand.y, ssrQuality, a2, false);
+ vec3 hit_pos = raycast(index, vP, R * 1e16, 1e16, rand.y, ssrQuality, a2, false);
hitData = encode_hit_data(hit_pos.xy, (hit_pos.z > 0.0), true);
}
-void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 viewPosition, float a2, vec4 rand)
+void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 vP, float a2, vec4 rand)
{
float NH;
/* Microfacet normal */
@@ -110,7 +105,7 @@ void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 viewPosition, float a2, vec4 ra
pdfData = min(1024e32, pdf_ggx_reflect(NH, a2)); /* Theoretical limit of 16bit float */
- vec3 hit_pos = raycast(-1, viewPosition, R * 1e16, ssrThickness, rand.y, ssrQuality, a2, true);
+ vec3 hit_pos = raycast(-1, vP, R * 1e16, ssrThickness, rand.y, ssrQuality, a2, true);
hitData = encode_hit_data(hit_pos.xy, (hit_pos.z > 0.0), false);
}
@@ -140,9 +135,12 @@ void main()
vec2 uvs = vec2(fullres_texel) / vec2(textureSize(depthBuffer, 0));
/* Using view space */
- vec3 viewPosition = get_view_space_from_depth(uvs, depth);
- vec3 V = viewCameraVec;
- vec3 N = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, V);
+ vec3 vP = get_view_space_from_depth(uvs, depth);
+ vec3 P = transform_point(ViewMatrixInverse, vP);
+ vec3 vV = viewCameraVec(vP);
+ vec3 V = cameraVec(P);
+ vec3 vN = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, vV);
+ vec3 N = transform_direction(ViewMatrixInverse, vN);
/* Retrieve pixel data */
vec4 speccol_roughness = texelFetch(specroughBuffer, fullres_texel, 0).rgba;
@@ -170,26 +168,24 @@ void main()
/* Importance sampling bias */
rand.x = mix(rand.x, 0.0, ssrBrdfBias);
- vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition);
- vec3 wN = transform_direction(ViewMatrixInverse, N);
-
- vec3 T, B;
- make_orthonormal_basis(N, T, B); /* Generate tangent space */
+ vec3 vT, vB;
+ make_orthonormal_basis(vN, vT, vB); /* Generate tangent space */
/* Planar Reflections */
for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) {
PlanarData pd = planars_data[i];
- float fade = probe_attenuation_planar(pd, worldPosition, wN, 0.0);
+ float fade = probe_attenuation_planar(pd, P);
+ fade *= probe_attenuation_planar_normal_roughness(pd, N, 0.0);
if (fade > 0.5) {
/* Find view vector / reflection plane intersection. */
/* TODO optimize, use view space for all. */
- vec3 tracePosition = line_plane_intersect(worldPosition, cameraVec, pd.pl_plane_eq);
+ vec3 tracePosition = line_plane_intersect(P, V, pd.pl_plane_eq);
tracePosition = transform_point(ViewMatrix, tracePosition);
vec3 planeNormal = transform_direction(ViewMatrix, pd.pl_normal);
- do_planar_ssr(i, V, N, T, B, planeNormal, tracePosition, a2, rand);
+ do_planar_ssr(i, vV, vN, vT, vB, planeNormal, tracePosition, a2, rand);
return;
}
}
@@ -197,9 +193,9 @@ void main()
/* Constant bias (due to depth buffer precision). Helps with self intersection. */
/* Magic numbers for 24bits of precision.
* From http://terathon.com/gdc07_lengyel.pdf (slide 26) */
- viewPosition.z = get_view_z_from_depth(depth - mix(2.4e-7, 4.8e-7, depth));
+ vP.z = get_view_z_from_depth(depth - mix(2.4e-7, 4.8e-7, depth));
- do_ssr(V, N, T, B, viewPosition, a2, rand);
+ do_ssr(vV, vN, vT, vB, vP, a2, rand);
}
#else /* STEP_RESOLVE */
@@ -213,6 +209,8 @@ uniform sampler2D pdfBuffer;
uniform int neighborOffset;
+in vec4 uvcoordsvar;
+
const ivec2 neighbors[32] = ivec2[32](ivec2(0, 0),
ivec2(1, 1),
ivec2(-2, 0),
@@ -298,7 +296,7 @@ float get_sample_depth(vec2 hit_co, bool is_planar, float planar_index)
vec3 get_hit_vector(vec3 hit_pos,
PlanarData pd,
- vec3 worldPosition,
+ vec3 P,
vec3 N,
vec3 V,
bool is_planar,
@@ -309,7 +307,7 @@ vec3 get_hit_vector(vec3 hit_pos,
if (is_planar) {
/* Reflect back the hit position to have it in non-reflected world space */
- vec3 trace_pos = line_plane_intersect(worldPosition, V, pd.pl_plane_eq);
+ vec3 trace_pos = line_plane_intersect(P, V, pd.pl_plane_eq);
hit_vec = hit_pos - trace_pos;
hit_vec = reflect(hit_vec, pd.pl_normal);
/* Modify here so mip texel alignment is correct. */
@@ -317,8 +315,8 @@ vec3 get_hit_vector(vec3 hit_pos,
}
else {
/* Find hit position in previous frame. */
- hit_co = get_reprojected_reflection(hit_pos, worldPosition, N);
- hit_vec = hit_pos - worldPosition;
+ hit_co = get_reprojected_reflection(hit_pos, P, N);
+ hit_vec = hit_pos - P;
}
mask = screen_border_mask(hit_co);
@@ -339,7 +337,7 @@ vec4 get_ssr_samples(vec4 hit_pdf,
ivec4 hit_data[2],
PlanarData pd,
float planar_index,
- vec3 worldPosition,
+ vec3 P,
vec3 N,
vec3 V,
float roughnessSquared,
@@ -379,14 +377,10 @@ vec4 get_ssr_samples(vec4 hit_pdf,
/* Get actual hit vector and hit coordinate (from last frame). */
vec4 mask = vec4(1.0);
- hit_pos[0] = get_hit_vector(
- hit_pos[0], pd, worldPosition, N, V, is_planar.x, hit_co[0].xy, mask.x);
- hit_pos[1] = get_hit_vector(
- hit_pos[1], pd, worldPosition, N, V, is_planar.y, hit_co[0].zw, mask.y);
- hit_pos[2] = get_hit_vector(
- hit_pos[2], pd, worldPosition, N, V, is_planar.z, hit_co[1].xy, mask.z);
- hit_pos[3] = get_hit_vector(
- hit_pos[3], pd, worldPosition, N, V, is_planar.w, hit_co[1].zw, mask.w);
+ hit_pos[0] = get_hit_vector(hit_pos[0], pd, P, N, V, is_planar.x, hit_co[0].xy, mask.x);
+ hit_pos[1] = get_hit_vector(hit_pos[1], pd, P, N, V, is_planar.y, hit_co[0].zw, mask.y);
+ hit_pos[2] = get_hit_vector(hit_pos[2], pd, P, N, V, is_planar.z, hit_co[1].xy, mask.z);
+ hit_pos[3] = get_hit_vector(hit_pos[3], pd, P, N, V, is_planar.w, hit_co[1].zw, mask.w);
vec4 hit_dist;
hit_dist.x = length(hit_pos[0]);
@@ -476,47 +470,30 @@ vec4 get_ssr_samples(vec4 hit_pdf,
return accum;
}
-void main()
+void raytrace_resolve(ClosureInputGlossy cl_in,
+ inout ClosureEvalGlossy cl_eval,
+ inout ClosureEvalCommon cl_common,
+ inout ClosureOutputGlossy cl_out)
{
- ivec2 fullres_texel = ivec2(gl_FragCoord.xy);
# ifdef FULLRES
- ivec2 halfres_texel = fullres_texel;
+ ivec2 texel = ivec2(gl_FragCoord.xy);
# else
- ivec2 halfres_texel = ivec2(gl_FragCoord.xy / 2.0);
+ ivec2 texel = ivec2(gl_FragCoord.xy / 2.0);
# endif
- vec2 uvs = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0));
-
- float depth = textureLod(depthBuffer, uvs, 0.0).r;
-
- /* Early out */
- if (depth == 1.0) {
- discard;
- }
-
/* Using world space */
- vec3 viewPosition = get_view_space_from_depth(uvs, depth); /* Needed for viewCameraVec */
- vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition);
- vec3 V = cameraVec;
- vec3 vN = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, viewCameraVec);
- vec3 N = transform_direction(ViewMatrixInverse, vN);
- vec4 speccol_roughness = texelFetch(specroughBuffer, fullres_texel, 0).rgba;
+ vec3 V = cl_common.V;
+ vec3 N = cl_in.N;
+ vec3 P = cl_common.P;
- /* Early out */
- if (dot(speccol_roughness.rgb, vec3(1.0)) == 0.0) {
- discard;
- }
-
- float roughness = speccol_roughness.a;
- float roughnessSquared = max(1e-3, roughness * roughness);
-
- vec4 spec_accum = vec4(0.0);
+ float roughness = cl_in.roughness;
+ float roughnessSquared = max(1e-3, sqr(roughness));
/* Resolve SSR */
float cone_cos = cone_cosine(roughnessSquared);
float cone_tan = sqrt(1 - cone_cos * cone_cos) / cone_cos;
cone_tan *= mix(saturate(dot(N, -V) * 2.0), 1.0, roughness); /* Elongation fit */
- vec2 source_uvs = project_point(pastViewProjectionMatrix, worldPosition).xy * 0.5 + 0.5;
+ vec2 source_uvs = project_point(pastViewProjectionMatrix, P).xy * 0.5 + 0.5;
vec4 ssr_accum = vec4(0.0);
float weight_acc = 0.0;
@@ -525,16 +502,16 @@ void main()
/* TODO optimize with textureGather */
/* Doing these fetches early to hide latency. */
vec4 hit_pdf;
- hit_pdf.x = texelFetch(pdfBuffer, halfres_texel + neighbors[0 + neighborOffset], 0).r;
- hit_pdf.y = texelFetch(pdfBuffer, halfres_texel + neighbors[1 + neighborOffset], 0).r;
- hit_pdf.z = texelFetch(pdfBuffer, halfres_texel + neighbors[2 + neighborOffset], 0).r;
- hit_pdf.w = texelFetch(pdfBuffer, halfres_texel + neighbors[3 + neighborOffset], 0).r;
+ hit_pdf.x = texelFetch(pdfBuffer, texel + neighbors[0 + neighborOffset], 0).r;
+ hit_pdf.y = texelFetch(pdfBuffer, texel + neighbors[1 + neighborOffset], 0).r;
+ hit_pdf.z = texelFetch(pdfBuffer, texel + neighbors[2 + neighborOffset], 0).r;
+ hit_pdf.w = texelFetch(pdfBuffer, texel + neighbors[3 + neighborOffset], 0).r;
ivec4 hit_data[2];
- hit_data[0].xy = texelFetch(hitBuffer, halfres_texel + neighbors[0 + neighborOffset], 0).rg;
- hit_data[0].zw = texelFetch(hitBuffer, halfres_texel + neighbors[1 + neighborOffset], 0).rg;
- hit_data[1].xy = texelFetch(hitBuffer, halfres_texel + neighbors[2 + neighborOffset], 0).rg;
- hit_data[1].zw = texelFetch(hitBuffer, halfres_texel + neighbors[3 + neighborOffset], 0).rg;
+ hit_data[0].xy = texelFetch(hitBuffer, texel + neighbors[0 + neighborOffset], 0).rg;
+ hit_data[0].zw = texelFetch(hitBuffer, texel + neighbors[1 + neighborOffset], 0).rg;
+ hit_data[1].xy = texelFetch(hitBuffer, texel + neighbors[2 + neighborOffset], 0).rg;
+ hit_data[1].zw = texelFetch(hitBuffer, texel + neighbors[3 + neighborOffset], 0).rg;
/* Find Planar Reflections affecting this pixel */
PlanarData pd;
@@ -542,7 +519,8 @@ void main()
for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) {
pd = planars_data[i];
- float fade = probe_attenuation_planar(pd, worldPosition, N, 0.0);
+ float fade = probe_attenuation_planar(pd, P);
+ fade *= probe_attenuation_planar_normal_roughness(pd, N, 0.0);
if (fade > 0.5) {
planar_index = float(i);
@@ -554,7 +532,7 @@ void main()
hit_data,
pd,
planar_index,
- worldPosition,
+ P,
N,
V,
roughnessSquared,
@@ -564,19 +542,53 @@ void main()
}
/* Compute SSR contribution */
- if (weight_acc > 0.0) {
- ssr_accum /= weight_acc;
- /* fade between 0.5 and 1.0 roughness */
- ssr_accum.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness);
- accumulate_light(ssr_accum.rgb, ssr_accum.a, spec_accum);
+ ssr_accum *= (weight_acc == 0.0) ? 0.0 : (1.0 / weight_acc);
+ /* fade between 0.5 and 1.0 roughness */
+ ssr_accum.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness);
+
+ cl_eval.raytrace_radiance = ssr_accum.rgb * ssr_accum.a;
+ cl_common.specular_accum -= ssr_accum.a;
+}
+
+CLOSURE_EVAL_FUNCTION_DECLARE_1(ssr_resolve, Glossy)
+
+void main()
+{
+ ivec2 texel = ivec2(gl_FragCoord.xy);
+ float depth = texelFetch(depthBuffer, texel, 0).r;
+
+ if (depth == 1.0) {
+ discard;
}
- /* If SSR contribution is not 1.0, blend with cubemaps */
- if (spec_accum.a < 1.0) {
- fallback_cubemap(N, V, worldPosition, viewPosition, roughness, roughnessSquared, spec_accum);
+ vec4 speccol_roughness = texelFetch(specroughBuffer, texel, 0).rgba;
+ vec3 brdf = speccol_roughness.rgb;
+ float roughness = speccol_roughness.a;
+
+ if (max_v3(brdf) <= 0.0) {
+ discard;
}
- fragColor = vec4(spec_accum.rgb * speccol_roughness.rgb, 1.0);
+ FragDepth = depth;
+
+ viewPosition = get_view_space_from_depth(uvcoordsvar.xy, depth);
+ worldPosition = transform_point(ViewMatrixInverse, viewPosition);
+
+ vec2 normal_encoded = texelFetch(normalBuffer, texel, 0).rg;
+ viewNormal = normal_decode(normal_encoded, viewCameraVec(viewPosition));
+ worldNormal = transform_direction(ViewMatrixInverse, viewNormal);
+
+ CLOSURE_VARS_DECLARE_1(Glossy);
+
+ in_Glossy_0.N = worldNormal;
+ in_Glossy_0.roughness = roughness;
+
+ /* Do a full deferred evaluation of the glossy BSDF. The only difference is that we inject the
+ * SSR resolve before the cubemap iter. BRDF term is already computed during main pass and is
+ * passed as specular color. */
+ CLOSURE_EVAL_FUNCTION_1(ssr_resolve, Glossy);
+
+ fragColor = vec4(out_Glossy_0.radiance * brdf, 1.0);
}
#endif
diff --git a/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl
index 724e63eaba8..737ef7dc509 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl
@@ -81,7 +81,7 @@ float shadow_cube_radial_depth(vec3 cubevec, float tex_id, int shadow_id)
return depth;
}
-vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, float sss_scale)
+vec3 light_translucent(LightData ld, vec3 P, vec3 N, vec4 l_vector, vec2 rand, float sss_scale)
{
int shadow_id = int(ld.l_shadowid);
@@ -98,7 +98,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f
float d, dist;
int data_id = int(sd(shadow_id).sh_data_index);
if (ld.l_type == SUN) {
- vec4 view_z = vec4(dot(W - cameraPos, cameraForward));
+ vec4 view_z = vec4(dot(P - cameraPos, cameraForward));
vec4 weights = step(scascade(data_id).split_end_distances, view_z);
float id = abs(4.0 - dot(weights, weights));
@@ -109,7 +109,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f
/* Same factor as in get_cascade_world_distance(). */
float range = abs(sd(shadow_id).sh_far - sd(shadow_id).sh_near);
- vec4 shpos = scascade(data_id).shadowmat[int(id)] * vec4(W, 1.0);
+ vec4 shpos = scascade(data_id).shadowmat[int(id)] * vec4(P, 1.0);
dist = shpos.z * range;
if (shpos.z > 1.0 || shpos.z < 0.0) {
@@ -149,7 +149,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f
else {
float ofs = 1.0 / float(textureSize(sssShadowCubes, 0).x);
- vec3 cubevec = transform_point(scube(data_id).shadowmat, W);
+ vec3 cubevec = transform_point(scube(data_id).shadowmat, P);
dist = length(cubevec);
cubevec /= dist;
/* tex_id == data_id for cube shadowmap */
@@ -187,8 +187,8 @@ void main(void)
{
vec2 uvs = uvcoordsvar.xy;
float sss_scale = texture(sssRadius, uvs).r;
- vec3 W = get_world_space_from_depth(uvs, texture(depthBuffer, uvs).r);
- vec3 N = normalize(cross(dFdx(W), dFdy(W)));
+ vec3 P = get_world_space_from_depth(uvs, texture(depthBuffer, uvs).r);
+ vec3 N = normalize(cross(dFdx(P), dFdy(P)));
vec3 rand = texelfetch_noise_tex(gl_FragCoord.xy).zwy;
rand.xy *= fast_sqrt(rand.z);
@@ -203,7 +203,7 @@ void main(void)
}
vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */
- l_vector.xyz = ld.l_position - W;
+ l_vector.xyz = ld.l_position - P;
l_vector.w = length(l_vector.xyz);
float att = light_attenuation(ld, l_vector);
@@ -211,7 +211,7 @@ void main(void)
continue;
}
- accum += att * ld.l_color * light_translucent(ld, W, -N, l_vector, rand.xy, sss_scale);
+ accum += att * ld.l_color * light_translucent(ld, P, -N, l_vector, rand.xy, sss_scale);
}
FragColor = vec4(accum, 1.0);
diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl
index bf45169ebaa..0d0ae6ea4a5 100644
--- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl
@@ -9,6 +9,9 @@ uniform float lodFactor;
uniform float lodMax;
uniform float intensityFac;
+uniform float sampleCount;
+uniform float invSampleCount;
+
in vec3 worldPosition;
out vec4 FragColor;
@@ -105,8 +108,8 @@ void main()
weight = texel_solid_angle(facecoord, halfpix);
- vec4 sample = textureLod(probeHdr, cubevec, lodMax);
- sh += sample.rgb * coef * weight;
+ vec4 samp = textureLod(probeHdr, cubevec, lodMax);
+ sh += samp.rgb * coef * weight;
weight_accum += weight;
}
}
@@ -144,7 +147,7 @@ void main()
float weight = 0.0;
vec3 out_radiance = vec3(0.0);
for (float i = 0; i < sampleCount; i++) {
- vec3 L = sample_hemisphere(i, N, T, B); /* Microfacet normal */
+ vec3 L = sample_hemisphere(i, invSampleCount, N, T, B); /* Microfacet normal */
float NL = dot(N, L);
if (NL > 0.0) {
diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl
index ccb77427ed2..35fdbcb715f 100644
--- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl
@@ -11,6 +11,9 @@ uniform float paddingSize;
uniform float intensityFac;
uniform float fireflyFactor;
+uniform float sampleCount;
+uniform float invSampleCount;
+
in vec3 worldPosition;
out vec4 FragColor;
@@ -45,15 +48,11 @@ void main()
make_orthonormal_basis(N, T, B); /* Generate tangent space */
- /* Noise to dither the samples */
- /* Note : ghosting is better looking than noise. */
- // setup_noise();
-
/* Integrating Envmap */
float weight = 0.0;
vec3 out_radiance = vec3(0.0);
for (float i = 0; i < sampleCount; i++) {
- vec3 H = sample_ggx(i, roughnessSquared, N, T, B); /* Microfacet normal */
+ vec3 H = sample_ggx(i, invSampleCount, roughnessSquared, N, T, B); /* Microfacet normal */
vec3 L = -reflect(V, H);
float NL = dot(N, L);
diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl
index 8d7c58a93d5..b802b39c56e 100644
--- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl
@@ -13,6 +13,9 @@ uniform float farClip;
uniform float visibilityRange;
uniform float visibilityBlur;
+uniform float sampleCount;
+uniform float invSampleCount;
+
out vec4 FragColor;
vec3 octahedral_to_cubemap_proj(vec2 co)
@@ -77,9 +80,9 @@ void main()
vec2 accum = vec2(0.0);
for (float i = 0; i < sampleCount; i++) {
- vec3 sample = sample_cone(i, M_PI_2 * visibilityBlur, cos, T, B);
- float depth = texture(probeDepth, sample).r;
- depth = get_world_distance(depth, sample);
+ vec3 samp = sample_cone(i, invSampleCount, M_PI_2 * visibilityBlur, cos, T, B);
+ float depth = texture(probeDepth, samp).r;
+ depth = get_world_distance(depth, samp);
accum += vec2(depth, depth * depth);
}
diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
index a2e25b83532..de384146b80 100644
--- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
@@ -99,9 +99,9 @@ layout(std140) uniform planar_block
/* ----------- Functions --------- */
-float probe_attenuation_cube(int pd_id, vec3 W)
+float probe_attenuation_cube(int pd_id, vec3 P)
{
- vec3 localpos = transform_point(probes_data[pd_id].influencemat, W);
+ vec3 localpos = transform_point(probes_data[pd_id].influencemat, P);
float probe_atten_fac = probes_data[pd_id].p_atten_fac;
float fac;
@@ -116,39 +116,40 @@ float probe_attenuation_cube(int pd_id, vec3 W)
return fac;
}
-float probe_attenuation_planar(PlanarData pd, vec3 W, vec3 N, float roughness)
+float probe_attenuation_planar(PlanarData pd, vec3 P)
{
- /* Normal Facing */
- float fac = saturate(dot(pd.pl_normal, N) * pd.pl_facing_scale + pd.pl_facing_bias);
-
/* Distance from plane */
- fac *= saturate(abs(dot(pd.pl_plane_eq, vec4(W, 1.0))) * pd.pl_fade_scale + pd.pl_fade_bias);
-
+ float fac = saturate(abs(dot(pd.pl_plane_eq, vec4(P, 1.0))) * pd.pl_fade_scale +
+ pd.pl_fade_bias);
/* Fancy fast clipping calculation */
vec2 dist_to_clip;
- dist_to_clip.x = dot(pd.pl_clip_pos_x, W);
- dist_to_clip.y = dot(pd.pl_clip_pos_y, W);
+ dist_to_clip.x = dot(pd.pl_clip_pos_x, P);
+ dist_to_clip.y = dot(pd.pl_clip_pos_y, P);
/* compare and add all tests */
fac *= step(2.0, dot(step(pd.pl_clip_edges, dist_to_clip.xxyy), vec2(-1.0, 1.0).xyxy));
+ return fac;
+}
+float probe_attenuation_planar_normal_roughness(PlanarData pd, vec3 N, float roughness)
+{
+ /* Normal Facing */
+ float fac = saturate(dot(pd.pl_normal, N) * pd.pl_facing_scale + pd.pl_facing_bias);
/* Decrease influence for high roughness */
- fac *= saturate(1.0 - roughness * 10.0);
-
- return fac;
+ return fac * saturate(1.0 - roughness * 10.0);
}
-float probe_attenuation_grid(GridData gd, mat4 localmat, vec3 W, out vec3 localpos)
+float probe_attenuation_grid(GridData gd, vec3 P, out vec3 localpos)
{
- localpos = transform_point(localmat, W);
+ localpos = transform_point(gd.localmat, P);
vec3 pos_to_edge = max(vec3(0.0), abs(localpos) - 1.0);
float fade = length(pos_to_edge);
return saturate(-fade * gd.g_atten_scale + gd.g_atten_bias);
}
-vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness)
+vec3 probe_evaluate_cube(int pd_id, vec3 P, vec3 R, float roughness)
{
/* Correct reflection ray using parallax volume intersection. */
- vec3 localpos = transform_point(probes_data[pd_id].parallaxmat, W);
+ vec3 localpos = transform_point(probes_data[pd_id].parallaxmat, P);
vec3 localray = transform_direction(probes_data[pd_id].parallaxmat, R);
float dist;
@@ -160,14 +161,14 @@ vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness)
}
/* Use Distance in WS directly to recover intersection */
- vec3 intersection = W + R * dist - probes_data[pd_id].p_position;
+ vec3 intersection = P + R * dist - probes_data[pd_id].p_position;
/* From Frostbite PBR Course
* Distance based roughness
* http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf
*/
float original_roughness = roughness;
- float linear_roughness = sqrt(roughness);
+ float linear_roughness = fast_sqrt(roughness);
float distance_roughness = saturate(dist * linear_roughness / length(intersection));
linear_roughness = mix(distance_roughness, linear_roughness, linear_roughness);
roughness = linear_roughness * linear_roughness;
@@ -175,19 +176,20 @@ vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness)
float fac = saturate(original_roughness * 2.0 - 1.0);
R = mix(intersection, R, fac * fac);
- return textureLod_cubemapArray(probeCubes, vec4(R, float(pd_id)), roughness * prbLodCubeMax).rgb;
+ float lod = linear_roughness * prbLodCubeMax;
+ return textureLod_cubemapArray(probeCubes, vec4(R, float(pd_id)), lod).rgb;
}
vec3 probe_evaluate_world_spec(vec3 R, float roughness)
{
- return textureLod_cubemapArray(probeCubes, vec4(R, 0.0), roughness * prbLodCubeMax).rgb;
+ float lod = fast_sqrt(roughness) * prbLodCubeMax;
+ return textureLod_cubemapArray(probeCubes, vec4(R, 0.0), lod).rgb;
}
-vec3 probe_evaluate_planar(
- float id, PlanarData pd, vec3 W, vec3 N, vec3 V, float roughness, inout float fade)
+vec3 probe_evaluate_planar(int id, PlanarData pd, vec3 P, vec3 N, vec3 V, float roughness)
{
/* Find view vector / reflection plane intersection. */
- vec3 point_on_plane = line_plane_intersect(W, V, pd.pl_plane_eq);
+ vec3 point_on_plane = line_plane_intersect(P, V, pd.pl_plane_eq);
/* How far the pixel is from the plane. */
float ref_depth = 1.0; /* TODO parameter */
@@ -207,15 +209,15 @@ vec3 probe_evaluate_planar(
/* TODO: If we support non-ssr planar reflection, we should blur them with gaussian
* and chose the right mip depending on the cone footprint after projection */
/* NOTE: X is inverted here to compensate inverted drawing. */
- vec3 sample = textureLod(probePlanars, vec3(refco.xy * vec2(-0.5, 0.5) + 0.5, id), 0.0).rgb;
+ vec3 radiance = textureLod(probePlanars, vec3(refco.xy * vec2(-0.5, 0.5) + 0.5, id), 0.0).rgb;
- return sample;
+ return radiance;
}
void fallback_cubemap(vec3 N,
vec3 V,
- vec3 W,
- vec3 viewPosition,
+ vec3 P,
+ vec3 vP,
float roughness,
float roughnessSquared,
inout vec4 spec_accum)
@@ -223,21 +225,15 @@ void fallback_cubemap(vec3 N,
/* Specular probes */
vec3 spec_dir = specular_dominant_dir(N, V, roughnessSquared);
-#ifdef SSR_AO
- vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy);
- vec3 bent_normal;
- float final_ao = occlusion_compute(N, viewPosition, 1.0, rand, bent_normal);
- final_ao = specular_occlusion(dot(N, V), final_ao, roughness);
-#else
- const float final_ao = 1.0;
-#endif
+ OcclusionData occlusion_data = occlusion_load(vP, 1.0);
+ float final_ao = specular_occlusion(occlusion_data, V, N, roughness, spec_dir);
/* Starts at 1 because 0 is world probe */
for (int i = 1; i < MAX_PROBE && i < prbNumRenderCube && spec_accum.a < 0.999; i++) {
- float fade = probe_attenuation_cube(i, W);
+ float fade = probe_attenuation_cube(i, P);
if (fade > 0.0) {
- vec3 spec = final_ao * probe_evaluate_cube(i, W, spec_dir, roughness);
+ vec3 spec = final_ao * probe_evaluate_cube(i, P, spec_dir, roughness);
accumulate_light(spec, fade, spec_accum);
}
}
@@ -249,7 +245,7 @@ void fallback_cubemap(vec3 N,
}
}
-vec3 probe_evaluate_grid(GridData gd, vec3 W, vec3 N, vec3 localpos)
+vec3 probe_evaluate_grid(GridData gd, vec3 P, vec3 N, vec3 localpos)
{
localpos = localpos * 0.5 + 0.5;
localpos = localpos * vec3(gd.g_resolution) - 0.5;
@@ -278,7 +274,7 @@ vec3 probe_evaluate_grid(GridData gd, vec3 W, vec3 N, vec3 localpos)
(gd.g_increment_x * cell_cos.x + gd.g_increment_y * cell_cos.y +
gd.g_increment_z * cell_cos.z);
- vec3 ws_point_to_cell = ws_cell_location - W;
+ vec3 ws_point_to_cell = ws_cell_location - P;
float ws_dist_point_to_cell = length(ws_point_to_cell);
vec3 ws_light = ws_point_to_cell / ws_dist_point_to_cell;
diff --git a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
index 949e4d8f04f..04ad53eabb7 100644
--- a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
@@ -164,10 +164,10 @@ vec4 sample_cascade(sampler2DArray tex, vec2 co, float cascade_id)
#define scube(x) shadows_cube_data[x]
#define scascade(x) shadows_cascade_data[x]
-float sample_cube_shadow(int shadow_id, vec3 W)
+float sample_cube_shadow(int shadow_id, vec3 P)
{
int data_id = int(sd(shadow_id).sh_data_index);
- vec3 cubevec = transform_point(scube(data_id).shadowmat, W);
+ vec3 cubevec = transform_point(scube(data_id).shadowmat, P);
float dist = max(sd(shadow_id).sh_near, max_v3(abs(cubevec)) - sd(shadow_id).sh_bias);
dist = buffer_depth(true, dist, sd(shadow_id).sh_far, sd(shadow_id).sh_near);
/* Manual Shadow Cube Layer indexing. */
@@ -179,11 +179,11 @@ float sample_cube_shadow(int shadow_id, vec3 W)
return texture(shadowCubeTexture, vec4(coord, tex_id * 6.0 + face, dist));
}
-float sample_cascade_shadow(int shadow_id, vec3 W)
+float sample_cascade_shadow(int shadow_id, vec3 P)
{
int data_id = int(sd(shadow_id).sh_data_index);
float tex_id = scascade(data_id).sh_tex_index;
- vec4 view_z = vec4(dot(W - cameraPos, cameraForward));
+ vec4 view_z = vec4(dot(P - cameraPos, cameraForward));
vec4 weights = 1.0 - smoothstep(scascade(data_id).split_end_distances,
scascade(data_id).split_start_distances.yzwx,
view_z);
@@ -194,13 +194,13 @@ float sample_cascade_shadow(int shadow_id, vec3 W)
float vis = weights.w;
vec4 coord, shpos;
/* Main cascade. */
- shpos = scascade(data_id).shadowmat[cascade] * vec4(W, 1.0);
+ shpos = scascade(data_id).shadowmat[cascade] * vec4(P, 1.0);
coord = vec4(shpos.xy, tex_id + float(cascade), shpos.z - sd(shadow_id).sh_bias);
vis += texture(shadowCascadeTexture, coord) * (1.0 - blend);
cascade = min(3, cascade + 1);
/* Second cascade. */
- shpos = scascade(data_id).shadowmat[cascade] * vec4(W, 1.0);
+ shpos = scascade(data_id).shadowmat[cascade] * vec4(P, 1.0);
coord = vec4(shpos.xy, tex_id + float(cascade), shpos.z - sd(shadow_id).sh_bias);
vis += texture(shadowCascadeTexture, coord) * blend;
@@ -252,32 +252,29 @@ float light_attenuation(LightData ld, vec4 l_vector)
return vis;
}
-float light_shadowing(LightData ld,
- vec3 W,
-#ifndef VOLUMETRICS
- vec3 viewPosition,
- float tracing_depth,
- vec3 true_normal,
- float rand_x,
- const bool use_contact_shadows,
-#endif
- float vis)
+float light_shadowing(LightData ld, vec3 P, float vis)
{
#if !defined(VOLUMETRICS) || defined(VOLUME_SHADOW)
- /* shadowing */
if (ld.l_shadowid >= 0.0 && vis > 0.001) {
-
if (ld.l_type == SUN) {
- vis *= sample_cascade_shadow(int(ld.l_shadowid), W);
+ vis *= sample_cascade_shadow(int(ld.l_shadowid), P);
}
else {
- vis *= sample_cube_shadow(int(ld.l_shadowid), W);
+ vis *= sample_cube_shadow(int(ld.l_shadowid), P);
}
+ }
+#endif
+ return vis;
+}
-# ifndef VOLUMETRICS
+#ifndef VOLUMETRICS
+float light_contact_shadows(
+ LightData ld, vec3 P, vec3 vP, float tracing_depth, vec3 vNg, float rand_x, float vis)
+{
+ if (ld.l_shadowid >= 0.0 && vis > 0.001) {
ShadowData sd = shadows_data[int(ld.l_shadowid)];
/* Only compute if not already in shadow. */
- if (use_contact_shadows && sd.sh_contact_dist > 0.0 && vis > 1e-8) {
+ if (sd.sh_contact_dist > 0.0) {
/* Contact Shadows. */
vec3 ray_ori, ray_dir;
float trace_distance;
@@ -287,54 +284,34 @@ float light_shadowing(LightData ld,
ray_dir = shadows_cascade_data[int(sd.sh_data_index)].sh_shadow_vec * trace_distance;
}
else {
- ray_dir = shadows_cube_data[int(sd.sh_data_index)].position.xyz - W;
+ ray_dir = shadows_cube_data[int(sd.sh_data_index)].position.xyz - P;
float len = length(ray_dir);
trace_distance = min(sd.sh_contact_dist, len);
ray_dir *= trace_distance / len;
}
ray_dir = transform_direction(ViewMatrix, ray_dir);
- ray_ori = vec3(viewPosition.xy, tracing_depth) + true_normal * sd.sh_contact_offset;
+ ray_ori = vec3(vP.xy, tracing_depth) + vNg * sd.sh_contact_offset;
vec3 hit_pos = raycast(
-1, ray_ori, ray_dir, sd.sh_contact_thickness, rand_x, 0.1, 0.001, false);
if (hit_pos.z > 0.0) {
hit_pos = get_view_space_from_depth(hit_pos.xy, hit_pos.z);
- float hit_dist = distance(viewPosition, hit_pos);
+ float hit_dist = distance(vP, hit_pos);
float dist_ratio = hit_dist / trace_distance;
- return vis * saturate(dist_ratio * 3.0 - 2.0);
+ return saturate(dist_ratio * 3.0 - 2.0);
}
}
-# endif /* VOLUMETRICS */
}
-#endif
-
- return vis;
+ return 1.0;
}
+#endif /* VOLUMETRICS */
-float light_visibility(LightData ld,
- vec3 W,
-#ifndef VOLUMETRICS
- vec3 viewPosition,
- float tracing_depth,
- vec3 true_normal,
- float rand_x,
- const bool use_contact_shadows,
-#endif
- vec4 l_vector)
+float light_visibility(LightData ld, vec3 P, vec4 l_vector)
{
float l_atten = light_attenuation(ld, l_vector);
- return light_shadowing(ld,
- W,
-#ifndef VOLUMETRICS
- viewPosition,
- tracing_depth,
- true_normal,
- rand_x,
- use_contact_shadows,
-#endif
- l_atten);
+ return light_shadowing(ld, P, l_atten);
}
float light_diffuse(LightData ld, vec3 N, vec3 V, vec4 l_vector)
diff --git a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
index 34999076f9c..fd08dfda060 100644
--- a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
@@ -5,8 +5,12 @@
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
#pragma BLENDER_REQUIRE(common_uniforms_lib.glsl)
-#pragma BLENDER_REQUIRE(closure_lib.glsl)
-#pragma BLENDER_REQUIRE(closure_lit_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_type_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_diffuse_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_translucent_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_refraction_lib.glsl)
#pragma BLENDER_REQUIRE(surface_lib.glsl)
#ifdef USE_ALPHA_HASH
diff --git a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
index 5f14f590128..aebd1c3aef3 100644
--- a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
@@ -238,7 +238,7 @@ vec3 raycast(int index,
#endif
}
- /* Discard backface hits. Only do this if the ray traveled enough to avoid loosing intricate
+ /* Discard backface hits. Only do this if the ray traveled enough to avoid losing intricate
* contact reflections. This is only used for SSReflections. */
if (discard_backface && prev_delta < 0.0 && curr_time > 4.1) {
hit = false;
diff --git a/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl b/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl
index 0bbbe58c44a..363b5cb978a 100644
--- a/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl
@@ -82,7 +82,7 @@ void main()
* with NaN's */
if (depth != 1.0 && any(notEqual(encoded_normal, vec2(0.0)))) {
vec3 decoded_normal = normal_decode(texelFetch(inputBuffer, texel, 0).rg, vec3(0.0));
- vec3 world_normal = mat3(ViewMatrixInverse) * decoded_normal;
+ vec3 world_normal = transform_direction(ViewMatrixInverse, decoded_normal);
color.rgb = world_normal;
}
else {
diff --git a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl
index e0b9d4a60db..c48828b7b8d 100644
--- a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl
@@ -36,20 +36,21 @@ void main()
/* Convert to view Z. */
tracing_depth = get_view_z_from_depth(tracing_depth);
- vec3 viewPosition = get_view_space_from_depth(uvs, depth);
- vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition);
+ vec3 vP = get_view_space_from_depth(uvs, depth);
+ vec3 P = transform_point(ViewMatrixInverse, vP);
- vec3 true_normal = normalize(cross(dFdx(viewPosition), dFdy(viewPosition)));
+ vec3 vNg = safe_normalize(cross(dFdx(vP), dFdy(vP)));
for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) {
LightData ld = lights_data[i];
vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */
- l_vector.xyz = ld.l_position - worldPosition;
+ l_vector.xyz = ld.l_position - P;
l_vector.w = length(l_vector.xyz);
- float l_vis = light_shadowing(
- ld, worldPosition, viewPosition, tracing_depth, true_normal, rand.x, true, 1.0);
+ float l_vis = light_shadowing(ld, P, 1.0);
+
+ l_vis *= light_contact_shadows(ld, P, vP, tracing_depth, vNg, rand.x, 1.0);
accum_light += l_vis;
}
diff --git a/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl b/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl
index 29495e98355..15c28efe622 100644
--- a/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl
@@ -9,8 +9,7 @@
#define BTDF_BIAS 0.85
-vec4 screen_space_refraction(
- vec3 viewPosition, vec3 N, vec3 V, float ior, float roughnessSquared, vec4 rand)
+vec4 screen_space_refraction(vec3 vP, vec3 N, vec3 V, float ior, float roughnessSquared, vec4 rand)
{
float a2 = max(5e-6, roughnessSquared * roughnessSquared);
@@ -29,7 +28,7 @@ vec4 screen_space_refraction(
pdf = pdf_ggx_reflect(NH, a2);
}
- vec3 vV = viewCameraVec;
+ vec3 vV = viewCameraVec(vP);
float eta = 1.0 / ior;
if (dot(H, V) < 0.0) {
H = -H;
@@ -41,11 +40,11 @@ vec4 screen_space_refraction(
R = transform_direction(ViewMatrix, R);
vec3 hit_pos = raycast(
- -1, viewPosition, R * 1e16, ssrThickness, rand.y, ssrQuality, roughnessSquared, false);
+ -1, vP, R * 1e16, ssrThickness, rand.y, ssrQuality, roughnessSquared, false);
if ((hit_pos.z > 0.0) && (F_eta(ior, dot(H, V)) < 1.0)) {
hit_pos = get_view_space_from_depth(hit_pos.xy, hit_pos.z);
- float hit_dist = distance(hit_pos, viewPosition);
+ float hit_dist = distance(hit_pos, vP);
float cone_cos = cone_cosine(roughnessSquared);
float cone_tan = sqrt(1 - cone_cos * cone_cos) / cone_cos;
diff --git a/source/blender/draw/engines/eevee/shaders/surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/surface_frag.glsl
index d0297c8cb7f..62930b9944a 100644
--- a/source/blender/draw/engines/eevee/shaders/surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/surface_frag.glsl
@@ -3,8 +3,13 @@
#pragma BLENDER_REQUIRE(common_hair_lib.glsl)
#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl)
-#pragma BLENDER_REQUIRE(closure_lib.glsl)
-#pragma BLENDER_REQUIRE(closure_lit_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_type_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_diffuse_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_translucent_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_eval_refraction_lib.glsl)
+
#pragma BLENDER_REQUIRE(surface_lib.glsl)
#pragma BLENDER_REQUIRE(volumetric_lib.glsl)
diff --git a/source/blender/draw/engines/eevee/shaders/surface_lib.glsl b/source/blender/draw/engines/eevee/shaders/surface_lib.glsl
index b93a3a23eff..e80dc1761f0 100644
--- a/source/blender/draw/engines/eevee/shaders/surface_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/surface_lib.glsl
@@ -13,7 +13,15 @@ uniform float refractionDepth;
vec3 worldNormal; \
vec3 viewNormal;
-#ifdef GPU_GEOMETRY_SHADER
+#if defined(STEP_RESOLVE) || defined(STEP_RAYTRACE)
+/* SSR will set these global variables itself.
+ * Also make false positive compiler warnings disapear by setting values. */
+vec3 worldPosition = vec3(0);
+vec3 viewPosition = vec3(0);
+vec3 worldNormal = vec3(0);
+vec3 viewNormal = vec3(0);
+
+#elif defined(GPU_GEOMETRY_SHADER)
in ShaderStageInterface{SURFACE_INTERFACE} dataIn[];
out ShaderStageInterface{SURFACE_INTERFACE} dataOut;
@@ -24,7 +32,7 @@ out ShaderStageInterface{SURFACE_INTERFACE} dataOut;
dataOut.worldNormal = dataIn[vert].worldNormal; \
dataOut.viewNormal = dataIn[vert].viewNormal;
-#else
+#else /* GPU_VERTEX_SHADER || GPU_FRAGMENT_SHADER*/
IN_OUT ShaderStageInterface{SURFACE_INTERFACE};
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
index bac69ab0355..25661a0d731 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
@@ -1,6 +1,6 @@
#pragma BLENDER_REQUIRE(volumetric_lib.glsl)
-#pragma BLENDER_REQUIRE(closure_lib.glsl)
+#pragma BLENDER_REQUIRE(closure_type_lib.glsl)
/* Based on Frosbite Unified Volumetric.
* https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite */
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl
index 806f1b5b205..e72bf8b9150 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl
@@ -29,15 +29,14 @@ void main()
outTransmittance = texelFetch(volumeExtinction, volume_cell, 0);
vec3 s_scattering = texelFetch(volumeScattering, volume_cell, 0).rgb;
vec3 volume_ndc = volume_to_ndc((vec3(volume_cell) + volJitter.xyz) * volInvTexSize.xyz);
- vec3 worldPosition = get_world_space_from_depth(volume_ndc.xy, volume_ndc.z);
- vec3 wdir = cameraVec;
+ vec3 P = get_world_space_from_depth(volume_ndc.xy, volume_ndc.z);
+ vec3 V = cameraVec(P);
vec2 phase = texelFetch(volumePhase, volume_cell, 0).rg;
float s_anisotropy = phase.x / max(1.0, phase.y);
/* Environment : Average color. */
- outScattering.rgb += irradiance_volumetric(worldPosition) * s_scattering *
- phase_function_isotropic();
+ outScattering.rgb += irradiance_volumetric(P) * s_scattering * phase_function_isotropic();
#ifdef VOLUME_LIGHTING /* Lights */
for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) {
@@ -45,16 +44,15 @@ void main()
LightData ld = lights_data[i];
vec4 l_vector;
- l_vector.xyz = (ld.l_type == SUN) ? -ld.l_forward : ld.l_position - worldPosition;
+ l_vector.xyz = (ld.l_type == SUN) ? -ld.l_forward : ld.l_position - P;
l_vector.w = length(l_vector.xyz);
- float Vis = light_visibility(ld, worldPosition, l_vector);
+ float Vis = light_visibility(ld, P, l_vector);
- vec3 Li = light_volume(ld, l_vector) *
- light_volume_shadow(ld, worldPosition, l_vector, volumeExtinction);
+ vec3 Li = light_volume(ld, l_vector) * light_volume_shadow(ld, P, l_vector, volumeExtinction);
outScattering.rgb += Li * Vis * s_scattering *
- phase_function(-wdir, l_vector.xyz / l_vector.w, s_anisotropy);
+ phase_function(-V, l_vector.xyz / l_vector.w, s_anisotropy);
}
#endif
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index 1b331052a06..adb21540afb 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -108,7 +108,7 @@ static void external_engine_init(void *vedata)
const DRWContextState *draw_ctx = DRW_context_state_get();
ARegion *region = draw_ctx->region;
- /* Depth prepass */
+ /* Depth pre-pass. */
if (!e_data.depth_sh) {
const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[GPU_SHADER_CFG_DEFAULT];
diff --git a/source/blender/draw/engines/gpencil/gpencil_antialiasing.c b/source/blender/draw/engines/gpencil/gpencil_antialiasing.c
index 511f09db247..eaf010e81c9 100644
--- a/source/blender/draw/engines/gpencil/gpencil_antialiasing.c
+++ b/source/blender/draw/engines/gpencil/gpencil_antialiasing.c
@@ -58,11 +58,11 @@ void GPENCIL_antialiasing_init(struct GPENCIL_Data *vedata)
if (txl->smaa_search_tx == NULL) {
txl->smaa_search_tx = GPU_texture_create_2d(
"smaa_search", SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT, 1, GPU_R8, NULL);
- GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UNSIGNED_BYTE, searchTexBytes);
+ GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UBYTE, searchTexBytes);
txl->smaa_area_tx = GPU_texture_create_2d(
"smaa_area", AREATEX_WIDTH, AREATEX_HEIGHT, 1, GPU_RG8, NULL);
- GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UNSIGNED_BYTE, areaTexBytes);
+ GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UBYTE, areaTexBytes);
GPU_texture_filter_mode(txl->smaa_search_tx, true);
GPU_texture_filter_mode(txl->smaa_area_tx, true);
diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
index f2472699300..ee51b751187 100644
--- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
@@ -270,12 +270,12 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd,
const bool is_in_front = (ob->dtx & OB_DRAW_IN_FRONT);
const bool is_screenspace = (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS) != 0;
- const bool overide_vertcol = (pd->v3d_color_type != -1);
+ const bool override_vertcol = (pd->v3d_color_type != -1);
const bool is_vert_col_mode = (pd->v3d_color_type == V3D_SHADING_VERTEX_COLOR) ||
GPENCIL_VERTEX_MODE(gpd) || pd->is_render;
bool is_masked = (gpl->flag & GP_LAYER_USE_MASK) && !BLI_listbase_is_empty(&gpl->mask_layers);
- float vert_col_opacity = (overide_vertcol) ?
+ float vert_col_opacity = (override_vertcol) ?
(is_vert_col_mode ? pd->vertex_paint_opacity : 0.0f) :
pd->is_render ? gpl->vertex_paint_opacity :
pd->vertex_paint_opacity;
@@ -365,7 +365,7 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd,
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
if (gpl->blend_mode == eGplBlendMode_HardLight) {
- /* We cannot do custom blending on MultiTarget framebuffers.
+ /* 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);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 57c69398ef2..8bb336ebc96 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -23,6 +23,7 @@
#include "DRW_render.h"
#include "BKE_gpencil.h"
+#include "BKE_gpencil_modifier.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_object.h"
@@ -214,6 +215,7 @@ void GPENCIL_cache_init(void *ved)
NULL :
false;
pd->do_onion = show_onion && !hide_overlay && !playing;
+ pd->playing = playing;
/* Save simplify flags (can change while drawing, so it's better to save). */
Scene *scene = draw_ctx->scene;
pd->simplify_fill = GPENCIL_SIMPLIFY_FILL(scene, playing);
@@ -241,6 +243,7 @@ void GPENCIL_cache_init(void *ved)
pd->simplify_fill = false;
pd->simplify_fx = false;
pd->fade_layer_opacity = -1.0f;
+ pd->playing = false;
}
{
@@ -279,7 +282,7 @@ void GPENCIL_cache_init(void *ved)
});
}
else {
- /* Free uneeded buffers. */
+ /* Free unneeded buffers. */
GPU_FRAMEBUFFER_FREE_SAFE(fbl->snapshot_fb);
DRW_TEXTURE_FREE_SAFE(txl->snapshot_depth_tx);
DRW_TEXTURE_FREE_SAFE(txl->snapshot_color_tx);
@@ -331,7 +334,7 @@ void GPENCIL_cache_init(void *ved)
pd->dof_params[0] = -focus_dist * pd->dof_params[1];
}
else {
- /* Disable DoF blur scalling. */
+ /* Disable DoF blur scaling. */
pd->camera = NULL;
}
}
@@ -344,7 +347,7 @@ typedef struct gpIterPopulateData {
GPENCIL_PrivateData *pd;
GPENCIL_MaterialPool *matpool;
DRWShadingGroup *grp;
- /* Last material UBO bound. Used to avoid uneeded buffer binding. */
+ /* Last material UBO bound. Used to avoid unneeded buffer binding. */
GPUUniformBuf *ubo_mat;
GPUUniformBuf *ubo_lights;
/* Last texture bound. */
@@ -383,7 +386,7 @@ static void gpencil_drawcall_flush(gpIterPopulateData *iter)
iter->vcount = 0;
}
-/* Group drawcalls that are consecutive and with the same type. Reduces GPU driver overhead. */
+/* Group draw-calls that are consecutive and with the same type. Reduces GPU driver overhead. */
static void gpencil_drawcall_add(
gpIterPopulateData *iter, struct GPUBatch *geom, bool instancing, int v_first, int v_count)
{
@@ -397,7 +400,7 @@ static void gpencil_drawcall_add(
#endif
int last = iter->vfirst + iter->vcount;
- /* Interupt drawcall grouping if the sequence is not consecutive. */
+ /* Interrupt draw-call grouping if the sequence is not consecutive. */
if ((geom != iter->geom) || (v_first - last > 3)) {
gpencil_drawcall_flush(iter);
}
@@ -485,6 +488,7 @@ static void gpencil_stroke_cache_populate(bGPDlayer *gpl,
{
gpIterPopulateData *iter = (gpIterPopulateData *)thunk;
+ bGPdata *gpd = iter->ob->data;
MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(iter->ob, gps->mat_nr + 1);
const bool is_render = iter->pd->is_render;
@@ -493,8 +497,8 @@ static void gpencil_stroke_cache_populate(bGPDlayer *gpl,
(!is_render && ((gps->flag & GP_STROKE_NOFILL) != 0));
bool show_fill = (gps->tot_triangles > 0) && ((gp_style->flag & GP_MATERIAL_FILL_SHOW) != 0) &&
(!iter->pd->simplify_fill) && ((gps->flag & GP_STROKE_NOFILL) == 0);
-
- bool only_lines = gpl && gpf && gpl->actframe != gpf && iter->pd->use_multiedit_lines_only;
+ bool only_lines = !GPENCIL_PAINT_MODE(gpd) && gpl && gpf && gpl->actframe != gpf &&
+ iter->pd->use_multiedit_lines_only;
bool is_onion = gpl && gpf && gpf->runtime.onion_id != 0;
bool hide_onion = is_onion && ((gp_style->flag & GP_MATERIAL_HIDE_ONIONSKIN) != 0);
if ((hide_material) || (!show_stroke && !show_fill) || (only_lines && !is_onion) ||
@@ -617,12 +621,22 @@ void GPENCIL_cache_populate(void *ved, Object *ob)
/* 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;
- /* When render in background the active frame could not be properly set due thread priority
+ /* When render in background the active frame could not be properly set due thread priority,
* better set again. This is not required in viewport. */
if (txl->render_depth_tx) {
+ const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
- gpl->actframe = BKE_gpencil_layer_frame_get(gpl, pd->cfra, GP_GETFRAME_USE_PREV);
+ /* If there is a time modifier, need remap the time before. */
+ if (time_remap) {
+ gpl->actframe = BKE_gpencil_frame_retime_get(draw_ctx->depsgraph, pd->scene, ob, gpl);
+ }
+ else {
+ gpl->actframe = BKE_gpencil_layer_frame_get(gpl, pd->cfra, GP_GETFRAME_USE_PREV);
+ }
}
}
@@ -675,7 +689,7 @@ void GPENCIL_cache_finish(void *ved)
/* Sort object by decreasing Z to avoid most of alpha ordering issues. */
gpencil_object_cache_sort(pd);
- /* Create framebuffers only if needed. */
+ /* Create frame-buffers only if needed. */
if (pd->tobjects.first) {
eGPUTextureFormat format = pd->use_signed_fb ? GPU_RGBA16F : GPU_R11F_G11F_B10F;
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index d0bd56b42dd..5ceb909bc88 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -110,7 +110,7 @@ BLI_STATIC_ASSERT_ALIGN(gpLight, 16)
typedef struct GPENCIL_MaterialPool {
/* Linklist. */
struct GPENCIL_MaterialPool *next;
- /* GPU representatin of materials. */
+ /* GPU representation of materials. */
gpMaterial mat_data[GP_MATERIAL_BUFFER_LEN];
/* Matching ubo. */
struct GPUUniformBuf *ubo;
@@ -122,7 +122,7 @@ typedef struct GPENCIL_MaterialPool {
} GPENCIL_MaterialPool;
typedef struct GPENCIL_LightPool {
- /* GPU representatin of materials. */
+ /* GPU representation of materials. */
gpLight light_data[GPENCIL_LIGHT_BUFFER_LEN];
/* Matching ubo. */
struct GPUUniformBuf *ubo;
@@ -151,7 +151,7 @@ typedef struct GPENCIL_tVfx {
/** Linklist */
struct GPENCIL_tVfx *next;
DRWPass *vfx_ps;
- /* Framebuffer reference since it may not be allocated yet. */
+ /* Frame-buffer reference since it may not be allocated yet. */
GPUFrameBuffer **target_fb;
} GPENCIL_tVfx;
@@ -342,6 +342,8 @@ typedef struct GPENCIL_PrivateData {
/* Display onion skinning */
bool do_onion;
+ /* Playing animation */
+ bool playing;
/* simplify settings */
bool simplify_fill;
bool simplify_fx;
@@ -350,7 +352,7 @@ typedef struct GPENCIL_PrivateData {
bool use_lighting;
/* Use physical lights or just ambient lighting. */
bool use_lights;
- /* Do we need additional framebuffers? */
+ /* Do we need additional frame-buffers? */
bool use_layer_fb;
bool use_object_fb;
bool use_mask_fb;
diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c
index 9ac9a4dc078..b597a786e86 100644
--- a/source/blender/draw/engines/gpencil/gpencil_render.c
+++ b/source/blender/draw/engines/gpencil/gpencil_render.c
@@ -47,7 +47,7 @@ void GPENCIL_render_init(GPENCIL_Data *vedata,
const float *viewport_size = DRW_viewport_size_get();
const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
- /* Set the pers & view matrix. */
+ /* Set the perspective & view matrix. */
float winmat[4][4], viewmat[4][4], viewinv[4][4];
struct Object *camera = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index cb65fbd6ae7..0b66141e51a 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -235,7 +235,7 @@ static void gpencil_vfx_rim(RimShaderFxData *fx, Object *ob, gpIterVfxData *iter
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
if (fx->mode == eShaderFxRimMode_Overlay) {
- /* We cannot do custom blending on MultiTarget framebuffers.
+ /* We cannot do custom blending on multi-target frame-buffers.
* Workaround by doing 2 passes. */
grp = DRW_shgroup_create_sub(grp);
DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_MUL);
@@ -363,7 +363,7 @@ static void gpencil_vfx_shadow(ShadowShaderFxData *fx, Object *ob, gpIterVfxData
copy_v2_v2(wave_ofs, wave_dir);
SWAP(float, wave_ofs[0], wave_ofs[1]);
wave_ofs[1] *= -1.0f;
- /* Keep world space scalling and aspect ratio. */
+ /* Keep world space scaling and aspect ratio. */
mul_v2_fl(wave_dir, 1.0f / (max_ff(1e-8f, fx->period) * distance_factor));
mul_v2_v2(wave_dir, vp_size);
mul_v2_fl(wave_ofs, fx->amplitude * distance_factor);
@@ -397,7 +397,7 @@ static void gpencil_vfx_shadow(ShadowShaderFxData *fx, Object *ob, gpIterVfxData
unit_m4(uv_mat);
zero_v2(wave_ofs);
- /* We reseted the uv_mat so we need to accound for the rotation in the */
+ /* We reset the uv_mat so we need to account for the rotation in the */
copy_v2_fl2(tmp, 0.0f, blur_size[1]);
rotate_v2_v2fl(blur_dir, tmp, -fx->rotation);
mul_v2_v2(blur_dir, vp_size_inv);
@@ -515,7 +515,7 @@ static void gpencil_vfx_wave(WaveShaderFxData *fx, Object *ob, gpIterVfxData *it
copy_v2_v2(wave_ofs, wave_dir);
SWAP(float, wave_ofs[0], wave_ofs[1]);
wave_ofs[1] *= -1.0f;
- /* Keep world space scalling and aspect ratio. */
+ /* Keep world space scaling and aspect ratio. */
mul_v2_fl(wave_dir, 1.0f / (max_ff(1e-8f, fx->period) * distance_factor));
mul_v2_v2(wave_dir, vp_size);
mul_v2_fl(wave_ofs, fx->amplitude * distance_factor);
@@ -647,7 +647,7 @@ void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObjec
DRW_shgroup_uniform_int_copy(grp, "isFirstPass", true);
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
- /* We cannot do custom blending on MultiTarget framebuffers.
+ /* We cannot do custom blending on multi-target frame-buffers.
* Workaround by doing 2 passes. */
grp = DRW_shgroup_create_sub(grp);
DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_MUL);
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
index 189ed91cbb4..7412959a30b 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
@@ -156,6 +156,7 @@ IN_OUT ShaderStageInterface
vec3 finalPos;
vec2 finalUvs;
noperspective float strokeThickness;
+ noperspective float unclampedThickness;
noperspective float strokeHardeness;
flat vec2 strokeAspect;
flat vec2 strokePt1;
@@ -324,7 +325,7 @@ vec2 safe_normalize_len(vec2 v, out float len)
}
}
-float stroke_thickness_modulate(float thickness, out float opacity)
+float stroke_thickness_modulate(float thickness)
{
/* Modify stroke thickness by object and layer factors.-*/
thickness *= thicknessScale;
@@ -340,9 +341,14 @@ float stroke_thickness_modulate(float thickness, out float opacity)
/* World space point size. */
thickness *= thicknessWorldScale * ProjectionMatrix[1][1] * sizeViewport.y;
}
- /* To avoid aliasing artifact, we clamp the line thickness and reduce its opacity. */
+ return thickness;
+}
+
+float clamp_small_stroke_thickness(float thickness)
+{
+ /* To avoid aliasing artifacts, we clamp the line thickness and
+ * reduce its opacity in the fragment shader.*/
float min_thickness = gl_Position.w * 1.3;
- opacity = smoothstep(0.0, gl_Position.w * 1.0, thickness);
thickness = max(min_thickness, thickness);
return thickness;
@@ -393,7 +399,7 @@ void stroke_vertex()
is_squares = false;
}
- /* Enpoints, we discard the vertices. */
+ /* Endpoints, we discard the vertices. */
if (ma1.x == -1 || (!is_dot && ma2.x == -1)) {
discard_vert();
return;
@@ -426,9 +432,9 @@ void stroke_vertex()
vec2 line = safe_normalize_len(ss2 - ss1, line_len);
vec2 line_adj = safe_normalize((use_curr) ? (ss1 - ss_adj) : (ss_adj - ss2));
- float small_line_opacity;
float thickness = abs((use_curr) ? thickness1 : thickness2);
- thickness = stroke_thickness_modulate(thickness, small_line_opacity);
+ thickness = stroke_thickness_modulate(thickness);
+ float clampedThickness = clamp_small_stroke_thickness(thickness);
finalUvs = vec2(x, y) * 0.5 + 0.5;
strokeHardeness = decode_hardness(use_curr ? hardness1 : hardness2);
@@ -479,11 +485,12 @@ void stroke_vertex()
/* Invert for vertex shader. */
strokeAspect = 1.0 / strokeAspect;
- gl_Position.xy += (x * x_axis + y * y_axis) * sizeViewportInv.xy * thickness;
+ gl_Position.xy += (x * x_axis + y * y_axis) * sizeViewportInv.xy * clampedThickness;
strokePt1 = ss1;
strokePt2 = ss1 + x_axis * 0.5;
- strokeThickness = (is_squares) ? 1e18 : (thickness / gl_Position.w);
+ strokeThickness = (is_squares) ? 1e18 : (clampedThickness / gl_Position.w);
+ unclampedThickness = (is_squares) ? 1e18 : (thickness / gl_Position.w);
}
else {
bool is_stroke_start = (ma.x == -1 && x == -1);
@@ -501,7 +508,8 @@ void stroke_vertex()
strokePt1.xy = ss1;
strokePt2.xy = ss2;
- strokeThickness = thickness / gl_Position.w;
+ strokeThickness = clampedThickness / gl_Position.w;
+ unclampedThickness = thickness / gl_Position.w;
strokeAspect = vec2(1.0);
vec2 screen_ofs = miter * y;
@@ -512,7 +520,7 @@ void stroke_vertex()
screen_ofs += line * x;
}
- gl_Position.xy += screen_ofs * sizeViewportInv.xy * thickness;
+ gl_Position.xy += screen_ofs * sizeViewportInv.xy * clampedThickness;
finalUvs.x = (use_curr) ? uv1.z : uv2.z;
# ifdef GP_MATERIAL_BUFFER_LEN
@@ -531,7 +539,7 @@ void stroke_vertex()
vert_col = vec4(0.0);
}
- color_output(stroke_col, vert_col, vert_strength * small_line_opacity, mix_tex);
+ color_output(stroke_col, vert_col, vert_strength, mix_tex);
matFlag = GP_FLAG(m) & ~GP_FILL_FLAGS;
# endif
@@ -607,6 +615,7 @@ void fill_vertex()
strokeHardeness = 1.0;
strokeThickness = 1e18;
+ unclampedThickness = 1e20;
strokeAspect = vec2(1.0);
strokePt1 = strokePt2 = vec2(0.0);
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl
index 31e6df80d23..87365c2844d 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl
@@ -89,6 +89,9 @@ void main()
fragColor *= stroke_round_cap_mask(
strokePt1, strokePt2, strokeAspect, strokeThickness, strokeHardeness);
+ /* To avoid aliasing artifacts, we reduce the opacity of small strokes. */
+ fragColor *= smoothstep(0.0, 1.0, unclampedThickness);
+
/* Holdout materials. */
if (GP_FLAG_TEST(matFlag, GP_STROKE_HOLDOUT | GP_FILL_HOLDOUT)) {
revealColor = fragColor.aaaa;
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
index 503248558ad..aedc8668387 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
@@ -274,7 +274,7 @@ uniform bool isFirstPass;
vec2 compute_uvs(float x)
{
vec2 uv = uvcoordsvar.xy;
- /* Tranform UV (loc, rot, scale) */
+ /* Transform UV (loc, rot, scale) */
uv = uv.x * uvRotX + uv.y * uvRotY + uvOffset;
uv += blurDir * x;
/* Wave deform. */
diff --git a/source/blender/draw/engines/image/image_engine.c b/source/blender/draw/engines/image/image_engine.c
index 04bdee131d7..d75f887ce2b 100644
--- a/source/blender/draw/engines/image/image_engine.c
+++ b/source/blender/draw/engines/image/image_engine.c
@@ -113,7 +113,8 @@ static void space_image_gpu_texture_get(Image *image,
BKE_image_multiview_index(image, &sima->iuser);
if (ibuf) {
- if (sima->flag & SI_SHOW_ZBUF && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1))) {
+ const int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(ibuf);
+ if (sima_flag & SI_SHOW_ZBUF && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1))) {
if (ibuf->zbuf) {
BLI_assert(!"Integer based depth buffers not supported");
}
@@ -204,30 +205,31 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser
int draw_flags = 0;
if (space_type == SPACE_IMAGE) {
SpaceImage *sima = (SpaceImage *)draw_ctx->space_data;
+ const int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(ibuf);
const bool do_repeat = (!is_tiled_texture) && ((sima->flag & SI_DRAW_TILE) != 0);
SET_FLAG_FROM_TEST(draw_flags, do_repeat, IMAGE_DRAW_FLAG_DO_REPEAT);
SET_FLAG_FROM_TEST(draw_flags, is_tiled_texture, IMAGE_DRAW_FLAG_USE_WORLD_POS);
- if ((sima->flag & SI_USE_ALPHA) != 0) {
+ if ((sima_flag & SI_USE_ALPHA) != 0) {
/* Show RGBA */
draw_flags |= IMAGE_DRAW_FLAG_SHOW_ALPHA | IMAGE_DRAW_FLAG_APPLY_ALPHA;
}
- else if ((sima->flag & SI_SHOW_ALPHA) != 0) {
+ else if ((sima_flag & SI_SHOW_ALPHA) != 0) {
draw_flags |= IMAGE_DRAW_FLAG_SHUFFLING;
copy_v4_fl4(shuffle, 0.0f, 0.0f, 0.0f, 1.0f);
}
- else if ((sima->flag & SI_SHOW_ZBUF) != 0) {
+ else if ((sima_flag & SI_SHOW_ZBUF) != 0) {
draw_flags |= IMAGE_DRAW_FLAG_DEPTH | IMAGE_DRAW_FLAG_SHUFFLING;
copy_v4_fl4(shuffle, 1.0f, 0.0f, 0.0f, 0.0f);
}
- else if ((sima->flag & SI_SHOW_R) != 0) {
+ else if ((sima_flag & SI_SHOW_R) != 0) {
draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING;
copy_v4_fl4(shuffle, 1.0f, 0.0f, 0.0f, 0.0f);
}
- else if ((sima->flag & SI_SHOW_G) != 0) {
+ else if ((sima_flag & SI_SHOW_G) != 0) {
draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING;
copy_v4_fl4(shuffle, 0.0f, 1.0f, 0.0f, 0.0f);
}
- else if ((sima->flag & SI_SHOW_B) != 0) {
+ else if ((sima_flag & SI_SHOW_B) != 0) {
draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING;
copy_v4_fl4(shuffle, 0.0f, 0.0f, 1.0f, 0.0f);
}
@@ -283,6 +285,7 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser
/* -------------------------------------------------------------------- */
/** \name Engine Callbacks
* \{ */
+
static void IMAGE_engine_init(void *ved)
{
IMAGE_shader_library_ensure();
@@ -394,7 +397,8 @@ static void IMAGE_engine_free(void)
IMAGE_shader_free();
}
-/* \} */
+/** \} */
+
static const DrawEngineDataSize IMAGE_data_size = DRW_VIEWPORT_DATA_SIZE(IMAGE_Data);
DrawEngineType draw_engine_image_type = {
diff --git a/source/blender/draw/engines/image/image_shader.c b/source/blender/draw/engines/image/image_shader.c
index 7dc428de2ee..691c0d7029a 100644
--- a/source/blender/draw/engines/image/image_shader.c
+++ b/source/blender/draw/engines/image/image_shader.c
@@ -49,7 +49,7 @@ void IMAGE_shader_library_ensure(void)
{
if (e_data.lib == NULL) {
e_data.lib = DRW_shader_library_create();
- /* NOTE: Theses needs to be ordered by dependencies. */
+ /* NOTE: These need to be ordered by dependencies. */
DRW_SHADER_LIB_ADD(e_data.lib, common_colormanagement_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_globals_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_view_lib);
diff --git a/source/blender/draw/engines/overlay/overlay_antialiasing.c b/source/blender/draw/engines/overlay/overlay_antialiasing.c
index 229f9c5a88f..b263254696c 100644
--- a/source/blender/draw/engines/overlay/overlay_antialiasing.c
+++ b/source/blender/draw/engines/overlay/overlay_antialiasing.c
@@ -80,7 +80,7 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata)
bool need_wire_expansion = (G_draw.block.sizePixel > 1.0f);
pd->antialiasing.enabled = need_wire_expansion ||
- ((U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) > 0);
+ ((U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) != 0);
GPUTexture *color_tex = NULL;
GPUTexture *line_tex = NULL;
@@ -93,7 +93,7 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata)
line_tex = txl->overlay_line_tx;
}
else {
- /* Just a copy of the defaults framebuffers. */
+ /* Just a copy of the defaults frame-buffers. */
color_tex = dtxl->color_overlay;
}
@@ -127,7 +127,7 @@ void OVERLAY_antialiasing_cache_init(OVERLAY_Data *vedata)
if (pd->antialiasing.enabled) {
/* `antialiasing.enabled` is also enabled for wire expansion. Check here if
* anti aliasing is needed. */
- const bool do_smooth_lines = (U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) > 0;
+ const bool do_smooth_lines = (U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) != 0;
DRW_PASS_CREATE(psl->antialiasing_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL);
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index cbd2589f20f..7042d095b56 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -1691,13 +1691,13 @@ static void draw_bone_degrees_of_freedom(ArmatureDrawContext *ctx, bPoseChannel
unit_m4(posetrans);
translate_m4(posetrans, pchan->pose_mat[3][0], pchan->pose_mat[3][1], pchan->pose_mat[3][2]);
- /* in parent-bone pose space... */
+ /* In parent-bone pose space... */
if (pchan->parent) {
copy_m4_m4(tmp, pchan->parent->pose_mat);
zero_v3(tmp[3]);
mul_m4_m4m4(posetrans, posetrans, tmp);
}
- /* ... but own restspace */
+ /* ... but own rest-space. */
mul_m4_m4m3(posetrans, posetrans, pchan->bone->bone_mat);
float scale = pchan->bone->length * pchan->size[1];
diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.c b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
index 38e171cb5e2..40a9dbe01c0 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_mesh.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
@@ -344,7 +344,7 @@ void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
if (pd->edit_mesh.do_zbufclip) {
DRW_draw_pass(psl->edit_mesh_depth_ps[IN_FRONT]);
- /* render facefill */
+ /* Render face-fill. */
DRW_view_set_active(pd->view_edit_faces);
DRW_draw_pass(psl->edit_mesh_faces_ps[NOT_IN_FRONT]);
diff --git a/source/blender/draw/engines/overlay/overlay_edit_uv.c b/source/blender/draw/engines/overlay/overlay_edit_uv.c
index 336b03ee284..fe0741d1606 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_uv.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_uv.c
@@ -161,7 +161,7 @@ void OVERLAY_edit_uv_init(OVERLAY_Data *vedata)
pd->edit_uv.do_tiled_image_border_overlay = is_image_type && is_tiled_image;
pd->edit_uv.dash_length = 4.0f * UI_DPI_FAC;
pd->edit_uv.line_style = edit_uv_line_style_from_space_image(sima);
- pd->edit_uv.do_smooth_wire = ((U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) > 0);
+ pd->edit_uv.do_smooth_wire = ((U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) != 0);
pd->edit_uv.do_stencil_overlay = show_overlays && do_stencil_overlay;
pd->edit_uv.draw_type = sima->dt_uvstretch;
@@ -575,4 +575,4 @@ void OVERLAY_edit_uv_draw(OVERLAY_Data *vedata)
OVERLAY_edit_uv_draw_finish(vedata);
}
-/* \} */
+/** \} */
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 39f17581e0d..00429a19cf4 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -642,10 +642,10 @@ void OVERLAY_light_cache_populate(OVERLAY_Data *vedata, Object *ob)
} instdata;
copy_m4_m4(instdata.mat, ob->obmat);
- /* FIXME / TODO: clipend has no meaning nowadays.
- * In EEVEE, Only clipsta is used shadowmaping.
+ /* 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.
- * For now, always use the custom distance as clipend. */
+ * For now, always use the custom distance as clip_end. */
instdata.clip_end = la->att_dist;
instdata.clip_sta = la->clipsta;
@@ -1176,7 +1176,7 @@ void OVERLAY_camera_cache_populate(OVERLAY_Data *vedata, Object *ob)
invert_v3(scale);
for (int i = 0; i < 4; i++) {
mul_v3_v3(vec[i], scale);
- /* Project to z=-1 plane. Makes positionning / scaling easier. (see shader) */
+ /* Project to z=-1 plane. Makes positioning / scaling easier. (see shader) */
mul_v2_fl(vec[i], 1.0f / fabsf(vec[i][2]));
}
diff --git a/source/blender/draw/engines/overlay/overlay_gpencil.c b/source/blender/draw/engines/overlay/overlay_gpencil.c
index 7f9290a6c3a..891142fe0a2 100644
--- a/source/blender/draw/engines/overlay/overlay_gpencil.c
+++ b/source/blender/draw/engines/overlay/overlay_gpencil.c
@@ -85,7 +85,9 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
(GPENCIL_VERTEX_MODE(gpd) && !use_vertex_mask));
const bool do_multiedit = GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
- const bool show_multi_edit_lines = (v3d->gp_flag & V3D_GP_SHOW_MULTIEDIT_LINES) != 0;
+ const bool show_multi_edit_lines = (do_multiedit) &&
+ ((v3d->gp_flag & (V3D_GP_SHOW_MULTIEDIT_LINES |
+ V3D_GP_SHOW_EDIT_LINES)) != 0);
const bool show_lines = (v3d->gp_flag & V3D_GP_SHOW_EDIT_LINES) || show_multi_edit_lines;
@@ -258,6 +260,16 @@ void OVERLAY_gpencil_cache_init(OVERLAY_Data *vedata)
copy_m4_m4(mat, ob->obmat);
+ /* Rotate and scale except align to cursor. */
+ bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd);
+ if (gpl != NULL) {
+ if (ts->gp_sculpt.lock_axis != GP_LOCKAXIS_CURSOR) {
+ float matrot[3][3];
+ copy_m3_m4(matrot, gpl->layer_mat);
+ mul_m4_m4m3(mat, mat, matrot);
+ }
+ }
+
float viewinv[4][4];
/* Set the grid in the selected axis */
switch (ts->gp_sculpt.lock_axis) {
@@ -294,6 +306,11 @@ void OVERLAY_gpencil_cache_init(OVERLAY_Data *vedata)
mul_v2_v2fl(size, gpd->grid.scale, 2.0f * ED_scene_grid_scale(scene, &grid_unit));
rescale_m4(mat, (float[3]){size[0], size[1], 0.0f});
+ /* Apply layer loc transform, except cursor mode. */
+ if ((gpl != NULL) && (ts->gpencil_v3d_align & GP_PROJECT_CURSOR) == 0) {
+ add_v3_v3(mat[3], gpl->layer_mat[3]);
+ }
+
const int gridlines = (gpd->grid.lines <= 0) ? 1 : gpd->grid.lines;
int line_ct = gridlines * 4 + 2;
diff --git a/source/blender/draw/engines/overlay/overlay_grid.c b/source/blender/draw/engines/overlay/overlay_grid.c
index 87aa013f03a..5bb157ed081 100644
--- a/source/blender/draw/engines/overlay/overlay_grid.c
+++ b/source/blender/draw/engines/overlay/overlay_grid.c
@@ -93,7 +93,7 @@ void OVERLAY_grid_init(OVERLAY_Data *vedata)
DRW_view_viewmat_get(NULL, viewmat, false);
DRW_view_viewmat_get(NULL, viewinv, true);
- /* if perps */
+ /* If perspective view or non-axis aligned view. */
if (winmat[3][3] == 0.0f || rv3d->view == RV3D_VIEW_USER) {
if (show_axis_x) {
shd->grid_flag |= PLANE_XY | SHOW_AXIS_X;
diff --git a/source/blender/draw/engines/overlay/overlay_metaball.c b/source/blender/draw/engines/overlay/overlay_metaball.c
index f973c1eda8a..46076a7c88b 100644
--- a/source/blender/draw/engines/overlay/overlay_metaball.c
+++ b/source/blender/draw/engines/overlay/overlay_metaball.c
@@ -63,7 +63,7 @@ static void metaball_instance_data_set(
mul_v3_v3fl(data->mat[1], ob->obmat[1], radius / 0.05f);
mul_v3_v3fl(data->mat[2], ob->obmat[2], radius / 0.05f);
mul_v3_m4v3(data->mat[3], ob->obmat, pos);
- /* WATCH: Reminder, alpha is wiresize. */
+ /* WATCH: Reminder, alpha is wire-size. */
OVERLAY_bone_instance_data_set_color(data, color);
}
diff --git a/source/blender/draw/engines/overlay/overlay_particle.c b/source/blender/draw/engines/overlay/overlay_particle.c
index fa95bad4d86..71064e7ff47 100644
--- a/source/blender/draw/engines/overlay/overlay_particle.c
+++ b/source/blender/draw/engines/overlay/overlay_particle.c
@@ -185,7 +185,7 @@ void OVERLAY_particle_cache_populate(OVERLAY_Data *vedata, Object *ob)
/* TODO(fclem): Here would be a good place for preemptive culling. */
- /* fclem: Is color even usefull in our modern context? */
+ /* NOTE(fclem): Is color even useful in our modern context? */
Material *ma = BKE_object_material_get(ob, part->omat);
float color[4] = {0.6f, 0.6f, 0.6f, part->draw_size};
if (ma != NULL) {
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 88f4e28c039..c9c26e3faaa 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -238,7 +238,7 @@ void OVERLAY_shader_library_ensure(void)
{
if (e_data.lib == NULL) {
e_data.lib = DRW_shader_library_create();
- /* NOTE: Theses needs to be ordered by dependencies. */
+ /* NOTE: These need to be ordered by dependencies. */
DRW_SHADER_LIB_ADD(e_data.lib, common_globals_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_overlay_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_colormanagement_lib);
@@ -1684,7 +1684,7 @@ GPUShader *OVERLAY_shader_edit_uv_tiled_image_borders_get(void)
return sh_data->edit_uv_tiled_image_borders;
}
-/* \} */
+/** \} */
static OVERLAY_InstanceFormats g_formats = {NULL};
diff --git a/source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl b/source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl
index 2989e07691f..f24aee56bb2 100644
--- a/source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl
@@ -146,7 +146,7 @@ void main()
vec4 lines = vec4(neightbor_line0.z, neightbor_line1.z, neightbor_line2.z, neightbor_line3.z);
/* Count number of line neighbors. */
float blend = dot(vec4(0.25), step(0.001, lines));
- /* Only do blend if there is more than 2 neighbor. This avoid loosing too much AA. */
+ /* Only do blend if there are more than 2 neighbors. This avoids losing too much AA. */
blend = clamp(blend * 2.0 - 1.0, 0.0, 1.0);
fragColor = mix(fragColor, fragColor / fragColor.a, blend);
}
diff --git a/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl b/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl
index ad791a9416d..036efa41555 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl
@@ -1,7 +1,7 @@
/* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */
-#define ACTIVE_NURB 1 << 2
-#define EVEN_U_BIT 1 << 4
+#define ACTIVE_NURB (1 << 2)
+#define EVEN_U_BIT (1 << 4)
#define COLOR_SHIFT 5
/* Keep the same value in `handle_display` in `DNA_view3d_types.h` */
diff --git a/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl
index 64cc1b7d840..5f2154f00b8 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl
@@ -1,6 +1,6 @@
/* Keep the same value of `BEZIER_HANDLE` in `draw_cache_imp_curve.c` */
-#define BEZIER_HANDLE 1 << 3
+#define BEZIER_HANDLE (1 << 3)
/* Keep the same value in `handle_display` in `DNA_view3d_types.h` */
#define CURVE_HANDLE_SELECTED 0
diff --git a/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl b/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl
index 92252bbd223..66fa85685e2 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl
@@ -4,7 +4,7 @@ layout(triangle_strip, max_vertices = 4) out;
in vec4 finalColor[2];
in vec4 finalColorOuter[2];
-in int selectOveride[2];
+in int selectOverride[2];
flat out vec4 finalColorOuter_f;
out vec4 finalColor_f;
@@ -80,7 +80,7 @@ void main()
#ifdef USE_WORLD_CLIP_PLANES
world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance);
#endif
- vec4 final_color = (selectOveride[0] == 0) ? finalColor[1] : finalColor[0];
+ vec4 final_color = (selectOverride[0] == 0) ? finalColor[1] : finalColor[0];
do_vertex(final_color, pos1, half_size, edge_ofs.xy);
do_vertex(final_color, pos1, -half_size, -edge_ofs.xy);
diff --git a/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl
index 2cefab56722..a3ff277b714 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl
@@ -17,7 +17,7 @@ out vec4 finalColor;
out vec4 finalColorOuter;
#endif
#ifdef USE_GEOM_SHADER
-out int selectOveride;
+out int selectOverride;
#endif
bool test_occlusion()
@@ -59,10 +59,10 @@ void main()
#elif defined(EDGE)
# ifdef FLAT
finalColor = EDIT_MESH_edge_color_inner(m_data.y);
- selectOveride = 1;
+ selectOverride = 1;
# else
finalColor = EDIT_MESH_edge_vertex_color(m_data.y);
- selectOveride = (m_data.y & EDGE_SELECTED);
+ selectOverride = (m_data.y & EDGE_SELECTED);
# endif
float crease = float(m_data.z) / 255.0;
diff --git a/source/blender/draw/engines/overlay/shaders/extra_vert.glsl b/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
index 89bc0bcf522..74854dc0f8d 100644
--- a/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
@@ -222,7 +222,7 @@ void main()
edgePos = edgeStart = ((gl_Position.xy / gl_Position.w) * 0.5 + 0.5) * sizeViewport.xy;
#ifdef SELECT_EDGES
- /* HACK: to avoid loosing sub pixel object in selections, we add a bit of randomness to the
+ /* HACK: to avoid losing sub-pixel object in selections, we add a bit of randomness to the
* wire to at least create one fragment that will pass the occlusion query. */
/* TODO(fclem): Limit this workaround to selection. It's not very noticeable but still... */
gl_Position.xy += sizeViewportInv.xy * gl_Position.w * ((gl_VertexID % 2 == 0) ? -1.0 : 1.0);
diff --git a/source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl b/source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
index 8a80441b5d9..91f45329018 100644
--- a/source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
@@ -18,7 +18,7 @@ void main()
gl_Position = point_world_to_ndc(world_pos);
#ifdef SELECT_EDGES
- /* HACK: to avoid loosing sub pixel object in selections, we add a bit of randomness to the
+ /* HACK: to avoid losing sub-pixel object in selections, we add a bit of randomness to the
* wire to at least create one fragment that will pass the occlusion query. */
/* TODO(fclem): Limit this workaround to selection. It's not very noticeable but still... */
gl_Position.xy += sizeViewportInv.xy * gl_Position.w * ((gl_VertexID % 2 == 0) ? -1.0 : 1.0);
diff --git a/source/blender/draw/engines/overlay/shaders/grid_frag.glsl b/source/blender/draw/engines/overlay/shaders/grid_frag.glsl
index 9cf6898cf18..3220adbff36 100644
--- a/source/blender/draw/engines/overlay/shaders/grid_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/grid_frag.glsl
@@ -187,8 +187,8 @@ void main()
FragColor = colorGrid;
FragColor.a *= gridA * blend;
- FragColor = mix(FragColor, mix(colorGrid, colorGridEmphasise, blend), gridB);
- FragColor = mix(FragColor, colorGridEmphasise, gridC);
+ FragColor = mix(FragColor, mix(colorGrid, colorGridEmphasis, blend), gridB);
+ FragColor = mix(FragColor, colorGridEmphasis, gridC);
}
else {
FragColor = vec4(colorGrid.rgb, 0.0);
diff --git a/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
index c80d8f99628..c083fdacbbe 100644
--- a/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
@@ -169,7 +169,7 @@ void main()
}
#ifdef SELECT_EDGES
- /* HACK: to avoid loosing sub pixel object in selections, we add a bit of randomness to the
+ /* HACK: to avoid losing sub-pixel object in selections, we add a bit of randomness to the
* wire to at least create one fragment that will pass the occlusion query. */
gl_Position.xy += sizeViewportInv.xy * gl_Position.w * ((gl_VertexID % 2 == 0) ? -1.0 : 1.0);
#endif
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl
index 102a8ddca7b..8f6940a6062 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl
@@ -24,9 +24,6 @@ uniform sampler2D noiseTex;
#define dof_distance dofParams.y
#define dof_invsensorsize dofParams.z
-#define weighted_sum(a, b, c, d, e, e_sum) \
- ((a)*e.x + (b)*e.y + (c)*e.z + (d)*e.w) / max(1e-6, e_sum);
-
/* divide by sensor size to get the normalized size */
#define calculate_coc(zdepth) \
(dof_aperturesize * (dof_distance / zdepth - 1.0) * dof_invsensorsize)
@@ -89,8 +86,7 @@ void main()
/* now write output to weighted buffers. */
/* Take far plane pixels in priority. */
vec4 w = any(notEqual(far_weights, vec4(0.0))) ? far_weights : near_weights;
- float tot_weight = dot(w, vec4(1.0));
- halfResColor = weighted_sum(color1, color2, color3, color4, w, tot_weight);
+ halfResColor = weighted_sum(color1, color2, color3, color4, w);
halfResColor = clamp(halfResColor, 0.0, 3.0);
normalizedCoc = encode_coc(coc_near, coc_far);
@@ -138,8 +134,7 @@ void main()
/* now write output to weighted buffers. */
vec4 w = any(notEqual(far_weights, vec4(0.0))) ? far_weights : near_weights;
- float tot_weight = dot(w, vec4(1.0));
- outColor = weighted_sum(color1, color2, color3, color4, w, tot_weight);
+ outColor = weighted_sum(color1, color2, color3, color4, w);
outCocs = encode_coc(coc_near, coc_far);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
index 2dea2fc4883..9797a5e3301 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
@@ -5,7 +5,7 @@ uniform sampler2D searchTex;
uniform sampler2D blendTex;
uniform sampler2D colorTex;
uniform float mixFactor;
-uniform float taaSampleCountInv;
+uniform float taaAccumulatedWeight;
in vec2 uvs;
in vec2 pixcoord;
@@ -39,6 +39,12 @@ void main()
if (mixFactor < 1.0) {
fragColor += texture(colorTex, uvs) * (1.0 - mixFactor);
}
- fragColor *= taaSampleCountInv;
+ fragColor /= taaAccumulatedWeight;
+ fragColor = exp2(fragColor) - 0.5;
+
+ /* Avoid float precision issue. */
+ if (fragColor.a > 0.999) {
+ fragColor.a = 1.0;
+ }
#endif
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
index b877c2c3f76..d021e4696f7 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
@@ -1,11 +1,22 @@
uniform sampler2D colorBuffer;
-
-in vec4 uvcoordsvar;
+uniform float samplesWeights[9];
out vec4 fragColor;
void main()
{
- fragColor = texture(colorBuffer, uvcoordsvar.st);
+ vec2 texel_size = 1.0 / vec2(textureSize(colorBuffer, 0));
+ vec2 uv = gl_FragCoord.xy * texel_size;
+
+ fragColor = vec4(0.0);
+ int i = 0;
+ for (int x = -1; x <= 1; x++) {
+ for (int y = -1; y <= 1; y++, i++) {
+ /* Use log2 space to avoid highlights creating too much aliasing. */
+ vec4 color = log2(texture(colorBuffer, uv + vec2(x, y) * texel_size) + 0.5);
+
+ fragColor += color * samplesWeights[i];
+ }
+ }
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index eaa553a10de..9bd49bb84f8 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -288,7 +288,7 @@ void main()
ls_ray_dir -= ls_ray_ori;
- /* TODO: Align rays to volume center so that it mimics old behaviour of slicing the volume. */
+ /* TODO: Align rays to volume center so that it mimics old behavior of slicing the volume. */
float dist = line_unit_box_intersect_dist(ls_ray_ori, ls_ray_dir);
if (dist > 0.0) {
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 4f689fd55a5..b84ddec4973 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -84,7 +84,7 @@ static WORKBENCH_ViewLayerData *workbench_view_layer_data_ensure_ex(struct ViewL
return *vldata;
}
-/* \} */
+/** \} */
static void workbench_studiolight_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd)
{
diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
index 20c30d9ce68..c9f876f9573 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
@@ -75,7 +75,7 @@ static void workbench_taa_jitter_init_order(float (*table)[2], int num)
swap_v2_v2(table[0], table[closest_index]);
}
- /* sort list based on furtest distance with previous */
+ /* Sort list based on farthest distance with previous. */
for (int i = 0; i < num - 2; i++) {
float f_squared_dist = 0.0;
int f_index = i;
@@ -244,11 +244,11 @@ void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata)
if (txl->smaa_search_tx == NULL) {
txl->smaa_search_tx = GPU_texture_create_2d(
"smaa_search", SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT, 1, GPU_R8, NULL);
- GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UNSIGNED_BYTE, searchTexBytes);
+ GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UBYTE, searchTexBytes);
txl->smaa_area_tx = GPU_texture_create_2d(
"smaa_area", AREATEX_WIDTH, AREATEX_HEIGHT, 1, GPU_RG8, NULL);
- GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UNSIGNED_BYTE, areaTexBytes);
+ GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UBYTE, areaTexBytes);
GPU_texture_filter_mode(txl->smaa_search_tx, true);
GPU_texture_filter_mode(txl->smaa_area_tx, true);
@@ -264,6 +264,37 @@ void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata)
}
}
+static float filter_blackman_harris(float x, const float width)
+{
+ if (x > width * 0.5f) {
+ return 0.0f;
+ }
+ x = 2.0f * M_PI * clamp_f((x / width + 0.5f), 0.0f, 1.0f);
+ return 0.35875f - 0.48829f * cosf(x) + 0.14128f * cosf(2.0f * x) - 0.01168f * cosf(3.0f * x);
+}
+
+/* Compute weights for the 3x3 neighborhood using a 1.5px filter. */
+static void workbench_antialiasing_weights_get(const float offset[2],
+ float r_weights[9],
+ float *r_weight_sum)
+{
+ /* NOTE: If filter width is bigger than 2.0f, then we need to sample more neighborhood. */
+ const float filter_width = 2.0f;
+ *r_weight_sum = 0.0f;
+ int i = 0;
+ for (int x = -1; x <= 1; x++) {
+ for (int y = -1; y <= 1; y++, i++) {
+ float sample_co[2] = {x, y};
+ add_v2_v2(sample_co, offset);
+ float r = len_v2(sample_co);
+ /* fclem: is radial distance ok here? */
+ float weight = filter_blackman_harris(r, filter_width);
+ *r_weight_sum += weight;
+ r_weights[i] = weight;
+ }
+ }
+}
+
void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata)
{
WORKBENCH_TextureList *txl = vedata->txl;
@@ -278,10 +309,12 @@ void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata)
{
DRW_PASS_CREATE(psl->aa_accum_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL);
+ DRW_PASS_INSTANCE_CREATE(psl->aa_accum_replace_ps, psl->aa_accum_ps, DRW_STATE_WRITE_COLOR);
GPUShader *shader = workbench_shader_antialiasing_accumulation_get();
grp = DRW_shgroup_create(shader, psl->aa_accum_ps);
- DRW_shgroup_uniform_texture(grp, "colorBuffer", dtxl->color);
+ DRW_shgroup_uniform_texture_ex(grp, "colorBuffer", dtxl->color, GPU_SAMPLER_DEFAULT);
+ DRW_shgroup_uniform_float(grp, "samplesWeights", wpd->taa_weights, 9);
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
}
@@ -325,7 +358,7 @@ void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata)
DRW_shgroup_uniform_texture(grp, "colorTex", txl->history_buffer_tx);
DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
DRW_shgroup_uniform_float(grp, "mixFactor", &wpd->smaa_mix_factor, 1);
- DRW_shgroup_uniform_float(grp, "taaSampleCountInv", &wpd->taa_sample_inv, 1);
+ DRW_shgroup_uniform_float(grp, "taaAccumulatedWeight", &wpd->taa_weight_accum, 1);
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
}
@@ -369,6 +402,8 @@ bool workbench_antialiasing_setup(WORKBENCH_Data *vedata)
break;
}
+ workbench_antialiasing_weights_get(transform_offset, wpd->taa_weights, &wpd->taa_weights_sum);
+
/* construct new matrices from transform delta */
float winmat[4][4], viewmat[4][4], persmat[4][4];
DRW_view_winmat_get(default_view, winmat, false);
@@ -419,8 +454,11 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata)
const bool last_sample = wpd->taa_sample + 1 == wpd->taa_sample_len;
const bool taa_finished = wpd->taa_sample >= wpd->taa_sample_len;
if (wpd->taa_sample == 0) {
+ wpd->taa_weight_accum = wpd->taa_weights_sum;
wpd->valid_history = true;
- GPU_texture_copy(txl->history_buffer_tx, dtxl->color);
+
+ GPU_framebuffer_bind(fbl->antialiasing_fb);
+ DRW_draw_pass(psl->aa_accum_replace_ps);
/* In playback mode, we are sure the next redraw will not use the same viewmatrix.
* In this case no need to save the depth buffer. */
if (!wpd->is_playback) {
@@ -435,6 +473,7 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata)
/* Accumulate result to the TAA buffer. */
GPU_framebuffer_bind(fbl->antialiasing_fb);
DRW_draw_pass(psl->aa_accum_ps);
+ wpd->taa_weight_accum += wpd->taa_weights_sum;
}
/* Copy back the saved depth buffer for correct overlays. */
GPU_texture_copy(dtxl->depth, txl->depth_buffer_tx);
@@ -446,7 +485,6 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata)
if (!DRW_state_is_image_render() || last_sample) {
/* After a certain point SMAA is no longer necessary. */
wpd->smaa_mix_factor = 1.0f - clamp_f(wpd->taa_sample / 4.0f, 0.0f, 1.0f);
- wpd->taa_sample_inv = 1.0f / min_ii(wpd->taa_sample + 1, wpd->taa_sample_len);
if (wpd->smaa_mix_factor > 0.0f) {
GPU_framebuffer_bind(fbl->smaa_edge_fb);
diff --git a/source/blender/draw/engines/workbench/workbench_effect_dof.c b/source/blender/draw/engines/workbench/workbench_effect_dof.c
index 73cd501190f..a00453fe125 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_dof.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_dof.c
@@ -104,7 +104,7 @@ static void workbench_dof_setup_samples(struct GPUUniformBuf **ubo,
square_to_circle(x, y, &r, &T);
samp[2] = r;
- /* Bokeh shape parametrisation */
+ /* Bokeh shape parameterization. */
if (bokeh_sides > 1.0f) {
float denom = T - (2.0 * M_PI / bokeh_sides) *
floorf((bokeh_sides * T + M_PI) / (2.0 * M_PI));
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 6aa794bda51..6e9118bfe46 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -76,7 +76,7 @@ void workbench_material_ubo_data(WORKBENCH_PrivateData *wpd,
alpha *= mat->a;
copy_v3_v3(data->base_color, &mat->r);
metallic = mat->metallic;
- roughness = sqrtf(mat->roughness); /* Remap to disney roughness. */
+ roughness = sqrtf(mat->roughness); /* Remap to Disney roughness. */
}
else {
copy_v3_fl(data->base_color, 0.8f);
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index d157c260fbd..6247436feea 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -164,6 +164,7 @@ typedef struct WORKBENCH_PassList {
struct DRWPass *volume_ps;
struct DRWPass *aa_accum_ps;
+ struct DRWPass *aa_accum_replace_ps;
struct DRWPass *aa_edge_ps;
struct DRWPass *aa_weight_ps;
struct DRWPass *aa_resolve_ps;
@@ -225,7 +226,7 @@ BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_Material, 16)
typedef struct WORKBENCH_Prepass {
/** Hash storing shading group for each Material or GPUTexture to reduce state changes. */
struct GHash *material_hash;
- /** First common (non-vcol and non-image colored) shading group to created subgroups. */
+ /** First common (non-vertex-color and non-image-colored) shading group to created subgroups. */
struct DRWShadingGroup *common_shgrp;
/** First Vertex Color shading group to created subgroups. */
struct DRWShadingGroup *vcol_shgrp;
@@ -286,8 +287,12 @@ typedef struct WORKBENCH_PrivateData {
int taa_sample_len_previous;
/** Current TAA sample index in [0..taa_sample_len[ range. */
int taa_sample;
- /** Inverse of taa_sample to divide the accumulation buffer. */
- float taa_sample_inv;
+ /** Weight accumulated. */
+ float taa_weight_accum;
+ /** Samples weight for this iteration. */
+ float taa_weights[9];
+ /** Sum of taa_weights. */
+ float taa_weights_sum;
/** If the view has been updated and TAA needs to be reset. */
bool view_updated;
/** True if the history buffer contains relevant data and false if it could contain garbage. */
@@ -384,7 +389,7 @@ typedef struct WORKBENCH_ViewLayerData {
struct GPUUniformBuf *cavity_sample_ubo;
/** Blue noise texture used to randomize the sampling of some effects.*/
struct GPUTexture *cavity_jitter_tx;
- /** Materials ubos allocated in a memblock for easy bookeeping. */
+ /** Materials UBO's allocated in a memblock for easy bookkeeping. */
struct BLI_memblock *material_ubo;
struct BLI_memblock *material_ubo_data;
/** Number of samples for which cavity_sample_ubo is valid. */
diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c
index 47592578c34..f2d178f6565 100644
--- a/source/blender/draw/engines/workbench/workbench_render.c
+++ b/source/blender/draw/engines/workbench/workbench_render.c
@@ -54,7 +54,7 @@ static void workbench_render_matrices_init(RenderEngine *engine, Depsgraph *deps
/* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */
struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
- /* Set the persective, view and window matrix. */
+ /* Set the perspective, view and window matrix. */
float winmat[4][4], viewmat[4][4], viewinv[4][4];
RE_GetCameraWindow(engine->re, ob_camera_eval, winmat);
diff --git a/source/blender/draw/engines/workbench/workbench_shader.c b/source/blender/draw/engines/workbench/workbench_shader.c
index 1c612404c95..ad610a6a885 100644
--- a/source/blender/draw/engines/workbench/workbench_shader.c
+++ b/source/blender/draw/engines/workbench/workbench_shader.c
@@ -120,7 +120,7 @@ void workbench_shader_library_ensure(void)
{
if (e_data.lib == NULL) {
e_data.lib = DRW_shader_library_create();
- /* NOTE: Theses needs to be ordered by dependencies. */
+ /* NOTE: These need to be ordered by dependencies. */
DRW_SHADER_LIB_ADD(e_data.lib, common_math_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_math_geom_lib);
DRW_SHADER_LIB_ADD(e_data.lib, common_hair_lib);
diff --git a/source/blender/draw/engines/workbench/workbench_shadow.c b/source/blender/draw/engines/workbench/workbench_shadow.c
index 881c186e3e5..99d945c311e 100644
--- a/source/blender/draw/engines/workbench/workbench_shadow.c
+++ b/source/blender/draw/engines/workbench/workbench_shadow.c
@@ -157,7 +157,7 @@ void workbench_shadow_cache_init(WORKBENCH_Data *data)
DRWState state = DRW_STATE_DEPTH_LESS | DRW_STATE_STENCIL_ALWAYS;
#endif
- /* TODO(fclem): Merge into one pass with subpasses. */
+ /* TODO(fclem): Merge into one pass with sub-passes. */
DRW_PASS_CREATE(psl->shadow_ps[0], state | depth_pass_state);
DRW_PASS_CREATE(psl->shadow_ps[1], state | depth_fail_state);
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 4a43107c612..2545cfa65dc 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -93,7 +93,7 @@ typedef char DRWViewportEmptyList;
#define DRW_VIEWPORT_LIST_SIZE(list) \
(sizeof(list) == sizeof(DRWViewportEmptyList) ? 0 : ((sizeof(list)) / sizeof(void *)))
-/* Unused members must be either pass list or 'char *' when not usd. */
+/* Unused members must be either pass list or 'char *' when not used. */
#define DRW_VIEWPORT_DATA_SIZE(ty) \
{ \
DRW_VIEWPORT_LIST_SIZE(*(((ty *)NULL)->fbl)), DRW_VIEWPORT_LIST_SIZE(*(((ty *)NULL)->txl)), \
@@ -327,14 +327,14 @@ typedef enum {
/** Culling test */
DRW_STATE_CULL_BACK = (1 << 7),
DRW_STATE_CULL_FRONT = (1 << 8),
- /** Stencil test . These options are mutal exclusive and packed into 2 bits*/
+ /** Stencil test . These options are mutually exclusive and packed into 2 bits. */
DRW_STATE_STENCIL_ALWAYS = (1 << 9),
DRW_STATE_STENCIL_EQUAL = (2 << 9),
DRW_STATE_STENCIL_NEQUAL = (3 << 9),
/** Blend state. These options are mutual exclusive and packed into 4 bits */
DRW_STATE_BLEND_ADD = (1 << 11),
- /** Same as additive but let alpha accumulate without premult. */
+ /** Same as additive but let alpha accumulate without pre-multiply. */
DRW_STATE_BLEND_ADD_FULL = (2 << 11),
/** Standard alpha blending. */
DRW_STATE_BLEND_ALPHA = (3 << 11),
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 5333f59bf38..fcd626eb92b 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -1325,7 +1325,7 @@ GPUBatch *DRW_cache_field_vortex_get(void)
#undef SPIRAL_RESOL
}
-/* Screenaligned circle. */
+/* Screen-aligned circle. */
GPUBatch *DRW_cache_field_curve_get(void)
{
#define CIRCLE_RESOL 32
@@ -1414,7 +1414,7 @@ GPUBatch *DRW_cache_field_cone_limit_get(void)
#undef CIRCLE_RESOL
}
-/* Screenaligned dashed circle */
+/* Screen-aligned dashed circle */
GPUBatch *DRW_cache_field_sphere_limit_get(void)
{
#define CIRCLE_RESOL 32
@@ -3385,7 +3385,7 @@ GPUBatch *DRW_cache_particles_get_prim(int type)
int v = 0;
int flag = VCLASS_EMPTY_AXES;
- /* Set minimum to 0.001f so we can easilly normalize to get the color. */
+ /* Set minimum to 0.001f so we can easily normalize to get the color. */
GPU_vertbuf_vert_set(vbo, v++, &(Vert){{0.0f, 0.0001f, 0.0f}, flag});
GPU_vertbuf_vert_set(vbo, v++, &(Vert){{0.0f, 2.0f, 0.0f}, flag});
GPU_vertbuf_vert_set(vbo, v++, &(Vert){{0.0001f, 0.0f, 0.0f}, flag});
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 9fd7ffd4692..c15c246992d 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -239,7 +239,7 @@ typedef struct DRWVolumeGrid {
float texture_to_object[4][4];
float object_to_texture[4][4];
- /* Transfrom from bounds to texture space. */
+ /* Transform from bounds to texture space. */
float object_to_bounds[4][4];
float bounds_to_texture[4][4];
} DRWVolumeGrid;
diff --git a/source/blender/draw/intern/draw_cache_extract.h b/source/blender/draw/intern/draw_cache_extract.h
index a0679ba6442..c929fe7dfd3 100644
--- a/source/blender/draw/intern/draw_cache_extract.h
+++ b/source/blender/draw/intern/draw_cache_extract.h
@@ -109,8 +109,8 @@ typedef struct MeshBufferCache {
/* Only for edit mode. */
GPUVertBuf *edit_data; /* extend */
GPUVertBuf *edituv_data;
- GPUVertBuf *stretch_area;
- GPUVertBuf *stretch_angle;
+ GPUVertBuf *edituv_stretch_area;
+ GPUVertBuf *edituv_stretch_angle;
GPUVertBuf *mesh_analysis;
GPUVertBuf *fdots_pos;
GPUVertBuf *fdots_nor;
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.c b/source/blender/draw/intern/draw_cache_extract_mesh.c
index 40d7614f93f..f167ea3d540 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh.c
+++ b/source/blender/draw/intern/draw_cache_extract_mesh.c
@@ -907,7 +907,7 @@ static void extract_tris_finish(const MeshRenderData *mr,
if (mr->use_final_mesh && cache->final.tris_per_mat) {
MeshBufferCache *mbc = &cache->final;
for (int i = 0; i < mr->mat_len; i++) {
- /* Theses IBOs have not been queried yet but we create them just in case they are needed
+ /* These IBOs have not been queried yet but we create them just in case they are needed
* later since they are not tracked by mesh_buffer_cache_create_requested(). */
if (mbc->tris_per_mat[i] == NULL) {
mbc->tris_per_mat[i] = GPU_indexbuf_calloc();
@@ -1380,7 +1380,7 @@ static void extract_lines_paint_mask_iter_poly_mesh(const MeshRenderData *mr,
}
}
else {
- /* Set theses unselected loop only if this edge has no other selected loop. */
+ /* Set these unselected loop only if this edge has no other selected loop. */
if (!BLI_BITMAP_TEST(data->select_map, e_index)) {
GPU_indexbuf_set_line_verts(&data->elb, e_index, ml_index, ml_index_other);
}
@@ -3849,9 +3849,9 @@ static const MeshExtract extract_edituv_data = {
/** \name Extract Edit UV area stretch
* \{ */
-static void *extract_stretch_area_init(const MeshRenderData *mr,
- struct MeshBatchCache *UNUSED(cache),
- void *buf)
+static void *extract_edituv_stretch_area_init(const MeshRenderData *mr,
+ struct MeshBatchCache *UNUSED(cache),
+ void *buf)
{
static GPUVertFormat format = {0};
if (format.attr_len == 0) {
@@ -3880,10 +3880,10 @@ BLI_INLINE float area_ratio_to_stretch(float ratio, float tot_ratio, float inv_t
return (ratio > 1.0f) ? (1.0f / ratio) : ratio;
}
-static void mesh_stretch_area_finish(const MeshRenderData *mr,
- struct MeshBatchCache *cache,
- void *buf,
- void *UNUSED(data))
+static void mesh_edituv_stretch_area_finish(const MeshRenderData *mr,
+ struct MeshBatchCache *cache,
+ void *buf,
+ void *UNUSED(data))
{
float tot_area = 0.0f, tot_uv_area = 0.0f;
float *area_ratio = MEM_mallocN(sizeof(float) * mr->poly_len, __func__);
@@ -3952,9 +3952,9 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr,
MEM_freeN(area_ratio);
}
-static const MeshExtract extract_stretch_area = {
- .init = extract_stretch_area_init,
- .finish = mesh_stretch_area_finish,
+static const MeshExtract extract_edituv_stretch_area = {
+ .init = extract_edituv_stretch_area_init,
+ .finish = mesh_edituv_stretch_area_finish,
.data_flag = 0,
.use_threading = false,
};
@@ -4001,9 +4001,9 @@ static short v2_to_short_angle(const float v[2])
return atan2f(v[1], v[0]) * (float)M_1_PI * SHRT_MAX;
}
-static void edituv_get_stretch_angle(float auv[2][2],
- const float av[2][3],
- UVStretchAngle *r_stretch)
+static void edituv_get_edituv_stretch_angle(float auv[2][2],
+ const float av[2][3],
+ UVStretchAngle *r_stretch)
{
/* Send UV's to the shader and let it compute the aspect corrected angle. */
r_stretch->uv_angles[0] = v2_to_short_angle(auv[0]);
@@ -4019,9 +4019,9 @@ static void edituv_get_stretch_angle(float auv[2][2],
#endif
}
-static void *extract_stretch_angle_init(const MeshRenderData *mr,
- struct MeshBatchCache *UNUSED(cache),
- void *buf)
+static void *extract_edituv_stretch_angle_init(const MeshRenderData *mr,
+ struct MeshBatchCache *UNUSED(cache),
+ void *buf)
{
static GPUVertFormat format = {0};
if (format.attr_len == 0) {
@@ -4048,9 +4048,9 @@ static void *extract_stretch_angle_init(const MeshRenderData *mr,
return data;
}
-static void extract_stretch_angle_iter_poly_bm(const MeshRenderData *mr,
- const ExtractPolyBMesh_Params *params,
- void *_data)
+static void extract_edituv_stretch_angle_iter_poly_bm(const MeshRenderData *mr,
+ const ExtractPolyBMesh_Params *params,
+ void *_data)
{
MeshExtract_StretchAngle_Data *data = _data;
float(*auv)[2] = data->auv, *last_auv = data->last_auv;
@@ -4090,14 +4090,14 @@ static void extract_stretch_angle_iter_poly_bm(const MeshRenderData *mr,
compute_normalize_edge_vectors(
auv, av, luv->uv, luv_next->uv, bm_vert_co_get(mr, l->v), bm_vert_co_get(mr, l_next->v));
}
- edituv_get_stretch_angle(auv, av, &data->vbo_data[l_index]);
+ edituv_get_edituv_stretch_angle(auv, av, &data->vbo_data[l_index]);
}
EXTRACT_POLY_AND_LOOP_FOREACH_BM_END(l);
}
-static void extract_stretch_angle_iter_poly_mesh(const MeshRenderData *mr,
- const ExtractPolyMesh_Params *params,
- void *_data)
+static void extract_edituv_stretch_angle_iter_poly_mesh(const MeshRenderData *mr,
+ const ExtractPolyMesh_Params *params,
+ void *_data)
{
MeshExtract_StretchAngle_Data *data = _data;
@@ -4134,24 +4134,24 @@ static void extract_stretch_angle_iter_poly_mesh(const MeshRenderData *mr,
compute_normalize_edge_vectors(
auv, av, data->luv[ml_index].uv, data->luv[l_next].uv, v->co, v_next->co);
}
- edituv_get_stretch_angle(auv, av, &data->vbo_data[ml_index]);
+ edituv_get_edituv_stretch_angle(auv, av, &data->vbo_data[ml_index]);
}
EXTRACT_POLY_AND_LOOP_FOREACH_MESH_END;
}
-static void extract_stretch_angle_finish(const MeshRenderData *UNUSED(mr),
- struct MeshBatchCache *UNUSED(cache),
- void *UNUSED(buf),
- void *data)
+static void extract_edituv_stretch_angle_finish(const MeshRenderData *UNUSED(mr),
+ struct MeshBatchCache *UNUSED(cache),
+ void *UNUSED(buf),
+ void *data)
{
MEM_freeN(data);
}
-static const MeshExtract extract_stretch_angle = {
- .init = extract_stretch_angle_init,
- .iter_poly_bm = extract_stretch_angle_iter_poly_bm,
- .iter_poly_mesh = extract_stretch_angle_iter_poly_mesh,
- .finish = extract_stretch_angle_finish,
+static const MeshExtract extract_edituv_stretch_angle = {
+ .init = extract_edituv_stretch_angle_init,
+ .iter_poly_bm = extract_edituv_stretch_angle_iter_poly_bm,
+ .iter_poly_mesh = extract_edituv_stretch_angle_iter_poly_mesh,
+ .finish = extract_edituv_stretch_angle_finish,
.data_flag = 0,
.use_threading = false,
};
@@ -5222,7 +5222,7 @@ static void *extract_skin_roots_init(const MeshRenderData *mr,
}
}
- /* It's really unlikely that all verts will be roots. Resize to avoid loosing VRAM. */
+ /* It's really unlikely that all verts will be roots. Resize to avoid losing VRAM. */
GPU_vertbuf_data_len_set(vbo, root_len);
return NULL;
@@ -5976,8 +5976,8 @@ void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph,
TEST_ASSIGN(VBO, vbo, weights);
TEST_ASSIGN(VBO, vbo, edit_data);
TEST_ASSIGN(VBO, vbo, edituv_data);
- TEST_ASSIGN(VBO, vbo, stretch_area);
- TEST_ASSIGN(VBO, vbo, stretch_angle);
+ TEST_ASSIGN(VBO, vbo, edituv_stretch_area);
+ TEST_ASSIGN(VBO, vbo, edituv_stretch_angle);
TEST_ASSIGN(VBO, vbo, mesh_analysis);
TEST_ASSIGN(VBO, vbo, fdots_pos);
TEST_ASSIGN(VBO, vbo, fdots_nor);
@@ -6070,8 +6070,8 @@ void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph,
EXTRACT(vbo, weights);
EXTRACT(vbo, edit_data);
EXTRACT(vbo, edituv_data);
- EXTRACT(vbo, stretch_area);
- EXTRACT(vbo, stretch_angle);
+ EXTRACT(vbo, edituv_stretch_area);
+ EXTRACT(vbo, edituv_stretch_angle);
EXTRACT(vbo, mesh_analysis);
EXTRACT(vbo, fdots_pos);
EXTRACT(vbo, fdots_nor);
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c
index 3ccada23d47..e9558fb320c 100644
--- a/source/blender/draw/intern/draw_cache_impl_curve.c
+++ b/source/blender/draw/intern/draw_cache_impl_curve.c
@@ -50,9 +50,9 @@
/* See: edit_curve_point_vert.glsl for duplicate includes. */
#define SELECT 1
-#define ACTIVE_NURB 1 << 2
-#define BEZIER_HANDLE 1 << 3
-#define EVEN_U_BIT 1 << 4 /* Alternate this bit for every U vert. */
+#define ACTIVE_NURB (1 << 2)
+#define BEZIER_HANDLE (1 << 3)
+#define EVEN_U_BIT (1 << 4) /* Alternate this bit for every U vert. */
#define COLOR_SHIFT 5
/* Used as values of `color_id` in `edit_curve_overlay_handle_geom.glsl` */
diff --git a/source/blender/draw/intern/draw_cache_impl_displist.c b/source/blender/draw/intern/draw_cache_impl_displist.c
index 72f3e7b0fa8..d606f70db9e 100644
--- a/source/blender/draw/intern/draw_cache_impl_displist.c
+++ b/source/blender/draw/intern/draw_cache_impl_displist.c
@@ -774,7 +774,7 @@ void DRW_displist_vertbuf_create_loop_pos_and_nor_and_uv_and_tan(ListBase *lb,
}
}
-/* Edge detection/adjecency */
+/* Edge detection/adjacency. */
#define NO_EDGE INT_MAX
static void set_edge_adjacency_lines_indices(
EdgeHash *eh, GPUIndexBufBuilder *elb, bool *r_is_manifold, uint v1, uint v2, uint v3)
diff --git a/source/blender/draw/intern/draw_cache_impl_gpencil.c b/source/blender/draw/intern/draw_cache_impl_gpencil.c
index e1523db36c7..c07271a0d33 100644
--- a/source/blender/draw/intern/draw_cache_impl_gpencil.c
+++ b/source/blender/draw/intern/draw_cache_impl_gpencil.c
@@ -44,7 +44,7 @@
#include "draw_cache.h"
#include "draw_cache_impl.h"
-#define BEZIER_HANDLE 1 << 3
+#define BEZIER_HANDLE (1 << 3)
#define COLOR_SHIFT 5
/* ---------------------------------------------------------------------- */
@@ -800,20 +800,20 @@ static void gpencil_edit_curve_stroke_iter_cb(bGPDlayer *gpl,
};
/* First segment. */
- copy_v3_v3(vert_ptr->pos, bezt->vec[0]);
+ mul_v3_m4v3(vert_ptr->pos, gpl->layer_mat, bezt->vec[0]);
vert_ptr->data = vflag[0];
vert_ptr++;
- copy_v3_v3(vert_ptr->pos, bezt->vec[1]);
+ mul_v3_m4v3(vert_ptr->pos, gpl->layer_mat, bezt->vec[1]);
vert_ptr->data = vflag[1];
vert_ptr++;
/* Second segment. */
- copy_v3_v3(vert_ptr->pos, bezt->vec[1]);
+ mul_v3_m4v3(vert_ptr->pos, gpl->layer_mat, bezt->vec[1]);
vert_ptr->data = vflag[1];
vert_ptr++;
- copy_v3_v3(vert_ptr->pos, bezt->vec[2]);
+ mul_v3_m4v3(vert_ptr->pos, gpl->layer_mat, bezt->vec[2]);
vert_ptr->data = vflag[2];
vert_ptr++;
}
diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c b/source/blender/draw/intern/draw_cache_impl_hair.c
index 327a92a997e..fd28ac00186 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -318,7 +318,7 @@ bool hair_ensure_procedural_data(Object *object,
HairBatchCache *cache = hair_batch_cache_get(hair);
*r_hair_cache = &cache->hair;
- const int steps = 2; /* TODO: don't hardcode? */
+ const int steps = 2; /* TODO: don't hard-code? */
(*r_hair_cache)->final[subdiv].strands_res = 1 << (steps + subdiv);
/* Refreshed on combing and simulation. */
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 3f014a01680..04bfb667d24 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -405,7 +405,7 @@ static void drw_mesh_weight_state_extract(Object *ob,
&wstate->defgroup_sel_count);
}
}
- /* With only one selected bone Multipaint reverts to regular mode. */
+ /* With only one selected bone Multi-paint reverts to regular mode. */
else {
wstate->defgroup_sel_count = 0;
MEM_SAFE_FREE(wstate->defgroup_sel);
@@ -570,8 +570,8 @@ static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache *cache)
static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache)
{
FOREACH_MESH_BUFFER_CACHE (cache, mbufcache) {
- GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.stretch_angle);
- GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.stretch_area);
+ GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_stretch_angle);
+ GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_stretch_area);
GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.uv);
GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_data);
GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.fdots_uv);
@@ -1497,13 +1497,13 @@ void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph,
DRW_ibo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->ibo.edituv_tris);
DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.uv);
DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.edituv_data);
- DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.stretch_area);
+ DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.edituv_stretch_area);
}
if (DRW_batch_requested(cache->batch.edituv_faces_stretch_angle, GPU_PRIM_TRIS)) {
DRW_ibo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->ibo.edituv_tris);
DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.uv);
DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.edituv_data);
- DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.stretch_angle);
+ DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.edituv_stretch_angle);
}
if (DRW_batch_requested(cache->batch.edituv_edges, GPU_PRIM_LINES)) {
DRW_ibo_request(cache->batch.edituv_edges, &mbufcache->ibo.edituv_lines);
@@ -1522,8 +1522,7 @@ void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph,
}
/* Meh loose Scene const correctness here. */
- const bool use_subsurf_fdots = scene ? BKE_modifiers_uses_subsurf_facedots((Scene *)scene, ob) :
- false;
+ const bool use_subsurf_fdots = scene ? BKE_modifiers_uses_subsurf_facedots(scene, ob) : false;
if (do_uvcage) {
mesh_buffer_cache_create_requested(task_graph,
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index 5029e71cac8..132b5274517 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -161,14 +161,14 @@ void DRW_globals_update(void)
/* Grid */
UI_GetThemeColorShade4fv(TH_GRID, 10, gb->colorGrid);
- /* emphasise division lines lighter instead of darker, if background is darker than grid */
+ /* Emphasize division lines lighter instead of darker, if background is darker than grid. */
UI_GetThemeColorShade4fv(
TH_GRID,
(gb->colorGrid[0] + gb->colorGrid[1] + gb->colorGrid[2] + 0.12f >
gb->colorBackground[0] + gb->colorBackground[1] + gb->colorBackground[2]) ?
20 :
-10,
- gb->colorGridEmphasise);
+ gb->colorGridEmphasis);
/* Grid Axis */
UI_GetThemeColorBlendShade4fv(TH_GRID, TH_AXIS_X, 0.5f, -10, gb->colorGridAxisX);
UI_GetThemeColorBlendShade4fv(TH_GRID, TH_AXIS_Y, 0.5f, -10, gb->colorGridAxisY);
@@ -333,7 +333,7 @@ int DRW_object_wire_theme_get(Object *ob, ViewLayer *view_layer, float **r_color
theme_id = TH_EMPTY;
break;
case OB_LIGHTPROBE:
- /* TODO add lightprobe color */
+ /* TODO: add light-probe color. */
theme_id = TH_EMPTY;
break;
default:
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index a059ac32311..6e3a73a8314 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -131,7 +131,7 @@ typedef struct GlobalsUboStorage {
float colorCurrentFrame[4];
float colorGrid[4];
- float colorGridEmphasise[4];
+ float colorGridEmphasis[4];
float colorGridAxisX[4];
float colorGridAxisY[4];
float colorGridAxisZ[4];
diff --git a/source/blender/draw/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c
index 86f1b0e0ebb..bca227a24e2 100644
--- a/source/blender/draw/intern/draw_hair.c
+++ b/source/blender/draw/intern/draw_hair.c
@@ -320,7 +320,7 @@ void DRW_hair_update(void)
max_size = max_ii(max_size, pr_call->vert_len);
}
- /* Create target Texture / Framebuffer */
+ /* Create target Texture / Frame-buffer */
/* Don't use max size as it can be really heavy and fail.
* Do chunks of maximum 2048 * 2048 hair points. */
int width = 2048;
diff --git a/source/blender/draw/intern/draw_hair_private.h b/source/blender/draw/intern/draw_hair_private.h
index 33abae156cc..28bd5d4dfb5 100644
--- a/source/blender/draw/intern/draw_hair_private.h
+++ b/source/blender/draw/intern/draw_hair_private.h
@@ -24,7 +24,7 @@
#pragma once
#define MAX_LAYER_NAME_CT 4 /* u0123456789, u, au, a0123456789 */
-#define MAX_LAYER_NAME_LEN GPU_MAX_SAFE_ATTR_NAME + 2
+#define MAX_LAYER_NAME_LEN (GPU_MAX_SAFE_ATTR_NAME + 2)
#define MAX_THICKRES 2 /* see eHairType */
#define MAX_HAIR_SUBDIV 4 /* see hair_subdiv rna */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index bc41eab9e22..244b0133e64 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -154,6 +154,7 @@ static bool drw_draw_show_annotation(void)
/* -------------------------------------------------------------------- */
/** \name Threading
* \{ */
+
static void drw_task_graph_init(void)
{
BLI_assert(DST.task_graph == NULL);
@@ -172,7 +173,8 @@ static void drw_task_graph_deinit(void)
BLI_task_graph_free(DST.task_graph);
DST.task_graph = NULL;
}
-/* \} */
+
+/** \} */
/* -------------------------------------------------------------------- */
/** \name Settings
@@ -1570,13 +1572,13 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
drw_engines_enable(view_layer, engine_type, gpencil_engine_needed);
drw_engines_data_validate();
- /* Update ubos */
+ /* Update UBO's */
DRW_globals_update();
drw_debug_init();
DRW_hair_init();
- /* No framebuffer allowed before drawing. */
+ /* No frame-buffer allowed before drawing. */
BLI_assert(GPU_framebuffer_active_get() == GPU_framebuffer_back_get());
/* Init engines */
@@ -1642,7 +1644,7 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
DRW_draw_callbacks_post_scene();
if (WM_draw_region_get_bound_viewport(region)) {
- /* Don't unbind the framebuffer yet in this case and let
+ /* Don't unbind the frame-buffer yet in this case and let
* GPU_viewport_unbind do it, so that we can still do further
* drawing of action zones on top. */
}
@@ -1706,7 +1708,7 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph,
if (draw_background) {
/* HACK(fclem): In this case we need to make sure the final alpha is 1.
* We use the blend mode to ensure that. A better way to fix that would
- * be to do that in the colormanagmeent shader. */
+ * be to do that in the color-management shader. */
GPU_offscreen_bind(ofs, false);
GPU_clear_color(0.0f, 0.0f, 0.0f, 1.0f);
/* Premult Alpha over black background. */
@@ -2088,12 +2090,12 @@ void DRW_draw_render_loop_2d_ex(struct Depsgraph *depsgraph,
drw_engines_enable_editors();
drw_engines_data_validate();
- /* Update ubos */
+ /* Update UBO's */
DRW_globals_update();
drw_debug_init();
- /* No framebuffer allowed before drawing. */
+ /* No frame-buffer allowed before drawing. */
BLI_assert(GPU_framebuffer_active_get() == GPU_framebuffer_back_get());
GPU_framebuffer_bind(DST.default_framebuffer);
GPU_framebuffer_clear_depth_stencil(DST.default_framebuffer, 1.0f, 0xFF);
@@ -2191,7 +2193,7 @@ void DRW_draw_render_loop_2d_ex(struct Depsgraph *depsgraph,
GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
if (WM_draw_region_get_bound_viewport(region)) {
- /* Don't unbind the framebuffer yet in this case and let
+ /* Don't unbind the frame-buffer yet in this case and let
* GPU_viewport_unbind do it, so that we can still do further
* drawing of action zones on top. */
}
@@ -2373,7 +2375,7 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph,
drw_context_state_init();
drw_viewport_var_init();
- /* Update ubos */
+ /* Update UBO's */
DRW_globals_update();
/* Init engines */
@@ -2445,7 +2447,7 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph,
DRW_render_instance_buffer_finish();
}
- /* Setup framebuffer */
+ /* Setup frame-buffer. */
draw_select_framebuffer_depth_only_setup(viewport_size);
GPU_framebuffer_bind(g_select_buffer.framebuffer_depth_only);
GPU_framebuffer_clear_depth(g_select_buffer.framebuffer_depth_only, 1.0f);
@@ -2489,11 +2491,11 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph,
/**
* object mode select-loop, see: ED_view3d_draw_depth_loop (legacy drawing).
*/
-static void drw_draw_depth_loop_imp(struct Depsgraph *depsgraph,
- ARegion *region,
- View3D *v3d,
- GPUViewport *viewport,
- const bool use_opengl_context)
+static void drw_draw_depth_loop_impl(struct Depsgraph *depsgraph,
+ ARegion *region,
+ View3D *v3d,
+ GPUViewport *viewport,
+ const bool use_opengl_context)
{
Scene *scene = DEG_get_evaluated_scene(depsgraph);
RenderEngineType *engine_type = ED_view3d_engine_type(scene, v3d->shading.type);
@@ -2521,7 +2523,7 @@ static void drw_draw_depth_loop_imp(struct Depsgraph *depsgraph,
drw_task_graph_init();
drw_engines_data_validate();
- /* Setup framebuffer */
+ /* Setup frame-buffer. */
DefaultFramebufferList *fbl = (DefaultFramebufferList *)GPU_viewport_framebuffer_list_get(
DST.viewport);
GPU_framebuffer_bind(fbl->depth_only_fb);
@@ -2531,7 +2533,7 @@ static void drw_draw_depth_loop_imp(struct Depsgraph *depsgraph,
drw_context_state_init();
drw_viewport_var_init();
- /* Update ubos */
+ /* Update UBO's */
DRW_globals_update();
/* Init engines */
@@ -2587,7 +2589,7 @@ static void drw_draw_depth_loop_imp(struct Depsgraph *depsgraph,
drw_state_ensure_not_reused(&DST);
#endif
- /* Changin context */
+ /* Changing context. */
if (use_opengl_context) {
DRW_opengl_context_disable();
}
@@ -2616,7 +2618,7 @@ void DRW_draw_depth_loop(struct Depsgraph *depsgraph,
}
}
- drw_draw_depth_loop_imp(depsgraph, region, v3d, viewport, use_opengl_context);
+ drw_draw_depth_loop_impl(depsgraph, region, v3d, viewport, use_opengl_context);
}
/**
@@ -2632,7 +2634,7 @@ void DRW_draw_depth_loop_gpencil(struct Depsgraph *depsgraph,
use_drw_engine(&draw_engine_gpencil_type);
- drw_draw_depth_loop_imp(depsgraph, region, v3d, viewport, true);
+ drw_draw_depth_loop_impl(depsgraph, region, v3d, viewport, true);
}
void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, const rcti *rect)
@@ -2671,7 +2673,7 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons
DST.viewport = viewport;
drw_viewport_var_init();
- /* Update ubos */
+ /* Update UBO's */
DRW_globals_update();
/* Init Select Engine */
@@ -2728,7 +2730,7 @@ void DRW_draw_depth_object(
GPU_matrix_set(rv3d->viewmat);
GPU_matrix_mul(object->obmat);
- /* Setup framebuffer */
+ /* Setup frame-buffer. */
DefaultFramebufferList *fbl = GPU_viewport_framebuffer_list_get(viewport);
GPU_framebuffer_bind(fbl->depth_only_fb);
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 3ab60bc3c96..f540ff09032 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -266,14 +266,14 @@ typedef union DRWCommand {
DRWCommandClear clear;
} DRWCommand;
-/* Used for agregating calls into GPUVertBufs. */
+/** Used for aggregating calls into #GPUVertBuf's. */
struct DRWCallBuffer {
GPUVertBuf *buf;
GPUVertBuf *buf_select;
int count;
};
-/* Used by DRWUniform.type */
+/** Used by #DRWUniform.type */
typedef enum {
DRW_UNIFORM_INT = 0,
DRW_UNIFORM_INT_COPY,
@@ -324,8 +324,8 @@ struct DRWUniform {
/* DRW_UNIFORM_BLOCK_OBATTRS */
struct GPUUniformAttrList *uniform_attrs;
};
- int location; /* Uniform location or binding point for textures and ubos. */
- uint8_t type; /* DRWUniformType */
+ int location; /* Uniform location or binding point for textures and UBO's. */
+ uint8_t type; /* #DRWUniformType */
uint8_t length; /* Length of vector types. */
uint8_t arraysize; /* Array size of scalar/vector types. */
};
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 57b3373932e..6bdc5305fed 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -978,7 +978,7 @@ static void drw_sculpt_get_frustum_planes(Object *ob, float planes[6][4])
static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd)
{
- /* PBVH should always exist for non-empty meshes, created by depsgrah eval. */
+ /* PBVH should always exist for non-empty meshes, created by depsgraph eval. */
PBVH *pbvh = (scd->ob->sculpt) ? scd->ob->sculpt->pbvh : NULL;
if (!pbvh) {
return;
@@ -1601,10 +1601,10 @@ static void draw_frustum_bound_sphere_calc(const BoundBox *bbox,
/* Detect which of the corner of the far clipping plane is the farthest to the origin */
float nfar[4]; /* most extreme far point in NDC space */
- float farxy[2]; /* farpoint projection onto the near plane */
+ float farxy[2]; /* far-point projection onto the near plane */
float farpoint[3] = {0.0f}; /* most extreme far point in camera coordinate */
float nearpoint[3]; /* most extreme near point in camera coordinate */
- float farcenter[3] = {0.0f}; /* center of far cliping plane in camera coordinate */
+ float farcenter[3] = {0.0f}; /* center of far clipping plane in camera coordinate */
float F = -1.0f, N; /* square distance of far and near point to origin */
float f, n; /* distance of far and near point to z axis. f is always > 0 but n can be < 0 */
float e, s; /* far and near clipping distance (<0) */
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 5f7aa28c3c9..4c8fcb0e016 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -272,7 +272,7 @@ static void drw_stencil_state_set(uint write_mask, uint reference, uint compare_
GPU_stencil_compare_mask_set(compare_mask);
}
-/* Reset state to not interfer with other UI drawcall */
+/* Reset state to not interfere with other UI draw-call. */
void DRW_state_reset_ex(DRWState state)
{
DST.state = ~state;
@@ -344,7 +344,7 @@ void DRW_state_reset(void)
/* Should stay constant during the whole rendering. */
GPU_point_size(5);
GPU_line_smooth(false);
- /* Bypass U.pixelsize factor by using a factor of 0.0f. Will be clamped to 1.0f. */
+ /* Bypass #U.pixelsize factor by using a factor of 0.0f. Will be clamped to 1.0f. */
GPU_line_width(0.0f);
}
@@ -855,7 +855,7 @@ static void draw_call_batching_do(DRWShadingGroup *shgroup,
DRWCommandsState *state,
DRWCommandDraw *call)
{
- /* If any condition requires to interupt the merging. */
+ /* If any condition requires to interrupt the merging. */
bool neg_scale = DRW_handle_negative_scale_get(&call->handle);
int chunk = DRW_handle_chunk_get(&call->handle);
int id = DRW_handle_id_get(&call->handle);
diff --git a/source/blender/draw/intern/draw_manager_texture.c b/source/blender/draw/intern/draw_manager_texture.c
index 8b948e62cf3..73afdd6e1e3 100644
--- a/source/blender/draw/intern/draw_manager_texture.c
+++ b/source/blender/draw/intern/draw_manager_texture.c
@@ -26,7 +26,7 @@
/* Maybe gpu_texture.c is a better place for this. */
static bool drw_texture_format_supports_framebuffer(eGPUTextureFormat format)
{
- /* Some formats do not work with framebuffers. */
+ /* Some formats do not work with frame-buffers. */
switch (format) {
/* Only add formats that are COMPATIBLE with FB.
* Generally they are multiple of 16bit. */
@@ -43,6 +43,7 @@ static bool drw_texture_format_supports_framebuffer(eGPUTextureFormat format)
case GPU_RG16F:
case GPU_RG16I:
case GPU_RG32F:
+ case GPU_RGB10_A2:
case GPU_R11F_G11F_B10F:
case GPU_RGBA8:
case GPU_RGBA16:
diff --git a/source/blender/draw/intern/draw_select_buffer.c b/source/blender/draw/intern/draw_select_buffer.c
index ee5561e1e38..b5151293c1b 100644
--- a/source/blender/draw/intern/draw_select_buffer.c
+++ b/source/blender/draw/intern/draw_select_buffer.c
@@ -91,7 +91,7 @@ uint *DRW_select_buffer_read(struct Depsgraph *depsgraph,
BLI_rcti_size_y(&rect_clamp),
1,
0,
- GPU_DATA_UNSIGNED_INT,
+ GPU_DATA_UINT,
r_buf);
if (!BLI_rcti_compare(rect, &rect_clamp)) {
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c
index 8ba3ee097df..2fb44d0030b 100644
--- a/source/blender/draw/intern/draw_view.c
+++ b/source/blender/draw/intern/draw_view.c
@@ -256,7 +256,7 @@ void DRW_draw_cursor_2d(void)
GPU_matrix_projection_set(original_proj);
}
}
-/* \} */
+/** \} */
/* **************************** 3D Gizmo ******************************** */
diff --git a/source/blender/draw/intern/shaders/common_fxaa_lib.glsl b/source/blender/draw/intern/shaders/common_fxaa_lib.glsl
index a87b4558227..0ecfc397e95 100644
--- a/source/blender/draw/intern/shaders/common_fxaa_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_fxaa_lib.glsl
@@ -1,7 +1,7 @@
/* ---------------------------------------------------------------------------------
* File: es3-kepler\FXAA/FXAA3_11.h
* SDK Version: v3.00
- * Email: gameworks@nvidia.com
+ * Email: <gameworks@nvidia.com>
* Site: http://developer.nvidia.com/
*
* Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
diff --git a/source/blender/draw/intern/shaders/common_globals_lib.glsl b/source/blender/draw/intern/shaders/common_globals_lib.glsl
index 91fb822edac..3c76c8a5b28 100644
--- a/source/blender/draw/intern/shaders/common_globals_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_globals_lib.glsl
@@ -95,7 +95,7 @@ layout(std140) uniform globalsBlock
vec4 colorCurrentFrame;
vec4 colorGrid;
- vec4 colorGridEmphasise;
+ vec4 colorGridEmphasis;
vec4 colorGridAxisX;
vec4 colorGridAxisY;
vec4 colorGridAxisZ;
diff --git a/source/blender/draw/intern/shaders/common_math_lib.glsl b/source/blender/draw/intern/shaders/common_math_lib.glsl
index a82e0b5a5e9..d02fd27f35f 100644
--- a/source/blender/draw/intern/shaders/common_math_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_math_lib.glsl
@@ -3,12 +3,14 @@
/** \name Common Math Utilities
* \{ */
-#define M_PI 3.14159265358979323846 /* pi */
-#define M_2PI 6.28318530717958647692 /* 2*pi */
-#define M_PI_2 1.57079632679489661923 /* pi/2 */
-#define M_1_PI 0.318309886183790671538 /* 1/pi */
-#define M_1_2PI 0.159154943091895335768 /* 1/(2*pi) */
-#define M_1_PI2 0.101321183642337771443 /* 1/(pi^2) */
+#define M_PI 3.14159265358979323846 /* pi */
+#define M_2PI 6.28318530717958647692 /* 2*pi */
+#define M_PI_2 1.57079632679489661923 /* pi/2 */
+#define M_1_PI 0.318309886183790671538 /* 1/pi */
+#define M_1_2PI 0.159154943091895335768 /* 1/(2*pi) */
+#define M_1_PI2 0.101321183642337771443 /* 1/(pi^2) */
+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
+#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
#define FLT_MAX 3.402823e+38
vec3 mul(mat3 m, vec3 v)
@@ -33,6 +35,13 @@ vec3 project_point(mat4 m, vec3 v)
return tmp.xyz / tmp.w;
}
+mat2 rot2_from_angle(float a)
+{
+ float c = cos(a);
+ float s = sin(a);
+ return mat2(c, -s, s, c);
+}
+
#define min3(a, b, c) min(a, min(b, c))
#define min4(a, b, c, d) min(a, min3(b, c, d))
#define min5(a, b, c, d, e) min(a, min4(b, c, d, e))
@@ -72,6 +81,22 @@ float sum(vec4 v) { return dot(vec4(1.0), v); }
float avg(vec2 v) { return dot(vec2(1.0 / 2.0), v); }
float avg(vec3 v) { return dot(vec3(1.0 / 3.0), v); }
float avg(vec4 v) { return dot(vec4(1.0 / 4.0), v); }
+
+float safe_rcp(float a) { return (a != 0.0) ? (1.0 / a) : 0.0; }
+vec2 safe_rcp(vec2 a) { return mix(vec2(0.0), (1.0 / a), notEqual(a, vec2(0.0))); }
+vec4 safe_rcp(vec4 a) { return mix(vec4(0.0), (1.0 / a), notEqual(a, vec4(0.0))); }
+
+float sqr(float a) { return a * a; }
+vec2 sqr(vec2 a) { return a * a; }
+vec3 sqr(vec3 a) { return a * a; }
+vec4 sqr(vec4 a) { return a * a; }
+
+float len_squared(vec3 a) { return dot(a, a); }
+float len_squared(vec2 a) { return dot(a, a); }
+
+#define weighted_sum(val0, val1, val2, val3, weights) ((val0 * weights[0] + val1 * weights[1] + val2 * weights[2] + val3 * weights[3]) * safe_rcp(sum(weights)));
+#define weighted_sum_array(val, weights) ((val[0] * weights[0] + val[1] * weights[1] + val[2] * weights[2] + val[3] * weights[3]) * safe_rcp(sum(weights)));
+
/* clang-format on */
#define saturate(a) clamp(a, 0.0, 1.0)
@@ -88,9 +113,19 @@ float distance_squared(vec3 a, vec3 b)
return dot(a, a);
}
-float len_squared(vec3 a)
+vec3 safe_normalize(vec3 v)
{
- return dot(a, a);
+ float len = length(v);
+ if (isnan(len) || len == 0.0) {
+ return vec3(1.0, 0.0, 0.0);
+ }
+ return v / len;
+}
+
+vec3 normalize_len(vec3 v, out float len)
+{
+ len = length(v);
+ return v / len;
}
/** \} */
@@ -128,3 +163,14 @@ vec2 fast_acos(vec2 v)
}
/** \} */
+
+/*
+ * For debugging purpose mainly.
+ * From https://www.shadertoy.com/view/4dsSzr
+ * By Morgan McGuire @morgan3d, http://graphicscodex.com
+ * Reuse permitted under the BSD license.
+ */
+vec3 neon_gradient(float t)
+{
+ return clamp(vec3(t * 1.3 + 0.1, sqr(abs(0.43 - t) * 1.7), (1.0 - t) * 1.7), 0.0, 1.0);
+}
diff --git a/source/blender/draw/intern/shaders/common_smaa_lib.glsl b/source/blender/draw/intern/shaders/common_smaa_lib.glsl
index 78a62c6ae7d..36ffb4d8b32 100644
--- a/source/blender/draw/intern/shaders/common_smaa_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_smaa_lib.glsl
@@ -118,7 +118,7 @@
* half-rate linear filtering on GCN.
*
* If SMAA is applied to 64-bit color buffers, switching to point filtering
- * when accesing them will increase the performance. Search for
+ * when accessing them will increase the performance. Search for
* 'SMAASamplePoint' to see which textures may benefit from point
* filtering, and where (which is basically the color input in the edge
* detection and resolve passes).
diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl
index 0f2782fc2b2..4012de4f95b 100644
--- a/source/blender/draw/intern/shaders/common_view_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_view_lib.glsl
@@ -27,10 +27,8 @@ layout(std140) uniform viewBlock
#define cameraForward ViewMatrixInverse[2].xyz
#define cameraPos ViewMatrixInverse[3].xyz
-#define cameraVec \
- ((ProjectionMatrix[3][3] == 0.0) ? normalize(cameraPos - worldPosition) : cameraForward)
-#define viewCameraVec \
- ((ProjectionMatrix[3][3] == 0.0) ? normalize(-viewPosition) : vec3(0.0, 0.0, 1.0))
+#define cameraVec(P) ((ProjectionMatrix[3][3] == 0.0) ? normalize(cameraPos - P) : cameraForward)
+#define viewCameraVec(vP) ((ProjectionMatrix[3][3] == 0.0) ? normalize(-vP) : vec3(0.0, 0.0, 1.0))
#ifdef world_clip_planes_calc_clip_distance
# undef world_clip_planes_calc_clip_distance
diff --git a/source/blender/draw/tests/shaders_test.cc b/source/blender/draw/tests/shaders_test.cc
index 2c8b3d85a0a..8ab626ed7ba 100644
--- a/source/blender/draw/tests/shaders_test.cc
+++ b/source/blender/draw/tests/shaders_test.cc
@@ -299,12 +299,29 @@ TEST_F(DrawTest, eevee_glsl_shaders_static)
EXPECT_NE(EEVEE_shaders_bloom_upsample_get(true), nullptr);
EXPECT_NE(EEVEE_shaders_bloom_resolve_get(false), nullptr);
EXPECT_NE(EEVEE_shaders_bloom_resolve_get(true), nullptr);
- EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(false), nullptr);
- EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(true), nullptr);
- EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false), nullptr);
- EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true), nullptr);
- EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false), nullptr);
- EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_bokeh_get(), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_setup_get(), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_flatten_tiles_get(), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_dilate_tiles_get(false), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_dilate_tiles_get(true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_reduce_get(true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_reduce_get(false), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, false), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, false), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, false), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_filter_get(), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false, false), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false, true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true, false), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true, true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false, true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false, false), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true, true), nullptr);
+ EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true, false), nullptr);
EXPECT_NE(EEVEE_shaders_effect_downsample_sh_get(), nullptr);
EXPECT_NE(EEVEE_shaders_effect_downsample_cube_sh_get(), nullptr);
EXPECT_NE(EEVEE_shaders_effect_minz_downlevel_sh_get(), nullptr);
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
index 05cbb3ef48f..2bfa417eb78 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -133,7 +133,16 @@ static void acf_generic_root_backdrop(bAnimContext *ac,
UI_draw_roundbox_corner_set((expanded) ? UI_CNR_TOP_LEFT :
(UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT));
UI_draw_roundbox_3fv_alpha(
- true, offset, yminc, v2d->cur.xmax + EXTRA_SCROLL_PAD, ymaxc, 8, color, 1.0f);
+ &(const rctf){
+ .xmin = offset,
+ .xmax = v2d->cur.xmax + EXTRA_SCROLL_PAD,
+ .ymin = yminc,
+ .ymax = ymaxc,
+ },
+ true,
+ 8,
+ color,
+ 1.0f);
}
/* get backdrop color for data expanders under top-level Scene/Object */
@@ -421,7 +430,7 @@ static bool acf_generic_dataexpand_setting_valid(bAnimContext *ac,
case ACHANNEL_SETTING_MUTE:
return ((ac) && (ac->spacetype == SPACE_NLA));
- /* select is ok for most "ds*" channels (e.g. dsmat) */
+ /* Select is ok for most `ds*` channels (e.g. `dsmat`) */
case ACHANNEL_SETTING_SELECT:
return true;
@@ -464,7 +473,16 @@ static void acf_summary_backdrop(bAnimContext *ac, bAnimListElem *ale, float ymi
*/
UI_draw_roundbox_corner_set(UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT);
UI_draw_roundbox_3fv_alpha(
- true, 0, yminc - 2, v2d->cur.xmax + EXTRA_SCROLL_PAD, ymaxc, 8, color, 1.0f);
+ &(const rctf){
+ .xmin = 0,
+ .xmax = v2d->cur.xmax + EXTRA_SCROLL_PAD,
+ .ymin = yminc - 2,
+ .ymax = ymaxc,
+ },
+ true,
+ 8,
+ color,
+ 1.0f);
}
/* name for summary entries */
@@ -875,7 +893,16 @@ static void acf_group_backdrop(bAnimContext *ac, bAnimListElem *ale, float yminc
/* rounded corners on LHS only - top only when expanded, but bottom too when collapsed */
UI_draw_roundbox_corner_set(expanded ? UI_CNR_TOP_LEFT : (UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT));
UI_draw_roundbox_3fv_alpha(
- true, offset, yminc, v2d->cur.xmax + EXTRA_SCROLL_PAD, ymaxc, 8, color, 1.0f);
+ &(const rctf){
+ .xmin = offset,
+ .xmax = v2d->cur.xmax + EXTRA_SCROLL_PAD,
+ .ymin = yminc,
+ .ymax = ymaxc,
+ },
+ true,
+ 8,
+ color,
+ 1.0f);
}
/* name for group entries */
@@ -1149,7 +1176,16 @@ static void acf_nla_controls_backdrop(bAnimContext *ac,
/* rounded corners on LHS only - top only when expanded, but bottom too when collapsed */
UI_draw_roundbox_corner_set(expanded ? UI_CNR_TOP_LEFT : (UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT));
UI_draw_roundbox_3fv_alpha(
- true, offset, yminc, v2d->cur.xmax + EXTRA_SCROLL_PAD, ymaxc, 5, color, 1.0f);
+ &(const rctf){
+ .xmin = offset,
+ .xmax = v2d->cur.xmax + EXTRA_SCROLL_PAD,
+ .ymin = yminc,
+ .ymax = ymaxc,
+ },
+ true,
+ 5,
+ color,
+ 1.0f);
}
/* name for nla controls expander entries */
@@ -3936,13 +3972,16 @@ static void acf_nlaaction_backdrop(bAnimContext *ac, bAnimListElem *ale, float y
/* draw slightly shifted up vertically to look like it has more separation from other channels,
* but we then need to slightly shorten it so that it doesn't look like it overlaps
*/
- UI_draw_roundbox_4fv(true,
- offset,
- yminc + NLACHANNEL_SKIP,
- (float)v2d->cur.xmax,
- ymaxc + NLACHANNEL_SKIP - 1,
- 8,
- color);
+ UI_draw_roundbox_4fv(
+ &(const rctf){
+ .xmin = offset,
+ .xmax = (float)v2d->cur.xmax,
+ .ymin = yminc + NLACHANNEL_SKIP,
+ .ymax = ymaxc + NLACHANNEL_SKIP - 1,
+ },
+ true,
+ 8,
+ color);
}
/* name for nla action entries */
@@ -4122,7 +4161,7 @@ static void ANIM_init_channel_typeinfo_data(void)
/* Get type info from given channel type */
const bAnimChannelType *ANIM_channel_get_typeinfo(bAnimListElem *ale)
{
- /* santiy checks */
+ /* Sanity checks. */
if (ale == NULL) {
return NULL;
}
@@ -4710,7 +4749,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi
const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct(depsgraph,
(float)CFRA);
NlaKeyframingContext *nla_context = BKE_animsys_get_nla_keyframing_context(
- &nla_cache, &id_ptr, adt, &anim_eval_context, false);
+ &nla_cache, &id_ptr, adt, &anim_eval_context);
/* get current frame and apply NLA-mapping to it (if applicable) */
cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
@@ -4766,7 +4805,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct(depsgraph,
(float)CFRA);
NlaKeyframingContext *nla_context = BKE_animsys_get_nla_keyframing_context(
- &nla_cache, &id_ptr, key->adt, &anim_eval_context, false);
+ &nla_cache, &id_ptr, key->adt, &anim_eval_context);
/* get current frame and apply NLA-mapping to it (if applicable) */
const float remapped_frame = BKE_nla_tweakedit_remap(
diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c
index a6e96a4d919..109cf79c786 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -393,7 +393,11 @@ static void anim_channels_select_set(bAnimContext *ac,
FCurve *fcu = (FCurve *)ale->data;
ACHANNEL_SET_FLAG(fcu, sel, FCURVE_SELECTED);
- fcu->flag &= ~FCURVE_ACTIVE;
+ if ((fcu->flag & FCURVE_SELECTED) == 0) {
+ /* Only erase the ACTIVE flag when deselecting. This ensures that "select all curves"
+ * retains the currently active curve. */
+ fcu->flag &= ~FCURVE_ACTIVE;
+ }
break;
}
case ANIMTYPE_SHAPEKEY: {
@@ -1197,7 +1201,7 @@ static void rearrange_nla_channels(bAnimContext *ac, AnimData *adt, eRearrangeAn
rearrange_animchannel_islands(
&adt->nla_tracks, rearrange_func, mode, ANIMTYPE_NLATRACK, &anim_data_visible);
- /* Add back non-local NLA tracks at the begining of the animation data's list. */
+ /* Add back non-local NLA tracks at the beginning of the animation data's list. */
if (!BLI_listbase_is_empty(&extracted_nonlocal_nla_tracks)) {
BLI_assert(is_liboverride);
((NlaTrack *)extracted_nonlocal_nla_tracks.last)->next = adt->nla_tracks.first;
@@ -1732,7 +1736,7 @@ static int animchannels_group_exec(bContext *C, wmOperator *op)
/* free temp data */
ANIM_animdata_freelist(&anim_data);
- /* updatss */
+ /* Updates. */
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
}
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index f2022194ed5..a03f19d0111 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -2403,6 +2403,13 @@ static void animfilter_modifier_idpoin_cb(void *afm_ptr,
}
break;
}
+ case ID_NT: {
+ bNodeTree *node_tree = (bNodeTree *)id;
+ if (!(afm->ads->filterflag & ADS_FILTER_NONTREE)) {
+ afm->items += animdata_filter_ds_nodetree(
+ afm->ac, &afm->tmp_data, afm->ads, owner_id, node_tree, afm->filter_mode);
+ }
+ }
/* TODO: images? */
default:
diff --git a/source/blender/editors/animation/anim_motion_paths.c b/source/blender/editors/animation/anim_motion_paths.c
index 088ac9dbcba..aac2465d43a 100644
--- a/source/blender/editors/animation/anim_motion_paths.c
+++ b/source/blender/editors/animation/anim_motion_paths.c
@@ -331,7 +331,7 @@ static void motionpath_calculate_update_range(MPathTarget *mpt,
int fcu_sfra = motionpath_get_prev_prev_keyframe(mpt, &fcu_keys, current_frame);
int fcu_efra = motionpath_get_next_next_keyframe(mpt, &fcu_keys, current_frame);
- /* Extend range furher, since accelleration compensation propagates even further away. */
+ /* Extend range further, since acceleration compensation propagates even further away. */
if (fcu->auto_smoothing != FCURVE_SMOOTH_NONE) {
fcu_sfra = motionpath_get_prev_prev_keyframe(mpt, &fcu_keys, fcu_sfra);
fcu_efra = motionpath_get_next_next_keyframe(mpt, &fcu_keys, fcu_efra);
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index a5514f6517e..72d9bff545a 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -29,12 +29,10 @@
#include "BLI_math_base.h"
#include "BLI_utildefines.h"
-#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -50,10 +48,8 @@
#include "ED_screen.h"
#include "ED_sequencer.h"
#include "ED_time_scrub_ui.h"
-#include "ED_util.h"
#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_query.h"
#include "SEQ_sequencer.h"
#include "SEQ_time.h"
diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c
index b2a9d6ac9b7..43d5efe9ea9 100644
--- a/source/blender/editors/animation/drivers.c
+++ b/source/blender/editors/animation/drivers.c
@@ -33,7 +33,6 @@
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
-#include "DNA_space_types.h"
#include "DNA_texture_types.h"
#include "BKE_anim_data.h"
diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c
index deebf1d1efc..b344e67f62d 100644
--- a/source/blender/editors/animation/fmodifier_ui.c
+++ b/source/blender/editors/animation/fmodifier_ui.c
@@ -32,6 +32,7 @@
#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
#include "MEM_guardedalloc.h"
@@ -42,6 +43,7 @@
#include "BKE_context.h"
#include "BKE_fcurve.h"
+#include "BKE_screen.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -56,47 +58,208 @@
#include "DEG_depsgraph.h"
-/* ********************************************** */
-/* UI STUFF */
+typedef void (*PanelDrawFn)(const bContext *, struct Panel *);
+static void fmodifier_panel_header(const bContext *C, Panel *panel);
-/* XXX! -------------------------------- */
-/* Temporary definition for limits of float number buttons
- * (FLT_MAX tends to infinity with old system). */
-#define UI_FLT_MAX 10000.0f
+/* -------------------------------------------------------------------- */
+/** \name Panel Registering and Panel Callbacks
+ * \{ */
-#define B_REDR 1
-#define B_FMODIFIER_REDRAW 20
+/**
+ * Get the list of FModifiers from the context (either the NLA or graph editor).
+ */
+static ListBase *fmodifier_list_space_specific(const bContext *C)
+{
+ ScrArea *area = CTX_wm_area(C);
+
+ if (area->spacetype == SPACE_GRAPH) {
+ FCurve *fcu = ANIM_graph_context_fcurve(C);
+ return &fcu->modifiers;
+ }
+
+ if (area->spacetype == SPACE_NLA) {
+ NlaStrip *strip = ANIM_nla_context_strip(C);
+ return &strip->modifiers;
+ }
-/* callback to update depsgraph on value changes */
-static void deg_update(bContext *C, void *owner_id, void *UNUSED(var2))
+ /* This should not be called in any other space. */
+ BLI_assert(false);
+ return NULL;
+}
+
+/**
+ * Get a pointer to the panel's FModifier, and also its owner ID if \a r_owner_id is not NULL.
+ * Also in the graph editor, gray out the panel if the FModifier's FCurve has modifiers turned off.
+ */
+static PointerRNA *fmodifier_get_pointers(const bContext *C, const Panel *panel, ID **r_owner_id)
{
- /* send notifiers */
- /* XXX for now, this is the only way to get updates in all the right places...
- * but would be nice to have a special one in this case. */
- WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
- DEG_id_tag_update(owner_id, ID_RECALC_ANIMATION);
+ PointerRNA *ptr = UI_panel_custom_data_get(panel);
+
+ if (r_owner_id != NULL) {
+ *r_owner_id = ptr->owner_id;
+ }
+
+ if (C != NULL && CTX_wm_space_graph(C)) {
+ FCurve *fcu = ANIM_graph_context_fcurve(C);
+ uiLayoutSetActive(panel->layout, !(fcu->flag & FCURVE_MOD_OFF));
+ }
+
+ return ptr;
}
-/* callback to verify modifier data */
-static void validate_fmodifier_cb(bContext *C, void *fcm_v, void *owner_id)
+/**
+ * Move an FModifier to the index it's moved to after a drag and drop.
+ */
+static void fmodifier_reorder(bContext *C, Panel *panel, int new_index)
{
- FModifier *fcm = (FModifier *)fcm_v;
- const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm);
+ ID *owner_id;
+ PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, &owner_id);
+ FModifier *fcm = ptr->data;
+ const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(fcm->type);
+
+ /* Cycles modifier has to be the first, so make sure it's kept that way. */
+ if (fmi->requires & FMI_REQUIRES_ORIGINAL_DATA) {
+ WM_report(RPT_ERROR, "Modifier requires original data");
+ return;
+ }
- /* call the verify callback on the modifier if applicable */
- if (fmi && fmi->verify_data) {
- fmi->verify_data(fcm);
+ ListBase *modifiers = fmodifier_list_space_specific(C);
+
+ /* Again, make sure we don't move a modifier before a cycles modifier. */
+ FModifier *fcm_first = modifiers->first;
+ const FModifierTypeInfo *fmi_first = get_fmodifier_typeinfo(fcm_first->type);
+ if (fmi_first->requires & FMI_REQUIRES_ORIGINAL_DATA && new_index == 0) {
+ WM_report(RPT_ERROR, "Modifier requires original data");
+ return;
}
- if (owner_id) {
- deg_update(C, owner_id, NULL);
+
+ int current_index = BLI_findindex(modifiers, fcm);
+ BLI_assert(current_index >= 0);
+ BLI_assert(new_index >= 0);
+
+ /* Don't do anything if the drag didn't change the index. */
+ if (current_index == new_index) {
+ return;
}
+
+ /* Move the FModifier in the list. */
+ BLI_listbase_link_move(modifiers, fcm, new_index - current_index);
+
+ ED_undo_push(C, "Reorder F-Curve Modifier");
+
+ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
+ DEG_id_tag_update(owner_id, ID_RECALC_ANIMATION);
+}
+
+static short get_fmodifier_expand_flag(const bContext *UNUSED(C), Panel *panel)
+{
+ PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, NULL);
+ FModifier *fcm = (FModifier *)ptr->data;
+
+ return fcm->ui_expand_flag;
+}
+
+static void set_fmodifier_expand_flag(const bContext *UNUSED(C), Panel *panel, short expand_flag)
+{
+ PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, NULL);
+ FModifier *fcm = (FModifier *)ptr->data;
+
+ fcm->ui_expand_flag = expand_flag;
+}
+
+static PanelType *fmodifier_panel_register(ARegionType *region_type,
+ eFModifier_Types type,
+ PanelDrawFn draw,
+ PanelTypePollFn poll,
+ const char *id_prefix)
+{
+ /* Get the name for the modifier's panel. */
+ char panel_idname[BKE_ST_MAXNAME];
+ const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type);
+ BLI_snprintf(panel_idname, BKE_ST_MAXNAME, "%s_PT_%s", id_prefix, fmi->name);
+
+ PanelType *panel_type = MEM_callocN(sizeof(PanelType), panel_idname);
+
+ /* Intentionally leave the label field blank. The header is filled with buttons. */
+ BLI_strncpy(panel_type->idname, panel_idname, BKE_ST_MAXNAME);
+ BLI_strncpy(panel_type->category, "Modifiers", BKE_ST_MAXNAME);
+ BLI_strncpy(panel_type->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA, BKE_ST_MAXNAME);
+
+ panel_type->draw_header = fmodifier_panel_header;
+ panel_type->draw = draw;
+ panel_type->poll = poll;
+
+ /* Give the panel the special flag that says it was built here and corresponds to a
+ * modifier rather than a #PanelType. */
+ panel_type->flag = PANEL_TYPE_HEADER_EXPAND | PANEL_TYPE_DRAW_BOX | PANEL_TYPE_INSTANCED;
+ panel_type->reorder = fmodifier_reorder;
+ panel_type->get_list_data_expand_flag = get_fmodifier_expand_flag;
+ panel_type->set_list_data_expand_flag = set_fmodifier_expand_flag;
+
+ BLI_addtail(&region_type->paneltypes, panel_type);
+
+ return panel_type;
}
+/**
+ * Add a child panel to the parent.
+ *
+ * \note To create the panel type's idname, it appends the \a name argument to the \a parent's
+ * idname.
+ */
+static PanelType *fmodifier_subpanel_register(ARegionType *region_type,
+ const char *name,
+ const char *label,
+ PanelDrawFn draw_header,
+ PanelDrawFn draw,
+ PanelTypePollFn poll,
+ PanelType *parent)
+{
+ /* Create the subpanel's ID name. */
+ char panel_idname[BKE_ST_MAXNAME];
+ BLI_snprintf(panel_idname, BKE_ST_MAXNAME, "%s_%s", parent->idname, name);
+
+ PanelType *panel_type = MEM_callocN(sizeof(PanelType), panel_idname);
+
+ BLI_strncpy(panel_type->idname, panel_idname, BKE_ST_MAXNAME);
+ BLI_strncpy(panel_type->label, label, BKE_ST_MAXNAME);
+ BLI_strncpy(panel_type->category, "Modifiers", BKE_ST_MAXNAME);
+ BLI_strncpy(panel_type->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA, BKE_ST_MAXNAME);
+
+ panel_type->draw_header = draw_header;
+ panel_type->draw = draw;
+ panel_type->poll = poll;
+ panel_type->flag = PANEL_TYPE_DEFAULT_CLOSED | PANEL_TYPE_DRAW_BOX;
+
+ BLI_assert(parent != NULL);
+ BLI_strncpy(panel_type->parent_id, parent->idname, BKE_ST_MAXNAME);
+ panel_type->parent = parent;
+ BLI_addtail(&parent->children, BLI_genericNodeN(panel_type));
+ BLI_addtail(&region_type->paneltypes, panel_type);
+
+ return panel_type;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name General UI Callbacks and Drawing
+ * \{ */
+
+/* XXX! -------------------------------- */
+/* Temporary definition for limits of float number buttons
+ * (FLT_MAX tends to infinity with old system). */
+#define UI_FLT_MAX 10000.0f
+
+#define B_REDR 1
+#define B_FMODIFIER_REDRAW 20
+
/* callback to remove the given modifier */
typedef struct FModifierDeleteContext {
- ID *fcurve_owner_id;
+ ID *owner_id;
ListBase *modifiers;
} FModifierDeleteContext;
+
static void delete_fmodifier_cb(bContext *C, void *ctx_v, void *fcm_v)
{
FModifierDeleteContext *ctx = (FModifierDeleteContext *)ctx_v;
@@ -108,466 +271,334 @@ static void delete_fmodifier_cb(bContext *C, void *ctx_v, void *fcm_v)
ED_undo_push(C, "Delete F-Curve Modifier");
- deg_update(C, ctx->fcurve_owner_id, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
+ DEG_id_tag_update(ctx->owner_id, ID_RECALC_ANIMATION);
}
-/* --------------- */
-/* draw settings for generator modifier */
-static void draw_modifier__generator(uiLayout *layout,
- ID *fcurve_owner_id,
- FModifier *fcm,
- short width)
+static void fmodifier_influence_draw(uiLayout *layout, PointerRNA *ptr)
{
+ FModifier *fcm = (FModifier *)ptr->data;
+ uiItemS(layout);
+
+ uiLayout *row = uiLayoutRowWithHeading(layout, true, IFACE_("Influence"));
+ uiItemR(row, ptr, "use_influence", 0, "", ICON_NONE);
+ uiLayout *sub = uiLayoutRow(row, true);
+
+ uiLayoutSetActive(sub, fcm->flag & FMODIFIER_FLAG_USEINFLUENCE);
+ uiItemR(sub, ptr, "influence", 0, "", ICON_NONE);
+}
+
+static void fmodifier_frame_range_header_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL);
+
+ uiItemR(layout, ptr, "use_restricted_range", 0, NULL, ICON_NONE);
+}
+
+static void fmodifier_frame_range_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL);
+
+ uiLayoutSetPropSep(layout, true);
+
+ FModifier *fcm = (FModifier *)ptr->data;
+ uiLayoutSetActive(layout, fcm->flag & FMODIFIER_FLAG_RANGERESTRICT);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE);
+ uiItemR(col, ptr, "frame_end", 0, IFACE_("End"), ICON_NONE);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, ptr, "blend_in", 0, IFACE_("Blend In"), ICON_NONE);
+ uiItemR(col, ptr, "blend_out", 0, IFACE_("Out"), ICON_NONE);
+}
+
+static void fmodifier_panel_header(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ ID *owner_id;
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id);
+ FModifier *fcm = (FModifier *)ptr->data;
+ const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm);
+
+ uiBlock *block = uiLayoutGetBlock(layout);
+
+ uiLayout *sub = uiLayoutRow(layout, true);
+ uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT);
+ uiLayoutSetEmboss(sub, UI_EMBOSS_NONE);
+
+ /* Checkbox for 'active' status (for now). */
+ uiItemR(sub, ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+
+ /* Name. */
+ if (fmi) {
+ uiItemL(sub, IFACE_(fmi->name), ICON_NONE);
+ }
+ else {
+ uiItemL(sub, IFACE_("<Unknown Modifier>"), ICON_NONE);
+ }
+
+ /* Right align. */
+ sub = uiLayoutRow(layout, true);
+ uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT);
+ uiLayoutSetEmboss(sub, UI_EMBOSS_NONE);
+
+ /* 'Mute' button. */
+ uiItemR(sub, ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+
+ /* Delete button. */
+ uiBut *but = uiDefIconBut(block,
+ UI_BTYPE_BUT,
+ B_REDR,
+ ICON_X,
+ 0,
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
+ NULL,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ TIP_("Delete Modifier"));
+ FModifierDeleteContext *ctx = MEM_mallocN(sizeof(FModifierDeleteContext), __func__);
+ ctx->owner_id = owner_id;
+ ctx->modifiers = fmodifier_list_space_specific(C);
+ BLI_assert(ctx->modifiers != NULL);
+
+ UI_but_funcN_set(but, delete_fmodifier_cb, ctx, fcm);
+
+ uiItemS(layout);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Generator Modifier
+ * \{ */
+
+static void generator_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ ID *owner_id;
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id);
+ FModifier *fcm = (FModifier *)ptr->data;
FMod_Generator *data = (FMod_Generator *)fcm->data;
- uiLayout /* *col, */ /* UNUSED */ *row;
- uiBlock *block;
- uiBut *but;
- PointerRNA ptr;
- short bwidth = width - 1.5 * UI_UNIT_X; /* max button width */
-
- /* init the RNA-pointer */
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr);
-
- /* basic settings (backdrop + mode selector + some padding) */
- /* col = uiLayoutColumn(layout, true); */ /* UNUSED */
- block = uiLayoutGetBlock(layout);
- UI_block_align_begin(block);
- but = uiDefButR(block,
- UI_BTYPE_MENU,
- B_FMODIFIER_REDRAW,
- NULL,
- 0,
- 0,
- bwidth,
- UI_UNIT_Y,
- &ptr,
- "mode",
- -1,
- 0,
- 0,
- -1,
- -1,
- NULL);
- UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL);
-
- uiDefButR(block,
- UI_BTYPE_TOGGLE,
- B_FMODIFIER_REDRAW,
- NULL,
- 0,
- 0,
- bwidth,
- UI_UNIT_Y,
- &ptr,
- "use_additive",
- -1,
- 0,
- 0,
- -1,
- -1,
- NULL);
- UI_block_align_end(block);
-
- /* now add settings for individual modes */
+
+ uiItemR(layout, ptr, "mode", 0, "", ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+
+ uiItemR(layout, ptr, "use_additive", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, ptr, "poly_order", 0, IFACE_("Order"), ICON_NONE);
+
+ PropertyRNA *prop = RNA_struct_find_property(ptr, "coefficients");
+ uiLayout *col = uiLayoutColumn(layout, true);
switch (data->mode) {
- case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */
+ case FCM_GENERATOR_POLYNOMIAL: /* Polynomial expression. */
{
- const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
- float *cp = NULL;
+
char xval[32];
- int maxXWidth;
-
- /* draw polynomial order selector */
- row = uiLayoutRow(layout, false);
- block = uiLayoutGetBlock(row);
-
- but = uiDefButI(
- block,
- UI_BTYPE_NUM,
- B_FMODIFIER_REDRAW,
- IFACE_("Poly Order:"),
- 0.5f * UI_UNIT_X,
- 0,
- bwidth,
- UI_UNIT_Y,
- &data->poly_order,
- 1,
- 100,
- 0,
- 0,
- TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)"));
- UI_but_number_step_size_set(but, 1);
- UI_but_func_set(but, validate_fmodifier_cb, fcm, fcurve_owner_id);
-
- /* calculate maximum width of label for "x^n" labels */
- if (data->arraysize > 2) {
- BLI_snprintf(xval, sizeof(xval), "x^%u", data->arraysize);
- /* XXX: UI_fontstyle_string_width is not accurate */
- maxXWidth = UI_fontstyle_string_width(fstyle, xval) + 0.5 * UI_UNIT_X;
- }
- else {
- /* basic size (just "x") */
- maxXWidth = UI_fontstyle_string_width(fstyle, "x") + 0.5 * UI_UNIT_X;
- }
- /* draw controls for each coefficient and a + sign at end of row */
- row = uiLayoutRow(layout, true);
- block = uiLayoutGetBlock(row);
-
- /* Update depsgraph when values change */
- UI_block_func_set(block, deg_update, fcurve_owner_id, NULL);
-
- cp = data->coefficients;
- for (uint i = 0; (i < data->arraysize) && (cp); i++, cp++) {
- /* To align with first line... */
- if (i) {
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- " ",
- 0,
- 0,
- 2 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- "");
- }
- else {
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- "y =",
- 0,
- 0,
- 2 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- "");
- }
-
- /* coefficient */
- but = uiDefButF(block,
- UI_BTYPE_NUM,
- B_FMODIFIER_REDRAW,
- "",
- 0,
- 0,
- bwidth / 2,
- UI_UNIT_Y,
- cp,
- -UI_FLT_MAX,
- UI_FLT_MAX,
- 0,
- 0,
- TIP_("Coefficient for polynomial"));
- UI_but_number_step_size_set(but, 10);
- UI_but_number_precision_set(but, 3);
-
- /* 'x' param (and '+' if necessary) */
- if (i == 0) {
- BLI_strncpy(xval, " ", sizeof(xval));
- }
- else if (i == 1) {
- BLI_strncpy(xval, "x", sizeof(xval));
- }
- else {
- BLI_snprintf(xval, sizeof(xval), "x^%u", i);
- }
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- xval,
- 0,
- 0,
- maxXWidth,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- TIP_("Power of x"));
-
- if ((i != (data->arraysize - 1)) || ((i == 0) && data->arraysize == 2)) {
- uiDefBut(
- block, UI_BTYPE_LABEL, 1, "+", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
-
- /* next coefficient on a new row */
- row = uiLayoutRow(layout, true);
- block = uiLayoutGetBlock(row);
- }
- else {
- /* For alignment in UI! */
- uiDefBut(
- block, UI_BTYPE_LABEL, 1, " ", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
- }
+ /* The first value gets a "Coefficient" label. */
+ BLI_strncpy(xval, "Coefficient", sizeof(xval));
+
+ for (int i = 0; i < data->arraysize; i++) {
+ uiItemFullR(col, ptr, prop, i, 0, 0, N_(xval), ICON_NONE);
+ BLI_snprintf(xval, sizeof(xval), "x^%d", i + 1);
}
break;
}
-
case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* Factorized polynomial expression */
{
- float *cp = NULL;
-
- /* draw polynomial order selector */
- row = uiLayoutRow(layout, false);
- block = uiLayoutGetBlock(row);
-
- but = uiDefButI(
- block,
- UI_BTYPE_NUM,
- B_FMODIFIER_REDRAW,
- IFACE_("Poly Order:"),
- 0,
- 0,
- width - 1.5 * UI_UNIT_X,
- UI_UNIT_Y,
- &data->poly_order,
- 1,
- 100,
- 0,
- 0,
- TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)"));
- UI_but_func_set(but, validate_fmodifier_cb, fcm, fcurve_owner_id);
- UI_but_number_step_size_set(but, 1);
-
- /* draw controls for each pair of coefficients */
- row = uiLayoutRow(layout, true);
- block = uiLayoutGetBlock(row);
-
- /* Update depsgraph when values change */
- UI_block_func_set(block, deg_update, fcurve_owner_id, NULL);
-
- cp = data->coefficients;
- for (uint i = 0; (i < data->poly_order) && (cp); i++, cp += 2) {
- /* To align with first line */
- if (i) {
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- " ",
- 0,
- 0,
- 2.5 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- "");
- }
- else {
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- "y =",
- 0,
- 0,
- 2.5 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- "");
- }
- /* opening bracket */
- uiDefBut(
- block, UI_BTYPE_LABEL, 1, "(", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
-
- /* coefficients */
- but = uiDefButF(block,
- UI_BTYPE_NUM,
- B_FMODIFIER_REDRAW,
- "",
- 0,
- 0,
- 5 * UI_UNIT_X,
- UI_UNIT_Y,
- cp,
- -UI_FLT_MAX,
- UI_FLT_MAX,
- 0,
- 0,
- TIP_("Coefficient of x"));
- UI_but_number_step_size_set(but, 10);
- UI_but_number_precision_set(but, 3);
-
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- "x +",
- 0,
- 0,
- 2 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- "");
-
- but = uiDefButF(block,
- UI_BTYPE_NUM,
- B_FMODIFIER_REDRAW,
- "",
- 0,
- 0,
- 5 * UI_UNIT_X,
- UI_UNIT_Y,
- cp + 1,
- -UI_FLT_MAX,
- UI_FLT_MAX,
- 0,
- 0,
- TIP_("Second coefficient"));
- UI_but_number_step_size_set(but, 10);
- UI_but_number_precision_set(but, 3);
-
- /* closing bracket and multiplication sign */
- if ((i != (data->poly_order - 1)) || ((i == 0) && data->poly_order == 2)) {
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- ") \xc3\x97",
- 0,
- 0,
- 2 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- "");
-
- /* set up new row for the next pair of coefficients */
- row = uiLayoutRow(layout, true);
- block = uiLayoutGetBlock(row);
- }
- else {
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- ") ",
- 0,
- 0,
- 2 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- "");
- }
+ {
+ /* Add column labels above the buttons to prevent confusion.
+ * Fake the property split layout, otherwise the labels use the full row. */
+ uiLayout *split = uiLayoutSplit(col, 0.4f, false);
+ uiLayoutColumn(split, false);
+ uiLayout *title_col = uiLayoutColumn(split, false);
+ uiLayout *title_row = uiLayoutRow(title_col, true);
+ uiItemL(title_row, N_("A"), ICON_NONE);
+ uiItemL(title_row, N_("B"), ICON_NONE);
+ }
+
+ uiLayout *first_row = uiLayoutRow(col, true);
+ uiItemFullR(first_row, ptr, prop, 0, 0, 0, N_("y = (Ax + B)"), ICON_NONE);
+ uiItemFullR(first_row, ptr, prop, 1, 0, 0, "", ICON_NONE);
+ for (int i = 2; i < data->arraysize - 1; i++) {
+ /* \u2715 is the multiplication symbol. */
+ uiLayout *row = uiLayoutRow(col, true);
+ uiItemFullR(row, ptr, prop, i, 0, 0, N_("\u2715 (Ax + B)"), ICON_NONE);
+ uiItemFullR(row, ptr, prop, i + 1, 0, 0, "", ICON_NONE);
}
break;
}
}
+
+ fmodifier_influence_draw(layout, ptr);
}
-/* --------------- */
+static void panel_register_generator(ARegionType *region_type,
+ const char *id_prefix,
+ PanelTypePollFn poll_fn)
+{
+ PanelType *panel_type = fmodifier_panel_register(
+ region_type, FMODIFIER_TYPE_GENERATOR, generator_panel_draw, poll_fn, id_prefix);
+ fmodifier_subpanel_register(region_type,
+ "frame_range",
+ "",
+ fmodifier_frame_range_header_draw,
+ fmodifier_frame_range_draw,
+ poll_fn,
+ panel_type);
+}
+
+/** \} */
-/* draw settings for generator modifier */
-static void draw_modifier__fn_generator(uiLayout *layout,
- ID *fcurve_owner_id,
- FModifier *fcm,
- short UNUSED(width))
+/* -------------------------------------------------------------------- */
+/** \name Function Generator Modifier
+ * \{ */
+
+static void fn_generator_panel_draw(const bContext *C, Panel *panel)
{
uiLayout *col;
- PointerRNA ptr;
+ uiLayout *layout = panel->layout;
- /* init the RNA-pointer */
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr);
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL);
- /* add the settings */
- col = uiLayoutColumn(layout, true);
- uiItemR(col, &ptr, "function_type", 0, "", ICON_NONE);
- uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
-
- col = uiLayoutColumn(layout, false); /* no grouping for now */
- uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "function_type", 0, "", ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "use_additive", 0, NULL, ICON_NONE);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "amplitude", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "phase_multiplier", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "phase_offset", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "value_offset", 0, NULL, ICON_NONE);
+
+ fmodifier_influence_draw(layout, ptr);
}
-/* --------------- */
+static void panel_register_fn_generator(ARegionType *region_type,
+ const char *id_prefix,
+ PanelTypePollFn poll_fn)
+{
+ PanelType *panel_type = fmodifier_panel_register(
+ region_type, FMODIFIER_TYPE_FN_GENERATOR, fn_generator_panel_draw, poll_fn, id_prefix);
+ fmodifier_subpanel_register(region_type,
+ "frame_range",
+ "",
+ fmodifier_frame_range_header_draw,
+ fmodifier_frame_range_draw,
+ poll_fn,
+ panel_type);
+}
+
+/** \} */
-/* draw settings for cycles modifier */
-static void draw_modifier__cycles(uiLayout *layout,
- ID *fcurve_owner_id,
- FModifier *fcm,
- short UNUSED(width))
+/* -------------------------------------------------------------------- */
+/** \name Cycles Modifier
+ * \{ */
+
+static void cycles_panel_draw(const bContext *C, Panel *panel)
{
- uiLayout *split, *col;
- PointerRNA ptr;
-
- /* init the RNA-pointer */
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifierCycles, fcm, &ptr);
-
- /* split into 2 columns
- * NOTE: the mode combination-boxes shouldn't get labels, otherwise there isn't enough room. */
- split = uiLayoutSplit(layout, 0.5f, false);
-
- /* before range */
- col = uiLayoutColumn(split, true);
- uiItemL(col, IFACE_("Before:"), ICON_NONE);
- uiItemR(col, &ptr, "mode_before", 0, "", ICON_NONE);
- uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NONE);
-
- /* after range */
- col = uiLayoutColumn(split, true);
- uiItemL(col, IFACE_("After:"), ICON_NONE);
- uiItemR(col, &ptr, "mode_after", 0, "", ICON_NONE);
- uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NONE);
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL);
+
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+
+ /* Before. */
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "mode_before", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "cycles_before", 0, IFACE_("Count"), ICON_NONE);
+
+ /* After. */
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "mode_after", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "cycles_after", 0, IFACE_("Count"), ICON_NONE);
+
+ fmodifier_influence_draw(layout, ptr);
}
-/* --------------- */
+static void panel_register_cycles(ARegionType *region_type,
+ const char *id_prefix,
+ PanelTypePollFn poll_fn)
+{
+ PanelType *panel_type = fmodifier_panel_register(
+ region_type, FMODIFIER_TYPE_CYCLES, cycles_panel_draw, poll_fn, id_prefix);
+ fmodifier_subpanel_register(region_type,
+ "frame_range",
+ "",
+ fmodifier_frame_range_header_draw,
+ fmodifier_frame_range_draw,
+ poll_fn,
+ panel_type);
+}
-/* draw settings for noise modifier */
-static void draw_modifier__noise(uiLayout *layout,
- ID *fcurve_owner_id,
- FModifier *fcm,
- short UNUSED(width))
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Noise Modifier
+ * \{ */
+
+static void noise_panel_draw(const bContext *C, Panel *panel)
{
- uiLayout *split, *col;
- PointerRNA ptr;
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL);
- /* init the RNA-pointer */
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifierNoise, fcm, &ptr);
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
- /* blending mode */
- uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "blend_type", 0, NULL, ICON_NONE);
- /* split into 2 columns */
- split = uiLayoutSplit(layout, 0.5f, false);
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "scale", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "strength", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "offset", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "phase", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "depth", 0, NULL, ICON_NONE);
- /* col 1 */
- col = uiLayoutColumn(split, false);
- uiItemR(col, &ptr, "scale", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "strength", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "offset", 0, NULL, ICON_NONE);
+ fmodifier_influence_draw(layout, ptr);
+}
- /* col 2 */
- col = uiLayoutColumn(split, false);
- uiItemR(col, &ptr, "phase", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "depth", 0, NULL, ICON_NONE);
+static void panel_register_noise(ARegionType *region_type,
+ const char *id_prefix,
+ PanelTypePollFn poll_fn)
+{
+ PanelType *panel_type = fmodifier_panel_register(
+ region_type, FMODIFIER_TYPE_NOISE, noise_panel_draw, poll_fn, id_prefix);
+ fmodifier_subpanel_register(region_type,
+ "frame_range",
+ "",
+ fmodifier_frame_range_header_draw,
+ fmodifier_frame_range_draw,
+ poll_fn,
+ panel_type);
}
-/* callback to add new envelope data point */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Envelope Modifier
+ * \{ */
+
static void fmod_envelope_addpoint_cb(bContext *C, void *fcm_dv, void *UNUSED(arg))
{
Scene *scene = CTX_data_scene(C);
@@ -656,132 +687,60 @@ static void fmod_envelope_deletepoint_cb(bContext *UNUSED(C), void *fcm_dv, void
}
/* draw settings for envelope modifier */
-static void draw_modifier__envelope(uiLayout *layout,
- ID *fcurve_owner_id,
- FModifier *fcm,
- short UNUSED(width))
+static void envelope_panel_draw(const bContext *C, Panel *panel)
{
+ uiLayout *row, *col;
+ uiLayout *layout = panel->layout;
+
+ ID *owner_id;
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id);
+ FModifier *fcm = (FModifier *)ptr->data;
FMod_Envelope *env = (FMod_Envelope *)fcm->data;
- FCM_EnvelopeData *fed;
- uiLayout *col, *row;
- uiBlock *block;
- uiBut *but;
- PointerRNA ptr;
- int i;
- /* init the RNA-pointer */
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifierEnvelope, fcm, &ptr);
+ uiLayoutSetPropSep(layout, true);
- /* general settings */
+ /* General settings. */
col = uiLayoutColumn(layout, true);
- uiItemL(col, IFACE_("Envelope:"), ICON_NONE);
- uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "reference_value", 0, IFACE_("Reference"), ICON_NONE);
+ uiItemR(col, ptr, "default_min", 0, IFACE_("Min"), ICON_NONE);
+ uiItemR(col, ptr, "default_max", 0, IFACE_("Max"), ICON_NONE);
- row = uiLayoutRow(col, true);
- uiItemR(row, &ptr, "default_min", 0, IFACE_("Min"), ICON_NONE);
- uiItemR(row, &ptr, "default_max", 0, IFACE_("Max"), ICON_NONE);
+ /* Control points list. */
- /* control points header */
- /* TODO: move this control-point control stuff to using the new special widgets for lists
- * the current way is far too cramped */
row = uiLayoutRow(layout, false);
- block = uiLayoutGetBlock(row);
-
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 1,
- IFACE_("Control Points:"),
- 0,
- 0,
- 7.5 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0,
- 0,
- "");
-
- but = uiDefBut(block,
- UI_BTYPE_BUT,
- B_FMODIFIER_REDRAW,
- IFACE_("Add Point"),
- 0,
- 0,
- 7.5 * UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0,
- 0,
- 0,
- 0,
- TIP_("Add a new control-point to the envelope on the current frame"));
+ uiBlock *block = uiLayoutGetBlock(row);
+
+ uiBut *but = uiDefBut(block,
+ UI_BTYPE_BUT,
+ B_FMODIFIER_REDRAW,
+ IFACE_("Add Control Point"),
+ 0,
+ 0,
+ 7.5 * UI_UNIT_X,
+ UI_UNIT_Y,
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ TIP_("Add a new control-point to the envelope on the current frame"));
UI_but_func_set(but, fmod_envelope_addpoint_cb, env, NULL);
- /* control points list */
- for (i = 0, fed = env->data; i < env->totvert; i++, fed++) {
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetPropSep(col, false);
+
+ FCM_EnvelopeData *fed = env->data;
+ for (int i = 0; i < env->totvert; i++, fed++) {
PointerRNA ctrl_ptr;
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifierEnvelopeControlPoint, fed, &ctrl_ptr);
+ RNA_pointer_create(owner_id, &RNA_FModifierEnvelopeControlPoint, fed, &ctrl_ptr);
/* get a new row to operate on */
- row = uiLayoutRow(layout, true);
+ row = uiLayoutRow(col, true);
block = uiLayoutGetBlock(row);
- UI_block_align_begin(block);
- but = uiDefButR(block,
- UI_BTYPE_NUM,
- B_FMODIFIER_REDRAW,
- IFACE_("Fra:"),
- 0,
- 0,
- 4.5 * UI_UNIT_X,
- UI_UNIT_Y,
- &ctrl_ptr,
- "frame",
- -1,
- -MAXFRAMEF,
- MAXFRAMEF,
- 0,
- 0,
- NULL);
- UI_but_number_step_size_set(but, 10);
- UI_but_number_precision_set(but, 1);
- but = uiDefButR(block,
- UI_BTYPE_NUM,
- B_FMODIFIER_REDRAW,
- IFACE_("Min:"),
- 0,
- 0,
- 5 * UI_UNIT_X,
- UI_UNIT_Y,
- &ctrl_ptr,
- "min",
- -1,
- -UI_FLT_MAX,
- UI_FLT_MAX,
- 0,
- 0,
- NULL);
- UI_but_number_step_size_set(but, 10);
- UI_but_number_precision_set(but, 2);
- but = uiDefButR(block,
- UI_BTYPE_NUM,
- B_FMODIFIER_REDRAW,
- IFACE_("Max:"),
- 0,
- 0,
- 5 * UI_UNIT_X,
- UI_UNIT_Y,
- &ctrl_ptr,
- "max",
- -1,
- -UI_FLT_MAX,
- UI_FLT_MAX,
- 0,
- 0,
- NULL);
- UI_but_number_step_size_set(but, 10);
- UI_but_number_precision_set(but, 2);
+ uiItemR(row, &ctrl_ptr, "frame", 0, NULL, ICON_NONE);
+ uiItemR(row, &ctrl_ptr, "min", 0, IFACE_("Min"), ICON_NONE);
+ uiItemR(row, &ctrl_ptr, "max", 0, IFACE_("Max"), ICON_NONE);
but = uiDefIconBut(block,
UI_BTYPE_BUT,
@@ -800,251 +759,210 @@ static void draw_modifier__envelope(uiLayout *layout,
UI_but_func_set(but, fmod_envelope_deletepoint_cb, env, POINTER_FROM_INT(i));
UI_block_align_begin(block);
}
-}
-/* --------------- */
+ fmodifier_influence_draw(layout, ptr);
+}
-/* draw settings for limits modifier */
-static void draw_modifier__limits(uiLayout *layout,
- ID *fcurve_owner_id,
- FModifier *fcm,
- short UNUSED(width))
+static void panel_register_envelope(ARegionType *region_type,
+ const char *id_prefix,
+ PanelTypePollFn poll_fn)
{
- uiLayout *split, *col /* , *row */ /* UNUSED */;
- PointerRNA ptr;
-
- /* init the RNA-pointer */
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifierLimits, fcm, &ptr);
-
- /* row 1: minimum */
- {
- /* row = uiLayoutRow(layout, false); */ /* UNUSED */
-
- /* split into 2 columns */
- split = uiLayoutSplit(layout, 0.5f, false);
+ PanelType *panel_type = fmodifier_panel_register(
+ region_type, FMODIFIER_TYPE_ENVELOPE, envelope_panel_draw, poll_fn, id_prefix);
+ fmodifier_subpanel_register(region_type,
+ "frame_range",
+ "",
+ fmodifier_frame_range_header_draw,
+ fmodifier_frame_range_draw,
+ poll_fn,
+ panel_type);
+}
- /* x-minimum */
- col = uiLayoutColumn(split, true);
- uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NONE);
+/** \} */
- /* y-minimum*/
- col = uiLayoutColumn(split, true);
- uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NONE);
- }
+/* -------------------------------------------------------------------- */
+/** \name Limits Modifier
+ * \{ */
- /* row 2: maximum */
- {
- /* row = uiLayoutRow(layout, false); */ /* UNUSED */
+static void limits_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col, *row, *sub;
+ uiLayout *layout = panel->layout;
- /* split into 2 columns */
- split = uiLayoutSplit(layout, 0.5f, false);
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL);
- /* x-minimum */
- col = uiLayoutColumn(split, true);
- uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NONE);
+ uiLayoutSetPropSep(layout, true);
- /* y-minimum*/
- col = uiLayoutColumn(split, true);
- uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NONE);
- }
+ /* Minimums. */
+ col = uiLayoutColumn(layout, false);
+ row = uiLayoutRowWithHeading(col, true, IFACE_("Minimum X"));
+ uiItemR(row, ptr, "use_min_x", 0, "", ICON_NONE);
+ sub = uiLayoutColumn(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min_x"));
+ uiItemR(sub, ptr, "min_x", 0, "", ICON_NONE);
+
+ row = uiLayoutRowWithHeading(col, true, IFACE_("Y"));
+ uiItemR(row, ptr, "use_min_y", 0, "", ICON_NONE);
+ sub = uiLayoutColumn(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min_y"));
+ uiItemR(sub, ptr, "min_y", 0, "", ICON_NONE);
+
+ /* Maximums. */
+ col = uiLayoutColumn(layout, false);
+ row = uiLayoutRowWithHeading(col, true, IFACE_("Maximum X"));
+ uiItemR(row, ptr, "use_max_x", 0, "", ICON_NONE);
+ sub = uiLayoutColumn(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max_x"));
+ uiItemR(sub, ptr, "max_x", 0, "", ICON_NONE);
+
+ row = uiLayoutRowWithHeading(col, true, IFACE_("Y"));
+ uiItemR(row, ptr, "use_max_y", 0, "", ICON_NONE);
+ sub = uiLayoutColumn(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max_y"));
+ uiItemR(sub, ptr, "max_y", 0, "", ICON_NONE);
+
+ fmodifier_influence_draw(layout, ptr);
}
-/* --------------- */
-
-/* draw settings for stepped interpolation modifier */
-static void draw_modifier__stepped(uiLayout *layout,
- ID *fcurve_owner_id,
- FModifier *fcm,
- short UNUSED(width))
+static void panel_register_limits(ARegionType *region_type,
+ const char *id_prefix,
+ PanelTypePollFn poll_fn)
{
- uiLayout *col, *sub;
- PointerRNA ptr;
+ PanelType *panel_type = fmodifier_panel_register(
+ region_type, FMODIFIER_TYPE_LIMITS, limits_panel_draw, poll_fn, id_prefix);
+ fmodifier_subpanel_register(region_type,
+ "frame_range",
+ "",
+ fmodifier_frame_range_header_draw,
+ fmodifier_frame_range_draw,
+ poll_fn,
+ panel_type);
+}
- /* init the RNA-pointer */
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifierStepped, fcm, &ptr);
+/** \} */
- /* block 1: "stepping" settings */
- col = uiLayoutColumn(layout, false);
- uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NONE);
- uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NONE);
+/* -------------------------------------------------------------------- */
+/** \name Stepped Interpolation Modifier
+ * \{ */
- /* block 2: start range settings */
- col = uiLayoutColumn(layout, true);
- uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NONE);
+static void stepped_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col, *sub, *row;
+ uiLayout *layout = panel->layout;
- sub = uiLayoutColumn(col, true);
- uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_start"));
- uiItemR(sub, &ptr, "frame_start", 0, NULL, ICON_NONE);
+ PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL);
- /* block 3: end range settings */
- col = uiLayoutColumn(layout, true);
- uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NONE);
+ uiLayoutSetPropSep(layout, true);
- sub = uiLayoutColumn(col, true);
- uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_end"));
- uiItemR(sub, &ptr, "frame_end", 0, NULL, ICON_NONE);
+ /* Stepping Settings. */
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "frame_step", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "frame_offset", 0, NULL, ICON_NONE);
+
+ /* Start range settings. */
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Start Frame"));
+ uiItemR(row, ptr, "use_frame_start", 0, "", ICON_NONE);
+ sub = uiLayoutColumn(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_frame_start"));
+ uiItemR(sub, ptr, "frame_start", 0, "", ICON_NONE);
+
+ /* End range settings. */
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("End Frame"));
+ uiItemR(row, ptr, "use_frame_end", 0, "", ICON_NONE);
+ sub = uiLayoutColumn(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_frame_end"));
+ uiItemR(sub, ptr, "frame_end", 0, "", ICON_NONE);
+
+ fmodifier_influence_draw(layout, ptr);
}
-/* --------------- */
-
-void ANIM_uiTemplate_fmodifier_draw(uiLayout *layout,
- ID *fcurve_owner_id,
- ListBase *modifiers,
- FModifier *fcm)
+static void panel_register_stepped(ARegionType *region_type,
+ const char *id_prefix,
+ PanelTypePollFn poll_fn)
{
- const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm);
- uiLayout *box, *row, *sub, *col;
- uiBlock *block;
- uiBut *but;
- short width = 314;
- PointerRNA ptr;
-
- /* init the RNA-pointer */
- RNA_pointer_create(fcurve_owner_id, &RNA_FModifier, fcm, &ptr);
+ PanelType *panel_type = fmodifier_panel_register(
+ region_type, FMODIFIER_TYPE_STEPPED, stepped_panel_draw, poll_fn, id_prefix);
+ fmodifier_subpanel_register(region_type,
+ "frame_range",
+ "",
+ fmodifier_frame_range_header_draw,
+ fmodifier_frame_range_draw,
+ poll_fn,
+ panel_type);
+}
- /* draw header */
- {
- /* get layout-row + UI-block for this */
- box = uiLayoutBox(layout);
+/** \} */
- row = uiLayoutRow(box, false);
- block = uiLayoutGetBlock(row); /* err... */
+/* -------------------------------------------------------------------- */
+/** \name Panel Creation
+ * \{ */
- /* left-align -------------------------------------------- */
- sub = uiLayoutRow(row, true);
- uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT);
+/**
+ * Checks if the panels match the active strip / curve, rebuilds them if they don't.
+ */
+void ANIM_fmodifier_panels(const bContext *C,
+ ID *owner_id,
+ ListBase *fmodifiers,
+ uiListPanelIDFromDataFunc panel_id_fn)
+{
+ ARegion *region = CTX_wm_region(C);
- UI_block_emboss_set(block, UI_EMBOSS_NONE);
+ bool panels_match = UI_panel_list_matches_data(region, fmodifiers, panel_id_fn);
- /* expand */
- uiItemR(sub, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ if (!panels_match) {
+ UI_panels_free_instanced(C, region);
+ FModifier *fcm = fmodifiers->first;
+ for (int i = 0; fcm; i++, fcm = fcm->next) {
+ char panel_idname[MAX_NAME];
+ panel_id_fn(fcm, panel_idname);
- /* checkbox for 'active' status (for now) */
- uiItemR(sub, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ PointerRNA *fcm_ptr = MEM_mallocN(sizeof(PointerRNA), "panel customdata");
+ RNA_pointer_create(owner_id, &RNA_FModifier, fcm, fcm_ptr);
- /* name */
- if (fmi) {
- uiItemL(sub, IFACE_(fmi->name), ICON_NONE);
- }
- else {
- uiItemL(sub, IFACE_("<Unknown Modifier>"), ICON_NONE);
+ UI_panel_add_instanced(C, region, &region->panels, panel_idname, fcm_ptr);
}
-
- /* right-align ------------------------------------------- */
- sub = uiLayoutRow(row, true);
- uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT);
-
- /* 'mute' button */
- uiItemR(sub, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
-
- UI_block_emboss_set(block, UI_EMBOSS_NONE);
-
- /* delete button */
- but = uiDefIconBut(block,
- UI_BTYPE_BUT,
- B_REDR,
- ICON_X,
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0.0,
- 0.0,
- TIP_("Delete F-Curve Modifier"));
- FModifierDeleteContext *ctx = MEM_mallocN(sizeof(FModifierDeleteContext), "fmodifier ctx");
- ctx->fcurve_owner_id = fcurve_owner_id;
- ctx->modifiers = modifiers;
- UI_but_funcN_set(but, delete_fmodifier_cb, ctx, fcm);
-
- UI_block_emboss_set(block, UI_EMBOSS);
}
-
- /* when modifier is expanded, draw settings */
- if (fcm->flag & FMODIFIER_FLAG_EXPANDED) {
- /* set up the flexible-box layout which acts as the backdrop for the modifier settings */
- box = uiLayoutBox(layout);
-
- /* draw settings for individual modifiers */
- switch (fcm->type) {
- case FMODIFIER_TYPE_GENERATOR: /* Generator */
- draw_modifier__generator(box, fcurve_owner_id, fcm, width);
- break;
-
- case FMODIFIER_TYPE_FN_GENERATOR: /* Built-In Function Generator */
- draw_modifier__fn_generator(box, fcurve_owner_id, fcm, width);
- break;
-
- case FMODIFIER_TYPE_CYCLES: /* Cycles */
- draw_modifier__cycles(box, fcurve_owner_id, fcm, width);
- break;
-
- case FMODIFIER_TYPE_ENVELOPE: /* Envelope */
- draw_modifier__envelope(box, fcurve_owner_id, fcm, width);
- break;
-
- case FMODIFIER_TYPE_LIMITS: /* Limits */
- draw_modifier__limits(box, fcurve_owner_id, fcm, width);
- break;
-
- case FMODIFIER_TYPE_NOISE: /* Noise */
- draw_modifier__noise(box, fcurve_owner_id, fcm, width);
- break;
-
- case FMODIFIER_TYPE_STEPPED: /* Stepped */
- draw_modifier__stepped(box, fcurve_owner_id, fcm, width);
- break;
-
- default: /* unknown type */
- break;
- }
-
- /* one last panel below this: FModifier range */
- /* TODO: experiment with placement of this */
- {
- box = uiLayoutBox(layout);
-
- /* restricted range ----------------------------------------------------- */
- col = uiLayoutColumn(box, true);
-
- /* top row: use restricted range */
- row = uiLayoutRow(col, true);
- uiItemR(row, &ptr, "use_restricted_range", 0, NULL, ICON_NONE);
-
- if (fcm->flag & FMODIFIER_FLAG_RANGERESTRICT) {
- /* second row: settings */
- row = uiLayoutRow(col, true);
-
- uiItemR(row, &ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE);
- uiItemR(row, &ptr, "frame_end", 0, IFACE_("End"), ICON_NONE);
-
- /* third row: blending influence */
- row = uiLayoutRow(col, true);
-
- uiItemR(row, &ptr, "blend_in", 0, IFACE_("In"), ICON_NONE);
- uiItemR(row, &ptr, "blend_out", 0, IFACE_("Out"), ICON_NONE);
+ else {
+ /* Assuming there's only one group of instanced panels, update the custom data pointers. */
+ Panel *panel = region->panels.first;
+ LISTBASE_FOREACH (FModifier *, fcm, fmodifiers) {
+
+ /* Move to the next instanced panel corresponding to the next modifier. */
+ while ((panel->type == NULL) || !(panel->type->flag & PANEL_TYPE_INSTANCED)) {
+ panel = panel->next;
+ BLI_assert(panel != NULL); /* There shouldn't be fewer panels than modifiers with UIs. */
}
- /* influence -------------------------------------------------------------- */
- col = uiLayoutColumn(box, true);
-
- /* top row: use influence */
- uiItemR(col, &ptr, "use_influence", 0, NULL, ICON_NONE);
+ PointerRNA *fcm_ptr = MEM_mallocN(sizeof(PointerRNA), "panel customdata");
+ RNA_pointer_create(owner_id, &RNA_FModifier, fcm, fcm_ptr);
+ UI_panel_custom_data_set(panel, fcm_ptr);
- if (fcm->flag & FMODIFIER_FLAG_USEINFLUENCE) {
- /* second row: influence value */
- uiItemR(col, &ptr, "influence", 0, NULL, ICON_NONE);
- }
+ panel = panel->next;
}
}
}
+void ANIM_modifier_panels_register_graph_and_NLA(ARegionType *region_type,
+ const char *modifier_panel_prefix,
+ PanelTypePollFn poll_function)
+{
+ panel_register_generator(region_type, modifier_panel_prefix, poll_function);
+ panel_register_fn_generator(region_type, modifier_panel_prefix, poll_function);
+ panel_register_noise(region_type, modifier_panel_prefix, poll_function);
+ panel_register_envelope(region_type, modifier_panel_prefix, poll_function);
+ panel_register_limits(region_type, modifier_panel_prefix, poll_function);
+ panel_register_stepped(region_type, modifier_panel_prefix, poll_function);
+}
+
+void ANIM_modifier_panels_register_graph_only(ARegionType *region_type,
+ const char *modifier_panel_prefix,
+ PanelTypePollFn poll_function)
+{
+ panel_register_cycles(region_type, modifier_panel_prefix, poll_function);
+}
+
+/** \} */
+
/* -------------------------------------------------------------------- */
/** \name Copy / Paste Buffer Code
*
diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index 542a6d45db7..b9ef69cf8bd 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -258,6 +258,10 @@ static DLRBT_Node *nalloc_ak_gpframe(void *data)
/* count keyframes in this column */
ak->totkey = 1;
+ /* Set as visible block. */
+ ak->totblock = 1;
+ ak->block.sel = ak->sel;
+ ak->block.flag |= ACTKEYBLOCK_FLAG_GPENCIL;
return (DLRBT_Node *)ak;
}
@@ -689,6 +693,7 @@ static void draw_keylist(View2D *v2d,
{
const float icon_sz = U.widget_unit * 0.5f * yscale_fac;
const float half_icon_sz = 0.5f * icon_sz;
+ const float quarter_icon_sz = 0.25f * icon_sz;
const float smaller_sz = 0.35f * icon_sz;
const float ipo_sz = 0.1f * icon_sz;
@@ -724,6 +729,7 @@ static void draw_keylist(View2D *v2d,
ipo_color_mix[3] *= 0.5f;
uint block_len = 0;
+ uint gpencil_len = 0;
LISTBASE_FOREACH (ActKeyColumn *, ab, keys) {
if (actkeyblock_get_valid_hold(ab)) {
block_len++;
@@ -731,50 +737,72 @@ static void draw_keylist(View2D *v2d,
if (show_ipo && actkeyblock_is_valid(ab) && (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) {
block_len++;
}
+ if ((ab->next != NULL) && (ab->block.flag & ACTKEYBLOCK_FLAG_GPENCIL)) {
+ gpencil_len++;
+ }
}
- if (block_len > 0) {
+ if ((block_len > 0) || (gpencil_len > 0)) {
GPUVertFormat *format = immVertexFormat();
uint pos_id = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
- immBegin(GPU_PRIM_TRIS, 6 * block_len);
- LISTBASE_FOREACH (ActKeyColumn *, ab, keys) {
- int valid_hold = actkeyblock_get_valid_hold(ab);
- if (valid_hold != 0) {
- if ((valid_hold & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) {
- /* draw "moving hold" long-keyframe block - slightly smaller */
- immRectf_fast_with_color(pos_id,
- color_id,
- ab->cfra,
- ypos - smaller_sz,
- ab->next->cfra,
- ypos + smaller_sz,
- (ab->block.sel) ? sel_mhcol : unsel_mhcol);
+ /* Normal Dopesheet. */
+ if (block_len > 0) {
+ immBegin(GPU_PRIM_TRIS, 6 * block_len);
+ LISTBASE_FOREACH (ActKeyColumn *, ab, keys) {
+ int valid_hold = actkeyblock_get_valid_hold(ab);
+ if (valid_hold != 0) {
+ if ((valid_hold & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) {
+ /* draw "moving hold" long-keyframe block - slightly smaller */
+ immRectf_fast_with_color(pos_id,
+ color_id,
+ ab->cfra,
+ ypos - smaller_sz,
+ ab->next->cfra,
+ ypos + smaller_sz,
+ (ab->block.sel) ? sel_mhcol : unsel_mhcol);
+ }
+ else {
+ /* draw standard long-keyframe block */
+ immRectf_fast_with_color(pos_id,
+ color_id,
+ ab->cfra,
+ ypos - half_icon_sz,
+ ab->next->cfra,
+ ypos + half_icon_sz,
+ (ab->block.sel) ? sel_color : unsel_color);
+ }
}
- else {
- /* draw standard long-keyframe block */
- immRectf_fast_with_color(pos_id,
- color_id,
- ab->cfra,
- ypos - half_icon_sz,
- ab->next->cfra,
- ypos + half_icon_sz,
- (ab->block.sel) ? sel_color : unsel_color);
+ if (show_ipo && actkeyblock_is_valid(ab) &&
+ (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) {
+ /* draw an interpolation line */
+ immRectf_fast_with_color(
+ pos_id,
+ color_id,
+ ab->cfra,
+ ypos - ipo_sz,
+ ab->next->cfra,
+ ypos + ipo_sz,
+ (ab->block.conflict & ACTKEYBLOCK_FLAG_NON_BEZIER) ? ipo_color_mix : ipo_color);
}
}
- if (show_ipo && actkeyblock_is_valid(ab) &&
- (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) {
- /* draw an interpolation line */
- immRectf_fast_with_color(
- pos_id,
- color_id,
- ab->cfra,
- ypos - ipo_sz,
- ab->next->cfra,
- ypos + ipo_sz,
- (ab->block.conflict & ACTKEYBLOCK_FLAG_NON_BEZIER) ? ipo_color_mix : ipo_color);
+ }
+ /* Grease Pencil Dopesheet. */
+ else {
+ immBegin(GPU_PRIM_TRIS, 6 * gpencil_len);
+ LISTBASE_FOREACH (ActKeyColumn *, ab, keys) {
+ if (ab->next == NULL) {
+ continue;
+ }
+ immRectf_fast_with_color(pos_id,
+ color_id,
+ ab->cfra,
+ ypos - quarter_icon_sz,
+ ab->next->cfra,
+ ypos + quarter_icon_sz,
+ (ab->block.sel) ? sel_mhcol : unsel_mhcol);
}
}
immEnd();
diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c
index d5260cac0c9..636f0d3cbea 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -86,7 +86,7 @@ short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked,
return 0;
}
- /* set the F-Curve into the editdata so that it can be accessed */
+ /* Set the F-Curve into the edit-data so that it can be accessed. */
if (ked) {
ked->fcu = fcu;
ked->curIndex = 0;
diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c
index 6ed9803dbd3..72e65272f13 100644
--- a/source/blender/editors/animation/keyframes_general.c
+++ b/source/blender/editors/animation/keyframes_general.c
@@ -39,13 +39,11 @@
#include "BKE_action.h"
#include "BKE_curve.h"
-#include "BKE_deform.h"
#include "BKE_fcurve.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "RNA_access.h"
-#include "RNA_enum_types.h"
#include "ED_anim_api.h"
#include "ED_keyframes_edit.h"
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index e8146ca960a..4cc0413be5b 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -614,7 +614,7 @@ int insert_vert_fcurve(
return -1;
}
- /* set handletype and interpolation */
+ /* Set handle-type and interpolation. */
if ((fcu->totvert > 2) && (flag & INSERTKEY_REPLACE) == 0) {
BezTriple *bezt = (fcu->bezt + a);
@@ -639,7 +639,7 @@ int insert_vert_fcurve(
/* don't recalculate handles if fast is set
* - this is a hack to make importers faster
- * - we may calculate twice (due to autohandle needing to be calculated twice)
+ * - we may calculate twice (due to auto-handle needing to be calculated twice)
*/
if ((flag & INSERTKEY_FAST) == 0) {
calchandles_fcurve(fcu);
@@ -1384,7 +1384,7 @@ static AnimationEvalContext nla_time_remap(const AnimationEvalContext *anim_eval
if (adt && adt->action == act) {
/* Get NLA context for value remapping. */
*r_nla_context = BKE_animsys_get_nla_keyframing_context(
- nla_cache, id_ptr, adt, anim_eval_context, false);
+ nla_cache, id_ptr, adt, anim_eval_context);
/* Apply NLA-mapping to frame. */
const float remapped_frame = BKE_nla_tweakedit_remap(
diff --git a/source/blender/editors/animation/time_scrub_ui.c b/source/blender/editors/animation/time_scrub_ui.c
index 98b4d93fbf1..034378399b9 100644
--- a/source/blender/editors/animation/time_scrub_ui.c
+++ b/source/blender/editors/animation/time_scrub_ui.c
@@ -124,23 +124,22 @@ static void draw_current_frame(const Scene *scene,
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_3fv_alpha(true,
- frame_x - box_width / 2 + U.pixelsize / 2,
- scrub_region_rect->ymin + box_padding,
- frame_x + box_width / 2 + U.pixelsize / 2,
- scrub_region_rect->ymax - box_padding,
- 4 * UI_DPI_FAC,
- bg_color,
- 1.0f);
-
- UI_GetThemeColorShade4fv(TH_CFRAME, 5, bg_color);
- UI_draw_roundbox_aa(false,
- frame_x - box_width / 2 + U.pixelsize / 2,
- scrub_region_rect->ymin + box_padding,
- frame_x + box_width / 2 + U.pixelsize / 2,
- scrub_region_rect->ymax - box_padding,
- 4 * UI_DPI_FAC,
- bg_color);
+ float outline_color[4];
+ UI_GetThemeColorShade4fv(TH_CFRAME, 5, outline_color);
+
+ UI_draw_roundbox_4fv_ex(
+ &(const rctf){
+ .xmin = frame_x - box_width / 2 + U.pixelsize / 2,
+ .xmax = frame_x + box_width / 2 + U.pixelsize / 2,
+ .ymin = scrub_region_rect->ymin + box_padding,
+ .ymax = scrub_region_rect->ymax - box_padding,
+ },
+ bg_color,
+ NULL,
+ 1.0f,
+ outline_color,
+ U.pixelsize,
+ 4 * UI_DPI_FAC);
uchar text_color[4];
UI_GetThemeColor4ubv(TH_HEADER_TEXT_HI, text_color);
diff --git a/source/blender/editors/armature/armature_add.c b/source/blender/editors/armature/armature_add.c
index a0b8bf862d7..68fff1091af 100644
--- a/source/blender/editors/armature/armature_add.c
+++ b/source/blender/editors/armature/armature_add.c
@@ -122,9 +122,6 @@ EditBone *ED_armature_ebone_add_primitive(Object *obedit_arm, float length, bool
return bone;
}
-/* previously addvert_armature */
-/* the ctrl-click method */
-
/**
* Note this is already ported to multi-objects as it is.
* Since only the active bone is extruded even for single objects,
@@ -306,8 +303,7 @@ static EditBone *get_named_editbone(ListBase *edbo, const char *name)
return NULL;
}
-/* Call this before doing any duplications
- * */
+/* Call this before doing any duplications. */
void preEditBoneDuplicate(ListBase *editbones)
{
/* clear temp */
diff --git a/source/blender/editors/armature/armature_edit.c b/source/blender/editors/armature/armature_edit.c
index a07e73d6266..912aafbd6e3 100644
--- a/source/blender/editors/armature/armature_edit.c
+++ b/source/blender/editors/armature/armature_edit.c
@@ -126,12 +126,12 @@ void ED_armature_origin_set(
bArmature *arm = ob->data;
float cent[3];
- /* Put the armature into editmode */
+ /* Put the armature into edit-mode. */
if (is_editmode == false) {
ED_armature_to_edit(arm);
}
- /* Find the centerpoint */
+ /* Find the center-point. */
if (centermode == 2) {
copy_v3_v3(cent, cursor);
invert_m4_m4(ob->imat, ob->obmat);
@@ -173,7 +173,7 @@ void ED_armature_origin_set(
ED_armature_edit_free(arm);
}
- /* Adjust object location for new centerpoint */
+ /* Adjust object location for new center-point. */
if (centermode && (is_editmode == false)) {
mul_mat3_m4_v3(ob->obmat, cent); /* omit translation part */
add_v3_v3(ob->loc, cent);
diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c
index da1b29307b1..a0face26bae 100644
--- a/source/blender/editors/armature/armature_ops.c
+++ b/source/blender/editors/armature/armature_ops.c
@@ -28,8 +28,6 @@
#include "ED_armature.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
-#include "ED_transform.h"
#include "armature_intern.h"
diff --git a/source/blender/editors/armature/armature_skinning.c b/source/blender/editors/armature/armature_skinning.c
index 6951ed6f305..f86ec545712 100644
--- a/source/blender/editors/armature/armature_skinning.c
+++ b/source/blender/editors/armature/armature_skinning.c
@@ -30,7 +30,6 @@
#include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_string_utils.h"
@@ -50,8 +49,6 @@
#include "ED_armature.h"
#include "ED_mesh.h"
-#include "eigen_capi.h"
-
#include "armature_intern.h"
#include "meshlaplacian.h"
diff --git a/source/blender/editors/armature/armature_utils.c b/source/blender/editors/armature/armature_utils.c
index fba88e78162..3d1d8d0d1f1 100644
--- a/source/blender/editors/armature/armature_utils.c
+++ b/source/blender/editors/armature/armature_utils.c
@@ -699,11 +699,11 @@ void ED_armature_from_edit(Main *bmain, bArmature *arm)
BKE_armature_bonelist_free(&arm->bonebase, true);
arm->act_bone = NULL;
- /* remove zero sized bones, this gives unstable restposes */
+ /* Remove zero sized bones, this gives unstable rest-poses. */
for (eBone = arm->edbo->first; eBone; eBone = neBone) {
float len_sq = len_squared_v3v3(eBone->head, eBone->tail);
neBone = eBone->next;
- /* TODO(sergey): How to ensure this is a constexpr? */
+ /* TODO(sergey): How to ensure this is a `constexpr`? */
if (len_sq <= square_f(0.000001f)) { /* FLT_EPSILON is too large? */
EditBone *fBone;
diff --git a/source/blender/editors/armature/editarmature_undo.c b/source/blender/editors/armature/editarmature_undo.c
index c6d7d2eb869..337d1138b23 100644
--- a/source/blender/editors/armature/editarmature_undo.c
+++ b/source/blender/editors/armature/editarmature_undo.c
@@ -178,8 +178,11 @@ static bool armature_undosys_step_encode(struct bContext *C, struct Main *bmain,
return true;
}
-static void armature_undosys_step_decode(
- struct bContext *C, struct Main *bmain, UndoStep *us_p, int UNUSED(dir), bool UNUSED(is_final))
+static void armature_undosys_step_decode(struct bContext *C,
+ struct Main *bmain,
+ UndoStep *us_p,
+ const eUndoStepDir UNUSED(dir),
+ bool UNUSED(is_final))
{
ArmatureUndoStep *us = (ArmatureUndoStep *)us_p;
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index 3c0b6dacbf6..e362a2e2f40 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -422,7 +422,7 @@ static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTr
}
}
-/* Raytracing for vertex to bone/vertex visibility */
+/* Ray-tracing for vertex to bone/vertex visibility. */
static void heat_ray_tree_create(LaplacianSystem *sys)
{
const MLoopTri *looptri = sys->heat.mlooptri;
@@ -497,7 +497,7 @@ static float heat_source_distance(LaplacianSystem *sys, int vertex, int source)
{
float closest[3], d[3], dist, cosine;
- /* compute euclidian distance */
+ /* compute Euclidean distance */
closest_to_line_segment_v3(
closest, sys->heat.verts[vertex], sys->heat.root[source], sys->heat.tip[source]);
diff --git a/source/blender/editors/armature/pose_edit.c b/source/blender/editors/armature/pose_edit.c
index 91893af003f..78bce8679bb 100644
--- a/source/blender/editors/armature/pose_edit.c
+++ b/source/blender/editors/armature/pose_edit.c
@@ -149,7 +149,7 @@ bool ED_object_posemode_exit(bContext *C, Object *ob)
return ok;
}
-/* if a selected or active bone is protected, throw error (oonly if warn == 1) and return 1 */
+/* if a selected or active bone is protected, throw error (only if warn == 1) and return 1 */
/* only_selected == 1: the active bone is allowed to be protected */
#if 0 /* UNUSED 2.5 */
static bool pose_has_protected_selected(Object *ob, short warn)
diff --git a/source/blender/editors/armature/pose_group.c b/source/blender/editors/armature/pose_group.c
index 55c9877e55f..38d15d8b880 100644
--- a/source/blender/editors/armature/pose_group.c
+++ b/source/blender/editors/armature/pose_group.c
@@ -423,7 +423,7 @@ static int group_sort_exec(bContext *C, wmOperator *UNUSED(op))
BLI_addtail(&pose->agroups, agrp_array[i].agrp);
}
- /* fix changed bone group indizes in bones */
+ /* Fix changed bone group indices in bones. */
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
for (i = 0; i < agrp_count; i++) {
if (pchan->agrp_index == agrp_array[i].index) {
diff --git a/source/blender/editors/armature/pose_lib.c b/source/blender/editors/armature/pose_lib.c
index 947e2dbf5aa..45f623f3a9d 100644
--- a/source/blender/editors/armature/pose_lib.c
+++ b/source/blender/editors/armature/pose_lib.c
@@ -1106,7 +1106,7 @@ static void poselib_keytag_pose(bContext *C, Scene *scene, tPoseLib_PreviewData
if (pchan) {
if (!any_bone_selected || ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED))) {
if (autokey) {
- /* add datasource override for the PoseChannel, to be used later */
+ /* Add data-source override for the PoseChannel, to be used later. */
ANIM_relative_keyingset_add_source(&dsources, &pld->ob->id, &RNA_PoseBone, pchan);
/* clear any unkeyed tags */
@@ -1142,7 +1142,7 @@ static void poselib_preview_apply(bContext *C, wmOperator *op)
/* only recalc pose (and its dependencies) if pose has changed */
if (pld->redraw == PL_PREVIEW_REDRAWALL) {
- /* don't clear pose if firsttime */
+ /* Don't clear pose if first time. */
if ((pld->flag & PL_PREVIEW_FIRSTTIME) == 0) {
poselib_backup_restore(pld);
}
diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c
index 6a03207b3b0..a3f97000509 100644
--- a/source/blender/editors/armature/pose_select.c
+++ b/source/blender/editors/armature/pose_select.c
@@ -138,8 +138,10 @@ void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select)
}
}
-/* called from editview.c, for mode-less pose selection */
-/* assumes scene obact and basact is still on old situation */
+/**
+ * Called for mode-less pose selection.
+ * assumes the active object is still on old situation.
+ */
bool ED_armature_pose_select_pick_with_buffer(ViewLayer *view_layer,
View3D *v3d,
Base *base,
diff --git a/source/blender/editors/armature/pose_slide.c b/source/blender/editors/armature/pose_slide.c
index 4b646bb26e2..d636f0d68af 100644
--- a/source/blender/editors/armature/pose_slide.c
+++ b/source/blender/editors/armature/pose_slide.c
@@ -689,7 +689,7 @@ static void pose_slide_rest_pose_apply(bContext *C, tPoseSlideOp *pso)
/* Not strictly a transform, but custom properties contribute
* to the pose produced in many rigs (e.g. the facial rigs used in Sintel). */
/* TODO Not implemented */
- // pose_slide_apply_props(pso, pfl, "[\""); /* dummy " for texteditor bugs */
+ // pose_slide_apply_props(pso, pfl, "[\"");
}
}
@@ -702,7 +702,7 @@ static void pose_slide_apply(bContext *C, tPoseSlideOp *pso)
{
tPChanFCurveLink *pfl;
- /* sanitise the frame ranges */
+ /* Sanitize the frame ranges. */
if (pso->prevFrame == pso->nextFrame) {
/* move out one step either side */
pso->prevFrame--;
@@ -765,7 +765,7 @@ static void pose_slide_apply(bContext *C, tPoseSlideOp *pso)
if (ELEM(pso->channels, PS_TFM_ALL, PS_TFM_PROPS) && (pfl->oldprops)) {
/* Not strictly a transform, but custom properties contribute
* to the pose produced in many rigs (e.g. the facial rigs used in Sintel). */
- pose_slide_apply_props(pso, pfl, "[\""); /* dummy " for texteditor bugs */
+ pose_slide_apply_props(pso, pfl, "[\"");
}
}
@@ -1125,7 +1125,7 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event)
if (event->val == KM_PRESS) {
switch (event->type) {
/* Transform Channel Limits */
- /* XXX: Replace these hardcoded hotkeys with a modalmap that can be customised */
+ /* XXX: Replace these hard-coded hotkeys with a modal-map that can be customized. */
case EVT_GKEY: /* Location */
{
pose_slide_toggle_channels_mode(op, pso, PS_TFM_LOC);
@@ -1183,7 +1183,7 @@ static int pose_slide_modal(bContext *C, wmOperator *op, const wmEvent *event)
}
}
else {
- /* unhandled event - maybe it was some view manip? */
+ /* unhandled event - maybe it was some view manipulation? */
/* allow to pass through */
return OPERATOR_RUNNING_MODAL | OPERATOR_PASS_THROUGH;
}
@@ -1246,15 +1246,15 @@ static void pose_slide_opdef_properties(wmOperatorType *ot)
{
PropertyRNA *prop;
- prop = RNA_def_float_percentage(ot->srna,
- "percentage",
- 0.5f,
- 0.0f,
- 1.0f,
- "Percentage",
- "Weighting factor for which keyframe is favored more",
- 0.0,
- 1.0);
+ prop = RNA_def_float_factor(ot->srna,
+ "factor",
+ 0.5f,
+ 0.0f,
+ 1.0f,
+ "Factor",
+ "Weighting factor for which keyframe is favored more",
+ 0.0,
+ 1.0);
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
prop = RNA_def_int(ot->srna,
diff --git a/source/blender/editors/armature/pose_transform.c b/source/blender/editors/armature/pose_transform.c
index 3505aea3f40..722865cc942 100644
--- a/source/blender/editors/armature/pose_transform.c
+++ b/source/blender/editors/armature/pose_transform.c
@@ -225,7 +225,7 @@ static void applyarmature_process_selected_recursive(bArmature *arm,
ApplyArmature_ParentState new_pstate = {.bone = bone};
if (BLI_findptr(selected, pchan, offsetof(CollectionPointerLink, ptr.data))) {
- /* SELECTED BONE: Snap to final pose transform minus unapplied parent effects.
+ /* SELECTED BONE: Snap to final pose transform minus un-applied parent effects.
*
* I.e. bone position with accumulated parent effects but no local
* transformation will match the original final pose_mat.
diff --git a/source/blender/editors/armature/pose_utils.c b/source/blender/editors/armature/pose_utils.c
index 2a6dc9f406b..c75e9c9ef69 100644
--- a/source/blender/editors/armature/pose_utils.c
+++ b/source/blender/editors/armature/pose_utils.c
@@ -33,7 +33,6 @@
#include "BKE_action.h"
#include "BKE_anim_data.h"
-#include "BKE_armature.h"
#include "BKE_idprop.h"
#include "BKE_layer.h"
#include "BKE_object.h"
@@ -312,7 +311,7 @@ void poseAnim_mapping_autoKeyframe(bContext *C, Scene *scene, ListBase *pfLinks,
continue;
}
- /* add datasource override for the PoseChannel, to be used later */
+ /* Add data-source override for the PoseChannel, to be used later. */
ANIM_relative_keyingset_add_source(&dsources, &pfl->ob->id, &RNA_PoseBone, pchan);
/* clear any unkeyed tags */
diff --git a/source/blender/editors/asset/CMakeLists.txt b/source/blender/editors/asset/CMakeLists.txt
index 6cd94783251..8c5f91561b7 100644
--- a/source/blender/editors/asset/CMakeLists.txt
+++ b/source/blender/editors/asset/CMakeLists.txt
@@ -29,8 +29,8 @@ set(INC_SYS
)
set(SRC
- asset_edit.c
- asset_ops.c
+ asset_edit.cc
+ asset_ops.cc
)
set(LIB
diff --git a/source/blender/editors/asset/asset_edit.c b/source/blender/editors/asset/asset_edit.cc
index 3dca87d3a03..d20de4141cb 100644
--- a/source/blender/editors/asset/asset_edit.c
+++ b/source/blender/editors/asset/asset_edit.cc
@@ -20,11 +20,9 @@
#include "BKE_asset.h"
#include "BKE_context.h"
-#include "BKE_idtype.h"
#include "BKE_lib_id.h"
#include "DNA_ID.h"
-#include "DNA_asset_types.h"
#include "UI_interface_icons.h"
@@ -45,7 +43,7 @@ bool ED_asset_mark_id(const bContext *C, ID *id)
id->asset_data = BKE_asset_metadata_create();
- UI_icon_render_id(C, NULL, id, ICON_SIZE_PREVIEW, true);
+ UI_icon_render_id(C, nullptr, id, ICON_SIZE_PREVIEW, true);
return true;
}
@@ -65,5 +63,5 @@ bool ED_asset_clear_id(ID *id)
bool ED_asset_can_make_single_from_context(const bContext *C)
{
/* Context needs a "id" pointer to be set for #ASSET_OT_mark()/#ASSET_OT_clear() to use. */
- return CTX_data_pointer_get_type_silent(C, "id", &RNA_ID).data != NULL;
+ return CTX_data_pointer_get_type_silent(C, "id", &RNA_ID).data != nullptr;
}
diff --git a/source/blender/editors/asset/asset_ops.c b/source/blender/editors/asset/asset_ops.c
deleted file mode 100644
index 29c3174f051..00000000000
--- a/source/blender/editors/asset/asset_ops.c
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-/** \file
- * \ingroup edasset
- */
-
-#include <string.h>
-
-#include "BKE_asset.h"
-#include "BKE_context.h"
-#include "BKE_report.h"
-
-#include "BLI_listbase.h"
-#include "BLI_string_utils.h"
-#include "BLI_utildefines.h"
-
-#include "DNA_asset_types.h"
-#include "DNA_userdef_types.h"
-
-#include "ED_asset.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "RNA_access.h"
-#include "RNA_define.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-/* -------------------------------------------------------------------- */
-
-struct AssetMarkResultStats {
- int tot_created;
- int tot_already_asset;
- ID *last_id;
-};
-
-static bool asset_ops_poll(bContext *UNUSED(C))
-{
- return U.experimental.use_asset_browser;
-}
-
-/**
- * Return the IDs to operate on as list of #CollectionPointerLink links. Needs freeing.
- */
-static ListBase /* CollectionPointerLink */ asset_operation_get_ids_from_context(const bContext *C)
-{
- ListBase list = {0};
-
- PointerRNA idptr = CTX_data_pointer_get_type(C, "id", &RNA_ID);
-
- if (idptr.data) {
- CollectionPointerLink *ctx_link = MEM_callocN(sizeof(*ctx_link), __func__);
- ctx_link->ptr = idptr;
- BLI_addtail(&list, ctx_link);
- }
- else {
- CTX_data_selected_ids(C, &list);
- }
-
- return list;
-}
-
-static void asset_mark_for_idptr_list(const bContext *C,
- const ListBase /* CollectionPointerLink */ *ids,
- struct AssetMarkResultStats *r_stats)
-{
- memset(r_stats, 0, sizeof(*r_stats));
-
- LISTBASE_FOREACH (CollectionPointerLink *, ctx_id, ids) {
- BLI_assert(RNA_struct_is_ID(ctx_id->ptr.type));
-
- ID *id = ctx_id->ptr.data;
- if (id->asset_data) {
- r_stats->tot_already_asset++;
- continue;
- }
-
- if (ED_asset_mark_id(C, id)) {
- r_stats->last_id = id;
- r_stats->tot_created++;
- }
- }
-}
-
-static bool asset_mark_results_report(const struct AssetMarkResultStats *stats,
- ReportList *reports)
-{
- /* User feedback on failure. */
- if ((stats->tot_created < 1) && (stats->tot_already_asset > 0)) {
- BKE_report(reports,
- RPT_ERROR,
- "Selected data-blocks are already assets (or do not support use as assets)");
- return false;
- }
- if (stats->tot_created < 1) {
- BKE_report(reports,
- RPT_ERROR,
- "No data-blocks to create assets for found (or do not support use as assets)");
- return false;
- }
-
- /* User feedback on success. */
- if (stats->tot_created == 1) {
- /* If only one data-block: Give more useful message by printing asset name. */
- BKE_reportf(reports, RPT_INFO, "Data-block '%s' is now an asset", stats->last_id->name + 2);
- }
- else {
- BKE_reportf(reports, RPT_INFO, "%i data-blocks are now assets", stats->tot_created);
- }
-
- return true;
-}
-
-static int asset_mark_exec(bContext *C, wmOperator *op)
-{
- ListBase ids = asset_operation_get_ids_from_context(C);
-
- struct AssetMarkResultStats stats;
- asset_mark_for_idptr_list(C, &ids, &stats);
- BLI_freelistN(&ids);
-
- if (!asset_mark_results_report(&stats, op->reports)) {
- return OPERATOR_CANCELLED;
- }
-
- WM_main_add_notifier(NC_ID | NA_EDITED, NULL);
- WM_main_add_notifier(NC_ASSET | NA_ADDED, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-static void ASSET_OT_mark(wmOperatorType *ot)
-{
- ot->name = "Mark Asset";
- ot->description =
- "Enable easier reuse of selected data-blocks through the Asset Browser, with the help of "
- "customizable metadata (like previews, descriptions and tags)";
- ot->idname = "ASSET_OT_mark";
-
- ot->exec = asset_mark_exec;
- ot->poll = asset_ops_poll;
-
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-}
-
-/* -------------------------------------------------------------------- */
-
-struct AssetClearResultStats {
- int tot_removed;
- ID *last_id;
-};
-
-static void asset_clear_from_idptr_list(const ListBase /* CollectionPointerLink */ *ids,
- struct AssetClearResultStats *r_stats)
-{
- memset(r_stats, 0, sizeof(*r_stats));
-
- LISTBASE_FOREACH (CollectionPointerLink *, ctx_id, ids) {
- BLI_assert(RNA_struct_is_ID(ctx_id->ptr.type));
-
- ID *id = ctx_id->ptr.data;
- if (!id->asset_data) {
- continue;
- }
-
- if (ED_asset_clear_id(id)) {
- r_stats->tot_removed++;
- r_stats->last_id = id;
- }
- }
-}
-
-static bool asset_clear_result_report(const struct AssetClearResultStats *stats,
- ReportList *reports)
-
-{
- if (stats->tot_removed < 1) {
- BKE_report(reports, RPT_ERROR, "No asset data-blocks selected/focused");
- return false;
- }
-
- if (stats->tot_removed == 1) {
- /* If only one data-block: Give more useful message by printing asset name. */
- BKE_reportf(
- reports, RPT_INFO, "Data-block '%s' is no asset anymore", stats->last_id->name + 2);
- }
- else {
- BKE_reportf(reports, RPT_INFO, "%i data-blocks are no assets anymore", stats->tot_removed);
- }
-
- return true;
-}
-
-static int asset_clear_exec(bContext *C, wmOperator *op)
-{
- ListBase ids = asset_operation_get_ids_from_context(C);
-
- struct AssetClearResultStats stats;
- asset_clear_from_idptr_list(&ids, &stats);
- BLI_freelistN(&ids);
-
- if (!asset_clear_result_report(&stats, op->reports)) {
- return OPERATOR_CANCELLED;
- }
-
- WM_main_add_notifier(NC_ID | NA_EDITED, NULL);
- WM_main_add_notifier(NC_ASSET | NA_REMOVED, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-static void ASSET_OT_clear(wmOperatorType *ot)
-{
- ot->name = "Clear Asset";
- ot->description =
- "Delete all asset metadata and turn the selected asset data-blocks back into normal "
- "data-blocks";
- ot->idname = "ASSET_OT_clear";
-
- ot->exec = asset_clear_exec;
- ot->poll = asset_ops_poll;
-
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-}
-
-/* -------------------------------------------------------------------- */
-
-void ED_operatortypes_asset(void)
-{
- WM_operatortype_append(ASSET_OT_mark);
- WM_operatortype_append(ASSET_OT_clear);
-}
diff --git a/source/blender/editors/asset/asset_ops.cc b/source/blender/editors/asset/asset_ops.cc
new file mode 100644
index 00000000000..8ca1b488a1d
--- /dev/null
+++ b/source/blender/editors/asset/asset_ops.cc
@@ -0,0 +1,259 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup edasset
+ */
+
+#include "BKE_context.h"
+#include "BKE_report.h"
+
+#include "BLI_vector.hh"
+
+#include "ED_asset.h"
+
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+/* -------------------------------------------------------------------- */
+
+using PointerRNAVec = blender::Vector<PointerRNA>;
+
+static bool asset_operation_poll(bContext * /*C*/)
+{
+ return U.experimental.use_asset_browser;
+}
+
+/**
+ * Return the IDs to operate on as PointerRNA vector. Either a single one ("id" context member) or
+ * multiple ones ("selected_ids" context member).
+ */
+static PointerRNAVec asset_operation_get_ids_from_context(const bContext *C)
+{
+ PointerRNAVec ids;
+
+ PointerRNA idptr = CTX_data_pointer_get_type(C, "id", &RNA_ID);
+ if (idptr.data) {
+ /* Single ID. */
+ ids.append(idptr);
+ }
+ else {
+ ListBase list;
+ CTX_data_selected_ids(C, &list);
+ LISTBASE_FOREACH (CollectionPointerLink *, link, &list) {
+ ids.append(link->ptr);
+ }
+ BLI_freelistN(&list);
+ }
+
+ return ids;
+}
+
+/* -------------------------------------------------------------------- */
+
+class AssetMarkHelper {
+ public:
+ void operator()(const bContext &C, PointerRNAVec &ids);
+
+ void reportResults(ReportList &reports) const;
+ bool wasSuccessful() const;
+
+ private:
+ struct Stats {
+ int tot_created = 0;
+ int tot_already_asset = 0;
+ ID *last_id = nullptr;
+ };
+
+ Stats stats;
+};
+
+void AssetMarkHelper::operator()(const bContext &C, PointerRNAVec &ids)
+{
+ for (PointerRNA &ptr : ids) {
+ BLI_assert(RNA_struct_is_ID(ptr.type));
+
+ ID *id = static_cast<ID *>(ptr.data);
+ if (id->asset_data) {
+ stats.tot_already_asset++;
+ continue;
+ }
+
+ if (ED_asset_mark_id(&C, id)) {
+ stats.last_id = id;
+ stats.tot_created++;
+ }
+ }
+}
+
+bool AssetMarkHelper::wasSuccessful() const
+{
+ return stats.tot_created > 0;
+}
+
+void AssetMarkHelper::reportResults(ReportList &reports) const
+{
+ /* User feedback on failure. */
+ if (!wasSuccessful()) {
+ if ((stats.tot_already_asset > 0)) {
+ BKE_report(&reports,
+ RPT_ERROR,
+ "Selected data-blocks are already assets (or do not support use as assets)");
+ }
+ else {
+ BKE_report(&reports,
+ RPT_ERROR,
+ "No data-blocks to create assets for found (or do not support use as assets)");
+ }
+ }
+ /* User feedback on success. */
+ else if (stats.tot_created == 1) {
+ /* If only one data-block: Give more useful message by printing asset name. */
+ BKE_reportf(&reports, RPT_INFO, "Data-block '%s' is now an asset", stats.last_id->name + 2);
+ }
+ else {
+ BKE_reportf(&reports, RPT_INFO, "%i data-blocks are now assets", stats.tot_created);
+ }
+}
+
+static int asset_mark_exec(bContext *C, wmOperator *op)
+{
+ PointerRNAVec ids = asset_operation_get_ids_from_context(C);
+
+ AssetMarkHelper mark_helper;
+ mark_helper(*C, ids);
+ mark_helper.reportResults(*op->reports);
+
+ if (!mark_helper.wasSuccessful()) {
+ return OPERATOR_CANCELLED;
+ }
+
+ WM_main_add_notifier(NC_ID | NA_EDITED, nullptr);
+ WM_main_add_notifier(NC_ASSET | NA_ADDED, nullptr);
+
+ return OPERATOR_FINISHED;
+}
+
+static void ASSET_OT_mark(wmOperatorType *ot)
+{
+ ot->name = "Mark Asset";
+ ot->description =
+ "Enable easier reuse of selected data-blocks through the Asset Browser, with the help of "
+ "customizable metadata (like previews, descriptions and tags)";
+ ot->idname = "ASSET_OT_mark";
+
+ ot->exec = asset_mark_exec;
+ ot->poll = asset_operation_poll;
+
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+/* -------------------------------------------------------------------- */
+
+class AssetClearHelper {
+ public:
+ void operator()(PointerRNAVec &ids);
+
+ void reportResults(ReportList &reports) const;
+ bool wasSuccessful() const;
+
+ private:
+ struct Stats {
+ int tot_cleared = 0;
+ ID *last_id = nullptr;
+ };
+
+ Stats stats;
+};
+
+void AssetClearHelper::operator()(PointerRNAVec &ids)
+{
+ for (PointerRNA &ptr : ids) {
+ BLI_assert(RNA_struct_is_ID(ptr.type));
+
+ ID *id = static_cast<ID *>(ptr.data);
+ if (!id->asset_data) {
+ continue;
+ }
+
+ if (ED_asset_clear_id(id)) {
+ stats.tot_cleared++;
+ stats.last_id = id;
+ }
+ }
+}
+
+void AssetClearHelper::reportResults(ReportList &reports) const
+{
+ if (!wasSuccessful()) {
+ BKE_report(&reports, RPT_ERROR, "No asset data-blocks selected/focused");
+ }
+ else if (stats.tot_cleared == 1) {
+ /* If only one data-block: Give more useful message by printing asset name. */
+ BKE_reportf(
+ &reports, RPT_INFO, "Data-block '%s' is no asset anymore", stats.last_id->name + 2);
+ }
+ else {
+ BKE_reportf(&reports, RPT_INFO, "%i data-blocks are no assets anymore", stats.tot_cleared);
+ }
+}
+
+bool AssetClearHelper::wasSuccessful() const
+{
+ return stats.tot_cleared > 0;
+}
+
+static int asset_clear_exec(bContext *C, wmOperator *op)
+{
+ PointerRNAVec ids = asset_operation_get_ids_from_context(C);
+
+ AssetClearHelper clear_helper;
+ clear_helper(ids);
+ clear_helper.reportResults(*op->reports);
+
+ if (!clear_helper.wasSuccessful()) {
+ return OPERATOR_CANCELLED;
+ }
+
+ WM_main_add_notifier(NC_ID | NA_EDITED, nullptr);
+ WM_main_add_notifier(NC_ASSET | NA_REMOVED, nullptr);
+
+ return OPERATOR_FINISHED;
+}
+
+static void ASSET_OT_clear(wmOperatorType *ot)
+{
+ ot->name = "Clear Asset";
+ ot->description =
+ "Delete all asset metadata and turn the selected asset data-blocks back into normal "
+ "data-blocks";
+ ot->idname = "ASSET_OT_clear";
+
+ ot->exec = asset_clear_exec;
+ ot->poll = asset_operation_poll;
+
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+/* -------------------------------------------------------------------- */
+
+void ED_operatortypes_asset(void)
+{
+ WM_operatortype_append(ASSET_OT_mark);
+ WM_operatortype_append(ASSET_OT_clear);
+}
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index e9ceedf7ce2..0593cedb5a1 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -2419,7 +2419,7 @@ static void adduplicateflagNurb(
memcpy(newnu->bp, &nu->bp[a], newu * newv * sizeof(BPoint));
memcpy(&newnu->bp[newu * newv], nu->bp, newu * cyclicv * sizeof(BPoint));
- /* check for actvert in cylicv selection */
+ /* check for actvert in cyclicv selection */
if (cu->actnu == i) {
calc_duplicate_actvert(
editnurb, newnurb, cu, cu->actvert, a, (newu * newv) + cu->actvert);
@@ -2474,7 +2474,7 @@ static void adduplicateflagNurb(
memcpy(&newnu->bp[b * newu], &nu->bp[b * nu->pntsu], newu * sizeof(BPoint));
}
- /* check for actvert in the unused cyclicuv selection */
+ /* Check for `actvert` in the unused cyclic-UV selection. */
if (cu->actnu == i) {
if (cu->actvert == -1) {
calc_duplicate_actnurb(editnurb, newnurb, cu);
@@ -3111,7 +3111,7 @@ void CURVE_OT_smooth_weight(wmOperatorType *ot)
ot->description = "Interpolate weight of selected points";
ot->idname = "CURVE_OT_smooth_weight";
- /* api clastbacks */
+ /* api callbacks */
ot->exec = curve_smooth_weight_exec;
ot->poll = ED_operator_editsurfcurve;
@@ -3154,7 +3154,7 @@ void CURVE_OT_smooth_radius(wmOperatorType *ot)
ot->description = "Interpolate radii of selected points";
ot->idname = "CURVE_OT_smooth_radius";
- /* api clastbacks */
+ /* api callbacks */
ot->exec = curve_smooth_radius_exec;
ot->poll = ED_operator_editsurfcurve;
@@ -3197,7 +3197,7 @@ void CURVE_OT_smooth_tilt(wmOperatorType *ot)
ot->description = "Interpolate tilt of selected points";
ot->idname = "CURVE_OT_smooth_tilt";
- /* api clastbacks */
+ /* api callbacks */
ot->exec = curve_smooth_tilt_exec;
ot->poll = ED_operator_editsurfcurve;
@@ -6102,7 +6102,7 @@ static bool curve_delete_segments(Object *obedit, View3D *v3d, const bool split)
}
if (!split && cut != -1 && nu->pntsu > 2 && !(nu->flagu & CU_NURB_CYCLIC)) {
- /* start and points copied if connecting segment was deleted and not cylic spline */
+ /* start and points copied if connecting segment was deleted and not cyclic spline */
bezt1 = nu->bezt;
bezt2 = &nu->bezt[1];
@@ -6232,7 +6232,7 @@ static bool curve_delete_segments(Object *obedit, View3D *v3d, const bool split)
}
if (!split && cut != -1 && nu->pntsu > 2 && !(nu->flagu & CU_NURB_CYCLIC)) {
- /* start and points copied if connecting segment was deleted and not cylic spline */
+ /* start and points copied if connecting segment was deleted and not cyclic spline */
bp1 = nu->bp;
bp2 = &nu->bp[1];
@@ -6352,7 +6352,7 @@ static bool curve_delete_segments(Object *obedit, View3D *v3d, const bool split)
}
if (!split && cut != -1 && nu->pntsv > 2 && !(nu->flagv & CU_NURB_CYCLIC)) {
- /* start and points copied if connecting segment was deleted and not cylic spline */
+ /* start and points copied if connecting segment was deleted and not cyclic spline */
bp1 = nu->bp;
bp2 = &nu->bp[nu->pntsu];
diff --git a/source/blender/editors/curve/editcurve_select.c b/source/blender/editors/curve/editcurve_select.c
index 4097275a2b9..d362ec23370 100644
--- a/source/blender/editors/curve/editcurve_select.c
+++ b/source/blender/editors/curve/editcurve_select.c
@@ -501,7 +501,7 @@ void CURVE_OT_de_select_first(wmOperatorType *ot)
ot->idname = "CURVE_OT_de_select_first";
ot->description = "(De)select first of visible part of each NURBS";
- /* api cfirstbacks */
+ /* api callbacks */
ot->exec = de_select_first_exec;
ot->poll = ED_operator_editcurve;
@@ -535,7 +535,7 @@ void CURVE_OT_de_select_last(wmOperatorType *ot)
ot->idname = "CURVE_OT_de_select_last";
ot->description = "(De)select last of visible part of each NURBS";
- /* api clastbacks */
+ /* api callbacks */
ot->exec = de_select_last_exec;
ot->poll = ED_operator_editcurve;
@@ -1242,7 +1242,7 @@ static void curve_select_random(ListBase *editnurb, float randfac, int seed, boo
static int curve_select_random_exec(bContext *C, wmOperator *op)
{
const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
- const float randfac = RNA_float_get(op->ptr, "percent") / 100.0f;
+ const float randfac = RNA_float_get(op->ptr, "ratio");
const int seed = WM_operator_properties_select_random_seed_increment_get(op);
ViewLayer *view_layer = CTX_data_view_layer(C);
diff --git a/source/blender/editors/curve/editcurve_undo.c b/source/blender/editors/curve/editcurve_undo.c
index 534d29c0cc7..681f387e83e 100644
--- a/source/blender/editors/curve/editcurve_undo.c
+++ b/source/blender/editors/curve/editcurve_undo.c
@@ -238,8 +238,11 @@ static bool curve_undosys_step_encode(struct bContext *C, struct Main *bmain, Un
return true;
}
-static void curve_undosys_step_decode(
- struct bContext *C, struct Main *bmain, UndoStep *us_p, int UNUSED(dir), bool UNUSED(is_final))
+static void curve_undosys_step_decode(struct bContext *C,
+ struct Main *bmain,
+ UndoStep *us_p,
+ const eUndoStepDir UNUSED(dir),
+ bool UNUSED(is_final))
{
CurveUndoStep *us = (CurveUndoStep *)us_p;
diff --git a/source/blender/editors/curve/editfont_undo.c b/source/blender/editors/curve/editfont_undo.c
index 8559234b62f..88f3ed0582c 100644
--- a/source/blender/editors/curve/editfont_undo.c
+++ b/source/blender/editors/curve/editfont_undo.c
@@ -279,7 +279,7 @@ static void *undofont_from_editfont(UndoFont *uf, Curve *cu)
((LinkData *)uf_arraystore.local_links.last)->data :
NULL;
- /* add oursrlves */
+ /* Add ourselves. */
BLI_addtail(&uf_arraystore.local_links, BLI_genericNodeN(uf));
uf_arraystore_compact_with_info(uf, uf_ref);
@@ -356,8 +356,11 @@ static bool font_undosys_step_encode(struct bContext *C, struct Main *bmain, Und
return true;
}
-static void font_undosys_step_decode(
- struct bContext *C, struct Main *bmain, UndoStep *us_p, int UNUSED(dir), bool UNUSED(is_final))
+static void font_undosys_step_decode(struct bContext *C,
+ struct Main *bmain,
+ UndoStep *us_p,
+ const eUndoStepDir UNUSED(dir),
+ bool UNUSED(is_final))
{
/* TODO(campbell): undo_system: use low-level API to set mode. */
ED_object_mode_set_ex(C, OB_MODE_EDIT, false, NULL);
diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt
index bd37df49e39..4c0d1b65465 100644
--- a/source/blender/editors/datafiles/CMakeLists.txt
+++ b/source/blender/editors/datafiles/CMakeLists.txt
@@ -53,6 +53,9 @@ set(ICON_NAMES
collapsemenu
x
duplicate
+ trash
+ collection_new
+ options
node
node_sel
window
@@ -65,6 +68,7 @@ set(ICON_NAMES
panel_close
copy_id
eyedropper
+ checkmark
auto
checkbox_dehlt
checkbox_hlt
@@ -75,6 +79,10 @@ set(ICON_NAMES
screen_back
rightarrow
downarrow_hlt
+ fcurve_snapshot
+ object_hidden
+ topbar
+ statusbar
plugin
help
ghost_enabled
@@ -101,6 +109,7 @@ set(ICON_NAMES
three_dots
fullscreen_enter
fullscreen_exit
+ brushes_all
light
material
texture
@@ -132,7 +141,7 @@ set(ICON_NAMES
time
nodetree
console
- clip
+ tracker
asset_manager
node_compositing
node_texture
@@ -140,6 +149,7 @@ set(ICON_NAMES
object_datamode
editmode_hlt
uv
+ uv_data
vpaint_hlt
tpaint_hlt
wpaint_hlt
@@ -213,6 +223,7 @@ set(ICON_NAMES
mouse_lmb_drag
mouse_mmb_drag
mouse_rmb_drag
+ memory
preset_new
decorate
decorate_keyframe
@@ -223,7 +234,8 @@ set(ICON_NAMES
decorate_unlocked
decorate_locked
decorate_override
- sealed
+ fund
+ tracker_data
heart
orphan_data
user
@@ -245,6 +257,7 @@ set(ICON_NAMES
outliner_ob_greasepencil
outliner_ob_lightprobe
outliner_ob_image
+ outliner_collection
restrict_color_off
restrict_color_on
hide_on
@@ -253,6 +266,7 @@ set(ICON_NAMES
restrict_select_off
restrict_render_on
restrict_render_off
+ restrict_instanced_off
outliner_data_empty
outliner_data_mesh
outliner_data_curve
@@ -264,17 +278,21 @@ set(ICON_NAMES
outliner_data_font
outliner_data_surface
outliner_data_speaker
+ outliner_data_lightprobe
+ outliner_data_gp_layer
outliner_data_greasepencil
gp_select_points
gp_select_strokes
gp_multiframe_editing
gp_only_selected
+ gp_select_between_strokes
modifier_off
modifier_on
onionskin_off
onionskin_on
restrict_view_on
restrict_view_off
+ restrict_instanced_on
mesh_plane
mesh_cube
mesh_circle
@@ -337,6 +355,8 @@ set(ICON_NAMES
force_turbulence
force_drag
force_fluidflow
+ rigid_body
+ rigid_body_constraint
image_plane
image_background
image_reference
@@ -345,6 +365,16 @@ set(ICON_NAMES
node_top
node_side
node_corner
+ anchor_top
+ anchor_bottom
+ anchor_left
+ anchor_right
+ anchor_center
+ select_set
+ select_extend
+ select_subtract
+ select_intersect
+ select_difference
align_left
align_center
align_right
@@ -358,6 +388,38 @@ set(ICON_NAMES
underline
small_caps
modifier
+ con_action
+ holdout_off
+ holdout_on
+ indirect_only_off
+ indirect_only_on
+ con_camerasolver
+ con_followtrack
+ con_objectsolver
+ con_loclike
+ con_rotlike
+ con_sizelike
+ con_translike
+ con_distlimit
+ con_loclimit
+ con_rotlimit
+ con_sizelimit
+ con_samevol
+ con_transform
+ con_transform_cache
+ con_clampto
+ con_kinematic
+ con_locktrack
+ con_splineik
+ con_stretchto
+ con_trackto
+ con_armature
+ con_childof
+ con_floor
+ con_followpath
+ con_pivot
+ con_shrinkwrap
+ modifier_data
mod_wave
mod_build
mod_decim
@@ -385,6 +447,7 @@ set(ICON_NAMES
mod_mask
mod_cloth
mod_explode
+ mod_fluidsim
mod_multires
mod_fluid
mod_solidify
@@ -415,6 +478,7 @@ set(ICON_NAMES
pause
prev_keyframe
next_keyframe
+ play_sound
play_reverse
preview_range
action_tweak
@@ -456,6 +520,7 @@ set(ICON_NAMES
vertexsel
edgesel
facesel
+ cursor
pivot_boundbox
pivot_cursor
pivot_individual
@@ -464,6 +529,7 @@ set(ICON_NAMES
center_only
smoothcurve
spherecurve
+ inversesquarecurve
rootcurve
sharpcurve
lincurve
@@ -472,10 +538,13 @@ set(ICON_NAMES
prop_off
prop_on
prop_con
- sculpt_dyntopo
+ prop_projected
particle_point
particle_tip
particle_path
+ snap_face_center
+ snap_perpendicular
+ snap_midpoint
snap_off
snap_on
snap_normal
@@ -513,6 +582,9 @@ set(ICON_NAMES
uv_facesel
uv_islandsel
uv_sync_select
+ transform_origins
+ gizmo
+ orientation_cursor
normals_vertex
normals_face
normals_vertex_face
@@ -530,6 +602,18 @@ set(ICON_NAMES
axis_top
layer_used
layer_active
+ outliner_ob_hair
+ outliner_data_hair
+ hair_data
+ outliner_ob_pointcloud
+ outliner_data_pointcloud
+ pointcloud_data
+ outliner_ob_volume
+ outliner_data_volume
+ volume_data
+ home
+ documents
+ temp
sortalpha
sortbyext
sorttime
@@ -541,6 +625,7 @@ set(ICON_NAMES
fontpreview
filter
newfolder
+ folder_redirect
file_parent
file_refresh
file_folder
@@ -562,6 +647,7 @@ set(ICON_NAMES
loop_forwards
back
forward
+ file_archive
file_cache
file_volume
file_3d
@@ -586,16 +672,27 @@ set(ICON_NAMES
linenumbers_off
linenumbers_on
scriptplugins
+ disc
+ desktop
+ external_drive
+ network_drive
seq_sequencer
seq_preview
seq_luma_waveform
seq_chroma_scope
seq_histogram
seq_splitview
+ seq_strip_meta
+ seq_strip_duplicate
image_rgb
image_rgb_alpha
image_alpha
image_zdepth
+ handle_autoclamped
+ handle_auto
+ handle_aligned
+ handle_vector
+ handle_free
view_perspective
view_ortho
view_camera
diff --git a/source/blender/editors/geometry/geometry_attributes.c b/source/blender/editors/geometry/geometry_attributes.c
index 4106c03f17d..2807e7c4392 100644
--- a/source/blender/editors/geometry/geometry_attributes.c
+++ b/source/blender/editors/geometry/geometry_attributes.c
@@ -23,7 +23,6 @@
#include "BKE_attribute.h"
#include "BKE_context.h"
-#include "BKE_report.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -34,7 +33,6 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_geometry.h"
#include "ED_object.h"
#include "geometry_intern.h"
diff --git a/source/blender/editors/gizmo_library/gizmo_library_presets.c b/source/blender/editors/gizmo_library/gizmo_library_presets.c
index 9039851da01..4e56ceb9fd4 100644
--- a/source/blender/editors/gizmo_library/gizmo_library_presets.c
+++ b/source/blender/editors/gizmo_library/gizmo_library_presets.c
@@ -22,12 +22,9 @@
* \brief Preset shapes that can be drawn from any gizmo type.
*/
-#include "MEM_guardedalloc.h"
-
#include "BLI_math.h"
#include "DNA_object_types.h"
-#include "DNA_view3d_types.h"
#include "BKE_context.h"
@@ -36,12 +33,8 @@
#include "DEG_depsgraph.h"
-#include "RNA_access.h"
-
-#include "WM_api.h"
#include "WM_types.h"
-#include "ED_screen.h"
#include "ED_view3d.h"
/* own includes */
diff --git a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c
index d4d9f9bf424..d506af4450a 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c
@@ -446,7 +446,6 @@ static void gizmo_arrow_exit(bContext *C, wmGizmo *gz, const bool cancel)
/* -------------------------------------------------------------------- */
/** \name Arrow Gizmo API
- *
* \{ */
/**
diff --git a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c
index 5617b6e125e..b1c8efcfafc 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c
@@ -28,14 +28,11 @@
#include "BKE_context.h"
#include "ED_gizmo_library.h"
-#include "ED_view3d.h"
#include "WM_api.h"
#include "WM_types.h"
/* own includes */
-#include "../gizmo_geometry.h"
-#include "../gizmo_library_intern.h"
static void gizmo_blank_draw(const bContext *UNUSED(C), wmGizmo *UNUSED(gz))
{
@@ -58,7 +55,6 @@ static int gizmo_blank_test_select(bContext *UNUSED(C),
/* -------------------------------------------------------------------- */
/** \name Blank Gizmo API
- *
* \{ */
static void GIZMO_GT_blank_3d(wmGizmoType *gzt)
diff --git a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
index eb40500d011..f4c4e4eb2ac 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
@@ -320,6 +320,16 @@ static int gizmo_button2d_cursor_get(wmGizmo *gz)
return WM_CURSOR_DEFAULT;
}
+static void gizmo_button2d_bounds(bContext *C, wmGizmo *gz, rcti *r_bounding_box)
+{
+ ScrArea *area = CTX_wm_area(C);
+ float rad = CIRCLE_RESOLUTION * U.dpi_fac / 2.0f;
+ r_bounding_box->xmin = gz->matrix_basis[3][0] + area->totrct.xmin - rad;
+ r_bounding_box->ymin = gz->matrix_basis[3][1] + area->totrct.ymin - rad;
+ r_bounding_box->xmax = r_bounding_box->xmin + rad;
+ r_bounding_box->ymax = r_bounding_box->ymin + rad;
+}
+
static void gizmo_button2d_free(wmGizmo *gz)
{
ButtonGizmo2D *shape = (ButtonGizmo2D *)gz;
@@ -333,7 +343,6 @@ static void gizmo_button2d_free(wmGizmo *gz)
/* -------------------------------------------------------------------- */
/** \name Button Gizmo API
- *
* \{ */
static void GIZMO_GT_button_2d(wmGizmoType *gzt)
@@ -346,6 +355,7 @@ static void GIZMO_GT_button_2d(wmGizmoType *gzt)
gzt->draw_select = gizmo_button2d_draw_select;
gzt->test_select = gizmo_button2d_test_select;
gzt->cursor_get = gizmo_button2d_cursor_get;
+ gzt->screen_bounds_get = gizmo_button2d_bounds;
gzt->free = gizmo_button2d_free;
gzt->struct_size = sizeof(ButtonGizmo2D);
diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
index be5f488d759..deb89319f4f 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
@@ -1145,7 +1145,6 @@ static void gizmo_cage2d_exit(bContext *C, wmGizmo *gz, const bool cancel)
/* -------------------------------------------------------------------- */
/** \name Cage Gizmo API
- *
* \{ */
static void GIZMO_GT_cage_2d(wmGizmoType *gzt)
diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c
index f7ab1732457..07117c0153b 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c
@@ -635,7 +635,6 @@ static void gizmo_cage3d_exit(bContext *C, wmGizmo *gz, const bool cancel)
/* -------------------------------------------------------------------- */
/** \name Cage Gizmo API
- *
* \{ */
static void GIZMO_GT_cage_3d(wmGizmoType *gzt)
diff --git a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
index e1860d5d0fd..6345cd3525a 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
@@ -595,7 +595,6 @@ static int gizmo_dial_invoke(bContext *UNUSED(C), wmGizmo *gz, const wmEvent *ev
/* -------------------------------------------------------------------- */
/** \name Dial Gizmo API
- *
* \{ */
void ED_gizmotypes_dial_3d_draw_util(const float matrix_basis[4][4],
diff --git a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c
index 011563eece5..364444f99ae 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c
@@ -434,7 +434,6 @@ static int gizmo_move_cursor_get(wmGizmo *UNUSED(gz))
/* -------------------------------------------------------------------- */
/** \name Move Gizmo API
- *
* \{ */
static void GIZMO_GT_move_3d(wmGizmoType *gzt)
diff --git a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c
index 177687b6afd..7e6a728ee80 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c
@@ -149,7 +149,6 @@ static int gizmo_primitive_invoke(bContext *UNUSED(C), wmGizmo *gz, const wmEven
/* -------------------------------------------------------------------- */
/** \name Primitive Gizmo API
- *
* \{ */
static void GIZMO_GT_primitive_3d(wmGizmoType *gzt)
diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c
index 1b53141294e..c8bd38d58fe 100644
--- a/source/blender/editors/gpencil/annotate_paint.c
+++ b/source/blender/editors/gpencil/annotate_paint.c
@@ -444,13 +444,13 @@ static void annotation_stroke_arrow_calc_points_segment(float stroke_points[8],
const float ref_point[2],
const float dir_cw[2],
const float dir_ccw[2],
- const float lenght,
+ const float length,
const float sign)
{
- stroke_points[0] = ref_point[0] + dir_cw[0] * lenght * sign;
- stroke_points[1] = ref_point[1] + dir_cw[1] * lenght * sign;
- stroke_points[2] = ref_point[0] + dir_ccw[0] * lenght * sign;
- stroke_points[3] = ref_point[1] + dir_ccw[1] * lenght * sign;
+ stroke_points[0] = ref_point[0] + dir_cw[0] * length * sign;
+ stroke_points[1] = ref_point[1] + dir_cw[1] * length * sign;
+ stroke_points[2] = ref_point[0] + dir_ccw[0] * length * sign;
+ stroke_points[3] = ref_point[1] + dir_ccw[1] * length * sign;
}
static void annotation_stroke_arrow_calc_points(tGPspoint *point,
@@ -459,7 +459,7 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point,
float stroke_points[8],
const int arrow_style)
{
- const int arrow_lenght = 8;
+ const int arrow_length = 8;
float norm_dir[2];
copy_v2_v2(norm_dir, stroke_dir);
normalize_v2(norm_dir);
@@ -468,22 +468,22 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point,
switch (arrow_style) {
case GP_STROKE_ARROWSTYLE_OPEN:
- mul_v2_fl(norm_dir, arrow_lenght);
- stroke_points[0] = corner[0] + inv_norm_dir_clockwise[0] * arrow_lenght + norm_dir[0];
- stroke_points[1] = corner[1] + inv_norm_dir_clockwise[1] * arrow_lenght + norm_dir[1];
- stroke_points[2] = corner[0] + inv_norm_dir_counterclockwise[0] * arrow_lenght + norm_dir[0];
- stroke_points[3] = corner[1] + inv_norm_dir_counterclockwise[1] * arrow_lenght + norm_dir[1];
+ mul_v2_fl(norm_dir, arrow_length);
+ stroke_points[0] = corner[0] + inv_norm_dir_clockwise[0] * arrow_length + norm_dir[0];
+ stroke_points[1] = corner[1] + inv_norm_dir_clockwise[1] * arrow_length + norm_dir[1];
+ stroke_points[2] = corner[0] + inv_norm_dir_counterclockwise[0] * arrow_length + norm_dir[0];
+ stroke_points[3] = corner[1] + inv_norm_dir_counterclockwise[1] * arrow_length + norm_dir[1];
break;
case GP_STROKE_ARROWSTYLE_SEGMENT:
annotation_stroke_arrow_calc_points_segment(stroke_points,
corner,
inv_norm_dir_clockwise,
inv_norm_dir_counterclockwise,
- arrow_lenght,
+ arrow_length,
1.0f);
break;
case GP_STROKE_ARROWSTYLE_CLOSED:
- mul_v2_fl(norm_dir, arrow_lenght);
+ mul_v2_fl(norm_dir, arrow_length);
if (point != NULL) {
add_v2_v2(&point->x, norm_dir);
copy_v2_v2(corner, &point->x);
@@ -492,13 +492,13 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point,
corner,
inv_norm_dir_clockwise,
inv_norm_dir_counterclockwise,
- arrow_lenght,
+ arrow_length,
-1.0f);
stroke_points[4] = corner[0] - norm_dir[0];
stroke_points[5] = corner[1] - norm_dir[1];
break;
case GP_STROKE_ARROWSTYLE_SQUARE:
- mul_v2_fl(norm_dir, arrow_lenght * 1.5f);
+ mul_v2_fl(norm_dir, arrow_length * 1.5f);
if (point != NULL) {
add_v2_v2(&point->x, norm_dir);
copy_v2_v2(corner, &point->x);
@@ -507,7 +507,7 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point,
corner,
inv_norm_dir_clockwise,
inv_norm_dir_counterclockwise,
- arrow_lenght * 0.75f,
+ arrow_length * 0.75f,
-1.0f);
stroke_points[4] = stroke_points[0] - norm_dir[0];
stroke_points[5] = stroke_points[1] - norm_dir[1];
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 4e2951c3571..751f8333aaa 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -171,7 +171,8 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw,
int totpoints = tgpw->gps->totpoints;
const float viewport[2] = {(float)tgpw->winx, (float)tgpw->winy};
- float curpressure = points[0].pressure;
+ const float min_thickness = 0.05f;
+
float fpt[3];
/* if cyclic needs more vertex */
@@ -205,7 +206,6 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw,
immUniform1i("fill_stroke", (int)tgpw->is_fill_stroke);
/* draw stroke curve */
- GPU_line_width(max_ff(curpressure * thickness, 1.0f));
immBeginAtMost(GPU_PRIM_LINE_STRIP_ADJ, totpoints + cyclic_add + 2);
const bGPDspoint *pt = points;
@@ -215,18 +215,19 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw,
gpencil_set_point_varying_color(points, ink, attr_id.color, (bool)tgpw->is_fill_stroke);
if ((cyclic) && (totpoints > 2)) {
- immAttr1f(attr_id.thickness, max_ff((points + totpoints - 1)->pressure * thickness, 1.0f));
+ immAttr1f(attr_id.thickness,
+ max_ff((points + totpoints - 1)->pressure * thickness, min_thickness));
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 1)->x);
}
else {
- immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, 1.0f));
+ immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, min_thickness));
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x);
}
immVertex3fv(attr_id.pos, fpt);
}
/* set point */
gpencil_set_point_varying_color(pt, ink, attr_id.color, (bool)tgpw->is_fill_stroke);
- immAttr1f(attr_id.thickness, max_ff(pt->pressure * thickness, 1.0f));
+ immAttr1f(attr_id.thickness, max_ff(pt->pressure * thickness, min_thickness));
mul_v3_m4v3(fpt, tgpw->diff_mat, &pt->x);
immVertex3fv(attr_id.pos, fpt);
}
diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c
index aae31b11025..166111c582c 100644
--- a/source/blender/editors/gpencil/editaction_gpencil.c
+++ b/source/blender/editors/gpencil/editaction_gpencil.c
@@ -276,7 +276,7 @@ void ED_gpencil_layer_frames_duplicate(bGPDlayer *gpl)
bGPDframe *gpfd;
/* duplicate frame, and deselect self */
- gpfd = BKE_gpencil_frame_duplicate(gpf);
+ gpfd = BKE_gpencil_frame_duplicate(gpf, true);
gpf->flag &= ~GP_FRAME_SELECT;
BLI_insertlinkafter(&gpl->frames, gpf, gpfd);
@@ -361,7 +361,7 @@ bool ED_gpencil_anim_copybuf_copy(bAnimContext *ac)
/* if frame is selected, make duplicate it and its strokes */
if (gpf->flag & GP_FRAME_SELECT) {
/* make a copy of this frame */
- bGPDframe *new_frame = BKE_gpencil_frame_duplicate(gpf);
+ bGPDframe *new_frame = BKE_gpencil_frame_duplicate(gpf, true);
BLI_addtail(&copied_frames, new_frame);
/* extend extents for keyframes encountered */
diff --git a/source/blender/editors/gpencil/gpencil_add_monkey.c b/source/blender/editors/gpencil/gpencil_add_monkey.c
index 65141442237..d86bad7ef3c 100644
--- a/source/blender/editors/gpencil/gpencil_add_monkey.c
+++ b/source/blender/editors/gpencil/gpencil_add_monkey.c
@@ -29,16 +29,13 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_gpencil.h"
#include "BKE_gpencil_geom.h"
-#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_query.h"
#include "ED_gpencil.h"
diff --git a/source/blender/editors/gpencil/gpencil_add_stroke.c b/source/blender/editors/gpencil/gpencil_add_stroke.c
index 0c8cc621a3b..1e1a70f9c1d 100644
--- a/source/blender/editors/gpencil/gpencil_add_stroke.c
+++ b/source/blender/editors/gpencil/gpencil_add_stroke.c
@@ -29,16 +29,13 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_gpencil.h"
#include "BKE_gpencil_geom.h"
-#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_query.h"
#include "ED_gpencil.h"
diff --git a/source/blender/editors/gpencil/gpencil_armature.c b/source/blender/editors/gpencil/gpencil_armature.c
index 5cc5e7ecdcd..3271096c433 100644
--- a/source/blender/editors/gpencil/gpencil_armature.c
+++ b/source/blender/editors/gpencil/gpencil_armature.c
@@ -31,12 +31,9 @@
#include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
-#include "BLT_translation.h"
-
#include "DNA_armature_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_meshdata_types.h"
diff --git a/source/blender/editors/gpencil/gpencil_convert.c b/source/blender/editors/gpencil/gpencil_convert.c
index 09b57029350..ac75ae44c8a 100644
--- a/source/blender/editors/gpencil/gpencil_convert.c
+++ b/source/blender/editors/gpencil/gpencil_convert.c
@@ -178,7 +178,7 @@ static void gpencil_strokepoint_convertcoords(bContext *C,
/* apply parent transform */
float fpt[3];
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
mul_v3_m4v3(fpt, diff_mat, &source_pt->x);
copy_v3_v3(&pt->x, fpt);
@@ -370,7 +370,7 @@ static int gpencil_find_end_of_stroke_idx(tGpTimingData *gtd,
static void gpencil_stroke_path_animation_preprocess_gaps(tGpTimingData *gtd,
RNG *rng,
int *nbr_gaps,
- float *tot_gaps_time)
+ float *r_tot_gaps_time)
{
float delta_time = 0.0f;
@@ -387,10 +387,10 @@ static void gpencil_stroke_path_animation_preprocess_gaps(tGpTimingData *gtd,
}
gtd->tot_time -= delta_time;
- *tot_gaps_time = (float)(*nbr_gaps) * gtd->gap_duration;
- gtd->tot_time += *tot_gaps_time;
+ *r_tot_gaps_time = (float)(*nbr_gaps) * gtd->gap_duration;
+ gtd->tot_time += *r_tot_gaps_time;
if (G.debug & G_DEBUG) {
- printf("%f, %f, %f, %d\n", gtd->tot_time, delta_time, *tot_gaps_time, *nbr_gaps);
+ printf("%f, %f, %f, %d\n", gtd->tot_time, delta_time, *r_tot_gaps_time, *nbr_gaps);
}
if (gtd->gap_randomness > 0.0f) {
BLI_rng_srandom(rng, gtd->seed);
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index ad9b72b713e..c76c2e55d2b 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -449,21 +449,32 @@ void GPENCIL_OT_layer_annotation_move(wmOperatorType *ot)
ot->prop = RNA_def_enum(ot->srna, "type", slot_move, 0, "Type", "");
}
/* ********************* Duplicate Layer ************************** */
+enum {
+ GP_LAYER_DUPLICATE_ALL = 0,
+ GP_LAYER_DUPLICATE_EMPTY = 1,
+};
-static int gpencil_layer_copy_exec(bContext *C, wmOperator *UNUSED(op))
+static int gpencil_layer_copy_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd);
bGPDlayer *new_layer;
-
+ const int mode = RNA_enum_get(op->ptr, "mode");
+ const bool dup_strokes = (bool)(mode == GP_LAYER_DUPLICATE_ALL);
/* sanity checks */
if (ELEM(NULL, gpd, gpl)) {
return OPERATOR_CANCELLED;
}
- /* make copy of layer, and add it immediately after the existing layer */
- new_layer = BKE_gpencil_layer_duplicate(gpl);
- BLI_insertlinkafter(&gpd->layers, gpl, new_layer);
+ /* Make copy of layer, and add it immediately after or before the existing layer. */
+ new_layer = BKE_gpencil_layer_duplicate(gpl, true, dup_strokes);
+ if (dup_strokes) {
+ BLI_insertlinkafter(&gpd->layers, gpl, new_layer);
+ }
+ else {
+ /* For empty strokes is better add below. */
+ BLI_insertlinkbefore(&gpd->layers, gpl, new_layer);
+ }
/* ensure new layer has a unique name, and is now the active layer */
BLI_uniquename(&gpd->layers,
@@ -484,6 +495,12 @@ static int gpencil_layer_copy_exec(bContext *C, wmOperator *UNUSED(op))
void GPENCIL_OT_layer_duplicate(wmOperatorType *ot)
{
+ static const EnumPropertyItem copy_mode[] = {
+ {GP_LAYER_DUPLICATE_ALL, "ALL", 0, "All Data", ""},
+ {GP_LAYER_DUPLICATE_EMPTY, "EMPTY", 0, "Empty Keyframes", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
/* identifiers */
ot->name = "Duplicate Layer";
ot->idname = "GPENCIL_OT_layer_duplicate";
@@ -495,6 +512,8 @@ void GPENCIL_OT_layer_duplicate(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "mode", copy_mode, GP_LAYER_DUPLICATE_ALL, "Mode", "");
}
/* ********************* Duplicate Layer in a new object ************************** */
@@ -1560,7 +1579,7 @@ static int gpencil_stroke_arrange_exec(bContext *C, wmOperator *op)
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
/* some stroke is already at front*/
@@ -1570,7 +1589,7 @@ static int gpencil_stroke_arrange_exec(bContext *C, wmOperator *op)
continue;
}
}
- /* some stroke is already at botom */
+ /* Some stroke is already at bottom. */
if (ELEM(direction, GP_STROKE_MOVE_BOTTOM, GP_STROKE_MOVE_DOWN)) {
if (gps == gpf->strokes.first) {
gpf_lock = true;
@@ -1725,7 +1744,7 @@ static int gpencil_stroke_change_color_exec(bContext *C, wmOperator *op)
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
@@ -2003,7 +2022,7 @@ static void gpencil_brush_delete_mode_brushes(Main *bmain,
}
}
- /* Before delete, unpinn any material of the brush. */
+ /* Before delete, un-pin any material of the brush. */
if ((brush->gpencil_settings) && (brush->gpencil_settings->material != NULL)) {
brush->gpencil_settings->material = NULL;
brush->gpencil_settings->flag &= ~GP_BRUSH_MATERIAL_PINNED;
@@ -2849,12 +2868,12 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
mul_v3_m3v3(offset_local, imat, offset_global);
LISTBASE_FOREACH (bGPDlayer *, gpl_src, &gpd_src->layers) {
- bGPDlayer *gpl_new = BKE_gpencil_layer_duplicate(gpl_src);
+ bGPDlayer *gpl_new = BKE_gpencil_layer_duplicate(gpl_src, true, true);
float diff_mat[4][4];
float inverse_diff_mat[4][4];
/* recalculate all stroke points */
- BKE_gpencil_parent_matrix_get(depsgraph, ob_iter, gpl_src, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, ob_iter, gpl_src, diff_mat);
invert_m4_m4_safe_ortho(inverse_diff_mat, diff_mat);
Material *ma_src = NULL;
@@ -3388,7 +3407,7 @@ static int gpencil_material_select_exec(bContext *C, wmOperator *op)
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
@@ -3399,9 +3418,11 @@ static int gpencil_material_select_exec(bContext *C, wmOperator *op)
if (!deselected) {
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
}
else {
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
if (!deselected) {
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index d1c8eca1be0..b03d2c6e795 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -214,7 +214,7 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *op)
if (gpc->flag & GP_CURVE_NEEDS_STROKE_UPDATE) {
BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps);
/* Update the selection from the stroke to the curve. */
- BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve);
+ BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve);
gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
BKE_gpencil_stroke_geometry_update(gpd, gps);
@@ -992,6 +992,7 @@ static int gpencil_duplicate_exec(bContext *C, wmOperator *op)
pt->flag &= ~GP_SPOINT_SELECT;
}
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
changed = true;
}
@@ -1111,7 +1112,7 @@ static void gpencil_add_move_points(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gp
BKE_gpencil_stroke_geometry_update(gpd, gps);
BKE_gpencil_stroke_geometry_update(gpd, gps_new);
- /* deselect orinal point */
+ /* Deselect original point. */
pt->flag &= ~GP_SPOINT_SELECT;
}
}
@@ -1193,6 +1194,7 @@ static void gpencil_add_move_points(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gp
/* if the stroke is not reused, deselect */
if (!do_stroke) {
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
}
@@ -1241,7 +1243,7 @@ static void gpencil_curve_extrude_points(bGPdata *gpd,
}
}
- /* Edgcase for single curve point. */
+ /* Edge-case for single curve point. */
if (gpc->tot_curve_points == 1) {
last_select = false;
}
@@ -1331,7 +1333,7 @@ static int gpencil_extrude_exec(bContext *C, wmOperator *op)
changed = true;
}
- /* if not multiedit, exit loop*/
+ /* If not multi-edit, exit loop. */
if (!is_multiedit) {
break;
}
@@ -1379,8 +1381,11 @@ void GPENCIL_OT_extrude(wmOperatorType *ot)
* from several different layers into a single layer.
* \{ */
-/* list of bGPDstroke instances */
-/* NOTE: is exposed within the editors/gpencil module so that other tools can use it too */
+/**
+ * list of #bGPDstroke instances
+ *
+ * \note is exposed within the editors/gpencil module so that other tools can use it too.
+ */
ListBase gpencil_strokes_copypastebuf = {NULL, NULL};
/* Hash for hanging on to all the colors used by strokes in the buffer
@@ -1706,6 +1711,7 @@ static int gpencil_strokes_paste_exec(bContext *C, wmOperator *op)
}
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
CTX_DATA_END;
@@ -1867,7 +1873,7 @@ static int gpencil_move_to_layer_exec(bContext *C, wmOperator *op)
}
/* Check if the color is editable. */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
@@ -2545,6 +2551,7 @@ static bool gpencil_dissolve_selected_stroke_points(bContext *C,
/* deselect the stroke, since none of its selected points will still be selected */
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
pt->flag &= ~GP_SPOINT_SELECT;
}
@@ -2610,13 +2617,14 @@ static int gpencil_delete_selected_points(bContext *C)
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
if (gps->flag & GP_STROKE_SELECT) {
/* deselect old stroke, since it will be used as template for the new strokes */
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
if (is_curve_edit) {
bGPDcurve *gpc = gps->editcurve;
@@ -2800,7 +2808,7 @@ static int gpencil_snap_to_grid(bContext *C, wmOperator *UNUSED(op))
float diff_mat[4][4];
/* calculate difference matrix object */
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
/* skip strokes that are invalid for current view */
@@ -2808,7 +2816,7 @@ static int gpencil_snap_to_grid(bContext *C, wmOperator *UNUSED(op))
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
continue;
}
@@ -2935,7 +2943,7 @@ static int gpencil_snap_to_cursor(bContext *C, wmOperator *op)
float diff_mat[4][4];
/* calculate difference matrix */
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
bGPDspoint *pt;
@@ -2946,7 +2954,7 @@ static int gpencil_snap_to_cursor(bContext *C, wmOperator *op)
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
continue;
}
/* only continue if this stroke is selected (editable doesn't guarantee this)... */
@@ -3039,7 +3047,7 @@ static bool gpencil_stroke_points_centroid(Depsgraph *depsgraph,
float diff_mat[4][4];
/* calculate difference matrix */
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
bGPDspoint *pt;
@@ -3050,7 +3058,7 @@ static bool gpencil_stroke_points_centroid(Depsgraph *depsgraph,
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
continue;
}
/* only continue if this stroke is selected (editable doesn't guarantee this)... */
@@ -3565,7 +3573,7 @@ static int gpencil_stroke_join_exec(bContext *C, wmOperator *op)
continue;
}
/* check if the color is editable. */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
elem = &strokes_list[tot_strokes];
@@ -3697,7 +3705,7 @@ static int gpencil_stroke_flip_exec(bContext *C, wmOperator *op)
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
@@ -3787,7 +3795,7 @@ static int gpencil_strokes_reproject_exec(bContext *C, wmOperator *op)
if (is_curve_edit && gps->editcurve != NULL) {
BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps);
/* Update the selection from the stroke to the curve. */
- BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve);
+ BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve);
gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
BKE_gpencil_stroke_geometry_update(gpd, gps);
@@ -4516,7 +4524,7 @@ static int gpencil_stroke_separate_exec(bContext *C, wmOperator *op)
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
/* Separate selected strokes. */
@@ -4571,6 +4579,7 @@ static int gpencil_stroke_separate_exec(bContext *C, wmOperator *op)
else if (mode == GP_SEPARATE_STROKE) {
/* deselect old stroke */
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
/* unlink from source frame */
BLI_remlink(&gpf->strokes, gps);
gps->prev = gps->next = NULL;
@@ -4717,7 +4726,7 @@ static int gpencil_stroke_split_exec(bContext *C, wmOperator *op)
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
/* Split selected strokes. */
@@ -4948,11 +4957,14 @@ static int gpencil_cutter_lasso_select(bContext *C,
GPencilTestFn is_inside_fn,
void *user_data)
{
+ Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+ Object *obact = CTX_data_active_object(C);
bGPdata *gpd = ED_gpencil_data_get_active(C);
ScrArea *area = CTX_wm_area(C);
ToolSettings *ts = CTX_data_tool_settings(C);
const float scale = ts->gp_sculpt.isect_threshold;
const bool flat_caps = RNA_boolean_get(op->ptr, "flat_caps");
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
bGPDspoint *pt;
GP_SpaceConversion gsc = {NULL};
@@ -4976,60 +4988,92 @@ static int gpencil_cutter_lasso_select(bContext *C,
}
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
CTX_DATA_END;
- /* select points */
- GP_EDITABLE_STROKES_BEGIN (gpstroke_iter, C, gpl, gps) {
- int tot_inside = 0;
- const int oldtot = gps->totpoints;
- for (int i = 0; i < gps->totpoints; i++) {
- pt = &gps->points[i];
- if ((pt->flag & GP_SPOINT_SELECT) || (pt->flag & GP_SPOINT_TAG)) {
- continue;
- }
- /* convert point coords to screen-space */
- const bool is_inside = is_inside_fn(gps, pt, &gsc, gpstroke_iter.diff_mat, user_data);
- if (is_inside) {
- tot_inside++;
- changed = true;
- pt->flag |= GP_SPOINT_SELECT;
- gps->flag |= GP_STROKE_SELECT;
- float r_hita[3], r_hitb[3];
- if (gps->totpoints > 1) {
- ED_gpencil_select_stroke_segment(gpd, gpl, gps, pt, true, true, scale, r_hita, r_hitb);
+ /* Select points */
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+ if ((gpl->flag & GP_LAYER_LOCKED) || ((gpl->flag & GP_LAYER_HIDE))) {
+ continue;
+ }
+
+ float diff_mat[4][4];
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
+
+ bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe;
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
+ if (gpf == NULL) {
+ continue;
+ }
+
+ LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
+ if (ED_gpencil_stroke_can_use(C, gps) == false) {
+ continue;
+ } /* check if the color is editable */
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
+ continue;
+ }
+ int tot_inside = 0;
+ const int oldtot = gps->totpoints;
+ for (int i = 0; i < gps->totpoints; i++) {
+ pt = &gps->points[i];
+ if ((pt->flag & GP_SPOINT_SELECT) || (pt->flag & GP_SPOINT_TAG)) {
+ continue;
+ }
+ /* convert point coords to screen-space */
+ const bool is_inside = is_inside_fn(gps, pt, &gsc, diff_mat, user_data);
+ if (is_inside) {
+ tot_inside++;
+ changed = true;
+ pt->flag |= GP_SPOINT_SELECT;
+ gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
+ float r_hita[3], r_hitb[3];
+ if (gps->totpoints > 1) {
+ ED_gpencil_select_stroke_segment(
+ gpd, gpl, gps, pt, true, true, scale, r_hita, r_hitb);
+ }
+ /* avoid infinite loops */
+ if (gps->totpoints > oldtot) {
+ break;
+ }
+ }
+ }
+ /* if mark all points inside lasso set to remove all stroke */
+ if ((tot_inside == oldtot) || ((tot_inside == 1) && (oldtot == 2))) {
+ for (int i = 0; i < gps->totpoints; i++) {
+ pt = &gps->points[i];
+ pt->flag |= GP_SPOINT_SELECT;
+ }
+ }
}
- /* avoid infinite loops */
- if (gps->totpoints > oldtot) {
+ /* if not multiedit, exit loop. */
+ if (!is_multiedit) {
break;
}
}
}
- /* if mark all points inside lasso set to remove all stroke */
- if ((tot_inside == oldtot) || ((tot_inside == 1) && (oldtot == 2))) {
- for (int i = 0; i < gps->totpoints; i++) {
- pt = &gps->points[i];
- pt->flag |= GP_SPOINT_SELECT;
- }
- }
}
- GP_EDITABLE_STROKES_END(gpstroke_iter);
- /* dissolve selected points */
+ /* Dissolve selected points. */
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
- if (gpl->flag & GP_LAYER_LOCKED) {
- continue;
- }
-
- bGPDframe *gpf = gpl->actframe;
- if (gpf == NULL) {
- continue;
- }
- LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) {
- if (gps->flag & GP_STROKE_SELECT) {
- gpencil_cutter_dissolve(gpd, gpl, gps, flat_caps);
+ bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe;
+ bGPDframe *gpf_act = gpl->actframe;
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ gpl->actframe = gpf;
+ LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) {
+ if (gps->flag & GP_STROKE_SELECT) {
+ gpencil_cutter_dissolve(gpd, gpl, gps, flat_caps);
+ }
+ }
+ /* if not multiedit, exit loop. */
+ if (!is_multiedit) {
+ break;
}
}
+ gpl->actframe = gpf_act;
}
/* updates */
diff --git a/source/blender/editors/gpencil/gpencil_edit_curve.c b/source/blender/editors/gpencil/gpencil_edit_curve.c
index 60d1d2169b4..0f9a8c93df9 100644
--- a/source/blender/editors/gpencil/gpencil_edit_curve.c
+++ b/source/blender/editors/gpencil/gpencil_edit_curve.c
@@ -28,13 +28,10 @@
#include <stdlib.h>
#include <string.h>
-#include "MEM_guardedalloc.h"
-
#include "DNA_gpencil_types.h"
#include "DNA_view3d_types.h"
#include "BKE_context.h"
-#include "BKE_curve.h"
#include "BKE_gpencil.h"
#include "BKE_gpencil_curve.h"
#include "BKE_gpencil_geom.h"
@@ -91,7 +88,7 @@ static int gpencil_stroke_enter_editcurve_mode_exec(bContext *C, wmOperator *op)
(gps->editcurve != NULL && gps->editcurve->flag & GP_CURVE_NEEDS_STROKE_UPDATE)) {
BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps);
/* Update the selection from the stroke to the curve. */
- BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve);
+ BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve);
gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
BKE_gpencil_stroke_geometry_update(gpd, gps);
}
diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c
index ecad7384049..bf228af88a5 100644
--- a/source/blender/editors/gpencil/gpencil_fill.c
+++ b/source/blender/editors/gpencil/gpencil_fill.c
@@ -26,6 +26,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
#include "BLI_math.h"
#include "BLI_stack.h"
#include "BLI_utildefines.h"
@@ -81,8 +82,18 @@
#define LEAK_HORZ 0
#define LEAK_VERT 1
+#define MIN_WINDOW_SIZE 128
-/* Temporary fill operation data (op->customdata) */
+/* Set to 1 to debug filling internal image. By default, the value must be 0. */
+#define FILL_DEBUG 0
+
+/* Duplicated: etempFlags */
+enum {
+ GP_DRAWFILLS_NOSTATUS = (1 << 0), /* don't draw status info */
+ GP_DRAWFILLS_ONLY3D = (1 << 1), /* only draw 3d-strokes */
+};
+
+/* Temporary fill operation data `op->customdata`. */
typedef struct tGPDfill {
bContext *C;
struct Main *bmain;
@@ -101,7 +112,7 @@ typedef struct tGPDfill {
struct View3D *v3d;
/** region where painting originated */
struct ARegion *region;
- /** current GP datablock */
+ /** Current GP data-block. */
struct bGPdata *gpd;
/** current material */
struct Material *mat;
@@ -111,6 +122,8 @@ typedef struct tGPDfill {
struct bGPDlayer *gpl;
/** frame */
struct bGPDframe *gpf;
+ /** Temp mouse position stroke. */
+ struct bGPDstroke *gps_mouse;
/** flags */
short flag;
@@ -118,9 +131,12 @@ typedef struct tGPDfill {
short oldkey;
/** send to back stroke */
bool on_back;
-
+ /** Flag for render mode */
+ bool is_render;
+ /** Flag to check something was done. */
+ bool done;
/** mouse fill center position */
- int center[2];
+ int mouse[2];
/** windows width */
int sizex;
/** window height */
@@ -137,7 +153,7 @@ typedef struct tGPDfill {
/** boundary limits drawing mode */
int fill_draw_mode;
/* scaling factor */
- short fill_factor;
+ float fill_factor;
/* Frame to use. */
int active_cfra;
@@ -156,14 +172,184 @@ typedef struct tGPDfill {
/** handle for drawing strokes while operator is running 3d stuff */
void *draw_handle_3d;
- /* tmp size x */
+ /* Temporary size x. */
int bwinx;
- /* tmp size y */
+ /* Temporary size y. */
int bwiny;
rcti brect;
+ /* Space Conversion Data */
+ GP_SpaceConversion gsc;
+
+ /** Zoom factor. */
+ float zoom;
+
+ /** Factor of extension. */
+ float fill_extend_fac;
+
} tGPDfill;
+bool skip_layer_check(short fill_layer_mode, int gpl_active_index, int gpl_index);
+static void gpencil_draw_boundary_lines(const struct bContext *UNUSED(C), struct tGPDfill *tgpf);
+
+/* Delete any temporary stroke. */
+static void gpencil_delete_temp_stroke_extension(tGPDfill *tgpf, const bool all_frames)
+{
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &tgpf->gpd->layers) {
+ if (gpl->flag & GP_LAYER_HIDE) {
+ continue;
+ }
+
+ bGPDframe *init_gpf = (all_frames) ? gpl->frames.first :
+ BKE_gpencil_layer_frame_get(
+ gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV);
+ if (init_gpf == NULL) {
+ continue;
+ }
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) {
+ /* free stroke */
+ if ((gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG)) {
+ BLI_remlink(&gpf->strokes, gps);
+ BKE_gpencil_free_stroke(gps);
+ }
+ }
+ if (!all_frames) {
+ break;
+ }
+ }
+ }
+}
+
+static void extrapolate_points_by_length(bGPDspoint *a,
+ bGPDspoint *b,
+ float length,
+ float r_point[3])
+{
+ float ab[3];
+ sub_v3_v3v3(ab, &b->x, &a->x);
+ normalize_v3(ab);
+ mul_v3_fl(ab, length);
+ add_v3_v3v3(r_point, &b->x, ab);
+}
+
+/* Loop all layers create stroke extensions. */
+static void gpencil_create_extensions(tGPDfill *tgpf)
+{
+ Object *ob = tgpf->ob;
+ bGPdata *gpd = tgpf->gpd;
+ Brush *brush = tgpf->brush;
+ BrushGpencilSettings *brush_settings = brush->gpencil_settings;
+
+ bGPDlayer *gpl_active = BKE_gpencil_layer_active_get(gpd);
+ BLI_assert(gpl_active != NULL);
+
+ const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active);
+ BLI_assert(gpl_active_index >= 0);
+
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+ if (gpl->flag & GP_LAYER_HIDE) {
+ continue;
+ }
+
+ /* Decide if the strokes of layers are included or not depending on the layer mode. */
+ const int gpl_index = BLI_findindex(&gpd->layers, gpl);
+ bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index);
+ if (skip) {
+ continue;
+ }
+
+ bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV);
+ if (gpf == NULL) {
+ continue;
+ }
+
+ LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
+ /* Check if stroke can be drawn. */
+ if ((gps->points == NULL) || (gps->totpoints < 2)) {
+ continue;
+ }
+ if (gps->flag & (GP_STROKE_NOFILL | GP_STROKE_TAG)) {
+ continue;
+ }
+ /* Check if the color is visible. */
+ MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(ob, gps->mat_nr + 1);
+ if ((gp_style == NULL) || (gp_style->flag & GP_MATERIAL_HIDE)) {
+ continue;
+ }
+
+ /* Extend start. */
+ bGPDspoint *pt0 = &gps->points[1];
+ bGPDspoint *pt1 = &gps->points[0];
+ bGPDstroke *gps_new = BKE_gpencil_stroke_new(gps->mat_nr, 2, gps->thickness);
+ gps_new->flag |= GP_STROKE_NOFILL | GP_STROKE_TAG;
+ BLI_addtail(&gpf->strokes, gps_new);
+
+ bGPDspoint *pt = &gps_new->points[0];
+ copy_v3_v3(&pt->x, &pt1->x);
+ pt->strength = 1.0f;
+ pt->pressure = 1.0f;
+
+ pt = &gps_new->points[1];
+ pt->strength = 1.0f;
+ pt->pressure = 1.0f;
+ extrapolate_points_by_length(pt0, pt1, tgpf->fill_extend_fac * 0.1f, &pt->x);
+
+ /* Extend end. */
+ pt0 = &gps->points[gps->totpoints - 2];
+ pt1 = &gps->points[gps->totpoints - 1];
+ gps_new = BKE_gpencil_stroke_new(gps->mat_nr, 2, gps->thickness);
+ gps_new->flag |= GP_STROKE_NOFILL | GP_STROKE_TAG;
+ BLI_addtail(&gpf->strokes, gps_new);
+
+ pt = &gps_new->points[0];
+ copy_v3_v3(&pt->x, &pt1->x);
+ pt->strength = 1.0f;
+ pt->pressure = 1.0f;
+
+ pt = &gps_new->points[1];
+ pt->strength = 1.0f;
+ pt->pressure = 1.0f;
+ extrapolate_points_by_length(pt0, pt1, tgpf->fill_extend_fac * 0.1f, &pt->x);
+ }
+ }
+}
+
+static void gpencil_update_extend(tGPDfill *tgpf)
+{
+ gpencil_delete_temp_stroke_extension(tgpf, false);
+
+ if (tgpf->fill_extend_fac > 0.0f) {
+ gpencil_create_extensions(tgpf);
+ }
+ WM_event_add_notifier(tgpf->C, NC_GPENCIL | NA_EDITED, NULL);
+}
+
+static bool gpencil_stroke_is_drawable(tGPDfill *tgpf, bGPDstroke *gps)
+{
+ if (tgpf->is_render) {
+ return true;
+ }
+
+ const bool show_help = (tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) != 0;
+ const bool show_extend = (tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) != 0;
+ const bool is_extend = (gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG);
+
+ if ((!show_help) && (show_extend)) {
+ if (!is_extend) {
+ return false;
+ }
+ }
+
+ if ((show_help) && (!show_extend)) {
+ if (is_extend) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
/* draw a given stroke using same thickness and color for all points */
static void gpencil_draw_basic_stroke(tGPDfill *tgpf,
bGPDstroke *gps,
@@ -171,7 +357,8 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf,
const bool cyclic,
const float ink[4],
const int flag,
- const float thershold)
+ const float thershold,
+ const float thickness)
{
bGPDspoint *points = gps->points;
@@ -181,9 +368,19 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf,
int totpoints = gps->totpoints;
float fpt[3];
float col[4];
+ const float extend_col[4] = {0.0f, 1.0f, 1.0f, 1.0f};
+ const bool is_extend = (gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG);
- copy_v4_v4(col, ink);
+ if (!gpencil_stroke_is_drawable(tgpf, gps)) {
+ return;
+ }
+ if ((is_extend) && (!tgpf->is_render)) {
+ copy_v4_v4(col, extend_col);
+ }
+ else {
+ copy_v4_v4(col, ink);
+ }
/* if cyclic needs more vertex */
int cyclic_add = (cyclic) ? 1 : 0;
@@ -194,7 +391,7 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf,
immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR);
/* draw stroke curve */
- GPU_line_width(1.0f);
+ GPU_line_width((!is_extend) ? thickness : thickness * 2.0f);
immBeginAtMost(GPU_PRIM_LINE_STRIP, totpoints + cyclic_add);
const bGPDspoint *pt = points;
@@ -225,15 +422,77 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf,
immUnbindProgram();
}
-/* loop all layers */
-static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4])
+static void draw_mouse_position(tGPDfill *tgpf)
{
- /* duplicated: etempFlags */
- enum {
- GP_DRAWFILLS_NOSTATUS = (1 << 0), /* don't draw status info */
- GP_DRAWFILLS_ONLY3D = (1 << 1), /* only draw 3d-strokes */
- };
+ if (tgpf->gps_mouse == NULL) {
+ return;
+ }
+ uchar mouse_color[4] = {0, 0, 255, 255};
+ bGPDspoint *pt = &tgpf->gps_mouse->points[0];
+ float point_size = (tgpf->zoom == 1.0f) ? 4.0f * tgpf->fill_factor :
+ (0.5f * tgpf->zoom) + tgpf->fill_factor;
+ GPUVertFormat *format = immVertexFormat();
+ uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+ uint col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
+
+ /* Draw mouse click position in Blue. */
+ immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR);
+ GPU_point_size(point_size);
+ immBegin(GPU_PRIM_POINTS, 1);
+ immAttr4ubv(col, mouse_color);
+ immVertex3fv(pos, &pt->x);
+ immEnd();
+ immUnbindProgram();
+}
+
+/* Helper: Check if must skip the layer */
+bool skip_layer_check(short fill_layer_mode, int gpl_active_index, int gpl_index)
+{
+ bool skip = false;
+
+ switch (fill_layer_mode) {
+ case GP_FILL_GPLMODE_ACTIVE: {
+ if (gpl_index != gpl_active_index) {
+ skip = true;
+ }
+ break;
+ }
+ case GP_FILL_GPLMODE_ABOVE: {
+ if (gpl_index != gpl_active_index + 1) {
+ skip = true;
+ }
+ break;
+ }
+ case GP_FILL_GPLMODE_BELOW: {
+ if (gpl_index != gpl_active_index - 1) {
+ skip = true;
+ }
+ break;
+ }
+ case GP_FILL_GPLMODE_ALL_ABOVE: {
+ if (gpl_index <= gpl_active_index) {
+ skip = true;
+ }
+ break;
+ }
+ case GP_FILL_GPLMODE_ALL_BELOW: {
+ if (gpl_index >= gpl_active_index) {
+ skip = true;
+ }
+ break;
+ }
+ case GP_FILL_GPLMODE_VISIBLE:
+ default:
+ break;
+ }
+
+ return skip;
+}
+
+/* Loop all layers to draw strokes. */
+static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4])
+{
Object *ob = tgpf->ob;
bGPdata *gpd = tgpf->gpd;
Brush *brush = tgpf->brush;
@@ -247,8 +506,8 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4])
tgpw.gpd = gpd;
tgpw.offsx = 0;
tgpw.offsy = 0;
- tgpw.winx = tgpf->region->winx;
- tgpw.winy = tgpf->region->winy;
+ tgpw.winx = tgpf->sizex;
+ tgpw.winy = tgpf->sizey;
tgpw.dflag = 0;
tgpw.disable_fill = 1;
tgpw.dflag |= (GP_DRAWFILLS_ONLY3D | GP_DRAWFILLS_NOSTATUS);
@@ -261,54 +520,22 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4])
const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active);
BLI_assert(gpl_active_index >= 0);
- LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
- /* calculate parent position */
- BKE_gpencil_parent_matrix_get(tgpw.depsgraph, ob, gpl, tgpw.diff_mat);
+ /* Draw blue point where click with mouse. */
+ draw_mouse_position(tgpf);
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
/* do not draw layer if hidden */
if (gpl->flag & GP_LAYER_HIDE) {
continue;
}
+ /* calculate parent position */
+ BKE_gpencil_layer_transform_matrix_get(tgpw.depsgraph, ob, gpl, tgpw.diff_mat);
+
/* Decide if the strokes of layers are included or not depending on the layer mode.
* Cannot skip the layer because it can use boundary strokes and must be used. */
- bool skip = false;
const int gpl_index = BLI_findindex(&gpd->layers, gpl);
- switch (brush_settings->fill_layer_mode) {
- case GP_FILL_GPLMODE_ACTIVE: {
- if (gpl_index != gpl_active_index) {
- skip = true;
- }
- break;
- }
- case GP_FILL_GPLMODE_ABOVE: {
- if (gpl_index != gpl_active_index + 1) {
- skip = true;
- }
- break;
- }
- case GP_FILL_GPLMODE_BELOW: {
- if (gpl_index != gpl_active_index - 1) {
- skip = true;
- }
- break;
- }
- case GP_FILL_GPLMODE_ALL_ABOVE: {
- if (gpl_index <= gpl_active_index) {
- skip = true;
- }
- break;
- }
- case GP_FILL_GPLMODE_ALL_BELOW: {
- if (gpl_index >= gpl_active_index) {
- skip = true;
- }
- break;
- }
- case GP_FILL_GPLMODE_VISIBLE:
- default:
- break;
- }
+ bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index);
/* if active layer and no keyframe, create a new one */
if (gpl == tgpf->gpl) {
@@ -351,17 +578,19 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4])
tgpw.gpf = gpf;
tgpw.t_gpf = gpf;
- /* reduce thickness to avoid gaps */
tgpw.is_fill_stroke = (tgpf->fill_draw_mode == GP_FILL_DMODE_CONTROL) ? false : true;
+ /* Reduce thickness to avoid gaps. */
tgpw.lthick = gpl->line_change;
tgpw.opacity = 1.0;
copy_v4_v4(tgpw.tintcolor, ink);
tgpw.onion = true;
tgpw.custonion = true;
- /* normal strokes */
+ /* Normal strokes. */
if (ELEM(tgpf->fill_draw_mode, GP_FILL_DMODE_STROKE, GP_FILL_DMODE_BOTH)) {
- ED_gpencil_draw_fill(&tgpw);
+ if (gpencil_stroke_is_drawable(tgpf, gps) && ((gps->flag & GP_STROKE_TAG) == 0)) {
+ ED_gpencil_draw_fill(&tgpw);
+ }
}
/* 3D Lines with basic shapes and invisible lines */
@@ -372,7 +601,8 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4])
gps->flag & GP_STROKE_CYCLIC,
ink,
tgpf->flag,
- tgpf->fill_threshold);
+ tgpf->fill_threshold,
+ 1.0f);
}
}
}
@@ -380,7 +610,7 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4])
GPU_blend(GPU_BLEND_NONE);
}
-/* draw strokes in offscreen buffer */
+/* Draw strokes in off-screen buffer. */
static bool gpencil_render_offscreen(tGPDfill *tgpf)
{
bool is_ortho = false;
@@ -398,8 +628,8 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf)
/* resize region */
tgpf->region->winrct.xmin = 0;
tgpf->region->winrct.ymin = 0;
- tgpf->region->winrct.xmax = (int)tgpf->region->winx * tgpf->fill_factor;
- tgpf->region->winrct.ymax = (int)tgpf->region->winy * tgpf->fill_factor;
+ tgpf->region->winrct.xmax = max_ii((int)tgpf->region->winx * tgpf->fill_factor, MIN_WINDOW_SIZE);
+ tgpf->region->winrct.ymax = max_ii((int)tgpf->region->winy * tgpf->fill_factor, MIN_WINDOW_SIZE);
tgpf->region->winx = (short)abs(tgpf->region->winrct.xmax - tgpf->region->winrct.xmin);
tgpf->region->winy = (short)abs(tgpf->region->winrct.ymax - tgpf->region->winrct.ymin);
@@ -407,12 +637,6 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf)
tgpf->sizex = (int)tgpf->region->winx;
tgpf->sizey = (int)tgpf->region->winy;
- /* adjust center */
- float center[2];
- center[0] = (float)tgpf->center[0] * ((float)tgpf->region->winx / (float)tgpf->bwinx);
- center[1] = (float)tgpf->center[1] * ((float)tgpf->region->winy / (float)tgpf->bwiny);
- round_v2i_v2fl(tgpf->center, center);
-
char err_out[256] = "unknown";
GPUOffScreen *offscreen = GPU_offscreen_create(tgpf->sizex, tgpf->sizey, true, false, err_out);
if (offscreen == NULL) {
@@ -421,7 +645,7 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf)
}
GPU_offscreen_bind(offscreen, true);
- uint flag = IB_rect | IB_rectfloat;
+ uint flag = IB_rectfloat;
ImBuf *ibuf = IMB_allocImBuf(tgpf->sizex, tgpf->sizey, 32, flag);
rctf viewplane;
@@ -436,6 +660,21 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf)
&clip_start,
&clip_end,
NULL);
+
+ /* Rescale `viewplane` to fit all strokes. */
+ float width = viewplane.xmax - viewplane.xmin;
+ float height = viewplane.ymax - viewplane.ymin;
+
+ float width_new = width * tgpf->zoom;
+ float height_new = height * tgpf->zoom;
+ float scale_x = (width_new - width) / 2.0f;
+ float scale_y = (height_new - height) / 2.0f;
+
+ viewplane.xmin -= scale_x;
+ viewplane.xmax += scale_x;
+ viewplane.ymin -= scale_y;
+ viewplane.ymax += scale_y;
+
if (is_ortho) {
orthographic_m4(winmat,
viewplane.xmin,
@@ -456,7 +695,7 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf)
}
GPU_matrix_push_projection();
- GPU_matrix_identity_set();
+ GPU_matrix_identity_projection_set();
GPU_matrix_push();
GPU_matrix_identity_set();
@@ -484,7 +723,7 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf)
GPU_offscreen_read_pixels(offscreen, GPU_DATA_FLOAT, ibuf->rect_float);
}
else if (ibuf->rect) {
- GPU_offscreen_read_pixels(offscreen, GPU_DATA_UNSIGNED_BYTE, ibuf->rect);
+ GPU_offscreen_read_pixels(offscreen, GPU_DATA_UBYTE, ibuf->rect);
}
if (ibuf->rect_float && ibuf->rect) {
IMB_rect_from_float(ibuf);
@@ -495,45 +734,33 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf)
BKE_image_release_ibuf(tgpf->ima, ibuf, NULL);
- /* switch back to window-system-provided framebuffer */
+ /* Switch back to window-system-provided frame-buffer. */
GPU_offscreen_unbind(offscreen, true);
GPU_offscreen_free(offscreen);
return true;
}
-/* return pixel data (rgba) at index */
+/* Return pixel data (RGBA) at index. */
static void get_pixel(const ImBuf *ibuf, const int idx, float r_col[4])
{
- if (ibuf->rect_float) {
- const float *frgba = &ibuf->rect_float[idx * 4];
- copy_v4_v4(r_col, frgba);
- }
- else {
- /* XXX: This case probably doesn't happen, as we only write to the float buffer,
- * but we get compiler warnings about uninitialized vars otherwise
- */
- BLI_assert(!"gpencil_fill.c - get_pixel() non-float case is used!");
- zero_v4(r_col);
- }
+ BLI_assert(ibuf->rect_float != NULL);
+ memcpy(r_col, &ibuf->rect_float[idx * 4], sizeof(float[4]));
}
-/* set pixel data (rgba) at index */
+/* Set pixel data (RGBA) at index. */
static void set_pixel(ImBuf *ibuf, int idx, const float col[4])
{
- // BLI_assert(idx <= ibuf->x * ibuf->y);
- if (ibuf->rect) {
- uint *rrect = &ibuf->rect[idx];
- uchar ccol[4];
-
- rgba_float_to_uchar(ccol, col);
- *rrect = *((uint *)ccol);
- }
+ BLI_assert(ibuf->rect_float != NULL);
+ float *rrectf = &ibuf->rect_float[idx * 4];
+ copy_v4_v4(rrectf, col);
+}
- if (ibuf->rect_float) {
- float *rrectf = &ibuf->rect_float[idx * 4];
- copy_v4_v4(rrectf, col);
- }
+/* Helper: Check if one image row is empty. */
+static bool is_row_filled(const ImBuf *ibuf, const int row_index)
+{
+ float *row = &ibuf->rect_float[ibuf->x * 4 * row_index];
+ return (row[0] == 0.0f && memcmp(row, row + 1, ((ibuf->x * 4) - 1) * sizeof(float)) != 0);
}
/**
@@ -541,6 +768,9 @@ static void set_pixel(ImBuf *ibuf, int idx, const float col[4])
* this is used for strokes with small gaps between them to get a full fill
* and do not get a full screen fill.
*
+ * This function assumes that if the furthest pixel is occupied,
+ * the other pixels are occupied.
+ *
* \param ibuf: Image pixel data.
* \param maxpixel: Maximum index.
* \param limit: Limit of pixels to analyze.
@@ -550,10 +780,10 @@ static void set_pixel(ImBuf *ibuf, int idx, const float col[4])
static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index, int type)
{
float rgba[4];
- int i;
int pt;
bool t_a = false;
bool t_b = false;
+ const int extreme = limit - 1;
/* Horizontal leak (check vertical pixels)
* X
@@ -564,37 +794,29 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index
*/
if (type == LEAK_HORZ) {
/* pixels on top */
- for (i = 1; i <= limit; i++) {
- pt = index + (ibuf->x * i);
- if (pt <= maxpixel) {
- get_pixel(ibuf, pt, rgba);
- if (rgba[0] == 1.0f) {
- t_a = true;
- break;
- }
- }
- else {
- /* edge of image*/
+ pt = index + (ibuf->x * extreme);
+ if (pt <= maxpixel) {
+ get_pixel(ibuf, pt, rgba);
+ if (rgba[0] == 1.0f) {
t_a = true;
- break;
}
}
+ else {
+ /* edge of image*/
+ t_a = true;
+ }
/* pixels on bottom */
- for (i = 1; i <= limit; i++) {
- pt = index - (ibuf->x * i);
- if (pt >= 0) {
- get_pixel(ibuf, pt, rgba);
- if (rgba[0] == 1.0f) {
- t_b = true;
- break;
- }
- }
- else {
- /* edge of image*/
+ pt = index - (ibuf->x * extreme);
+ if (pt >= 0) {
+ get_pixel(ibuf, pt, rgba);
+ if (rgba[0] == 1.0f) {
t_b = true;
- break;
}
}
+ else {
+ /* edge of image*/
+ t_b = true;
+ }
}
/* Vertical leak (check horizontal pixels)
@@ -608,35 +830,27 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index
int higpix = lowpix + ibuf->x - 1;
/* pixels to right */
- for (i = 0; i < limit; i++) {
- pt = index - (limit - i);
- if (pt >= lowpix) {
- get_pixel(ibuf, pt, rgba);
- if (rgba[0] == 1.0f) {
- t_a = true;
- break;
- }
- }
- else {
- t_a = true; /* edge of image*/
- break;
+ pt = index - extreme;
+ if (pt >= lowpix) {
+ get_pixel(ibuf, pt, rgba);
+ if (rgba[0] == 1.0f) {
+ t_a = true;
}
}
+ else {
+ t_a = true; /* edge of image*/
+ }
/* pixels to left */
- for (i = 0; i < limit; i++) {
- pt = index + (limit - i);
- if (pt <= higpix) {
- get_pixel(ibuf, pt, rgba);
- if (rgba[0] == 1.0f) {
- t_b = true;
- break;
- }
- }
- else {
- t_b = true; /* edge of image */
- break;
+ pt = index + extreme;
+ if (pt <= higpix) {
+ get_pixel(ibuf, pt, rgba);
+ if (rgba[0] == 1.0f) {
+ t_b = true;
}
}
+ else {
+ t_b = true; /* edge of image */
+ }
}
return (bool)(t_a && t_b);
}
@@ -659,23 +873,37 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf)
BLI_Stack *stack = BLI_stack_new(sizeof(int), __func__);
- /* calculate index of the seed point using the position of the mouse */
- int index = (tgpf->sizex * tgpf->center[1]) + tgpf->center[0];
+ /* Calculate index of the seed point using the position of the mouse looking
+ * for a blue pixel. */
+ int index = -1;
+ for (int i = 0; i < maxpixel; i++) {
+ get_pixel(ibuf, i, rgba);
+ if (rgba[2] == 1.0f) {
+ index = i;
+ break;
+ }
+ }
+
if ((index >= 0) && (index <= maxpixel)) {
- BLI_stack_push(stack, &index);
+ if (!FILL_DEBUG) {
+ BLI_stack_push(stack, &index);
+ }
}
- /* the fill use a stack to save the pixel list instead of the common recursive
+ /**
+ * The fill use a stack to save the pixel list instead of the common recursive
* 4-contact point method.
* The problem with recursive calls is that for big fill areas, we can get max limit
* of recursive calls and STACK_OVERFLOW error.
*
* The 4-contact point analyze the pixels to the left, right, bottom and top
- * -----------
- * | X |
- * | XoX |
- * | X |
- * -----------
+ * <pre>
+ * -----------
+ * | X |
+ * | XoX |
+ * | X |
+ * -----------
+ * </pre>
*/
while (!BLI_stack_is_empty(stack)) {
int v;
@@ -763,7 +991,7 @@ static void gpencil_set_borders(tGPDfill *tgpf, const bool transparent)
tgpf->ima->id.tag |= LIB_TAG_DOIT;
}
-/* Invert image to paint invese area. */
+/* Invert image to paint inverse area. */
static void gpencil_invert_image(tGPDfill *tgpf)
{
ImBuf *ibuf;
@@ -773,18 +1001,24 @@ static void gpencil_invert_image(tGPDfill *tgpf)
ibuf = BKE_image_acquire_ibuf(tgpf->ima, NULL, &lock);
const int maxpixel = (ibuf->x * ibuf->y) - 1;
+ const int center = ibuf->x / 2;
for (int v = maxpixel; v != 0; v--) {
float color[4];
get_pixel(ibuf, v, color);
- /* Green. */
+ /* Green->Red. */
if (color[1] == 1.0f) {
set_pixel(ibuf, v, fill_col[0]);
}
+ /* Red->Green */
else if (color[0] == 1.0f) {
set_pixel(ibuf, v, fill_col[1]);
+ /* Add thickness of 2 pixels to avoid too thin lines. */
+ int offset = (v % ibuf->x < center) ? 1 : -1;
+ set_pixel(ibuf, v + offset, fill_col[1]);
}
else {
+ /* Set to Transparent. */
set_pixel(ibuf, v, fill_col[2]);
}
}
@@ -821,21 +1055,37 @@ static void gpencil_erase_processed_area(tGPDfill *tgpf)
float rgba[4];
for (int idy = 0; idy < ibuf->y; idy++) {
- bool clear = false;
+ int init = -1;
+ int end = -1;
for (int idx = 0; idx < ibuf->x; idx++) {
int image_idx = ibuf->x * idy + idx;
get_pixel(ibuf, image_idx, rgba);
/* Blue. */
if (rgba[2] == 1.0f) {
- clear = true;
+ if (init < 0) {
+ init = image_idx;
+ }
+ else {
+ end = image_idx;
+ }
}
/* Red. */
else if (rgba[0] == 1.0f) {
- clear = false;
+ if (init > -1) {
+ for (int i = init; i <= max_ii(init, end); i++) {
+ set_pixel(ibuf, i, clear_col);
+ }
+ init = -1;
+ end = -1;
+ }
}
- if (clear) {
- set_pixel(ibuf, image_idx, clear_col);
+ }
+ /* Check last segment. */
+ if (init > -1) {
+ for (int i = init; i <= max_ii(init, end); i++) {
+ set_pixel(ibuf, i, clear_col);
}
+ set_pixel(ibuf, init, clear_col);
}
}
@@ -845,98 +1095,112 @@ static void gpencil_erase_processed_area(tGPDfill *tgpf)
tgpf->ima->id.tag |= LIB_TAG_DOIT;
}
-/* Naive dilate
+/**
+ * Naive dilate
*
* Expand green areas into enclosing red areas.
* Using stack prevents creep when replacing colors directly.
+ * <pre>
* -----------
* XXXXXXX
* XoooooX
* XXooXXX
* XXXX
* -----------
+ * </pre>
*/
-static void dilate_shape(ImBuf *ibuf)
+static bool dilate_shape(ImBuf *ibuf)
{
+ bool done = false;
+
BLI_Stack *stack = BLI_stack_new(sizeof(int), __func__);
const float green[4] = {0.0f, 1.0f, 0.0f, 1.0f};
- const int maxpixel = (ibuf->x * ibuf->y) - 1;
+ // const int maxpixel = (ibuf->x * ibuf->y) - 1;
/* detect pixels and expand into red areas */
- for (int v = maxpixel; v != 0; v--) {
- float color[4];
- int index;
- int tp = 0;
- int bm = 0;
- int lt = 0;
- int rt = 0;
- get_pixel(ibuf, v, color);
- if (color[1] == 1.0f) {
- /* pixel left */
- if (v - 1 >= 0) {
- index = v - 1;
- get_pixel(ibuf, index, color);
- if (color[0] == 1.0f) {
- BLI_stack_push(stack, &index);
- lt = index;
+ for (int row = 0; row < ibuf->y; row++) {
+ if (!is_row_filled(ibuf, row)) {
+ continue;
+ }
+ int maxpixel = (ibuf->x * (row + 1)) - 1;
+ int minpixel = ibuf->x * row;
+
+ for (int v = maxpixel; v != minpixel; v--) {
+ float color[4];
+ int index;
+ get_pixel(ibuf, v, color);
+ if (color[1] == 1.0f) {
+ int tp = 0;
+ int bm = 0;
+ int lt = 0;
+ int rt = 0;
+
+ /* pixel left */
+ if (v - 1 >= 0) {
+ index = v - 1;
+ get_pixel(ibuf, index, color);
+ if (color[0] == 1.0f) {
+ BLI_stack_push(stack, &index);
+ lt = index;
+ }
}
- }
- /* pixel right */
- if (v + 1 <= maxpixel) {
- index = v + 1;
- get_pixel(ibuf, index, color);
- if (color[0] == 1.0f) {
- BLI_stack_push(stack, &index);
- rt = index;
+ /* pixel right */
+ if (v + 1 <= maxpixel) {
+ index = v + 1;
+ get_pixel(ibuf, index, color);
+ if (color[0] == 1.0f) {
+ BLI_stack_push(stack, &index);
+ rt = index;
+ }
}
- }
- /* pixel top */
- if (v + ibuf->x <= maxpixel) {
- index = v + ibuf->x;
- get_pixel(ibuf, index, color);
- if (color[0] == 1.0f) {
- BLI_stack_push(stack, &index);
- tp = index;
+ /* pixel top */
+ if (v + (ibuf->x * 1) <= maxpixel) {
+ index = v + (ibuf->x * 1);
+ get_pixel(ibuf, index, color);
+ if (color[0] == 1.0f) {
+ BLI_stack_push(stack, &index);
+ tp = index;
+ }
}
- }
- /* pixel bottom */
- if (v - ibuf->x >= 0) {
- index = v - ibuf->x;
- get_pixel(ibuf, index, color);
- if (color[0] == 1.0f) {
- BLI_stack_push(stack, &index);
- bm = index;
+ /* pixel bottom */
+ if (v - (ibuf->x * 1) >= 0) {
+ index = v - (ibuf->x * 1);
+ get_pixel(ibuf, index, color);
+ if (color[0] == 1.0f) {
+ BLI_stack_push(stack, &index);
+ bm = index;
+ }
}
- }
- /* pixel top-left */
- if (tp && lt) {
- index = tp - 1;
- get_pixel(ibuf, index, color);
- if (color[0] == 1.0f) {
- BLI_stack_push(stack, &index);
+ /* pixel top-left */
+ if (tp && lt) {
+ index = tp - 1;
+ get_pixel(ibuf, index, color);
+ if (color[0] == 1.0f) {
+ BLI_stack_push(stack, &index);
+ }
}
- }
- /* pixel top-right */
- if (tp && rt) {
- index = tp + 1;
- get_pixel(ibuf, index, color);
- if (color[0] == 1.0f) {
- BLI_stack_push(stack, &index);
+ /* pixel top-right */
+ if (tp && rt) {
+ index = tp + 1;
+ get_pixel(ibuf, index, color);
+ if (color[0] == 1.0f) {
+ BLI_stack_push(stack, &index);
+ }
}
- }
- /* pixel bottom-left */
- if (bm && lt) {
- index = bm - 1;
- get_pixel(ibuf, index, color);
- if (color[0] == 1.0f) {
- BLI_stack_push(stack, &index);
+ /* pixel bottom-left */
+ if (bm && lt) {
+ index = bm - 1;
+ get_pixel(ibuf, index, color);
+ if (color[0] == 1.0f) {
+ BLI_stack_push(stack, &index);
+ }
}
- }
- /* pixel bottom-right */
- if (bm && rt) {
- index = bm + 1;
- get_pixel(ibuf, index, color);
- if (color[0] == 1.0f) {
- BLI_stack_push(stack, &index);
+ /* pixel bottom-right */
+ if (bm && rt) {
+ index = bm + 1;
+ get_pixel(ibuf, index, color);
+ if (color[0] == 1.0f) {
+ BLI_stack_push(stack, &index);
+ }
}
}
}
@@ -946,8 +1210,11 @@ static void dilate_shape(ImBuf *ibuf)
int v;
BLI_stack_pop(stack, &v);
set_pixel(ibuf, v, green);
+ done = true;
}
BLI_stack_free(stack);
+
+ return done;
}
/* Get the outline points of a shape using Moore Neighborhood algorithm
@@ -963,11 +1230,12 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate)
int v[2];
int boundary_co[2];
int start_co[2];
+ int first_co[2] = {-1, -1};
int backtracked_co[2];
int current_check_co[2];
int prev_check_co[2];
int backtracked_offset[1][2] = {{0, 0}};
- // bool boundary_found = false;
+ bool first_pixel = false;
bool start_found = false;
const int NEIGHBOR_COUNT = 8;
@@ -992,7 +1260,6 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate)
dilate_shape(ibuf);
}
- /* find the initial point to start outline analysis */
for (int idx = imagesize - 1; idx != 0; idx--) {
get_pixel(ibuf, idx, rgba);
if (rgba[1] == 1.0f) {
@@ -1015,7 +1282,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate)
int cur_back_offset = -1;
for (int i = 0; i < NEIGHBOR_COUNT; i++) {
if (backtracked_offset[0][0] == offset[i][0] && backtracked_offset[0][1] == offset[i][1]) {
- /* Finding the bracktracked pixel offset index */
+ /* Finding the back-tracked pixel offset index */
cur_back_offset = i;
break;
}
@@ -1045,19 +1312,24 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate)
cur_back_offset++;
loop++;
}
- /* current pixel is equal to starting pixel */
- if (boundary_co[0] == start_co[0] && boundary_co[1] == start_co[1]) {
+ /* Current pixel is equal to starting or first pixel. */
+ if ((boundary_co[0] == start_co[0] && boundary_co[1] == start_co[1]) ||
+ (boundary_co[0] == first_co[0] && boundary_co[1] == first_co[1])) {
BLI_stack_pop(tgpf->stack, &v);
- // boundary_found = true;
break;
}
+
+ if (!first_pixel) {
+ first_pixel = true;
+ copy_v2_v2_int(first_co, boundary_co);
+ }
}
/* release ibuf */
BKE_image_release_ibuf(tgpf->ima, ibuf, lock);
}
-/* get z-depth array to reproject on surface */
+/* Get z-depth array to reproject on surface. */
static void gpencil_get_depth_array(tGPDfill *tgpf)
{
tGPspoint *ptc;
@@ -1108,7 +1380,7 @@ static void gpencil_get_depth_array(tGPDfill *tgpf)
}
if (found_depth == false) {
- /* eeh... not much we can do.. :/, ignore depth in this case */
+ /* Sigh! not much we can do here. Ignore depth in this case. */
for (i = totpoints - 1; i >= 0; i--) {
tgpf->depth_arr[i] = 0.9999f;
}
@@ -1171,6 +1443,9 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf)
return;
}
+ /* Set as done. */
+ tgpf->done = true;
+
/* Get frame or create a new one. */
tgpf->gpf = BKE_gpencil_layer_frame_get(tgpf->gpl, tgpf->active_cfra, GP_GETFRAME_ADD_NEW);
@@ -1275,7 +1550,7 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf)
float origin[3];
ED_gpencil_drawing_reference_get(tgpf->scene, tgpf->ob, ts->gpencil_v3d_align, origin);
ED_gpencil_project_stroke_to_plane(
- tgpf->scene, tgpf->ob, tgpf->rv3d, gps, origin, tgpf->lock_axis - 1);
+ tgpf->scene, tgpf->ob, tgpf->rv3d, tgpf->gpl, gps, origin, tgpf->lock_axis - 1);
}
/* if parented change position relative to parent object */
@@ -1326,7 +1601,6 @@ static void gpencil_fill_draw_3d(const bContext *C, ARegion *UNUSED(region), voi
if (region != tgpf->region) {
return;
}
-
gpencil_draw_boundary_lines(C, tgpf);
}
@@ -1377,6 +1651,10 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op))
tgpf->win = CTX_wm_window(C);
tgpf->active_cfra = CFRA;
+ /* Setup space conversions. */
+ gpencil_point_conversion_init(C, &tgpf->gsc);
+ tgpf->zoom = 1.0f;
+
/* set GP datablock */
tgpf->gpd = gpd;
tgpf->gpl = BKE_gpencil_layer_active_get(gpd);
@@ -1387,6 +1665,7 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op))
tgpf->lock_axis = ts->gp_sculpt.lock_axis;
tgpf->oldkey = -1;
+ tgpf->is_render = false;
tgpf->sbuffer_used = 0;
tgpf->sbuffer = NULL;
tgpf->depth_arr = NULL;
@@ -1395,11 +1674,13 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op))
Brush *brush = BKE_paint_brush(&ts->gp_paint->paint);
tgpf->brush = brush;
tgpf->flag = brush->gpencil_settings->flag;
- tgpf->fill_leak = brush->gpencil_settings->fill_leak;
tgpf->fill_threshold = brush->gpencil_settings->fill_threshold;
tgpf->fill_simplylvl = brush->gpencil_settings->fill_simplylvl;
tgpf->fill_draw_mode = brush->gpencil_settings->fill_draw_mode;
- tgpf->fill_factor = (short)max_ii(1, min_ii((int)brush->gpencil_settings->fill_factor, 8));
+ tgpf->fill_extend_fac = brush->gpencil_settings->fill_extend_fac;
+ tgpf->fill_factor = max_ff(GPENCIL_MIN_FILL_FAC,
+ min_ff(brush->gpencil_settings->fill_factor, GPENCIL_MAX_FILL_FAC));
+ tgpf->fill_leak = (int)ceil((float)brush->gpencil_settings->fill_leak * tgpf->fill_factor);
int totcol = tgpf->ob->totcol;
@@ -1424,7 +1705,6 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op))
/* end operator */
static void gpencil_fill_exit(bContext *C, wmOperator *op)
{
- Main *bmain = CTX_data_main(C);
Object *ob = CTX_data_active_object(C);
/* clear undo stack */
@@ -1443,16 +1723,14 @@ static void gpencil_fill_exit(bContext *C, wmOperator *op)
MEM_SAFE_FREE(tgpf->sbuffer);
MEM_SAFE_FREE(tgpf->depth_arr);
+ /* Remove any temp stroke. */
+ gpencil_delete_temp_stroke_extension(tgpf, true);
+
/* remove drawing handler */
if (tgpf->draw_handle_3d) {
ED_region_draw_cb_exit(tgpf->region->type, tgpf->draw_handle_3d);
}
- /* Delete temp image. */
- if (tgpf->ima) {
- BKE_id_free(bmain, tgpf->ima);
- }
-
/* finally, free memory used by temp data */
MEM_freeN(tgpf);
}
@@ -1536,7 +1814,11 @@ static int gpencil_fill_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE
tgpf = op->customdata;
/* Enable custom drawing handlers to show help lines */
- if (tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) {
+ const bool do_extend = (tgpf->fill_extend_fac > 0.0f);
+ const bool help_lines = ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) ||
+ ((tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) && (do_extend)));
+
+ if (help_lines) {
tgpf->draw_handle_3d = ED_region_draw_cb_activate(
tgpf->region->type, gpencil_fill_draw_3d, tgpf, REGION_DRAW_POST_VIEW);
}
@@ -1554,17 +1836,210 @@ static int gpencil_fill_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE
return OPERATOR_RUNNING_MODAL;
}
+/* Helper: Calc the maximum bounding box size of strokes to get the zoom level of the viewport.
+ * For each stroke, the 2D projected bounding box is calculated and using this data, the total
+ * object bounding box (all strokes) is calculated. */
+static void gpencil_zoom_level_set(tGPDfill *tgpf)
+{
+ Brush *brush = tgpf->brush;
+ if (brush->gpencil_settings->flag & GP_BRUSH_FILL_FIT_DISABLE) {
+ tgpf->zoom = 1.0f;
+ return;
+ }
+
+ Object *ob = tgpf->ob;
+ bGPdata *gpd = tgpf->gpd;
+ BrushGpencilSettings *brush_settings = tgpf->brush->gpencil_settings;
+ bGPDlayer *gpl_active = BKE_gpencil_layer_active_get(gpd);
+ BLI_assert(gpl_active != NULL);
+
+ const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active);
+ BLI_assert(gpl_active_index >= 0);
+
+ /* Init maximum boundbox size. */
+ rctf rect_max;
+ const float winx_half = tgpf->region->winx / 2.0f;
+ const float winy_half = tgpf->region->winy / 2.0f;
+ BLI_rctf_init(&rect_max,
+ 0.0f - winx_half,
+ tgpf->region->winx + winx_half,
+ 0.0f - winy_half,
+ tgpf->region->winy + winy_half);
+
+ float objectbox_min[2], objectbox_max[2];
+ INIT_MINMAX2(objectbox_min, objectbox_max);
+ rctf rect_bound;
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+ if (gpl->flag & GP_LAYER_HIDE) {
+ continue;
+ }
+ float diff_mat[4][4];
+ /* calculate parent matrix */
+ BKE_gpencil_layer_transform_matrix_get(tgpf->depsgraph, ob, gpl, diff_mat);
+
+ /* Decide if the strokes of layers are included or not depending on the layer mode.
+ * Cannot skip the layer because it can use boundary strokes and must be used. */
+ const int gpl_index = BLI_findindex(&gpd->layers, gpl);
+ bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index);
+
+ /* Get frame to check. */
+ bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV);
+ if (gpf == NULL) {
+ continue;
+ }
+
+ /* Read all strokes. */
+ LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
+ /* check if stroke can be drawn */
+ if ((gps->points == NULL) || (gps->totpoints < 2)) {
+ continue;
+ }
+ /* check if the color is visible */
+ MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(ob, gps->mat_nr + 1);
+ if ((gp_style == NULL) || (gp_style->flag & GP_MATERIAL_HIDE)) {
+ continue;
+ }
+
+ /* If the layer must be skipped, but the stroke is not boundary, skip stroke. */
+ if ((skip) && ((gps->flag & GP_STROKE_NOFILL) == 0)) {
+ continue;
+ }
+
+ float boundbox_min[2];
+ float boundbox_max[2];
+ ED_gpencil_projected_2d_bound_box(&tgpf->gsc, gps, diff_mat, boundbox_min, boundbox_max);
+ minmax_v2v2_v2(objectbox_min, objectbox_max, boundbox_min);
+ minmax_v2v2_v2(objectbox_min, objectbox_max, boundbox_max);
+ }
+ }
+ /* Clamp max bound box. */
+ BLI_rctf_init(
+ &rect_bound, objectbox_min[0], objectbox_max[0], objectbox_min[1], objectbox_max[1]);
+ float r_xy[2];
+ BLI_rctf_clamp(&rect_bound, &rect_max, r_xy);
+
+ /* Calculate total width used. */
+ float width = tgpf->region->winx;
+ if (rect_bound.xmin < 0.0f) {
+ width -= rect_bound.xmin;
+ }
+ if (rect_bound.xmax > tgpf->region->winx) {
+ width += rect_bound.xmax - tgpf->region->winx;
+ }
+ /* Calculate total height used. */
+ float height = tgpf->region->winy;
+ if (rect_bound.ymin < 0.0f) {
+ height -= rect_bound.ymin;
+ }
+ if (rect_bound.ymax > tgpf->region->winy) {
+ height += rect_bound.ymax - tgpf->region->winy;
+ }
+
+ width = ceilf(width);
+ height = ceilf(height);
+
+ float zoomx = (width > tgpf->region->winx) ? width / (float)tgpf->region->winx : 1.0f;
+ float zoomy = (height > tgpf->region->winy) ? height / (float)tgpf->region->winy : 1.0f;
+ if ((zoomx != 1.0f) || (zoomy != 1.0f)) {
+ tgpf->zoom = min_ff(max_ff(zoomx, zoomy) * 1.5f, 5.0f);
+ }
+}
+
+static bool gpencil_do_frame_fill(tGPDfill *tgpf, const bool is_inverted)
+{
+ wmWindow *win = CTX_wm_window(tgpf->C);
+
+ /* render screen to temp image */
+ int totpoints = 1;
+ if (gpencil_render_offscreen(tgpf)) {
+
+ /* Set red borders to create a external limit. */
+ gpencil_set_borders(tgpf, true);
+
+ /* apply boundary fill */
+ gpencil_boundaryfill_area(tgpf);
+
+ /* Invert direction if press Ctrl. */
+ if (is_inverted) {
+ gpencil_invert_image(tgpf);
+ }
+
+ /* Clean borders to avoid infinite loops. */
+ gpencil_set_borders(tgpf, false);
+ WM_cursor_time(win, 50);
+ int totpoints_prv = 0;
+ int loop_limit = 0;
+ while (totpoints > 0) {
+ /* analyze outline */
+ gpencil_get_outline_points(tgpf, (totpoints == 1) ? true : false);
+
+ /* create array of points from stack */
+ totpoints = gpencil_points_from_stack(tgpf);
+
+ /* create z-depth array for reproject */
+ gpencil_get_depth_array(tgpf);
+
+ /* create stroke and reproject */
+ gpencil_stroke_from_buffer(tgpf);
+
+ if (is_inverted) {
+ gpencil_erase_processed_area(tgpf);
+ }
+ else {
+ /* Exit of the loop. */
+ totpoints = 0;
+ }
+
+ /* free temp stack data */
+ if (tgpf->stack) {
+ BLI_stack_free(tgpf->stack);
+ }
+ WM_cursor_time(win, 100);
+
+ /* Free memory. */
+ MEM_SAFE_FREE(tgpf->sbuffer);
+ MEM_SAFE_FREE(tgpf->depth_arr);
+
+ /* Limit very small areas. */
+ if (totpoints < 3) {
+ break;
+ }
+ /* Limit infinite loops is some corner cases. */
+ if (totpoints_prv == totpoints) {
+ loop_limit++;
+ if (loop_limit > 3) {
+ break;
+ }
+ }
+ totpoints_prv = totpoints;
+ }
+
+ /* Delete temp image. */
+ if ((tgpf->ima) && (!FILL_DEBUG)) {
+ BKE_id_free(tgpf->bmain, tgpf->ima);
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
/* events handling during interactive part of operator */
static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
tGPDfill *tgpf = op->customdata;
- Scene *scene = tgpf->scene;
Brush *brush = tgpf->brush;
BrushGpencilSettings *brush_settings = brush->gpencil_settings;
+ tgpf->on_back = RNA_boolean_get(op->ptr, "on_back");
+
const bool is_brush_inv = brush_settings->fill_direction == BRUSH_DIR_IN;
const bool is_inverted = (is_brush_inv && !event->ctrl) || (!is_brush_inv && event->ctrl);
-
- int estate = OPERATOR_PASS_THROUGH; /* default exit state - pass through */
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(tgpf->gpd);
+ const bool do_extend = (tgpf->fill_extend_fac > 0.0f);
+ const bool help_lines = ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) ||
+ ((tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) && (do_extend)));
+ int estate = OPERATOR_RUNNING_MODAL;
switch (event->type) {
case EVT_ESCKEY:
@@ -1572,82 +2047,104 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event)
estate = OPERATOR_CANCELLED;
break;
case LEFTMOUSE:
- tgpf->on_back = RNA_boolean_get(op->ptr, "on_back");
/* first time the event is not enabled to show help lines. */
- if ((tgpf->oldkey != -1) || ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) == 0)) {
+ if ((tgpf->oldkey != -1) || (!help_lines)) {
ARegion *region = BKE_area_find_region_xy(
CTX_wm_area(C), RGN_TYPE_ANY, event->x, event->y);
if (region) {
bool in_bounds = false;
-
/* Perform bounds check */
in_bounds = BLI_rcti_isect_pt(&region->winrct, event->x, event->y);
if ((in_bounds) && (region->regiontype == RGN_TYPE_WINDOW)) {
- tgpf->center[0] = event->mval[0];
- tgpf->center[1] = event->mval[1];
-
- /* Set active frame as current for filling. */
- tgpf->active_cfra = CFRA;
+ tgpf->mouse[0] = event->mval[0];
+ tgpf->mouse[1] = event->mval[1];
+ tgpf->is_render = true;
+ /* Define Zoom level. */
+ gpencil_zoom_level_set(tgpf);
+
+ /* Create Temp stroke. */
+ tgpf->gps_mouse = BKE_gpencil_stroke_new(0, 1, 10.0f);
+ tGPspoint point2D;
+ bGPDspoint *pt = &tgpf->gps_mouse->points[0];
+ copy_v2fl_v2i(&point2D.x, tgpf->mouse);
+ gpencil_stroke_convertcoords_tpoint(
+ tgpf->scene, tgpf->region, tgpf->ob, &point2D, NULL, &pt->x);
+
+ /* If not multiframe and there is no frame in CFRA for the active layer, create
+ * a new frame before to make the hash function can find something. */
+ if (!is_multiedit) {
+ tgpf->gpf = BKE_gpencil_layer_frame_get(
+ tgpf->gpl, tgpf->active_cfra, GP_GETFRAME_ADD_NEW);
+ tgpf->gpf->flag |= GP_FRAME_SELECT;
+ }
- /* render screen to temp image */
- int totpoints = 1;
- if (gpencil_render_offscreen(tgpf)) {
+ /* Hash of selected frames.*/
+ GHash *frame_list = BLI_ghash_int_new_ex(__func__, 64);
+ BKE_gpencil_frame_selected_hash(tgpf->gpd, frame_list);
- /* Set red borders to create a external limit. */
- gpencil_set_borders(tgpf, true);
+ /* Loop all frames. */
+ wmWindow *win = CTX_wm_window(C);
- /* apply boundary fill */
- gpencil_boundaryfill_area(tgpf);
+ GHashIterator gh_iter;
+ int total = BLI_ghash_len(frame_list);
+ int i = 1;
+ GHASH_ITER (gh_iter, frame_list) {
+ /* Set active frame as current for filling. */
+ tgpf->active_cfra = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
+ int step = ((float)i / (float)total) * 100.0f;
+ WM_cursor_time(win, step);
- /* Invert direction if press Ctrl. */
- if (is_inverted) {
- gpencil_invert_image(tgpf);
+ if (do_extend) {
+ gpencil_update_extend(tgpf);
}
- /* Clean borders to avoid infinite loops. */
- gpencil_set_borders(tgpf, false);
-
- while (totpoints > 0) {
- /* analyze outline */
- gpencil_get_outline_points(tgpf, (totpoints == 1) ? true : false);
-
- /* create array of points from stack */
- totpoints = gpencil_points_from_stack(tgpf);
-
- /* create z-depth array for reproject */
- gpencil_get_depth_array(tgpf);
-
- /* create stroke and reproject */
- gpencil_stroke_from_buffer(tgpf);
-
- if (is_inverted) {
- gpencil_erase_processed_area(tgpf);
- }
- else {
- /* Exit of the loop. */
- totpoints = 0;
- }
-
- /* free temp stack data */
- if (tgpf->stack) {
- BLI_stack_free(tgpf->stack);
+ /* Repeat loop until get something. */
+ tgpf->done = false;
+ int loop_limit = 0;
+ while ((!tgpf->done) && (loop_limit < 2)) {
+ WM_cursor_time(win, loop_limit + 1);
+ /* Render screen to temp image and do fill. */
+ gpencil_do_frame_fill(tgpf, is_inverted);
+
+ /* restore size */
+ tgpf->region->winx = (short)tgpf->bwinx;
+ tgpf->region->winy = (short)tgpf->bwiny;
+ tgpf->region->winrct = tgpf->brect;
+ if (!tgpf->done) {
+ /* If the zoom was not set before, avoid a loop. */
+ if (tgpf->zoom == 1.0f) {
+ loop_limit++;
+ }
+ else {
+ tgpf->zoom = 1.0f;
+ tgpf->fill_factor = max_ff(
+ GPENCIL_MIN_FILL_FAC,
+ min_ff(brush->gpencil_settings->fill_factor, GPENCIL_MAX_FILL_FAC));
+ }
}
+ loop_limit++;
+ }
- /* Free memory. */
- MEM_SAFE_FREE(tgpf->sbuffer);
- MEM_SAFE_FREE(tgpf->depth_arr);
+ if (do_extend) {
+ gpencil_delete_temp_stroke_extension(tgpf, true);
}
+
+ i++;
}
+ WM_cursor_modal_restore(win);
+ /* Free hash table. */
+ BLI_ghash_free(frame_list, NULL, NULL);
- /* restore size */
- tgpf->region->winx = (short)tgpf->bwinx;
- tgpf->region->winy = (short)tgpf->bwiny;
- tgpf->region->winrct = tgpf->brect;
+ /* Free temp stroke. */
+ BKE_gpencil_free_stroke(tgpf->gps_mouse);
/* push undo data */
gpencil_undo_push(tgpf->gpd);
+ /* Save extend value for next operation. */
+ brush_settings->fill_extend_fac = tgpf->fill_extend_fac;
+
estate = OPERATOR_FINISHED;
}
else {
@@ -1658,8 +2155,29 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event)
estate = OPERATOR_CANCELLED;
}
}
+ else if (do_extend) {
+ gpencil_update_extend(tgpf);
+ }
tgpf->oldkey = event->type;
break;
+ case EVT_PAGEUPKEY:
+ case WHEELUPMOUSE:
+ if (tgpf->oldkey == 1) {
+ tgpf->fill_extend_fac -= (event->shift) ? 0.01f : 0.1f;
+ CLAMP_MIN(tgpf->fill_extend_fac, 0.0f);
+ gpencil_update_extend(tgpf);
+ }
+ break;
+ case EVT_PAGEDOWNKEY:
+ case WHEELDOWNMOUSE:
+ if (tgpf->oldkey == 1) {
+ tgpf->fill_extend_fac += (event->shift) ? 0.01f : 0.1f;
+ CLAMP_MAX(tgpf->fill_extend_fac, 100.0f);
+ gpencil_update_extend(tgpf);
+ }
+ break;
+ default:
+ break;
}
/* process last operations before exiting */
switch (estate) {
@@ -1672,7 +2190,7 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event)
gpencil_fill_exit(C, op);
break;
- case OPERATOR_RUNNING_MODAL | OPERATOR_PASS_THROUGH:
+ default:
break;
}
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 4a908eff92e..c6f74c39beb 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -103,55 +103,6 @@ typedef struct tGPDdraw {
float diff_mat[4][4]; /* matrix */
} tGPDdraw;
-/* Temporary interpolate operation data */
-typedef struct tGPDinterpolate_layer {
- struct tGPDinterpolate_layer *next, *prev;
-
- /** layer */
- struct bGPDlayer *gpl;
- /** frame before current frame (interpolate-from) */
- struct bGPDframe *prevFrame;
- /** frame after current frame (interpolate-to) */
- struct bGPDframe *nextFrame;
- /** interpolated frame */
- struct bGPDframe *interFrame;
- /** interpolate factor */
- float factor;
-
-} tGPDinterpolate_layer;
-
-typedef struct tGPDinterpolate {
- /** Current depsgraph from context */
- struct Depsgraph *depsgraph;
- /** current scene from context */
- struct Scene *scene;
- /** area where painting originated */
- struct ScrArea *area;
- /** region where painting originated */
- struct ARegion *region;
- /** current GP datablock */
- struct bGPdata *gpd;
- /** current material */
- struct Material *mat;
-
- /** current frame number */
- int cframe;
- /** (tGPDinterpolate_layer) layers to be interpolated */
- ListBase ilayers;
- /** value for determining the displacement influence */
- float shift;
- /** initial interpolation factor for active layer */
- float init_factor;
- /** shift low limit (-100%) */
- float low_limit;
- /** shift upper limit (200%) */
- float high_limit;
- /** flag from toolsettings */
- int flag;
-
- NumInput num; /* numeric input */
-} tGPDinterpolate;
-
/* Modal Operator Drawing Callbacks ------------------------ */
void ED_gpencil_draw_fill(struct tGPDdraw *tgpw);
@@ -341,7 +292,7 @@ bool gpencil_brush_create_presets_poll(bContext *C);
extern ListBase gpencil_strokes_copypastebuf;
-/* Build a map for converting between old colornames and destination-color-refs */
+/* Build a map for converting between old color-names and destination-color-refs. */
struct GHash *gpencil_copybuf_validate_colormap(struct bContext *C);
/* Stroke Editing ------------------------------------ */
@@ -611,7 +562,7 @@ typedef struct bActListElem {
struct bActionGroup *grp; /* action group that owns the channel */
- void *owner; /* will either be an action channel or fake ipo-channel (for keys) */
+ void *owner; /* will either be an action channel or fake IPO-channel (for keys) */
short ownertype; /* type of owner */
} bActListElem;
@@ -624,7 +575,7 @@ typedef enum ACTFILTER_FLAGS {
ACTFILTER_SEL = (1 << 1), /* should channels be selected */
ACTFILTER_FOREDIT = (1 << 2), /* does editable status matter */
ACTFILTER_CHANNELS = (1 << 3), /* do we only care that it is a channel */
- ACTFILTER_IPOKEYS = (1 << 4), /* only channels referencing ipo's */
+ ACTFILTER_IPOKEYS = (1 << 4), /* only channels referencing IPO's */
ACTFILTER_ONLYICU = (1 << 5), /* only reference ipo-curves */
ACTFILTER_FORDRAWING = (1 << 6), /* make list for interface drawing */
ACTFILTER_ACTGROUPED = (1 << 7), /* belongs to the active group */
@@ -667,7 +618,8 @@ struct GP_EditableStrokes_Iter {
bGPDframe *init_gpf_ = (is_multiedit_) ? gpl->frames.first : gpl->actframe; \
for (bGPDframe *gpf_ = init_gpf_; gpf_; gpf_ = gpf_->next) { \
if ((gpf_ == gpl->actframe) || ((gpf_->flag & GP_FRAME_SELECT) && is_multiedit_)) { \
- BKE_gpencil_parent_matrix_get(depsgraph_, obact_, gpl, gpstroke_iter.diff_mat); \
+ BKE_gpencil_layer_transform_matrix_get( \
+ depsgraph_, obact_, gpl, gpstroke_iter.diff_mat); \
invert_m4_m4(gpstroke_iter.inverse_diff_mat, gpstroke_iter.diff_mat); \
/* loop over strokes */ \
bGPDstroke *gpsn_; \
@@ -678,7 +630,7 @@ struct GP_EditableStrokes_Iter {
continue; \
} \
/* check if the color is editable */ \
- if (ED_gpencil_stroke_color_use(obact_, gpl, gps) == false) { \
+ if (ED_gpencil_stroke_material_editable(obact_, gpl, gps) == false) { \
continue; \
} \
/* ... Do Stuff With Strokes ... */
@@ -718,7 +670,8 @@ struct GP_EditableStrokes_Iter {
bGPDframe *init_gpf_ = (is_multiedit_) ? gpl->frames.first : gpl->actframe; \
for (bGPDframe *gpf_ = init_gpf_; gpf_; gpf_ = gpf_->next) { \
if ((gpf_ == gpl->actframe) || ((gpf_->flag & GP_FRAME_SELECT) && is_multiedit_)) { \
- BKE_gpencil_parent_matrix_get(depsgraph_, obact_, gpl, gpstroke_iter.diff_mat); \
+ BKE_gpencil_layer_transform_matrix_get( \
+ depsgraph_, obact_, gpl, gpstroke_iter.diff_mat); \
invert_m4_m4(gpstroke_iter.inverse_diff_mat, gpstroke_iter.diff_mat); \
/* loop over strokes */ \
bGPDstroke *gpsn_; \
@@ -767,8 +720,10 @@ struct GP_EditableStrokes_Iter {
bGPDframe *init_gpf_ = (is_multiedit_) ? gpl->frames.first : gpl->actframe; \
for (bGPDframe *gpf_ = init_gpf_; gpf_; gpf_ = gpf_->next) { \
if ((gpf_ == gpl->actframe) || ((gpf_->flag & GP_FRAME_SELECT) && is_multiedit_)) { \
- BKE_gpencil_parent_matrix_get(depsgraph_, obact_, gpl, gpstroke_iter.diff_mat); \
- invert_m4_m4(gpstroke_iter.inverse_diff_mat, gpstroke_iter.diff_mat); \
+ BKE_gpencil_layer_transform_matrix_get( \
+ depsgraph_, obact_, gpl, gpstroke_iter.diff_mat); \
+ /* Undo layer transform. */ \
+ mul_m4_m4m4(gpstroke_iter.diff_mat, gpstroke_iter.diff_mat, gpl->layer_invmat); \
/* loop over strokes */ \
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf_->strokes) { \
/* skip strokes that are invalid for current view */ \
@@ -776,7 +731,7 @@ struct GP_EditableStrokes_Iter {
continue; \
} \
/* check if the color is editable */ \
- if (ED_gpencil_stroke_color_use(obact_, gpl, gps) == false) { \
+ if (ED_gpencil_stroke_material_editable(obact_, gpl, gps) == false) { \
continue; \
} \
/* ... Do Stuff With Strokes ... */
diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c
index c666fcb67b7..1823a962926 100644
--- a/source/blender/editors/gpencil/gpencil_interpolate.c
+++ b/source/blender/editors/gpencil/gpencil_interpolate.c
@@ -32,6 +32,7 @@
#include "BLI_blenlib.h"
#include "BLI_easing.h"
+#include "BLI_ghash.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
@@ -48,7 +49,6 @@
#include "BKE_colortools.h"
#include "BKE_context.h"
-#include "BKE_deform.h"
#include "BKE_gpencil.h"
#include "BKE_gpencil_geom.h"
#include "BKE_report.h"
@@ -61,21 +61,86 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#include "RNA_enum_types.h"
-
-#include "UI_view2d.h"
#include "ED_gpencil.h"
-#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_space_api.h"
-#include "ED_view3d.h"
#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_query.h"
#include "gpencil_intern.h"
+/* Temporary interpolate operation data */
+typedef struct tGPDinterpolate_layer {
+ struct tGPDinterpolate_layer *next, *prev;
+
+ /** layer */
+ struct bGPDlayer *gpl;
+ /** frame before current frame (interpolate-from) */
+ struct bGPDframe *prevFrame;
+ /** frame after current frame (interpolate-to) */
+ struct bGPDframe *nextFrame;
+ /** interpolated frame */
+ struct bGPDframe *interFrame;
+ /** interpolate factor */
+ float factor;
+
+ /* Hash tablets to create temp relationship between strokes. */
+ struct GHash *used_strokes;
+ struct GHash *pair_strokes;
+
+} tGPDinterpolate_layer;
+
+typedef struct tGPDinterpolate {
+ /** Current depsgraph from context */
+ struct Depsgraph *depsgraph;
+ /** current scene from context */
+ struct Scene *scene;
+ /** area where painting originated */
+ struct ScrArea *area;
+ /** region where painting originated */
+ struct ARegion *region;
+ /** current object */
+ struct Object *ob;
+ /** current GP datablock */
+ struct bGPdata *gpd;
+ /** current material */
+ struct Material *mat;
+ /* Space Conversion Data */
+ struct GP_SpaceConversion gsc;
+
+ /** current frame number */
+ int cframe;
+ /** (tGPDinterpolate_layer) layers to be interpolated */
+ ListBase ilayers;
+ /** value for determining the displacement influence */
+ float shift;
+ /** initial interpolation factor for active layer */
+ float init_factor;
+ /** shift low limit (-100%) */
+ float low_limit;
+ /** shift upper limit (200%) */
+ float high_limit;
+ /** flag from toolsettings */
+ int flag;
+ /** Flip mode. */
+ int flipmode;
+ /** smooth factor */
+ float smooth_factor;
+ /** smooth iterations */
+ int smooth_steps;
+
+ NumInput num; /* numeric input */
+} tGPDinterpolate;
+
+typedef enum eGP_InterpolateFlipMode {
+ /* No flip. */
+ GP_INTERPOLATE_NOFLIP = 0,
+ /* Flip always. */
+ GP_INTERPOLATE_FLIP = 1,
+ /* Flip if needed. */
+ GP_INTERPOLATE_FLIPAUTO = 2,
+} eGP_InterpolateFlipMode;
+
/* ************************************************ */
/* Core/Shared Utilities */
@@ -88,17 +153,150 @@ static bool gpencil_view3d_poll(bContext *C)
/* only 3D view */
ScrArea *area = CTX_wm_area(C);
if (area && area->spacetype != SPACE_VIEW3D) {
- return 0;
+ return false;
}
/* need data to interpolate */
if (ELEM(NULL, gpd, gpl)) {
- return 0;
+ return false;
}
- return 1;
+ return true;
+}
+
+/* Return if the stroke must be flipped or not. The logic of the calculation
+ * is to check if the lines from extremes crossed. All is done in 2D. */
+static bool gpencil_stroke_need_flip(Depsgraph *depsgraph,
+ Object *ob,
+ bGPDlayer *gpl,
+ GP_SpaceConversion *gsc,
+ bGPDstroke *gps_from,
+ bGPDstroke *gps_to)
+{
+ float diff_mat[4][4];
+ /* calculate parent matrix */
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, ob, gpl, diff_mat);
+ bGPDspoint *pt, pt_dummy_ps;
+ float v1a[2], v1b[2], v2a[2], v2b[2];
+
+ /* Line from start of strokes. */
+ pt = &gps_from->points[0];
+ gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps);
+ gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v1a[0], &v1a[1]);
+
+ pt = &gps_to->points[0];
+ gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps);
+ gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v1b[0], &v1b[1]);
+
+ /* Line from end of strokes. */
+ pt = &gps_from->points[gps_from->totpoints - 1];
+ gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps);
+ gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v2a[0], &v2a[1]);
+
+ pt = &gps_to->points[gps_to->totpoints - 1];
+ gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps);
+ gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v2b[0], &v2b[1]);
+
+ if (isect_seg_seg_v2(v1a, v1b, v2a, v2b) == ISECT_LINE_LINE_CROSS) {
+ return true;
+ }
+
+ return false;
+}
+
+/* Return the stroke related to the selection index, returning the stroke with
+ * the smallest selection index greater than reference index. */
+static bGPDstroke *gpencil_stroke_get_related(GHash *used_strokes,
+ bGPDframe *gpf,
+ const int reference_index)
+{
+ bGPDstroke *gps_found = NULL;
+ int lower_index = INT_MAX;
+ LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
+ if (gps->select_index > reference_index) {
+ if (!BLI_ghash_haskey(used_strokes, gps)) {
+ if (gps->select_index < lower_index) {
+ lower_index = gps->select_index;
+ gps_found = gps;
+ }
+ }
+ }
+ }
+
+ /* Set as used. */
+ if (gps_found) {
+ BLI_ghash_insert(used_strokes, gps_found, gps_found);
+ }
+
+ return gps_found;
+}
+
+/* Load a Hash with the relationship between strokes. */
+static void gpencil_stroke_pair_table(bContext *C,
+ tGPDinterpolate *tgpi,
+ tGPDinterpolate_layer *tgpil)
+{
+ bGPdata *gpd = tgpi->gpd;
+ const bool only_selected = ((GPENCIL_EDIT_MODE(gpd)) &&
+ ((tgpi->flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) != 0));
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+
+ /* Create hash tablets with relationship between strokes. */
+ tgpil->used_strokes = BLI_ghash_ptr_new(__func__);
+ tgpil->pair_strokes = BLI_ghash_ptr_new(__func__);
+
+ /* Create a table with source and target pair of strokes. */
+ LISTBASE_FOREACH (bGPDstroke *, gps_from, &tgpil->prevFrame->strokes) {
+ bGPDstroke *gps_to = NULL;
+ /* only selected */
+ if ((GPENCIL_EDIT_MODE(gpd)) && (only_selected) &&
+ ((gps_from->flag & GP_STROKE_SELECT) == 0)) {
+ continue;
+ }
+ /* skip strokes that are invalid for current view */
+ if (ED_gpencil_stroke_can_use(C, gps_from) == false) {
+ continue;
+ }
+ /* Check if the material is editable. */
+ if (ED_gpencil_stroke_material_editable(tgpi->ob, tgpil->gpl, gps_from) == false) {
+ continue;
+ }
+ /* Try to get the related stroke. */
+ if ((is_multiedit) && (gps_from->select_index > 0)) {
+ gps_to = gpencil_stroke_get_related(
+ tgpil->used_strokes, tgpil->nextFrame, gps_from->select_index);
+ }
+ /* If not found, get final stroke to interpolate using position in the array. */
+ if (gps_to == NULL) {
+ int fFrame = BLI_findindex(&tgpil->prevFrame->strokes, gps_from);
+ gps_to = BLI_findlink(&tgpil->nextFrame->strokes, fFrame);
+ }
+
+ if (ELEM(NULL, gps_from, gps_to)) {
+ continue;
+ }
+ /* Insert the pair entry in the hash table. */
+ BLI_ghash_insert(tgpil->pair_strokes, gps_from, gps_to);
+ }
}
+static void gpencil_interpolate_smooth_stroke(bGPDstroke *gps,
+ float smooth_factor,
+ int smooth_steps)
+{
+ if (smooth_factor == 0.0f) {
+ return;
+ }
+
+ float reduce = 0.0f;
+ for (int r = 0; r < smooth_steps; r++) {
+ for (int i = 0; i < gps->totpoints - 1; i++) {
+ BKE_gpencil_stroke_smooth(gps, i, smooth_factor - reduce);
+ BKE_gpencil_stroke_smooth_strength(gps, i, smooth_factor);
+ }
+ reduce += 0.25f; /* reduce the factor */
+ }
+}
/* Perform interpolation */
static void gpencil_interpolate_update_points(const bGPDstroke *gps_from,
const bGPDstroke *gps_to,
@@ -121,7 +319,7 @@ static void gpencil_interpolate_update_points(const bGPDstroke *gps_from,
/* ****************** Interpolate Interactive *********************** */
/* Helper: free all temp strokes for display. */
-static void gpencil_interpolate_free_temp_strokes(bGPDframe *gpf)
+static void gpencil_interpolate_free_tagged_strokes(bGPDframe *gpf)
{
if (gpf == NULL) {
return;
@@ -161,33 +359,34 @@ static void gpencil_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgp
const float factor = tgpil->factor + shift;
bGPDframe *gpf = tgpil->gpl->actframe;
- /* Free temp strokes. */
- gpencil_interpolate_free_temp_strokes(gpf);
+ /* Free temp strokes used for display. */
+ gpencil_interpolate_free_tagged_strokes(gpf);
- LISTBASE_FOREACH (bGPDstroke *, new_stroke, &tgpil->interFrame->strokes) {
- bGPDstroke *gps_from, *gps_to;
- int stroke_idx;
+ /* Clear previous interpolations. */
+ gpencil_interpolate_free_tagged_strokes(tgpil->interFrame);
- if (new_stroke->totpoints == 0) {
- continue;
- }
-
- /* get strokes to interpolate */
- stroke_idx = BLI_findindex(&tgpil->interFrame->strokes, new_stroke);
+ GHashIterator gh_iter;
+ GHASH_ITER (gh_iter, tgpil->pair_strokes) {
+ bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter);
+ bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter);
+ /* Create new stroke. */
+ bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true);
+ new_stroke->flag |= GP_STROKE_TAG;
+ new_stroke->select_index = 0;
- gps_from = BLI_findlink(&tgpil->prevFrame->strokes, stroke_idx);
- gps_to = BLI_findlink(&tgpil->nextFrame->strokes, stroke_idx);
+ /* Update points position. */
+ gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor);
- /* update points position */
- if ((gps_from) && (gps_to)) {
- gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor);
+ /* Calc geometry data. */
+ BKE_gpencil_stroke_geometry_update(gpd, new_stroke);
+ /* Add to strokes. */
+ BLI_addtail(&tgpil->interFrame->strokes, new_stroke);
- /* Add temp strokes. */
- if (gpf) {
- bGPDstroke *gps_eval = BKE_gpencil_stroke_duplicate(new_stroke, true, true);
- gps_eval->flag |= GP_STROKE_TAG;
- BLI_addtail(&gpf->strokes, gps_eval);
- }
+ /* Add temp strokes to display. */
+ if (gpf) {
+ bGPDstroke *gps_eval = BKE_gpencil_stroke_duplicate(new_stroke, true, true);
+ gps_eval->flag |= GP_STROKE_TAG;
+ BLI_addtail(&gpf->strokes, gps_eval);
}
}
}
@@ -196,65 +395,50 @@ static void gpencil_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgp
WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL);
}
-/* Helper: Verify valid strokes for interpolation */
-static bool gpencil_interpolate_check_todo(bContext *C, bGPdata *gpd)
+/* Helper: Get previous keyframe. */
+static bGPDframe *gpencil_get_previous_keyframe(bGPDlayer *gpl, int cfra)
{
- Object *ob = CTX_data_active_object(C);
- ToolSettings *ts = CTX_data_tool_settings(C);
- eGP_Interpolate_SettingsFlag flag = ts->gp_interpolate.flag;
+ if (gpl->actframe != NULL && gpl->actframe->framenum < cfra &&
+ gpl->actframe->key_type == BEZT_KEYTYPE_KEYFRAME) {
+ return gpl->actframe;
+ }
- /* get layers */
- LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
- /* all layers or only active */
- if (!(flag & GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS) && !(gpl->flag & GP_LAYER_ACTIVE)) {
+ LISTBASE_FOREACH_BACKWARD (bGPDframe *, gpf, &gpl->frames) {
+ if (gpf->key_type != BEZT_KEYTYPE_KEYFRAME) {
continue;
}
- /* only editable and visible layers are considered */
- if (!BKE_gpencil_layer_is_editable(gpl) || (gpl->actframe == NULL)) {
+ if (gpf->framenum >= cfra) {
continue;
}
+ return gpf;
+ }
- /* read strokes */
- LISTBASE_FOREACH (bGPDstroke *, gps_from, &gpl->actframe->strokes) {
- bGPDstroke *gps_to;
- int fFrame;
-
- /* only selected */
- if ((GPENCIL_EDIT_MODE(gpd)) && (flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) &&
- ((gps_from->flag & GP_STROKE_SELECT) == 0)) {
- continue;
- }
- /* skip strokes that are invalid for current view */
- if (ED_gpencil_stroke_can_use(C, gps_from) == false) {
- continue;
- }
- /* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps_from) == false) {
- continue;
- }
-
- /* get final stroke to interpolate */
- fFrame = BLI_findindex(&gpl->actframe->strokes, gps_from);
- gps_to = (gpl->actframe->next != NULL) ?
- BLI_findlink(&gpl->actframe->next->strokes, fFrame) :
- NULL;
- if (gps_to == NULL) {
- continue;
- }
+ return NULL;
+}
- return true;
+/* Helper: Get next keyframe. */
+static bGPDframe *gpencil_get_next_keyframe(bGPDlayer *gpl, int cfra)
+{
+ LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
+ if (gpf->key_type != BEZT_KEYTYPE_KEYFRAME) {
+ continue;
+ }
+ if (gpf->framenum <= cfra) {
+ continue;
}
+ return gpf;
}
- return false;
+
+ return NULL;
}
/* Helper: Create internal strokes interpolated */
static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
{
+ Scene *scene = tgpi->scene;
bGPdata *gpd = tgpi->gpd;
bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C);
bGPDframe *actframe = active_gpl->actframe;
- Object *ob = CTX_data_active_object(C);
/* save initial factor for active layer to define shift limits */
tgpi->init_factor = (float)(tgpi->cframe - actframe->framenum) /
@@ -283,12 +467,15 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
tgpil = MEM_callocN(sizeof(tGPDinterpolate_layer), "GPencil Interpolate Layer");
tgpil->gpl = gpl;
- tgpil->prevFrame = BKE_gpencil_frame_duplicate(gpl->actframe);
- tgpil->nextFrame = BKE_gpencil_frame_duplicate(gpl->actframe->next);
+ bGPDframe *gpf = gpencil_get_previous_keyframe(gpl, CFRA);
+ tgpil->prevFrame = BKE_gpencil_frame_duplicate(gpf, true);
+
+ gpf = gpencil_get_next_keyframe(gpl, CFRA);
+ tgpil->nextFrame = BKE_gpencil_frame_duplicate(gpf, true);
BLI_addtail(&tgpi->ilayers, tgpil);
- /* create a new temporary frame */
+ /* Create a new temporary frame. */
tgpil->interFrame = MEM_callocN(sizeof(bGPDframe), "bGPDframe");
tgpil->interFrame->framenum = tgpi->cframe;
@@ -296,62 +483,42 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
tgpil->factor = (float)(tgpi->cframe - tgpil->prevFrame->framenum) /
(tgpil->nextFrame->framenum - tgpil->prevFrame->framenum + 1);
- /* create new strokes data with interpolated points reading original stroke */
- LISTBASE_FOREACH (bGPDstroke *, gps_from, &tgpil->prevFrame->strokes) {
- bGPDstroke *gps_to;
- int fFrame;
+ /* Load the relationship between frames. */
+ gpencil_stroke_pair_table(C, tgpi, tgpil);
- bGPDstroke *new_stroke = NULL;
- bool valid = true;
+ /* Create new strokes data with interpolated points reading original stroke. */
+ GHashIterator gh_iter;
+ GHASH_ITER (gh_iter, tgpil->pair_strokes) {
+ bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter);
+ bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter);
- /* only selected */
- if ((GPENCIL_EDIT_MODE(gpd)) && (tgpi->flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) &&
- ((gps_from->flag & GP_STROKE_SELECT) == 0)) {
- valid = false;
+ /* If destination stroke is smaller, resize new_stroke to size of gps_to stroke. */
+ if (gps_from->totpoints > gps_to->totpoints) {
+ BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true);
}
- /* skip strokes that are invalid for current view */
- if (ED_gpencil_stroke_can_use(C, gps_from) == false) {
- valid = false;
+ if (gps_to->totpoints > gps_from->totpoints) {
+ BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true);
}
- /* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, tgpil->gpl, gps_from) == false) {
- valid = false;
+ /* Flip stroke. */
+ if (tgpi->flipmode == GP_INTERPOLATE_FLIP) {
+ BKE_gpencil_stroke_flip(gps_to);
}
-
- /* get final stroke to interpolate */
- fFrame = BLI_findindex(&tgpil->prevFrame->strokes, gps_from);
- gps_to = BLI_findlink(&tgpil->nextFrame->strokes, fFrame);
- if (gps_to == NULL) {
- valid = false;
- }
-
- if (valid) {
- /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */
- if (gps_from->totpoints > gps_to->totpoints) {
- BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true);
+ else if (tgpi->flipmode == GP_INTERPOLATE_FLIPAUTO) {
+ if (gpencil_stroke_need_flip(
+ tgpi->depsgraph, tgpi->ob, gpl, &tgpi->gsc, gps_from, gps_to)) {
+ BKE_gpencil_stroke_flip(gps_to);
}
- if (gps_to->totpoints > gps_from->totpoints) {
- BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true);
- }
-
- /* Create new stroke. */
- new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true);
-
- /* Update points position. */
- gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, tgpil->factor);
}
- else {
- /* Create new stroke. */
- new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true);
- /* need an empty stroke to keep index correct for lookup, but resize to smallest size */
- new_stroke->totpoints = 0;
- new_stroke->points = MEM_recallocN(new_stroke->points, sizeof(*new_stroke->points));
- if (new_stroke->dvert != NULL) {
- new_stroke->dvert = MEM_recallocN(new_stroke->dvert, sizeof(*new_stroke->dvert));
- }
- }
+ /* Create new stroke. */
+ bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true);
+ new_stroke->flag |= GP_STROKE_TAG;
+ new_stroke->select_index = 0;
+
+ /* Update points position. */
+ gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, tgpil->factor);
+ gpencil_interpolate_smooth_stroke(new_stroke, tgpi->smooth_factor, tgpi->smooth_steps);
/* Calc geometry data. */
BKE_gpencil_stroke_geometry_update(gpd, new_stroke);
@@ -438,7 +605,7 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op)
/* Clear any temp stroke. */
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
- gpencil_interpolate_free_temp_strokes(gpf);
+ gpencil_interpolate_free_tagged_strokes(gpf);
}
}
@@ -450,9 +617,18 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op)
MEM_SAFE_FREE(tgpil->prevFrame);
MEM_SAFE_FREE(tgpil->nextFrame);
MEM_SAFE_FREE(tgpil->interFrame);
+
+ /* Free Hash tablets. */
+ if (tgpil->used_strokes != NULL) {
+ BLI_ghash_free(tgpil->used_strokes, NULL, NULL);
+ }
+ if (tgpil->pair_strokes != NULL) {
+ BLI_ghash_free(tgpil->pair_strokes, NULL, NULL);
+ }
}
BLI_freelistN(&tgpi->ilayers);
+
MEM_SAFE_FREE(tgpi);
}
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
@@ -465,24 +641,33 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op)
/* Init new temporary interpolation data */
static bool gpencil_interpolate_set_init_values(bContext *C, wmOperator *op, tGPDinterpolate *tgpi)
{
- ToolSettings *ts = CTX_data_tool_settings(C);
- bGPdata *gpd = CTX_data_gpencil_data(C);
-
/* set current scene and window */
tgpi->depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
tgpi->scene = CTX_data_scene(C);
tgpi->area = CTX_wm_area(C);
tgpi->region = CTX_wm_region(C);
- tgpi->flag = ts->gp_interpolate.flag;
+ tgpi->ob = CTX_data_active_object(C);
+ /* Setup space conversions. */
+ gpencil_point_conversion_init(C, &tgpi->gsc);
/* set current frame number */
tgpi->cframe = tgpi->scene->r.cfra;
/* set GP datablock */
- tgpi->gpd = gpd;
-
+ tgpi->gpd = tgpi->ob->data;
/* set interpolation weight */
tgpi->shift = RNA_float_get(op->ptr, "shift");
+ SET_FLAG_FROM_TEST(
+ tgpi->flag, (RNA_enum_get(op->ptr, "layers") == 1), GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS);
+ SET_FLAG_FROM_TEST(
+ tgpi->flag,
+ ((GPENCIL_EDIT_MODE(tgpi->gpd)) && (RNA_boolean_get(op->ptr, "interpolate_selected_only"))),
+ GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED);
+
+ tgpi->flipmode = RNA_enum_get(op->ptr, "flip");
+
+ tgpi->smooth_factor = RNA_float_get(op->ptr, "smooth_factor");
+ tgpi->smooth_steps = RNA_int_get(op->ptr, "smooth_steps");
/* Untag strokes to be sure nothing is pending due any canceled process. */
LISTBASE_FOREACH (bGPDlayer *, gpl, &tgpi->gpd->layers) {
@@ -533,12 +718,13 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent
bGPdata *gpd = CTX_data_gpencil_data(C);
bGPDlayer *gpl = CTX_data_active_gpencil_layer(C);
Scene *scene = CTX_data_scene(C);
- int cfra = CFRA;
- bGPDframe *actframe = gpl->actframe;
tGPDinterpolate *tgpi = NULL;
/* cannot interpolate if not between 2 frames */
- if (ELEM(NULL, actframe, actframe->next)) {
+ int cfra = CFRA;
+ bGPDframe *gpf_prv = gpencil_get_previous_keyframe(gpl, cfra);
+ bGPDframe *gpf_next = gpencil_get_next_keyframe(gpl, cfra);
+ if (ELEM(NULL, gpf_prv, gpf_next)) {
BKE_report(
op->reports,
RPT_ERROR,
@@ -546,25 +732,10 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent
return OPERATOR_CANCELLED;
}
- /* cannot interpolate in extremes */
- if (ELEM(cfra, actframe->framenum, actframe->next->framenum)) {
- BKE_report(op->reports,
- RPT_ERROR,
- "Cannot interpolate as current frame already has existing grease pencil frames");
- return OPERATOR_CANCELLED;
- }
-
if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) {
BKE_report(op->reports, RPT_ERROR, "Cannot interpolate in curve edit mode");
return OPERATOR_CANCELLED;
}
-
- /* need editable strokes */
- if (!gpencil_interpolate_check_todo(C, gpd)) {
- BKE_report(op->reports, RPT_ERROR, "Interpolation requires some editable strokes");
- return OPERATOR_CANCELLED;
- }
-
/* try to initialize context data needed */
if (!gpencil_interpolate_init(C, op)) {
if (op->customdata) {
@@ -611,8 +782,7 @@ static int gpencil_interpolate_modal(bContext *C, wmOperator *op, const wmEvent
gpf_dst = BKE_gpencil_layer_frame_get(tgpil->gpl, tgpi->cframe, GP_GETFRAME_ADD_NEW);
gpf_dst->key_type = BEZT_KEYTYPE_BREAKDOWN;
- /* copy strokes */
- BLI_listbase_clear(&gpf_dst->strokes);
+ /* Copy strokes. */
LISTBASE_FOREACH (bGPDstroke *, gps_src, &tgpil->interFrame->strokes) {
if (gps_src->totpoints == 0) {
continue;
@@ -719,6 +889,15 @@ static void gpencil_interpolate_cancel(bContext *C, wmOperator *op)
void GPENCIL_OT_interpolate(wmOperatorType *ot)
{
+ static const EnumPropertyItem flip_modes[] = {
+ {GP_INTERPOLATE_NOFLIP, "NOFLIP", 0, "No Flip", ""},
+ {GP_INTERPOLATE_FLIP, "FLIP", 0, "Flip", ""},
+ {GP_INTERPOLATE_FLIPAUTO, "AUTO", 0, "Automatic", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ PropertyRNA *prop;
+
/* identifiers */
ot->name = "Grease Pencil Interpolation";
ot->idname = "GPENCIL_OT_interpolate";
@@ -733,8 +912,14 @@ void GPENCIL_OT_interpolate(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_UNDO | OPTYPE_BLOCKING;
+ static const EnumPropertyItem gpencil_interpolation_layer_items[] = {
+ {0, "ACTIVE", 0, "Active", ""},
+ {1, "ALL", 0, "All Layers", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
/* properties */
- RNA_def_float_percentage(
+ RNA_def_float_factor(
ot->srna,
"shift",
0.0f,
@@ -744,25 +929,68 @@ void GPENCIL_OT_interpolate(wmOperatorType *ot)
"Bias factor for which frame has more influence on the interpolated strokes",
-0.9f,
0.9f);
+
+ RNA_def_enum(ot->srna,
+ "layers",
+ gpencil_interpolation_layer_items,
+ 0,
+ "Layer",
+ "Layers included in the interpolation");
+
+ RNA_def_boolean(ot->srna,
+ "interpolate_selected_only",
+ 0,
+ "Only Selected",
+ "Interpolate only selected strokes");
+
+ RNA_def_enum(ot->srna,
+ "flip",
+ flip_modes,
+ GP_INTERPOLATE_FLIPAUTO,
+ "Flip Mode",
+ "Invert destination stroke to match start and end with source stroke");
+
+ RNA_def_int(ot->srna,
+ "smooth_steps",
+ 1,
+ 1,
+ 3,
+ "Iterations",
+ "Number of times to smooth newly created strokes",
+ 1,
+ 3);
+
+ RNA_def_float(ot->srna,
+ "smooth_factor",
+ 0.0f,
+ 0.0f,
+ 2.0f,
+ "Smooth",
+ "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise",
+ 0.0f,
+ 2.0f);
+
+ prop = RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", "");
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
/* ****************** Interpolate Sequence *********************** */
/* Helper: Perform easing equation calculations for GP interpolation operator */
-static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_settings, float time)
+static float gpencil_interpolate_seq_easing_calc(wmOperator *op, float time)
{
const float begin = 0.0f;
const float change = 1.0f;
const float duration = 1.0f;
- const float back = ipo_settings->back;
- const float amplitude = ipo_settings->amplitude;
- const float period = ipo_settings->period;
-
- eBezTriple_Easing easing = ipo_settings->easing;
+ const float back = RNA_float_get(op->ptr, "back");
+ const float amplitude = RNA_float_get(op->ptr, "amplitude");
+ const float period = RNA_float_get(op->ptr, "period");
+ const eBezTriple_Easing easing = RNA_enum_get(op->ptr, "easing");
+ const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type");
float result = time;
- switch (ipo_settings->type) {
+ switch (type) {
case GP_IPO_BACK:
switch (easing) {
case BEZT_IPO_EASE_IN:
@@ -945,7 +1173,7 @@ static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_se
break;
default:
- printf("%s: Unknown interpolation type - %d\n", __func__, ipo_settings->type);
+ printf("%s: Unknown interpolation type\n", __func__);
break;
}
@@ -954,34 +1182,47 @@ static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_se
static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op)
{
- bGPdata *gpd = CTX_data_gpencil_data(C);
+ Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+ Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = CTX_data_tool_settings(C);
+ Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = ob->data;
bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C);
- bGPDframe *actframe = active_gpl->actframe;
+ /* Setup space conversions. */
+ GP_SpaceConversion gsc;
+ gpencil_point_conversion_init(C, &gsc);
- Object *ob = CTX_data_active_object(C);
- ToolSettings *ts = CTX_data_tool_settings(C);
- Scene *scene = CTX_data_scene(C);
int cfra = CFRA;
GP_Interpolate_Settings *ipo_settings = &ts->gp_interpolate;
- eGP_Interpolate_SettingsFlag flag = ipo_settings->flag;
- const int step = ipo_settings->step;
+ const int step = RNA_int_get(op->ptr, "step");
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool all_layers = (bool)(RNA_enum_get(op->ptr, "layers") == 1);
+ const bool only_selected = ((GPENCIL_EDIT_MODE(gpd)) &&
+ (RNA_boolean_get(op->ptr, "interpolate_selected_only") != 0));
- /* cannot interpolate if not between 2 frames */
- if (ELEM(NULL, actframe, actframe->next)) {
+ eGP_InterpolateFlipMode flipmode = RNA_enum_get(op->ptr, "flip");
+
+ const float smooth_factor = RNA_float_get(op->ptr, "smooth_factor");
+ const int smooth_steps = RNA_int_get(op->ptr, "smooth_steps");
+
+ const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type");
+
+ if (ipo_settings->custom_ipo == NULL) {
+ ipo_settings->custom_ipo = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
+ }
+ BKE_curvemapping_init(ipo_settings->custom_ipo);
+
+ /* Cannot interpolate if not between 2 frames. */
+ bGPDframe *gpf_prv = gpencil_get_previous_keyframe(active_gpl, cfra);
+ bGPDframe *gpf_next = gpencil_get_next_keyframe(active_gpl, cfra);
+ if (ELEM(NULL, gpf_prv, gpf_next)) {
BKE_report(
op->reports,
RPT_ERROR,
"Cannot find a pair of grease pencil frames to interpolate between in active layer");
return OPERATOR_CANCELLED;
}
- /* cannot interpolate in extremes */
- if (ELEM(cfra, actframe->framenum, actframe->next->framenum)) {
- BKE_report(op->reports,
- RPT_ERROR,
- "Cannot interpolate as current frame already has existing grease pencil frames");
- return OPERATOR_CANCELLED;
- }
if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) {
BKE_report(op->reports, RPT_ERROR, "Cannot interpolate in curve edit mode");
@@ -990,103 +1231,137 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op)
/* loop all layer to check if need interpolation */
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
- bGPDframe *prevFrame, *nextFrame;
- bGPDstroke *gps_from, *gps_to;
- int cframe, fFrame;
-
- /* Need a set of frames to interpolate. */
- if ((gpl->actframe == NULL) || (gpl->actframe->next == NULL)) {
- continue;
- }
/* all layers or only active */
- if (((flag & GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS) == 0) && (gpl != active_gpl)) {
+ if ((!all_layers) && (gpl != active_gpl)) {
continue;
}
/* only editable and visible layers are considered */
if (!BKE_gpencil_layer_is_editable(gpl)) {
continue;
}
+ gpf_prv = gpencil_get_previous_keyframe(gpl, cfra);
+ gpf_next = gpencil_get_next_keyframe(gpl, cfra);
+
+ /* Need a set of frames to interpolate. */
+ if ((gpf_prv == NULL) || (gpf_next == NULL)) {
+ continue;
+ }
+
+ /* Store extremes. */
+ bGPDframe *prevFrame = BKE_gpencil_frame_duplicate(gpf_prv, true);
+ bGPDframe *nextFrame = BKE_gpencil_frame_duplicate(gpf_next, true);
+
+ /* Create a table with source and target pair of strokes. */
+ GHash *used_strokes = BLI_ghash_ptr_new(__func__);
+ GHash *pair_strokes = BLI_ghash_ptr_new(__func__);
+
+ LISTBASE_FOREACH (bGPDstroke *, gps_from, &prevFrame->strokes) {
+ bGPDstroke *gps_to = NULL;
+ /* Only selected. */
+ if ((GPENCIL_EDIT_MODE(gpd)) && (only_selected) &&
+ ((gps_from->flag & GP_STROKE_SELECT) == 0)) {
+ continue;
+ }
+ /* Skip strokes that are invalid for current view. */
+ if (ED_gpencil_stroke_can_use(C, gps_from) == false) {
+ continue;
+ }
+ /* Check if the material is editable. */
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps_from) == false) {
+ continue;
+ }
+ /* Try to get the related stroke. */
+ if ((is_multiedit) && (gps_from->select_index > 0)) {
+ gps_to = gpencil_stroke_get_related(used_strokes, nextFrame, gps_from->select_index);
+ }
+ /* If not found, get final stroke to interpolate using position in the array. */
+ if (gps_to == NULL) {
+ int fFrame = BLI_findindex(&prevFrame->strokes, gps_from);
+ gps_to = BLI_findlink(&nextFrame->strokes, fFrame);
+ }
+
+ if (ELEM(NULL, gps_from, gps_to)) {
+ continue;
+ }
- /* store extremes */
- prevFrame = BKE_gpencil_frame_duplicate(gpl->actframe);
- nextFrame = BKE_gpencil_frame_duplicate(gpl->actframe->next);
+ /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */
+ if (gps_from->totpoints > gps_to->totpoints) {
+ BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true);
+ }
+ if (gps_to->totpoints > gps_from->totpoints) {
+ BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true);
+ }
- /* Loop over intermediary frames and create the interpolation */
- for (cframe = prevFrame->framenum + step; cframe < nextFrame->framenum; cframe += step) {
- bGPDframe *interFrame = NULL;
- float factor;
+ /* Flip stroke. */
+ if (flipmode == GP_INTERPOLATE_FLIP) {
+ BKE_gpencil_stroke_flip(gps_to);
+ }
+ else if (flipmode == GP_INTERPOLATE_FLIPAUTO) {
+ if (gpencil_stroke_need_flip(depsgraph, ob, gpl, &gsc, gps_from, gps_to)) {
+ BKE_gpencil_stroke_flip(gps_to);
+ }
+ }
+
+ /* Insert the pair entry in the hash table. */
+ BLI_ghash_insert(pair_strokes, gps_from, gps_to);
+ }
- /* get interpolation factor */
+ /* Loop over intermediary frames and create the interpolation. */
+ for (int cframe = prevFrame->framenum + step; cframe < nextFrame->framenum; cframe += step) {
+ /* Get interpolation factor. */
float framerange = nextFrame->framenum - prevFrame->framenum;
CLAMP_MIN(framerange, 1.0f);
- factor = (float)(cframe - prevFrame->framenum) / framerange;
+ float factor = (float)(cframe - prevFrame->framenum) / framerange;
- if (ipo_settings->type == GP_IPO_CURVEMAP) {
+ if (type == GP_IPO_CURVEMAP) {
/* custom curvemap */
if (ipo_settings->custom_ipo) {
factor = BKE_curvemapping_evaluateF(ipo_settings->custom_ipo, 0, factor);
}
else {
BKE_report(op->reports, RPT_ERROR, "Custom interpolation curve does not exist");
+ continue;
}
}
- else if (ipo_settings->type >= GP_IPO_BACK) {
+ else if (type >= GP_IPO_BACK) {
/* easing equation... */
- factor = gpencil_interpolate_seq_easing_calc(ipo_settings, factor);
+ factor = gpencil_interpolate_seq_easing_calc(op, factor);
}
- /* create new strokes data with interpolated points reading original stroke */
- for (gps_from = prevFrame->strokes.first; gps_from; gps_from = gps_from->next) {
-
- /* only selected */
- if ((GPENCIL_EDIT_MODE(gpd)) && (flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) &&
- ((gps_from->flag & GP_STROKE_SELECT) == 0)) {
- continue;
- }
- /* skip strokes that are invalid for current view */
- if (ED_gpencil_stroke_can_use(C, gps_from) == false) {
- continue;
- }
- /* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps_from) == false) {
- continue;
- }
-
- /* get final stroke to interpolate */
- fFrame = BLI_findindex(&prevFrame->strokes, gps_from);
- gps_to = BLI_findlink(&nextFrame->strokes, fFrame);
- if (gps_to == NULL) {
- continue;
- }
-
- /* create a new frame if needed */
- if (interFrame == NULL) {
- interFrame = BKE_gpencil_layer_frame_get(gpl, cframe, GP_GETFRAME_ADD_NEW);
- interFrame->key_type = BEZT_KEYTYPE_BREAKDOWN;
- }
-
- /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */
- if (gps_from->totpoints > gps_to->totpoints) {
- BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true);
- }
- if (gps_to->totpoints > gps_from->totpoints) {
- BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true);
- }
+ /* Apply the factor to all pair of strokes. */
+ GHashIterator gh_iter;
+ GHASH_ITER (gh_iter, pair_strokes) {
+ bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter);
+ bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter);
- /* create new stroke */
+ /* Create new stroke. */
bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true);
+ new_stroke->flag |= GP_STROKE_TAG;
+ new_stroke->select_index = 0;
- /* update points position */
+ /* Update points position. */
gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor);
+ gpencil_interpolate_smooth_stroke(new_stroke, smooth_factor, smooth_steps);
/* Calc geometry data. */
BKE_gpencil_stroke_geometry_update(gpd, new_stroke);
- /* add to strokes */
+ /* Add strokes to frame. */
+ bGPDframe *interFrame = BKE_gpencil_layer_frame_get(gpl, cframe, GP_GETFRAME_ADD_NEW);
+ interFrame->key_type = BEZT_KEYTYPE_BREAKDOWN;
+
BLI_addtail(&interFrame->strokes, new_stroke);
}
}
+ /* Free Hash tablets. */
+ if (used_strokes != NULL) {
+ BLI_ghash_free(used_strokes, NULL, NULL);
+ }
+ if (pair_strokes != NULL) {
+ BLI_ghash_free(pair_strokes, NULL, NULL);
+ }
+
BKE_gpencil_free_strokes(prevFrame);
BKE_gpencil_free_strokes(nextFrame);
MEM_SAFE_FREE(prevFrame);
@@ -1100,8 +1375,152 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+static void gpencil_interpolate_seq_ui(bContext *C, wmOperator *op)
+{
+ uiLayout *layout = op->layout;
+ uiLayout *col, *row;
+ PointerRNA ptr;
+
+ RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr);
+
+ const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type");
+
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "step", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "layers", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "interpolate_selected_only", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "flip", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "smooth_factor", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "smooth_steps", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "type", 0, NULL, ICON_NONE);
+
+ if (type == GP_IPO_CURVEMAP) {
+ /* Get an RNA pointer to ToolSettings to give to the custom curve. */
+ Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = scene->toolsettings;
+ PointerRNA gpsettings_ptr;
+ RNA_pointer_create(
+ &scene->id, &RNA_GPencilInterpolateSettings, &ts->gp_interpolate, &gpsettings_ptr);
+ uiTemplateCurveMapping(
+ layout, &gpsettings_ptr, "interpolation_curve", 0, false, true, true, false);
+ }
+ else if (type != GP_IPO_LINEAR) {
+ row = uiLayoutRow(layout, false);
+ uiItemR(row, &ptr, "easing", 0, NULL, ICON_NONE);
+ if (type == GP_IPO_BACK) {
+ row = uiLayoutRow(layout, false);
+ uiItemR(row, &ptr, "back", 0, NULL, ICON_NONE);
+ }
+ else if (type == GP_IPO_ELASTIC) {
+ row = uiLayoutRow(layout, false);
+ uiItemR(row, &ptr, "amplitude", 0, NULL, ICON_NONE);
+ row = uiLayoutRow(layout, false);
+ uiItemR(row, &ptr, "period", 0, NULL, ICON_NONE);
+ }
+ }
+}
+
void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot)
{
+ static const EnumPropertyItem gpencil_interpolation_layer_items[] = {
+ {0, "ACTIVE", 0, "Active", ""},
+ {1, "ALL", 0, "All Layers", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ /**
+ * \note this is a near exact duplicate of #rna_enum_beztriple_interpolation_mode_items,
+ * Changes here will likely apply there too.
+ */
+ static const EnumPropertyItem gpencil_interpolation_type_items[] = {
+ /* interpolation */
+ {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"},
+ {GP_IPO_LINEAR,
+ "LINEAR",
+ ICON_IPO_LINEAR,
+ "Linear",
+ "Straight-line interpolation between A and B (i.e. no ease in/out)"},
+ {GP_IPO_CURVEMAP,
+ "CUSTOM",
+ ICON_IPO_BEZIER,
+ "Custom",
+ "Custom interpolation defined using a curve map"},
+
+ /* easing */
+ {0,
+ "",
+ 0,
+ N_("Easing (by strength)"),
+ "Predefined inertial transitions, useful for motion graphics (from least to most "
+ "''dramatic'')"},
+ {GP_IPO_SINE,
+ "SINE",
+ ICON_IPO_SINE,
+ "Sinusoidal",
+ "Sinusoidal easing (weakest, almost linear but with a slight curvature)"},
+ {GP_IPO_QUAD, "QUAD", ICON_IPO_QUAD, "Quadratic", "Quadratic easing"},
+ {GP_IPO_CUBIC, "CUBIC", ICON_IPO_CUBIC, "Cubic", "Cubic easing"},
+ {GP_IPO_QUART, "QUART", ICON_IPO_QUART, "Quartic", "Quartic easing"},
+ {GP_IPO_QUINT, "QUINT", ICON_IPO_QUINT, "Quintic", "Quintic easing"},
+ {GP_IPO_EXPO, "EXPO", ICON_IPO_EXPO, "Exponential", "Exponential easing (dramatic)"},
+ {GP_IPO_CIRC,
+ "CIRC",
+ ICON_IPO_CIRC,
+ "Circular",
+ "Circular easing (strongest and most dynamic)"},
+
+ {0, "", 0, N_("Dynamic Effects"), "Simple physics-inspired easing effects"},
+ {GP_IPO_BACK, "BACK", ICON_IPO_BACK, "Back", "Cubic easing with overshoot and settle"},
+ {GP_IPO_BOUNCE,
+ "BOUNCE",
+ ICON_IPO_BOUNCE,
+ "Bounce",
+ "Exponentially decaying parabolic bounce, like when objects collide"},
+ {GP_IPO_ELASTIC,
+ "ELASTIC",
+ ICON_IPO_ELASTIC,
+ "Elastic",
+ "Exponentially decaying sine wave, like an elastic band"},
+
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ static const EnumPropertyItem gpencil_interpolation_easing_items[] = {
+ {BEZT_IPO_EASE_AUTO,
+ "AUTO",
+ ICON_IPO_EASE_IN_OUT,
+ "Automatic Easing",
+ "Easing type is chosen automatically based on what the type of interpolation used "
+ "(e.g. 'Ease In' for transitional types, and 'Ease Out' for dynamic effects)"},
+
+ {BEZT_IPO_EASE_IN,
+ "EASE_IN",
+ ICON_IPO_EASE_IN,
+ "Ease In",
+ "Only on the end closest to the next keyframe"},
+ {BEZT_IPO_EASE_OUT,
+ "EASE_OUT",
+ ICON_IPO_EASE_OUT,
+ "Ease Out",
+ "Only on the end closest to the first keyframe"},
+ {BEZT_IPO_EASE_IN_OUT,
+ "EASE_IN_OUT",
+ ICON_IPO_EASE_IN_OUT,
+ "Ease In and Out",
+ "Segment between both keyframes"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ static const EnumPropertyItem flip_modes[] = {
+ {GP_INTERPOLATE_NOFLIP, "NOFLIP", 0, "No Flip", ""},
+ {GP_INTERPOLATE_FLIP, "FLIP", 0, "Flip", ""},
+ {GP_INTERPOLATE_FLIPAUTO, "AUTO", 0, "Automatic", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
/* identifiers */
ot->name = "Interpolate Sequence";
ot->idname = "GPENCIL_OT_interpolate_sequence";
@@ -1110,6 +1529,103 @@ void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot)
/* api callbacks */
ot->exec = gpencil_interpolate_seq_exec;
ot->poll = gpencil_view3d_poll;
+ ot->ui = gpencil_interpolate_seq_ui;
+
+ RNA_def_int(ot->srna,
+ "step",
+ 1,
+ 1,
+ MAXFRAME,
+ "Step",
+ "Number of frames between generated interpolated frames",
+ 1,
+ MAXFRAME);
+
+ RNA_def_enum(ot->srna,
+ "layers",
+ gpencil_interpolation_layer_items,
+ 0,
+ "Layer",
+ "Layers included in the interpolation");
+
+ RNA_def_boolean(ot->srna,
+ "interpolate_selected_only",
+ 0,
+ "Only Selected",
+ "Interpolate only selected strokes");
+
+ RNA_def_enum(ot->srna,
+ "flip",
+ flip_modes,
+ GP_INTERPOLATE_FLIPAUTO,
+ "Flip Mode",
+ "Invert destination stroke to match start and end with source stroke");
+
+ RNA_def_int(ot->srna,
+ "smooth_steps",
+ 1,
+ 1,
+ 3,
+ "Iterations",
+ "Number of times to smooth newly created strokes",
+ 1,
+ 3);
+
+ RNA_def_float(ot->srna,
+ "smooth_factor",
+ 0.0f,
+ 0.0f,
+ 2.0f,
+ "Smooth",
+ "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise",
+ 0.0f,
+ 2.0f);
+
+ RNA_def_enum(ot->srna,
+ "type",
+ gpencil_interpolation_type_items,
+ 0,
+ "Type",
+ "Interpolation method to use the next time 'Interpolate Sequence' is run");
+
+ RNA_def_enum(
+ ot->srna,
+ "easing",
+ gpencil_interpolation_easing_items,
+ 0,
+ "Easing",
+ "Which ends of the segment between the preceding and following grease pencil frames "
+ "easing interpolation is applied to");
+
+ RNA_def_float(ot->srna,
+ "back",
+ 1.702f,
+ 0.0f,
+ FLT_MAX,
+ "Back",
+ "Amount of overshoot for 'back' easing",
+ 0.0f,
+ FLT_MAX);
+
+ RNA_def_float(ot->srna,
+ "amplitude",
+ 0.15f,
+ 0.0f,
+ FLT_MAX,
+ "Amplitude",
+ "Amount to boost elastic bounces for 'elastic' easing",
+ 0.0f,
+ FLT_MAX);
+
+ RNA_def_float(ot->srna,
+ "period",
+ 0.15f,
+ -FLT_MAX,
+ FLT_MAX,
+ "Period",
+ "Time between bounces for elastic easing",
+ -FLT_MAX,
+ FLT_MAX);
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -1119,19 +1635,30 @@ void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot)
static bool gpencil_interpolate_reverse_poll(bContext *C)
{
- if (!gpencil_view3d_poll(C)) {
- return 0;
+ ScrArea *area = CTX_wm_area(C);
+ if (area == NULL) {
+ return false;
+ }
+ if ((area->spacetype != SPACE_VIEW3D) && (area->spacetype != SPACE_ACTION)) {
+ return false;
}
- bGPDlayer *gpl = CTX_data_active_gpencil_layer(C);
+ bGPdata *gpd = ED_gpencil_data_get_active(C);
+ if (gpd == NULL) {
+ return false;
+ }
+ bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd);
+ if (gpl == NULL) {
+ return false;
+ }
/* need to be on a breakdown frame */
if ((gpl->actframe == NULL) || (gpl->actframe->key_type != BEZT_KEYTYPE_BREAKDOWN)) {
CTX_wm_operator_poll_msg_set(C, "Expected current frame to be a breakdown");
- return 0;
+ return false;
}
- return 1;
+ return true;
}
static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op))
@@ -1141,7 +1668,11 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op))
/* Go through each layer, deleting the breakdowns around the current frame,
* but only if there is a keyframe nearby to stop at
*/
- CTX_DATA_BEGIN (C, bGPDlayer *, gpl, editable_gpencil_layers) {
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+ /* only editable and visible layers are considered */
+ if (!BKE_gpencil_layer_is_editable(gpl) || (gpl->actframe == NULL)) {
+ continue;
+ }
bGPDframe *start_key = NULL;
bGPDframe *end_key = NULL;
bGPDframe *gpf, *gpfn;
@@ -1202,7 +1733,6 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op))
BLI_freelinkN(&gpl->frames, end_key);
}
}
- CTX_DATA_END;
/* notifiers */
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
@@ -1214,7 +1744,7 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op))
void GPENCIL_OT_interpolate_reverse(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Remove Breakdowns";
+ ot->name = "Delete Breakdowns";
ot->idname = "GPENCIL_OT_interpolate_reverse";
ot->description =
"Remove breakdown frames generated by interpolating between two Grease Pencil frames";
@@ -1226,5 +1756,3 @@ void GPENCIL_OT_interpolate_reverse(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-
-/* *************************************************************** */
diff --git a/source/blender/editors/gpencil/gpencil_merge.c b/source/blender/editors/gpencil/gpencil_merge.c
index 272dff56291..259b2882589 100644
--- a/source/blender/editors/gpencil/gpencil_merge.c
+++ b/source/blender/editors/gpencil/gpencil_merge.c
@@ -48,12 +48,9 @@
#include "RNA_define.h"
#include "ED_gpencil.h"
-#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_view3d.h"
#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_query.h"
#include "gpencil_intern.h"
@@ -107,6 +104,7 @@ static bGPDstroke *gpencil_prepare_stroke(bContext *C, wmOperator *op, int totpo
Main *bmain = CTX_data_main(C);
ToolSettings *ts = CTX_data_tool_settings(C);
Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = ob->data;
bGPDlayer *gpl = CTX_data_active_gpencil_layer(C);
Scene *scene = CTX_data_scene(C);
@@ -136,6 +134,7 @@ static bGPDstroke *gpencil_prepare_stroke(bContext *C, wmOperator *op, int totpo
/* stroke */
bGPDstroke *gps = BKE_gpencil_stroke_new(MAX2(ob->actcol - 1, 0), totpoints, brush->size);
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
if (cyclic) {
gps->flag |= GP_STROKE_CYCLIC;
@@ -244,6 +243,7 @@ static void gpencil_calc_points_factor(bContext *C,
}
}
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
}
}
diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c
index 53beaeaa6a0..7e6b42f284b 100644
--- a/source/blender/editors/gpencil/gpencil_mesh.c
+++ b/source/blender/editors/gpencil/gpencil_mesh.c
@@ -36,8 +36,6 @@
#include "BKE_anim_data.h"
#include "BKE_context.h"
#include "BKE_duplilist.h"
-#include "BKE_global.h"
-#include "BKE_gpencil.h"
#include "BKE_gpencil_geom.h"
#include "BKE_layer.h"
#include "BKE_main.h"
@@ -320,7 +318,7 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op)
use_seams,
use_faces);
- /* Reproject all untaged created strokes. */
+ /* Reproject all un-tagged created strokes. */
if (project_type != GP_REPROJECT_KEEP) {
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
bGPDframe *gpf = gpl->actframe;
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
index 0a29b83bc4f..1a6cb5670c4 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -27,9 +27,7 @@
#include "BLI_sys_types.h"
-#include "BKE_brush.h"
#include "BKE_context.h"
-#include "BKE_gpencil.h"
#include "BKE_paint.h"
#include "DNA_brush_types.h"
@@ -45,9 +43,6 @@
#include "RNA_access.h"
#include "ED_gpencil.h"
-#include "ED_object.h"
-#include "ED_select_utils.h"
-#include "ED_transform.h"
#include "gpencil_intern.h"
diff --git a/source/blender/editors/gpencil/gpencil_ops_versioning.c b/source/blender/editors/gpencil/gpencil_ops_versioning.c
index 815bbbaa254..45842c28dff 100644
--- a/source/blender/editors/gpencil/gpencil_ops_versioning.c
+++ b/source/blender/editors/gpencil/gpencil_ops_versioning.c
@@ -34,16 +34,12 @@
#include "DNA_gpencil_types.h"
#include "DNA_material_types.h"
-#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_brush.h"
#include "BKE_context.h"
-#include "BKE_deform.h"
#include "BKE_gpencil.h"
#include "BKE_main.h"
-#include "BKE_material.h"
#include "BKE_object.h"
#include "WM_api.h"
@@ -53,7 +49,6 @@
#include "RNA_define.h"
#include "ED_gpencil.h"
-#include "ED_object.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index a7337b5646f..974f51ff90b 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -149,9 +149,9 @@ typedef struct tGPsdata {
Scene *scene;
struct Depsgraph *depsgraph;
- /** current object. */
+ /** Current object. */
Object *ob;
- /** Obeject eval. */
+ /** Evaluated object. */
Object *ob_eval;
/** window where painting originated. */
wmWindow *win;
@@ -426,7 +426,7 @@ static void gpencil_reproject_toplane(tGPsdata *p, bGPDstroke *gps)
/* get drawing origin */
gpencil_get_3d_reference(p, origin);
- ED_gpencil_project_stroke_to_plane(p->scene, obact, rv3d, gps, origin, p->lock_axis - 1);
+ ED_gpencil_project_stroke_to_plane(p->scene, obact, rv3d, p->gpl, gps, origin, p->lock_axis - 1);
}
/* convert screen-coordinates to buffer-coordinates */
@@ -887,11 +887,13 @@ static short gpencil_stroke_addpoint(tGPsdata *p,
gpencil_get_3d_reference(p, origin);
/* reproject current */
ED_gpencil_tpoint_to_point(p->region, origin, pt, &spt);
- ED_gpencil_project_point_to_plane(p->scene, obact, rv3d, origin, p->lock_axis - 1, &spt);
+ ED_gpencil_project_point_to_plane(
+ p->scene, obact, p->gpl, rv3d, origin, p->lock_axis - 1, &spt);
/* reproject previous */
ED_gpencil_tpoint_to_point(p->region, origin, ptb, &spt2);
- ED_gpencil_project_point_to_plane(p->scene, obact, rv3d, origin, p->lock_axis - 1, &spt2);
+ ED_gpencil_project_point_to_plane(
+ p->scene, obact, p->gpl, rv3d, origin, p->lock_axis - 1, &spt2);
p->totpixlen += len_v3v3(&spt.x, &spt2.x);
pt->uv_fac = p->totpixlen;
}
@@ -1305,6 +1307,12 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p)
/* Calc geometry data. */
BKE_gpencil_stroke_geometry_update(gpd, gps);
+ /* In Multiframe mode, duplicate the stroke in other frames. */
+ if (GPENCIL_MULTIEDIT_SESSIONS_ON(p->gpd)) {
+ const bool tail = (ts->gpencil_flags & GP_TOOL_FLAG_PAINT_ONBACK);
+ BKE_gpencil_stroke_copy_to_keyframes(gpd, gpl, p->gpf, gps, tail);
+ }
+
gpencil_stroke_added_enable(p);
}
@@ -1322,10 +1330,8 @@ static float view3d_point_depth(const RegionView3D *rv3d, const float co[3])
}
/* only erase stroke points that are visible */
-static bool gpencil_stroke_eraser_is_occluded(tGPsdata *p,
- const bGPDspoint *pt,
- const int x,
- const int y)
+static bool gpencil_stroke_eraser_is_occluded(
+ tGPsdata *p, bGPDlayer *gpl, const bGPDspoint *pt, const int x, const int y)
{
Object *obact = (Object *)p->ownerPtr.data;
Brush *brush = p->brush;
@@ -1342,7 +1348,6 @@ static bool gpencil_stroke_eraser_is_occluded(tGPsdata *p,
if ((gp_settings != NULL) && (p->area->spacetype == SPACE_VIEW3D) &&
(gp_settings->flag & GP_BRUSH_OCCLUDE_ERASER)) {
RegionView3D *rv3d = p->region->regiondata;
- bGPDlayer *gpl = p->gpl;
const int mval_i[2] = {x, y};
float mval_3d[3];
@@ -1350,7 +1355,7 @@ static bool gpencil_stroke_eraser_is_occluded(tGPsdata *p,
float diff_mat[4][4];
/* calculate difference matrix if parent object */
- BKE_gpencil_parent_matrix_get(p->depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(p->depsgraph, obact, gpl, diff_mat);
if (ED_view3d_autodist_simple(p->region, mval_i, mval_3d, 0, NULL)) {
const float depth_mval = view3d_point_depth(rv3d, mval_3d);
@@ -1453,6 +1458,7 @@ static void gpencil_stroke_soft_refine(bGPDstroke *gps)
/* eraser tool - evaluation per stroke */
static void gpencil_stroke_eraser_dostroke(tGPsdata *p,
+ bGPDlayer *gpl,
bGPDframe *gpf,
bGPDstroke *gps,
const float mval[2],
@@ -1578,9 +1584,9 @@ static void gpencil_stroke_eraser_dostroke(tGPsdata *p,
* - this assumes that linewidth is irrelevant
*/
if (gpencil_stroke_inside_circle(mval, radius, pc0[0], pc0[1], pc2[0], pc2[1])) {
- if ((gpencil_stroke_eraser_is_occluded(p, pt0, pc0[0], pc0[1]) == false) ||
- (gpencil_stroke_eraser_is_occluded(p, pt1, pc1[0], pc1[1]) == false) ||
- (gpencil_stroke_eraser_is_occluded(p, pt2, pc2[0], pc2[1]) == false)) {
+ if ((gpencil_stroke_eraser_is_occluded(p, gpl, pt0, pc0[0], pc0[1]) == false) ||
+ (gpencil_stroke_eraser_is_occluded(p, gpl, pt1, pc1[0], pc1[1]) == false) ||
+ (gpencil_stroke_eraser_is_occluded(p, gpl, pt2, pc2[0], pc2[1]) == false)) {
/* Point is affected: */
/* Adjust thickness
* - Influence of eraser falls off with distance from the middle of the eraser
@@ -1682,6 +1688,8 @@ static void gpencil_stroke_eraser_dostroke(tGPsdata *p,
/* erase strokes which fall under the eraser strokes */
static void gpencil_stroke_doeraser(tGPsdata *p)
{
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(p->gpd);
+
rcti rect;
Brush *brush = p->brush;
Brush *eraser = p->eraser;
@@ -1722,40 +1730,53 @@ static void gpencil_stroke_doeraser(tGPsdata *p)
* on multiple layers...
*/
LISTBASE_FOREACH (bGPDlayer *, gpl, &p->gpd->layers) {
- bGPDframe *gpf = gpl->actframe;
-
/* only affect layer if it's editable (and visible) */
if (BKE_gpencil_layer_is_editable(gpl) == false) {
continue;
}
- if (gpf == NULL) {
+
+ bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe;
+ if (init_gpf == NULL) {
continue;
}
- /* calculate difference matrix */
- BKE_gpencil_parent_matrix_get(p->depsgraph, p->ob, gpl, p->diff_mat);
- /* loop over strokes, checking segments for intersections */
- LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) {
- /* check if the color is editable */
- if (ED_gpencil_stroke_color_use(p->ob, gpl, gps) == false) {
- continue;
- }
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
+ if (gpf == NULL) {
+ continue;
+ }
+ /* calculate difference matrix */
+ BKE_gpencil_layer_transform_matrix_get(p->depsgraph, p->ob, gpl, p->diff_mat);
+
+ /* loop over strokes, checking segments for intersections */
+ LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) {
+ /* check if the color is editable */
+ if (ED_gpencil_stroke_material_editable(p->ob, gpl, gps) == false) {
+ continue;
+ }
- /* Check if the stroke collide with mouse. */
- if (!ED_gpencil_stroke_check_collision(&p->gsc, gps, p->mval, calc_radius, p->diff_mat)) {
- continue;
- }
+ /* Check if the stroke collide with mouse. */
+ if (!ED_gpencil_stroke_check_collision(
+ &p->gsc, gps, p->mval, calc_radius, p->diff_mat)) {
+ continue;
+ }
- /* Not all strokes in the datablock may be valid in the current editor/context
- * (e.g. 2D space strokes in the 3D view, if the same datablock is shared)
- */
- if (ED_gpencil_stroke_can_use_direct(p->area, gps)) {
- gpencil_stroke_eraser_dostroke(p, gpf, gps, p->mval, calc_radius, &rect);
+ /* Not all strokes in the datablock may be valid in the current editor/context
+ * (e.g. 2D space strokes in the 3D view, if the same datablock is shared)
+ */
+ if (ED_gpencil_stroke_can_use_direct(p->area, gps)) {
+ gpencil_stroke_eraser_dostroke(p, gpl, gpf, gps, p->mval, calc_radius, &rect);
+ }
+ }
+
+ /* if not multiedit, exit loop*/
+ if (!is_multiedit) {
+ break;
+ }
}
}
}
}
-
/* ******************************************* */
/* Sketching Operator */
@@ -1856,7 +1877,7 @@ static void gpencil_init_drawing_brush(bContext *C, tGPsdata *p)
BKE_brush_gpencil_paint_presets(bmain, ts, true);
changed = true;
}
- /* Be sure curves are initializated. */
+ /* Be sure curves are initialized. */
BKE_curvemapping_init(paint->brush->gpencil_settings->curve_sensitivity);
BKE_curvemapping_init(paint->brush->gpencil_settings->curve_strength);
BKE_curvemapping_init(paint->brush->gpencil_settings->curve_jitter);
@@ -1867,7 +1888,7 @@ static void gpencil_init_drawing_brush(bContext *C, tGPsdata *p)
BKE_curvemapping_init(paint->brush->gpencil_settings->curve_rand_saturation);
BKE_curvemapping_init(paint->brush->gpencil_settings->curve_rand_value);
- /* assign to temp tGPsdata */
+ /* Assign to temp #tGPsdata */
p->brush = paint->brush;
if (paint->brush->gpencil_tool != GPAINT_TOOL_ERASE) {
p->eraser = gpencil_get_default_eraser(p->bmain, ts);
@@ -2104,6 +2125,11 @@ static void gpencil_paint_initstroke(tGPsdata *p,
copy_v3_v3(p->gpl->color, p->custom_color);
}
}
+
+ /* Recalculate layer transform matrix to avoid problems if props are animated. */
+ loc_eul_size_to_mat4(p->gpl->layer_mat, p->gpl->location, p->gpl->rotation, p->gpl->scale);
+ invert_m4_m4(p->gpl->layer_invmat, p->gpl->layer_mat);
+
if ((paintmode != GP_PAINTMODE_ERASER) && (p->gpl->flag & GP_LAYER_LOCKED)) {
p->status = GP_STATUS_ERROR;
if (G.debug & G_DEBUG) {
diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c
index a438d12710a..12d399f32ca 100644
--- a/source/blender/editors/gpencil/gpencil_primitive.c
+++ b/source/blender/editors/gpencil/gpencil_primitive.c
@@ -317,6 +317,10 @@ static void gpencil_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi)
}
tgpi->gpl = gpl;
+ /* Recalculate layer transform matrix to avoid problems if props are animated. */
+ loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale);
+ invert_m4_m4(gpl->layer_invmat, gpl->layer_mat);
+
/* create a new temporary frame */
tgpi->gpf = MEM_callocN(sizeof(bGPDframe), "Temp bGPDframe");
tgpi->gpf->framenum = tgpi->cframe = cfra;
@@ -334,6 +338,7 @@ static void gpencil_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi)
ED_gpencil_fill_vertex_color_set(ts, brush, gps);
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
/* the polygon must be closed, so enabled cyclic */
if (ELEM(tgpi->type, GP_STROKE_BOX, GP_STROKE_CIRCLE)) {
gps->flag |= GP_STROKE_CYCLIC;
@@ -1004,12 +1009,12 @@ static void gpencil_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
/* reproject current */
ED_gpencil_tpoint_to_point(tgpi->region, origin, tpt, &spt);
ED_gpencil_project_point_to_plane(
- tgpi->scene, tgpi->ob, tgpi->rv3d, origin, tgpi->lock_axis - 1, &spt);
+ tgpi->scene, tgpi->ob, tgpi->gpl, tgpi->rv3d, origin, tgpi->lock_axis - 1, &spt);
/* reproject previous */
ED_gpencil_tpoint_to_point(tgpi->region, origin, tptb, &spt2);
ED_gpencil_project_point_to_plane(
- tgpi->scene, tgpi->ob, tgpi->rv3d, origin, tgpi->lock_axis - 1, &spt2);
+ tgpi->scene, tgpi->ob, tgpi->gpl, tgpi->rv3d, origin, tgpi->lock_axis - 1, &spt2);
tgpi->totpixlen += len_v3v3(&spt.x, &spt2.x);
tpt->uv_fac = tgpi->totpixlen;
}
@@ -1068,7 +1073,7 @@ static void gpencil_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
float origin[3];
ED_gpencil_drawing_reference_get(tgpi->scene, tgpi->ob, ts->gpencil_v3d_align, origin);
ED_gpencil_project_stroke_to_plane(
- tgpi->scene, tgpi->ob, tgpi->rv3d, gps, origin, ts->gp_sculpt.lock_axis - 1);
+ tgpi->scene, tgpi->ob, tgpi->rv3d, tgpi->gpl, gps, origin, ts->gp_sculpt.lock_axis - 1);
}
/* if parented change position relative to parent object */
@@ -1272,7 +1277,7 @@ static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent *
/* set cursor to indicate modal */
WM_cursor_modal_set(win, WM_CURSOR_CROSS);
- /* update sindicator in header */
+ /* Updates indicator in header. */
gpencil_primitive_status_indicators(C, tgpi);
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL);
@@ -1373,6 +1378,12 @@ static void gpencil_primitive_interaction_end(bContext *C,
BKE_gpencil_stroke_geometry_update(tgpi->gpd, gps);
}
+ /* In Multiframe mode, duplicate the stroke in other frames. */
+ if (GPENCIL_MULTIEDIT_SESSIONS_ON(tgpi->gpd)) {
+ const bool tail = (ts->gpencil_flags & GP_TOOL_FLAG_PAINT_ONBACK);
+ BKE_gpencil_stroke_copy_to_keyframes(tgpi->gpd, tgpi->gpl, gpf, gps, tail);
+ }
+
DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_COPY_ON_WRITE);
DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
diff --git a/source/blender/editors/gpencil/gpencil_sculpt_paint.c b/source/blender/editors/gpencil/gpencil_sculpt_paint.c
index bb9dd8cac5d..0d3ab9011d6 100644
--- a/source/blender/editors/gpencil/gpencil_sculpt_paint.c
+++ b/source/blender/editors/gpencil/gpencil_sculpt_paint.c
@@ -1441,11 +1441,6 @@ static bool gpencil_sculpt_brush_do_stroke(tGP_BrushEditData *gso,
bool changed = false;
float rot_eval = 0.0f;
- /* Check if the stroke collide with brush. */
- if (!ED_gpencil_stroke_check_collision(gsc, gps, gso->mval, radius, diff_mat)) {
- return false;
- }
-
if (gps->totpoints == 1) {
bGPDspoint pt_temp;
pt = &gps->points[0];
@@ -1577,6 +1572,13 @@ static bool gpencil_sculpt_brush_do_frame(bContext *C,
Object *ob = gso->object;
bGPdata *gpd = ob->data;
char tool = gso->brush->gpencil_sculpt_tool;
+ GP_SpaceConversion *gsc = &gso->gsc;
+ Brush *brush = gso->brush;
+ const int radius = (brush->flag & GP_BRUSH_USE_PRESSURE) ? gso->brush->size * gso->pressure :
+ gso->brush->size;
+ /* Calc bound box matrix. */
+ float bound_mat[4][4];
+ BKE_gpencil_layer_transform_matrix_get(gso->depsgraph, gso->object, gpl, bound_mat);
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
/* skip strokes that are invalid for current view */
@@ -1584,7 +1586,12 @@ static bool gpencil_sculpt_brush_do_frame(bContext *C,
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
+ continue;
+ }
+
+ /* Check if the stroke collide with brush. */
+ if (!ED_gpencil_stroke_check_collision(gsc, gps, gso->mval, radius, bound_mat)) {
continue;
}
@@ -1742,7 +1749,8 @@ static bool gpencil_sculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *
/* calculate difference matrix */
float diff_mat[4][4];
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
+ mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_invmat);
/* Active Frame or MultiFrame? */
if (gso->is_multiframe) {
diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c
index 281ab8c5adc..e01c1ec54d7 100644
--- a/source/blender/editors/gpencil/gpencil_select.c
+++ b/source/blender/editors/gpencil/gpencil_select.c
@@ -120,7 +120,8 @@ static bool gpencil_select_poll(bContext *C)
}
}
- /* we just need some visible strokes, and to be in editmode or other modes only to catch event */
+ /* We just need some visible strokes,
+ * and to be in edit-mode or other modes only to catch event. */
if (GPENCIL_ANY_MODE(gpd)) {
/* TODO: include a check for visible strokes? */
if (gpd->layers.first) {
@@ -155,6 +156,11 @@ static bool gpencil_3d_point_to_screen_space(ARegion *region,
/* helper to deselect all selected strokes/points */
static void deselect_all_selected(bContext *C)
{
+ /* Set selection index to 0. */
+ Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = ob->data;
+ gpd->select_last_index = 0;
+
CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) {
/* deselect stroke and its points if selected */
if (gps->flag & GP_STROKE_SELECT) {
@@ -168,6 +174,7 @@ static void deselect_all_selected(bContext *C)
/* deselect stroke itself too */
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
/* deselect curve and curve points */
@@ -186,7 +193,7 @@ static void deselect_all_selected(bContext *C)
CTX_DATA_END;
}
-static void select_all_curve_points(bGPDstroke *gps, bGPDcurve *gpc, bool deselect)
+static void select_all_curve_points(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gpc, bool deselect)
{
for (int i = 0; i < gpc->tot_curve_points; i++) {
bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
@@ -204,10 +211,12 @@ static void select_all_curve_points(bGPDstroke *gps, bGPDcurve *gpc, bool desele
if (deselect == false) {
gpc->flag |= GP_CURVE_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
}
else {
gpc->flag &= ~GP_CURVE_SELECT;
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
}
@@ -220,7 +229,8 @@ static bool gpencil_select_all_poll(bContext *C)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
- /* we just need some visible strokes, and to be in editmode or other modes only to catch event */
+ /* We just need some visible strokes,
+ * and to be in edit-mode or other modes only to catch event. */
if (GPENCIL_ANY_MODE(gpd)) {
if (gpd->layers.first) {
return true;
@@ -241,7 +251,7 @@ static int gpencil_select_all_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -305,7 +315,7 @@ static int gpencil_select_linked_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -382,7 +392,7 @@ static int gpencil_select_alternate_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -421,7 +431,7 @@ static int gpencil_select_alternate_exec(bContext *C, wmOperator *op)
BEZT_DESEL_ALL(&gpc_pt->bezt);
}
- BKE_gpencil_curve_sync_selection(gps);
+ BKE_gpencil_curve_sync_selection(gpd, gps);
changed = true;
}
}
@@ -560,6 +570,7 @@ static bool gpencil_select_same_layer(bContext *C)
}
gpc->flag |= GP_CURVE_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
changed = true;
}
@@ -576,6 +587,7 @@ static bool gpencil_select_same_layer(bContext *C)
}
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
changed = true;
}
@@ -620,6 +632,7 @@ static bool gpencil_select_same_material(bContext *C)
}
gpc->flag |= GP_CURVE_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
changed = true;
}
@@ -638,6 +651,7 @@ static bool gpencil_select_same_material(bContext *C)
}
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
changed = true;
}
@@ -645,7 +659,7 @@ static bool gpencil_select_same_material(bContext *C)
CTX_DATA_END;
}
- /* free memomy */
+ /* Free memory. */
if (selected_colors != NULL) {
BLI_gset_free(selected_colors, NULL);
}
@@ -659,7 +673,7 @@ static int gpencil_select_grouped_exec(bContext *C, wmOperator *op)
{
eGP_SelectGrouped mode = RNA_enum_get(op->ptr, "type");
bGPdata *gpd = ED_gpencil_data_get_active(C);
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -729,7 +743,7 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op)
bGPdata *gpd = ED_gpencil_data_get_active(C);
const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd);
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -754,6 +768,8 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op)
BEZT_SEL_ALL(&gpc->curve_points[0].bezt);
gpc->flag |= GP_CURVE_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
+
if ((extend == false) && (gps->totpoints > 1)) {
for (int i = 1; i < gpc->tot_curve_points; i++) {
bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
@@ -767,6 +783,7 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op)
else {
gps->points->flag |= GP_SPOINT_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
/* deselect rest? */
if ((extend == false) && (gps->totpoints > 1)) {
@@ -836,7 +853,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op)
bGPdata *gpd = ED_gpencil_data_get_active(C);
const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd);
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -861,6 +878,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op)
BEZT_SEL_ALL(&gpc->curve_points[gpc->tot_curve_points - 1].bezt);
gpc->flag |= GP_CURVE_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
if ((extend == false) && (gps->totpoints > 1)) {
for (int i = 0; i < gpc->tot_curve_points - 1; i++) {
bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
@@ -874,6 +892,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op)
else {
gps->points[gps->totpoints - 1].flag |= GP_SPOINT_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
/* deselect rest? */
if ((extend == false) && (gps->totpoints > 1)) {
@@ -943,7 +962,7 @@ static int gpencil_select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd);
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -1083,7 +1102,7 @@ static int gpencil_select_less_exec(bContext *C, wmOperator *UNUSED(op))
bGPdata *gpd = ED_gpencil_data_get_active(C);
const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd);
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -1270,10 +1289,12 @@ static bool gpencil_stroke_do_circle_sel(bGPdata *gpd,
if (select) {
pt_active->flag |= GP_SPOINT_SELECT;
gps_active->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps_active);
}
else {
pt_active->flag &= ~GP_SPOINT_SELECT;
gps_active->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps_active);
}
changed = true;
/* if stroke mode, don't check more points */
@@ -1312,13 +1333,13 @@ static bool gpencil_stroke_do_circle_sel(bGPdata *gpd,
BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps_active);
gps_active->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
/* Select all curve points. */
- select_all_curve_points(gps_active, gps_active->editcurve, false);
+ select_all_curve_points(gpd, gps_active, gps_active->editcurve, false);
BKE_gpencil_stroke_geometry_update(gpd, gps_active);
changed = true;
}
/* Ensure that stroke selection is in sync with its points. */
- BKE_gpencil_stroke_sync_selection(gps_active);
+ BKE_gpencil_stroke_sync_selection(gpd, gps_active);
return changed;
}
@@ -1336,6 +1357,9 @@ static bool gpencil_do_curve_circle_sel(bContext *C,
{
ARegion *region = CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
+ Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = ob->data;
+
const bool only_selected = (v3d->overlay.handle_display == CURVE_HANDLE_SELECTED);
bool hit = false;
@@ -1409,7 +1433,7 @@ static bool gpencil_do_curve_circle_sel(bContext *C,
}
}
- BKE_gpencil_curve_sync_selection(gps);
+ BKE_gpencil_curve_sync_selection(gpd, gps);
return hit;
}
@@ -1434,7 +1458,7 @@ static int gpencil_circle_select_exec(bContext *C, wmOperator *op)
const float scale = ts->gp_sculpt.isect_threshold;
- /* if not edit/sculpt mode, the event is catched but not processed */
+ /* If not edit/sculpt mode, the event has been caught but not processed. */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
@@ -1629,7 +1653,7 @@ static bool gpencil_stroke_fill_isect_rect(ARegion *region,
#endif
static bool gpencil_generic_curve_select(bContext *C,
- Object *UNUSED(ob),
+ Object *ob,
GPencilTestFn is_inside_fn,
rcti UNUSED(box),
GP_SelectUserData *user_data,
@@ -1638,6 +1662,7 @@ static bool gpencil_generic_curve_select(bContext *C,
{
ARegion *region = CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
+ bGPdata *gpd = ob->data;
const bool handle_only_selected = (v3d->overlay.handle_display == CURVE_HANDLE_SELECTED);
const bool handle_all = (v3d->overlay.handle_display == CURVE_HANDLE_ALL);
@@ -1769,7 +1794,7 @@ static bool gpencil_generic_curve_select(bContext *C,
}
}
- BKE_gpencil_curve_sync_selection(gps);
+ BKE_gpencil_curve_sync_selection(gpd, gps);
}
GP_EDITABLE_CURVES_END(gps_iter);
@@ -1795,6 +1820,8 @@ static bool gpencil_generic_stroke_select(bContext *C,
/* deselect all strokes first? */
if (SEL_OP_USE_PRE_DESELECT(sel_op) || (GPENCIL_PAINT_MODE(gpd))) {
+ /* Set selection index to 0. */
+ gpd->select_last_index = 0;
CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) {
bGPDspoint *pt;
@@ -1805,6 +1832,7 @@ static bool gpencil_generic_stroke_select(bContext *C,
}
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
CTX_DATA_END;
@@ -1889,13 +1917,13 @@ static bool gpencil_generic_stroke_select(bContext *C,
BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps_active);
gps_active->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
/* Select all curve points. */
- select_all_curve_points(gps_active, gps_active->editcurve, false);
+ select_all_curve_points(gpd, gps_active, gps_active->editcurve, false);
BKE_gpencil_stroke_geometry_update(gpd, gps_active);
changed = true;
}
/* Ensure that stroke selection is in sync with its points */
- BKE_gpencil_stroke_sync_selection(gps_active);
+ BKE_gpencil_stroke_sync_selection(gpd, gps_active);
}
GP_EVALUATED_STROKES_END(gpstroke_iter);
@@ -2311,7 +2339,7 @@ static int gpencil_select_exec(bContext *C, wmOperator *op)
}
/* select all curve points */
if (hit_curve != NULL) {
- select_all_curve_points(hit_stroke, hit_curve, deselect);
+ select_all_curve_points(gpd, hit_stroke, hit_curve, deselect);
}
else {
bGPDspoint *pt;
@@ -2330,9 +2358,11 @@ static int gpencil_select_exec(bContext *C, wmOperator *op)
/* stroke too... */
if (deselect == false) {
hit_stroke->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, hit_stroke);
}
else {
hit_stroke->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(hit_stroke);
}
}
}
@@ -2344,11 +2374,13 @@ static int gpencil_select_exec(bContext *C, wmOperator *op)
BEZT_SEL_IDX(&hit_curve_point->bezt, hit_curve_handle);
hit_curve->flag |= GP_CURVE_SELECT;
hit_stroke->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, hit_stroke);
}
else {
/* we're adding selection, so selection must be true */
hit_point->flag |= GP_SPOINT_SELECT;
hit_stroke->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, hit_stroke);
/* expand selection to segment */
int selectmode;
@@ -2376,14 +2408,14 @@ static int gpencil_select_exec(bContext *C, wmOperator *op)
if (!BEZT_ISSEL_ANY(&hit_curve_point->bezt)) {
hit_curve_point->flag &= ~GP_CURVE_POINT_SELECT;
}
- BKE_gpencil_curve_sync_selection(hit_stroke);
+ BKE_gpencil_curve_sync_selection(gpd, hit_stroke);
}
else {
/* deselect point */
hit_point->flag &= ~GP_SPOINT_SELECT;
/* ensure that stroke is selected correctly */
- BKE_gpencil_stroke_sync_selection(hit_stroke);
+ BKE_gpencil_stroke_sync_selection(gpd, hit_stroke);
}
}
}
@@ -2473,7 +2505,7 @@ static void gpencil_selected_hue_table(bContext *C,
if (ED_gpencil_stroke_can_use(C, gps) == false) {
continue;
}
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
if ((gps->flag & GP_STROKE_SELECT) == 0) {
@@ -2570,6 +2602,7 @@ static int gpencil_select_vertex_color_exec(bContext *C, wmOperator *op)
if (gps_selected) {
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
/* Extend stroke selection. */
if (selectmode == GP_SELECTMODE_STROKE) {
diff --git a/source/blender/editors/gpencil/gpencil_trace_ops.c b/source/blender/editors/gpencil/gpencil_trace_ops.c
index 0be9d74278e..0f344909692 100644
--- a/source/blender/editors/gpencil/gpencil_trace_ops.c
+++ b/source/blender/editors/gpencil/gpencil_trace_ops.c
@@ -23,7 +23,6 @@
#include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLT_translation.h"
@@ -31,34 +30,26 @@
#include "DNA_gpencil_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
-#include "DNA_space_types.h"
#include "BKE_context.h"
-#include "BKE_duplilist.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
#include "BKE_image.h"
#include "BKE_layer.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
-#include "BKE_material.h"
#include "BKE_object.h"
#include "BKE_report.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
-#include "UI_interface.h"
-#include "UI_resources.h"
-
#include "WM_api.h"
#include "WM_types.h"
#include "RNA_access.h"
#include "RNA_define.h"
-#include "RNA_enum_types.h"
-#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
#include "ED_gpencil.h"
@@ -66,7 +57,6 @@
#include "gpencil_intern.h"
#include "gpencil_trace.h"
-#include "potracelib.h"
typedef struct TraceJob {
/* from wmJob */
@@ -87,6 +77,7 @@ typedef struct TraceJob {
bGPDlayer *gpl;
bool was_ob_created;
+ bool use_current_frame;
int32_t frame_target;
float threshold;
@@ -228,15 +219,17 @@ static void trace_start_job(void *customdata, short *stop, short *do_update, flo
trace_job->do_update = do_update;
trace_job->progress = progress;
trace_job->was_canceled = false;
+ const int init_frame = max_ii((trace_job->use_current_frame) ? trace_job->frame_target : 0, 0);
G.is_break = false;
/* Single Image. */
-
if ((trace_job->image->source == IMA_SRC_FILE) ||
(trace_job->mode == GPENCIL_TRACE_MODE_SINGLE)) {
void *lock;
- ImBuf *ibuf = BKE_image_acquire_ibuf(trace_job->image, NULL, &lock);
+ ImageUser *iuser = trace_job->ob_active->iuser;
+ iuser->framenr = init_frame;
+ ImBuf *ibuf = BKE_image_acquire_ibuf(trace_job->image, iuser, &lock);
if (ibuf) {
/* Create frame. */
bGPDframe *gpf = BKE_gpencil_layer_frame_get(
@@ -249,7 +242,7 @@ static void trace_start_job(void *customdata, short *stop, short *do_update, flo
/* Image sequence. */
else if (trace_job->image->type == IMA_TYPE_IMAGE) {
ImageUser *iuser = trace_job->ob_active->iuser;
- for (int i = 0; i < iuser->frames; i++) {
+ for (int i = init_frame; i < iuser->frames; i++) {
if (G.is_break) {
trace_job->was_canceled = true;
break;
@@ -320,6 +313,7 @@ static int gpencil_trace_image_exec(bContext *C, wmOperator *op)
job->ob_active = job->base_active->object;
job->image = (Image *)job->ob_active->data;
job->frame_target = CFRA;
+ job->use_current_frame = RNA_boolean_get(op->ptr, "use_current_frame");
/* Create a new grease pencil object or reuse selected. */
eGP_TargetObjectMode target = RNA_enum_get(op->ptr, "target");
@@ -493,4 +487,9 @@ void GPENCIL_OT_trace_image(wmOperatorType *ot)
GPENCIL_TRACE_MODE_SINGLE,
"Mode",
"Determines if trace simple image or full sequence");
+ RNA_def_boolean(ot->srna,
+ "use_current_frame",
+ true,
+ "Start At Current Frame",
+ "Trace Image starting in current image frame");
}
diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c
index c2504ce329e..ede1d3eefaa 100644
--- a/source/blender/editors/gpencil/gpencil_undo.c
+++ b/source/blender/editors/gpencil/gpencil_undo.c
@@ -36,6 +36,7 @@
#include "BKE_blender_undo.h"
#include "BKE_context.h"
#include "BKE_gpencil.h"
+#include "BKE_undo_system.h"
#include "ED_gpencil.h"
@@ -61,28 +62,26 @@ int ED_gpencil_session_active(void)
return (BLI_listbase_is_empty(&undo_nodes) == false);
}
-int ED_undo_gpencil_step(bContext *C, int step, const char *name)
+/**
+ * \param step: eUndoStepDir.
+ */
+int ED_undo_gpencil_step(bContext *C, const int step)
{
bGPdata **gpd_ptr = NULL, *new_gpd = NULL;
gpd_ptr = ED_gpencil_data_get_pointers(C, NULL);
- if (step == 1) { /* undo */
- // printf("\t\tGP - undo step\n");
+ const eUndoStepDir undo_step = (eUndoStepDir)step;
+ if (undo_step == STEP_UNDO) {
if (cur_node->prev) {
- if (!name || STREQ(cur_node->name, name)) {
- cur_node = cur_node->prev;
- new_gpd = cur_node->gpd;
- }
+ cur_node = cur_node->prev;
+ new_gpd = cur_node->gpd;
}
}
- else if (step == -1) {
- // printf("\t\tGP - redo step\n");
+ else if (undo_step == STEP_REDO) {
if (cur_node->next) {
- if (!name || STREQ(cur_node->name, name)) {
- cur_node = cur_node->next;
- new_gpd = cur_node->gpd;
- }
+ cur_node = cur_node->next;
+ new_gpd = cur_node->gpd;
}
}
@@ -99,7 +98,7 @@ int ED_undo_gpencil_step(bContext *C, int step, const char *name)
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
/* make a copy of source layer and its data */
- gpld = BKE_gpencil_layer_duplicate(gpl);
+ gpld = BKE_gpencil_layer_duplicate(gpl, true, true);
BLI_addtail(&gpd->layers, gpld);
}
}
@@ -137,7 +136,7 @@ void gpencil_undo_push(bGPdata *gpd)
// printf("\t\tGP - undo push\n");
if (cur_node) {
- /* remove all un-done nodes from stack */
+ /* Remove all undone nodes from stack. */
undo_node = cur_node->next;
while (undo_node) {
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index 7c796f7b7a1..5c041134a74 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -579,7 +579,7 @@ bool ED_gpencil_stroke_can_use(const bContext *C, const bGPDstroke *gps)
}
/* Check whether given stroke can be edited for the current color */
-bool ED_gpencil_stroke_color_use(Object *ob, const bGPDlayer *gpl, const bGPDstroke *gps)
+bool ED_gpencil_stroke_material_editable(Object *ob, const bGPDlayer *gpl, const bGPDstroke *gps)
{
/* check if the color is editable */
MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(ob, gps->mat_nr + 1);
@@ -674,7 +674,7 @@ void gpencil_apply_parent(Depsgraph *depsgraph, Object *obact, bGPDlayer *gpl, b
float inverse_diff_mat[4][4];
float fpt[3];
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
invert_m4_m4(inverse_diff_mat, diff_mat);
for (i = 0; i < gps->totpoints; i++) {
@@ -697,10 +697,11 @@ void gpencil_apply_parent_point(Depsgraph *depsgraph,
float inverse_diff_mat[4][4];
float fpt[3];
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
invert_m4_m4(inverse_diff_mat, diff_mat);
mul_v3_m4v3(fpt, inverse_diff_mat, &pt->x);
+
copy_v3_v3(&pt->x, fpt);
}
@@ -997,6 +998,12 @@ void ED_gpencil_drawing_reference_get(const Scene *scene,
else {
/* use object location */
copy_v3_v3(r_vec, ob->obmat[3]);
+ /* Apply layer offset. */
+ bGPdata *gpd = ob->data;
+ bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd);
+ if (gpl != NULL) {
+ add_v3_v3(r_vec, gpl->layer_mat[3]);
+ }
}
}
}
@@ -1021,7 +1028,7 @@ void ED_gpencil_project_stroke_to_view(bContext *C, bGPDlayer *gpl, bGPDstroke *
/* init space conversion stuff */
gpencil_point_conversion_init(C, &gsc);
- BKE_gpencil_parent_matrix_get(depsgraph, ob, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, ob, gpl, diff_mat);
invert_m4_m4(inverse_diff_mat, diff_mat);
/* Adjust each point */
@@ -1046,6 +1053,7 @@ void ED_gpencil_project_stroke_to_view(bContext *C, bGPDlayer *gpl, bGPDstroke *
void ED_gpencil_project_stroke_to_plane(const Scene *scene,
const Object *ob,
const RegionView3D *rv3d,
+ bGPDlayer *gpl,
bGPDstroke *gps,
const float origin[3],
const int axis)
@@ -1058,6 +1066,10 @@ void ED_gpencil_project_stroke_to_plane(const Scene *scene,
float ray[3];
float rpoint[3];
+ /* Recalculate layer transform matrix. */
+ loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale);
+ invert_m4_m4(gpl->layer_invmat, gpl->layer_mat);
+
/* normal vector for a plane locked to axis */
zero_v3(plane_normal);
if (axis < 0) {
@@ -1074,24 +1086,27 @@ void ED_gpencil_project_stroke_to_plane(const Scene *scene,
copy_m4_m4(mat, ob->obmat);
/* move origin to cursor */
+ if ((ts->gpencil_v3d_align & GP_PROJECT_CURSOR) == 0) {
+ if (gpl != NULL) {
+ add_v3_v3(mat[3], gpl->location);
+ }
+ }
if (ts->gpencil_v3d_align & GP_PROJECT_CURSOR) {
copy_v3_v3(mat[3], cursor->location);
}
mul_mat3_m4_v3(mat, plane_normal);
}
+
+ if ((gpl != NULL) && (ts->gp_sculpt.lock_axis != GP_LOCKAXIS_CURSOR)) {
+ mul_mat3_m4_v3(gpl->layer_mat, plane_normal);
+ }
}
else {
const float scale[3] = {1.0f, 1.0f, 1.0f};
plane_normal[2] = 1.0f;
float mat[4][4];
loc_eul_size_to_mat4(mat, cursor->location, cursor->rotation_euler, scale);
-
- /* move origin to object */
- if ((ts->gpencil_v3d_align & GP_PROJECT_CURSOR) == 0) {
- copy_v3_v3(mat[3], ob->obmat[3]);
- }
-
mul_mat3_m4_v3(mat, plane_normal);
}
@@ -1127,8 +1142,12 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph,
ARegion *region = gsc->region;
RegionView3D *rv3d = region->regiondata;
+ /* Recalculate layer transform matrix. */
+ loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale);
+ invert_m4_m4(gpl->layer_invmat, gpl->layer_mat);
+
float diff_mat[4][4], inverse_diff_mat[4][4];
- BKE_gpencil_parent_matrix_get(depsgraph, gsc->ob, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, gsc->ob, gpl, diff_mat);
invert_m4_m4(inverse_diff_mat, diff_mat);
float origin[3];
@@ -1148,6 +1167,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph,
if (keep_original) {
gps_active = BKE_gpencil_stroke_duplicate(gps, true, true);
gps_active->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps_active);
for (i = 0, pt = gps_active->points; i < gps_active->totpoints; i++, pt++) {
pt->flag &= ~GP_SPOINT_SELECT;
}
@@ -1194,7 +1214,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph,
}
}
- ED_gpencil_project_point_to_plane(gsc->scene, gsc->ob, rv3d, origin, axis, &pt2);
+ ED_gpencil_project_point_to_plane(gsc->scene, gsc->ob, gpl, rv3d, origin, axis, &pt2);
copy_v3_v3(&pt->x, &pt2.x);
@@ -1250,6 +1270,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph,
*/
void ED_gpencil_project_point_to_plane(const Scene *scene,
const Object *ob,
+ bGPDlayer *gpl,
const RegionView3D *rv3d,
const float origin[3],
const int axis,
@@ -1277,6 +1298,11 @@ void ED_gpencil_project_point_to_plane(const Scene *scene,
if (ob && (ob->type == OB_GPENCIL)) {
float mat[4][4];
copy_m4_m4(mat, ob->obmat);
+ if ((ts->gpencil_v3d_align & GP_PROJECT_CURSOR) == 0) {
+ if (gpl != NULL) {
+ add_v3_v3(mat[3], gpl->location);
+ }
+ }
/* move origin to cursor */
if (ts->gpencil_v3d_align & GP_PROJECT_CURSOR) {
@@ -1284,6 +1310,10 @@ void ED_gpencil_project_point_to_plane(const Scene *scene,
}
mul_mat3_m4_v3(mat, plane_normal);
+ /* Apply layer rotation (local transform). */
+ if ((gpl != NULL) && (ts->gp_sculpt.lock_axis != GP_LOCKAXIS_CURSOR)) {
+ mul_mat3_m4_v3(gpl->layer_mat, plane_normal);
+ }
}
}
else {
@@ -1449,7 +1479,7 @@ void ED_gpencil_reset_layers_parent(Depsgraph *depsgraph, Object *obact, bGPdata
/* only redo if any change */
if (!equals_m4m4(gpl->inverse, cur_mat)) {
/* first apply current transformation to all strokes */
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
/* undo local object */
sub_v3_v3(diff_mat[3], gpl_loc);
@@ -1660,6 +1690,10 @@ void ED_gpencil_vgroup_select(bContext *C, Object *ob)
gps->flag |= GP_STROKE_SELECT;
}
}
+
+ if (gps->flag & GP_STROKE_SELECT) {
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
+ }
}
}
@@ -2144,7 +2178,7 @@ void ED_gpencil_update_color_uv(Main *bmain, Material *mat)
LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
/* check if it is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
gps_ma = BKE_gpencil_material(ob, gps->mat_nr + 1);
@@ -2535,6 +2569,9 @@ int ED_gpencil_select_stroke_segment(bGPdata *gpd,
void ED_gpencil_select_toggle_all(bContext *C, int action)
{
+ Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = ob->data;
+
/* for "toggle", test for existing selected strokes */
if (action == SEL_TOGGLE) {
action = SEL_SELECT;
@@ -2559,6 +2596,9 @@ void ED_gpencil_select_toggle_all(bContext *C, int action)
* NOTE: we limit ourselves to editable layers, since once a layer is "locked/hidden
* nothing should be able to touch it
*/
+ /* Set selection index to 0. */
+ gpd->select_last_index = 0;
+
CTX_DATA_BEGIN (C, bGPDlayer *, gpl, editable_gpencil_layers) {
/* deselect all strokes on all frames */
@@ -2576,6 +2616,7 @@ void ED_gpencil_select_toggle_all(bContext *C, int action)
}
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
}
}
@@ -2613,9 +2654,11 @@ void ED_gpencil_select_toggle_all(bContext *C, int action)
/* Change status of stroke */
if (selected) {
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
}
else {
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
}
CTX_DATA_END;
@@ -2637,6 +2680,11 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action)
}
if (action == SEL_DESELECT) {
+ /* Set selection index to 0. */
+ Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = ob->data;
+ gpd->select_last_index = 0;
+
GP_EDITABLE_CURVES_BEGIN(gps_iter, C, gpl, gps, gpc)
{
for (int i = 0; i < gpc->tot_curve_points; i++) {
@@ -2647,6 +2695,7 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action)
}
gpc->flag &= ~GP_CURVE_SELECT;
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
GP_EDITABLE_CURVES_END(gps_iter);
}
@@ -2688,10 +2737,12 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action)
if (selected) {
gpc->flag |= GP_CURVE_SELECT;
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
}
else {
gpc->flag &= ~GP_CURVE_SELECT;
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
}
GP_EDITABLE_STROKES_END(gps_iter);
@@ -3003,12 +3054,12 @@ void ED_gpencil_sbuffer_vertex_color_set(Depsgraph *depsgraph,
}
}
-/* Helper to get the bigger 2D bound box points. */
-static void gpencil_projected_2d_bound_box(GP_SpaceConversion *gsc,
- bGPDstroke *gps,
- const float diff_mat[4][4],
- float r_min[2],
- float r_max[2])
+/* Get the bigger 2D bound box points. */
+void ED_gpencil_projected_2d_bound_box(GP_SpaceConversion *gsc,
+ bGPDstroke *gps,
+ const float diff_mat[4][4],
+ float r_min[2],
+ float r_max[2])
{
float bounds[8][2];
BoundBox bb;
@@ -3053,7 +3104,7 @@ bool ED_gpencil_stroke_check_collision(GP_SpaceConversion *gsc,
BKE_gpencil_stroke_boundingbox_calc(gps);
}
- gpencil_projected_2d_bound_box(gsc, gps, diff_mat, boundbox_min, boundbox_max);
+ ED_gpencil_projected_2d_bound_box(gsc, gps, diff_mat, boundbox_min, boundbox_max);
rcti rect_stroke = {boundbox_min[0], boundbox_max[0], boundbox_min[1], boundbox_max[1]};
@@ -3126,7 +3177,7 @@ bGPDstroke *ED_gpencil_stroke_nearest_to_ends(bContext *C,
/* calculate difference matrix object */
float diff_mat[4][4];
- BKE_gpencil_parent_matrix_get(depsgraph, ob, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, ob, gpl, diff_mat);
/* Calculate the extremes of the stroke in 2D. */
bGPDspoint pt_parent;
@@ -3144,15 +3195,13 @@ bGPDstroke *ED_gpencil_stroke_nearest_to_ends(bContext *C,
float dist_min = FLT_MAX;
LISTBASE_FOREACH (bGPDstroke *, gps_target, &gpf->strokes) {
/* Check if the color is editable. */
- if ((gps_target == gps) || (ED_gpencil_stroke_color_use(ob, gpl, gps) == false)) {
+ if ((gps_target == gps) || (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false)) {
continue;
}
/* Check if one of the ends is inside target stroke bounding box. */
- if (!ED_gpencil_stroke_check_collision(gsc, gps, pt2d_start, radius, diff_mat)) {
- continue;
- }
- if (!ED_gpencil_stroke_check_collision(gsc, gps, pt2d_end, radius, diff_mat)) {
+ if ((!ED_gpencil_stroke_check_collision(gsc, gps_target, pt2d_start, radius, diff_mat)) &&
+ (!ED_gpencil_stroke_check_collision(gsc, gps_target, pt2d_end, radius, diff_mat))) {
continue;
}
/* Check the distance of the ends with the ends of target stroke to avoid middle contact.
diff --git a/source/blender/editors/gpencil/gpencil_uv.c b/source/blender/editors/gpencil/gpencil_uv.c
index ec2ccabddfe..677451eaabc 100644
--- a/source/blender/editors/gpencil/gpencil_uv.c
+++ b/source/blender/editors/gpencil/gpencil_uv.c
@@ -31,7 +31,6 @@
#include "BKE_context.h"
#include "BKE_gpencil.h"
#include "BKE_gpencil_geom.h"
-#include "BKE_unit.h"
#include "RNA_access.h"
#include "RNA_define.h"
diff --git a/source/blender/editors/gpencil/gpencil_vertex_ops.c b/source/blender/editors/gpencil/gpencil_vertex_ops.c
index b212872b607..bf46fa2544f 100644
--- a/source/blender/editors/gpencil/gpencil_vertex_ops.c
+++ b/source/blender/editors/gpencil/gpencil_vertex_ops.c
@@ -28,16 +28,11 @@
#include "BLI_ghash.h"
#include "BLI_math.h"
-#include "BLT_translation.h"
-
#include "DNA_brush_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_material_types.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
-#include "BKE_gpencil.h"
-#include "BKE_gpencil_modifier.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_paint.h"
@@ -48,16 +43,11 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#include "RNA_enum_types.h"
-
-#include "UI_view2d.h"
#include "ED_gpencil.h"
#include "ED_screen.h"
-#include "ED_view3d.h"
#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_query.h"
#include "gpencil_intern.h"
@@ -674,7 +664,7 @@ static bool gpencil_extract_palette_from_vertex(bContext *C,
if (ED_gpencil_stroke_can_use(C, gps) == false) {
continue;
}
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(ob, gps->mat_nr + 1);
@@ -859,7 +849,7 @@ static int gpencil_material_to_vertex_exec(bContext *C, wmOperator *op)
if (ED_gpencil_stroke_can_use(C, gps) == false) {
continue;
}
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
diff --git a/source/blender/editors/gpencil/gpencil_vertex_paint.c b/source/blender/editors/gpencil/gpencil_vertex_paint.c
index e2c81d53fba..a05cc3c4dbd 100644
--- a/source/blender/editors/gpencil/gpencil_vertex_paint.c
+++ b/source/blender/editors/gpencil/gpencil_vertex_paint.c
@@ -151,7 +151,7 @@ typedef struct tGP_BrushVertexpaintData {
tGP_Grid *grid;
/** Total number of rows/cols. */
int grid_size;
- /** Total number of cells elments in the grid array. */
+ /** Total number of cells elements in the grid array. */
int grid_len;
/** Grid sample position (used to determine distance of falloff) */
int grid_sample[2];
@@ -825,7 +825,8 @@ static void gpencil_save_selected_point(tGP_BrushVertexpaintData *gso,
static bool gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso,
bGPDstroke *gps,
const char tool,
- const float diff_mat[4][4])
+ const float diff_mat[4][4],
+ const float bound_mat[4][4])
{
GP_SpaceConversion *gsc = &gso->gsc;
rcti *rect = &gso->brush_rect;
@@ -853,7 +854,7 @@ static bool gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso,
}
/* Check if the stroke collide with brush. */
- if (!ED_gpencil_stroke_check_collision(gsc, gps, gso->mval, radius, diff_mat)) {
+ if (!ED_gpencil_stroke_check_collision(gsc, gps, gso->mval, radius, bound_mat)) {
return false;
}
@@ -998,7 +999,8 @@ static bool gpencil_vertexpaint_brush_do_frame(bContext *C,
tGP_BrushVertexpaintData *gso,
bGPDlayer *gpl,
bGPDframe *gpf,
- const float diff_mat[4][4])
+ const float diff_mat[4][4],
+ const float bound_mat[4][4])
{
Object *ob = CTX_data_active_object(C);
const char tool = ob->mode == OB_MODE_VERTEX_GPENCIL ? gso->brush->gpencil_vertex_tool :
@@ -1020,12 +1022,12 @@ static bool gpencil_vertexpaint_brush_do_frame(bContext *C,
continue;
}
/* Check if the color is editable. */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
/* Check points below the brush. */
- bool hit = gpencil_vertexpaint_select_stroke(gso, gps, tool, diff_mat);
+ bool hit = gpencil_vertexpaint_select_stroke(gso, gps, tool, diff_mat, bound_mat);
/* If stroke was hit and has an editcurve the curve needs an update. */
bGPDstroke *gps_active = (gps->runtime.gps_orig) ? gps->runtime.gps_orig : gps;
@@ -1130,9 +1132,11 @@ static bool gpencil_vertexpaint_brush_apply_to_layers(bContext *C, tGP_BrushVert
continue;
}
- /* calculate difference matrix */
- float diff_mat[4][4];
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ /* Calculate transform matrix. */
+ float diff_mat[4][4], bound_mat[4][4];
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
+ copy_m4_m4(bound_mat, diff_mat);
+ mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_invmat);
/* Active Frame or MultiFrame? */
if (gso->is_multiframe) {
@@ -1159,7 +1163,7 @@ static bool gpencil_vertexpaint_brush_apply_to_layers(bContext *C, tGP_BrushVert
}
/* affect strokes in this frame */
- changed |= gpencil_vertexpaint_brush_do_frame(C, gso, gpl, gpf, diff_mat);
+ changed |= gpencil_vertexpaint_brush_do_frame(C, gso, gpl, gpf, diff_mat, bound_mat);
}
}
}
@@ -1167,7 +1171,8 @@ static bool gpencil_vertexpaint_brush_apply_to_layers(bContext *C, tGP_BrushVert
/* Apply to active frame's strokes */
if (gpl->actframe != NULL) {
gso->mf_falloff = 1.0f;
- changed |= gpencil_vertexpaint_brush_do_frame(C, gso, gpl, gpl->actframe, diff_mat);
+ changed |= gpencil_vertexpaint_brush_do_frame(
+ C, gso, gpl, gpl->actframe, diff_mat, bound_mat);
}
}
}
diff --git a/source/blender/editors/gpencil/gpencil_weight_paint.c b/source/blender/editors/gpencil/gpencil_weight_paint.c
index 7fa71fcce3c..a3e5ece5862 100644
--- a/source/blender/editors/gpencil/gpencil_weight_paint.c
+++ b/source/blender/editors/gpencil/gpencil_weight_paint.c
@@ -383,7 +383,8 @@ static void gpencil_save_selected_point(tGP_BrushWeightpaintData *gso,
/* Select points in this stroke and add to an array to be used later. */
static void gpencil_weightpaint_select_stroke(tGP_BrushWeightpaintData *gso,
bGPDstroke *gps,
- const float diff_mat[4][4])
+ const float diff_mat[4][4],
+ const float bound_mat[4][4])
{
GP_SpaceConversion *gsc = &gso->gsc;
rcti *rect = &gso->brush_rect;
@@ -402,7 +403,7 @@ static void gpencil_weightpaint_select_stroke(tGP_BrushWeightpaintData *gso,
bool include_last = false;
/* Check if the stroke collide with brush. */
- if (!ED_gpencil_stroke_check_collision(gsc, gps, gso->mval, radius, diff_mat)) {
+ if (!ED_gpencil_stroke_check_collision(gsc, gps, gso->mval, radius, bound_mat)) {
return;
}
@@ -505,7 +506,8 @@ static bool gpencil_weightpaint_brush_do_frame(bContext *C,
tGP_BrushWeightpaintData *gso,
bGPDlayer *gpl,
bGPDframe *gpf,
- const float diff_mat[4][4])
+ const float diff_mat[4][4],
+ const float bound_mat[4][4])
{
Object *ob = CTX_data_active_object(C);
char tool = gso->brush->gpencil_weight_tool;
@@ -526,12 +528,12 @@ static bool gpencil_weightpaint_brush_do_frame(bContext *C,
continue;
}
/* Check if the color is editable. */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
/* Check points below the brush. */
- gpencil_weightpaint_select_stroke(gso, gps, diff_mat);
+ gpencil_weightpaint_select_stroke(gso, gps, diff_mat, bound_mat);
}
/*---------------------------------------------------------------------
@@ -578,9 +580,11 @@ static bool gpencil_weightpaint_brush_apply_to_layers(bContext *C, tGP_BrushWeig
continue;
}
- /* calculate difference matrix */
- float diff_mat[4][4];
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ /* Calculate transform matrix. */
+ float diff_mat[4][4], bound_mat[4][4];
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
+ copy_m4_m4(bound_mat, diff_mat);
+ mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_invmat);
/* Active Frame or MultiFrame? */
if (gso->is_multiframe) {
@@ -608,7 +612,7 @@ static bool gpencil_weightpaint_brush_apply_to_layers(bContext *C, tGP_BrushWeig
}
/* affect strokes in this frame */
- changed |= gpencil_weightpaint_brush_do_frame(C, gso, gpl, gpf, diff_mat);
+ changed |= gpencil_weightpaint_brush_do_frame(C, gso, gpl, gpf, diff_mat, bound_mat);
}
}
}
@@ -616,7 +620,8 @@ static bool gpencil_weightpaint_brush_apply_to_layers(bContext *C, tGP_BrushWeig
if (gpl->actframe != NULL) {
/* Apply to active frame's strokes */
gso->mf_falloff = 1.0f;
- changed |= gpencil_weightpaint_brush_do_frame(C, gso, gpl, gpl->actframe, diff_mat);
+ changed |= gpencil_weightpaint_brush_do_frame(
+ C, gso, gpl, gpl->actframe, diff_mat, bound_mat);
}
}
}
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index 9cf67816df2..2415c85e299 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -33,7 +33,11 @@ struct ID;
struct ListBase;
struct ARegion;
+struct ARegionType;
struct Main;
+struct NlaStrip;
+struct FModifier;
+struct PanelType;
struct ReportList;
struct ScrArea;
struct SpaceLink;
@@ -675,11 +679,25 @@ void ANIM_draw_framerange(struct Scene *scene, struct View2D *v2d);
/* ------------- UI Panel Drawing -------------- */
-/* draw a given F-Modifier for some layout/UI-Block */
-void ANIM_uiTemplate_fmodifier_draw(struct uiLayout *layout,
- struct ID *fcurve_owner_id,
- ListBase *modifiers,
- struct FModifier *fcm);
+struct NlaStrip *ANIM_nla_context_strip(const struct bContext *C);
+struct FCurve *ANIM_graph_context_fcurve(const struct bContext *C);
+
+/* Needed for abstraction between the graph editor and the NLA editor. */
+typedef bool (*PanelTypePollFn)(const struct bContext *C, struct PanelType *pt);
+/* Avoid including "UI_interface.h" here. */
+typedef void (*uiListPanelIDFromDataFunc)(void *data_link, char *r_idname);
+
+void ANIM_fmodifier_panels(const struct bContext *C,
+ struct ID *owner_id,
+ struct ListBase *fmodifiers,
+ uiListPanelIDFromDataFunc panel_id_fn);
+
+void ANIM_modifier_panels_register_graph_and_NLA(struct ARegionType *region_type,
+ const char *modifier_panel_prefix,
+ PanelTypePollFn poll_function);
+void ANIM_modifier_panels_register_graph_only(struct ARegionType *region_type,
+ const char *modifier_panel_prefix,
+ PanelTypePollFn poll_function);
/* ------------- Copy/Paste Buffer -------------- */
diff --git a/source/blender/editors/include/ED_clip.h b/source/blender/editors/include/ED_clip.h
index 0a66c439f79..56494f87bfe 100644
--- a/source/blender/editors/include/ED_clip.h
+++ b/source/blender/editors/include/ED_clip.h
@@ -99,6 +99,30 @@ void ED_space_clip_set_clip(struct bContext *C,
struct Mask *ED_space_clip_get_mask(struct SpaceClip *sc);
void ED_space_clip_set_mask(struct bContext *C, struct SpaceClip *sc, struct Mask *mask);
+/* Locked state is used to preserve current clip editor viewport upon changes. Example usage:
+ *
+ * ...
+ *
+ * ClipViewLockState lock_state;
+ * ED_clip_view_lock_state_store(C, &lock_state);
+ *
+ * <change selection>
+ *
+ * ED_clip_view_lock_state_restore_no_jump(C, &lock_state);
+ *
+ * These function are to be used from space clip editor context only. Otherwise debug builds will
+ * assert, release builds will crash. */
+
+typedef struct ClipViewLockState {
+ float offset_x, offset_y;
+ float lock_offset_x, lock_offset_y;
+ float zoom;
+} ClipViewLockState;
+
+void ED_clip_view_lock_state_store(const struct bContext *C, ClipViewLockState *state);
+void ED_clip_view_lock_state_restore_no_jump(const struct bContext *C,
+ const ClipViewLockState *state);
+
/* ** clip_ops.c ** */
void ED_operatormacros_clip(void);
diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h
index d12882f0e29..7538dac1354 100644
--- a/source/blender/editors/include/ED_fileselect.h
+++ b/source/blender/editors/include/ED_fileselect.h
@@ -194,7 +194,7 @@ typedef enum FSMenuInsert {
FS_INSERT_SAVE = (1 << 1),
/** moves the item to the front of the list when its not already there */
FS_INSERT_FIRST = (1 << 2),
- /** just append to preseve delivered order */
+ /** just append to preserve delivered order */
FS_INSERT_LAST = (1 << 3),
} FSMenuInsert;
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 1b7caf27ecf..2fbf280475b 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -147,9 +147,9 @@ bool ED_gpencil_has_keyframe_v3d(struct Scene *scene, struct Object *ob, int cfr
bool ED_gpencil_stroke_can_use_direct(const struct ScrArea *area, const struct bGPDstroke *gps);
bool ED_gpencil_stroke_can_use(const struct bContext *C, const struct bGPDstroke *gps);
-bool ED_gpencil_stroke_color_use(struct Object *ob,
- const struct bGPDlayer *gpl,
- const struct bGPDstroke *gps);
+bool ED_gpencil_stroke_material_editable(struct Object *ob,
+ const struct bGPDlayer *gpl,
+ const struct bGPDstroke *gps);
/* ----------- Grease Pencil Operators ----------------- */
@@ -213,7 +213,7 @@ bool ED_gpencil_anim_copybuf_paste(struct bAnimContext *ac, const short copy_mod
/* ------------ Grease-Pencil Undo System ------------------ */
int ED_gpencil_session_active(void);
-int ED_undo_gpencil_step(struct bContext *C, int step, const char *name);
+int ED_undo_gpencil_step(struct bContext *C, const int step); /* eUndoStepDir. */
/* ------------ Grease-Pencil Armature ------------------ */
bool ED_gpencil_add_armature(const struct bContext *C,
@@ -263,11 +263,13 @@ bool ED_object_gpencil_exit(struct Main *bmain, struct Object *ob);
void ED_gpencil_project_stroke_to_plane(const struct Scene *scene,
const struct Object *ob,
const struct RegionView3D *rv3d,
+ struct bGPDlayer *gpl,
struct bGPDstroke *gps,
const float origin[3],
const int axis);
void ED_gpencil_project_point_to_plane(const struct Scene *scene,
const struct Object *ob,
+ struct bGPDlayer *gpl,
const struct RegionView3D *rv3d,
const float origin[3],
const int axis,
@@ -366,6 +368,11 @@ bool ED_gpencil_stroke_point_is_inside(struct bGPDstroke *gps,
struct GP_SpaceConversion *gsc,
int mouse[2],
const float diff_mat[4][4]);
+void ED_gpencil_projected_2d_bound_box(struct GP_SpaceConversion *gsc,
+ struct bGPDstroke *gps,
+ const float diff_mat[4][4],
+ float r_min[2],
+ float r_max[2]);
struct bGPDstroke *ED_gpencil_stroke_nearest_to_ends(struct bContext *C,
struct GP_SpaceConversion *gsc,
diff --git a/source/blender/editors/include/ED_keyframes_draw.h b/source/blender/editors/include/ED_keyframes_draw.h
index 3cc77887b1a..2f8faf1b2bd 100644
--- a/source/blender/editors/include/ED_keyframes_draw.h
+++ b/source/blender/editors/include/ED_keyframes_draw.h
@@ -95,6 +95,8 @@ typedef enum eActKeyBlock_Hold {
ACTKEYBLOCK_FLAG_ANY_HOLD = (1 << 2),
/* The curve segment uses non-bezier interpolation */
ACTKEYBLOCK_FLAG_NON_BEZIER = (1 << 3),
+ /* The block is grease pencil */
+ ACTKEYBLOCK_FLAG_GPENCIL = (1 << 4),
} eActKeyBlock_Flag;
/* *********************** Keyframe Drawing ****************************** */
diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h
index b08ab57545f..cf90a21f799 100644
--- a/source/blender/editors/include/ED_keyframes_edit.h
+++ b/source/blender/editors/include/ED_keyframes_edit.h
@@ -118,7 +118,7 @@ typedef struct KeyframeEdit_CircleData {
} KeyframeEdit_CircleData;
/* ************************************************ */
-/* Non-Destuctive Editing API (keyframes_edit.c) */
+/* Non-Destructive Editing API (keyframes_edit.c) */
/* --- Defines for 'OK' polls + KeyframeEditData Flags --------- */
@@ -300,7 +300,7 @@ short bezt_to_cfraelem(KeyframeEditData *ked, struct BezTriple *bezt);
*/
void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt);
-/* ------ 1.5-D Region Testing Uitls (Lasso/Circle Select) ------- */
+/* ------ 1.5-D Region Testing Utilities (Lasso/Circle Select) ------- */
/* XXX: These are temporary,
* until we can unify GP/Mask Keyframe handling and standard FCurve Keyframe handling */
diff --git a/source/blender/editors/include/ED_mask.h b/source/blender/editors/include/ED_mask.h
index bcf52da3f69..247911bdc55 100644
--- a/source/blender/editors/include/ED_mask.h
+++ b/source/blender/editors/include/ED_mask.h
@@ -63,7 +63,10 @@ void ED_mask_point_pos__reverse(
struct ScrArea *area, struct ARegion *region, float x, float y, float *xr, float *yr);
void ED_mask_cursor_location_get(struct ScrArea *area, float cursor[2]);
-bool ED_mask_selected_minmax(const struct bContext *C, float min[2], float max[2]);
+bool ED_mask_selected_minmax(const struct bContext *C,
+ float min[2],
+ float max[2],
+ bool handles_as_control_point);
/* mask_draw.c */
void ED_mask_draw(const struct bContext *C, const char draw_flag, const char draw_type);
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index 417cae800ea..ea2383457c2 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -51,6 +51,10 @@ typedef enum {
#define NODE_GRID_STEPS 5
/* space_node.c */
+
+void ED_node_cursor_location_get(const struct SpaceNode *snode, float value[2]);
+void ED_node_cursor_location_set(struct SpaceNode *snode, const float value[2]);
+
int ED_node_tree_path_length(struct SpaceNode *snode);
void ED_node_tree_path_get(struct SpaceNode *snode, char *value);
void ED_node_tree_path_get_fixedbuf(struct SpaceNode *snode, char *value, int max_length);
@@ -76,7 +80,7 @@ void ED_node_sample_set(const float col[4]);
void ED_node_draw_snap(
struct View2D *v2d, const float cent[2], float size, NodeBorder border, unsigned int pos);
-/* node_draw.c */
+/* node_draw.cc */
void ED_node_socket_draw(struct bNodeSocket *sock,
const struct rcti *rect,
const float color[4],
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index bd1a4a0c63f..5dfce6071f0 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -159,7 +159,7 @@ extern struct EnumPropertyItem prop_clear_parent_types[];
extern struct EnumPropertyItem prop_make_parent_types[];
#endif
-/* Set the object's parent, return true iff successful. */
+/* Set the object's parent, return true if successful. */
bool ED_object_parent_set(struct ReportList *reports,
const struct bContext *C,
struct Scene *scene,
@@ -462,25 +462,25 @@ bool ED_object_gpencil_modifier_remove(struct ReportList *reports,
struct Object *ob,
struct GpencilModifierData *md);
void ED_object_gpencil_modifier_clear(struct Main *bmain, struct Object *ob);
-int ED_object_gpencil_modifier_move_down(struct ReportList *reports,
- struct Object *ob,
- struct GpencilModifierData *md);
-int ED_object_gpencil_modifier_move_up(struct ReportList *reports,
- struct Object *ob,
- struct GpencilModifierData *md);
+bool ED_object_gpencil_modifier_move_down(struct ReportList *reports,
+ struct Object *ob,
+ struct GpencilModifierData *md);
+bool ED_object_gpencil_modifier_move_up(struct ReportList *reports,
+ struct Object *ob,
+ struct GpencilModifierData *md);
bool ED_object_gpencil_modifier_move_to_index(struct ReportList *reports,
struct Object *ob,
struct GpencilModifierData *md,
const int index);
-int ED_object_gpencil_modifier_apply(struct Main *bmain,
- struct ReportList *reports,
- struct Depsgraph *depsgraph,
+bool ED_object_gpencil_modifier_apply(struct Main *bmain,
+ struct ReportList *reports,
+ struct Depsgraph *depsgraph,
+ struct Object *ob,
+ struct GpencilModifierData *md,
+ int mode);
+bool ED_object_gpencil_modifier_copy(struct ReportList *reports,
struct Object *ob,
- struct GpencilModifierData *md,
- int mode);
-int ED_object_gpencil_modifier_copy(struct ReportList *reports,
- struct Object *ob,
- struct GpencilModifierData *md);
+ struct GpencilModifierData *md);
void ED_object_gpencil_modifier_copy_to_object(struct Object *ob_dst,
struct GpencilModifierData *md);
diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h
index 9cdecc444c8..a49fe1aa544 100644
--- a/source/blender/editors/include/ED_render.h
+++ b/source/blender/editors/include/ED_render.h
@@ -29,16 +29,16 @@
extern "C" {
#endif
-struct bContext;
-struct bScreen;
struct DEGEditorUpdateContext;
struct Depsgraph;
struct ID;
-struct Main;
struct MTex;
+struct Main;
struct Render;
struct Scene;
struct ScrArea;
+struct bContext;
+struct bScreen;
struct wmWindow;
struct wmWindowManager;
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 20417634020..deb6b7502c7 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -57,15 +57,14 @@ struct wmMsgSubscribeKey;
struct wmMsgSubscribeValue;
struct wmNotifier;
struct wmOperatorType;
+struct wmRegionListenerParams;
+struct wmRegionMessageSubscribeParams;
+struct wmSpaceTypeListenerParams;
struct wmWindow;
struct wmWindowManager;
/* regions */
-void ED_region_do_listen(struct wmWindow *win,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmNotifier *note,
- const Scene *scene);
+void ED_region_do_listen(struct wmRegionListenerParams *params);
void ED_region_do_layout(struct bContext *C, struct ARegion *region);
void ED_region_do_draw(struct bContext *C, struct ARegion *region);
void ED_region_exit(struct bContext *C, struct ARegion *region);
@@ -144,29 +143,11 @@ void ED_area_do_msg_notify_tag_refresh(struct bContext *C,
struct wmMsgSubscribeKey *msg_key,
struct wmMsgSubscribeValue *msg_val);
-void ED_area_do_mgs_subscribe_for_tool_header(const struct bContext *C,
- struct WorkSpace *workspace,
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus);
-void ED_area_do_mgs_subscribe_for_tool_ui(const struct bContext *C,
- struct WorkSpace *workspace,
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus);
+void ED_area_do_mgs_subscribe_for_tool_header(const struct wmRegionMessageSubscribeParams *params);
+void ED_area_do_mgs_subscribe_for_tool_ui(const struct wmRegionMessageSubscribeParams *params);
/* message bus */
-void ED_region_message_subscribe(struct bContext *C,
- struct WorkSpace *workspace,
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus);
+void ED_region_message_subscribe(struct wmRegionMessageSubscribeParams *params);
/* spaces */
void ED_spacetypes_keymap(struct wmKeyConfig *keyconf);
@@ -178,7 +159,7 @@ void ED_area_exit(struct bContext *C, struct ScrArea *area);
int ED_screen_area_active(const struct bContext *C);
void ED_screen_global_areas_refresh(struct wmWindow *win);
void ED_screen_global_areas_sync(struct wmWindow *win);
-void ED_area_do_listen(struct wmWindow *win, ScrArea *area, struct wmNotifier *note, Scene *scene);
+void ED_area_do_listen(struct wmSpaceTypeListenerParams *params);
void ED_area_tag_redraw(ScrArea *area);
void ED_area_tag_redraw_no_rebuild(ScrArea *area);
void ED_area_tag_redraw_regiontype(ScrArea *area, int type);
@@ -427,13 +408,8 @@ void ED_region_cache_draw_cached_segments(struct ARegion *region,
const int efra);
/* area_utils.c */
-void ED_region_generic_tools_region_message_subscribe(const struct bContext *C,
- struct WorkSpace *workspace,
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus);
+void ED_region_generic_tools_region_message_subscribe(
+ const struct wmRegionMessageSubscribeParams *params);
int ED_region_generic_tools_region_snap_size(const struct ARegion *region, int size, int axis);
/* area_query.c */
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index ca3e351a052..8f1be847e2b 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -40,7 +40,7 @@ void transform_operatortypes(void);
/* ******************** Macros & Prototypes *********************** */
/* MODE AND NUMINPUT FLAGS */
-enum TfmMode {
+typedef enum {
TFM_INIT = -1,
TFM_DUMMY,
TFM_TRANSLATION,
@@ -77,29 +77,11 @@ enum TfmMode {
TFM_BONE_ENVELOPE_DIST,
TFM_NORMAL_ROTATION,
TFM_GPENCIL_OPACITY,
-};
-
-/* TRANSFORM CONTEXTS */
-#define CTX_NONE 0
-#define CTX_TEXTURE (1 << 0)
-#define CTX_EDGE (1 << 1)
-#define CTX_NO_PET (1 << 2)
-#define CTX_NO_MIRROR (1 << 3)
-#define CTX_AUTOCONFIRM (1 << 4)
-#define CTX_MOVIECLIP (1 << 6)
-#define CTX_MASK (1 << 7)
-#define CTX_PAINT_CURVE (1 << 8)
-#define CTX_GPENCIL_STROKES (1 << 9)
-#define CTX_CURSOR (1 << 10)
-/** When transforming object's, adjust the object data so it stays in the same place. */
-#define CTX_OBMODE_XFORM_OBDATA (1 << 11)
-/** Transform object parents without moving their children. */
-#define CTX_OBMODE_XFORM_SKIP_CHILDREN (1 << 12)
+} eTfmMode;
/* Standalone call to get the transformation center corresponding to the current situation
* returns 1 if successful, 0 otherwise (usually means there's no selection)
- * (if 0 is returns, *vec is unmodified)
- * */
+ * (if false is returns, `cent3d` is unmodified). */
bool calculateTransformCenter(struct bContext *C,
int centerMode,
float cent3d[3],
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index a4856845a65..a63b133cc22 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -465,7 +465,7 @@ float ED_view3d_radius_to_dist(const struct View3D *v3d,
void imm_drawcircball(const float cent[3], float rad, const float tmat[4][4], unsigned int pos);
-/* backbuffer select and draw support */
+/* Back-buffer select and draw support. */
void ED_view3d_backbuf_depth_validate(struct ViewContext *vc);
int ED_view3d_backbuf_sample_size_clamp(struct ARegion *region, const float dist);
@@ -479,7 +479,7 @@ bool ED_view3d_autodist(struct Depsgraph *depsgraph,
const bool alphaoverride,
const float fallback_depth_pt[3]);
-/* only draw so ED_view3d_autodist_simple can be called many times after */
+/* Only draw so #ED_view3d_autodist_simple can be called many times after. */
void ED_view3d_autodist_init(struct Depsgraph *depsgraph,
struct ARegion *region,
struct View3D *v3d,
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 7bbb7225f14..81641239c6a 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -56,6 +56,7 @@ struct bNode;
struct bNodeSocket;
struct bNodeTree;
struct bScreen;
+struct rctf;
struct rcti;
struct uiButSearch;
struct uiFontStyle;
@@ -105,7 +106,7 @@ typedef struct uiPopupBlockHandle uiPopupBlockHandle;
typedef enum eUIEmbossType {
UI_EMBOSS = 0, /* use widget style for drawing */
UI_EMBOSS_NONE = 1, /* Nothing, only icon and/or text */
- UI_EMBOSS_PULLDOWN = 2, /* Pulldown menu style */
+ UI_EMBOSS_PULLDOWN = 2, /* Pull-down menu style */
UI_EMBOSS_RADIAL = 3, /* Pie Menu */
/**
* The same as #UI_EMBOSS_NONE, unless the button has
@@ -165,6 +166,8 @@ enum {
/** The block is only used during the search process and will not be drawn.
* Currently just for the case of a closed panel's sub-panel (and its sub-panels). */
UI_BLOCK_SEARCH_ONLY = 1 << 25,
+ /** Hack for quick setup (splash screen) to draw text centered. */
+ UI_BLOCK_QUICK_SETUP = 1 << 26,
};
/** #uiPopupBlockHandle.menuretval */
@@ -414,57 +417,38 @@ void UI_draw_anti_tria(
void UI_draw_anti_fan(float tri_array[][2], unsigned int length, const float color[4]);
void UI_draw_roundbox_corner_set(int type);
-void UI_draw_roundbox_aa(
- bool filled, float minx, float miny, float maxx, float maxy, float rad, const float color[4]);
-void UI_draw_roundbox_4fv(
- bool filled, float minx, float miny, float maxx, float maxy, float rad, const float col[4]);
-void UI_draw_roundbox_3ub_alpha(bool filled,
- float minx,
- float miny,
- float maxx,
- float maxy,
+void UI_draw_roundbox_aa(const struct rctf *rect, bool filled, float rad, const float color[4]);
+void UI_draw_roundbox_4fv(const struct rctf *rect, bool filled, float rad, const float col[4]);
+void UI_draw_roundbox_3ub_alpha(const struct rctf *rect,
+ bool filled,
float rad,
const unsigned char col[3],
unsigned char alpha);
-void UI_draw_roundbox_3fv_alpha(bool filled,
- float minx,
- float miny,
- float maxx,
- float maxy,
- float rad,
- const float col[3],
- float alpha);
-void UI_draw_roundbox_shade_x(bool filled,
- float minx,
- float miny,
- float maxx,
- float maxy,
+void UI_draw_roundbox_3fv_alpha(
+ const struct rctf *rect, bool filled, float rad, const float col[3], float alpha);
+void UI_draw_roundbox_shade_x(const struct rctf *rect,
+ bool filled,
float rad,
float shadetop,
float shadedown,
const float col[4]);
+void UI_draw_roundbox_4fv_ex(const struct rctf *rect,
+ const float inner1[4],
+ const float inner2[4],
+ float shade_dir,
+ const float outline[4],
+ float outline_width,
+ float rad);
#if 0 /* unused */
int UI_draw_roundbox_corner_get(void);
-void UI_draw_roundbox_shade_y(bool filled,
- float minx,
- float miny,
- float maxx,
- float maxy,
- float rad,
- float shadeleft,
- float shaderight,
- const float col[4]);
#endif
-void UI_draw_box_shadow(unsigned char alpha, float minx, float miny, float maxx, float maxy);
+void UI_draw_box_shadow(const struct rctf *rect, unsigned char alpha);
void UI_draw_text_underline(int pos_x, int pos_y, int len, int height, const float color[4]);
void UI_draw_safe_areas(uint pos,
- float x1,
- float x2,
- float y1,
- float y2,
+ const struct rctf *rect,
const float title_aspect[2],
const float action_aspect[2]);
@@ -526,6 +510,7 @@ typedef bool (*uiButSearchContextMenuFn)(struct bContext *C,
const struct wmEvent *event);
typedef struct ARegion *(*uiButSearchTooltipFn)(struct bContext *C,
struct ARegion *region,
+ const struct rcti *item_rect,
void *arg,
void *active);
@@ -664,8 +649,7 @@ bool UI_popup_block_name_exists(const struct bScreen *screen, const char *name);
* Begin/Define Buttons/End/Draw is the typical order in which these
* function should be called, though for popup blocks Draw is left out.
* Freeing blocks is done by the screen/ module automatically.
- *
- * */
+ */
uiBlock *UI_block_begin(const struct bContext *C,
struct ARegion *region,
@@ -1429,8 +1413,10 @@ enum {
UI_TEMPLATE_ID_FILTER_AVAILABLE = 1,
};
-int UI_icon_from_id(struct ID *id);
+int UI_icon_from_id(const struct ID *id);
int UI_icon_from_report_type(int type);
+int UI_icon_colorid_from_report_type(int type);
+int UI_text_colorid_from_report_type(int type);
int UI_icon_from_event_type(short event_type, short event_value);
int UI_icon_from_keymap_item(const struct wmKeyMapItem *kmi, int r_icon_mod[4]);
@@ -2499,11 +2485,12 @@ void UI_context_active_but_prop_get_templateID(struct bContext *C,
struct PropertyRNA **r_prop);
struct ID *UI_context_active_but_get_tab_ID(struct bContext *C);
-uiBut *UI_region_active_but_get(struct ARegion *region);
+uiBut *UI_region_active_but_get(const struct ARegion *region);
uiBut *UI_region_but_find_rect_over(const struct ARegion *region, const struct rcti *rect_px);
uiBlock *UI_region_block_find_mouse_over(const struct ARegion *region,
const int xy[2],
bool only_clip);
+struct ARegion *UI_region_searchbox_region_get(const struct ARegion *button_region);
/* uiFontStyle.align */
typedef enum eFontStyle_Align {
@@ -2560,6 +2547,7 @@ void UI_template_fix_linking(void);
/* UI_OT_editsource helpers */
bool UI_editsource_enable_check(void);
void UI_editsource_active_but_test(uiBut *but);
+void UI_editsource_but_replace(const uiBut *old_but, uiBut *new_but);
/* UI_butstore_ helpers */
typedef struct uiButStore uiButStore;
@@ -2583,6 +2571,21 @@ struct ARegion *UI_tooltip_create_from_button(struct bContext *C,
struct ARegion *UI_tooltip_create_from_gizmo(struct bContext *C, struct wmGizmo *gz);
void UI_tooltip_free(struct bContext *C, struct bScreen *screen, struct ARegion *region);
+typedef struct {
+ /** A description for the item, e.g. what happens when selecting it. */
+ char description[UI_MAX_DRAW_STR];
+ /* The full name of the item, without prefixes or suffixes (e.g. hint with UI_SEP_CHARP). */
+ const char *name;
+ /** Additional info about the item (e.g. library name of a linked data-block). */
+ char hint[UI_MAX_DRAW_STR];
+} uiSearchItemTooltipData;
+
+struct ARegion *UI_tooltip_create_from_search_item_generic(
+ struct bContext *C,
+ const struct ARegion *searchbox_region,
+ const struct rcti *item_rect,
+ const uiSearchItemTooltipData *item_tooltip_data);
+
/* How long before a tool-tip shows. */
#define UI_TOOLTIP_DELAY 0.5
#define UI_TOOLTIP_DELAY_LABEL 0.2
diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h
index d77a87e7200..266a538b6c3 100644
--- a/source/blender/editors/include/UI_interface_icons.h
+++ b/source/blender/editors/include/UI_interface_icons.h
@@ -23,6 +23,9 @@
#pragma once
+/* Required for #eIconSizes which can't be forward declared if this file is included in C++. */
+#include "DNA_ID_enums.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -34,8 +37,6 @@ struct PreviewImage;
struct Scene;
struct bContext;
-enum eIconSizes;
-
typedef struct IconFile {
struct IconFile *next, *prev;
char filename[256]; /* FILE_MAXFILE size */
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index c09bf41e152..1820c2f133c 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -433,7 +433,7 @@ void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3],
* (for anything fancy use UI_GetThemeColor[Fancy] then BLF_color) */
void UI_FontThemeColor(int fontid, int colorid);
-/* clear the framebuffer using the input colorid */
+/* Clear the frame-buffer using the input colorid. */
void UI_ThemeClearColor(int colorid);
/* internal (blender) usage only, for init and set active */
diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h
index 8df29e5b520..64f881052a1 100644
--- a/source/blender/editors/include/UI_view2d.h
+++ b/source/blender/editors/include/UI_view2d.h
@@ -231,7 +231,7 @@ struct View2D *UI_view2d_fromcontext(const struct bContext *C);
struct View2D *UI_view2d_fromcontext_rwin(const struct bContext *C);
void UI_view2d_scroller_size_get(const struct View2D *v2d, float *r_x, float *r_y);
-void UI_view2d_scale_get(struct View2D *v2d, float *r_x, float *r_y);
+void UI_view2d_scale_get(const struct View2D *v2d, float *r_x, float *r_y);
float UI_view2d_scale_get_x(const struct View2D *v2d);
float UI_view2d_scale_get_y(const struct View2D *v2d);
void UI_view2d_scale_get_inverse(const struct View2D *v2d, float *r_x, float *r_y);
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 6e62d6f1140..6e25ec9d275 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -988,10 +988,9 @@ bool UI_but_active_only(const bContext *C, ARegion *region, uiBlock *block, uiBu
*/
bool UI_block_active_only_flagged_buttons(const bContext *C, ARegion *region, uiBlock *block)
{
-
/* Running this command before end-block has run, means buttons that open menus
* wont have those menus correctly positioned, see T83539. */
- BLI_assert(block->endblock != 0);
+ BLI_assert(block->endblock);
bool done = false;
LISTBASE_FOREACH (uiBut *, but, &block->buttons) {
@@ -1284,12 +1283,10 @@ static bool ui_but_event_property_operator_string(const bContext *C,
char *buf,
const size_t buf_len)
{
- /* context toggle operator names to check... */
+ /* Context toggle operator names to check. */
/* This function could use a refactor to generalize button type to operator relationship
- * as well as which operators use properties.
- * - Campbell
- * */
+ * as well as which operators use properties. - Campbell */
const char *ctx_toggle_opnames[] = {
"WM_OT_context_toggle",
"WM_OT_context_toggle_enum",
@@ -1424,10 +1421,10 @@ static bool ui_but_event_property_operator_string(const bContext *C,
// printf("prop shortcut: '%s' (%s)\n", RNA_property_identifier(prop), data_path);
}
- /* we have a datapath! */
+ /* We have a data-path! */
bool found = false;
if (data_path || (prop_enum_value_ok && prop_enum_value_id)) {
- /* create a property to host the "datapath" property we're sending to the operators */
+ /* Create a property to host the "data_path" property we're sending to the operators. */
IDProperty *prop_path;
const IDPropertyTemplate val = {0};
@@ -1916,7 +1913,7 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2], int r_x
ui_update_flexible_spacing(region, block);
- block->endblock = 1;
+ block->endblock = true;
}
void UI_block_end(const bContext *C, uiBlock *block)
@@ -1947,7 +1944,7 @@ void ui_fontscale(short *points, float aspect)
}
}
-/* project button or block (but==NULL) to pixels in regionspace */
+/* Project button or block (but==NULL) to pixels in region-space. */
static void ui_but_to_pixelrect(rcti *rect, const ARegion *region, uiBlock *block, uiBut *but)
{
rctf rectf;
@@ -3431,12 +3428,12 @@ void UI_blocklist_free_inactive(const bContext *C, ListBase *lb)
{
LISTBASE_FOREACH_MUTABLE (uiBlock *, block, lb) {
if (!block->handle) {
- if (!block->active) {
- BLI_remlink(lb, block);
- UI_block_free(C, block);
+ if (block->active) {
+ block->active = false;
}
else {
- block->active = 0;
+ BLI_remlink(lb, block);
+ UI_block_free(C, block);
}
}
}
@@ -3453,7 +3450,7 @@ void UI_block_region_set(uiBlock *block, ARegion *region)
oldblock = BLI_findstring(lb, block->name, offsetof(uiBlock, name));
if (oldblock) {
- oldblock->active = 0;
+ oldblock->active = false;
oldblock->panel = NULL;
oldblock->handle = NULL;
}
@@ -3471,7 +3468,7 @@ uiBlock *UI_block_begin(const bContext *C, ARegion *region, const char *name, eU
Scene *scene = CTX_data_scene(C);
uiBlock *block = MEM_callocN(sizeof(uiBlock), "uiBlock");
- block->active = 1;
+ block->active = true;
block->emboss = emboss;
block->evil_C = (void *)C; /* XXX */
@@ -3950,6 +3947,9 @@ uiBut *ui_but_change_type(uiBut *but, eButType new_type)
UNUSED_VARS_NDEBUG(found_layout);
ui_button_group_replace_but_ptr(uiLayoutGetBlock(but->layout), old_but_ptr, but);
}
+ if (UI_editsource_enable_check()) {
+ UI_editsource_but_replace(old_but_ptr, but);
+ }
}
return but;
@@ -4026,7 +4026,7 @@ static uiBut *ui_def_but(uiBlock *block,
but->emboss = block->emboss;
but->pie_dir = UI_RADIAL_NONE;
- but->block = block; /* pointer back, used for frontbuffer status, and picker */
+ but->block = block; /* pointer back, used for front-buffer status, and picker. */
if ((block->flag & UI_BUT_ALIGN) && ui_but_can_align(but)) {
but->alignnr = block->alignnr;
@@ -4059,7 +4059,8 @@ static uiBut *ui_def_but(uiBlock *block,
but->drawflag |= UI_BUT_ICON_LEFT;
}
}
- else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block)) ||
+ else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block) &&
+ !(block->flag & UI_BLOCK_QUICK_SETUP)) ||
ELEM(but->type,
UI_BTYPE_MENU,
UI_BTYPE_TEXT,
@@ -4744,7 +4745,7 @@ static int findBitIndex(uint x)
return idx;
}
-/* autocomplete helper functions */
+/* Auto-complete helper functions. */
struct AutoComplete {
size_t maxlen;
int matches;
diff --git a/source/blender/editors/interface/interface_context_menu.c b/source/blender/editors/interface/interface_context_menu.c
index 85730d138ac..53a04ec9db5 100644
--- a/source/blender/editors/interface/interface_context_menu.c
+++ b/source/blender/editors/interface/interface_context_menu.c
@@ -953,7 +953,7 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but)
}
}
- /* If the button reprents an id, it can set the "id" context pointer. */
+ /* If the button represents an id, it can set the "id" context pointer. */
if (U.experimental.use_asset_browser && ED_asset_can_make_single_from_context(C)) {
ID *id = CTX_data_pointer_get_type(C, "id", &RNA_ID).data;
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 5bb6b0f21e7..d10cdc207c2 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -81,544 +81,116 @@ int UI_draw_roundbox_corner_get(void)
}
#endif
-void UI_draw_roundbox_3ub_alpha(bool filled,
- float minx,
- float miny,
- float maxx,
- float maxy,
- float rad,
- const uchar col[3],
- uchar alpha)
+void UI_draw_roundbox_4fv_ex(const rctf *rect,
+ const float inner1[4],
+ const float inner2[4],
+ float shade_dir,
+ const float outline[4],
+ float outline_width,
+ float rad)
{
- float colv[4];
- colv[0] = ((float)col[0]) / 255;
- colv[1] = ((float)col[1]) / 255;
- colv[2] = ((float)col[2]) / 255;
- colv[3] = ((float)alpha) / 255;
- UI_draw_roundbox_4fv(filled, minx, miny, maxx, maxy, rad, colv);
-}
-
-void UI_draw_roundbox_3fv_alpha(bool filled,
- float minx,
- float miny,
- float maxx,
- float maxy,
- float rad,
- const float col[3],
- float alpha)
-{
- float colv[4];
- colv[0] = col[0];
- colv[1] = col[1];
- colv[2] = col[2];
- colv[3] = alpha;
- UI_draw_roundbox_4fv(filled, minx, miny, maxx, maxy, rad, colv);
-}
-
-void UI_draw_roundbox_aa(
- bool filled, float minx, float miny, float maxx, float maxy, float rad, const float color[4])
-{
- uiWidgetBaseParameters widget_params = {
- .recti.xmin = minx + U.pixelsize,
- .recti.ymin = miny + U.pixelsize,
- .recti.xmax = maxx - U.pixelsize,
- .recti.ymax = maxy - U.pixelsize,
- .rect.xmin = minx,
- .rect.ymin = miny,
- .rect.xmax = maxx,
- .rect.ymax = maxy,
- .radi = rad,
- .rad = rad,
- .round_corners[0] = (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 1.0f : 0.0f,
- .round_corners[1] = (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 1.0f : 0.0f,
- .round_corners[2] = (roundboxtype & UI_CNR_TOP_RIGHT) ? 1.0f : 0.0f,
- .round_corners[3] = (roundboxtype & UI_CNR_TOP_LEFT) ? 1.0f : 0.0f,
- .color_inner1[0] = filled ? color[0] : 0.0f,
- .color_inner1[1] = filled ? color[1] : 0.0f,
- .color_inner1[2] = filled ? color[2] : 0.0f,
- .color_inner1[3] = filled ? color[3] : 0.0f,
- .color_inner2[0] = filled ? color[0] : 0.0f,
- .color_inner2[1] = filled ? color[1] : 0.0f,
- .color_inner2[2] = filled ? color[2] : 0.0f,
- .color_inner2[3] = filled ? color[3] : 0.0f,
- .color_outline[0] = color[0],
- .color_outline[1] = color[1],
- .color_outline[2] = color[2],
- .color_outline[3] = color[3],
- .alpha_discard = 1.0f,
- };
-
- /* XXX this is to emulate previous behavior of semitransparent fills but that's was a side effect
- * of the previous AA method. Better fix the callers. */
- if (filled) {
- widget_params.color_inner1[3] *= 0.65f;
- widget_params.color_inner2[3] *= 0.65f;
- widget_params.color_outline[3] *= 0.65f;
- }
-
/* WATCH: This is assuming the ModelViewProjectionMatrix is area pixel space.
* If it has been scaled, then it's no longer valid. */
-
- GPUBatch *batch = ui_batch_roundbox_widget_get();
- GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_WIDGET_BASE);
- GPU_batch_uniform_4fv_array(batch, "parameters", 11, (float(*)[4]) & widget_params);
-
- GPU_blend(GPU_BLEND_ALPHA);
-
- GPU_batch_draw(batch);
-
- GPU_blend(GPU_BLEND_NONE);
-}
-
-void UI_draw_roundbox_4fv(
- bool filled, float minx, float miny, float maxx, float maxy, float rad, const float col[4])
-{
-#if 0
- float vec[7][2] = {
- {0.195, 0.02},
- {0.383, 0.067},
- {0.55, 0.169},
- {0.707, 0.293},
- {0.831, 0.45},
- {0.924, 0.617},
- {0.98, 0.805},
- };
- int a;
-
- GPUVertFormat *format = immVertexFormat();
- uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-
- /* mult */
- for (a = 0; a < 7; a++) {
- mul_v2_fl(vec[a], rad);
- }
-
- uint vert_len = 0;
- vert_len += (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 9 : 1;
- vert_len += (roundboxtype & UI_CNR_TOP_RIGHT) ? 9 : 1;
- vert_len += (roundboxtype & UI_CNR_TOP_LEFT) ? 9 : 1;
- vert_len += (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 9 : 1;
-
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
- immUniformColor4fv(col);
-
- immBegin(filled ? GPU_PRIM_TRI_FAN : GPU_PRIM_LINE_LOOP, vert_len);
- /* start with corner right-bottom */
- if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
- immVertex2f(pos, maxx - rad, miny);
- for (a = 0; a < 7; a++) {
- immVertex2f(pos, maxx - rad + vec[a][0], miny + vec[a][1]);
- }
- immVertex2f(pos, maxx, miny + rad);
- }
- else {
- immVertex2f(pos, maxx, miny);
- }
-
- /* corner right-top */
- if (roundboxtype & UI_CNR_TOP_RIGHT) {
- immVertex2f(pos, maxx, maxy - rad);
- for (a = 0; a < 7; a++) {
- immVertex2f(pos, maxx - vec[a][1], maxy - rad + vec[a][0]);
- }
- immVertex2f(pos, maxx - rad, maxy);
- }
- else {
- immVertex2f(pos, maxx, maxy);
- }
-
- /* corner left-top */
- if (roundboxtype & UI_CNR_TOP_LEFT) {
- immVertex2f(pos, minx + rad, maxy);
- for (a = 0; a < 7; a++) {
- immVertex2f(pos, minx + rad - vec[a][0], maxy - vec[a][1]);
- }
- immVertex2f(pos, minx, maxy - rad);
- }
- else {
- immVertex2f(pos, minx, maxy);
- }
-
- /* corner left-bottom */
- if (roundboxtype & UI_CNR_BOTTOM_LEFT) {
- immVertex2f(pos, minx, miny + rad);
- for (a = 0; a < 7; a++) {
- immVertex2f(pos, minx + vec[a][1], miny + rad - vec[a][0]);
- }
- immVertex2f(pos, minx + rad, miny);
- }
- else {
- immVertex2f(pos, minx, miny);
- }
-
- immEnd();
- immUnbindProgram();
-#endif
uiWidgetBaseParameters widget_params = {
- .recti.xmin = minx + U.pixelsize,
- .recti.ymin = miny + U.pixelsize,
- .recti.xmax = maxx - U.pixelsize,
- .recti.ymax = maxy - U.pixelsize,
- .rect.xmin = minx,
- .rect.ymin = miny,
- .rect.xmax = maxx,
- .rect.ymax = maxy,
+ .recti.xmin = rect->xmin + outline_width,
+ .recti.ymin = rect->ymin + outline_width,
+ .recti.xmax = rect->xmax - outline_width,
+ .recti.ymax = rect->ymax - outline_width,
+ .rect = *rect,
.radi = rad,
.rad = rad,
.round_corners[0] = (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 1.0f : 0.0f,
.round_corners[1] = (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 1.0f : 0.0f,
.round_corners[2] = (roundboxtype & UI_CNR_TOP_RIGHT) ? 1.0f : 0.0f,
.round_corners[3] = (roundboxtype & UI_CNR_TOP_LEFT) ? 1.0f : 0.0f,
- .color_inner1[0] = filled ? col[0] : 0.0f,
- .color_inner1[1] = filled ? col[1] : 0.0f,
- .color_inner1[2] = filled ? col[2] : 0.0f,
- .color_inner1[3] = filled ? col[3] : 0.0f,
- .color_inner2[0] = filled ? col[0] : 0.0f,
- .color_inner2[1] = filled ? col[1] : 0.0f,
- .color_inner2[2] = filled ? col[2] : 0.0f,
- .color_inner2[3] = filled ? col[3] : 0.0f,
- .color_outline[0] = col[0],
- .color_outline[1] = col[1],
- .color_outline[2] = col[2],
- .color_outline[3] = col[3],
+ .color_inner1[0] = inner1 ? inner1[0] : 0.0f,
+ .color_inner1[1] = inner1 ? inner1[1] : 0.0f,
+ .color_inner1[2] = inner1 ? inner1[2] : 0.0f,
+ .color_inner1[3] = inner1 ? inner1[3] : 0.0f,
+ .color_inner2[0] = inner2 ? inner2[0] : inner1 ? inner1[0] : 0.0f,
+ .color_inner2[1] = inner2 ? inner2[1] : inner1 ? inner1[1] : 0.0f,
+ .color_inner2[2] = inner2 ? inner2[2] : inner1 ? inner1[2] : 0.0f,
+ .color_inner2[3] = inner2 ? inner2[3] : inner1 ? inner1[3] : 0.0f,
+ .color_outline[0] = outline ? outline[0] : inner1 ? inner1[0] : 0.0f,
+ .color_outline[1] = outline ? outline[1] : inner1 ? inner1[1] : 0.0f,
+ .color_outline[2] = outline ? outline[2] : inner1 ? inner1[2] : 0.0f,
+ .color_outline[3] = outline ? outline[3] : inner1 ? inner1[3] : 0.0f,
+ .shade_dir = shade_dir,
.alpha_discard = 1.0f,
};
- /* Exactly the same as UI_draw_roundbox_aa but does not do the legacy transparency. */
-
- /* WATCH: This is assuming the ModelViewProjectionMatrix is area pixel space.
- * If it has been scaled, then it's no longer valid. */
-
GPUBatch *batch = ui_batch_roundbox_widget_get();
GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_WIDGET_BASE);
GPU_batch_uniform_4fv_array(batch, "parameters", 11, (float(*)[4]) & widget_params);
-
GPU_blend(GPU_BLEND_ALPHA);
-
GPU_batch_draw(batch);
-
GPU_blend(GPU_BLEND_NONE);
}
-#if 0
-static void round_box_shade_col(uint attr,
- const float col1[3],
- float const col2[3],
- const float fac)
+void UI_draw_roundbox_3ub_alpha(
+ const rctf *rect, bool filled, float rad, const uchar col[3], uchar alpha)
{
- float col[4] = {
- fac * col1[0] + (1.0f - fac) * col2[0],
- fac * col1[1] + (1.0f - fac) * col2[1],
- fac * col1[2] + (1.0f - fac) * col2[2],
- 1.0f,
+ float colv[4] = {
+ ((float)col[0]) / 255,
+ ((float)col[1]) / 255,
+ ((float)col[2]) / 255,
+ ((float)alpha) / 255,
};
- immAttr4fv(attr, col);
+ UI_draw_roundbox_4fv_ex(rect, (filled) ? colv : NULL, NULL, 1.0f, colv, U.pixelsize, rad);
}
-#endif
-/* linear horizontal shade within button or in outline */
-/* view2d scrollers use it */
-void UI_draw_roundbox_shade_x(bool filled,
- float minx,
- float miny,
- float maxx,
- float maxy,
- float rad,
- float shadetop,
- float shadedown,
- const float col[4])
+void UI_draw_roundbox_3fv_alpha(
+ const rctf *rect, bool filled, float rad, const float col[3], float alpha)
{
-#if 0
- float vec[7][2] = {
- {0.195, 0.02},
- {0.383, 0.067},
- {0.55, 0.169},
- {0.707, 0.293},
- {0.831, 0.45},
- {0.924, 0.617},
- {0.98, 0.805},
- };
- const float div = maxy - miny;
- const float idiv = 1.0f / div;
- float coltop[3], coldown[3];
- int vert_count = 0;
- int a;
-
- GPUVertFormat *format = immVertexFormat();
- uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- uint color = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
-
- /* mult */
- for (a = 0; a < 7; a++) {
- mul_v2_fl(vec[a], rad);
- }
-
- /* 'shade' defines strength of shading */
- coltop[0] = min_ff(1.0f, col[0] + shadetop);
- coltop[1] = min_ff(1.0f, col[1] + shadetop);
- coltop[2] = min_ff(1.0f, col[2] + shadetop);
- coldown[0] = max_ff(0.0f, col[0] + shadedown);
- coldown[1] = max_ff(0.0f, col[1] + shadedown);
- coldown[2] = max_ff(0.0f, col[2] + shadedown);
-
- vert_count += (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 9 : 1;
- vert_count += (roundboxtype & UI_CNR_TOP_RIGHT) ? 9 : 1;
- vert_count += (roundboxtype & UI_CNR_TOP_LEFT) ? 9 : 1;
- vert_count += (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 9 : 1;
-
- immBegin(filled ? GPU_PRIM_TRI_FAN : GPU_PRIM_LINE_LOOP, vert_count);
-
- /* start with corner right-bottom */
- if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
-
- round_box_shade_col(color, coltop, coldown, 0.0);
- immVertex2f(pos, maxx - rad, miny);
-
- for (a = 0; a < 7; a++) {
- round_box_shade_col(color, coltop, coldown, vec[a][1] * idiv);
- immVertex2f(pos, maxx - rad + vec[a][0], miny + vec[a][1]);
- }
-
- round_box_shade_col(color, coltop, coldown, rad * idiv);
- immVertex2f(pos, maxx, miny + rad);
- }
- else {
- round_box_shade_col(color, coltop, coldown, 0.0);
- immVertex2f(pos, maxx, miny);
- }
-
- /* corner right-top */
- if (roundboxtype & UI_CNR_TOP_RIGHT) {
-
- round_box_shade_col(color, coltop, coldown, (div - rad) * idiv);
- immVertex2f(pos, maxx, maxy - rad);
-
- for (a = 0; a < 7; a++) {
- round_box_shade_col(color, coltop, coldown, (div - rad + vec[a][1]) * idiv);
- immVertex2f(pos, maxx - vec[a][1], maxy - rad + vec[a][0]);
- }
- round_box_shade_col(color, coltop, coldown, 1.0);
- immVertex2f(pos, maxx - rad, maxy);
- }
- else {
- round_box_shade_col(color, coltop, coldown, 1.0);
- immVertex2f(pos, maxx, maxy);
- }
-
- /* corner left-top */
- if (roundboxtype & UI_CNR_TOP_LEFT) {
-
- round_box_shade_col(color, coltop, coldown, 1.0);
- immVertex2f(pos, minx + rad, maxy);
-
- for (a = 0; a < 7; a++) {
- round_box_shade_col(color, coltop, coldown, (div - vec[a][1]) * idiv);
- immVertex2f(pos, minx + rad - vec[a][0], maxy - vec[a][1]);
- }
-
- round_box_shade_col(color, coltop, coldown, (div - rad) * idiv);
- immVertex2f(pos, minx, maxy - rad);
- }
- else {
- round_box_shade_col(color, coltop, coldown, 1.0);
- immVertex2f(pos, minx, maxy);
- }
-
- /* corner left-bottom */
- if (roundboxtype & UI_CNR_BOTTOM_LEFT) {
-
- round_box_shade_col(color, coltop, coldown, rad * idiv);
- immVertex2f(pos, minx, miny + rad);
-
- for (a = 0; a < 7; a++) {
- round_box_shade_col(color, coltop, coldown, (rad - vec[a][1]) * idiv);
- immVertex2f(pos, minx + vec[a][1], miny + rad - vec[a][0]);
- }
+ float colv[4] = {col[0], col[1], col[2], alpha};
+ UI_draw_roundbox_4fv_ex(rect, (filled) ? colv : NULL, NULL, 1.0f, colv, U.pixelsize, rad);
+}
- round_box_shade_col(color, coltop, coldown, 0.0);
- immVertex2f(pos, minx + rad, miny);
- }
- else {
- round_box_shade_col(color, coltop, coldown, 0.0);
- immVertex2f(pos, minx, miny);
+void UI_draw_roundbox_aa(const rctf *rect, bool filled, float rad, const float color[4])
+{
+ /* XXX this is to emulate previous behavior of semitransparent fills but that's was a side effect
+ * of the previous AA method. Better fix the callers. */
+ float colv[4] = {color[0], color[1], color[2], color[3]};
+ if (filled) {
+ colv[3] *= 0.65f;
}
- immEnd();
- immUnbindProgram();
-#endif
- uiWidgetBaseParameters widget_params = {
- .recti.xmin = minx + U.pixelsize,
- .recti.ymin = miny + U.pixelsize,
- .recti.xmax = maxx - U.pixelsize,
- .recti.ymax = maxy - U.pixelsize,
- .rect.xmin = minx,
- .rect.ymin = miny,
- .rect.xmax = maxx,
- .rect.ymax = maxy,
- .radi = rad,
- .rad = rad,
- .round_corners[0] = (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 1.0f : 0.0f,
- .round_corners[1] = (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 1.0f : 0.0f,
- .round_corners[2] = (roundboxtype & UI_CNR_TOP_RIGHT) ? 1.0f : 0.0f,
- .round_corners[3] = (roundboxtype & UI_CNR_TOP_LEFT) ? 1.0f : 0.0f,
- .color_inner1[0] = !filled ? 0.0f : min_ff(1.0f, col[0] + shadetop),
- .color_inner1[1] = !filled ? 0.0f : min_ff(1.0f, col[1] + shadetop),
- .color_inner1[2] = !filled ? 0.0f : min_ff(1.0f, col[2] + shadetop),
- .color_inner1[3] = !filled ? 0.0f : 1.0f,
- .color_inner2[0] = !filled ? 0.0f : max_ff(0.0f, col[0] + shadedown),
- .color_inner2[1] = !filled ? 0.0f : max_ff(0.0f, col[1] + shadedown),
- .color_inner2[2] = !filled ? 0.0f : max_ff(0.0f, col[2] + shadedown),
- .color_inner2[3] = !filled ? 0.0f : 1.0f,
- /* TODO: non-filled box don't have gradients. Just use middle color. */
- .color_outline[0] = clamp_f(col[0] + shadetop + shadedown, 0.0f, 1.0f),
- .color_outline[1] = clamp_f(col[1] + shadetop + shadedown, 0.0f, 1.0f),
- .color_outline[2] = clamp_f(col[2] + shadetop + shadedown, 0.0f, 1.0f),
- .color_outline[3] = clamp_f(col[3] + shadetop + shadedown, 0.0f, 1.0f),
- .shade_dir = 1.0f,
- .alpha_discard = 1.0f,
- };
-
- GPU_blend(GPU_BLEND_ALPHA);
-
- GPUBatch *batch = ui_batch_roundbox_widget_get();
- GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_WIDGET_BASE);
- GPU_batch_uniform_4fv_array(batch, "parameters", 11, (float(*)[4]) & widget_params);
- GPU_batch_draw(batch);
+ UI_draw_roundbox_4fv_ex(rect, (filled) ? colv : NULL, NULL, 1.0f, colv, U.pixelsize, rad);
+}
- GPU_blend(GPU_BLEND_NONE);
+void UI_draw_roundbox_4fv(const rctf *rect, bool filled, float rad, const float col[4])
+{
+ /* Exactly the same as UI_draw_roundbox_aa but does not do the legacy transparency. */
+ UI_draw_roundbox_4fv_ex(rect, (filled) ? col : NULL, NULL, 1.0f, col, U.pixelsize, rad);
}
-#if 0 /* unused */
-/* linear vertical shade within button or in outline */
+/* linear horizontal shade within button or in outline */
/* view2d scrollers use it */
-void UI_draw_roundbox_shade_y(bool filled,
- float minx,
- float miny,
- float maxx,
- float maxy,
- float rad,
- float shadeleft,
- float shaderight,
- const float col[4])
+void UI_draw_roundbox_shade_x(
+ const rctf *rect, bool filled, float rad, float shadetop, float shadedown, const float col[4])
{
- float vec[7][2] = {
- {0.195, 0.02},
- {0.383, 0.067},
- {0.55, 0.169},
- {0.707, 0.293},
- {0.831, 0.45},
- {0.924, 0.617},
- {0.98, 0.805},
- };
- const float div = maxx - minx;
- const float idiv = 1.0f / div;
- float colLeft[3], colRight[3];
- int vert_count = 0;
- int a;
-
- /* mult */
- for (a = 0; a < 7; a++) {
- mul_v2_fl(vec[a], rad);
- }
-
- GPUVertFormat *format = immVertexFormat();
- uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- uint color = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
-
- /* 'shade' defines strength of shading */
- colLeft[0] = min_ff(1.0f, col[0] + shadeleft);
- colLeft[1] = min_ff(1.0f, col[1] + shadeleft);
- colLeft[2] = min_ff(1.0f, col[2] + shadeleft);
- colRight[0] = max_ff(0.0f, col[0] + shaderight);
- colRight[1] = max_ff(0.0f, col[1] + shaderight);
- colRight[2] = max_ff(0.0f, col[2] + shaderight);
-
- vert_count += (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 9 : 1;
- vert_count += (roundboxtype & UI_CNR_TOP_RIGHT) ? 9 : 1;
- vert_count += (roundboxtype & UI_CNR_TOP_LEFT) ? 9 : 1;
- vert_count += (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 9 : 1;
-
- immBegin(filled ? GPU_PRIM_TRI_FAN : GPU_PRIM_LINE_LOOP, vert_count);
+ float inner1[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ float inner2[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ float outline[4];
- /* start with corner right-bottom */
- if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
- round_box_shade_col(color, colLeft, colRight, 0.0);
- immVertex2f(pos, maxx - rad, miny);
-
- for (a = 0; a < 7; a++) {
- round_box_shade_col(color, colLeft, colRight, vec[a][0] * idiv);
- immVertex2f(pos, maxx - rad + vec[a][0], miny + vec[a][1]);
- }
-
- round_box_shade_col(color, colLeft, colRight, rad * idiv);
- immVertex2f(pos, maxx, miny + rad);
- }
- else {
- round_box_shade_col(color, colLeft, colRight, 0.0);
- immVertex2f(pos, maxx, miny);
- }
-
- /* corner right-top */
- if (roundboxtype & UI_CNR_TOP_RIGHT) {
- round_box_shade_col(color, colLeft, colRight, 0.0);
- immVertex2f(pos, maxx, maxy - rad);
-
- for (a = 0; a < 7; a++) {
-
- round_box_shade_col(color, colLeft, colRight, (div - rad - vec[a][0]) * idiv);
- immVertex2f(pos, maxx - vec[a][1], maxy - rad + vec[a][0]);
- }
- round_box_shade_col(color, colLeft, colRight, (div - rad) * idiv);
- immVertex2f(pos, maxx - rad, maxy);
- }
- else {
- round_box_shade_col(color, colLeft, colRight, 0.0);
- immVertex2f(pos, maxx, maxy);
- }
-
- /* corner left-top */
- if (roundboxtype & UI_CNR_TOP_LEFT) {
- round_box_shade_col(color, colLeft, colRight, (div - rad) * idiv);
- immVertex2f(pos, minx + rad, maxy);
-
- for (a = 0; a < 7; a++) {
- round_box_shade_col(color, colLeft, colRight, (div - rad + vec[a][0]) * idiv);
- immVertex2f(pos, minx + rad - vec[a][0], maxy - vec[a][1]);
- }
-
- round_box_shade_col(color, colLeft, colRight, 1.0);
- immVertex2f(pos, minx, maxy - rad);
- }
- else {
- round_box_shade_col(color, colLeft, colRight, 1.0);
- immVertex2f(pos, minx, maxy);
- }
-
- /* corner left-bottom */
- if (roundboxtype & UI_CNR_BOTTOM_LEFT) {
- round_box_shade_col(color, colLeft, colRight, 1.0);
- immVertex2f(pos, minx, miny + rad);
-
- for (a = 0; a < 7; a++) {
- round_box_shade_col(color, colLeft, colRight, (vec[a][0]) * idiv);
- immVertex2f(pos, minx + vec[a][1], miny + rad - vec[a][0]);
- }
-
- round_box_shade_col(color, colLeft, colRight, 1.0);
- immVertex2f(pos, minx + rad, miny);
- }
- else {
- round_box_shade_col(color, colLeft, colRight, 1.0);
- immVertex2f(pos, minx, miny);
- }
-
- immEnd();
- immUnbindProgram();
+ if (filled) {
+ inner1[0] = min_ff(1.0f, col[0] + shadetop);
+ inner1[1] = min_ff(1.0f, col[1] + shadetop);
+ inner1[2] = min_ff(1.0f, col[2] + shadetop);
+ inner1[3] = 1.0f;
+ inner2[0] = max_ff(0.0f, col[0] + shadedown);
+ inner2[1] = max_ff(0.0f, col[1] + shadedown);
+ inner2[2] = max_ff(0.0f, col[2] + shadedown);
+ inner2[3] = 1.0f;
+ }
+
+ /* TODO: non-filled box don't have gradients. Just use middle color. */
+ outline[0] = clamp_f(col[0] + shadetop + shadedown, 0.0f, 1.0f);
+ outline[1] = clamp_f(col[1] + shadetop + shadedown, 0.0f, 1.0f);
+ outline[2] = clamp_f(col[2] + shadetop + shadedown, 0.0f, 1.0f);
+ outline[3] = clamp_f(col[3] + shadetop + shadedown, 0.0f, 1.0f);
+
+ UI_draw_roundbox_4fv_ex(rect, inner1, inner2, 1.0f, outline, U.pixelsize, rad);
}
-#endif /* unused */
void UI_draw_text_underline(int pos_x, int pos_y, int len, int height, const float color[4])
{
@@ -783,7 +355,7 @@ void ui_draw_but_IMAGE(ARegion *UNUSED(region),
GPU_blend(GPU_BLEND_NONE);
# if 0
- /* restore scissortest */
+ /* Restore scissor-test. */
GPU_scissor(scissor[0], scissor[1], scissor[2], scissor[3]);
# endif
@@ -799,15 +371,12 @@ void ui_draw_but_IMAGE(ARegion *UNUSED(region),
* \param x1, x2, y1, y2: The offsets for the view, not the zones.
*/
void UI_draw_safe_areas(uint pos,
- float x1,
- float x2,
- float y1,
- float y2,
+ const rctf *rect,
const float title_aspect[2],
const float action_aspect[2])
{
- const float size_x_half = (x2 - x1) * 0.5f;
- const float size_y_half = (y2 - y1) * 0.5f;
+ const float size_x_half = (rect->xmax - rect->xmin) * 0.5f;
+ const float size_y_half = (rect->ymax - rect->ymin) * 0.5f;
const float *safe_areas[] = {title_aspect, action_aspect};
const int safe_len = ARRAY_SIZE(safe_areas);
@@ -817,10 +386,10 @@ void UI_draw_safe_areas(uint pos,
const float margin_x = safe_areas[i][0] * size_x_half;
const float margin_y = safe_areas[i][1] * size_y_half;
- const float minx = x1 + margin_x;
- const float miny = y1 + margin_y;
- const float maxx = x2 - margin_x;
- const float maxy = y2 - margin_y;
+ const float minx = rect->xmin + margin_x;
+ const float miny = rect->ymin + margin_y;
+ const float maxx = rect->xmax - margin_x;
+ const float maxy = rect->ymax - margin_y;
imm_draw_box_wire_2d(pos, minx, miny, maxx, maxy);
}
@@ -835,7 +404,15 @@ static void draw_scope_end(const rctf *rect)
UI_draw_roundbox_corner_set(UI_CNR_ALL);
const float color[4] = {0.0f, 0.0f, 0.0f, 0.5f};
UI_draw_roundbox_4fv(
- false, rect->xmin - 1, rect->ymin, rect->xmax + 1, rect->ymax + 1, 3.0f, color);
+ &(const rctf){
+ .xmin = rect->xmin - 1,
+ .xmax = rect->xmax + 1,
+ .ymin = rect->ymin,
+ .ymax = rect->ymax + 1,
+ },
+ false,
+ 3.0f,
+ color);
}
static void histogram_draw_one(float r,
@@ -928,7 +505,15 @@ void ui_draw_but_HISTOGRAM(ARegion *UNUSED(region),
UI_GetThemeColor4fv(TH_PREVIEW_BACK, color);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_4fv(
- true, rect.xmin - 1, rect.ymin - 1, rect.xmax + 1, rect.ymax + 1, 3.0f, color);
+ &(const rctf){
+ .xmin = rect.xmin - 1,
+ .xmax = rect.xmax + 1,
+ .ymin = rect.ymin - 1,
+ .ymax = rect.ymax + 1,
+ },
+ true,
+ 3.0f,
+ color);
/* need scissor test, histogram can draw outside of boundary */
int scissor[4];
@@ -1070,7 +655,15 @@ void ui_draw_but_WAVEFORM(ARegion *UNUSED(region),
UI_GetThemeColor4fv(TH_PREVIEW_BACK, color);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_4fv(
- true, rect.xmin - 1, rect.ymin - 1, rect.xmax + 1, rect.ymax + 1, 3.0f, color);
+ &(const rctf){
+ .xmin = rect.xmin - 1,
+ .xmax = rect.xmax + 1,
+ .ymin = rect.ymin - 1,
+ .ymax = rect.ymax + 1,
+ },
+ true,
+ 3.0f,
+ color);
/* need scissor test, waveform can draw outside of boundary */
GPU_scissor_get(scissor);
@@ -1399,7 +992,15 @@ void ui_draw_but_VECTORSCOPE(ARegion *UNUSED(region),
UI_GetThemeColor4fv(TH_PREVIEW_BACK, color);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_4fv(
- true, rect.xmin - 1, rect.ymin - 1, rect.xmax + 1, rect.ymax + 1, 3.0f, color);
+ &(const rctf){
+ .xmin = rect.xmin - 1,
+ .xmax = rect.xmax + 1,
+ .ymin = rect.ymin - 1,
+ .ymax = rect.ymax + 1,
+ },
+ true,
+ 3.0f,
+ color);
/* need scissor test, hvectorscope can draw outside of boundary */
int scissor[4];
@@ -1774,7 +1375,16 @@ void ui_draw_but_UNITVEC(uiBut *but, const uiWidgetColors *wcol, const rcti *rec
/* backdrop */
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_3ub_alpha(
- true, rect->xmin, rect->ymin, rect->xmax, rect->ymax, 5.0f, wcol->inner, 255);
+ &(const rctf){
+ .xmin = rect->xmin,
+ .xmax = rect->xmax,
+ .ymin = rect->ymin,
+ .ymax = rect->ymax,
+ },
+ true,
+ 5.0f,
+ wcol->inner,
+ 255);
GPU_face_culling(GPU_CULL_BACK);
@@ -1800,7 +1410,7 @@ void ui_draw_but_UNITVEC(uiBut *but, const uiWidgetColors *wcol, const rcti *rec
GPU_batch_uniform_3fv(sphere, "light", light);
GPU_batch_draw(sphere);
- /* restore */
+ /* Restore. */
GPU_face_culling(GPU_CULL_NONE);
/* AA circle */
@@ -2130,7 +1740,7 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol,
immEnd();
immUnbindProgram();
- /* restore scissortest */
+ /* Restore scissor-test. */
GPU_scissor(scissor[0], scissor[1], scissor[2], scissor[3]);
/* outline */
@@ -2420,7 +2030,7 @@ void ui_draw_but_CURVEPROFILE(ARegion *region,
}
immUnbindProgram();
- /* restore scissortest */
+ /* Restore scissor-test. */
GPU_scissor(scissor[0], scissor[1], scissor[2], scissor[3]);
/* Outline */
@@ -2465,7 +2075,15 @@ void ui_draw_but_TRACKPREVIEW(ARegion *UNUSED(region),
const float color[4] = {0.7f, 0.3f, 0.3f, 0.3f};
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_4fv(
- true, rect.xmin - 1, rect.ymin, rect.xmax + 1, rect.ymax + 1, 3.0f, color);
+ &(const rctf){
+ .xmin = rect.xmin - 1,
+ .xmax = rect.xmax + 1,
+ .ymin = rect.ymin,
+ .ymax = rect.ymax + 1,
+ },
+ true,
+ 3.0f,
+ color);
ok = true;
}
@@ -2514,7 +2132,15 @@ void ui_draw_but_TRACKPREVIEW(ARegion *UNUSED(region),
const float color[4] = {0.0f, 0.0f, 0.0f, 0.3f};
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_4fv(
- true, rect.xmin - 1, rect.ymin, rect.xmax + 1, rect.ymax + 1, 3.0f, color);
+ &(const rctf){
+ .xmin = rect.xmin - 1,
+ .xmax = rect.xmax + 1,
+ .ymin = rect.ymin,
+ .ymax = rect.ymax + 1,
+ },
+ true,
+ 3.0f,
+ color);
}
IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR);
@@ -2577,7 +2203,15 @@ void ui_draw_but_TRACKPREVIEW(ARegion *UNUSED(region),
const float color[4] = {0.0f, 0.0f, 0.0f, 0.3f};
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_4fv(
- true, rect.xmin - 1, rect.ymin, rect.xmax + 1, rect.ymax + 1, 3.0f, color);
+ &(const rctf){
+ .xmin = rect.xmin - 1,
+ .xmax = rect.xmax + 1,
+ .ymin = rect.ymin,
+ .ymax = rect.ymax + 1,
+ },
+ true,
+ 3.0f,
+ color);
}
/* Restore scissor test. */
@@ -2594,14 +2228,7 @@ void ui_draw_but_TRACKPREVIEW(ARegion *UNUSED(region),
* would replace / modify the following 3 functions - merwin
*/
-static void ui_shadowbox(uint pos,
- uint color,
- float minx,
- float miny,
- float maxx,
- float maxy,
- float shadsize,
- uchar alpha)
+static void ui_shadowbox(const rctf *rect, uint pos, uint color, float shadsize, uchar alpha)
{
/**
* <pre>
@@ -2616,16 +2243,16 @@ static void ui_shadowbox(uint pos,
* v8______v6_-
* </pre>
*/
- const float v1[2] = {maxx, maxy - 0.3f * shadsize};
- const float v2[2] = {maxx + shadsize, maxy - 0.75f * shadsize};
- const float v3[2] = {maxx, miny};
- const float v4[2] = {maxx + shadsize, miny};
+ const float v1[2] = {rect->xmax, rect->ymax - 0.3f * shadsize};
+ const float v2[2] = {rect->xmax + shadsize, rect->ymax - 0.75f * shadsize};
+ const float v3[2] = {rect->xmax, rect->ymin};
+ const float v4[2] = {rect->xmax + shadsize, rect->ymin};
- const float v5[2] = {maxx + 0.7f * shadsize, miny - 0.7f * shadsize};
+ const float v5[2] = {rect->xmax + 0.7f * shadsize, rect->ymin - 0.7f * shadsize};
- const float v6[2] = {maxx, miny - shadsize};
- const float v7[2] = {minx + 0.3f * shadsize, miny};
- const float v8[2] = {minx + 0.5f * shadsize, miny - shadsize};
+ const float v6[2] = {rect->xmax, rect->ymin - shadsize};
+ const float v7[2] = {rect->xmin + 0.3f * shadsize, rect->ymin};
+ const float v8[2] = {rect->xmin + 0.5f * shadsize, rect->ymin - shadsize};
/* right quad */
immAttr4ub(color, 0, 0, 0, alpha);
@@ -2664,7 +2291,7 @@ static void ui_shadowbox(uint pos,
immVertex2fv(pos, v3);
}
-void UI_draw_box_shadow(uchar alpha, float minx, float miny, float maxx, float maxy)
+void UI_draw_box_shadow(const rctf *rect, uchar alpha)
{
GPU_blend(GPU_BLEND_ALPHA);
@@ -2678,9 +2305,9 @@ void UI_draw_box_shadow(uchar alpha, float minx, float miny, float maxx, float m
immBegin(GPU_PRIM_TRIS, 54);
/* accumulated outline boxes to make shade not linear, is more pleasant */
- ui_shadowbox(pos, color, minx, miny, maxx, maxy, 11.0, (20 * alpha) >> 8);
- ui_shadowbox(pos, color, minx, miny, maxx, maxy, 7.0, (40 * alpha) >> 8);
- ui_shadowbox(pos, color, minx, miny, maxx, maxy, 5.0, (80 * alpha) >> 8);
+ ui_shadowbox(rect, pos, color, 11.0, (20 * alpha) >> 8);
+ ui_shadowbox(rect, pos, color, 7.0, (40 * alpha) >> 8);
+ ui_shadowbox(rect, pos, color, 5.0, (80 * alpha) >> 8);
immEnd();
@@ -2755,13 +2382,16 @@ void ui_draw_dropshadow(
/* outline emphasis */
const float color[4] = {0.0f, 0.0f, 0.0f, 0.4f};
- UI_draw_roundbox_4fv(false,
- rct->xmin - 0.5f,
- rct->ymin - 0.5f,
- rct->xmax + 0.5f,
- rct->ymax + 0.5f,
- radius + 0.5f,
- color);
+ UI_draw_roundbox_4fv(
+ &(const rctf){
+ .xmin = rct->xmin - 0.5f,
+ .xmax = rct->xmax + 0.5f,
+ .ymin = rct->ymin - 0.5f,
+ .ymax = rct->ymax + 0.5f,
+ },
+ false,
+ radius + 0.5f,
+ color);
GPU_blend(GPU_BLEND_NONE);
}
diff --git a/source/blender/editors/interface/interface_eyedropper.c b/source/blender/editors/interface/interface_eyedropper.c
index 4d0e1584156..de39484bc1e 100644
--- a/source/blender/editors/interface/interface_eyedropper.c
+++ b/source/blender/editors/interface/interface_eyedropper.c
@@ -24,8 +24,6 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
-#include "BLI_blenlib.h"
-
#include "BKE_context.h"
#include "BKE_screen.h"
diff --git a/source/blender/editors/interface/interface_eyedropper_depth.c b/source/blender/editors/interface/interface_eyedropper_depth.c
index ead65a62226..a4adbef0b94 100644
--- a/source/blender/editors/interface/interface_eyedropper_depth.c
+++ b/source/blender/editors/interface/interface_eyedropper_depth.c
@@ -41,8 +41,6 @@
#include "BKE_screen.h"
#include "BKE_unit.h"
-#include "DEG_depsgraph.h"
-
#include "RNA_access.h"
#include "UI_interface.h"
@@ -66,9 +64,9 @@ typedef struct DepthDropper {
bool is_undo;
bool is_set;
- float init_depth; /* for resetting on cancel */
+ float init_depth; /* For resetting on cancel. */
- bool accum_start; /* has mouse been presed */
+ bool accum_start; /* Has mouse been pressed. */
float accum_depth;
int accum_tot;
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 97d9b225d3c..5de330d7136 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -349,7 +349,7 @@ typedef struct uiHandleButtonData {
#endif
ColorBand *coba;
- /* tooltip */
+ /* Tool-tip. */
uint tooltip_force : 1;
/* auto open */
@@ -665,7 +665,6 @@ static void ui_afterfunc_update_preferences_dirty(uiAfterFunc *after)
/* -------------------------------------------------------------------- */
/** \name Button Snap Values
- *
* \{ */
enum eSnapType {
@@ -1617,7 +1616,7 @@ static int ui_handler_region_drag_toggle(bContext *C, const wmEvent *event, void
static bool ui_but_is_drag_toggle(const uiBut *but)
{
return ((ui_drag_toggle_but_is_supported(but) == true) &&
- /* menu check is importnt so the button dragged over isn't removed instantly */
+ /* Menu check is important so the button dragged over isn't removed instantly. */
(ui_block_is_menu(but->block) == false));
}
@@ -3710,9 +3709,9 @@ static void ui_do_but_textedit(
case EVT_AKEY:
- /* Ctrl + A: Select all */
+ /* Ctrl-A: Select all. */
#if defined(__APPLE__)
- /* OSX uses cmd-a systemwide, so add it */
+ /* OSX uses Command-A system-wide, so add it. */
if ((event->oskey && !IS_EVENT_MOD(event, shift, alt, ctrl)) ||
(event->ctrl && !IS_EVENT_MOD(event, shift, alt, oskey)))
#else
@@ -3726,7 +3725,7 @@ static void ui_do_but_textedit(
break;
case EVT_TABKEY:
- /* there is a key conflict here, we can't tab with autocomplete */
+ /* There is a key conflict here, we can't tab with auto-complete. */
if (but->autocomplete_func || data->searchbox) {
const int autocomplete = ui_textedit_autocomplete(C, but, data);
changed = autocomplete != AUTOCOMPLETE_NO_MATCH;
@@ -3735,13 +3734,14 @@ static void ui_do_but_textedit(
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
}
- /* the hotkey here is not well defined, was G.qual so we check all */
- else if (IS_EVENT_MOD(event, shift, ctrl, alt, oskey)) {
- ui_textedit_prev_but(block, but, data);
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
- else {
- ui_textedit_next_but(block, but, data);
+ else if (!IS_EVENT_MOD(event, ctrl, alt, oskey)) {
+ /* Use standard keys for cycling through buttons Tab, Shift-Tab to reverse. */
+ if (event->shift) {
+ ui_textedit_prev_but(block, but, data);
+ }
+ else {
+ ui_textedit_next_but(block, but, data);
+ }
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
retval = WM_UI_HANDLER_BREAK;
@@ -4575,7 +4575,7 @@ static int ui_do_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data, cons
return WM_UI_HANDLER_BREAK;
}
if (ELEM(event->type, MOUSEPAN, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->ctrl) {
- /* Support ctrl-wheel to cycle values on expanded enum rows. */
+ /* Support Ctrl-Wheel to cycle values on expanded enum rows. */
if (but->type == UI_BTYPE_ROW) {
int type = event->type;
int val = event->val;
@@ -5086,7 +5086,7 @@ static int ui_do_but_NUM(
else if (event->type == LEFTMOUSE && event->val == KM_RELEASE) {
if (data->dragchange) {
#ifdef USE_DRAG_MULTINUM
- /* if we started multibutton but didn't drag, then edit */
+ /* If we started multi-button but didn't drag, then edit. */
if (data->multi_data.init == BUTTON_MULTI_INIT_SETUP) {
click = 1;
}
@@ -5408,7 +5408,7 @@ static int ui_do_but_SLI(
else if (event->type == LEFTMOUSE && event->val == KM_RELEASE) {
if (data->dragchange) {
#ifdef USE_DRAG_MULTINUM
- /* if we started multibutton but didn't drag, then edit */
+ /* If we started multi-button but didn't drag, then edit. */
if (data->multi_data.init == BUTTON_MULTI_INIT_SETUP) {
click = 1;
}
@@ -6836,7 +6836,7 @@ static bool ui_numedit_but_CURVE(uiBlock *block,
#ifdef USE_CONT_MOUSE_CORRECT
/* note: using 'cmp_last' is weak since there may be multiple points selected,
- * but in practice this isnt really an issue */
+ * but in practice this isn't really an issue */
if (ui_but_is_cursor_warp(but)) {
/* OK but can go outside bounds */
data->ungrab_mval[0] = but->rect.xmin + ((cmp_last->x - cumap->curr.xmin) * zoomx);
@@ -7107,7 +7107,7 @@ static bool ui_numedit_but_CURVEPROFILE(uiBlock *block,
changed = true;
#ifdef USE_CONT_MOUSE_CORRECT
/* note: using 'cmp_last' is weak since there may be multiple points selected,
- * but in practice this isnt really an issue */
+ * but in practice this isn't really an issue */
if (ui_but_is_cursor_warp(but)) {
/* OK but can go outside bounds */
data->ungrab_mval[0] = but->rect.xmin + ((last_x - profile->view_rect.xmin) * zoomx);
@@ -7491,7 +7491,7 @@ static bool ui_numedit_but_TRACKPREVIEW(
if (!scopes->track_locked) {
const MovieClip *clip = CTX_data_edit_movieclip(C);
- const int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scopes->framenr);
+ const int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scopes->scene_framenr);
if (scopes->marker->framenr != clip_framenr) {
scopes->marker = BKE_tracking_marker_ensure(scopes->track, clip_framenr);
}
@@ -7822,7 +7822,7 @@ static void ui_blocks_set_tooltips(ARegion *region, const bool enable)
}
/**
- * Recreate tooltip (use to update dynamic tips)
+ * Recreate tool-tip (use to update dynamic tips)
*/
void UI_but_tooltip_refresh(bContext *C, uiBut *but)
{
@@ -7921,13 +7921,13 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
return;
}
- /* highlight has timers for tooltips and auto open */
+ /* Highlight has timers for tool-tips and auto open. */
if (state == BUTTON_STATE_HIGHLIGHT) {
but->flag &= ~UI_SELECT;
button_tooltip_timer_reset(C, but);
- /* automatic open pulldown block timer */
+ /* Automatic open pull-down block timer. */
if (ELEM(but->type, UI_BTYPE_BLOCK, UI_BTYPE_PULLDOWN, UI_BTYPE_POPOVER) ||
/* Menu button types may draw as popovers, check for this case
* ignoring other kinds of menus (mainly enums). (see T66538). */
@@ -8261,13 +8261,13 @@ static void button_activate_exit(
}
}
- /* disable tooltips until mousemove + last active flag */
+ /* Disable tool-tips until mouse-move + last active flag. */
LISTBASE_FOREACH (uiBlock *, block_iter, &data->region->uiblocks) {
LISTBASE_FOREACH (uiBut *, bt, &block_iter->buttons) {
bt->flag &= ~UI_BUT_LAST_ACTIVE;
}
- block_iter->tooltipdisabled = 1;
+ block_iter->tooltipdisabled = true;
}
ui_blocks_set_tooltips(data->region, false);
@@ -8325,7 +8325,7 @@ void ui_but_active_free(const bContext *C, uiBut *but)
}
/* returns the active button with an optional checking function */
-static uiBut *ui_context_button_active(ARegion *region, bool (*but_check_cb)(uiBut *))
+static uiBut *ui_context_button_active(const ARegion *region, bool (*but_check_cb)(const uiBut *))
{
uiBut *but_found = NULL;
@@ -8349,7 +8349,7 @@ static uiBut *ui_context_button_active(ARegion *region, bool (*but_check_cb)(uiB
but_found = activebut;
- /* recurse into opened menu, like colorpicker case */
+ /* Recurse into opened menu, like color-picker case. */
if (data && data->menu && (region != data->menu->region)) {
region = data->menu->region;
}
@@ -8366,7 +8366,7 @@ static uiBut *ui_context_button_active(ARegion *region, bool (*but_check_cb)(uiB
return but_found;
}
-static bool ui_context_rna_button_active_test(uiBut *but)
+static bool ui_context_rna_button_active_test(const uiBut *but)
{
return (but->rnapoin.data != NULL);
}
@@ -8391,7 +8391,7 @@ uiBut *UI_context_active_but_get_respect_menu(const bContext *C)
return ui_context_button_active(region_menu ? region_menu : CTX_wm_region(C), NULL);
}
-uiBut *UI_region_active_but_get(ARegion *region)
+uiBut *UI_region_active_but_get(const ARegion *region)
{
return ui_context_button_active(region, NULL);
}
@@ -8489,6 +8489,15 @@ wmOperator *UI_context_active_operator_get(const struct bContext *C)
return NULL;
}
+/**
+ * Try to find a search-box region opened from a button in \a button_region.
+ */
+ARegion *UI_region_searchbox_region_get(const ARegion *button_region)
+{
+ uiBut *but = UI_region_active_but_get(button_region);
+ return (but != NULL) ? but->active->searchbox : NULL;
+}
+
/* helper function for insert keyframe, reset to default, etc operators */
void UI_context_update_anim_flag(const bContext *C)
{
@@ -8522,7 +8531,7 @@ void UI_context_update_anim_flag(const bContext *C)
}
if (activebut) {
- /* always recurse into opened menu, so all buttons update (like colorpicker) */
+ /* Always recurse into opened menu, so all buttons update (like color-picker). */
uiHandleButtonData *data = activebut->active;
if (data && data->menu) {
region = data->menu->region;
@@ -8564,7 +8573,8 @@ static int ui_handle_button_over(bContext *C, const wmEvent *event, ARegion *reg
button_activate_init(C, region, but, BUTTON_ACTIVATE_OVER);
if (event->alt && but->active) {
- /* display tooltips if holding alt on mouseover when tooltips are off in prefs */
+ /* Display tool-tips if holding Alt on mouse-over when tool-tips are disabled in the
+ * preferences. */
but->active->tooltip_force = true;
}
}
@@ -8606,7 +8616,7 @@ void ui_but_activate_event(bContext *C, ARegion *region, uiBut *but)
* Simulate moving the mouse over a button (or navigating to it with arrow keys).
*
* exported so menus can start with a highlighted button,
- * even if the mouse isnt over it
+ * even if the mouse isn't over it
*/
void ui_but_activate_over(bContext *C, ARegion *region, uiBut *but)
{
@@ -8786,7 +8796,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
else if (event->x != event->prevx || event->y != event->prevy) {
- /* re-enable tooltip on mouse move */
+ /* Re-enable tool-tip on mouse move. */
ui_blocks_set_tooltips(region, true);
button_tooltip_timer_reset(C, but);
}
@@ -8810,7 +8820,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
break;
}
/* XXX hardcoded keymap check... but anyway,
- * while view changes, tooltips should be removed */
+ * while view changes, tool-tips should be removed */
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
case MIDDLEMOUSE:
@@ -9513,7 +9523,7 @@ static int ui_handle_menu_button(bContext *C, const wmEvent *event, uiPopupBlock
/* pass, skip for dialogs */
}
else if (!ui_region_contains_point_px(but->active->region, event->x, event->y)) {
- /* pass, needed to click-exit outside of non-flaoting menus */
+ /* Pass, needed to click-exit outside of non-floating menus. */
ui_region_auto_open_clear(but->active->region);
}
else if ((!ELEM(event->type, MOUSEMOVE, WHEELUPMOUSE, WHEELDOWNMOUSE, MOUSEPAN)) &&
@@ -10135,7 +10145,7 @@ static int ui_handle_menu_event(bContext *C,
ui_mouse_motion_towards_check(block, menu, &event->x, is_parent_inside == false);
- /* check for all parent rects, enables arrowkeys to be used */
+ /* Check for all parent rects, enables arrow-keys to be used. */
for (saferct = block->saferct.first; saferct; saferct = saferct->next) {
/* for mouse move we only check our own rect, for other
* events we check all preceding block rects too to make
@@ -10409,7 +10419,7 @@ static int ui_pie_handler(bContext *C, const wmEvent *event, uiPopupBlockHandle
}
}
- /* check pie velociy here if gesture has ended */
+ /* Check pie velocity here if gesture has ended. */
if (block->pie_data.flags & UI_PIE_GESTURE_END_WAIT) {
float len_sq = 10;
@@ -10735,7 +10745,7 @@ static int ui_region_handler(bContext *C, const wmEvent *event, void *UNUSED(use
}
}
- /* re-enable tooltips */
+ /* Re-enable tool-tips. */
if (event->type == MOUSEMOVE && (event->x != event->prevx || event->y != event->prevy)) {
ui_blocks_set_tooltips(region, true);
}
@@ -10832,7 +10842,7 @@ static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *UNUSE
}
}
- /* re-enable tooltips */
+ /* Re-enable tool-tips. */
if (event->type == MOUSEMOVE && (event->x != event->prevx || event->y != event->prevy)) {
ui_blocks_set_tooltips(region, true);
}
@@ -10926,7 +10936,7 @@ static int ui_popup_handler(bContext *C, const wmEvent *event, void *userdata)
WM_event_add_mousemove(win);
}
else {
- /* re-enable tooltips */
+ /* Re-enable tool-tips */
if (event->type == MOUSEMOVE && (event->x != event->prevx || event->y != event->prevy)) {
ui_blocks_set_tooltips(menu->region, true);
}
@@ -10936,7 +10946,7 @@ static int ui_popup_handler(bContext *C, const wmEvent *event, void *userdata)
ui_apply_but_funcs_after(C);
if (reset_pie) {
- /* reaqcuire window in case pie invalidates it somehow */
+ /* Reacquire window in case pie invalidates it somehow. */
wmWindow *win = CTX_wm_window(C);
if (win) {
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 26f0f6ca98a..1739035f92c 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -889,15 +889,15 @@ void UI_icons_reload_internal_textures(void)
icongltex.invh = 1.0f / b32buf->y;
icongltex.tex[0] = GPU_texture_create_2d("icons", b32buf->x, b32buf->y, 2, GPU_RGBA8, NULL);
- GPU_texture_update_mipmap(icongltex.tex[0], 0, GPU_DATA_UNSIGNED_BYTE, b32buf->rect);
- GPU_texture_update_mipmap(icongltex.tex[0], 1, GPU_DATA_UNSIGNED_BYTE, b16buf->rect);
+ GPU_texture_update_mipmap(icongltex.tex[0], 0, GPU_DATA_UBYTE, b32buf->rect);
+ GPU_texture_update_mipmap(icongltex.tex[0], 1, GPU_DATA_UBYTE, b16buf->rect);
}
if (need_icons_with_border && icongltex.tex[1] == NULL) {
icongltex.tex[1] = GPU_texture_create_2d(
"icons_border", b32buf_border->x, b32buf_border->y, 2, GPU_RGBA8, NULL);
- GPU_texture_update_mipmap(icongltex.tex[1], 0, GPU_DATA_UNSIGNED_BYTE, b32buf_border->rect);
- GPU_texture_update_mipmap(icongltex.tex[1], 1, GPU_DATA_UNSIGNED_BYTE, b16buf_border->rect);
+ GPU_texture_update_mipmap(icongltex.tex[1], 0, GPU_DATA_UBYTE, b32buf_border->rect);
+ GPU_texture_update_mipmap(icongltex.tex[1], 1, GPU_DATA_UBYTE, b16buf_border->rect);
}
}
diff --git a/source/blender/editors/interface/interface_icons_event.c b/source/blender/editors/interface/interface_icons_event.c
index 223fcbfd45b..3962ff6a702 100644
--- a/source/blender/editors/interface/interface_icons_event.c
+++ b/source/blender/editors/interface/interface_icons_event.c
@@ -118,7 +118,15 @@ void icon_draw_rect_input(float x,
UI_GetThemeColor4fv(TH_TEXT, color);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_aa(
- false, (int)x - U.pixelsize, (int)y, (int)(x + w), (int)(y + h), 3.0f * U.pixelsize, color);
+ &(const rctf){
+ .xmin = (int)x - U.pixelsize,
+ .xmax = (int)(x + w),
+ .ymin = (int)y,
+ .ymax = (int)(y + h),
+ },
+ false,
+ 3.0f * U.pixelsize,
+ color);
const enum {
UNIX,
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index f4e68ca3909..3da66d45abd 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -510,13 +510,13 @@ struct uiBlock {
const char *lockstr;
- char lock;
+ bool lock;
/** to keep blocks while drawing and free them afterwards */
- char active;
+ bool active;
/** to avoid tooltip after click */
- char tooltipdisabled;
+ bool tooltipdisabled;
/** UI_block_end done? */
- char endblock;
+ bool endblock;
/** for doing delayed */
eBlockBoundsCalc bounds_type;
@@ -525,7 +525,7 @@ struct uiBlock {
/** for doing delayed */
int bounds, minbounds;
- /** pulldowns, to detect outside, can differ per case how it is created */
+ /** pull-downs, to detect outside, can differ per case how it is created. */
rctf safety;
/** uiSafetyRct list */
ListBase saferct;
@@ -659,7 +659,7 @@ void ui_block_cm_to_display_space_v3(uiBlock *block, float pixel[3]);
/* interface_regions.c */
struct uiKeyNavLock {
- /* set when we're using keyinput */
+ /* Set when we're using key-input. */
bool is_keynav;
/* only used to check if we've moved the cursor */
int event_xy[2];
@@ -756,7 +756,7 @@ uiBlock *ui_block_func_COLOR(struct bContext *C, uiPopupBlockHandle *handle, voi
ColorPicker *ui_block_colorpicker_create(struct uiBlock *block);
/* interface_region_search.c */
-/* Searchbox for string button */
+/* Search-box for string button. */
struct ARegion *ui_searchbox_create_generic(struct bContext *C,
struct ARegion *butregion,
uiButSearch *search_but);
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 3281b8de920..8f90dc7f801 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -2642,7 +2642,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname
static void search_id_collection(StructRNA *ptype, PointerRNA *r_ptr, PropertyRNA **r_prop)
{
/* look for collection property in Main */
- /* Note: using global Main is OK-ish here, UI shall not access other Mains anyay... */
+ /* NOTE: using global Main is OK-ish here, UI shall not access other Mains anyway. */
RNA_main_pointer_create(G_MAIN, r_ptr);
*r_prop = NULL;
@@ -2821,7 +2821,7 @@ void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)
UI_menutype_draw(C, mt, layout);
- /* menus are created flipped (from event handling pov) */
+ /* Menus are created flipped (from event handling point of view). */
layout->root->block->flag ^= UI_BLOCK_IS_FLIP;
}
@@ -3057,7 +3057,8 @@ void uiItemPopoverPanel_ptr(
};
pt->draw_header(C, &panel);
}
- uiBut *but = ui_item_menu(layout, name, icon, ui_item_paneltype_func, pt, NULL, NULL, true);
+ uiBut *but = ui_item_menu(
+ layout, name, icon, ui_item_paneltype_func, pt, NULL, pt->description, true);
but->type = UI_BTYPE_POPOVER;
if (!ok) {
but->flag |= UI_BUT_DISABLED;
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index e5aa0665a16..540e98f542e 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -901,7 +901,7 @@ bool UI_context_copy_to_selected_list(bContext *C,
MEM_freeN(link);
}
else {
- /* avoid prepending 'data' to the path */
+ /* Avoid prepending 'data' to the path. */
RNA_id_pointer_create(id_data, &link->ptr);
}
@@ -1296,6 +1296,19 @@ void UI_editsource_active_but_test(uiBut *but)
BLI_ghash_insert(ui_editsource_info->hash, but, but_store);
}
+/**
+ * Remove the editsource data for \a old_but and reinsert it for \a new_but. Use when the button
+ * was reallocated, e.g. to have a new type (#ui_but_change_type()).
+ */
+void UI_editsource_but_replace(const uiBut *old_but, uiBut *new_but)
+{
+ uiEditSourceButStore *but_store = BLI_ghash_lookup(ui_editsource_info->hash, old_but);
+ if (but_store) {
+ BLI_ghash_remove(ui_editsource_info->hash, old_but, NULL, NULL);
+ BLI_ghash_insert(ui_editsource_info->hash, new_but, but_store);
+ }
+}
+
static int editsource_text_edit(bContext *C,
wmOperator *op,
const char filepath[FILE_MAX],
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index bf140eb1692..7343417137a 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -926,9 +926,9 @@ bool UI_panel_matches_search_filter(const Panel *panel)
/**
* Set the flag telling the panel to use its search result status for its expansion.
*/
-static void panel_set_expansion_from_seach_filter_recursive(const bContext *C,
- Panel *panel,
- const bool use_search_closed)
+static void panel_set_expansion_from_search_filter_recursive(const bContext *C,
+ Panel *panel,
+ const bool use_search_closed)
{
/* This has to run on inactive panels that may not have a type,
* but we can prevent running on header-less panels in some cases. */
@@ -939,21 +939,21 @@ static void panel_set_expansion_from_seach_filter_recursive(const bContext *C,
LISTBASE_FOREACH (Panel *, child_panel, &panel->children) {
/* Don't check if the sub-panel is active, otherwise the
* expansion won't be reset when the parent is closed. */
- panel_set_expansion_from_seach_filter_recursive(C, child_panel, use_search_closed);
+ panel_set_expansion_from_search_filter_recursive(C, child_panel, use_search_closed);
}
}
/**
* Set the flag telling every panel to override its expansion with its search result status.
*/
-static void region_panels_set_expansion_from_seach_filter(const bContext *C,
- ARegion *region,
- const bool use_search_closed)
+static void region_panels_set_expansion_from_search_filter(const bContext *C,
+ ARegion *region,
+ const bool use_search_closed)
{
LISTBASE_FOREACH (Panel *, panel, &region->panels) {
/* Don't check if the panel is active, otherwise the expansion won't
* be correct when switching back to tab after exiting search. */
- panel_set_expansion_from_seach_filter_recursive(C, panel, use_search_closed);
+ panel_set_expansion_from_search_filter_recursive(C, panel, use_search_closed);
}
set_panels_list_data_expand_flag(C, region);
}
@@ -1121,13 +1121,16 @@ static void panel_draw_highlight_border(const Panel *panel,
float color[4];
UI_GetThemeColor4fv(TH_SELECT_ACTIVE, color);
- UI_draw_roundbox_4fv(false,
- rect->xmin,
- UI_panel_is_closed(panel) ? header_rect->ymin : rect->ymin,
- rect->xmax,
- header_rect->ymax,
- radius,
- color);
+ UI_draw_roundbox_4fv(
+ &(const rctf){
+ .xmin = rect->xmin,
+ .xmax = rect->xmax,
+ .ymin = UI_panel_is_closed(panel) ? header_rect->ymin : rect->ymin,
+ .ymax = header_rect->ymax,
+ },
+ false,
+ radius,
+ color);
}
static void panel_draw_aligned_widgets(const uiStyle *style,
@@ -1253,13 +1256,16 @@ static void panel_draw_aligned_backdrop(const Panel *panel,
float color[4];
UI_GetThemeColor4fv(TH_PANEL_SUB_BACK, color);
/* Change the width a little bit to line up with sides. */
- UI_draw_roundbox_aa(true,
- rect->xmin + U.pixelsize,
- rect->ymin + U.pixelsize,
- rect->xmax - U.pixelsize,
- rect->ymax,
- box_wcol->roundness * U.widget_unit,
- color);
+ UI_draw_roundbox_aa(
+ &(const rctf){
+ .xmin = rect->xmin + U.pixelsize,
+ .xmax = rect->xmax - U.pixelsize,
+ .ymin = rect->ymin + U.pixelsize,
+ .ymax = rect->ymax,
+ },
+ true,
+ box_wcol->roundness * U.widget_unit,
+ color);
}
else {
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
@@ -1333,7 +1339,7 @@ void ui_draw_aligned_panel(const uiStyle *style,
{
const Panel *panel = block->panel;
- /* Add 0.001f to prevent flicker frpm float inaccuracy. */
+ /* Add 0.001f to prevent flicker from float inaccuracy. */
const rcti header_rect = {
rect->xmin,
rect->xmax,
@@ -1544,20 +1550,26 @@ void UI_panel_category_draw_all(ARegion *region, const char *category_id_active)
{
/* Draw filled rectangle and outline for tab. */
UI_draw_roundbox_corner_set(roundboxtype);
- UI_draw_roundbox_4fv(true,
- rct->xmin,
- rct->ymin,
- rct->xmax,
- rct->ymax,
- tab_curve_radius,
- is_active ? theme_col_tab_active : theme_col_tab_inactive);
- UI_draw_roundbox_4fv(false,
- rct->xmin,
- rct->ymin,
- rct->xmax,
- rct->ymax,
- tab_curve_radius,
- theme_col_tab_outline);
+ UI_draw_roundbox_4fv(
+ &(const rctf){
+ .xmin = rct->xmin,
+ .xmax = rct->xmax,
+ .ymin = rct->ymin,
+ .ymax = rct->ymax,
+ },
+ true,
+ tab_curve_radius,
+ is_active ? theme_col_tab_active : theme_col_tab_inactive);
+ UI_draw_roundbox_4fv(
+ &(const rctf){
+ .xmin = rct->xmin,
+ .xmax = rct->xmax,
+ .ymin = rct->ymin,
+ .ymax = rct->ymax,
+ },
+ false,
+ tab_curve_radius,
+ theme_col_tab_outline);
/* Disguise the outline on one side to join the tab to the panel. */
pos = GPU_vertformat_attr_add(
@@ -1911,10 +1923,10 @@ void UI_panels_end(const bContext *C, ARegion *region, int *r_x, int *r_y)
const bool region_search_filter_active = region->flag & RGN_FLAG_SEARCH_FILTER_ACTIVE;
if (properties_space_needs_realign(area, region)) {
- region_panels_set_expansion_from_seach_filter(C, region, region_search_filter_active);
+ region_panels_set_expansion_from_search_filter(C, region, region_search_filter_active);
}
else if (region->flag & RGN_FLAG_SEARCH_FILTER_UPDATE) {
- region_panels_set_expansion_from_seach_filter(C, region, region_search_filter_active);
+ region_panels_set_expansion_from_search_filter(C, region, region_search_filter_active);
}
if (region->flag & RGN_FLAG_SEARCH_FILTER_ACTIVE) {
@@ -2354,7 +2366,7 @@ static int ui_handle_panel_category_cycling(const wmEvent *event,
PanelCategoryDyn *pc_dyn = UI_panel_category_find(region, category);
if (LIKELY(pc_dyn)) {
if (is_mousewheel) {
- /* We can probably get rid of this and only allow ctrl-tabbing. */
+ /* We can probably get rid of this and only allow Ctrl-Tabbing. */
pc_dyn = (event->type == WHEELDOWNMOUSE) ? pc_dyn->next : pc_dyn->prev;
}
else {
diff --git a/source/blender/editors/interface/interface_region_color_picker.c b/source/blender/editors/interface/interface_region_color_picker.c
index 82028d4e595..e68705e4321 100644
--- a/source/blender/editors/interface/interface_region_color_picker.c
+++ b/source/blender/editors/interface/interface_region_color_picker.c
@@ -565,6 +565,7 @@ static void ui_block_colorpicker(uiBlock *block,
0,
"");
UI_but_flag_disable(bt, UI_BUT_UNDO);
+ UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT);
UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL);
bt->custom_data = cpicker;
bt = uiDefButC(block,
@@ -582,6 +583,7 @@ static void ui_block_colorpicker(uiBlock *block,
0,
"");
UI_but_flag_disable(bt, UI_BUT_UNDO);
+ UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT);
UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL);
bt->custom_data = cpicker;
bt = uiDefButC(block,
@@ -599,6 +601,7 @@ static void ui_block_colorpicker(uiBlock *block,
0,
"");
UI_but_flag_disable(bt, UI_BUT_UNDO);
+ UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT);
UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL);
bt->custom_data = cpicker;
UI_block_align_end(block);
diff --git a/source/blender/editors/interface/interface_region_menu_pie.c b/source/blender/editors/interface/interface_region_menu_pie.c
index d047d5421d7..81c627816b9 100644
--- a/source/blender/editors/interface/interface_region_menu_pie.c
+++ b/source/blender/editors/interface/interface_region_menu_pie.c
@@ -392,7 +392,7 @@ void ui_pie_menu_level_create(uiBlock *block,
EnumPropertyItem *remaining = MEM_mallocN(array_size + sizeof(EnumPropertyItem),
"pie_level_item_array");
memcpy(remaining, items + totitem_parent, array_size);
- /* a NULL terminating sentinal element is required */
+ /* A NULL terminating sentinel element is required. */
memset(&remaining[totitem_remain], 0, sizeof(EnumPropertyItem));
/* yuk, static... issue is we can't reliably free this without doing dangerous changes */
diff --git a/source/blender/editors/interface/interface_region_menu_popup.c b/source/blender/editors/interface/interface_region_menu_popup.c
index 1789af2d2ce..f234f0fbbf5 100644
--- a/source/blender/editors/interface/interface_region_menu_popup.c
+++ b/source/blender/editors/interface/interface_region_menu_popup.c
@@ -188,7 +188,7 @@ static uiBlock *ui_block_func_POPUP(bContext *C, uiPopupBlockHandle *handle, voi
minwidth = uiLayoutGetUnitsX(pup->layout) * UI_UNIT_X;
}
else if (pup->but) {
- /* minimum width to enforece */
+ /* Minimum width to enforce. */
if (pup->but->drawstr[0]) {
minwidth = BLI_rctf_size_x(&pup->but->rect);
}
diff --git a/source/blender/editors/interface/interface_region_popup.c b/source/blender/editors/interface/interface_region_popup.c
index 93e3dbb2cc8..8135f5a203e 100644
--- a/source/blender/editors/interface/interface_region_popup.c
+++ b/source/blender/editors/interface/interface_region_popup.c
@@ -353,7 +353,7 @@ static void ui_popup_block_position(wmWindow *window,
block->direction = dir1;
}
- /* keep a list of these, needed for pulldown menus */
+ /* Keep a list of these, needed for pull-down menus. */
uiSafetyRct *saferct = MEM_callocN(sizeof(uiSafetyRct), "uiSafetyRct");
saferct->parent = butrct;
saferct->safety = block->safety;
@@ -413,12 +413,11 @@ static void ui_block_region_draw(const bContext *C, ARegion *region)
/**
* Use to refresh centered popups on screen resizing (for splash).
*/
-static void ui_block_region_popup_window_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void ui_block_region_popup_window_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
switch (wmn->category) {
case NC_WINDOW: {
switch (wmn->action) {
@@ -540,7 +539,7 @@ static void ui_popup_block_remove(bContext *C, uiPopupBlockHandle *handle)
CTX_wm_window_set(C, win);
ui_region_temp_remove(C, screen, handle->region);
- /* Reset context (area and region were NULL'ed when chaning context window). */
+ /* Reset context (area and region were NULL'ed when changing context window). */
CTX_wm_window_set(C, ctx_win);
CTX_wm_area_set(C, ctx_area);
CTX_wm_region_set(C, ctx_region);
@@ -633,7 +632,7 @@ uiBlock *ui_popup_block_refresh(bContext *C,
}
else {
uiSafetyRct *saferct;
- /* keep a list of these, needed for pulldown menus */
+ /* Keep a list of these, needed for pull-down menus. */
saferct = MEM_callocN(sizeof(uiSafetyRct), "uiSafetyRct");
saferct->safety = block->safety;
BLI_addhead(&block->saferct, saferct);
diff --git a/source/blender/editors/interface/interface_region_search.c b/source/blender/editors/interface/interface_region_search.c
index 816162e9aa2..2c07f5c3c03 100644
--- a/source/blender/editors/interface/interface_region_search.c
+++ b/source/blender/editors/interface/interface_region_search.c
@@ -289,7 +289,7 @@ int ui_searchbox_find_index(ARegion *region, const char *name)
return UI_search_items_find_index(&data->items, name);
}
-/* x and y in screencoords */
+/* x and y in screen-coords. */
bool ui_searchbox_inside(ARegion *region, int x, int y)
{
uiSearchboxData *data = region->regiondata;
@@ -347,9 +347,20 @@ static struct ARegion *wm_searchbox_tooltip_init(struct bContext *C,
}
uiButSearch *search_but = (uiButSearch *)but;
- if (search_but->item_tooltip_fn) {
- return search_but->item_tooltip_fn(C, region, search_but->arg, search_but->item_active);
+ if (!search_but->item_tooltip_fn) {
+ continue;
}
+
+ ARegion *searchbox_region = UI_region_searchbox_region_get(region);
+ uiSearchboxData *data = searchbox_region->regiondata;
+
+ BLI_assert(data->items.pointers[data->active] == search_but->item_active);
+
+ rcti rect;
+ ui_searchbox_butrect(&rect, data, data->active);
+
+ return search_but->item_tooltip_fn(
+ C, region, &rect, search_but->arg, search_but->item_active);
}
}
return NULL;
@@ -452,8 +463,11 @@ static void ui_searchbox_update_fn(bContext *C,
const char *str,
uiSearchItems *items)
{
- wmWindow *win = CTX_wm_window(C);
- WM_tooltip_clear(C, win);
+ /* While the button is in text editing mode (searchbox open), remove tooltips on every update. */
+ if (search_but->but.editstr) {
+ wmWindow *win = CTX_wm_window(C);
+ WM_tooltip_clear(C, win);
+ }
search_but->items_update_fn(C, search_but->arg, str, items);
}
@@ -710,19 +724,13 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc
wmWindow *win = CTX_wm_window(C);
const uiStyle *style = UI_style_get();
uiBut *but = &search_but->but;
- static ARegionType type;
- ARegion *region;
- uiSearchboxData *data;
const float aspect = but->block->aspect;
- rctf rect_fl;
- rcti rect_i;
const int margin = UI_POPUP_MARGIN;
- int winx /*, winy */, ofsx, ofsy;
- int i;
/* create area region */
- region = ui_region_temp_add(CTX_wm_screen(C));
+ ARegion *region = ui_region_temp_add(CTX_wm_screen(C));
+ static ARegionType type;
memset(&type, 0, sizeof(ARegionType));
type.draw = ui_searchbox_region_draw_cb;
type.free = ui_searchbox_region_free_cb;
@@ -730,7 +738,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc
region->type = &type;
/* create searchbox data */
- data = MEM_callocN(sizeof(uiSearchboxData), "uiSearchboxData");
+ uiSearchboxData *data = MEM_callocN(sizeof(uiSearchboxData), "uiSearchboxData");
/* set font, get bb */
data->fstyle = style->widget; /* copy struct */
@@ -785,13 +793,14 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc
else {
const int searchbox_width = UI_searchbox_size_x();
+ rctf rect_fl;
rect_fl.xmin = but->rect.xmin - 5; /* align text with button */
rect_fl.xmax = but->rect.xmax + 5; /* symmetrical */
rect_fl.ymax = but->rect.ymin;
rect_fl.ymin = rect_fl.ymax - UI_searchbox_size_y();
- ofsx = (but->block->panel) ? but->block->panel->ofsx : 0;
- ofsy = (but->block->panel) ? but->block->panel->ofsy : 0;
+ const int ofsx = (but->block->panel) ? but->block->panel->ofsx : 0;
+ const int ofsy = (but->block->panel) ? but->block->panel->ofsy : 0;
BLI_rctf_translate(&rect_fl, ofsx, ofsy);
@@ -801,6 +810,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc
}
/* copy to int, gets projected if possible too */
+ rcti rect_i;
BLI_rcti_rctf_copy(&rect_i, &rect_fl);
if (butregion->v2d.cur.xmin != butregion->v2d.cur.xmax) {
@@ -809,7 +819,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc
BLI_rcti_translate(&rect_i, butregion->winrct.xmin, butregion->winrct.ymin);
- winx = WM_window_pixels_x(win);
+ int winx = WM_window_pixels_x(win);
// winy = WM_window_pixels_y(win); /* UNUSED */
// wm_window_get_size(win, &winx, &winy);
@@ -871,7 +881,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc
data->items.icons = MEM_callocN(data->items.maxitem * sizeof(int), "search icons");
data->items.states = MEM_callocN(data->items.maxitem * sizeof(int), "search flags");
data->items.name_prefix_offsets = NULL; /* Lazy initialized as needed. */
- for (i = 0; i < data->items.maxitem; i++) {
+ for (int i = 0; i < data->items.maxitem; i++) {
data->items.names[i] = MEM_callocN(but->hardmax + 1, "search pointers");
}
@@ -986,10 +996,8 @@ static void ui_searchbox_region_draw_cb__operator(const bContext *UNUSED(C), ARe
ARegion *ui_searchbox_create_operator(bContext *C, ARegion *butregion, uiButSearch *search_but)
{
- ARegion *region;
-
UI_but_drawflag_enable(&search_but->but, UI_BUT_HAS_SHORTCUT);
- region = ui_searchbox_create_generic(C, butregion, search_but);
+ ARegion *region = ui_searchbox_create_generic(C, butregion, search_but);
region->type->draw = ui_searchbox_region_draw_cb__operator;
@@ -1008,10 +1016,8 @@ static void ui_searchbox_region_draw_cb__menu(const bContext *UNUSED(C), ARegion
ARegion *ui_searchbox_create_menu(bContext *C, ARegion *butregion, uiButSearch *search_but)
{
- ARegion *region;
-
UI_but_drawflag_enable(&search_but->but, UI_BUT_HAS_SHORTCUT);
- region = ui_searchbox_create_generic(C, butregion, search_but);
+ ARegion *region = ui_searchbox_create_generic(C, butregion, search_but);
if (false) {
region->type->draw = ui_searchbox_region_draw_cb__menu;
@@ -1046,7 +1052,7 @@ void ui_but_search_refresh(uiButSearch *search_but)
ui_searchbox_update_fn(but->block->evil_C, search_but, but->drawstr, items);
- /* only redalert when we are sure of it, this can miss cases when >10 matches */
+ /* Only red-alert when we are sure of it, this can miss cases when >10 matches. */
if (items->totitem == 0) {
UI_but_flag_enable(but, UI_BUT_REDALERT);
}
diff --git a/source/blender/editors/interface/interface_region_tooltip.c b/source/blender/editors/interface/interface_region_tooltip.c
index 2bf63955855..050a14cf574 100644
--- a/source/blender/editors/interface/interface_region_tooltip.c
+++ b/source/blender/editors/interface/interface_region_tooltip.c
@@ -1456,15 +1456,91 @@ ARegion *UI_tooltip_create_from_gizmo(bContext *C, wmGizmo *gz)
{
wmWindow *win = CTX_wm_window(C);
const float aspect = 1.0f;
- float init_position[2];
+ float init_position[2] = {win->eventstate->x, win->eventstate->y};
uiTooltipData *data = ui_tooltip_data_from_gizmo(C, gz);
if (data == NULL) {
return NULL;
}
+ /* TODO(harley):
+ * Julian preferred that the gizmo callback return the 3D bounding box
+ * which we then project to 2D here. Would make a nice improvement.
+ */
+ if (gz->type->screen_bounds_get) {
+ rcti bounds;
+ gz->type->screen_bounds_get(C, gz, &bounds);
+ init_position[0] = bounds.xmin;
+ init_position[1] = bounds.ymin;
+ }
+
+ return ui_tooltip_create_with_data(C, data, init_position, NULL, aspect);
+}
+
+static uiTooltipData *ui_tooltip_data_from_search_item_tooltip_data(
+ const uiSearchItemTooltipData *item_tooltip_data)
+{
+ uiTooltipData *data = MEM_callocN(sizeof(uiTooltipData), "uiTooltipData");
+
+ if (item_tooltip_data->description[0]) {
+ uiTooltipField *field = text_field_add(data,
+ &(uiTooltipFormat){
+ .style = UI_TIP_STYLE_HEADER,
+ .color_id = UI_TIP_LC_NORMAL,
+ .is_pad = true,
+ });
+ field->text = BLI_strdup(item_tooltip_data->description);
+ }
+
+ if (item_tooltip_data->name && item_tooltip_data->name[0]) {
+ uiTooltipField *field = text_field_add(data,
+ &(uiTooltipFormat){
+ .style = UI_TIP_STYLE_NORMAL,
+ .color_id = UI_TIP_LC_VALUE,
+ .is_pad = true,
+ });
+ field->text = BLI_strdup(item_tooltip_data->name);
+ }
+ if (item_tooltip_data->hint[0]) {
+ uiTooltipField *field = text_field_add(data,
+ &(uiTooltipFormat){
+ .style = UI_TIP_STYLE_NORMAL,
+ .color_id = UI_TIP_LC_NORMAL,
+ .is_pad = true,
+ });
+ field->text = BLI_strdup(item_tooltip_data->hint);
+ }
+
+ if (data->fields_len == 0) {
+ MEM_freeN(data);
+ return NULL;
+ }
+ return data;
+}
+
+/**
+ * Create a tooltip from search-item tooltip data \a item_tooltip data.
+ * To be called from a callback set with #UI_but_func_search_set_tooltip().
+ *
+ * \param item_rect: Rectangle of the search item in search region space (#ui_searchbox_butrect())
+ * which is passed to the tooltip callback.
+ */
+ARegion *UI_tooltip_create_from_search_item_generic(
+ bContext *C,
+ const ARegion *searchbox_region,
+ const rcti *item_rect,
+ const uiSearchItemTooltipData *item_tooltip_data)
+{
+ uiTooltipData *data = ui_tooltip_data_from_search_item_tooltip_data(item_tooltip_data);
+ if (data == NULL) {
+ return NULL;
+ }
+
+ const float aspect = 1.0f;
+ const wmWindow *win = CTX_wm_window(C);
+ float init_position[2];
init_position[0] = win->eventstate->x;
- init_position[1] = win->eventstate->y;
+ init_position[1] = item_rect->ymin + searchbox_region->winrct.ymin - (UI_POPUP_MARGIN / 2);
return ui_tooltip_create_with_data(C, data, init_position, NULL, aspect);
}
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index a37fb0dfde1..eaefc2c3736 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -341,13 +341,16 @@ void UI_fontstyle_draw_simple_backdrop(const uiFontStyle *fs,
const float color[4] = {col_bg[0], col_bg[1], col_bg[2], 0.5f};
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(true,
- x - margin,
- (y + decent) - margin,
- x + width + margin,
- (y + decent) + height + margin,
- margin,
- color);
+ UI_draw_roundbox_aa(
+ &(const rctf){
+ .xmin = x - margin,
+ .xmax = x + width + margin,
+ .ymin = (y + decent) - margin,
+ .ymax = (y + decent) + height + margin,
+ },
+ true,
+ margin,
+ color);
}
BLF_position(fs->uifont_id, x, y, 0.0f);
diff --git a/source/blender/editors/interface/interface_template_search_menu.c b/source/blender/editors/interface/interface_template_search_menu.c
index 9f4cd32588d..25cf2e12377 100644
--- a/source/blender/editors/interface/interface_template_search_menu.c
+++ b/source/blender/editors/interface/interface_template_search_menu.c
@@ -1069,6 +1069,7 @@ static bool ui_search_menu_create_context_menu(struct bContext *C,
static struct ARegion *ui_search_menu_create_tooltip(struct bContext *C,
struct ARegion *region,
+ const rcti *UNUSED(item_rect),
void *arg,
void *active)
{
diff --git a/source/blender/editors/interface/interface_template_search_operator.c b/source/blender/editors/interface/interface_template_search_operator.c
index 21529a97c01..ff0f9a2e5cd 100644
--- a/source/blender/editors/interface/interface_template_search_operator.c
+++ b/source/blender/editors/interface/interface_template_search_operator.c
@@ -23,11 +23,8 @@
#include <string.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_alloca.h"
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 003bb110baf..67446ca681f 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -208,6 +208,7 @@ static uiBlock *template_common_search_menu(const bContext *C,
void *search_arg,
uiButHandleFunc search_exec_fn,
void *active_item,
+ uiButSearchTooltipFn item_tooltip_fn,
const int preview_rows,
const int preview_cols,
float scale)
@@ -284,6 +285,7 @@ static uiBlock *template_common_search_menu(const bContext *C,
NULL,
search_exec_fn,
active_item);
+ UI_but_func_search_set_tooltip(but, item_tooltip_fn);
UI_block_bounds_set_normal(block, 0.3f * U.widget_unit);
UI_block_direction_set(block, UI_DIR_DOWN);
@@ -347,7 +349,7 @@ static bool id_search_allows_id(TemplateID *template_ui, const int flag, ID *id,
}
}
- /* Hide dot-datablocks, but only if filter does not force them visible. */
+ /* Hide dot prefixed data-blocks, but only if filter does not force them visible. */
if (U.uiflag & USER_HIDE_DOT) {
if ((id->name[2] == '.') && (query[0] != '.')) {
return false;
@@ -485,6 +487,31 @@ static void id_search_cb_objects_from_scene(const bContext *C,
id_search_cb_tagged(C, arg_template, str, items);
}
+static ARegion *template_ID_search_menu_item_tooltip(
+ bContext *C, ARegion *region, const rcti *item_rect, void *arg, void *active)
+{
+ TemplateID *template_ui = arg;
+ ID *active_id = active;
+ StructRNA *type = RNA_property_pointer_type(&template_ui->ptr, template_ui->prop);
+
+ uiSearchItemTooltipData tooltip_data = {0};
+
+ tooltip_data.name = active_id->name + 2;
+ BLI_snprintf(tooltip_data.description,
+ sizeof(tooltip_data.description),
+ TIP_("Choose %s data-block to be assigned to this user"),
+ RNA_struct_ui_name(type));
+ if (ID_IS_LINKED(active_id)) {
+ BLI_snprintf(tooltip_data.hint,
+ sizeof(tooltip_data.hint),
+ TIP_("Source library: %s\n%s"),
+ active_id->lib->id.name + 2,
+ active_id->lib->filepath);
+ }
+
+ return UI_tooltip_create_from_search_item_generic(C, region, item_rect, &tooltip_data);
+}
+
/* ID Search browse menu, open */
static uiBlock *id_search_menu(bContext *C, ARegion *region, void *arg_litem)
{
@@ -512,6 +539,7 @@ static uiBlock *id_search_menu(bContext *C, ARegion *region, void *arg_litem)
&template_ui,
template_ID_set_property_exec_fn,
active_item_ptr.data,
+ template_ID_search_menu_item_tooltip,
template_ui.prv_rows,
template_ui.prv_cols,
template_ui.scale);
@@ -530,14 +558,13 @@ void UI_context_active_but_prop_get_templateID(bContext *C,
PointerRNA *r_ptr,
PropertyRNA **r_prop)
{
- TemplateID *template_ui;
uiBut *but = UI_context_active_but_get(C);
memset(r_ptr, 0, sizeof(*r_ptr));
*r_prop = NULL;
if (but && but->func_argN) {
- template_ui = but->func_argN;
+ TemplateID *template_ui = but->func_argN;
*r_ptr = template_ui->ptr;
*r_prop = template_ui->prop;
}
@@ -883,22 +910,18 @@ static void template_ID(const bContext *C,
const bool hide_buttons)
{
uiBut *but;
- uiBlock *block;
- PointerRNA idptr;
- // ListBase *lb; // UNUSED
- ID *id, *idfrom;
const bool editable = RNA_property_editable(&template_ui->ptr, template_ui->prop);
const bool use_previews = template_ui->preview = (flag & UI_ID_PREVIEWS) != 0;
- idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
- id = idptr.data;
- idfrom = template_ui->ptr.owner_id;
+ PointerRNA idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
+ ID *id = idptr.data;
+ ID *idfrom = template_ui->ptr.owner_id;
// lb = template_ui->idlb;
- /* Allow opertators to take the ID from context. */
+ /* Allow operators to take the ID from context. */
uiLayoutSetContextPointer(layout, "id", &idptr);
- block = uiLayoutGetBlock(layout);
+ uiBlock *block = uiLayoutGetBlock(layout);
UI_block_align_begin(block);
if (idptr.type) {
@@ -906,7 +929,7 @@ static void template_ID(const bContext *C,
}
if (text) {
- /* Add label resepecting the separated layout property split state. */
+ /* Add label respecting the separated layout property split state. */
uiItemL_respect_property_split(layout, text, ICON_NONE);
}
@@ -1302,19 +1325,14 @@ static void ui_template_id(uiLayout *layout,
const bool live_icon,
const bool hide_buttons)
{
- TemplateID *template_ui;
- PropertyRNA *prop;
- StructRNA *type;
- short idcode;
-
- prop = RNA_struct_find_property(ptr, propname);
+ PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
if (!prop || RNA_property_type(prop) != PROP_POINTER) {
RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
- template_ui = MEM_callocN(sizeof(TemplateID), "TemplateID");
+ TemplateID *template_ui = MEM_callocN(sizeof(TemplateID), "TemplateID");
template_ui->ptr = *ptr;
template_ui->prop = prop;
template_ui->prv_rows = prv_rows;
@@ -1335,8 +1353,8 @@ static void ui_template_id(uiLayout *layout,
flag |= UI_ID_OPEN;
}
- type = RNA_property_pointer_type(ptr, prop);
- idcode = RNA_type_to_ID_code(type);
+ StructRNA *type = RNA_property_pointer_type(ptr, prop);
+ short idcode = RNA_type_to_ID_code(type);
template_ui->idcode = idcode;
template_ui->idlb = which_libbase(CTX_data_main(C), idcode);
@@ -1535,12 +1553,9 @@ void uiTemplateAnyID(uiLayout *layout,
const char *proptypename,
const char *text)
{
- PropertyRNA *propID, *propType;
- uiLayout *split, *row, *sub;
-
/* get properties... */
- propID = RNA_struct_find_property(ptr, propname);
- propType = RNA_struct_find_property(ptr, proptypename);
+ PropertyRNA *propID = RNA_struct_find_property(ptr, propname);
+ PropertyRNA *propType = RNA_struct_find_property(ptr, proptypename);
if (!propID || RNA_property_type(propID) != PROP_POINTER) {
RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
@@ -1555,10 +1570,10 @@ void uiTemplateAnyID(uiLayout *layout,
/* Start drawing UI Elements using standard defines */
/* NOTE: split amount here needs to be synced with normal labels */
- split = uiLayoutSplit(layout, 0.33f, false);
+ uiLayout *split = uiLayoutSplit(layout, 0.33f, false);
/* FIRST PART ................................................ */
- row = uiLayoutRow(split, false);
+ uiLayout *row = uiLayoutRow(split, false);
/* Label - either use the provided text, or will become "ID-Block:" */
if (text) {
@@ -1577,7 +1592,7 @@ void uiTemplateAnyID(uiLayout *layout,
/* HACK: special group just for the enum,
* otherwise we get ugly layout with text included too... */
- sub = uiLayoutRow(row, true);
+ uiLayout *sub = uiLayoutRow(row, true);
uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT);
uiItemFullR(sub, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
@@ -1632,6 +1647,7 @@ static uiBlock *template_search_menu(bContext *C, ARegion *region, void *arg_tem
&template_search,
template_search_exec_fn,
active_ptr.data,
+ NULL,
template_search.preview_rows,
template_search.preview_cols,
1.0f);
@@ -1775,18 +1791,15 @@ static TemplateSearch *template_search_setup(PointerRNA *ptr,
PointerRNA *searchptr,
const char *const searchpropname)
{
- TemplateSearch *template_search;
- PropertyRNA *prop, *searchprop;
-
- prop = RNA_struct_find_property(ptr, propname);
+ PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
if (!prop || RNA_property_type(prop) != PROP_POINTER) {
RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return NULL;
}
- searchprop = template_search_get_searchprop(ptr, prop, searchptr, searchpropname);
+ PropertyRNA *searchprop = template_search_get_searchprop(ptr, prop, searchptr, searchpropname);
- template_search = MEM_callocN(sizeof(*template_search), __func__);
+ TemplateSearch *template_search = MEM_callocN(sizeof(*template_search), __func__);
template_search->search_data.target_ptr = *ptr;
template_search->search_data.target_prop = prop;
template_search->search_data.search_ptr = *searchptr;
@@ -1862,18 +1875,15 @@ void uiTemplatePathBuilder(uiLayout *layout,
PointerRNA *UNUSED(root_ptr),
const char *text)
{
- PropertyRNA *propPath;
- uiLayout *row;
-
/* check that properties are valid */
- propPath = RNA_struct_find_property(ptr, propname);
+ PropertyRNA *propPath = RNA_struct_find_property(ptr, propname);
if (!propPath || RNA_property_type(propPath) != PROP_STRING) {
RNA_warning("path property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
/* Start drawing UI Elements using standard defines */
- row = uiLayoutRow(layout, true);
+ uiLayout *row = uiLayoutRow(layout, true);
/* Path (existing string) Widget */
uiItemR(row, ptr, propname, 0, text, ICON_RNA);
@@ -6802,20 +6812,16 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
width = min_ii((int)(rti->widthfac * width), width);
width = max_ii(width, 10 * UI_DPI_FAC);
- /* make a box around the report to make it stand out */
UI_block_align_begin(block);
- but = uiDefBut(
- block, UI_BTYPE_ROUNDBOX, 0, "", 0, 0, UI_UNIT_X + 5, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
- /* set the report's bg color in but->col - UI_BTYPE_ROUNDBOX feature */
- rgba_float_to_uchar(but->col, rti->col);
+ /* Background for icon. */
but = uiDefBut(block,
UI_BTYPE_ROUNDBOX,
0,
"",
- UI_UNIT_X + 5,
0,
- UI_UNIT_X + width,
+ 0,
+ UI_UNIT_X + (6 * UI_DPI_FAC),
UI_UNIT_Y,
NULL,
0.0f,
@@ -6823,46 +6829,57 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
0,
0,
"");
- rgba_float_to_uchar(but->col, rti->col);
+ /* UI_BTYPE_ROUNDBOX's bg color is set in but->col. */
+ UI_GetThemeColorType4ubv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, but->col);
- UI_block_align_end(block);
+ /* Background for the rest of the message. */
+ but = uiDefBut(block,
+ UI_BTYPE_ROUNDBOX,
+ 0,
+ "",
+ UI_UNIT_X + (6 * UI_DPI_FAC),
+ 0,
+ UI_UNIT_X + width,
+ UI_UNIT_Y,
+ NULL,
+ 0.0f,
+ 0.0f,
+ 0,
+ 0,
+ "");
- /* icon and report message on top */
- const int icon = UI_icon_from_report_type(report->type);
+ /* Use icon background at low opacity to highlight, but still contrasting with area TH_TEXT. */
+ UI_GetThemeColorType4ubv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, but->col);
+ but->col[3] = 64;
- /* XXX: temporary operator to dump all reports to a text block, but only if more than 1 report
- * to be shown instead of icon when appropriate...
- */
+ UI_block_align_end(block);
UI_block_emboss_set(block, UI_EMBOSS_NONE);
- if (reports->list.first != reports->list.last) {
- uiDefIconButO(block,
- UI_BTYPE_BUT,
- "SCREEN_OT_info_log_show",
- WM_OP_INVOKE_REGION_WIN,
- icon,
- 2,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- TIP_("Click to see the remaining reports in text block: 'Recent Reports'"));
- }
- else {
- uiDefIconBut(
- block, UI_BTYPE_LABEL, 0, icon, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
- }
+ /* The report icon itself. */
+ but = uiDefIconButO(block,
+ UI_BTYPE_BUT,
+ "SCREEN_OT_info_log_show",
+ WM_OP_INVOKE_REGION_WIN,
+ UI_icon_from_report_type(report->type),
+ (3 * UI_DPI_FAC),
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
+ TIP_("Click to see the remaining reports in text block: 'Recent Reports'"));
+ UI_GetThemeColorType4ubv(UI_text_colorid_from_report_type(report->type), SPACE_INFO, but->col);
+ but->col[3] = 255; /* This theme color is RBG only, so have to set alpha here. */
+ /* The report message. */
but = uiDefButO(block,
UI_BTYPE_BUT,
"SCREEN_OT_info_log_show",
WM_OP_INVOKE_REGION_WIN,
report->message,
- UI_UNIT_X + 5,
+ UI_UNIT_X,
0,
- UI_UNIT_X + width,
+ width + UI_UNIT_X,
UI_UNIT_Y,
"Show in Info Log");
- rgba_float_to_uchar(but->col, rti->col);
}
void uiTemplateInputStatus(uiLayout *layout, struct bContext *C)
@@ -6999,7 +7016,6 @@ void uiTemplateKeymapItemProperties(uiLayout *layout, PointerRNA *ptr)
/* -------------------------------------------------------------------- */
/** \name Event Icon Template
- *
* \{ */
bool uiTemplateEventFromKeymapItem(struct uiLayout *layout,
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 958a0bc03cd..5311bb57da9 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -33,6 +33,7 @@
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_string.h"
+#include "BLI_string_search.h"
#include "BLI_utildefines.h"
#include "BLT_translation.h"
@@ -374,15 +375,31 @@ typedef struct CollItemSearch {
uint has_sep_char : 1;
} CollItemSearch;
-static int sort_search_items_list(const void *a, const void *b)
+static bool add_collection_search_item(CollItemSearch *cis,
+ const bool requires_exact_data_name,
+ const bool has_id_icon,
+ uiSearchItems *items)
{
- const CollItemSearch *cis1 = a;
- const CollItemSearch *cis2 = b;
+ char name_buf[UI_MAX_DRAW_STR];
- if (BLI_strcasecmp(cis1->name, cis2->name) > 0) {
- return 1;
+ /* If no item has an own icon to display, libraries can use the library icons rather than the
+ * name prefix for showing the library status. */
+ int name_prefix_offset = cis->name_prefix_offset;
+ if (!has_id_icon && cis->is_id && !requires_exact_data_name) {
+ cis->iconid = UI_icon_from_library(cis->data);
+ /* No need to re-allocate, string should be shorter than before (lib status prefix is
+ * removed). */
+ BKE_id_full_name_ui_prefix_get(name_buf, cis->data, false, UI_SEP_CHAR, &name_prefix_offset);
+ BLI_assert(strlen(name_buf) <= MEM_allocN_len(cis->name));
+ strcpy(cis->name, name_buf);
}
- return 0;
+
+ return UI_search_item_add(items,
+ cis->name,
+ cis->data,
+ cis->iconid,
+ cis->has_sep_char ? UI_BUT_HAS_SEP_CHAR : 0,
+ name_prefix_offset);
}
void ui_rna_collection_search_update_fn(const struct bContext *C,
@@ -392,9 +409,7 @@ void ui_rna_collection_search_update_fn(const struct bContext *C,
{
uiRNACollectionSearch *data = arg;
const int flag = RNA_property_flag(data->target_prop);
- int i = 0;
ListBase *items_list = MEM_callocN(sizeof(ListBase), "items_list");
- CollItemSearch *cis;
const bool is_ptr_target = (RNA_property_type(data->target_prop) == PROP_POINTER);
/* For non-pointer properties, UI code acts entirely based on the item's name. So the name has to
* match the RNA name exactly. So only for pointer properties, the name can be modified to add
@@ -405,13 +420,10 @@ void ui_rna_collection_search_update_fn(const struct bContext *C,
char *name;
bool has_id_icon = false;
- /* Prepare matching all words. */
- const size_t str_len = strlen(str);
- const int words_max = BLI_string_max_possible_word_count(str_len);
- int(*words)[2] = BLI_array_alloca(words, words_max);
- const int words_len = BLI_string_find_split_words(str, str_len, ' ', words, words_max);
+ StringSearch *search = skip_filter ? NULL : BLI_string_search_new();
/* build a temporary list of relevant items first */
+ int item_index = 0;
RNA_PROP_BEGIN (&data->search_ptr, itemptr, data->search_prop) {
if (flag & PROP_ID_SELF_CHECK) {
@@ -456,54 +468,50 @@ void ui_rna_collection_search_update_fn(const struct bContext *C,
}
if (name) {
- if (skip_filter ||
- BLI_string_all_words_matched(name + name_prefix_offset, str, words, words_len)) {
- cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch");
- cis->data = itemptr.data;
- cis->name = BLI_strdup(name);
- cis->index = i;
- cis->iconid = iconid;
- cis->is_id = is_id;
- cis->name_prefix_offset = name_prefix_offset;
- cis->has_sep_char = has_sep_char;
- BLI_addtail(items_list, cis);
+ CollItemSearch *cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch");
+ cis->data = itemptr.data;
+ cis->name = BLI_strdup(name);
+ cis->index = item_index;
+ cis->iconid = iconid;
+ cis->is_id = is_id;
+ cis->name_prefix_offset = name_prefix_offset;
+ cis->has_sep_char = has_sep_char;
+ if (!skip_filter) {
+ BLI_string_search_add(search, name, cis);
}
+ BLI_addtail(items_list, cis);
if (name != name_buf) {
MEM_freeN(name);
}
}
- i++;
+ item_index++;
}
RNA_PROP_END;
- BLI_listbase_sort(items_list, sort_search_items_list);
-
- /* add search items from temporary list */
- for (cis = items_list->first; cis; cis = cis->next) {
- /* If no item has an own icon to display, libraries can use the library icons rather than the
- * name prefix for showing the library status. */
- int name_prefix_offset = cis->name_prefix_offset;
- if (!has_id_icon && cis->is_id && !requires_exact_data_name) {
- cis->iconid = UI_icon_from_library(cis->data);
- /* No need to re-allocate, string should be shorter than before (lib status prefix is
- * removed). */
- BKE_id_full_name_ui_prefix_get(name_buf, cis->data, false, UI_SEP_CHAR, &name_prefix_offset);
- BLI_assert(strlen(name_buf) <= MEM_allocN_len(cis->name));
- strcpy(cis->name, name_buf);
+ if (skip_filter) {
+ LISTBASE_FOREACH (CollItemSearch *, cis, items_list) {
+ if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) {
+ break;
+ }
}
+ }
+ else {
+ CollItemSearch **filtered_items;
+ int filtered_amount = BLI_string_search_query(search, str, (void ***)&filtered_items);
- if (!UI_search_item_add(items,
- cis->name,
- cis->data,
- cis->iconid,
- cis->has_sep_char ? UI_BUT_HAS_SEP_CHAR : 0,
- name_prefix_offset)) {
- break;
+ for (int i = 0; i < filtered_amount; i++) {
+ CollItemSearch *cis = filtered_items[i];
+ if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) {
+ break;
+ }
}
+
+ MEM_freeN(filtered_items);
+ BLI_string_search_free(search);
}
- for (cis = items_list->first; cis; cis = cis->next) {
+ LISTBASE_FOREACH (CollItemSearch *, cis, items_list) {
MEM_freeN(cis->name);
}
BLI_freelistN(items_list);
@@ -511,21 +519,15 @@ void ui_rna_collection_search_update_fn(const struct bContext *C,
}
/***************************** ID Utilities *******************************/
-int UI_icon_from_id(ID *id)
+int UI_icon_from_id(const ID *id)
{
- Object *ob;
- PointerRNA ptr;
- short idcode;
-
if (id == NULL) {
return ICON_NONE;
}
- idcode = GS(id->name);
-
/* exception for objects */
- if (idcode == ID_OB) {
- ob = (Object *)id;
+ if (GS(id->name) == ID_OB) {
+ Object *ob = (Object *)id;
if (ob->type == OB_EMPTY) {
return ICON_EMPTY_DATA;
@@ -535,7 +537,8 @@ int UI_icon_from_id(ID *id)
/* otherwise get it through RNA, creating the pointer
* will set the right type, also with subclassing */
- RNA_id_pointer_create(id, &ptr);
+ PointerRNA ptr;
+ RNA_id_pointer_create((ID *)id, &ptr);
return (ptr.type) ? RNA_struct_ui_icon(ptr.type) : ICON_NONE;
}
@@ -544,7 +547,7 @@ int UI_icon_from_id(ID *id)
int UI_icon_from_report_type(int type)
{
if (type & RPT_ERROR_ALL) {
- return ICON_ERROR;
+ return ICON_CANCEL;
}
if (type & RPT_WARNING_ALL) {
return ICON_ERROR;
@@ -552,7 +555,62 @@ int UI_icon_from_report_type(int type)
if (type & RPT_INFO_ALL) {
return ICON_INFO;
}
- return ICON_NONE;
+ if (type & RPT_DEBUG_ALL) {
+ return ICON_SYSTEM;
+ }
+ if (type & RPT_PROPERTY) {
+ return ICON_OPTIONS;
+ }
+ if (type & RPT_OPERATOR) {
+ return ICON_CHECKMARK;
+ }
+ return ICON_INFO;
+}
+
+int UI_icon_colorid_from_report_type(int type)
+{
+ if (type & RPT_ERROR_ALL) {
+ return TH_INFO_ERROR;
+ }
+ if (type & RPT_WARNING_ALL) {
+ return TH_INFO_WARNING;
+ }
+ if (type & RPT_INFO_ALL) {
+ return TH_INFO_INFO;
+ }
+ if (type & RPT_DEBUG_ALL) {
+ return TH_INFO_DEBUG;
+ }
+ if (type & RPT_PROPERTY) {
+ return TH_INFO_PROPERTY;
+ }
+ if (type & RPT_OPERATOR) {
+ return TH_INFO_OPERATOR;
+ }
+ return TH_INFO_WARNING;
+}
+
+int UI_text_colorid_from_report_type(int type)
+{
+ if (type & RPT_ERROR_ALL) {
+ return TH_INFO_ERROR_TEXT;
+ }
+ if (type & RPT_WARNING_ALL) {
+ return TH_INFO_WARNING_TEXT;
+ }
+ if (type & RPT_INFO_ALL) {
+ return TH_INFO_INFO_TEXT;
+ }
+ if (type & RPT_DEBUG_ALL) {
+ return TH_INFO_DEBUG_TEXT;
+ }
+ if (type & RPT_PROPERTY) {
+ return TH_INFO_PROPERTY_TEXT;
+ }
+ if (type & RPT_OPERATOR) {
+ return TH_INFO_OPERATOR_TEXT;
+ }
+ return TH_INFO_WARNING_TEXT;
}
/********************************** Misc **************************************/
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 868f62c89c9..5c59d0edeb5 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -1311,7 +1311,7 @@ static void widgetbase_draw_ex(uiWidgetBase *wtb,
tria_col[3] = wcol->item[3];
}
- /* Draw everything in one drawcall */
+ /* Draw everything in one draw-call. */
if (inner_col1[3] || inner_col2[3] || outline_col[3] || emboss_col[3] || tria_col[3] ||
show_alpha_checkers) {
widgetbase_set_uniform_colors_ubv(
@@ -1533,25 +1533,22 @@ static void ui_text_clip_right_ex(const uiFontStyle *fstyle,
{
BLI_assert(str[0]);
- /* If the trailing ellipsis takes more than 20% of all available width, just cut the string
- * (as using the ellipsis would remove even more useful chars, and we cannot show much
- * already!).
- */
- if (sep_strwidth / okwidth > 0.2f) {
- float tmp;
- const int l_end = BLF_width_to_strlen(fstyle->uifont_id, str, max_len, okwidth, &tmp);
- str[l_end] = '\0';
+ /* How many BYTES (not characters) of this utf-8 string can fit, along with appended ellipsis. */
+ int l_end = BLF_width_to_strlen(fstyle->uifont_id, str, max_len, okwidth - sep_strwidth, NULL);
+
+ if (l_end > 0) {
+ /* At least one character, so clip and add the ellipsis. */
+ memcpy(str + l_end, sep, sep_len + 1); /* +1 for trailing '\0'. */
if (r_final_len) {
- *r_final_len = (size_t)l_end;
+ *r_final_len = (size_t)(l_end) + sep_len;
}
}
else {
- float tmp;
- const int l_end = BLF_width_to_strlen(
- fstyle->uifont_id, str, max_len, okwidth - sep_strwidth, &tmp);
- memcpy(str + l_end, sep, sep_len + 1); /* +1 for trailing '\0'. */
+ /* Otherwise fit as much as we can without adding an ellipsis. */
+ l_end = BLF_width_to_strlen(fstyle->uifont_id, str, max_len, okwidth, NULL);
+ str[l_end] = '\0';
if (r_final_len) {
- *r_final_len = (size_t)(l_end) + sep_len;
+ *r_final_len = (size_t)l_end;
}
}
}
@@ -2352,7 +2349,7 @@ static void widget_draw_text_icon(const uiFontStyle *fstyle,
int icon_size = BLI_rcti_size_y(rect);
int text_size = 0;
- /* This is a bit britle, but avoids adding an 'UI_BUT_HAS_LABEL' flag to but... */
+ /* This is a bit brittle, but avoids adding an 'UI_BUT_HAS_LABEL' flag to but... */
if (icon_size > BLI_rcti_size_x(rect)) {
/* button is not square, it has extra height for label */
text_size = UI_UNIT_Y;
@@ -2413,7 +2410,9 @@ static void widget_draw_text_icon(const uiFontStyle *fstyle,
rect->xmin += 0.2f * U.widget_unit;
}
- widget_draw_icon(but, icon, alpha, rect, wcol->text);
+ /* By default icon is the color of text, but can optionally override with but->col. */
+ widget_draw_icon(but, icon, alpha, rect, (but->col[3] != 0) ? but->col : wcol->text);
+
if (show_menu_icon) {
BLI_assert(but->block->content_hints & UI_BLOCK_CONTAINS_SUBMENU_BUT);
widget_draw_submenu_tria(but, rect, wcol);
@@ -3617,7 +3616,7 @@ static void widget_scroll(
rect1.xmin = rect1.xmin + ceilf(fac * (value - but->softmin));
rect1.xmax = rect1.xmin + ceilf(fac * (but->a1 - but->softmin));
- /* ensure minimium size */
+ /* Ensure minimum size. */
const float min = BLI_rcti_size_y(rect);
if (BLI_rcti_size_x(&rect1) < min) {
@@ -3634,7 +3633,7 @@ static void widget_scroll(
rect1.ymax = rect1.ymax - ceilf(fac * (value - but->softmin));
rect1.ymin = rect1.ymax - ceilf(fac * (but->a1 - but->softmin));
- /* ensure minimium size */
+ /* Ensure minimum size. */
const float min = BLI_rcti_size_x(rect);
if (BLI_rcti_size_y(&rect1) < min) {
@@ -3671,7 +3670,7 @@ static void widget_progressbar(
const float offs = wcol->roundness * BLI_rcti_size_y(&rect_prog);
float w = value * BLI_rcti_size_x(&rect_prog);
- /* ensure minimium size */
+ /* Ensure minimum size. */
w = MAX2(w, offs);
rect_bar.xmax = rect_bar.xmin + w;
@@ -5224,8 +5223,7 @@ void ui_draw_tooltip_background(const uiStyle *UNUSED(style), uiBlock *UNUSED(bl
*
* \param state: The state of the button,
* typically #UI_ACTIVE, #UI_BUT_DISABLED, #UI_BUT_INACTIVE.
- * \param use_sep: When true, characters after the last #UI_SEP_CHAR are right aligned,
- * use for displaying key shortcuts.
+ * \param separator_type: The kind of separator which controls if and how the string is clipped.
* \param r_xmax: The right hand position of the text, this takes into the icon,
* padding and text clipping when there is not enough room to display the full text.
*/
@@ -5273,7 +5271,7 @@ void ui_draw_menu_item(const uiFontStyle *fstyle,
rect->xmax -= BLF_width(fstyle->uifont_id, cpoin + 1, INT_MAX) + UI_DPI_ICON_SIZE;
}
else if (separator_type == UI_MENU_ITEM_SEPARATOR_HINT) {
- /* Deterimine max-width for the hint string to leave the name string un-clipped (if there's
+ /* Determine max-width for the hint string to leave the name string un-clipped (if there's
* enough space to display it). */
const int available_width = BLI_rcti_size_x(rect) - padding;
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index f115618c13b..e4dad0f1a53 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -616,7 +616,7 @@ static void ui_view2d_curRect_validate_resize(View2D *v2d, bool resize)
if ((width != curwidth) || (height != curheight)) {
float temp, dh;
- /* resize from centerpoint, unless otherwise specified */
+ /* Resize from center-point, unless otherwise specified. */
if (width != curwidth) {
if (v2d->keepofs & V2D_LOCKOFS_X) {
cur->xmax += width - BLI_rctf_size_x(cur);
@@ -1058,7 +1058,7 @@ void UI_view2d_zoom_cache_reset(void)
/* While scaling we can accumulate fonts at many sizes (~20 or so).
* Not an issue with embedded font, but can use over 500Mb with i18n ones! See T38244. */
- /* note: only some views draw text, we could check for this case to avoid clearning cache */
+ /* Note: only some views draw text, we could check for this case to avoid cleaning cache. */
BLF_cache_clear();
}
@@ -1895,7 +1895,7 @@ void UI_view2d_scroller_size_get(const View2D *v2d, float *r_x, float *r_y)
*
* \param r_x, r_y: scale on each axis
*/
-void UI_view2d_scale_get(View2D *v2d, float *r_x, float *r_y)
+void UI_view2d_scale_get(const View2D *v2d, float *r_x, float *r_y)
{
if (r_x) {
*r_x = UI_view2d_scale_get_x(v2d);
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index 222f03ee1d8..7453cd17868 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -46,7 +46,7 @@
#include "UI_interface.h"
#include "UI_view2d.h"
-#include "PIL_time.h" /* USER_ZOOM_CONT */
+#include "PIL_time.h" /* USER_ZOOM_CONTINUE */
/* -------------------------------------------------------------------- */
/** \name Internal Utilities
@@ -1106,14 +1106,9 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op)
float dx = RNA_float_get(op->ptr, "deltax") / U.dpi_fac;
float dy = RNA_float_get(op->ptr, "deltay") / U.dpi_fac;
- if (U.uiflag & USER_ZOOM_INVERT) {
- dx *= -1;
- dy *= -1;
- }
-
/* 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_CONT) && vzd->timer) { /* XXX store this setting as RNA prop? */
+ if ((U.viewzoom == USER_ZOOM_CONTINUE) && vzd->timer) { /* XXX store this setting as RNA prop? */
const double time = PIL_check_seconds_timer();
const float time_step = (float)(time - vzd->timer_lastdraw);
@@ -1232,26 +1227,53 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, const wmEvent *even
vzd->lastx = event->prevx;
vzd->lasty = event->prevy;
- /* As we have only 1D information (magnify value), feed both axes
- * with magnify information that is stored in x axis
- */
- float fac = 0.01f * (event->prevx - event->x);
- float dx = fac * BLI_rctf_size_x(&v2d->cur) / 10.0f;
+ float facx, facy;
+ float zoomfac = 0.01f;
+
+ /* Some view2d's (graph) don't have min/max zoom, or extreme ones. */
+ if (v2d->maxzoom > 0.0f) {
+ zoomfac = clamp_f(0.001f * v2d->maxzoom, 0.001f, 0.01f);
+ }
+
if (event->type == MOUSEPAN) {
- fac = 0.01f * (event->prevy - event->y);
+ facx = zoomfac * WM_event_absolute_delta_x(event);
+ facy = zoomfac * WM_event_absolute_delta_y(event);
+
+ if (U.uiflag & USER_ZOOM_INVERT) {
+ facx *= -1.0f;
+ facy *= -1.0f;
+ }
+ }
+ else { /* MOUSEZOOM */
+ facx = facy = zoomfac * WM_event_absolute_delta_x(event);
+ }
+
+ /* Only respect user setting zoom axis if the view does not have any zoom restrictions
+ * any will be scaled uniformly. */
+ if (((v2d->keepzoom & (V2D_LOCKZOOM_X | V2D_LOCKZOOM_Y)) == 0) &&
+ (v2d->keepzoom & V2D_KEEPASPECT)) {
+ if (U.uiflag & USER_ZOOM_HORIZ) {
+ facy = 0.0f;
+ }
+ else {
+ facx = 0.0f;
+ }
}
- float dy = fac * BLI_rctf_size_y(&v2d->cur) / 10.0f;
/* support trackpad zoom to always zoom entirely - the v2d code uses portrait or
* landscape exceptions */
if (v2d->keepzoom & V2D_KEEPASPECT) {
- if (fabsf(dx) > fabsf(dy)) {
- dy = dx;
+ if (fabsf(facx) > fabsf(facy)) {
+ facy = facx;
}
else {
- dx = dy;
+ facx = facy;
}
}
+
+ const float dx = facx * BLI_rctf_size_x(&v2d->cur);
+ const float dy = facy * BLI_rctf_size_y(&v2d->cur);
+
RNA_float_set(op->ptr, "deltax", dx);
RNA_float_set(op->ptr, "deltay", dy);
@@ -1282,7 +1304,7 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, const wmEvent *even
/* add temp handler */
WM_event_add_modal_handler(C, op);
- if (U.viewzoom == USER_ZOOM_CONT) {
+ if (U.viewzoom == USER_ZOOM_CONTINUE) {
/* needs a timer to continue redrawing */
vzd->timer = WM_event_add_timer(CTX_wm_manager(C), window, TIMER, 0.01f);
vzd->timer_lastdraw = PIL_check_seconds_timer();
@@ -1320,19 +1342,13 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, const wmEvent *event
/* x-axis transform */
dist = BLI_rcti_size_x(&v2d->mask) / 2.0f;
- len_old[0] = fabsf(vzd->lastx - vzd->region->winrct.xmin - dist);
- len_new[0] = fabsf(event->x - vzd->region->winrct.xmin - dist);
-
- len_old[0] *= zoomfac * BLI_rctf_size_x(&v2d->cur);
- len_new[0] *= zoomfac * BLI_rctf_size_x(&v2d->cur);
+ len_old[0] = zoomfac * fabsf(vzd->lastx - vzd->region->winrct.xmin - dist);
+ len_new[0] = zoomfac * fabsf(event->x - vzd->region->winrct.xmin - dist);
/* y-axis transform */
dist = BLI_rcti_size_y(&v2d->mask) / 2.0f;
- len_old[1] = fabsf(vzd->lasty - vzd->region->winrct.ymin - dist);
- len_new[1] = fabsf(event->y - vzd->region->winrct.ymin - dist);
-
- len_old[1] *= zoomfac * BLI_rctf_size_y(&v2d->cur);
- len_new[1] *= zoomfac * BLI_rctf_size_y(&v2d->cur);
+ len_old[1] = zoomfac * fabsf(vzd->lasty - vzd->region->winrct.ymin - dist);
+ len_new[1] = zoomfac * fabsf(event->y - vzd->region->winrct.ymin - dist);
/* Calculate distance */
if (v2d->keepzoom & V2D_KEEPASPECT) {
@@ -1343,40 +1359,44 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, const wmEvent *event
dx = len_new[0] - len_old[0];
dy = len_new[1] - len_old[1];
}
- }
- else {
- /* 'continuous' or 'dolly' */
- float fac;
- /* x-axis transform */
- fac = zoomfac * (event->x - vzd->lastx);
- dx = fac * BLI_rctf_size_x(&v2d->cur);
- /* y-axis transform */
- fac = zoomfac * (event->y - vzd->lasty);
- dy = fac * BLI_rctf_size_y(&v2d->cur);
+ dx *= BLI_rctf_size_x(&v2d->cur);
+ dy *= BLI_rctf_size_y(&v2d->cur);
+ }
+ else { /* USER_ZOOM_CONTINUE or USER_ZOOM_DOLLY */
+ float facx = zoomfac * (event->x - vzd->lastx);
+ float facy = zoomfac * (event->y - vzd->lasty);
/* Only respect user setting zoom axis if the view does not have any zoom restrictions
* any will be scaled uniformly */
if ((v2d->keepzoom & V2D_LOCKZOOM_X) == 0 && (v2d->keepzoom & V2D_LOCKZOOM_Y) == 0 &&
(v2d->keepzoom & V2D_KEEPASPECT)) {
if (U.uiflag & USER_ZOOM_HORIZ) {
- dy = 0;
+ facy = 0.0f;
}
else {
- dx = 0;
+ facx = 0.0f;
}
}
- }
- /* support zoom to always zoom entirely - the v2d code uses portrait or
- * landscape exceptions */
- if (v2d->keepzoom & V2D_KEEPASPECT) {
- if (fabsf(dx) > fabsf(dy)) {
- dy = dx;
- }
- else {
- dx = dy;
+ /* support zoom to always zoom entirely - the v2d code uses portrait or
+ * landscape exceptions */
+ if (v2d->keepzoom & V2D_KEEPASPECT) {
+ if (fabsf(facx) > fabsf(facy)) {
+ facy = facx;
+ }
+ else {
+ facx = facy;
+ }
}
+
+ dx = facx * BLI_rctf_size_x(&v2d->cur);
+ dy = facy * BLI_rctf_size_y(&v2d->cur);
+ }
+
+ if (U.uiflag & USER_ZOOM_INVERT) {
+ dx *= -1.0f;
+ dy *= -1.0f;
}
/* set transform amount, and add current deltas to stored total delta (for redo) */
@@ -1390,7 +1410,7 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, const wmEvent *event
* - Continuous zoom only depends on distance of mouse
* to starting point to determine rate of change.
*/
- if (U.viewzoom != USER_ZOOM_CONT) { /* XXX store this setting as RNA prop? */
+ if (U.viewzoom != USER_ZOOM_CONTINUE) { /* XXX store this setting as RNA prop? */
vzd->lastx = event->x;
vzd->lasty = event->y;
}
@@ -1726,8 +1746,7 @@ void UI_view2d_smooth_view(bContext *C, ARegion *region, const rctf *cur, const
if (v2d->smooth_timer) {
WM_event_remove_timer(wm, win, v2d->smooth_timer);
}
- /* TIMER1 is hardcoded in keymap */
- /* max 30 frs/sec */
+ /* TIMER1 is hard-coded in key-map. */
v2d->smooth_timer = WM_event_add_timer(wm, win, TIMER1, 1.0 / 100.0);
ok = true;
@@ -2204,7 +2223,7 @@ static int scroller_activate_invoke(bContext *C, wmOperator *op, const wmEvent *
scroller_activate_init(C, op, event, in_scroller);
v2dScrollerMove *vsm = (v2dScrollerMove *)op->customdata;
- /* support for quick jump to location - gtk and qt do this on linux */
+ /* Support for quick jump to location - GTK and QT do this on Linux. */
if (event->type == MIDDLEMOUSE) {
switch (vsm->scroller) {
case 'h': /* horizontal scroller - so only horizontal movement
diff --git a/source/blender/editors/io/io_alembic.c b/source/blender/editors/io/io_alembic.c
index 636e6688971..a66f53ea839 100644
--- a/source/blender/editors/io/io_alembic.c
+++ b/source/blender/editors/io/io_alembic.c
@@ -35,19 +35,16 @@
# include "MEM_guardedalloc.h"
-# include "DNA_mesh_types.h"
# include "DNA_modifier_types.h"
# include "DNA_object_types.h"
# include "DNA_scene_types.h"
# include "DNA_space_types.h"
# include "BKE_context.h"
-# include "BKE_global.h"
# include "BKE_main.h"
# include "BKE_report.h"
# include "BLI_listbase.h"
-# include "BLI_math_vector.h"
# include "BLI_path_util.h"
# include "BLI_string.h"
# include "BLI_utildefines.h"
diff --git a/source/blender/editors/io/io_cache.c b/source/blender/editors/io/io_cache.c
index b73b8abccfe..1e66a86c8fd 100644
--- a/source/blender/editors/io/io_cache.c
+++ b/source/blender/editors/io/io_cache.c
@@ -26,7 +26,6 @@
#include "DNA_cachefile_types.h"
#include "DNA_space_types.h"
-#include "BLI_listbase.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
diff --git a/source/blender/editors/io/io_collada.c b/source/blender/editors/io/io_collada.c
index 200786ca99d..2bf975cc4f5 100644
--- a/source/blender/editors/io/io_collada.c
+++ b/source/blender/editors/io/io_collada.c
@@ -29,7 +29,6 @@
# include "BLI_utildefines.h"
# include "BKE_context.h"
-# include "BKE_global.h"
# include "BKE_main.h"
# include "BKE_object.h"
# include "BKE_report.h"
@@ -37,7 +36,6 @@
# include "DEG_depsgraph.h"
# include "ED_object.h"
-# include "ED_screen.h"
# include "RNA_access.h"
# include "RNA_define.h"
diff --git a/source/blender/editors/lattice/editlattice_select.c b/source/blender/editors/lattice/editlattice_select.c
index 4497ca1a379..cb3f9a89e62 100644
--- a/source/blender/editors/lattice/editlattice_select.c
+++ b/source/blender/editors/lattice/editlattice_select.c
@@ -108,7 +108,7 @@ bool ED_lattice_deselect_all_multi(struct bContext *C)
static int lattice_select_random_exec(bContext *C, wmOperator *op)
{
- const float randfac = RNA_float_get(op->ptr, "percent") / 100.0f;
+ const float randfac = RNA_float_get(op->ptr, "ratio");
const int seed = WM_operator_properties_select_random_seed_increment_get(op);
const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
diff --git a/source/blender/editors/lattice/editlattice_undo.c b/source/blender/editors/lattice/editlattice_undo.c
index 3a5734706f1..3ffbc3712fc 100644
--- a/source/blender/editors/lattice/editlattice_undo.c
+++ b/source/blender/editors/lattice/editlattice_undo.c
@@ -212,8 +212,11 @@ static bool lattice_undosys_step_encode(struct bContext *C, Main *bmain, UndoSte
return true;
}
-static void lattice_undosys_step_decode(
- struct bContext *C, struct Main *bmain, UndoStep *us_p, int UNUSED(dir), bool UNUSED(is_final))
+static void lattice_undosys_step_decode(struct bContext *C,
+ struct Main *bmain,
+ UndoStep *us_p,
+ const eUndoStepDir UNUSED(dir),
+ bool UNUSED(is_final))
{
LatticeUndoStep *us = (LatticeUndoStep *)us_p;
diff --git a/source/blender/editors/lattice/lattice_ops.c b/source/blender/editors/lattice/lattice_ops.c
index d5505c00132..3f96b8a303b 100644
--- a/source/blender/editors/lattice/lattice_ops.c
+++ b/source/blender/editors/lattice/lattice_ops.c
@@ -23,15 +23,10 @@
#include "DNA_scene_types.h"
-#include "RNA_access.h"
-
#include "WM_api.h"
-#include "WM_types.h"
#include "ED_lattice.h"
-#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
#include "lattice_intern.h"
diff --git a/source/blender/editors/mask/mask_add.c b/source/blender/editors/mask/mask_add.c
index d7b3d74bc7e..1226cc57359 100644
--- a/source/blender/editors/mask/mask_add.c
+++ b/source/blender/editors/mask/mask_add.c
@@ -507,6 +507,9 @@ static int add_vertex_handle_cyclic(
static int add_vertex_exec(bContext *C, wmOperator *op)
{
+ MaskViewLockState lock_state;
+ ED_mask_view_lock_state_store(C, &lock_state);
+
Mask *mask = CTX_data_edit_mask(C);
if (mask == NULL) {
/* if there's no active mask, create one */
@@ -548,6 +551,8 @@ static int add_vertex_exec(bContext *C, wmOperator *op)
DEG_id_tag_update(&mask->id, ID_RECALC_GEOMETRY);
+ ED_mask_view_lock_state_restore_no_jump(C, &lock_state);
+
return OPERATOR_FINISHED;
}
@@ -690,6 +695,9 @@ void MASK_OT_add_feather_vertex(wmOperatorType *ot)
static int create_primitive_from_points(
bContext *C, wmOperator *op, const float (*points)[2], int num_points, char handle_type)
{
+ MaskViewLockState lock_state;
+ ED_mask_view_lock_state_store(C, &lock_state);
+
ScrArea *area = CTX_wm_area(C);
int size = RNA_float_get(op->ptr, "size");
@@ -752,6 +760,8 @@ static int create_primitive_from_points(
DEG_id_tag_update(&mask->id, ID_RECALC_GEOMETRY);
+ ED_mask_view_lock_state_restore_no_jump(C, &lock_state);
+
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/mask/mask_draw.c b/source/blender/editors/mask/mask_draw.c
index 89fd2fa9b62..d3fa0e93597 100644
--- a/source/blender/editors/mask/mask_draw.c
+++ b/source/blender/editors/mask/mask_draw.c
@@ -539,7 +539,7 @@ static void draw_spline_curve(const bContext *C,
uint tot_feather_point;
float(*feather_points)[2];
- diff_points = BKE_mask_spline_differentiate_with_resolution(spline, &tot_diff_point, resol);
+ diff_points = BKE_mask_spline_differentiate_with_resolution(spline, resol, &tot_diff_point);
if (!diff_points) {
return;
@@ -550,7 +550,7 @@ static void draw_spline_curve(const bContext *C,
}
feather_points = BKE_mask_spline_feather_differentiated_points_with_resolution(
- spline, &tot_feather_point, resol, (is_fill != false));
+ spline, resol, (is_fill != false), &tot_feather_point);
/* draw feather */
mask_spline_feather_color_get(mask_layer, spline, is_spline_sel, rgb_tmp);
diff --git a/source/blender/editors/mask/mask_edit.c b/source/blender/editors/mask/mask_edit.c
index 663ae0097ad..f1041d062a8 100644
--- a/source/blender/editors/mask/mask_edit.c
+++ b/source/blender/editors/mask/mask_edit.c
@@ -184,3 +184,39 @@ void ED_operatormacros_mask(void)
}
/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Lock-to-selection viewport preservation
+ * \{ */
+
+void ED_mask_view_lock_state_store(const bContext *C, MaskViewLockState *state)
+{
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+ if (space_clip != NULL) {
+ ED_clip_view_lock_state_store(C, &state->space_clip_state);
+ }
+}
+
+void ED_mask_view_lock_state_restore_no_jump(const bContext *C, const MaskViewLockState *state)
+{
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+ if (space_clip != NULL) {
+ if ((space_clip->flag & SC_LOCK_SELECTION) == 0) {
+ /* Early output if the editor is not locked to selection.
+ * Avoids forced dependency graph evaluation here. */
+ return;
+ }
+
+ /* Mask's lock-to-selection requires deformed splines to be evaluated to calculate bounds of
+ * points after animation has been evaluated. The restore-no-jump type of function does
+ * calculation of new offset for the view for an updated state of mask to cancel the offset out
+ * by modifying locked offset. In order to do such calculation mask needs to be evaluated after
+ * modification by an operator. */
+ struct Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+ (void)depsgraph;
+
+ ED_clip_view_lock_state_restore_no_jump(C, &state->space_clip_state);
+ }
+}
+
+/** \} */
diff --git a/source/blender/editors/mask/mask_intern.h b/source/blender/editors/mask/mask_intern.h
index f6990583383..ee1784011ea 100644
--- a/source/blender/editors/mask/mask_intern.h
+++ b/source/blender/editors/mask/mask_intern.h
@@ -23,6 +23,8 @@
#pragma once
+#include "ED_clip.h"
+
struct Mask;
struct bContext;
struct wmOperatorType;
@@ -92,6 +94,19 @@ void ED_mask_select_flush_all(struct Mask *mask);
bool ED_maskedit_poll(struct bContext *C);
bool ED_maskedit_mask_poll(struct bContext *C);
+/* Generalized solution for preserving editor viewport when making changes while lock-to-selection
+ * is enabled.
+ * Any mask operator can use this API, without worrying that some editors do not have an idea of
+ * lock-to-selection. */
+
+typedef struct MaskViewLockState {
+ ClipViewLockState space_clip_state;
+} MaskViewLockState;
+
+void ED_mask_view_lock_state_store(const struct bContext *C, MaskViewLockState *state);
+void ED_mask_view_lock_state_restore_no_jump(const struct bContext *C,
+ const MaskViewLockState *state);
+
/* mask_query.c */
bool ED_mask_find_nearest_diff_point(const struct bContext *C,
struct Mask *mask,
diff --git a/source/blender/editors/mask/mask_ops.c b/source/blender/editors/mask/mask_ops.c
index 25cc39bf9a0..14f81520b9a 100644
--- a/source/blender/editors/mask/mask_ops.c
+++ b/source/blender/editors/mask/mask_ops.c
@@ -226,13 +226,19 @@ typedef struct SlidePointData {
int width, height;
float prev_mouse_coord[2];
+
+ /* Previous clip coordinate which was resolved from mouse position (0, 0).
+ * Is used to compensate for view offset moving in-between of mouse events when
+ * lock-to-selection is enabled. */
+ float prev_zero_coord[2];
+
float no[2];
bool is_curvature_only, is_accurate, is_initial_feather, is_overall_feather;
bool is_sliding_new_point;
- /* Data needed to restre the state. */
+ /* Data needed to restore the state. */
float vec[3][3];
char old_h1, old_h2;
@@ -431,6 +437,9 @@ static void *slide_point_customdata(bContext *C, wmOperator *op, const wmEvent *
const float threshold = 19;
eMaskWhichHandle which_handle;
+ MaskViewLockState lock_state;
+ ED_mask_view_lock_state_store(C, &lock_state);
+
ED_mask_mouse_pos(area, region, event->mval, co);
ED_mask_get_size(area, &width, &height);
@@ -530,7 +539,15 @@ static void *slide_point_customdata(bContext *C, wmOperator *op, const wmEvent *
}
customdata->which_handle = which_handle;
+ {
+ WM_event_add_notifier(C, NC_MASK | NA_EDITED, mask);
+ DEG_id_tag_update(&mask->id, 0);
+
+ ED_mask_view_lock_state_restore_no_jump(C, &lock_state);
+ }
+
ED_mask_mouse_pos(area, region, event->mval, customdata->prev_mouse_coord);
+ ED_mask_mouse_pos(area, region, (int[2]){0, 0}, customdata->prev_zero_coord);
}
return customdata;
@@ -655,10 +672,24 @@ static int slide_point_modal(bContext *C, wmOperator *op, const wmEvent *event)
ED_mask_mouse_pos(area, region, event->mval, co);
sub_v2_v2v2(delta, co, data->prev_mouse_coord);
+ copy_v2_v2(data->prev_mouse_coord, co);
+
+ /* Compensate for possibly moved view offset since the last event.
+ * The idea is to see how mapping of a fixed and known position did change. */
+ {
+ float zero_coord[2];
+ ED_mask_mouse_pos(area, region, (int[2]){0, 0}, zero_coord);
+
+ float zero_delta[2];
+ sub_v2_v2v2(zero_delta, zero_coord, data->prev_zero_coord);
+ sub_v2_v2(delta, zero_delta);
+
+ copy_v2_v2(data->prev_zero_coord, zero_coord);
+ }
+
if (data->is_accurate) {
mul_v2_fl(delta, 0.2f);
}
- copy_v2_v2(data->prev_mouse_coord, co);
if (data->action == SLIDE_ACTION_HANDLE) {
float new_handle[2];
@@ -832,7 +863,7 @@ static int slide_point_modal(bContext *C, wmOperator *op, const wmEvent *event)
if (event->type == data->event_invoke_type && event->val == KM_RELEASE) {
Scene *scene = CTX_data_scene(C);
- /* dont key sliding feather uw's */
+ /* Don't key sliding feather UW's. */
if ((data->action == SLIDE_ACTION_FEATHER && data->uw) == false) {
if (IS_AUTOKEY_ON(scene)) {
ED_mask_layer_shape_auto_key(data->mask_layer, CFRA);
@@ -966,6 +997,9 @@ static SlideSplineCurvatureData *slide_spline_curvature_customdata(bContext *C,
float u, co[2];
BezTriple *next_bezt;
+ MaskViewLockState lock_state;
+ ED_mask_view_lock_state_store(C, &lock_state);
+
ED_mask_mouse_pos(CTX_wm_area(C), CTX_wm_region(C), event->mval, co);
if (!ED_mask_find_nearest_diff_point(C,
@@ -1019,7 +1053,7 @@ static SlideSplineCurvatureData *slide_spline_curvature_customdata(bContext *C,
slide_data->bezt_backup = *slide_data->adjust_bezt;
slide_data->other_bezt_backup = *slide_data->other_bezt;
- /* Let's dont touch other side of the point for now, so set handle to FREE. */
+ /* Let's don't touch other side of the point for now, so set handle to FREE. */
if (u < 0.5f) {
if (slide_data->adjust_bezt->h2 <= HD_VECT) {
slide_data->adjust_bezt->h2 = HD_FREE;
@@ -1047,6 +1081,9 @@ static SlideSplineCurvatureData *slide_spline_curvature_customdata(bContext *C,
mask_layer->act_point = point;
ED_mask_select_flush_all(mask);
+ DEG_id_tag_update(&mask->id, 0);
+ ED_mask_view_lock_state_restore_no_jump(C, &lock_state);
+
return slide_data;
}
@@ -1233,7 +1270,7 @@ static int slide_spline_curvature_modal(bContext *C, wmOperator *op, const wmEve
case LEFTMOUSE:
case RIGHTMOUSE:
if (event->type == slide_data->event_invoke_type && event->val == KM_RELEASE) {
- /* dont key sliding feather uw's */
+ /* Don't key sliding feather UW's. */
if (IS_AUTOKEY_ON(scene)) {
ED_mask_layer_shape_auto_key(slide_data->mask_layer, CFRA);
}
diff --git a/source/blender/editors/mask/mask_query.c b/source/blender/editors/mask/mask_query.c
index cfd57ca3477..401b6eac4f2 100644
--- a/source/blender/editors/mask/mask_query.c
+++ b/source/blender/editors/mask/mask_query.c
@@ -604,22 +604,37 @@ void ED_mask_point_pos__reverse(
*yr = co[1];
}
-bool ED_mask_selected_minmax(const bContext *C, float min[2], float max[2])
+static void handle_position_for_minmax(const MaskSplinePoint *point,
+ eMaskWhichHandle which_handle,
+ bool handles_as_control_point,
+ float r_handle[2])
+{
+ if (handles_as_control_point) {
+ copy_v2_v2(r_handle, point->bezt.vec[1]);
+ return;
+ }
+ BKE_mask_point_handle(point, which_handle, r_handle);
+}
+
+bool ED_mask_selected_minmax(const bContext *C,
+ float min[2],
+ float max[2],
+ bool handles_as_control_point)
{
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
Mask *mask = CTX_data_edit_mask(C);
- /* Use evaluated mask to take animation into account.
- * The animation of splies is not "flushed" back to original, so need to explicitly
- * sue evaluated datablock here. */
- Mask *mask_eval = (Mask *)DEG_get_evaluated_id(depsgraph, &mask->id);
-
bool ok = false;
if (mask == NULL) {
return ok;
}
+ /* Use evaluated mask to take animation into account.
+ * The animation of splies is not "flushed" back to original, so need to explicitly
+ * sue evaluated datablock here. */
+ Mask *mask_eval = (Mask *)DEG_get_evaluated_id(depsgraph, &mask->id);
+
INIT_MINMAX2(min, max);
for (MaskLayer *mask_layer = mask_eval->masklayers.first; mask_layer != NULL;
mask_layer = mask_layer->next) {
@@ -638,22 +653,29 @@ bool ED_mask_selected_minmax(const bContext *C, float min[2], float max[2])
}
if (bezt->f2 & SELECT) {
minmax_v2v2_v2(min, max, deform_point->bezt.vec[1]);
+ ok = true;
}
+
if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) {
- BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_STICK, handle);
+ handle_position_for_minmax(
+ deform_point, MASK_WHICH_HANDLE_STICK, handles_as_control_point, handle);
minmax_v2v2_v2(min, max, handle);
+ ok = true;
}
else {
if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) {
- BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_LEFT, handle);
+ handle_position_for_minmax(
+ deform_point, MASK_WHICH_HANDLE_LEFT, handles_as_control_point, handle);
minmax_v2v2_v2(min, max, handle);
+ ok = true;
}
if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) {
- BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_RIGHT, handle);
+ handle_position_for_minmax(
+ deform_point, MASK_WHICH_HANDLE_RIGHT, handles_as_control_point, handle);
minmax_v2v2_v2(min, max, handle);
+ ok = true;
}
}
- ok = true;
}
}
}
diff --git a/source/blender/editors/mask/mask_select.c b/source/blender/editors/mask/mask_select.c
index cdc6ece1e84..5c369afc4cd 100644
--- a/source/blender/editors/mask/mask_select.c
+++ b/source/blender/editors/mask/mask_select.c
@@ -214,12 +214,17 @@ static int select_all_exec(bContext *C, wmOperator *op)
Mask *mask = CTX_data_edit_mask(C);
int action = RNA_enum_get(op->ptr, "action");
+ MaskViewLockState lock_state;
+ ED_mask_view_lock_state_store(C, &lock_state);
+
ED_mask_select_toggle_all(mask, action);
ED_mask_select_flush_all(mask);
DEG_id_tag_update(&mask->id, ID_RECALC_SELECT);
WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ ED_mask_view_lock_state_restore_no_jump(C, &lock_state);
+
return OPERATOR_FINISHED;
}
@@ -261,6 +266,9 @@ static int select_exec(bContext *C, wmOperator *op)
eMaskWhichHandle which_handle;
const float threshold = 19;
+ MaskViewLockState lock_state;
+ ED_mask_view_lock_state_store(C, &lock_state);
+
RNA_float_get_array(op->ptr, "location", co);
point = ED_mask_point_find_nearest(
@@ -324,6 +332,8 @@ static int select_exec(bContext *C, wmOperator *op)
DEG_id_tag_update(&mask->id, ID_RECALC_SELECT);
WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ ED_mask_view_lock_state_restore_no_jump(C, &lock_state);
+
return OPERATOR_FINISHED;
}
@@ -364,12 +374,15 @@ static int select_exec(bContext *C, wmOperator *op)
DEG_id_tag_update(&mask->id, ID_RECALC_SELECT);
WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ ED_mask_view_lock_state_restore_no_jump(C, &lock_state);
+
return OPERATOR_FINISHED;
}
if (deselect_all) {
/* For clip editor tracks, leave deselect all to clip editor. */
if (!ED_clip_can_select(C)) {
ED_mask_deselect_all(C);
+ ED_mask_view_lock_state_restore_no_jump(C, &lock_state);
return OPERATOR_FINISHED;
}
}
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index a5dd29c9d73..d60d83850a5 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -24,7 +24,6 @@
#include "BLI_math.h"
#include "BLI_sys_types.h"
-#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -42,7 +41,6 @@
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_uvedit.h"
#include "mesh_intern.h" /* own include */
diff --git a/source/blender/editors/mesh/editmesh_automerge.c b/source/blender/editors/mesh/editmesh_automerge.c
index f9910f01f47..2bd5b9b26ca 100644
--- a/source/blender/editors/mesh/editmesh_automerge.c
+++ b/source/blender/editors/mesh/editmesh_automerge.c
@@ -26,12 +26,9 @@
* - #EDBM_automerge_and_split
*/
-#include "MEM_guardedalloc.h"
-
#include "BKE_editmesh.h"
#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
#include "ED_mesh.h"
diff --git a/source/blender/editors/mesh/editmesh_bevel.c b/source/blender/editors/mesh/editmesh_bevel.c
index 8ea3c883433..66a7b97b440 100644
--- a/source/blender/editors/mesh/editmesh_bevel.c
+++ b/source/blender/editors/mesh/editmesh_bevel.c
@@ -28,11 +28,9 @@
#include "BLT_translation.h"
#include "BKE_context.h"
-#include "BKE_curveprofile.h"
#include "BKE_editmesh.h"
#include "BKE_global.h"
#include "BKE_layer.h"
-#include "BKE_mesh.h"
#include "BKE_unit.h"
#include "DNA_curveprofile_types.h"
@@ -575,7 +573,7 @@ static void edbm_bevel_mouse_set_value(wmOperator *op, const wmEvent *event)
opdata->shift_value[vmode] = -1.0f;
}
- /* clamp accordingto value mode, and store value back */
+ /* Clamp according to value mode, and store value back. */
CLAMP(value, value_clamp_min[vmode], value_clamp_max[vmode]);
if (vmode == SEGMENTS_VALUE) {
opdata->segments = value;
diff --git a/source/blender/editors/mesh/editmesh_extrude_spin.c b/source/blender/editors/mesh/editmesh_extrude_spin.c
index 7b3fabf07fc..187652ae00f 100644
--- a/source/blender/editors/mesh/editmesh_extrude_spin.c
+++ b/source/blender/editors/mesh/editmesh_extrude_spin.c
@@ -33,17 +33,13 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#include "RNA_enum_types.h"
-#include "WM_api.h"
#include "WM_types.h"
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_view3d.h"
-#include "UI_resources.h"
-
#include "MEM_guardedalloc.h"
#include "mesh_intern.h" /* own include */
diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c
index f45f48e0e32..1f894ec0f1d 100644
--- a/source/blender/editors/mesh/editmesh_knife.c
+++ b/source/blender/editors/mesh/editmesh_knife.c
@@ -210,7 +210,7 @@ typedef struct KnifeTool_OpData {
/* run by the UI or not */
bool is_interactive;
- /* operatpr options */
+ /* Operator options. */
bool cut_through; /* preference, can be modified at runtime (that feature may go) */
bool only_select; /* set on initialization */
bool select_result; /* set on initialization */
@@ -2752,8 +2752,6 @@ static int knifetool_invoke(bContext *C, wmOperator *op, const wmEvent *event)
}
}
- view3d_operator_needs_opengl(C);
-
/* alloc new customdata */
kcd = op->customdata = MEM_callocN(sizeof(KnifeTool_OpData), __func__);
@@ -2831,7 +2829,6 @@ static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event)
em_setup_viewcontext(C, &kcd->vc);
kcd->region = kcd->vc.region;
- view3d_operator_needs_opengl(C);
ED_view3d_init_mats_rv3d(obedit, kcd->vc.rv3d); /* needed to initialize clipping */
if (kcd->mode == MODE_PANNING) {
@@ -3067,8 +3064,6 @@ void EDBM_mesh_knife(bContext *C, LinkNode *polys, bool use_tag, bool cut_throug
{
KnifeTool_OpData *kcd;
- view3d_operator_needs_opengl(C);
-
/* init */
{
const bool only_select = false;
diff --git a/source/blender/editors/mesh/editmesh_loopcut.c b/source/blender/editors/mesh/editmesh_loopcut.c
index 373d82883d1..2057738221b 100644
--- a/source/blender/editors/mesh/editmesh_loopcut.c
+++ b/source/blender/editors/mesh/editmesh_loopcut.c
@@ -189,8 +189,8 @@ static void ringsel_finish(bContext *C, wmOperator *op)
const int seltype = is_edge_wire ? SUBDIV_SELECT_INNER :
is_single ? SUBDIV_SELECT_NONE : SUBDIV_SELECT_LOOPCUT;
- /* Enable gridfill, so that intersecting loopcut works as one would expect.
- * Note though that it will break edgeslide in this specific case.
+ /* Enable grid-fill, so that intersecting loop-cut works as one would expect.
+ * Note though that it will break edge-slide in this specific case.
* See T31939. */
BM_mesh_esubdivide(em->bm,
BM_ELEM_SELECT,
diff --git a/source/blender/editors/mesh/editmesh_mask_extract.c b/source/blender/editors/mesh/editmesh_mask_extract.c
index 3e0bee3c4b8..7d849c096e7 100644
--- a/source/blender/editors/mesh/editmesh_mask_extract.c
+++ b/source/blender/editors/mesh/editmesh_mask_extract.c
@@ -81,7 +81,7 @@ typedef struct GeometryExtactParams {
/* For extracting Mask. */
float mask_threshold;
- /* Common paramenters. */
+ /* Common parameters. */
bool add_boundary_loop;
int num_smooth_iterations;
bool apply_shrinkwrap;
@@ -106,7 +106,7 @@ static int geometry_extract_apply(bContext *C,
BKE_sculpt_mask_layers_ensure(ob, NULL);
- /* Ensures that deformation from sculpt mode is taken into accunt before duplicating the mesh to
+ /* Ensures that deformation from sculpt mode is taken into account before duplicating the mesh to
* extract the geometry. */
CTX_data_ensure_evaluated_depsgraph(C);
@@ -385,7 +385,7 @@ static int face_set_extract_modal(bContext *C, wmOperator *op, const wmEvent *ev
ED_workspace_status_text(C, NULL);
/* This modal operator uses and eyedropper to pick a Face Set from the mesh. This ensures
- * that the mouse clicked in a viewport region and its coordinates can be used to raycast
+ * that the mouse clicked in a viewport region and its coordinates can be used to ray-cast
* the PBVH and update the active Face Set ID. */
bScreen *screen = CTX_wm_screen(C);
ARegion *region = BKE_screen_find_main_region_at_xy(
diff --git a/source/blender/editors/mesh/editmesh_polybuild.c b/source/blender/editors/mesh/editmesh_polybuild.c
index da3d16ba04f..4d37b78c9b7 100644
--- a/source/blender/editors/mesh/editmesh_polybuild.c
+++ b/source/blender/editors/mesh/editmesh_polybuild.c
@@ -523,7 +523,6 @@ void MESH_OT_polybuild_split_at_cursor(wmOperatorType *ot)
/* -------------------------------------------------------------------- */
/** \name Dissolve at Cursor
- *
* \{ */
static int edbm_polybuild_dissolve_at_cursor_invoke(bContext *C,
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index b5b4802aa78..903e50bf668 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -995,7 +995,7 @@ bool EDBM_unified_findnearest(ViewContext *vc,
/* -------------------------------------------------------------------- */
/** \name Alternate Find Nearest Vert/Edge (optional boundary)
*
- * \note This uses ray-cast method instead of backbuffer,
+ * \note This uses ray-cast method instead of back-buffer,
* currently used for poly-build.
* \{ */
@@ -2205,7 +2205,7 @@ void EDBM_selectmode_set(BMEditMesh *em)
}
}
else if (em->selectmode & SCE_SELECT_FACE) {
- /* deselect eges, and select again based on face select */
+ /* Deselect edges, and select again based on face select. */
BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
BM_edge_select_set(em->bm, eed, false);
}
@@ -2247,7 +2247,7 @@ void EDBM_selectmode_convert(BMEditMesh *em,
/* first tag-to-select, then select --- this avoids a feedback loop */
- /* have to find out what the selectionmode was previously */
+ /* Have to find out what the selection-mode was previously. */
if (selectmode_old == SCE_SELECT_VERTEX) {
if (bm->totvertsel == 0) {
/* pass */
@@ -4573,7 +4573,7 @@ void MESH_OT_select_non_manifold(wmOperatorType *ot)
static int edbm_select_random_exec(bContext *C, wmOperator *op)
{
const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
- const float randfac = RNA_float_get(op->ptr, "percent") / 100.0f;
+ const float randfac = RNA_float_get(op->ptr, "ratio");
const int seed = WM_operator_properties_select_random_seed_increment_get(op);
ViewLayer *view_layer = CTX_data_view_layer(C);
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 84f4e35cb0c..231e6fbc2d9 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -3101,7 +3101,8 @@ static bool merge_firstlast(BMEditMesh *em,
* so do extra check for data here
*/
- /* do sanity check in mergemenu in edit.c ?*/
+ /* While #merge_type_itemf does a sanity check, this operation runs on all edit-mode objects.
+ * Some of them may not have the expected selection state. */
if (use_first == false) {
if (!em->bm->selected.last || ((BMEditSelection *)em->bm->selected.last)->htype != BM_VERT) {
return false;
@@ -3905,7 +3906,7 @@ static float bm_edge_seg_isect(const float sco_a[2],
x12 = mouse_path[i][0];
y12 = mouse_path[i][1];
- /* Perp. Distance from point to line */
+ /* Calculate the distance from point to line. */
if (m2 != MAXSLOPE) {
/* sqrt(m2 * m2 + 1); Only looking for change in sign. Skip extra math .*/
dist = (y12 - m2 * x12 - b2);
@@ -4010,7 +4011,7 @@ static int edbm_knife_cut_exec(bContext *C, wmOperator *op)
short numcuts = 1;
const short mode = RNA_int_get(op->ptr, "type");
- /* allocd vars */
+ /* Allocated variables. */
float(*screen_vert_coords)[2], (*sco)[2], (*mouse_path)[2];
/* edit-object needed for matrix, and region->regiondata for projections to work */
diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c
index 41bb3faa135..cea006f0faa 100644
--- a/source/blender/editors/mesh/editmesh_undo.c
+++ b/source/blender/editors/mesh/editmesh_undo.c
@@ -188,7 +188,7 @@ static void um_arraystore_cd_compact(struct CustomData *cdata,
else {
bcd_reference_current = NULL;
- /* do a full lookup when un-alligned */
+ /* Do a full lookup when unaligned. */
if (bcd_reference) {
const BArrayCustomData *bcd_iter = bcd_reference;
while (bcd_iter) {
@@ -565,7 +565,7 @@ static void *undomesh_from_editmesh(UndoMesh *um, BMEditMesh *em, Key *key)
((LinkData *)um_arraystore.local_links.last)->data :
NULL;
- /* add oursrlves */
+ /* Add ourselves. */
BLI_addtail(&um_arraystore.local_links, BLI_genericNodeN(um));
# ifdef USE_ARRAY_STORE_THREAD
@@ -766,8 +766,11 @@ static bool mesh_undosys_step_encode(struct bContext *C, struct Main *bmain, Und
return true;
}
-static void mesh_undosys_step_decode(
- struct bContext *C, struct Main *bmain, UndoStep *us_p, int UNUSED(dir), bool UNUSED(is_final))
+static void mesh_undosys_step_decode(struct bContext *C,
+ struct Main *bmain,
+ UndoStep *us_p,
+ const eUndoStepDir UNUSED(dir),
+ bool UNUSED(is_final))
{
MeshUndoStep *us = (MeshUndoStep *)us_p;
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index 2cf97b7235f..27d73497b49 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -21,7 +21,6 @@
* \ingroup edmesh
*/
-#include "DNA_modifier_types.h"
#include "DNA_scene_types.h"
#include "RNA_access.h"
@@ -30,9 +29,7 @@
#include "WM_types.h"
#include "ED_mesh.h"
-#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
#include "mesh_intern.h" /* own include */
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 3b5897de0b0..3450d61337c 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -145,7 +145,7 @@ static void join_mesh_single(Depsgraph *depsgraph,
if (ob_src != ob_dst) {
float cmat[4][4];
- /* watch this: switch matmul order really goes wrong */
+ /* Watch this: switch matrix multiplication order really goes wrong. */
mul_m4_m4m4(cmat, imat, ob_src->obmat);
/* transform vertex coordinates into new space */
@@ -733,7 +733,7 @@ int ED_mesh_join_objects_exec(bContext *C, wmOperator *op)
BKE_key_sort(key);
}
- /* Due to dependnecy cycle some other object might access old derived data. */
+ /* Due to dependency cycle some other object might access old derived data. */
BKE_object_free_derived_caches(ob);
DEG_relations_tag_update(bmain); /* removed objects, need to rebuild dag */
diff --git a/source/blender/editors/metaball/editmball_undo.c b/source/blender/editors/metaball/editmball_undo.c
index cbc60bcc031..b817bc3a718 100644
--- a/source/blender/editors/metaball/editmball_undo.c
+++ b/source/blender/editors/metaball/editmball_undo.c
@@ -187,8 +187,11 @@ static bool mball_undosys_step_encode(struct bContext *C, struct Main *bmain, Un
return true;
}
-static void mball_undosys_step_decode(
- struct bContext *C, struct Main *bmain, UndoStep *us_p, int UNUSED(dir), bool UNUSED(is_final))
+static void mball_undosys_step_decode(struct bContext *C,
+ struct Main *bmain,
+ UndoStep *us_p,
+ const eUndoStepDir UNUSED(dir),
+ bool UNUSED(is_final))
{
MBallUndoStep *us = (MBallUndoStep *)us_p;
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 094011ebef1..cf453bf0c32 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -483,7 +483,7 @@ void MBALL_OT_select_similar(wmOperatorType *ot)
static int select_random_metaelems_exec(bContext *C, wmOperator *op)
{
const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
- const float randfac = RNA_float_get(op->ptr, "percent") / 100.0f;
+ const float randfac = RNA_float_get(op->ptr, "ratio");
const int seed = WM_operator_properties_select_random_seed_increment_get(op);
ViewLayer *view_layer = CTX_data_view_layer(C);
diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c
index 100ca4691ca..a54ec384d8e 100644
--- a/source/blender/editors/metaball/mball_ops.c
+++ b/source/blender/editors/metaball/mball_ops.c
@@ -29,9 +29,7 @@
#include "WM_types.h"
#include "ED_mball.h"
-#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
#include "mball_intern.h"
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index c6d6b8b16b9..351b762c8cd 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -265,7 +265,6 @@ static int object_add_drop_xy_generic_invoke(bContext *C, wmOperator *op, const
/* -------------------------------------------------------------------- */
/** \name Public Add Object API
- *
* \{ */
void ED_object_location_from_view(bContext *C, float loc[3])
@@ -516,7 +515,7 @@ bool ED_object_add_generic_get_opts(bContext *C,
if (RNA_struct_property_is_set(op->ptr, "rotation")) {
/* If rotation is set, always use it. Alignment (and corresponding user preference)
* can be ignored since this is in world space anyways.
- * To not confuse (e.g. on redo), dont set it to ALIGN_WORLD in the op UI though. */
+ * To not confuse (e.g. on redo), don't set it to #ALIGN_WORLD in the op UI though. */
*is_view_aligned = false;
RNA_float_get_array(op->ptr, "rotation", rot);
}
@@ -607,7 +606,6 @@ Object *ED_object_add_type_with_obdata(bContext *C,
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
- /* For as long scene has editmode... */
{
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
if (obedit != NULL) {
@@ -1712,9 +1710,8 @@ static int object_speaker_add_exec(bContext *C, wmOperator *op)
Object *ob = ED_object_add_type(C, OB_SPEAKER, NULL, loc, rot, false, local_view_bits);
const bool is_liboverride = ID_IS_OVERRIDE_LIBRARY(ob);
- /* to make it easier to start using this immediately in NLA, a default sound clip is created
- * ready to be moved around to retime the sound and/or make new sound clips
- */
+ /* To make it easier to start using this immediately in NLA, a default sound clip is created
+ * ready to be moved around to re-time the sound and/or make new sound clips. */
{
/* create new data for NLA hierarchy */
AnimData *adt = BKE_animdata_add_id(&ob->id);
@@ -1856,7 +1853,7 @@ void ED_object_base_free_and_unlink(Main *bmain, Scene *scene, Object *ob)
ID_EXTRA_USERS(ob) == 0) {
/* We cannot delete indirectly used object... */
printf(
- "WARNING, undeletable object '%s', should have been catched before reaching this "
+ "WARNING, undeletable object '%s', should have been caught before reaching this "
"function!",
ob->id.name + 2);
return;
@@ -2302,7 +2299,7 @@ static void make_object_duplilist_real(bContext *C,
/* OK to keep most of the members uninitialized,
* they won't be read, this is simply for a hash lookup. */
DupliObject dob_key;
- /* We are looking one step upper in hierarchy, so we need to 'shift' the persitent_id,
+ /* We are looking one step upper in hierarchy, so we need to 'shift' the `persistent_id`,
* ignoring the first item.
* We only check on persistent_id here, since we have no idea what object it might be. */
memcpy(&dob_key.persistent_id[0],
@@ -3364,6 +3361,9 @@ static int object_add_named_exec(bContext *C, wmOperator *op)
ED_view3d_cursor3d_position(C, mval, false, basen->object->loc);
}
+ /* object_add_duplicate_internal() doesn't deselect other objects, unlike object_add_common() or
+ * BKE_view_layer_base_deselect_all(). */
+ ED_object_base_deselect_all(view_layer, NULL, BA_DESELECT);
ED_object_base_select(basen, BA_SELECT);
ED_object_base_activate(C, basen);
@@ -3410,7 +3410,6 @@ void OBJECT_OT_add_named(wmOperatorType *ot)
/* -------------------------------------------------------------------- */
/** \name Join Object Operator
- *
* \{ */
static bool object_join_poll(bContext *C)
diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c
index 7179cc26fc1..9ec0c625f71 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -1364,7 +1364,7 @@ static int bake(const BakeAPIRender *bkr,
highpoly[i].ob_eval->base_flag |= (BASE_VISIBLE_DEPSGRAPH | BASE_ENABLED_RENDER);
highpoly[i].me = BKE_mesh_new_from_object(NULL, highpoly[i].ob_eval, false);
- /* lowpoly to highpoly transformation matrix */
+ /* Low-poly to high-poly transformation matrix. */
copy_m4_m4(highpoly[i].obmat, highpoly[i].ob->obmat);
invert_m4_m4(highpoly[i].imat, highpoly[i].obmat);
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c
index 4cbb8858bf4..b251e617a4c 100644
--- a/source/blender/editors/object/object_data_transfer.c
+++ b/source/blender/editors/object/object_data_transfer.c
@@ -51,8 +51,6 @@
#include "ED_object.h"
-#include "UI_interface.h"
-
#include "object_intern.h"
/* All possible data to transfer.
@@ -65,7 +63,7 @@ static const EnumPropertyItem DT_layer_items[] = {
0,
"Vertex Group(s)",
"Transfer active or all vertex groups"},
-#if 0 /* XXX For now, would like to finish/merge work from 2014 gsoc first. */
+#if 0 /* XXX For now, would like to finish/merge work from 2014 GSOC first. */
{DT_TYPE_SHAPEKEY, "SHAPEKEYS", 0, "Shapekey(s)", "Transfer active or all shape keys"},
#endif
/* XXX When SkinModifier is enabled,
diff --git a/source/blender/editors/object/object_gpencil_modifier.c b/source/blender/editors/object/object_gpencil_modifier.c
index f70e86bcb05..3995728c428 100644
--- a/source/blender/editors/object/object_gpencil_modifier.c
+++ b/source/blender/editors/object/object_gpencil_modifier.c
@@ -173,28 +173,28 @@ void ED_object_gpencil_modifier_clear(Main *bmain, Object *ob)
DEG_relations_tag_update(bmain);
}
-int ED_object_gpencil_modifier_move_up(ReportList *UNUSED(reports),
- Object *ob,
- GpencilModifierData *md)
+bool ED_object_gpencil_modifier_move_up(ReportList *UNUSED(reports),
+ Object *ob,
+ GpencilModifierData *md)
{
if (md->prev) {
BLI_remlink(&ob->greasepencil_modifiers, md);
BLI_insertlinkbefore(&ob->greasepencil_modifiers, md->prev, md);
}
- return 1;
+ return true;
}
-int ED_object_gpencil_modifier_move_down(ReportList *UNUSED(reports),
- Object *ob,
- GpencilModifierData *md)
+bool ED_object_gpencil_modifier_move_down(ReportList *UNUSED(reports),
+ Object *ob,
+ GpencilModifierData *md)
{
if (md->next) {
BLI_remlink(&ob->greasepencil_modifiers, md);
BLI_insertlinkafter(&ob->greasepencil_modifiers, md->next, md);
}
- return 1;
+ return true;
}
bool ED_object_gpencil_modifier_move_to_index(ReportList *reports,
@@ -234,57 +234,57 @@ bool ED_object_gpencil_modifier_move_to_index(ReportList *reports,
return true;
}
-static int gpencil_modifier_apply_obdata(
+static bool gpencil_modifier_apply_obdata(
ReportList *reports, Main *bmain, Depsgraph *depsgraph, Object *ob, GpencilModifierData *md)
{
const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type);
if (mti->isDisabled && mti->isDisabled(md, 0)) {
BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
- return 0;
+ return false;
}
if (ob->type == OB_GPENCIL) {
if (ELEM(NULL, ob, ob->data)) {
- return 0;
+ return false;
}
if (mti->bakeModifier == NULL) {
BKE_report(reports, RPT_ERROR, "Not implemented");
- return 0;
+ return false;
}
mti->bakeModifier(bmain, depsgraph, md, ob);
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
}
else {
BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
- return 0;
+ return false;
}
- return 1;
+ return true;
}
-int ED_object_gpencil_modifier_apply(Main *bmain,
- ReportList *reports,
- Depsgraph *depsgraph,
- Object *ob,
- GpencilModifierData *md,
- int UNUSED(mode))
+bool ED_object_gpencil_modifier_apply(Main *bmain,
+ ReportList *reports,
+ Depsgraph *depsgraph,
+ Object *ob,
+ GpencilModifierData *md,
+ int UNUSED(mode))
{
if (ob->type == OB_GPENCIL) {
if (ob->mode != OB_MODE_OBJECT) {
BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied in paint, sculpt or edit mode");
- return 0;
+ return false;
}
if (((ID *)ob->data)->us > 1) {
BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied to multi-user data");
- return 0;
+ return false;
}
}
else if (((ID *)ob->data)->us > 1) {
BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied to multi-user data");
- return 0;
+ return false;
}
if (md != ob->greasepencil_modifiers.first) {
@@ -292,16 +292,16 @@ int ED_object_gpencil_modifier_apply(Main *bmain,
}
if (!gpencil_modifier_apply_obdata(reports, bmain, depsgraph, ob, md)) {
- return 0;
+ return false;
}
BLI_remlink(&ob->greasepencil_modifiers, md);
BKE_gpencil_modifier_free(md);
- return 1;
+ return true;
}
-int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModifierData *md)
+bool ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModifierData *md)
{
GpencilModifierData *nmd;
const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type);
@@ -310,7 +310,7 @@ int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModi
if (mti->flags & eGpencilModifierTypeFlag_Single) {
if (BKE_gpencil_modifiers_findby_type(ob, type)) {
BKE_report(reports, RPT_WARNING, "Only one modifier of this type is allowed");
- return 0;
+ return false;
}
}
@@ -321,7 +321,7 @@ int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModi
nmd->flag |= eGpencilModifierFlag_OverrideLibrary_Local;
- return 1;
+ return true;
}
void ED_object_gpencil_modifier_copy_to_object(Object *ob_dst, GpencilModifierData *md)
@@ -730,14 +730,18 @@ static int gpencil_modifier_apply_exec(bContext *C, wmOperator *op)
Object *ob = ED_object_active_context(C);
GpencilModifierData *md = gpencil_edit_modifier_property_get(op, ob, 0);
int apply_as = RNA_enum_get(op->ptr, "apply_as");
+ const bool do_report = RNA_boolean_get(op->ptr, "report");
if (md == NULL) {
return OPERATOR_CANCELLED;
}
- /* Store name temporarily for report. */
+ int reports_len;
char name[MAX_NAME];
- strcpy(name, md->name);
+ if (do_report) {
+ reports_len = BLI_listbase_count(&op->reports->list);
+ strcpy(name, md->name); /* Store name temporarily since the modifier is removed. */
+ }
if (!ED_object_gpencil_modifier_apply(bmain, op->reports, depsgraph, ob, md, apply_as)) {
return OPERATOR_CANCELLED;
@@ -746,8 +750,12 @@ static int gpencil_modifier_apply_exec(bContext *C, wmOperator *op)
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
- if (RNA_boolean_get(op->ptr, "report")) {
- BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name);
+ if (do_report) {
+ /* Only add this report if the operator didn't cause another one. The purpose here is
+ * to alert that something happened, and the previous report will do that anyway. */
+ if (BLI_listbase_count(&op->reports->list) == reports_len) {
+ BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name);
+ }
}
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c
index 5a6fa2b8e3e..99103cf10c7 100644
--- a/source/blender/editors/object/object_modes.c
+++ b/source/blender/editors/object/object_modes.c
@@ -62,7 +62,6 @@
/* -------------------------------------------------------------------- */
/** \name High Level Mode Operations
- *
* \{ */
static const char *object_mode_op_string(eObjectMode mode)
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 6350ffb9c77..7673649c261 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -1383,14 +1383,18 @@ static int modifier_apply_exec_ex(bContext *C, wmOperator *op, int apply_as, boo
Scene *scene = CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
ModifierData *md = edit_modifier_property_get(op, ob, 0);
+ const bool do_report = RNA_boolean_get(op->ptr, "report");
if (md == NULL) {
return OPERATOR_CANCELLED;
}
- /* Store name temporarily for report. */
+ int reports_len;
char name[MAX_NAME];
- strcpy(name, md->name);
+ if (do_report) {
+ reports_len = BLI_listbase_count(&op->reports->list);
+ strcpy(name, md->name); /* Store name temporarily since the modifier is removed. */
+ }
if (!ED_object_modifier_apply(
bmain, op->reports, depsgraph, scene, ob, md, apply_as, keep_modifier)) {
@@ -1401,8 +1405,12 @@ static int modifier_apply_exec_ex(bContext *C, wmOperator *op, int apply_as, boo
DEG_relations_tag_update(bmain);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
- if (RNA_boolean_get(op->ptr, "report")) {
- BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name);
+ if (do_report) {
+ /* Only add this report if the operator didn't cause another one. The purpose here is
+ * to alert that something happened, and the previous report will do that anyway. */
+ if (BLI_listbase_count(&op->reports->list) == reports_len) {
+ BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name);
+ }
}
return OPERATOR_FINISHED;
@@ -3024,7 +3032,7 @@ static int ocean_bake_exec(bContext *C, wmOperator *op)
i++;
}
- /* make a copy of ocean to use for baking - threadsafety */
+ /* Make a copy of ocean to use for baking - thread-safety. */
struct Ocean *ocean = BKE_ocean_add();
BKE_ocean_init_from_modifier(ocean, omd, omd->resolution);
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 964d9898ac0..57676cf5c76 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -25,23 +25,15 @@
#include <stdlib.h>
#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
-
-#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "RNA_access.h"
-#include "RNA_enum_types.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_object.h"
-#include "ED_screen.h"
-#include "ED_select_utils.h"
-
-#include "DEG_depsgraph.h"
#include "object_intern.h"
@@ -162,7 +154,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_gpencil_modifier_copy);
WM_operatortype_append(OBJECT_OT_gpencil_modifier_copy_to_selected);
- /* shader fx */
+ /* Shader FX. */
WM_operatortype_append(OBJECT_OT_shaderfx_add);
WM_operatortype_append(OBJECT_OT_shaderfx_remove);
WM_operatortype_append(OBJECT_OT_shaderfx_move_up);
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index acad1b43cbb..5a2ef1c6556 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -1790,20 +1790,33 @@ void OBJECT_OT_make_links_scene(wmOperatorType *ot)
void OBJECT_OT_make_links_data(wmOperatorType *ot)
{
static const EnumPropertyItem make_links_items[] = {
- {MAKE_LINKS_OBDATA, "OBDATA", 0, "Object Data", ""},
- {MAKE_LINKS_MATERIALS, "MATERIAL", 0, "Materials", ""},
- {MAKE_LINKS_ANIMDATA, "ANIMATION", 0, "Animation Data", ""},
- {MAKE_LINKS_GROUP, "GROUPS", 0, "Collection", ""},
- {MAKE_LINKS_DUPLICOLLECTION, "DUPLICOLLECTION", 0, "Instance Collection", ""},
- {MAKE_LINKS_MODIFIERS, "MODIFIERS", 0, "Modifiers", ""},
- {MAKE_LINKS_FONTS, "FONTS", 0, "Fonts", ""},
- {MAKE_LINKS_SHADERFX, "EFFECTS", 0, "Effects", ""},
+ {MAKE_LINKS_OBDATA, "OBDATA", 0, "Link Object Data", "Replace assigned Object Data"},
+ {MAKE_LINKS_MATERIALS, "MATERIAL", 0, "Link Materials", "Replace assigned Materials"},
+ {MAKE_LINKS_ANIMDATA,
+ "ANIMATION",
+ 0,
+ "Link Animation Data",
+ "Replace assigned Animation Data"},
+ {MAKE_LINKS_GROUP, "GROUPS", 0, "Link Collections", "Replace assigned Collections"},
+ {MAKE_LINKS_DUPLICOLLECTION,
+ "DUPLICOLLECTION",
+ 0,
+ "Link Instance Collection",
+ "Replace assigned Collection Instance"},
+ {MAKE_LINKS_FONTS, "FONTS", 0, "Link Fonts to Text", "Replace Text object Fonts"},
+ {0, "", 0, NULL, NULL},
+ {MAKE_LINKS_MODIFIERS, "MODIFIERS", 0, "Copy Modifiers", "Replace Modifiers"},
+ {MAKE_LINKS_SHADERFX,
+ "EFFECTS",
+ 0,
+ "Copy Grease Pencil Effects",
+ "Replace Grease Pencil Effects"},
{0, NULL, 0, NULL, NULL},
};
/* identifiers */
- ot->name = "Link Data";
- ot->description = "Apply active object links to other selected objects";
+ ot->name = "Link/Transfer Data";
+ ot->description = "Transfer data from active object to selected objects";
ot->idname = "OBJECT_OT_make_links_data";
/* api callbacks */
@@ -2328,7 +2341,7 @@ void OBJECT_OT_make_local(wmOperatorType *ot)
static bool make_override_library_object_overridable_check(Main *bmain, Object *object)
{
- /* An object is actually overrideable only if it is in at least one local collections.
+ /* An object is actually overridable only if it is in at least one local collection.
* Unfortunately 'direct link' flag is not enough here. */
LISTBASE_FOREACH (Collection *, collection, &bmain->collections) {
if (!ID_IS_LINKED(collection) && BKE_collection_has_object(collection, object)) {
diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c
index d560d347217..9ef2cce875f 100644
--- a/source/blender/editors/object/object_remesh.c
+++ b/source/blender/editors/object/object_remesh.c
@@ -327,7 +327,7 @@ static void voxel_size_edit_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar),
const float total_len = len_v3v3(cd->preview_plane[0], cd->preview_plane[1]);
const int tot_lines = (int)(total_len / cd->voxel_size);
- /* Smoothstep to reduce the alpha of the grid as the line number increases. */
+ /* Smooth-step to reduce the alpha of the grid as the line number increases. */
const float a = VOXEL_SIZE_EDIT_MAX_GRIDS_LINES * 0.1f;
const float b = VOXEL_SIZE_EDIT_MAX_GRIDS_LINES;
const float x = clamp_f((tot_lines - a) / (b - a), 0.0f, 1.0);
@@ -467,7 +467,7 @@ static int voxel_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *ev
cd->voxel_size = mesh->remesh_voxel_size;
op->customdata = cd;
- /* Select the front facing face of the mesh boundig box. */
+ /* Select the front facing face of the mesh bounding box. */
BoundBox *bb = BKE_mesh_boundbox_get(cd->active_object);
/* Indices of the Bounding Box faces. */
@@ -738,7 +738,7 @@ static int quadriflow_break_job(void *customdata)
return should_break;
}
-/* called by oceanbake, wmJob sends notifier */
+/** Called by ocean-bake, #wmJob sends notifier. */
static void quadriflow_update_job(void *customdata, float progress, int *cancel)
{
QuadriFlowJob *qj = customdata;
@@ -982,7 +982,7 @@ static int quadriflow_remesh_exec(bContext *C, wmOperator *op)
quadriflow_free_job(job);
}
else {
- /* Non blocking call. For when the operator has been called from the gui */
+ /* Non blocking call. For when the operator has been called from the GUI. */
job->is_nonblocking_job = true;
wmJob *wm_job = WM_jobs_get(CTX_wm_manager(C),
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index b36d89dc37a..1e6a7b9f14e 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -317,7 +317,7 @@ bool ED_object_jump_to_object(bContext *C, Object *ob, const bool UNUSED(reveal_
/**
* Select and make the target object and bone active.
* Switches to Pose mode if in Object mode so the selection is visible.
- * Unhides the target bone and bone layer if necessary.
+ * Un-hides the target bone and bone layer if necessary.
*
* \returns false if object not in layer, bone not found, or other error
*/
@@ -1453,7 +1453,7 @@ void OBJECT_OT_select_less(wmOperatorType *ot)
static int object_select_random_exec(bContext *C, wmOperator *op)
{
- const float randfac = RNA_float_get(op->ptr, "percent") / 100.0f;
+ const float randfac = RNA_float_get(op->ptr, "ratio");
const int seed = WM_operator_properties_select_random_seed_increment_get(op);
const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c
index 1bb0246deb5..fd649854d8f 100644
--- a/source/blender/editors/object/object_shapekey.c
+++ b/source/blender/editors/object/object_shapekey.c
@@ -36,7 +36,6 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
-#include "DNA_curve_types.h"
#include "DNA_key_types.h"
#include "DNA_lattice_types.h"
#include "DNA_mesh_types.h"
@@ -44,7 +43,6 @@
#include "DNA_object_types.h"
#include "BKE_context.h"
-#include "BKE_curve.h"
#include "BKE_key.h"
#include "BKE_lattice.h"
#include "BKE_main.h"
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 0528d64dca9..13c0740bce6 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -1394,7 +1394,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
* (all layers are considered without evaluating lock attributes) */
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
/* calculate difference matrix */
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
/* undo matrix */
invert_m4_m4(inverse_diff_mat, diff_mat);
LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 6362662c4e7..2296e158cc8 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -2422,7 +2422,7 @@ void ED_vgroup_mirror(Object *ob,
BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false);
- /* Go through the list of editverts and assign them */
+ /* Go through the list of edit-vertices and assign them. */
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_TAG)) {
if ((eve_mirr = EDBM_verts_mirror_get(em, eve))) {
@@ -2602,7 +2602,7 @@ static void vgroup_assign_verts(Object *ob, const float weight)
cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
- /* Go through the list of editverts and assign them */
+ /* Go through the list of edit-vertices and assign them. */
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
MDeformVert *dv;
diff --git a/source/blender/editors/object/object_volume.c b/source/blender/editors/object/object_volume.c
index 6b46d43e5bf..fbdee00c29c 100644
--- a/source/blender/editors/object/object_volume.c
+++ b/source/blender/editors/object/object_volume.c
@@ -23,9 +23,6 @@
#include <string.h>
-#include "MEM_guardedalloc.h"
-
-#include "BLI_fileops.h"
#include "BLI_listbase.h"
#include "BLI_math_base.h"
#include "BLI_path_util.h"
diff --git a/source/blender/editors/object/object_warp.c b/source/blender/editors/object/object_warp.c
index b36a8543d67..4b15385b537 100644
--- a/source/blender/editors/object/object_warp.c
+++ b/source/blender/editors/object/object_warp.c
@@ -36,7 +36,6 @@
#include "WM_types.h"
#include "ED_transverts.h"
-#include "ED_view3d.h"
#include "object_intern.h"
@@ -75,7 +74,7 @@ static void object_warp_transverts_minmax_x(TransVertStore *tvs,
for (int i = 0; i < tvs->transverts_tot; i++, tv++) {
float val;
- /* convert objectspace->viewspace */
+ /* Convert object-space to view-space. */
val = dot_m4_v3_row_x(mat_view, tv->loc);
min = min_ff(min, val);
@@ -123,7 +122,7 @@ static void object_warp_transverts(TransVertStore *tvs,
float co[3], co_add[2];
float val, phi;
- /* convert objectspace->viewspace */
+ /* Convert object-space to view-space. */
mul_v3_m4v3(co, mat_view, tv->loc);
sub_v2_v2(co, center_view);
@@ -158,7 +157,7 @@ static void object_warp_transverts(TransVertStore *tvs,
add_v2_v2(co, co_add);
- /* convert viewspace->objectspace */
+ /* Convert view-space to object-space. */
add_v2_v2(co, center_view);
mul_v3_m4v3(tv->loc, imat_view, co);
}
@@ -187,7 +186,7 @@ static int object_warp_verts_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* get viewmatrix */
+ /* Get view-matrix. */
{
PropertyRNA *prop_viewmat = RNA_struct_find_property(op->ptr, "viewmat");
if (RNA_property_is_set(op->ptr, prop_viewmat)) {
diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c
index 381bf317bee..a761701f60b 100644
--- a/source/blender/editors/physics/dynamicpaint_ops.c
+++ b/source/blender/editors/physics/dynamicpaint_ops.c
@@ -233,7 +233,7 @@ static int output_toggle_exec(bContext *C, wmOperator *op)
/* if type is already enabled, toggle it off */
if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
- int exists = dynamicPaint_outputLayerExists(surface, ob, output);
+ bool exists = dynamicPaint_outputLayerExists(surface, ob, output);
const char *name;
if (output == 0) {
diff --git a/source/blender/editors/physics/particle_boids.c b/source/blender/editors/physics/particle_boids.c
index 22cfa50aee9..9b8622e6eac 100644
--- a/source/blender/editors/physics/particle_boids.c
+++ b/source/blender/editors/physics/particle_boids.c
@@ -33,7 +33,6 @@
#include "BKE_boids.h"
#include "BKE_context.h"
#include "BKE_main.h"
-#include "BKE_particle.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index 8ab25fa74b8..ec3eb9c6a3a 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -88,7 +88,9 @@
#include "particle_edit_utildefines.h"
-/**************************** utilities *******************************/
+/* -------------------------------------------------------------------- */
+/** \name Public Utilities
+ * \{ */
bool PE_poll(bContext *C)
{
@@ -178,9 +180,56 @@ void PE_free_ptcache_edit(PTCacheEdit *edit)
MEM_freeN(edit);
}
-/************************************************/
-/* Edit Mode Helpers */
-/************************************************/
+int PE_minmax(
+ Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, float min[3], float max[3])
+{
+ Object *ob = OBACT(view_layer);
+ PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob);
+ ParticleSystem *psys;
+ ParticleSystemModifierData *psmd_eval = NULL;
+ POINT_P;
+ KEY_K;
+ float co[3], mat[4][4];
+ int ok = 0;
+
+ if (!edit) {
+ return ok;
+ }
+
+ if ((psys = edit->psys)) {
+ psmd_eval = edit->psmd_eval;
+ }
+ else {
+ unit_m4(mat);
+ }
+
+ LOOP_VISIBLE_POINTS {
+ if (psys) {
+ psys_mat_hair_to_global(
+ ob, psmd_eval->mesh_final, psys->part->from, psys->particles + p, mat);
+ }
+
+ LOOP_SELECTED_KEYS {
+ copy_v3_v3(co, key->co);
+ mul_m4_v3(mat, co);
+ DO_MINMAX(co, min, max);
+ ok = 1;
+ }
+ }
+
+ if (!ok) {
+ BKE_object_minmax(ob, min, max, true);
+ ok = 1;
+ }
+
+ return ok;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Edit Mode Helpers
+ * \{ */
int PE_start_edit(PTCacheEdit *edit)
{
@@ -409,7 +458,11 @@ static int pe_x_mirror(Object *ob)
return 0;
}
-/****************** common struct passed to callbacks ******************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Common Struct Passed to Callbacks
+ * \{ */
typedef struct PEData {
ViewContext vc;
@@ -519,7 +572,11 @@ static void PE_free_random_generator(PEData *data)
}
}
-/*************************** selection utilities *******************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Selection Utilities
+ * \{ */
static bool key_test_depth(const PEData *data, const float co[3], const int screen_co[2])
{
@@ -632,7 +689,11 @@ static bool point_is_selected(PTCacheEditPoint *point)
return 0;
}
-/*************************** iterators *******************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Iterators
+ * \{ */
typedef void (*ForPointFunc)(PEData *data, int point_index);
typedef void (*ForHitPointFunc)(PEData *data, int point_index, float mouse_distance);
@@ -905,9 +966,11 @@ static int count_selected_keys(Scene *scene, PTCacheEdit *edit)
return sel;
}
-/************************************************/
-/* Particle Edit Mirroring */
-/************************************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Particle Edit Mirroring
+ * \{ */
static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys)
{
@@ -1115,9 +1178,11 @@ static void PE_apply_mirror(Object *ob, ParticleSystem *psys)
}
}
-/************************************************/
-/* Edit Calculation */
-/************************************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Edit Calculation
+ * \{ */
typedef struct DeflectEmitterIter {
Object *object;
@@ -1605,9 +1670,11 @@ void PE_update_object(Depsgraph *depsgraph, Scene *scene, Object *ob, int usefla
}
}
-/************************************************/
-/* Edit Selections */
-/************************************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Edit Selections
+ * \{ */
/*-----selection callbacks-----*/
@@ -1703,7 +1770,11 @@ static void toggle_key_select(PEData *data, int point_index, int key_index, bool
data->is_changed = true;
}
-/************************ de select all operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name De-Select All Operator
+ * \{ */
static bool select_action_apply(PTCacheEditPoint *point, PTCacheEditKey *key, int action)
{
@@ -1794,7 +1865,11 @@ void PARTICLE_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-/************************ pick select operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Pick Select Operator
+ * \{ */
bool PE_mouse_particles(bContext *C, const int mval[2], bool extend, bool deselect, bool toggle)
{
@@ -1843,7 +1918,11 @@ bool PE_mouse_particles(bContext *C, const int mval[2], bool extend, bool desele
return true;
}
-/************************ select root operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Root Operator
+ * \{ */
static void select_root(PEData *data, int point_index)
{
@@ -1906,7 +1985,11 @@ void PARTICLE_OT_select_roots(wmOperatorType *ot)
WM_operator_properties_select_action(ot, SEL_SELECT, false);
}
-/************************ select tip operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Tip Operator
+ * \{ */
static void select_tip(PEData *data, int point_index)
{
@@ -1977,7 +2060,11 @@ void PARTICLE_OT_select_tips(wmOperatorType *ot)
WM_operator_properties_select_action(ot, SEL_SELECT, false);
}
-/*********************** select random operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Random Operator
+ * \{ */
enum { RAN_HAIR, RAN_POINTS };
@@ -1999,7 +2086,7 @@ static int select_random_exec(bContext *C, wmOperator *op)
int p;
int k;
- const float randfac = RNA_float_get(op->ptr, "percent") / 100.0f;
+ const float randfac = RNA_float_get(op->ptr, "ratio");
const int seed = WM_operator_properties_select_random_seed_increment_get(op);
const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
RNG *rng;
@@ -2064,7 +2151,11 @@ void PARTICLE_OT_select_random(wmOperatorType *ot)
"Select either hair or points");
}
-/************************ select linked operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Linked operator
+ * \{ */
static int select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -2146,7 +2237,12 @@ void PARTICLE_OT_select_linked_pick(wmOperatorType *ot)
RNA_def_int_vector(ot->srna, "location", 2, NULL, 0, INT_MAX, "Location", "", 0, 16384);
}
-/************************ box select operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Box Select Operator
+ * \{ */
+
bool PE_deselect_all_visible_ex(PTCacheEdit *edit)
{
bool changed = false;
@@ -2211,7 +2307,11 @@ bool PE_box_select(bContext *C, const rcti *rect, const int sel_op)
return data.is_changed;
}
-/************************ circle select operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Circle Select Operator
+ * \{ */
bool PE_circle_select(bContext *C, const int sel_op, const int mval[2], float rad)
{
@@ -2244,7 +2344,11 @@ bool PE_circle_select(bContext *C, const int sel_op, const int mval[2], float ra
return data.is_changed;
}
-/************************ lasso select operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Lasso Select Operator
+ * \{ */
int PE_lasso_select(bContext *C, const int mcoords[][2], const int mcoords_len, const int sel_op)
{
@@ -2331,7 +2435,11 @@ int PE_lasso_select(bContext *C, const int mcoords[][2], const int mcoords_len,
return OPERATOR_CANCELLED;
}
-/*************************** hide operator **************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Hide Operator
+ * \{ */
static int hide_exec(bContext *C, wmOperator *op)
{
@@ -2388,7 +2496,11 @@ void PARTICLE_OT_hide(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected");
}
-/*************************** reveal operator **************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Reveal Operator
+ * \{ */
static int reveal_exec(bContext *C, wmOperator *op)
{
@@ -2435,7 +2547,11 @@ void PARTICLE_OT_reveal(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "select", true, "Select", "");
}
-/************************ select less operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Less Operator
+ * \{ */
static void select_less_keys(PEData *data, int point_index)
{
@@ -2498,7 +2614,11 @@ void PARTICLE_OT_select_less(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/************************ select more operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select More Operator
+ * \{ */
static void select_more_keys(PEData *data, int point_index)
{
@@ -2566,7 +2686,11 @@ void PARTICLE_OT_select_more(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/************************ rekey operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Re-Key Operator
+ * \{ */
static void rekey_particle(PEData *data, int pa_index)
{
@@ -2723,7 +2847,11 @@ static void rekey_particle_to_time(
pa->flag &= ~PARS_REKEY;
}
-/************************* utilities **************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Internal Utilities
+ * \{ */
static int remove_tagged_particles(Object *ob, ParticleSystem *psys, int mirror)
{
@@ -2905,7 +3033,11 @@ static void remove_tagged_keys(Depsgraph *depsgraph, Object *ob, ParticleSystem
}
}
-/************************ subdivide opertor *********************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Subdivide Operator
+ * \{ */
/* works like normal edit mode subdivide, inserts keys between neighboring selected keys */
static void subdivide_particle(PEData *data, int pa_index)
@@ -3029,7 +3161,11 @@ void PARTICLE_OT_subdivide(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/************************ remove doubles opertor *********************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Remove Doubles Operator
+ * \{ */
static int remove_doubles_exec(bContext *C, wmOperator *op)
{
@@ -3192,7 +3328,11 @@ void PARTICLE_OT_weight_set(wmOperatorType *ot)
1);
}
-/************************ cursor drawing *******************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Cursor Drawing
+ * \{ */
static void brush_drawcursor(bContext *C, int x, int y, void *UNUSED(customdata))
{
@@ -3238,7 +3378,11 @@ static void toggle_particle_cursor(Scene *scene, bool enable)
}
}
-/*************************** delete operator **************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Delete Operator
+ * \{ */
enum { DEL_PARTICLE, DEL_KEY };
@@ -3314,7 +3458,11 @@ void PARTICLE_OT_delete(wmOperatorType *ot)
"Delete a full particle or only keys");
}
-/*************************** mirror operator **************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Mirror Operator
+ * \{ */
static void PE_mirror_x(Depsgraph *depsgraph, Scene *scene, Object *ob, int tagged)
{
@@ -3526,7 +3674,11 @@ void PARTICLE_OT_mirror(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/************************* brush edit callbacks ********************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Brush Edit Callbacks
+ * \{ */
static void brush_comb(PEData *data,
float UNUSED(mat[4][4]),
@@ -3750,8 +3902,7 @@ static void brush_puff(PEData *data, int point_index, float mouse_distance)
}
}
else {
- /* compute position as if hair was standing up straight.
- * */
+ /* Compute position as if hair was standing up straight. */
float length;
copy_v3_v3(co_prev, co);
copy_v3_v3(co, key->co);
@@ -4475,7 +4626,11 @@ static int brush_add(const bContext *C, PEData *data, short number)
return n;
}
-/************************* brush edit operator ********************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Brush Edit Operator
+ * \{ */
typedef struct BrushEdit {
Scene *scene;
@@ -4566,7 +4721,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
mval[0] = mouse[0];
mval[1] = mouse[1];
- /* disable locking temporatily for disconnected hair */
+ /* Disable locking temporarily for disconnected hair. */
if (edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR) {
pset->flag &= ~PE_LOCK_FIRST;
}
@@ -4865,7 +5020,11 @@ void PARTICLE_OT_brush_edit(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
-/*********************** cut shape ***************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Cut Shape
+ * \{ */
static bool shape_cut_poll(bContext *C)
{
@@ -5004,7 +5163,7 @@ static int shape_cut_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_CANCELLED;
}
- /* disable locking temporatily for disconnected hair */
+ /* Disable locking temporarily for disconnected hair. */
if (edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR) {
pset->flag &= ~PE_LOCK_FIRST;
}
@@ -5071,54 +5230,11 @@ void PARTICLE_OT_shape_cut(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/************************ utilities ******************************/
-
-int PE_minmax(
- Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, float min[3], float max[3])
-{
- Object *ob = OBACT(view_layer);
- PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob);
- ParticleSystem *psys;
- ParticleSystemModifierData *psmd_eval = NULL;
- POINT_P;
- KEY_K;
- float co[3], mat[4][4];
- int ok = 0;
-
- if (!edit) {
- return ok;
- }
-
- if ((psys = edit->psys)) {
- psmd_eval = edit->psmd_eval;
- }
- else {
- unit_m4(mat);
- }
+/** \} */
- LOOP_VISIBLE_POINTS {
- if (psys) {
- psys_mat_hair_to_global(
- ob, psmd_eval->mesh_final, psys->part->from, psys->particles + p, mat);
- }
-
- LOOP_SELECTED_KEYS {
- copy_v3_v3(co, key->co);
- mul_m4_v3(mat, co);
- DO_MINMAX(co, min, max);
- ok = 1;
- }
- }
-
- if (!ok) {
- BKE_object_minmax(ob, min, max, true);
- ok = 1;
- }
-
- return ok;
-}
-
-/************************ particle edit toggle operator ************************/
+/* -------------------------------------------------------------------- */
+/** \name Particle Edit Toggle Operator
+ * \{ */
/* initialize needed data for bake edit */
void PE_create_particle_edit(
@@ -5372,7 +5488,11 @@ void PARTICLE_OT_particle_edit_toggle(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/************************ set editable operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Set Editable Operator
+ * \{ */
static int clear_edited_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -5422,7 +5542,11 @@ void PARTICLE_OT_edited_clear(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/************************ Unify length operator ************************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Unify length operator
+ * \{ */
static float calculate_point_length(PTCacheEditPoint *point)
{
@@ -5534,3 +5658,5 @@ void PARTICLE_OT_unify_length(struct wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
+
+/** \} */
diff --git a/source/blender/editors/physics/particle_edit_undo.c b/source/blender/editors/physics/particle_edit_undo.c
index 77b8d410d81..5d2e0e5b6ef 100644
--- a/source/blender/editors/physics/particle_edit_undo.c
+++ b/source/blender/editors/physics/particle_edit_undo.c
@@ -247,7 +247,7 @@ static bool particle_undosys_step_encode(struct bContext *C,
static void particle_undosys_step_decode(struct bContext *C,
struct Main *UNUSED(bmain),
UndoStep *us_p,
- int UNUSED(dir),
+ const eUndoStepDir UNUSED(dir),
bool UNUSED(is_final))
{
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index 32d2e39d6f6..a94a2b9b764 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -33,21 +33,17 @@
#include "DNA_object_types.h"
#include "BLI_blenlib.h"
-#include "BLI_math.h"
#include "BLI_path_util.h"
#include "BLI_utildefines.h"
#include "BLT_translation.h"
#include "BKE_context.h"
-#include "BKE_customdata.h"
#include "BKE_fluid.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
-#include "BKE_object.h"
#include "BKE_report.h"
-#include "BKE_scene.h"
#include "BKE_screen.h"
#include "DEG_depsgraph.h"
@@ -59,11 +55,9 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "manta_fluid_API.h"
#include "physics_intern.h" /* own include */
#include "DNA_fluid_types.h"
-#include "DNA_mesh_types.h"
#include "DNA_scene_types.h"
#define FLUID_JOB_BAKE_ALL "FLUID_OT_bake_all"
diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c
index eb154b97eb0..f5b80679689 100644
--- a/source/blender/editors/physics/physics_ops.c
+++ b/source/blender/editors/physics/physics_ops.c
@@ -23,14 +23,9 @@
#include <stdlib.h>
-#include "RNA_access.h"
-
#include "WM_api.h"
-#include "WM_types.h"
-#include "ED_object.h"
#include "ED_physics.h"
-#include "ED_select_utils.h"
#include "physics_intern.h" /* own include */
diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c
index 1d5903bf417..ea8a4ce2a79 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -34,7 +34,6 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_layer.h"
-#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "DEG_depsgraph.h"
diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c
index 4fd304ea71d..81a8b57776b 100644
--- a/source/blender/editors/physics/rigidbody_object.c
+++ b/source/blender/editors/physics/rigidbody_object.c
@@ -34,9 +34,7 @@
#include "BLT_translation.h"
-#include "BKE_collection.h"
#include "BKE_context.h"
-#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_rigidbody.h"
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 10cf4131584..50ba5907703 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -43,14 +43,10 @@
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
-#include "BKE_blender_undo.h"
-#include "BKE_blender_version.h"
-#include "BKE_camera.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
-#include "BKE_layer.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_node.h"
@@ -58,19 +54,15 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "BKE_undo_system.h"
#include "DEG_depsgraph.h"
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_object.h"
#include "ED_render.h"
#include "ED_screen.h"
-#include "ED_undo.h"
#include "ED_util.h"
-#include "ED_view3d.h"
#include "BIF_glutil.h"
@@ -85,8 +77,6 @@
#include "SEQ_relations.h"
-#include "BLO_undofile.h"
-
#include "render_intern.h"
/* Render Callbacks */
@@ -1098,7 +1088,7 @@ void RENDER_OT_render(wmOperatorType *ot)
ot->cancel = screen_render_cancel;
ot->exec = screen_render_exec;
- /* this isn't needed, causes failer in background mode */
+ /* This isn't needed, causes failure in background mode. */
#if 0
ot->poll = ED_operator_screenactive;
#endif
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index 546156e3406..48f937fb4ec 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -351,7 +351,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R
G.f &= ~G_FLAG_RENDER_VIEWPORT;
gp_rect = MEM_mallocN(sizeof(uchar[4]) * sizex * sizey, "offscreen rect");
- GPU_offscreen_read_pixels(oglrender->ofs, GPU_DATA_UNSIGNED_BYTE, gp_rect);
+ GPU_offscreen_read_pixels(oglrender->ofs, GPU_DATA_UBYTE, gp_rect);
for (i = 0; i < sizex * sizey * 4; i += 4) {
blend_color_mix_byte(&render_rect[i], &render_rect[i], &gp_rect[i]);
@@ -363,7 +363,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R
}
}
else {
- /* shouldnt suddenly give errors mid-render but possible */
+ /* shouldn't suddenly give errors mid-render but possible */
char err_out[256] = "unknown";
ImBuf *ibuf_view;
const int alpha_mode = (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL;
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 6cf8515bdbb..4e766841c24 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -200,6 +200,11 @@ static bool check_engine_supports_preview(Scene *scene)
return (type->flag & RE_USE_PREVIEW) != 0;
}
+static bool preview_method_is_render(int pr_method)
+{
+ return ELEM(pr_method, PR_ICON_RENDER, PR_BUTS_RENDER, PR_NODE_RENDER);
+}
+
void ED_preview_free_dbase(void)
{
if (G_pr_main) {
@@ -1179,7 +1184,7 @@ static void icon_copy_rect(ImBuf *ibuf, uint w, uint h, uint *rect)
return;
}
- /* waste of cpu cyles... but the imbuf API has no other way to scale fast (ton) */
+ /* Waste of cpu cycles... but the imbuf API has no other way to scale fast (ton). */
ima = IMB_dupImBuf(ibuf);
if (!ima) {
@@ -1352,13 +1357,12 @@ static void common_preview_startjob(void *customdata,
*/
static void other_id_types_preview_render(IconPreview *ip,
IconPreviewSize *cur_size,
- const bool is_deferred,
+ const int pr_method,
short *stop,
short *do_update,
float *progress)
{
ShaderPreview *sp = MEM_callocN(sizeof(ShaderPreview), "Icon ShaderPreview");
- const bool is_render = !is_deferred;
/* These types don't use the ShaderPreview mess, they have their own types and functions. */
BLI_assert(!ip->id || !ELEM(GS(ip->id->name), ID_OB));
@@ -1368,7 +1372,7 @@ static void other_id_types_preview_render(IconPreview *ip,
sp->owner = ip->owner;
sp->sizex = cur_size->sizex;
sp->sizey = cur_size->sizey;
- sp->pr_method = is_render ? PR_ICON_RENDER : PR_ICON_DEFERRED;
+ sp->pr_method = pr_method;
sp->pr_rect = cur_size->rect;
sp->id = ip->id;
sp->id_copy = ip->id_copy;
@@ -1376,7 +1380,7 @@ static void other_id_types_preview_render(IconPreview *ip,
sp->own_id_copy = false;
Material *ma = NULL;
- if (is_render) {
+ if (sp->pr_method == PR_ICON_RENDER) {
BLI_assert(ip->id);
/* grease pencil use its own preview file */
@@ -1424,6 +1428,8 @@ static void icon_preview_startjob_all_sizes(void *customdata,
for (cur_size = ip->sizes.first; cur_size; cur_size = cur_size->next) {
PreviewImage *prv = ip->owner;
+ /* Is this a render job or a deferred loading job? */
+ const int pr_method = (prv->tag & PRV_TAG_DEFFERED) ? PR_ICON_DEFERRED : PR_ICON_RENDER;
if (*stop) {
break;
@@ -1434,7 +1440,7 @@ static void icon_preview_startjob_all_sizes(void *customdata,
continue;
}
- if (!check_engine_supports_preview(ip->scene)) {
+ if (preview_method_is_render(pr_method) && !check_engine_supports_preview(ip->scene)) {
continue;
}
@@ -1450,8 +1456,7 @@ static void icon_preview_startjob_all_sizes(void *customdata,
object_preview_render(ip, cur_size);
}
else {
- other_id_types_preview_render(
- ip, cur_size, (prv->tag & PRV_TAG_DEFFERED), stop, do_update, progress);
+ other_id_types_preview_render(ip, cur_size, pr_method, stop, do_update, progress);
}
}
}
@@ -1634,7 +1639,7 @@ void ED_preview_shader_job(const bContext *C,
/* Use workspace render only for buttons Window,
* since the other previews are related to the datablock. */
- if (!check_engine_supports_preview(scene)) {
+ if (preview_method_is_render(method) && !check_engine_supports_preview(scene)) {
return;
}
diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c
index 499ffac6028..4ed1cbd60a5 100644
--- a/source/blender/editors/render/render_update.c
+++ b/source/blender/editors/render/render_update.c
@@ -25,7 +25,6 @@
#include "DNA_light_types.h"
#include "DNA_material_types.h"
-#include "DNA_meshdata_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -33,7 +32,6 @@
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
#include "DNA_windowmanager_types.h"
-#include "DNA_workspace_types.h"
#include "DNA_world_types.h"
#include "DRW_engine.h"
@@ -44,13 +42,11 @@
#include "BKE_context.h"
#include "BKE_icons.h"
-#include "BKE_layer.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_paint.h"
#include "BKE_scene.h"
-#include "BKE_workspace.h"
#include "RE_engine.h"
#include "RE_pipeline.h"
@@ -65,8 +61,6 @@
#include "WM_api.h"
-#include "render_intern.h" /* own include */
-
#include <stdio.h>
/***************************** Render Engines ********************************/
diff --git a/source/blender/editors/render/render_view.c b/source/blender/editors/render/render_view.c
index fd5963b217b..465438f814a 100644
--- a/source/blender/editors/render/render_view.c
+++ b/source/blender/editors/render/render_view.c
@@ -157,8 +157,16 @@ ScrArea *render_view_open(bContext *C, int mx, int my, ReportList *reports)
}
/* changes context! */
- if (WM_window_open_temp(
- C, IFACE_("Blender Render"), mx, my, sizex, sizey, SPACE_IMAGE, false) == NULL) {
+ if (WM_window_open(C,
+ IFACE_("Blender Render"),
+ mx,
+ my,
+ sizex,
+ sizey,
+ SPACE_IMAGE,
+ false,
+ true,
+ WIN_ALIGN_LOCATION_CENTER) == NULL) {
BKE_report(reports, RPT_ERROR, "Failed to open window!");
return NULL;
}
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 581169d823e..2c71345699f 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -141,13 +141,15 @@ void ED_region_pixelspace(ARegion *region)
}
/* only exported for WM */
-void ED_region_do_listen(
- wmWindow *win, ScrArea *area, ARegion *region, wmNotifier *note, const Scene *scene)
+void ED_region_do_listen(wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *notifier = params->notifier;
+
/* generic notes first */
- switch (note->category) {
+ switch (notifier->category) {
case NC_WM:
- if (note->data == ND_FILEREAD) {
+ if (notifier->data == ND_FILEREAD) {
ED_region_tag_redraw(region);
}
break;
@@ -157,16 +159,16 @@ void ED_region_do_listen(
}
if (region->type && region->type->listener) {
- region->type->listener(win, area, region, note, scene);
+ region->type->listener(params);
}
}
/* only exported for WM */
-void ED_area_do_listen(wmWindow *win, ScrArea *area, wmNotifier *note, Scene *scene)
+void ED_area_do_listen(wmSpaceTypeListenerParams *params)
{
/* no generic notes? */
- if (area->type && area->type->listener) {
- area->type->listener(win, area, note, scene);
+ if (params->area->type && params->area->type->listener) {
+ params->area->type->listener(params);
}
}
@@ -289,7 +291,15 @@ static void region_draw_azone_tab_arrow(ScrArea *area, ARegion *region, AZone *a
float alpha = WM_region_use_viewport(area, region) ? 0.6f : 0.4f;
const float color[4] = {0.05f, 0.05f, 0.05f, alpha};
UI_draw_roundbox_aa(
- true, (float)az->x1, (float)az->y1, (float)az->x2, (float)az->y2, 4.0f, color);
+ &(const rctf){
+ .xmin = (float)az->x1,
+ .xmax = (float)az->x2,
+ .ymin = (float)az->y1,
+ .ymax = (float)az->y2,
+ },
+ true,
+ 4.0f,
+ color);
draw_azone_arrow((float)az->x1, (float)az->y1, (float)az->x2, (float)az->y2, az->edge);
}
@@ -373,7 +383,16 @@ static void region_draw_status_text(ScrArea *area, ARegion *region)
float color[4] = {0.0f, 0.0f, 0.0f, 0.5f};
UI_GetThemeColor3fv(TH_BACK, color);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(true, x1, y1, x2, y2, 4.0f, color);
+ UI_draw_roundbox_aa(
+ &(const rctf){
+ .xmin = x1,
+ .xmax = x2,
+ .ymin = y1,
+ .ymax = y2,
+ },
+ true,
+ 4.0f,
+ color);
UI_FontThemeColor(fontid, TH_TEXT);
}
@@ -418,16 +437,13 @@ void ED_area_do_msg_notify_tag_refresh(
ED_area_tag_refresh(area);
}
-void ED_area_do_mgs_subscribe_for_tool_header(
- /* Follow ARegionType.message_subscribe */
- const struct bContext *UNUSED(C),
- struct WorkSpace *workspace,
- struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen),
- struct ScrArea *UNUSED(area),
- struct ARegion *region,
- struct wmMsgBus *mbus)
+/* Follow ARegionType.message_subscribe */
+void ED_area_do_mgs_subscribe_for_tool_header(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ WorkSpace *workspace = params->workspace;
+ ARegion *region = params->region;
+
BLI_assert(region->regiontype == RGN_TYPE_TOOL_HEADER);
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
@@ -438,16 +454,12 @@ void ED_area_do_mgs_subscribe_for_tool_header(
mbus, &workspace->id, workspace, WorkSpace, tools, &msg_sub_value_region_tag_redraw);
}
-void ED_area_do_mgs_subscribe_for_tool_ui(
- /* Follow ARegionType.message_subscribe */
- const struct bContext *UNUSED(C),
- struct WorkSpace *workspace,
- struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen),
- struct ScrArea *UNUSED(area),
- struct ARegion *region,
- struct wmMsgBus *mbus)
+void ED_area_do_mgs_subscribe_for_tool_ui(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ WorkSpace *workspace = params->workspace;
+ ARegion *region = params->region;
+
BLI_assert(region->regiontype == RGN_TYPE_UI);
const char *panel_category_tool = "Tool";
const char *category = UI_panel_category_active_get(region, false);
@@ -634,7 +646,16 @@ void ED_region_do_draw(bContext *C, ARegion *region)
WM_msg_subscribe_rna(mbus, &ptr, NULL, &msg_sub_value_region_tag_redraw, __func__);
}
- ED_region_message_subscribe(C, workspace, scene, screen, area, region, mbus);
+ wmRegionMessageSubscribeParams message_subscribe_params = {
+ .context = C,
+ .message_bus = mbus,
+ .workspace = workspace,
+ .scene = scene,
+ .screen = screen,
+ .area = area,
+ .region = region,
+ };
+ ED_region_message_subscribe(&message_subscribe_params);
}
}
@@ -4027,14 +4048,12 @@ void ED_region_cache_draw_cached_segments(
/**
* Generate subscriptions for this region.
*/
-void ED_region_message_subscribe(bContext *C,
- struct WorkSpace *workspace,
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+void ED_region_message_subscribe(wmRegionMessageSubscribeParams *params)
{
+ ARegion *region = params->region;
+ const bContext *C = params->context;
+ struct wmMsgBus *mbus = params->message_bus;
+
if (region->gizmo_map != NULL) {
WM_gizmomap_message_subscribe(C, region->gizmo_map, region, mbus);
}
@@ -4044,7 +4063,7 @@ void ED_region_message_subscribe(bContext *C,
}
if (region->type->message_subscribe != NULL) {
- region->type->message_subscribe(C, workspace, scene, screen, area, region, mbus);
+ region->type->message_subscribe(params);
}
}
diff --git a/source/blender/editors/screen/area_utils.c b/source/blender/editors/screen/area_utils.c
index 075759f1120..30553bb7f07 100644
--- a/source/blender/editors/screen/area_utils.c
+++ b/source/blender/editors/screen/area_utils.c
@@ -22,6 +22,8 @@
#include "DNA_userdef_types.h"
+#include "BKE_screen.h"
+
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
@@ -32,7 +34,6 @@
#include "ED_screen.h"
-#include "UI_interface.h"
#include "UI_interface_icons.h"
/* -------------------------------------------------------------------- */
@@ -42,14 +43,11 @@
/**
* Callback for #ARegionType.message_subscribe
*/
-void ED_region_generic_tools_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen),
- struct ScrArea *UNUSED(area),
- struct ARegion *region,
- struct wmMsgBus *mbus)
+void ED_region_generic_tools_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ ARegion *region = params->region;
+
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
.user_data = region,
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index 33b918e6d4d..e366760a55d 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -57,11 +57,12 @@ static void immDrawPixelsTexSetupAttributes(IMMDrawPixelsTexState *state)
vert_format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
}
-/* To be used before calling immDrawPixelsTex
- * Default shader is GPU_SHADER_2D_IMAGE_COLOR
- * You can still set uniforms with :
- * GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "name"), 0);
- * */
+/**
+ * To be used before calling #immDrawPixelsTex
+ * Default shader is #GPU_SHADER_2D_IMAGE_COLOR
+ * You can still set uniforms with:
+ * `GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "name"), 0);`
+ */
IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
{
IMMDrawPixelsTexState state;
@@ -77,10 +78,11 @@ IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
return state;
}
-/* Use the currently bound shader.
+/**
+ * Use the currently bound shader.
*
- * Use immDrawPixelsTexSetup to bind the shader you
- * want before calling immDrawPixelsTex.
+ * Use #immDrawPixelsTexSetup to bind the shader you
+ * want before calling #immDrawPixelsTex.
*
* If using a special shader double check it uses the same
* attributes "pos" "texCoord" and uniform "image".
@@ -89,7 +91,7 @@ IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
*
* Be also aware that this function unbinds the shader when
* it's finished.
- * */
+ */
void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state,
float x,
float y,
@@ -129,7 +131,7 @@ void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state,
}
const bool use_float_data = ELEM(gpu_format, GPU_RGBA16F, GPU_RGB16F, GPU_R16F);
- eGPUDataFormat gpu_data = (use_float_data) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE;
+ eGPUDataFormat gpu_data = (use_float_data) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE;
size_t stride = components * ((use_float_data) ? sizeof(float) : sizeof(uchar));
GPUTexture *tex = GPU_texture_create_2d("immDrawPixels", tex_w, tex_h, 1, gpu_format, NULL);
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index 1dfe606be78..627a67358f2 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -866,7 +866,7 @@ static eContextResult screen_ctx_editable_gpencil_strokes(const bContext *C,
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
if (ED_gpencil_stroke_can_use_direct(area, gps)) {
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
continue;
}
diff --git a/source/blender/editors/screen/screen_draw.c b/source/blender/editors/screen/screen_draw.c
index 6432bdac1b1..2ba7ef8f972 100644
--- a/source/blender/editors/screen/screen_draw.c
+++ b/source/blender/editors/screen/screen_draw.c
@@ -478,7 +478,7 @@ void ED_screen_draw_split_preview(ScrArea *area, const int dir, const float fac)
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
- /* splitpoint */
+ /* Split-point. */
GPU_blend(GPU_BLEND_ALPHA);
immUniformColor4ub(255, 255, 255, 100);
@@ -610,7 +610,7 @@ void ED_screen_preview_render(const bScreen *screen, int size_x, int size_y, uin
screen_preview_draw(screen, size_x, size_y);
- GPU_offscreen_read_pixels(offscreen, GPU_DATA_UNSIGNED_BYTE, r_rect);
+ GPU_offscreen_read_pixels(offscreen, GPU_DATA_UBYTE, r_rect);
GPU_offscreen_unbind(offscreen, true);
GPU_offscreen_free(offscreen);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index be52874ed0b..3e498522071 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -871,6 +871,11 @@ static void screen_global_area_refresh(wmWindow *win,
const short height_min,
const short height_max)
{
+ /* Full-screens shouldn't have global areas. Don't touch them. */
+ if (screen->state == SCREENFULL) {
+ return;
+ }
+
ScrArea *area = NULL;
LISTBASE_FOREACH (ScrArea *, area_iter, &win->global_areas.areabase) {
if (area_iter->spacetype == space_type) {
@@ -1019,7 +1024,7 @@ void screen_change_update(bContext *C, wmWindow *win, bScreen *screen)
WM_event_add_notifier(C, NC_WINDOW, NULL);
WM_event_add_notifier(C, NC_SCREEN | ND_LAYOUTSET, layout);
- /* makes button hilites work */
+ /* Makes button highlights work. */
WM_event_add_mousemove(win);
}
@@ -1216,7 +1221,7 @@ void ED_screen_full_restore(bContext *C, ScrArea *area)
}
/**
- * \param toggle_area: If this is set, its space data will be swapped with the one of the new emtpy
+ * \param toggle_area: If this is set, its space data will be swapped with the one of the new empty
* area, when toggling back it can be swapped back again.
* \return The newly created screen with the non-normal area.
*/
@@ -1436,7 +1441,16 @@ ScrArea *ED_screen_temp_space_open(bContext *C,
switch (display_type) {
case USER_TEMP_SPACE_DISPLAY_WINDOW:
- if (WM_window_open_temp(C, title, x, y, sizex, sizey, (int)space_type, dialog)) {
+ if (WM_window_open(C,
+ title,
+ x,
+ y,
+ sizex,
+ sizey,
+ (int)space_type,
+ dialog,
+ true,
+ WIN_ALIGN_LOCATION_CENTER)) {
area = CTX_wm_area(C);
}
break;
@@ -1551,7 +1565,7 @@ void ED_screen_animation_timer(bContext *C, int redraws, int sync, int enable)
/* Seek audio to ensure playback in preview range with AV sync. */
DEG_id_tag_update(&scene->id, ID_RECALC_AUDIO_SEEK);
- /* notifier catched by top header, for button */
+ /* Notifier caught by top header, for button. */
WM_event_add_notifier(C, NC_SCREEN | ND_ANIMPLAY, NULL);
}
diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h
index a03e65d8a9d..c51ff559786 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -29,10 +29,10 @@ struct bContextDataResult;
/* internal exports only */
-#define AZONESPOTW UI_HEADER_OFFSET /* width of corner azone - max */
-#define AZONESPOTH (0.6f * U.widget_unit) /* height of corner azone */
-#define AZONEFADEIN (5.0f * U.widget_unit) /* when azone is totally visible */
-#define AZONEFADEOUT (6.5f * U.widget_unit) /* when we start seeing the azone */
+#define AZONESPOTW UI_HEADER_OFFSET /* width of corner #AZone - max */
+#define AZONESPOTH (0.6f * U.widget_unit) /* height of corner #AZone */
+#define AZONEFADEIN (5.0f * U.widget_unit) /* when #AZone is totally visible */
+#define AZONEFADEOUT (6.5f * U.widget_unit) /* when we start seeing the #AZone */
#define AREAJOINTOLERANCE (1.0f * U.widget_unit) /* Edges must be close to allow joining. */
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index ca1c75be0a1..8a53154cc85 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1332,67 +1332,46 @@ static void SCREEN_OT_area_swap(wmOperatorType *ot)
/* operator callback */
static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- Main *bmain = CTX_data_main(C);
- wmWindow *win = CTX_wm_window(C);
- WorkSpace *workspace = WM_window_get_active_workspace(win);
- WorkSpaceLayout *layout_old = WM_window_get_active_layout(win);
-
- Scene *scene = CTX_data_scene(C);
ScrArea *area = CTX_wm_area(C);
- /* XXX hrmf! */
- if (event->type == EVT_ACTIONZONE_AREA) {
+ if (event && event->customdata) {
sActionzoneData *sad = event->customdata;
-
if (sad == NULL) {
return OPERATOR_PASS_THROUGH;
}
-
area = sad->sa1;
}
- /* adds window to WM */
- rcti rect = area->totrct;
- BLI_rcti_translate(&rect, win->posx, win->posy);
- rect.xmax = rect.xmin + BLI_rcti_size_x(&rect);
- rect.ymax = rect.ymin + BLI_rcti_size_y(&rect);
+ /* Create new window. No need to set space_type since it will be copied over. */
+ wmWindow *newwin = WM_window_open(C,
+ "Blender",
+ area->totrct.xmin,
+ area->totrct.ymin,
+ area->winx,
+ area->winy,
+ SPACE_EMPTY,
+ true,
+ false,
+ WIN_ALIGN_ABSOLUTE);
- wmWindow *newwin = WM_window_open(C, &rect);
- if (newwin == NULL) {
+ if (newwin) {
+ /* copy area to new screen */
+ bScreen *newsc = WM_window_get_active_screen(newwin);
+ ED_area_data_copy((ScrArea *)newsc->areabase.first, area, true);
+ ED_area_tag_redraw((ScrArea *)newsc->areabase.first);
+
+ /* screen, areas init */
+ WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL);
+ }
+ else {
BKE_report(op->reports, RPT_ERROR, "Failed to open window!");
- goto finally;
}
- *newwin->stereo3d_format = *win->stereo3d_format;
-
- newwin->scene = scene;
-
- STRNCPY(newwin->view_layer_name, win->view_layer_name);
-
- BKE_workspace_active_set(newwin->workspace_hook, workspace);
- /* allocs new screen and adds to newly created window, using window size */
- WorkSpaceLayout *layout_new = ED_workspace_layout_add(
- bmain, workspace, newwin, BKE_workspace_layout_name_get(layout_old));
- bScreen *newsc = BKE_workspace_layout_screen_get(layout_new);
- WM_window_set_active_layout(newwin, workspace, layout_new);
-
- /* copy area to new screen */
- ED_area_data_copy((ScrArea *)newsc->areabase.first, area, true);
-
- ED_area_tag_redraw((ScrArea *)newsc->areabase.first);
-
- /* screen, areas init */
- WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL);
-
-finally:
- if (event->type == EVT_ACTIONZONE_AREA) {
+ if (event && event->customdata) {
actionzone_exit(op);
}
- if (newwin) {
- return OPERATOR_FINISHED;
- }
- return OPERATOR_CANCELLED;
+ return newwin ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
static void SCREEN_OT_area_dupli(wmOperatorType *ot)
@@ -1637,7 +1616,7 @@ static int area_snap_calc_location(const bScreen *screen,
/* Thirds. */
1.0f / 3.0f,
2.0f / 3.0f,
- /* Quaters. */
+ /* Quarters. */
1.0f / 4.0f,
3.0f / 4.0f,
/* Eighth. */
@@ -4866,14 +4845,16 @@ static int userpref_show_exec(bContext *C, wmOperator *op)
int sizey = 520 * UI_DPI_FAC;
/* changes context! */
- if (WM_window_open_temp(C,
- IFACE_("Blender Preferences"),
- event->x,
- event->y,
- sizex,
- sizey,
- SPACE_USERPREF,
- false) != NULL) {
+ if (WM_window_open(C,
+ IFACE_("Blender Preferences"),
+ event->x,
+ event->y,
+ sizex,
+ sizey,
+ SPACE_USERPREF,
+ false,
+ true,
+ WIN_ALIGN_LOCATION_CENTER) != NULL) {
/* The header only contains the editor switcher and looks empty.
* So hiding in the temp window makes sense. */
ScrArea *area = CTX_wm_area(C);
@@ -4925,14 +4906,16 @@ static int drivers_editor_show_exec(bContext *C, wmOperator *op)
uiBut *but = UI_context_active_but_prop_get(C, &ptr, &prop, &index);
/* changes context! */
- if (WM_window_open_temp(C,
- IFACE_("Blender Drivers Editor"),
- event->x,
- event->y,
- sizex,
- sizey,
- SPACE_GRAPH,
- false) != NULL) {
+ if (WM_window_open(C,
+ IFACE_("Blender Drivers Editor"),
+ event->x,
+ event->y,
+ sizex,
+ sizey,
+ SPACE_GRAPH,
+ false,
+ true,
+ WIN_ALIGN_LOCATION_CENTER) != NULL) {
ED_drivers_editor_init(C, CTX_wm_area(C));
/* activate driver F-Curve for the property under the cursor */
@@ -4991,14 +4974,16 @@ static int info_log_show_exec(bContext *C, wmOperator *op)
int shift_y = 480;
/* changes context! */
- if (WM_window_open_temp(C,
- IFACE_("Blender Info Log"),
- event->x,
- event->y + shift_y,
- sizex,
- sizey,
- SPACE_INFO,
- false) != NULL) {
+ if (WM_window_open(C,
+ IFACE_("Blender Info Log"),
+ event->x,
+ event->y + shift_y,
+ sizex,
+ sizey,
+ SPACE_INFO,
+ false,
+ true,
+ WIN_ALIGN_LOCATION_CENTER) != NULL) {
return OPERATOR_FINISHED;
}
BKE_report(op->reports, RPT_ERROR, "Failed to open window!");
@@ -5083,7 +5068,7 @@ static void SCREEN_OT_delete(wmOperatorType *ot)
/** \name Region Alpha Blending Operator
*
* Implementation note: a disappearing region needs at least 1 last draw with
- * 100% backbuffer texture over it - then triple buffer will clear it entirely.
+ * 100% back-buffer texture over it - then triple buffer will clear it entirely.
* This because flag #RGN_FLAG_HIDDEN is set in end - region doesn't draw at all then.
*
* \{ */
@@ -5567,8 +5552,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
/* dropbox for entire window */
ListBase *lb = WM_dropboxmap_find("Window", 0, 0);
- WM_dropbox_add(lb, "WM_OT_drop_blend_file", blend_file_drop_poll, blend_file_drop_copy);
- WM_dropbox_add(lb, "UI_OT_drop_color", UI_drop_color_poll, UI_drop_color_copy);
+ WM_dropbox_add(lb, "WM_OT_drop_blend_file", blend_file_drop_poll, blend_file_drop_copy, NULL);
+ WM_dropbox_add(lb, "UI_OT_drop_color", UI_drop_color_poll, UI_drop_color_copy, NULL);
keymap_modal_set(keyconf);
}
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 5430137f5ca..b99cb831bee 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -234,7 +234,6 @@ void ED_workspace_scene_data_sync(WorkSpaceInstanceHook *hook, Scene *scene)
/* -------------------------------------------------------------------- */
/** \name Workspace Operators
- *
* \{ */
static WorkSpace *workspace_context_get(bContext *C)
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c
index 550913fc8af..e9f33d2fbd3 100644
--- a/source/blender/editors/sculpt_paint/paint_cursor.c
+++ b/source/blender/editors/sculpt_paint/paint_cursor.c
@@ -350,7 +350,7 @@ static int load_tex(Brush *br, ViewContext *vc, float zoom, bool col, bool prima
eGPUTextureFormat format = col ? GPU_RGBA8 : GPU_R8;
target->overlay_texture = GPU_texture_create_2d(
"paint_cursor_overlay", size, size, 1, format, NULL);
- GPU_texture_update(target->overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer);
+ GPU_texture_update(target->overlay_texture, GPU_DATA_UBYTE, buffer);
if (!col) {
GPU_texture_swizzle_set(target->overlay_texture, "rrrr");
@@ -358,7 +358,7 @@ static int load_tex(Brush *br, ViewContext *vc, float zoom, bool col, bool prima
}
if (init) {
- GPU_texture_update(target->overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer);
+ GPU_texture_update(target->overlay_texture, GPU_DATA_UBYTE, buffer);
}
if (buffer) {
@@ -469,13 +469,13 @@ static int load_tex_cursor(Brush *br, ViewContext *vc, float zoom)
if (!cursor_snap.overlay_texture) {
cursor_snap.overlay_texture = GPU_texture_create_2d(
"cursor_snap_overaly", size, size, 1, GPU_R8, NULL);
- GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer);
+ GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UBYTE, buffer);
GPU_texture_swizzle_set(cursor_snap.overlay_texture, "rrrr");
}
if (init) {
- GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer);
+ GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UBYTE, buffer);
}
if (buffer) {
@@ -1755,7 +1755,7 @@ static void paint_cursor_cursor_draw_3d_view_brush_cursor_active(PaintCursorCont
else if (brush->cloth_force_falloff_type == BRUSH_CLOTH_FORCE_FALLOFF_RADIAL &&
brush->cloth_simulation_area_type == BRUSH_CLOTH_SIMULATION_AREA_LOCAL) {
/* Display the simulation limits if sculpting outside them. */
- /* This does not makes much sense of plane falloff as the falloff is infinte or global. */
+ /* This does not makes much sense of plane falloff as the falloff is infinite or global. */
if (len_v3v3(ss->cache->true_location, ss->cache->true_initial_location) >
ss->cache->radius * (1.0f + brush->cloth_sim_limit)) {
diff --git a/source/blender/editors/sculpt_paint/paint_curve_undo.c b/source/blender/editors/sculpt_paint/paint_curve_undo.c
index a8e22f66734..dbe522bf304 100644
--- a/source/blender/editors/sculpt_paint/paint_curve_undo.c
+++ b/source/blender/editors/sculpt_paint/paint_curve_undo.c
@@ -126,7 +126,7 @@ static bool paintcurve_undosys_step_encode(struct bContext *C,
static void paintcurve_undosys_step_decode(struct bContext *UNUSED(C),
struct Main *UNUSED(bmain),
UndoStep *us_p,
- int UNUSED(dir),
+ const eUndoStepDir UNUSED(dir),
bool UNUSED(is_final))
{
PaintCurveUndoStep *us = (PaintCurveUndoStep *)us_p;
diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c
index 5c15fd05116..f7c0f7718bb 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -138,7 +138,7 @@ BLI_INLINE uchar f_to_char(const float val)
#ifndef PROJ_DEBUG_NOSEAMBLEED
/* projectFaceSeamFlags options */
-//#define PROJ_FACE_IGNORE (1<<0) /* When the face is hidden, backfacing or occluded */
+//#define PROJ_FACE_IGNORE (1<<0) /* When the face is hidden, back-facing or occluded. */
//#define PROJ_FACE_INIT (1<<1) /* When we have initialized the faces data */
/* If this face has a seam on any of its edges. */
@@ -150,7 +150,7 @@ BLI_INLINE uchar f_to_char(const float val)
# define PROJ_FACE_NOSEAM1 (1 << 5)
# define PROJ_FACE_NOSEAM2 (1 << 6)
-/* If the seam is completely initialized, including adjecent seams. */
+/* If the seam is completely initialized, including adjacent seams. */
# define PROJ_FACE_SEAM_INIT0 (1 << 8)
# define PROJ_FACE_SEAM_INIT1 (1 << 9)
# define PROJ_FACE_SEAM_INIT2 (1 << 10)
@@ -294,7 +294,7 @@ typedef struct ProjPaintState {
/** verts projected into floating point screen space. */
float (*screenCoords)[4];
- /** 2D bounds for mesh verts on the screen's plane (screenspace). */
+ /** 2D bounds for mesh verts on the screen's plane (screen-space). */
float screenMin[2];
float screenMax[2];
/** Calculated from screenMin & screenMax. */
@@ -310,10 +310,10 @@ typedef struct ProjPaintState {
bool do_stencil_brush;
bool do_material_slots;
- /** Use raytraced occlusion? - ortherwise will paint right through to the back. */
+ /** Use ray-traced occlusion? - otherwise will paint right through to the back. */
bool do_occlude;
/** ignore faces with normals pointing away,
- * skips a lot of raycasts if your normals are correctly flipped. */
+ * skips a lot of ray-casts if your normals are correctly flipped. */
bool do_backfacecull;
/** mask out pixels based on their normals. */
bool do_mask_normal;
@@ -579,7 +579,7 @@ static Image *project_paint_face_clone_image(const ProjPaintState *ps, int tri_i
/* fast projection bucket array lookup, use the safe version for bound checking */
static int project_bucket_offset(const ProjPaintState *ps, const float projCoSS[2])
{
- /* If we were not dealing with screenspace 2D coords we could simple do...
+ /* If we were not dealing with screen-space 2D coords we could simple do...
* ps->bucketRect[x + (y*ps->buckets_y)] */
/* please explain?
@@ -887,8 +887,8 @@ static int project_paint_occlude_ptv_clip(const float pt[3],
return -1;
}
-/* Check if a screenspace location is occluded by any other faces
- * check, pixelScreenCo must be in screenspace, its Z-Depth only needs to be used for comparison
+/* Check if a screen-space location is occluded by any other faces
+ * check, pixelScreenCo must be in screen-space, its Z-Depth only needs to be used for comparison
* and doesn't need to be correct in relation to X and Y coords
* (this is the case in perspective view) */
static bool project_bucket_point_occluded(const ProjPaintState *ps,
@@ -1514,10 +1514,10 @@ static void project_face_seams_init(const ProjPaintState *ps,
}
#endif // PROJ_DEBUG_NOSEAMBLEED
-/* Converts a UV location to a 3D screenspace location
+/* Converts a UV location to a 3D screen-space location
* Takes a 'uv' and 3 UV coords, and sets the values of pixelScreenCo
*
- * This is used for finding a pixels location in screenspace for painting */
+ * This is used for finding a pixels location in screen-space for painting */
static void screen_px_from_ortho(const float uv[2],
const float v1co[3],
const float v2co[3],
@@ -1537,7 +1537,7 @@ static void screen_px_from_ortho(const float uv[2],
static void screen_px_from_persp(const float uv[2],
const float v1co[4],
const float v2co[4],
- const float v3co[4], /* screenspace coords */
+ const float v3co[4], /* screen-space coords */
const float uv1co[2],
const float uv2co[2],
const float uv3co[2],
@@ -1923,7 +1923,7 @@ static ProjPixel *project_paint_uvpixel_init(const ProjPaintState *ps,
projPixel->newColor.uint = 0;
}
- /* screenspace unclamped, we could keep its z and w values but don't need them at the moment */
+ /* Screen-space unclamped, we could keep its z and w values but don't need them at the moment. */
if (ps->brush->mtex.brush_map_mode == MTEX_MAP_MODE_3D) {
copy_v3_v3(projPixel->worldCoSS, world_spaceCo);
}
@@ -2304,14 +2304,14 @@ static bool project_bucket_isect_circle(const float cent[2],
return false;
}
-/* Note for rect_to_uvspace_ortho() and rect_to_uvspace_persp()
+/* Note for #rect_to_uvspace_ortho() and #rect_to_uvspace_persp()
* in ortho view this function gives good results when bucket_bounds are outside the triangle
* however in some cases, perspective view will mess up with faces
- * that have minimal screenspace area (viewed from the side).
+ * that have minimal screen-space area (viewed from the side).
*
* for this reason its not reliable in this case so we'll use the Simple Barycentric'
- * funcs that only account for points inside the triangle.
- * however switching back to this for ortho is always an option */
+ * functions that only account for points inside the triangle.
+ * however switching back to this for ortho is always an option. */
static void rect_to_uvspace_ortho(const rctf *bucket_bounds,
const float *v1coSS,
@@ -2415,9 +2415,10 @@ static bool IsectPT2Df_limit(
(area_tri_v2(v1, v2, v3))) < limit;
}
-/* Clip the face by a bucket and set the uv-space bucket_bounds_uv
+/**
+ * Clip the face by a bucket and set the uv-space bucket_bounds_uv
* so we have the clipped UV's to do pixel intersection tests with
- * */
+ */
static int float_z_sort_flip(const void *p1, const void *p2)
{
return (((float *)p1)[2] < ((float *)p2)[2] ? 1 : -1);
@@ -2516,8 +2517,8 @@ static void project_bucket_clip_face(const bool is_ortho,
flip = (((line_point_side_v2(v1coSS, v2coSS, v3coSS) > 0.0f) != is_flip_object) !=
(line_point_side_v2(uv1co, uv2co, uv3co) > 0.0f));
- /* all screenspace points are inside the bucket bounding box,
- * this means we don't need to clip and can simply return the UVs */
+ /* All screen-space points are inside the bucket bounding box,
+ * this means we don't need to clip and can simply return the UVs. */
if (flip) { /* facing the back? */
copy_v2_v2(bucket_bounds_uv[0], uv3co);
copy_v2_v2(bucket_bounds_uv[1], uv2co);
@@ -2634,7 +2635,7 @@ static void project_bucket_clip_face(const bool is_ortho,
(line_point_side_v2(uv1co, uv2co, uv3co) > 0.0f));
if (inside_face_flag == ISECT_ALL4) {
- /* bucket is totally inside the screenspace face, we can safely use weights */
+ /* Bucket is totally inside the screen-space face, we can safely use weights. */
if (is_ortho) {
rect_to_uvspace_ortho(
@@ -2655,7 +2656,7 @@ static void project_bucket_clip_face(const bool is_ortho,
* The 2 cases above are where the face is inside the bucket
* or the bucket is inside the face.
*
- * we need to make a convex polyline from the intersection between the screenspace face
+ * we need to make a convex poly-line from the intersection between the screen-space face
* and the bucket bounds.
*
* There are a number of ways this could be done, currently it just collects all
@@ -2996,7 +2997,7 @@ static void project_paint_face_init(const ProjPaintState *ps,
/* vert co screen-space, these will be assigned to lt_vtri[0-2] */
const float *v1coSS, *v2coSS, *v3coSS;
- /* vertex screenspace coords */
+ /* Vertex screen-space coords. */
const float *vCo[3];
float w[3], wco[3];
@@ -3006,9 +3007,9 @@ static void project_paint_face_init(const ProjPaintState *ps,
float pixelScreenCo[4];
bool do_3d_mapping = ps->brush->mtex.brush_map_mode == MTEX_MAP_MODE_3D;
- /* ispace bounds */
+ /* Image-space bounds. */
rcti bounds_px;
- /* vars for getting uvspace bounds */
+ /* Variables for getting UV-space bounds. */
/* bucket bounds in UV space so we can init pixels only for this face, */
float lt_uv_pxoffset[3][2];
@@ -3206,10 +3207,10 @@ static void project_paint_face_init(const ProjPaintState *ps,
/* inset face coords. NOTE!!! ScreenSace for ortho, Worldspace in perspective view */
float insetCos[3][3];
- /* vertex screenspace coords */
+ /* Vertex screen-space coords. */
const float *vCoSS[3];
- /* Store the screenspace coords of the face,
+ /* Store the screen-space coords of the face,
* clipped by the bucket's screen aligned rectangle. */
float bucket_clip_edges[2][2];
float edge_verts_inset_clip[2][3];
@@ -3418,7 +3419,7 @@ static void project_paint_face_init(const ProjPaintState *ps,
}
/**
- * Takes floating point screenspace min/max and
+ * Takes floating point screen-space min/max and
* returns int min/max to be used as indices for ps->bucketRect, ps->bucketFlags
*/
static void project_paint_bucket_bounds(const ProjPaintState *ps,
@@ -3887,7 +3888,7 @@ static void proj_paint_state_cavity_init(ProjPaintState *ps)
float no[3];
mul_v3_fl(edges[a], 1.0f / counter[a]);
normal_short_to_float_v3(no, mv->no);
- /* augment the diffe*/
+ /* Augment the difference. */
cavities[a] = saacos(10.0f * dot_v3v3(no, edges[a])) * (float)M_1_PI;
}
else {
@@ -4307,7 +4308,7 @@ static void project_paint_prepare_all_faces(ProjPaintState *ps,
slot_last = slot;
}
- /* don't allow using the same inage for painting and stencilling */
+ /* Don't allow using the same image for painting and stenciling. */
if (slot->ima == ps->stencil_ima) {
/* Delay continuing the loop until after loop_uvs and bleed faces are initialized.
* While this shouldn't be used, face-winding reads all polys.
@@ -4337,7 +4338,6 @@ static void project_paint_prepare_all_faces(ProjPaintState *ps,
continue;
}
- /* tfbase here should be non-null! */
BLI_assert(mloopuv_base != NULL);
if (is_face_sel && tpage) {
diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c
index bacb3b549e3..26e2bcc42cf 100644
--- a/source/blender/editors/sculpt_paint/paint_mask.c
+++ b/source/blender/editors/sculpt_paint/paint_mask.c
@@ -1073,8 +1073,6 @@ static void sculpt_gesture_trim_calculate_depth(SculptGestureContext *sgcontext)
mid_point_depth = ss->gesture_initial_hit ?
0.0f :
(trim_operation->depth_back + trim_operation->depth_front) * 0.5f;
-
-
}
const float depth_radius = ss->cursor_radius;
diff --git a/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c b/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c
index 7120f6a8748..dbc6044d2d8 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c
@@ -610,7 +610,9 @@ BLI_INLINE uint mcol_alpha_sub(uint col_src, int fac)
return col_mix;
}
-/* wpaint has 'ED_wpaint_blend_tool' */
+/**
+ * \note weight-paint has an equivalent function: #ED_wpaint_blend_tool
+ */
uint ED_vpaint_blend_tool(const int tool, const uint col, const uint paintcol, const int alpha_i)
{
switch ((IMB_BlendMode)tool) {
diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
index 8eb2ebd0f19..8277b485578 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
@@ -168,8 +168,11 @@ void PAINT_OT_weight_from_bones(wmOperatorType *ot)
/** \name Sample Weight Operator
* \{ */
-/* sets wp->weight to the closest weight value to vertex */
-/* note: we cant sample frontbuf, weight colors are interpolated too unpredictable */
+/**
+ * Sets wp->weight to the closest weight value to vertex.
+ *
+ * \note we can't sample front-buffer, weight colors are interpolated too unpredictable.
+ */
static int weight_sample_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
@@ -201,7 +204,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, const wmEvent *even
}
else if (ED_mesh_pick_face(
C, vc.obact, event->mval, ED_MESH_PICK_DEFAULT_FACE_DIST, &index)) {
- /* this relies on knowning the internal worksings of ED_mesh_pick_face_vert() */
+ /* This relies on knowing the internal workings of #ED_mesh_pick_face_vert() */
BKE_report(
op->reports, RPT_WARNING, "The modifier used does not support deformed locations");
}
@@ -570,6 +573,7 @@ typedef struct WPGradient_vertStore {
enum {
VGRAD_STORE_NOP = 0,
VGRAD_STORE_DW_EXIST = (1 << 0),
+ VGRAD_STORE_IS_MODIFIED = (1 << 1)
} flag;
} WPGradient_vertStore;
@@ -604,8 +608,10 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index)
Mesh *me = grad_data->me;
WPGradient_vertStore *vs = &grad_data->vert_cache->elem[index];
- /* Optionally restrict to assigned verices only. */
+ /* Optionally restrict to assigned vertices only. */
if (grad_data->use_vgroup_restrict && ((vs->flag & VGRAD_STORE_DW_EXIST) == 0)) {
+ /* In this case the vertex will never have been touched. */
+ BLI_assert((vs->flag & VGRAD_STORE_IS_MODIFIED) == 0);
return;
}
@@ -634,6 +640,7 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index)
tool, vs->weight_orig, grad_data->weightpaint, alpha * grad_data->brush->alpha);
CLAMP(testw, 0.0f, 1.0f);
dw->weight = testw;
+ vs->flag |= VGRAD_STORE_IS_MODIFIED;
}
else {
MDeformVert *dv = &me->dvert[index];
@@ -649,6 +656,7 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index)
BKE_defvert_remove_group(dv, dw);
}
}
+ vs->flag &= ~VGRAD_STORE_IS_MODIFIED;
}
}
@@ -853,6 +861,20 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op)
MEM_freeN(vert_cache);
}
+ if (scene->toolsettings->auto_normalize) {
+ const int vgroup_num = BLI_listbase_count(&ob->defbase);
+ bool *vgroup_validmap = BKE_object_defgroup_validmap_get(ob, vgroup_num);
+ if (vgroup_validmap != NULL) {
+ MDeformVert *dvert = me->dvert;
+ for (int i = 0; i < me->totvert; i++) {
+ if ((data.vert_cache->elem[i].flag & VGRAD_STORE_IS_MODIFIED) != 0) {
+ BKE_defvert_normalize_lock_single(&dvert[i], vgroup_validmap, vgroup_num, data.def_nr);
+ }
+ }
+ MEM_freeN(vgroup_validmap);
+ }
+ }
+
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c
index dc777572858..a8ba87ac483 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c
@@ -273,10 +273,15 @@ BLI_INLINE float wval_exclusion(float weight, float paintval, float fac)
return temp * fac + weight * mfac;
}
-/* vpaint has 'vpaint_blend_tool' */
-/* result is not clamped from [0-1] */
+/**
+ * \param weight: Typically the current weight: #MDeformWeight.weight
+ *
+ * \return The final weight, note that this is _not_ clamped from [0-1].
+ * Clamping must be done on the final #MDeformWeight.weight
+ *
+ * \note vertex-paint has an equivalent function: #ED_vpaint_blend_tool
+ */
float ED_wpaint_blend_tool(const int tool,
- /* dw->weight */
const float weight,
const float paintval,
const float alpha)
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index cb5d708908b..1b19fa2b976 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -391,13 +391,14 @@ void SCULPT_face_set_visibility_set(SculptSession *ss, int face_set, bool visibl
case PBVH_FACES:
case PBVH_GRIDS:
for (int i = 0; i < ss->totfaces; i++) {
- if (abs(ss->face_sets[i]) == face_set) {
- if (visible) {
- ss->face_sets[i] = abs(ss->face_sets[i]);
- }
- else {
- ss->face_sets[i] = -abs(ss->face_sets[i]);
- }
+ if (abs(ss->face_sets[i]) != face_set) {
+ continue;
+ }
+ if (visible) {
+ ss->face_sets[i] = abs(ss->face_sets[i]);
+ }
+ else {
+ ss->face_sets[i] = -abs(ss->face_sets[i]);
}
}
break;
@@ -1057,12 +1058,13 @@ bool SCULPT_is_vertex_inside_brush_radius_symm(const float vertex[3],
char symm)
{
for (char i = 0; i <= symm; ++i) {
- if (SCULPT_is_symmetry_iteration_valid(i, symm)) {
- float location[3];
- flip_v3_v3(location, br_co, (char)i);
- if (len_squared_v3v3(location, vertex) < radius * radius) {
- return true;
- }
+ if (!SCULPT_is_symmetry_iteration_valid(i, symm)) {
+ continue;
+ }
+ float location[3];
+ flip_v3_v3(location, br_co, (char)i);
+ if (len_squared_v3v3(location, vertex) < radius * radius) {
+ return true;
}
}
return false;
@@ -1107,20 +1109,22 @@ void SCULPT_floodfill_add_initial_with_symmetry(
/* Add active vertex and symmetric vertices to the queue. */
const char symm = SCULPT_mesh_symmetry_xyz_get(ob);
for (char i = 0; i <= symm; ++i) {
- if (SCULPT_is_symmetry_iteration_valid(i, symm)) {
- int v = -1;
- if (i == 0) {
- v = index;
- }
- else if (radius > 0.0f) {
- float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius;
- float location[3];
- flip_v3_v3(location, SCULPT_vertex_co_get(ss, index), i);
- v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false);
- }
- if (v != -1) {
- SCULPT_floodfill_add_initial(flood, v);
- }
+ if (!SCULPT_is_symmetry_iteration_valid(i, symm)) {
+ continue;
+ }
+ int v = -1;
+ if (i == 0) {
+ v = index;
+ }
+ else if (radius > 0.0f) {
+ float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius;
+ float location[3];
+ flip_v3_v3(location, SCULPT_vertex_co_get(ss, index), i);
+ v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false);
+ }
+
+ if (v != -1) {
+ SCULPT_floodfill_add_initial(flood, v);
}
}
}
@@ -1131,20 +1135,22 @@ void SCULPT_floodfill_add_active(
/* Add active vertex and symmetric vertices to the queue. */
const char symm = SCULPT_mesh_symmetry_xyz_get(ob);
for (char i = 0; i <= symm; ++i) {
- if (SCULPT_is_symmetry_iteration_valid(i, symm)) {
- int v = -1;
- if (i == 0) {
- v = SCULPT_active_vertex_get(ss);
- }
- else if (radius > 0.0f) {
- float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius;
- float location[3];
- flip_v3_v3(location, SCULPT_active_vertex_co_get(ss), i);
- v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false);
- }
- if (v != -1) {
- SCULPT_floodfill_add_initial(flood, v);
- }
+ if (!SCULPT_is_symmetry_iteration_valid(i, symm)) {
+ continue;
+ }
+ int v = -1;
+ if (i == 0) {
+ v = SCULPT_active_vertex_get(ss);
+ }
+ else if (radius > 0.0f) {
+ float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius;
+ float location[3];
+ flip_v3_v3(location, SCULPT_active_vertex_co_get(ss), i);
+ v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false);
+ }
+
+ if (v != -1) {
+ SCULPT_floodfill_add_initial(flood, v);
}
}
}
@@ -1161,12 +1167,19 @@ void SCULPT_floodfill_execute(
SculptVertexNeighborIter ni;
SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, from_v, ni) {
const int to_v = ni.index;
- if (!BLI_BITMAP_TEST(flood->visited_vertices, to_v) && SCULPT_vertex_visible_get(ss, to_v)) {
- BLI_BITMAP_ENABLE(flood->visited_vertices, to_v);
- if (func(ss, from_v, to_v, ni.is_duplicate, userdata)) {
- BLI_gsqueue_push(flood->queue, &to_v);
- }
+ if (BLI_BITMAP_TEST(flood->visited_vertices, to_v)) {
+ continue;
+ }
+
+ if (!SCULPT_vertex_visible_get(ss, to_v)) {
+ continue;
+ }
+
+ BLI_BITMAP_ENABLE(flood->visited_vertices, to_v);
+
+ if (func(ss, from_v, to_v, ni.is_duplicate, userdata)) {
+ BLI_gsqueue_push(flood->queue, &to_v);
}
}
SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
@@ -1466,40 +1479,42 @@ static void paint_mesh_restore_co_task_cb(void *__restrict userdata,
unode = SCULPT_undo_get_node(data->nodes[n]);
}
- if (unode) {
- PBVHVertexIter vd;
- SculptOrigVertData orig_data;
+ if (!unode) {
+ return;
+ }
- SCULPT_orig_vert_data_unode_init(&orig_data, data->ob, unode);
+ PBVHVertexIter vd;
+ SculptOrigVertData orig_data;
- BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
- {
- SCULPT_orig_vert_data_update(&orig_data, &vd);
+ SCULPT_orig_vert_data_unode_init(&orig_data, data->ob, unode);
- if (orig_data.unode->type == SCULPT_UNDO_COORDS) {
- copy_v3_v3(vd.co, orig_data.co);
- if (vd.no) {
- copy_v3_v3_short(vd.no, orig_data.no);
- }
- else {
- normal_short_to_float_v3(vd.fno, orig_data.no);
- }
- }
- else if (orig_data.unode->type == SCULPT_UNDO_MASK) {
- *vd.mask = orig_data.mask;
- }
- else if (orig_data.unode->type == SCULPT_UNDO_COLOR) {
- copy_v4_v4(vd.col, orig_data.col);
- }
+ BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
+ {
+ SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+ if (orig_data.unode->type == SCULPT_UNDO_COORDS) {
+ copy_v3_v3(vd.co, orig_data.co);
+ if (vd.no) {
+ copy_v3_v3_short(vd.no, orig_data.no);
+ }
+ else {
+ normal_short_to_float_v3(vd.fno, orig_data.no);
}
}
- BKE_pbvh_vertex_iter_end;
+ else if (orig_data.unode->type == SCULPT_UNDO_MASK) {
+ *vd.mask = orig_data.mask;
+ }
+ else if (orig_data.unode->type == SCULPT_UNDO_COLOR) {
+ copy_v4_v4(vd.col, orig_data.col);
+ }
- BKE_pbvh_node_mark_update(data->nodes[n]);
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+ }
}
+ BKE_pbvh_vertex_iter_end;
+
+ BKE_pbvh_node_mark_update(data->nodes[n]);
}
static void paint_mesh_restore_co(Sculpt *sd, Object *ob)
@@ -1545,11 +1560,15 @@ static void sculpt_extend_redraw_rect_previous(Object *ob, rcti *rect)
* mesh parts could disappear from screen (sergey). */
SculptSession *ss = ob->sculpt;
- if (ss->cache) {
- if (!BLI_rcti_is_empty(&ss->cache->previous_r)) {
- BLI_rcti_union(rect, &ss->cache->previous_r);
- }
+ if (!ss->cache) {
+ return;
+ }
+
+ if (BLI_rcti_is_empty(&ss->cache->previous_r)) {
+ return;
}
+
+ BLI_rcti_union(rect, &ss->cache->previous_r);
}
/* Get a screen-space rectangle of the modified area. */
@@ -1651,28 +1670,30 @@ bool SCULPT_brush_test_sphere(SculptBrushTest *test, const float co[3])
{
float distsq = len_squared_v3v3(co, test->location);
- if (distsq <= test->radius_squared) {
- if (sculpt_brush_test_clipping(test, co)) {
- return false;
- }
- test->dist = sqrtf(distsq);
- return true;
+ if (distsq > test->radius_squared) {
+ return false;
}
- return false;
+
+ if (sculpt_brush_test_clipping(test, co)) {
+ return false;
+ }
+
+ test->dist = sqrtf(distsq);
+ return true;
}
bool SCULPT_brush_test_sphere_sq(SculptBrushTest *test, const float co[3])
{
float distsq = len_squared_v3v3(co, test->location);
- if (distsq <= test->radius_squared) {
- if (sculpt_brush_test_clipping(test, co)) {
- return false;
- }
- test->dist = distsq;
- return true;
+ if (distsq > test->radius_squared) {
+ return false;
}
- return false;
+ if (sculpt_brush_test_clipping(test, co)) {
+ return false;
+ }
+ test->dist = distsq;
+ return true;
}
bool SCULPT_brush_test_sphere_fast(const SculptBrushTest *test, const float co[3])
@@ -1689,14 +1710,16 @@ bool SCULPT_brush_test_circle_sq(SculptBrushTest *test, const float co[3])
closest_to_plane_normalized_v3(co_proj, test->plane_view, co);
float distsq = len_squared_v3v3(co_proj, test->location);
- if (distsq <= test->radius_squared) {
- if (sculpt_brush_test_clipping(test, co)) {
- return false;
- }
- test->dist = distsq;
- return true;
+ if (distsq > test->radius_squared) {
+ return false;
}
- return false;
+
+ if (sculpt_brush_test_clipping(test, co)) {
+ return false;
+ }
+
+ test->dist = distsq;
+ return true;
}
bool SCULPT_brush_test_cube(SculptBrushTest *test,
@@ -1724,25 +1747,26 @@ bool SCULPT_brush_test_cube(SculptBrushTest *test,
const float constant_side = hardness * side;
const float falloff_side = roundness * side;
- if (local_co[0] <= side && local_co[1] <= side && local_co[2] <= side) {
+ if (!(local_co[0] <= side && local_co[1] <= side && local_co[2] <= side)) {
+ /* Outside the square. */
+ return false;
+ }
+ if (min_ff(local_co[0], local_co[1]) > constant_side) {
/* Corner, distance to the center of the corner circle. */
- if (min_ff(local_co[0], local_co[1]) > constant_side) {
- float r_point[3];
- copy_v3_fl(r_point, constant_side);
- test->dist = len_v2v2(r_point, local_co) / falloff_side;
- return true;
- }
+ float r_point[3];
+ copy_v3_fl(r_point, constant_side);
+ test->dist = len_v2v2(r_point, local_co) / falloff_side;
+ return true;
+ }
+ if (max_ff(local_co[0], local_co[1]) > constant_side) {
/* Side, distance to the square XY axis. */
- if (max_ff(local_co[0], local_co[1]) > constant_side) {
- test->dist = (max_ff(local_co[0], local_co[1]) - constant_side) / falloff_side;
- return true;
- }
- /* Inside the square, constant distance. */
- test->dist = 0.0f;
+ test->dist = (max_ff(local_co[0], local_co[1]) - constant_side) / falloff_side;
return true;
}
- /* Outside the square. */
- return false;
+
+ /* Inside the square, constant distance. */
+ test->dist = 0.0f;
+ return true;
}
SculptBrushTestFn SCULPT_brush_test_init_with_falloff_shape(SculptSession *ss,
@@ -1777,21 +1801,21 @@ static float frontface(const Brush *br,
const short no[3],
const float fno[3])
{
- if (br->flag & BRUSH_FRONTFACE) {
- float dot;
+ if (!(br->flag & BRUSH_FRONTFACE)) {
+ return 1.0f;
+ }
- if (no) {
- float tmp[3];
+ float dot;
+ if (no) {
+ float tmp[3];
- normal_short_to_float_v3(tmp, no);
- dot = dot_v3v3(tmp, sculpt_normal);
- }
- else {
- dot = dot_v3v3(fno, sculpt_normal);
- }
- return dot > 0.0f ? dot : 0.0f;
+ normal_short_to_float_v3(tmp, no);
+ dot = dot_v3v3(tmp, sculpt_normal);
+ }
+ else {
+ dot = dot_v3v3(fno, sculpt_normal);
}
- return 1.0f;
+ return dot > 0.0f ? dot : 0.0f;
}
#if 0
@@ -1871,25 +1895,25 @@ static float calc_radial_symmetry_feather(Sculpt *sd,
static float calc_symmetry_feather(Sculpt *sd, StrokeCache *cache)
{
- if (sd->paint.symmetry_flags & PAINT_SYMMETRY_FEATHER) {
- float overlap;
- const int symm = cache->symmetry;
-
- overlap = 0.0f;
- for (int i = 0; i <= symm; i++) {
- if (i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) {
-
- overlap += calc_overlap(cache, i, 0, 0);
+ if (!(sd->paint.symmetry_flags & PAINT_SYMMETRY_FEATHER)) {
+ return 1.0f;
+ }
+ float overlap;
+ const int symm = cache->symmetry;
- overlap += calc_radial_symmetry_feather(sd, cache, i, 'X');
- overlap += calc_radial_symmetry_feather(sd, cache, i, 'Y');
- overlap += calc_radial_symmetry_feather(sd, cache, i, 'Z');
- }
+ overlap = 0.0f;
+ for (int i = 0; i <= symm; i++) {
+ if (!SCULPT_is_symmetry_iteration_valid(i, symm)) {
+ continue;
}
- return 1.0f / overlap;
+ overlap += calc_overlap(cache, i, 0, 0);
+
+ overlap += calc_radial_symmetry_feather(sd, cache, i, 'X');
+ overlap += calc_radial_symmetry_feather(sd, cache, i, 'Y');
+ overlap += calc_radial_symmetry_feather(sd, cache, i, 'Z');
}
- return 1.0f;
+ return 1.0f / overlap;
}
/* -------------------------------------------------------------------- */
@@ -1991,35 +2015,37 @@ static void calc_area_normal_and_center_task_cb(void *__restrict userdata,
normal_test_r = sculpt_brush_normal_test_sq_fn(&normal_test, co);
area_test_r = sculpt_brush_area_test_sq_fn(&area_test, co);
- if (normal_test_r || area_test_r) {
- float no[3];
- int flip_index;
+ if (!normal_test_r && !area_test_r) {
+ continue;
+ }
- normal_tri_v3(no, UNPACK3(co_tri));
+ float no[3];
+ int flip_index;
- flip_index = (dot_v3v3(ss->cache->view_normal, no) <= 0.0f);
- if (use_area_cos && area_test_r) {
- /* Weight the coordinates towards the center. */
- float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius);
- const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
+ normal_tri_v3(no, UNPACK3(co_tri));
- float disp[3];
- sub_v3_v3v3(disp, co, area_test.location);
- mul_v3_fl(disp, 1.0f - afactor);
- add_v3_v3v3(co, area_test.location, disp);
- add_v3_v3(anctd->area_cos[flip_index], co);
+ flip_index = (dot_v3v3(ss->cache->view_normal, no) <= 0.0f);
+ if (use_area_cos && area_test_r) {
+ /* Weight the coordinates towards the center. */
+ float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius);
+ const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
- anctd->count_co[flip_index] += 1;
- }
- if (use_area_nos && normal_test_r) {
- /* Weight the normals towards the center. */
- float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius);
- const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
- mul_v3_fl(no, nfactor);
-
- add_v3_v3(anctd->area_nos[flip_index], no);
- anctd->count_no[flip_index] += 1;
- }
+ float disp[3];
+ sub_v3_v3v3(disp, co, area_test.location);
+ mul_v3_fl(disp, 1.0f - afactor);
+ add_v3_v3v3(co, area_test.location, disp);
+ add_v3_v3(anctd->area_cos[flip_index], co);
+
+ anctd->count_co[flip_index] += 1;
+ }
+ if (use_area_nos && normal_test_r) {
+ /* Weight the normals towards the center. */
+ float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius);
+ const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
+ mul_v3_fl(no, nfactor);
+
+ add_v3_v3(anctd->area_nos[flip_index], no);
+ anctd->count_no[flip_index] += 1;
}
}
}
@@ -2051,49 +2077,51 @@ static void calc_area_normal_and_center_task_cb(void *__restrict userdata,
normal_test_r = sculpt_brush_normal_test_sq_fn(&normal_test, co);
area_test_r = sculpt_brush_area_test_sq_fn(&area_test, co);
- if (normal_test_r || area_test_r) {
- float no[3];
- int flip_index;
+ if (!normal_test_r && !area_test_r) {
+ continue;
+ }
+
+ float no[3];
+ int flip_index;
- data->any_vertex_sampled = true;
+ data->any_vertex_sampled = true;
- if (use_original) {
- normal_short_to_float_v3(no, no_s);
+ if (use_original) {
+ normal_short_to_float_v3(no, no_s);
+ }
+ else {
+ if (vd.no) {
+ normal_short_to_float_v3(no, vd.no);
}
else {
- if (vd.no) {
- normal_short_to_float_v3(no, vd.no);
- }
- else {
- copy_v3_v3(no, vd.fno);
- }
+ copy_v3_v3(no, vd.fno);
}
+ }
- flip_index = (dot_v3v3(ss->cache ? ss->cache->view_normal : ss->cursor_view_normal, no) <=
- 0.0f);
+ flip_index = (dot_v3v3(ss->cache ? ss->cache->view_normal : ss->cursor_view_normal, no) <=
+ 0.0f);
- if (use_area_cos && area_test_r) {
- /* Weight the coordinates towards the center. */
- float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius);
- const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
+ if (use_area_cos && area_test_r) {
+ /* Weight the coordinates towards the center. */
+ float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius);
+ const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
- float disp[3];
- sub_v3_v3v3(disp, co, area_test.location);
- mul_v3_fl(disp, 1.0f - afactor);
- add_v3_v3v3(co, area_test.location, disp);
+ float disp[3];
+ sub_v3_v3v3(disp, co, area_test.location);
+ mul_v3_fl(disp, 1.0f - afactor);
+ add_v3_v3v3(co, area_test.location, disp);
- add_v3_v3(anctd->area_cos[flip_index], co);
- anctd->count_co[flip_index] += 1;
- }
- if (use_area_nos && normal_test_r) {
- /* Weight the normals towards the center. */
- float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius);
- const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
- mul_v3_fl(no, nfactor);
-
- add_v3_v3(anctd->area_nos[flip_index], no);
- anctd->count_no[flip_index] += 1;
- }
+ add_v3_v3(anctd->area_cos[flip_index], co);
+ anctd->count_co[flip_index] += 1;
+ }
+ if (use_area_nos && normal_test_r) {
+ /* Weight the normals towards the center. */
+ float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius);
+ const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
+ mul_v3_fl(no, nfactor);
+
+ add_v3_v3(anctd->area_nos[flip_index], no);
+ anctd->count_no[flip_index] += 1;
}
}
BKE_pbvh_vertex_iter_end;
@@ -2150,10 +2178,12 @@ static void calc_area_center(
/* For flatten center. */
for (n = 0; n < ARRAY_SIZE(anctd.area_cos); n++) {
- if (anctd.count_co[n] != 0) {
- mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]);
- break;
+ if (anctd.count_co[n] == 0) {
+ continue;
}
+
+ mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]);
+ break;
}
if (n == 2) {
@@ -2249,10 +2279,12 @@ static void calc_area_normal_and_center(
/* For flatten center. */
for (n = 0; n < ARRAY_SIZE(anctd.area_cos); n++) {
- if (anctd.count_co[n] != 0) {
- mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]);
- break;
+ if (anctd.count_co[n] == 0) {
+ continue;
}
+
+ mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]);
+ break;
}
if (n == 2) {
@@ -2892,26 +2924,27 @@ static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata,
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade =
- bstrength *
- SCULPT_brush_strength_factor(
- ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, *vd.mask, vd.index, thread_id) *
- ss->cache->pressure;
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade =
+ bstrength *
+ SCULPT_brush_strength_factor(
+ ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, *vd.mask, vd.index, thread_id) *
+ ss->cache->pressure;
- float avg[3], val[3];
+ float avg[3], val[3];
- SCULPT_bmesh_four_neighbor_average(avg, direction, vd.bm_vert);
+ SCULPT_bmesh_four_neighbor_average(avg, direction, vd.bm_vert);
- sub_v3_v3v3(val, avg, vd.co);
+ sub_v3_v3v3(val, avg, vd.co);
- madd_v3_v3v3fl(val, vd.co, val, fade);
+ madd_v3_v3v3fl(val, vd.co, val, fade);
- SCULPT_clip(sd, ss, vd.co, val);
+ SCULPT_clip(sd, ss, vd.co, val);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -2964,21 +2997,23 @@ static void do_mask_brush_draw_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = SCULPT_brush_strength_factor(
- ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, 0.0f, vd.index, thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
- if (bstrength > 0.0f) {
- (*vd.mask) += fade * bstrength * (1.0f - *vd.mask);
- }
- else {
- (*vd.mask) += fade * bstrength * (*vd.mask);
- }
- *vd.mask = clamp_f(*vd.mask, 0.0f, 1.0f);
+ const float fade = SCULPT_brush_strength_factor(
+ ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, 0.0f, vd.index, thread_id);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (bstrength > 0.0f) {
+ (*vd.mask) += fade * bstrength * (1.0f - *vd.mask);
+ }
+ else {
+ (*vd.mask) += fade * bstrength * (*vd.mask);
+ }
+ *vd.mask = clamp_f(*vd.mask, 0.0f, 1.0f);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
BKE_pbvh_vertex_iter_end;
}
@@ -3039,26 +3074,27 @@ static void do_displacement_eraser_brush_task_cb_ex(void *__restrict userdata,
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- float limit_co[3];
- float disp[3];
- SCULPT_vertex_limit_surface_get(ss, vd.index, limit_co);
- sub_v3_v3v3(disp, limit_co, vd.co);
- mul_v3_v3fl(proxy[vd.i], disp, fade);
+ float limit_co[3];
+ float disp[3];
+ SCULPT_vertex_limit_surface_get(ss, vd.index, limit_co);
+ sub_v3_v3v3(disp, limit_co, vd.co);
+ mul_v3_v3fl(proxy[vd.i], disp, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -3151,12 +3187,15 @@ static void do_displacement_smear_brush_task_cb_ex(void *__restrict userdata,
ss->cache->limit_surface_co[vd.index]);
const float *neighbor_limit_surface_disp = ss->cache->prev_displacement[ni.index];
normalize_v3_v3(vertex_disp_norm, vertex_disp);
- if (dot_v3v3(current_disp_norm, vertex_disp_norm) < 0.0f) {
- const float disp_interp = clamp_f(
- -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f);
- madd_v3_v3fl(interp_limit_surface_disp, neighbor_limit_surface_disp, disp_interp);
- weights_accum += disp_interp;
+
+ if (dot_v3v3(current_disp_norm, vertex_disp_norm) >= 0.0f) {
+ continue;
}
+
+ const float disp_interp = clamp_f(
+ -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f);
+ madd_v3_v3fl(interp_limit_surface_disp, neighbor_limit_surface_disp, disp_interp);
+ weights_accum += disp_interp;
}
SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
@@ -3246,23 +3285,24 @@ static void do_draw_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- /* Offset vertex. */
- const float fade = SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ /* Offset vertex. */
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- mul_v3_v3fl(proxy[vd.i], offset, fade);
+ mul_v3_v3fl(proxy[vd.i], offset, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -3325,23 +3365,24 @@ static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (sculpt_brush_test_sq_fn(&test, orig_data.co)) {
- /* Offset vertex. */
- const float fade = SCULPT_brush_strength_factor(ss,
- brush,
- orig_data.co,
- sqrtf(test.dist),
- orig_data.no,
- NULL,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) {
+ continue;
+ }
+ /* Offset vertex. */
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ orig_data.co,
+ sqrtf(test.dist),
+ orig_data.no,
+ NULL,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- mul_v3_v3fl(proxy[vd.i], offset, fade);
+ mul_v3_v3fl(proxy[vd.i], offset, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -3407,52 +3448,53 @@ static void do_topology_slide_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (sculpt_brush_test_sq_fn(&test, orig_data.co)) {
- const float fade = SCULPT_brush_strength_factor(ss,
- brush,
- orig_data.co,
- sqrtf(test.dist),
- orig_data.no,
- NULL,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
- float current_disp[3];
- float current_disp_norm[3];
- float final_disp[3] = {0.0f, 0.0f, 0.0f};
+ if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) {
+ continue;
+ }
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ orig_data.co,
+ sqrtf(test.dist),
+ orig_data.no,
+ NULL,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+ float current_disp[3];
+ float current_disp_norm[3];
+ float final_disp[3] = {0.0f, 0.0f, 0.0f};
- switch (brush->slide_deform_type) {
- case BRUSH_SLIDE_DEFORM_DRAG:
- sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location);
- break;
- case BRUSH_SLIDE_DEFORM_PINCH:
- sub_v3_v3v3(current_disp, ss->cache->location, vd.co);
- break;
- case BRUSH_SLIDE_DEFORM_EXPAND:
- sub_v3_v3v3(current_disp, vd.co, ss->cache->location);
- break;
- }
+ switch (brush->slide_deform_type) {
+ case BRUSH_SLIDE_DEFORM_DRAG:
+ sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location);
+ break;
+ case BRUSH_SLIDE_DEFORM_PINCH:
+ sub_v3_v3v3(current_disp, ss->cache->location, vd.co);
+ break;
+ case BRUSH_SLIDE_DEFORM_EXPAND:
+ sub_v3_v3v3(current_disp, vd.co, ss->cache->location);
+ break;
+ }
- normalize_v3_v3(current_disp_norm, current_disp);
- mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength);
-
- SculptVertexNeighborIter ni;
- SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) {
- float vertex_disp[3];
- float vertex_disp_norm[3];
- sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.index), vd.co);
- normalize_v3_v3(vertex_disp_norm, vertex_disp);
- if (dot_v3v3(current_disp_norm, vertex_disp_norm) > 0.0f) {
- madd_v3_v3fl(final_disp, vertex_disp_norm, dot_v3v3(current_disp, vertex_disp));
- }
+ normalize_v3_v3(current_disp_norm, current_disp);
+ mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength);
+
+ SculptVertexNeighborIter ni;
+ SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) {
+ float vertex_disp[3];
+ float vertex_disp_norm[3];
+ sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.index), vd.co);
+ normalize_v3_v3(vertex_disp_norm, vertex_disp);
+ if (dot_v3v3(current_disp_norm, vertex_disp_norm) > 0.0f) {
+ madd_v3_v3fl(final_disp, vertex_disp_norm, dot_v3v3(current_disp, vertex_disp));
}
- SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
+ }
+ SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
- mul_v3_v3fl(proxy[vd.i], final_disp, fade);
+ mul_v3_v3fl(proxy[vd.i], final_disp, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -3482,16 +3524,17 @@ void SCULPT_relax_vertex(SculptSession *ss,
/* When the vertex to relax is boundary, use only connected boundary vertices for the average
* position. */
if (is_boundary) {
- if (SCULPT_vertex_is_boundary(ss, ni.index)) {
- add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.index));
- avg_count++;
-
- /* Calculate a normal for the constraint plane using the edges of the boundary. */
- float to_neighbor[3];
- sub_v3_v3v3(to_neighbor, SCULPT_vertex_co_get(ss, ni.index), vd->co);
- normalize_v3(to_neighbor);
- add_v3_v3(boundary_normal, to_neighbor);
+ if (!SCULPT_vertex_is_boundary(ss, ni.index)) {
+ continue;
}
+ add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.index));
+ avg_count++;
+
+ /* Calculate a normal for the constraint plane using the edges of the boundary. */
+ float to_neighbor[3];
+ sub_v3_v3v3(to_neighbor, SCULPT_vertex_co_get(ss, ni.index), vd->co);
+ normalize_v3(to_neighbor);
+ add_v3_v3(boundary_normal, to_neighbor);
}
else {
add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.index));
@@ -3563,21 +3606,22 @@ static void do_topology_relax_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (sculpt_brush_test_sq_fn(&test, orig_data.co)) {
- const float fade = SCULPT_brush_strength_factor(ss,
- brush,
- orig_data.co,
- sqrtf(test.dist),
- orig_data.no,
- NULL,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- SCULPT_relax_vertex(ss, &vd, fade * bstrength, false, vd.co);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) {
+ continue;
+ }
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ orig_data.co,
+ sqrtf(test.dist),
+ orig_data.no,
+ NULL,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ SCULPT_relax_vertex(ss, &vd, fade * bstrength, false, vd.co);
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -3728,38 +3772,39 @@ static void do_crease_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- /* Offset vertex. */
- const float fade = SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
- float val1[3];
- float val2[3];
-
- /* First we pinch. */
- sub_v3_v3v3(val1, test.location, vd.co);
- if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) {
- project_plane_v3_v3v3(val1, val1, ss->cache->view_normal);
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ /* Offset vertex. */
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+ float val1[3];
+ float val2[3];
+
+ /* First we pinch. */
+ sub_v3_v3v3(val1, test.location, vd.co);
+ if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) {
+ project_plane_v3_v3v3(val1, val1, ss->cache->view_normal);
+ }
- mul_v3_fl(val1, fade * flippedbstrength);
+ mul_v3_fl(val1, fade * flippedbstrength);
- sculpt_project_v3(spvc, val1, val1);
+ sculpt_project_v3(spvc, val1, val1);
- /* Then we draw. */
- mul_v3_v3fl(val2, offset, fade);
+ /* Then we draw. */
+ mul_v3_v3fl(val2, offset, fade);
- add_v3_v3v3(proxy[vd.i], val1, val2);
+ add_v3_v3v3(proxy[vd.i], val1, val2);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -3845,40 +3890,41 @@ static void do_pinch_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
- float disp_center[3];
- float x_disp[3];
- float z_disp[3];
- /* Calculate displacement from the vertex to the brush center. */
- sub_v3_v3v3(disp_center, test.location, vd.co);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+ float disp_center[3];
+ float x_disp[3];
+ float z_disp[3];
+ /* Calculate displacement from the vertex to the brush center. */
+ sub_v3_v3v3(disp_center, test.location, vd.co);
- /* Project the displacement into the X vector (aligned to the stroke). */
- mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space));
+ /* Project the displacement into the X vector (aligned to the stroke). */
+ mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space));
- /* Project the displacement into the Z vector (aligned to the surface normal). */
- mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space));
+ /* Project the displacement into the Z vector (aligned to the surface normal). */
+ mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space));
- /* Add the two projected vectors to calculate the final displacement.
- * The Y component is removed. */
- add_v3_v3v3(disp_center, x_disp, z_disp);
+ /* Add the two projected vectors to calculate the final displacement.
+ * The Y component is removed. */
+ add_v3_v3v3(disp_center, x_disp, z_disp);
- if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) {
- project_plane_v3_v3v3(disp_center, disp_center, ss->cache->view_normal);
- }
- mul_v3_v3fl(proxy[vd.i], disp_center, fade);
+ if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) {
+ project_plane_v3_v3v3(disp_center, disp_center, ss->cache->view_normal);
+ }
+ mul_v3_v3fl(proxy[vd.i], disp_center, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -3961,33 +4007,34 @@ static void do_grab_brush_task_cb_ex(void *__restrict userdata,
{
SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (sculpt_brush_test_sq_fn(&test, orig_data.co)) {
- float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- orig_data.co,
- sqrtf(test.dist),
- orig_data.no,
- NULL,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- if (grab_silhouette) {
- float silhouette_test_dir[3];
- normalize_v3_v3(silhouette_test_dir, grab_delta);
- if (dot_v3v3(ss->cache->initial_normal, ss->cache->grab_delta_symmetry) < 0.0f) {
- mul_v3_fl(silhouette_test_dir, -1.0f);
- }
- float vno[3];
- normal_short_to_float_v3(vno, orig_data.no);
- fade *= max_ff(dot_v3v3(vno, silhouette_test_dir), 0.0f);
+ if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) {
+ continue;
+ }
+ float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ orig_data.co,
+ sqrtf(test.dist),
+ orig_data.no,
+ NULL,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ if (grab_silhouette) {
+ float silhouette_test_dir[3];
+ normalize_v3_v3(silhouette_test_dir, grab_delta);
+ if (dot_v3v3(ss->cache->initial_normal, ss->cache->grab_delta_symmetry) < 0.0f) {
+ mul_v3_fl(silhouette_test_dir, -1.0f);
}
+ float vno[3];
+ normal_short_to_float_v3(vno, orig_data.no);
+ fade *= max_ff(dot_v3v3(vno, silhouette_test_dir), 0.0f);
+ }
- mul_v3_v3fl(proxy[vd.i], grab_delta, fade);
+ mul_v3_v3fl(proxy[vd.i], grab_delta, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -4149,13 +4196,14 @@ void SCULPT_flip_v3_by_symm_area(float v[3],
{
for (int i = 0; i < 3; i++) {
ePaintSymmetryFlags symm_it = 1 << i;
- if (symm & symm_it) {
- if (symmarea & symm_it) {
- flip_v3(v, symm_it);
- }
- if (pivot[i] < 0.0f) {
- flip_v3(v, symm_it);
- }
+ if (!(symm & symm_it)) {
+ continue;
+ }
+ if (symmarea & symm_it) {
+ flip_v3(v, symm_it);
+ }
+ if (pivot[i] < 0.0f) {
+ flip_v3(v, symm_it);
}
}
}
@@ -4167,13 +4215,14 @@ void SCULPT_flip_quat_by_symm_area(float quat[3],
{
for (int i = 0; i < 3; i++) {
ePaintSymmetryFlags symm_it = 1 << i;
- if (symm & symm_it) {
- if (symmarea & symm_it) {
- flip_qt(quat, symm_it);
- }
- if (pivot[i] < 0.0f) {
- flip_qt(quat, symm_it);
- }
+ if (!(symm & symm_it)) {
+ continue;
+ }
+ if (symmarea & symm_it) {
+ flip_qt(quat, symm_it);
+ }
+ if (pivot[i] < 0.0f) {
+ flip_qt(quat, symm_it);
}
}
}
@@ -4289,22 +4338,23 @@ static void do_nudge_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- mul_v3_v3fl(proxy[vd.i], cono, fade);
+ mul_v3_v3fl(proxy[vd.i], cono, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -4368,75 +4418,76 @@ static void do_snake_hook_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (do_elastic || sculpt_brush_test_sq_fn(&test, vd.co)) {
+ if (!do_elastic && !sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
- float fade;
- if (do_elastic) {
- fade = 1.0f;
- }
- else {
- fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
- }
+ float fade;
+ if (do_elastic) {
+ fade = 1.0f;
+ }
+ else {
+ fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+ }
- mul_v3_v3fl(proxy[vd.i], grab_delta, fade);
+ mul_v3_v3fl(proxy[vd.i], grab_delta, fade);
- /* Negative pinch will inflate, helps maintain volume. */
- if (do_pinch) {
- float delta_pinch_init[3], delta_pinch[3];
+ /* Negative pinch will inflate, helps maintain volume. */
+ if (do_pinch) {
+ float delta_pinch_init[3], delta_pinch[3];
- sub_v3_v3v3(delta_pinch, vd.co, test.location);
- if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) {
- project_plane_v3_v3v3(delta_pinch, delta_pinch, ss->cache->true_view_normal);
- }
+ sub_v3_v3v3(delta_pinch, vd.co, test.location);
+ if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) {
+ project_plane_v3_v3v3(delta_pinch, delta_pinch, ss->cache->true_view_normal);
+ }
- /* Important to calculate based on the grabbed location
- * (intentionally ignore fade here). */
- add_v3_v3(delta_pinch, grab_delta);
+ /* Important to calculate based on the grabbed location
+ * (intentionally ignore fade here). */
+ add_v3_v3(delta_pinch, grab_delta);
- sculpt_project_v3(spvc, delta_pinch, delta_pinch);
+ sculpt_project_v3(spvc, delta_pinch, delta_pinch);
- copy_v3_v3(delta_pinch_init, delta_pinch);
+ copy_v3_v3(delta_pinch_init, delta_pinch);
- float pinch_fade = pinch * fade;
- /* When reducing, scale reduction back by how close to the center we are,
- * so we don't pinch into nothingness. */
- if (pinch > 0.0f) {
- /* Square to have even less impact for close vertices. */
- pinch_fade *= pow2f(min_ff(1.0f, len_v3(delta_pinch) / ss->cache->radius));
- }
- mul_v3_fl(delta_pinch, 1.0f + pinch_fade);
- sub_v3_v3v3(delta_pinch, delta_pinch_init, delta_pinch);
- add_v3_v3(proxy[vd.i], delta_pinch);
+ float pinch_fade = pinch * fade;
+ /* When reducing, scale reduction back by how close to the center we are,
+ * so we don't pinch into nothingness. */
+ if (pinch > 0.0f) {
+ /* Square to have even less impact for close vertices. */
+ pinch_fade *= pow2f(min_ff(1.0f, len_v3(delta_pinch) / ss->cache->radius));
}
+ mul_v3_fl(delta_pinch, 1.0f + pinch_fade);
+ sub_v3_v3v3(delta_pinch, delta_pinch_init, delta_pinch);
+ add_v3_v3(proxy[vd.i], delta_pinch);
+ }
- if (do_rake_rotation) {
- float delta_rotate[3];
- sculpt_rake_rotate(ss, test.location, vd.co, fade, delta_rotate);
- add_v3_v3(proxy[vd.i], delta_rotate);
- }
+ if (do_rake_rotation) {
+ float delta_rotate[3];
+ sculpt_rake_rotate(ss, test.location, vd.co, fade, delta_rotate);
+ add_v3_v3(proxy[vd.i], delta_rotate);
+ }
- if (do_elastic) {
- float disp[3];
- BKE_kelvinlet_grab_triscale(disp, &params, vd.co, ss->cache->location, proxy[vd.i]);
- mul_v3_fl(disp, bstrength * 20.0f);
- if (vd.mask) {
- mul_v3_fl(disp, 1.0f - *vd.mask);
- }
- mul_v3_fl(disp, SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index));
- copy_v3_v3(proxy[vd.i], disp);
+ if (do_elastic) {
+ float disp[3];
+ BKE_kelvinlet_grab_triscale(disp, &params, vd.co, ss->cache->location, proxy[vd.i]);
+ mul_v3_fl(disp, bstrength * 20.0f);
+ if (vd.mask) {
+ mul_v3_fl(disp, 1.0f - *vd.mask);
}
+ mul_v3_fl(disp, SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index));
+ copy_v3_v3(proxy[vd.i], disp);
+ }
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -4507,22 +4558,23 @@ static void do_thumb_brush_task_cb_ex(void *__restrict userdata,
{
SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (sculpt_brush_test_sq_fn(&test, orig_data.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- orig_data.co,
- sqrtf(test.dist),
- orig_data.no,
- NULL,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ orig_data.co,
+ sqrtf(test.dist),
+ orig_data.no,
+ NULL,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- mul_v3_v3fl(proxy[vd.i], cono, fade);
+ mul_v3_v3fl(proxy[vd.i], cono, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -4580,27 +4632,28 @@ static void do_rotate_brush_task_cb_ex(void *__restrict userdata,
{
SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (sculpt_brush_test_sq_fn(&test, orig_data.co)) {
- float vec[3], rot[3][3];
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- orig_data.co,
- sqrtf(test.dist),
- orig_data.no,
- NULL,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) {
+ continue;
+ }
+ float vec[3], rot[3][3];
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ orig_data.co,
+ sqrtf(test.dist),
+ orig_data.no,
+ NULL,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- sub_v3_v3v3(vec, orig_data.co, ss->cache->location);
- axis_angle_normalized_to_mat3(rot, ss->cache->sculpt_normal_symm, angle * fade);
- mul_v3_m3v3(proxy[vd.i], rot, vec);
- add_v3_v3(proxy[vd.i], ss->cache->location);
- sub_v3_v3(proxy[vd.i], orig_data.co);
+ sub_v3_v3v3(vec, orig_data.co, ss->cache->location);
+ axis_angle_normalized_to_mat3(rot, ss->cache->sculpt_normal_symm, angle * fade);
+ mul_v3_m3v3(proxy[vd.i], rot, vec);
+ add_v3_v3(proxy[vd.i], ss->cache->location);
+ sub_v3_v3(proxy[vd.i], orig_data.co);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -4652,70 +4705,71 @@ static void do_layer_brush_task_cb_ex(void *__restrict userdata,
{
SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (sculpt_brush_test_sq_fn(&test, orig_data.co)) {
- const float fade = SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- const int vi = vd.index;
- float *disp_factor;
- if (use_persistent_base) {
- disp_factor = &ss->persistent_base[vi].disp;
- }
- else {
- disp_factor = &ss->cache->layer_displacement_factor[vi];
- }
+ if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) {
+ continue;
+ }
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ const int vi = vd.index;
+ float *disp_factor;
+ if (use_persistent_base) {
+ disp_factor = &ss->persistent_base[vi].disp;
+ }
+ else {
+ disp_factor = &ss->cache->layer_displacement_factor[vi];
+ }
- /* When using persistent base, the layer brush (holding Control) invert mode resets the
- * height of the layer to 0. This makes possible to clean edges of previously added layers
- * on top of the base. */
- /* The main direction of the layers is inverted using the regular brush strength with the
- * brush direction property. */
- if (use_persistent_base && ss->cache->invert) {
- (*disp_factor) += fabsf(fade * bstrength * (*disp_factor)) *
- ((*disp_factor) > 0.0f ? -1.0f : 1.0f);
- }
- else {
- (*disp_factor) += fade * bstrength * (1.05f - fabsf(*disp_factor));
- }
- if (vd.mask) {
- const float clamp_mask = 1.0f - *vd.mask;
- *disp_factor = clamp_f(*disp_factor, -clamp_mask, clamp_mask);
- }
- else {
- *disp_factor = clamp_f(*disp_factor, -1.0f, 1.0f);
- }
+ /* When using persistent base, the layer brush (holding Control) invert mode resets the
+ * height of the layer to 0. This makes possible to clean edges of previously added layers
+ * on top of the base. */
+ /* The main direction of the layers is inverted using the regular brush strength with the
+ * brush direction property. */
+ if (use_persistent_base && ss->cache->invert) {
+ (*disp_factor) += fabsf(fade * bstrength * (*disp_factor)) *
+ ((*disp_factor) > 0.0f ? -1.0f : 1.0f);
+ }
+ else {
+ (*disp_factor) += fade * bstrength * (1.05f - fabsf(*disp_factor));
+ }
+ if (vd.mask) {
+ const float clamp_mask = 1.0f - *vd.mask;
+ *disp_factor = clamp_f(*disp_factor, -clamp_mask, clamp_mask);
+ }
+ else {
+ *disp_factor = clamp_f(*disp_factor, -1.0f, 1.0f);
+ }
- float final_co[3];
- float normal[3];
+ float final_co[3];
+ float normal[3];
- if (use_persistent_base) {
- SCULPT_vertex_persistent_normal_get(ss, vi, normal);
- mul_v3_fl(normal, brush->height);
- madd_v3_v3v3fl(final_co, SCULPT_vertex_persistent_co_get(ss, vi), normal, *disp_factor);
- }
- else {
- normal_short_to_float_v3(normal, orig_data.no);
- mul_v3_fl(normal, brush->height);
- madd_v3_v3v3fl(final_co, orig_data.co, normal, *disp_factor);
- }
+ if (use_persistent_base) {
+ SCULPT_vertex_persistent_normal_get(ss, vi, normal);
+ mul_v3_fl(normal, brush->height);
+ madd_v3_v3v3fl(final_co, SCULPT_vertex_persistent_co_get(ss, vi), normal, *disp_factor);
+ }
+ else {
+ normal_short_to_float_v3(normal, orig_data.no);
+ mul_v3_fl(normal, brush->height);
+ madd_v3_v3v3fl(final_co, orig_data.co, normal, *disp_factor);
+ }
- float vdisp[3];
- sub_v3_v3v3(vdisp, final_co, vd.co);
- mul_v3_fl(vdisp, fabsf(fade));
- add_v3_v3v3(final_co, vd.co, vdisp);
+ float vdisp[3];
+ sub_v3_v3v3(vdisp, final_co, vd.co);
+ mul_v3_fl(vdisp, fabsf(fade));
+ add_v3_v3v3(final_co, vd.co, vdisp);
- SCULPT_clip(sd, ss, vd.co, final_co);
+ SCULPT_clip(sd, ss, vd.co, final_co);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -4764,31 +4818,32 @@ static void do_inflate_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
- float val[3];
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+ float val[3];
- if (vd.fno) {
- copy_v3_v3(val, vd.fno);
- }
- else {
- normal_short_to_float_v3(val, vd.no);
- }
+ if (vd.fno) {
+ copy_v3_v3(val, vd.fno);
+ }
+ else {
+ normal_short_to_float_v3(val, vd.no);
+ }
- mul_v3_fl(val, fade * ss->cache->radius);
- mul_v3_v3v3(proxy[vd.i], val, ss->cache->scale);
+ mul_v3_fl(val, fade * ss->cache->radius);
+ mul_v3_v3v3(proxy[vd.i], val, ss->cache->scale);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -4869,30 +4924,31 @@ static void do_flatten_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- float intr[3];
- float val[3];
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ float intr[3];
+ float val[3];
- closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
+ closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
- sub_v3_v3v3(val, intr, vd.co);
+ sub_v3_v3v3(val, intr, vd.co);
- if (SCULPT_plane_trim(ss->cache, brush, val)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (SCULPT_plane_trim(ss->cache, brush, val)) {
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- mul_v3_v3fl(proxy[vd.i], val, fade);
+ mul_v3_v3fl(proxy[vd.i], val, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
}
@@ -4975,16 +5031,17 @@ static void calc_clay_surface_task_cb(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- float plane_dist = dist_signed_to_plane_v3(vd.co, plane);
- float plane_dist_abs = fabsf(plane_dist);
- if (plane_dist > 0.0f) {
- csd->plane_dist[0] = MIN2(csd->plane_dist[0], plane_dist_abs);
- }
- else {
- csd->plane_dist[1] = MIN2(csd->plane_dist[1], plane_dist_abs);
- }
+ float plane_dist = dist_signed_to_plane_v3(vd.co, plane);
+ float plane_dist_abs = fabsf(plane_dist);
+ if (plane_dist > 0.0f) {
+ csd->plane_dist[0] = MIN2(csd->plane_dist[0], plane_dist_abs);
+ }
+ else {
+ csd->plane_dist[1] = MIN2(csd->plane_dist[1], plane_dist_abs);
}
BKE_pbvh_vertex_iter_end;
}
@@ -5025,28 +5082,30 @@ static void do_clay_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- float intr[3];
- float val[3];
- closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
- sub_v3_v3v3(val, intr, vd.co);
+ float intr[3];
+ float val[3];
+ closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ sub_v3_v3v3(val, intr, vd.co);
- mul_v3_v3fl(proxy[vd.i], val, fade);
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ mul_v3_v3fl(proxy[vd.i], val, fade);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -5143,35 +5202,37 @@ static void do_clay_strips_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness)) {
- if (plane_point_side_flip(vd.co, test.plane_tool, flip)) {
- float intr[3];
- float val[3];
+ if (!SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness)) {
+ continue;
+ }
- closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
+ if (!plane_point_side_flip(vd.co, test.plane_tool, flip)) {
+ continue;
+ }
- sub_v3_v3v3(val, intr, vd.co);
+ float intr[3];
+ float val[3];
+ closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
+ sub_v3_v3v3(val, intr, vd.co);
- if (SCULPT_plane_trim(ss->cache, brush, val)) {
- /* The normal from the vertices is ignored, it causes glitch with planes, see: T44390. */
- const float fade = bstrength *
- SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- ss->cache->radius * test.dist,
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!SCULPT_plane_trim(ss->cache, brush, val)) {
+ continue;
+ }
+ /* The normal from the vertices is ignored, it causes glitch with planes, see: T44390. */
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ ss->cache->radius * test.dist,
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- mul_v3_v3fl(proxy[vd.i], val, fade);
+ mul_v3_v3fl(proxy[vd.i], val, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
- }
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -5295,33 +5356,37 @@ static void do_fill_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- if (SCULPT_plane_point_side(vd.co, test.plane_tool)) {
- float intr[3];
- float val[3];
-
- closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
-
- sub_v3_v3v3(val, intr, vd.co);
-
- if (SCULPT_plane_trim(ss->cache, brush, val)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- mul_v3_v3fl(proxy[vd.i], val, fade);
-
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
- }
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+
+ if (!SCULPT_plane_point_side(vd.co, test.plane_tool)) {
+ continue;
+ }
+
+ float intr[3];
+ float val[3];
+ closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
+ sub_v3_v3v3(val, intr, vd.co);
+
+ if (!SCULPT_plane_trim(ss->cache, brush, val)) {
+ continue;
+ }
+
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ mul_v3_v3fl(proxy[vd.i], val, fade);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -5390,33 +5455,37 @@ static void do_scrape_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- if (!SCULPT_plane_point_side(vd.co, test.plane_tool)) {
- float intr[3];
- float val[3];
-
- closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
-
- sub_v3_v3v3(val, intr, vd.co);
-
- if (SCULPT_plane_trim(ss->cache, brush, val)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- mul_v3_v3fl(proxy[vd.i], val, fade);
-
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
- }
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+
+ if (SCULPT_plane_point_side(vd.co, test.plane_tool)) {
+ continue;
+ }
+
+ float intr[3];
+ float val[3];
+ closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
+ sub_v3_v3v3(val, intr, vd.co);
+
+ if (!SCULPT_plane_trim(ss->cache, brush, val)) {
+ continue;
+ }
+
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ mul_v3_v3fl(proxy[vd.i], val, fade);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -5501,38 +5570,39 @@ static void do_clay_thumb_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- float local_co[3];
- mul_v3_m4v3(local_co, mat, vd.co);
- float intr[3], intr_tilt[3];
- float val[3];
-
- closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
- closest_to_plane_normalized_v3(intr_tilt, plane_tilt, vd.co);
-
- /* Mix the deformation of the aligned and the tilted plane based on the brush space vertex
- * coordinates. */
- /* We can also control the mix with a curve if it produces noticeable artifacts in the center
- * of the brush. */
- const float tilt_mix = local_co[1] > 0.0f ? 0.0f : 1.0f;
- interp_v3_v3v3(intr, intr, intr_tilt, tilt_mix);
- sub_v3_v3v3(val, intr_tilt, vd.co);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ float local_co[3];
+ mul_v3_m4v3(local_co, mat, vd.co);
+ float intr[3], intr_tilt[3];
+ float val[3];
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co);
+ closest_to_plane_normalized_v3(intr_tilt, plane_tilt, vd.co);
- mul_v3_v3fl(proxy[vd.i], val, fade);
+ /* Mix the deformation of the aligned and the tilted plane based on the brush space vertex
+ * coordinates. */
+ /* We can also control the mix with a curve if it produces noticeable artifacts in the center
+ * of the brush. */
+ const float tilt_mix = local_co[1] > 0.0f ? 0.0f : 1.0f;
+ interp_v3_v3v3(intr, intr, intr_tilt, tilt_mix);
+ sub_v3_v3v3(val, intr_tilt, vd.co);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ mul_v3_v3fl(proxy[vd.i], val, fade);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -5656,22 +5726,23 @@ static void do_gravity_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
- mul_v3_v3fl(proxy[vd.i], offset, fade);
+ mul_v3_v3fl(proxy[vd.i], offset, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -5766,49 +5837,51 @@ static void sculpt_topology_update(Sculpt *sd,
ob, sd, brush, use_original, radius_scale, &totnode);
/* Only act if some verts are inside the brush area. */
- if (totnode) {
- PBVHTopologyUpdateMode mode = 0;
- float location[3];
+ if (totnode == 0) {
+ return;
+ }
- if (!(sd->flags & SCULPT_DYNTOPO_DETAIL_MANUAL)) {
- if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE) {
- mode |= PBVH_Subdivide;
- }
+ PBVHTopologyUpdateMode mode = 0;
+ float location[3];
- if ((sd->flags & SCULPT_DYNTOPO_COLLAPSE) || (brush->sculpt_tool == SCULPT_TOOL_SIMPLIFY)) {
- mode |= PBVH_Collapse;
- }
+ if (!(sd->flags & SCULPT_DYNTOPO_DETAIL_MANUAL)) {
+ if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE) {
+ mode |= PBVH_Subdivide;
}
- for (n = 0; n < totnode; n++) {
- SCULPT_undo_push_node(ob,
- nodes[n],
- brush->sculpt_tool == SCULPT_TOOL_MASK ? SCULPT_UNDO_MASK :
- SCULPT_UNDO_COORDS);
- BKE_pbvh_node_mark_update(nodes[n]);
-
- if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
- BKE_pbvh_node_mark_topology_update(nodes[n]);
- BKE_pbvh_bmesh_node_save_orig(ss->bm, nodes[n]);
- }
+ if ((sd->flags & SCULPT_DYNTOPO_COLLAPSE) || (brush->sculpt_tool == SCULPT_TOOL_SIMPLIFY)) {
+ mode |= PBVH_Collapse;
}
+ }
+
+ for (n = 0; n < totnode; n++) {
+ SCULPT_undo_push_node(ob,
+ nodes[n],
+ brush->sculpt_tool == SCULPT_TOOL_MASK ? SCULPT_UNDO_MASK :
+ SCULPT_UNDO_COORDS);
+ BKE_pbvh_node_mark_update(nodes[n]);
if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
- BKE_pbvh_bmesh_update_topology(ss->pbvh,
- mode,
- ss->cache->location,
- ss->cache->view_normal,
- ss->cache->radius,
- (brush->flag & BRUSH_FRONTFACE) != 0,
- (brush->falloff_shape != PAINT_FALLOFF_SHAPE_SPHERE));
+ BKE_pbvh_node_mark_topology_update(nodes[n]);
+ BKE_pbvh_bmesh_node_save_orig(ss->bm, nodes[n]);
}
+ }
- MEM_SAFE_FREE(nodes);
-
- /* Update average stroke position. */
- copy_v3_v3(location, ss->cache->true_location);
- mul_m4_v3(ob->obmat, location);
+ if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
+ BKE_pbvh_bmesh_update_topology(ss->pbvh,
+ mode,
+ ss->cache->location,
+ ss->cache->view_normal,
+ ss->cache->radius,
+ (brush->flag & BRUSH_FRONTFACE) != 0,
+ (brush->falloff_shape != PAINT_FALLOFF_SHAPE_SPHERE));
}
+
+ MEM_SAFE_FREE(nodes);
+
+ /* Update average stroke position. */
+ copy_v3_v3(location, ss->cache->true_location);
+ mul_m4_v3(ob->obmat, location);
}
static void do_brush_action_task_cb(void *__restrict userdata,
@@ -5914,202 +5987,199 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSe
}
/* Only act if some verts are inside the brush area. */
- if (totnode) {
- float location[3];
+ if (totnode == 0) {
+ return;
+ }
+ float location[3];
- SculptThreadedTaskData task_data = {
- .sd = sd,
- .ob = ob,
- .brush = brush,
- .nodes = nodes,
- };
+ SculptThreadedTaskData task_data = {
+ .sd = sd,
+ .ob = ob,
+ .brush = brush,
+ .nodes = nodes,
+ };
- TaskParallelSettings settings;
- BKE_pbvh_parallel_range_settings(&settings, true, totnode);
- BLI_task_parallel_range(0, totnode, &task_data, do_brush_action_task_cb, &settings);
+ TaskParallelSettings settings;
+ BKE_pbvh_parallel_range_settings(&settings, true, totnode);
+ BLI_task_parallel_range(0, totnode, &task_data, do_brush_action_task_cb, &settings);
- if (sculpt_brush_needs_normal(ss, brush)) {
- update_sculpt_normal(sd, ob, nodes, totnode);
- }
+ if (sculpt_brush_needs_normal(ss, brush)) {
+ update_sculpt_normal(sd, ob, nodes, totnode);
+ }
- if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_AREA) {
- update_brush_local_mat(sd, ob);
- }
+ if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_AREA) {
+ update_brush_local_mat(sd, ob);
+ }
- if (brush->sculpt_tool == SCULPT_TOOL_POSE && SCULPT_stroke_is_first_brush_step(ss->cache)) {
- SCULPT_pose_brush_init(sd, ob, ss, brush);
- }
+ if (brush->sculpt_tool == SCULPT_TOOL_POSE && SCULPT_stroke_is_first_brush_step(ss->cache)) {
+ SCULPT_pose_brush_init(sd, ob, ss, brush);
+ }
- if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) {
- if (!ss->cache->cloth_sim) {
- ss->cache->cloth_sim = SCULPT_cloth_brush_simulation_create(
- ss, 1.0f, 0.0f, 0.0f, false, true);
- SCULPT_cloth_brush_simulation_init(ss, ss->cache->cloth_sim);
- }
- SCULPT_cloth_brush_store_simulation_state(ss, ss->cache->cloth_sim);
- SCULPT_cloth_brush_ensure_nodes_constraints(
- sd, ob, nodes, totnode, ss->cache->cloth_sim, ss->cache->location, FLT_MAX);
+ if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) {
+ if (!ss->cache->cloth_sim) {
+ ss->cache->cloth_sim = SCULPT_cloth_brush_simulation_create(
+ ss, 1.0f, 0.0f, 0.0f, false, true);
+ SCULPT_cloth_brush_simulation_init(ss, ss->cache->cloth_sim);
}
+ SCULPT_cloth_brush_store_simulation_state(ss, ss->cache->cloth_sim);
+ SCULPT_cloth_brush_ensure_nodes_constraints(
+ sd, ob, nodes, totnode, ss->cache->cloth_sim, ss->cache->location, FLT_MAX);
+ }
- bool invert = ss->cache->pen_flip || ss->cache->invert || brush->flag & BRUSH_DIR_IN;
+ bool invert = ss->cache->pen_flip || ss->cache->invert || brush->flag & BRUSH_DIR_IN;
- /* Apply one type of brush action. */
- switch (brush->sculpt_tool) {
- case SCULPT_TOOL_DRAW:
- do_draw_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_SMOOTH:
- if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_LAPLACIAN) {
- SCULPT_do_smooth_brush(sd, ob, nodes, totnode);
- }
- else if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_SURFACE) {
- SCULPT_do_surface_smooth_brush(sd, ob, nodes, totnode);
- }
- break;
- case SCULPT_TOOL_CREASE:
- do_crease_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_BLOB:
- do_crease_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_PINCH:
- do_pinch_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_INFLATE:
- do_inflate_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_GRAB:
- do_grab_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_ROTATE:
- do_rotate_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_SNAKE_HOOK:
- do_snake_hook_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_NUDGE:
- do_nudge_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_THUMB:
- do_thumb_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_LAYER:
- do_layer_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_FLATTEN:
- do_flatten_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_CLAY:
- do_clay_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_CLAY_STRIPS:
- do_clay_strips_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_MULTIPLANE_SCRAPE:
- SCULPT_do_multiplane_scrape_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_CLAY_THUMB:
- do_clay_thumb_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_FILL:
- if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) {
- do_scrape_brush(sd, ob, nodes, totnode);
- }
- else {
- do_fill_brush(sd, ob, nodes, totnode);
- }
- break;
- case SCULPT_TOOL_SCRAPE:
- if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) {
- do_fill_brush(sd, ob, nodes, totnode);
- }
- else {
- do_scrape_brush(sd, ob, nodes, totnode);
- }
- break;
- case SCULPT_TOOL_MASK:
- do_mask_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_POSE:
- SCULPT_do_pose_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_DRAW_SHARP:
- do_draw_sharp_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_ELASTIC_DEFORM:
- do_elastic_deform_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_SLIDE_RELAX:
- do_slide_relax_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_BOUNDARY:
- SCULPT_do_boundary_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_CLOTH:
- SCULPT_do_cloth_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_DRAW_FACE_SETS:
- SCULPT_do_draw_face_sets_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_DISPLACEMENT_ERASER:
- do_displacement_eraser_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_DISPLACEMENT_SMEAR:
- do_displacement_smear_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_PAINT:
- SCULPT_do_paint_brush(sd, ob, nodes, totnode);
- break;
- case SCULPT_TOOL_SMEAR:
- SCULPT_do_smear_brush(sd, ob, nodes, totnode);
- break;
- }
-
- if (!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_MASK) &&
- brush->autosmooth_factor > 0) {
- if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) {
- SCULPT_smooth(sd,
- ob,
- nodes,
- totnode,
- brush->autosmooth_factor * (1.0f - ss->cache->pressure),
- false);
+ /* Apply one type of brush action. */
+ switch (brush->sculpt_tool) {
+ case SCULPT_TOOL_DRAW:
+ do_draw_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_SMOOTH:
+ if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_LAPLACIAN) {
+ SCULPT_do_smooth_brush(sd, ob, nodes, totnode);
+ }
+ else if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_SURFACE) {
+ SCULPT_do_surface_smooth_brush(sd, ob, nodes, totnode);
+ }
+ break;
+ case SCULPT_TOOL_CREASE:
+ do_crease_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_BLOB:
+ do_crease_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_PINCH:
+ do_pinch_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_INFLATE:
+ do_inflate_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_GRAB:
+ do_grab_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_ROTATE:
+ do_rotate_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_SNAKE_HOOK:
+ do_snake_hook_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_NUDGE:
+ do_nudge_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_THUMB:
+ do_thumb_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_LAYER:
+ do_layer_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_FLATTEN:
+ do_flatten_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_CLAY:
+ do_clay_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_CLAY_STRIPS:
+ do_clay_strips_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_MULTIPLANE_SCRAPE:
+ SCULPT_do_multiplane_scrape_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_CLAY_THUMB:
+ do_clay_thumb_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_FILL:
+ if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) {
+ do_scrape_brush(sd, ob, nodes, totnode);
}
else {
- SCULPT_smooth(sd, ob, nodes, totnode, brush->autosmooth_factor, false);
+ do_fill_brush(sd, ob, nodes, totnode);
}
- }
+ break;
+ case SCULPT_TOOL_SCRAPE:
+ if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) {
+ do_fill_brush(sd, ob, nodes, totnode);
+ }
+ else {
+ do_scrape_brush(sd, ob, nodes, totnode);
+ }
+ break;
+ case SCULPT_TOOL_MASK:
+ do_mask_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_POSE:
+ SCULPT_do_pose_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_DRAW_SHARP:
+ do_draw_sharp_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_ELASTIC_DEFORM:
+ do_elastic_deform_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_SLIDE_RELAX:
+ do_slide_relax_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_BOUNDARY:
+ SCULPT_do_boundary_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_CLOTH:
+ SCULPT_do_cloth_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_DRAW_FACE_SETS:
+ SCULPT_do_draw_face_sets_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_DISPLACEMENT_ERASER:
+ do_displacement_eraser_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_DISPLACEMENT_SMEAR:
+ do_displacement_smear_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_PAINT:
+ SCULPT_do_paint_brush(sd, ob, nodes, totnode);
+ break;
+ case SCULPT_TOOL_SMEAR:
+ SCULPT_do_smear_brush(sd, ob, nodes, totnode);
+ break;
+ }
- if (sculpt_brush_use_topology_rake(ss, brush)) {
- bmesh_topology_rake(sd, ob, nodes, totnode, brush->topology_rake_factor);
+ if (!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_MASK) &&
+ brush->autosmooth_factor > 0) {
+ if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) {
+ SCULPT_smooth(
+ sd, ob, nodes, totnode, brush->autosmooth_factor * (1.0f - ss->cache->pressure), false);
}
-
- /* The cloth brush adds the gravity as a regular force and it is processed in the solver. */
- if (ss->cache->supports_gravity && !ELEM(brush->sculpt_tool,
- SCULPT_TOOL_CLOTH,
- SCULPT_TOOL_DRAW_FACE_SETS,
- SCULPT_TOOL_BOUNDARY)) {
- do_gravity(sd, ob, nodes, totnode, sd->gravity_factor);
+ else {
+ SCULPT_smooth(sd, ob, nodes, totnode, brush->autosmooth_factor, false);
}
+ }
- if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) {
- if (SCULPT_stroke_is_main_symmetry_pass(ss->cache)) {
- SCULPT_cloth_sim_activate_nodes(ss->cache->cloth_sim, nodes, totnode);
- SCULPT_cloth_brush_do_simulation_step(sd, ob, ss->cache->cloth_sim, nodes, totnode);
- }
+ if (sculpt_brush_use_topology_rake(ss, brush)) {
+ bmesh_topology_rake(sd, ob, nodes, totnode, brush->topology_rake_factor);
+ }
+
+ /* The cloth brush adds the gravity as a regular force and it is processed in the solver. */
+ if (ss->cache->supports_gravity && !ELEM(brush->sculpt_tool,
+ SCULPT_TOOL_CLOTH,
+ SCULPT_TOOL_DRAW_FACE_SETS,
+ SCULPT_TOOL_BOUNDARY)) {
+ do_gravity(sd, ob, nodes, totnode, sd->gravity_factor);
+ }
+
+ if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) {
+ if (SCULPT_stroke_is_main_symmetry_pass(ss->cache)) {
+ SCULPT_cloth_sim_activate_nodes(ss->cache->cloth_sim, nodes, totnode);
+ SCULPT_cloth_brush_do_simulation_step(sd, ob, ss->cache->cloth_sim, nodes, totnode);
}
+ }
- MEM_SAFE_FREE(nodes);
+ MEM_SAFE_FREE(nodes);
- /* Update average stroke position. */
- copy_v3_v3(location, ss->cache->true_location);
- mul_m4_v3(ob->obmat, location);
+ /* Update average stroke position. */
+ copy_v3_v3(location, ss->cache->true_location);
+ mul_m4_v3(ob->obmat, location);
- add_v3_v3(ups->average_stroke_accum, location);
- ups->average_stroke_counter++;
- /* Update last stroke position. */
- ups->last_stroke_valid = true;
- }
+ add_v3_v3(ups->average_stroke_accum, location);
+ ups->average_stroke_counter++;
+ /* Update last stroke position. */
+ ups->last_stroke_valid = true;
}
/* Flush displacement from deformed PBVH vertex to original mesh. */
@@ -6199,22 +6269,22 @@ static void sculpt_combine_proxies(Sculpt *sd, Object *ob)
PBVHNode **nodes;
int totnode;
- BKE_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode);
-
- /* First line is tools that don't support proxies. */
- if (ss->cache->supports_gravity || (sculpt_tool_is_proxy_used(brush->sculpt_tool) == false)) {
- SculptThreadedTaskData data = {
- .sd = sd,
- .ob = ob,
- .brush = brush,
- .nodes = nodes,
- };
-
- TaskParallelSettings settings;
- BKE_pbvh_parallel_range_settings(&settings, true, totnode);
- BLI_task_parallel_range(0, totnode, &data, sculpt_combine_proxies_task_cb, &settings);
+ if (!ss->cache->supports_gravity && sculpt_tool_is_proxy_used(brush->sculpt_tool)) {
+ /* First line is tools that don't support proxies. */
+ return;
}
+ BKE_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode);
+ SculptThreadedTaskData data = {
+ .sd = sd,
+ .ob = ob,
+ .brush = brush,
+ .nodes = nodes,
+ };
+
+ TaskParallelSettings settings;
+ BKE_pbvh_parallel_range_settings(&settings, true, totnode);
+ BLI_task_parallel_range(0, totnode, &data, sculpt_combine_proxies_task_cb, &settings);
MEM_SAFE_FREE(nodes);
}
@@ -6235,12 +6305,14 @@ static void sculpt_update_keyblock(Object *ob)
vertCos = BKE_pbvh_vert_coords_alloc(ss->pbvh);
}
- if (vertCos) {
- SCULPT_vertcos_to_key(ob, ss->shapekey_active, vertCos);
+ if (!vertCos) {
+ return;
+ }
- if (vertCos != ss->orig_cos) {
- MEM_freeN(vertCos);
- }
+ SCULPT_vertcos_to_key(ob, ss->shapekey_active, vertCos);
+
+ if (vertCos != ss->orig_cos) {
+ MEM_freeN(vertCos);
}
}
@@ -6259,10 +6331,12 @@ static void SCULPT_flush_stroke_deform_task_cb(void *__restrict userdata,
{
sculpt_flush_pbvhvert_deform(ob, &vd);
- if (vertCos) {
- int index = vd.vert_indices[vd.i];
- copy_v3_v3(vertCos[index], ss->orig_cos[index]);
+ if (!vertCos) {
+ continue;
}
+
+ int index = vd.vert_indices[vd.i];
+ copy_v3_v3(vertCos[index], ss->orig_cos[index]);
}
BKE_pbvh_vertex_iter_end;
}
@@ -6411,7 +6485,7 @@ static void do_tiled(
}
}
- /* First do the "untiled" position to initialize the stroke for this location. */
+ /* First do the "un-tiled" position to initialize the stroke for this location. */
cache->tile_pass = 0;
action(sd, ob, brush, ups);
@@ -6490,17 +6564,18 @@ static void do_symmetrical_brush_actions(Sculpt *sd,
/* `symm` is a bit combination of XYZ -
* 1 is mirror X; 2 is Y; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */
for (int i = 0; i <= symm; i++) {
- if (i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) {
- cache->mirror_symmetry_pass = i;
- cache->radial_symmetry_pass = 0;
+ if (!SCULPT_is_symmetry_iteration_valid(i, symm)) {
+ continue;
+ }
+ cache->mirror_symmetry_pass = i;
+ cache->radial_symmetry_pass = 0;
- SCULPT_cache_calc_brushdata_symm(cache, i, 0, 0);
- do_tiled(sd, ob, brush, ups, action);
+ SCULPT_cache_calc_brushdata_symm(cache, i, 0, 0);
+ do_tiled(sd, ob, brush, ups, action);
- do_radial_symmetry(sd, ob, brush, ups, action, i, 'X', feather);
- do_radial_symmetry(sd, ob, brush, ups, action, i, 'Y', feather);
- do_radial_symmetry(sd, ob, brush, ups, action, i, 'Z', feather);
- }
+ do_radial_symmetry(sd, ob, brush, ups, action, i, 'X', feather);
+ do_radial_symmetry(sd, ob, brush, ups, action, i, 'Y', feather);
+ do_radial_symmetry(sd, ob, brush, ups, action, i, 'Z', feather);
}
}
@@ -6668,22 +6743,25 @@ static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss)
ModifierData *md;
for (md = ob->modifiers.first; md; md = md->next) {
- if (md->type == eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) {
- MirrorModifierData *mmd = (MirrorModifierData *)md;
-
- if (mmd->flag & MOD_MIR_CLIPPING) {
- /* Check each axis for mirroring. */
- for (int i = 0; i < 3; i++) {
- if (mmd->flag & (MOD_MIR_AXIS_X << i)) {
- /* Enable sculpt clipping. */
- ss->cache->flag |= CLIP_X << i;
-
- /* Update the clip tolerance. */
- if (mmd->tolerance > ss->cache->clip_tolerance[i]) {
- ss->cache->clip_tolerance[i] = mmd->tolerance;
- }
- }
- }
+ if (!(md->type == eModifierType_Mirror && (md->mode & eModifierMode_Realtime))) {
+ continue;
+ }
+ MirrorModifierData *mmd = (MirrorModifierData *)md;
+
+ if (!(mmd->flag & MOD_MIR_CLIPPING)) {
+ continue;
+ }
+ /* Check each axis for mirroring. */
+ for (int i = 0; i < 3; i++) {
+ if (!(mmd->flag & (MOD_MIR_AXIS_X << i))) {
+ continue;
+ }
+ /* Enable sculpt clipping. */
+ ss->cache->flag |= CLIP_X << i;
+
+ /* Update the clip tolerance. */
+ if (mmd->tolerance > ss->cache->clip_tolerance[i]) {
+ ss->cache->clip_tolerance[i] = mmd->tolerance;
}
}
}
@@ -6926,150 +7004,151 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru
};
int tool = brush->sculpt_tool;
- if (ELEM(tool,
- SCULPT_TOOL_PAINT,
- SCULPT_TOOL_GRAB,
- SCULPT_TOOL_ELASTIC_DEFORM,
- SCULPT_TOOL_CLOTH,
- SCULPT_TOOL_NUDGE,
- SCULPT_TOOL_CLAY_STRIPS,
- SCULPT_TOOL_PINCH,
- SCULPT_TOOL_MULTIPLANE_SCRAPE,
- SCULPT_TOOL_CLAY_THUMB,
- SCULPT_TOOL_SNAKE_HOOK,
- SCULPT_TOOL_POSE,
- SCULPT_TOOL_BOUNDARY,
- SCULPT_TOOL_THUMB) ||
- sculpt_brush_use_topology_rake(ss, brush)) {
- float grab_location[3], imat[4][4], delta[3], loc[3];
+ if (!ELEM(tool,
+ SCULPT_TOOL_PAINT,
+ SCULPT_TOOL_GRAB,
+ SCULPT_TOOL_ELASTIC_DEFORM,
+ SCULPT_TOOL_CLOTH,
+ SCULPT_TOOL_NUDGE,
+ SCULPT_TOOL_CLAY_STRIPS,
+ SCULPT_TOOL_PINCH,
+ SCULPT_TOOL_MULTIPLANE_SCRAPE,
+ SCULPT_TOOL_CLAY_THUMB,
+ SCULPT_TOOL_SNAKE_HOOK,
+ SCULPT_TOOL_POSE,
+ SCULPT_TOOL_BOUNDARY,
+ SCULPT_TOOL_THUMB) &&
+ !sculpt_brush_use_topology_rake(ss, brush)) {
+ return;
+ }
+ float grab_location[3], imat[4][4], delta[3], loc[3];
- if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) {
- if (tool == SCULPT_TOOL_GRAB && brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) {
- copy_v3_v3(cache->orig_grab_location,
- SCULPT_vertex_co_for_grab_active_get(ss, SCULPT_active_vertex_get(ss)));
- }
- else {
- copy_v3_v3(cache->orig_grab_location, cache->true_location);
- }
+ if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) {
+ if (tool == SCULPT_TOOL_GRAB && brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) {
+ copy_v3_v3(cache->orig_grab_location,
+ SCULPT_vertex_co_for_grab_active_get(ss, SCULPT_active_vertex_get(ss)));
}
- else if (tool == SCULPT_TOOL_SNAKE_HOOK ||
- (tool == SCULPT_TOOL_CLOTH &&
- brush->cloth_deform_type == BRUSH_CLOTH_DEFORM_SNAKE_HOOK)) {
- add_v3_v3(cache->true_location, cache->grab_delta);
+ else {
+ copy_v3_v3(cache->orig_grab_location, cache->true_location);
}
+ }
+ else if (tool == SCULPT_TOOL_SNAKE_HOOK ||
+ (tool == SCULPT_TOOL_CLOTH &&
+ brush->cloth_deform_type == BRUSH_CLOTH_DEFORM_SNAKE_HOOK)) {
+ add_v3_v3(cache->true_location, cache->grab_delta);
+ }
- /* Compute 3d coordinate at same z from original location + mouse. */
- mul_v3_m4v3(loc, ob->obmat, cache->orig_grab_location);
- ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mouse, grab_location);
+ /* Compute 3d coordinate at same z from original location + mouse. */
+ mul_v3_m4v3(loc, ob->obmat, cache->orig_grab_location);
+ ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mouse, grab_location);
- /* Compute delta to move verts by. */
- if (!SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) {
- if (sculpt_needs_delta_from_anchored_origin(brush)) {
- sub_v3_v3v3(delta, grab_location, cache->old_grab_location);
- invert_m4_m4(imat, ob->obmat);
- mul_mat3_m4_v3(imat, delta);
- add_v3_v3(cache->grab_delta, delta);
- }
- else if (sculpt_needs_delta_for_tip_orientation(brush)) {
- if (brush->flag & BRUSH_ANCHORED) {
- float orig[3];
- mul_v3_m4v3(orig, ob->obmat, cache->orig_grab_location);
- sub_v3_v3v3(cache->grab_delta, grab_location, orig);
- }
- else {
- sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location);
- }
- invert_m4_m4(imat, ob->obmat);
- mul_mat3_m4_v3(imat, cache->grab_delta);
+ /* Compute delta to move verts by. */
+ if (!SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) {
+ if (sculpt_needs_delta_from_anchored_origin(brush)) {
+ sub_v3_v3v3(delta, grab_location, cache->old_grab_location);
+ invert_m4_m4(imat, ob->obmat);
+ mul_mat3_m4_v3(imat, delta);
+ add_v3_v3(cache->grab_delta, delta);
+ }
+ else if (sculpt_needs_delta_for_tip_orientation(brush)) {
+ if (brush->flag & BRUSH_ANCHORED) {
+ float orig[3];
+ mul_v3_m4v3(orig, ob->obmat, cache->orig_grab_location);
+ sub_v3_v3v3(cache->grab_delta, grab_location, orig);
}
else {
- /* Use for 'Brush.topology_rake_factor'. */
sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location);
}
+ invert_m4_m4(imat, ob->obmat);
+ mul_mat3_m4_v3(imat, cache->grab_delta);
}
else {
- zero_v3(cache->grab_delta);
+ /* Use for 'Brush.topology_rake_factor'. */
+ sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location);
}
+ }
+ else {
+ zero_v3(cache->grab_delta);
+ }
- if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) {
- project_plane_v3_v3v3(cache->grab_delta, cache->grab_delta, ss->cache->true_view_normal);
- }
+ if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) {
+ project_plane_v3_v3v3(cache->grab_delta, cache->grab_delta, ss->cache->true_view_normal);
+ }
- copy_v3_v3(cache->old_grab_location, grab_location);
+ copy_v3_v3(cache->old_grab_location, grab_location);
- if (tool == SCULPT_TOOL_GRAB) {
- if (brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) {
- copy_v3_v3(cache->anchored_location, cache->orig_grab_location);
- }
- else {
- copy_v3_v3(cache->anchored_location, cache->true_location);
- }
+ if (tool == SCULPT_TOOL_GRAB) {
+ if (brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) {
+ copy_v3_v3(cache->anchored_location, cache->orig_grab_location);
}
- else if (tool == SCULPT_TOOL_ELASTIC_DEFORM || SCULPT_is_cloth_deform_brush(brush)) {
+ else {
copy_v3_v3(cache->anchored_location, cache->true_location);
}
- else if (tool == SCULPT_TOOL_THUMB) {
- copy_v3_v3(cache->anchored_location, cache->orig_grab_location);
- }
+ }
+ else if (tool == SCULPT_TOOL_ELASTIC_DEFORM || SCULPT_is_cloth_deform_brush(brush)) {
+ copy_v3_v3(cache->anchored_location, cache->true_location);
+ }
+ else if (tool == SCULPT_TOOL_THUMB) {
+ copy_v3_v3(cache->anchored_location, cache->orig_grab_location);
+ }
- if (sculpt_needs_delta_from_anchored_origin(brush)) {
- /* Location stays the same for finding vertices in brush radius. */
- copy_v3_v3(cache->true_location, cache->orig_grab_location);
+ if (sculpt_needs_delta_from_anchored_origin(brush)) {
+ /* Location stays the same for finding vertices in brush radius. */
+ copy_v3_v3(cache->true_location, cache->orig_grab_location);
- ups->draw_anchored = true;
- copy_v2_v2(ups->anchored_initial_mouse, cache->initial_mouse);
- ups->anchored_size = ups->pixel_radius;
- }
+ ups->draw_anchored = true;
+ copy_v2_v2(ups->anchored_initial_mouse, cache->initial_mouse);
+ ups->anchored_size = ups->pixel_radius;
+ }
- /* Handle 'rake' */
- cache->is_rake_rotation_valid = false;
+ /* Handle 'rake' */
+ cache->is_rake_rotation_valid = false;
- invert_m4_m4(imat, ob->obmat);
- mul_mat3_m4_v3(imat, grab_location);
+ invert_m4_m4(imat, ob->obmat);
+ mul_mat3_m4_v3(imat, grab_location);
- if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) {
- copy_v3_v3(cache->rake_data.follow_co, grab_location);
- }
+ if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) {
+ copy_v3_v3(cache->rake_data.follow_co, grab_location);
+ }
- if (sculpt_brush_needs_rake_rotation(brush)) {
- cache->rake_data.follow_dist = cache->radius * SCULPT_RAKE_BRUSH_FACTOR;
+ if (!sculpt_brush_needs_rake_rotation(brush)) {
+ return;
+ }
+ cache->rake_data.follow_dist = cache->radius * SCULPT_RAKE_BRUSH_FACTOR;
- if (!is_zero_v3(cache->grab_delta)) {
- const float eps = 0.00001f;
+ if (!is_zero_v3(cache->grab_delta)) {
+ const float eps = 0.00001f;
- float v1[3], v2[3];
+ float v1[3], v2[3];
- copy_v3_v3(v1, cache->rake_data.follow_co);
- copy_v3_v3(v2, cache->rake_data.follow_co);
- sub_v3_v3(v2, cache->grab_delta);
+ copy_v3_v3(v1, cache->rake_data.follow_co);
+ copy_v3_v3(v2, cache->rake_data.follow_co);
+ sub_v3_v3(v2, cache->grab_delta);
- sub_v3_v3(v1, grab_location);
- sub_v3_v3(v2, grab_location);
+ sub_v3_v3(v1, grab_location);
+ sub_v3_v3(v2, grab_location);
- if ((normalize_v3(v2) > eps) && (normalize_v3(v1) > eps) &&
- (len_squared_v3v3(v1, v2) > eps)) {
- const float rake_dist_sq = len_squared_v3v3(cache->rake_data.follow_co, grab_location);
- const float rake_fade = (rake_dist_sq > square_f(cache->rake_data.follow_dist)) ?
- 1.0f :
- sqrtf(rake_dist_sq) / cache->rake_data.follow_dist;
+ if ((normalize_v3(v2) > eps) && (normalize_v3(v1) > eps) && (len_squared_v3v3(v1, v2) > eps)) {
+ const float rake_dist_sq = len_squared_v3v3(cache->rake_data.follow_co, grab_location);
+ const float rake_fade = (rake_dist_sq > square_f(cache->rake_data.follow_dist)) ?
+ 1.0f :
+ sqrtf(rake_dist_sq) / cache->rake_data.follow_dist;
- float axis[3], angle;
- float tquat[4];
+ float axis[3], angle;
+ float tquat[4];
- rotation_between_vecs_to_quat(tquat, v1, v2);
+ rotation_between_vecs_to_quat(tquat, v1, v2);
- /* Use axis-angle to scale rotation since the factor may be above 1. */
- quat_to_axis_angle(axis, &angle, tquat);
- normalize_v3(axis);
+ /* Use axis-angle to scale rotation since the factor may be above 1. */
+ quat_to_axis_angle(axis, &angle, tquat);
+ normalize_v3(axis);
- angle *= brush->rake_factor * rake_fade;
- axis_angle_normalized_to_quat(cache->rake_rotation, axis, angle);
- cache->is_rake_rotation_valid = true;
- }
- }
- sculpt_rake_data_update(&cache->rake_data, grab_location);
+ angle *= brush->rake_factor * rake_fade;
+ axis_angle_normalized_to_quat(cache->rake_rotation, axis, angle);
+ cache->is_rake_rotation_valid = true;
}
}
+ sculpt_rake_data_update(&cache->rake_data, grab_location);
}
static void sculpt_update_cache_paint_variants(StrokeCache *cache, const Brush *brush)
@@ -7257,71 +7336,73 @@ void SCULPT_stroke_modifiers_check(const bContext *C, Object *ob, const Brush *b
static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float *tmin)
{
- if (BKE_pbvh_node_get_tmin(node) < *tmin) {
- SculptRaycastData *srd = data_v;
- float(*origco)[3] = NULL;
- bool use_origco = false;
+ if (BKE_pbvh_node_get_tmin(node) >= *tmin) {
+ return;
+ }
+ SculptRaycastData *srd = data_v;
+ float(*origco)[3] = NULL;
+ bool use_origco = false;
- if (srd->original && srd->ss->cache) {
- if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) {
- use_origco = true;
- }
- else {
- /* Intersect with coordinates from before we started stroke. */
- SculptUndoNode *unode = SCULPT_undo_get_node(node);
- origco = (unode) ? unode->co : NULL;
- use_origco = origco ? true : false;
- }
+ if (srd->original && srd->ss->cache) {
+ if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) {
+ use_origco = true;
}
-
- if (BKE_pbvh_node_raycast(srd->ss->pbvh,
- node,
- origco,
- use_origco,
- srd->ray_start,
- srd->ray_normal,
- &srd->isect_precalc,
- &srd->depth,
- &srd->active_vertex_index,
- &srd->active_face_grid_index,
- srd->face_normal)) {
- srd->hit = true;
- *tmin = srd->depth;
+ else {
+ /* Intersect with coordinates from before we started stroke. */
+ SculptUndoNode *unode = SCULPT_undo_get_node(node);
+ origco = (unode) ? unode->co : NULL;
+ use_origco = origco ? true : false;
}
}
+
+ if (BKE_pbvh_node_raycast(srd->ss->pbvh,
+ node,
+ origco,
+ use_origco,
+ srd->ray_start,
+ srd->ray_normal,
+ &srd->isect_precalc,
+ &srd->depth,
+ &srd->active_vertex_index,
+ &srd->active_face_grid_index,
+ srd->face_normal)) {
+ srd->hit = true;
+ *tmin = srd->depth;
+ }
}
static void sculpt_find_nearest_to_ray_cb(PBVHNode *node, void *data_v, float *tmin)
{
- if (BKE_pbvh_node_get_tmin(node) < *tmin) {
- SculptFindNearestToRayData *srd = data_v;
- float(*origco)[3] = NULL;
- bool use_origco = false;
+ if (BKE_pbvh_node_get_tmin(node) >= *tmin) {
+ return;
+ }
+ SculptFindNearestToRayData *srd = data_v;
+ float(*origco)[3] = NULL;
+ bool use_origco = false;
- if (srd->original && srd->ss->cache) {
- if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) {
- use_origco = true;
- }
- else {
- /* Intersect with coordinates from before we started stroke. */
- SculptUndoNode *unode = SCULPT_undo_get_node(node);
- origco = (unode) ? unode->co : NULL;
- use_origco = origco ? true : false;
- }
+ if (srd->original && srd->ss->cache) {
+ if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) {
+ use_origco = true;
}
-
- if (BKE_pbvh_node_find_nearest_to_ray(srd->ss->pbvh,
- node,
- origco,
- use_origco,
- srd->ray_start,
- srd->ray_normal,
- &srd->depth,
- &srd->dist_sq_to_ray)) {
- srd->hit = true;
- *tmin = srd->dist_sq_to_ray;
+ else {
+ /* Intersect with coordinates from before we started stroke. */
+ SculptUndoNode *unode = SCULPT_undo_get_node(node);
+ origco = (unode) ? unode->co : NULL;
+ use_origco = origco ? true : false;
}
}
+
+ if (BKE_pbvh_node_find_nearest_to_ray(srd->ss->pbvh,
+ node,
+ origco,
+ use_origco,
+ srd->ray_start,
+ srd->ray_normal,
+ &srd->depth,
+ &srd->dist_sq_to_ray)) {
+ srd->hit = true;
+ *tmin = srd->dist_sq_to_ray;
+ }
}
float SCULPT_raycast_init(ViewContext *vc,
@@ -7546,26 +7627,30 @@ bool SCULPT_stroke_get_location(bContext *C, float out[3], const float mouse[2])
}
}
- if (!hit) {
- if (ELEM(brush->falloff_shape, PAINT_FALLOFF_SHAPE_TUBE)) {
- SculptFindNearestToRayData srd = {
- .original = original,
- .ss = ob->sculpt,
- .hit = false,
- .ray_start = ray_start,
- .ray_normal = ray_normal,
- .depth = FLT_MAX,
- .dist_sq_to_ray = FLT_MAX,
- };
- BKE_pbvh_find_nearest_to_ray(
- ss->pbvh, sculpt_find_nearest_to_ray_cb, &srd, ray_start, ray_normal, srd.original);
- if (srd.hit) {
- hit = true;
- copy_v3_v3(out, ray_normal);
- mul_v3_fl(out, srd.depth);
- add_v3_v3(out, ray_start);
- }
- }
+ if (hit) {
+ return hit;
+ }
+
+ if (!ELEM(brush->falloff_shape, PAINT_FALLOFF_SHAPE_TUBE)) {
+ return hit;
+ }
+
+ SculptFindNearestToRayData srd = {
+ .original = original,
+ .ss = ob->sculpt,
+ .hit = false,
+ .ray_start = ray_start,
+ .ray_normal = ray_normal,
+ .depth = FLT_MAX,
+ .dist_sq_to_ray = FLT_MAX,
+ };
+ BKE_pbvh_find_nearest_to_ray(
+ ss->pbvh, sculpt_find_nearest_to_ray_cb, &srd, ray_start, ray_normal, srd.original);
+ if (srd.hit) {
+ hit = true;
+ copy_v3_v3(out, ray_normal);
+ mul_v3_fl(out, srd.depth);
+ add_v3_v3(out, ray_start);
}
return hit;
@@ -7748,19 +7833,20 @@ void SCULPT_flush_update_done(const bContext *C, Object *ob, SculptUpdateType up
bScreen *screen = WM_window_get_active_screen(win);
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
SpaceLink *sl = area->spacedata.first;
- if (sl->spacetype == SPACE_VIEW3D) {
- View3D *v3d = (View3D *)sl;
- if (v3d != current_v3d) {
- need_tag |= !BKE_sculptsession_use_pbvh_draw(ob, v3d);
- }
+ if (sl->spacetype != SPACE_VIEW3D) {
+ continue;
+ }
+ View3D *v3d = (View3D *)sl;
+ if (v3d != current_v3d) {
+ need_tag |= !BKE_sculptsession_use_pbvh_draw(ob, v3d);
+ }
- /* Tag all 3D viewports for redraw now that we are done. Others
- * viewports did not get a full redraw, and anti-aliasing for the
- * current viewport was deactivated. */
- LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
- if (region->regiontype == RGN_TYPE_WINDOW) {
- ED_region_tag_redraw(region);
- }
+ /* Tag all 3D viewports for redraw now that we are done. Others
+ * viewports did not get a full redraw, and anti-aliasing for the
+ * current viewport was deactivated. */
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ if (region->regiontype == RGN_TYPE_WINDOW) {
+ ED_region_tag_redraw(region);
}
}
}
@@ -7920,55 +8006,56 @@ static void sculpt_stroke_done(const bContext *C, struct PaintStroke *UNUSED(str
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
/* Finished. */
- if (ss->cache) {
- UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings;
- Brush *brush = BKE_paint_brush(&sd->paint);
- BLI_assert(brush == ss->cache->brush); /* const, so we shouldn't change. */
- ups->draw_inverted = false;
+ if (!ss->cache) {
+ sculpt_brush_exit_tex(sd);
+ return;
+ }
+ UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings;
+ Brush *brush = BKE_paint_brush(&sd->paint);
+ BLI_assert(brush == ss->cache->brush); /* const, so we shouldn't change. */
+ ups->draw_inverted = false;
- SCULPT_stroke_modifiers_check(C, ob, brush);
+ SCULPT_stroke_modifiers_check(C, ob, brush);
- /* Alt-Smooth. */
- if (ss->cache->alt_smooth) {
- if (brush->sculpt_tool == SCULPT_TOOL_MASK) {
- brush->mask_tool = ss->cache->saved_mask_brush_tool;
- }
- else if (ELEM(brush->sculpt_tool,
- SCULPT_TOOL_SLIDE_RELAX,
- SCULPT_TOOL_DRAW_FACE_SETS,
- SCULPT_TOOL_PAINT,
- SCULPT_TOOL_SMEAR)) {
- /* Do nothing. */
- }
- else {
- BKE_brush_size_set(scene, brush, ss->cache->saved_smooth_size);
- brush = (Brush *)BKE_libblock_find_name(bmain, ID_BR, ss->cache->saved_active_brush_name);
- if (brush) {
- BKE_paint_brush_set(&sd->paint, brush);
- }
- }
+ /* Alt-Smooth. */
+ if (ss->cache->alt_smooth) {
+ if (brush->sculpt_tool == SCULPT_TOOL_MASK) {
+ brush->mask_tool = ss->cache->saved_mask_brush_tool;
}
-
- if (SCULPT_is_automasking_enabled(sd, ss, brush)) {
- SCULPT_automasking_cache_free(ss->cache->automasking);
+ else if (ELEM(brush->sculpt_tool,
+ SCULPT_TOOL_SLIDE_RELAX,
+ SCULPT_TOOL_DRAW_FACE_SETS,
+ SCULPT_TOOL_PAINT,
+ SCULPT_TOOL_SMEAR)) {
+ /* Do nothing. */
}
+ else {
+ BKE_brush_size_set(scene, brush, ss->cache->saved_smooth_size);
+ brush = (Brush *)BKE_libblock_find_name(bmain, ID_BR, ss->cache->saved_active_brush_name);
+ if (brush) {
+ BKE_paint_brush_set(&sd->paint, brush);
+ }
+ }
+ }
- BKE_pbvh_node_color_buffer_free(ss->pbvh);
- SCULPT_cache_free(ss->cache);
- ss->cache = NULL;
+ if (SCULPT_is_automasking_enabled(sd, ss, brush)) {
+ SCULPT_automasking_cache_free(ss->cache->automasking);
+ }
- SCULPT_undo_push_end();
+ BKE_pbvh_node_color_buffer_free(ss->pbvh);
+ SCULPT_cache_free(ss->cache);
+ ss->cache = NULL;
- if (brush->sculpt_tool == SCULPT_TOOL_MASK) {
- SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK);
- }
- else {
- SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_COORDS);
- }
+ SCULPT_undo_push_end();
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
+ if (brush->sculpt_tool == SCULPT_TOOL_MASK) {
+ SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK);
+ }
+ else {
+ SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_COORDS);
}
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
sculpt_brush_exit_tex(sd);
}
@@ -8090,21 +8177,22 @@ static int sculpt_set_persistent_base_exec(bContext *C, wmOperator *UNUSED(op))
Object *ob = CTX_data_active_object(C);
SculptSession *ss = ob->sculpt;
- if (ss) {
- SCULPT_vertex_random_access_ensure(ss);
- BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false);
+ if (!ss) {
+ return OPERATOR_FINISHED;
+ }
+ SCULPT_vertex_random_access_ensure(ss);
+ BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false);
- MEM_SAFE_FREE(ss->persistent_base);
+ MEM_SAFE_FREE(ss->persistent_base);
- const int totvert = SCULPT_vertex_count_get(ss);
- ss->persistent_base = MEM_mallocN(sizeof(SculptPersistentBase) * totvert,
- "layer persistent base");
+ const int totvert = SCULPT_vertex_count_get(ss);
+ ss->persistent_base = MEM_mallocN(sizeof(SculptPersistentBase) * totvert,
+ "layer persistent base");
- for (int i = 0; i < totvert; i++) {
- copy_v3_v3(ss->persistent_base[i].co, SCULPT_vertex_co_get(ss, i));
- SCULPT_vertex_normal_get(ss, i, ss->persistent_base[i].no);
- ss->persistent_base[i].disp = 0.0f;
- }
+ for (int i = 0; i < totvert; i++) {
+ copy_v3_v3(ss->persistent_base[i].co, SCULPT_vertex_co_get(ss, i));
+ SCULPT_vertex_normal_get(ss, i, ss->persistent_base[i].no);
+ ss->persistent_base[i].disp = 0.0f;
}
return OPERATOR_FINISHED;
@@ -8564,12 +8652,13 @@ void SCULPT_geometry_preview_lines_update(bContext *C, SculptSession *ss, float
totpoints++;
ss->preview_vert_index_list[totpoints] = to_v;
totpoints++;
- if (!BLI_BITMAP_TEST(visited_vertices, to_v)) {
- BLI_BITMAP_ENABLE(visited_vertices, to_v);
- const float *co = SCULPT_vertex_co_for_grab_active_get(ss, to_v);
- if (len_squared_v3v3(brush_co, co) < radius * radius) {
- BLI_gsqueue_push(not_visited_vertices, &to_v);
- }
+ if (BLI_BITMAP_TEST(visited_vertices, to_v)) {
+ continue;
+ }
+ BLI_BITMAP_ENABLE(visited_vertices, to_v);
+ const float *co = SCULPT_vertex_co_for_grab_active_get(ss, to_v);
+ if (len_squared_v3v3(brush_co, co) < radius * radius) {
+ BLI_gsqueue_push(not_visited_vertices, &to_v);
}
}
}
@@ -8993,7 +9082,7 @@ void SCULPT_fake_neighbors_ensure(Sculpt *sd, Object *ob, const float max_dist)
for (int i = 0; i < totvert; i++) {
const int from_v = i;
- /* This vertex does not have a fake neighbor yet, seach one for it. */
+ /* This vertex does not have a fake neighbor yet, search one for it. */
if (ss->fake_neighbors.fake_neighbor_index[from_v] == FAKE_NEIGHBOR_NONE) {
const int to_v = SCULPT_fake_neighbor_search(sd, ob, from_v, max_dist);
if (to_v != -1) {
@@ -9099,11 +9188,12 @@ static void do_mask_by_color_contiguous_update_nodes_cb(
const float current_mask = *vd.mask;
const float new_mask = data->mask_by_color_floodfill[vd.index];
*vd.mask = sculpt_mask_by_color_final_mask_get(current_mask, new_mask, invert, preserve_mask);
- if (current_mask != *vd.mask) {
- update_node = true;
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (current_mask == *vd.mask) {
+ continue;
+ }
+ update_node = true;
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -9206,11 +9296,12 @@ static void do_mask_by_color_task_cb(void *__restrict userdata,
const float new_mask = sculpt_mask_by_color_delta_get(active_color, vd.col, threshold, invert);
*vd.mask = sculpt_mask_by_color_final_mask_get(current_mask, new_mask, invert, preserve_mask);
- if (current_mask != *vd.mask) {
- update_node = true;
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (current_mask == *vd.mask) {
+ continue;
+ }
+ update_node = true;
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -9615,7 +9706,7 @@ static int dyntopo_detail_size_edit_invoke(bContext *C, wmOperator *op, const wm
copy_m4_m4(cd->gizmo_mat, cursor_trans);
mul_m4_m4_post(cd->gizmo_mat, cursor_rot);
- /* Initize the position of the triangle vertices. */
+ /* Initialize the position of the triangle vertices. */
const float y_axis[3] = {0.0f, cd->radius, 0.0f};
for (int i = 0; i < 3; i++) {
zero_v3(cd->preview_tri[i]);
diff --git a/source/blender/editors/sculpt_paint/sculpt_automasking.c b/source/blender/editors/sculpt_paint/sculpt_automasking.c
index bb68ec56b25..5f5fb51d75f 100644
--- a/source/blender/editors/sculpt_paint/sculpt_automasking.c
+++ b/source/blender/editors/sculpt_paint/sculpt_automasking.c
@@ -298,24 +298,26 @@ float *SCULPT_boundary_automasking_init(Object *ob,
for (int propagation_it = 0; propagation_it < propagation_steps; propagation_it++) {
for (int i = 0; i < totvert; i++) {
- if (edge_distance[i] == EDGE_DISTANCE_INF) {
- SculptVertexNeighborIter ni;
- SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, i, ni) {
- if (edge_distance[ni.index] == propagation_it) {
- edge_distance[i] = propagation_it + 1;
- }
+ if (edge_distance[i] != EDGE_DISTANCE_INF) {
+ continue;
+ }
+ SculptVertexNeighborIter ni;
+ SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, i, ni) {
+ if (edge_distance[ni.index] == propagation_it) {
+ edge_distance[i] = propagation_it + 1;
}
- SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
}
+ SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
}
}
for (int i = 0; i < totvert; i++) {
- if (edge_distance[i] != EDGE_DISTANCE_INF) {
- const float p = 1.0f - ((float)edge_distance[i] / (float)propagation_steps);
- const float edge_boundary_automask = pow2f(p);
- automask_factor[i] *= (1.0f - edge_boundary_automask);
+ if (edge_distance[i] == EDGE_DISTANCE_INF) {
+ continue;
}
+ const float p = 1.0f - ((float)edge_distance[i] / (float)propagation_steps);
+ const float edge_boundary_automask = pow2f(p);
+ automask_factor[i] *= (1.0f - edge_boundary_automask);
}
MEM_SAFE_FREE(edge_distance);
diff --git a/source/blender/editors/sculpt_paint/sculpt_boundary.c b/source/blender/editors/sculpt_paint/sculpt_boundary.c
index 0cfb6f17adb..fca19c04b98 100644
--- a/source/blender/editors/sculpt_paint/sculpt_boundary.c
+++ b/source/blender/editors/sculpt_paint/sculpt_boundary.c
@@ -227,19 +227,19 @@ static bool boundary_floodfill_cb(
{
BoundaryFloodFillData *data = userdata;
SculptBoundary *boundary = data->boundary;
- if (SCULPT_vertex_is_boundary(ss, to_v)) {
- const float edge_len = len_v3v3(SCULPT_vertex_co_get(ss, from_v),
- SCULPT_vertex_co_get(ss, to_v));
- const float distance_boundary_to_dst = boundary->distance ?
- boundary->distance[from_v] + edge_len :
- 0.0f;
- sculpt_boundary_index_add(boundary, to_v, distance_boundary_to_dst, data->included_vertices);
- if (!is_duplicate) {
- sculpt_boundary_preview_edge_add(boundary, from_v, to_v);
- }
- return sculpt_boundary_is_vertex_in_editable_boundary(ss, to_v);
+ if (!SCULPT_vertex_is_boundary(ss, to_v)) {
+ return false;
+ }
+ const float edge_len = len_v3v3(SCULPT_vertex_co_get(ss, from_v),
+ SCULPT_vertex_co_get(ss, to_v));
+ const float distance_boundary_to_dst = boundary->distance ?
+ boundary->distance[from_v] + edge_len :
+ 0.0f;
+ sculpt_boundary_index_add(boundary, to_v, distance_boundary_to_dst, data->included_vertices);
+ if (!is_duplicate) {
+ sculpt_boundary_preview_edge_add(boundary, from_v, to_v);
}
- return false;
+ return sculpt_boundary_is_vertex_in_editable_boundary(ss, to_v);
}
static void sculpt_boundary_indices_init(SculptSession *ss,
@@ -360,49 +360,50 @@ static void sculpt_boundary_edit_data_init(SculptSession *ss,
SculptVertexNeighborIter ni;
SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, from_v, ni) {
const bool is_visible = SCULPT_vertex_visible_get(ss, ni.index);
- if (is_visible &&
- boundary->edit_info[ni.index].num_propagation_steps == BOUNDARY_STEPS_NONE) {
- boundary->edit_info[ni.index].original_vertex =
- boundary->edit_info[from_v].original_vertex;
+ if (!is_visible ||
+ boundary->edit_info[ni.index].num_propagation_steps != BOUNDARY_STEPS_NONE) {
+ continue;
+ }
+ boundary->edit_info[ni.index].original_vertex =
+ boundary->edit_info[from_v].original_vertex;
- BLI_BITMAP_ENABLE(visited_vertices, ni.index);
+ BLI_BITMAP_ENABLE(visited_vertices, ni.index);
- if (ni.is_duplicate) {
- /* Grids duplicates handling. */
- boundary->edit_info[ni.index].num_propagation_steps =
- boundary->edit_info[from_v].num_propagation_steps;
- }
- else {
- boundary->edit_info[ni.index].num_propagation_steps =
- boundary->edit_info[from_v].num_propagation_steps + 1;
-
- BLI_gsqueue_push(next_iteration, &ni.index);
-
- /* When copying the data to the neighbor for the next iteration, it has to be copied to
- * all its duplicates too. This is because it is not possible to know if the updated
- * neighbor or one if its uninitialized duplicates is going to come first in order to
- * copy the data in the from_v neighbor iterator. */
- if (has_duplicates) {
- SculptVertexNeighborIter ni_duplis;
- SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, ni.index, ni_duplis) {
- if (ni_duplis.is_duplicate) {
- boundary->edit_info[ni_duplis.index].original_vertex =
- boundary->edit_info[from_v].original_vertex;
- boundary->edit_info[ni_duplis.index].num_propagation_steps =
- boundary->edit_info[from_v].num_propagation_steps + 1;
- }
+ if (ni.is_duplicate) {
+ /* Grids duplicates handling. */
+ boundary->edit_info[ni.index].num_propagation_steps =
+ boundary->edit_info[from_v].num_propagation_steps;
+ }
+ else {
+ boundary->edit_info[ni.index].num_propagation_steps =
+ boundary->edit_info[from_v].num_propagation_steps + 1;
+
+ BLI_gsqueue_push(next_iteration, &ni.index);
+
+ /* When copying the data to the neighbor for the next iteration, it has to be copied to
+ * all its duplicates too. This is because it is not possible to know if the updated
+ * neighbor or one if its uninitialized duplicates is going to come first in order to
+ * copy the data in the from_v neighbor iterator. */
+ if (has_duplicates) {
+ SculptVertexNeighborIter ni_duplis;
+ SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, ni.index, ni_duplis) {
+ if (ni_duplis.is_duplicate) {
+ boundary->edit_info[ni_duplis.index].original_vertex =
+ boundary->edit_info[from_v].original_vertex;
+ boundary->edit_info[ni_duplis.index].num_propagation_steps =
+ boundary->edit_info[from_v].num_propagation_steps + 1;
}
- SCULPT_VERTEX_NEIGHBORS_ITER_END(ni_duplis);
}
+ SCULPT_VERTEX_NEIGHBORS_ITER_END(ni_duplis);
+ }
- /* Check the distance using the vertex that was propagated from the initial vertex that
- * was used to initialize the boundary. */
- if (boundary->edit_info[from_v].original_vertex == initial_vertex) {
- boundary->pivot_vertex = ni.index;
- copy_v3_v3(boundary->initial_pivot_position, SCULPT_vertex_co_get(ss, ni.index));
- accum_distance += len_v3v3(SCULPT_vertex_co_get(ss, from_v),
- SCULPT_vertex_co_get(ss, ni.index));
- }
+ /* Check the distance using the vertex that was propagated from the initial vertex that
+ * was used to initialize the boundary. */
+ if (boundary->edit_info[from_v].original_vertex == initial_vertex) {
+ boundary->pivot_vertex = ni.index;
+ copy_v3_v3(boundary->initial_pivot_position, SCULPT_vertex_co_get(ss, ni.index));
+ accum_distance += len_v3v3(SCULPT_vertex_co_get(ss, from_v),
+ SCULPT_vertex_co_get(ss, ni.index));
}
}
}
@@ -552,28 +553,30 @@ static void sculpt_boundary_bend_data_init(SculptSession *ss, SculptBoundary *bo
totvert, 3 * sizeof(float), "pivot positions");
for (int i = 0; i < totvert; i++) {
- if (boundary->edit_info[i].num_propagation_steps == boundary->max_propagation_steps) {
- float dir[3];
- float normal[3];
- SCULPT_vertex_normal_get(ss, i, normal);
- sub_v3_v3v3(dir,
- SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex),
- SCULPT_vertex_co_get(ss, i));
- cross_v3_v3v3(
- boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex], dir, normal);
- normalize_v3(boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]);
- copy_v3_v3(boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex],
- SCULPT_vertex_co_get(ss, i));
+ if (boundary->edit_info[i].num_propagation_steps != boundary->max_propagation_steps) {
+ continue;
}
+ float dir[3];
+ float normal[3];
+ SCULPT_vertex_normal_get(ss, i, normal);
+ sub_v3_v3v3(dir,
+ SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex),
+ SCULPT_vertex_co_get(ss, i));
+ cross_v3_v3v3(
+ boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex], dir, normal);
+ normalize_v3(boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]);
+ copy_v3_v3(boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex],
+ SCULPT_vertex_co_get(ss, i));
}
for (int i = 0; i < totvert; i++) {
- if (boundary->edit_info[i].num_propagation_steps != BOUNDARY_STEPS_NONE) {
- copy_v3_v3(boundary->bend.pivot_positions[i],
- boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex]);
- copy_v3_v3(boundary->bend.pivot_rotation_axis[i],
- boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]);
+ if (boundary->edit_info[i].num_propagation_steps == BOUNDARY_STEPS_NONE) {
+ continue;
}
+ copy_v3_v3(boundary->bend.pivot_positions[i],
+ boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex]);
+ copy_v3_v3(boundary->bend.pivot_rotation_axis[i],
+ boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]);
}
}
@@ -583,19 +586,20 @@ static void sculpt_boundary_slide_data_init(SculptSession *ss, SculptBoundary *b
boundary->slide.directions = MEM_calloc_arrayN(totvert, 3 * sizeof(float), "slide directions");
for (int i = 0; i < totvert; i++) {
- if (boundary->edit_info[i].num_propagation_steps == boundary->max_propagation_steps) {
- sub_v3_v3v3(boundary->slide.directions[boundary->edit_info[i].original_vertex],
- SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex),
- SCULPT_vertex_co_get(ss, i));
- normalize_v3(boundary->slide.directions[boundary->edit_info[i].original_vertex]);
+ if (boundary->edit_info[i].num_propagation_steps != boundary->max_propagation_steps) {
}
+ sub_v3_v3v3(boundary->slide.directions[boundary->edit_info[i].original_vertex],
+ SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex),
+ SCULPT_vertex_co_get(ss, i));
+ normalize_v3(boundary->slide.directions[boundary->edit_info[i].original_vertex]);
}
for (int i = 0; i < totvert; i++) {
- if (boundary->edit_info[i].num_propagation_steps != BOUNDARY_STEPS_NONE) {
- copy_v3_v3(boundary->slide.directions[i],
- boundary->slide.directions[boundary->edit_info[i].original_vertex]);
+ if (boundary->edit_info[i].num_propagation_steps == BOUNDARY_STEPS_NONE) {
+ continue;
}
+ copy_v3_v3(boundary->slide.directions[i],
+ boundary->slide.directions[boundary->edit_info[i].original_vertex]);
}
}
@@ -662,24 +666,27 @@ static void do_boundary_brush_bend_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
+ if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
+ continue;
+ }
- if (boundary->edit_info[vd.index].num_propagation_steps != -1) {
- SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (SCULPT_check_vertex_pivot_symmetry(
- orig_data.co, boundary->initial_vertex_position, symm)) {
- const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
- const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
- float t_orig_co[3];
- float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
- sub_v3_v3v3(t_orig_co, orig_data.co, boundary->bend.pivot_positions[vd.index]);
- rotate_v3_v3v3fl(target_co,
- t_orig_co,
- boundary->bend.pivot_rotation_axis[vd.index],
- angle * boundary->edit_info[vd.index].strength_factor * mask * automask);
- add_v3_v3(target_co, boundary->bend.pivot_positions[vd.index]);
- }
+ SCULPT_orig_vert_data_update(&orig_data, &vd);
+ if (!SCULPT_check_vertex_pivot_symmetry(
+ orig_data.co, boundary->initial_vertex_position, symm)) {
+ continue;
}
+ const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
+ const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
+ float t_orig_co[3];
+ float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
+ sub_v3_v3v3(t_orig_co, orig_data.co, boundary->bend.pivot_positions[vd.index]);
+ rotate_v3_v3v3fl(target_co,
+ t_orig_co,
+ boundary->bend.pivot_rotation_axis[vd.index],
+ angle * boundary->edit_info[vd.index].strength_factor * mask * automask);
+ add_v3_v3(target_co, boundary->bend.pivot_positions[vd.index]);
+
if (vd.mvert) {
vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
@@ -708,22 +715,25 @@ static void do_boundary_brush_slide_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
+ if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
+ continue;
+ }
- if (boundary->edit_info[vd.index].num_propagation_steps != -1) {
- SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (SCULPT_check_vertex_pivot_symmetry(
- orig_data.co, boundary->initial_vertex_position, symm)) {
- const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
- const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
- float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
- madd_v3_v3v3fl(target_co,
- orig_data.co,
- boundary->slide.directions[vd.index],
- boundary->edit_info[vd.index].strength_factor * disp * mask * automask *
- strength);
- }
+ SCULPT_orig_vert_data_update(&orig_data, &vd);
+ if (!SCULPT_check_vertex_pivot_symmetry(
+ orig_data.co, boundary->initial_vertex_position, symm)) {
+ continue;
}
+ const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
+ const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
+ float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
+ madd_v3_v3v3fl(target_co,
+ orig_data.co,
+ boundary->slide.directions[vd.index],
+ boundary->edit_info[vd.index].strength_factor * disp * mask * automask *
+ strength);
+
if (vd.mvert) {
vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
@@ -752,24 +762,27 @@ static void do_boundary_brush_inflate_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
+ if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
+ continue;
+ }
- if (boundary->edit_info[vd.index].num_propagation_steps != -1) {
- SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (SCULPT_check_vertex_pivot_symmetry(
- orig_data.co, boundary->initial_vertex_position, symm)) {
- const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
- const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
- float normal[3];
- normal_short_to_float_v3(normal, orig_data.no);
- float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
- madd_v3_v3v3fl(target_co,
- orig_data.co,
- normal,
- boundary->edit_info[vd.index].strength_factor * disp * mask * automask *
- strength);
- }
+ SCULPT_orig_vert_data_update(&orig_data, &vd);
+ if (!SCULPT_check_vertex_pivot_symmetry(
+ orig_data.co, boundary->initial_vertex_position, symm)) {
+ continue;
}
+ const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
+ const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
+ float normal[3];
+ normal_short_to_float_v3(normal, orig_data.no);
+ float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
+ madd_v3_v3v3fl(target_co,
+ orig_data.co,
+ normal,
+ boundary->edit_info[vd.index].strength_factor * disp * mask * automask *
+ strength);
+
if (vd.mvert) {
vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
@@ -796,21 +809,24 @@ static void do_boundary_brush_grab_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
+ if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
+ continue;
+ }
- if (boundary->edit_info[vd.index].num_propagation_steps != -1) {
- SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (SCULPT_check_vertex_pivot_symmetry(
- orig_data.co, boundary->initial_vertex_position, symm)) {
- const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
- const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
- float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
- madd_v3_v3v3fl(target_co,
- orig_data.co,
- ss->cache->grab_delta_symmetry,
- boundary->edit_info[vd.index].strength_factor * mask * automask * strength);
- }
+ SCULPT_orig_vert_data_update(&orig_data, &vd);
+ if (!SCULPT_check_vertex_pivot_symmetry(
+ orig_data.co, boundary->initial_vertex_position, symm)) {
+ continue;
}
+ const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
+ const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
+ float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
+ madd_v3_v3v3fl(target_co,
+ orig_data.co,
+ ss->cache->grab_delta_symmetry,
+ boundary->edit_info[vd.index].strength_factor * mask * automask * strength);
+
if (vd.mvert) {
vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
@@ -845,24 +861,27 @@ static void do_boundary_brush_twist_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
+ if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
+ continue;
+ }
- if (boundary->edit_info[vd.index].num_propagation_steps != -1) {
- SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (SCULPT_check_vertex_pivot_symmetry(
- orig_data.co, boundary->initial_vertex_position, symm)) {
- const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
- const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
- float t_orig_co[3];
- float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
- sub_v3_v3v3(t_orig_co, orig_data.co, boundary->twist.pivot_position);
- rotate_v3_v3v3fl(target_co,
- t_orig_co,
- boundary->twist.rotation_axis,
- angle * mask * automask * boundary->edit_info[vd.index].strength_factor);
- add_v3_v3(target_co, boundary->twist.pivot_position);
- }
+ SCULPT_orig_vert_data_update(&orig_data, &vd);
+ if (!SCULPT_check_vertex_pivot_symmetry(
+ orig_data.co, boundary->initial_vertex_position, symm)) {
+ continue;
}
+ const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
+ const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
+ float t_orig_co[3];
+ float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
+ sub_v3_v3v3(t_orig_co, orig_data.co, boundary->twist.pivot_position);
+ rotate_v3_v3v3fl(target_co,
+ t_orig_co,
+ boundary->twist.rotation_axis,
+ angle * mask * automask * boundary->edit_info[vd.index].strength_factor);
+ add_v3_v3(target_co, boundary->twist.pivot_position);
+
if (vd.mvert) {
vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.c b/source/blender/editors/sculpt_paint/sculpt_cloth.c
index c97f31fa682..16d10f6d6bb 100644
--- a/source/blender/editors/sculpt_paint/sculpt_cloth.c
+++ b/source/blender/editors/sculpt_paint/sculpt_cloth.c
@@ -540,97 +540,98 @@ static void do_cloth_brush_apply_forces_task_cb_ex(void *__restrict userdata,
cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, vertex_gravity, vd.index);
/* When using the plane falloff mode the falloff is not constrained by the brush radius. */
- if (sculpt_brush_test_sq_fn(&test, current_vertex_location) || use_falloff_plane) {
-
- float dist = sqrtf(test.dist);
+ if (!sculpt_brush_test_sq_fn(&test, current_vertex_location) && !use_falloff_plane) {
+ continue;
+ }
- if (use_falloff_plane) {
- dist = dist_to_plane_v3(current_vertex_location, deform_plane);
- }
+ float dist = sqrtf(test.dist);
- const float fade = sim_factor * bstrength *
- SCULPT_brush_strength_factor(ss,
- brush,
- current_vertex_location,
- dist,
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- float brush_disp[3];
- float normal[3];
- if (vd.no) {
- normal_short_to_float_v3(normal, vd.no);
- }
- else {
- copy_v3_v3(normal, vd.fno);
- }
+ if (use_falloff_plane) {
+ dist = dist_to_plane_v3(current_vertex_location, deform_plane);
+ }
- switch (brush->cloth_deform_type) {
- case BRUSH_CLOTH_DEFORM_DRAG:
- sub_v3_v3v3(brush_disp, ss->cache->location, ss->cache->last_location);
- normalize_v3(brush_disp);
- mul_v3_v3fl(force, brush_disp, fade);
- break;
- case BRUSH_CLOTH_DEFORM_PUSH:
- /* Invert the fade to push inwards. */
- mul_v3_v3fl(force, offset, -fade);
- break;
- case BRUSH_CLOTH_DEFORM_GRAB:
- madd_v3_v3v3fl(cloth_sim->deformation_pos[vd.index],
- cloth_sim->init_pos[vd.index],
- ss->cache->grab_delta_symmetry,
- fade);
- if (use_falloff_plane) {
- cloth_sim->deformation_strength[vd.index] = clamp_f(fade, 0.0f, 1.0f);
- }
- else {
- cloth_sim->deformation_strength[vd.index] = 1.0f;
- }
- zero_v3(force);
- break;
- case BRUSH_CLOTH_DEFORM_SNAKE_HOOK:
- copy_v3_v3(cloth_sim->deformation_pos[vd.index], cloth_sim->pos[vd.index]);
- madd_v3_v3fl(cloth_sim->deformation_pos[vd.index], ss->cache->grab_delta_symmetry, fade);
- cloth_sim->deformation_strength[vd.index] = fade;
- zero_v3(force);
- break;
- case BRUSH_CLOTH_DEFORM_PINCH_POINT:
- if (use_falloff_plane) {
- float distance = dist_signed_to_plane_v3(vd.co, deform_plane);
- copy_v3_v3(brush_disp, plane_normal);
- mul_v3_fl(brush_disp, -distance);
- }
- else {
- sub_v3_v3v3(brush_disp, ss->cache->location, vd.co);
- }
- normalize_v3(brush_disp);
- mul_v3_v3fl(force, brush_disp, fade);
- break;
- case BRUSH_CLOTH_DEFORM_PINCH_PERPENDICULAR: {
- float disp_center[3];
- float x_disp[3];
- float z_disp[3];
- sub_v3_v3v3(disp_center, ss->cache->location, vd.co);
- normalize_v3(disp_center);
- mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space));
- mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space));
- add_v3_v3v3(disp_center, x_disp, z_disp);
- mul_v3_v3fl(force, disp_center, fade);
- } break;
- case BRUSH_CLOTH_DEFORM_INFLATE:
- mul_v3_v3fl(force, normal, fade);
- break;
- case BRUSH_CLOTH_DEFORM_EXPAND:
- cloth_sim->length_constraint_tweak[vd.index] += fade * 0.1f;
- zero_v3(force);
- break;
- }
+ const float fade = sim_factor * bstrength *
+ SCULPT_brush_strength_factor(ss,
+ brush,
+ current_vertex_location,
+ dist,
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ float brush_disp[3];
+ float normal[3];
+ if (vd.no) {
+ normal_short_to_float_v3(normal, vd.no);
+ }
+ else {
+ copy_v3_v3(normal, vd.fno);
+ }
- cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, force, vd.index);
+ switch (brush->cloth_deform_type) {
+ case BRUSH_CLOTH_DEFORM_DRAG:
+ sub_v3_v3v3(brush_disp, ss->cache->location, ss->cache->last_location);
+ normalize_v3(brush_disp);
+ mul_v3_v3fl(force, brush_disp, fade);
+ break;
+ case BRUSH_CLOTH_DEFORM_PUSH:
+ /* Invert the fade to push inwards. */
+ mul_v3_v3fl(force, offset, -fade);
+ break;
+ case BRUSH_CLOTH_DEFORM_GRAB:
+ madd_v3_v3v3fl(cloth_sim->deformation_pos[vd.index],
+ cloth_sim->init_pos[vd.index],
+ ss->cache->grab_delta_symmetry,
+ fade);
+ if (use_falloff_plane) {
+ cloth_sim->deformation_strength[vd.index] = clamp_f(fade, 0.0f, 1.0f);
+ }
+ else {
+ cloth_sim->deformation_strength[vd.index] = 1.0f;
+ }
+ zero_v3(force);
+ break;
+ case BRUSH_CLOTH_DEFORM_SNAKE_HOOK:
+ copy_v3_v3(cloth_sim->deformation_pos[vd.index], cloth_sim->pos[vd.index]);
+ madd_v3_v3fl(cloth_sim->deformation_pos[vd.index], ss->cache->grab_delta_symmetry, fade);
+ cloth_sim->deformation_strength[vd.index] = fade;
+ zero_v3(force);
+ break;
+ case BRUSH_CLOTH_DEFORM_PINCH_POINT:
+ if (use_falloff_plane) {
+ float distance = dist_signed_to_plane_v3(vd.co, deform_plane);
+ copy_v3_v3(brush_disp, plane_normal);
+ mul_v3_fl(brush_disp, -distance);
+ }
+ else {
+ sub_v3_v3v3(brush_disp, ss->cache->location, vd.co);
+ }
+ normalize_v3(brush_disp);
+ mul_v3_v3fl(force, brush_disp, fade);
+ break;
+ case BRUSH_CLOTH_DEFORM_PINCH_PERPENDICULAR: {
+ float disp_center[3];
+ float x_disp[3];
+ float z_disp[3];
+ sub_v3_v3v3(disp_center, ss->cache->location, vd.co);
+ normalize_v3(disp_center);
+ mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space));
+ mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space));
+ add_v3_v3v3(disp_center, x_disp, z_disp);
+ mul_v3_v3fl(force, disp_center, fade);
+ } break;
+ case BRUSH_CLOTH_DEFORM_INFLATE:
+ mul_v3_v3fl(force, normal, fade);
+ break;
+ case BRUSH_CLOTH_DEFORM_EXPAND:
+ cloth_sim->length_constraint_tweak[vd.index] += fade * 0.1f;
+ zero_v3(force);
+ break;
}
+
+ cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, force, vd.index);
}
BKE_pbvh_vertex_iter_end;
}
@@ -644,17 +645,22 @@ static ListBase *cloth_brush_collider_cache_create(Depsgraph *depsgraph)
DEG_ITER_OBJECT_FLAG_DUPLI) {
CollisionModifierData *cmd = (CollisionModifierData *)BKE_modifiers_findby_type(
ob, eModifierType_Collision);
- if (cmd && cmd->bvhtree) {
- if (cache == NULL) {
- cache = MEM_callocN(sizeof(ListBase), "ColliderCache array");
- }
+ if (!cmd) {
+ continue;
+ }
- ColliderCache *col = MEM_callocN(sizeof(ColliderCache), "ColliderCache");
- col->ob = ob;
- col->collmd = cmd;
- collision_move_object(cmd, 1.0, 0.0, true);
- BLI_addtail(cache, col);
+ if (!cmd->bvhtree) {
+ continue;
}
+ if (cache == NULL) {
+ cache = MEM_callocN(sizeof(ListBase), "ColliderCache array");
+ }
+
+ ColliderCache *col = MEM_callocN(sizeof(ColliderCache), "ColliderCache");
+ col->ob = ob;
+ col->collmd = cmd;
+ collision_move_object(cmd, 1.0, 0.0, true);
+ BLI_addtail(cache, col);
}
DEG_OBJECT_ITER_END;
return cache;
@@ -734,26 +740,27 @@ static void cloth_brush_solve_collision(Object *object,
&col,
raycast_flag);
- if (hit.index != -1) {
-
- float collision_disp[3];
- float movement_disp[3];
- mul_v3_v3fl(collision_disp, hit.no, 0.005f);
- sub_v3_v3v3(movement_disp, pos_world_space, prev_pos_world_space);
- float friction_plane[4];
- float pos_on_friction_plane[3];
- plane_from_point_normal_v3(friction_plane, hit.co, hit.no);
- closest_to_plane_v3(pos_on_friction_plane, friction_plane, pos_world_space);
- sub_v3_v3v3(movement_disp, pos_on_friction_plane, hit.co);
-
- /* TODO(pablodp606): This can be exposed in a brush/filter property as friction. */
- mul_v3_fl(movement_disp, 0.35f);
-
- copy_v3_v3(cloth_sim->pos[i], hit.co);
- add_v3_v3(cloth_sim->pos[i], movement_disp);
- add_v3_v3(cloth_sim->pos[i], collision_disp);
- mul_v3_m4v3(cloth_sim->pos[i], obmat_inv, cloth_sim->pos[i]);
+ if (hit.index == -1) {
+ continue;
}
+
+ float collision_disp[3];
+ float movement_disp[3];
+ mul_v3_v3fl(collision_disp, hit.no, 0.005f);
+ sub_v3_v3v3(movement_disp, pos_world_space, prev_pos_world_space);
+ float friction_plane[4];
+ float pos_on_friction_plane[3];
+ plane_from_point_normal_v3(friction_plane, hit.co, hit.no);
+ closest_to_plane_v3(pos_on_friction_plane, friction_plane, pos_world_space);
+ sub_v3_v3v3(movement_disp, pos_on_friction_plane, hit.co);
+
+ /* TODO(pablodp606): This can be exposed in a brush/filter property as friction. */
+ mul_v3_fl(movement_disp, 0.35f);
+
+ copy_v3_v3(cloth_sim->pos[i], hit.co);
+ add_v3_v3(cloth_sim->pos[i], movement_disp);
+ add_v3_v3(cloth_sim->pos[i], collision_disp);
+ mul_v3_m4v3(cloth_sim->pos[i], obmat_inv, cloth_sim->pos[i]);
}
}
@@ -784,38 +791,40 @@ static void do_cloth_brush_solve_simulation_task_cb_ex(
ss->cache ? cloth_brush_simulation_falloff_get(
brush, ss->cache->radius, sim_location, cloth_sim->init_pos[vd.index]) :
1.0f;
- if (sim_factor > 0.0f) {
- int i = vd.index;
- float temp[3];
- copy_v3_v3(temp, cloth_sim->pos[i]);
+ if (sim_factor <= 0.0f) {
+ continue;
+ }
- mul_v3_fl(cloth_sim->acceleration[i], time_step);
+ int i = vd.index;
+ float temp[3];
+ copy_v3_v3(temp, cloth_sim->pos[i]);
- float pos_diff[3];
- sub_v3_v3v3(pos_diff, cloth_sim->pos[i], cloth_sim->prev_pos[i]);
- mul_v3_fl(pos_diff, (1.0f - cloth_sim->damping) * sim_factor);
+ mul_v3_fl(cloth_sim->acceleration[i], time_step);
- const float mask_v = (1.0f - (vd.mask ? *vd.mask : 0.0f)) *
- SCULPT_automasking_factor_get(automasking, ss, vd.index);
+ float pos_diff[3];
+ sub_v3_v3v3(pos_diff, cloth_sim->pos[i], cloth_sim->prev_pos[i]);
+ mul_v3_fl(pos_diff, (1.0f - cloth_sim->damping) * sim_factor);
- madd_v3_v3fl(cloth_sim->pos[i], pos_diff, mask_v);
- madd_v3_v3fl(cloth_sim->pos[i], cloth_sim->acceleration[i], mask_v);
+ const float mask_v = (1.0f - (vd.mask ? *vd.mask : 0.0f)) *
+ SCULPT_automasking_factor_get(automasking, ss, vd.index);
- if (cloth_sim->collider_list != NULL) {
- cloth_brush_solve_collision(data->ob, cloth_sim, i);
- }
+ madd_v3_v3fl(cloth_sim->pos[i], pos_diff, mask_v);
+ madd_v3_v3fl(cloth_sim->pos[i], cloth_sim->acceleration[i], mask_v);
- copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]);
+ if (cloth_sim->collider_list != NULL) {
+ cloth_brush_solve_collision(data->ob, cloth_sim, i);
+ }
- copy_v3_v3(cloth_sim->prev_pos[i], temp);
- copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]);
- copy_v3_fl(cloth_sim->acceleration[i], 0.0f);
+ copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]);
- copy_v3_v3(vd.co, cloth_sim->pos[vd.index]);
+ copy_v3_v3(cloth_sim->prev_pos[i], temp);
+ copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]);
+ copy_v3_fl(cloth_sim->acceleration[i], 0.0f);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ copy_v3_v3(vd.co, cloth_sim->pos[vd.index]);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
diff --git a/source/blender/editors/sculpt_paint/sculpt_detail.c b/source/blender/editors/sculpt_paint/sculpt_detail.c
index aa1d407dc24..ddf7ba1e412 100644
--- a/source/blender/editors/sculpt_paint/sculpt_detail.c
+++ b/source/blender/editors/sculpt_paint/sculpt_detail.c
@@ -24,46 +24,29 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
-#include "BLI_hash.h"
#include "BLI_math.h"
-#include "BLI_task.h"
#include "BLT_translation.h"
#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "BKE_brush.h"
#include "BKE_context.h"
-#include "BKE_mesh.h"
-#include "BKE_mesh_mapping.h"
-#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_pbvh.h"
-#include "BKE_scene.h"
#include "BKE_screen.h"
#include "DEG_depsgraph.h"
#include "WM_api.h"
-#include "WM_message.h"
-#include "WM_toolsystem.h"
#include "WM_types.h"
-#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_sculpt.h"
#include "ED_view3d.h"
-#include "paint_intern.h"
#include "sculpt_intern.h"
#include "RNA_access.h"
#include "RNA_define.h"
-#include "UI_interface.h"
-
-#include "bmesh.h"
-
#include <math.h>
#include <stdlib.h>
diff --git a/source/blender/editors/sculpt_paint/sculpt_face_set.c b/source/blender/editors/sculpt_paint/sculpt_face_set.c
index 1fba958d695..df03d2adeaf 100644
--- a/source/blender/editors/sculpt_paint/sculpt_face_set.c
+++ b/source/blender/editors/sculpt_paint/sculpt_face_set.c
@@ -148,40 +148,42 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
float poly_center[3];
BKE_mesh_calc_poly_center(p, &ss->mloop[p->loopstart], mvert, poly_center);
- if (sculpt_brush_test_sq_fn(&test, poly_center)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- if (fade > 0.05f && ss->face_sets[vert_map->indices[j]] > 0) {
- ss->face_sets[vert_map->indices[j]] = abs(ss->cache->paint_face_set);
- }
+ if (!sculpt_brush_test_sq_fn(&test, poly_center)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ if (fade > 0.05f && ss->face_sets[vert_map->indices[j]] > 0) {
+ ss->face_sets[vert_map->indices[j]] = abs(ss->cache->paint_face_set);
}
}
}
else if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) {
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- if (fade > 0.05f) {
- SCULPT_vertex_face_set_set(ss, vd.index, ss->cache->paint_face_set);
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ if (fade > 0.05f) {
+ SCULPT_vertex_face_set_set(ss, vd.index, ss->cache->paint_face_set);
}
}
}
@@ -205,7 +207,7 @@ static void do_relax_face_sets_brush_task_cb_ex(void *__restrict userdata,
ss, &test, data->brush->falloff_shape);
const bool relax_face_sets = !(ss->cache->iteration_count % 3 == 0);
- /* This operations needs a stregth tweak as the relax deformation is too weak by default. */
+ /* This operations needs a strength tweak as the relax deformation is too weak by default. */
if (relax_face_sets) {
bstrength *= 2.0f;
}
@@ -214,23 +216,26 @@ static void do_relax_face_sets_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- if (relax_face_sets != SCULPT_vertex_has_unique_face_set(ss, vd.index)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ if (relax_face_sets == SCULPT_vertex_has_unique_face_set(ss, vd.index)) {
+ continue;
+ }
- SCULPT_relax_vertex(ss, &vd, fade * bstrength, relax_face_sets, vd.co);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
- }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ SCULPT_relax_vertex(ss, &vd, fade * bstrength, relax_face_sets, vd.co);
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -313,7 +318,7 @@ static int sculpt_face_set_create_exec(bContext *C, wmOperator *op)
const int mode = RNA_enum_get(op->ptr, "mode");
- /* Dyntopo not suported. */
+ /* Dyntopo not supported. */
if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
return OPERATOR_CANCELLED;
}
@@ -582,44 +587,49 @@ static void sculpt_face_sets_init_flood_fill(Object *ob,
int next_face_set = 1;
for (int i = 0; i < totfaces; i++) {
- if (!BLI_BITMAP_TEST(visited_faces, i)) {
- GSQueue *queue;
- queue = BLI_gsqueue_new(sizeof(int));
-
- face_sets[i] = next_face_set;
- BLI_BITMAP_ENABLE(visited_faces, i);
- BLI_gsqueue_push(queue, &i);
-
- while (!BLI_gsqueue_is_empty(queue)) {
- int from_f;
- BLI_gsqueue_pop(queue, &from_f);
-
- BMFace *f, *f_neighbor;
- BMEdge *ed;
- BMIter iter_a, iter_b;
-
- f = BM_face_at_index(bm, from_f);
-
- BM_ITER_ELEM (ed, &iter_a, f, BM_EDGES_OF_FACE) {
- BM_ITER_ELEM (f_neighbor, &iter_b, ed, BM_FACES_OF_EDGE) {
- if (f_neighbor != f) {
- int neighbor_face_index = BM_elem_index_get(f_neighbor);
- if (!BLI_BITMAP_TEST(visited_faces, neighbor_face_index)) {
- if (test(bm, f, ed, f_neighbor, threshold)) {
- face_sets[neighbor_face_index] = next_face_set;
- BLI_BITMAP_ENABLE(visited_faces, neighbor_face_index);
- BLI_gsqueue_push(queue, &neighbor_face_index);
- }
- }
- }
+ if (BLI_BITMAP_TEST(visited_faces, i)) {
+ continue;
+ }
+ GSQueue *queue;
+ queue = BLI_gsqueue_new(sizeof(int));
+
+ face_sets[i] = next_face_set;
+ BLI_BITMAP_ENABLE(visited_faces, i);
+ BLI_gsqueue_push(queue, &i);
+
+ while (!BLI_gsqueue_is_empty(queue)) {
+ int from_f;
+ BLI_gsqueue_pop(queue, &from_f);
+
+ BMFace *f, *f_neighbor;
+ BMEdge *ed;
+ BMIter iter_a, iter_b;
+
+ f = BM_face_at_index(bm, from_f);
+
+ BM_ITER_ELEM (ed, &iter_a, f, BM_EDGES_OF_FACE) {
+ BM_ITER_ELEM (f_neighbor, &iter_b, ed, BM_FACES_OF_EDGE) {
+ if (f_neighbor == f) {
+ continue;
}
+ int neighbor_face_index = BM_elem_index_get(f_neighbor);
+ if (BLI_BITMAP_TEST(visited_faces, neighbor_face_index)) {
+ continue;
+ }
+ if (!test(bm, f, ed, f_neighbor, threshold)) {
+ continue;
+ }
+
+ face_sets[neighbor_face_index] = next_face_set;
+ BLI_BITMAP_ENABLE(visited_faces, neighbor_face_index);
+ BLI_gsqueue_push(queue, &neighbor_face_index);
}
}
+ }
- next_face_set += 1;
+ next_face_set += 1;
- BLI_gsqueue_free(queue);
- }
+ BLI_gsqueue_free(queue);
}
MEM_SAFE_FREE(visited_faces);
diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_color.c b/source/blender/editors/sculpt_paint/sculpt_filter_color.c
index 76a6b05cdff..b5fade32a25 100644
--- a/source/blender/editors/sculpt_paint/sculpt_filter_color.c
+++ b/source/blender/editors/sculpt_paint/sculpt_filter_color.c
@@ -86,7 +86,7 @@ static EnumPropertyItem prop_color_filter_types[] = {
{COLOR_FILTER_SATURATION, "SATURATION", 0, "Saturation", "Change saturation"},
{COLOR_FILTER_VALUE, "VALUE", 0, "Value", "Change value"},
- {COLOR_FILTER_BRIGHTNESS, "BRIGTHNESS", 0, "Brightness", "Change brightness"},
+ {COLOR_FILTER_BRIGHTNESS, "BRIGHTNESS", 0, "Brightness", "Change brightness"},
{COLOR_FILTER_CONTRAST, "CONTRAST", 0, "Contrast", "Change contrast"},
{COLOR_FILTER_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth colors"},
diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_mesh.c b/source/blender/editors/sculpt_paint/sculpt_filter_mesh.c
index e11894a8c01..3cf6a8cc561 100644
--- a/source/blender/editors/sculpt_paint/sculpt_filter_mesh.c
+++ b/source/blender/editors/sculpt_paint/sculpt_filter_mesh.c
@@ -553,7 +553,7 @@ static void mesh_filter_sharpen_init(SculptSession *ss,
filter_cache->sharpen_factor[i] = 1.0f - pow2f(1.0f - filter_cache->sharpen_factor[i]);
}
- /* Smooth the calculated factors and directions to remove high frecuency detail. */
+ /* Smooth the calculated factors and directions to remove high frequency detail. */
for (int smooth_iterations = 0;
smooth_iterations < filter_cache->sharpen_curvature_smooth_iterations;
smooth_iterations++) {
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index d1e17c7e59b..f90cf366ed9 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -511,7 +511,7 @@ void SCULPT_boundary_edges_preview_draw(const uint gpuattr,
const float outline_alpha);
void SCULPT_boundary_pivot_line_preview_draw(const uint gpuattr, struct SculptSession *ss);
-/* Multiplane Scrape Brush. */
+/* Multi-plane Scrape Brush. */
void SCULPT_do_multiplane_scrape_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode);
void SCULPT_multiplane_scrape_preview_draw(const uint gpuattr,
Brush *brush,
diff --git a/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c b/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c
index e47a94dff90..cfc31e1dcdd 100644
--- a/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c
+++ b/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c
@@ -88,38 +88,39 @@ static void calc_multiplane_scrape_surface_task_cb(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- float local_co[3];
- float normal[3];
- if (vd.no) {
- normal_short_to_float_v3(normal, vd.no);
- }
- else {
- copy_v3_v3(normal, vd.fno);
- }
- mul_v3_m4v3(local_co, mat, vd.co);
- /* Use the brush falloff to weight the sampled normals. */
- const float fade = SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- /* Sample the normal and area of the +X and -X axis individually. */
- if (local_co[0] > 0.0f) {
- madd_v3_v3fl(mssd->area_nos[0], normal, fade);
- add_v3_v3(mssd->area_cos[0], vd.co);
- mssd->area_count[0]++;
- }
- else {
- madd_v3_v3fl(mssd->area_nos[1], normal, fade);
- add_v3_v3(mssd->area_cos[1], vd.co);
- mssd->area_count[1]++;
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ float local_co[3];
+ float normal[3];
+ if (vd.no) {
+ normal_short_to_float_v3(normal, vd.no);
+ }
+ else {
+ copy_v3_v3(normal, vd.fno);
+ }
+ mul_v3_m4v3(local_co, mat, vd.co);
+ /* Use the brush falloff to weight the sampled normals. */
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ /* Sample the normal and area of the +X and -X axis individually. */
+ if (local_co[0] > 0.0f) {
+ madd_v3_v3fl(mssd->area_nos[0], normal, fade);
+ add_v3_v3(mssd->area_cos[0], vd.co);
+ mssd->area_count[0]++;
+ }
+ else {
+ madd_v3_v3fl(mssd->area_nos[1], normal, fade);
+ add_v3_v3(mssd->area_cos[1], vd.co);
+ mssd->area_count[1]++;
}
BKE_pbvh_vertex_iter_end;
}
@@ -168,56 +169,61 @@ static void do_multiplane_scrape_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- float local_co[3];
- bool deform = false;
-
- mul_v3_m4v3(local_co, mat, vd.co);
-
- if (local_co[0] > 0.0f) {
- deform = !SCULPT_plane_point_side(vd.co, scrape_planes[0]);
- }
- else {
- deform = !SCULPT_plane_point_side(vd.co, scrape_planes[1]);
- }
-
- if (angle < 0.0f) {
- deform = true;
- }
-
- if (deform) {
- float intr[3];
- float val[3];
-
- if (local_co[0] > 0.0f) {
- closest_to_plane_normalized_v3(intr, scrape_planes[0], vd.co);
- }
- else {
- closest_to_plane_normalized_v3(intr, scrape_planes[1], vd.co);
- }
-
- sub_v3_v3v3(val, intr, vd.co);
- if (SCULPT_plane_trim(ss->cache, brush, val)) {
- /* Deform the local space along the Y axis to avoid artifacts on curved strokes. */
- /* This produces a not round brush tip. */
- local_co[1] *= 2.0f;
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- len_v3(local_co),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- mul_v3_v3fl(proxy[vd.i], val, fade);
-
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
- }
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+
+ float local_co[3];
+ bool deform = false;
+
+ mul_v3_m4v3(local_co, mat, vd.co);
+
+ if (local_co[0] > 0.0f) {
+ deform = !SCULPT_plane_point_side(vd.co, scrape_planes[0]);
+ }
+ else {
+ deform = !SCULPT_plane_point_side(vd.co, scrape_planes[1]);
+ }
+
+ if (angle < 0.0f) {
+ deform = true;
+ }
+
+ if (!deform) {
+ continue;
+ }
+
+ float intr[3];
+ float val[3];
+
+ if (local_co[0] > 0.0f) {
+ closest_to_plane_normalized_v3(intr, scrape_planes[0], vd.co);
+ }
+ else {
+ closest_to_plane_normalized_v3(intr, scrape_planes[1], vd.co);
+ }
+
+ sub_v3_v3v3(val, intr, vd.co);
+ if (!SCULPT_plane_trim(ss->cache, brush, val)) {
+ continue;
+ }
+ /* Deform the local space along the Y axis to avoid artifacts on curved strokes. */
+ /* This produces a not round brush tip. */
+ local_co[1] *= 2.0f;
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ len_v3(local_co),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ mul_v3_v3fl(proxy[vd.i], val, fade);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_color.c b/source/blender/editors/sculpt_paint/sculpt_paint_color.c
index 39320f3f558..5fdf8415f28 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_color.c
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_color.c
@@ -87,24 +87,25 @@ static void do_color_smooth_task_cb_exec(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- float smooth_color[4];
- SCULPT_neighbor_color_average(ss, smooth_color, vd.index);
- blend_color_interpolate_float(vd.col, vd.col, smooth_color, fade);
-
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ float smooth_color[4];
+ SCULPT_neighbor_color_average(ss, smooth_color, vd.index);
+ blend_color_interpolate_float(vd.col, vd.col, smooth_color, fade);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -153,46 +154,49 @@ static void do_paint_brush_task_cb_ex(void *__restrict userdata,
distance_to_stroke_location = sqrtf(test.dist);
}
- if (affect_vertex) {
- float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- distance_to_stroke_location,
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- /* Density. */
- float noise = 1.0f;
- const float density = ss->cache->paint_brush.density;
- if (density < 1.0f) {
- const float hash_noise = BLI_hash_int_01(ss->cache->density_seed * 1000 * vd.index);
- if (hash_noise > density) {
- noise = density * hash_noise;
- fade = fade * noise;
- }
+ if (!affect_vertex) {
+ continue;
+ }
+
+ float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ distance_to_stroke_location,
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ /* Density. */
+ float noise = 1.0f;
+ const float density = ss->cache->paint_brush.density;
+ if (density < 1.0f) {
+ const float hash_noise = BLI_hash_int_01(ss->cache->density_seed * 1000 * vd.index);
+ if (hash_noise > density) {
+ noise = density * hash_noise;
+ fade = fade * noise;
}
+ }
- /* Brush paint color, brush test falloff and flow. */
- float paint_color[4];
- float wet_mix_color[4];
- float buffer_color[4];
+ /* Brush paint color, brush test falloff and flow. */
+ float paint_color[4];
+ float wet_mix_color[4];
+ float buffer_color[4];
- mul_v4_v4fl(paint_color, brush_color, fade * ss->cache->paint_brush.flow);
- mul_v4_v4fl(wet_mix_color, data->wet_mix_sampled_color, fade * ss->cache->paint_brush.flow);
+ mul_v4_v4fl(paint_color, brush_color, fade * ss->cache->paint_brush.flow);
+ mul_v4_v4fl(wet_mix_color, data->wet_mix_sampled_color, fade * ss->cache->paint_brush.flow);
- /* Interpolate with the wet_mix color for wet paint mixing. */
- blend_color_interpolate_float(
- paint_color, paint_color, wet_mix_color, ss->cache->paint_brush.wet_mix);
- blend_color_mix_float(color_buffer->color[vd.i], color_buffer->color[vd.i], paint_color);
+ /* Interpolate with the wet_mix color for wet paint mixing. */
+ blend_color_interpolate_float(
+ paint_color, paint_color, wet_mix_color, ss->cache->paint_brush.wet_mix);
+ blend_color_mix_float(color_buffer->color[vd.i], color_buffer->color[vd.i], paint_color);
- /* Final mix over the original color using brush alpha. */
- mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], brush->alpha);
+ /* Final mix over the original color using brush alpha. */
+ mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], brush->alpha);
+
+ IMB_blend_color_float(vd.col, orig_data.col, buffer_color, brush->blend);
- IMB_blend_color_float(vd.col, orig_data.col, buffer_color, brush->blend);
- }
CLAMP4(vd.col, 0.0f, 1.0f);
if (vd.mvert) {
@@ -225,10 +229,12 @@ static void do_sample_wet_paint_task_cb(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- add_v4_v4(swptd->color, vd.col);
- swptd->tot_samples++;
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
}
+
+ add_v4_v4(swptd->color, vd.col);
+ swptd->tot_samples++;
}
BKE_pbvh_vertex_iter_end;
}
@@ -380,59 +386,61 @@ static void do_smear_brush_task_cb_exec(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- float current_disp[3];
- float current_disp_norm[3];
- float interp_color[4];
- copy_v4_v4(interp_color, ss->cache->prev_colors[vd.index]);
-
- switch (brush->smear_deform_type) {
- case BRUSH_SMEAR_DEFORM_DRAG:
- sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location);
- break;
- case BRUSH_SMEAR_DEFORM_PINCH:
- sub_v3_v3v3(current_disp, ss->cache->location, vd.co);
- break;
- case BRUSH_SMEAR_DEFORM_EXPAND:
- sub_v3_v3v3(current_disp, vd.co, ss->cache->location);
- break;
- }
- normalize_v3_v3(current_disp_norm, current_disp);
- mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength);
-
- SculptVertexNeighborIter ni;
- SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) {
- float vertex_disp[3];
- float vertex_disp_norm[3];
- sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.index), vd.co);
- const float *neighbor_color = ss->cache->prev_colors[ni.index];
- normalize_v3_v3(vertex_disp_norm, vertex_disp);
- if (dot_v3v3(current_disp_norm, vertex_disp_norm) < 0.0f) {
- const float color_interp = clamp_f(
- -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f);
- float color_mix[4];
- copy_v4_v4(color_mix, neighbor_color);
- mul_v4_fl(color_mix, color_interp * fade);
- blend_color_mix_float(interp_color, interp_color, color_mix);
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ float current_disp[3];
+ float current_disp_norm[3];
+ float interp_color[4];
+ copy_v4_v4(interp_color, ss->cache->prev_colors[vd.index]);
+
+ switch (brush->smear_deform_type) {
+ case BRUSH_SMEAR_DEFORM_DRAG:
+ sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location);
+ break;
+ case BRUSH_SMEAR_DEFORM_PINCH:
+ sub_v3_v3v3(current_disp, ss->cache->location, vd.co);
+ break;
+ case BRUSH_SMEAR_DEFORM_EXPAND:
+ sub_v3_v3v3(current_disp, vd.co, ss->cache->location);
+ break;
+ }
+ normalize_v3_v3(current_disp_norm, current_disp);
+ mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength);
+
+ SculptVertexNeighborIter ni;
+ SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) {
+ float vertex_disp[3];
+ float vertex_disp_norm[3];
+ sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.index), vd.co);
+ const float *neighbor_color = ss->cache->prev_colors[ni.index];
+ normalize_v3_v3(vertex_disp_norm, vertex_disp);
+ if (dot_v3v3(current_disp_norm, vertex_disp_norm) >= 0.0f) {
+ continue;
}
- SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
+ const float color_interp = clamp_f(
+ -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f);
+ float color_mix[4];
+ copy_v4_v4(color_mix, neighbor_color);
+ mul_v4_fl(color_mix, color_interp * fade);
+ blend_color_mix_float(interp_color, interp_color, color_mix);
+ }
+ SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
- blend_color_interpolate_float(vd.col, ss->cache->prev_colors[vd.index], interp_color, fade);
+ blend_color_interpolate_float(vd.col, ss->cache->prev_colors[vd.index], interp_color, fade);
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
diff --git a/source/blender/editors/sculpt_paint/sculpt_pose.c b/source/blender/editors/sculpt_paint/sculpt_pose.c
index 1bf9ba60073..a85f805894b 100644
--- a/source/blender/editors/sculpt_paint/sculpt_pose.c
+++ b/source/blender/editors/sculpt_paint/sculpt_pose.c
@@ -490,50 +490,52 @@ static bool pose_face_sets_floodfill_cb(
is_vertex_valid = SCULPT_vertex_has_face_set(ss, index, data->current_face_set);
}
- if (is_vertex_valid) {
-
- if (!BLI_BITMAP_TEST(data->is_weighted, index)) {
- data->pose_factor[index] = 1.0f;
- BLI_BITMAP_ENABLE(data->is_weighted, index);
- visit_next = true;
- }
-
- /* Fallback origin accumulation. */
- if (symmetry_check) {
- add_v3_v3(data->fallback_origin, SCULPT_vertex_co_get(ss, index));
- data->fallback_count++;
- }
-
- if (symmetry_check && !SCULPT_vertex_has_unique_face_set(ss, index)) {
+ if (!is_vertex_valid) {
+ return visit_next;
+ }
- /* We only add coordinates for calculating the origin when it is possible to go from this
- * vertex to another vertex in a valid face set for the next iteration. */
- bool count_as_boundary = false;
+ if (!BLI_BITMAP_TEST(data->is_weighted, index)) {
+ data->pose_factor[index] = 1.0f;
+ BLI_BITMAP_ENABLE(data->is_weighted, index);
+ visit_next = true;
+ }
- SculptVertexNeighborIter ni;
- SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, index, ni) {
- int next_face_set_candidate = SCULPT_vertex_face_set_get(ss, ni.index);
+ /* Fallback origin accumulation. */
+ if (symmetry_check) {
+ add_v3_v3(data->fallback_origin, SCULPT_vertex_co_get(ss, index));
+ data->fallback_count++;
+ }
- /* Check if we can get a valid face set for the next iteration from this neighbor. */
- if (SCULPT_vertex_has_unique_face_set(ss, ni.index) &&
- !BLI_gset_haskey(data->visited_face_sets, POINTER_FROM_INT(next_face_set_candidate))) {
- if (!data->next_face_set_found) {
- data->next_face_set = next_face_set_candidate;
- data->next_vertex = ni.index;
- data->next_face_set_found = true;
- }
- count_as_boundary = true;
- }
- }
- SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
+ if (!symmetry_check || SCULPT_vertex_has_unique_face_set(ss, index)) {
+ return visit_next;
+ }
- /* Origin accumulation. */
- if (count_as_boundary) {
- add_v3_v3(data->pose_origin, SCULPT_vertex_co_get(ss, index));
- data->tot_co++;
+ /* We only add coordinates for calculating the origin when it is possible to go from this
+ * vertex to another vertex in a valid face set for the next iteration. */
+ bool count_as_boundary = false;
+
+ SculptVertexNeighborIter ni;
+ SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, index, ni) {
+ int next_face_set_candidate = SCULPT_vertex_face_set_get(ss, ni.index);
+
+ /* Check if we can get a valid face set for the next iteration from this neighbor. */
+ if (SCULPT_vertex_has_unique_face_set(ss, ni.index) &&
+ !BLI_gset_haskey(data->visited_face_sets, POINTER_FROM_INT(next_face_set_candidate))) {
+ if (!data->next_face_set_found) {
+ data->next_face_set = next_face_set_candidate;
+ data->next_vertex = ni.index;
+ data->next_face_set_found = true;
}
+ count_as_boundary = true;
}
}
+ SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
+
+ /* Origin accumulation. */
+ if (count_as_boundary) {
+ add_v3_v3(data->pose_origin, SCULPT_vertex_co_get(ss, index));
+ data->tot_co++;
+ }
return visit_next;
}
@@ -738,7 +740,7 @@ static SculptPoseIKChain *pose_ik_chain_init_topology(Sculpt *sd,
* iteration an the current iteration. */
for (int j = 0; j < totvert; j++) {
ik_chain->segments[i].weights[j] = pose_factor_grow[j] - pose_factor_grow_prev[j];
- /* Store the current grow factor status for the next interation. */
+ /* Store the current grow factor status for the next iteration. */
pose_factor_grow_prev[j] = pose_factor_grow[j];
}
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_smooth.c b/source/blender/editors/sculpt_paint/sculpt_smooth.c
index 87ee7480c92..4c0795eb0f7 100644
--- a/source/blender/editors/sculpt_paint/sculpt_smooth.c
+++ b/source/blender/editors/sculpt_paint/sculpt_smooth.c
@@ -231,24 +231,26 @@ static void do_enhance_details_brush_task_cb_ex(void *__restrict userdata,
const int thread_id = BLI_task_parallel_thread_id(tls);
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- float disp[3];
- madd_v3_v3v3fl(disp, vd.co, ss->cache->detail_directions[vd.index], fade);
- SCULPT_clip(sd, ss, vd.co, disp);
-
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ float disp[3];
+ madd_v3_v3v3fl(disp, vd.co, ss->cache->detail_directions[vd.index], fade);
+ SCULPT_clip(sd, ss, vd.co, disp);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -312,33 +314,34 @@ static void do_smooth_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(
- ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- smooth_mask ? 0.0f : (vd.mask ? *vd.mask : 0.0f),
- vd.index,
- thread_id);
- if (smooth_mask) {
- float val = SCULPT_neighbor_mask_average(ss, vd.index) - *vd.mask;
- val *= fade * bstrength;
- *vd.mask += val;
- CLAMP(*vd.mask, 0.0f, 1.0f);
- }
- else {
- float avg[3], val[3];
- SCULPT_neighbor_coords_average_interior(ss, avg, vd.index);
- sub_v3_v3v3(val, avg, vd.co);
- madd_v3_v3v3fl(val, vd.co, val, fade);
- SCULPT_clip(sd, ss, vd.co, val);
- }
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(
+ ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ smooth_mask ? 0.0f : (vd.mask ? *vd.mask : 0.0f),
+ vd.index,
+ thread_id);
+ if (smooth_mask) {
+ float val = SCULPT_neighbor_mask_average(ss, vd.index) - *vd.mask;
+ val *= fade * bstrength;
+ *vd.mask += val;
+ CLAMP(*vd.mask, 0.0f, 1.0f);
+ }
+ else {
+ float avg[3], val[3];
+ SCULPT_neighbor_coords_average_interior(ss, avg, vd.index);
+ sub_v3_v3v3(val, avg, vd.co);
+ madd_v3_v3v3fl(val, vd.co, val, fade);
+ SCULPT_clip(sd, ss, vd.co, val);
+ }
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
}
BKE_pbvh_vertex_iter_end;
@@ -473,32 +476,28 @@ static void SCULPT_do_surface_smooth_brush_laplacian_task_cb_ex(
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
SCULPT_orig_vert_data_update(&orig_data, &vd);
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
-
- float disp[3];
- SCULPT_surface_smooth_laplacian_step(ss,
- disp,
- vd.co,
- ss->cache->surface_smooth_laplacian_disp,
- vd.index,
- orig_data.co,
- alpha);
- madd_v3_v3fl(vd.co, disp, clamp_f(fade, 0.0f, 1.0f));
- if (vd.mvert) {
- vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
+ }
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+
+ float disp[3];
+ SCULPT_surface_smooth_laplacian_step(
+ ss, disp, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.index, orig_data.co, alpha);
+ madd_v3_v3fl(vd.co, disp, clamp_f(fade, 0.0f, 1.0f));
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
- BKE_pbvh_vertex_iter_end;
}
+ BKE_pbvh_vertex_iter_end;
}
static void SCULPT_do_surface_smooth_brush_displace_task_cb_ex(
@@ -519,19 +518,20 @@ static void SCULPT_do_surface_smooth_brush_displace_task_cb_ex(
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
- SCULPT_surface_smooth_displace_step(
- ss, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.index, beta, fade);
+ if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+ continue;
}
+ const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+ SCULPT_surface_smooth_displace_step(
+ ss, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.index, beta, fade);
}
BKE_pbvh_vertex_iter_end;
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index 938080b392d..ec103bd2b98 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -1527,9 +1527,14 @@ static void sculpt_undosys_step_decode_redo(struct bContext *C,
}
}
-static void sculpt_undosys_step_decode(
- struct bContext *C, struct Main *bmain, UndoStep *us_p, int dir, bool UNUSED(is_final))
+static void sculpt_undosys_step_decode(struct bContext *C,
+ struct Main *bmain,
+ UndoStep *us_p,
+ const eUndoStepDir dir,
+ bool UNUSED(is_final))
{
+ BLI_assert(dir != STEP_INVALID);
+
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
/* Ensure sculpt mode. */
@@ -1568,10 +1573,10 @@ static void sculpt_undosys_step_decode(
}
SculptUndoStep *us = (SculptUndoStep *)us_p;
- if (dir < 0) {
+ if (dir == STEP_UNDO) {
sculpt_undosys_step_decode_undo(C, depsgraph, us);
}
- else {
+ else if (dir == STEP_REDO) {
sculpt_undosys_step_decode_redo(C, depsgraph, us);
}
}
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index 34617804888..85616f6356d 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -31,7 +31,6 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
-#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
#include "DNA_sound_types.h"
@@ -877,7 +876,7 @@ static void SOUND_OT_unpack(wmOperatorType *ot)
/* properties */
RNA_def_enum(
ot->srna, "method", rna_enum_unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack");
- /* XXX, weark!, will fail with library, name collisions */
+ /* XXX: weak!, will fail with library, name collisions */
RNA_def_string(
ot->srna, "id", NULL, MAX_ID_NAME - 2, "Sound Name", "Sound data-block name to unpack");
}
diff --git a/source/blender/editors/space_action/action_buttons.c b/source/blender/editors/space_action/action_buttons.c
index 5e1c205f1d4..dfc3789a26c 100644
--- a/source/blender/editors/space_action/action_buttons.c
+++ b/source/blender/editors/space_action/action_buttons.c
@@ -26,33 +26,10 @@
#include <stdio.h>
#include <string.h>
-#include "DNA_anim_types.h"
-#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
-
-#include "MEM_guardedalloc.h"
-
#include "BLI_utildefines.h"
-#include "BLT_translation.h"
-
#include "BKE_context.h"
-#include "BKE_curve.h"
-#include "BKE_fcurve.h"
#include "BKE_screen.h"
-#include "BKE_unit.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "RNA_access.h"
-
-#include "ED_anim_api.h"
-#include "ED_keyframing.h"
-#include "ED_screen.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
#include "action_intern.h" /* own include */
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index f731fe23b7c..5c061518570 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -73,7 +73,7 @@
/* ************************************************************************** */
/* POSE MARKERS STUFF */
-/* *************************** Localise Markers ***************************** */
+/* *************************** Localize Markers ***************************** */
/* ensure that there is:
* 1) an active action editor
@@ -312,17 +312,17 @@ void ACTION_OT_previewrange_set(wmOperatorType *ot)
/**
* Find the extents of the active channel
*
- * \param[out] min: Bottom y-extent of channel
- * \param[out] max: Top y-extent of channel
- * \return Success of finding a selected channel
+ * \param r_min: Bottom y-extent of channel.
+ * \param r_max: Top y-extent of channel.
+ * \return Success of finding a selected channel.
*/
-static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min, float *max)
+static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *r_min, float *r_max)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
- /* NOTE: not bool, since we want prioritise individual channels over expanders */
+ /* NOTE: not bool, since we want prioritize individual channels over expanders. */
short found = 0;
/* get all items - we need to do it this way */
@@ -339,14 +339,14 @@ static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min,
if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) &&
ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT)) {
/* update best estimate */
- *min = ymax - ACHANNEL_HEIGHT(ac);
- *max = ymax;
+ *r_min = ymax - ACHANNEL_HEIGHT(ac);
+ *r_max = ymax;
/* is this high enough priority yet? */
found = acf->channel_role;
/* only stop our search when we've found an actual channel
- * - datablock expanders get less priority so that we don't abort prematurely
+ * - data-block expanders get less priority so that we don't abort prematurely
*/
if (found == ACHANNEL_ROLE_CHANNEL) {
break;
diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c
index 7422c05511c..7821458d1e5 100644
--- a/source/blender/editors/space_action/action_ops.c
+++ b/source/blender/editors/space_action/action_ops.c
@@ -27,9 +27,6 @@
#include "DNA_space_types.h"
#include "ED_anim_api.h"
-#include "ED_markers.h"
-#include "ED_object.h"
-#include "ED_select_utils.h"
#include "ED_transform.h"
#include "action_intern.h"
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index ff0201f9702..722005235d3 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -55,7 +55,6 @@
#include "ED_space_api.h"
#include "ED_time_scrub_ui.h"
-#include "GPU_framebuffer.h"
#include "action_intern.h" /* own include */
/* ******************** default callbacks for action space ***************** */
@@ -305,12 +304,11 @@ static void action_header_region_draw(const bContext *C, ARegion *region)
ED_region_header(C, region);
}
-static void action_channel_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void action_channel_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
@@ -356,14 +354,13 @@ static void action_channel_region_listener(wmWindow *UNUSED(win),
}
}
-static void saction_channel_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *UNUSED(scene),
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void saction_channel_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ bScreen *screen = params->screen;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+
PointerRNA ptr;
RNA_pointer_create(&screen->id, &RNA_SpaceDopeSheetEditor, area->spacedata.first, &ptr);
@@ -401,12 +398,11 @@ static void saction_channel_region_message_subscribe(const struct bContext *UNUS
}
}
-static void action_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void action_main_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
@@ -460,14 +456,14 @@ static void action_main_region_listener(wmWindow *UNUSED(win),
}
}
-static void saction_main_region_message_subscribe(const struct bContext *C,
- struct WorkSpace *workspace,
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void saction_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ Scene *scene = params->scene;
+ bScreen *screen = params->screen;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+
PointerRNA ptr;
RNA_pointer_create(&screen->id, &RNA_SpaceDopeSheetEditor, area->spacedata.first, &ptr);
@@ -502,15 +498,14 @@ static void saction_main_region_message_subscribe(const struct bContext *C,
}
/* Now run the general "channels region" one - since channels and main should be in sync */
- saction_channel_region_message_subscribe(C, workspace, scene, screen, area, region, mbus);
+ saction_channel_region_message_subscribe(params);
}
/* editor level listener */
-static void action_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void action_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
SpaceAction *saction = (SpaceAction *)area->spacedata.first;
/* context changes */
@@ -660,12 +655,11 @@ static void action_listener(wmWindow *UNUSED(win),
}
}
-static void action_header_region_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void action_header_region_listener(const wmRegionListenerParams *params)
{
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
SpaceAction *saction = (SpaceAction *)area->spacedata.first;
/* context changes */
@@ -737,12 +731,11 @@ static void action_buttons_area_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
-static void action_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void action_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index 10fa2c19919..817760615df 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -70,16 +70,13 @@
#include "io_ops.h"
-/* only call once on startup, storage is global in BKE kernel listbase */
+/* Only called once on startup. storage is global in BKE kernel listbase. */
void ED_spacetypes_init(void)
{
- const ListBase *spacetypes;
- SpaceType *type;
-
- /* UI_UNIT_X is now a variable, is used in some spacetype inits? */
+ /* UI unit is a variable, may be used in some space type inits. */
U.widget_unit = 20;
- /* create space types */
+ /* Create space types. */
ED_spacetype_outliner();
ED_spacetype_view3d();
ED_spacetype_ipo();
@@ -98,9 +95,8 @@ void ED_spacetypes_init(void)
ED_spacetype_clip();
ED_spacetype_statusbar();
ED_spacetype_topbar();
- // ...
- /* register operator types for screen and all spaces */
+ /* Register operator types for screen and all spaces. */
ED_operatortypes_userpref();
ED_operatortypes_workspace();
ED_operatortypes_scene();
@@ -132,7 +128,7 @@ void ED_spacetypes_init(void)
ED_screen_user_menu_register();
- /* gizmo types */
+ /* Gizmo types. */
ED_gizmotypes_button_2d();
ED_gizmotypes_dial_3d();
ED_gizmotypes_move_3d();
@@ -144,10 +140,10 @@ void ED_spacetypes_init(void)
ED_gizmotypes_cage_3d();
ED_gizmotypes_snap_3d();
- /* register types for operators and gizmos */
- spacetypes = BKE_spacetypes_list();
- for (type = spacetypes->first; type; type = type->next) {
- /* init gizmo types first, operator-types need them */
+ /* Register types for operators and gizmos. */
+ const ListBase *spacetypes = BKE_spacetypes_list();
+ LISTBASE_FOREACH (const SpaceType *, type, spacetypes) {
+ /* Initialize gizmo types first, operator types need them. */
if (type->gizmos) {
type->gizmos();
}
@@ -159,11 +155,8 @@ void ED_spacetypes_init(void)
void ED_spacemacros_init(void)
{
- const ListBase *spacetypes;
- SpaceType *type;
-
- /* Macros's must go last since they reference other operators.
- * We need to have them go after python operators too */
+ /* Macros must go last since they reference other operators.
+ * They need to be registered after python operators too. */
ED_operatormacros_armature();
ED_operatormacros_mesh();
ED_operatormacros_uvedit();
@@ -180,24 +173,21 @@ void ED_spacemacros_init(void)
ED_operatormacros_paint();
ED_operatormacros_gpencil();
- /* register dropboxes (can use macros) */
- spacetypes = BKE_spacetypes_list();
- for (type = spacetypes->first; type; type = type->next) {
+ /* Register dropboxes (can use macros). */
+ const ListBase *spacetypes = BKE_spacetypes_list();
+ LISTBASE_FOREACH (const SpaceType *, type, spacetypes) {
if (type->dropboxes) {
type->dropboxes();
}
}
}
-/* called in wm.c */
-/* keymap definitions are registered only once per WM initialize, usually on file read,
- * using the keymap the actual areas/regions add the handlers */
+/**
+ * \note Keymap definitions are registered only once per WM initialize,
+ * usually on file read, using the keymap the actual areas/regions add the handlers.
+ * \note Called in wm.c. */
void ED_spacetypes_keymap(wmKeyConfig *keyconf)
{
- const ListBase *spacetypes;
- SpaceType *stype;
- ARegionType *atype;
-
ED_keymap_screen(keyconf);
ED_keymap_anim(keyconf);
ED_keymap_animchannels(keyconf);
@@ -219,20 +209,20 @@ void ED_spacetypes_keymap(wmKeyConfig *keyconf)
ED_keymap_transform(keyconf);
- spacetypes = BKE_spacetypes_list();
- for (stype = spacetypes->first; stype; stype = stype->next) {
- if (stype->keymap) {
- stype->keymap(keyconf);
+ const ListBase *spacetypes = BKE_spacetypes_list();
+ LISTBASE_FOREACH (const SpaceType *, type, spacetypes) {
+ if (type->keymap) {
+ type->keymap(keyconf);
}
- for (atype = stype->regiontypes.first; atype; atype = atype->next) {
- if (atype->keymap) {
- atype->keymap(keyconf);
+ LISTBASE_FOREACH (ARegionType *, region_type, &type->regiontypes) {
+ if (region_type->keymap) {
+ region_type->keymap(keyconf);
}
}
}
}
-/* ********************** custom drawcall api ***************** */
+/* ********************** Custom Draw Call API ***************** */
typedef struct RegionDrawCB {
struct RegionDrawCB *next, *prev;
@@ -261,9 +251,7 @@ void *ED_region_draw_cb_activate(ARegionType *art,
void ED_region_draw_cb_exit(ARegionType *art, void *handle)
{
- RegionDrawCB *rdc;
-
- for (rdc = art->drawcalls.first; rdc; rdc = rdc->next) {
+ LISTBASE_FOREACH (RegionDrawCB *, rdc, &art->drawcalls) {
if (rdc == (RegionDrawCB *)handle) {
BLI_remlink(&art->drawcalls, rdc);
MEM_freeN(rdc);
@@ -274,9 +262,7 @@ void ED_region_draw_cb_exit(ARegionType *art, void *handle)
void ED_region_draw_cb_draw(const bContext *C, ARegion *region, int type)
{
- RegionDrawCB *rdc;
-
- for (rdc = region->type->drawcalls.first; rdc; rdc = rdc->next) {
+ LISTBASE_FOREACH (RegionDrawCB *, rdc, &region->type->drawcalls) {
if (rdc->type == type) {
rdc->draw(C, region, rdc->customdata);
@@ -301,7 +287,7 @@ static void xxx_free(SpaceLink *UNUSED(sl))
{
}
-/* spacetype; init callback for usage, should be redoable */
+/* spacetype; init callback for usage, should be re-doable. */
static void xxx_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(area))
{
diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c
index 76c0fc07429..3efaff72637 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -33,8 +33,6 @@
#include "DNA_armature_types.h"
#include "DNA_brush_types.h"
-#include "DNA_collection_types.h"
-#include "DNA_light_types.h"
#include "DNA_linestyle_types.h"
#include "DNA_material_types.h"
#include "DNA_node_types.h"
@@ -53,7 +51,6 @@
#include "BKE_paint.h"
#include "BKE_particle.h"
#include "BKE_screen.h"
-#include "BKE_texture.h"
#include "RNA_access.h"
diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c
index 6f743eb1a6b..4847e8738df 100644
--- a/source/blender/editors/space_buttons/buttons_texture.c
+++ b/source/blender/editors/space_buttons/buttons_texture.c
@@ -52,10 +52,7 @@
#include "BKE_node.h"
#include "BKE_paint.h"
#include "BKE_particle.h"
-#include "BKE_scene.h"
-#include "BKE_workspace.h"
#ifdef WITH_FREESTYLE
-# include "BKE_freestyle.h"
#endif
#include "RNA_access.h"
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index e50ca2ec92b..07bc1d42c3f 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -514,12 +514,11 @@ static void buttons_main_region_layout(const bContext *C, ARegion *region)
sbuts->mainbo = sbuts->mainb;
}
-static void buttons_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void buttons_main_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SCREEN:
@@ -567,15 +566,13 @@ static void buttons_header_region_draw(const bContext *C, ARegion *region)
ED_region_header(C, region);
}
-static void buttons_header_region_message_subscribe(const bContext *UNUSED(C),
- WorkSpace *UNUSED(workspace),
- Scene *UNUSED(scene),
- bScreen *UNUSED(screen),
- ScrArea *area,
- ARegion *region,
- struct wmMsgBus *mbus)
+static void buttons_header_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
SpaceProperties *sbuts = area->spacedata.first;
+
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
.user_data = region,
@@ -621,14 +618,12 @@ static void buttons_navigation_bar_region_draw(const bContext *C, ARegion *regio
ED_region_panels_draw(C, region);
}
-static void buttons_navigation_bar_region_message_subscribe(const bContext *UNUSED(C),
- WorkSpace *UNUSED(workspace),
- Scene *UNUSED(scene),
- bScreen *UNUSED(screen),
- ScrArea *UNUSED(area),
- ARegion *region,
- struct wmMsgBus *mbus)
+static void buttons_navigation_bar_region_message_subscribe(
+ const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ ARegion *region = params->region;
+
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
.user_data = region,
@@ -657,11 +652,10 @@ static void buttons_area_redraw(ScrArea *area, short buttons)
* \{ */
/* reused! */
-static void buttons_area_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void buttons_area_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
SpaceProperties *sbuts = area->spacedata.first;
/* context changes */
diff --git a/source/blender/editors/space_clip/clip_buttons.c b/source/blender/editors/space_clip/clip_buttons.c
index 81bae26efeb..d555238e949 100644
--- a/source/blender/editors/space_clip/clip_buttons.c
+++ b/source/blender/editors/space_clip/clip_buttons.c
@@ -46,7 +46,6 @@
#include "DEG_depsgraph.h"
#include "ED_clip.h"
-#include "ED_gpencil.h"
#include "ED_screen.h"
#include "UI_interface.h"
@@ -805,7 +804,7 @@ void uiTemplateMovieclipInformation(uiLayout *layout,
ImBuf *ibuf = BKE_movieclip_get_ibuf_flag(clip, user, clip->flag, MOVIECLIP_CACHE_SKIP);
int width, height;
- /* Display frame dimensions, channels number and byffer type. */
+ /* Display frame dimensions, channels number and buffer type. */
BKE_movieclip_get_size(clip, user, &width, &height);
char str[1024];
diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c
index 93c30c9a4ba..cbe8ec4ba00 100644
--- a/source/blender/editors/space_clip/clip_draw.c
+++ b/source/blender/editors/space_clip/clip_draw.c
@@ -1207,7 +1207,7 @@ static void draw_plane_marker_image(Scene *scene,
GPUTexture *texture = GPU_texture_create_2d(
"plane_marker_image", ibuf->x, ibuf->y, 1, GPU_RGBA8, NULL);
- GPU_texture_update(texture, GPU_DATA_UNSIGNED_BYTE, display_buffer);
+ GPU_texture_update(texture, GPU_DATA_UBYTE, display_buffer);
GPU_texture_filter_mode(texture, false);
GPU_matrix_push();
diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c
index bd11a746e11..e1172458f67 100644
--- a/source/blender/editors/space_clip/clip_editor.c
+++ b/source/blender/editors/space_clip/clip_editor.c
@@ -67,7 +67,9 @@
#include "clip_intern.h" /* own include */
-/* ******** operactor poll functions ******** */
+/* -------------------------------------------------------------------- */
+/** \name Operator Poll Functions
+ * \{ */
bool ED_space_clip_poll(bContext *C)
{
@@ -128,7 +130,11 @@ bool ED_space_clip_maskedit_mask_poll(bContext *C)
return false;
}
-/* ******** common editing functions ******** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Common Editing Functions
+ * \{ */
void ED_space_clip_get_size(SpaceClip *sc, int *width, int *height)
{
@@ -327,118 +333,18 @@ void ED_clip_update_frame(const Main *mainp, int cfra)
}
}
-static bool selected_tracking_boundbox(SpaceClip *sc, float min[2], float max[2])
+bool ED_clip_view_selection(const bContext *C, ARegion *UNUSED(region), bool fit)
{
- MovieClip *clip = ED_space_clip_get_clip(sc);
- MovieTrackingTrack *track;
- int width, height;
- bool ok = false;
- ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
- int framenr = ED_space_clip_get_clip_frame_number(sc);
-
- INIT_MINMAX2(min, max);
-
- ED_space_clip_get_size(sc, &width, &height);
-
- track = tracksbase->first;
- while (track) {
- if (TRACK_VIEW_SELECTED(sc, track)) {
- MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
-
- if (marker) {
- float pos[3];
-
- pos[0] = marker->pos[0] + track->offset[0];
- pos[1] = marker->pos[1] + track->offset[1];
- pos[2] = 0.0f;
-
- /* undistortion happens for normalized coords */
- if (sc->user.render_flag & MCLIP_PROXY_RENDER_UNDISTORT) {
- /* undistortion happens for normalized coords */
- ED_clip_point_undistorted_pos(sc, pos, pos);
- }
-
- pos[0] *= width;
- pos[1] *= height;
-
- mul_v3_m4v3(pos, sc->stabmat, pos);
-
- minmax_v2v2_v2(min, max, pos);
-
- ok = true;
- }
- }
-
- track = track->next;
- }
-
- return ok;
-}
-
-static bool selected_boundbox(const bContext *C, float min[2], float max[2])
-{
- SpaceClip *sc = CTX_wm_space_clip(C);
- if (sc->mode == SC_MODE_TRACKING) {
- return selected_tracking_boundbox(sc, min, max);
- }
-
- if (ED_mask_selected_minmax(C, min, max)) {
- MovieClip *clip = ED_space_clip_get_clip(sc);
- int width, height;
- ED_space_clip_get_size(sc, &width, &height);
- BKE_mask_coord_to_movieclip(clip, &sc->user, min, min);
- BKE_mask_coord_to_movieclip(clip, &sc->user, max, max);
- min[0] *= width;
- min[1] *= height;
- max[0] *= width;
- max[1] *= height;
- return true;
- }
- return false;
-}
-
-bool ED_clip_view_selection(const bContext *C, ARegion *region, bool fit)
-{
- SpaceClip *sc = CTX_wm_space_clip(C);
- int w, h, frame_width, frame_height;
- float min[2], max[2];
-
- ED_space_clip_get_size(sc, &frame_width, &frame_height);
-
- if ((frame_width == 0) || (frame_height == 0) || (sc->clip == NULL)) {
- return false;
- }
-
- if (!selected_boundbox(C, min, max)) {
+ float offset_x, offset_y;
+ float zoom;
+ if (!clip_view_calculate_view_selection(C, fit, &offset_x, &offset_y, &zoom)) {
return false;
}
- /* center view */
- clip_view_center_to_point(
- sc, (max[0] + min[0]) / (2 * frame_width), (max[1] + min[1]) / (2 * frame_height));
-
- w = max[0] - min[0];
- h = max[1] - min[1];
-
- /* set zoom to see all selection */
- if (w > 0 && h > 0) {
- int width, height;
- float zoomx, zoomy, newzoom, aspx, aspy;
-
- ED_space_clip_get_aspect(sc, &aspx, &aspy);
-
- width = BLI_rcti_size_x(&region->winrct) + 1;
- height = BLI_rcti_size_y(&region->winrct) + 1;
-
- zoomx = (float)width / w / aspx;
- zoomy = (float)height / h / aspy;
-
- newzoom = 1.0f / power_of_2(1.0f / min_ff(zoomx, zoomy));
-
- if (fit || sc->zoom > newzoom) {
- sc->zoom = newzoom;
- }
- }
+ SpaceClip *sc = CTX_wm_space_clip(C);
+ sc->xof = offset_x;
+ sc->yof = offset_y;
+ sc->zoom = zoom;
return true;
}
@@ -638,7 +544,11 @@ bool ED_space_clip_check_show_maskedit(SpaceClip *sc)
return false;
}
-/* ******** clip editing functions ******** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Clip Editing Functions
+ * \{ */
MovieClip *ED_space_clip_get_clip(SpaceClip *sc)
{
@@ -695,7 +605,11 @@ void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieCl
}
}
-/* ******** masking editing functions ******** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Masking Editing Functions
+ * \{ */
Mask *ED_space_clip_get_mask(SpaceClip *sc)
{
@@ -713,7 +627,11 @@ void ED_space_clip_set_mask(bContext *C, SpaceClip *sc, Mask *mask)
}
}
-/* ******** pre-fetching functions ******** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Pre-Fetching Functions
+ * \{ */
typedef struct PrefetchJob {
MovieClip *clip;
@@ -1177,3 +1095,49 @@ void clip_start_prefetch_job(const bContext *C)
/* and finally start the job */
WM_jobs_start(CTX_wm_manager(C), wm_job);
}
+
+void ED_clip_view_lock_state_store(const bContext *C, ClipViewLockState *state)
+{
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+ BLI_assert(space_clip != NULL);
+
+ state->offset_x = space_clip->xof;
+ state->offset_y = space_clip->yof;
+ state->zoom = space_clip->zoom;
+
+ state->lock_offset_x = 0.0f;
+ state->lock_offset_y = 0.0f;
+
+ if ((space_clip->flag & SC_LOCK_SELECTION) == 0) {
+ return;
+ }
+
+ if (!clip_view_calculate_view_selection(
+ C, false, &state->offset_x, &state->offset_y, &state->zoom)) {
+ return;
+ }
+
+ state->lock_offset_x = space_clip->xlockof;
+ state->lock_offset_y = space_clip->ylockof;
+}
+
+void ED_clip_view_lock_state_restore_no_jump(const bContext *C, const ClipViewLockState *state)
+{
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+ BLI_assert(space_clip != NULL);
+
+ if ((space_clip->flag & SC_LOCK_SELECTION) == 0) {
+ return;
+ }
+
+ float offset_x, offset_y;
+ float zoom;
+ if (!clip_view_calculate_view_selection(C, false, &offset_x, &offset_y, &zoom)) {
+ return;
+ }
+
+ space_clip->xlockof = state->offset_x + state->lock_offset_x - offset_x;
+ space_clip->ylockof = state->offset_y + state->lock_offset_y - offset_y;
+}
+
+/** \} */
diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h
index 4848ec72f79..202dc00e365 100644
--- a/source/blender/editors/space_clip/clip_intern.h
+++ b/source/blender/editors/space_clip/clip_intern.h
@@ -171,8 +171,15 @@ void clip_delete_plane_track(struct bContext *C,
struct MovieClip *clip,
struct MovieTrackingPlaneTrack *plane_track);
+void clip_view_offset_for_center_to_point(
+ SpaceClip *sc, const float x, const float y, float *r_offset_x, float *r_offset_y);
void clip_view_center_to_point(SpaceClip *sc, float x, float y);
+bool clip_view_calculate_view_selection(
+ const struct bContext *C, bool fit, float *r_offset_x, float *r_offset_y, float *r_zoom);
+
+bool clip_view_has_locked_selection(const struct bContext *C);
+
void clip_draw_sfra_efra(struct View2D *v2d, struct Scene *scene);
/* tracking_ops.c */
@@ -191,6 +198,7 @@ void CLIP_OT_clear_solution(struct wmOperatorType *ot);
void CLIP_OT_clear_track_path(struct wmOperatorType *ot);
void CLIP_OT_join_tracks(struct wmOperatorType *ot);
+void CLIP_OT_average_tracks(struct wmOperatorType *ot);
void CLIP_OT_disable_markers(struct wmOperatorType *ot);
void CLIP_OT_hide_tracks(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c
index cd4a1ffb526..0c54a042a1a 100644
--- a/source/blender/editors/space_clip/clip_ops.c
+++ b/source/blender/editors/space_clip/clip_ops.c
@@ -125,7 +125,7 @@ static void sclip_zoom_set(const bContext *C,
dx = ((location[0] - 0.5f) * w - sc->xof) * (sc->zoom - oldzoom) / sc->zoom;
dy = ((location[1] - 0.5f) * h - sc->yof) * (sc->zoom - oldzoom) / sc->zoom;
- if (sc->flag & SC_LOCK_SELECTION) {
+ if (clip_view_has_locked_selection(C)) {
sc->xlockof += dx;
sc->ylockof += dy;
}
@@ -396,7 +396,7 @@ static void view_pan_init(bContext *C, wmOperator *op, const wmEvent *event)
vpd->x = event->x;
vpd->y = event->y;
- if (sc->flag & SC_LOCK_SELECTION) {
+ if (clip_view_has_locked_selection(C)) {
vpd->vec = &sc->xlockof;
}
else {
@@ -434,7 +434,7 @@ static int view_pan_exec(bContext *C, wmOperator *op)
RNA_float_get_array(op->ptr, "offset", offset);
- if (sc->flag & SC_LOCK_SELECTION) {
+ if (clip_view_has_locked_selection(C)) {
sc->xlockof += offset[0];
sc->ylockof += offset[1];
}
@@ -569,7 +569,7 @@ static void view_zoom_init(bContext *C, wmOperator *op, const wmEvent *event)
WM_cursor_modal_set(win, WM_CURSOR_NSEW_SCROLL);
}
- if (U.viewzoom == USER_ZOOM_CONT) {
+ if (U.viewzoom == USER_ZOOM_CONTINUE) {
/* needs a timer to continue redrawing */
vpd->timer = WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
vpd->timer_lastdraw = PIL_check_seconds_timer();
@@ -662,7 +662,7 @@ static void view_zoom_apply(
delta = -delta;
}
- if (U.viewzoom == USER_ZOOM_CONT) {
+ if (U.viewzoom == USER_ZOOM_CONTINUE) {
SpaceClip *sclip = CTX_wm_space_clip(C);
double time = PIL_check_seconds_timer();
float time_step = (float)(time - vpd->timer_lastdraw);
@@ -1837,11 +1837,19 @@ void CLIP_OT_cursor_set(wmOperatorType *ot)
/** \name Toggle Lock To Selection Operator
* \{ */
-static int lock_selection_togglee_exec(bContext *C, wmOperator *UNUSED(op))
+static int lock_selection_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceClip *space_clip = CTX_wm_space_clip(C);
+
+ ClipViewLockState lock_state;
+ ED_clip_view_lock_state_store(C, &lock_state);
+
space_clip->flag ^= SC_LOCK_SELECTION;
+
+ ED_clip_view_lock_state_restore_no_jump(C, &lock_state);
+
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_CLIP, NULL);
+
return OPERATOR_FINISHED;
}
@@ -1854,7 +1862,7 @@ void CLIP_OT_lock_selection_toggle(wmOperatorType *ot)
/* api callbacks */
ot->poll = ED_space_clip_poll;
- ot->exec = lock_selection_togglee_exec;
+ ot->exec = lock_selection_toggle_exec;
/* flags */
ot->flag = OPTYPE_LOCK_BYPASS;
diff --git a/source/blender/editors/space_clip/clip_toolbar.c b/source/blender/editors/space_clip/clip_toolbar.c
index b02f3fe16f6..da9e82043f0 100644
--- a/source/blender/editors/space_clip/clip_toolbar.c
+++ b/source/blender/editors/space_clip/clip_toolbar.c
@@ -23,29 +23,17 @@
#include <string.h>
-#include "DNA_windowmanager_types.h"
-#include "DNA_workspace_types.h"
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
-#include "BLT_translation.h"
-
#include "BKE_context.h"
#include "BKE_screen.h"
-#include "RNA_access.h"
-
-#include "WM_api.h"
#include "WM_types.h"
#include "ED_screen.h"
-#include "ED_undo.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
#include "clip_intern.h" /* own include */
diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c
index c7f2a027ba8..dbf733413e5 100644
--- a/source/blender/editors/space_clip/clip_utils.c
+++ b/source/blender/editors/space_clip/clip_utils.c
@@ -27,10 +27,12 @@
#include "BLI_listbase.h"
#include "BLI_math.h"
+#include "BLI_rect.h"
#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_context.h"
+#include "BKE_mask.h"
#include "BKE_movieclip.h"
#include "BKE_tracking.h"
@@ -44,6 +46,7 @@
#include "WM_types.h"
#include "ED_clip.h"
+#include "ED_mask.h"
#include "ED_screen.h"
#include "UI_interface.h"
@@ -395,16 +398,231 @@ void clip_delete_plane_track(bContext *C, MovieClip *clip, MovieTrackingPlaneTra
DEG_id_tag_update(&clip->id, 0);
}
-void clip_view_center_to_point(SpaceClip *sc, float x, float y)
+/* Calculate space clip offset to be centered at the given point. */
+void clip_view_offset_for_center_to_point(
+ SpaceClip *sc, const float x, const float y, float *r_offset_x, float *r_offset_y)
{
int width, height;
+ ED_space_clip_get_size(sc, &width, &height);
+
float aspx, aspy;
+ ED_space_clip_get_aspect(sc, &aspx, &aspy);
+
+ *r_offset_x = (x - 0.5f) * width * aspx;
+ *r_offset_y = (y - 0.5f) * height * aspy;
+}
+
+void clip_view_center_to_point(SpaceClip *sc, float x, float y)
+{
+ clip_view_offset_for_center_to_point(sc, x, y, &sc->xof, &sc->yof);
+}
+
+static bool selected_tracking_boundbox(SpaceClip *sc, float min[2], float max[2])
+{
+ MovieClip *clip = ED_space_clip_get_clip(sc);
+ MovieTrackingTrack *track;
+ int width, height;
+ bool ok = false;
+ ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
+ int framenr = ED_space_clip_get_clip_frame_number(sc);
+
+ INIT_MINMAX2(min, max);
ED_space_clip_get_size(sc, &width, &height);
- ED_space_clip_get_aspect(sc, &aspx, &aspy);
- sc->xof = (x - 0.5f) * width * aspx;
- sc->yof = (y - 0.5f) * height * aspy;
+ track = tracksbase->first;
+ while (track) {
+ if (TRACK_VIEW_SELECTED(sc, track)) {
+ MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
+
+ if (marker) {
+ float pos[3];
+
+ pos[0] = marker->pos[0] + track->offset[0];
+ pos[1] = marker->pos[1] + track->offset[1];
+ pos[2] = 0.0f;
+
+ /* undistortion happens for normalized coords */
+ if (sc->user.render_flag & MCLIP_PROXY_RENDER_UNDISTORT) {
+ /* undistortion happens for normalized coords */
+ ED_clip_point_undistorted_pos(sc, pos, pos);
+ }
+
+ pos[0] *= width;
+ pos[1] *= height;
+
+ mul_v3_m4v3(pos, sc->stabmat, pos);
+
+ minmax_v2v2_v2(min, max, pos);
+
+ ok = true;
+ }
+ }
+
+ track = track->next;
+ }
+
+ return ok;
+}
+
+static bool tracking_has_selection(SpaceClip *space_clip)
+{
+ MovieClip *clip = ED_space_clip_get_clip(space_clip);
+ ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
+ const int framenr = ED_space_clip_get_clip_frame_number(space_clip);
+
+ LISTBASE_FOREACH (MovieTrackingTrack *, track, tracksbase) {
+ if (!TRACK_VIEW_SELECTED(space_clip, track)) {
+ continue;
+ }
+ const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
+ if (marker != NULL) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static bool mask_has_selection(const bContext *C)
+{
+ Mask *mask = CTX_data_edit_mask(C);
+ if (mask == NULL) {
+ return false;
+ }
+
+ LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask->masklayers) {
+ if (mask_layer->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
+ continue;
+ }
+ LISTBASE_FOREACH (MaskSpline *, spline, &mask_layer->splines) {
+ for (int i = 0; i < spline->tot_point; i++) {
+ const MaskSplinePoint *point = &spline->points[i];
+ const BezTriple *bezt = &point->bezt;
+ if (!MASKPOINT_ISSEL_ANY(point)) {
+ continue;
+ }
+ if (bezt->f2 & SELECT) {
+ return true;
+ }
+
+ if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) {
+ return true;
+ }
+
+ if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) {
+ return true;
+ }
+ if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+static bool selected_boundbox(const bContext *C,
+ float min[2],
+ float max[2],
+ bool handles_as_control_point)
+{
+ SpaceClip *sc = CTX_wm_space_clip(C);
+ if (sc->mode == SC_MODE_TRACKING) {
+ return selected_tracking_boundbox(sc, min, max);
+ }
+
+ if (ED_mask_selected_minmax(C, min, max, handles_as_control_point)) {
+ MovieClip *clip = ED_space_clip_get_clip(sc);
+ int width, height;
+ ED_space_clip_get_size(sc, &width, &height);
+ BKE_mask_coord_to_movieclip(clip, &sc->user, min, min);
+ BKE_mask_coord_to_movieclip(clip, &sc->user, max, max);
+ min[0] *= width;
+ min[1] *= height;
+ max[0] *= width;
+ max[1] *= height;
+ return true;
+ }
+ return false;
+}
+
+bool clip_view_calculate_view_selection(
+ const bContext *C, bool fit, float *r_offset_x, float *r_offset_y, float *r_zoom)
+{
+ SpaceClip *sc = CTX_wm_space_clip(C);
+
+ int frame_width, frame_height;
+ ED_space_clip_get_size(sc, &frame_width, &frame_height);
+
+ if ((frame_width == 0) || (frame_height == 0) || (sc->clip == NULL)) {
+ return false;
+ }
+
+ /* NOTE: The `fit` argument is set to truth when doing "View to Selected" operator, and it set to
+ * false when this function is used for Lock-to-Selection functionality. When locking to
+ * selection the handles are to use control point position. So we can derive the
+ * `handles_as_control_point` from `fit`.
+ *
+ * TODO(sergey): Make such decision more explicit. Maybe pass use-case for the calculation to
+ * tell operator from lock-to-selection apart. */
+ float min[2], max[2];
+ if (!selected_boundbox(C, min, max, !fit)) {
+ return false;
+ }
+
+ /* center view */
+ clip_view_offset_for_center_to_point(sc,
+ (max[0] + min[0]) / (2 * frame_width),
+ (max[1] + min[1]) / (2 * frame_height),
+ r_offset_x,
+ r_offset_y);
+
+ const int w = max[0] - min[0];
+ const int h = max[1] - min[1];
+
+ /* set zoom to see all selection */
+ *r_zoom = sc->zoom;
+ if (w > 0 && h > 0) {
+ ARegion *region = CTX_wm_region(C);
+
+ int width, height;
+ float zoomx, zoomy, newzoom, aspx, aspy;
+
+ ED_space_clip_get_aspect(sc, &aspx, &aspy);
+
+ width = BLI_rcti_size_x(&region->winrct) + 1;
+ height = BLI_rcti_size_y(&region->winrct) + 1;
+
+ zoomx = (float)width / w / aspx;
+ zoomy = (float)height / h / aspy;
+
+ newzoom = 1.0f / power_of_2(1.0f / min_ff(zoomx, zoomy));
+
+ if (fit) {
+ *r_zoom = newzoom;
+ }
+ }
+
+ return true;
+}
+
+/* Returns truth if lock-to-selection is enabled and possible.
+ * Locking to selection is not possible if there is no selection. */
+bool clip_view_has_locked_selection(const bContext *C)
+{
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+
+ if ((space_clip->flag & SC_LOCK_SELECTION) == 0) {
+ return false;
+ }
+
+ if (space_clip->mode == SC_MODE_TRACKING) {
+ return tracking_has_selection(space_clip);
+ }
+
+ return mask_has_selection(C);
}
void clip_draw_sfra_efra(View2D *v2d, Scene *scene)
diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c
index 3bdf016b64c..e0a524a79c1 100644
--- a/source/blender/editors/space_clip/space_clip.c
+++ b/source/blender/editors/space_clip/space_clip.c
@@ -47,15 +47,12 @@
#include "ED_clip.h"
#include "ED_mask.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
#include "ED_space_api.h"
#include "ED_time_scrub_ui.h"
-#include "ED_transform.h"
#include "ED_uvedit.h" /* just for ED_image_draw_cursor */
#include "IMB_imbuf.h"
-#include "GPU_framebuffer.h"
#include "GPU_matrix.h"
#include "WM_api.h"
@@ -229,7 +226,7 @@ static void clip_scopes_check_gpencil_change(ScrArea *area)
}
}
-static void clip_area_sync_frame_from_scene(ScrArea *area, Scene *scene)
+static void clip_area_sync_frame_from_scene(ScrArea *area, const Scene *scene)
{
SpaceClip *space_clip = (SpaceClip *)area->spacedata.first;
BKE_movieclip_user_set_frame(&space_clip->user, scene->r.cfra);
@@ -334,8 +331,12 @@ static SpaceLink *clip_duplicate(SpaceLink *sl)
return (SpaceLink *)scn;
}
-static void clip_listener(wmWindow *UNUSED(win), ScrArea *area, wmNotifier *wmn, Scene *scene)
+static void clip_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
+ const Scene *scene = params->scene;
+
/* context changes */
switch (wmn->category) {
case NC_SCENE:
@@ -514,6 +515,7 @@ static void clip_operatortypes(void)
/* clean-up */
WM_operatortype_append(CLIP_OT_clear_track_path);
WM_operatortype_append(CLIP_OT_join_tracks);
+ WM_operatortype_append(CLIP_OT_average_tracks);
WM_operatortype_append(CLIP_OT_track_copy_color);
WM_operatortype_append(CLIP_OT_clean_tracks);
@@ -637,7 +639,7 @@ static void clip_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("Clip", SPACE_CLIP, 0);
- WM_dropbox_add(lb, "CLIP_OT_open", clip_drop_poll, clip_drop_copy);
+ WM_dropbox_add(lb, "CLIP_OT_open", clip_drop_poll, clip_drop_copy, NULL);
}
static void clip_refresh(const bContext *C, ScrArea *area)
@@ -988,7 +990,14 @@ static void clip_main_region_draw(const bContext *C, ARegion *region)
}
/* callback */
+ /* TODO(sergey): For being consistent with space image the projection needs to be configured
+ * the way how the commented out code does it. This works correct for tracking data, but it
+ * causes wrong aspect correction for mask editor (see T84990). */
+ // GPU_matrix_push_projection();
+ // wmOrtho2(region->v2d.cur.xmin, region->v2d.cur.xmax, region->v2d.cur.ymin,
+ // region->v2d.cur.ymax);
ED_region_draw_cb_draw(C, region, REGION_DRAW_POST_VIEW);
+ // GPU_matrix_pop_projection();
/* reset view matrix */
UI_view2d_view_restore(C);
@@ -1001,12 +1010,11 @@ static void clip_main_region_draw(const bContext *C, ARegion *region)
WM_gizmomap_draw(region->gizmo_map, C, WM_GIZMOMAP_DRAWSTEP_2D);
}
-static void clip_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void clip_main_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_GPENCIL:
@@ -1137,11 +1145,7 @@ static void clip_preview_region_draw(const bContext *C, ARegion *region)
}
}
-static void clip_preview_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *UNUSED(region),
- wmNotifier *UNUSED(wmn),
- const Scene *UNUSED(scene))
+static void clip_preview_region_listener(const wmRegionListenerParams *UNUSED(params))
{
}
@@ -1182,11 +1186,7 @@ static void clip_channels_region_draw(const bContext *C, ARegion *region)
UI_view2d_view_restore(C);
}
-static void clip_channels_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *UNUSED(region),
- wmNotifier *UNUSED(wmn),
- const Scene *UNUSED(scene))
+static void clip_channels_region_listener(const wmRegionListenerParams *UNUSED(params))
{
}
@@ -1203,12 +1203,11 @@ static void clip_header_region_draw(const bContext *C, ARegion *region)
ED_region_header(C, region);
}
-static void clip_header_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void clip_header_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SCENE:
@@ -1246,12 +1245,11 @@ static void clip_tools_region_draw(const bContext *C, ARegion *region)
/****************** tool properties region ******************/
-static void clip_props_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void clip_props_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_WM:
@@ -1299,12 +1297,11 @@ static void clip_properties_region_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
-static void clip_properties_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void clip_properties_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_GPENCIL:
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c
index 49313005c43..bcac4d94bf0 100644
--- a/source/blender/editors/space_clip/tracking_ops.c
+++ b/source/blender/editors/space_clip/tracking_ops.c
@@ -88,17 +88,16 @@ static int add_marker_exec(bContext *C, wmOperator *op)
MovieClip *clip = ED_space_clip_get_clip(sc);
float pos[2];
+ ClipViewLockState lock_state;
+ ED_clip_view_lock_state_store(C, &lock_state);
+
RNA_float_get_array(op->ptr, "location", pos);
if (!add_marker(C, pos[0], pos[1])) {
return OPERATOR_CANCELLED;
}
- /* Reset offset from locked position, so frame jumping wouldn't be so
- * confusing.
- */
- sc->xlockof = 0;
- sc->ylockof = 0;
+ ED_clip_view_lock_state_restore_no_jump(C, &lock_state);
WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);
@@ -111,7 +110,7 @@ static int add_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event)
ARegion *region = CTX_wm_region(C);
if (!RNA_struct_property_is_set(op->ptr, "location")) {
- /* If location is not set, use mouse positio nas default. */
+ /* If location is not set, use mouse position as default. */
float co[2];
ED_clip_mouse_pos(sc, region, event->mval, co);
RNA_float_set_array(op->ptr, "location", co);
@@ -244,8 +243,6 @@ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op))
changed = true;
}
}
- /* Nothing selected now, unlock view so it can be scrolled nice again. */
- sc->flag &= ~SC_LOCK_SELECTION;
if (changed) {
WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);
}
@@ -314,11 +311,6 @@ static int delete_marker_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- if (!has_selection) {
- /* Nothing selected now, unlock view so it can be scrolled nice again. */
- sc->flag &= ~SC_LOCK_SELECTION;
- }
-
if (!changed) {
return OPERATOR_CANCELLED;
}
@@ -1225,13 +1217,6 @@ static int hide_tracks_exec(bContext *C, wmOperator *op)
clip->tracking.act_plane_track = NULL;
}
- if (unselected == 0) {
- /* No selection on screen now, unlock view so it can be
- * scrolled nice again.
- */
- sc->flag &= ~SC_LOCK_SELECTION;
- }
-
BKE_tracking_dopesheet_tag_update(tracking);
WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, NULL);
@@ -1490,6 +1475,97 @@ void CLIP_OT_join_tracks(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
+/********************** Average tracks operator *********************/
+
+static int average_tracks_exec(bContext *C, wmOperator *op)
+{
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+ MovieClip *clip = ED_space_clip_get_clip(space_clip);
+ MovieTracking *tracking = &clip->tracking;
+
+ /* Collect source tracks. */
+ int num_source_tracks;
+ MovieTrackingTrack **source_tracks = BKE_tracking_selected_tracks_in_active_object(
+ tracking, &num_source_tracks);
+ if (num_source_tracks == 0) {
+ return OPERATOR_CANCELLED;
+ }
+
+ /* Create new empty track, which will be the averaged result.
+ * Makes it simple to average all selection to it. */
+ ListBase *tracks_list = BKE_tracking_get_active_tracks(tracking);
+ MovieTrackingTrack *result_track = BKE_tracking_track_add_empty(tracking, tracks_list);
+
+ /* Perform averaging. */
+ BKE_tracking_tracks_average(result_track, source_tracks, num_source_tracks);
+
+ const bool keep_original = RNA_boolean_get(op->ptr, "keep_original");
+ if (!keep_original) {
+ for (int i = 0; i < num_source_tracks; i++) {
+ clip_delete_track(C, clip, source_tracks[i]);
+ }
+ }
+
+ /* Update selection, making the result track active and selected. */
+ /* TODO(sergey): Should become some sort of utility function available for all operators. */
+
+ BKE_tracking_track_select(tracks_list, result_track, TRACK_AREA_ALL, 0);
+ ListBase *plane_tracks_list = BKE_tracking_get_active_plane_tracks(tracking);
+ BKE_tracking_plane_tracks_deselect_all(plane_tracks_list);
+
+ clip->tracking.act_track = result_track;
+ clip->tracking.act_plane_track = NULL;
+
+ /* Inform the dependency graph and interface about changes. */
+ DEG_id_tag_update(&clip->id, 0);
+ WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);
+
+ /* Free memory. */
+ MEM_freeN(source_tracks);
+
+ return OPERATOR_FINISHED;
+}
+
+static int average_tracks_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+ PropertyRNA *prop_keep_original = RNA_struct_find_property(op->ptr, "keep_original");
+ if (!RNA_property_is_set(op->ptr, prop_keep_original)) {
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+ MovieClip *clip = ED_space_clip_get_clip(space_clip);
+ MovieTracking *tracking = &clip->tracking;
+
+ const int num_selected_tracks = BKE_tracking_count_selected_tracks_in_active_object(tracking);
+
+ if (num_selected_tracks == 1) {
+ RNA_property_boolean_set(op->ptr, prop_keep_original, false);
+ }
+ }
+
+ return average_tracks_exec(C, op);
+}
+
+void CLIP_OT_average_tracks(wmOperatorType *ot)
+{
+ /* Identifiers. */
+ ot->name = "Average Tracks";
+ ot->description = "Average selected tracks into active";
+ ot->idname = "CLIP_OT_average_tracks";
+
+ /* API callbacks. */
+ ot->exec = average_tracks_exec;
+ ot->invoke = average_tracks_invoke;
+ ot->poll = ED_space_clip_tracking_poll;
+
+ /* Flags. */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* Properties. */
+ PropertyRNA *prop;
+
+ prop = RNA_def_boolean(ot->srna, "keep_original", 1, "Keep Original", "Keep original tracks");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+}
+
/********************** lock tracks operator *********************/
enum {
diff --git a/source/blender/editors/space_clip/tracking_ops_detect.c b/source/blender/editors/space_clip/tracking_ops_detect.c
index 54ec439471d..86ee94df731 100644
--- a/source/blender/editors/space_clip/tracking_ops_detect.c
+++ b/source/blender/editors/space_clip/tracking_ops_detect.c
@@ -21,14 +21,10 @@
* \ingroup spclip
*/
-#include "MEM_guardedalloc.h"
-
#include "DNA_gpencil_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
-#include "BLI_utildefines.h"
-
#include "BKE_context.h"
#include "BKE_movieclip.h"
#include "BKE_report.h"
diff --git a/source/blender/editors/space_clip/tracking_ops_stabilize.c b/source/blender/editors/space_clip/tracking_ops_stabilize.c
index 5e43b7c7ec6..d0b4d18c6d9 100644
--- a/source/blender/editors/space_clip/tracking_ops_stabilize.c
+++ b/source/blender/editors/space_clip/tracking_ops_stabilize.c
@@ -21,8 +21,6 @@
* \ingroup spclip
*/
-#include "MEM_guardedalloc.h"
-
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
diff --git a/source/blender/editors/space_clip/tracking_ops_track.c b/source/blender/editors/space_clip/tracking_ops_track.c
index 585b13b426e..e480ec2db05 100644
--- a/source/blender/editors/space_clip/tracking_ops_track.c
+++ b/source/blender/editors/space_clip/tracking_ops_track.c
@@ -30,7 +30,6 @@
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_movieclip.h"
-#include "BKE_report.h"
#include "BKE_tracking.h"
#include "WM_api.h"
diff --git a/source/blender/editors/space_clip/tracking_ops_utils.c b/source/blender/editors/space_clip/tracking_ops_utils.c
index 1f959e94309..0f6bd6e039a 100644
--- a/source/blender/editors/space_clip/tracking_ops_utils.c
+++ b/source/blender/editors/space_clip/tracking_ops_utils.c
@@ -21,12 +21,8 @@
* \ingroup spclip
*/
-#include "MEM_guardedalloc.h"
-
#include "DNA_space_types.h"
-#include "BLI_utildefines.h"
-
#include "BKE_context.h"
#include "BKE_tracking.h"
diff --git a/source/blender/editors/space_clip/tracking_select.c b/source/blender/editors/space_clip/tracking_select.c
index 063ea9592aa..558c0bec11d 100644
--- a/source/blender/editors/space_clip/tracking_select.c
+++ b/source/blender/editors/space_clip/tracking_select.c
@@ -304,6 +304,9 @@ static int mouse_select(bContext *C, const float co[2], const bool extend, const
track = find_nearest_track(sc, tracksbase, co, &distance_to_track);
plane_track = find_nearest_plane_track(sc, plane_tracks_base, co, &distance_to_plane_track);
+ ClipViewLockState lock_state;
+ ED_clip_view_lock_state_store(C, &lock_state);
+
/* Do not select beyond some reasonable distance, that is useless and
* prevents the 'deselect on nothing' behavior. */
if (distance_to_track > 0.05f) {
@@ -377,10 +380,7 @@ static int mouse_select(bContext *C, const float co[2], const bool extend, const
ED_mask_deselect_all(C);
}
- if (!extend) {
- sc->xlockof = 0.0f;
- sc->ylockof = 0.0f;
- }
+ ED_clip_view_lock_state_restore_no_jump(C, &lock_state);
BKE_tracking_dopesheet_tag_update(tracking);
@@ -867,14 +867,16 @@ static int select_all_exec(bContext *C, wmOperator *op)
MovieClip *clip = ED_space_clip_get_clip(sc);
MovieTracking *tracking = &clip->tracking;
- int action = RNA_enum_get(op->ptr, "action");
+ const int action = RNA_enum_get(op->ptr, "action");
- bool has_selection = false;
+ ClipViewLockState lock_state;
+ ED_clip_view_lock_state_store(C, &lock_state);
+ bool has_selection = false;
ED_clip_select_all(sc, action, &has_selection);
- if (!has_selection) {
- sc->flag &= ~SC_LOCK_SELECTION;
+ if (has_selection) {
+ ED_clip_view_lock_state_restore_no_jump(C, &lock_state);
}
BKE_tracking_dopesheet_tag_update(tracking);
diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c
index 77f1111624d..05595e0b393 100644
--- a/source/blender/editors/space_console/console_ops.c
+++ b/source/blender/editors/space_console/console_ops.c
@@ -18,7 +18,7 @@
* \ingroup spconsole
*/
-#include <ctype.h> /* ispunct */
+#include <ctype.h> /* #ispunct */
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
@@ -749,7 +749,7 @@ static int console_clear_exec(bContext *C, wmOperator *op)
/*ConsoleLine *ci = */ console_history_verify(C);
- if (scrollback) { /* last item in mistory */
+ if (scrollback) { /* Last item in history. */
while (sc->scrollback.first) {
console_scrollback_free(sc, sc->scrollback.first);
}
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
index 9b8e9e0e871..56a6204b385 100644
--- a/source/blender/editors/space_console/space_console.c
+++ b/source/blender/editors/space_console/space_console.c
@@ -41,7 +41,6 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "GPU_framebuffer.h"
#include "console_intern.h" /* own include */
/* ******************** default callbacks for console space ***************** */
@@ -197,8 +196,8 @@ static void console_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("Console", SPACE_CONSOLE, RGN_TYPE_WINDOW);
- WM_dropbox_add(lb, "CONSOLE_OT_insert", id_drop_poll, id_drop_copy);
- WM_dropbox_add(lb, "CONSOLE_OT_insert", path_drop_poll, path_drop_copy);
+ WM_dropbox_add(lb, "CONSOLE_OT_insert", id_drop_poll, id_drop_copy, NULL);
+ WM_dropbox_add(lb, "CONSOLE_OT_insert", path_drop_poll, path_drop_copy, NULL);
}
/* ************* end drop *********** */
@@ -216,7 +215,7 @@ static void console_main_region_draw(const bContext *C, ARegion *region)
/* clear and setup matrix */
UI_ThemeClearColor(TH_BACK);
- /* worlks best with no view2d matrix set */
+ /* Works best with no view2d matrix set. */
UI_view2d_view_ortho(v2d);
/* data... */
@@ -273,13 +272,11 @@ static void console_header_region_draw(const bContext *C, ARegion *region)
ED_region_header(C, region);
}
-static void console_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void console_main_region_listener(const wmRegionListenerParams *params)
{
- // SpaceInfo *sinfo = area->spacedata.first;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
/* context changes */
switch (wmn->category) {
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 8e9093151ba..c1dcf2e56d3 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -131,7 +131,15 @@ static void draw_tile(int sx, int sy, int width, int height, int colorid, int sh
UI_GetThemeColorShade4fv(colorid, shade, color);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_aa(
- true, (float)sx, (float)(sy - height), (float)(sx + width), (float)sy, 5.0f, color);
+ &(const rctf){
+ .xmin = (float)sx,
+ .xmax = (float)(sx + width),
+ .ymin = (float)(sy - height),
+ .ymax = (float)sy,
+ },
+ true,
+ 5.0f,
+ color);
}
static void file_draw_icon(uiBlock *block,
@@ -465,7 +473,7 @@ static void file_draw_preview(uiBlock *block,
but = uiDefBut(block, UI_BTYPE_LABEL, 0, "", xco, yco, ex, ey, NULL, 0.0, 0.0, 0, 0, NULL);
- /* dragregion */
+ /* Drag-region. */
if (drag) {
ID *id;
@@ -546,7 +554,7 @@ static void draw_background(FileLayout *layout, View2D *v2d)
for (i = 2; (i <= layout->rows + 1); i += 2) {
sy = (int)v2d->cur.ymax - layout->offset_top - i * item_height - layout->tile_border_y;
- /* Offsett pattern slightly to add scroll effect. */
+ /* Offset pattern slightly to add scroll effect. */
sy += round_fl_to_int(item_height * (v2d->tot.ymax - v2d->cur.ymax) / item_height);
immRectf(pos,
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 1ba9716a194..985c92f19b6 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -2230,8 +2230,7 @@ static int file_directory_new_exec(bContext *C, wmOperator *op)
params->rename_flag = FILE_PARAMS_RENAME_PENDING;
}
- /* set timer to smoothly view newly generated file */
- /* max 30 frs/sec */
+ /* Set timer to smoothly view newly generated file. */
if (sfile->smoothscroll_timer != NULL) {
WM_event_remove_timer(wm, CTX_wm_window(C), sfile->smoothscroll_timer);
}
diff --git a/source/blender/editors/space_file/file_utils.c b/source/blender/editors/space_file/file_utils.c
index 9d85996c559..186bc04fafe 100644
--- a/source/blender/editors/space_file/file_utils.c
+++ b/source/blender/editors/space_file/file_utils.c
@@ -19,7 +19,6 @@
*/
#include "BLI_fileops.h"
-#include "BLI_listbase.h"
#include "BLI_path_util.h"
#include "BLI_rect.h"
#include "BLI_string.h"
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index d66219c7549..33c37875372 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -276,6 +276,7 @@ typedef struct FileListInternEntry {
char *redirection_path;
/** not strictly needed, but used during sorting, avoids to have to recompute it there... */
char *name;
+ bool free_name;
/**
* This is data from the current main, represented by this file. It's crucial that this is
@@ -1366,7 +1367,7 @@ static bool filelist_checkdir_main_assets(struct FileList *UNUSED(filelist),
static void filelist_entry_clear(FileDirEntry *entry)
{
- if (entry->name) {
+ if (entry->name && ((entry->flags & FILE_ENTRY_NAME_FREE) != 0)) {
MEM_freeN(entry->name);
}
if (entry->description) {
@@ -1451,7 +1452,7 @@ static void filelist_intern_entry_free(FileListInternEntry *entry)
if (entry->redirection_path) {
MEM_freeN(entry->redirection_path);
}
- if (entry->name) {
+ if (entry->name && entry->free_name) {
MEM_freeN(entry->name);
}
/* If we own the asset-data (it was generated from external file data), free it. */
@@ -1953,7 +1954,13 @@ static FileDirEntry *filelist_file_create_entry(FileList *filelist, const int in
ret->entry = rev;
ret->relpath = BLI_strdup(entry->relpath);
- ret->name = BLI_strdup(entry->name);
+ if (entry->free_name) {
+ ret->name = BLI_strdup(entry->name);
+ ret->flags |= FILE_ENTRY_NAME_FREE;
+ }
+ else {
+ ret->name = entry->name;
+ }
ret->description = BLI_strdupcat(filelist->filelist.root, entry->relpath);
memcpy(ret->uuid, entry->uuid, sizeof(ret->uuid));
ret->blentype = entry->blentype;
@@ -3175,6 +3182,7 @@ static void filelist_readjob_do(const bool do_lib,
entry->relpath = BLI_strdup(dir + 2); /* + 2 to remove '//'
* added by BLI_path_rel to rel_subdir. */
entry->name = BLI_strdup(fileentry_uiname(root, entry->relpath, entry->typeflag, dir));
+ entry->free_name = true;
/* Here we decide whether current filedirentry is to be listed too, or not. */
if (max_recursion && (is_lib || (recursion_level <= max_recursion))) {
@@ -3288,7 +3296,8 @@ static void filelist_readjob_main_assets(Main *current_main,
entry = MEM_callocN(sizeof(*entry), __func__);
entry->relpath = BLI_strdup(id_code_name);
- entry->name = BLI_strdup(id_iter->name + 2);
+ entry->name = id_iter->name + 2;
+ entry->free_name = false;
entry->typeflag |= FILE_TYPE_BLENDERLIB | FILE_TYPE_ASSET;
entry->blentype = GS(id_iter->name);
*((uint32_t *)entry->uuid) = atomic_add_and_fetch_uint32(
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 6b74b344375..6917893ab5f 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -280,7 +280,7 @@ static FileSelectParams *fileselect_ensure_updated_file_params(SpaceFile *sfile)
params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_VOLUME : 0;
}
if ((prop = RNA_struct_find_property(op->ptr, "filter_glob"))) {
- /* Protection against pyscripts not setting proper size limit... */
+ /* Protection against Python scripts not setting proper size limit. */
char *tmp = RNA_property_string_get_alloc(
op->ptr, prop, params->filter_glob, sizeof(params->filter_glob), NULL);
if (tmp != params->filter_glob) {
@@ -418,7 +418,7 @@ static void fileselect_refresh_asset_params(FileAssetSelectParams *asset_params)
FileSelectParams *base_params = &asset_params->base_params;
bUserAssetLibrary *user_library = NULL;
- /* Ensure valid repo, or fall-back to local one. */
+ /* Ensure valid repository, or fall-back to local one. */
if (library->type == FILE_ASSET_LIBRARY_CUSTOM) {
BLI_assert(library->custom_library_index >= 0);
@@ -460,7 +460,7 @@ bool ED_fileselect_is_asset_browser(const SpaceFile *sfile)
void ED_fileselect_window_params_get(const wmWindow *win, int win_size[2], bool *is_maximized)
{
- /* Get DPI/pixelsize independent size to be stored in preferences. */
+ /* Get DPI/pixel-size independent size to be stored in preferences. */
WM_window_set_dpi(win); /* Ensure the DPI is taken from the right window. */
win_size[0] = WM_window_pixels_x(win) / UI_DPI_FAC;
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index 7f33b0212d6..66d24c7ab53 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -104,6 +104,7 @@ static ARegion *file_tool_props_region_ensure(ScrArea *area, ARegion *region_pre
BLI_insertlinkafter(&area->regionbase, region_prev, region);
region->regiontype = RGN_TYPE_TOOL_PROPS;
region->alignment = RGN_ALIGN_RIGHT;
+ region->flag = RGN_FLAG_HIDDEN;
return region;
}
@@ -246,13 +247,13 @@ static void file_ensure_valid_region_state(bContext *C,
BLI_assert(region_tools);
if (sfile->browse_mode == FILE_BROWSE_MODE_ASSETS) {
- ARegion *region_execute = file_execute_region_ensure(area, region_tools);
- ARegion *region_props = file_tool_props_region_ensure(area, region_execute);
-
- /* Hide specific regions by default. */
- region_props->flag |= RGN_FLAG_HIDDEN;
- region_execute->flag |= RGN_FLAG_HIDDEN;
+ file_tool_props_region_ensure(area, region_tools);
+ ARegion *region_execute = BKE_area_find_region_type(area, RGN_TYPE_EXECUTE);
+ if (region_execute) {
+ ED_region_remove(C, area, region_execute);
+ needs_init = true;
+ }
ARegion *region_ui = BKE_area_find_region_type(area, RGN_TYPE_UI);
if (region_ui) {
ED_region_remove(C, area, region_ui);
@@ -260,7 +261,7 @@ static void file_ensure_valid_region_state(bContext *C,
}
}
/* If there's an file-operation, ensure we have the option and execute region */
- else if (sfile->op) {
+ else if (sfile->op && !BKE_area_find_region_type(area, RGN_TYPE_TOOL_PROPS)) {
ARegion *region_ui = file_ui_region_ensure(area, region_tools);
ARegion *region_execute = file_execute_region_ensure(area, region_ui);
ARegion *region_props = file_tool_props_region_ensure(area, region_execute);
@@ -275,17 +276,18 @@ static void file_ensure_valid_region_state(bContext *C,
needs_init = true;
}
/* If there's _no_ file-operation, ensure we _don't_ have the option and execute region */
- else {
+ else if (!sfile->op) {
ARegion *region_props = BKE_area_find_region_type(area, RGN_TYPE_TOOL_PROPS);
ARegion *region_execute = BKE_area_find_region_type(area, RGN_TYPE_EXECUTE);
ARegion *region_ui = file_ui_region_ensure(area, region_tools);
UNUSED_VARS(region_ui);
+ if (region_execute) {
+ ED_region_remove(C, area, region_execute);
+ needs_init = true;
+ }
if (region_props) {
- BLI_assert(region_execute);
-
ED_region_remove(C, area, region_props);
- ED_region_remove(C, area, region_execute);
needs_init = true;
}
}
@@ -390,11 +392,10 @@ static void file_refresh(const bContext *C, ScrArea *area)
ED_area_tag_redraw(area);
}
-static void file_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void file_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
SpaceFile *sfile = (SpaceFile *)area->spacedata.first;
/* context changes */
@@ -445,12 +446,11 @@ static void file_main_region_init(wmWindowManager *wm, ARegion *region)
WM_event_add_keymap_handler_v2d_mask(&region->handlers, keymap);
}
-static void file_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void file_main_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SPACE:
@@ -463,19 +463,24 @@ static void file_main_region_listener(wmWindow *UNUSED(win),
break;
}
break;
+ case NC_ID:
+ if (ELEM(wmn->action, NA_RENAME)) {
+ /* In case the filelist shows ID names. */
+ ED_region_tag_redraw(region);
+ }
+ break;
}
}
-static void file_main_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *UNUSED(scene),
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void file_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ bScreen *screen = params->screen;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
SpaceFile *sfile = area->spacedata.first;
- FileSelectParams *params = ED_fileselect_ensure_active_params(sfile);
+
+ FileSelectParams *file_params = ED_fileselect_ensure_active_params(sfile);
/* This is a bit odd that a region owns the subscriber for an area,
* keep for now since all subscribers for WM are regions.
* May be worth re-visiting later. */
@@ -497,7 +502,7 @@ static void file_main_region_message_subscribe(const struct bContext *UNUSED(C),
/* FileSelectParams */
{
PointerRNA ptr;
- RNA_pointer_create(&screen->id, &RNA_FileSelectParams, params, &ptr);
+ RNA_pointer_create(&screen->id, &RNA_FileSelectParams, file_params, &ptr);
/* All properties for this space type. */
WM_msg_subscribe_rna(mbus, &ptr, NULL, &msg_sub_value_area_tag_refresh, __func__);
@@ -647,18 +652,23 @@ static void file_tools_region_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
-static void file_tools_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *UNUSED(region),
- wmNotifier *UNUSED(wmn),
- const Scene *UNUSED(scene))
+static void file_tools_region_listener(const wmRegionListenerParams *UNUSED(params))
{
-#if 0
- /* context changes */
+}
+
+static void file_tool_props_region_listener(const wmRegionListenerParams *params)
+{
+ const wmNotifier *wmn = params->notifier;
+ ARegion *region = params->region;
+
switch (wmn->category) {
- /* pass */
+ case NC_ID:
+ if (ELEM(wmn->action, NA_RENAME)) {
+ /* In case the filelist shows ID names. */
+ ED_region_tag_redraw(region);
+ }
+ break;
}
-#endif
}
/* add handlers, stuff you only do once or on area/region changes */
@@ -715,12 +725,11 @@ static void file_execution_region_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
-static void file_ui_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void file_ui_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SPACE:
@@ -757,7 +766,7 @@ static void file_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("Window", SPACE_EMPTY, RGN_TYPE_WINDOW);
- WM_dropbox_add(lb, "FILE_OT_filepath_drop", filepath_drop_poll, filepath_drop_copy);
+ WM_dropbox_add(lb, "FILE_OT_filepath_drop", filepath_drop_poll, filepath_drop_copy, NULL);
}
static int file_space_subtype_get(ScrArea *area)
@@ -928,7 +937,7 @@ void ED_spacetype_file(void)
art->prefsizex = 240;
art->prefsizey = 60;
art->keymapflag = ED_KEYMAP_UI;
- art->listener = file_tools_region_listener;
+ art->listener = file_tool_props_region_listener;
art->init = file_tools_region_init;
art->draw = file_tools_region_draw;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index 51be5afafe5..d88bf8750c2 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -105,6 +105,16 @@ static bool graph_panel_context(const bContext *C, bAnimListElem **ale, FCurve *
return true;
}
+FCurve *ANIM_graph_context_fcurve(const bContext *C)
+{
+ FCurve *fcu;
+ if (!graph_panel_context(C, NULL, &fcu)) {
+ return NULL;
+ }
+
+ return fcu;
+}
+
static bool graph_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
return graph_panel_context(C, NULL, NULL);
@@ -1312,6 +1322,16 @@ static void graph_panel_drivers_popover(const bContext *C, Panel *panel)
/* All the drawing code is in editors/animation/fmodifier_ui.c */
#define B_FMODIFIER_REDRAW 20
+/** The start of FModifier panels registered for the graph editor. */
+#define GRAPH_FMODIFIER_PANEL_PREFIX "GRAPH"
+
+static void graph_fmodifier_panel_id(void *fcm_link, char *r_name)
+{
+ FModifier *fcm = (FModifier *)fcm_link;
+ eFModifier_Types type = fcm->type;
+ const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type);
+ BLI_snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_%s", GRAPH_FMODIFIER_PANEL_PREFIX, fmi->name);
+}
static void do_graph_region_modifier_buttons(bContext *C, void *UNUSED(arg), int event)
{
@@ -1327,10 +1347,8 @@ static void graph_panel_modifiers(const bContext *C, Panel *panel)
{
bAnimListElem *ale;
FCurve *fcu;
- FModifier *fcm;
- uiLayout *col, *row;
+ uiLayout *row;
uiBlock *block;
- bool active;
if (!graph_panel_context(C, &ale, &fcu)) {
return;
@@ -1355,14 +1373,7 @@ static void graph_panel_modifiers(const bContext *C, Panel *panel)
uiItemO(row, "", ICON_PASTEDOWN, "GRAPH_OT_fmodifier_paste");
}
- active = !(fcu->flag & FCURVE_MOD_OFF);
- /* draw each modifier */
- for (fcm = fcu->modifiers.first; fcm; fcm = fcm->next) {
- col = uiLayoutColumn(panel->layout, true);
- uiLayoutSetActive(col, active);
-
- ANIM_uiTemplate_fmodifier_draw(col, ale->fcurve_owner_id, &fcu->modifiers, fcm);
- }
+ ANIM_fmodifier_panels(C, ale->fcurve_owner_id, &fcu->modifiers, graph_fmodifier_panel_id);
MEM_freeN(ale);
}
@@ -1426,10 +1437,14 @@ void graph_buttons_register(ARegionType *art)
strcpy(pt->label, N_("Modifiers"));
strcpy(pt->category, "Modifiers");
strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+ pt->flag = PANEL_TYPE_NO_HEADER;
pt->draw = graph_panel_modifiers;
pt->poll = graph_panel_poll;
BLI_addtail(&art->paneltypes, pt);
+ ANIM_modifier_panels_register_graph_and_NLA(art, GRAPH_FMODIFIER_PANEL_PREFIX, graph_panel_poll);
+ ANIM_modifier_panels_register_graph_only(art, GRAPH_FMODIFIER_PANEL_PREFIX, graph_panel_poll);
+
pt = MEM_callocN(sizeof(PanelType), "spacetype graph panel view");
strcpy(pt->idname, "GRAPH_PT_view");
strcpy(pt->label, N_("Show Cursor"));
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index 33e724459a9..4752f62b58c 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -57,7 +57,6 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu);
/* -------------------------------------------------------------------- */
/** \name Utility Drawing Defines
- *
* \{ */
/* determine the alpha value that should be used when
@@ -73,7 +72,6 @@ static float fcurve_display_alpha(FCurve *fcu)
/* -------------------------------------------------------------------- */
/** \name FCurve Modifier Drawing
- *
* \{ */
/* Envelope -------------- */
@@ -153,7 +151,6 @@ static void draw_fcurve_modifier_controls_envelope(FModifier *fcm,
/* -------------------------------------------------------------------- */
/** \name FCurve Modifier Drawing
- *
* \{ */
/* Points ---------------- */
@@ -1343,7 +1340,6 @@ void graph_draw_curves(bAnimContext *ac, SpaceGraph *sipo, ARegion *region, shor
/* -------------------------------------------------------------------- */
/** \name Channel List
- *
* \{ */
/* left hand part */
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index fac38ef7b91..31f606e515d 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -178,7 +178,7 @@ static void insert_graph_keys(bAnimContext *ac, eGraphKeys_InsertKey_Types mode)
x = (float)CFRA;
}
- /* Normalise units of cursor's value. */
+ /* Normalize units of cursor's value. */
if (sipo) {
y = (sipo->cursorVal / unit_scale) - offset;
}
@@ -2263,7 +2263,7 @@ static void snap_graph_keys(bAnimContext *ac, short mode)
for (ale = anim_data.first; ale; ale = ale->next) {
AnimData *adt = ANIM_nla_mapping_get(ac, ale);
- /* Normalise cursor value (for normalised F-Curves display). */
+ /* Normalize cursor value (for normalized F-Curves display). */
if (mode == GRAPHKEYS_SNAP_VALUE) {
short mapping_flag = ANIM_get_normalization_flags(ac);
float offset;
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index 63acc2a1774..32396a70cce 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -32,15 +32,11 @@
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_main.h"
#include "UI_view2d.h"
#include "ED_anim_api.h"
-#include "ED_markers.h"
-#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
#include "ED_transform.h"
#include "graph_intern.h"
diff --git a/source/blender/editors/space_graph/graph_slider_ops.c b/source/blender/editors/space_graph/graph_slider_ops.c
index 4cda6b34a01..3e52dc7377b 100644
--- a/source/blender/editors/space_graph/graph_slider_ops.c
+++ b/source/blender/editors/space_graph/graph_slider_ops.c
@@ -380,7 +380,7 @@ static int graphkeys_decimate_modal(bContext *C, wmOperator *op, const wmEvent *
break;
}
- /* Unhandled event - maybe it was some view manip? */
+ /* Unhandled event - maybe it was some view manipulation? */
/* Allow to pass through. */
return OPERATOR_RUNNING_MODAL | OPERATOR_PASS_THROUGH;
}
@@ -505,15 +505,15 @@ void GRAPH_OT_decimate(wmOperatorType *ot)
"Mode",
"Which mode to use for decimation");
- RNA_def_float_percentage(ot->srna,
- "remove_ratio",
- 1.0f / 3.0f,
- 0.0f,
- 1.0f,
- "Remove",
- "The percentage of keyframes to remove",
- 0.0f,
- 1.0f);
+ RNA_def_float_factor(ot->srna,
+ "remove_ratio",
+ 1.0f / 3.0f,
+ 0.0f,
+ 1.0f,
+ "Remove",
+ "The ratio of remaining keyframes after the operation",
+ 0.0f,
+ 1.0f);
RNA_def_float(ot->srna,
"remove_error_margin",
0.0f,
diff --git a/source/blender/editors/space_graph/graph_utils.c b/source/blender/editors/space_graph/graph_utils.c
index 8463c21b1ad..c37d9f42c12 100644
--- a/source/blender/editors/space_graph/graph_utils.c
+++ b/source/blender/editors/space_graph/graph_utils.c
@@ -38,8 +38,6 @@
#include "BKE_fcurve.h"
#include "BKE_screen.h"
-#include "WM_api.h"
-
#include "ED_anim_api.h"
#include "ED_screen.h"
#include "UI_interface.h"
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index 791039498e8..9f01773eadf 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -403,12 +403,11 @@ static void graph_buttons_region_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
-static void graph_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void graph_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
@@ -470,14 +469,14 @@ static void graph_region_listener(wmWindow *UNUSED(win),
}
}
-static void graph_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void graph_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ Scene *scene = params->scene;
+ bScreen *screen = params->screen;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+
PointerRNA ptr;
RNA_pointer_create(&screen->id, &RNA_SpaceGraphEditor, area->spacedata.first, &ptr);
@@ -546,11 +545,10 @@ static void graph_region_message_subscribe(const struct bContext *UNUSED(C),
}
/* editor level listener */
-static void graph_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void graph_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
SpaceGraph *sipo = (SpaceGraph *)area->spacedata.first;
/* context changes */
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index 63e5ae64a8c..67d5055ec65 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -466,7 +466,7 @@ static void sima_draw_zbuf_pixels(
{
const float red[4] = {1.0f, 0.0f, 0.0f, 0.0f};
- /* Slowwww */
+ /* Very slow! */
float *rectf = MEM_mallocN(rectx * recty * sizeof(float), "temp");
for (int a = rectx * recty - 1; a >= 0; a--) {
/* zbuffer values are signed, so we need to shift color range */
@@ -874,7 +874,7 @@ void draw_image_main(const bContext *C, ARegion *region)
if (show_stereo3d) {
if (show_multilayer) {
- /* update multiindex and pass for the current eye */
+ /* Update multi-index and pass for the current eye. */
BKE_image_multilayer_index(ima->rr, &sima->iuser);
}
else {
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index 100556ad29a..0044c6072a4 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -71,6 +71,7 @@ void IMAGE_OT_save_all_modified(struct wmOperatorType *ot);
void IMAGE_OT_pack(struct wmOperatorType *ot);
void IMAGE_OT_unpack(struct wmOperatorType *ot);
+void IMAGE_OT_flip(struct wmOperatorType *ot);
void IMAGE_OT_invert(struct wmOperatorType *ot);
void IMAGE_OT_resize(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 86e52814d6f..4008ca228ac 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -36,9 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_fileops.h"
-#include "BLI_fileops_types.h"
#include "BLI_ghash.h"
-#include "BLI_linklist.h"
#include "BLI_math.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
@@ -48,7 +46,6 @@
#include "DNA_camera_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
-#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -62,14 +59,10 @@
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_packedFile.h"
-#include "BKE_paint.h"
#include "BKE_report.h"
-#include "BKE_scene.h"
-#include "BKE_screen.h"
#include "DEG_depsgraph.h"
-#include "GPU_immediate.h"
#include "GPU_state.h"
#include "IMB_colormanagement.h"
@@ -467,7 +460,7 @@ static void image_view_zoom_init(bContext *C, wmOperator *op, const wmEvent *eve
UI_view2d_region_to_view(
&region->v2d, event->mval[0], event->mval[1], &vpd->location[0], &vpd->location[1]);
- if (U.viewzoom == USER_ZOOM_CONT) {
+ if (U.viewzoom == USER_ZOOM_CONTINUE) {
/* needs a timer to continue redrawing */
vpd->timer = WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
vpd->timer_lastdraw = PIL_check_seconds_timer();
@@ -579,12 +572,10 @@ static void image_zoom_apply(ViewZoomData *vpd,
delta = -delta;
}
- if (viewzoom == USER_ZOOM_CONT) {
+ if (viewzoom == USER_ZOOM_CONTINUE) {
double time = PIL_check_seconds_timer();
float time_step = (float)(time - vpd->timer_lastdraw);
float zfac;
-
- /* oldstyle zoom */
zfac = 1.0f + ((delta / 20.0f) * time_step);
vpd->timer_lastdraw = time;
/* this is the final zoom, but instead make it into a factor */
@@ -900,7 +891,7 @@ static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
}
}
else if (ED_space_image_check_show_maskedit(sima, obedit)) {
- if (!ED_mask_selected_minmax(C, min, max)) {
+ if (!ED_mask_selected_minmax(C, min, max, false)) {
return OPERATOR_CANCELLED;
}
}
@@ -2663,6 +2654,126 @@ void IMAGE_OT_new(wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
+/** \name Flip Operator
+ * \{ */
+
+static int image_flip_exec(bContext *C, wmOperator *op)
+{
+ Image *ima = image_from_context(C);
+ ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, NULL);
+ SpaceImage *sima = CTX_wm_space_image(C);
+ const bool is_paint = ((sima != NULL) && (sima->mode == SI_MODE_PAINT));
+
+ if (ibuf == NULL) {
+ /* TODO: this should actually never happen, but does for render-results -> cleanup. */
+ return OPERATOR_CANCELLED;
+ }
+
+ const bool flip_horizontal = RNA_boolean_get(op->ptr, "use_flip_horizontal");
+ const bool flip_vertical = RNA_boolean_get(op->ptr, "use_flip_vertical");
+
+ if (!flip_horizontal && !flip_vertical) {
+ BKE_image_release_ibuf(ima, ibuf, NULL);
+ return OPERATOR_FINISHED;
+ }
+
+ ED_image_undo_push_begin_with_image(op->type->name, ima, ibuf, &sima->iuser);
+
+ if (is_paint) {
+ ED_imapaint_clear_partial_redraw();
+ }
+
+ const int size_x = ibuf->x;
+ const int size_y = ibuf->y;
+
+ if (ibuf->rect_float) {
+ float *float_pixels = (float *)ibuf->rect_float;
+
+ float *orig_float_pixels = MEM_dupallocN(float_pixels);
+ for (int x = 0; x < size_x; x++) {
+ for (int y = 0; y < size_y; y++) {
+ const int source_pixel_x = flip_horizontal ? size_x - x - 1 : x;
+ const int source_pixel_y = flip_vertical ? size_y - y - 1 : y;
+
+ float *source_pixel = &orig_float_pixels[4 * (source_pixel_x + source_pixel_y * size_x)];
+ float *target_pixel = &float_pixels[4 * (x + y * size_x)];
+
+ copy_v4_v4(target_pixel, source_pixel);
+ }
+ }
+ MEM_freeN(orig_float_pixels);
+
+ if (ibuf->rect) {
+ IMB_rect_from_float(ibuf);
+ }
+ }
+ else if (ibuf->rect) {
+ char *char_pixels = (char *)ibuf->rect;
+ char *orig_char_pixels = MEM_dupallocN(char_pixels);
+ for (int x = 0; x < size_x; x++) {
+ for (int y = 0; y < size_y; y++) {
+ const int source_pixel_x = flip_horizontal ? size_x - x - 1 : x;
+ const int source_pixel_y = flip_vertical ? size_y - y - 1 : y;
+
+ char *source_pixel = &orig_char_pixels[4 * (source_pixel_x + source_pixel_y * size_x)];
+ char *target_pixel = &char_pixels[4 * (x + y * size_x)];
+
+ copy_v4_v4_char(target_pixel, source_pixel);
+ }
+ }
+ MEM_freeN(orig_char_pixels);
+ }
+ else {
+ BKE_image_release_ibuf(ima, ibuf, NULL);
+ return OPERATOR_CANCELLED;
+ }
+
+ ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID;
+ BKE_image_mark_dirty(ima, ibuf);
+
+ if (ibuf->mipmap[0]) {
+ ibuf->userflags |= IB_MIPMAP_INVALID;
+ }
+
+ ED_image_undo_push_end();
+
+ /* force GPU re-upload, all image is invalid. */
+ BKE_image_free_gputextures(ima);
+
+ WM_event_add_notifier(C, NC_IMAGE | NA_EDITED, ima);
+
+ BKE_image_release_ibuf(ima, ibuf, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void IMAGE_OT_flip(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Flip Image";
+ ot->idname = "IMAGE_OT_flip";
+ ot->description = "Flip the image";
+
+ /* api callbacks */
+ ot->exec = image_flip_exec;
+ ot->poll = image_from_context_has_data_poll_no_image_user;
+
+ /* properties */
+ PropertyRNA *prop;
+ prop = RNA_def_boolean(
+ ot->srna, "use_flip_horizontal", false, "Horizontal", "Flip the image horizontally");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ prop = RNA_def_boolean(
+ ot->srna, "use_flip_vertical", false, "Vertical", "Flip the image vertically");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
/** \name Invert Operators
* \{ */
@@ -2747,7 +2858,7 @@ static int image_invert_exec(bContext *C, wmOperator *op)
ED_image_undo_push_end();
- /* force GPU reupload, all image is invalid */
+ /* Force GPU re-upload, all image is invalid. */
BKE_image_free_gputextures(ima);
WM_event_add_notifier(C, NC_IMAGE | NA_EDITED, ima);
@@ -2838,7 +2949,7 @@ static int image_scale_exec(bContext *C, wmOperator *op)
ED_image_undo_push_end();
- /* force GPU reupload, all image is invalid */
+ /* Force GPU re-upload, all image is invalid. */
BKE_image_free_gputextures(ima);
DEG_id_tag_update(&ima->id, 0);
diff --git a/source/blender/editors/space_image/image_sequence.c b/source/blender/editors/space_image/image_sequence.c
index 81f2ced7dee..02546e3e3b3 100644
--- a/source/blender/editors/space_image/image_sequence.c
+++ b/source/blender/editors/space_image/image_sequence.c
@@ -27,7 +27,6 @@
#include "BLI_fileops.h"
#include "BLI_fileops_types.h"
-#include "BLI_linklist.h"
#include "BLI_listbase.h"
#include "BLI_math_base.h"
#include "BLI_path_util.h"
@@ -35,7 +34,6 @@
#include "BLI_utildefines.h"
#include "DNA_image_types.h"
-#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
#include "RNA_access.h"
@@ -45,8 +43,6 @@
#include "ED_image.h"
-#include "WM_types.h"
-
typedef struct ImageFrame {
struct ImageFrame *next, *prev;
int framenr;
diff --git a/source/blender/editors/space_image/image_undo.c b/source/blender/editors/space_image/image_undo.c
index 1d5725033e0..391c68f4231 100644
--- a/source/blender/editors/space_image/image_undo.c
+++ b/source/blender/editors/space_image/image_undo.c
@@ -947,13 +947,15 @@ static void image_undosys_step_decode_redo(ImageUndoStep *us)
}
static void image_undosys_step_decode(
- struct bContext *C, struct Main *bmain, UndoStep *us_p, int dir, bool is_final)
+ struct bContext *C, struct Main *bmain, UndoStep *us_p, const eUndoStepDir dir, bool is_final)
{
+ BLI_assert(dir != STEP_INVALID);
+
ImageUndoStep *us = (ImageUndoStep *)us_p;
- if (dir < 0) {
+ if (dir == STEP_UNDO) {
image_undosys_step_decode_undo(us, is_final);
}
- else {
+ else if (dir == STEP_REDO) {
image_undosys_step_decode_redo(us);
}
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 186f2d3a5a8..95ca8aba399 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -24,8 +24,6 @@
#include "DNA_gpencil_types.h"
#include "DNA_image_types.h"
#include "DNA_mask_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -37,14 +35,9 @@
#include "BKE_colortools.h"
#include "BKE_context.h"
-#include "BKE_editmesh.h"
#include "BKE_image.h"
-#include "BKE_layer.h"
#include "BKE_lib_id.h"
-#include "BKE_material.h"
-#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "BKE_workspace.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -56,7 +49,6 @@
#include "ED_image.h"
#include "ED_mask.h"
-#include "ED_mesh.h"
#include "ED_node.h"
#include "ED_render.h"
#include "ED_screen.h"
@@ -65,19 +57,13 @@
#include "ED_uvedit.h"
#include "WM_api.h"
-#include "WM_message.h"
#include "WM_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "GPU_batch_presets.h"
-#include "GPU_framebuffer.h"
-#include "GPU_viewport.h"
-
#include "DRW_engine.h"
-#include "DRW_engine_types.h"
#include "image_intern.h"
@@ -234,6 +220,7 @@ static void image_operatortypes(void)
WM_operatortype_append(IMAGE_OT_pack);
WM_operatortype_append(IMAGE_OT_unpack);
+ WM_operatortype_append(IMAGE_OT_flip);
WM_operatortype_append(IMAGE_OT_invert);
WM_operatortype_append(IMAGE_OT_resize);
@@ -293,7 +280,7 @@ static void image_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("Image", SPACE_IMAGE, 0);
- WM_dropbox_add(lb, "IMAGE_OT_open", image_drop_poll, image_drop_copy);
+ WM_dropbox_add(lb, "IMAGE_OT_open", image_drop_poll, image_drop_copy, NULL);
}
/**
@@ -320,8 +307,11 @@ static void image_refresh(const bContext *C, ScrArea *area)
}
}
-static void image_listener(wmWindow *win, ScrArea *area, wmNotifier *wmn, Scene *UNUSED(scene))
+static void image_listener(const wmSpaceTypeListenerParams *params)
{
+ wmWindow *win = params->window;
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
SpaceImage *sima = (SpaceImage *)area->spacedata.first;
/* context changes */
@@ -728,12 +718,12 @@ static void image_main_region_draw(const bContext *C, ARegion *region)
draw_image_cache(C, region);
}
-static void image_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void image_main_region_listener(const wmRegionListenerParams *params)
{
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_GEOM:
@@ -843,12 +833,11 @@ static void image_buttons_region_draw(const bContext *C, ARegion *region)
ED_region_panels_draw(C, region);
}
-static void image_buttons_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void image_buttons_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_TEXTURE:
@@ -906,12 +895,11 @@ static void image_tools_region_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
-static void image_tools_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void image_tools_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_GPENCIL:
@@ -963,12 +951,11 @@ static void image_header_region_draw(const bContext *C, ARegion *region)
ED_region_header(C, region);
}
-static void image_header_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void image_header_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SCENE:
diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c
index 414bce29502..be3b60d581b 100644
--- a/source/blender/editors/space_info/info_draw.c
+++ b/source/blender/editors/space_info/info_draw.c
@@ -35,7 +35,6 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "GPU_framebuffer.h"
#include "info_intern.h"
#include "textview.h"
@@ -56,47 +55,11 @@ static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc,
int shade = (tvc->iter_tmp % 2) ? 4 : -4;
UI_GetThemeColorShade4ubv(bg_id, shade, bg);
- /* Icon color and backgound depend of report type. */
+ /* Don't show icon on subsequent rows of multi-row report. */
+ *r_icon = (tvc->iter_char_begin != 0) ? ICON_NONE : UI_icon_from_report_type(report->type);
- int icon_fg_id;
- int icon_bg_id;
-
- if (tvc->iter_char_begin != 0) {
- *r_icon = ICON_NONE;
- }
- else if (report->type & RPT_ERROR_ALL) {
- icon_fg_id = TH_INFO_ERROR_TEXT;
- icon_bg_id = TH_INFO_ERROR;
- *r_icon = ICON_CANCEL;
- }
- else if (report->type & RPT_WARNING_ALL) {
- icon_fg_id = TH_INFO_WARNING_TEXT;
- icon_bg_id = TH_INFO_WARNING;
- *r_icon = ICON_ERROR;
- }
- else if (report->type & RPT_INFO_ALL) {
- icon_fg_id = TH_INFO_INFO_TEXT;
- icon_bg_id = TH_INFO_INFO;
- *r_icon = ICON_INFO;
- }
- else if (report->type & RPT_DEBUG_ALL) {
- icon_fg_id = TH_INFO_DEBUG_TEXT;
- icon_bg_id = TH_INFO_DEBUG;
- *r_icon = ICON_SYSTEM;
- }
- else if (report->type & RPT_PROPERTY) {
- icon_fg_id = TH_INFO_PROPERTY_TEXT;
- icon_bg_id = TH_INFO_PROPERTY;
- *r_icon = ICON_OPTIONS;
- }
- else if (report->type & RPT_OPERATOR) {
- icon_fg_id = TH_INFO_OPERATOR_TEXT;
- icon_bg_id = TH_INFO_OPERATOR;
- *r_icon = ICON_CHECKMARK;
- }
- else {
- *r_icon = ICON_NONE;
- }
+ int icon_fg_id = UI_text_colorid_from_report_type(report->type);
+ int icon_bg_id = UI_icon_colorid_from_report_type(report->type);
if (report->flag & SELECT) {
icon_fg_id = TH_INFO_SELECTED;
@@ -105,6 +68,8 @@ static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc,
if (*r_icon != ICON_NONE) {
UI_GetThemeColor4ubv(icon_fg_id, r_icon_fg);
+ /* This theme color is RGB only, so set alpha. */
+ r_icon_fg[3] = 255;
UI_GetThemeColor4ubv(icon_bg_id, r_icon_bg);
return TVC_LINE_FG | TVC_LINE_BG | TVC_LINE_ICON | TVC_LINE_ICON_FG | TVC_LINE_ICON_BG;
}
diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c
index 3bd23eab836..0583628be43 100644
--- a/source/blender/editors/space_info/info_ops.c
+++ b/source/blender/editors/space_info/info_ops.c
@@ -24,7 +24,6 @@
#include <stdio.h>
#include <string.h>
-#include "DNA_packedFile_types.h"
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
@@ -52,8 +51,6 @@
#include "UI_interface.h"
#include "UI_resources.h"
-#include "IMB_imbuf_types.h"
-
#include "RNA_access.h"
#include "RNA_define.h"
@@ -567,15 +564,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), co
}
/* set target color based on report type */
- if (report->type & RPT_ERROR_ALL) {
- UI_GetThemeColorType3fv(TH_INFO_ERROR, SPACE_INFO, target_col);
- }
- else if (report->type & RPT_WARNING_ALL) {
- UI_GetThemeColorType3fv(TH_INFO_WARNING, SPACE_INFO, target_col);
- }
- else if (report->type & RPT_INFO_ALL) {
- UI_GetThemeColorType3fv(TH_INFO_INFO, SPACE_INFO, target_col);
- }
+ UI_GetThemeColorType3fv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, target_col);
target_col[3] = 0.65f;
if (rti->widthfac == 0.0f) {
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
index 8d3f21aefeb..dfc0abee704 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -29,8 +29,6 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
-#include "BLT_translation.h"
-
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -43,12 +41,9 @@
#include "RNA_access.h"
-#include "UI_interface.h"
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "BLO_readfile.h"
-#include "GPU_framebuffer.h"
#include "info_intern.h" /* own include */
/* ******************** default callbacks for info space ***************** */
@@ -150,7 +145,7 @@ static void info_main_region_draw(const bContext *C, ARegion *region)
info_textview_update_rect(C, region);
- /* worlks best with no view2d matrix set */
+ /* Works best with no view2d matrix set. */
UI_view2d_view_ortho(v2d);
info_textview_main(sinfo, region, CTX_wm_reports(C));
@@ -204,13 +199,10 @@ static void info_header_region_draw(const bContext *C, ARegion *region)
ED_region_header(C, region);
}
-static void info_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void info_main_region_listener(const wmRegionListenerParams *params)
{
- // SpaceInfo *sinfo = area->spacedata.first;
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
/* context changes */
switch (wmn->category) {
@@ -223,12 +215,11 @@ static void info_main_region_listener(wmWindow *UNUSED(win),
}
}
-static void info_header_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void info_header_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SCREEN:
@@ -259,14 +250,11 @@ static void info_header_listener(wmWindow *UNUSED(win),
}
}
-static void info_header_region_message_subscribe(const bContext *UNUSED(C),
- WorkSpace *UNUSED(workspace),
- Scene *UNUSED(scene),
- bScreen *UNUSED(screen),
- ScrArea *UNUSED(area),
- ARegion *region,
- struct wmMsgBus *mbus)
+static void info_header_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ ARegion *region = params->region;
+
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
.user_data = region,
diff --git a/source/blender/editors/space_info/textview.c b/source/blender/editors/space_info/textview.c
index a489216afd1..aef59e89325 100644
--- a/source/blender/editors/space_info/textview.c
+++ b/source/blender/editors/space_info/textview.c
@@ -225,13 +225,16 @@ static bool textview_draw_string(TextViewDrawState *tds,
rgba_uchar_to_float(col, icon_bg);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(true,
- hpadding,
- line_top - bg_size - vpadding,
- bg_size + hpadding,
- line_top - vpadding,
- 4 * UI_DPI_FAC,
- col);
+ UI_draw_roundbox_4fv(
+ &(const rctf){
+ .xmin = hpadding,
+ .xmax = bg_size + hpadding,
+ .ymin = line_top - bg_size - vpadding,
+ .ymax = line_top - vpadding,
+ },
+ true,
+ 4 * UI_DPI_FAC,
+ col);
}
if (icon) {
diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c
index b82fcf3db47..d019573bf93 100644
--- a/source/blender/editors/space_nla/nla_buttons.c
+++ b/source/blender/editors/space_nla/nla_buttons.c
@@ -37,6 +37,7 @@
#include "BLT_translation.h"
#include "BKE_context.h"
+#include "BKE_fcurve.h"
#include "BKE_nla.h"
#include "BKE_screen.h"
@@ -184,6 +185,17 @@ bool nla_panel_context(const bContext *C,
return (found != 0);
}
+NlaStrip *ANIM_nla_context_strip(const bContext *C)
+{
+ PointerRNA strip_ptr;
+ if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) {
+ return NULL;
+ }
+ NlaStrip *strip = strip_ptr.data;
+
+ return strip;
+}
+
#if 0
static bool nla_panel_poll(const bContext *C, PanelType *pt)
{
@@ -535,13 +547,23 @@ static void nla_panel_animated_strip_time(const bContext *C, Panel *panel)
uiItemR(layout, &strip_ptr, "strip_time", 0, NULL, ICON_NONE);
}
+#define NLA_FMODIFIER_PANEL_PREFIX "NLA"
+
+static void nla_fmodifier_panel_id(void *fcm_link, char *r_name)
+{
+ FModifier *fcm = (FModifier *)fcm_link;
+ eFModifier_Types type = fcm->type;
+ snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_", NLA_FMODIFIER_PANEL_PREFIX);
+ const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type);
+ BLI_snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_%s", NLA_FMODIFIER_PANEL_PREFIX, fmi->name);
+}
+
/* F-Modifiers for active NLA-Strip */
static void nla_panel_modifiers(const bContext *C, Panel *panel)
{
PointerRNA strip_ptr;
NlaStrip *strip;
- FModifier *fcm;
- uiLayout *col, *row;
+ uiLayout *row;
uiBlock *block;
/* check context and also validity of pointer */
@@ -569,12 +591,7 @@ static void nla_panel_modifiers(const bContext *C, Panel *panel)
uiItemO(row, "", ICON_PASTEDOWN, "NLA_OT_fmodifier_paste");
}
- /* draw each modifier */
- for (fcm = strip->modifiers.first; fcm; fcm = fcm->next) {
- col = uiLayoutColumn(panel->layout, true);
-
- ANIM_uiTemplate_fmodifier_draw(col, strip_ptr.owner_id, &strip->modifiers, fcm);
- }
+ ANIM_fmodifier_panels(C, strip_ptr.owner_id, &strip->modifiers, nla_fmodifier_panel_id);
}
/* ******************* general ******************************** */
@@ -657,5 +674,9 @@ void nla_buttons_register(ARegionType *art)
strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
pt->draw = nla_panel_modifiers;
pt->poll = nla_strip_eval_panel_poll;
+ pt->flag = PANEL_TYPE_NO_HEADER;
BLI_addtail(&art->paneltypes, pt);
+
+ ANIM_modifier_panels_register_graph_and_NLA(
+ art, NLA_FMODIFIER_PANEL_PREFIX, nla_strip_eval_panel_poll);
}
diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c
index 6fe980cf657..eea81e425c2 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -493,7 +493,18 @@ static void nla_draw_strip(SpaceNla *snla,
/* strip is in normal track */
UI_draw_roundbox_corner_set(UI_CNR_ALL); /* all corners rounded */
- UI_draw_roundbox_shade_x(true, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1, color);
+ UI_draw_roundbox_shade_x(
+ &(const rctf){
+ .xmin = strip->start,
+ .xmax = strip->end,
+ .ymin = yminc,
+ .ymax = ymaxc,
+ },
+ true,
+ 0.0,
+ 0.5,
+ 0.1,
+ color);
/* restore current vertex format & program (roundbox trashes it) */
shdr_pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
@@ -547,7 +558,18 @@ static void nla_draw_strip(SpaceNla *snla,
}
else {
/* non-muted - draw solid, rounded outline */
- UI_draw_roundbox_shade_x(false, strip->start, yminc, strip->end, ymaxc, 0.0, 0.0, 0.1, color);
+ UI_draw_roundbox_shade_x(
+ &(const rctf){
+ .xmin = strip->start,
+ .xmax = strip->end,
+ .ymin = yminc,
+ .ymax = ymaxc,
+ },
+ false,
+ 0.0,
+ 0.0,
+ 0.1,
+ color);
/* restore current vertex format & program (roundbox trashes it) */
shdr_pos = nla_draw_use_dashed_outlines(color, muted);
diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c
index d7bf6c324ac..dd381cc92fb 100644
--- a/source/blender/editors/space_nla/nla_edit.c
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -62,14 +62,14 @@
#include "DEG_depsgraph_build.h"
#include "UI_interface.h"
-#include "UI_resources.h"
#include "UI_view2d.h"
#include "nla_intern.h" /* own include */
#include "nla_private.h" /* FIXME... maybe this shouldn't be included? */
-/* *********************************************** */
-/* Utilities exported to other places... */
+/* -------------------------------------------------------------------- */
+/** \name Public Utilities
+ * \{ */
/* Perform validation for blending/extend settings */
void ED_nla_postop_refresh(bAnimContext *ac)
@@ -93,14 +93,18 @@ void ED_nla_postop_refresh(bAnimContext *ac)
ANIM_animdata_freelist(&anim_data);
}
-/* *********************************************** */
+/** \} */
+
/* 'Special' Editing */
-/* ******************** Tweak-Mode Operators ***************************** */
/* 'Tweak mode' allows the action referenced by the active NLA-strip to be edited
* as if it were the normal Active-Action of its AnimData block.
*/
+/* -------------------------------------------------------------------- */
+/** \name Enable Tweak-Mode Operator
+ * \{ */
+
static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
@@ -196,7 +200,11 @@ void NLA_OT_tweakmode_enter(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
-/* ------------- */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Disable Tweak-Mode Operator
+ * \{ */
/* NLA Editor internal API function for exiting tweakmode */
bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo)
@@ -215,7 +223,7 @@ bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo)
return false;
}
- /* for each AnimData block with NLA-data, try exitting tweak-mode */
+ /* For each AnimData block with NLA-data, try exiting tweak-mode. */
for (ale = anim_data.first; ale; ale = ale->next) {
AnimData *adt = ale->data;
@@ -298,10 +306,13 @@ void NLA_OT_tweakmode_exit(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
-/* *********************************************** */
+/** \} */
+
/* NLA Strips Range Stuff */
-/* *************************** Calculate Range ************************** */
+/* -------------------------------------------------------------------- */
+/** \name Calculate NLA Strip Range
+ * \{ */
/* Get the min/max strip extents */
static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const bool only_sel)
@@ -355,7 +366,11 @@ static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const
}
}
-/* ****************** Automatic Preview-Range Operator ****************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Automatic Preview-Range Operator
+ * \{ */
static int nlaedit_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -402,23 +417,27 @@ void NLA_OT_previewrange_set(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ****************** View-All Operator ****************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name View-All Operator
+ * \{ */
/**
* Find the extents of the active channel
*
- * \param[out] min: Bottom y-extent of channel.
- * \param[out] max: Top y-extent of channel.
- * \return Success of finding a selected channel
+ * \param r_min: Bottom y-extent of channel.
+ * \param r_max: Top y-extent of channel.
+ * \return Success of finding a selected channel.
*/
-static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, float *max)
+static bool nla_channels_get_selected_extents(bAnimContext *ac, float *r_min, float *r_max)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
SpaceNla *snla = (SpaceNla *)ac->sl;
- /* NOTE: not bool, since we want prioritise individual channels over expanders */
+ /* NOTE: not bool, since we want prioritize individual channels over expanders. */
short found = 0;
/* get all items - we need to do it this way */
@@ -435,14 +454,14 @@ static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, floa
if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) &&
ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT)) {
/* update best estimate */
- *min = ymax - NLACHANNEL_HEIGHT(snla);
- *max = ymax;
+ *r_min = ymax - NLACHANNEL_HEIGHT(snla);
+ *r_max = ymax;
/* is this high enough priority yet? */
found = acf->channel_role;
/* only stop our search when we've found an actual channel
- * - datablock expanders get less priority so that we don't abort prematurely
+ * - data-block expanders get less priority so that we don't abort prematurely
*/
if (found == ACHANNEL_ROLE_CHANNEL) {
break;
@@ -550,7 +569,11 @@ void NLA_OT_view_selected(wmOperatorType *ot)
ot->flag = 0;
}
-/* *********************************************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name View-Frame Operator
+ * \{ */
static int nlaedit_viewframe_exec(bContext *C, wmOperator *op)
{
@@ -574,12 +597,16 @@ void NLA_OT_view_frame(wmOperatorType *ot)
ot->flag = 0;
}
-/* *********************************************** */
+/** \} */
+
/* NLA Editing Operations (Constructive/Destructive) */
-/* ******************** Add Action-Clip Operator ***************************** */
-/* Add a new Action-Clip strip to the active track
- * (or the active block if no space in the track) */
+/* -------------------------------------------------------------------- */
+/** \name Add Action-Clip Operator
+ *
+ * Add a new Action-Clip strip to the active track
+ * (or the active block if no space in the track).
+ * \{ */
/* add the specified action as new strip */
static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op)
@@ -725,8 +752,13 @@ void NLA_OT_actionclip_add(wmOperatorType *ot)
ot->prop = prop;
}
-/* ******************** Add Transition Operator ***************************** */
-/* Add a new transition strip between selected strips */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Add Transition Operator
+ *
+ * Add a new transition strip between selected strips.
+ * \{ */
static int nlaedit_add_transition_exec(bContext *C, wmOperator *op)
{
@@ -850,8 +882,11 @@ void NLA_OT_transition_add(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Add Sound Clip Operator ***************************** */
-/* Add a new sound clip */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Add Sound Clip Operator
+ * \{ */
static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -941,8 +976,13 @@ void NLA_OT_soundclip_add(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Add Meta-Strip Operator ***************************** */
-/* Add new meta-strips incorporating the selected strips */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Add Meta-Strip Operator
+ *
+ * Add new meta-strips incorporating the selected strips.
+ * \{ */
/* add the specified action as new strip */
static int nlaedit_add_meta_exec(bContext *C, wmOperator *UNUSED(op))
@@ -1013,8 +1053,13 @@ void NLA_OT_meta_add(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Remove Meta-Strip Operator ***************************** */
-/* Separate out the strips held by the selected meta-strips */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Remove Meta-Strip Operator
+ *
+ * Separate out the strips held by the selected meta-strips.
+ * \{ */
static int nlaedit_remove_meta_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -1074,10 +1119,14 @@ void NLA_OT_meta_remove(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Duplicate Strips Operator ************************** */
-/* Duplicates the selected NLA-Strips, putting them on new tracks above the one
- * the originals were housed in.
- */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Duplicate Strips Operator
+ *
+ * Duplicates the selected NLA-Strips,
+ * putting them on new tracks above the one the originals were housed in.
+ * \{ */
static int nlaedit_duplicate_exec(bContext *C, wmOperator *op)
{
@@ -1201,8 +1250,13 @@ void NLA_OT_duplicate(wmOperatorType *ot)
RNA_def_enum(ot->srna, "mode", rna_enum_transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
-/* ******************** Delete Strips Operator ***************************** */
-/* Deletes the selected NLA-Strips */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Delete Strips Operator
+ *
+ * Deletes the selected NLA-Strips.
+ * \{ */
static int nlaedit_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -1281,11 +1335,17 @@ void NLA_OT_delete(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Split Strips Operator ***************************** */
-/* Splits the selected NLA-Strips into two strips at the midpoint of the strip */
-/* TODO's?
- * - multiple splits
- * - variable-length splits? */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Split Strips Operator
+ *
+ * Splits the selected NLA-Strips into two strips at the midpoint of the strip.
+ *
+ * TODO's?
+ * - multiple splits
+ * - variable-length splits?
+ * \{ */
/* split a given Action-Clip strip */
static void nlaedit_split_strip_actclip(
@@ -1436,11 +1496,15 @@ void NLA_OT_split(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* *********************************************** */
+/** \} */
+
/* NLA Editing Operations (Modifying) */
-/* ******************** Toggle Muting Operator ************************** */
-/* Toggles whether strips are muted or not */
+/* -------------------------------------------------------------------- */
+/** \name Toggle Muting Operator
+ *
+ * Toggles whether strips are muted or not.
+ * \{ */
static int nlaedit_toggle_mute_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -1503,8 +1567,13 @@ void NLA_OT_mute_toggle(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Swap Strips Operator ************************** */
-/* Tries to exchange strips within their owner tracks */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Swap Strips Operator
+ *
+ * Tries to exchange strips within their owner tracks.
+ * \{ */
static int nlaedit_swap_exec(bContext *C, wmOperator *op)
{
@@ -1532,11 +1601,11 @@ static int nlaedit_swap_exec(bContext *C, wmOperator *op)
const bool is_liboverride = ID_IS_OVERRIDE_LIBRARY(ale->id);
if (BKE_nlatrack_is_nonlocal_in_liboverride(ale->id, nlt)) {
- /* No re-ordering of strips whithin non-local tracks of override data. */
+ /* No re-ordering of strips within non-local tracks of override data. */
continue;
}
- /* make temporary metastrips so that entire islands of selections can be moved around */
+ /* Make temporary meta-strips so that entire islands of selections can be moved around. */
BKE_nlastrips_make_metas(&nlt->strips, 1);
/* special case: if there is only 1 island
@@ -1680,8 +1749,13 @@ void NLA_OT_swap(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Move Strips Up Operator ************************** */
-/* Tries to move the selected strips into the track above if possible. */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Move Strips Up Operator
+ *
+ * Tries to move the selected strips into the track above if possible.
+ * \{ */
static int nlaedit_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -1766,8 +1840,13 @@ void NLA_OT_move_up(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Move Strips Down Operator ************************** */
-/* Tries to move the selected strips into the track above if possible. */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Move Strips Down Operator
+ *
+ * Tries to move the selected strips into the track above if possible.
+ * \{ */
static int nlaedit_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -1852,8 +1931,13 @@ void NLA_OT_move_down(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Sync Action Length Operator ***************************** */
-/* Recalculate the extents of the action ranges used for the selected strips */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Sync Action Length Operator
+ *
+ * Recalculate the extents of the action ranges used for the selected strips.
+ * \{ */
static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op)
{
@@ -1941,8 +2025,13 @@ void NLA_OT_action_sync_length(wmOperatorType *ot)
"Only sync the active length for the active strip");
}
-/* ******************** Make Single User ********************************* */
-/* Ensure that each strip has its own action */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Make Single User
+ *
+ * Ensure that each strip has its own action.
+ * \{ */
static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -2027,8 +2116,13 @@ void NLA_OT_make_single_user(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Apply Scale Operator ***************************** */
-/* Reset the scaling of the selected strips to 1.0f */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Apply Scale Operator
+ *
+ * Reset the scaling of the selected strips to 1.0f.
+ * \{ */
/* apply scaling to keyframe */
static short bezt_apply_nlamapping(KeyframeEditData *ked, BezTriple *bezt)
@@ -2140,8 +2234,13 @@ void NLA_OT_apply_scale(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Clear Scale Operator ***************************** */
-/* Reset the scaling of the selected strips to 1.0f */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Clear Scale Operator
+ *
+ * Reset the scaling of the selected strips to 1.0f.
+ * \{ */
static int nlaedit_clear_scale_exec(bContext *C, wmOperator *UNUSED(op))
{
@@ -2205,8 +2304,13 @@ void NLA_OT_clear_scale(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Snap Strips Operator ************************** */
-/* Moves the start-point of the selected strips to the specified places */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Snap Strips Operator
+ *
+ * Moves the start-point of the selected strips to the specified places.
+ * \{ */
/* defines for snap keyframes tool */
static const EnumPropertyItem prop_nlaedit_snap_types[] = {
@@ -2367,10 +2471,13 @@ void NLA_OT_snap(wmOperatorType *ot)
ot->prop = RNA_def_enum(ot->srna, "type", prop_nlaedit_snap_types, 0, "Type", "");
}
-/* *********************************************** */
+/** \} */
+
/* NLA Modifiers */
-/* ******************** Add F-Modifier Operator *********************** */
+/* -------------------------------------------------------------------- */
+/** \name Add F-Modifier Operator
+ * \{ */
static const EnumPropertyItem *nla_fmodifier_itemf(bContext *C,
PointerRNA *UNUSED(ptr),
@@ -2516,7 +2623,11 @@ void NLA_OT_fmodifier_add(wmOperatorType *ot)
"Only add a F-Modifier of the specified type to the active strip");
}
-/* ******************** Copy F-Modifiers Operator *********************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Copy F-Modifiers Operator
+ * \{ */
static int nla_fmodifier_copy_exec(bContext *C, wmOperator *op)
{
@@ -2591,7 +2702,11 @@ void NLA_OT_fmodifier_copy(wmOperatorType *ot)
#endif
}
-/* ******************** Paste F-Modifiers Operator *********************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Paste F-Modifiers Operator
+ * \{ */
static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op)
{
@@ -2683,4 +2798,4 @@ void NLA_OT_fmodifier_paste(wmOperatorType *ot)
"Replace existing F-Modifiers, instead of just appending to the end of the existing list");
}
-/* *********************************************** */
+/** \} */
diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c
index 2e32c496170..631dc2e550c 100644
--- a/source/blender/editors/space_nla/nla_ops.c
+++ b/source/blender/editors/space_nla/nla_ops.c
@@ -30,16 +30,11 @@
#include "BKE_screen.h"
#include "ED_anim_api.h"
-#include "ED_markers.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
-#include "ED_transform.h"
#include "WM_api.h"
#include "WM_types.h"
-#include "RNA_access.h"
-
#include "nla_intern.h" /* own include */
/* ************************** poll callbacks for operators **********************************/
diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c
index c6fe1b8539e..011cd7e2651 100644
--- a/source/blender/editors/space_nla/space_nla.c
+++ b/source/blender/editors/space_nla/space_nla.c
@@ -24,7 +24,6 @@
#include <stdio.h>
#include <string.h>
-#include "DNA_anim_types.h"
#include "DNA_collection_types.h"
#include "DNA_scene_types.h"
@@ -52,7 +51,6 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "GPU_framebuffer.h"
#include "nla_intern.h" /* own include */
/* ******************** default callbacks for nla space ***************** */
@@ -324,12 +322,11 @@ static void nla_buttons_region_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
-static void nla_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void nla_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
@@ -364,12 +361,11 @@ static void nla_region_listener(wmWindow *UNUSED(win),
}
}
-static void nla_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void nla_main_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
@@ -423,14 +419,14 @@ static void nla_main_region_listener(wmWindow *UNUSED(win),
}
}
-static void nla_main_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *scene,
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void nla_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ Scene *scene = params->scene;
+ bScreen *screen = params->screen;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+
PointerRNA ptr;
RNA_pointer_create(&screen->id, &RNA_SpaceNLA, area->spacedata.first, &ptr);
@@ -465,12 +461,11 @@ static void nla_main_region_message_subscribe(const struct bContext *UNUSED(C),
}
}
-static void nla_channel_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void nla_channel_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
@@ -508,14 +503,13 @@ static void nla_channel_region_listener(wmWindow *UNUSED(win),
}
}
-static void nla_channel_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *UNUSED(scene),
- struct bScreen *screen,
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void nla_channel_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ bScreen *screen = params->screen;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+
PointerRNA ptr;
RNA_pointer_create(&screen->id, &RNA_SpaceNLA, area->spacedata.first, &ptr);
@@ -543,11 +537,11 @@ static void nla_channel_region_message_subscribe(const struct bContext *UNUSED(C
}
/* editor level listener */
-static void nla_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void nla_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt
index f4a3bb96aeb..c640b076ba4 100644
--- a/source/blender/editors/space_node/CMakeLists.txt
+++ b/source/blender/editors/space_node/CMakeLists.txt
@@ -40,7 +40,7 @@ set(SRC
drawnode.c
node_add.c
node_buttons.c
- node_draw.c
+ node_draw.cc
node_edit.c
node_gizmo.c
node_group.c
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index f2ee94af9b3..4716f1c29ea 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -190,7 +190,7 @@ static void node_buts_curvecol(uiLayout *layout, bContext *UNUSED(C), PointerRNA
cumap->flag &= ~CUMA_DRAW_SAMPLE;
}
- /* "Tone" (Standard/Filmlike) only used in the Compositor. */
+ /* "Tone" (Standard/Film-like) only used in the Compositor. */
bNodeTree *ntree = (bNodeTree *)ptr->owner_id;
uiTemplateCurveMapping(
layout, ptr, "mapping", 'c', false, false, false, (ntree->type == NTREE_COMPOSIT));
@@ -441,7 +441,7 @@ static void node_draw_frame(const bContext *C,
const rctf *rct = &node->totr;
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(true, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD, color);
+ UI_draw_roundbox_aa(rct, true, BASIS_RAD, color);
/* outline active and selected emphasis */
if (node->flag & SELECT) {
@@ -452,11 +452,11 @@ static void node_draw_frame(const bContext *C,
UI_GetThemeColorShadeAlpha4fv(TH_SELECT, 0, -40, color);
}
- UI_draw_roundbox_aa(false, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD, color);
+ UI_draw_roundbox_aa(rct, false, BASIS_RAD, color);
}
/* label */
- node_draw_frame_label(ntree, node, snode->aspect);
+ node_draw_frame_label(ntree, node, snode->runtime->aspect);
UI_block_end(C, node->block);
UI_block_draw(C, node->block);
@@ -559,7 +559,7 @@ static void node_draw_reroute(const bContext *C,
if (node->flag & SELECT) {
GPU_blend(GPU_BLEND_ALPHA);
GPU_line_smooth(true);
- /* using different shades of TH_TEXT_HI for the empasis, like triangle */
+ /* Using different shades of #TH_TEXT_HI for the emphasis, like triangle. */
if (node->flag & NODE_ACTIVE) {
UI_GetThemeColorShadeAlpha4fv(TH_TEXT_HI, 0, -40, debug_color);
}
@@ -3126,270 +3126,6 @@ static void node_texture_set_butfunc(bNodeType *ntype)
}
}
-/* ****************** BUTTON CALLBACKS FOR GEOMETRY NODES ***************** */
-
-static void node_geometry_buts_boolean_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE);
-}
-
-static void node_geometry_buts_attribute_compare(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE);
- uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE);
- uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE);
-}
-
-static void node_geometry_buts_subdivision_surface(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *UNUSED(ptr))
-{
-#ifndef WITH_OPENSUBDIV
- uiItemL(layout, IFACE_("Disabled, built without OpenSubdiv"), ICON_ERROR);
-#else
- UNUSED_VARS(layout);
-#endif
-}
-
-static void node_geometry_buts_triangulate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "quad_method", DEFAULT_FLAGS, "", ICON_NONE);
- uiItemR(layout, ptr, "ngon_method", DEFAULT_FLAGS, "", ICON_NONE);
-}
-
-static void node_geometry_buts_random_attribute(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE);
-}
-
-static void node_geometry_buts_attribute_math(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE);
- uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE);
- uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE);
-}
-
-static void node_geometry_buts_attribute_vector_math(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- bNode *node = (bNode *)ptr->data;
- NodeAttributeVectorMath *node_storage = (NodeAttributeVectorMath *)node->storage;
-
- uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE);
- uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE);
-
- /* These "use input b / c" checks are copied from the node's code.
- * They could be de-duplicated if the drawing code was moved to the node's file. */
- if (!ELEM(node_storage->operation,
- NODE_VECTOR_MATH_NORMALIZE,
- NODE_VECTOR_MATH_FLOOR,
- NODE_VECTOR_MATH_CEIL,
- NODE_VECTOR_MATH_FRACTION,
- NODE_VECTOR_MATH_ABSOLUTE,
- NODE_VECTOR_MATH_SINE,
- NODE_VECTOR_MATH_COSINE,
- NODE_VECTOR_MATH_TANGENT,
- NODE_VECTOR_MATH_LENGTH)) {
- uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE);
- }
- if (ELEM(node_storage->operation, NODE_VECTOR_MATH_WRAP)) {
- uiItemR(layout, ptr, "input_type_c", DEFAULT_FLAGS, IFACE_("Type C"), ICON_NONE);
- }
-}
-
-static void node_geometry_buts_point_instance(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "instance_type", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE);
- if (RNA_enum_get(ptr, "instance_type") == GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION) {
- uiItemR(layout, ptr, "use_whole_collection", DEFAULT_FLAGS, NULL, ICON_NONE);
- }
-}
-
-static void node_geometry_buts_attribute_fill(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE);
- // uiItemR(layout, ptr, "domain", DEFAULT_FLAGS, "", ICON_NONE);
-}
-
-static void node_geometry_buts_attribute_mix(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "blend_type", DEFAULT_FLAGS, "", ICON_NONE);
- uiLayout *col = uiLayoutColumn(layout, false);
- uiItemR(col, ptr, "input_type_factor", DEFAULT_FLAGS, IFACE_("Factor"), ICON_NONE);
- uiItemR(col, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("A"), ICON_NONE);
- uiItemR(col, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("B"), ICON_NONE);
-}
-
-static void node_geometry_buts_attribute_point_distribute(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "distribute_method", DEFAULT_FLAGS, "", ICON_NONE);
-}
-
-static void node_geometry_buts_attribute_color_ramp(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiTemplateColorRamp(layout, ptr, "color_ramp", 0);
-}
-
-static void node_geometry_buts_point_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
- NodeGeometryRotatePoints *storage = (NodeGeometryRotatePoints *)((bNode *)ptr->data)->storage;
-
- uiItemR(layout, ptr, "type", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE);
- uiItemR(layout, ptr, "space", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE);
-
- uiLayout *col = uiLayoutColumn(layout, false);
- if (storage->type == GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE) {
- uiItemR(col, ptr, "input_type_axis", DEFAULT_FLAGS, IFACE_("Axis"), ICON_NONE);
- uiItemR(col, ptr, "input_type_angle", DEFAULT_FLAGS, IFACE_("Angle"), ICON_NONE);
- }
- else {
- uiItemR(col, ptr, "input_type_rotation", DEFAULT_FLAGS, IFACE_("Rotation"), ICON_NONE);
- }
-}
-
-static void node_geometry_buts_align_rotation_to_vector(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "axis", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE);
- uiLayout *col = uiLayoutColumn(layout, false);
- uiItemR(col, ptr, "input_type_factor", DEFAULT_FLAGS, IFACE_("Factor"), ICON_NONE);
- uiItemR(col, ptr, "input_type_vector", DEFAULT_FLAGS, IFACE_("Vector"), ICON_NONE);
-}
-static void node_geometry_buts_point_translate(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "input_type", DEFAULT_FLAGS, IFACE_("Type"), ICON_NONE);
-}
-
-static void node_geometry_buts_point_scale(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "input_type", DEFAULT_FLAGS, IFACE_("Type"), ICON_NONE);
-}
-
-static void node_geometry_buts_object_info(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
-}
-
-static void node_geometry_set_butfunc(bNodeType *ntype)
-{
- switch (ntype->type) {
- case GEO_NODE_BOOLEAN:
- ntype->draw_buttons = node_geometry_buts_boolean_math;
- break;
- case GEO_NODE_SUBDIVISION_SURFACE:
- ntype->draw_buttons = node_geometry_buts_subdivision_surface;
- break;
- case GEO_NODE_TRIANGULATE:
- ntype->draw_buttons = node_geometry_buts_triangulate;
- break;
- case GEO_NODE_ATTRIBUTE_RANDOMIZE:
- ntype->draw_buttons = node_geometry_buts_random_attribute;
- break;
- case GEO_NODE_ATTRIBUTE_MATH:
- ntype->draw_buttons = node_geometry_buts_attribute_math;
- break;
- case GEO_NODE_ATTRIBUTE_COMPARE:
- ntype->draw_buttons = node_geometry_buts_attribute_compare;
- break;
- case GEO_NODE_POINT_INSTANCE:
- ntype->draw_buttons = node_geometry_buts_point_instance;
- break;
- case GEO_NODE_ATTRIBUTE_FILL:
- ntype->draw_buttons = node_geometry_buts_attribute_fill;
- break;
- case GEO_NODE_ATTRIBUTE_MIX:
- ntype->draw_buttons = node_geometry_buts_attribute_mix;
- break;
- case GEO_NODE_ATTRIBUTE_VECTOR_MATH:
- ntype->draw_buttons = node_geometry_buts_attribute_vector_math;
- break;
- case GEO_NODE_POINT_DISTRIBUTE:
- ntype->draw_buttons = node_geometry_buts_attribute_point_distribute;
- break;
- case GEO_NODE_ATTRIBUTE_COLOR_RAMP:
- ntype->draw_buttons = node_geometry_buts_attribute_color_ramp;
- break;
- case GEO_NODE_POINT_ROTATE:
- ntype->draw_buttons = node_geometry_buts_point_rotate;
- break;
- case GEO_NODE_ALIGN_ROTATION_TO_VECTOR:
- ntype->draw_buttons = node_geometry_buts_align_rotation_to_vector;
- break;
- case GEO_NODE_POINT_TRANSLATE:
- ntype->draw_buttons = node_geometry_buts_point_translate;
- break;
- case GEO_NODE_POINT_SCALE:
- ntype->draw_buttons = node_geometry_buts_point_scale;
- break;
- case GEO_NODE_OBJECT_INFO:
- ntype->draw_buttons = node_geometry_buts_object_info;
- break;
- }
-}
-
-/* ****************** BUTTON CALLBACKS FOR FUNCTION NODES ***************** */
-
-static void node_function_buts_boolean_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE);
-}
-
-static void node_function_buts_float_compare(uiLayout *layout,
- bContext *UNUSED(C),
- PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE);
-}
-
-static void node_function_buts_switch(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
- uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE);
-}
-
-static void node_function_buts_input_vector(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
- uiLayout *col = uiLayoutColumn(layout, true);
- uiItemR(col, ptr, "vector", UI_ITEM_R_EXPAND, "", ICON_NONE);
-}
-
-static void node_function_set_butfunc(bNodeType *ntype)
-{
- switch (ntype->type) {
- case FN_NODE_BOOLEAN_MATH:
- ntype->draw_buttons = node_function_buts_boolean_math;
- break;
- case FN_NODE_FLOAT_COMPARE:
- ntype->draw_buttons = node_function_buts_float_compare;
- break;
- case FN_NODE_SWITCH:
- ntype->draw_buttons = node_function_buts_switch;
- break;
- case FN_NODE_INPUT_VECTOR:
- ntype->draw_buttons = node_function_buts_input_vector;
- break;
- }
-}
-
/* ****** init draw callbacks for all tree types, only called in usiblender.c, once ************ */
static void node_property_update_default(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
@@ -3489,8 +3225,6 @@ void ED_node_init_butfuncs(void)
ntype->draw_nodetype_prepare = node_update_default;
ntype->select_area_func = node_select_area_default;
ntype->tweak_area_func = node_tweak_area_default;
- ntype->draw_buttons = NULL;
- ntype->draw_buttons_ex = NULL;
ntype->resize_area_func = node_resize_area_default;
node_common_set_butfunc(ntype);
@@ -3498,8 +3232,6 @@ void ED_node_init_butfuncs(void)
node_composit_set_butfunc(ntype);
node_shader_set_butfunc(ntype);
node_texture_set_butfunc(ntype);
- node_geometry_set_butfunc(ntype);
- node_function_set_butfunc(ntype);
/* define update callbacks for socket properties */
node_template_properties_update(ntype);
@@ -3828,18 +3560,18 @@ void draw_nodespace_back_pix(const bContext *C,
}
/* return quadratic beziers points for a given nodelink and clip if v2d is not NULL. */
-static bool node_link_bezier_handles(View2D *v2d,
- SpaceNode *snode,
- bNodeLink *link,
- float vec[4][2])
+bool node_link_bezier_handles(const View2D *v2d,
+ const SpaceNode *snode,
+ const bNodeLink *link,
+ float vec[4][2])
{
float cursor[2] = {0.0f, 0.0f};
/* this function can be called with snode null (via cut_links_intersect) */
- /* XXX map snode->cursor back to view space */
+ /* XXX map snode->runtime->cursor back to view space */
if (snode) {
- cursor[0] = snode->cursor[0] * UI_DPI_FAC;
- cursor[1] = snode->cursor[1] * UI_DPI_FAC;
+ cursor[0] = snode->runtime->cursor[0] * UI_DPI_FAC;
+ cursor[1] = snode->runtime->cursor[1] * UI_DPI_FAC;
}
/* in v0 and v3 we put begin/end points */
@@ -3859,6 +3591,9 @@ static bool node_link_bezier_handles(View2D *v2d,
if (link->tosock) {
vec[3][0] = link->tosock->locx;
vec[3][1] = link->tosock->locy;
+ if (!(link->tonode->flag & NODE_HIDDEN) && link->tosock->flag & SOCK_MULTI_INPUT) {
+ node_link_calculate_multi_input_position(link, vec[3]);
+ }
toreroute = (link->tonode && link->tonode->type == NODE_REROUTE);
}
else {
@@ -3923,8 +3658,11 @@ static bool node_link_bezier_handles(View2D *v2d,
}
/* if v2d not NULL, it clips and returns 0 if not visible */
-bool node_link_bezier_points(
- View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol)
+bool node_link_bezier_points(const View2D *v2d,
+ const SpaceNode *snode,
+ const bNodeLink *link,
+ float coord_array[][2],
+ const int resol)
{
float vec[4][2];
@@ -4087,7 +3825,7 @@ static char nodelink_get_color_id(int th_col)
return 0;
}
-static void nodelink_batch_draw(SpaceNode *snode)
+static void nodelink_batch_draw(const SpaceNode *snode)
{
if (g_batch_link.count == 0) {
return;
@@ -4107,7 +3845,7 @@ static void nodelink_batch_draw(SpaceNode *snode)
GPU_batch_program_set_builtin(g_batch_link.batch, GPU_SHADER_2D_NODELINK_INST);
GPU_batch_uniform_4fv_array(g_batch_link.batch, "colors", 6, colors);
- GPU_batch_uniform_1f(g_batch_link.batch, "expandSize", snode->aspect * LINK_WIDTH);
+ GPU_batch_uniform_1f(g_batch_link.batch, "expandSize", snode->runtime->aspect * LINK_WIDTH);
GPU_batch_uniform_1f(g_batch_link.batch, "arrowSize", ARROW_SIZE);
GPU_batch_draw(g_batch_link.batch);
@@ -4127,7 +3865,7 @@ void nodelink_batch_end(SpaceNode *snode)
g_batch_link.enabled = false;
}
-static void nodelink_batch_add_link(SpaceNode *snode,
+static void nodelink_batch_add_link(const SpaceNode *snode,
const float p0[2],
const float p1[2],
const float p2[2],
@@ -4159,11 +3897,15 @@ static void nodelink_batch_add_link(SpaceNode *snode,
}
/* don't do shadows if th_col3 is -1. */
-void node_draw_link_bezier(
- View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int th_col2, int th_col3)
+void node_draw_link_bezier(const View2D *v2d,
+ const SpaceNode *snode,
+ const bNodeLink *link,
+ int th_col1,
+ int th_col2,
+ int th_col3)
{
float vec[4][2];
-
+ const bool highlighted = link->flag & NODE_LINK_TEMP_HIGHLIGHT;
if (node_link_bezier_handles(v2d, snode, link, vec)) {
int drawarrow = ((link->tonode && (link->tonode->type == NODE_REROUTE)) &&
(link->fromnode && (link->fromnode->type == NODE_REROUTE)));
@@ -4172,7 +3914,7 @@ void node_draw_link_bezier(
nodelink_batch_init();
}
- if (g_batch_link.enabled) {
+ if (g_batch_link.enabled && !highlighted) {
/* Add link to batch. */
nodelink_batch_add_link(
snode, vec[0], vec[1], vec[2], vec[3], th_col1, th_col2, th_col3, drawarrow);
@@ -4186,11 +3928,17 @@ void node_draw_link_bezier(
UI_GetThemeColor4fv(th_col1, colors[1]);
UI_GetThemeColor4fv(th_col2, colors[2]);
+ if (highlighted) {
+ float link_preselection_highlight_color[4];
+ UI_GetThemeColor4fv(TH_SELECT, link_preselection_highlight_color);
+ copy_v4_v4(colors[2], link_preselection_highlight_color);
+ }
+
GPUBatch *batch = g_batch_link.batch_single;
GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_NODELINK);
GPU_batch_uniform_2fv_array(batch, "bezierPts", 4, vec);
GPU_batch_uniform_4fv_array(batch, "colors", 3, colors);
- GPU_batch_uniform_1f(batch, "expandSize", snode->aspect * LINK_WIDTH);
+ GPU_batch_uniform_1f(batch, "expandSize", snode->runtime->aspect * LINK_WIDTH);
GPU_batch_uniform_1f(batch, "arrowSize", ARROW_SIZE);
GPU_batch_uniform_1i(batch, "doArrow", drawarrow);
GPU_batch_draw(batch);
diff --git a/source/blender/editors/space_node/node_add.c b/source/blender/editors/space_node/node_add.c
index 508c0a47e21..e0de2393917 100644
--- a/source/blender/editors/space_node/node_add.c
+++ b/source/blender/editors/space_node/node_add.c
@@ -54,6 +54,10 @@
#include "node_intern.h" /* own include */
+/* -------------------------------------------------------------------- */
+/** \name Utilities
+ * \{ */
+
/**
* XXX Does some additional initialization on top of #nodeAddNode
* Can be used with both custom and static nodes,
@@ -93,7 +97,12 @@ bNode *node_add_node(const bContext *C, const char *idname, int type, float locx
return node;
}
-/* ********************** Add reroute operator ***************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Add Reroute Operator
+ * \{ */
+
static bool add_reroute_intersect_check(bNodeLink *link,
float mcoords[][2],
int tot,
@@ -104,9 +113,8 @@ static bool add_reroute_intersect_check(bNodeLink *link,
if (node_link_bezier_points(NULL, NULL, link, coord_array, NODE_LINK_RESOL)) {
for (int i = 0; i < tot - 1; i++) {
for (int b = 0; b < NODE_LINK_RESOL; b++) {
- if (isect_seg_seg_v2(mcoords[i], mcoords[i + 1], coord_array[b], coord_array[b + 1]) > 0) {
- result[0] = (mcoords[i][0] + mcoords[i + 1][0]) / 2.0f;
- result[1] = (mcoords[i][1] + mcoords[i + 1][1]) / 2.0f;
+ if (isect_seg_seg_v2_point(
+ mcoords[i], mcoords[i + 1], coord_array[b], coord_array[b + 1], result) > 0) {
return true;
}
}
@@ -310,7 +318,115 @@ void NODE_OT_add_reroute(wmOperatorType *ot)
RNA_def_int(ot->srna, "cursor", WM_CURSOR_CROSS, 0, INT_MAX, "Cursor", "", 0, INT_MAX);
}
-/* ****************** Add File Node Operator ******************* */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Add Node Group Operator
+ * \{ */
+
+static bNodeTree *node_add_group_get_and_poll_group_node_tree(Main *bmain,
+ wmOperator *op,
+ bNodeTree *ntree)
+{
+ char name[MAX_ID_NAME - 2];
+ RNA_string_get(op->ptr, "name", name);
+
+ bNodeTree *node_group = (bNodeTree *)BKE_libblock_find_name(bmain, ID_NT, name);
+ if (!node_group) {
+ return NULL;
+ }
+ if ((node_group->type != ntree->type) || !nodeGroupPoll(ntree, node_group)) {
+ return NULL;
+ }
+
+ return node_group;
+}
+
+static int node_add_group_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain = CTX_data_main(C);
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNodeTree *ntree = snode->edittree;
+ bNodeTree *node_group;
+
+ if (!(node_group = node_add_group_get_and_poll_group_node_tree(bmain, op, ntree))) {
+ return OPERATOR_CANCELLED;
+ }
+
+ ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
+
+ bNode *group_node = node_add_node(C,
+ node_group_idname(C),
+ (node_group->type == NTREE_CUSTOM) ? NODE_CUSTOM_GROUP :
+ NODE_GROUP,
+ snode->runtime->cursor[0],
+ snode->runtime->cursor[1]);
+ if (!group_node) {
+ BKE_report(op->reports, RPT_WARNING, "Could not add node group");
+ return OPERATOR_CANCELLED;
+ }
+
+ group_node->id = &node_group->id;
+ id_us_plus(group_node->id);
+
+ nodeSetActive(ntree, group_node);
+ ntreeUpdateTree(bmain, node_group);
+ ntreeUpdateTree(bmain, ntree);
+
+ snode_notify(C, snode);
+ snode_dag_update(C, snode);
+
+ return OPERATOR_FINISHED;
+}
+
+static int node_add_group_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ ARegion *region = CTX_wm_region(C);
+ SpaceNode *snode = CTX_wm_space_node(C);
+
+ /* Convert mouse coordinates to v2d space. */
+ UI_view2d_region_to_view(&region->v2d,
+ event->mval[0],
+ event->mval[1],
+ &snode->runtime->cursor[0],
+ &snode->runtime->cursor[1]);
+
+ snode->runtime->cursor[0] /= UI_DPI_FAC;
+ snode->runtime->cursor[1] /= UI_DPI_FAC;
+
+ return node_add_group_exec(C, op);
+}
+
+void NODE_OT_add_group(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Add Node Group";
+ ot->description = "Add an existing node group to the current node editor";
+ ot->idname = "NODE_OT_add_group";
+
+ /* callbacks */
+ ot->exec = node_add_group_exec;
+ ot->invoke = node_add_group_invoke;
+ ot->poll = ED_operator_node_editable;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+
+ RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign");
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Add File Node Operator
+ * \{ */
+
+static bool node_add_file_poll(bContext *C)
+{
+ const SpaceNode *snode = CTX_wm_space_node(C);
+ return ED_operator_node_editable(C) &&
+ ELEM(snode->nodetree->type, NTREE_SHADER, NTREE_TEXTURE, NTREE_COMPOSIT);
+}
static int node_add_file_exec(bContext *C, wmOperator *op)
{
@@ -341,7 +457,7 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
- node = node_add_node(C, NULL, type, snode->cursor[0], snode->cursor[1]);
+ node = node_add_node(C, NULL, type, snode->runtime->cursor[0], snode->runtime->cursor[1]);
if (!node) {
BKE_report(op->reports, RPT_WARNING, "Could not add an image node");
@@ -370,11 +486,14 @@ static int node_add_file_invoke(bContext *C, wmOperator *op, const wmEvent *even
SpaceNode *snode = CTX_wm_space_node(C);
/* convert mouse coordinates to v2d space */
- UI_view2d_region_to_view(
- &region->v2d, event->mval[0], event->mval[1], &snode->cursor[0], &snode->cursor[1]);
+ UI_view2d_region_to_view(&region->v2d,
+ event->mval[0],
+ event->mval[1],
+ &snode->runtime->cursor[0],
+ &snode->runtime->cursor[1]);
- snode->cursor[0] /= UI_DPI_FAC;
- snode->cursor[1] /= UI_DPI_FAC;
+ snode->runtime->cursor[0] /= UI_DPI_FAC;
+ snode->runtime->cursor[1] /= UI_DPI_FAC;
if (RNA_struct_property_is_set(op->ptr, "filepath") ||
RNA_struct_property_is_set(op->ptr, "name")) {
@@ -393,7 +512,7 @@ void NODE_OT_add_file(wmOperatorType *ot)
/* callbacks */
ot->exec = node_add_file_exec;
ot->invoke = node_add_file_invoke;
- ot->poll = ED_operator_node_editable;
+ ot->poll = node_add_file_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -408,7 +527,11 @@ void NODE_OT_add_file(wmOperatorType *ot)
RNA_def_string(ot->srna, "name", "Image", MAX_ID_NAME - 2, "Name", "Data-block name to assign");
}
-/* ****************** Add Mask Node Operator ******************* */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Add Mask Node Operator
+ * \{ */
static bool node_add_mask_poll(bContext *C)
{
@@ -435,7 +558,8 @@ static int node_add_mask_exec(bContext *C, wmOperator *op)
ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
- node = node_add_node(C, NULL, CMP_NODE_MASK, snode->cursor[0], snode->cursor[1]);
+ node = node_add_node(
+ C, NULL, CMP_NODE_MASK, snode->runtime->cursor[0], snode->runtime->cursor[1]);
if (!node) {
BKE_report(op->reports, RPT_WARNING, "Could not add a mask node");
@@ -468,7 +592,11 @@ void NODE_OT_add_mask(wmOperatorType *ot)
RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign");
}
-/********************** New node tree operator *********************/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name New Node Tree Operator
+ * \{ */
static int new_node_tree_exec(bContext *C, wmOperator *op)
{
@@ -556,3 +684,5 @@ void NODE_OT_new_node_tree(wmOperatorType *ot)
RNA_def_enum_funcs(prop, new_node_tree_type_itemf);
RNA_def_string(ot->srna, "name", "NodeTree", MAX_ID_NAME - 2, "Name", "");
}
+
+/** \} */
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index c9a0c827a09..fa4d6997c83 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -40,7 +40,6 @@
#include "RNA_access.h"
-#include "ED_gpencil.h"
#include "ED_screen.h"
#include "UI_resources.h"
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.cc
index d3fec7257f5..d0b62463ad9 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.cc
@@ -22,9 +22,12 @@
* \brief higher level node drawing for the node editor.
*/
+#include "MEM_guardedalloc.h"
+
#include "DNA_light_types.h"
#include "DNA_linestyle_types.h"
#include "DNA_material_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_node_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -32,7 +35,11 @@
#include "DNA_world_types.h"
#include "BLI_blenlib.h"
+#include "BLI_map.hh"
#include "BLI_math.h"
+#include "BLI_span.hh"
+#include "BLI_string_ref.hh"
+#include "BLI_vector.hh"
#include "BLT_translation.h"
@@ -40,6 +47,8 @@
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_node.h"
+#include "BKE_node_ui_storage.hh"
+#include "BKE_object.h"
#include "DEG_depsgraph.h"
@@ -72,9 +81,16 @@
# include "COM_compositor.h"
#endif
+using blender::Map;
+using blender::Span;
+using blender::StringRef;
+using blender::Vector;
+
+extern "C" {
/* XXX interface.h */
extern void ui_draw_dropshadow(
const rctf *rct, float radius, float aspect, float alpha, int select);
+}
float ED_node_grid_size(void)
{
@@ -101,21 +117,18 @@ static bNodeTree *node_tree_from_ID(ID *id)
return ntreeFromID(id);
}
- return NULL;
+ return nullptr;
}
void ED_node_tag_update_id(ID *id)
{
bNodeTree *ntree = node_tree_from_ID(id);
- if (id == NULL || ntree == NULL) {
+ if (id == nullptr || ntree == nullptr) {
return;
}
- /* TODO(sergey): With the new dependency graph it
- * should be just enough to only tag ntree itself,
- * all the users of this tree will have update
- * flushed from the tree,
- */
+ /* TODO(sergey): With the new dependency graph it should be just enough to only tag ntree itself.
+ * All the users of this tree will have update flushed from the tree. */
DEG_id_tag_update(&ntree->id, 0);
if (ntree->type == NTREE_SHADER) {
@@ -142,7 +155,7 @@ void ED_node_tag_update_id(ID *id)
WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, id);
}
else if (id == &ntree->id) {
- /* node groups */
+ /* Node groups. */
DEG_id_tag_update(id, 0);
}
}
@@ -154,16 +167,16 @@ void ED_node_tag_update_nodetree(Main *bmain, bNodeTree *ntree, bNode *node)
}
bool do_tag_update = true;
- if (node != NULL) {
+ if (node != nullptr) {
if (!node_connected_to_output(bmain, ntree, node)) {
do_tag_update = false;
}
}
- /* look through all datablocks, to support groups */
+ /* Look through all datablocks to support groups. */
if (do_tag_update) {
FOREACH_NODETREE_BEGIN (bmain, tntree, id) {
- /* check if nodetree uses the group */
+ /* Check if nodetree uses the group. */
if (ntreeHasTree(tntree, ntree)) {
ED_node_tag_update_id(id);
}
@@ -179,42 +192,41 @@ void ED_node_tag_update_nodetree(Main *bmain, bNodeTree *ntree, bNode *node)
static bool compare_nodes(const bNode *a, const bNode *b)
{
/* These tell if either the node or any of the parent nodes is selected.
- * A selected parent means an unselected node is also in foreground!
- */
+ * A selected parent means an unselected node is also in foreground! */
bool a_select = (a->flag & NODE_SELECT) != 0, b_select = (b->flag & NODE_SELECT) != 0;
bool a_active = (a->flag & NODE_ACTIVE) != 0, b_active = (b->flag & NODE_ACTIVE) != 0;
- /* if one is an ancestor of the other */
+ /* If one is an ancestor of the other. */
/* XXX there might be a better sorting algorithm for stable topological sort,
- * this is O(n^2) worst case */
+ * this is O(n^2) worst case. */
for (bNode *parent = a->parent; parent; parent = parent->parent) {
- /* if b is an ancestor, it is always behind a */
+ /* If B is an ancestor, it is always behind A. */
if (parent == b) {
return true;
}
- /* any selected ancestor moves the node forward */
+ /* Any selected ancestor moves the node forward. */
if (parent->flag & NODE_ACTIVE) {
- a_active = 1;
+ a_active = true;
}
if (parent->flag & NODE_SELECT) {
- a_select = 1;
+ a_select = true;
}
}
for (bNode *parent = b->parent; parent; parent = parent->parent) {
- /* if a is an ancestor, it is always behind b */
+ /* If A is an ancestor, it is always behind B. */
if (parent == a) {
return false;
}
- /* any selected ancestor moves the node forward */
+ /* Any selected ancestor moves the node forward. */
if (parent->flag & NODE_ACTIVE) {
- b_active = 1;
+ b_active = true;
}
if (parent->flag & NODE_SELECT) {
- b_select = 1;
+ b_select = true;
}
}
- /* if one of the nodes is in the background and the other not */
+ /* One of the nodes is in the background and the other not. */
if ((a->flag & NODE_BACKGROUND) && !(b->flag & NODE_BACKGROUND)) {
return false;
}
@@ -222,7 +234,7 @@ static bool compare_nodes(const bNode *a, const bNode *b)
return true;
}
- /* if one has a higher selection state (active > selected > nothing) */
+ /* One has a higher selection state (active > selected > nothing). */
if (!b_active && a_active) {
return true;
}
@@ -233,30 +245,31 @@ static bool compare_nodes(const bNode *a, const bNode *b)
return false;
}
-/* Sorts nodes by selection: unselected nodes first, then selected,
- * then the active node at the very end. Relative order is kept intact!
+/**
+ * Sort nodes by selection: unselected nodes first, then selected,
+ * then the active node at the very end. Relative order is kept intact.
*/
void ED_node_sort(bNodeTree *ntree)
{
- /* merge sort is the algorithm of choice here */
+ /* Merge sort is the algorithm of choice here. */
int totnodes = BLI_listbase_count(&ntree->nodes);
int k = 1;
while (k < totnodes) {
- bNode *first_a = ntree->nodes.first;
+ bNode *first_a = (bNode *)ntree->nodes.first;
bNode *first_b = first_a;
do {
- /* setup first_b pointer */
+ /* Set up first_b pointer. */
for (int b = 0; b < k && first_b; b++) {
first_b = first_b->next;
}
- /* all batches merged? */
- if (first_b == NULL) {
+ /* All batches merged? */
+ if (first_b == nullptr) {
break;
}
- /* merge batches */
+ /* Merge batches. */
bNode *node_a = first_a;
bNode *node_b = first_b;
int a = 0;
@@ -275,11 +288,11 @@ void ED_node_sort(bNodeTree *ntree)
}
}
- /* setup first pointers for next batch */
+ /* Set up first pointers for next batch. */
first_b = node_b;
for (; b < k; b++) {
- /* all nodes sorted? */
- if (first_b == NULL) {
+ /* All nodes sorted? */
+ if (first_b == nullptr) {
break;
}
first_b = first_b->next;
@@ -303,7 +316,7 @@ static void do_node_internal_buttons(bContext *C, void *UNUSED(node_v), int even
static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
{
- /* add node uiBlocks in drawing order - prevents events going to overlapping nodes */
+ /* Add node uiBlocks in drawing order - prevents events going to overlapping nodes. */
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
/* ui block */
@@ -317,14 +330,14 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
}
}
-void node_to_view(struct bNode *node, float x, float y, float *rx, float *ry)
+void node_to_view(const bNode *node, float x, float y, float *rx, float *ry)
{
nodeToView(node, x, y, rx, ry);
*rx *= UI_DPI_FAC;
*ry *= UI_DPI_FAC;
}
-void node_to_updated_rect(struct bNode *node, rctf *r_rect)
+void node_to_updated_rect(const bNode *node, rctf *r_rect)
{
node_to_view(node, node->offsetx, node->offsety, &r_rect->xmin, &r_rect->ymax);
node_to_view(node,
@@ -334,33 +347,35 @@ void node_to_updated_rect(struct bNode *node, rctf *r_rect)
&r_rect->ymin);
}
-void node_from_view(struct bNode *node, float x, float y, float *rx, float *ry)
+void node_from_view(const bNode *node, float x, float y, float *rx, float *ry)
{
x /= UI_DPI_FAC;
y /= UI_DPI_FAC;
nodeFromView(node, x, y, rx, ry);
}
-/* based on settings in node, sets drawing rect info. each redraw! */
+/**
+ * Based on settings and sockets in node, set drawing rect info.
+ */
static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
{
PointerRNA nodeptr;
RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr);
- /* get "global" coords */
+ /* Get "global" coordinates. */
float locx, locy;
node_to_view(node, 0.0f, 0.0f, &locx, &locy);
float dy = locy;
- /* header */
+ /* Header. */
dy -= NODE_DY;
- /* little bit space in top */
+ /* Little bit of space in top. */
if (node->outputs.first) {
dy -= NODE_DYS / 2;
}
- /* output sockets */
+ /* Output sockets. */
bool add_output_space = false;
int buty;
@@ -386,24 +401,24 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
uiLayoutSetActive(layout, false);
}
- /* context pointers for current node and socket */
+ /* Context pointers for current node and socket. */
uiLayoutSetContextPointer(layout, "node", &nodeptr);
uiLayoutSetContextPointer(layout, "socket", &sockptr);
- /* align output buttons to the right */
+ /* Align output buttons to the right. */
uiLayout *row = uiLayoutRow(layout, true);
uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT);
const char *socket_label = nodeSocketLabel(nsock);
nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label));
UI_block_align_end(node->block);
- UI_block_layout_resolve(node->block, NULL, &buty);
+ UI_block_layout_resolve(node->block, nullptr, &buty);
- /* ensure minimum socket height in case layout is empty */
+ /* Ensure minimum socket height in case layout is empty. */
buty = min_ii(buty, dy - NODE_DY);
nsock->locx = locx + NODE_WIDTH(node);
- /* place the socket circle in the middle of the layout */
+ /* Place the socket circle in the middle of the layout. */
nsock->locy = 0.5f * (dy + buty);
dy = buty;
@@ -436,8 +451,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
node->prvr.ymin = dy - aspect * (NODE_WIDTH(node) - NODE_DY);
}
else {
- /* width correction of image */
- /* XXX huh? (ton) */
+ /* Width correction of image. XXX huh? (ton) */
float dx = (NODE_WIDTH(node) - NODE_DYS) - (NODE_WIDTH(node) - NODE_DYS) / aspect;
node->prvr.ymin = dy - (NODE_WIDTH(node) - NODE_DY);
@@ -448,7 +462,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
dy = node->prvr.ymin - NODE_DYS / 2;
- /* make sure that maximums are bigger or equal to minimums */
+ /* Make sure that maximums are bigger or equal to minimums. */
if (node->prvr.xmax < node->prvr.xmin) {
SWAP(float, node->prvr.xmax, node->prvr.xmin);
}
@@ -457,11 +471,11 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
}
}
- /* buttons rect? */
+ /* Buttons rect? */
if (node->typeinfo->draw_buttons && (node->flag & NODE_OPTIONS)) {
dy -= NODE_DYS / 2;
- /* set this for uifunc() that don't use layout engine yet */
+ /* Set this for `uifunc()` that don't use layout engine yet. */
node->butr.xmin = 0;
node->butr.xmax = NODE_WIDTH(node) - 2 * NODE_DYS;
node->butr.ymin = 0;
@@ -486,12 +500,12 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
node->typeinfo->draw_buttons(layout, (bContext *)C, &nodeptr);
UI_block_align_end(node->block);
- UI_block_layout_resolve(node->block, NULL, &buty);
+ UI_block_layout_resolve(node->block, nullptr, &buty);
dy = buty - NODE_DYS / 2;
}
- /* input sockets */
+ /* Input sockets. */
LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) {
if (nodeSocketIsHidden(nsock)) {
continue;
@@ -500,6 +514,16 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
PointerRNA sockptr;
RNA_pointer_create(&ntree->id, &RNA_NodeSocket, nsock, &sockptr);
+ /* Add the half the height of a multi-input socket to cursor Y
+ * to account for the increased height of the taller sockets. */
+ float multi_input_socket_offset = 0.0f;
+ if (nsock->flag & SOCK_MULTI_INPUT) {
+ if (nsock->total_inputs > 2) {
+ multi_input_socket_offset = (nsock->total_inputs - 2) * NODE_MULTI_INPUT_LINK_GAP;
+ }
+ }
+ dy -= multi_input_socket_offset * 0.5f;
+
uiLayout *layout = UI_block_layout(node->block,
UI_LAYOUT_VERTICAL,
UI_LAYOUT_PANEL,
@@ -514,7 +538,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
uiLayoutSetActive(layout, false);
}
- /* context pointers for current node and socket */
+ /* Context pointers for current node and socket. */
uiLayoutSetContextPointer(layout, "node", &nodeptr);
uiLayoutSetContextPointer(layout, "socket", &sockptr);
@@ -524,22 +548,22 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label));
UI_block_align_end(node->block);
- UI_block_layout_resolve(node->block, NULL, &buty);
+ UI_block_layout_resolve(node->block, nullptr, &buty);
- /* ensure minimum socket height in case layout is empty */
+ /* Ensure minimum socket height in case layout is empty. */
buty = min_ii(buty, dy - NODE_DY);
nsock->locx = locx;
- /* place the socket circle in the middle of the layout */
+ /* Place the socket circle in the middle of the layout. */
nsock->locy = 0.5f * (dy + buty);
- dy = buty;
+ dy = buty - multi_input_socket_offset * 0.5;
if (nsock->next) {
dy -= NODE_SOCKDY;
}
}
- /* little bit space in end */
+ /* Little bit of space in end. */
if (node->inputs.first || (node->flag & (NODE_OPTIONS | NODE_PREVIEW)) == 0) {
dy -= NODE_DYS / 2;
}
@@ -550,8 +574,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
node->totr.ymin = min_ff(dy, locy - 2 * NODE_DY);
/* Set the block bounds to clip mouse events from underlying nodes.
- * Add a margin for sockets on each side.
- */
+ * Add a margin for sockets on each side. */
UI_block_bounds_set_explicit(node->block,
node->totr.xmin - NODE_SOCKSIZE,
node->totr.ymin,
@@ -559,16 +582,18 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
node->totr.ymax);
}
-/* based on settings in node, sets drawing rect info. each redraw! */
+/**
+ * Based on settings in node, sets drawing rect info.
+ */
static void node_update_hidden(bNode *node)
{
int totin = 0, totout = 0;
- /* get "global" coords */
+ /* Get "global" coords. */
float locx, locy;
node_to_view(node, 0.0f, 0.0f, &locx, &locy);
- /* calculate minimal radius */
+ /* Calculate minimal radius. */
LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) {
if (!nodeSocketIsHidden(nsock)) {
totin++;
@@ -591,7 +616,7 @@ static void node_update_hidden(bNode *node)
node->totr.ymax = locy + (hiddenrad - 0.5f * NODE_DY);
node->totr.ymin = node->totr.ymax - 2 * hiddenrad;
- /* output sockets */
+ /* Output sockets. */
float rad = (float)M_PI / (1.0f + (float)totout);
float drad = rad;
@@ -603,7 +628,7 @@ static void node_update_hidden(bNode *node)
}
}
- /* input sockets */
+ /* Input sockets. */
rad = drad = -(float)M_PI / (1.0f + (float)totin);
LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) {
@@ -615,8 +640,7 @@ static void node_update_hidden(bNode *node)
}
/* Set the block bounds to clip mouse events from underlying nodes.
- * Add a margin for sockets on each side.
- */
+ * Add a margin for sockets on each side. */
UI_block_bounds_set_explicit(node->block,
node->totr.xmin - NODE_SOCKSIZE,
node->totr.ymin,
@@ -686,21 +710,18 @@ int node_get_colorid(bNode *node)
}
}
-/* note: in cmp_util.c is similar code, for node_compo_pass_on()
- * the same goes for shader and texture nodes. */
-/* note: in node_edit.c is similar code, for untangle node */
-static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
+static void node_draw_mute_line(const View2D *v2d, const SpaceNode *snode, const bNode *node)
{
GPU_blend(GPU_BLEND_ALPHA);
- LISTBASE_FOREACH (bNodeLink *, link, &node->internal_links) {
+ LISTBASE_FOREACH (const bNodeLink *, link, &node->internal_links) {
node_draw_link_bezier(v2d, snode, link, TH_REDALERT, TH_REDALERT, -1);
}
GPU_blend(GPU_BLEND_NONE);
}
-/* flags used in gpu_shader_keyframe_diamond_frag.glsl */
+/* Flags used in gpu_shader_keyframe_diamond_frag.glsl. */
#define MARKER_SHAPE_DIAMOND 0x1
#define MARKER_SHAPE_SQUARE 0xC
#define MARKER_SHAPE_CIRCLE 0x2
@@ -720,7 +741,7 @@ static void node_socket_draw(const bNodeSocket *sock,
{
int flags;
- /* sets shape flags */
+ /* Set shape flags. */
switch (sock->display_shape) {
case SOCK_DISPLAY_SHAPE_DIAMOND:
case SOCK_DISPLAY_SHAPE_DIAMOND_DOT:
@@ -751,6 +772,27 @@ static void node_socket_draw(const bNodeSocket *sock,
immVertex2f(pos_id, locx, locy);
}
+static void node_socket_draw_multi_input(const float color[4],
+ const float color_outline[4],
+ const float width,
+ const float height,
+ const int locx,
+ const int locy)
+{
+ const float outline_width = 1.0f;
+ /* UI_draw_roundbox draws the outline on the outer side, so compensate for the outline width. */
+ const rctf rect = {
+ locx - width + outline_width * 0.5f,
+ locx + width - outline_width * 0.5f,
+ locy - height + outline_width * 0.5f,
+ locy + height - outline_width * 0.5f,
+ };
+
+ UI_draw_roundbox_corner_set(UI_CNR_ALL);
+ UI_draw_roundbox_4fv_ex(
+ &rect, color, nullptr, 1.0f, color_outline, outline_width, width - outline_width * 0.5f);
+}
+
static void node_socket_outline_color_get(bool selected, float r_outline_color[4])
{
if (selected) {
@@ -774,7 +816,7 @@ void node_socket_color_get(
sock->typeinfo->draw_color(C, &ptr, node_ptr, r_color);
- bNode *node = node_ptr->data;
+ bNode *node = (bNode *)node_ptr->data;
if (node->flag & NODE_MUTED) {
r_color[3] *= 0.25f;
}
@@ -842,7 +884,7 @@ void ED_node_socket_draw(bNodeSocket *sock, const rcti *rect, const float color[
immUniform1f("outline_scale", 0.7f);
immUniform2f("ViewportSize", -1.0f, -1.0f);
- /* Single point */
+ /* Single point. */
immBegin(GPU_PRIM_POINTS, 1);
node_socket_draw(sock,
color,
@@ -883,7 +925,7 @@ static void node_draw_preview_background(rctf *rect)
immUnbindProgram();
}
-/* not a callback */
+/* Not a callback. */
static void node_draw_preview(bNodePreview *preview, rctf *prv)
{
float xrect = BLI_rctf_size_x(prv);
@@ -892,7 +934,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
float yscale = yrect / ((float)preview->ysize);
float scale;
- /* uniform scale and offset */
+ /* Uniform scale and offset. */
rctf draw_rect = *prv;
if (xscale < yscale) {
float offset = 0.5f * (yrect - ((float)preview->ysize) * xscale);
@@ -910,7 +952,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
node_draw_preview_background(&draw_rect);
GPU_blend(GPU_BLEND_ALPHA);
- /* premul graphics */
+ /* Premul graphics. */
GPU_blend(GPU_BLEND_ALPHA);
IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR);
@@ -924,7 +966,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
preview->rect,
scale,
scale,
- NULL);
+ nullptr);
GPU_blend(GPU_BLEND_NONE);
@@ -935,26 +977,26 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
immUnbindProgram();
}
-/* common handle function for operator buttons that need to select the node first */
+/* Common handle function for operator buttons that need to select the node first. */
static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_argv)
{
bNode *node = (bNode *)node_argv;
const char *opname = (const char *)op_argv;
- /* select & activate only the button's node */
+ /* Select & activate only the button's node. */
node_select_single(C, node);
- WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, NULL);
+ WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, nullptr);
}
-void node_draw_shadow(SpaceNode *snode, bNode *node, float radius, float alpha)
+void node_draw_shadow(const SpaceNode *snode, const bNode *node, float radius, float alpha)
{
- rctf *rct = &node->totr;
+ const rctf *rct = &node->totr;
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- ui_draw_dropshadow(rct, radius, snode->aspect, alpha, node->flag & SELECT);
+ ui_draw_dropshadow(rct, radius, snode->runtime->aspect, alpha, node->flag & SELECT);
}
-void node_draw_sockets(View2D *v2d,
+void node_draw_sockets(const View2D *v2d,
const bContext *C,
bNodeTree *ntree,
bNode *node,
@@ -987,16 +1029,16 @@ void node_draw_sockets(View2D *v2d,
immUniform1f("outline_scale", 0.7f);
immUniform2f("ViewportSize", -1.0f, -1.0f);
- /* set handle size */
+ /* Set handle size. */
float scale;
- UI_view2d_scale_get(v2d, &scale, NULL);
+ UI_view2d_scale_get(v2d, &scale, nullptr);
scale *= 2.25f * NODE_SOCKSIZE;
if (!select_all) {
immBeginAtMost(GPU_PRIM_POINTS, total_input_len + total_output_len);
}
- /* socket inputs */
+ /* Socket inputs. */
short selected_input_len = 0;
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
if (nodeSocketIsHidden(sock)) {
@@ -1006,6 +1048,10 @@ void node_draw_sockets(View2D *v2d,
selected_input_len++;
continue;
}
+ /* Don't draw multi-input sockets here since they are drawn in a different batch. */
+ if (sock->flag & SOCK_MULTI_INPUT) {
+ continue;
+ }
node_socket_draw_nested(C,
ntree,
@@ -1020,7 +1066,7 @@ void node_draw_sockets(View2D *v2d,
selected);
}
- /* socket outputs */
+ /* Socket outputs. */
short selected_output_len = 0;
if (draw_outputs) {
LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
@@ -1050,16 +1096,16 @@ void node_draw_sockets(View2D *v2d,
immEnd();
}
- /* go back and draw selected sockets */
+ /* Go back and draw selected sockets. */
if (selected_input_len + selected_output_len > 0) {
- /* outline for selected sockets */
+ /* Outline for selected sockets. */
selected = true;
immBegin(GPU_PRIM_POINTS, selected_input_len + selected_output_len);
if (selected_input_len) {
- /* socket inputs */
+ /* Socket inputs. */
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
if (nodeSocketIsHidden(sock)) {
continue;
@@ -1077,14 +1123,14 @@ void node_draw_sockets(View2D *v2d,
scale,
selected);
if (--selected_input_len == 0) {
- break; /* stop as soon as last one is drawn */
+ break; /* Stop as soon as last one is drawn. */
}
}
}
}
if (selected_output_len) {
- /* socket outputs */
+ /* Socket outputs. */
LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
if (nodeSocketIsHidden(sock)) {
continue;
@@ -1102,7 +1148,7 @@ void node_draw_sockets(View2D *v2d,
scale,
selected);
if (--selected_output_len == 0) {
- break; /* stop as soon as last one is drawn */
+ break; /* Stop as soon as last one is drawn. */
}
}
}
@@ -1115,28 +1161,176 @@ void node_draw_sockets(View2D *v2d,
GPU_program_point_size(false);
GPU_blend(GPU_BLEND_NONE);
+
+ /* Draw multi-input sockets after the others because they are drawn with `UI_draw_roundbox`
+ * rather than with `GL_POINT`. */
+ LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
+ if (nodeSocketIsHidden(socket)) {
+ continue;
+ }
+ if (!(socket->flag & SOCK_MULTI_INPUT)) {
+ continue;
+ }
+
+ const bool is_node_hidden = (node->flag & NODE_HIDDEN);
+ const float width = NODE_SOCKSIZE;
+ float height = is_node_hidden ? width : node_socket_calculate_height(socket) - width;
+
+ float color[4];
+ float outline_color[4];
+ node_socket_color_get((bContext *)C, ntree, &node_ptr, socket, color);
+ node_socket_outline_color_get(selected, outline_color);
+
+ node_socket_draw_multi_input(color, outline_color, width, height, socket->locx, socket->locy);
+ }
+}
+
+static int node_error_type_to_icon(const NodeWarningType type)
+{
+ switch (type) {
+ case NodeWarningType::Error:
+ return ICON_ERROR;
+ case NodeWarningType::Warning:
+ return ICON_ERROR;
+ case NodeWarningType::Info:
+ return ICON_INFO;
+ }
+
+ BLI_assert(false);
+ return ICON_ERROR;
+}
+
+static uint8_t node_error_type_priority(const NodeWarningType type)
+{
+ switch (type) {
+ case NodeWarningType::Error:
+ return 3;
+ case NodeWarningType::Warning:
+ return 2;
+ case NodeWarningType::Info:
+ return 1;
+ }
+
+ BLI_assert(false);
+ return 0;
+}
+
+static NodeWarningType node_error_highest_priority(Span<NodeWarning> warnings)
+{
+ uint8_t highest_priority = 0;
+ NodeWarningType highest_priority_type = NodeWarningType::Info;
+ for (const NodeWarning &warning : warnings) {
+ const uint8_t priority = node_error_type_priority(warning.type);
+ if (priority > highest_priority) {
+ highest_priority = priority;
+ highest_priority_type = warning.type;
+ }
+ }
+ return highest_priority_type;
+}
+
+static char *node_errors_tooltip_fn(bContext *UNUSED(C), void *argN, const char *UNUSED(tip))
+{
+ const NodeUIStorage **storage_pointer_alloc = static_cast<const NodeUIStorage **>(argN);
+ const NodeUIStorage *node_ui_storage = *storage_pointer_alloc;
+ Span<NodeWarning> warnings = node_ui_storage->warnings;
+
+ std::string complete_string;
+
+ for (const NodeWarning &warning : warnings.drop_back(1)) {
+ complete_string += warning.message;
+ complete_string += '\n';
+ }
+
+ complete_string += warnings.last().message;
+
+ /* Remove the last period-- the tooltip system adds this automatically. */
+ if (complete_string.back() == '.') {
+ complete_string.pop_back();
+ }
+
+ return BLI_strdupn(complete_string.c_str(), complete_string.size());
+}
+
+#define NODE_HEADER_ICON_SIZE (0.8f * U.widget_unit)
+
+static const NodeUIStorage *node_ui_storage_get_from_context(const bContext *C,
+ const bNodeTree &ntree,
+ const bNode &node)
+{
+ const NodeTreeUIStorage *ui_storage = ntree.ui_storage;
+ if (ui_storage == nullptr) {
+ return nullptr;
+ }
+
+ const Object *active_object = CTX_data_active_object(C);
+ const ModifierData *active_modifier = BKE_object_active_modifier(active_object);
+ if (active_object == nullptr || active_modifier == nullptr) {
+ return nullptr;
+ }
+
+ const NodeTreeEvaluationContext context(*active_object, *active_modifier);
+ const Map<std::string, NodeUIStorage> *storage = ui_storage->context_map.lookup_ptr(context);
+ if (storage == nullptr) {
+ return nullptr;
+ }
+
+ return storage->lookup_ptr_as(StringRef(node.name));
+}
+
+static void node_add_error_message_button(
+ const bContext *C, bNodeTree &ntree, bNode &node, const rctf &rect, float &icon_offset)
+{
+ const NodeUIStorage *node_ui_storage = node_ui_storage_get_from_context(C, ntree, node);
+ if (node_ui_storage == nullptr || node_ui_storage->warnings.is_empty()) {
+ return;
+ }
+
+ /* The UI API forces us to allocate memory for each error button, because the
+ * ownership of #UI_but_func_tooltip_set's argument is transferred to the button. */
+ const NodeUIStorage **storage_pointer_alloc = (const NodeUIStorage **)MEM_mallocN(
+ sizeof(NodeUIStorage *), __func__);
+ *storage_pointer_alloc = node_ui_storage;
+
+ const NodeWarningType display_type = node_error_highest_priority(node_ui_storage->warnings);
+
+ icon_offset -= NODE_HEADER_ICON_SIZE;
+ UI_block_emboss_set(node.block, UI_EMBOSS_NONE);
+ uiBut *but = uiDefIconBut(node.block,
+ UI_BTYPE_BUT,
+ 0,
+ node_error_type_to_icon(display_type),
+ icon_offset,
+ rect.ymax - NODE_DY,
+ NODE_HEADER_ICON_SIZE,
+ UI_UNIT_Y,
+ nullptr,
+ 0,
+ 0,
+ 0,
+ 0,
+ nullptr);
+ UI_but_func_tooltip_set(but, node_errors_tooltip_fn, storage_pointer_alloc);
+ UI_block_emboss_set(node.block, UI_EMBOSS);
}
static void node_draw_basis(const bContext *C,
- ARegion *region,
- SpaceNode *snode,
+ const View2D *v2d,
+ const SpaceNode *snode,
bNodeTree *ntree,
bNode *node,
bNodeInstanceKey key)
{
- /* float socket_size = NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */
- float iconbutw = 0.8f * UI_UNIT_X;
-
- View2D *v2d = &region->v2d;
+ const float iconbutw = NODE_HEADER_ICON_SIZE;
- /* skip if out of view */
- if (BLI_rctf_isect(&node->totr, &v2d->cur, NULL) == false) {
+ /* Skip if out of view. */
+ if (BLI_rctf_isect(&node->totr, &v2d->cur, nullptr) == false) {
UI_block_end(C, node->block);
- node->block = NULL;
+ node->block = nullptr;
return;
}
- /* shadow */
+ /* Shadow. */
node_draw_shadow(snode, node, BASIS_RAD, 1.0f);
float color[4];
@@ -1156,13 +1350,21 @@ static void node_draw_basis(const bContext *C,
rctf *rct = &node->totr;
UI_draw_roundbox_corner_set(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
- UI_draw_roundbox_aa(
- true, rct->xmin, rct->ymax - NODE_DY, rct->xmax, rct->ymax, BASIS_RAD, color);
- /* show/hide icons */
+ {
+ const rctf rect = {
+ rct->xmin,
+ rct->xmax,
+ rct->ymax - NODE_DY,
+ rct->ymax,
+ };
+ UI_draw_roundbox_aa(&rect, true, BASIS_RAD, color);
+ }
+
+ /* Show/hide icons. */
float iconofs = rct->xmax - 0.35f * U.widget_unit;
- /* preview */
+ /* Preview. */
if (node->typeinfo->flag & NODE_PREVIEW) {
iconofs -= iconbutw;
UI_block_emboss_set(node->block, UI_EMBOSS_NONE);
@@ -1174,7 +1376,7 @@ static void node_draw_basis(const bContext *C,
rct->ymax - NODE_DY,
iconbutw,
UI_UNIT_Y,
- NULL,
+ nullptr,
0,
0,
0,
@@ -1183,13 +1385,12 @@ static void node_draw_basis(const bContext *C,
UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_preview_toggle");
/* XXX this does not work when node is activated and the operator called right afterwards,
* since active ID is not updated yet (needs to process the notifier).
- * This can only work as visual indicator!
- */
+ * This can only work as visual indicator! */
// if (!(node->flag & (NODE_ACTIVE_ID|NODE_DO_OUTPUT)))
// UI_but_flag_enable(but, UI_BUT_DISABLED);
UI_block_emboss_set(node->block, UI_EMBOSS);
}
- /* group edit */
+ /* Group edit. */
if (node->type == NODE_GROUP) {
iconofs -= iconbutw;
UI_block_emboss_set(node->block, UI_EMBOSS_NONE);
@@ -1201,7 +1402,7 @@ static void node_draw_basis(const bContext *C,
rct->ymax - NODE_DY,
iconbutw,
UI_UNIT_Y,
- NULL,
+ nullptr,
0,
0,
0,
@@ -1221,7 +1422,7 @@ static void node_draw_basis(const bContext *C,
rct->ymax - NODE_DY,
iconbutw,
UI_UNIT_Y,
- NULL,
+ nullptr,
0,
0,
0,
@@ -1230,7 +1431,9 @@ static void node_draw_basis(const bContext *C,
UI_block_emboss_set(node->block, UI_EMBOSS);
}
- /* title */
+ node_add_error_message_button(C, *ntree, *node, *rct, iconofs);
+
+ /* Title. */
if (node->flag & SELECT) {
UI_GetThemeColor4fv(TH_SELECT, color);
}
@@ -1238,10 +1441,10 @@ static void node_draw_basis(const bContext *C,
UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color);
}
- /* open/close entirely? */
+ /* Open/close entirely. */
{
int but_size = U.widget_unit * 0.8f;
- /* XXX button uses a custom triangle draw below, so make it invisible without icon */
+ /* XXX button uses a custom triangle draw below, so make it invisible without icon. */
UI_block_emboss_set(node->block, UI_EMBOSS_NONE);
uiBut *but = uiDefBut(node->block,
UI_BTYPE_BUT_TOGGLE,
@@ -1251,7 +1454,7 @@ static void node_draw_basis(const bContext *C,
rct->ymax - NODE_DY / 2.2f - but_size / 2,
but_size,
but_size,
- NULL,
+ nullptr,
0,
0,
0,
@@ -1261,11 +1464,11 @@ static void node_draw_basis(const bContext *C,
UI_block_emboss_set(node->block, UI_EMBOSS);
UI_GetThemeColor4fv(TH_TEXT, color);
- /* custom draw function for this button */
+ /* Custom draw function for this button. */
UI_draw_icon_tri(rct->xmin + 0.65f * U.widget_unit, rct->ymax - NODE_DY / 2.2f, 'v', color);
}
- char showname[128]; /* 128 used below */
+ char showname[128];
nodeLabel(ntree, node, showname, sizeof(showname));
uiBut *but = uiDefBut(node->block,
@@ -1276,7 +1479,7 @@ static void node_draw_basis(const bContext *C,
(int)(rct->ymax - NODE_DY),
(short)(iconofs - rct->xmin - (18.0f * U.dpi_fac)),
(short)NODE_DY,
- NULL,
+ nullptr,
0,
0,
0,
@@ -1286,9 +1489,9 @@ static void node_draw_basis(const bContext *C,
UI_but_flag_enable(but, UI_BUT_INACTIVE);
}
- /* body */
+ /* Body. */
if (nodeTypeUndefined(node)) {
- /* use warning color to indicate undefined types */
+ /* Use warning color to indicate undefined types. */
UI_GetThemeColor4fv(TH_REDALERT, color);
}
else if (node->flag & NODE_MUTED) {
@@ -1306,30 +1509,37 @@ static void node_draw_basis(const bContext *C,
color[3] = 0.5f;
}
- UI_draw_roundbox_corner_set(UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT);
- UI_draw_roundbox_aa(
- true, rct->xmin, rct->ymin, rct->xmax, rct->ymax - NODE_DY, BASIS_RAD, color);
+ {
+ UI_draw_roundbox_corner_set(UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT);
+ const rctf rect = {
+ rct->xmin,
+ rct->xmax,
+ rct->ymin,
+ rct->ymax - NODE_DY,
+ };
+ UI_draw_roundbox_aa(&rect, true, BASIS_RAD, color);
+ }
- /* outline active and selected emphasis */
+ /* Outline active and selected emphasis. */
if (node->flag & SELECT) {
UI_GetThemeColorShadeAlpha4fv(
(node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(false, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD, color);
+ UI_draw_roundbox_aa(rct, false, BASIS_RAD, color);
}
- /* disable lines */
+ /* Disable lines. */
if (node->flag & NODE_MUTED) {
node_draw_mute_line(v2d, snode, node);
}
node_draw_sockets(v2d, C, ntree, node, true, false);
- /* preview */
- bNodeInstanceHash *previews = CTX_data_pointer_get(C, "node_previews").data;
+ /* Preview. */
+ bNodeInstanceHash *previews = (bNodeInstanceHash *)CTX_data_pointer_get(C, "node_previews").data;
if (node->flag & NODE_PREVIEW && previews) {
- bNodePreview *preview = BKE_node_instance_hash_lookup(previews, key);
+ bNodePreview *preview = (bNodePreview *)BKE_node_instance_hash_lookup(previews, key);
if (preview && (preview->xsize && preview->ysize)) {
if (preview->rect && !BLI_rctf_is_empty(&node->prvr)) {
node_draw_preview(preview, &node->prvr);
@@ -1339,12 +1549,12 @@ static void node_draw_basis(const bContext *C,
UI_block_end(C, node->block);
UI_block_draw(C, node->block);
- node->block = NULL;
+ node->block = nullptr;
}
static void node_draw_hidden(const bContext *C,
- ARegion *region,
- SpaceNode *snode,
+ const View2D *v2d,
+ const SpaceNode *snode,
bNodeTree *ntree,
bNode *node,
bNodeInstanceKey UNUSED(key))
@@ -1353,15 +1563,13 @@ static void node_draw_hidden(const bContext *C,
float centy = BLI_rctf_cent_y(rct);
float hiddenrad = BLI_rctf_size_y(rct) / 2.0f;
- View2D *v2d = &region->v2d;
-
float scale;
- UI_view2d_scale_get(v2d, &scale, NULL);
+ UI_view2d_scale_get(v2d, &scale, nullptr);
- /* shadow */
+ /* Shadow. */
node_draw_shadow(snode, node, hiddenrad, 1.0f);
- /* body */
+ /* Body. */
float color[4];
int color_id = node_get_colorid(node);
if (node->flag & NODE_MUTED) {
@@ -1373,35 +1581,34 @@ static void node_draw_hidden(const bContext *C,
UI_GetThemeColor4fv(color_id, color);
}
- UI_draw_roundbox_aa(true, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad, color);
+ UI_draw_roundbox_aa(rct, true, hiddenrad, color);
- /* outline active and selected emphasis */
+ /* Outline active and selected emphasis. */
if (node->flag & SELECT) {
UI_GetThemeColorShadeAlpha4fv(
(node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color);
- UI_draw_roundbox_aa(false, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad, color);
+ UI_draw_roundbox_aa(rct, false, hiddenrad, color);
}
- /* custom color inline */
+ /* Custom color inline. */
if (node->flag & NODE_CUSTOM_COLOR) {
GPU_blend(GPU_BLEND_ALPHA);
GPU_line_smooth(true);
- UI_draw_roundbox_3fv_alpha(false,
- rct->xmin + 1,
- rct->ymin + 1,
- rct->xmax - 1,
- rct->ymax - 1,
- hiddenrad,
- node->color,
- 1.0f);
+ const rctf rect = {
+ rct->xmin + 1,
+ rct->xmax - 1,
+ rct->ymin + 1,
+ rct->ymax - 1,
+ };
+ UI_draw_roundbox_3fv_alpha(&rect, false, hiddenrad, node->color, 1.0f);
GPU_line_smooth(false);
GPU_blend(GPU_BLEND_NONE);
}
- /* title */
+ /* Title. */
if (node->flag & SELECT) {
UI_GetThemeColor4fv(TH_SELECT, color);
}
@@ -1409,7 +1616,7 @@ static void node_draw_hidden(const bContext *C,
UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color);
}
- /* open entirely icon */
+ /* Open / collapse icon. */
{
int but_size = U.widget_unit * 0.8f;
/* XXX button uses a custom triangle draw below, so make it invisible without icon */
@@ -1422,7 +1629,7 @@ static void node_draw_hidden(const bContext *C,
centy - but_size / 2,
but_size,
but_size,
- NULL,
+ nullptr,
0,
0,
0,
@@ -1432,22 +1639,18 @@ static void node_draw_hidden(const bContext *C,
UI_block_emboss_set(node->block, UI_EMBOSS);
UI_GetThemeColor4fv(TH_TEXT, color);
- /* custom draw function for this button */
+ /* Custom draw function for this button. */
UI_draw_icon_tri(rct->xmin + 0.65f * U.widget_unit, centy, 'h', color);
}
- /* disable lines */
+ /* Disable lines. */
if (node->flag & NODE_MUTED) {
- node_draw_mute_line(&region->v2d, snode, node);
+ node_draw_mute_line(v2d, snode, node);
}
- char showname[128]; /* 128 is used below */
+ char showname[128];
nodeLabel(ntree, node, showname, sizeof(showname));
- /* XXX - don't print into self! */
- // if (node->flag & NODE_MUTED)
- // BLI_snprintf(showname, sizeof(showname), "[%s]", showname);
-
uiBut *but = uiDefBut(node->block,
UI_BTYPE_LABEL,
0,
@@ -1456,7 +1659,7 @@ static void node_draw_hidden(const bContext *C,
round_fl_to_int(centy - NODE_DY * 0.5f),
(short)(BLI_rctf_size_x(rct) - ((18.0f + 12.0f) * U.dpi_fac)),
(short)NODE_DY,
- NULL,
+ nullptr,
0,
0,
0,
@@ -1466,7 +1669,7 @@ static void node_draw_hidden(const bContext *C,
UI_but_flag_enable(but, UI_BUT_INACTIVE);
}
- /* scale widget thing */
+ /* Scale widget thing. */
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
@@ -1477,19 +1680,19 @@ static void node_draw_hidden(const bContext *C,
immVertex2f(pos, rct->xmax - dx, centy - 4.0f);
immVertex2f(pos, rct->xmax - dx, centy + 4.0f);
- immVertex2f(pos, rct->xmax - dx - 3.0f * snode->aspect, centy - 4.0f);
- immVertex2f(pos, rct->xmax - dx - 3.0f * snode->aspect, centy + 4.0f);
+ immVertex2f(pos, rct->xmax - dx - 3.0f * snode->runtime->aspect, centy - 4.0f);
+ immVertex2f(pos, rct->xmax - dx - 3.0f * snode->runtime->aspect, centy + 4.0f);
immEnd();
immUniformThemeColorShade(color_id, 30);
- dx -= snode->aspect;
+ dx -= snode->runtime->aspect;
immBegin(GPU_PRIM_LINES, 4);
immVertex2f(pos, rct->xmax - dx, centy - 4.0f);
immVertex2f(pos, rct->xmax - dx, centy + 4.0f);
- immVertex2f(pos, rct->xmax - dx - 3.0f * snode->aspect, centy - 4.0f);
- immVertex2f(pos, rct->xmax - dx - 3.0f * snode->aspect, centy + 4.0f);
+ immVertex2f(pos, rct->xmax - dx - 3.0f * snode->runtime->aspect, centy - 4.0f);
+ immVertex2f(pos, rct->xmax - dx - 3.0f * snode->runtime->aspect, centy + 4.0f);
immEnd();
immUnbindProgram();
@@ -1498,7 +1701,7 @@ static void node_draw_hidden(const bContext *C,
UI_block_end(C, node->block);
UI_block_draw(C, node->block);
- node->block = NULL;
+ node->block = nullptr;
}
int node_get_resize_cursor(int directions)
@@ -1524,13 +1727,13 @@ void node_set_cursor(wmWindow *win, SpaceNode *snode, float cursor[2])
if (ntree) {
if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_IN | SOCK_OUT)) {
- /* pass */
+ /* Pass. */
}
else {
- /* check nodes front to back */
- for (node = ntree->nodes.last; node; node = node->prev) {
+ /* Check nodes front to back. */
+ for (node = (bNode *)ntree->nodes.last; node; node = node->prev) {
if (BLI_rctf_isect_pt(&node->totr, cursor[0], cursor[1])) {
- break; /* first hit on node stops */
+ break; /* First hit on node stops. */
}
}
if (node) {
@@ -1550,11 +1753,12 @@ void node_draw_default(const bContext *C,
bNode *node,
bNodeInstanceKey key)
{
+ const View2D *v2d = &region->v2d;
if (node->flag & NODE_HIDDEN) {
- node_draw_hidden(C, region, snode, ntree, node, key);
+ node_draw_hidden(C, v2d, snode, ntree, node, key);
}
else {
- node_draw_basis(C, region, snode, ntree, node, key);
+ node_draw_basis(C, v2d, snode, ntree, node, key);
}
}
@@ -1565,17 +1769,64 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
}
}
+static void count_mutli_input_socket_links(bNodeTree *ntree, SpaceNode *snode)
+{
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ LISTBASE_FOREACH (struct bNodeSocket *, socket, &node->inputs) {
+ if (socket->flag & SOCK_MULTI_INPUT) {
+ socket->total_inputs = 0;
+ LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
+ if (link->tosock == socket) {
+ socket->total_inputs++;
+ }
+ }
+ /* Count temporary links going into this socket. */
+ LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) {
+ LISTBASE_FOREACH (LinkData *, linkdata, &nldrag->links) {
+ bNodeLink *link = (bNodeLink *)linkdata->data;
+ if (link->tosock == socket) {
+ socket->total_inputs++;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
void node_update_nodetree(const bContext *C, bNodeTree *ntree)
{
- /* make sure socket "used" tags are correct, for displaying value buttons */
+ /* Make sure socket "used" tags are correct, for displaying value buttons. */
+ SpaceNode *snode = CTX_wm_space_node(C);
ntreeTagUsedSockets(ntree);
- /* update nodes front to back, so children sizes get updated before parents */
+ count_mutli_input_socket_links(ntree, snode);
+
+ /* Update nodes front to back, so children sizes get updated before parents. */
LISTBASE_FOREACH_BACKWARD (bNode *, node, &ntree->nodes) {
node_update(C, ntree, node);
}
}
+static bool compare_link_by_angle_to_node(const bNodeLink *link_a, const bNodeLink *link_b)
+{
+ BLI_assert(link_a->tosock == link_b->tosock);
+ const float socket_location[2] = {link_a->tosock->locx, link_a->tosock->locy};
+ const float up_direction[2] = {0.0f, 1.0f};
+
+ float delta_a[2] = {link_a->fromsock->locx - socket_location[0],
+ link_a->fromsock->locy - socket_location[1]};
+ normalize_v2(delta_a);
+ const float angle_a = angle_normalized_v2v2(up_direction, delta_a);
+
+ float delta_b[2] = {link_b->fromsock->locx - socket_location[0],
+ link_b->fromsock->locy - socket_location[1]};
+ normalize_v2(delta_b);
+ const float angle_b = angle_normalized_v2v2(up_direction, delta_b);
+
+ return angle_a > angle_b;
+}
+
static void node_draw(const bContext *C,
ARegion *region,
SpaceNode *snode,
@@ -1590,14 +1841,50 @@ static void node_draw(const bContext *C,
#define USE_DRAW_TOT_UPDATE
+/**
+ * Automatically sort the input links to multi-input sockets to avoid crossing noodles.
+ */
+static void sort_multi_input_socket_links(bNodeTree *ntree, SpaceNode *snode)
+{
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
+ if (socket->flag & SOCK_MULTI_INPUT) {
+ /* The total is calculated in #node_update_nodetree, which runs before this draw step. */
+ const int total_inputs = socket->total_inputs;
+ Vector<bNodeLink *> input_links;
+ input_links.reserve(total_inputs);
+
+ LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
+ if (link->tosock == socket) {
+ input_links.append(link);
+ }
+ }
+ LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) {
+ LISTBASE_FOREACH (LinkData *, linkdata, &nldrag->links) {
+ bNodeLink *link = (bNodeLink *)linkdata->data;
+ if (link->tosock == socket) {
+ input_links.append(link);
+ }
+ }
+ }
+
+ std::sort(input_links.begin(), input_links.end(), compare_link_by_angle_to_node);
+ for (const int i : input_links.index_range()) {
+ input_links[i]->multi_input_socket_index = i;
+ }
+ }
+ }
+ }
+}
+
void node_draw_nodetree(const bContext *C,
ARegion *region,
SpaceNode *snode,
bNodeTree *ntree,
bNodeInstanceKey parent_key)
{
- if (ntree == NULL) {
- return; /* groups... */
+ if (ntree == nullptr) {
+ return; /* Groups. */
}
#ifdef USE_DRAW_TOT_UPDATE
@@ -1606,12 +1893,11 @@ void node_draw_nodetree(const bContext *C,
}
#endif
- /* draw background nodes, last nodes in front */
- int a = 0;
- LISTBASE_FOREACH_INDEX (bNode *, node, &ntree->nodes, a) {
+ /* Draw background nodes, last nodes in front. */
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
#ifdef USE_DRAW_TOT_UPDATE
- /* unrelated to background nodes, update the v2d->tot,
- * can be anywhere before we draw the scroll bars */
+ /* Unrelated to background nodes, update the v2d->tot,
+ * can be anywhere before we draw the scroll bars. */
BLI_rctf_union(&region->v2d.tot, &node->totr);
#endif
@@ -1623,9 +1909,12 @@ void node_draw_nodetree(const bContext *C,
node_draw(C, region, snode, ntree, node, key);
}
- /* node lines */
+ /* Node lines. */
GPU_blend(GPU_BLEND_ALPHA);
nodelink_batch_start(snode);
+
+ sort_multi_input_socket_links(ntree, snode);
+
LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
if (!nodeLinkIsHidden(link)) {
node_draw_link(&region->v2d, snode, link);
@@ -1634,9 +1923,8 @@ void node_draw_nodetree(const bContext *C,
nodelink_batch_end(snode);
GPU_blend(GPU_BLEND_NONE);
- /* draw foreground nodes, last nodes in front */
- a = 0;
- LISTBASE_FOREACH_INDEX (bNode *, node, &ntree->nodes, a) {
+ /* Draw foreground nodes, last nodes in front. */
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
if (node->flag & NODE_BACKGROUND) {
continue;
}
@@ -1646,7 +1934,7 @@ void node_draw_nodetree(const bContext *C,
}
}
-/* draw tree path info in lower left corner */
+/* Draw tree path info in lower left corner. */
static void draw_tree_path(SpaceNode *snode)
{
char info[256];
@@ -1661,12 +1949,12 @@ static void snode_setup_v2d(SpaceNode *snode, ARegion *region, const float cente
{
View2D *v2d = &region->v2d;
- /* shift view to node tree center */
+ /* Shift view to node tree center. */
UI_view2d_center_set(v2d, center[0], center[1]);
UI_view2d_view_ortho(v2d);
- /* aspect+font, set each time */
- snode->aspect = BLI_rctf_size_x(&v2d->cur) / (float)region->winx;
+ /* Aspect + font, set each time. */
+ snode->runtime->aspect = BLI_rctf_size_x(&v2d->cur) / (float)region->winx;
// XXX snode->curfont = uiSetCurFont_ext(snode->aspect);
}
@@ -1683,22 +1971,22 @@ static void draw_nodetree(const bContext *C,
node_draw_nodetree(C, region, snode, ntree, parent_key);
}
-/* shade the parent node group and add a uiBlock to clip mouse events */
+/* Shade the parent node group and add a `uiBlock` to clip mouse events. */
static void draw_group_overlay(const bContext *C, ARegion *region)
{
- View2D *v2d = &region->v2d;
- rctf rect = v2d->cur;
+ const View2D *v2d = &region->v2d;
+ const rctf rect = v2d->cur;
float color[4];
- /* shade node groups to separate them visually */
+ /* Shade node groups to separate them visually. */
GPU_blend(GPU_BLEND_ALPHA);
UI_GetThemeColorShadeAlpha4fv(TH_NODE_GROUP, 0, 0, color);
UI_draw_roundbox_corner_set(UI_CNR_NONE);
- UI_draw_roundbox_4fv(true, rect.xmin, rect.ymin, rect.xmax, rect.ymax, 0, color);
+ UI_draw_roundbox_4fv(&rect, true, 0, color);
GPU_blend(GPU_BLEND_NONE);
- /* set the block bounds to clip mouse events from underlying nodes */
+ /* Set the block bounds to clip mouse events from underlying nodes. */
uiBlock *block = UI_block_begin(C, region, "node tree bounds block", UI_EMBOSS);
UI_block_bounds_set_explicit(block, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
UI_block_flag_enable(block, UI_BLOCK_CLIP_EVENTS);
@@ -1722,32 +2010,33 @@ void node_draw_space(const bContext *C, ARegion *region)
GPU_depth_test(GPU_DEPTH_NONE);
GPU_scissor_test(true);
- /* XXX snode->cursor set in coordspace for placing new nodes, used for drawing noodles too */
+ /* XXX `snode->runtime->cursor` set in coordinate-space for placing new nodes,
+ * used for drawing noodles too. */
UI_view2d_region_to_view(&region->v2d,
win->eventstate->x - region->winrct.xmin,
win->eventstate->y - region->winrct.ymin,
- &snode->cursor[0],
- &snode->cursor[1]);
- snode->cursor[0] /= UI_DPI_FAC;
- snode->cursor[1] /= UI_DPI_FAC;
+ &snode->runtime->cursor[0],
+ &snode->runtime->cursor[1]);
+ snode->runtime->cursor[0] /= UI_DPI_FAC;
+ snode->runtime->cursor[1] /= UI_DPI_FAC;
int grid_levels = UI_GetThemeValueType(TH_NODE_GRID_LEVELS, SPACE_NODE);
ED_region_draw_cb_draw(C, region, REGION_DRAW_PRE_VIEW);
- /* only set once */
+ /* Only set once. */
GPU_blend(GPU_BLEND_ALPHA);
- /* nodes */
+ /* Nodes. */
snode_set_context(C);
- /* draw parent node trees */
+ /* Draw parent node trees. */
if (snode->treepath.last) {
static const int max_depth = 2;
- bNodeTreePath *path = snode->treepath.last;
+ bNodeTreePath *path = (bNodeTreePath *)snode->treepath.last;
- /* update tree path name (drawn in the bottom left) */
+ /* Update tree path name (drawn in the bottom left). */
ID *name_id = (path->nodetree && path->nodetree != snode->nodetree) ? &path->nodetree->id :
snode->id;
@@ -1755,11 +2044,11 @@ void node_draw_space(const bContext *C, ARegion *region)
BLI_strncpy(path->node_name, name_id->name + 2, sizeof(path->node_name));
}
- /* current View2D center, will be set temporarily for parent node trees */
+ /* Current View2D center, will be set temporarily for parent node trees. */
float center[2];
UI_view2d_center_get(v2d, &center[0], &center[1]);
- /* store new view center in path and current edittree */
+ /* Store new view center in path and current edit tree. */
copy_v2_v2(path->view_center, center);
if (snode->edittree) {
copy_v2_v2(snode->edittree->view_center, center);
@@ -1771,7 +2060,7 @@ void node_draw_space(const bContext *C, ARegion *region)
depth++;
}
- /* parent node trees in the background */
+ /* Parent node trees in the background. */
for (int curdepth = depth; curdepth > 0; path = path->next, curdepth--) {
bNodeTree *ntree = path->nodetree;
if (ntree) {
@@ -1783,19 +2072,19 @@ void node_draw_space(const bContext *C, ARegion *region)
}
}
- /* top-level edit tree */
+ /* Top-level edit tree. */
bNodeTree *ntree = path->nodetree;
if (ntree) {
snode_setup_v2d(snode, region, center);
- /* grid, uses theme color based on node path depth */
+ /* Grid, uses theme color based on node path depth. */
UI_view2d_multi_grid_draw(v2d,
(depth > 0 ? TH_NODE_GROUP : TH_GRID),
ED_node_grid_size(),
NODE_GRID_STEPS,
grid_levels);
- /* backdrop */
+ /* Backdrop. */
draw_nodespace_back_pix(C, region, snode, path->parent_key);
{
@@ -1816,10 +2105,10 @@ void node_draw_space(const bContext *C, ARegion *region)
draw_nodetree(C, region, ntree, path->parent_key);
}
- /* temporary links */
+ /* Temporary links. */
GPU_blend(GPU_BLEND_ALPHA);
GPU_line_smooth(true);
- LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->linkdrag) {
+ LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) {
LISTBASE_FOREACH (LinkData *, linkdata, &nldrag->links) {
node_draw_link(v2d, snode, (bNodeLink *)linkdata->data);
}
@@ -1828,33 +2117,33 @@ void node_draw_space(const bContext *C, ARegion *region)
GPU_blend(GPU_BLEND_NONE);
if (snode->flag & SNODE_SHOW_GPENCIL) {
- /* draw grease-pencil ('canvas' strokes) */
+ /* Draw grease-pencil annotations. */
ED_annotation_draw_view2d(C, true);
}
}
else {
- /* default grid */
+ /* Default grid. */
UI_view2d_multi_grid_draw(v2d, TH_GRID, ED_node_grid_size(), NODE_GRID_STEPS, grid_levels);
- /* backdrop */
+ /* Backdrop. */
draw_nodespace_back_pix(C, region, snode, NODE_INSTANCE_KEY_NONE);
}
ED_region_draw_cb_draw(C, region, REGION_DRAW_POST_VIEW);
- /* reset view matrix */
+ /* Reset view matrix. */
UI_view2d_view_restore(C);
if (snode->treepath.last) {
if (snode->flag & SNODE_SHOW_GPENCIL) {
- /* draw grease-pencil (screen strokes, and also paintbuffer) */
+ /* Draw grease-pencil (screen strokes, and also paint-buffer). */
ED_annotation_draw_view2d(C, false);
}
}
- /* tree path info */
+ /* Tree path info. */
draw_tree_path(snode);
- /* scrollers */
- UI_view2d_scrollers_draw(v2d, NULL);
+ /* Scrollers. */
+ UI_view2d_scrollers_draw(v2d, nullptr);
}
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index e261e11d713..4826b6c72ba 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -98,6 +98,25 @@ typedef struct CompoJob {
float *progress;
} CompoJob;
+float node_socket_calculate_height(const bNodeSocket *socket)
+{
+ float sock_height = NODE_SOCKSIZE * 2.0f;
+ if (socket->flag & SOCK_MULTI_INPUT) {
+ sock_height += max_ii(NODE_MULTI_INPUT_LINK_GAP * 0.5f * socket->total_inputs, NODE_SOCKSIZE);
+ }
+ return sock_height;
+}
+
+void node_link_calculate_multi_input_position(const bNodeLink *link, float r[2])
+{
+ float offset = (link->tosock->total_inputs * NODE_MULTI_INPUT_LINK_GAP -
+ NODE_MULTI_INPUT_LINK_GAP) *
+ 0.5;
+ r[0] = link->tosock->locx - NODE_SOCKSIZE * 0.5f;
+ r[1] = link->tosock->locy - offset +
+ (link->multi_input_socket_index * NODE_MULTI_INPUT_LINK_GAP);
+}
+
static void compo_tag_output_nodes(bNodeTree *nodetree, int recalc_flags)
{
LISTBASE_FOREACH (bNode *, node, &nodetree->nodes) {
@@ -770,7 +789,7 @@ void ED_node_post_apply_transform(bContext *UNUSED(C), bNodeTree *UNUSED(ntree))
* which only exists during actual drawing. Can we rely on valid totr rects?
*/
/* make sure nodes have correct bounding boxes after transform */
- /* node_update_nodetree(C, ntree, 0.0f, 0.0f); */
+ // node_update_nodetree(C, ntree, 0.0f, 0.0f);
}
/* ***************** generic operator functions for nodes ***************** */
@@ -880,8 +899,8 @@ static void node_resize_init(
NodeSizeWidget *nsw = MEM_callocN(sizeof(NodeSizeWidget), "size widget op data");
op->customdata = nsw;
- nsw->mxstart = snode->cursor[0] * UI_DPI_FAC;
- nsw->mystart = snode->cursor[1] * UI_DPI_FAC;
+ nsw->mxstart = snode->runtime->cursor[0] * UI_DPI_FAC;
+ nsw->mystart = snode->runtime->cursor[1] * UI_DPI_FAC;
/* store old */
nsw->oldlocx = node->locx;
@@ -1104,6 +1123,21 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set)
}
/* checks snode->mouse position, and returns found node/socket */
+static bool cursor_isect_multi_input_socket(const float cursor[2], const bNodeSocket *socket)
+{
+ const float node_socket_height = node_socket_calculate_height(socket);
+ const rctf multi_socket_rect = {
+ .xmin = socket->locx - NODE_SOCKSIZE * 4,
+ .xmax = socket->locx + NODE_SOCKSIZE,
+ .ymin = socket->locy - node_socket_height * 0.5 - NODE_SOCKSIZE * 2.0f,
+ .ymax = socket->locy + node_socket_height * 0.5 + NODE_SOCKSIZE * 2.0f,
+ };
+ if (BLI_rctf_isect_pt(&multi_socket_rect, cursor[0], cursor[1])) {
+ return true;
+ }
+ return false;
+}
+
/* type is SOCK_IN and/or SOCK_OUT */
int node_find_indicated_socket(
SpaceNode *snode, bNode **nodep, bNodeSocket **sockp, float cursor[2], int in_out)
@@ -1132,7 +1166,16 @@ int node_find_indicated_socket(
if (in_out & SOCK_IN) {
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
if (!nodeSocketIsHidden(sock)) {
- if (BLI_rctf_isect_pt(&rect, sock->locx, sock->locy)) {
+ if (sock->flag & SOCK_MULTI_INPUT && !(node->flag & NODE_HIDDEN)) {
+ if (cursor_isect_multi_input_socket(cursor, sock)) {
+ if (node == visible_node(snode, &rect)) {
+ *nodep = node;
+ *sockp = sock;
+ return 1;
+ }
+ }
+ }
+ else if (BLI_rctf_isect_pt(&rect, sock->locx, sock->locy)) {
if (node == visible_node(snode, &rect)) {
*nodep = node;
*sockp = sock;
@@ -1199,7 +1242,7 @@ static int node_duplicate_exec(bContext *C, wmOperator *op)
if (node->flag & SELECT) {
BKE_node_copy_store_new_pointers(ntree, node, LIB_ID_COPY_DEFAULT);
- /* to ensure redraws or rerenders happen */
+ /* To ensure redraws or re-renders happen. */
ED_node_tag_update_id(snode->id);
}
diff --git a/source/blender/editors/space_node/node_group.c b/source/blender/editors/space_node/node_group.c
index f2abe272f48..b3ae336aadf 100644
--- a/source/blender/editors/space_node/node_group.c
+++ b/source/blender/editors/space_node/node_group.c
@@ -107,7 +107,7 @@ static const char *group_ntree_idname(bContext *C)
return snode->tree_idname;
}
-static const char *group_node_idname(bContext *C)
+const char *node_group_idname(bContext *C)
{
SpaceNode *snode = CTX_wm_space_node(C);
@@ -147,7 +147,7 @@ static bNode *node_group_get_active(bContext *C, const char *node_idname)
static int node_group_edit_exec(bContext *C, wmOperator *op)
{
SpaceNode *snode = CTX_wm_space_node(C);
- const char *node_idname = group_node_idname(C);
+ const char *node_idname = node_group_idname(C);
const bool exit = RNA_boolean_get(op->ptr, "exit");
ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
@@ -400,7 +400,7 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
SpaceNode *snode = CTX_wm_space_node(C);
- const char *node_idname = group_node_idname(C);
+ const char *node_idname = node_group_idname(C);
ED_preview_kill_jobs(CTX_wm_manager(C), bmain);
@@ -1013,7 +1013,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
SpaceNode *snode = CTX_wm_space_node(C);
bNodeTree *ntree = snode->edittree;
const char *ntree_idname = group_ntree_idname(C);
- const char *node_idname = group_node_idname(C);
+ const char *node_idname = node_group_idname(C);
Main *bmain = CTX_data_main(C);
ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
@@ -1039,7 +1039,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
snode_notify(C, snode);
snode_dag_update(C, snode);
- /* We broke relations in node tree, need to rebuild them in the grahes. */
+ /* We broke relations in node tree, need to rebuild them in the graphs. */
DEG_relations_tag_update(bmain);
return OPERATOR_FINISHED;
@@ -1070,7 +1070,7 @@ static int node_group_insert_exec(bContext *C, wmOperator *op)
{
SpaceNode *snode = CTX_wm_space_node(C);
bNodeTree *ntree = snode->edittree;
- const char *node_idname = group_node_idname(C);
+ const char *node_idname = node_group_idname(C);
Main *bmain = CTX_data_main(C);
ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index aa59b7293a3..1566c1e8571 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -32,6 +32,7 @@
struct ARegion;
struct ARegionType;
struct Main;
+struct NodeInsertOfsData;
struct View2D;
struct bContext;
struct bNode;
@@ -41,6 +42,10 @@ struct wmGizmoGroupType;
struct wmKeyConfig;
struct wmWindow;
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/* temp data to pass on to modal */
typedef struct bNodeLinkDrag {
struct bNodeLinkDrag *next, *prev;
@@ -50,25 +55,49 @@ typedef struct bNodeLinkDrag {
* This way the links can be added to the node tree while being stored in this list.
*/
ListBase links;
+ bool from_multi_input_socket;
int in_out;
} bNodeLinkDrag;
+typedef struct SpaceNode_Runtime {
+ float aspect;
+
+ /** Mouse position for drawing socket-less links and adding nodes. */
+ float cursor[2];
+
+ /** For auto compositing. */
+ bool recalc;
+
+ /** Temporary data for modal linking operator. */
+ struct ListBase linkdrag;
+
+ /* XXX hack for translate_attach op-macros to pass data from transform op to insert_offset op */
+ /** Temporary data for node insert offset (in UI called Auto-offset). */
+ struct NodeInsertOfsData *iofsd;
+} SpaceNode_Runtime;
+
/* space_node.c */
/* transform between View2Ds in the tree path */
void space_node_group_offset(struct SpaceNode *snode, float *x, float *y);
-/* node_draw.c */
+/* node_draw.cc */
+float node_socket_calculate_height(const bNodeSocket *socket);
+void node_link_calculate_multi_input_position(const bNodeLink *link, float r[2]);
+
int node_get_colorid(struct bNode *node);
int node_get_resize_cursor(int directions);
-void node_draw_shadow(struct SpaceNode *snode, struct bNode *node, float radius, float alpha);
+void node_draw_shadow(const struct SpaceNode *snode,
+ const struct bNode *node,
+ float radius,
+ float alpha);
void node_draw_default(const struct bContext *C,
struct ARegion *region,
struct SpaceNode *snode,
struct bNodeTree *ntree,
struct bNode *node,
bNodeInstanceKey key);
-void node_draw_sockets(struct View2D *v2d,
+void node_draw_sockets(const struct View2D *v2d,
const struct bContext *C,
struct bNodeTree *ntree,
struct bNode *node,
@@ -92,9 +121,9 @@ void node_draw_space(const bContext *C, ARegion *region);
void node_set_cursor(struct wmWindow *win, struct SpaceNode *snode, float cursor[2]);
/* DPI scaled coords */
-void node_to_view(struct bNode *node, float x, float y, float *rx, float *ry);
-void node_to_updated_rect(struct bNode *node, rctf *r_rect);
-void node_from_view(struct bNode *node, float x, float y, float *rx, float *ry);
+void node_to_view(const struct bNode *node, float x, float y, float *rx, float *ry);
+void node_to_updated_rect(const struct bNode *node, rctf *r_rect);
+void node_from_view(const struct bNode *node, float x, float y, float *rx, float *ry);
/* node_buttons.c */
void node_buttons_register(struct ARegionType *art);
@@ -145,17 +174,21 @@ void nodelink_batch_start(struct SpaceNode *snode);
void nodelink_batch_end(struct SpaceNode *snode);
void node_draw_link(struct View2D *v2d, struct SpaceNode *snode, struct bNodeLink *link);
-void node_draw_link_bezier(struct View2D *v2d,
- struct SpaceNode *snode,
- struct bNodeLink *link,
+void node_draw_link_bezier(const struct View2D *v2d,
+ const struct SpaceNode *snode,
+ const struct bNodeLink *link,
int th_col1,
int th_col2,
int th_col3);
-bool node_link_bezier_points(struct View2D *v2d,
- struct SpaceNode *snode,
- struct bNodeLink *link,
+bool node_link_bezier_points(const struct View2D *v2d,
+ const struct SpaceNode *snode,
+ const struct bNodeLink *link,
float coord_array[][2],
- int resol);
+ const int resol);
+bool node_link_bezier_handles(const struct View2D *v2d,
+ const struct SpaceNode *snode,
+ const struct bNodeLink *link,
+ float vec[4][2]);
void draw_nodespace_back_pix(const struct bContext *C,
struct ARegion *region,
struct SpaceNode *snode,
@@ -165,11 +198,13 @@ void draw_nodespace_back_pix(const struct bContext *C,
bNode *node_add_node(
const struct bContext *C, const char *idname, int type, float locx, float locy);
void NODE_OT_add_reroute(struct wmOperatorType *ot);
+void NODE_OT_add_group(struct wmOperatorType *ot);
void NODE_OT_add_file(struct wmOperatorType *ot);
void NODE_OT_add_mask(struct wmOperatorType *ot);
void NODE_OT_new_node_tree(struct wmOperatorType *ot);
/* node_group.c */
+const char *node_group_idname(struct bContext *C);
void NODE_OT_group_make(struct wmOperatorType *ot);
void NODE_OT_group_insert(struct wmOperatorType *ot);
void NODE_OT_group_ungroup(struct wmOperatorType *ot);
@@ -268,6 +303,7 @@ extern const char *node_context_dir[];
#define NODE_HEIGHT(node) (node->height * UI_DPI_FAC)
#define NODE_MARGIN_X (1.10f * U.widget_unit)
#define NODE_SOCKSIZE (0.25f * U.widget_unit)
+#define NODE_MULTI_INPUT_LINK_GAP (0.25f * U.widget_unit)
#define NODE_RESIZE_MARGIN (0.20f * U.widget_unit)
#define NODE_LINK_RESOL 12
@@ -290,3 +326,7 @@ enum eNodeSpace_ButEvents {
B_NODE_LOADIMAGE,
B_NODE_SETIMAGE,
};
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 11933ef0811..7671547363b 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -23,14 +23,10 @@
#include "DNA_node_types.h"
-#include "BLI_utildefines.h"
-
#include "BKE_context.h"
#include "ED_node.h" /* own include */
#include "ED_screen.h"
-#include "ED_select_utils.h"
-#include "ED_transform.h"
#include "RNA_access.h"
@@ -92,6 +88,7 @@ void node_operatortypes(void)
WM_operatortype_append(NODE_OT_backimage_fit);
WM_operatortype_append(NODE_OT_backimage_sample);
+ WM_operatortype_append(NODE_OT_add_group);
WM_operatortype_append(NODE_OT_add_file);
WM_operatortype_append(NODE_OT_add_mask);
diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c
index ba1e752e276..d6edfcce8e8 100644
--- a/source/blender/editors/space_node/node_relationships.c
+++ b/source/blender/editors/space_node/node_relationships.c
@@ -32,6 +32,7 @@
#include "BKE_anim_data.h"
#include "BKE_context.h"
+#include "BKE_curve.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_node.h"
@@ -58,7 +59,7 @@
static bool ntree_has_drivers(bNodeTree *ntree)
{
- AnimData *adt = BKE_animdata_from_id(&ntree->id);
+ const AnimData *adt = BKE_animdata_from_id(&ntree->id);
if (adt == NULL) {
return false;
}
@@ -179,6 +180,137 @@ typedef struct NodeInsertOfsData {
float offset_x; /* offset to apply to node chain */
} NodeInsertOfsData;
+static void clear_picking_highlight(ListBase *links)
+{
+ LISTBASE_FOREACH (bNodeLink *, link, links) {
+ link->flag &= ~NODE_LINK_TEMP_HIGHLIGHT;
+ }
+}
+
+static LinkData *create_drag_link(Main *bmain, SpaceNode *snode, bNode *node, bNodeSocket *sock)
+{
+ LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data");
+ bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link");
+ linkdata->data = oplink;
+ if (sock->in_out == SOCK_OUT) {
+ oplink->fromnode = node;
+ oplink->fromsock = sock;
+ }
+ else {
+ oplink->tonode = node;
+ oplink->tosock = sock;
+ }
+ oplink->flag |= NODE_LINK_VALID;
+ oplink->flag &= ~NODE_LINK_TEST;
+ if (node_connected_to_output(bmain, snode->edittree, node)) {
+ oplink->flag |= NODE_LINK_TEST;
+ }
+ return linkdata;
+}
+
+static void pick_link(const bContext *C,
+ wmOperator *op,
+ bNodeLinkDrag *nldrag,
+ SpaceNode *snode,
+ bNode *node,
+ bNodeLink *link_to_pick)
+{
+ clear_picking_highlight(&snode->edittree->links);
+ RNA_boolean_set(op->ptr, "has_link_picked", true);
+
+ Main *bmain = CTX_data_main(C);
+ LinkData *linkdata = create_drag_link(
+ bmain, snode, link_to_pick->fromnode, link_to_pick->fromsock);
+
+ BLI_addtail(&nldrag->links, linkdata);
+ nodeRemLink(snode->edittree, link_to_pick);
+ /* Send changed event to original link->tonode. */
+ if (node) {
+ snode_update(snode, node);
+ }
+}
+
+static void pick_input_link_by_link_intersect(const bContext *C,
+ wmOperator *op,
+ bNodeLinkDrag *nldrag,
+ const float *cursor)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ const ARegion *region = CTX_wm_region(C);
+ const View2D *v2d = &region->v2d;
+
+ float drag_start[2];
+ RNA_float_get_array(op->ptr, "drag_start", drag_start);
+ bNode *node;
+ bNodeSocket *socket;
+ node_find_indicated_socket(snode, &node, &socket, drag_start, SOCK_IN);
+
+ const float trigger_drag_distance = 25.0f;
+ const float cursor_link_touch_distance = 25.0f;
+
+ const float socket_height = node_socket_calculate_height(socket);
+
+ float cursor_to_socket_relative[2];
+ float socket_position[2] = {socket->locx, socket->locy};
+ sub_v2_v2v2(cursor_to_socket_relative, cursor, socket_position);
+ float distance_from_socket_v2[2] = {
+ max_ff(0, fabs(cursor_to_socket_relative[0]) - NODE_SOCKSIZE * 0.5),
+ max_ff(0, fabs(cursor_to_socket_relative[1]) - socket_height)};
+ const float distance_from_socket = len_v2(distance_from_socket_v2);
+
+ const int resolution = NODE_LINK_RESOL;
+
+ bNodeLink *link_to_pick = NULL;
+ clear_picking_highlight(&snode->edittree->links);
+ LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) {
+ if (link->tosock == socket) {
+ /* Test if the cursor is near a link. */
+ float vec[4][2];
+ node_link_bezier_handles(v2d, snode, link, vec);
+
+ float data[NODE_LINK_RESOL * 2 + 2];
+ BKE_curve_forward_diff_bezier(
+ vec[0][0], vec[1][0], vec[2][0], vec[3][0], data, resolution, sizeof(float[2]));
+ BKE_curve_forward_diff_bezier(
+ vec[0][1], vec[1][1], vec[2][1], vec[3][1], data + 1, resolution, sizeof(float[2]));
+
+ for (int i = 0; i < resolution * 2; i += 2) {
+ float *l1 = &data[i];
+ float *l2 = &data[i + 2];
+ float distance = dist_squared_to_line_segment_v2(cursor, l1, l2);
+ if (distance < cursor_link_touch_distance) {
+ link_to_pick = link;
+ RNA_int_set(op->ptr, "last_picked_link_index", link->multi_input_socket_index);
+ }
+ }
+ }
+ }
+
+ /* If no linked was picked in this call, try using the one picked in the previous call.
+ * Not essential for the basic behavior, but can make interaction feel a bit better if
+ * the mouse moves to the right and loses the "selection." */
+ if (!link_to_pick) {
+ int last_picked_link_index = RNA_int_get(op->ptr, "last_picked_link_index");
+ if (last_picked_link_index > -1) {
+ LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) {
+ if (link->multi_input_socket_index == last_picked_link_index) {
+ link_to_pick = link;
+ }
+ }
+ }
+ }
+
+ if (link_to_pick) {
+ /* Highlight is set here and cleared in the next iteration or if the operation finishes. */
+ link_to_pick->flag |= NODE_LINK_TEMP_HIGHLIGHT;
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ if (distance_from_socket > trigger_drag_distance) {
+ pick_link(C, op, nldrag, snode, node, link_to_pick);
+ }
+ }
+}
+
static int sort_nodes_locx(const void *a, const void *b)
{
const bNodeListItem *nli1 = a;
@@ -600,6 +732,13 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeLink *link)
tlink = NULL;
to_count--;
}
+ else if (tlink->fromsock == from) {
+ /* Also remove link if it comes from the same output. */
+ nodeRemLink(ntree, tlink);
+ tlink = NULL;
+ to_count--;
+ from_count--;
+ }
}
}
}
@@ -663,7 +802,7 @@ static void node_link_exit(bContext *C, wmOperator *op, bool apply_links)
snode_dag_update(C, snode);
}
- BLI_remlink(&snode->linkdrag, nldrag);
+ BLI_remlink(&snode->runtime->linkdrag, nldrag);
/* links->data pointers are either held by the tree or freed already */
BLI_freelistN(&nldrag->links);
MEM_freeN(nldrag);
@@ -736,7 +875,7 @@ static void node_link_find_socket(bContext *C, wmOperator *op, float cursor[2])
}
}
-/* loop that adds a nodelink, called by function below */
+/* Loop that adds a node-link, called by function below. */
/* in_out = starting socket */
static int node_link_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
@@ -748,10 +887,15 @@ static int node_link_modal(bContext *C, wmOperator *op, const wmEvent *event)
switch (event->type) {
case MOUSEMOVE:
- node_link_find_socket(C, op, cursor);
+ if (nldrag->from_multi_input_socket && !RNA_boolean_get(op->ptr, "has_link_picked")) {
+ pick_input_link_by_link_intersect(C, op, nldrag, cursor);
+ }
+ else {
+ node_link_find_socket(C, op, cursor);
- node_link_update_header(C, nldrag);
- ED_region_tag_redraw(region);
+ node_link_update_header(C, nldrag);
+ ED_region_tag_redraw(region);
+ }
break;
case LEFTMOUSE:
@@ -762,6 +906,8 @@ static int node_link_modal(bContext *C, wmOperator *op, const wmEvent *event)
ED_workspace_status_text(C, NULL);
ED_region_tag_redraw(region);
+ SpaceNode *snode = CTX_wm_space_node(C);
+ clear_picking_highlight(&snode->edittree->links);
return OPERATOR_FINISHED;
}
break;
@@ -817,16 +963,7 @@ static bNodeLinkDrag *node_link_init(Main *bmain, SpaceNode *snode, float cursor
/* dragged links are fixed on output side */
nldrag->in_out = SOCK_OUT;
/* create a new link */
- LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data");
- bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link");
- linkdata->data = oplink;
- oplink->fromnode = node;
- oplink->fromsock = sock;
- oplink->flag |= NODE_LINK_VALID;
- oplink->flag &= ~NODE_LINK_TEST;
- if (node_connected_to_output(bmain, snode->edittree, node)) {
- oplink->flag |= NODE_LINK_TEST;
- }
+ LinkData *linkdata = create_drag_link(bmain, snode, node, sock);
BLI_addtail(&nldrag->links, linkdata);
}
@@ -836,31 +973,38 @@ static bNodeLinkDrag *node_link_init(Main *bmain, SpaceNode *snode, float cursor
nldrag = MEM_callocN(sizeof(bNodeLinkDrag), "drag link op customdata");
const int num_links = nodeCountSocketLinks(snode->edittree, sock);
- int link_limit = nodeSocketLinkLimit(sock);
- if (num_links > 0 && (num_links >= link_limit || detach)) {
+ if (num_links > 0) {
/* dragged links are fixed on output side */
nldrag->in_out = SOCK_OUT;
/* detach current links and store them in the operator data */
+ bNodeLink *link_to_pick;
LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &snode->edittree->links) {
if (link->tosock == sock) {
- LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data");
- bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link");
- linkdata->data = oplink;
- *oplink = *link;
- oplink->next = oplink->prev = NULL;
- oplink->flag |= NODE_LINK_VALID;
- oplink->flag &= ~NODE_LINK_TEST;
- if (node_connected_to_output(bmain, snode->edittree, link->tonode)) {
- oplink->flag |= NODE_LINK_TEST;
+ if (sock->flag & SOCK_MULTI_INPUT) {
+ nldrag->from_multi_input_socket = true;
}
+ link_to_pick = link;
+ }
+ }
- BLI_addtail(&nldrag->links, linkdata);
- nodeRemLink(snode->edittree, link);
+ if (link_to_pick != NULL && !nldrag->from_multi_input_socket) {
+ LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data");
+ bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link");
+ linkdata->data = oplink;
+ *oplink = *link_to_pick;
+ oplink->next = oplink->prev = NULL;
+ oplink->flag |= NODE_LINK_VALID;
+ oplink->flag &= ~NODE_LINK_TEST;
+ if (node_connected_to_output(bmain, snode->edittree, link_to_pick->tonode)) {
+ oplink->flag |= NODE_LINK_TEST;
+ }
- /* send changed event to original link->tonode */
- if (node) {
- snode_update(snode, node);
- }
+ BLI_addtail(&nldrag->links, linkdata);
+ nodeRemLink(snode->edittree, link_to_pick);
+
+ /* send changed event to original link->tonode */
+ if (node) {
+ snode_update(snode, node);
}
}
}
@@ -868,16 +1012,7 @@ static bNodeLinkDrag *node_link_init(Main *bmain, SpaceNode *snode, float cursor
/* dragged links are fixed on input side */
nldrag->in_out = SOCK_IN;
/* create a new link */
- LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data");
- bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link");
- linkdata->data = oplink;
- oplink->tonode = node;
- oplink->tosock = sock;
- oplink->flag |= NODE_LINK_VALID;
- oplink->flag &= ~NODE_LINK_TEST;
- if (node_connected_to_output(bmain, snode->edittree, node)) {
- oplink->flag |= NODE_LINK_TEST;
- }
+ LinkData *linkdata = create_drag_link(bmain, snode, node, sock);
BLI_addtail(&nldrag->links, linkdata);
}
@@ -896,6 +1031,9 @@ static int node_link_invoke(bContext *C, wmOperator *op, const wmEvent *event)
float cursor[2];
UI_view2d_region_to_view(&region->v2d, event->mval[0], event->mval[1], &cursor[0], &cursor[1]);
+ RNA_float_set_array(op->ptr, "drag_start", cursor);
+ RNA_int_set(op->ptr, "last_picked_link_index", -1);
+ RNA_boolean_set(op->ptr, "has_link_picked", false);
ED_preview_kill_jobs(CTX_wm_manager(C), bmain);
@@ -903,7 +1041,7 @@ static int node_link_invoke(bContext *C, wmOperator *op, const wmEvent *event)
if (nldrag) {
op->customdata = nldrag;
- BLI_addtail(&snode->linkdrag, nldrag);
+ BLI_addtail(&snode->runtime->linkdrag, nldrag);
/* add modal handler */
WM_event_add_modal_handler(C, op);
@@ -918,10 +1056,11 @@ static void node_link_cancel(bContext *C, wmOperator *op)
SpaceNode *snode = CTX_wm_space_node(C);
bNodeLinkDrag *nldrag = op->customdata;
- BLI_remlink(&snode->linkdrag, nldrag);
+ BLI_remlink(&snode->runtime->linkdrag, nldrag);
BLI_freelistN(&nldrag->links);
MEM_freeN(nldrag);
+ clear_picking_highlight(&snode->edittree->links);
}
void NODE_OT_link(wmOperatorType *ot)
@@ -941,7 +1080,38 @@ void NODE_OT_link(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
+ PropertyRNA *prop;
+
RNA_def_boolean(ot->srna, "detach", false, "Detach", "Detach and redirect existing links");
+ prop = RNA_def_boolean(
+ ot->srna,
+ "has_link_picked",
+ false,
+ "Has Link Picked",
+ "The operation has placed a link. Only used for multi-input sockets, where the "
+ "link is picked later");
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+ RNA_def_float_array(ot->srna,
+ "drag_start",
+ 2,
+ 0,
+ -UI_PRECISION_FLOAT_MAX,
+ UI_PRECISION_FLOAT_MAX,
+ "Drag Start",
+ "The position of the mouse cursor at the start of the operation",
+ -UI_PRECISION_FLOAT_MAX,
+ UI_PRECISION_FLOAT_MAX);
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+ RNA_def_int(ot->srna,
+ "last_picked_link_index",
+ -1,
+ -1,
+ 4095,
+ "Last Picked Link Index",
+ "The index of the last picked link on a multi-input socket",
+ -1,
+ 4095);
+ RNA_def_property_flag(prop, PROP_HIDDEN);
}
/* ********************** Make Link operator ***************** */
@@ -1513,7 +1683,7 @@ void ED_node_link_intersect_test(ScrArea *area, int test)
/* loop over link coords to find shortest dist to
* upper left node edge of a intersected line segment */
for (int i = 0; i < NODE_LINK_RESOL; i++) {
- /* check if the node rect intersetcts the line from this point to next one */
+ /* Check if the node rectangle intersects the line from this point to next one. */
if (BLI_rctf_isect_segment(&select->totr, coord_array[i], coord_array[i + 1])) {
/* store the shortest distance to the upper left edge
* of all intersections found so far */
@@ -1798,7 +1968,7 @@ static void node_link_insert_offset_ntree(NodeInsertOfsData *iofsd,
static int node_insert_offset_modal(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
{
SpaceNode *snode = CTX_wm_space_node(C);
- NodeInsertOfsData *iofsd = snode->iofsd;
+ NodeInsertOfsData *iofsd = snode->runtime->iofsd;
bool redraw = false;
if (!snode || event->type != TIMER || iofsd == NULL || iofsd->anim_timer != event->customdata) {
@@ -1837,7 +2007,7 @@ static int node_insert_offset_modal(bContext *C, wmOperator *UNUSED(op), const w
node->anim_init_locx = node->anim_ofsx = 0.0f;
}
- snode->iofsd = NULL;
+ snode->runtime->iofsd = NULL;
MEM_freeN(iofsd);
return (OPERATOR_FINISHED | OPERATOR_PASS_THROUGH);
@@ -1851,7 +2021,7 @@ static int node_insert_offset_modal(bContext *C, wmOperator *UNUSED(op), const w
static int node_insert_offset_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
const SpaceNode *snode = CTX_wm_space_node(C);
- NodeInsertOfsData *iofsd = snode->iofsd;
+ NodeInsertOfsData *iofsd = snode->runtime->iofsd;
if (!iofsd || !iofsd->insert) {
return OPERATOR_CANCELLED;
@@ -1927,7 +2097,7 @@ void ED_node_link_insert(Main *bmain, ScrArea *area)
iofsd->prev = link->fromnode;
iofsd->next = node;
- snode->iofsd = iofsd;
+ snode->runtime->iofsd = iofsd;
}
ntreeUpdateTree(bmain, snode->edittree); /* needed for pointers */
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index 5060ac0db8a..1e6ca66dd31 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -26,7 +26,6 @@
#include "DNA_node_types.h"
#include "DNA_windowmanager_types.h"
-#include "BLI_alloca.h"
#include "BLI_lasso_2d.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
@@ -62,14 +61,15 @@
#include "node_intern.h" /* own include */
-/* Function to detect if there is a visible view3d that uses workbench in texture mode.
+/**
+ * Function to detect if there is a visible view3d that uses workbench in texture mode.
* This function is for fixing T76970 for Blender 2.83. The actual fix should add a mechanism in
* the depsgraph that can be used by the draw engines to check if they need to be redrawn.
*
* We don't want to add these risky changes this close before releasing 2.83 without good testing
* hence this workaround. There are still cases were too many updates happen. For example when you
* have both a Cycles and workbench with textures viewport.
- * */
+ */
static bool has_workbench_in_texture_color(const wmWindowManager *wm,
const Scene *scene,
const Object *ob)
diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c
index 553971cd0a5..f0e3f5442cc 100644
--- a/source/blender/editors/space_node/node_templates.c
+++ b/source/blender/editors/space_node/node_templates.c
@@ -35,7 +35,6 @@
#include "BKE_context.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
-#include "BKE_scene.h"
#include "RNA_access.h"
diff --git a/source/blender/editors/space_node/node_toolbar.c b/source/blender/editors/space_node/node_toolbar.c
index 7afd3fef4db..2e7d6ab6cd5 100644
--- a/source/blender/editors/space_node/node_toolbar.c
+++ b/source/blender/editors/space_node/node_toolbar.c
@@ -29,9 +29,6 @@
#include "BKE_screen.h"
#include "WM_api.h"
-#include "WM_types.h"
-
-#include "ED_screen.h"
#include "node_intern.h" /* own include */
diff --git a/source/blender/editors/space_node/node_view.c b/source/blender/editors/space_node/node_view.c
index d938cb38270..8f1dc3c8c3e 100644
--- a/source/blender/editors/space_node/node_view.c
+++ b/source/blender/editors/space_node/node_view.c
@@ -52,7 +52,6 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-#include "NOD_composite.h"
#include "node_intern.h" /* own include */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 5960360dc33..289b7d9efa1 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -35,7 +35,6 @@
#include "BKE_context.h"
#include "BKE_lib_id.h"
#include "BKE_node.h"
-#include "BKE_scene.h"
#include "BKE_screen.h"
#include "ED_node.h"
@@ -326,18 +325,25 @@ static void node_free(SpaceLink *sl)
LISTBASE_FOREACH_MUTABLE (bNodeTreePath *, path, &snode->treepath) {
MEM_freeN(path);
}
+
+ MEM_SAFE_FREE(snode->runtime);
}
/* spacetype; init callback */
-static void node_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(area))
+static void node_init(struct wmWindowManager *UNUSED(wm), ScrArea *area)
{
+ SpaceNode *snode = (SpaceNode *)area->spacedata.first;
+
+ if (snode->runtime == NULL) {
+ snode->runtime = MEM_callocN(sizeof(SpaceNode_Runtime), __func__);
+ }
}
-static void node_area_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void node_area_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
+
/* note, ED_area_tag_refresh will re-execute compositor */
SpaceNode *snode = area->spacedata.first;
/* shaderfrom is only used for new shading nodes, otherwise all shaders are from objects */
@@ -367,7 +373,7 @@ static void node_area_listener(wmWindow *UNUSED(win),
case ND_TRANSFORM_DONE:
if (ED_node_is_compositor(snode)) {
if (snode->flag & SNODE_AUTO_RENDER) {
- snode->recalc = 1;
+ snode->runtime->recalc = true;
ED_area_tag_refresh(area);
}
}
@@ -526,8 +532,8 @@ static void node_area_refresh(const struct bContext *C, ScrArea *area)
Scene *scene = (Scene *)snode->id;
if (scene->use_nodes) {
/* recalc is set on 3d view changes for auto compo */
- if (snode->recalc) {
- snode->recalc = 0;
+ if (snode->runtime->recalc) {
+ snode->runtime->recalc = false;
node_render_changed_exec((struct bContext *)C, NULL);
}
else {
@@ -551,8 +557,10 @@ static SpaceLink *node_duplicate(SpaceLink *sl)
BLI_duplicatelist(&snoden->treepath, &snode->treepath);
- /* clear or remove stuff from old */
- BLI_listbase_clear(&snoden->linkdrag);
+ if (snode->runtime != NULL) {
+ snoden->runtime = MEM_dupallocN(snode->runtime);
+ BLI_listbase_clear(&snoden->runtime->linkdrag);
+ }
/* Note: no need to set node tree user counts,
* the editor only keeps at least 1 (id_us_ensure_real),
@@ -594,6 +602,16 @@ static void node_toolbar_region_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
+void ED_node_cursor_location_get(const SpaceNode *snode, float value[2])
+{
+ copy_v2_v2(value, snode->runtime->cursor);
+}
+
+void ED_node_cursor_location_set(SpaceNode *snode, const float value[2])
+{
+ copy_v2_v2(snode->runtime->cursor, value);
+}
+
static void node_cursor(wmWindow *win, ScrArea *area, ARegion *region)
{
SpaceNode *snode = area->spacedata.first;
@@ -602,15 +620,15 @@ static void node_cursor(wmWindow *win, ScrArea *area, ARegion *region)
UI_view2d_region_to_view(&region->v2d,
win->eventstate->x - region->winrct.xmin,
win->eventstate->y - region->winrct.ymin,
- &snode->cursor[0],
- &snode->cursor[1]);
+ &snode->runtime->cursor[0],
+ &snode->runtime->cursor[1]);
- /* here snode->cursor is used to detect the node edge for sizing */
- node_set_cursor(win, snode, snode->cursor);
+ /* here snode->runtime->cursor is used to detect the node edge for sizing */
+ node_set_cursor(win, snode, snode->runtime->cursor);
- /* XXX snode->cursor is in placing new nodes space */
- snode->cursor[0] /= UI_DPI_FAC;
- snode->cursor[1] /= UI_DPI_FAC;
+ /* XXX snode->runtime->cursor is in placing new nodes space */
+ snode->runtime->cursor[0] /= UI_DPI_FAC;
+ snode->runtime->cursor[1] /= UI_DPI_FAC;
}
/* Initialize main region, setting handlers. */
@@ -641,6 +659,14 @@ static void node_main_region_draw(const bContext *C, ARegion *region)
/* ************* dropboxes ************* */
+static bool node_group_drop_poll(bContext *UNUSED(C),
+ wmDrag *drag,
+ const wmEvent *UNUSED(event),
+ const char **UNUSED(r_tooltip))
+{
+ return WM_drag_is_ID_type(drag, ID_NT);
+}
+
static bool node_ima_drop_poll(bContext *UNUSED(C),
wmDrag *drag,
const wmEvent *UNUSED(event),
@@ -650,7 +676,7 @@ static bool node_ima_drop_poll(bContext *UNUSED(C),
/* rule might not work? */
return (ELEM(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_MOVIE));
}
- return WM_drag_get_local_ID(drag, ID_IM) != NULL;
+ return WM_drag_is_ID_type(drag, ID_IM);
}
static bool node_mask_drop_poll(bContext *UNUSED(C),
@@ -658,19 +684,26 @@ static bool node_mask_drop_poll(bContext *UNUSED(C),
const wmEvent *UNUSED(event),
const char **UNUSED(r_tooltip))
{
- return WM_drag_get_local_ID(drag, ID_MSK) != NULL;
+ return WM_drag_is_ID_type(drag, ID_MSK);
+}
+
+static void node_group_drop_copy(wmDrag *drag, wmDropBox *drop)
+{
+ ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
+
+ RNA_string_set(drop->ptr, "name", id->name + 2);
}
static void node_id_drop_copy(wmDrag *drag, wmDropBox *drop)
{
- ID *id = WM_drag_get_local_ID(drag, 0);
+ ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
RNA_string_set(drop->ptr, "name", id->name + 2);
}
static void node_id_path_drop_copy(wmDrag *drag, wmDropBox *drop)
{
- ID *id = WM_drag_get_local_ID(drag, 0);
+ ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
if (id) {
RNA_string_set(drop->ptr, "name", id->name + 2);
@@ -687,8 +720,21 @@ static void node_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW);
- WM_dropbox_add(lb, "NODE_OT_add_file", node_ima_drop_poll, node_id_path_drop_copy);
- WM_dropbox_add(lb, "NODE_OT_add_mask", node_mask_drop_poll, node_id_drop_copy);
+ WM_dropbox_add(lb,
+ "NODE_OT_add_group",
+ node_group_drop_poll,
+ node_group_drop_copy,
+ WM_drag_free_imported_drag_ID);
+ WM_dropbox_add(lb,
+ "NODE_OT_add_file",
+ node_ima_drop_poll,
+ node_id_path_drop_copy,
+ WM_drag_free_imported_drag_ID);
+ WM_dropbox_add(lb,
+ "NODE_OT_add_mask",
+ node_mask_drop_poll,
+ node_id_drop_copy,
+ WM_drag_free_imported_drag_ID);
}
/* ************* end drop *********** */
@@ -708,12 +754,10 @@ static void node_header_region_draw(const bContext *C, ARegion *region)
}
/* used for header + main region */
-static void node_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void node_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
wmGizmoMap *gzmap = region->gizmo_map;
/* context changes */
diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index e0262371559..d54265aa292 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -27,6 +27,7 @@ set(INC
../../makesrna
../../sequencer
../../windowmanager
+ ../../../../intern/clog
../../../../intern/glew-mx
../../../../intern/guardedalloc
)
diff --git a/source/blender/editors/space_outliner/outliner_context.c b/source/blender/editors/space_outliner/outliner_context.c
index a314a640e42..e2b3b79e027 100644
--- a/source/blender/editors/space_outliner/outliner_context.c
+++ b/source/blender/editors/space_outliner/outliner_context.c
@@ -27,8 +27,6 @@
#include "DNA_space_types.h"
-#include "RNA_access.h"
-
#include "outliner_intern.h"
static void outliner_context_selected_ids_recursive(const ListBase *subtree,
diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c
index ab515c0c3a8..6df1e449b97 100644
--- a/source/blender/editors/space_outliner/outliner_dragdrop.c
+++ b/source/blender/editors/space_outliner/outliner_dragdrop.c
@@ -140,6 +140,11 @@ static TreeElement *outliner_drop_insert_find(bContext *C,
TreeElement *te_hovered;
float view_mval[2];
+ /* Empty tree, e.g. while filtered. */
+ if (BLI_listbase_is_empty(&space_outliner->tree)) {
+ return NULL;
+ }
+
UI_view2d_region_to_view(
&region->v2d, event->mval[0], event->mval[1], &view_mval[0], &view_mval[1]);
te_hovered = outliner_find_item_at_y(space_outliner, &space_outliner->tree, view_mval[1]);
@@ -1478,7 +1483,7 @@ static int outliner_item_drag_drop_invoke(bContext *C,
/* Outliner drag and drop. This operator mostly exists to support dragging
* from outliner text instead of only from the icon, and also to show a
- * hint in the statusbar keymap. */
+ * hint in the status-bar key-map. */
void OUTLINER_OT_item_drag_drop(wmOperatorType *ot)
{
@@ -1499,10 +1504,10 @@ void outliner_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("Outliner", SPACE_OUTLINER, RGN_TYPE_WINDOW);
- WM_dropbox_add(lb, "OUTLINER_OT_parent_drop", parent_drop_poll, NULL);
- WM_dropbox_add(lb, "OUTLINER_OT_parent_clear", parent_clear_poll, NULL);
- WM_dropbox_add(lb, "OUTLINER_OT_scene_drop", scene_drop_poll, NULL);
- WM_dropbox_add(lb, "OUTLINER_OT_material_drop", material_drop_poll, NULL);
- WM_dropbox_add(lb, "OUTLINER_OT_datastack_drop", datastack_drop_poll, NULL);
- WM_dropbox_add(lb, "OUTLINER_OT_collection_drop", collection_drop_poll, NULL);
+ WM_dropbox_add(lb, "OUTLINER_OT_parent_drop", parent_drop_poll, NULL, NULL);
+ WM_dropbox_add(lb, "OUTLINER_OT_parent_clear", parent_clear_poll, NULL, NULL);
+ WM_dropbox_add(lb, "OUTLINER_OT_scene_drop", scene_drop_poll, NULL, NULL);
+ WM_dropbox_add(lb, "OUTLINER_OT_material_drop", material_drop_poll, NULL, NULL);
+ WM_dropbox_add(lb, "OUTLINER_OT_datastack_drop", datastack_drop_poll, NULL, NULL);
+ WM_dropbox_add(lb, "OUTLINER_OT_collection_drop", collection_drop_poll, NULL, NULL);
}
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 8104c1e0d58..008ae727947 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -314,7 +314,7 @@ static void outliner_object_set_flag_recursive_fn(bContext *C,
/**
* Object properties.
- * */
+ */
static void outliner__object_set_flag_recursive_fn(bContext *C, void *poin, void *poin2)
{
Object *ob = poin;
@@ -324,7 +324,7 @@ static void outliner__object_set_flag_recursive_fn(bContext *C, void *poin, void
/**
* Base properties.
- * */
+ */
static void outliner__base_set_flag_recursive_fn(bContext *C, void *poin, void *poin2)
{
Base *base = poin;
@@ -697,13 +697,13 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
}
DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE);
- WM_event_add_notifier(C, NC_ID | NA_RENAME, NULL);
break;
}
default:
- WM_event_add_notifier(C, NC_ID | NA_RENAME, NULL);
break;
}
+ WM_event_add_notifier(C, NC_ID | NA_RENAME, NULL);
+
/* Check the library target exists */
if (te->idcode == ID_LI) {
Library *lib = (Library *)tselem->id;
@@ -760,7 +760,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
char newname[sizeof(bone->name)];
/* always make current object active */
- tree_element_active(C, &tvc, space_outliner, te, OL_SETSEL_NORMAL, true);
+ tree_element_activate(C, &tvc, te, OL_SETSEL_NORMAL, true);
/* restore bone name */
BLI_strncpy(newname, bone->name, sizeof(bone->name));
@@ -778,7 +778,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
char newname[sizeof(pchan->name)];
/* always make current pose-bone active */
- tree_element_active(C, &tvc, space_outliner, te, OL_SETSEL_NORMAL, true);
+ tree_element_activate(C, &tvc, te, OL_SETSEL_NORMAL, true);
BLI_assert(ob->type == OB_ARMATURE);
@@ -1876,9 +1876,7 @@ static void outliner_buttons(const bContext *C,
tselem = TREESTORE(te);
BLI_assert(tselem->flag & TSE_TEXTBUT);
- /* If we add support to rename Sequence.
- * need change this.
- */
+ /* If we add support to rename Sequence, need change this. */
if (tselem->type == TSE_EBONE) {
len = sizeof(((EditBone *)0)->name);
@@ -1912,11 +1910,11 @@ static void outliner_buttons(const bContext *C,
"");
UI_but_func_rename_set(bt, namebutton_fn, tselem);
- /* returns false if button got removed */
+ /* Returns false if button got removed. */
if (false == UI_but_active_only(C, region, block, bt)) {
tselem->flag &= ~TSE_TEXTBUT;
- /* bad! (notifier within draw) without this, we don't get a refresh */
+ /* Bad! (notifier within draw) without this, we don't get a refresh. */
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_OUTLINER, NULL);
}
}
@@ -2287,12 +2285,6 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
case TSE_R_LAYER:
data.icon = ICON_RENDER_RESULT;
break;
- case TSE_LINKED_LAMP:
- data.icon = ICON_LIGHT_DATA;
- break;
- case TSE_LINKED_MAT:
- data.icon = ICON_MATERIAL_DATA;
- break;
case TSE_POSEGRP_BASE:
case TSE_POSEGRP:
data.icon = ICON_GROUP_BONE;
@@ -2629,7 +2621,7 @@ static void tselem_draw_icon(uiBlock *block,
/* Collection colors and icons covered by restrict buttons. */
if (!is_clickable || x >= xmax || is_collection) {
- /* placement of icons, copied from interface_widgets.c */
+ /* Placement of icons, copied from interface_widgets.c */
float aspect = (0.8f * UI_UNIT_Y) / ICON_DEFAULT_HEIGHT;
x += 2.0f * aspect;
y += 2.0f * aspect;
@@ -2653,8 +2645,7 @@ static void tselem_draw_icon(uiBlock *block,
/* Reduce alpha to match icon buttons */
alpha *= 0.8f;
- /* restrict column clip... it has been coded by simply overdrawing,
- * doesn't work for buttons */
+ /* Restrict column clip. it has been coded by simply overdrawing, doesn't work for buttons. */
uchar color[4];
if (UI_icon_get_theme_color(data.icon, color)) {
UI_icon_draw_ex(x, y, data.icon, U.inv_dpi_fac, alpha, 0.0f, color, true);
@@ -2695,13 +2686,16 @@ static void outliner_draw_iconrow_number(const uiFontStyle *fstyle,
float offset_x = (float)offsx + UI_UNIT_X * 0.35f;
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(true,
- offset_x + ufac,
- (float)ys - UI_UNIT_Y * 0.2f + ufac,
- offset_x + UI_UNIT_X - ufac,
- (float)ys - UI_UNIT_Y * 0.2f + UI_UNIT_Y - ufac,
- (float)UI_UNIT_Y / 2.0f - ufac,
- color);
+ UI_draw_roundbox_aa(
+ &(const rctf){
+ .xmin = offset_x + ufac,
+ .xmax = offset_x + UI_UNIT_X - ufac,
+ .ymin = (float)ys - UI_UNIT_Y * 0.2f + ufac,
+ .ymax = (float)ys - UI_UNIT_Y * 0.2f + UI_UNIT_Y - ufac,
+ },
+ true,
+ (float)UI_UNIT_Y / 2.0f - ufac,
+ color);
/* Now the numbers. */
uchar text_col[4];
@@ -2751,8 +2745,26 @@ static void outliner_draw_active_indicator(const float minx,
const float radius = UI_UNIT_Y / 4.0f;
UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(true, minx, miny + ufac, maxx, maxy - ufac, radius, icon_color);
- UI_draw_roundbox_aa(false, minx, miny + ufac, maxx, maxy - ufac, radius, icon_border);
+ UI_draw_roundbox_aa(
+ &(const rctf){
+ .xmin = minx,
+ .xmax = maxx,
+ .ymin = miny + ufac,
+ .ymax = maxy - ufac,
+ },
+ true,
+ radius,
+ icon_color);
+ UI_draw_roundbox_aa(
+ &(const rctf){
+ .xmin = minx,
+ .xmax = maxx,
+ .ymin = miny + ufac,
+ .ymax = maxy - ufac,
+ },
+ false,
+ radius,
+ icon_border);
GPU_blend(GPU_BLEND_ALPHA); /* Roundbox disables. */
}
@@ -2860,16 +2872,11 @@ static void outliner_draw_iconrow(bContext *C,
active = OL_DRAWSEL_ACTIVE;
}
else {
- active = tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NONE, false);
+ active = tree_element_active_state_get(tvc, te, tselem);
}
}
- else if (tselem->type == TSE_GP_LAYER) {
- bGPDlayer *gpl = te->directdata;
- active = (gpl->flag & GP_LAYER_ACTIVE) ? OL_DRAWSEL_ACTIVE : OL_DRAWSEL_NONE;
- }
else {
- active = tree_element_type_active(
- C, tvc, space_outliner, te, tselem, OL_SETSEL_NONE, false);
+ active = tree_element_type_active_state_get(C, tvc, te, tselem);
}
if (!ELEM(tselem->type, 0, TSE_LAYER_COLLECTION, TSE_R_LAYER, TSE_GP_LAYER)) {
@@ -2943,6 +2950,41 @@ static void outliner_set_coord_tree_element(TreeElement *te, int startx, int sta
}
}
+static bool element_should_draw_faded(const TreeViewContext *tvc,
+ const TreeElement *te,
+ const TreeStoreElem *tselem)
+{
+ if (tselem->type == 0) {
+ switch (te->idcode) {
+ case ID_OB: {
+ const Object *ob = (const Object *)tselem->id;
+ /* Lookup in view layer is logically const as it only checks a cache. */
+ const Base *base = (te->directdata) ? (const Base *)te->directdata :
+ BKE_view_layer_base_find(
+ (ViewLayer *)tvc->view_layer, (Object *)ob);
+ const bool is_visible = (base != NULL) && (base->flag & BASE_VISIBLE_VIEWLAYER);
+ if (!is_visible) {
+ return true;
+ }
+ }
+ }
+ }
+ switch (tselem->type) {
+ case TSE_LAYER_COLLECTION: {
+ const LayerCollection *layer_collection = (const LayerCollection *)te->directdata;
+ const bool is_visible = layer_collection->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER;
+ const bool is_excluded = layer_collection->flag & LAYER_COLLECTION_EXCLUDE;
+ return !is_visible || is_excluded;
+ }
+ }
+
+ if (te->flag & TE_CHILD_NOT_IN_COLLECTION) {
+ return true;
+ }
+
+ return false;
+}
+
static void outliner_draw_tree_element(bContext *C,
uiBlock *block,
const uiFontStyle *fstyle,
@@ -2966,33 +3008,23 @@ static void outliner_draw_tree_element(bContext *C,
outliner_icon_background_colors(icon_bgcolor, icon_border);
if (*starty + 2 * UI_UNIT_Y >= region->v2d.cur.ymin && *starty <= region->v2d.cur.ymax) {
- const float alpha_fac = ((te->flag & TE_DISABLED) || (te->flag & TE_CHILD_NOT_IN_COLLECTION) ||
- draw_grayed_out) ?
- 0.5f :
- 1.0f;
+ const float alpha_fac = element_should_draw_faded(tvc, te, tselem) ? 0.5f : 1.0f;
int xmax = region->v2d.cur.xmax;
if ((tselem->flag & TSE_TEXTBUT) && (*te_edit == NULL)) {
*te_edit = te;
}
- /* icons can be ui buts, we don't want it to overlap with restrict */
+ /* Icons can be ui buts, we don't want it to overlap with restrict .*/
if (restrict_column_width > 0) {
xmax -= restrict_column_width + UI_UNIT_X;
}
GPU_blend(GPU_BLEND_ALPHA);
- /* colors for active/selected data */
+ /* Colors for active/selected data. */
if (tselem->type == 0) {
- if (te->idcode == ID_SCE) {
- if (tselem->id == (ID *)tvc->scene) {
- /* active scene */
- icon_bgcolor[3] = 0.2f;
- active = OL_DRAWSEL_ACTIVE;
- }
- }
- else if (te->idcode == ID_OB) {
+ if (te->idcode == ID_OB) {
Object *ob = (Object *)tselem->id;
Base *base = (te->directdata) ? (Base *)te->directdata :
BKE_view_layer_base_find(tvc->view_layer, ob);
@@ -3004,44 +3036,36 @@ static void outliner_draw_tree_element(bContext *C,
if (is_selected) {
if (ob == tvc->obact) {
- /* active selected object */
+ /* Active selected object. */
UI_GetThemeColor3ubv(TH_ACTIVE_OBJECT, text_color);
text_color[3] = 255;
}
else {
- /* other selected objects */
+ /* Other selected objects. */
UI_GetThemeColor3ubv(TH_SELECTED_OBJECT, text_color);
text_color[3] = 255;
}
}
}
else if (is_object_data_in_editmode(tselem->id, tvc->obact)) {
- /* objects being edited */
+ /* Objects being edited. */
UI_GetThemeColor4fv(TH_EDITED_OBJECT, icon_bgcolor);
icon_border[3] = 0.3f;
active = OL_DRAWSEL_ACTIVE;
}
else {
- if (tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NONE, false)) {
- /* active items like camera or material */
+ if (tree_element_active_state_get(tvc, te, tselem)) {
+ /* Active items like camera or material. */
icon_bgcolor[3] = 0.2f;
active = OL_DRAWSEL_ACTIVE;
}
}
}
- else if (tselem->type == TSE_GP_LAYER) {
- /* Active grease pencil layer. */
- if (((bGPDlayer *)te->directdata)->flag & GP_LAYER_ACTIVE) {
- icon_bgcolor[3] = 0.2f;
- active = OL_DRAWSEL_ACTIVE;
- }
- }
else {
- active = tree_element_type_active(C, tvc, space_outliner, te, tselem, OL_SETSEL_NONE, false);
- /* active collection*/
+ active = tree_element_type_active_state_get(C, tvc, te, tselem);
}
- /* active circle */
+ /* Active circle. */
if (active != OL_DRAWSEL_NONE) {
outliner_draw_active_indicator((float)startx + offsx + UI_UNIT_X,
(float)*starty,
@@ -3058,7 +3082,7 @@ static void outliner_draw_tree_element(bContext *C,
}
else if (te->subtree.first || (tselem->type == 0 && te->idcode == ID_SCE) ||
(te->flag & TE_LAZY_CLOSED)) {
- /* open/close icon, only when sublevels, except for scene */
+ /* Open/close icon, only when sub-levels, except for scene. */
int icon_x = startx;
/* Icons a bit higher. */
@@ -3077,7 +3101,7 @@ static void outliner_draw_tree_element(bContext *C,
}
offsx += UI_UNIT_X;
- /* datatype icon */
+ /* Data-type icon. */
if (!(ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM, TSE_ID_BASE))) {
tselem_draw_icon(block,
xmax,
@@ -3104,7 +3128,7 @@ static void outliner_draw_tree_element(bContext *C,
}
GPU_blend(GPU_BLEND_NONE);
- /* name */
+ /* Name. */
if ((tselem->flag & TSE_TEXTBUT) == 0) {
if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) {
UI_GetThemeColorBlend3ubv(TH_BACK, TH_TEXT, 0.75f, text_color);
@@ -3116,11 +3140,11 @@ static void outliner_draw_tree_element(bContext *C,
offsx += (int)(UI_UNIT_X + UI_fontstyle_string_width(fstyle, te->name));
- /* closed item, we draw the icons, not when it's a scene, or master-server list though */
+ /* Closed item, we draw the icons, not when it's a scene, or master-server list though. */
if (!TSELEM_OPEN(tselem, space_outliner)) {
if (te->subtree.first) {
if (tselem->type == 0 && te->idcode == ID_SCE) {
- /* pass */
+ /* Pass. */
}
/* this tree element always has same amount of branches, so don't draw */
else if (tselem->type != TSE_R_LAYER) {
@@ -3147,7 +3171,7 @@ static void outliner_draw_tree_element(bContext *C,
}
}
}
- /* store coord and continue, we need coordinates for elements outside view too */
+ /* Store coord and continue, we need coordinates for elements outside view too. */
te->xs = startx;
te->ys = *starty;
te->xend = startx + offsx;
@@ -3301,7 +3325,7 @@ static void outliner_draw_struct_marks(ARegion *region,
LISTBASE_FOREACH (TreeElement *, te, lb) {
TreeStoreElem *tselem = TREESTORE(te);
- /* selection status */
+ /* Selection status. */
if (TSELEM_OPEN(tselem, space_outliner)) {
if (tselem->type == TSE_RNA_STRUCT) {
GPUVertFormat *format = immVertexFormat();
@@ -3352,7 +3376,7 @@ static void outliner_draw_highlights_recursive(uint pos,
const TreeStoreElem *tselem = TREESTORE(te);
const int start_y = *io_start_y;
- /* selection status */
+ /* Selection status. */
if ((tselem->flag & TSE_ACTIVE) && (tselem->flag & TSE_SELECTED)) {
immUniformColor4fv(col_active);
immRecti(pos, 0, start_y, (int)region->v2d.cur.xmax, start_y + UI_UNIT_Y);
@@ -3362,12 +3386,12 @@ static void outliner_draw_highlights_recursive(uint pos,
immRecti(pos, 0, start_y, (int)region->v2d.cur.xmax, start_y + UI_UNIT_Y);
}
- /* highlights */
+ /* Highlights. */
if (tselem->flag & (TSE_DRAG_ANY | TSE_HIGHLIGHTED | TSE_SEARCHMATCH)) {
const int end_x = (int)region->v2d.cur.xmax;
if (tselem->flag & TSE_DRAG_ANY) {
- /* drag and drop highlight */
+ /* Drag and drop highlight. */
float col[4];
UI_GetThemeColorShade4fv(TH_BACK, -40, col);
@@ -3390,14 +3414,13 @@ static void outliner_draw_highlights_recursive(uint pos,
}
else {
if (is_searching && (tselem->flag & TSE_SEARCHMATCH)) {
- /* search match highlights
- * we don't expand items when searching in the data-blocks but we
- * still want to highlight any filter matches. */
+ /* Search match highlights. We don't expand items when searching in the data-blocks,
+ * but we still want to highlight any filter matches. */
immUniformColor4fv(col_searchmatch);
immRecti(pos, start_x, start_y, end_x, start_y + UI_UNIT_Y);
}
else if (tselem->flag & TSE_HIGHLIGHTED) {
- /* mouse hover highlight */
+ /* Mouse hover highlight. */
immUniformColor4fv(col_highlight);
immRecti(pos, 0, start_y, end_x, start_y + UI_UNIT_Y);
}
@@ -3429,9 +3452,9 @@ static void outliner_draw_highlights(ARegion *region,
float col_selection[4], col_active[4], col_searchmatch[4];
UI_GetThemeColor3fv(TH_SELECT_HIGHLIGHT, col_selection);
- col_selection[3] = 1.0f; /* no alpha */
+ col_selection[3] = 1.0f; /* No alpha. */
UI_GetThemeColor3fv(TH_SELECT_ACTIVE, col_active);
- col_active[3] = 1.0f; /* no alpha */
+ col_active[3] = 1.0f; /* No alpha. */
UI_GetThemeColor4fv(TH_MATCH, col_searchmatch);
col_searchmatch[3] = 0.5f;
@@ -3481,12 +3504,12 @@ static void outliner_draw_tree(bContext *C,
outliner_draw_struct_marks(region, space_outliner, &space_outliner->tree, &starty);
}
- /* draw highlights before hierarchy */
+ /* Draw highlights before hierarchy. */
starty = (int)region->v2d.tot.ymax - UI_UNIT_Y - OL_Y_OFFSET;
startx = 0;
outliner_draw_highlights(region, space_outliner, startx, &starty);
- /* set scissor so tree elements or lines can't overlap restriction icons */
+ /* Set scissor so tree elements or lines can't overlap restriction icons. */
int scissor[4] = {0};
if (restrict_column_width > 0.0f) {
int mask_x = BLI_rcti_size_x(&region->v2d.mask) - (int)restrict_column_width + 1;
@@ -3496,7 +3519,7 @@ static void outliner_draw_tree(bContext *C,
GPU_scissor(0, 0, mask_x, region->winy);
}
- /* Draw hierarhcy lines for collections and object children. */
+ /* Draw hierarchy lines for collections and object children. */
starty = (int)region->v2d.tot.ymax - OL_Y_OFFSET;
startx = mode_column_offset + UI_UNIT_X / 2 - (U.pixelsize + 1) / 2;
outliner_draw_hierarchy_lines(space_outliner, &space_outliner->tree, startx, &starty);
@@ -3520,7 +3543,7 @@ static void outliner_draw_tree(bContext *C,
}
if (restrict_column_width > 0.0f) {
- /* reset scissor */
+ /* Reset scissor. */
GPU_scissor(UNPACK4(scissor));
}
}
@@ -3587,7 +3610,7 @@ static void outliner_update_viewable_area(ARegion *region,
int sizex = outliner_width(space_outliner, tree_width, restrict_column_width);
int sizey = tree_height;
- /* extend size to allow for horizontal scrollbar and extra offset */
+ /* Extend size to allow for horizontal scrollbar and extra offset. */
sizey += V2D_SCROLL_HEIGHT + OL_Y_OFFSET;
UI_view2d_totRect_set(&region->v2d, sizex, sizey);
@@ -3610,27 +3633,27 @@ void draw_outliner(const bContext *C)
outliner_build_tree(mainvar, tvc.scene, tvc.view_layer, space_outliner, region); /* Always. */
- /* If global sync select is dirty, flag other outliners */
+ /* If global sync select is dirty, flag other outliners. */
if (ED_outliner_select_sync_is_dirty(C)) {
ED_outliner_select_sync_flag_outliners(C);
}
- /* Sync selection state from view layer */
+ /* Sync selection state from view layer. */
if (!ELEM(space_outliner->outlinevis, SO_LIBRARIES, SO_DATA_API, SO_ID_ORPHANS) &&
space_outliner->flag & SO_SYNC_SELECT) {
outliner_sync_selection(C, space_outliner);
}
- /* force display to pixel coords */
+ /* Force display to pixel coords. */
v2d->flag |= (V2D_PIXELOFS_X | V2D_PIXELOFS_Y);
- /* set matrix for 2d-view controls */
+ /* Set matrix for 2D-view controls. */
UI_view2d_view_ortho(v2d);
- /* Only show mode column in View Layers and Scenes view */
+ /* Only show mode column in View Layers and Scenes view. */
const bool use_mode_column = (space_outliner->flag & SO_MODE_COLUMN) &&
(ELEM(space_outliner->outlinevis, SO_VIEW_LAYER, SO_SCENES));
- /* draw outliner stuff (background, hierarchy lines and names) */
+ /* Draw outliner stuff (background, hierarchy lines and names). */
const float restrict_column_width = outliner_restrict_columns_width(space_outliner);
outliner_back(region);
block = UI_block_begin(C, region, __func__, UI_EMBOSS);
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 339cc3068d0..593c33bd3df 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -153,8 +153,7 @@ enum {
TE_ICONROW = (1 << 1),
TE_LAZY_CLOSED = (1 << 2),
TE_FREE_NAME = (1 << 3),
- TE_DISABLED = (1 << 4),
- TE_DRAGGING = (1 << 5),
+ TE_DRAGGING = (1 << 4),
TE_CHILD_NOT_IN_COLLECTION = (1 << 6),
/* Child elements of the same type in the icon-row are drawn merged as one icon.
* This flag is set for an element that is part of these merged child icons. */
@@ -289,19 +288,24 @@ void outliner_collection_isolate_flag(struct Scene *scene,
int tree_element_id_type_to_index(TreeElement *te);
/* outliner_select.c -------------------------------------------- */
-eOLDrawState tree_element_type_active(struct bContext *C,
- const TreeViewContext *tvc,
- struct SpaceOutliner *space_outliner,
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set,
- bool recursive);
-eOLDrawState tree_element_active(struct bContext *C,
- const TreeViewContext *tvc,
- SpaceOutliner *space_outliner,
- TreeElement *te,
- const eOLSetState set,
- const bool handle_all_types);
+void tree_element_type_active_set(struct bContext *C,
+ const TreeViewContext *tvc,
+ TreeElement *te,
+ TreeStoreElem *tselem,
+ const eOLSetState set,
+ bool recursive);
+eOLDrawState tree_element_type_active_state_get(const struct bContext *C,
+ const struct TreeViewContext *tvc,
+ const TreeElement *te,
+ const TreeStoreElem *tselem);
+void tree_element_activate(struct bContext *C,
+ const TreeViewContext *tvc,
+ TreeElement *te,
+ const eOLSetState set,
+ const bool handle_all_types);
+eOLDrawState tree_element_active_state_get(const TreeViewContext *tvc,
+ const TreeElement *te,
+ const TreeStoreElem *tselem);
struct bPoseChannel *outliner_find_parent_bone(TreeElement *te, TreeElement **r_bone_te);
@@ -388,21 +392,6 @@ void id_remap_fn(struct bContext *C,
struct TreeStoreElem *tselem,
void *user_data);
-void item_object_mode_enter_fn(struct bContext *C,
- struct ReportList *reports,
- struct Scene *scene,
- TreeElement *te,
- struct TreeStoreElem *tsep,
- struct TreeStoreElem *tselem,
- void *user_data);
-void item_object_mode_exit_fn(struct bContext *C,
- struct ReportList *reports,
- struct Scene *scene,
- TreeElement *te,
- struct TreeStoreElem *tsep,
- struct TreeStoreElem *tselem,
- void *user_data);
-
void outliner_set_coordinates(struct ARegion *region, struct SpaceOutliner *space_outliner);
void outliner_item_openclose(struct SpaceOutliner *space_outliner,
diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c
index acda5ae82f0..7e5b0c90714 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -21,22 +21,9 @@
* \ingroup spoutliner
*/
-#include "MEM_guardedalloc.h"
-
-#include "DNA_collection_types.h"
-
-#include "BLT_translation.h"
-
-#include "RNA_access.h"
-
-#include "UI_interface.h"
-#include "UI_view2d.h"
-
#include "WM_api.h"
-#include "WM_types.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
#include "outliner_intern.h"
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index 600047c4b11..e31af48ab7e 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -222,32 +222,21 @@ void outliner_item_mode_toggle(bContext *C,
/* ****************************************************** */
/* Outliner Element Selection/Activation on Click */
-static eOLDrawState active_viewlayer(bContext *C,
- Scene *UNUSED(scene),
- ViewLayer *UNUSED(sl),
- TreeElement *te,
- const eOLSetState set)
+static void tree_element_viewlayer_activate(bContext *C, TreeElement *te)
{
/* paranoia check */
if (te->idcode != ID_SCE) {
- return OL_DRAWSEL_NONE;
+ return;
}
ViewLayer *view_layer = te->directdata;
+ wmWindow *win = CTX_wm_window(C);
+ Scene *scene = WM_window_get_active_scene(win);
- if (set != OL_SETSEL_NONE) {
- wmWindow *win = CTX_wm_window(C);
- Scene *scene = WM_window_get_active_scene(win);
-
- if (BLI_findindex(&scene->view_layers, view_layer) != -1) {
- WM_window_set_active_view_layer(win, view_layer);
- WM_event_add_notifier(C, NC_SCREEN | ND_LAYER, NULL);
- }
- }
- else {
- return CTX_data_view_layer(C) == view_layer;
+ if (BLI_findindex(&scene->view_layers, view_layer) != -1) {
+ WM_window_set_active_view_layer(win, view_layer);
+ WM_event_add_notifier(C, NC_SCREEN | ND_LAYER, NULL);
}
- return OL_DRAWSEL_NONE;
}
/**
@@ -297,13 +286,12 @@ static void do_outliner_ebone_select_recursive(bArmature *arm, EditBone *ebone_p
}
}
-static eOLDrawState tree_element_set_active_object(bContext *C,
- Scene *scene,
- ViewLayer *view_layer,
- SpaceOutliner *UNUSED(space_outliner),
- TreeElement *te,
- const eOLSetState set,
- bool recursive)
+static void tree_element_object_activate(bContext *C,
+ Scene *scene,
+ ViewLayer *view_layer,
+ TreeElement *te,
+ const eOLSetState set,
+ bool recursive)
{
TreeStoreElem *tselem = TREESTORE(te);
TreeStoreElem *parent_tselem = NULL;
@@ -324,12 +312,12 @@ static eOLDrawState tree_element_set_active_object(bContext *C,
/* Don't return when activating children of the previous active object. */
if (ob == OBACT(view_layer) && set == OL_SETSEL_NONE) {
- return OL_DRAWSEL_NONE;
+ return;
}
}
}
if (ob == NULL) {
- return OL_DRAWSEL_NONE;
+ return;
}
sce = (Scene *)outliner_search_back(te, ID_SCE);
@@ -403,322 +391,200 @@ static eOLDrawState tree_element_set_active_object(bContext *C,
WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
}
}
- return OL_DRAWSEL_NORMAL;
}
-static eOLDrawState tree_element_active_material(bContext *C,
- Scene *UNUSED(scene),
- ViewLayer *view_layer,
- TreeElement *te,
- const eOLSetState set)
+static void tree_element_material_activate(bContext *C, ViewLayer *view_layer, TreeElement *te)
{
- TreeElement *tes;
- Object *ob;
-
/* we search for the object parent */
- ob = (Object *)outliner_search_back(te, ID_OB);
+ Object *ob = (Object *)outliner_search_back(te, ID_OB);
/* Note : ob->matbits can be NULL when a local object points to a library mesh. */
if (ob == NULL || ob != OBACT(view_layer) || ob->matbits == NULL) {
- return OL_DRAWSEL_NONE; /* just paranoia */
+ return; /* just paranoia */
}
- /* searching in ob mat array? */
- tes = te->parent;
+ /* In ob mat array? */
+ TreeElement *tes = te->parent;
if (tes->idcode == ID_OB) {
- if (set != OL_SETSEL_NONE) {
- ob->actcol = te->index + 1;
- ob->matbits[te->index] = 1; /* Make ob material active too. */
- }
- else {
- if (ob->actcol == te->index + 1) {
- if (ob->matbits[te->index]) {
- return OL_DRAWSEL_NORMAL;
- }
- }
- }
+ ob->actcol = te->index + 1;
+ ob->matbits[te->index] = 1; /* Make ob material active too. */
}
- /* or we search for obdata material */
else {
- if (set != OL_SETSEL_NONE) {
- ob->actcol = te->index + 1;
- ob->matbits[te->index] = 0; /* Make obdata material active too. */
- }
- else {
- if (ob->actcol == te->index + 1) {
- if (ob->matbits[te->index] == 0) {
- return OL_DRAWSEL_NORMAL;
- }
- }
- }
- }
- if (set != OL_SETSEL_NONE) {
- /* Tagging object for update seems a bit stupid here, but looks like we have to do it
- * for render views to update. See T42973.
- * Note that RNA material update does it too, see e.g. rna_MaterialSlot_update(). */
- DEG_id_tag_update((ID *)ob, ID_RECALC_TRANSFORM);
- WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, NULL);
+ /* or in obdata material */
+ ob->actcol = te->index + 1;
+ ob->matbits[te->index] = 0; /* Make obdata material active too. */
}
- return OL_DRAWSEL_NONE;
+
+ /* Tagging object for update seems a bit stupid here, but looks like we have to do it
+ * for render views to update. See T42973.
+ * Note that RNA material update does it too, see e.g. rna_MaterialSlot_update(). */
+ DEG_id_tag_update((ID *)ob, ID_RECALC_TRANSFORM);
+ WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, NULL);
}
-static eOLDrawState tree_element_active_camera(bContext *C,
- Scene *scene,
- ViewLayer *UNUSED(view_layer),
- TreeElement *te,
- const eOLSetState set)
+static void tree_element_camera_activate(bContext *C, Scene *scene, TreeElement *te)
{
Object *ob = (Object *)outliner_search_back(te, ID_OB);
- if (set != OL_SETSEL_NONE) {
- scene->camera = ob;
-
- Main *bmain = CTX_data_main(C);
- wmWindowManager *wm = bmain->wm.first;
+ scene->camera = ob;
- WM_windows_scene_data_sync(&wm->windows, scene);
- DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE);
- DEG_relations_tag_update(bmain);
- WM_event_add_notifier(C, NC_SCENE | NA_EDITED, NULL);
+ Main *bmain = CTX_data_main(C);
+ wmWindowManager *wm = bmain->wm.first;
- return OL_DRAWSEL_NONE;
- }
- return scene->camera == ob;
+ WM_windows_scene_data_sync(&wm->windows, scene);
+ DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE);
+ DEG_relations_tag_update(bmain);
+ WM_event_add_notifier(C, NC_SCENE | NA_EDITED, NULL);
}
-static eOLDrawState tree_element_active_world(bContext *C,
- Scene *scene,
- ViewLayer *UNUSED(sl),
- SpaceOutliner *UNUSED(space_outliner),
- TreeElement *te,
- const eOLSetState set)
+static void tree_element_world_activate(bContext *C, Scene *scene, TreeElement *te)
{
- TreeElement *tep;
- TreeStoreElem *tselem = NULL;
Scene *sce = NULL;
- tep = te->parent;
+ TreeElement *tep = te->parent;
if (tep) {
- tselem = TREESTORE(tep);
+ TreeStoreElem *tselem = TREESTORE(tep);
if (tselem->type == 0) {
sce = (Scene *)tselem->id;
}
}
- if (set != OL_SETSEL_NONE) {
- /* make new scene active */
- if (sce && scene != sce) {
- WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), sce);
- }
- }
-
- if (tep == NULL || tselem->id == (ID *)scene) {
- if (set == OL_SETSEL_NONE) {
- return OL_DRAWSEL_NORMAL;
- }
+ /* make new scene active */
+ if (sce && scene != sce) {
+ WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), sce);
}
- return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_defgroup(bContext *C,
- ViewLayer *view_layer,
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set)
+static void tree_element_defgroup_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem)
{
- Object *ob;
-
/* id in tselem is object */
- ob = (Object *)tselem->id;
- if (set != OL_SETSEL_NONE) {
- BLI_assert(te->index + 1 >= 0);
- ob->actdef = te->index + 1;
+ Object *ob = (Object *)tselem->id;
+ BLI_assert(te->index + 1 >= 0);
+ ob->actdef = te->index + 1;
- DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
- WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob);
- }
- else {
- if (ob == OBACT(view_layer)) {
- if (ob->actdef == te->index + 1) {
- return OL_DRAWSEL_NORMAL;
- }
- }
- }
- return OL_DRAWSEL_NONE;
+ DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
+ WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob);
}
-static eOLDrawState tree_element_active_gplayer(bContext *C,
- Scene *UNUSED(scene),
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set)
+static void tree_element_gplayer_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem)
{
bGPdata *gpd = (bGPdata *)tselem->id;
bGPDlayer *gpl = te->directdata;
/* We can only have a single "active" layer at a time
- * and there must always be an active layer...
- */
- if (set != OL_SETSEL_NONE) {
- if (gpl) {
- BKE_gpencil_layer_active_set(gpd, gpl);
- DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY);
- WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, gpd);
- }
+ * and there must always be an active layer... */
+ if (gpl) {
+ BKE_gpencil_layer_active_set(gpd, gpl);
+ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY);
+ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, gpd);
}
- else {
- return OL_DRAWSEL_NORMAL;
- }
-
- return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_posegroup(bContext *C,
- Scene *UNUSED(scene),
- ViewLayer *view_layer,
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set)
+static void tree_element_posegroup_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem)
{
Object *ob = (Object *)tselem->id;
-
- if (set != OL_SETSEL_NONE) {
- if (ob->pose) {
- ob->pose->active_group = te->index + 1;
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
- }
- }
- else {
- if (ob == OBACT(view_layer) && ob->pose) {
- if (ob->pose->active_group == te->index + 1) {
- return OL_DRAWSEL_NORMAL;
- }
- }
+ if (ob->pose) {
+ ob->pose->active_group = te->index + 1;
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
}
- return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_posechannel(bContext *C,
- Scene *UNUSED(scene),
- ViewLayer *view_layer,
- Object *ob_pose,
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set,
- bool recursive)
+static void tree_element_posechannel_activate(bContext *C,
+ ViewLayer *view_layer,
+ TreeElement *te,
+ TreeStoreElem *tselem,
+ const eOLSetState set,
+ bool recursive)
{
Object *ob = (Object *)tselem->id;
bArmature *arm = ob->data;
bPoseChannel *pchan = te->directdata;
- if (set != OL_SETSEL_NONE) {
- if (!(pchan->bone->flag & BONE_HIDDEN_P)) {
+ if (!(pchan->bone->flag & BONE_HIDDEN_P)) {
+ if (set != OL_SETSEL_EXTEND) {
+ /* Single select forces all other bones to get unselected. */
+ uint objects_len = 0;
+ Object **objects = BKE_object_pose_array_get_unique(view_layer, NULL, &objects_len);
- if (set != OL_SETSEL_EXTEND) {
- /* Single select forces all other bones to get unselected. */
- uint objects_len = 0;
- Object **objects = BKE_object_pose_array_get_unique(view_layer, NULL, &objects_len);
-
- for (uint object_index = 0; object_index < objects_len; object_index++) {
- Object *ob_iter = BKE_object_pose_armature_get(objects[object_index]);
-
- /* Sanity checks. */
- if (ELEM(NULL, ob_iter, ob_iter->pose, ob_iter->data)) {
- continue;
- }
-
- bPoseChannel *pchannel;
- for (pchannel = ob_iter->pose->chanbase.first; pchannel; pchannel = pchannel->next) {
- pchannel->bone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
- }
+ for (uint object_index = 0; object_index < objects_len; object_index++) {
+ Object *ob_iter = BKE_object_pose_armature_get(objects[object_index]);
- if (ob != ob_iter) {
- DEG_id_tag_update(ob_iter->data, ID_RECALC_SELECT);
- }
+ /* Sanity checks. */
+ if (ELEM(NULL, ob_iter, ob_iter->pose, ob_iter->data)) {
+ continue;
}
- MEM_freeN(objects);
- }
- if ((set == OL_SETSEL_EXTEND) && (pchan->bone->flag & BONE_SELECTED)) {
- pchan->bone->flag &= ~BONE_SELECTED;
- }
- else {
- pchan->bone->flag |= BONE_SELECTED;
- arm->act_bone = pchan->bone;
- }
+ bPoseChannel *pchannel;
+ for (pchannel = ob_iter->pose->chanbase.first; pchannel; pchannel = pchannel->next) {
+ pchannel->bone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
+ }
- if (recursive) {
- /* Recursive select/deselect */
- do_outliner_bone_select_recursive(
- arm, pchan->bone, (pchan->bone->flag & BONE_SELECTED) != 0);
+ if (ob != ob_iter) {
+ DEG_id_tag_update(ob_iter->data, ID_RECALC_SELECT);
+ }
}
+ MEM_freeN(objects);
+ }
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob);
- DEG_id_tag_update(&arm->id, ID_RECALC_SELECT);
+ if ((set == OL_SETSEL_EXTEND) && (pchan->bone->flag & BONE_SELECTED)) {
+ pchan->bone->flag &= ~BONE_SELECTED;
}
- }
- else {
- if (ob == ob_pose && ob->pose) {
- if (pchan->bone->flag & BONE_SELECTED) {
- return OL_DRAWSEL_NORMAL;
- }
+ else {
+ pchan->bone->flag |= BONE_SELECTED;
+ arm->act_bone = pchan->bone;
+ }
+
+ if (recursive) {
+ /* Recursive select/deselect */
+ do_outliner_bone_select_recursive(
+ arm, pchan->bone, (pchan->bone->flag & BONE_SELECTED) != 0);
}
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob);
+ DEG_id_tag_update(&arm->id, ID_RECALC_SELECT);
}
- return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_bone(bContext *C,
- ViewLayer *view_layer,
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set,
- bool recursive)
+static void tree_element_bone_activate(bContext *C,
+ ViewLayer *view_layer,
+ TreeElement *te,
+ TreeStoreElem *tselem,
+ const eOLSetState set,
+ bool recursive)
{
bArmature *arm = (bArmature *)tselem->id;
Bone *bone = te->directdata;
- if (set != OL_SETSEL_NONE) {
- if (!(bone->flag & BONE_HIDDEN_P)) {
- Object *ob = OBACT(view_layer);
- if (ob) {
- if (set != OL_SETSEL_EXTEND) {
- /* single select forces all other bones to get unselected */
- for (Bone *bone_iter = arm->bonebase.first; bone_iter != NULL;
- bone_iter = bone_iter->next) {
- bone_iter->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
- do_outliner_bone_select_recursive(arm, bone_iter, false);
- }
+ if (!(bone->flag & BONE_HIDDEN_P)) {
+ Object *ob = OBACT(view_layer);
+ if (ob) {
+ if (set != OL_SETSEL_EXTEND) {
+ /* single select forces all other bones to get unselected */
+ for (Bone *bone_iter = arm->bonebase.first; bone_iter != NULL;
+ bone_iter = bone_iter->next) {
+ bone_iter->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
+ do_outliner_bone_select_recursive(arm, bone_iter, false);
}
}
+ }
- if (set == OL_SETSEL_EXTEND && (bone->flag & BONE_SELECTED)) {
- bone->flag &= ~BONE_SELECTED;
- }
- else {
- bone->flag |= BONE_SELECTED;
- arm->act_bone = bone;
- }
-
- if (recursive) {
- /* Recursive select/deselect */
- do_outliner_bone_select_recursive(arm, bone, (bone->flag & BONE_SELECTED) != 0);
- }
-
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob);
+ if (set == OL_SETSEL_EXTEND && (bone->flag & BONE_SELECTED)) {
+ bone->flag &= ~BONE_SELECTED;
+ }
+ else {
+ bone->flag |= BONE_SELECTED;
+ arm->act_bone = bone;
}
- }
- else {
- Object *ob = OBACT(view_layer);
- if (ob && ob->data == arm) {
- if (bone->flag & BONE_SELECTED) {
- return OL_DRAWSEL_NORMAL;
- }
+ if (recursive) {
+ /* Recursive select/deselect */
+ do_outliner_bone_select_recursive(arm, bone, (bone->flag & BONE_SELECTED) != 0);
}
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob);
}
- return OL_DRAWSEL_NONE;
}
-/* ebones only draw in editmode armature */
+/** Edit-bones only draw in edit-mode armature. */
static void tree_element_active_ebone__sel(bContext *C, bArmature *arm, EditBone *ebone, short sel)
{
if (sel) {
@@ -727,359 +593,533 @@ static void tree_element_active_ebone__sel(bContext *C, bArmature *arm, EditBone
ED_armature_ebone_select_set(ebone, sel);
WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, CTX_data_edit_object(C));
}
-static eOLDrawState tree_element_active_ebone(bContext *C,
- ViewLayer *view_layer,
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set,
- bool recursive)
+static void tree_element_ebone_activate(bContext *C,
+ ViewLayer *view_layer,
+ TreeElement *te,
+ TreeStoreElem *tselem,
+ const eOLSetState set,
+ bool recursive)
{
bArmature *arm = (bArmature *)tselem->id;
EditBone *ebone = te->directdata;
- eOLDrawState status = OL_DRAWSEL_NONE;
- if (set != OL_SETSEL_NONE) {
- if (set == OL_SETSEL_NORMAL) {
- if (!(ebone->flag & BONE_HIDDEN_A)) {
- uint bases_len = 0;
- Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(
- view_layer, NULL, &bases_len);
- ED_armature_edit_deselect_all_multi_ex(bases, bases_len);
- MEM_freeN(bases);
+ if (set == OL_SETSEL_NORMAL) {
+ if (!(ebone->flag & BONE_HIDDEN_A)) {
+ uint bases_len = 0;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(
+ view_layer, NULL, &bases_len);
+ ED_armature_edit_deselect_all_multi_ex(bases, bases_len);
+ MEM_freeN(bases);
+ tree_element_active_ebone__sel(C, arm, ebone, true);
+ }
+ }
+ else if (set == OL_SETSEL_EXTEND) {
+ if (!(ebone->flag & BONE_HIDDEN_A)) {
+ if (!(ebone->flag & BONE_SELECTED)) {
tree_element_active_ebone__sel(C, arm, ebone, true);
- status = OL_DRAWSEL_NORMAL;
}
- }
- else if (set == OL_SETSEL_EXTEND) {
- if (!(ebone->flag & BONE_HIDDEN_A)) {
- if (!(ebone->flag & BONE_SELECTED)) {
- tree_element_active_ebone__sel(C, arm, ebone, true);
- status = OL_DRAWSEL_NORMAL;
- }
- else {
- /* entirely selected, so de-select */
- tree_element_active_ebone__sel(C, arm, ebone, false);
- status = OL_DRAWSEL_NONE;
- }
+ else {
+ /* entirely selected, so de-select */
+ tree_element_active_ebone__sel(C, arm, ebone, false);
}
}
-
- if (recursive) {
- /* Recursive select/deselect */
- do_outliner_ebone_select_recursive(arm, ebone, (ebone->flag & BONE_SELECTED) != 0);
- }
- }
- else if (ebone->flag & BONE_SELECTED) {
- status = OL_DRAWSEL_NORMAL;
}
- return status;
+ if (recursive) {
+ /* Recursive select/deselect */
+ do_outliner_ebone_select_recursive(arm, ebone, (ebone->flag & BONE_SELECTED) != 0);
+ }
}
-static eOLDrawState tree_element_active_modifier(bContext *C,
- Scene *UNUSED(scene),
- ViewLayer *UNUSED(sl),
- TreeElement *UNUSED(te),
- TreeStoreElem *tselem,
- const eOLSetState set)
+static void tree_element_modifier_activate(bContext *C,
+ TreeElement *te,
+ TreeStoreElem *tselem,
+ const eOLSetState set)
{
- if (set != OL_SETSEL_NONE) {
- Object *ob = (Object *)tselem->id;
+ Object *ob = (Object *)tselem->id;
+ ModifierData *md = (ModifierData *)te->directdata;
+ if (set == OL_SETSEL_NORMAL) {
+ BKE_object_modifier_set_active(ob, md);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
}
+}
- return OL_DRAWSEL_NONE;
+static void tree_element_psys_activate(bContext *C, TreeStoreElem *tselem)
+{
+ Object *ob = (Object *)tselem->id;
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_PARTICLE | NA_EDITED, ob);
}
-static eOLDrawState tree_element_active_psys(bContext *C,
- Scene *UNUSED(scene),
- TreeElement *UNUSED(te),
+static void tree_element_constraint_activate(bContext *C,
+ ViewLayer *view_layer,
+ TreeElement *te,
TreeStoreElem *tselem,
const eOLSetState set)
{
- if (set != OL_SETSEL_NONE) {
- Object *ob = (Object *)tselem->id;
+ Object *ob = (Object *)tselem->id;
- WM_event_add_notifier(C, NC_OBJECT | ND_PARTICLE | NA_EDITED, ob);
+ /* Activate the parent bone if this is a bone constraint. */
+ te = te->parent;
+ while (te) {
+ tselem = TREESTORE(te);
+ if (tselem->type == TSE_POSE_CHANNEL) {
+ tree_element_posechannel_activate(C, view_layer, te, tselem, set, false);
+ return;
+ }
+ te = te->parent;
}
- return OL_DRAWSEL_NONE;
+ WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob);
}
-static int tree_element_active_constraint(bContext *C,
- Scene *scene,
- ViewLayer *view_layer,
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set)
+static void tree_element_sequence_activate(bContext *C,
+ Scene *scene,
+ TreeElement *te,
+ const eOLSetState set)
{
- if (set != OL_SETSEL_NONE) {
- Object *ob = (Object *)tselem->id;
+ Sequence *seq = (Sequence *)te->directdata;
+ Editing *ed = SEQ_editing_get(scene, false);
- /* Activate the parent bone if this is a bone constraint. */
- te = te->parent;
- while (te) {
- tselem = TREESTORE(te);
- if (tselem->type == TSE_POSE_CHANNEL) {
- tree_element_active_posechannel(C, scene, view_layer, ob, te, tselem, set, false);
- return OL_DRAWSEL_NONE;
+ if (BLI_findindex(ed->seqbasep, seq) != -1) {
+ if (set == OL_SETSEL_EXTEND) {
+ SEQ_select_active_set(scene, NULL);
+ }
+ ED_sequencer_deselect_all(scene);
+
+ if ((set == OL_SETSEL_EXTEND) && seq->flag & SELECT) {
+ seq->flag &= ~SELECT;
+ }
+ else {
+ seq->flag |= SELECT;
+ SEQ_select_active_set(scene, seq);
+ }
+ }
+
+ WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER | NA_SELECTED, scene);
+}
+
+static void tree_element_sequence_dup_activate(Scene *scene, TreeElement *UNUSED(te))
+{
+ Editing *ed = SEQ_editing_get(scene, false);
+
+ /* XXX select_single_seq(seq, 1); */
+ Sequence *p = ed->seqbasep->first;
+ while (p) {
+ if ((!p->strip) || (!p->strip->stripdata) || (p->strip->stripdata->name[0] == '\0')) {
+ p = p->next;
+ continue;
+ }
+
+ /* XXX: if (STREQ(p->strip->stripdata->name, seq->strip->stripdata->name)) select_single_seq(p,
+ * 0); */
+ p = p->next;
+ }
+}
+
+static void tree_element_master_collection_activate(const bContext *C)
+{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ LayerCollection *layer_collection = view_layer->layer_collections.first;
+ BKE_layer_collection_activate(view_layer, layer_collection);
+ /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work
+ * when only the active collection changes. */
+ WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL);
+}
+
+static void tree_element_layer_collection_activate(bContext *C, TreeElement *te)
+{
+ Scene *scene = CTX_data_scene(C);
+ LayerCollection *layer_collection = te->directdata;
+ ViewLayer *view_layer = BKE_view_layer_find_from_collection(scene, layer_collection);
+ BKE_layer_collection_activate(view_layer, layer_collection);
+ /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work
+ * when only the active collection changes. */
+ WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL);
+}
+
+/* ---------------------------------------------- */
+
+/* generic call for ID data check or make/check active in UI */
+void tree_element_activate(bContext *C,
+ const TreeViewContext *tvc,
+ TreeElement *te,
+ const eOLSetState set,
+ const bool handle_all_types)
+{
+ switch (te->idcode) {
+ /** \note #ID_OB only if handle_all_type is true,
+ * else objects are handled specially to allow multiple selection.
+ * See #do_outliner_item_activate. */
+ case ID_OB:
+ if (handle_all_types) {
+ tree_element_object_activate(C, tvc->scene, tvc->view_layer, te, set, false);
}
- te = te->parent;
+ break;
+ case ID_MA:
+ tree_element_material_activate(C, tvc->view_layer, te);
+ break;
+ case ID_WO:
+ tree_element_world_activate(C, tvc->scene, te);
+ break;
+ case ID_CA:
+ tree_element_camera_activate(C, tvc->scene, te);
+ break;
+ }
+}
+
+/**
+ * Generic call for non-id data to make active in UI
+ */
+void tree_element_type_active_set(bContext *C,
+ const TreeViewContext *tvc,
+ TreeElement *te,
+ TreeStoreElem *tselem,
+ const eOLSetState set,
+ bool recursive)
+{
+ BLI_assert(set != OL_SETSEL_NONE);
+ switch (tselem->type) {
+ case TSE_DEFGROUP:
+ tree_element_defgroup_activate(C, te, tselem);
+ break;
+ case TSE_BONE:
+ tree_element_bone_activate(C, tvc->view_layer, te, tselem, set, recursive);
+ break;
+ case TSE_EBONE:
+ tree_element_ebone_activate(C, tvc->view_layer, te, tselem, set, recursive);
+ break;
+ case TSE_MODIFIER:
+ tree_element_modifier_activate(C, te, tselem, set);
+ break;
+ case TSE_LINKED_OB:
+ tree_element_object_activate(C, tvc->scene, tvc->view_layer, te, set, false);
+ break;
+ case TSE_LINKED_PSYS:
+ tree_element_psys_activate(C, tselem);
+ break;
+ case TSE_POSE_BASE:
+ return;
+ case TSE_POSE_CHANNEL:
+ tree_element_posechannel_activate(C, tvc->view_layer, te, tselem, set, recursive);
+ break;
+ case TSE_CONSTRAINT_BASE:
+ case TSE_CONSTRAINT:
+ tree_element_constraint_activate(C, tvc->view_layer, te, tselem, set);
+ break;
+ case TSE_R_LAYER:
+ tree_element_viewlayer_activate(C, te);
+ break;
+ case TSE_POSEGRP:
+ tree_element_posegroup_activate(C, te, tselem);
+ break;
+ case TSE_SEQUENCE:
+ tree_element_sequence_activate(C, tvc->scene, te, set);
+ break;
+ case TSE_SEQUENCE_DUP:
+ tree_element_sequence_dup_activate(tvc->scene, te);
+ break;
+ case TSE_GP_LAYER:
+ tree_element_gplayer_activate(C, te, tselem);
+ break;
+ case TSE_VIEW_COLLECTION_BASE:
+ tree_element_master_collection_activate(C);
+ break;
+ case TSE_LAYER_COLLECTION:
+ tree_element_layer_collection_activate(C, te);
+ break;
+ }
+}
+
+static eOLDrawState tree_element_defgroup_state_get(const ViewLayer *view_layer,
+ const TreeElement *te,
+ const TreeStoreElem *tselem)
+{
+ const Object *ob = (const Object *)tselem->id;
+ if (ob == OBACT(view_layer)) {
+ if (ob->actdef == te->index + 1) {
+ return OL_DRAWSEL_NORMAL;
}
+ }
+ return OL_DRAWSEL_NONE;
+}
- WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob);
+static eOLDrawState tree_element_bone_state_get(const ViewLayer *view_layer,
+ const TreeElement *te,
+ const TreeStoreElem *tselem)
+{
+ const bArmature *arm = (const bArmature *)tselem->id;
+ const Bone *bone = te->directdata;
+ const Object *ob = OBACT(view_layer);
+ if (ob && ob->data == arm) {
+ if (bone->flag & BONE_SELECTED) {
+ return OL_DRAWSEL_NORMAL;
+ }
}
+ return OL_DRAWSEL_NONE;
+}
+static eOLDrawState tree_element_ebone_state_get(const TreeElement *te)
+{
+ const EditBone *ebone = te->directdata;
+ if (ebone->flag & BONE_SELECTED) {
+ return OL_DRAWSEL_NORMAL;
+ }
return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_pose(bContext *UNUSED(C),
- Scene *UNUSED(scene),
- ViewLayer *view_layer,
- TreeElement *UNUSED(te),
- TreeStoreElem *tselem,
- const eOLSetState set)
+static eOLDrawState tree_element_modifier_state_get(const TreeElement *te,
+ const TreeStoreElem *tselem)
{
- Object *ob = (Object *)tselem->id;
- Base *base = BKE_view_layer_base_find(view_layer, ob);
+ const Object *ob = (const Object *)tselem->id;
+ const ModifierData *md = (const ModifierData *)te->directdata;
+
+ return (BKE_object_active_modifier(ob) == md) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE;
+}
+
+static eOLDrawState tree_element_object_state_get(const TreeViewContext *tvc,
+ const TreeStoreElem *tselem)
+{
+ return (tselem->id == (const ID *)tvc->obact) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE;
+}
+static eOLDrawState tree_element_pose_state_get(const ViewLayer *view_layer,
+ const TreeStoreElem *tselem)
+{
+ const Object *ob = (const Object *)tselem->id;
+ /* This will just lookup in a cache, it will not change the arguments. */
+ const Base *base = BKE_view_layer_base_find((ViewLayer *)view_layer, (Object *)ob);
if (base == NULL) {
- /* Armature not instantiated in current scene (e.g. inside an appended group...). */
+ /* Armature not instantiated in current scene (e.g. inside an appended group). */
return OL_DRAWSEL_NONE;
}
- if (set != OL_SETSEL_NONE) {
+ if (ob->mode & OB_MODE_POSE) {
+ return OL_DRAWSEL_NORMAL;
}
- else {
- if (ob->mode & OB_MODE_POSE) {
+ return OL_DRAWSEL_NONE;
+}
+
+static eOLDrawState tree_element_posechannel_state_get(const Object *ob_pose,
+ const TreeElement *te,
+ const TreeStoreElem *tselem)
+{
+ const Object *ob = (const Object *)tselem->id;
+ const bPoseChannel *pchan = te->directdata;
+ if (ob == ob_pose && ob->pose) {
+ if (pchan->bone->flag & BONE_SELECTED) {
return OL_DRAWSEL_NORMAL;
}
}
return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_sequence(bContext *C,
- Scene *scene,
- TreeElement *te,
- TreeStoreElem *UNUSED(tselem),
- const eOLSetState set)
+static eOLDrawState tree_element_viewlayer_state_get(const bContext *C, const TreeElement *te)
{
- Sequence *seq = (Sequence *)te->directdata;
- Editing *ed = SEQ_editing_get(scene, false);
-
- if (set != OL_SETSEL_NONE) {
- /* only check on setting */
- if (BLI_findindex(ed->seqbasep, seq) != -1) {
- if (set == OL_SETSEL_EXTEND) {
- SEQ_select_active_set(scene, NULL);
- }
- ED_sequencer_deselect_all(scene);
+ /* paranoia check */
+ if (te->idcode != ID_SCE) {
+ return OL_DRAWSEL_NONE;
+ }
- if ((set == OL_SETSEL_EXTEND) && seq->flag & SELECT) {
- seq->flag &= ~SELECT;
- }
- else {
- seq->flag |= SELECT;
- SEQ_select_active_set(scene, seq);
- }
- }
+ const ViewLayer *view_layer = te->directdata;
- WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER | NA_SELECTED, scene);
+ if (CTX_data_view_layer(C) == view_layer) {
+ return OL_DRAWSEL_NORMAL;
}
- else {
- if (ed->act_seq == seq && seq->flag & SELECT) {
+ return OL_DRAWSEL_NONE;
+}
+
+static eOLDrawState tree_element_posegroup_state_get(const ViewLayer *view_layer,
+ const TreeElement *te,
+ const TreeStoreElem *tselem)
+{
+ const Object *ob = (const Object *)tselem->id;
+
+ if (ob == OBACT(view_layer) && ob->pose) {
+ if (ob->pose->active_group == te->index + 1) {
return OL_DRAWSEL_NORMAL;
}
}
return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_sequence_dup(Scene *scene,
- TreeElement *te,
- TreeStoreElem *UNUSED(tselem),
- const eOLSetState set)
+static eOLDrawState tree_element_sequence_state_get(const Scene *scene, const TreeElement *te)
{
- Sequence *seq, *p;
- Editing *ed = SEQ_editing_get(scene, false);
+ const Sequence *seq = (const Sequence *)te->directdata;
+ const Editing *ed = scene->ed;
- seq = (Sequence *)te->directdata;
- if (set == OL_SETSEL_NONE) {
- if (seq->flag & SELECT) {
- return OL_DRAWSEL_NORMAL;
- }
- return OL_DRAWSEL_NONE;
+ if (ed && ed->act_seq == seq && seq->flag & SELECT) {
+ return OL_DRAWSEL_NORMAL;
}
+ return OL_DRAWSEL_NONE;
+}
- /* XXX select_single_seq(seq, 1); */
- p = ed->seqbasep->first;
- while (p) {
- if ((!p->strip) || (!p->strip->stripdata) || (p->strip->stripdata->name[0] == '\0')) {
- p = p->next;
- continue;
- }
+static eOLDrawState tree_element_sequence_dup_state_get(const TreeElement *te)
+{
+ const Sequence *seq = (const Sequence *)te->directdata;
+ if (seq->flag & SELECT) {
+ return OL_DRAWSEL_NORMAL;
+ }
+ return OL_DRAWSEL_NONE;
+}
- /* XXX: if (STREQ(p->strip->stripdata->name, seq->strip->stripdata->name)) select_single_seq(p,
- * 0); */
- p = p->next;
+static eOLDrawState tree_element_gplayer_state_get(const TreeElement *te)
+{
+ if (((const bGPDlayer *)te->directdata)->flag & GP_LAYER_ACTIVE) {
+ return OL_DRAWSEL_NORMAL;
}
return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_keymap_item(bContext *UNUSED(C),
- Scene *UNUSED(scene),
- ViewLayer *UNUSED(sl),
- TreeElement *te,
- TreeStoreElem *UNUSED(tselem),
- const eOLSetState set)
+static eOLDrawState tree_element_master_collection_state_get(const bContext *C)
{
- wmKeyMapItem *kmi = te->directdata;
+ const ViewLayer *view_layer = CTX_data_view_layer(C);
+ const LayerCollection *active = CTX_data_layer_collection(C);
- if (set == OL_SETSEL_NONE) {
- if (kmi->flag & KMI_INACTIVE) {
- return OL_DRAWSEL_NONE;
- }
+ if (active == view_layer->layer_collections.first) {
return OL_DRAWSEL_NORMAL;
}
- kmi->flag ^= KMI_INACTIVE;
return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_master_collection(bContext *C,
- TreeElement *UNUSED(te),
- const eOLSetState set)
+static eOLDrawState tree_element_layer_collection_state_get(const bContext *C,
+ const TreeElement *te)
{
- if (set == OL_SETSEL_NONE) {
- ViewLayer *view_layer = CTX_data_view_layer(C);
- LayerCollection *active = CTX_data_layer_collection(C);
+ const LayerCollection *active = CTX_data_layer_collection(C);
+ if (active == te->directdata) {
+ return OL_DRAWSEL_NORMAL;
+ }
+ return OL_DRAWSEL_NONE;
+}
- if (active == view_layer->layer_collections.first) {
- return OL_DRAWSEL_NORMAL;
+static eOLDrawState tree_element_active_material_get(const ViewLayer *view_layer,
+ const TreeElement *te)
+{
+ /* we search for the object parent */
+ const Object *ob = (const Object *)outliner_search_back((TreeElement *)te, ID_OB);
+ /* Note : ob->matbits can be NULL when a local object points to a library mesh. */
+ if (ob == NULL || ob != OBACT(view_layer) || ob->matbits == NULL) {
+ return OL_DRAWSEL_NONE; /* just paranoia */
+ }
+
+ /* searching in ob mat array? */
+ const TreeElement *tes = te->parent;
+ if (tes->idcode == ID_OB) {
+ if (ob->actcol == te->index + 1) {
+ if (ob->matbits[te->index]) {
+ return OL_DRAWSEL_NORMAL;
+ }
}
}
+ /* or we search for obdata material */
else {
- ViewLayer *view_layer = CTX_data_view_layer(C);
- LayerCollection *layer_collection = view_layer->layer_collections.first;
- BKE_layer_collection_activate(view_layer, layer_collection);
- /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work
- * when only the active collection changes. */
- WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL);
+ if (ob->actcol == te->index + 1) {
+ if (ob->matbits[te->index] == 0) {
+ return OL_DRAWSEL_NORMAL;
+ }
+ }
}
-
return OL_DRAWSEL_NONE;
}
-static eOLDrawState tree_element_active_layer_collection(bContext *C,
- TreeElement *te,
- const eOLSetState set)
+static eOLDrawState tree_element_active_scene_get(const TreeViewContext *tvc,
+ const TreeElement *te,
+ const TreeStoreElem *tselem)
{
- if (set == OL_SETSEL_NONE) {
- LayerCollection *active = CTX_data_layer_collection(C);
-
- if (active == te->directdata) {
+ if (te->idcode == ID_SCE) {
+ if (tselem->id == (ID *)tvc->scene) {
return OL_DRAWSEL_NORMAL;
}
}
- else {
- Scene *scene = CTX_data_scene(C);
- LayerCollection *layer_collection = te->directdata;
- ViewLayer *view_layer = BKE_view_layer_find_from_collection(scene, layer_collection);
- BKE_layer_collection_activate(view_layer, layer_collection);
- /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work
- * when only the active collection changes. */
- WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL);
+ return OL_DRAWSEL_NONE;
+}
+
+static eOLDrawState tree_element_active_world_get(const Scene *scene, const TreeElement *te)
+{
+ const TreeElement *tep = te->parent;
+ if (tep == NULL) {
+ return OL_DRAWSEL_NORMAL;
}
+ const TreeStoreElem *tselem = TREESTORE(tep);
+ if (tselem->id == (const ID *)scene) {
+ return OL_DRAWSEL_NORMAL;
+ }
return OL_DRAWSEL_NONE;
}
-/* ---------------------------------------------- */
+static eOLDrawState tree_element_active_camera_get(const Scene *scene, const TreeElement *te)
+{
+ const Object *ob = (const Object *)outliner_search_back((TreeElement *)te, ID_OB);
-/* generic call for ID data check or make/check active in UI */
-eOLDrawState tree_element_active(bContext *C,
- const TreeViewContext *tvc,
- SpaceOutliner *space_outliner,
- TreeElement *te,
- const eOLSetState set,
- const bool handle_all_types)
+ return (scene->camera == ob) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE;
+}
+
+eOLDrawState tree_element_active_state_get(const TreeViewContext *tvc,
+ const TreeElement *te,
+ const TreeStoreElem *tselem)
{
switch (te->idcode) {
- /** \note #ID_OB only if handle_all_type is true,
- * else objects are handled specially to allow multiple selection.
- * See #do_outliner_item_activate. */
+ case ID_SCE:
+ return tree_element_active_scene_get(tvc, te, tselem);
case ID_OB:
- if (handle_all_types) {
- return tree_element_set_active_object(
- C, tvc->scene, tvc->view_layer, space_outliner, te, set, false);
- }
+ /* Objects are currently handled by the caller in order to also change text color. */
+ return OL_DRAWSEL_NONE;
break;
case ID_MA:
- return tree_element_active_material(C, tvc->scene, tvc->view_layer, te, set);
+ return tree_element_active_material_get(tvc->view_layer, te);
case ID_WO:
- return tree_element_active_world(C, tvc->scene, tvc->view_layer, space_outliner, te, set);
+ return tree_element_active_world_get(tvc->scene, te);
case ID_CA:
- return tree_element_active_camera(C, tvc->scene, tvc->view_layer, te, set);
+ return tree_element_active_camera_get(tvc->scene, te);
}
return OL_DRAWSEL_NONE;
}
/**
- * Generic call for non-id data to make/check active in UI
+ * Generic call for non-id data to check the active state in UI.
*/
-eOLDrawState tree_element_type_active(bContext *C,
- const TreeViewContext *tvc,
- SpaceOutliner *space_outliner,
- TreeElement *te,
- TreeStoreElem *tselem,
- const eOLSetState set,
- bool recursive)
+eOLDrawState tree_element_type_active_state_get(const bContext *C,
+ const TreeViewContext *tvc,
+ const TreeElement *te,
+ const TreeStoreElem *tselem)
{
switch (tselem->type) {
case TSE_DEFGROUP:
- return tree_element_active_defgroup(C, tvc->view_layer, te, tselem, set);
+ return tree_element_defgroup_state_get(tvc->view_layer, te, tselem);
case TSE_BONE:
- return tree_element_active_bone(C, tvc->view_layer, te, tselem, set, recursive);
+ return tree_element_bone_state_get(tvc->view_layer, te, tselem);
case TSE_EBONE:
- return tree_element_active_ebone(C, tvc->view_layer, te, tselem, set, recursive);
+ return tree_element_ebone_state_get(te);
case TSE_MODIFIER:
- return tree_element_active_modifier(C, tvc->scene, tvc->view_layer, te, tselem, set);
+ return tree_element_modifier_state_get(te, tselem);
case TSE_LINKED_OB:
- if (set != OL_SETSEL_NONE) {
- tree_element_set_active_object(
- C, tvc->scene, tvc->view_layer, space_outliner, te, set, false);
- }
- else if (tselem->id == (ID *)tvc->obact) {
- return OL_DRAWSEL_NORMAL;
- }
- break;
+ return tree_element_object_state_get(tvc, tselem);
case TSE_LINKED_PSYS:
- return tree_element_active_psys(C, tvc->scene, te, tselem, set);
+ return OL_DRAWSEL_NONE;
case TSE_POSE_BASE:
- return tree_element_active_pose(C, tvc->scene, tvc->view_layer, te, tselem, set);
+ return tree_element_pose_state_get(tvc->view_layer, tselem);
case TSE_POSE_CHANNEL:
- return tree_element_active_posechannel(
- C, tvc->scene, tvc->view_layer, tvc->ob_pose, te, tselem, set, recursive);
+ return tree_element_posechannel_state_get(tvc->ob_pose, te, tselem);
case TSE_CONSTRAINT_BASE:
case TSE_CONSTRAINT:
- return tree_element_active_constraint(C, tvc->scene, tvc->view_layer, te, tselem, set);
+ return OL_DRAWSEL_NONE;
case TSE_R_LAYER:
- return active_viewlayer(C, tvc->scene, tvc->view_layer, te, set);
+ return tree_element_viewlayer_state_get(C, te);
case TSE_POSEGRP:
- return tree_element_active_posegroup(C, tvc->scene, tvc->view_layer, te, tselem, set);
+ return tree_element_posegroup_state_get(tvc->view_layer, te, tselem);
case TSE_SEQUENCE:
- return tree_element_active_sequence(C, tvc->scene, te, tselem, set);
+ return tree_element_sequence_state_get(tvc->scene, te);
case TSE_SEQUENCE_DUP:
- return tree_element_active_sequence_dup(tvc->scene, te, tselem, set);
- case TSE_KEYMAP_ITEM:
- return tree_element_active_keymap_item(C, tvc->scene, tvc->view_layer, te, tselem, set);
+ return tree_element_sequence_dup_state_get(te);
case TSE_GP_LAYER:
- return tree_element_active_gplayer(C, tvc->scene, te, tselem, set);
- break;
+ return tree_element_gplayer_state_get(te);
case TSE_VIEW_COLLECTION_BASE:
- return tree_element_active_master_collection(C, te, set);
+ return tree_element_master_collection_state_get(C);
case TSE_LAYER_COLLECTION:
- return tree_element_active_layer_collection(C, te, set);
+ return tree_element_layer_collection_state_get(C, te);
}
return OL_DRAWSEL_NONE;
}
@@ -1200,7 +1240,6 @@ static void outliner_set_properties_tab(bContext *C, TreeElement *te, TreeStoreE
}
else {
ModifierData *md = (ModifierData *)te->directdata;
- BKE_object_modifier_set_active(ob, md);
switch ((ModifierType)md->type) {
case eModifierType_ParticleSystem:
@@ -1331,14 +1370,13 @@ static void do_outliner_item_activate_tree_element(bContext *C,
* objects, we do not want to switch out of edit mode (see T48328 for details). */
}
else if (do_activate_data) {
- tree_element_set_active_object(C,
- tvc->scene,
- tvc->view_layer,
- space_outliner,
- te,
- (extend && tselem->type == 0) ? OL_SETSEL_EXTEND :
- OL_SETSEL_NORMAL,
- recursive && tselem->type == 0);
+ tree_element_object_activate(C,
+ tvc->scene,
+ tvc->view_layer,
+ te,
+ (extend && tselem->type == 0) ? OL_SETSEL_EXTEND :
+ OL_SETSEL_NORMAL,
+ recursive && tselem->type == 0);
}
if (tselem->type == 0) { /* The lib blocks. */
@@ -1391,17 +1429,12 @@ static void do_outliner_item_activate_tree_element(bContext *C,
WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, tvc->scene);
}
else { /* Rest of types. */
- tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NORMAL, false);
+ tree_element_activate(C, tvc, te, OL_SETSEL_NORMAL, false);
}
}
else if (do_activate_data) {
- tree_element_type_active(C,
- tvc,
- space_outliner,
- te,
- tselem,
- extend ? OL_SETSEL_EXTEND : OL_SETSEL_NORMAL,
- recursive);
+ tree_element_type_active_set(
+ C, tvc, te, tselem, extend ? OL_SETSEL_EXTEND : OL_SETSEL_NORMAL, recursive);
}
}
@@ -1543,7 +1576,7 @@ static bool outliner_is_co_within_active_mode_column(bContext *C,
* Action to run when clicking in the outliner,
*
* May expend/collapse branches or activate items.
- * */
+ */
static int outliner_item_do_activate_from_cursor(bContext *C,
const int mval[2],
const bool extend,
diff --git a/source/blender/editors/space_outliner/outliner_sync.c b/source/blender/editors/space_outliner/outliner_sync.c
index 0b2d1ce34ec..8bd5e3a130a 100644
--- a/source/blender/editors/space_outliner/outliner_sync.c
+++ b/source/blender/editors/space_outliner/outliner_sync.c
@@ -38,7 +38,6 @@
#include "BKE_context.h"
#include "BKE_layer.h"
#include "BKE_main.h"
-#include "BKE_object.h"
#include "DEG_depsgraph.h"
@@ -378,7 +377,7 @@ void ED_outliner_select_sync_from_outliner(bContext *C, SpaceOutliner *space_out
selected_items_free(&selected_items);
- /* Tag for updates and clear dirty flag toprevent a sync to the outliner on draw */
+ /* Tag for updates and clear dirty flag to prevent a sync to the outliner on draw. */
if (sync_types.object) {
space_outliner->sync_select_dirty &= ~WM_OUTLINER_SYNC_SELECT_FROM_OBJECT;
DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
@@ -545,7 +544,7 @@ static void get_sync_select_active_data(const bContext *C, SyncSelectActiveData
active_data->sequence = SEQ_select_active_get(scene);
}
-/* If outliner is dirty sync selection from view layer and sequwncer */
+/* If outliner is dirty sync selection from view layer and sequencer. */
void outliner_sync_selection(const bContext *C, SpaceOutliner *space_outliner)
{
/* Set which types of data to sync from sync dirty flag and outliner display mode */
diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c
index 2a2803c58dd..8bc32f5f3a7 100644
--- a/source/blender/editors/space_outliner/outliner_tools.c
+++ b/source/blender/editors/space_outliner/outliner_tools.c
@@ -23,6 +23,8 @@
#include "MEM_guardedalloc.h"
+#include "CLG_log.h"
+
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_collection_types.h"
@@ -92,6 +94,8 @@
#include "outliner_intern.h"
+static CLG_LogRef LOG = {"ed.outliner.tools"};
+
/* -------------------------------------------------------------------- */
/** \name ID/Library/Data Set/Un-link Utilities
* \{ */
@@ -790,7 +794,7 @@ static void id_override_library_create_fn(bContext *C,
id_root->tag |= LIB_TAG_DOIT;
- /* For now, remapp all local usages of linked ID to local override one here. */
+ /* For now, remap all local usages of linked ID to local override one here. */
ID *id_iter;
FOREACH_MAIN_ID_BEGIN (bmain, id_iter) {
if (ID_IS_LINKED(id_iter)) {
@@ -824,6 +828,9 @@ static void id_override_library_create_fn(bContext *C,
BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
}
}
+ else {
+ CLOG_WARN(&LOG, "Could not create library override for data block '%s'", id_root->name);
+ }
}
static void id_override_library_reset_fn(bContext *C,
@@ -852,6 +859,9 @@ static void id_override_library_reset_fn(bContext *C,
WM_event_add_notifier(C, NC_WM | ND_DATACHANGED, NULL);
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL);
}
+ else {
+ CLOG_WARN(&LOG, "Could not reset library override of data block '%s'", id_root->name);
+ }
}
static void id_override_library_resync_fn(bContext *C,
@@ -883,6 +893,9 @@ static void id_override_library_resync_fn(bContext *C,
BKE_lib_override_library_resync(bmain, scene, CTX_data_view_layer(C), id_root);
}
+ else {
+ CLOG_WARN(&LOG, "Could not resync library override of data block '%s'", id_root->name);
+ }
}
static void id_override_library_delete_fn(bContext *C,
@@ -914,6 +927,9 @@ static void id_override_library_delete_fn(bContext *C,
BKE_lib_override_library_delete(bmain, id_root);
}
+ else {
+ CLOG_WARN(&LOG, "Could not delete library override of data block '%s'", id_root->name);
+ }
}
static void id_fake_user_set_fn(bContext *UNUSED(C),
@@ -1423,13 +1439,7 @@ enum {
OL_OP_DESELECT,
OL_OP_SELECT_HIERARCHY,
OL_OP_REMAP,
- OL_OP_LOCALIZED, /* disabled, see below */
- OL_OP_TOGVIS,
- OL_OP_TOGSEL,
- OL_OP_TOGREN,
OL_OP_RENAME,
- OL_OP_OBJECT_MODE_ENTER,
- OL_OP_OBJECT_MODE_EXIT,
OL_OP_PROXY_TO_OVERRIDE_CONVERT,
};
@@ -1443,8 +1453,6 @@ static const EnumPropertyItem prop_object_op_types[] = {
"Remap Users",
"Make all users of selected data-blocks to use instead a new chosen one"},
{OL_OP_RENAME, "RENAME", 0, "Rename", ""},
- {OL_OP_OBJECT_MODE_ENTER, "OBJECT_MODE_ENTER", 0, "Enter Mode", ""},
- {OL_OP_OBJECT_MODE_EXIT, "OBJECT_MODE_EXIT", 0, "Exit Mode", ""},
{OL_OP_PROXY_TO_OVERRIDE_CONVERT,
"OBJECT_PROXY_TO_OVERRIDE",
0,
@@ -1509,11 +1517,6 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
/* No undo push here, operator does it itself (since it's a modal one, the op_undo_depth
* trick does not work here). */
}
- else if (event == OL_OP_LOCALIZED) { /* disabled, see above enum (ton) */
- outliner_do_object_operation(
- C, op->reports, scene, space_outliner, &space_outliner->tree, id_local_fn);
- str = "Localized Objects";
- }
else if (event == OL_OP_RENAME) {
outliner_do_object_operation(
C, op->reports, scene, space_outliner, &space_outliner->tree, item_rename_fn);
@@ -1789,21 +1792,44 @@ static bool outliner_id_operation_item_poll(bContext *C,
const int enum_value)
{
SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
+ TreeElement *te = get_target_element(space_outliner);
+ TreeStoreElem *tselem = TREESTORE(te);
+ if (!TSE_IS_REAL_ID(tselem)) {
+ return false;
+ }
+
+ Object *ob = NULL;
+ if (GS(tselem->id->name) == ID_OB) {
+ ob = (Object *)tselem->id;
+ }
switch (enum_value) {
case OUTLINER_IDOP_MARK_ASSET:
case OUTLINER_IDOP_CLEAR_ASSET:
return U.experimental.use_asset_browser;
case OUTLINER_IDOP_OVERRIDE_LIBRARY_CREATE:
+ if (ID_IS_OVERRIDABLE_LIBRARY(tselem->id)) {
+ return true;
+ }
+ return false;
case OUTLINER_IDOP_OVERRIDE_LIBRARY_CREATE_HIERARCHY:
- return true;
+ if (ID_IS_OVERRIDABLE_LIBRARY(tselem->id) || (ID_IS_LINKED(tselem->id))) {
+ return true;
+ }
+ return false;
+ case OUTLINER_IDOP_OVERRIDE_LIBRARY_PROXY_CONVERT:
+ if (ob != NULL && ob->proxy != NULL) {
+ return true;
+ }
+ return false;
case OUTLINER_IDOP_OVERRIDE_LIBRARY_RESET:
case OUTLINER_IDOP_OVERRIDE_LIBRARY_RESET_HIERARCHY:
- return true;
case OUTLINER_IDOP_OVERRIDE_LIBRARY_RESYNC_HIERARCHY:
- return true;
case OUTLINER_IDOP_OVERRIDE_LIBRARY_DELETE_HIERARCHY:
- return true;
+ if (ID_IS_OVERRIDE_LIBRARY_REAL(tselem->id)) {
+ return true;
+ }
+ return false;
case OUTLINER_IDOP_SINGLE:
if (!space_outliner || ELEM(space_outliner->outlinevis, SO_SCENES, SO_VIEW_LAYER)) {
return true;
@@ -2405,9 +2431,6 @@ typedef enum eOutliner_AnimDataOps {
OUTLINER_ANIMOP_REFRESH_DRV,
OUTLINER_ANIMOP_CLEAR_DRV
-
- /* OUTLINER_ANIMOP_COPY_DRIVERS, */
- /* OUTLINER_ANIMOP_PASTE_DRIVERS */
} eOutliner_AnimDataOps;
static const EnumPropertyItem prop_animdata_op_types[] = {
@@ -2419,8 +2442,6 @@ static const EnumPropertyItem prop_animdata_op_types[] = {
{OUTLINER_ANIMOP_SET_ACT, "SET_ACT", 0, "Set Action", ""},
{OUTLINER_ANIMOP_CLEAR_ACT, "CLEAR_ACT", 0, "Unlink Action", ""},
{OUTLINER_ANIMOP_REFRESH_DRV, "REFRESH_DRIVERS", 0, "Refresh Drivers", ""},
- /* {OUTLINER_ANIMOP_COPY_DRIVERS, "COPY_DRIVERS", 0, "Copy Drivers", ""}, */
- /* {OUTLINER_ANIMOP_PASTE_DRIVERS, "PASTE_DRIVERS", 0, "Paste Drivers", ""}, */
{OUTLINER_ANIMOP_CLEAR_DRV, "CLEAR_DRIVERS", 0, "Clear Drivers", ""},
{0, NULL, 0, NULL, NULL},
};
diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c
index acfeccca175..f94f19246fa 100644
--- a/source/blender/editors/space_outliner/outliner_tree.c
+++ b/source/blender/editors/space_outliner/outliner_tree.c
@@ -167,8 +167,6 @@ static void outliner_storage_cleanup(SpaceOutliner *space_outliner)
static void check_persistent(
SpaceOutliner *space_outliner, TreeElement *te, ID *id, short type, short nr)
{
- TreeStoreElem *tselem;
-
if (space_outliner->treestore == NULL) {
/* if treestore was not created in readfile.c, create it here */
space_outliner->treestore = BLI_mempool_create(
@@ -181,7 +179,8 @@ static void check_persistent(
/* find any unused tree element in treestore and mark it as used
* (note that there may be multiple unused elements in case of linked objects) */
- tselem = BKE_outliner_treehash_lookup_unused(space_outliner->runtime->treehash, type, nr, id);
+ TreeStoreElem *tselem = BKE_outliner_treehash_lookup_unused(
+ space_outliner->runtime->treehash, type, nr, id);
if (tselem) {
te->store_elem = tselem;
tselem->used = 1;
@@ -204,8 +203,7 @@ static void check_persistent(
void outliner_free_tree(ListBase *tree)
{
- for (TreeElement *element = tree->first, *element_next; element; element = element_next) {
- element_next = element->next;
+ LISTBASE_FOREACH_MUTABLE (TreeElement *, element, tree) {
outliner_free_tree_element(element, tree);
}
}
@@ -271,8 +269,8 @@ static void outliner_add_bone(SpaceOutliner *space_outliner,
te->name = curBone->name;
te->directdata = curBone;
- for (curBone = curBone->childbase.first; curBone; curBone = curBone->next) {
- outliner_add_bone(space_outliner, &te->subtree, id, curBone, te, a);
+ LISTBASE_FOREACH (Bone *, child_bone, &curBone->childbase) {
+ outliner_add_bone(space_outliner, &te->subtree, id, child_bone, te, a);
}
}
@@ -381,35 +379,30 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
if (ob->pose) {
bArmature *arm = ob->data;
- bPoseChannel *pchan;
TreeElement *tenla = outliner_add_element(
space_outliner, &te->subtree, ob, te, TSE_POSE_BASE, 0);
-
tenla->name = IFACE_("Pose");
/* channels undefined in editmode, but we want the 'tenla' pose icon itself */
if ((arm->edbo == NULL) && (ob->mode & OB_MODE_POSE)) {
- TreeElement *ten;
- int a = 0, const_index = 1000; /* ensure unique id for bone constraints */
-
- for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next, a++) {
- ten = outliner_add_element(
+ int const_index = 1000; /* ensure unique id for bone constraints */
+ int a;
+ LISTBASE_FOREACH_INDEX (bPoseChannel *, pchan, &ob->pose->chanbase, a) {
+ TreeElement *ten = outliner_add_element(
space_outliner, &tenla->subtree, ob, tenla, TSE_POSE_CHANNEL, a);
ten->name = pchan->name;
ten->directdata = pchan;
pchan->temp = (void *)ten;
- if (pchan->constraints.first) {
+ if (!BLI_listbase_is_empty(&pchan->constraints)) {
/* Object *target; */
- bConstraint *con;
- TreeElement *ten1;
TreeElement *tenla1 = outliner_add_element(
space_outliner, &ten->subtree, ob, ten, TSE_CONSTRAINT_BASE, 0);
+ tenla1->name = IFACE_("Constraints");
/* char *str; */
- tenla1->name = IFACE_("Constraints");
- for (con = pchan->constraints.first; con; con = con->next, const_index++) {
- ten1 = outliner_add_element(
+ LISTBASE_FOREACH (bConstraint *, con, &pchan->constraints) {
+ TreeElement *ten1 = outliner_add_element(
space_outliner, &tenla1->subtree, ob, tenla1, TSE_CONSTRAINT, const_index);
#if 0 /* disabled as it needs to be reworked for recoded constraints system */
target = get_constraint_target(con, &str);
@@ -427,15 +420,16 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
ten1->directdata = con;
/* possible add all other types links? */
}
+ const_index++;
}
}
/* make hierarchy */
- ten = tenla->subtree.first;
+ TreeElement *ten = tenla->subtree.first;
while (ten) {
TreeElement *nten = ten->next, *par;
tselem = TREESTORE(ten);
if (tselem->type == TSE_POSE_CHANNEL) {
- pchan = (bPoseChannel *)ten->directdata;
+ bPoseChannel *pchan = (bPoseChannel *)ten->directdata;
if (pchan->parent) {
BLI_remlink(&tenla->subtree, ten);
par = (TreeElement *)pchan->parent->temp;
@@ -448,17 +442,15 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
}
/* Pose Groups */
- if (ob->pose->agroups.first) {
- bActionGroup *agrp;
+ if (!BLI_listbase_is_empty(&ob->pose->agroups)) {
TreeElement *ten_bonegrp = outliner_add_element(
space_outliner, &te->subtree, ob, te, TSE_POSEGRP_BASE, 0);
- int a = 0;
-
ten_bonegrp->name = IFACE_("Bone Groups");
- for (agrp = ob->pose->agroups.first; agrp; agrp = agrp->next, a++) {
- TreeElement *ten;
- ten = outliner_add_element(
- space_outliner, &ten_bonegrp->subtree, ob, ten_bonegrp, TSE_POSEGRP, a);
+
+ int index;
+ LISTBASE_FOREACH_INDEX (bActionGroup *, agrp, &ob->pose->agroups, index) {
+ TreeElement *ten = outliner_add_element(
+ space_outliner, &ten_bonegrp->subtree, ob, ten_bonegrp, TSE_POSEGRP, index);
ten->name = agrp->name;
ten->directdata = agrp;
}
@@ -469,18 +461,15 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
outliner_add_element(space_outliner, &te->subtree, ob->mat[a], te, 0, a);
}
- if (ob->constraints.first) {
- /* Object *target; */
- bConstraint *con;
- TreeElement *ten;
+ if (!BLI_listbase_is_empty(&ob->constraints)) {
TreeElement *tenla = outliner_add_element(
space_outliner, &te->subtree, ob, te, TSE_CONSTRAINT_BASE, 0);
- /* char *str; */
- int a;
-
tenla->name = IFACE_("Constraints");
- for (con = ob->constraints.first, a = 0; con; con = con->next, a++) {
- ten = outliner_add_element(space_outliner, &tenla->subtree, ob, tenla, TSE_CONSTRAINT, a);
+
+ int index;
+ LISTBASE_FOREACH_INDEX (bConstraint *, con, &ob->constraints, index) {
+ TreeElement *ten = outliner_add_element(
+ space_outliner, &tenla->subtree, ob, tenla, TSE_CONSTRAINT, index);
#if 0 /* disabled due to constraints system targets recode... code here needs review */
target = get_constraint_target(con, &str);
if (str && str[0]) {
@@ -499,14 +488,13 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
}
}
- if (ob->modifiers.first) {
- ModifierData *md;
+ if (!BLI_listbase_is_empty(&ob->modifiers)) {
TreeElement *ten_mod = outliner_add_element(
space_outliner, &te->subtree, ob, te, TSE_MODIFIER_BASE, 0);
- int index;
-
ten_mod->name = IFACE_("Modifiers");
- for (index = 0, md = ob->modifiers.first; md; index++, md = md->next) {
+
+ int index;
+ LISTBASE_FOREACH_INDEX (ModifierData *, md, &ob->modifiers, index) {
TreeElement *ten = outliner_add_element(
space_outliner, &ten_mod->subtree, ob, ten_mod, TSE_MODIFIER, index);
ten->name = md->name;
@@ -559,8 +547,8 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
if (!BLI_listbase_is_empty(&ob->greasepencil_modifiers)) {
TreeElement *ten_mod = outliner_add_element(
space_outliner, &te->subtree, ob, te, TSE_MODIFIER_BASE, 0);
-
ten_mod->name = IFACE_("Modifiers");
+
int index;
LISTBASE_FOREACH_INDEX (GpencilModifierData *, md, &ob->greasepencil_modifiers, index) {
TreeElement *ten = outliner_add_element(
@@ -599,8 +587,8 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
if (!BLI_listbase_is_empty(&ob->shader_fx)) {
TreeElement *ten_fx = outliner_add_element(
space_outliner, &te->subtree, ob, te, TSE_GPENCIL_EFFECT_BASE, 0);
-
ten_fx->name = IFACE_("Effects");
+
int index;
LISTBASE_FOREACH_INDEX (ShaderFxData *, fx, &ob->shader_fx, index) {
TreeElement *ten = outliner_add_element(
@@ -620,16 +608,15 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
}
/* vertex groups */
- if (ob->defbase.first) {
- bDeformGroup *defgroup;
- TreeElement *ten;
+ if (!BLI_listbase_is_empty(&ob->defbase)) {
TreeElement *tenla = outliner_add_element(
space_outliner, &te->subtree, ob, te, TSE_DEFGROUP_BASE, 0);
- int a;
-
tenla->name = IFACE_("Vertex Groups");
- for (defgroup = ob->defbase.first, a = 0; defgroup; defgroup = defgroup->next, a++) {
- ten = outliner_add_element(space_outliner, &tenla->subtree, ob, tenla, TSE_DEFGROUP, a);
+
+ int index;
+ LISTBASE_FOREACH_INDEX (bDeformGroup *, defgroup, &ob->defbase, index) {
+ TreeElement *ten = outliner_add_element(
+ space_outliner, &tenla->subtree, ob, tenla, TSE_DEFGROUP, index);
ten->name = defgroup->name;
ten->directdata = defgroup;
}
@@ -694,14 +681,13 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_ME: {
Mesh *me = (Mesh *)id;
- int a;
if (outliner_animdata_test(me->adt)) {
outliner_add_element(space_outliner, &te->subtree, me, te, TSE_ANIM_DATA, 0);
}
outliner_add_element(space_outliner, &te->subtree, me->key, te, 0, 0);
- for (a = 0; a < me->totcol; a++) {
+ for (int a = 0; a < me->totcol; a++) {
outliner_add_element(space_outliner, &te->subtree, me->mat[a], te, 0, a);
}
/* could do tfaces with image links, but the images are not grouped nicely.
@@ -710,33 +696,30 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_CU: {
Curve *cu = (Curve *)id;
- int a;
if (outliner_animdata_test(cu->adt)) {
outliner_add_element(space_outliner, &te->subtree, cu, te, TSE_ANIM_DATA, 0);
}
- for (a = 0; a < cu->totcol; a++) {
+ for (int a = 0; a < cu->totcol; a++) {
outliner_add_element(space_outliner, &te->subtree, cu->mat[a], te, 0, a);
}
break;
}
case ID_MB: {
MetaBall *mb = (MetaBall *)id;
- int a;
if (outliner_animdata_test(mb->adt)) {
outliner_add_element(space_outliner, &te->subtree, mb, te, TSE_ANIM_DATA, 0);
}
- for (a = 0; a < mb->totcol; a++) {
+ for (int a = 0; a < mb->totcol; a++) {
outliner_add_element(space_outliner, &te->subtree, mb->mat[a], te, 0, a);
}
break;
}
case ID_MA: {
Material *ma = (Material *)id;
-
if (outliner_animdata_test(ma->adt)) {
outliner_add_element(space_outliner, &te->subtree, ma, te, TSE_ANIM_DATA, 0);
}
@@ -744,7 +727,6 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_TE: {
Tex *tex = (Tex *)id;
-
if (outliner_animdata_test(tex->adt)) {
outliner_add_element(space_outliner, &te->subtree, tex, te, TSE_ANIM_DATA, 0);
}
@@ -753,7 +735,6 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_CA: {
Camera *ca = (Camera *)id;
-
if (outliner_animdata_test(ca->adt)) {
outliner_add_element(space_outliner, &te->subtree, ca, te, TSE_ANIM_DATA, 0);
}
@@ -761,7 +742,6 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_CF: {
CacheFile *cache_file = (CacheFile *)id;
-
if (outliner_animdata_test(cache_file->adt)) {
outliner_add_element(space_outliner, &te->subtree, cache_file, te, TSE_ANIM_DATA, 0);
}
@@ -770,7 +750,6 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_LA: {
Light *la = (Light *)id;
-
if (outliner_animdata_test(la->adt)) {
outliner_add_element(space_outliner, &te->subtree, la, te, TSE_ANIM_DATA, 0);
}
@@ -778,7 +757,6 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_SPK: {
Speaker *spk = (Speaker *)id;
-
if (outliner_animdata_test(spk->adt)) {
outliner_add_element(space_outliner, &te->subtree, spk, te, TSE_ANIM_DATA, 0);
}
@@ -786,7 +764,6 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_LP: {
LightProbe *prb = (LightProbe *)id;
-
if (outliner_animdata_test(prb->adt)) {
outliner_add_element(space_outliner, &te->subtree, prb, te, TSE_ANIM_DATA, 0);
}
@@ -794,7 +771,6 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_WO: {
World *wrld = (World *)id;
-
if (outliner_animdata_test(wrld->adt)) {
outliner_add_element(space_outliner, &te->subtree, wrld, te, TSE_ANIM_DATA, 0);
}
@@ -802,7 +778,6 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_KE: {
Key *key = (Key *)id;
-
if (outliner_animdata_test(key->adt)) {
outliner_add_element(space_outliner, &te->subtree, key, te, TSE_ANIM_DATA, 0);
}
@@ -815,27 +790,25 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_AR: {
bArmature *arm = (bArmature *)id;
- int a = 0;
if (outliner_animdata_test(arm->adt)) {
outliner_add_element(space_outliner, &te->subtree, arm, te, TSE_ANIM_DATA, 0);
}
if (arm->edbo) {
- EditBone *ebone;
- TreeElement *ten;
-
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next, a++) {
- ten = outliner_add_element(space_outliner, &te->subtree, id, te, TSE_EBONE, a);
+ int a = 0;
+ LISTBASE_FOREACH_INDEX (EditBone *, ebone, arm->edbo, a) {
+ TreeElement *ten = outliner_add_element(
+ space_outliner, &te->subtree, id, te, TSE_EBONE, a);
ten->directdata = ebone;
ten->name = ebone->name;
ebone->temp.p = ten;
}
/* make hierarchy */
- ten = arm->edbo->first ? ((EditBone *)arm->edbo->first)->temp.p : NULL;
+ TreeElement *ten = arm->edbo->first ? ((EditBone *)arm->edbo->first)->temp.p : NULL;
while (ten) {
TreeElement *nten = ten->next, *par;
- ebone = (EditBone *)ten->directdata;
+ EditBone *ebone = (EditBone *)ten->directdata;
if (ebone->parent) {
BLI_remlink(&te->subtree, ten);
par = ebone->parent->temp.p;
@@ -852,9 +825,9 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
/* pass */
}
else {
- Bone *curBone;
- for (curBone = arm->bonebase.first; curBone; curBone = curBone->next) {
- outliner_add_bone(space_outliner, &te->subtree, id, curBone, te, &a);
+ int a = 0;
+ LISTBASE_FOREACH (Bone *, bone, &arm->bonebase) {
+ outliner_add_bone(space_outliner, &te->subtree, id, bone, te, &a);
}
}
}
@@ -862,13 +835,12 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_LS: {
FreestyleLineStyle *linestyle = (FreestyleLineStyle *)id;
- int a;
if (outliner_animdata_test(linestyle->adt)) {
outliner_add_element(space_outliner, &te->subtree, linestyle, te, TSE_ANIM_DATA, 0);
}
- for (a = 0; a < MAX_MTEX; a++) {
+ for (int a = 0; a < MAX_MTEX; a++) {
if (linestyle->mtex[a]) {
outliner_add_element(space_outliner, &te->subtree, linestyle->mtex[a]->tex, te, 0, a);
}
@@ -877,17 +849,16 @@ static void outliner_add_id_contents(SpaceOutliner *space_outliner,
}
case ID_GD: {
bGPdata *gpd = (bGPdata *)id;
- bGPDlayer *gpl;
- int a = 0;
if (outliner_animdata_test(gpd->adt)) {
outliner_add_element(space_outliner, &te->subtree, gpd, te, TSE_ANIM_DATA, 0);
}
/* TODO: base element for layers? */
- for (gpl = gpd->layers.last; gpl; gpl = gpl->prev) {
- outliner_add_element(space_outliner, &te->subtree, gpl, te, TSE_GP_LAYER, a);
- a++;
+ int index = 0;
+ LISTBASE_FOREACH_BACKWARD (bGPDlayer *, gpl, &gpd->layers) {
+ outliner_add_element(space_outliner, &te->subtree, gpl, te, TSE_GP_LAYER, index);
+ index++;
}
break;
}
@@ -957,8 +928,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
short type,
short index)
{
- TreeElement *te;
- TreeStoreElem *tselem;
ID *id = idv;
if (ELEM(type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) {
@@ -985,12 +954,12 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
BLI_assert(TREESTORE_ID_TYPE(id));
}
- te = MEM_callocN(sizeof(TreeElement), "tree elem");
+ TreeElement *te = MEM_callocN(sizeof(TreeElement), __func__);
/* add to the visual tree */
BLI_addtail(lb, te);
/* add to the storage */
check_persistent(space_outliner, te, id, type, index);
- tselem = TREESTORE(te);
+ TreeStoreElem *tselem = TREESTORE(te);
/* if we are searching for something expand to see child elements */
if (SEARCHING_OUTLINER(space_outliner)) {
@@ -1022,9 +991,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
else if (type == TSE_ID_BASE) {
/* pass */
}
- else if (ELEM(type, TSE_KEYMAP, TSE_KEYMAP_ITEM)) {
- /* pass */
- }
else {
/* Other cases must be caught above. */
BLI_assert(TSE_IS_REAL_ID(tselem));
@@ -1062,7 +1028,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
}
else if (type == TSE_SEQUENCE) {
Sequence *seq = (Sequence *)idv;
- Sequence *p;
/*
* The idcode is a little hack, but the outliner
@@ -1081,10 +1046,8 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
*/
if (seq->type == SEQ_TYPE_META) {
- p = seq->seqbase.first;
- while (p) {
+ LISTBASE_FOREACH (Sequence *, p, &seq->seqbase) {
outliner_add_element(space_outliner, &te->subtree, (void *)p, te, TSE_SEQUENCE, index);
- p = p->next;
}
}
else {
@@ -1112,17 +1075,13 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
te->name = seq->strip->stripdata->name;
}
else if (ELEM(type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) {
- PointerRNA pptr, propptr, *ptr = (PointerRNA *)idv;
- PropertyRNA *prop, *iterprop;
- PropertyType proptype;
+ PointerRNA *ptr = (PointerRNA *)idv;
/* Don't display arrays larger, weak but index is stored as a short,
* also the outliner isn't intended for editing such large data-sets. */
BLI_STATIC_ASSERT(sizeof(te->index) == 2, "Index is no longer short!")
const int tot_limit = SHRT_MAX;
- int a, tot;
-
/* we do lazy build, for speed and to avoid infinite recursion */
if (ptr->data == NULL) {
@@ -1144,8 +1103,8 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
tselem->flag &= ~TSE_CHILDSEARCH;
}
- iterprop = RNA_struct_iterator_property(ptr->type);
- tot = RNA_property_collection_length(ptr, iterprop);
+ PropertyRNA *iterprop = RNA_struct_iterator_property(ptr->type);
+ int tot = RNA_property_collection_length(ptr, iterprop);
CLAMP_MAX(tot, tot_limit);
/* auto open these cases */
@@ -1156,7 +1115,8 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
}
if (TSELEM_OPEN(tselem, space_outliner)) {
- for (a = 0; a < tot; a++) {
+ for (int a = 0; a < tot; a++) {
+ PointerRNA propptr;
RNA_property_collection_lookup_int(ptr, iterprop, a, &propptr);
if (!(RNA_property_flag(propptr.data) & PROP_HIDDEN)) {
outliner_add_element(
@@ -1172,11 +1132,12 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
}
else if (type == TSE_RNA_PROPERTY) {
/* property */
- iterprop = RNA_struct_iterator_property(ptr->type);
+ PointerRNA propptr;
+ PropertyRNA *iterprop = RNA_struct_iterator_property(ptr->type);
RNA_property_collection_lookup_int(ptr, iterprop, index, &propptr);
- prop = propptr.data;
- proptype = RNA_property_type(prop);
+ PropertyRNA *prop = propptr.data;
+ PropertyType proptype = RNA_property_type(prop);
te->name = RNA_property_ui_name(prop);
te->directdata = prop;
@@ -1188,7 +1149,7 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
}
if (proptype == PROP_POINTER) {
- pptr = RNA_property_pointer_get(ptr, prop);
+ PointerRNA pptr = RNA_property_pointer_get(ptr, prop);
if (pptr.data) {
if (TSELEM_OPEN(tselem, space_outliner)) {
@@ -1201,11 +1162,12 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
}
}
else if (proptype == PROP_COLLECTION) {
- tot = RNA_property_collection_length(ptr, prop);
+ int tot = RNA_property_collection_length(ptr, prop);
CLAMP_MAX(tot, tot_limit);
if (TSELEM_OPEN(tselem, space_outliner)) {
- for (a = 0; a < tot; a++) {
+ for (int a = 0; a < tot; a++) {
+ PointerRNA pptr;
RNA_property_collection_lookup_int(ptr, prop, a, &pptr);
outliner_add_element(
space_outliner, &te->subtree, (void *)&pptr, te, TSE_RNA_STRUCT, a);
@@ -1216,11 +1178,11 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
}
}
else if (ELEM(proptype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
- tot = RNA_property_array_length(ptr, prop);
+ int tot = RNA_property_array_length(ptr, prop);
CLAMP_MAX(tot, tot_limit);
if (TSELEM_OPEN(tselem, space_outliner)) {
- for (a = 0; a < tot; a++) {
+ for (int a = 0; a < tot; a++) {
outliner_add_element(
space_outliner, &te->subtree, (void *)ptr, te, TSE_RNA_ARRAY_ELEM, a);
}
@@ -1231,15 +1193,13 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
}
}
else if (type == TSE_RNA_ARRAY_ELEM) {
- char c;
-
- prop = parent->directdata;
+ PropertyRNA *prop = parent->directdata;
te->directdata = prop;
te->rnaptr = *ptr;
te->index = index;
- c = RNA_property_array_item_char(prop, index);
+ char c = RNA_property_array_item_char(prop, index);
te->name = MEM_callocN(sizeof(char[20]), "OutlinerRNAArrayName");
if (c) {
@@ -1251,52 +1211,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
te->flag |= TE_FREE_NAME;
}
}
- else if (type == TSE_KEYMAP) {
- wmKeyMap *km = (wmKeyMap *)idv;
- wmKeyMapItem *kmi;
- char opname[OP_MAX_TYPENAME];
-
- te->directdata = idv;
- te->name = km->idname;
-
- if (TSELEM_OPEN(tselem, space_outliner)) {
- int a = 0;
-
- for (kmi = km->items.first; kmi; kmi = kmi->next, a++) {
- const char *key = WM_key_event_string(kmi->type, false);
-
- if (key[0]) {
- wmOperatorType *ot = NULL;
-
- if (kmi->propvalue) {
- /* pass */
- }
- else {
- ot = WM_operatortype_find(kmi->idname, 0);
- }
-
- if (ot || kmi->propvalue) {
- TreeElement *ten = outliner_add_element(
- space_outliner, &te->subtree, kmi, te, TSE_KEYMAP_ITEM, a);
-
- ten->directdata = kmi;
-
- if (kmi->propvalue) {
- ten->name = IFACE_("Modal map, not yet");
- }
- else {
- WM_operator_py_idname(opname, ot->idname);
- ten->name = BLI_strdup(opname);
- ten->flag |= TE_FREE_NAME;
- }
- }
- }
- }
- }
- else {
- te->flag |= TE_LAZY_CLOSED;
- }
- }
return te;
}
@@ -1344,21 +1258,18 @@ static TreeElement *outliner_add_collection_recursive(SpaceOutliner *space_outli
/* make sure elements are correctly nested */
void outliner_make_object_parent_hierarchy(ListBase *lb)
{
- TreeElement *te, *ten, *tep;
- TreeStoreElem *tselem;
-
/* build hierarchy */
/* XXX also, set extents here... */
- te = lb->first;
+ TreeElement *te = lb->first;
while (te) {
- ten = te->next;
- tselem = TREESTORE(te);
+ TreeElement *ten = te->next;
+ TreeStoreElem *tselem = TREESTORE(te);
if (tselem->type == 0 && te->idcode == ID_OB) {
Object *ob = (Object *)tselem->id;
if (ob->parent && ob->parent->id.newid) {
BLI_remlink(lb, te);
- tep = (TreeElement *)ob->parent->id.newid;
+ TreeElement *tep = (TreeElement *)ob->parent->id.newid;
BLI_addtail(&tep->subtree, te);
te->parent = tep;
}
@@ -1380,10 +1291,9 @@ typedef struct tTreeSort {
static int treesort_alpha_ob(const void *v1, const void *v2)
{
const tTreeSort *x1 = v1, *x2 = v2;
- int comp;
/* first put objects last (hierarchy) */
- comp = (x1->idcode == ID_OB);
+ int comp = (x1->idcode == ID_OB);
if (x2->idcode == ID_OB) {
comp += 2;
}
@@ -1432,9 +1342,8 @@ static int treesort_child_not_in_collection(const void *v1, const void *v2)
static int treesort_alpha(const void *v1, const void *v2)
{
const tTreeSort *x1 = v1, *x2 = v2;
- int comp;
- comp = BLI_strcasecmp_natural(x1->name, x2->name);
+ int comp = BLI_strcasecmp_natural(x1->name, x2->name);
if (comp > 0) {
return 1;
@@ -1489,14 +1398,11 @@ static int treesort_obtype_alpha(const void *v1, const void *v2)
/* sort happens on each subtree individual */
static void outliner_sort(ListBase *lb)
{
- TreeElement *te;
- TreeStoreElem *tselem;
-
- te = lb->last;
+ TreeElement *te = lb->last;
if (te == NULL) {
return;
}
- tselem = TREESTORE(te);
+ TreeStoreElem *tselem = TREESTORE(te);
/* sorting rules; only object lists, ID lists, or deformgroups */
if (ELEM(tselem->type, TSE_DEFGROUP, TSE_ID_BASE) ||
@@ -1558,14 +1464,11 @@ static void outliner_sort(ListBase *lb)
static void outliner_collections_children_sort(ListBase *lb)
{
- TreeElement *te;
- TreeStoreElem *tselem;
-
- te = lb->last;
+ TreeElement *te = lb->last;
if (te == NULL) {
return;
}
- tselem = TREESTORE(te);
+ TreeStoreElem *tselem = TREESTORE(te);
/* Sorting rules: only object lists. */
if (tselem->type == 0 && te->idcode == ID_OB) {
@@ -1687,8 +1590,7 @@ static TreeElement *outliner_find_first_desired_element_at_y(const SpaceOutliner
const float view_co,
const float view_co_limit)
{
- TreeElement *te, *te_sub;
- te = outliner_find_item_at_y(space_outliner, &space_outliner->tree, view_co);
+ TreeElement *te = outliner_find_item_at_y(space_outliner, &space_outliner->tree, view_co);
bool (*callback_test)(TreeElement *);
if ((space_outliner->outlinevis == SO_VIEW_LAYER) &&
@@ -1700,7 +1602,7 @@ static TreeElement *outliner_find_first_desired_element_at_y(const SpaceOutliner
}
while (te != NULL) {
- te_sub = outliner_find_first_desired_element_at_y_recursive(
+ TreeElement *te_sub = outliner_find_first_desired_element_at_y_recursive(
space_outliner, te, view_co_limit, callback_test);
if (te_sub != NULL) {
/* Skip the element if it was not visible to start with. */
@@ -1742,12 +1644,12 @@ static void outliner_store_scrolling_position(SpaceOutliner *space_outliner,
ARegion *region,
OutlinerTreeElementFocus *focus)
{
- TreeElement *te;
float limit = region->v2d.cur.ymin;
outliner_set_coordinates(region, space_outliner);
- te = outliner_find_first_desired_element_at_y(space_outliner, region->v2d.cur.ymax, limit);
+ TreeElement *te = outliner_find_first_desired_element_at_y(
+ space_outliner, region->v2d.cur.ymax, limit);
if (te != NULL) {
focus->tselem = TREESTORE(te);
diff --git a/source/blender/editors/space_outliner/outliner_utils.c b/source/blender/editors/space_outliner/outliner_utils.c
index e0d63dfcf81..92178cfdfc9 100644
--- a/source/blender/editors/space_outliner/outliner_utils.c
+++ b/source/blender/editors/space_outliner/outliner_utils.c
@@ -169,7 +169,7 @@ TreeElement *outliner_find_item_at_x_in_row(const SpaceOutliner *space_outliner,
return te;
}
-/* Find specific item from the treestore */
+/* Find specific item from the trees-tore. */
TreeElement *outliner_find_tree_element(ListBase *lb, const TreeStoreElem *store_elem)
{
LISTBASE_FOREACH (TreeElement *, te, lb) {
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index 6c9d4433abd..5fde6e381e0 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -31,9 +31,7 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
-#include "BKE_layer.h"
#include "BKE_outliner_treehash.h"
-#include "BKE_scene.h"
#include "BKE_screen.h"
#include "ED_screen.h"
@@ -51,7 +49,6 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "GPU_framebuffer.h"
#include "outliner_intern.h"
#include "tree/tree_display.h"
@@ -102,12 +99,11 @@ static void outliner_main_region_free(ARegion *UNUSED(region))
{
}
-static void outliner_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void outliner_main_region_listener(const wmRegionListenerParams *params)
{
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
SpaceOutliner *space_outliner = area->spacedata.first;
/* context changes */
@@ -264,15 +260,13 @@ static void outliner_main_region_listener(wmWindow *UNUSED(win),
}
}
-static void outliner_main_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen),
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void outliner_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
SpaceOutliner *space_outliner = area->spacedata.first;
+
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
.user_data = region,
@@ -301,12 +295,11 @@ static void outliner_header_region_free(ARegion *UNUSED(region))
{
}
-static void outliner_header_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void outliner_header_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SCENE:
@@ -332,7 +325,7 @@ static SpaceLink *outliner_create(const ScrArea *UNUSED(area), const Scene *UNUS
space_outliner = MEM_callocN(sizeof(SpaceOutliner), "initoutliner");
space_outliner->spacetype = SPACE_OUTLINER;
space_outliner->filter_id_type = ID_GR;
- space_outliner->show_restrict_flags = SO_RESTRICT_ENABLE | SO_RESTRICT_HIDE;
+ space_outliner->show_restrict_flags = SO_RESTRICT_ENABLE | SO_RESTRICT_HIDE | SO_RESTRICT_RENDER;
space_outliner->outlinevis = SO_VIEW_LAYER;
space_outliner->sync_select_dirty |= WM_OUTLINER_SYNC_SELECT_FROM_ALL;
space_outliner->flag = SO_SYNC_SELECT | SO_MODE_COLUMN;
@@ -408,7 +401,7 @@ static void outliner_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_i
/* Some early out checks. */
if (!TREESTORE_ID_TYPE(old_id)) {
- return; /* ID type is not used by outilner... */
+ return; /* ID type is not used by outliner. */
}
if (space_outliner->search_tse.id == old_id) {
diff --git a/source/blender/editors/space_outliner/tree/common.cc b/source/blender/editors/space_outliner/tree/common.cc
index 65c9448634c..306d59288f4 100644
--- a/source/blender/editors/space_outliner/tree/common.cc
+++ b/source/blender/editors/space_outliner/tree/common.cc
@@ -28,7 +28,6 @@
/* -------------------------------------------------------------------- */
/** \name ID Helpers.
- *
* \{ */
const char *outliner_idcode_to_plural(short idcode)
diff --git a/source/blender/editors/space_outliner/tree/tree_display.cc b/source/blender/editors/space_outliner/tree/tree_display.cc
index d2070fb9b1c..6632c057814 100644
--- a/source/blender/editors/space_outliner/tree/tree_display.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display.cc
@@ -18,8 +18,6 @@
* \ingroup spoutliner
*/
-#include "BLI_listbase.h"
-
#include "DNA_listBase.h"
#include "tree_display.hh"
diff --git a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc
index f7740f4648f..a0ebac5f451 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc
@@ -60,7 +60,6 @@ class ObjectsChildrenBuilder {
/* -------------------------------------------------------------------- */
/** \name Tree-Display for a View Layer.
- *
* \{ */
TreeDisplayViewLayer::TreeDisplayViewLayer(SpaceOutliner &space_outliner)
@@ -143,10 +142,6 @@ void TreeDisplayViewLayer::add_layer_collections_recursive(ListBase &tree,
if (!(tselem->used || ID_IS_LINKED(id) || ID_IS_OVERRIDE_LIBRARY(id))) {
tselem->flag &= ~TSE_CLOSED;
}
-
- if (exclude || (lc->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER) == 0) {
- ten->flag |= TE_DISABLED;
- }
}
add_layer_collections_recursive(ten->subtree, lc->layer_collections, *ten);
@@ -165,10 +160,6 @@ void TreeDisplayViewLayer::add_layer_collection_objects(ListBase &tree,
TreeElement *te_object = outliner_add_element(
&space_outliner_, &tree, base->object, &ten, 0, 0);
te_object->directdata = base;
-
- if (!(base->flag & BASE_VISIBLE_VIEWLAYER)) {
- te_object->flag |= TE_DISABLED;
- }
}
}
diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc
index ce2a8fa634d..27846614994 100644
--- a/source/blender/editors/space_outliner/tree/tree_element.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element.cc
@@ -20,8 +20,6 @@
#include "DNA_listBase.h"
-#include "../outliner_intern.h"
-
#include "tree_element_anim_data.hh"
#include "tree_element_driver_base.hh"
#include "tree_element_nla.hh"
diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c
index 3330ba14530..4ce0e454df8 100644
--- a/source/blender/editors/space_script/space_script.c
+++ b/source/blender/editors/space_script/space_script.c
@@ -36,7 +36,6 @@
#include "ED_space_api.h"
#include "WM_api.h"
-#include "WM_types.h"
#include "UI_resources.h"
#include "UI_view2d.h"
@@ -44,7 +43,6 @@
#ifdef WITH_PYTHON
#endif
-#include "GPU_framebuffer.h"
#include "script_intern.h" /* own include */
// static script_run_python(char *funcname, )
@@ -156,13 +154,8 @@ static void script_header_region_draw(const bContext *C, ARegion *region)
ED_region_header(C, region);
}
-static void script_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *UNUSED(region),
- wmNotifier *UNUSED(wmn),
- const Scene *UNUSED(scene))
+static void script_main_region_listener(const wmRegionListenerParams *UNUSED(params))
{
-/* context changes */
/* XXX - Todo, need the ScriptSpace accessible to get the python script to run. */
#if 0
BPY_run_script_space_listener()
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index f9076145f2f..e605cf4a889 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -66,8 +66,6 @@
#include "UI_interface.h"
-#include "BKE_sound.h"
-
#ifdef WITH_AUDASPACE
# include <AUD_Sequence.h>
#endif
@@ -1069,6 +1067,9 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
else if (seq->type == SEQ_TYPE_TEXT) {
seq->blend_mode = SEQ_TYPE_ALPHAOVER;
}
+ else if (SEQ_effect_get_num_inputs(seq->type) == 1) {
+ seq->blend_mode = seq1->blend_mode;
+ }
/* Set channel. If unset, use lowest free one above strips. */
if (!RNA_struct_property_is_set(op->ptr, "channel")) {
diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c
index a8c13d63259..11614d94862 100644
--- a/source/blender/editors/space_sequencer/sequencer_buttons.c
+++ b/source/blender/editors/space_sequencer/sequencer_buttons.c
@@ -35,13 +35,9 @@
#include "BKE_global.h"
#include "BKE_screen.h"
-#include "ED_gpencil.h"
#include "ED_screen.h"
#include "ED_sequencer.h"
-#include "WM_api.h"
-#include "WM_types.h"
-
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 72c3e43185b..b9fb577eb43 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -1447,15 +1447,24 @@ static void sequencer_draw_borders_overlay(const SpaceSeq *sseq,
if (sseq->flag & SEQ_SHOW_SAFE_MARGINS) {
immUniformThemeColorBlend(TH_VIEW_OVERLAY, TH_BACK, 0.25f);
- UI_draw_safe_areas(
- shdr_pos, x1, x2, y1, y2, scene->safe_areas.title, scene->safe_areas.action);
+ UI_draw_safe_areas(shdr_pos,
+ &(const rctf){
+ .xmin = x1,
+ .xmax = x2,
+ .ymin = y1,
+ .ymax = y2,
+ },
+ scene->safe_areas.title,
+ scene->safe_areas.action);
if (sseq->flag & SEQ_SHOW_SAFE_CENTER) {
UI_draw_safe_areas(shdr_pos,
- x1,
- x2,
- y1,
- y2,
+ &(const rctf){
+ .xmin = x1,
+ .xmax = x2,
+ .ymin = y1,
+ .ymax = y2,
+ },
scene->safe_areas.title_center,
scene->safe_areas.action_center);
}
@@ -1524,7 +1533,7 @@ static void *sequencer_OCIO_transform_ibuf(const bContext *C,
/* Default */
*r_format = GPU_RGBA8;
- *r_data = GPU_DATA_UNSIGNED_BYTE;
+ *r_data = GPU_DATA_UBYTE;
/* Fallback to CPU based color space conversion. */
if (force_fallback) {
@@ -1571,7 +1580,7 @@ static void *sequencer_OCIO_transform_ibuf(const bContext *C,
if ((ibuf->rect || ibuf->rect_float) && !*r_glsl_used) {
display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
*r_format = GPU_RGBA8;
- *r_data = GPU_DATA_UNSIGNED_BYTE;
+ *r_data = GPU_DATA_UBYTE;
}
if (cache_handle) {
IMB_display_buffer_release(cache_handle);
@@ -1673,7 +1682,7 @@ static void sequencer_draw_display_buffer(const bContext *C,
display_buffer = (uchar *)ibuf->rect;
format = GPU_RGBA8;
- data = GPU_DATA_UNSIGNED_BYTE;
+ data = GPU_DATA_UBYTE;
}
else {
display_buffer = sequencer_OCIO_transform_ibuf(C, ibuf, &glsl_used, &format, &data);
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 7474f8034de..608e220c582 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -28,7 +28,6 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
-#include "BLI_ghash.h"
#include "BLI_math.h"
#include "BLI_timecode.h"
#include "BLI_utildefines.h"
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index 7bfc8600544..48e6cfcdcd0 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -29,12 +29,7 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_markers.h"
-#include "ED_select_utils.h"
#include "ED_sequencer.h"
-#include "ED_transform.h" /* Transform keymap. */
-
-#include "SEQ_sequencer.h"
#include "sequencer_intern.h"
diff --git a/source/blender/editors/space_sequencer/sequencer_proxy.c b/source/blender/editors/space_sequencer/sequencer_proxy.c
index b9698492aa5..24fa4ad7a17 100644
--- a/source/blender/editors/space_sequencer/sequencer_proxy.c
+++ b/source/blender/editors/space_sequencer/sequencer_proxy.c
@@ -25,7 +25,6 @@
#include "BLI_blenlib.h"
#include "BLI_ghash.h"
-#include "BLI_timecode.h"
#include "DNA_scene_types.h"
diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.c b/source/blender/editors/space_sequencer/sequencer_scopes.c
index f5707d1ea65..16768e09cb8 100644
--- a/source/blender/editors/space_sequencer/sequencer_scopes.c
+++ b/source/blender/editors/space_sequencer/sequencer_scopes.c
@@ -30,8 +30,6 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-#include "atomic_ops.h"
-
#include "sequencer_intern.h"
/* XXX, why is this function better than BLI_math version?
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index 3b476fefe47..ffcb3d35d5a 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -26,6 +26,7 @@
#include <string.h>
#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
@@ -771,69 +772,83 @@ void SEQUENCER_OT_select(wmOperatorType *ot)
* \{ */
/* Run recursively to select linked. */
-static bool select_more_less_seq__internal(Scene *scene, bool sel, const bool linked)
+static bool select_linked_internal(Scene *scene)
{
Editing *ed = SEQ_editing_get(scene, false);
- Sequence *seq, *neighbor;
- bool changed = false;
- int isel;
if (ed == NULL) {
- return changed;
+ return false;
}
- if (sel) {
- sel = SELECT;
- isel = 0;
+ bool changed = false;
+
+ LISTBASE_FOREACH (Sequence *, seq, SEQ_active_seqbase_get(ed)) {
+ if ((seq->flag & SELECT) != 0) {
+ continue;
+ }
+ /* Only get unselected neighbors. */
+ Sequence *neighbor = find_neighboring_sequence(scene, seq, SEQ_SIDE_LEFT, 0);
+ if (neighbor) {
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ changed = true;
+ }
+ neighbor = find_neighboring_sequence(scene, seq, SEQ_SIDE_RIGHT, 0);
+ if (neighbor) {
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ changed = true;
+ }
}
- else {
- sel = 0;
- isel = SELECT;
+
+ return changed;
+}
+
+/* Select only one linked strip on each side. */
+static bool select_more_less_seq__internal(Scene *scene, bool select_more)
+{
+ Editing *ed = SEQ_editing_get(scene, false);
+
+ if (ed == NULL) {
+ return false;
}
- if (!linked) {
- /* If not linked we only want to touch each seq once, newseq. */
- for (seq = ed->seqbasep->first; seq; seq = seq->next) {
- seq->tmp = NULL;
+ GSet *neighbors = BLI_gset_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "Linked strips");
+ const int neighbor_selection_filter = select_more ? 0 : SELECT;
+ const int selection_filter = select_more ? SELECT : 0;
+
+ LISTBASE_FOREACH (Sequence *, seq, SEQ_active_seqbase_get(ed)) {
+ if ((seq->flag & SELECT) != selection_filter) {
+ continue;
+ }
+ Sequence *neighbor = find_neighboring_sequence(
+ scene, seq, SEQ_SIDE_LEFT, neighbor_selection_filter);
+ if (neighbor) {
+ BLI_gset_add(neighbors, neighbor);
+ }
+ neighbor = find_neighboring_sequence(scene, seq, SEQ_SIDE_RIGHT, neighbor_selection_filter);
+ if (neighbor) {
+ BLI_gset_add(neighbors, neighbor);
}
}
- for (seq = ed->seqbasep->first; seq; seq = seq->next) {
- if ((seq->flag & SELECT) == sel) {
- if (linked || (seq->tmp == NULL)) {
- /* Only get unselected neighbors. */
- neighbor = find_neighboring_sequence(scene, seq, SEQ_SIDE_LEFT, isel);
- if (neighbor) {
- if (sel) {
- neighbor->flag |= SELECT;
- recurs_sel_seq(neighbor);
- }
- else {
- neighbor->flag &= ~SELECT;
- }
- if (!linked) {
- neighbor->tmp = (Sequence *)1;
- }
- changed = true;
- }
- neighbor = find_neighboring_sequence(scene, seq, SEQ_SIDE_RIGHT, isel);
- if (neighbor) {
- if (sel) {
- neighbor->flag |= SELECT;
- recurs_sel_seq(neighbor);
- }
- else {
- neighbor->flag &= ~SELECT;
- }
- if (!linked) {
- neighbor->tmp = (Sequence *)1;
- }
- changed = true;
- }
- }
+ bool changed = false;
+ GSetIterator gsi;
+ BLI_gsetIterator_init(&gsi, neighbors);
+ while (!BLI_gsetIterator_done(&gsi)) {
+ Sequence *neighbor = BLI_gsetIterator_getKey(&gsi);
+ if (select_more) {
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ }
+ else {
+ neighbor->flag &= ~SELECT;
}
+ changed = true;
+ BLI_gsetIterator_step(&gsi);
}
+ BLI_gset_free(neighbors, NULL);
return changed;
}
@@ -841,7 +856,7 @@ static int sequencer_select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
- if (!select_more_less_seq__internal(scene, true, false)) {
+ if (!select_more_less_seq__internal(scene, true)) {
return OPERATOR_CANCELLED;
}
@@ -877,7 +892,7 @@ static int sequencer_select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
- if (!select_more_less_seq__internal(scene, false, false)) {
+ if (!select_more_less_seq__internal(scene, false)) {
return OPERATOR_CANCELLED;
}
@@ -934,7 +949,7 @@ static int sequencer_select_linked_pick_invoke(bContext *C, wmOperator *op, cons
selected = 1;
while (selected) {
- selected = select_more_less_seq__internal(scene, 1, 1);
+ selected = select_linked_internal(scene);
}
ED_outliner_select_sync_from_sequence_tag(C);
@@ -975,7 +990,7 @@ static int sequencer_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
selected = true;
while (selected) {
- selected = select_more_less_seq__internal(scene, true, true);
+ selected = select_linked_internal(scene);
}
ED_outliner_select_sync_from_sequence_tag(C);
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index b11e2a32b87..cf26d1e3243 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -51,7 +51,6 @@
#include "RNA_access.h"
-#include "SEQ_sequencer.h"
#include "SEQ_utils.h"
#include "UI_interface.h"
@@ -334,11 +333,11 @@ static SpaceLink *sequencer_duplicate(SpaceLink *sl)
return (SpaceLink *)sseqn;
}
-static void sequencer_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void sequencer_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
+
/* Context changes. */
switch (wmn->category) {
case NC_SCENE:
@@ -449,9 +448,9 @@ static void sequencer_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW);
- WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy);
- WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy);
- WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy);
+ WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy, NULL);
+ WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy, NULL);
+ WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy, NULL);
}
/* ************* end drop *********** */
@@ -534,12 +533,11 @@ static void sequencer_main_region_draw_overlay(const bContext *C, ARegion *regio
draw_timeline_seq_display(C, region);
}
-static void sequencer_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void sequencer_main_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* Context changes. */
switch (wmn->category) {
case NC_SCENE:
@@ -579,14 +577,12 @@ static void sequencer_main_region_listener(wmWindow *UNUSED(win),
}
}
-static void sequencer_main_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *scene,
- struct bScreen *UNUSED(screen),
- struct ScrArea *UNUSED(area),
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void sequencer_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ Scene *scene = params->scene;
+ ARegion *region = params->region;
+
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
.user_data = region,
@@ -746,12 +742,11 @@ static void sequencer_preview_region_draw(const bContext *C, ARegion *region)
}
}
-static void sequencer_preview_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void sequencer_preview_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* Context changes. */
switch (wmn->category) {
case NC_GPENCIL:
@@ -816,12 +811,11 @@ static void sequencer_buttons_region_draw(const bContext *C, ARegion *region)
ED_region_panels(C, region);
}
-static void sequencer_buttons_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void sequencer_buttons_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* Context changes. */
switch (wmn->category) {
case NC_GPENCIL:
@@ -959,7 +953,7 @@ void ED_spacetype_sequencer(void)
art->listener = sequencer_main_region_listener;
BLI_addhead(&st->regiontypes, art);
- /* Hud. */
+ /* HUD. */
art = ED_area_type_hud(st->spaceid);
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_statusbar/space_statusbar.c b/source/blender/editors/space_statusbar/space_statusbar.c
index ae56b111360..0b4f483c114 100644
--- a/source/blender/editors/space_statusbar/space_statusbar.c
+++ b/source/blender/editors/space_statusbar/space_statusbar.c
@@ -34,7 +34,6 @@
#include "RNA_access.h"
#include "UI_interface.h"
-#include "UI_view2d.h"
#include "WM_api.h"
#include "WM_message.h"
@@ -95,12 +94,11 @@ static void statusbar_keymap(struct wmKeyConfig *UNUSED(keyconf))
{
}
-static void statusbar_header_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void statusbar_header_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SCREEN:
@@ -131,14 +129,11 @@ static void statusbar_header_region_listener(wmWindow *UNUSED(win),
}
}
-static void statusbar_header_region_message_subscribe(const bContext *UNUSED(C),
- WorkSpace *UNUSED(workspace),
- Scene *UNUSED(scene),
- bScreen *UNUSED(screen),
- ScrArea *UNUSED(area),
- ARegion *region,
- struct wmMsgBus *mbus)
+static void statusbar_header_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ ARegion *region = params->region;
+
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
.user_data = region,
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 0f5ac5abe1d..98faf89f8ae 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -33,7 +33,6 @@
#include "BKE_global.h"
#include "BKE_lib_id.h"
#include "BKE_screen.h"
-#include "BKE_text.h"
#include "ED_screen.h"
#include "ED_space_api.h"
@@ -47,7 +46,6 @@
#include "RNA_access.h"
-#include "GPU_framebuffer.h"
#include "text_format.h"
#include "text_intern.h" /* own include */
@@ -122,11 +120,10 @@ static SpaceLink *text_duplicate(SpaceLink *sl)
return (SpaceLink *)stextn;
}
-static void text_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void text_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
SpaceText *st = area->spacedata.first;
/* context changes */
@@ -370,8 +367,8 @@ static void text_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW);
- WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy);
- WM_dropbox_add(lb, "TEXT_OT_insert", text_drop_paste_poll, text_drop_paste);
+ WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy, NULL);
+ WM_dropbox_add(lb, "TEXT_OT_insert", text_drop_paste_poll, text_drop_paste, NULL);
}
/* ************* end drop *********** */
diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c
index 849766851aa..883556948e2 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -722,7 +722,7 @@ static void text_update_drawcache(SpaceText *st, ARegion *region)
void text_drawcache_tag_update(SpaceText *st, int full)
{
- /* this happens if text editor ops are caled from python */
+ /* This happens if text editor ops are called from Python. */
if (st == NULL) {
return;
}
@@ -1010,13 +1010,16 @@ static void draw_textscroll(const SpaceText *st, rcti *scroll, rcti *back)
BLI_rcti_size_y(&st->runtime.scroll_region_select));
UI_GetThemeColor3fv(TH_HILITE, col);
col[3] = 0.18f;
- UI_draw_roundbox_aa(true,
- st->runtime.scroll_region_select.xmin + 1,
- st->runtime.scroll_region_select.ymin,
- st->runtime.scroll_region_select.xmax - 1,
- st->runtime.scroll_region_select.ymax,
- rad,
- col);
+ UI_draw_roundbox_aa(
+ &(const rctf){
+ .xmin = st->runtime.scroll_region_select.xmin + 1,
+ .xmax = st->runtime.scroll_region_select.xmax - 1,
+ .ymin = st->runtime.scroll_region_select.ymin,
+ .ymax = st->runtime.scroll_region_select.ymax,
+ },
+ true,
+ rad,
+ col);
}
/*********************** draw documentation *******************************/
@@ -1180,7 +1183,14 @@ static void draw_suggestion_list(const SpaceText *st, const TextDrawContext *tdc
}
/* not needed but stands out nicer */
- UI_draw_box_shadow(220, x, y - boxh, x + boxw, y);
+ UI_draw_box_shadow(
+ &(const rctf){
+ .xmin = x,
+ .xmax = x + boxw,
+ .ymin = y - boxh,
+ .ymax = y,
+ },
+ 220);
uint pos = GPU_vertformat_attr_add(
immVertexFormat(), "pos", GPU_COMP_I32, 2, GPU_FETCH_INT_TO_FLOAT);
diff --git a/source/blender/editors/space_text/text_format.c b/source/blender/editors/space_text/text_format.c
index d099f2a20d8..66765206fa6 100644
--- a/source/blender/editors/space_text/text_format.c
+++ b/source/blender/editors/space_text/text_format.c
@@ -237,7 +237,7 @@ bool ED_text_is_syntax_highlight_supported(Text *text)
const char *text_ext = BLI_path_extension(text->id.name + 2);
if (text_ext == NULL) {
- /* Extensionless datablocks are considered highlightable as Python. */
+ /* Extensionless data-blocks are considered highlightable as Python. */
return true;
}
text_ext++; /* skip the '.' */
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 932bacfb8a0..526285c076a 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -3832,7 +3832,7 @@ static int text_resolve_conflict_invoke(bContext *C, wmOperator *op, const wmEve
switch (BKE_text_file_modified_check(text)) {
case 1:
if (text->flags & TXT_ISDIRTY) {
- /* modified locally and externally, ahhh. offer more possibilities. */
+ /* Modified locally and externally, ah. offer more possibilities. */
pup = UI_popup_menu_begin(
C, IFACE_("File Modified Outside and Inside Blender"), ICON_NONE);
layout = UI_popup_menu_layout(pup);
diff --git a/source/blender/editors/space_text/text_undo.c b/source/blender/editors/space_text/text_undo.c
index 61b786b2b13..f55db8c3cc9 100644
--- a/source/blender/editors/space_text/text_undo.c
+++ b/source/blender/editors/space_text/text_undo.c
@@ -196,14 +196,19 @@ static bool text_undosys_step_encode(struct bContext *C,
return true;
}
-static void text_undosys_step_decode(
- struct bContext *C, struct Main *UNUSED(bmain), UndoStep *us_p, int dir, bool is_final)
+static void text_undosys_step_decode(struct bContext *C,
+ struct Main *UNUSED(bmain),
+ UndoStep *us_p,
+ const eUndoStepDir dir,
+ bool is_final)
{
+ BLI_assert(dir != STEP_INVALID);
+
TextUndoStep *us = (TextUndoStep *)us_p;
Text *text = us->text_ref.ptr;
TextState *state;
- if ((us->states[0].buf_array_state != NULL) && (dir == -1) && !is_final) {
+ if ((us->states[0].buf_array_state != NULL) && (dir == STEP_UNDO) && !is_final) {
state = &us->states[0];
}
else {
diff --git a/source/blender/editors/space_topbar/space_topbar.c b/source/blender/editors/space_topbar/space_topbar.c
index dc357cdd355..419721cf89e 100644
--- a/source/blender/editors/space_topbar/space_topbar.c
+++ b/source/blender/editors/space_topbar/space_topbar.c
@@ -38,7 +38,6 @@
#include "ED_screen.h"
#include "ED_space_api.h"
-#include "ED_undo.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -129,12 +128,11 @@ static void topbar_header_region_init(wmWindowManager *UNUSED(wm), ARegion *regi
ED_region_header_init(region);
}
-static void topbar_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void topbar_main_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_WM:
@@ -160,12 +158,11 @@ static void topbar_main_region_listener(wmWindow *UNUSED(win),
}
}
-static void topbar_header_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void topbar_header_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_WM:
@@ -191,14 +188,12 @@ static void topbar_header_listener(wmWindow *UNUSED(win),
}
}
-static void topbar_header_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *workspace,
- struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen),
- struct ScrArea *UNUSED(area),
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void topbar_header_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ WorkSpace *workspace = params->workspace;
+ ARegion *region = params->region;
+
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = region,
.user_data = region,
diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c
index 3efdee9cec9..d4692f156d3 100644
--- a/source/blender/editors/space_userpref/space_userpref.c
+++ b/source/blender/editors/space_userpref/space_userpref.c
@@ -183,46 +183,20 @@ static void userpref_execute_region_init(wmWindowManager *wm, ARegion *region)
region->v2d.keepzoom |= V2D_LOCKZOOM_X | V2D_LOCKZOOM_Y;
}
-static void userpref_main_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *UNUSED(region),
- wmNotifier *UNUSED(wmn),
- const Scene *UNUSED(scene))
+static void userpref_main_region_listener(const wmRegionListenerParams *UNUSED(params))
{
- /* context changes */
}
-static void userpref_header_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *UNUSED(region),
- wmNotifier *UNUSED(wmn),
- const Scene *UNUSED(scene))
+static void userpref_header_listener(const wmRegionListenerParams *UNUSED(params))
{
- /* context changes */
-#if 0
- switch (wmn->category) {
- default:
- break;
- }
-#endif
}
-static void userpref_navigation_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *UNUSED(region),
- wmNotifier *UNUSED(wmn),
- const Scene *UNUSED(scene))
+static void userpref_navigation_region_listener(const wmRegionListenerParams *UNUSED(params))
{
- /* context changes */
}
-static void userpref_execute_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *UNUSED(region),
- wmNotifier *UNUSED(wmn),
- const Scene *UNUSED(scene))
+static void userpref_execute_region_listener(const wmRegionListenerParams *UNUSED(params))
{
- /* context changes */
}
/* only called once, from space/spacetypes.c */
diff --git a/source/blender/editors/space_userpref/userpref_ops.c b/source/blender/editors/space_userpref/userpref_ops.c
index f05d6df9944..7c799f0d97b 100644
--- a/source/blender/editors/space_userpref/userpref_ops.c
+++ b/source/blender/editors/space_userpref/userpref_ops.c
@@ -28,10 +28,8 @@
#include "BLI_listbase.h"
#include "BKE_context.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_preferences.h"
-#include "BKE_report.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -39,8 +37,6 @@
#include "UI_interface.h"
-#include "../interface/interface_intern.h"
-
#include "WM_api.h"
#include "WM_types.h"
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 4c168c7a243..3d260a9a05b 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -393,7 +393,7 @@ static void view3d_main_region_init(wmWindowManager *wm, ARegion *region)
keymap = WM_keymap_ensure(wm->defaultconf, "Paint Vertex Selection (Weight, Vertex)", 0, 0);
WM_event_add_keymap_handler(&region->handlers, keymap);
- /* Before 'Weight/Vertex Paint' so adding curve points is not overriden. */
+ /* Before 'Weight/Vertex Paint' so adding curve points is not overridden. */
keymap = WM_keymap_ensure(wm->defaultconf, "Paint Curve", 0, 0);
WM_event_add_keymap_handler(&region->handlers, keymap);
@@ -469,16 +469,30 @@ static bool view3d_drop_in_main_region_poll(bContext *C, const wmEvent *event)
return ED_region_overlap_isect_any_xy(area, &event->x) == false;
}
-static ID *view3d_drop_id_in_main_region_poll_id(bContext *C,
- wmDrag *drag,
- const wmEvent *event,
- ID_Type id_type)
+static ID_Type view3d_drop_id_in_main_region_poll_get_id_type(bContext *C,
+ wmDrag *drag,
+ const wmEvent *event)
{
- ScrArea *area = CTX_wm_area(C);
+ const ScrArea *area = CTX_wm_area(C);
+
if (ED_region_overlap_isect_any_xy(area, &event->x)) {
- return NULL;
+ return 0;
+ }
+ if (!view3d_drop_in_main_region_poll(C, event)) {
+ return 0;
+ }
+
+ ID *local_id = WM_drag_get_local_ID(drag, 0);
+ if (local_id) {
+ return GS(local_id->name);
+ }
+
+ wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0);
+ if (asset_drag) {
+ return asset_drag->id_type;
}
- return view3d_drop_in_main_region_poll(C, event) ? WM_drag_get_local_ID(drag, id_type) : NULL;
+
+ return 0;
}
static bool view3d_drop_id_in_main_region_poll(bContext *C,
@@ -490,7 +504,7 @@ static bool view3d_drop_id_in_main_region_poll(bContext *C,
return false;
}
- return WM_drag_get_local_ID(drag, id_type) || WM_drag_get_asset_data(drag, id_type);
+ return WM_drag_is_ID_type(drag, id_type);
}
static bool view3d_ob_drop_poll(bContext *C,
@@ -522,9 +536,9 @@ static bool view3d_object_data_drop_poll(bContext *C,
const wmEvent *event,
const char **r_tooltip)
{
- ID *id = view3d_drop_id_in_main_region_poll_id(C, drag, event, 0);
- if (id != NULL) {
- if (BKE_object_obdata_to_type(id) != -1) {
+ ID_Type id_type = view3d_drop_id_in_main_region_poll_get_id_type(C, drag, event);
+ if (id_type) {
+ if (OB_DATA_SUPPORT_ID(id_type)) {
*r_tooltip = TIP_("Create object instance from object-data");
return true;
}
@@ -545,7 +559,7 @@ static bool view3d_ima_drop_poll(bContext *C,
return (ELEM(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_MOVIE));
}
- return WM_drag_get_local_ID(drag, ID_IM) || WM_drag_get_asset_data(drag, ID_IM);
+ return WM_drag_is_ID_type(drag, ID_IM);
}
static bool view3d_ima_bg_is_camera_view(bContext *C)
@@ -629,7 +643,7 @@ static void view3d_id_drop_copy(wmDrag *drag, wmDropBox *drop)
static void view3d_id_drop_copy_with_type(wmDrag *drag, wmDropBox *drop)
{
- ID *id = WM_drag_get_local_ID(drag, 0);
+ ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
RNA_string_set(drop->ptr, "name", id->name + 2);
RNA_enum_set(drop->ptr, "type", GS(id->name));
@@ -675,21 +689,41 @@ static void view3d_dropboxes(void)
{
ListBase *lb = WM_dropboxmap_find("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW);
- WM_dropbox_add(lb, "OBJECT_OT_add_named", view3d_ob_drop_poll, view3d_ob_drop_copy);
- WM_dropbox_add(lb, "OBJECT_OT_drop_named_material", view3d_mat_drop_poll, view3d_id_drop_copy);
- WM_dropbox_add(
- lb, "VIEW3D_OT_background_image_add", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy);
- WM_dropbox_add(
- lb, "OBJECT_OT_drop_named_image", view3d_ima_empty_drop_poll, view3d_id_path_drop_copy);
- WM_dropbox_add(lb, "OBJECT_OT_volume_import", view3d_volume_drop_poll, view3d_id_path_drop_copy);
+ WM_dropbox_add(lb,
+ "OBJECT_OT_add_named",
+ view3d_ob_drop_poll,
+ view3d_ob_drop_copy,
+ WM_drag_free_imported_drag_ID);
+ WM_dropbox_add(lb,
+ "OBJECT_OT_drop_named_material",
+ view3d_mat_drop_poll,
+ view3d_id_drop_copy,
+ WM_drag_free_imported_drag_ID);
+ WM_dropbox_add(lb,
+ "VIEW3D_OT_background_image_add",
+ view3d_ima_bg_drop_poll,
+ view3d_id_path_drop_copy,
+ WM_drag_free_imported_drag_ID);
+ WM_dropbox_add(lb,
+ "OBJECT_OT_drop_named_image",
+ view3d_ima_empty_drop_poll,
+ view3d_id_path_drop_copy,
+ WM_drag_free_imported_drag_ID);
+ WM_dropbox_add(lb,
+ "OBJECT_OT_volume_import",
+ view3d_volume_drop_poll,
+ view3d_id_path_drop_copy,
+ WM_drag_free_imported_drag_ID);
WM_dropbox_add(lb,
"OBJECT_OT_collection_instance_add",
view3d_collection_drop_poll,
- view3d_collection_drop_copy);
+ view3d_collection_drop_copy,
+ WM_drag_free_imported_drag_ID);
WM_dropbox_add(lb,
"OBJECT_OT_data_instance_add",
view3d_object_data_drop_poll,
- view3d_id_drop_copy_with_type);
+ view3d_id_drop_copy_with_type,
+ WM_drag_free_imported_drag_ID);
}
static void view3d_widgets(void)
@@ -784,9 +818,13 @@ static void *view3d_main_region_duplicate(void *poin)
return NULL;
}
-static void view3d_main_region_listener(
- wmWindow *win, ScrArea *area, ARegion *region, wmNotifier *wmn, const Scene *scene)
+static void view3d_main_region_listener(const wmRegionListenerParams *params)
{
+ wmWindow *window = params->window;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+ const Scene *scene = params->scene;
View3D *v3d = area->spacedata.first;
RegionView3D *rv3d = region->regiondata;
wmGizmoMap *gzmap = region->gizmo_map;
@@ -1007,10 +1045,10 @@ static void view3d_main_region_listener(
ED_view3d_xr_shading_update(G_MAIN->wm.first, v3d, scene);
#endif
- ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(window);
Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer);
if (depsgraph) {
- ED_render_view3d_update(depsgraph, win, area, true);
+ ED_render_view3d_update(depsgraph, window, area, true);
}
}
ED_region_tag_redraw(region);
@@ -1048,14 +1086,13 @@ static void view3d_main_region_listener(
}
}
-static void view3d_main_region_message_subscribe(const struct bContext *C,
- struct WorkSpace *UNUSED(workspace),
- struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen),
- struct ScrArea *area,
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void view3d_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ const bContext *C = params->context;
+ ScrArea *area = params->area;
+ ARegion *region = params->region;
+
/* Developer note: there are many properties that impact 3D view drawing,
* so instead of subscribing to individual properties, just subscribe to types
* accepting some redundant redraws.
@@ -1170,12 +1207,11 @@ static void view3d_header_region_draw(const bContext *C, ARegion *region)
ED_region_header(C, region);
}
-static void view3d_header_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void view3d_header_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_SCENE:
@@ -1240,14 +1276,11 @@ static void view3d_header_region_listener(wmWindow *UNUSED(win),
#endif
}
-static void view3d_header_region_message_subscribe(const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace),
- struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen),
- struct ScrArea *UNUSED(area),
- struct ARegion *region,
- struct wmMsgBus *mbus)
+static void view3d_header_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
{
+ struct wmMsgBus *mbus = params->message_bus;
+ ARegion *region = params->region;
+
wmMsgParams_RNA msg_key_params = {{0}};
/* Only subscribe to types. */
@@ -1385,12 +1418,11 @@ static void view3d_buttons_region_layout(const bContext *C, ARegion *region)
ED_view3d_buttons_region_layout_ex(C, region, NULL);
}
-static void view3d_buttons_region_listener(wmWindow *UNUSED(win),
- ScrArea *UNUSED(area),
- ARegion *region,
- wmNotifier *wmn,
- const Scene *UNUSED(scene))
+static void view3d_buttons_region_listener(const wmRegionListenerParams *params)
{
+ ARegion *region = params->region;
+ wmNotifier *wmn = params->notifier;
+
/* context changes */
switch (wmn->category) {
case NC_ANIMATION:
@@ -1509,11 +1541,10 @@ static void view3d_tools_region_draw(const bContext *C, ARegion *region)
}
/* area (not region) level listener */
-static void space_view3d_listener(wmWindow *UNUSED(win),
- ScrArea *area,
- struct wmNotifier *wmn,
- Scene *UNUSED(scene))
+static void space_view3d_listener(const wmSpaceTypeListenerParams *params)
{
+ ScrArea *area = params->area;
+ wmNotifier *wmn = params->notifier;
View3D *v3d = area->spacedata.first;
/* context changes */
@@ -1580,7 +1611,8 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
if (view_layer->basact) {
Object *ob = view_layer->basact->object;
/* if hidden but in edit mode, we still display, can happen with animation */
- if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 || (ob->mode & OB_MODE_EDIT)) {
+ if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 ||
+ (ob->mode != OB_MODE_OBJECT)) {
CTX_data_pointer_set(result, &scene->id, &RNA_ObjectBase, view_layer->basact);
}
}
@@ -1588,12 +1620,25 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
return 1;
}
else if (CTX_data_equals(member, "active_object")) {
+ /* In most cases the active object is the `view_layer->basact->object`.
+ * For the 3D view however it can be NULL when hidden.
+ *
+ * This is ignored in the case the object is in any mode (besides object-mode),
+ * since the object's mode impacts the current tool, cursor, gizmos etc.
+ * If we didn't have this exception, changing visibility would need to perform
+ * many of the the same updates as changing the objects mode.
+ *
+ * Further, there are multiple ways to hide objects - by collection, by object type, etc.
+ * it's simplest if all these methods behave consistently - respecting the object-mode
+ * without showing the object.
+ *
+ * See T85532 for alternatives that were considered. */
ViewLayer *view_layer = CTX_data_view_layer(C);
if (view_layer->basact) {
Object *ob = view_layer->basact->object;
/* if hidden but in edit mode, we still display, can happen with animation */
if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 ||
- (ob->mode & OB_MODE_EDIT) != 0) {
+ (ob->mode != OB_MODE_OBJECT)) {
CTX_data_id_pointer_set(result, &ob->id);
}
}
diff --git a/source/blender/editors/space_view3d/view3d_camera_control.c b/source/blender/editors/space_view3d/view3d_camera_control.c
index 11643960595..0edd6aeb2ca 100644
--- a/source/blender/editors/space_view3d/view3d_camera_control.c
+++ b/source/blender/editors/space_view3d/view3d_camera_control.c
@@ -50,12 +50,8 @@
#include "DEG_depsgraph.h"
-#include "ED_screen.h"
-
#include "view3d_intern.h" /* own include */
-#include "BLI_strict_flags.h"
-
typedef struct View3DCameraControl {
/* -------------------------------------------------------------------- */
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 9982d44b6be..a46d093c039 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -165,7 +165,7 @@ void ED_view3d_update_viewmat(Depsgraph *depsgraph,
rv3d->viewcamtexcofac[2] = rv3d->viewcamtexcofac[3] = 0.0f;
}
- /* calculate pixelsize factor once, is used for lights and obcenters */
+ /* Calculate pixel-size factor once, this is used for lights and object-centers. */
{
/* note: '1.0f / len_v3(v1)' replaced 'len_v3(rv3d->viewmat[0])'
* because of float point precision problems at large values T23908. */
@@ -723,15 +723,24 @@ static void drawviewborder(Scene *scene, Depsgraph *depsgraph, ARegion *region,
}
if (ca->flag & CAM_SHOW_SAFE_MARGINS) {
- UI_draw_safe_areas(
- shdr_pos, x1, x2, y1, y2, scene->safe_areas.title, scene->safe_areas.action);
+ UI_draw_safe_areas(shdr_pos,
+ &(const rctf){
+ .xmin = x1,
+ .xmax = x2,
+ .ymin = y1,
+ .ymax = y2,
+ },
+ scene->safe_areas.title,
+ scene->safe_areas.action);
if (ca->flag & CAM_SHOW_SAFE_CENTER) {
UI_draw_safe_areas(shdr_pos,
- x1,
- x2,
- y1,
- y2,
+ &(const rctf){
+ .xmin = x1,
+ .xmax = x2,
+ .ymin = y1,
+ .ymax = y2,
+ },
scene->safe_areas.title_center,
scene->safe_areas.action_center);
}
@@ -869,7 +878,11 @@ void ED_view3d_draw_depth(Depsgraph *depsgraph, ARegion *region, View3D *v3d, bo
UI_Theme_Restore(&theme_state);
}
-/* ******************** other elements ***************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Other Elements
+ * \{ */
/** could move this elsewhere, but tied into #ED_view3d_grid_scale */
float ED_scene_grid_scale(const Scene *scene, const char **r_grid_unit)
@@ -1960,13 +1973,13 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph,
/* XXX(jbakker): `do_color_management` should be controlled by the caller. Currently when doing a
* viewport render animation and saving to an 8bit file format, color management would be applied
* twice. Once here, and once when saving the saving to disk. In this case the Save As Render
- * option cannot be controlled either. But when doing an offscreen render you want to do the
+ * option cannot be controlled either. But when doing an off-screen render you want to do the
* color management here.
*
- * This option was added here to increase the performance when rendering for a playblast. When
- * using workbench the color differences haven't been reported as a bug. But users also use the
- * viewport rendering to render Eevee scenes. In the later situation the saved colors
- * are totally wrong. */
+ * This option was added here to increase the performance for quick view-port preview renders.
+ * When using workbench the color differences haven't been reported as a bug. But users also use
+ * the viewport rendering to render Eevee scenes. In the later situation the saved colors are
+ * totally wrong. */
const bool do_color_management = (ibuf->rect_float == NULL);
ED_view3d_draw_offscreen(depsgraph,
scene,
@@ -1989,7 +2002,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph,
GPU_offscreen_read_pixels(ofs, GPU_DATA_FLOAT, ibuf->rect_float);
}
else if (ibuf->rect) {
- GPU_offscreen_read_pixels(ofs, GPU_DATA_UNSIGNED_BYTE, ibuf->rect);
+ GPU_offscreen_read_pixels(ofs, GPU_DATA_UBYTE, ibuf->rect);
}
/* unbind */
@@ -2140,7 +2153,11 @@ bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], const
return view3d_clipping_test(co, is_local ? rv3d->clip_local : rv3d->clip);
}
-/* *********************** backdraw for selection *************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Back-Draw for Selection
+ * \{ */
/**
* \note Only use in object mode.
@@ -2183,7 +2200,7 @@ static void validate_object_select_id(struct Depsgraph *depsgraph,
}
/* TODO: Create a flag in `DRW_manager` because the drawing is no longer
- * made on the backbuffer in this case. */
+ * made on the back-buffer in this case. */
v3d->flag &= ~V3D_INVALID_BACKBUF;
}
@@ -2212,7 +2229,7 @@ static void view3d_opengl_read_Z_pixels(GPUViewport *viewport, rcti *rect, void
void ED_view3d_select_id_validate(ViewContext *vc)
{
/* TODO: Create a flag in `DRW_manager` because the drawing is no longer
- * made on the backbuffer in this case. */
+ * made on the back-buffer in this case. */
if (vc->v3d->flag & V3D_INVALID_BACKBUF) {
validate_object_select_id(vc->depsgraph, vc->view_layer, vc->region, vc->v3d, vc->obact);
}
@@ -2242,7 +2259,11 @@ int ED_view3d_backbuf_sample_size_clamp(ARegion *region, const float dist)
return (int)min_ff(ceilf(dist), (float)max_ii(region->winx, region->winx));
}
-/* *********************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Z-Depth Utilities
+ * \{ */
void view3d_update_depths_rect(ARegion *region, ViewDepths *d, rcti *rect)
{
@@ -2335,7 +2356,7 @@ void ED_view3d_depth_update(ARegion *region)
}
}
-/* Utility function to find the closest Z value, use for autodepth. */
+/* Utility function to find the closest Z value, use for auto-depth. */
float view3d_depth_near(ViewDepths *d)
{
/* Convert to float for comparisons. */
@@ -2374,7 +2395,11 @@ void ED_view3d_draw_depth_gpencil(Depsgraph *depsgraph, Scene *scene, ARegion *r
GPU_depth_test(GPU_DEPTH_NONE);
}
-/* *********************** customdata **************** */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Custom-data Utilities
+ * \{ */
void ED_view3d_datamask(const bContext *C,
const Scene *UNUSED(scene),
@@ -2421,6 +2446,12 @@ void ED_view3d_screen_datamask(const bContext *C,
}
}
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Region View Matrix Backup/Restore
+ * \{ */
+
/**
* Store values from #RegionView3D, set when drawing.
* This is needed when we draw with to a viewport using a different matrix
@@ -2463,6 +2494,12 @@ void ED_view3d_mats_rv3d_restore(struct RegionView3D *rv3d, struct RV3DMatrixSto
rv3d->pixsize = rv3dmat->pixsize;
}
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name FPS Drawing
+ * \{ */
+
/**
* \note The info that this uses is updated in #ED_refresh_viewport_fps,
* which currently gets called during #SCREEN_OT_animation_step.
@@ -2522,6 +2559,12 @@ void ED_scene_draw_fps(const Scene *scene, int xoffset, int *yoffset)
BLF_disable(font_id, BLF_SHADOW);
}
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Calculate Render Border
+ * \{ */
+
static bool view3d_main_region_do_render_draw(const Scene *scene)
{
RenderEngineType *type = RE_engines_find(scene->r.engine);
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index ab4e7be88fe..5c2969f47d7 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -2025,7 +2025,7 @@ static float viewzoom_scale_value(const rcti *winrct,
{
float zfac;
- if (viewzoom == USER_ZOOM_CONT) {
+ if (viewzoom == USER_ZOOM_CONTINUE) {
double time = PIL_check_seconds_timer();
float time_step = (float)(time - *r_timer_lastdraw);
float fac;
@@ -2043,7 +2043,6 @@ static float viewzoom_scale_value(const rcti *winrct,
fac = -fac;
}
- /* oldstyle zoom */
zfac = 1.0f + ((fac / 20.0f) * time_step);
*r_timer_lastdraw = time;
}
@@ -2405,7 +2404,7 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, const wmEvent *event)
return OPERATOR_FINISHED;
}
- if (U.viewzoom == USER_ZOOM_CONT) {
+ if (U.viewzoom == USER_ZOOM_CONTINUE) {
/* needs a timer to continue redrawing */
vod->timer = WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
vod->prev.time = PIL_check_seconds_timer();
@@ -2888,7 +2887,7 @@ static void view3d_from_minmax(bContext *C,
});
}
- /* smooth view does viewlock RV3D_BOXVIEW copy */
+ /* Smooth-view does view-lock #RV3D_BOXVIEW copy. */
}
/**
@@ -3021,7 +3020,6 @@ void VIEW3D_OT_view_all(wmOperatorType *ot)
* Move & Zoom the view to fit selected contents.
* \{ */
-/* like a localview without local!, was centerview() in 2.4x */
static int viewselected_exec(bContext *C, wmOperator *op)
{
ARegion *region = CTX_wm_region(C);
@@ -3282,7 +3280,7 @@ static int viewcenter_cursor_exec(bContext *C, wmOperator *op)
ED_view3d_smooth_view(
C, v3d, region, smooth_viewtx, &(const V3D_SmoothParams){.ofs = new_ofs});
- /* smooth view does viewlock RV3D_BOXVIEW copy */
+ /* Smooth view does view-lock #RV3D_BOXVIEW copy. */
}
return OPERATOR_FINISHED;
@@ -4107,8 +4105,6 @@ static int view_camera_exec(bContext *C, wmOperator *op)
ED_view3d_smooth_view_force_finish(C, v3d, region);
if ((RV3D_LOCK_FLAGS(rv3d) & RV3D_LOCK_ANY_TRANSFORM) == 0) {
- /* lastview - */
-
ViewLayer *view_layer = CTX_data_view_layer(C);
Scene *scene = CTX_data_scene(C);
@@ -4122,15 +4118,6 @@ static int view_camera_exec(bContext *C, wmOperator *op)
ED_view3d_lastview_store(rv3d);
}
-#if 0
- if (G.qual == LR_ALTKEY) {
- if (oldcamera && is_an_active_object(oldcamera)) {
- v3d->camera = oldcamera;
- }
- handle_view3d_lock();
- }
-#endif
-
/* first get the default camera for the view lock type */
if (v3d->scenelock) {
/* sets the camera view if available */
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index 6824c526888..2d499cf85c7 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -48,7 +48,7 @@
#include "ED_screen.h"
#include "ED_space_api.h"
-#include "PIL_time.h" /* smoothview */
+#include "PIL_time.h" /* Smooth-view. */
#include "UI_interface.h"
#include "UI_resources.h"
@@ -84,7 +84,7 @@ enum {
FLY_MODAL_PRECISION_DISABLE,
FLY_MODAL_FREELOOK_ENABLE,
FLY_MODAL_FREELOOK_DISABLE,
- FLY_MODAL_SPEED, /* mousepan typically */
+ FLY_MODAL_SPEED, /* mouse-pan typically. */
};
/* relative view axis locking - xlock, zlock */
@@ -537,7 +537,7 @@ static void flyEvent(FlyInfo *fly, const wmEvent *event)
fly->state = FLY_CONFIRM;
break;
- /* speed adjusting with mousepan (trackpad) */
+ /* Speed adjusting with mouse-pan (track-pad). */
case FLY_MODAL_SPEED: {
float fac = 0.02f * (event->prevy - event->y);
@@ -768,7 +768,7 @@ static int flyApply(bContext *C, FlyInfo *fly, bool is_confirm)
/* this is the direction that's added to the view offset per redraw */
float dvec[3] = {0, 0, 0};
- /* Camera Uprighting variables */
+ /* Camera Up-righting variables. */
float moffset[2]; /* mouse offset from the views center */
float tmp_quat[4]; /* used for rotating the view */
@@ -950,7 +950,7 @@ static int flyApply(bContext *C, FlyInfo *fly, bool is_confirm)
}
}
- /* only apply xcorrect when mouse isn't applying x rot */
+ /* Only apply X-axis correction when mouse isn't applying x rotation. */
if (fly->xlock == FLY_AXISLOCK_STATE_ACTIVE && moffset[1] == 0) {
float upvec[3];
copy_v3_fl3(upvec, 0.0f, 0.0f, 1.0f);
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_armature.c b/source/blender/editors/space_view3d/view3d_gizmo_armature.c
index ee512a5f726..4d8102af6ff 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_armature.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_armature.c
@@ -48,7 +48,6 @@
/* -------------------------------------------------------------------- */
/** \name Armature Spline Gizmo
- *
* \{ */
/*
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_camera.c b/source/blender/editors/space_view3d/view3d_gizmo_camera.c
index a9928fa2dc0..20d766357e8 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_camera.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_camera.c
@@ -242,7 +242,7 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmGizmoGroup *gzgroup)
WM_gizmo_target_property_def_rna_ptr(widget, gz_prop_type, &camera_ptr, prop, -1);
}
- /* This could be handled more elegently (split into two gizmo groups). */
+ /* This could be handled more elegantly (split into two gizmo groups). */
if ((v3d->gizmo_show_camera & V3D_GIZMO_SHOW_CAMERA_LENS) == 0) {
WM_gizmo_set_flag(cagzgroup->focal_len, WM_GIZMO_HIDDEN, true);
WM_gizmo_set_flag(cagzgroup->ortho_scale, WM_GIZMO_HIDDEN, true);
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c b/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c
index 242a0a802a6..98597cb2986 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c
@@ -22,7 +22,6 @@
#include "BKE_context.h"
#include "BKE_layer.h"
-#include "BKE_object.h"
#include "DNA_object_force_types.h"
#include "DNA_object_types.h"
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_navigate.c b/source/blender/editors/space_view3d/view3d_gizmo_navigate.c
index 7a201d8841c..6fa974cdb09 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_navigate.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_navigate.c
@@ -22,7 +22,6 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
-#include "BKE_object.h"
#include "DNA_object_types.h"
@@ -45,14 +44,17 @@
/** \name View3D Navigation Gizmo Group
* \{ */
-/* Offset from screen edge. */
-#define GIZMO_OFFSET_FAC 1.2f
/* Size of main icon. */
-#define GIZMO_SIZE 80
-/* Factor for size of smaller button. */
-#define GIZMO_MINI_FAC 0.35f
-/* How much mini buttons offset from the primary. */
-#define GIZMO_MINI_OFFSET_FAC 0.38f
+#define GIZMO_SIZE U.gizmo_size_navigate_v3d
+
+/* Main gizmo offset from screen edges in unscaled pixels. */
+#define GIZMO_OFFSET 10.0f
+
+/* Width of smaller buttons in unscaled pixels. */
+#define GIZMO_MINI_SIZE 28.0f
+
+/* Margin around the smaller buttons. */
+#define GIZMO_MINI_OFFSET 2.0f
enum {
GZ_INDEX_MOVE = 0,
@@ -174,7 +176,7 @@ static void WIDGETGROUP_navigate_setup(const bContext *C, wmGizmoGroup *gzgroup)
}
/* may be overwritten later */
- gz->scale_basis = (GIZMO_SIZE * GIZMO_MINI_FAC) / 2;
+ gz->scale_basis = GIZMO_MINI_SIZE / 2.0f;
if (info->icon != 0) {
PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "icon");
RNA_property_enum_set(gz->ptr, prop, info->icon);
@@ -212,7 +214,7 @@ static void WIDGETGROUP_navigate_setup(const bContext *C, wmGizmoGroup *gzgroup)
{
wmGizmo *gz = navgroup->gz_array[GZ_INDEX_ROTATE];
- gz->scale_basis = GIZMO_SIZE / 2;
+ gz->scale_basis = GIZMO_SIZE / 2.0f;
const char mapping[6] = {
RV3D_VIEW_LEFT,
RV3D_VIEW_RIGHT,
@@ -263,9 +265,8 @@ static void WIDGETGROUP_navigate_draw_prepare(const bContext *C, wmGizmoGroup *g
const bool show_navigate = (U.uiflag & USER_SHOW_GIZMO_NAVIGATE) != 0;
const bool show_rotate_gizmo = (U.mini_axis_type == USER_MINI_AXIS_TYPE_GIZMO);
- const float icon_size = GIZMO_SIZE;
- const float icon_offset = (icon_size * 0.52f) * GIZMO_OFFSET_FAC * UI_DPI_FAC;
- const float icon_offset_mini = icon_size * GIZMO_MINI_OFFSET_FAC * UI_DPI_FAC;
+ const float icon_offset = ((GIZMO_SIZE / 2.0f) + GIZMO_OFFSET) * UI_DPI_FAC;
+ const float icon_offset_mini = (GIZMO_MINI_SIZE + GIZMO_MINI_OFFSET) * UI_DPI_FAC;
const float co_rotate[2] = {
rect_visible->xmax - icon_offset,
rect_visible->ymax - icon_offset,
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c b/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c
index 8f3d40584aa..4ac16e8fbe8 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c
@@ -40,6 +40,8 @@
#include "GPU_matrix.h"
#include "GPU_state.h"
+#include "BLF_api.h"
+
#include "RNA_access.h"
#include "RNA_define.h"
@@ -53,169 +55,34 @@
#include "view3d_intern.h"
-#define USE_AXIS_FONT
-#define USE_FADE_BACKGROUND
-
-#ifdef USE_AXIS_FONT
-# include "BLF_api.h"
-#endif
-
-#define DIAL_RESOLUTION 32
-
-/* Sizes of axis spheres containing XYZ characters. */
-#define AXIS_HANDLE_SIZE_FG 0.19f
-/* When pointing away from the view. */
-#define AXIS_HANDLE_SIZE_BG 0.15f
-/* How far axis handles are away from the center. */
-#define AXIS_HANDLE_OFFSET (1.0f - AXIS_HANDLE_SIZE_FG)
-
-struct AxisDrawInfo {
- /* Matrix is needed for screen-aligned font drawing. */
-#ifdef USE_AXIS_FONT
- float matrix_final[4][4];
-#endif
-#ifdef USE_FADE_BACKGROUND
- float color_bg[3];
-#endif
-};
-
-#ifndef USE_AXIS_FONT
-/**
- * \param viewmat_local_unit: is typically the 'rv3d->viewmatob'
- * copied into a 3x3 matrix and normalized.
- */
-static void draw_xyz_wire(
- uint pos_id, const float viewmat_local_unit[3][3], const float c[3], float size, int axis)
-{
- int line_type;
- float buffer[4][3];
- int n = 0;
-
- float v1[3] = {0.0f, 0.0f, 0.0f}, v2[3] = {0.0f, 0.0f, 0.0f};
- float dim = size * 0.1f;
- float dx[3], dy[3];
-
- dx[0] = dim;
- dx[1] = 0.0f;
- dx[2] = 0.0f;
- dy[0] = 0.0f;
- dy[1] = dim;
- dy[2] = 0.0f;
-
- switch (axis) {
- case 0: /* x axis */
- line_type = GPU_PRIM_LINES;
-
- /* bottom left to top right */
- negate_v3_v3(v1, dx);
- sub_v3_v3(v1, dy);
- copy_v3_v3(v2, dx);
- add_v3_v3(v2, dy);
-
- copy_v3_v3(buffer[n++], v1);
- copy_v3_v3(buffer[n++], v2);
-
- /* top left to bottom right */
- mul_v3_fl(dy, 2.0f);
- add_v3_v3(v1, dy);
- sub_v3_v3(v2, dy);
-
- copy_v3_v3(buffer[n++], v1);
- copy_v3_v3(buffer[n++], v2);
-
- break;
- case 1: /* y axis */
- line_type = GPU_PRIM_LINES;
-
- /* bottom left to top right */
- mul_v3_fl(dx, 0.75f);
- negate_v3_v3(v1, dx);
- sub_v3_v3(v1, dy);
- copy_v3_v3(v2, dx);
- add_v3_v3(v2, dy);
-
- copy_v3_v3(buffer[n++], v1);
- copy_v3_v3(buffer[n++], v2);
-
- /* top left to center */
- mul_v3_fl(dy, 2.0f);
- add_v3_v3(v1, dy);
- zero_v3(v2);
-
- copy_v3_v3(buffer[n++], v1);
- copy_v3_v3(buffer[n++], v2);
-
- break;
- case 2: /* z axis */
- line_type = GPU_PRIM_LINE_STRIP;
-
- /* start at top left */
- negate_v3_v3(v1, dx);
- add_v3_v3(v1, dy);
-
- copy_v3_v3(buffer[n++], v1);
-
- mul_v3_fl(dx, 2.0f);
- add_v3_v3(v1, dx);
+/* Radius of the entire background. */
+#define WIDGET_RADIUS ((U.gizmo_size_navigate_v3d / 2.0f) * UI_DPI_FAC)
- copy_v3_v3(buffer[n++], v1);
+/* Sizes of axis spheres containing XYZ characters in relation to above. */
+#define AXIS_HANDLE_SIZE 0.20f
- mul_v3_fl(dy, 2.0f);
- sub_v3_v3(v1, dx);
- sub_v3_v3(v1, dy);
+#define AXIS_LINE_WIDTH ((U.gizmo_size_navigate_v3d / 40.0f) * U.pixelsize)
+#define AXIS_RING_WIDTH ((U.gizmo_size_navigate_v3d / 60.0f) * U.pixelsize)
+#define AXIS_TEXT_SIZE (WIDGET_RADIUS * AXIS_HANDLE_SIZE * 1.25f)
- copy_v3_v3(buffer[n++], v1);
+/* distance within this from center is considered positive. */
+#define AXIS_DEPTH_BIAS 0.01f
- add_v3_v3(v1, dx);
-
- copy_v3_v3(buffer[n++], v1);
-
- break;
- default:
- BLI_assert(0);
- return;
- }
-
- for (int i = 0; i < n; i++) {
- mul_transposed_m3_v3((float(*)[3])viewmat_local_unit, buffer[i]);
- add_v3_v3(buffer[i], c);
- }
-
- immBegin(line_type, n);
- for (int i = 0; i < n; i++) {
- immVertex3fv(pos_id, buffer[i]);
- }
- immEnd();
-}
-#endif /* !USE_AXIS_FONT */
-
-/**
- * \param draw_info: Extra data needed for drawing.
- */
-static void axis_geom_draw(const wmGizmo *gz,
- const float color[4],
- const bool select,
- const struct AxisDrawInfo *draw_info)
+static void gizmo_axis_draw(const bContext *C, wmGizmo *gz)
{
- float viewport[4];
- GPU_viewport_size_get_f(viewport);
-
- GPUVertFormat *format = immVertexFormat();
- const uint pos_id = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
-
struct {
float depth;
char index;
char axis;
+ char axis_opposite;
bool is_pos;
} axis_order[6] = {
- {-gz->matrix_offset[0][2], 0, 0, false},
- {+gz->matrix_offset[0][2], 1, 0, true},
- {-gz->matrix_offset[1][2], 2, 1, false},
- {+gz->matrix_offset[1][2], 3, 1, true},
- {-gz->matrix_offset[2][2], 4, 2, false},
- {+gz->matrix_offset[2][2], 5, 2, true},
+ {-gz->matrix_offset[0][2], 0, 0, 1, false},
+ {+gz->matrix_offset[0][2], 1, 0, 0, true},
+ {-gz->matrix_offset[1][2], 2, 1, 3, false},
+ {+gz->matrix_offset[1][2], 3, 1, 2, true},
+ {-gz->matrix_offset[2][2], 4, 2, 5, false},
+ {+gz->matrix_offset[2][2], 5, 2, 4, true},
};
int axis_align = -1;
@@ -226,25 +93,35 @@ static void axis_geom_draw(const wmGizmo *gz,
}
}
- /* Show backwards pointing highlight on-top (else we can't see it at all). */
- if ((select == false) && (gz->highlight_part > 0) && (axis_align != -1)) {
- if (axis_order[gz->highlight_part - 1].is_pos == false) {
- axis_order[gz->highlight_part - 1].depth = FLT_MAX;
- }
- }
-
qsort(&axis_order, ARRAY_SIZE(axis_order), sizeof(axis_order[0]), BLI_sortutil_cmp_float);
- static const float axis_highlight[4] = {1, 1, 1, 1};
- static const float axis_black[4] = {0, 0, 0, 1};
- static float axis_color[3][4];
+ /* When the cursor is over any of the gizmos (show circle backdrop). */
+ const bool is_active = ((gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0);
- const float axis_depth_bias = 0.01f;
- const float sphere_scale = 1.15f;
- /* TODO(fclem): Is there a way to get the widget radius? */
- const float widget_pix_size = 40.0f * U.dpi_fac;
+ /* Background color of the View3D, used to mix colors. */
+ float view_color[4];
+ ED_view3d_background_color_get(CTX_data_scene(C), CTX_wm_view3d(C), view_color);
+ view_color[3] = 1.0f;
+
+ float matrix_screen[4][4];
+ float matrix_unit[4][4];
+ unit_m4(matrix_unit);
+ WM_gizmo_calc_matrix_final_params(gz,
+ &((struct WM_GizmoMatrixParams){
+ .matrix_offset = matrix_unit,
+ }),
+ matrix_screen);
+ GPU_matrix_push();
+ GPU_matrix_mul(matrix_screen);
+
+ GPUVertFormat *format = immVertexFormat();
+ const uint pos_id = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+ const uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+ float viewport_size[4];
+ GPU_viewport_size_get_f(viewport_size);
+
+ static float axis_color[3][4];
-#ifdef USE_AXIS_FONT
struct {
float matrix[4][4];
float matrix_m3[3][3];
@@ -252,38 +129,29 @@ static void axis_geom_draw(const wmGizmo *gz,
int id;
} font;
- if (select == false) {
- font.id = blf_mono_font;
- BLF_disable(font.id, BLF_ROTATION | BLF_SHADOW | BLF_MATRIX | BLF_ASPECT | BLF_WORD_WRAP);
- BLF_color4fv(font.id, axis_black);
- BLF_size(font.id, 12 * U.dpi_fac, 72);
-
- /* The view matrix is used to position the text. */
- BLF_position(font.id, 0, 0, 0);
-
- /* Calculate the inverse of the (matrix_final * matrix_offset).
- * This allows us to use the final location, while reversing the rotation so fonts
- * show without any rotation. */
- float m3[3][3];
- float m3_offset[3][3];
- copy_m3_m4(m3, draw_info->matrix_final);
- copy_m3_m4(m3_offset, gz->matrix_offset);
- mul_m3_m3m3(m3, m3, m3_offset);
- copy_m3_m3(font.matrix_m3_invert, m3);
- invert_m3(m3);
- copy_m3_m3(font.matrix_m3, m3);
- copy_m4_m3(font.matrix, m3);
- }
-#endif
-
- /* When the cursor is over any of the gizmos (show circle backdrop). */
- const bool is_active = (color[3] != 0.0f);
-
- const float clip_range = gz->scale_final * sphere_scale;
- bool use_project_matrix = (clip_range >= -GPU_MATRIX_ORTHO_CLIP_NEAR_DEFAULT);
+ font.id = BLF_default();
+ BLF_disable(font.id, BLF_ROTATION | BLF_SHADOW | BLF_MATRIX | BLF_ASPECT | BLF_WORD_WRAP);
+ BLF_enable(font.id, BLF_BOLD);
+ BLF_size(font.id, AXIS_TEXT_SIZE, 72);
+ BLF_position(font.id, 0, 0, 0);
+
+ /* Calculate the inverse of the (matrix_final * matrix_offset).
+ * This allows us to use the final location, while reversing the rotation so fonts
+ * show without any rotation. */
+ float m3[3][3];
+ float m3_offset[3][3];
+ copy_m3_m4(m3, matrix_screen);
+ copy_m3_m4(m3_offset, gz->matrix_offset);
+ mul_m3_m3m3(m3, m3, m3_offset);
+ copy_m3_m3(font.matrix_m3_invert, m3);
+ invert_m3(m3);
+ copy_m3_m3(font.matrix_m3, m3);
+ copy_m4_m3(font.matrix, m3);
+
+ bool use_project_matrix = (gz->scale_final >= -GPU_MATRIX_ORTHO_CLIP_NEAR_DEFAULT);
if (use_project_matrix) {
GPU_matrix_push_projection();
- GPU_matrix_ortho_set_z(-clip_range, clip_range);
+ GPU_matrix_ortho_set_z(-gz->scale_final, gz->scale_final);
}
UI_draw_roundbox_corner_set(UI_CNR_ALL);
@@ -291,263 +159,161 @@ static void axis_geom_draw(const wmGizmo *gz,
/* Circle defining active area. */
if (is_active) {
- immUnbindProgram();
-
- float rad = widget_pix_size;
+ const float rad = WIDGET_RADIUS;
GPU_matrix_push();
GPU_matrix_scale_1f(1.0f / rad);
-
- UI_draw_roundbox_4fv(true, -rad, -rad, rad, rad, rad, color);
-
+ UI_draw_roundbox_4fv(
+ &(const rctf){
+ .xmin = -rad,
+ .xmax = rad,
+ .ymin = -rad,
+ .ymax = rad,
+ },
+ true,
+ rad,
+ gz->color_hi);
GPU_matrix_pop();
-
- immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
}
- GPU_matrix_push();
GPU_matrix_mul(gz->matrix_offset);
for (int axis_index = 0; axis_index < ARRAY_SIZE(axis_order); axis_index++) {
const int index = axis_order[axis_index].index;
const int axis = axis_order[axis_index].axis;
const bool is_pos = axis_order[axis_index].is_pos;
- const bool is_highlight = index + 1 == gz->highlight_part;
+ const float depth = axis_order[axis_index].depth;
+ const bool is_behind = (depth <= (AXIS_DEPTH_BIAS * (is_pos ? -1 : 1)));
+ bool is_aligned_front = (axis_align != -1 && axis_align == axis && !is_behind);
+ bool is_aligned_back = (axis_align != -1 && axis_align == axis && is_behind);
+
+ const float v[3] = {0, 0, (1.0f - AXIS_HANDLE_SIZE) * (is_pos ? 1 : -1)};
+ const float v_final[3] = {v[(axis + 2) % 3], v[(axis + 1) % 3], v[axis]};
+
+ bool is_highlight = index + 1 == gz->highlight_part;
+ /* Check if highlight part is the other side when axis aligned. */
+ if (is_aligned_front && (axis_order[axis_index].axis_opposite + 1 == gz->highlight_part)) {
+ is_highlight = true;
+ }
UI_GetThemeColor3fv(TH_AXIS_X + axis, axis_color[axis]);
axis_color[axis][3] = 1.0f;
- const int index_z = axis;
- const int index_y = (axis + 1) % 3;
- const int index_x = (axis + 2) % 3;
-
- bool ok = true;
-
- /* Skip view align axis when selecting (allows to switch to opposite side). */
- if (select && ((axis_align == axis) && (gz->matrix_offset[axis][2] > 0.0f) == is_pos)) {
- ok = false;
+ /* Color that is full at front, but 50% view background when in back. */
+ float fading_color[4];
+ interp_v4_v4v4(fading_color, view_color, axis_color[axis], ((depth + 1) * 0.25) + 0.5);
+
+ /* Color that is midway between front and back. */
+ float middle_color[4];
+ interp_v4_v4v4(middle_color, view_color, axis_color[axis], 0.75f);
+
+ GPU_blend(GPU_BLEND_ALPHA);
+
+ /* Axis Line. */
+ if (is_pos || axis_align != -1) {
+
+ /* Extend slightly to meet better at the center. */
+ float v_start[3] = {0.0f, 0.0f, 0.0f};
+ mul_v3_v3fl(v_start, v_final, -(AXIS_LINE_WIDTH / WIDGET_RADIUS * 0.66f));
+
+ /* Decrease length of line by ball radius. */
+ float v_end[3] = {0.0f, 0.0f, 0.0f};
+ mul_v3_v3fl(v_end, v_final, 1.0f - AXIS_HANDLE_SIZE);
+
+ immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_SMOOTH_COLOR);
+ immUniform2fv("viewportSize", &viewport_size[2]);
+ immUniform1f("lineWidth", AXIS_LINE_WIDTH);
+ immBegin(GPU_PRIM_LINES, 2);
+ immAttr4fv(color_id, middle_color);
+ immVertex3fv(pos_id, v_start);
+ immAttr4fv(color_id, fading_color);
+ immVertex3fv(pos_id, v_end);
+ immEnd();
+ immUnbindProgram();
}
- if (ok) {
- /* Check aligned, since the front axis won't display in this case,
- * and we want to make sure all 3 axes have a character at all times. */
- const bool show_axis_char = (is_pos || (axis == axis_align));
- const float v[3] = {0, 0, AXIS_HANDLE_OFFSET * (is_pos ? 1 : -1)};
- const float v_final[3] = {v[index_x], v[index_y], v[index_z]};
- const float *color_current = is_highlight ? axis_highlight : axis_color[axis];
- float color_current_fade[4];
-
- /* Flip the faded state when axis aligned, since we're hiding the front-mode axis
- * otherwise we see the color for the back-most axis, which is useful for
- * click-to-rotate 180d but not useful to visualize.
- *
- * Use depth bias so axis-aligned views show the positive axis as being in-front.
- * This is a detail so primary axes show as dominant.
- */
- const bool is_pos_color = (axis_order[axis_index].depth >
- (axis_depth_bias * (is_pos ? -1 : 1)));
-
- if (select == false) {
-#ifdef USE_FADE_BACKGROUND
- interp_v3_v3v3(
- color_current_fade, draw_info->color_bg, color_current, is_highlight ? 1.0 : 0.5f);
- color_current_fade[3] = color_current[3];
-#else
- copy_v4_v4(color_current_fade, color_current);
- color_current_fade[3] *= 0.2;
-#endif
- }
- else {
- copy_v4_fl(color_current_fade, 1.0f);
- }
-
- /* Axis Line. */
- if (is_pos) {
- float v_start[3];
- immUnbindProgram();
-
- GPU_blend(GPU_BLEND_ALPHA);
-
- immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_UNIFORM_COLOR);
- immUniform2fv("viewportSize", &viewport[2]);
- immUniform1f("lineWidth", 2.0f * U.pixelsize);
- immUniformColor4fv(is_pos_color ? color_current : color_current_fade);
- immBegin(GPU_PRIM_LINES, 2);
- if (axis_align == -1) {
- zero_v3(v_start);
+ /* Axis Ball. */
+ if (!is_aligned_back) {
+ float *inner_color = fading_color;
+ float *outline_color = fading_color;
+ float negative_color[4];
+ if (!is_pos) {
+ if (is_aligned_front) {
+ interp_v4_v4v4(
+ negative_color, (float[4]){1.0f, 1.0f, 1.0f, 1.0f}, axis_color[axis], 0.5f);
+ negative_color[3] = MIN2(depth + 1, 1.0f);
+ outline_color = negative_color;
}
else {
- /* When axis aligned we don't draw the front most axis
- * (allowing us to switch to the opposite side).
- * In this case don't draw lines over axis pointing away from us
- * because it obscures character and looks noisy.
- */
- mul_v3_v3fl(v_start, v_final, 0.3f);
+ interp_v4_v4v4(negative_color, view_color, axis_color[axis], 0.25f);
+ negative_color[3] = MIN2(depth + 1, 1.0f);
+ inner_color = negative_color;
}
- immVertex3fv(pos_id, v_start);
- immVertex3fv(pos_id, v_final);
- immEnd();
-
- immUnbindProgram();
-
- immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
}
- /* Axis Ball. */
-#ifdef USE_AXIS_FONT
- if (select == false) {
- immUnbindProgram();
-
- GPU_matrix_push();
- GPU_matrix_translate_3fv(v_final);
- GPU_matrix_mul(font.matrix);
-
- float rad = widget_pix_size * (is_pos ? AXIS_HANDLE_SIZE_FG : AXIS_HANDLE_SIZE_BG);
-
- /* Black outlines for negative axis balls, otherwise they can be hard to see since
- * they use a faded color which can be similar to the circle backdrop in tone. */
- if (is_active && !is_highlight && !is_pos && !select && !(axis_align == axis)) {
- static const float axis_black_faded[4] = {0.0f, 0.0f, 0.0f, 0.2f};
- float outline = rad * sphere_scale;
- UI_draw_roundbox_4fv(
- true, -outline, -outline, outline, outline, outline, axis_black_faded);
- }
-
- const float *col = is_pos_color ? color_current : color_current_fade;
- UI_draw_roundbox_4fv(true, -rad, -rad, rad, rad, rad, col);
-
- GPU_matrix_pop();
-
- immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
- }
- else
-#endif
- {
- GPU_matrix_push();
- GPU_matrix_translate_3fv(v_final);
- GPU_matrix_scale_1f(is_pos ? AXIS_HANDLE_SIZE_FG : AXIS_HANDLE_SIZE_BG);
-
- GPUBatch *sphere = GPU_batch_preset_sphere(0);
- GPU_batch_program_set_builtin(sphere, GPU_SHADER_3D_UNIFORM_COLOR);
-
- /* Black outlines for negative axis balls, otherwise they can be hard to see since
- * they use a faded color which can be similar to the circle backdrop in tone. */
- if (is_active && !is_highlight && !is_pos && !select && !(axis_align == axis)) {
- static const float axis_black_faded[4] = {0, 0, 0, 0.2f};
- GPU_matrix_scale_1f(sphere_scale);
- GPU_batch_uniform_4fv(sphere, "color", axis_black_faded);
- GPU_batch_draw(sphere);
- GPU_matrix_scale_1f(1.0 / sphere_scale);
- }
+ GPU_matrix_push();
+ GPU_matrix_translate_3fv(v_final);
+ GPU_matrix_mul(font.matrix);
+ /* Size change from back to front: 0.92f - 1.08f. */
+ float scale = ((depth + 1) * 0.08f) + 0.92f;
+ const float rad = WIDGET_RADIUS * AXIS_HANDLE_SIZE * scale;
+ UI_draw_roundbox_4fv_ex(
+ &(const rctf){
+ .xmin = -rad,
+ .xmax = rad,
+ .ymin = -rad,
+ .ymax = rad,
+ },
+ inner_color,
+ NULL,
+ 0.0f,
+ outline_color,
+ AXIS_RING_WIDTH,
+ rad);
+ GPU_matrix_pop();
+ }
- GPU_batch_program_set_builtin(sphere, GPU_SHADER_3D_UNIFORM_COLOR);
- GPU_batch_uniform_4fv(sphere, "color", is_pos_color ? color_current : color_current_fade);
- GPU_batch_draw(sphere);
- GPU_matrix_pop();
+ /* Axis XYZ Character. */
+ if ((is_pos || is_highlight || (axis == axis_align)) && !is_aligned_back) {
+ float axis_str_width, axis_string_height;
+ char axis_str[3] = {'X' + axis, 0, 0};
+ if (!is_pos) {
+ axis_str[0] = '-';
+ axis_str[1] = 'X' + axis;
}
-
- /* Axis XYZ Character. */
- if (show_axis_char && (select == false)) {
-#ifdef USE_AXIS_FONT
- float axis_str_size[2] = {0};
- const char axis_str[2] = {'X' + axis, 0};
- BLF_width_and_height(font.id, axis_str, 2, &axis_str_size[0], &axis_str_size[1]);
-
- /* Calculate pixel aligned location, without this text draws fuzzy. */
- float v_final_px[3];
- mul_v3_m3v3(v_final_px, font.matrix_m3_invert, v_final);
- /* Center the test and pixel align, it's important to round once
- * otherwise the characters are noticeably not-centered.
- * If this wasn't an issue we could use #BLF_position to place the text. */
- v_final_px[0] = roundf(v_final_px[0] - (axis_str_size[0] / 2.0f));
- v_final_px[1] = roundf(v_final_px[1] - (axis_str_size[1] / 2.0f));
- mul_m3_v3(font.matrix_m3, v_final_px);
-
- immUnbindProgram();
-
- GPU_matrix_push();
- GPU_matrix_translate_3fv(v_final_px);
- GPU_matrix_mul(font.matrix);
-
- BLF_draw_ascii(font.id, axis_str, 2);
- GPU_blend(GPU_BLEND_ALPHA); /* XXX, blf disables */
- GPU_matrix_pop();
-
- immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
-#else
- immUnbindProgram();
- immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
- GPU_line_width(1.0f);
- float m3[3][3];
- copy_m3_m4(m3, gz->matrix_offset);
- immUniformColor4fv(axis_black);
- draw_xyz_wire(pos_id, m3, v_final, 1.0, axis);
- immUnbindProgram();
-#endif
+ BLF_width_and_height(font.id, axis_str, 3, &axis_str_width, &axis_string_height);
+
+ /* Calculate pixel-aligned location, without this text draws fuzzy. */
+ float v_final_px[3];
+ mul_v3_m3v3(v_final_px, font.matrix_m3_invert, v_final);
+ /* Center the text and pixel align, it's important to round once
+ * otherwise the characters are noticeably not-centered.
+ * If this wasn't an issue we could use #BLF_position to place the text. */
+ v_final_px[0] = roundf(v_final_px[0] - (axis_str_width * (is_pos ? 0.5f : 0.55f)));
+ v_final_px[1] = roundf(v_final_px[1] - (axis_string_height / 2.0f));
+ mul_m3_v3(font.matrix_m3, v_final_px);
+ GPU_matrix_push();
+ GPU_matrix_translate_3fv(v_final_px);
+ GPU_matrix_mul(font.matrix);
+ float text_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+ if (!is_highlight) {
+ zero_v4(text_color);
+ text_color[3] = is_active ? 1.0f : 0.9f;
}
+ BLF_color4fv(font.id, text_color);
+ BLF_draw_ascii(font.id, axis_str, 2);
+ GPU_matrix_pop();
}
}
- GPU_matrix_pop();
- immUnbindProgram();
-
if (use_project_matrix) {
GPU_matrix_pop_projection();
}
-}
-
-static void axis3d_draw_intern(const bContext *C,
- wmGizmo *gz,
- const bool select,
- const bool highlight)
-{
- const float *color = highlight ? gz->color_hi : gz->color;
- float matrix_final[4][4];
- float matrix_unit[4][4];
-
- unit_m4(matrix_unit);
-
- WM_gizmo_calc_matrix_final_params(gz,
- &((struct WM_GizmoMatrixParams){
- .matrix_offset = matrix_unit,
- }),
- matrix_final);
-
- GPU_matrix_push();
- GPU_matrix_mul(matrix_final);
-
- struct AxisDrawInfo draw_info;
-#ifdef USE_AXIS_FONT
- if (select == false) {
- copy_m4_m4(draw_info.matrix_final, matrix_final);
- }
-#endif
-#ifdef USE_FADE_BACKGROUND
- if (select == false) {
- ED_view3d_background_color_get(CTX_data_scene(C), CTX_wm_view3d(C), draw_info.color_bg);
- }
-#else
- UNUSED_VARS(C);
-#endif
-
- GPU_blend(GPU_BLEND_ALPHA);
- axis_geom_draw(gz, color, select, &draw_info);
GPU_blend(GPU_BLEND_NONE);
+ BLF_disable(font.id, BLF_BOLD);
GPU_matrix_pop();
}
-static void gizmo_axis_draw(const bContext *C, wmGizmo *gz)
-{
- const bool is_modal = gz->state & WM_GIZMO_STATE_MODAL;
- const bool is_highlight = (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0;
-
- (void)is_modal;
-
- GPU_blend(GPU_BLEND_ALPHA);
- axis3d_draw_intern(C, gz, false, is_highlight);
- GPU_blend(GPU_BLEND_NONE);
-}
-
static int gizmo_axis_test_select(bContext *UNUSED(C), wmGizmo *gz, const int mval[2])
{
float point_local[2] = {UNPACK2(mval)};
@@ -601,12 +367,19 @@ static int gizmo_axis_test_select(bContext *UNUSED(C), wmGizmo *gz, const int mv
return -1;
}
-static int gizmo_axis_cursor_get(wmGizmo *gz)
+static int gizmo_axis_cursor_get(wmGizmo *UNUSED(gz))
{
- if (gz->highlight_part > 0) {
- return WM_CURSOR_EDIT;
- }
- return WM_CURSOR_NSEW_SCROLL;
+ return WM_CURSOR_DEFAULT;
+}
+
+static void gizmo_axis_screen_bounds_get(bContext *C, wmGizmo *gz, rcti *r_bounding_box)
+{
+ ScrArea *area = CTX_wm_area(C);
+ const float rad = WIDGET_RADIUS;
+ r_bounding_box->xmin = gz->matrix_basis[3][0] + area->totrct.xmin - rad;
+ r_bounding_box->ymin = gz->matrix_basis[3][1] + area->totrct.ymin - rad;
+ r_bounding_box->xmax = r_bounding_box->xmin + rad;
+ r_bounding_box->ymax = r_bounding_box->ymin + rad;
}
void VIEW3D_GT_navigate_rotate(wmGizmoType *gzt)
@@ -618,6 +391,7 @@ void VIEW3D_GT_navigate_rotate(wmGizmoType *gzt)
gzt->draw = gizmo_axis_draw;
gzt->test_select = gizmo_axis_test_select;
gzt->cursor_get = gizmo_axis_cursor_get;
+ gzt->screen_bounds_get = gizmo_axis_screen_bounds_get;
gzt->struct_size = sizeof(wmGizmo);
}
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c
index 3f07653fb2f..441182d7a5f 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c
@@ -30,14 +30,12 @@
#include "UI_resources.h"
#include "WM_api.h"
-#include "WM_toolsystem.h"
#include "WM_types.h"
#include "view3d_intern.h" /* own include */
/* -------------------------------------------------------------------- */
/** \name Mesh Pre-Select Element Gizmo
- *
* \{ */
struct GizmoGroupPreSelElem {
@@ -73,7 +71,6 @@ void VIEW3D_GGT_mesh_preselect_elem(wmGizmoGroupType *gzgt)
/* -------------------------------------------------------------------- */
/** \name Mesh Pre-Select Edge Ring Gizmo
- *
* \{ */
struct GizmoGroupPreSelEdgeRing {
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
index 9f35abf7fef..298a2a7a824 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
@@ -52,7 +52,6 @@
/* -------------------------------------------------------------------- */
/** \name Mesh Element (Vert/Edge/Face) Pre-Select Gizmo API
- *
* \{ */
typedef struct MeshElemGizmo3D {
@@ -282,7 +281,6 @@ static void GIZMO_GT_mesh_preselect_elem_3d(wmGizmoType *gzt)
/* -------------------------------------------------------------------- */
/** \name Mesh Edge-Ring Pre-Select Gizmo API
- *
* \{ */
typedef struct MeshEdgeRingGizmo3D {
@@ -439,7 +437,6 @@ static void GIZMO_GT_mesh_preselect_edgering_3d(wmGizmoType *gzt)
/* -------------------------------------------------------------------- */
/** \name Gizmo API
- *
* \{ */
void ED_gizmotypes_preselect_3d(void)
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index f2e42cd1725..607ca110d0f 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -40,14 +40,11 @@
#include "DEG_depsgraph.h"
#include "RNA_access.h"
-#include "RNA_define.h"
-#include "RNA_enum_types.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_mesh.h"
-#include "ED_screen.h"
#include "ED_undo.h"
#include "UI_interface.h"
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index 0770bac1313..344168e895b 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -24,7 +24,6 @@
#include <math.h>
#include <stdlib.h>
-#include "DNA_collection_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -36,7 +35,6 @@
#include "BKE_appdir.h"
#include "BKE_blender_copybuffer.h"
-#include "BKE_collection.h"
#include "BKE_context.h"
#include "BKE_main.h"
#include "BKE_report.h"
@@ -49,7 +47,6 @@
#include "ED_outliner.h"
#include "ED_screen.h"
-#include "ED_select_utils.h"
#include "ED_transform.h"
#include "view3d_intern.h"
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 35ec4de5077..0605ea30806 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -596,7 +596,7 @@ static bool do_lasso_select_objects(ViewContext *vc,
}
for (base = vc->view_layer->object_bases.first; base; base = base->next) {
- if (BASE_SELECTABLE(v3d, base)) { /* use this to avoid un-needed lasso lookups */
+ if (BASE_SELECTABLE(v3d, base)) { /* Use this to avoid unnecessary lasso look-ups. */
const bool is_select = base->flag & BASE_SELECTED;
const bool is_inside = ((ED_view3d_project_base(vc->region, base) == V3D_PROJ_RET_OK) &&
BLI_lasso_is_point_inside(
@@ -1447,7 +1447,7 @@ static const EnumPropertyItem *object_select_menu_enum_itemf(bContext *C,
int totitem = 0;
int i = 0;
- /* don't need context but avoid docgen using this */
+ /* Don't need context but avoid API doc-generation using this. */
if (C == NULL || object_mouse_select_menu_data[i].idname[0] == '\0') {
return DummyRNA_NULL_items;
}
@@ -2494,8 +2494,7 @@ static int view3d_select_exec(bContext *C, wmOperator *op)
}
/* Pass-through allows tweaks
- * FINISHED to signal one operator worked
- * */
+ * FINISHED to signal one operator worked */
if (retval) {
WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
return OPERATOR_PASS_THROUGH | OPERATOR_FINISHED;
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 148a0986c5c..cce9287679c 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -27,7 +27,6 @@
#include "DNA_object_types.h"
#include "BLI_array.h"
-#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
diff --git a/source/blender/editors/space_view3d/view3d_utils.c b/source/blender/editors/space_view3d/view3d_utils.c
index 2b7b8255068..3ef428cfbaf 100644
--- a/source/blender/editors/space_view3d/view3d_utils.c
+++ b/source/blender/editors/space_view3d/view3d_utils.c
@@ -67,7 +67,6 @@
/* -------------------------------------------------------------------- */
/** \name View Data Access Utilities
- *
* \{ */
void ED_view3d_background_color_get(const Scene *scene, const View3D *v3d, float r_color[3])
@@ -189,7 +188,6 @@ bool ED_view3d_viewplane_get(Depsgraph *depsgraph,
/* -------------------------------------------------------------------- */
/** \name View State/Context Utilities
- *
* \{ */
/**
@@ -224,13 +222,11 @@ void view3d_region_operator_needs_opengl(wmWindow *UNUSED(win), ARegion *region)
*/
void ED_view3d_polygon_offset(const RegionView3D *rv3d, const float dist)
{
- float viewdist;
-
if (rv3d->rflag & RV3D_ZOFFSET_DISABLED) {
return;
}
- viewdist = rv3d->dist;
+ float viewdist = rv3d->dist;
/* special exception for ortho camera (viewdist isnt used for perspective cameras) */
if (dist != 0.0f) {
@@ -248,7 +244,6 @@ bool ED_view3d_context_activate(bContext *C)
{
bScreen *screen = CTX_wm_screen(C);
ScrArea *area = CTX_wm_area(C);
- ARegion *region;
/* area can be NULL when called from python */
if (area == NULL || area->spacetype != SPACE_VIEW3D) {
@@ -259,7 +254,7 @@ bool ED_view3d_context_activate(bContext *C)
return false;
}
- region = BKE_area_find_region_active_win(area);
+ ARegion *region = BKE_area_find_region_active_win(area);
if (region == NULL) {
return false;
}
@@ -275,16 +270,13 @@ bool ED_view3d_context_activate(bContext *C)
/* -------------------------------------------------------------------- */
/** \name View Clipping Utilities
- *
* \{ */
void ED_view3d_clipping_calc_from_boundbox(float clip[4][4],
const BoundBox *bb,
const bool is_flip)
{
- int val;
-
- for (val = 0; val < 4; val++) {
+ for (int val = 0; val < 4; val++) {
normal_tri_v3(clip[val], bb->vec[val], bb->vec[val == 3 ? 0 : val + 1], bb->vec[val + 4]);
if (UNLIKELY(is_flip)) {
negate_v3(clip[val]);
@@ -402,7 +394,6 @@ bool ED_view3d_clipping_clamp_minmax(const RegionView3D *rv3d, float min[3], flo
/* -------------------------------------------------------------------- */
/** \name View Bound-Box Utilities
- *
* \{ */
static bool view3d_boundbox_clip_m4(const BoundBox *bb, const float persmatob[4][4])
@@ -752,14 +743,12 @@ bool ED_view3d_camera_lock_autokey(View3D *v3d,
static void view3d_boxview_clip(ScrArea *area)
{
- ARegion *region;
BoundBox *bb = MEM_callocN(sizeof(BoundBox), "clipbb");
float clip[6][4];
float x1 = 0.0f, y1 = 0.0f, z1 = 0.0f, ofs[3] = {0.0f, 0.0f, 0.0f};
- int val;
/* create bounding box */
- for (region = area->regionbase.first; region; region = region->next) {
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
if (region->regiontype == RGN_TYPE_WINDOW) {
RegionView3D *rv3d = region->regiondata;
@@ -794,7 +783,7 @@ static void view3d_boxview_clip(ScrArea *area)
}
}
- for (val = 0; val < 8; val++) {
+ for (int val = 0; val < 8; val++) {
if (ELEM(val, 0, 3, 4, 7)) {
bb->vec[val][0] = -x1 - ofs[0];
}
@@ -826,12 +815,12 @@ static void view3d_boxview_clip(ScrArea *area)
normal_tri_v3(clip[5], bb->vec[0], bb->vec[2], bb->vec[1]);
/* then plane equations */
- for (val = 0; val < 6; val++) {
+ for (int val = 0; val < 6; val++) {
clip[val][3] = -dot_v3v3(clip[val], bb->vec[val % 5]);
}
/* create bounding box */
- for (region = area->regionbase.first; region; region = region->next) {
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
if (region->regiontype == RGN_TYPE_WINDOW) {
RegionView3D *rv3d = region->regiondata;
@@ -950,11 +939,10 @@ void ED_view3d_quadview_update(ScrArea *area, ARegion *region, bool do_clip)
{
ARegion *region_sync = NULL;
RegionView3D *rv3d = region->regiondata;
- short viewlock;
/* this function copies flags from the first of the 3 other quadview
* regions to the 2 other, so it assumes this is the region whose
* properties are always being edited, weak */
- viewlock = rv3d->viewlock;
+ short viewlock = rv3d->viewlock;
if ((viewlock & RV3D_LOCK_ROTATION) == 0) {
do_clip = (viewlock & RV3D_BOXCLIP) != 0;
@@ -1015,10 +1003,7 @@ void ED_view3d_quadview_update(ScrArea *area, ARegion *region, bool do_clip)
static float view_autodist_depth_margin(ARegion *region, const int mval[2], int margin)
{
- ViewDepths depth_temp = {0};
rcti rect;
- float depth_close;
-
if (margin == 0) {
/* Get Z Depths, needed for perspective, nice for ortho */
rect.xmin = mval[0];
@@ -1030,8 +1015,9 @@ static float view_autodist_depth_margin(ARegion *region, const int mval[2], int
BLI_rcti_init_pt_radius(&rect, mval, margin);
}
+ ViewDepths depth_temp = {0};
view3d_update_depths_rect(region, &depth_temp, &rect);
- depth_close = view3d_depth_near(&depth_temp);
+ float depth_close = view3d_depth_near(&depth_temp);
MEM_SAFE_FREE(depth_temp.depths);
return depth_close;
}
@@ -1053,14 +1039,13 @@ bool ED_view3d_autodist(Depsgraph *depsgraph,
{
float depth_close;
int margin_arr[] = {0, 2, 4};
- int i;
bool depth_ok = false;
/* Get Z Depths, needed for perspective, nice for ortho */
ED_view3d_draw_depth(depsgraph, region, v3d, alphaoverride);
/* Attempt with low margin's first */
- i = 0;
+ int i = 0;
do {
depth_close = view_autodist_depth_margin(region, mval, margin_arr[i++] * U.pixelsize);
depth_ok = (depth_close != FLT_MAX);
@@ -1104,9 +1089,8 @@ bool ED_view3d_autodist_simple(ARegion *region,
int margin,
const float *force_depth)
{
- float depth;
-
/* Get Z Depths, needed for perspective, nice for ortho */
+ float depth;
if (force_depth) {
depth = *force_depth;
}
@@ -1237,7 +1221,6 @@ float ED_view3d_radius_to_dist(const View3D *v3d,
}
else {
float lens, sensor_size, zoom;
- float angle;
if (persp == RV3D_CAMOB) {
CameraParams params;
@@ -1259,7 +1242,7 @@ float ED_view3d_radius_to_dist(const View3D *v3d,
zoom = CAMERA_PARAM_ZOOM_INIT_PERSP;
}
- angle = focallength_to_fov(lens, sensor_size);
+ float angle = focallength_to_fov(lens, sensor_size);
/* zoom influences lens, correct this by scaling the angle as a distance
* (by the zoom-level) */
@@ -1319,14 +1302,13 @@ float ED_view3d_offset_distance(const float mat[4][4],
{
float pos[4] = {0.0f, 0.0f, 0.0f, 1.0f};
float dir[4] = {0.0f, 0.0f, 1.0f, 0.0f};
- float dist;
mul_m4_v4(mat, pos);
add_v3_v3(pos, ofs);
mul_m4_v4(mat, dir);
normalize_v3(dir);
- dist = dot_v3v3(pos, dir);
+ float dist = dot_v3v3(pos, dir);
if ((dist < FLT_EPSILON) && (fallback_dist != 0.0f)) {
dist = fallback_dist;
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 9d947384bf0..21cb8560e9b 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -142,7 +142,7 @@ void ED_view3d_smooth_view_ex(
/* initialize sms */
view3d_smooth_view_state_backup(&sms.dst, v3d, rv3d);
view3d_smooth_view_state_backup(&sms.src, v3d, rv3d);
- /* if smoothview runs multiple times... */
+ /* If smooth-view runs multiple times. */
if (rv3d->sms == NULL) {
view3d_smooth_view_state_backup(&sms.org, v3d, rv3d);
}
@@ -277,8 +277,7 @@ void ED_view3d_smooth_view_ex(
if (rv3d->smooth_timer) {
WM_event_remove_timer(wm, win, rv3d->smooth_timer);
}
- /* TIMER1 is hardcoded in keymap */
- /* max 30 frs/sec */
+ /* #TIMER1 is hard-coded in key-map. */
rv3d->smooth_timer = WM_event_add_timer(wm, win, TIMER1, 1.0 / 100.0);
ok = true;
@@ -396,7 +395,7 @@ static void view3d_smoothview_apply(bContext *C, View3D *v3d, ARegion *region, b
/* note: this doesn't work right because the v3d->lens is now used in ortho mode r51636,
* when switching camera in quad-view the other ortho views would zoom & reset.
*
- * For now only redraw all regions when smoothview finishes.
+ * For now only redraw all regions when smooth-view finishes.
*/
if (step >= 1.0f) {
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d);
@@ -423,7 +422,7 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), const w
}
/**
- * Apply the smoothview immediately, use when we need to start a new view operation.
+ * Apply the smooth-view immediately, use when we need to start a new view operation.
* (so we don't end up half-applying a view operation when pressing keys quickly).
*/
void ED_view3d_smooth_view_force_finish(bContext *C, View3D *v3d, ARegion *region)
@@ -1210,8 +1209,8 @@ static uint free_localview_bit(Main *bmain)
ushort local_view_bits = 0;
- /* sometimes we lose a localview: when an area is closed */
- /* check all areas: which localviews are in use? */
+ /* Sometimes we lose a local-view: when an area is closed.
+ * Check all areas: which local-views are in use? */
for (screen = bmain->screens.first; screen; screen = screen->id.next) {
for (area = screen->areabase.first; area; area = area->next) {
SpaceLink *sl = area->spacedata.first;
diff --git a/source/blender/editors/space_view3d/view3d_walk.c b/source/blender/editors/space_view3d/view3d_walk.c
index 5b42f221c80..cbd65e3175d 100644
--- a/source/blender/editors/space_view3d/view3d_walk.c
+++ b/source/blender/editors/space_view3d/view3d_walk.c
@@ -48,7 +48,7 @@
#include "ED_space_api.h"
#include "ED_transform_snap_object_context.h"
-#include "PIL_time.h" /* smoothview */
+#include "PIL_time.h" /* Smooth-view. */
#include "UI_interface.h"
#include "UI_resources.h"
@@ -872,7 +872,7 @@ static void walkEvent(bContext *C, WalkInfo *walk, const wmEvent *event)
/* delta time */
t = (float)(PIL_check_seconds_timer() - walk->teleport.initial_time);
- /* reduce the veolocity, if JUMP wasn't hold for long enough */
+ /* Reduce the velocity, if JUMP wasn't hold for long enough. */
t = min_ff(t, JUMP_TIME_MAX);
walk->speed_jump = JUMP_SPEED_MIN +
t * (JUMP_SPEED_MAX - JUMP_SPEED_MIN) / JUMP_TIME_MAX;
diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index faed8abb202..b0bc5c6abda 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -55,6 +55,7 @@ set(SRC
transform_convert_nla.c
transform_convert_node.c
transform_convert_object.c
+ transform_convert_object_texspace.c
transform_convert_paintcurve.c
transform_convert_particle.c
transform_convert_sculpt.c
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 2a7c247ff2b..2fbcbe22349 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -135,7 +135,7 @@ void setTransformViewAspect(TransInfo *t, float r_aspect[3])
}
}
else if (t->spacetype == SPACE_GRAPH) {
- /* depemds on context of usage */
+ /* Depends on context of usage. */
}
}
@@ -440,7 +440,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t)
}
else {
/* Do we need more refined tags? */
- if (t->flag & T_POSE) {
+ if (t->options & CTX_POSE_BONE) {
WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL);
}
else {
@@ -471,7 +471,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t)
}
else if (t->spacetype == SPACE_SEQ) {
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, NULL);
- /* Keyframes on strips has been moved, so make sure related editos are informed. */
+ /* Key-frames on strips has been moved, so make sure related editors are informed. */
WM_event_add_notifier(C, NC_ANIMATION, NULL);
}
else if (t->spacetype == SPACE_IMAGE) {
@@ -484,7 +484,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t)
wmWindow *window = CTX_wm_window(C);
WM_paint_cursor_tag_redraw(window, t->region);
}
- else if (t->flag & T_CURSOR) {
+ else if (t->options & CTX_CURSOR) {
ED_area_tag_redraw(t->area);
}
else {
@@ -695,6 +695,7 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf)
{TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""},
{TFM_MODAL_AUTOCONSTRAINT, "AUTOCONSTRAIN", 0, "Automatic Constraint", ""},
{TFM_MODAL_AUTOCONSTRAINTPLANE, "AUTOCONSTRAINPLANE", 0, "Automatic Constraint Plane", ""},
+ {TFM_MODAL_PRECISION, "PRECISION", 0, "Precision Mode", ""},
{0, NULL, 0, NULL, NULL},
};
@@ -806,8 +807,6 @@ int transformEvent(TransInfo *t, const wmEvent *event)
const int modifiers_prev = t->modifiers;
const int mode_prev = t->mode;
- t->redraw |= handleMouseInput(t, &t->mouse, event);
-
/* Handle modal numinput events first, if already activated. */
if (((event->val == KM_PRESS) || (event->type == EVT_MODAL_MAP)) && hasNumInput(&t->num) &&
handleNumInput(t->context, &(t->num), event)) {
@@ -895,7 +894,7 @@ int transformEvent(TransInfo *t, const wmEvent *event)
break;
case TFM_MODAL_ROTATE:
/* only switch when... */
- if (!(t->options & CTX_TEXTURE) && !(t->options & (CTX_MOVIECLIP | CTX_MASK))) {
+ if (!(t->options & CTX_TEXTURE_SPACE) && !(t->options & (CTX_MOVIECLIP | CTX_MASK))) {
if (transform_mode_is_changeable(t->mode)) {
restoreTransObjects(t);
resetTransModal(t);
@@ -1069,7 +1068,7 @@ int transformEvent(TransInfo *t, const wmEvent *event)
t->modifiers &= ~(MOD_CONSTRAINT_SELECT | MOD_CONSTRAINT_PLANE);
}
else {
- if (t->flag & T_CAMERA) {
+ if (t->options & CTX_CAMERA) {
/* Exception for switching to dolly, or trackball, in camera view. */
if (t->mode == TFM_TRANSLATION) {
setLocalConstraint(t, (CON_AXIS2), TIP_("along local Z"));
@@ -1095,6 +1094,19 @@ int transformEvent(TransInfo *t, const wmEvent *event)
handled = true;
}
break;
+ case TFM_MODAL_PRECISION:
+ if (event->prevval == KM_PRESS) {
+ t->modifiers |= MOD_PRECISION;
+ /* Shift is modifier for higher precision transform. */
+ t->mouse.precision = 1;
+ t->redraw |= TREDRAW_HARD;
+ }
+ else if (event->prevval == KM_RELEASE) {
+ t->modifiers &= ~MOD_PRECISION;
+ t->mouse.precision = 0;
+ t->redraw |= TREDRAW_HARD;
+ }
+ break;
/* Those two are only handled in transform's own handler, see T44634! */
case TFM_MODAL_EDGESLIDE_UP:
case TFM_MODAL_EDGESLIDE_DOWN:
@@ -1249,7 +1261,7 @@ bool calculateTransformCenter(bContext *C, int centerMode, float cent3d[3], floa
createTransData(C, t); /* make TransData structs from selection */
- t->around = centerMode; /* override userdefined mode */
+ t->around = centerMode; /* override user-defined mode. */
if (t->data_len_all == 0) {
success = false;
@@ -1382,7 +1394,7 @@ static void drawTransformPixel(const struct bContext *C, ARegion *region, void *
*/
if ((U.autokey_flag & AUTOKEY_FLAG_NOWARNING) == 0) {
if (region == t->region) {
- if (t->flag & (T_OBJECT | T_POSE)) {
+ if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) {
if (ob && autokeyframe_cfra_can_key(scene, &ob->id)) {
drawAutoKeyWarning(t, region);
}
@@ -1652,7 +1664,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
if ((prop = RNA_struct_find_property(op->ptr, "texture_space")) &&
RNA_property_is_set(op->ptr, prop)) {
if (RNA_property_boolean_get(op->ptr, prop)) {
- options |= CTX_TEXTURE;
+ options |= CTX_TEXTURE_SPACE;
}
}
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index fff7d47cc5b..24335b6b6b7 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -36,6 +36,11 @@
#include "transform_data.h"
+/* use node center for transform instead of upper-left corner.
+ * disabled since it makes absolute snapping not work so nicely
+ */
+// #define USE_NODE_CENTER
+
/* -------------------------------------------------------------------- */
/** \name Types/
* \{ */
@@ -60,6 +65,134 @@ struct wmKeyMap;
struct wmOperator;
struct wmTimer;
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Enums and Flags
+ * \{ */
+
+/** #TransInfo.options */
+typedef enum {
+ CTX_NONE = 0,
+
+ /* These are similar to TransInfo::data_type. */
+ CTX_CAMERA = (1 << 0),
+ CTX_CURSOR = (1 << 1),
+ CTX_EDGE_DATA = (1 << 2),
+ CTX_GPENCIL_STROKES = (1 << 3),
+ CTX_MASK = (1 << 4),
+ CTX_MOVIECLIP = (1 << 5),
+ CTX_OBJECT = (1 << 6),
+ CTX_PAINT_CURVE = (1 << 7),
+ CTX_POSE_BONE = (1 << 8),
+ CTX_TEXTURE_SPACE = (1 << 9),
+
+ CTX_NO_PET = (1 << 10),
+ CTX_NO_MIRROR = (1 << 11),
+ CTX_AUTOCONFIRM = (1 << 12),
+ /** When transforming object's, adjust the object data so it stays in the same place. */
+ CTX_OBMODE_XFORM_OBDATA = (1 << 13),
+ /** Transform object parents without moving their children. */
+ CTX_OBMODE_XFORM_SKIP_CHILDREN = (1 << 14),
+} eTContext;
+
+/** #TransInfo.flag */
+typedef enum {
+ /** \note We could remove 'T_EDIT' and use 'obedit_type', for now ensure they're in sync. */
+ T_EDIT = 1 << 0,
+ /** Transform points, having no rotation/scale. */
+ T_POINTS = 1 << 1,
+ /** restrictions flags */
+ T_NO_CONSTRAINT = 1 << 2,
+ T_NULL_ONE = 1 << 3,
+ T_NO_ZERO = 1 << 4,
+ T_ALL_RESTRICTIONS = T_NO_CONSTRAINT | T_NULL_ONE | T_NO_ZERO,
+
+ T_PROP_EDIT = 1 << 5,
+ T_PROP_CONNECTED = 1 << 6,
+ T_PROP_PROJECTED = 1 << 7,
+ T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED,
+
+ T_V3D_ALIGN = 1 << 8,
+ /** For 2D views such as UV or f-curve. */
+ T_2D_EDIT = 1 << 9,
+ T_CLIP_UV = 1 << 10,
+
+ /** Auto-IK is on. */
+ T_AUTOIK = 1 << 11,
+
+ /** Don't use mirror even if the data-block option is set. */
+ T_NO_MIRROR = 1 << 12,
+
+ /** To indicate that the value set in the `value` parameter is the final
+ * value of the transformation, modified only by the constrain. */
+ T_INPUT_IS_VALUES_FINAL = 1 << 13,
+
+ /** To specify if we save back settings at the end. */
+ T_MODAL = 1 << 14,
+
+ /** No re-topology (projection). */
+ T_NO_PROJECT = 1 << 15,
+
+ T_RELEASE_CONFIRM = 1 << 16,
+
+ /** Alternative transformation. used to add offset to tracking markers. */
+ T_ALT_TRANSFORM = 1 << 17,
+
+ /** #TransInfo.center has been set, don't change it. */
+ T_OVERRIDE_CENTER = 1 << 18,
+
+ T_MODAL_CURSOR_SET = 1 << 19,
+
+ T_CLNOR_REBUILD = 1 << 20,
+
+ /** Merges unselected into selected after transforming (runs after transforming). */
+ T_AUTOMERGE = 1 << 21,
+ /** Runs auto-merge & splits. */
+ T_AUTOSPLIT = 1 << 22,
+} eTFlag;
+
+/** #TransInfo.modifiers */
+typedef enum {
+ MOD_CONSTRAINT_SELECT = 1 << 0,
+ MOD_PRECISION = 1 << 1,
+ MOD_SNAP = 1 << 2,
+ MOD_SNAP_INVERT = 1 << 3,
+ MOD_CONSTRAINT_PLANE = 1 << 4,
+} eTModifier;
+
+/** #TransSnap.status */
+typedef enum {
+ SNAP_FORCED = 1 << 0,
+ TARGET_INIT = 1 << 1,
+ /* Special flag for snap to grid. */
+ TARGET_GRID_INIT = 1 << 2,
+ POINT_INIT = 1 << 3,
+ MULTI_POINTS = 1 << 4,
+} eTSnap;
+
+/** #TransCon.mode, #TransInfo.con.mode */
+typedef enum {
+ /** When set constraints are in use. */
+ CON_APPLY = 1 << 0,
+ /** These are only used for modal execution. */
+ CON_AXIS0 = 1 << 1,
+ CON_AXIS1 = 1 << 2,
+ CON_AXIS2 = 1 << 3,
+ CON_SELECT = 1 << 4,
+ /** Does not reorient vector to face viewport when on. */
+ CON_NOFLIP = 1 << 5,
+ CON_USER = 1 << 6,
+} eTConstraint;
+
+/** #TransInfo.state */
+typedef enum {
+ TRANS_STARTING = 0,
+ TRANS_RUNNING = 1,
+ TRANS_CONFIRM = 2,
+ TRANS_CANCEL = 3,
+} eTState;
+
/** #TransInfo.redraw */
typedef enum {
TREDRAW_NOTHING = 0,
@@ -67,6 +200,97 @@ typedef enum {
TREDRAW_SOFT = 2,
} eRedrawFlag;
+/** #TransInfo.helpline */
+typedef enum {
+ HLP_NONE = 0,
+ HLP_SPRING = 1,
+ HLP_ANGLE = 2,
+ HLP_HARROW = 3,
+ HLP_VARROW = 4,
+ HLP_CARROW = 5,
+ HLP_TRACKBALL = 6,
+} eTHelpline;
+
+typedef enum {
+ TC_NONE = 0,
+ TC_ACTION_DATA,
+ TC_POSE,
+ TC_ARMATURE_VERTS,
+ TC_CURSOR_IMAGE,
+ TC_CURSOR_VIEW3D,
+ TC_CURVE_VERTS,
+ TC_GRAPH_EDIT_DATA,
+ TC_GPENCIL,
+ TC_LATTICE_VERTS,
+ TC_MASKING_DATA,
+ TC_MBALL_VERTS,
+ TC_MESH_VERTS,
+ TC_MESH_EDGES,
+ TC_MESH_SKIN,
+ TC_MESH_UV,
+ TC_NLA_DATA,
+ TC_NODE_DATA,
+ TC_OBJECT,
+ TC_OBJECT_TEXSPACE,
+ TC_PAINT_CURVE_VERTS,
+ TC_PARTICLE_VERTS,
+ TC_SCULPT,
+ TC_SEQ_DATA,
+ TC_TRACKING_DATA,
+} eTConvertType;
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Keymap Modal Items
+ *
+ * \note these values are saved in key-map files, do not change then but just add new ones.
+ * \{ */
+
+enum {
+ TFM_MODAL_CANCEL = 1,
+ TFM_MODAL_CONFIRM = 2,
+ TFM_MODAL_TRANSLATE = 3,
+ TFM_MODAL_ROTATE = 4,
+ TFM_MODAL_RESIZE = 5,
+ TFM_MODAL_SNAP_INV_ON = 6,
+ TFM_MODAL_SNAP_INV_OFF = 7,
+ TFM_MODAL_SNAP_TOGGLE = 8,
+ TFM_MODAL_AXIS_X = 9,
+ TFM_MODAL_AXIS_Y = 10,
+ TFM_MODAL_AXIS_Z = 11,
+ TFM_MODAL_PLANE_X = 12,
+ TFM_MODAL_PLANE_Y = 13,
+ TFM_MODAL_PLANE_Z = 14,
+ TFM_MODAL_CONS_OFF = 15,
+ TFM_MODAL_ADD_SNAP = 16,
+ TFM_MODAL_REMOVE_SNAP = 17,
+
+ /* 18 and 19 used by number-input, defined in `ED_numinput.h`. */
+ // NUM_MODAL_INCREMENT_UP = 18,
+ // NUM_MODAL_INCREMENT_DOWN = 19,
+
+ TFM_MODAL_PROPSIZE_UP = 20,
+ TFM_MODAL_PROPSIZE_DOWN = 21,
+ TFM_MODAL_AUTOIK_LEN_INC = 22,
+ TFM_MODAL_AUTOIK_LEN_DEC = 23,
+
+ TFM_MODAL_EDGESLIDE_UP = 24,
+ TFM_MODAL_EDGESLIDE_DOWN = 25,
+
+ /** For analog input, like track-pad. */
+ TFM_MODAL_PROPSIZE = 26,
+ /** Node editor insert offset (also called auto-offset) direction toggle. */
+ TFM_MODAL_INSERTOFS_TOGGLE_DIR = 27,
+
+ TFM_MODAL_AUTOCONSTRAINT = 28,
+ TFM_MODAL_AUTOCONSTRAINTPLANE = 29,
+
+ TFM_MODAL_PRECISION = 30,
+};
+
+/** \} */
+
typedef struct TransSnapPoint {
struct TransSnapPoint *next, *prev;
float co[3];
@@ -82,13 +306,14 @@ typedef struct TransSnap {
bool snap_self;
bool peel;
bool use_backface_culling;
- char status;
+ eTSnap status;
/* Snapped Element Type (currently for objects only). */
char snapElem;
/** snapping from this point (in global-space). */
float snapPoint[3];
/** to this point (in global-space). */
float snapTarget[3];
+ float snapTargetGrid[3];
float snapNormal[3];
char snapNodeBorder;
ListBase points;
@@ -120,7 +345,7 @@ typedef struct TransCon {
* the one in #TransInfo is not guarantee to stay the same (Rotates change it). */
int imval[2];
/** Mode flags of the constraint. */
- int mode;
+ eTConstraint mode;
void (*drawExtra)(struct TransInfo *t);
/* Note: if 'tc' is NULL, 'td' must also be NULL.
@@ -266,37 +491,45 @@ typedef struct TransInfo {
TransDataContainer *data_container;
int data_container_len;
- /** #eTransConvertType
- * TODO: It should be a member of #TransDataContainer. */
- int data_type;
-
/** Combine length of all #TransDataContainer.data_len
* Use to check if nothing is selected or if we have a single selection. */
int data_len_all;
- /** Current mode. */
- int mode;
+ /** TODO: It should be a member of #TransDataContainer. */
+ eTConvertType data_type;
+
+ /** Current context/options for transform. */
+ eTContext options;
/** Generic flags for special behaviors. */
- int flag;
+ eTFlag flag;
/** Special modifiers, by function, not key. */
- int modifiers;
+ eTModifier modifiers;
/** Current state (running, canceled. */
- short state;
- /** Current context/options for transform. */
- int options;
+ eTState state;
+ /** Redraw flag. */
+ eRedrawFlag redraw;
+ /** Choice of custom cursor with or without a help line from the gizmo to the mouse position. */
+ eTHelpline helpline;
+ /** Current mode. */
+ eTfmMode mode;
+
+ /** Main transform mode function. */
void (*transform)(struct TransInfo *, const int[2]);
- /** Transform function pointer. */
+ /* Event handler function that determines whether the viewport needs to be redrawn. */
eRedrawFlag (*handleEvent)(struct TransInfo *, const struct wmEvent *);
- /* event handler function pointer RETURN 1 if redraw is needed */
- /** transformed constraint. */
+
+ /** Constraint Data. */
TransCon con;
+
+ /** Snap Data. */
TransSnap tsnap;
- /** numerical input. */
+
+ /** Numerical input. */
NumInput num;
- /** mouse input. */
+
+ /** Mouse input. */
MouseInput mouse;
- /** redraw flag. */
- eRedrawFlag redraw;
+
/** proportional circle radius. */
float prop_size;
/** proportional falloff text. */
@@ -310,9 +543,6 @@ typedef struct TransInfo {
float center_global[3];
/** center in screen coordinates. */
float center2d[2];
- /* Lazy initialize center data for when we need other center values.
- * V3D_AROUND_ACTIVE + 1 (static assert checks this) */
- TransCenterData center_cache[5];
/** maximum index on the input vector. */
short idx_max;
/** Snapping Gears. */
@@ -333,8 +563,6 @@ typedef struct TransInfo {
short around;
/** space-type where transforming is. */
char spacetype;
- /** Choice of custom cursor with or without a help line from the gizmo to the mouse position. */
- char helpline;
/** Avoid looking inside #TransDataContainer.obedit. */
short obedit_type;
@@ -422,178 +650,6 @@ typedef struct TransInfo {
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Flags
- * \{ */
-
-/** #TransInfo.state */
-enum {
- TRANS_STARTING = 0,
- TRANS_RUNNING = 1,
- TRANS_CONFIRM = 2,
- TRANS_CANCEL = 3,
-};
-
-/** #TransInfo.flag */
-enum {
- T_OBJECT = 1 << 0,
- /** \note We could remove 'T_EDIT' and use 'obedit_type', for now ensure they're in sync. */
- T_EDIT = 1 << 1,
- T_POSE = 1 << 2,
- T_TEXTURE = 1 << 3,
- /** Transforming the 3d view. */
- T_CAMERA = 1 << 4,
- /** Transforming the 3D cursor. */
- T_CURSOR = 1 << 5,
- /** Transform points, having no rotation/scale. */
- T_POINTS = 1 << 6,
- /** restrictions flags */
- T_NO_CONSTRAINT = 1 << 7,
- T_NULL_ONE = 1 << 8,
- T_NO_ZERO = 1 << 9,
- T_ALL_RESTRICTIONS = T_NO_CONSTRAINT | T_NULL_ONE | T_NO_ZERO,
-
- T_PROP_EDIT = 1 << 10,
- T_PROP_CONNECTED = 1 << 11,
- T_PROP_PROJECTED = 1 << 12,
- T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED,
-
- T_V3D_ALIGN = 1 << 13,
- /** For 2D views such as UV or f-curve. */
- T_2D_EDIT = 1 << 14,
- T_CLIP_UV = 1 << 15,
-
- /** Auto-IK is on. */
- T_AUTOIK = 1 << 16,
-
- /** Don't use mirror even if the data-block option is set. */
- T_NO_MIRROR = 1 << 17,
-
- /** To indicate that the value set in the `value` parameter is the final
- * value of the transformation, modified only by the constrain. */
- T_INPUT_IS_VALUES_FINAL = 1 << 18,
-
- /** To specify if we save back settings at the end. */
- T_MODAL = 1 << 19,
-
- /** No re-topology (projection). */
- T_NO_PROJECT = 1 << 20,
-
- T_RELEASE_CONFIRM = 1 << 21,
-
- /** Alternative transformation. used to add offset to tracking markers. */
- T_ALT_TRANSFORM = 1 << 22,
-
- /** #TransInfo.center has been set, don't change it. */
- T_OVERRIDE_CENTER = 1 << 23,
-
- T_MODAL_CURSOR_SET = 1 << 24,
-
- T_CLNOR_REBUILD = 1 << 25,
-
- /** Merges unselected into selected after transforming (runs after transforming). */
- T_AUTOMERGE = 1 << 26,
- /** Runs auto-merge & splits. */
- T_AUTOSPLIT = 1 << 27,
-};
-
-/** #TransInfo.modifiers */
-enum {
- MOD_CONSTRAINT_SELECT = 1 << 0,
- MOD_PRECISION = 1 << 1,
- MOD_SNAP = 1 << 2,
- MOD_SNAP_INVERT = 1 << 3,
- MOD_CONSTRAINT_PLANE = 1 << 4,
-};
-
-/* use node center for transform instead of upper-left corner.
- * disabled since it makes absolute snapping not work so nicely
- */
-// #define USE_NODE_CENTER
-
-/** #TransInfo.helpline */
-enum {
- HLP_NONE = 0,
- HLP_SPRING = 1,
- HLP_ANGLE = 2,
- HLP_HARROW = 3,
- HLP_VARROW = 4,
- HLP_CARROW = 5,
- HLP_TRACKBALL = 6,
-};
-
-/** #TransCon.mode, #TransInfo.con.mode */
-enum {
- /** When set constraints are in use. */
- CON_APPLY = 1 << 0,
- /** These are only used for modal execution. */
- CON_AXIS0 = 1 << 1,
- CON_AXIS1 = 1 << 2,
- CON_AXIS2 = 1 << 3,
- CON_SELECT = 1 << 4,
- /** Does not reorient vector to face viewport when on. */
- CON_NOFLIP = 1 << 5,
- CON_USER = 1 << 6,
-};
-
-/** #TransSnap.status */
-enum {
- SNAP_FORCED = 1 << 0,
- TARGET_INIT = 1 << 1,
- POINT_INIT = 1 << 2,
- MULTI_POINTS = 1 << 3,
-};
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Keymap Modal Items
- *
- * \note these values are saved in key-map files, do not change then but just add new ones.
- * \{ */
-
-enum {
- TFM_MODAL_CANCEL = 1,
- TFM_MODAL_CONFIRM = 2,
- TFM_MODAL_TRANSLATE = 3,
- TFM_MODAL_ROTATE = 4,
- TFM_MODAL_RESIZE = 5,
- TFM_MODAL_SNAP_INV_ON = 6,
- TFM_MODAL_SNAP_INV_OFF = 7,
- TFM_MODAL_SNAP_TOGGLE = 8,
- TFM_MODAL_AXIS_X = 9,
- TFM_MODAL_AXIS_Y = 10,
- TFM_MODAL_AXIS_Z = 11,
- TFM_MODAL_PLANE_X = 12,
- TFM_MODAL_PLANE_Y = 13,
- TFM_MODAL_PLANE_Z = 14,
- TFM_MODAL_CONS_OFF = 15,
- TFM_MODAL_ADD_SNAP = 16,
- TFM_MODAL_REMOVE_SNAP = 17,
-
- /* 18 and 19 used by number-input, defined in `ED_numinput.h`. */
- // NUM_MODAL_INCREMENT_UP = 18,
- // NUM_MODAL_INCREMENT_DOWN = 19,
-
- TFM_MODAL_PROPSIZE_UP = 20,
- TFM_MODAL_PROPSIZE_DOWN = 21,
- TFM_MODAL_AUTOIK_LEN_INC = 22,
- TFM_MODAL_AUTOIK_LEN_DEC = 23,
-
- TFM_MODAL_EDGESLIDE_UP = 24,
- TFM_MODAL_EDGESLIDE_DOWN = 25,
-
- /** For analog input, like track-pad. */
- TFM_MODAL_PROPSIZE = 26,
- /** Node editor insert offset (also called auto-offset) direction toggle. */
- TFM_MODAL_INSERTOFS_TOGGLE_DIR = 27,
-
- TFM_MODAL_AUTOCONSTRAINT = 28,
- TFM_MODAL_AUTOCONSTRAINTPLANE = 29,
-};
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
/** \name Public Transform API
* \{ */
@@ -666,9 +722,6 @@ typedef enum {
void initMouseInput(
TransInfo *t, MouseInput *mi, const float center[2], const int mval[2], const bool precision);
void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode);
-eRedrawFlag handleMouseInput(struct TransInfo *t,
- struct MouseInput *mi,
- const struct wmEvent *event);
void applyMouseInput(struct TransInfo *t,
struct MouseInput *mi,
const int mval[2],
@@ -684,10 +737,6 @@ void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *t, float val
/** \name Generics
* \{ */
-void initTransDataContainers_FromObjectData(TransInfo *t,
- struct Object *obact,
- struct Object **objects,
- uint objects_len);
void initTransInfo(struct bContext *C,
TransInfo *t,
struct wmOperator *op,
@@ -709,7 +758,6 @@ void recalcData(TransInfo *t);
void calculateCenter2D(TransInfo *t);
void calculateCenterLocal(TransInfo *t, const float center_global[3]);
-const TransCenterData *transformCenter_from_type(TransInfo *t, int around);
void calculateCenter(TransInfo *t);
/* API functions for getting center points */
@@ -724,6 +772,8 @@ void calculatePropRatio(TransInfo *t);
void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot);
+struct Object *transform_object_deform_pose_armature_get(const TransInfo *t, struct Object *ob);
+
void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data);
/* TODO. transform_query.c */
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 2ac7e41a7c9..1f589a830fc 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -58,6 +58,10 @@
static void drawObjectConstraint(TransInfo *t);
+/* -------------------------------------------------------------------- */
+/** \name Internal Utilities
+ * \{ */
+
static void projection_matrix_calc(const TransInfo *t, float r_pmtx[3][3])
{
unit_m3(r_pmtx);
@@ -380,14 +384,13 @@ static void planeProjection(const TransInfo *t, const float in[3], float out[3])
add_v3_v3v3(out, in, vec);
}
-/*
+/**
* Generic callback for constant spatial constraints applied to linear motion
*
- * The IN vector in projected into the constrained space and then further
+ * The `in` vector in projected into the constrained space and then further
* projected along the view vector.
* (in perspective mode, the view vector is relative to the position on screen)
*/
-
static void applyAxisConstraintVec(
TransInfo *t, TransDataContainer *UNUSED(tc), TransData *td, const float in[3], float out[3])
{
@@ -459,17 +462,16 @@ static void applyAxisConstraintVec(
}
}
-/*
+/**
* Generic callback for object based spatial constraints applied to linear motion
*
* At first, the following is applied without orientation
* The IN vector in projected into the constrained space and then further
* projected along the view vector.
- * (in perspective mode, the view vector is relative to the position on screen)
+ * (in perspective mode, the view vector is relative to the position on screen).
*
* Further down, that vector is mapped to each data's space.
*/
-
static void applyObjectConstraintVec(
TransInfo *t, TransDataContainer *tc, TransData *td, const float in[3], float out[3])
{
@@ -489,10 +491,9 @@ static void applyObjectConstraintVec(
}
}
-/*
- * Generic callback for constant spatial constraints applied to resize motion
+/**
+ * Generic callback for constant spatial constraints applied to resize motion.
*/
-
static void applyAxisConstraintSize(TransInfo *t,
TransDataContainer *UNUSED(tc),
TransData *td,
@@ -516,10 +517,9 @@ static void applyAxisConstraintSize(TransInfo *t,
}
}
-/*
- * Callback for object based spatial constraints applied to resize motion
+/**
+ * Callback for object based spatial constraints applied to resize motion.
*/
-
static void applyObjectConstraintSize(TransInfo *t,
TransDataContainer *tc,
TransData *td,
@@ -549,10 +549,10 @@ static void applyObjectConstraintSize(TransInfo *t,
}
}
-static void constraints_rotation_imp(TransInfo *t,
- float axismtx[3][3],
- float r_vec[3],
- float *r_angle)
+static void constraints_rotation_impl(TransInfo *t,
+ float axismtx[3][3],
+ float r_vec[3],
+ float *r_angle)
{
BLI_assert(t->con.mode & CON_APPLY);
int mode = t->con.mode & (CON_AXIS0 | CON_AXIS1 | CON_AXIS2);
@@ -581,15 +581,15 @@ static void constraints_rotation_imp(TransInfo *t,
}
}
-/*
+/**
* Generic callback for constant spatial constraints applied to rotations
*
- * The rotation axis is copied into VEC.
+ * The rotation axis is copied into `vec`.
*
* In the case of single axis constraints, the rotation axis is directly the one constrained to.
* For planar constraints (2 axis), the rotation axis is the normal of the plane.
*
- * The following only applies when CON_NOFLIP is not set.
+ * The following only applies when #CON_NOFLIP is not set.
* The vector is then modified to always point away from the screen (in global space)
* This insures that the rotation is always logically following the mouse.
* (ie: not doing counterclockwise rotations when the mouse moves clockwise).
@@ -598,19 +598,19 @@ static void applyAxisConstraintRot(
TransInfo *t, TransDataContainer *UNUSED(tc), TransData *td, float vec[3], float *angle)
{
if (!td && t->con.mode & CON_APPLY) {
- constraints_rotation_imp(t, t->spacemtx, vec, angle);
+ constraints_rotation_impl(t, t->spacemtx, vec, angle);
}
}
-/*
+/**
* Callback for object based spatial constraints applied to rotations
*
- * The rotation axis is copied into VEC.
+ * The rotation axis is copied into `vec`.
*
* In the case of single axis constraints, the rotation axis is directly the one constrained to.
* For planar constraints (2 axis), the rotation axis is the normal of the plane.
*
- * The following only applies when CON_NOFLIP is not set.
+ * The following only applies when #CON_NOFLIP is not set.
* The vector is then modified to always point away from the screen (in global space)
* This insures that the rotation is always logically following the mouse.
* (ie: not doing counterclockwise rotations when the mouse moves clockwise).
@@ -637,11 +637,15 @@ static void applyObjectConstraintRot(
axismtx = td->axismtx;
}
- constraints_rotation_imp(t, axismtx, vec, angle);
+ constraints_rotation_impl(t, axismtx, vec, angle);
}
}
-/*--------------------- INTERNAL SETUP CALLS ------------------*/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Internal Setup Calls
+ * \{ */
void setConstraint(TransInfo *t, int mode, const char text[])
{
@@ -676,7 +680,7 @@ void setAxisMatrixConstraint(TransInfo *t, int mode, const char text[])
void setLocalConstraint(TransInfo *t, int mode, const char text[])
{
- if (t->flag & T_EDIT) {
+ if ((t->flag & T_EDIT) || t->data_len_all == 1) {
/* Although in edit-mode each object has its local space, use the
* orientation of the active object. */
setConstraint(t, mode, text);
@@ -686,10 +690,10 @@ void setLocalConstraint(TransInfo *t, int mode, const char text[])
}
}
-/*
+/**
* Set the constraint according to the user defined orientation
*
- * ftext is a format string passed to BLI_snprintf. It will add the name of
+ * `ftext` is a format string passed to #BLI_snprintf. It will add the name of
* the orientation where %s is (logically).
*/
void setUserConstraint(TransInfo *t, int mode, const char ftext[])
@@ -704,40 +708,35 @@ void setUserConstraint(TransInfo *t, int mode, const char ftext[])
const char *spacename = transform_orientations_spacename_get(t, orientation);
BLI_snprintf(text, sizeof(text), ftext, spacename);
- if (t->modifiers & (MOD_CONSTRAINT_SELECT | MOD_CONSTRAINT_PLANE)) {
- /* Force the orientation of the active object.
- * Although possible, it is not convenient to use the local or axis constraint
- * with the modifier to select constraint.
- * This also follows the convention of older versions. */
- setConstraint(t, mode, text);
- }
- else {
- switch (orientation) {
- case V3D_ORIENT_LOCAL:
- setLocalConstraint(t, mode, text);
- break;
- case V3D_ORIENT_NORMAL:
- if (checkUseAxisMatrix(t)) {
- setAxisMatrixConstraint(t, mode, text);
- break;
- }
- ATTR_FALLTHROUGH;
- case V3D_ORIENT_GLOBAL:
- case V3D_ORIENT_VIEW:
- case V3D_ORIENT_CURSOR:
- case V3D_ORIENT_GIMBAL:
- case V3D_ORIENT_CUSTOM_MATRIX:
- case V3D_ORIENT_CUSTOM:
- default: {
- setConstraint(t, mode, text);
+ switch (orientation) {
+ case V3D_ORIENT_LOCAL:
+ setLocalConstraint(t, mode, text);
+ break;
+ case V3D_ORIENT_NORMAL:
+ if (checkUseAxisMatrix(t)) {
+ setAxisMatrixConstraint(t, mode, text);
break;
}
+ ATTR_FALLTHROUGH;
+ case V3D_ORIENT_GLOBAL:
+ case V3D_ORIENT_VIEW:
+ case V3D_ORIENT_CURSOR:
+ case V3D_ORIENT_GIMBAL:
+ case V3D_ORIENT_CUSTOM_MATRIX:
+ case V3D_ORIENT_CUSTOM:
+ default: {
+ setConstraint(t, mode, text);
+ break;
}
}
t->con.mode |= CON_USER;
}
-/*----------------- DRAWING CONSTRAINTS -------------------*/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Drawing Constraints
+ * \{ */
void drawConstraint(TransInfo *t)
{
@@ -915,7 +914,7 @@ static void drawObjectConstraint(TransInfo *t)
mul_m3_m3m3(tmp_axismtx, tc->mat3_unit, td->axismtx);
axismtx = tmp_axismtx;
}
- else if (t->flag & T_POSE) {
+ else if (t->options & CTX_POSE_BONE) {
mul_v3_m4v3(co, tc->mat, td->center);
axismtx = td->axismtx;
}
@@ -938,7 +937,11 @@ static void drawObjectConstraint(TransInfo *t)
}
}
-/*--------------------- START / STOP CONSTRAINTS ---------------------- */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Start / Stop Constraints
+ * \{ */
void startConstraint(TransInfo *t)
{
@@ -959,7 +962,11 @@ void stopConstraint(TransInfo *t)
t->num.idx_max = t->idx_max;
}
-/*------------------------- MMB Select -------------------------------*/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Middle Mouse Button Select
+ * \{ */
void initSelectConstraint(TransInfo *t)
{
@@ -1106,7 +1113,11 @@ void setNearestAxis(TransInfo *t)
projection_matrix_calc(t, t->con.pmtx);
}
-/*-------------- HELPER FUNCTIONS ----------------*/
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Helper Functions
+ * \{ */
int constraintModeToIndex(const TransInfo *t)
{
@@ -1147,14 +1158,13 @@ bool isLockConstraint(TransInfo *t)
return false;
}
-/*
+/**
* Returns the dimension of the constraint space.
*
* For that reason, the flags always needs to be set to properly evaluate here,
- * even if they aren't actually used in the callback function. (Which could happen
- * for weird constraints not yet designed. Along a path for example.)
+ * even if they aren't actually used in the callback function.
+ * (Which could happen for weird constraints not yet designed. Along a path for example.)
*/
-
int getConstraintSpaceDimension(TransInfo *t)
{
int n = 0;
@@ -1172,11 +1182,12 @@ int getConstraintSpaceDimension(TransInfo *t)
}
return n;
- /*
- * Someone willing to do it cryptically could do the following instead:
+ /* Someone willing to do it cryptically could do the following instead:
*
- * return t->con & (CON_AXIS0|CON_AXIS1|CON_AXIS2);
+ * `return t->con & (CON_AXIS0|CON_AXIS1|CON_AXIS2);`
*
* Based on the assumptions that the axis flags are one after the other and start at 1
*/
}
+
+/** \} */
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index 3ea0b0a0a70..6b2e9dd9840 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -23,6 +23,7 @@
#include "DNA_anim_types.h"
#include "DNA_constraint_types.h"
+#include "DNA_mesh_types.h"
#include "MEM_guardedalloc.h"
@@ -892,7 +893,6 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
special_aftertrans_update__node(C, t);
break;
case TC_OBJECT:
- case TC_OBJECT_TEXSPACE:
special_aftertrans_update__object(C, t);
break;
case TC_SCULPT:
@@ -912,6 +912,8 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
case TC_LATTICE_VERTS:
case TC_MBALL_VERTS:
case TC_MESH_UV:
+ case TC_MESH_SKIN:
+ case TC_OBJECT_TEXSPACE:
case TC_PAINT_CURVE_VERTS:
case TC_PARTICLE_VERTS:
case TC_NONE:
@@ -928,10 +930,10 @@ int special_transform_moving(TransInfo *t)
if (t->spacetype == SPACE_GRAPH) {
return G_TRANSFORM_FCURVES;
}
- if ((t->flag & T_EDIT) || (t->flag & T_POSE)) {
+ if ((t->flag & T_EDIT) || (t->options & CTX_POSE_BONE)) {
return G_TRANSFORM_EDIT;
}
- if (t->flag & (T_OBJECT | T_TEXTURE)) {
+ if (t->options & (CTX_OBJECT | CTX_TEXTURE_SPACE)) {
return G_TRANSFORM_OBJ;
}
@@ -973,53 +975,254 @@ static int countAndCleanTransDataContainer(TransInfo *t)
return t->data_len_all;
}
-void createTransData(bContext *C, TransInfo *t)
+static void init_proportional_edit(TransInfo *t)
{
- Scene *scene = t->scene;
- ViewLayer *view_layer = t->view_layer;
- Object *ob = OBACT(view_layer);
+ eTConvertType convert_type = t->data_type;
+ switch (convert_type) {
+ case TC_ACTION_DATA:
+ case TC_CURVE_VERTS:
+ case TC_GRAPH_EDIT_DATA:
+ case TC_GPENCIL:
+ case TC_LATTICE_VERTS:
+ case TC_MASKING_DATA:
+ case TC_MBALL_VERTS:
+ case TC_MESH_VERTS:
+ case TC_MESH_EDGES:
+ case TC_MESH_SKIN:
+ case TC_MESH_UV:
+ case TC_NODE_DATA:
+ case TC_OBJECT:
+ case TC_PARTICLE_VERTS:
+ break;
+ case TC_POSE: /* Disable PET, its not usable in pose mode yet T32444. */
+ case TC_ARMATURE_VERTS:
+ case TC_CURSOR_IMAGE:
+ case TC_CURSOR_VIEW3D:
+ case TC_NLA_DATA:
+ case TC_OBJECT_TEXSPACE:
+ case TC_PAINT_CURVE_VERTS:
+ case TC_SCULPT:
+ case TC_SEQ_DATA:
+ case TC_TRACKING_DATA:
+ case TC_NONE:
+ default:
+ t->options |= CTX_NO_PET;
+ t->flag &= ~T_PROP_EDIT_ALL;
+ return;
+ }
- t->data_len_all = -1;
+ if (t->data_len_all && (t->flag & T_PROP_EDIT)) {
+ if (convert_type == TC_OBJECT) {
+ /* Selected objects are already first, no need to presort. */
+ }
+ else {
+ sort_trans_data_selected_first(t);
+ }
- eTransConvertType convert_type = TC_NONE;
+ if (ELEM(convert_type, TC_ACTION_DATA, TC_GRAPH_EDIT_DATA)) {
+ /* Distance has already been set. */
+ }
+ else if (ELEM(convert_type, TC_MESH_VERTS, TC_MESH_SKIN)) {
+ if (t->flag & T_PROP_CONNECTED) {
+ /* Already calculated by transform_convert_mesh_connectivity_distance. */
+ }
+ else {
+ set_prop_dist(t, false);
+ }
+ }
+ else if (convert_type == TC_MESH_UV && t->flag & T_PROP_CONNECTED) {
+ /* Already calculated by uv_set_connectivity_distance. */
+ }
+ else if (convert_type == TC_CURVE_VERTS && t->obedit_type == OB_CURVE) {
+ set_prop_dist(t, false);
+ }
+ else {
+ set_prop_dist(t, true);
+ }
+
+ sort_trans_data_dist(t);
+ }
+ else if (ELEM(t->obedit_type, OB_CURVE)) {
+ /* Needed because bezier handles can be partially selected
+ * and are still added into transform data. */
+ sort_trans_data_selected_first(t);
+ }
+}
+
+/* For multi object editing. */
+static void init_TransDataContainers(TransInfo *t,
+ Object *obact,
+ Object **objects,
+ uint objects_len)
+{
+ switch (t->data_type) {
+ case TC_POSE:
+ case TC_ARMATURE_VERTS:
+ case TC_CURVE_VERTS:
+ case TC_GPENCIL:
+ case TC_LATTICE_VERTS:
+ case TC_MBALL_VERTS:
+ case TC_MESH_VERTS:
+ case TC_MESH_EDGES:
+ case TC_MESH_SKIN:
+ case TC_MESH_UV:
+ break;
+ case TC_ACTION_DATA:
+ case TC_GRAPH_EDIT_DATA:
+ case TC_CURSOR_IMAGE:
+ case TC_CURSOR_VIEW3D:
+ case TC_MASKING_DATA:
+ case TC_NLA_DATA:
+ case TC_NODE_DATA:
+ case TC_OBJECT:
+ case TC_OBJECT_TEXSPACE:
+ case TC_PAINT_CURVE_VERTS:
+ case TC_PARTICLE_VERTS:
+ case TC_SCULPT:
+ case TC_SEQ_DATA:
+ case TC_TRACKING_DATA:
+ case TC_NONE:
+ default:
+ /* Does not support Multi object editing. */
+ return;
+ }
+
+ const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT;
+ const short object_type = obact ? obact->type : -1;
+
+ if ((object_mode & OB_MODE_EDIT) || (t->data_type == TC_GPENCIL) ||
+ ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) {
+ if (t->data_container) {
+ MEM_freeN(t->data_container);
+ }
+
+ bool free_objects = false;
+ if (objects == NULL) {
+ objects = BKE_view_layer_array_from_objects_in_mode(
+ t->view_layer,
+ (t->spacetype == SPACE_VIEW3D) ? t->view : NULL,
+ &objects_len,
+ {
+ .object_mode = object_mode,
+ .no_dup_data = true,
+ });
+ free_objects = true;
+ }
+
+ t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__);
+ t->data_container_len = objects_len;
+
+ for (int i = 0; i < objects_len; i++) {
+ TransDataContainer *tc = &t->data_container[i];
+ if (((t->flag & T_NO_MIRROR) == 0) && ((t->options & CTX_NO_MIRROR) == 0) &&
+ (objects[i]->type == OB_MESH)) {
+ tc->use_mirror_axis_x = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_X) != 0;
+ tc->use_mirror_axis_y = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Y) != 0;
+ tc->use_mirror_axis_z = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Z) != 0;
+ }
+
+ if (object_mode & OB_MODE_EDIT) {
+ tc->obedit = objects[i];
+ /* Check needed for UV's */
+ if ((t->flag & T_2D_EDIT) == 0) {
+ tc->use_local_mat = true;
+ }
+ }
+ else if (object_mode & OB_MODE_POSE) {
+ tc->poseobj = objects[i];
+ tc->use_local_mat = true;
+ }
+ else if (t->data_type == TC_GPENCIL) {
+ tc->use_local_mat = true;
+ }
+
+ if (tc->use_local_mat) {
+ BLI_assert((t->flag & T_2D_EDIT) == 0);
+ copy_m4_m4(tc->mat, objects[i]->obmat);
+ copy_m3_m4(tc->mat3, tc->mat);
+ /* for non-invertible scale matrices, invert_m4_m4_fallback()
+ * can still provide a valid pivot */
+ invert_m4_m4_fallback(tc->imat, tc->mat);
+ invert_m3_m3(tc->imat3, tc->mat3);
+ normalize_m3_m3(tc->mat3_unit, tc->mat3);
+ }
+ /* Otherwise leave as zero. */
+ }
+
+ if (free_objects) {
+ MEM_freeN(objects);
+ }
+ }
+}
+
+static eTFlag flags_from_data_type(eTConvertType data_type)
+{
+ switch (data_type) {
+ case TC_ACTION_DATA:
+ case TC_GRAPH_EDIT_DATA:
+ case TC_MASKING_DATA:
+ case TC_NLA_DATA:
+ case TC_NODE_DATA:
+ case TC_PAINT_CURVE_VERTS:
+ case TC_SEQ_DATA:
+ case TC_TRACKING_DATA:
+ return T_POINTS | T_2D_EDIT;
+ case TC_ARMATURE_VERTS:
+ case TC_CURVE_VERTS:
+ case TC_GPENCIL:
+ case TC_LATTICE_VERTS:
+ case TC_MBALL_VERTS:
+ case TC_MESH_VERTS:
+ case TC_MESH_SKIN:
+ return T_EDIT | T_POINTS;
+ case TC_MESH_EDGES:
+ return T_EDIT;
+ case TC_MESH_UV:
+ return T_EDIT | T_POINTS | T_2D_EDIT;
+ case TC_PARTICLE_VERTS:
+ return T_POINTS;
+ case TC_POSE:
+ case TC_CURSOR_IMAGE:
+ case TC_CURSOR_VIEW3D:
+ case TC_OBJECT:
+ case TC_OBJECT_TEXSPACE:
+ case TC_SCULPT:
+ case TC_NONE:
+ default:
+ break;
+ }
+ return 0;
+}
+
+static eTConvertType convert_type_get(const TransInfo *t, Object **r_obj_armature)
+{
+ ViewLayer *view_layer = t->view_layer;
+ Object *ob = OBACT(view_layer);
+ eTConvertType convert_type = TC_NONE;
/* if tests must match recalcData for correct updates */
if (t->options & CTX_CURSOR) {
- t->flag |= T_CURSOR;
-
if (t->spacetype == SPACE_IMAGE) {
convert_type = TC_CURSOR_IMAGE;
}
else {
convert_type = TC_CURSOR_VIEW3D;
}
-
- /* Since we're transforming the cursor, initialize this value before it's modified.
- * Needed for #snap_grid_apply to access the cursor location. */
- transformCenter_from_type(t, V3D_AROUND_CURSOR);
}
else if (!(t->options & CTX_PAINT_CURVE) && (t->spacetype == SPACE_VIEW3D) && ob &&
(ob->mode == OB_MODE_SCULPT) && ob->sculpt) {
convert_type = TC_SCULPT;
}
- else if (t->options & CTX_TEXTURE) {
- t->flag |= T_TEXTURE;
+ else if (t->options & CTX_TEXTURE_SPACE) {
convert_type = TC_OBJECT_TEXSPACE;
}
- else if (t->options & CTX_EDGE) {
- t->flag |= T_EDIT;
+ else if (t->options & CTX_EDGE_DATA) {
convert_type = TC_MESH_EDGES;
- /* Multi object editing. */
- initTransDataContainers_FromObjectData(t, ob, NULL, 0);
}
else if (t->options & CTX_GPENCIL_STROKES) {
- t->options |= CTX_GPENCIL_STROKES;
- t->flag |= T_POINTS | T_EDIT;
convert_type = TC_GPENCIL;
- initTransDataContainers_FromObjectData(t, ob, NULL, 0);
}
else if (t->spacetype == SPACE_IMAGE) {
- t->flag |= T_POINTS | T_2D_EDIT;
if (t->options & CTX_MASK) {
convert_type = TC_MASKING_DATA;
}
@@ -1029,41 +1232,25 @@ void createTransData(bContext *C, TransInfo *t)
}
}
else if (t->obedit_type == OB_MESH) {
- t->flag |= T_EDIT;
convert_type = TC_MESH_UV;
- initTransDataContainers_FromObjectData(t, ob, NULL, 0);
}
}
else if (t->spacetype == SPACE_ACTION) {
- t->flag |= T_POINTS | T_2D_EDIT;
- t->obedit_type = -1;
convert_type = TC_ACTION_DATA;
}
else if (t->spacetype == SPACE_NLA) {
- t->flag |= T_POINTS | T_2D_EDIT;
- t->obedit_type = -1;
convert_type = TC_NLA_DATA;
}
else if (t->spacetype == SPACE_SEQ) {
- t->flag |= T_POINTS | T_2D_EDIT;
- t->obedit_type = -1;
- t->num.flag |= NUM_NO_FRACTION; /* sequencer has no use for floating point trasnform */
convert_type = TC_SEQ_DATA;
}
else if (t->spacetype == SPACE_GRAPH) {
- t->flag |= T_POINTS | T_2D_EDIT;
- t->obedit_type = -1;
convert_type = TC_GRAPH_EDIT_DATA;
}
else if (t->spacetype == SPACE_NODE) {
- t->flag |= T_POINTS | T_2D_EDIT;
- t->obedit_type = -1;
convert_type = TC_NODE_DATA;
}
else if (t->spacetype == SPACE_CLIP) {
- t->flag |= T_POINTS | T_2D_EDIT;
- t->obedit_type = -1;
-
if (t->options & CTX_MOVIECLIP) {
convert_type = TC_TRACKING_DATA;
}
@@ -1072,11 +1259,6 @@ void createTransData(bContext *C, TransInfo *t)
}
}
else if (t->obedit_type != -1) {
- t->flag |= T_EDIT | T_POINTS;
-
- /* Multi object editing. */
- initTransDataContainers_FromObjectData(t, ob, NULL, 0);
-
if (t->obedit_type == OB_MESH) {
if (t->mode == TFM_SKIN_RESIZE) {
convert_type = TC_MESH_SKIN;
@@ -1095,46 +1277,25 @@ void createTransData(bContext *C, TransInfo *t)
convert_type = TC_MBALL_VERTS;
}
else if (t->obedit_type == OB_ARMATURE) {
- t->flag &= ~T_PROP_EDIT;
convert_type = TC_ARMATURE_VERTS;
}
}
else if (ob && (ob->mode & OB_MODE_POSE)) {
- /* XXX this is currently limited to active armature only... */
-
- /* XXX active-layer checking isn't done
- * as that should probably be checked through context instead. */
-
- /* Multi object editing. */
- initTransDataContainers_FromObjectData(t, ob, NULL, 0);
convert_type = TC_POSE;
}
else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) {
- /* Important that ob_armature can be set even when its not selected T23412.
- * Lines below just check is also visible. */
- Object *ob_armature = BKE_modifiers_is_deformed_by_armature(ob);
- if (ob_armature && ob_armature->mode & OB_MODE_POSE) {
- Base *base_arm = BKE_view_layer_base_find(t->view_layer, ob_armature);
- if (base_arm) {
- View3D *v3d = t->view;
- if (BASE_VISIBLE(v3d, base_arm)) {
- Object *objects[1];
- objects[0] = ob_armature;
- uint objects_len = 1;
- initTransDataContainers_FromObjectData(t, ob_armature, objects, objects_len);
- convert_type = TC_POSE;
- }
- }
+ Object *ob_armature = transform_object_deform_pose_armature_get(t, ob);
+ if (ob_armature) {
+ *r_obj_armature = ob_armature;
+ convert_type = TC_POSE;
}
}
else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT) &&
- PE_start_edit(PE_get_current(t->depsgraph, scene, ob))) {
- t->flag |= T_POINTS;
+ PE_start_edit(PE_get_current(t->depsgraph, t->scene, ob))) {
convert_type = TC_PARTICLE_VERTS;
}
else if (ob && (ob->mode & OB_MODE_ALL_PAINT)) {
if ((t->options & CTX_PAINT_CURVE) && !ELEM(t->mode, TFM_SHEAR, TFM_SHRINKFATTEN)) {
- t->flag |= T_POINTS | T_2D_EDIT;
convert_type = TC_PAINT_CURVE_VERTS;
}
}
@@ -1146,47 +1307,55 @@ void createTransData(bContext *C, TransInfo *t)
/* In grease pencil all transformations must be canceled if not Object or Edit. */
}
else {
- /* Needed for correct Object.obmat after duplication, see: T62135. */
- BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context));
-
- if ((scene->toolsettings->transform_flag & SCE_XFORM_DATA_ORIGIN) != 0) {
- t->options |= CTX_OBMODE_XFORM_OBDATA;
- }
- if ((scene->toolsettings->transform_flag & SCE_XFORM_SKIP_CHILDREN) != 0) {
- t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN;
- }
-
- t->flag |= T_OBJECT;
convert_type = TC_OBJECT;
}
- t->data_type = convert_type;
- bool init_prop_edit = (t->flag & T_PROP_EDIT) != 0;
+ return convert_type;
+}
+
+void createTransData(bContext *C, TransInfo *t)
+{
+ t->data_len_all = -1;
+
+ Object *ob_armature = NULL;
+ t->data_type = convert_type_get(t, &ob_armature);
+ t->flag |= flags_from_data_type(t->data_type);
- switch (convert_type) {
+ if (ob_armature) {
+ init_TransDataContainers(t, ob_armature, &ob_armature, 1);
+ }
+ else {
+ ViewLayer *view_layer = t->view_layer;
+ Object *ob = OBACT(view_layer);
+ init_TransDataContainers(t, ob, NULL, 0);
+ }
+
+ switch (t->data_type) {
case TC_ACTION_DATA:
+ t->obedit_type = -1;
createTransActionData(C, t);
break;
case TC_POSE:
+ t->options |= CTX_POSE_BONE;
+
+ /* XXX active-layer checking isn't done
+ * as that should probably be checked through context instead. */
createTransPose(t);
- /* Disable PET, its not usable in pose mode yet T32444. */
- init_prop_edit = false;
break;
case TC_ARMATURE_VERTS:
createTransArmatureVerts(t);
break;
case TC_CURSOR_IMAGE:
createTransCursor_image(t);
- init_prop_edit = false;
break;
case TC_CURSOR_VIEW3D:
createTransCursor_view3d(t);
- init_prop_edit = false;
break;
case TC_CURVE_VERTS:
createTransCurveVerts(t);
break;
case TC_GRAPH_EDIT_DATA:
+ t->obedit_type = -1;
createTransGraphEditData(C, t);
break;
case TC_GPENCIL:
@@ -1196,6 +1365,9 @@ void createTransData(bContext *C, TransInfo *t)
createTransLatticeVerts(t);
break;
case TC_MASKING_DATA:
+ if (t->spacetype == SPACE_CLIP) {
+ t->obedit_type = -1;
+ }
createTransMaskingData(C, t);
break;
case TC_MBALL_VERTS:
@@ -1214,13 +1386,25 @@ void createTransData(bContext *C, TransInfo *t)
createTransUVs(C, t);
break;
case TC_NLA_DATA:
+ t->obedit_type = -1;
createTransNlaData(C, t);
- init_prop_edit = false;
break;
case TC_NODE_DATA:
+ t->obedit_type = -1;
createTransNodeData(t);
break;
case TC_OBJECT:
+ t->options |= CTX_OBJECT;
+
+ /* Needed for correct Object.obmat after duplication, see: T62135. */
+ BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context));
+
+ if ((t->settings->transform_flag & SCE_XFORM_DATA_ORIGIN) != 0) {
+ t->options |= CTX_OBMODE_XFORM_OBDATA;
+ }
+ if ((t->settings->transform_flag & SCE_XFORM_SKIP_CHILDREN) != 0) {
+ t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN;
+ }
createTransObject(C, t);
/* Check if we're transforming the camera from the camera */
if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) {
@@ -1229,36 +1413,34 @@ void createTransData(bContext *C, TransInfo *t)
if ((rv3d->persp == RV3D_CAMOB) && v3d->camera) {
/* we could have a flag to easily check an object is being transformed */
if (v3d->camera->id.tag & LIB_TAG_DOIT) {
- t->flag |= T_CAMERA;
+ t->options |= CTX_CAMERA;
}
}
else if (v3d->ob_center && v3d->ob_center->id.tag & LIB_TAG_DOIT) {
- t->flag |= T_CAMERA;
+ t->options |= CTX_CAMERA;
}
}
break;
case TC_OBJECT_TEXSPACE:
createTransTexspace(t);
- init_prop_edit = false;
break;
case TC_PAINT_CURVE_VERTS:
createTransPaintCurveVerts(C, t);
- init_prop_edit = false;
break;
case TC_PARTICLE_VERTS:
createTransParticleVerts(t);
break;
case TC_SCULPT:
createTransSculpt(C, t);
- init_prop_edit = false;
break;
case TC_SEQ_DATA:
+ t->obedit_type = -1;
+ t->num.flag |= NUM_NO_FRACTION; /* sequencer has no use for floating point transform. */
createTransSeqData(t);
- init_prop_edit = false;
break;
case TC_TRACKING_DATA:
+ t->obedit_type = -1;
createTransTrackingData(C, t);
- init_prop_edit = false;
break;
case TC_NONE:
default:
@@ -1270,48 +1452,7 @@ void createTransData(bContext *C, TransInfo *t)
countAndCleanTransDataContainer(t);
- if (t->data_len_all && init_prop_edit) {
- if (convert_type == TC_OBJECT) {
- /* Selected objects are already first, no need to presort. */
- }
- else {
- sort_trans_data_selected_first(t);
- }
-
- if (ELEM(convert_type, TC_ACTION_DATA, TC_GRAPH_EDIT_DATA)) {
- /* Distance has already been set. */
- }
- else if (ELEM(convert_type, TC_MESH_VERTS, TC_MESH_SKIN)) {
- if (t->flag & T_PROP_CONNECTED) {
- /* Already calculated by transform_convert_mesh_connectivity_distance. */
- }
- else {
- set_prop_dist(t, false);
- }
- }
- else if (convert_type == TC_MESH_UV && t->flag & T_PROP_CONNECTED) {
- /* Already calculated by uv_set_connectivity_distance. */
- }
- else if (convert_type == TC_CURVE_VERTS && t->obedit_type == OB_CURVE) {
- set_prop_dist(t, false);
- }
- else {
- set_prop_dist(t, true);
- }
-
- sort_trans_data_dist(t);
- }
- else {
- if (ELEM(t->obedit_type, OB_CURVE)) {
- /* Needed because bezier handles can be partially selected
- * and are still added into transform data. */
- sort_trans_data_selected_first(t);
- }
-
- if (!init_prop_edit) {
- t->flag &= ~T_PROP_EDIT_ALL;
- }
- }
+ init_proportional_edit(t);
BLI_assert((!(t->flag & T_EDIT)) == (!(t->obedit_type != -1)));
}
@@ -1557,9 +1698,11 @@ void recalcData(TransInfo *t)
flushTransNodes(t);
break;
case TC_OBJECT:
- case TC_OBJECT_TEXSPACE:
recalcData_objects(t);
break;
+ case TC_OBJECT_TEXSPACE:
+ recalcData_texspace(t);
+ break;
case TC_PAINT_CURVE_VERTS:
flushTransPaintCurve(t);
break;
diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h
index 466bfd6b226..36a51d57f64 100644
--- a/source/blender/editors/transform/transform_convert.h
+++ b/source/blender/editors/transform/transform_convert.h
@@ -24,9 +24,9 @@
#pragma once
-struct BezTriple;
struct BMEditMesh;
struct BMesh;
+struct BezTriple;
struct FCurve;
struct ListBase;
struct Object;
@@ -49,37 +49,9 @@ void mesh_customdatacorrect_init(TransInfo *t);
/* transform_convert_sequencer.c */
int transform_convert_sequencer_get_snap_bound(TransInfo *t);
-
+void transform_convert_sequencer_channel_clamp(TransInfo *t);
/********************* intern **********************/
-typedef enum eTransConvertType {
- TC_NONE = 0,
- TC_ACTION_DATA,
- TC_POSE,
- TC_ARMATURE_VERTS,
- TC_CURSOR_IMAGE,
- TC_CURSOR_VIEW3D,
- TC_CURVE_VERTS,
- TC_GRAPH_EDIT_DATA,
- TC_GPENCIL,
- TC_LATTICE_VERTS,
- TC_MASKING_DATA,
- TC_MBALL_VERTS,
- TC_MESH_VERTS,
- TC_MESH_EDGES,
- TC_MESH_SKIN,
- TC_MESH_UV,
- TC_NLA_DATA,
- TC_NODE_DATA,
- TC_OBJECT,
- TC_OBJECT_TEXSPACE,
- TC_PAINT_CURVE_VERTS,
- TC_PARTICLE_VERTS,
- TC_SCULPT,
- TC_SEQ_DATA,
- TC_TRACKING_DATA,
-} eTransConvertType;
-
/* transform_convert.c */
bool transform_mode_use_local_origins(const TransInfo *t);
void transform_around_single_fallback_ex(TransInfo *t, int data_len_all);
@@ -215,10 +187,13 @@ void special_aftertrans_update__node(bContext *C, TransInfo *t);
/* transform_convert_object.c */
void createTransObject(bContext *C, TransInfo *t);
-void createTransTexspace(TransInfo *t);
void recalcData_objects(TransInfo *t);
void special_aftertrans_update__object(bContext *C, TransInfo *t);
+/* transform_convert_object_texspace.c */
+void createTransTexspace(TransInfo *t);
+void recalcData_texspace(TransInfo *t);
+
/* transform_convert_paintcurve.c */
void createTransPaintCurveVerts(bContext *C, TransInfo *t);
void flushTransPaintCurve(TransInfo *t);
diff --git a/source/blender/editors/transform/transform_convert_action.c b/source/blender/editors/transform/transform_convert_action.c
index da68f9c13de..8204264e105 100644
--- a/source/blender/editors/transform/transform_convert_action.c
+++ b/source/blender/editors/transform/transform_convert_action.c
@@ -55,7 +55,6 @@ typedef struct tGPFtransdata {
/* -------------------------------------------------------------------- */
/** \name Action Transform Creation
- *
* \{ */
/* fully select selected beztriples, but only include if it's on the right side of cfra */
@@ -553,7 +552,6 @@ void createTransActionData(bContext *C, TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Action Transform Flush
- *
* \{ */
/* This function helps flush transdata written to tempdata into the gp-frames */
diff --git a/source/blender/editors/transform/transform_convert_armature.c b/source/blender/editors/transform/transform_convert_armature.c
index e9b2273b343..a4edf51ffee 100644
--- a/source/blender/editors/transform/transform_convert_armature.c
+++ b/source/blender/editors/transform/transform_convert_armature.c
@@ -444,7 +444,7 @@ static short pose_grab_with_ik(Main *bmain, Object *ob)
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
if (pchan->bone->layer & arm->layer) {
if (pchan->bone->flag & (BONE_SELECTED | BONE_TRANSFORM_MIRROR)) {
- /* Rule: no IK for solitatry (unconnected) bones */
+ /* Rule: no IK for solitary (unconnected) bones. */
for (bonec = pchan->bone->childbase.first; bonec; bonec = bonec->next) {
if (bonec->flag & BONE_CONNECTED) {
break;
@@ -672,7 +672,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
}
}
- /* for axismat we use bone's own transform */
+ /* For `axismtx` we use bone's own transform. */
copy_m3_m4(pmat, pchan->pose_mat);
mul_m3_m3m3(td->axismtx, omat, pmat);
normalize_m3(td->axismtx);
@@ -870,8 +870,6 @@ void createTransPose(TransInfo *t)
t->mode = TFM_RESIZE;
}
}
-
- t->flag |= T_POSE;
}
void createTransArmatureVerts(TransInfo *t)
@@ -1343,7 +1341,7 @@ static void pose_transform_mirror_update(TransInfo *t, TransDataContainer *tc, O
}
BKE_pchan_apply_mat4(pchan, pchan_mtx_final, false);
- /* Set flag to let autokeyframe know to keyframe the mirrred bone. */
+ /* Set flag to let auto key-frame know to key-frame the mirrored bone. */
pchan->bone->flag |= BONE_TRANSFORM_MIRROR;
/* In this case we can do target-less IK grabbing. */
@@ -1354,7 +1352,7 @@ static void pose_transform_mirror_update(TransInfo *t, TransDataContainer *tc, O
}
mul_v3_m4v3(data->grabtarget, flip_mtx, td->loc);
if (pid) {
- /* TODO(germano): Realitve Mirror support */
+ /* TODO(germano): Relative Mirror support. */
}
data->flag |= CONSTRAINT_IK_AUTO;
/* Add a temporary auto IK constraint here, as we will only temporarily active this
diff --git a/source/blender/editors/transform/transform_convert_curve.c b/source/blender/editors/transform/transform_convert_curve.c
index 445253d5446..bef3eca0d9d 100644
--- a/source/blender/editors/transform/transform_convert_curve.c
+++ b/source/blender/editors/transform/transform_convert_curve.c
@@ -40,7 +40,6 @@
/* -------------------------------------------------------------------- */
/** \name Curve/Surfaces Transform Creation
- *
* \{ */
/**
@@ -298,7 +297,7 @@ void createTransCurveVerts(TransInfo *t)
}
if ((bezt_tx & SEL_F1) == 0 && (bezt_tx & SEL_F3) == 0) {
- /* If the middle is selected but the sides arnt, this is needed */
+ /* If the middle is selected but the sides aren't, this is needed. */
if (hdata == NULL) {
/* if the handle was not saved by the previous handle */
hdata = initTransDataCurveHandles(td, bezt);
diff --git a/source/blender/editors/transform/transform_convert_gpencil.c b/source/blender/editors/transform/transform_convert_gpencil.c
index deb18b50a22..244cd552495 100644
--- a/source/blender/editors/transform/transform_convert_gpencil.c
+++ b/source/blender/editors/transform/transform_convert_gpencil.c
@@ -43,7 +43,6 @@
/* -------------------------------------------------------------------- */
/** \name Gpencil Transform Creation
- *
* \{ */
static void createTransGPencil_center_get(bGPDstroke *gps, float r_center[3])
@@ -135,7 +134,7 @@ static void createTransGPencil_curves(bContext *C,
continue;
}
/* Check if the color is editable. */
- if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
continue;
}
/* Check if stroke has an editcurve */
@@ -242,7 +241,7 @@ static void createTransGPencil_curves(bContext *C,
}
/* Calculate difference matrix. */
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
copy_m3_m4(mtx, diff_mat);
pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON);
@@ -263,7 +262,7 @@ static void createTransGPencil_curves(bContext *C,
continue;
}
/* Check if the color is editable. */
- if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
continue;
}
/* Check if stroke has an editcurve */
@@ -436,7 +435,7 @@ static void createTransGPencil_strokes(bContext *C,
continue;
}
/* Check if the color is editable. */
- if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
continue;
}
@@ -507,7 +506,7 @@ static void createTransGPencil_strokes(bContext *C,
}
/* Calculate difference matrix. */
- BKE_gpencil_parent_matrix_get(depsgraph, obact, gpl, diff_mat);
+ BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat);
/* Undo matrix. */
invert_m4_m4(inverse_diff_mat, diff_mat);
@@ -551,7 +550,7 @@ static void createTransGPencil_strokes(bContext *C,
continue;
}
/* check if the color is editable */
- if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) {
+ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) {
continue;
}
/* What we need to include depends on proportional editing settings... */
diff --git a/source/blender/editors/transform/transform_convert_graph.c b/source/blender/editors/transform/transform_convert_graph.c
index 7daa6498334..d57f7fffe0b 100644
--- a/source/blender/editors/transform/transform_convert_graph.c
+++ b/source/blender/editors/transform/transform_convert_graph.c
@@ -49,7 +49,6 @@ typedef struct TransDataGraph {
/* -------------------------------------------------------------------- */
/** \name Graph Editor Transform Creation
- *
* \{ */
/* Helper function for createTransGraphEditData, which is responsible for associating
@@ -632,7 +631,6 @@ void createTransGraphEditData(bContext *C, TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Graph Editor Transform Flush
- *
* \{ */
static bool fcu_test_selected(FCurve *fcu)
diff --git a/source/blender/editors/transform/transform_convert_lattice.c b/source/blender/editors/transform/transform_convert_lattice.c
index e564733266b..20ac7dcb998 100644
--- a/source/blender/editors/transform/transform_convert_lattice.c
+++ b/source/blender/editors/transform/transform_convert_lattice.c
@@ -39,7 +39,6 @@
/* -------------------------------------------------------------------- */
/** \name Curve/Surfaces Transform Creation
- *
* \{ */
void createTransLatticeVerts(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_mask.c b/source/blender/editors/transform/transform_convert_mask.c
index 340f14c6800..d60d34d2c5d 100644
--- a/source/blender/editors/transform/transform_convert_mask.c
+++ b/source/blender/editors/transform/transform_convert_mask.c
@@ -57,7 +57,6 @@ typedef struct TransDataMasking {
/* -------------------------------------------------------------------- */
/** \name Masking Transform Creation
- *
* \{ */
static void MaskHandleToTransData(MaskSplinePoint *point,
@@ -400,7 +399,6 @@ void createTransMaskingData(bContext *C, TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Recalc TransData Masking
- *
* \{ */
static void flushTransMasking(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_mball.c b/source/blender/editors/transform/transform_convert_mball.c
index ce5e4dade5a..6f5c0318054 100644
--- a/source/blender/editors/transform/transform_convert_mball.c
+++ b/source/blender/editors/transform/transform_convert_mball.c
@@ -34,7 +34,6 @@
/* -------------------------------------------------------------------- */
/** \name Meta Elements Transform Creation
- *
* \{ */
void createTransMBallVerts(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_mesh.c b/source/blender/editors/transform/transform_convert_mesh.c
index b3bd6b31879..7270763c4e4 100644
--- a/source/blender/editors/transform/transform_convert_mesh.c
+++ b/source/blender/editors/transform/transform_convert_mesh.c
@@ -52,7 +52,6 @@
/* -------------------------------------------------------------------- */
/** \name Island Creation
- *
* \{ */
void transform_convert_mesh_islands_calc(struct BMEditMesh *em,
@@ -248,32 +247,57 @@ void transform_convert_mesh_islanddata_free(struct TransIslandData *island_data)
/* -------------------------------------------------------------------- */
/** \name Connectivity Distance for Proportional Editing
- *
* \{ */
-static bool bmesh_test_dist_add(BMVert *v,
- BMVert *v_other,
+/* Propagate distance from v1 and v2 to v0. */
+static bool bmesh_test_dist_add(BMVert *v0,
+ BMVert *v1,
+ BMVert *v2,
float *dists,
- const float *dists_prev,
/* optionally track original index */
int *index,
- const int *index_prev,
const float mtx[3][3])
{
- if ((BM_elem_flag_test(v_other, BM_ELEM_SELECT) == 0) &&
- (BM_elem_flag_test(v_other, BM_ELEM_HIDDEN) == 0)) {
- const int i = BM_elem_index_get(v);
- const int i_other = BM_elem_index_get(v_other);
- float vec[3];
- float dist_other;
- sub_v3_v3v3(vec, v->co, v_other->co);
- mul_m3_v3(mtx, vec);
-
- dist_other = dists_prev[i] + len_v3(vec);
- if (dist_other < dists[i_other]) {
- dists[i_other] = dist_other;
+ if ((BM_elem_flag_test(v0, BM_ELEM_SELECT) == 0) &&
+ (BM_elem_flag_test(v0, BM_ELEM_HIDDEN) == 0)) {
+ const int i0 = BM_elem_index_get(v0);
+ const int i1 = BM_elem_index_get(v1);
+
+ BLI_assert(dists[i1] != FLT_MAX);
+ if (dists[i0] <= dists[i1]) {
+ return false;
+ }
+
+ float dist0;
+
+ if (v2) {
+ /* Distance across triangle. */
+ const int i2 = BM_elem_index_get(v2);
+ BLI_assert(dists[i2] != FLT_MAX);
+ if (dists[i0] <= dists[i2]) {
+ return false;
+ }
+
+ float vm0[3], vm1[3], vm2[3];
+ mul_v3_m3v3(vm0, mtx, v0->co);
+ mul_v3_m3v3(vm1, mtx, v1->co);
+ mul_v3_m3v3(vm2, mtx, v2->co);
+
+ dist0 = geodesic_distance_propagate_across_triangle(vm0, vm1, vm2, dists[i1], dists[i2]);
+ }
+ else {
+ /* Distance along edge. */
+ float vec[3];
+ sub_v3_v3v3(vec, v1->co, v0->co);
+ mul_m3_v3(mtx, vec);
+
+ dist0 = dists[i1] + len_v3(vec);
+ }
+
+ if (dist0 < dists[i0]) {
+ dists[i0] = dist0;
if (index != NULL) {
- index[i_other] = index_prev[i];
+ index[i0] = index[i1];
}
return true;
}
@@ -282,6 +306,24 @@ static bool bmesh_test_dist_add(BMVert *v,
return false;
}
+static bool bmesh_test_loose_edge(BMEdge *edge)
+{
+ /* Actual loose edge. */
+ if (edge->l == NULL) {
+ return true;
+ }
+
+ /* Loose edge due to hidden adjacent faces. */
+ BMIter iter;
+ BMFace *face;
+ BM_ITER_ELEM (face, &iter, edge, BM_FACES_OF_EDGE) {
+ if (BM_elem_flag_test(face, BM_ELEM_HIDDEN) == 0) {
+ return false;
+ }
+ }
+ return true;
+}
+
/**
* \param mtx: Measure distance in this space.
* \param dists: Store the closest connected distance to selected vertices.
@@ -292,15 +334,19 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm,
float *dists,
int *index)
{
- BLI_LINKSTACK_DECLARE(queue, BMVert *);
+ BLI_LINKSTACK_DECLARE(queue, BMEdge *);
+
+ /* any BM_ELEM_TAG'd edge is in 'queue_next', so we don't add in twice */
+ const int tag_queued = BM_ELEM_TAG;
+ const int tag_loose = BM_ELEM_TAG_ALT;
- /* any BM_ELEM_TAG'd vertex is in 'queue_next', so we don't add in twice */
- BLI_LINKSTACK_DECLARE(queue_next, BMVert *);
+ BLI_LINKSTACK_DECLARE(queue_next, BMEdge *);
BLI_LINKSTACK_INIT(queue);
BLI_LINKSTACK_INIT(queue_next);
{
+ /* Set indexes and initial distances for selected vertices. */
BMIter viter;
BMVert *v;
int i;
@@ -308,7 +354,6 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm,
BM_ITER_MESH_INDEX (v, &viter, bm, BM_VERTS_OF_MESH, i) {
float dist;
BM_elem_index_set(v, i); /* set_inline */
- BM_elem_flag_disable(v, BM_ELEM_TAG);
if (BM_elem_flag_test(v, BM_ELEM_SELECT) == 0 || BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
dist = FLT_MAX;
@@ -317,7 +362,6 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm,
}
}
else {
- BLI_LINKSTACK_PUSH(queue, v);
dist = 0.0f;
if (index != NULL) {
index[i] = i;
@@ -329,110 +373,106 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm,
bm->elem_index_dirty &= ~BM_VERT;
}
- /* need to be very careful of feedback loops here, store previous dist's to avoid feedback */
- float *dists_prev = MEM_dupallocN(dists);
- int *index_prev = MEM_dupallocN(index); /* may be NULL */
+ {
+ /* Add edges with at least one selected vertex to the queue. */
+ BMIter eiter;
+ BMEdge *e;
+
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
+ BMVert *v1 = e->v1;
+ BMVert *v2 = e->v2;
+ int i1 = BM_elem_index_get(v1);
+ int i2 = BM_elem_index_get(v2);
+
+ if (dists[i1] != FLT_MAX || dists[i2] != FLT_MAX) {
+ BLI_LINKSTACK_PUSH(queue, e);
+ }
+ BM_elem_flag_disable(e, tag_queued);
+ BM_elem_flag_set(e, tag_loose, bmesh_test_loose_edge(e));
+ }
+ }
do {
- BMVert *v;
- LinkNode *lnk;
-
- /* this is correct but slow to do each iteration,
- * instead sync the dist's while clearing BM_ELEM_TAG (below) */
-#if 0
- memcpy(dists_prev, dists, sizeof(float) * bm->totvert);
-#endif
-
- while ((v = BLI_LINKSTACK_POP(queue))) {
- BLI_assert(dists[BM_elem_index_get(v)] != FLT_MAX);
-
- /* connected edge-verts */
- if (v->e != NULL) {
- BMEdge *e_iter, *e_first;
-
- e_iter = e_first = v->e;
-
- /* would normally use BM_EDGES_OF_VERT, but this runs so often,
- * its faster to iterate on the data directly */
- do {
-
- if (BM_elem_flag_test(e_iter, BM_ELEM_HIDDEN) == 0) {
+ BMEdge *e;
+
+ while ((e = BLI_LINKSTACK_POP(queue))) {
+ BMVert *v1 = e->v1;
+ BMVert *v2 = e->v2;
+ int i1 = BM_elem_index_get(v1);
+ int i2 = BM_elem_index_get(v2);
+
+ if (BM_elem_flag_test(e, tag_loose) || (dists[i1] == FLT_MAX || dists[i2] == FLT_MAX)) {
+ /* Propagate along edge from vertex with smallest to largest distance. */
+ if (dists[i1] > dists[i2]) {
+ SWAP(int, i1, i2);
+ SWAP(BMVert *, v1, v2);
+ }
- /* edge distance */
- {
- BMVert *v_other = BM_edge_other_vert(e_iter, v);
- if (bmesh_test_dist_add(v, v_other, dists, dists_prev, index, index_prev, mtx)) {
- if (BM_elem_flag_test(v_other, BM_ELEM_TAG) == 0) {
- BM_elem_flag_enable(v_other, BM_ELEM_TAG);
- BLI_LINKSTACK_PUSH(queue_next, v_other);
- }
- }
+ if (bmesh_test_dist_add(v2, v1, NULL, dists, index, mtx)) {
+ /* Add adjacent loose edges to the queue, or all edges if this is a loose edge.
+ * Other edges are handled by propagation across edges below. */
+ BMEdge *e_other;
+ BMIter eiter;
+ BM_ITER_ELEM (e_other, &eiter, v2, BM_EDGES_OF_VERT) {
+ if (e_other != e && BM_elem_flag_test(e_other, tag_queued) == 0 &&
+ (BM_elem_flag_test(e, tag_loose) || BM_elem_flag_test(e_other, tag_loose))) {
+ BM_elem_flag_enable(e_other, tag_queued);
+ BLI_LINKSTACK_PUSH(queue_next, e_other);
}
+ }
+ }
+ }
- /* face distance */
- if (e_iter->l) {
- BMLoop *l_iter_radial, *l_first_radial;
- /**
- * imaginary edge diagonally across quad.
- * \note This takes advantage of the rules of winding that we
- * know 2 or more of a verts edges wont reference the same face twice.
- * Also, if the edge is hidden, the face will be hidden too.
- */
- l_iter_radial = l_first_radial = e_iter->l;
-
- do {
- if ((l_iter_radial->v == v) && (l_iter_radial->f->len == 4) &&
- (BM_elem_flag_test(l_iter_radial->f, BM_ELEM_HIDDEN) == 0)) {
- BMVert *v_other = l_iter_radial->next->next->v;
- if (bmesh_test_dist_add(v, v_other, dists, dists_prev, index, index_prev, mtx)) {
- if (BM_elem_flag_test(v_other, BM_ELEM_TAG) == 0) {
- BM_elem_flag_enable(v_other, BM_ELEM_TAG);
- BLI_LINKSTACK_PUSH(queue_next, v_other);
- }
- }
+ if (!BM_elem_flag_test(e, tag_loose)) {
+ /* Propagate across edge to vertices in adjacent faces. */
+ BMLoop *l;
+ BMIter liter;
+ BM_ITER_ELEM (l, &liter, e, BM_LOOPS_OF_EDGE) {
+ for (BMLoop *l_other = l->next->next; l_other != l; l_other = l_other->next) {
+ BMVert *v_other = l_other->v;
+ BLI_assert(!ELEM(v_other, v1, v2));
+
+ if (bmesh_test_dist_add(v_other, v1, v2, dists, index, mtx)) {
+ /* Add adjacent edges to the queue, if they are ready to propagate across/along.
+ * Always propagate along loose edges, and for other edges only propagate across
+ * if both vertices have a known distances. */
+ BMEdge *e_other;
+ BMIter eiter;
+ BM_ITER_ELEM (e_other, &eiter, v_other, BM_EDGES_OF_VERT) {
+ if (e_other != e && BM_elem_flag_test(e_other, tag_queued) == 0 &&
+ (BM_elem_flag_test(e_other, tag_loose) ||
+ dists[BM_elem_index_get(BM_edge_other_vert(e_other, v_other))] != FLT_MAX)) {
+ BM_elem_flag_enable(e_other, tag_queued);
+ BLI_LINKSTACK_PUSH(queue_next, e_other);
}
- } while ((l_iter_radial = l_iter_radial->radial_next) != l_first_radial);
+ }
}
}
- } while ((e_iter = BM_DISK_EDGE_NEXT(e_iter, v)) != e_first);
+ }
}
}
- /* clear for the next loop */
- for (lnk = queue_next; lnk; lnk = lnk->next) {
- BMVert *v_link = lnk->link;
- const int i = BM_elem_index_get(v_link);
+ /* Clear for the next loop. */
+ for (LinkNode *lnk = queue_next; lnk; lnk = lnk->next) {
+ BMEdge *e_link = lnk->link;
- BM_elem_flag_disable(v_link, BM_ELEM_TAG);
-
- /* keep in sync, avoid having to do full memcpy each iteration */
- dists_prev[i] = dists[i];
- if (index != NULL) {
- index_prev[i] = index[i];
- }
+ BM_elem_flag_disable(e_link, tag_queued);
}
BLI_LINKSTACK_SWAP(queue, queue_next);
- /* none should be tagged now since 'queue_next' is empty */
- BLI_assert(BM_iter_mesh_count_flag(BM_VERTS_OF_MESH, bm, BM_ELEM_TAG, true) == 0);
-
+ /* None should be tagged now since 'queue_next' is empty. */
+ BLI_assert(BM_iter_mesh_count_flag(BM_EDGES_OF_MESH, bm, tag_queued, true) == 0);
} while (BLI_LINKSTACK_SIZE(queue));
BLI_LINKSTACK_FREE(queue);
BLI_LINKSTACK_FREE(queue_next);
-
- MEM_freeN(dists_prev);
- if (index_prev != NULL) {
- MEM_freeN(index_prev);
- }
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name TransDataMirror Creation
- *
* \{ */
/* Used for both mirror epsilon and TD_MIRROR_EDGE_ */
@@ -575,7 +615,6 @@ void transform_convert_mesh_mirrordata_free(struct TransMirrorData *mirror_data)
/* -------------------------------------------------------------------- */
/** \name Crazy Space
- *
* \{ */
/* Detect CrazySpace [tm].
@@ -681,7 +720,6 @@ void transform_convert_mesh_crazyspace_free(struct TransMeshDataCrazySpace *r_cr
/* -------------------------------------------------------------------- */
/** \name Edit Mesh Verts Transform Creation
- *
* \{ */
static void transdata_center_get(const struct TransIslandData *island_data,
@@ -989,7 +1027,6 @@ void createTransEditVerts(TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name CustomData Layer Correction
- *
* \{ */
struct TransCustomDataMergeGroup {
@@ -1445,7 +1482,7 @@ static void mesh_customdatacorrect_apply_vert(struct TransCustomDataLayer *tcld,
*
* Interpolate from every other loop (not ideal)
* However values will only be taken from loops which overlap other mdisps.
- * */
+ */
const bool update_loop_mdisps = is_moved && do_loop_mdisps && (tcld->cd_loop_mdisp_offset != -1);
if (update_loop_mdisps) {
float(*faces_center)[3] = BLI_array_alloca(faces_center, l_num);
@@ -1539,7 +1576,6 @@ static void mesh_customdatacorrect_restore(struct TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Recalc Mesh Data
- *
* \{ */
static void mesh_apply_to_mirror(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_mesh_edge.c b/source/blender/editors/transform/transform_convert_mesh_edge.c
index 7bdd33192da..bb9296b4b90 100644
--- a/source/blender/editors/transform/transform_convert_mesh_edge.c
+++ b/source/blender/editors/transform/transform_convert_mesh_edge.c
@@ -36,7 +36,6 @@
/* -------------------------------------------------------------------- */
/** \name Edge (for crease) Transform Creation
- *
* \{ */
void createTransEdge(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_mesh_skin.c b/source/blender/editors/transform/transform_convert_mesh_skin.c
index 1807e9adcd1..5dbb1947773 100644
--- a/source/blender/editors/transform/transform_convert_mesh_skin.c
+++ b/source/blender/editors/transform/transform_convert_mesh_skin.c
@@ -45,7 +45,6 @@
/* -------------------------------------------------------------------- */
/** \name Edit Mesh #CD_MVERT_SKIN Transform Creation
- *
* \{ */
static float *mesh_skin_transdata_center(const struct TransIslandData *island_data,
@@ -55,9 +54,7 @@ static float *mesh_skin_transdata_center(const struct TransIslandData *island_da
if (island_data->center && island_index != -1) {
return island_data->center[island_index];
}
- else {
- return eve->co;
- }
+ return eve->co;
}
static void mesh_skin_transdata_create(TransDataBasic *td,
@@ -276,7 +273,6 @@ void createTransMeshSkin(TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Recalc Mesh Data
- *
* \{ */
static void mesh_skin_apply_to_mirror(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_mesh_uv.c b/source/blender/editors/transform/transform_convert_mesh_uv.c
index 52394009d28..a5f90e9ac5f 100644
--- a/source/blender/editors/transform/transform_convert_mesh_uv.c
+++ b/source/blender/editors/transform/transform_convert_mesh_uv.c
@@ -44,7 +44,6 @@
/* -------------------------------------------------------------------- */
/** \name UVs Transform Creation
- *
* \{ */
static void UVsToTransData(const float aspect[2],
@@ -414,7 +413,6 @@ void createTransUVs(bContext *C, TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name UVs Transform Flush
- *
* \{ */
static void flushTransUVs(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_nla.c b/source/blender/editors/transform/transform_convert_nla.c
index adc2d03e2dc..b55005673d9 100644
--- a/source/blender/editors/transform/transform_convert_nla.c
+++ b/source/blender/editors/transform/transform_convert_nla.c
@@ -70,7 +70,6 @@ typedef struct TransDataNla {
/* -------------------------------------------------------------------- */
/** \name NLA Transform Creation
- *
* \{ */
void createTransNlaData(bContext *C, TransInfo *t)
@@ -304,7 +303,7 @@ void recalcData_nla(TransInfo *t)
for (i = 0; i < tc->data_len; i++, tdn++) {
NlaStrip *strip = tdn->strip;
PointerRNA strip_ptr;
- short pExceeded, nExceeded, iter;
+ short iter;
int delta_y1, delta_y2;
/* if this tdn has no handles, that means it is just a dummy that should be skipped */
@@ -358,21 +357,31 @@ void recalcData_nla(TransInfo *t)
*
* this is done as a iterative procedure (done 5 times max for now)
*/
+ NlaStrip *prev = strip->prev;
+ while (prev != NULL && (prev->type & NLASTRIP_TYPE_TRANSITION)) {
+ prev = prev->prev;
+ }
+
+ NlaStrip *next = strip->next;
+ while (next != NULL && (next->type & NLASTRIP_TYPE_TRANSITION)) {
+ next = next->next;
+ }
+
for (iter = 0; iter < 5; iter++) {
- pExceeded = ((strip->prev) && (strip->prev->type != NLASTRIP_TYPE_TRANSITION) &&
- (tdn->h1[0] < strip->prev->end));
- nExceeded = ((strip->next) && (strip->next->type != NLASTRIP_TYPE_TRANSITION) &&
- (tdn->h2[0] > strip->next->start));
+
+ const bool pExceeded = (prev != NULL) && (tdn->h1[0] < prev->end);
+ const bool nExceeded = (next != NULL) && (tdn->h2[0] > next->start);
if ((pExceeded && nExceeded) || (iter == 4)) {
- /* both endpoints exceeded (or iteration ping-pong'd meaning that we need a compromise)
+ /* both endpoints exceeded (or iteration ping-pong'd meaning that we need a
+ * compromise)
* - Simply crop strip to fit within the bounds of the strips bounding it
* - If there were no neighbors, clear the transforms
* (make it default to the strip's current values).
*/
- if (strip->prev && strip->next) {
- tdn->h1[0] = strip->prev->end;
- tdn->h2[0] = strip->next->start;
+ if (prev && next) {
+ tdn->h1[0] = prev->end;
+ tdn->h2[0] = next->start;
}
else {
tdn->h1[0] = strip->start;
@@ -381,14 +390,14 @@ void recalcData_nla(TransInfo *t)
}
else if (nExceeded) {
/* move backwards */
- float offset = tdn->h2[0] - strip->next->start;
+ float offset = tdn->h2[0] - next->start;
tdn->h1[0] -= offset;
tdn->h2[0] -= offset;
}
else if (pExceeded) {
/* more forwards */
- float offset = strip->prev->end - tdn->h1[0];
+ float offset = prev->end - tdn->h1[0];
tdn->h1[0] += offset;
tdn->h2[0] += offset;
@@ -564,7 +573,7 @@ void special_aftertrans_update__nla(bContext *C, TransInfo *UNUSED(t))
/* free temp memory */
ANIM_animdata_freelist(&anim_data);
- /* perform after-transfrom validation */
+ /* Perform after-transform validation. */
ED_nla_postop_refresh(&ac);
}
}
diff --git a/source/blender/editors/transform/transform_convert_node.c b/source/blender/editors/transform/transform_convert_node.c
index 58ff4db324e..506e8a2bd9b 100644
--- a/source/blender/editors/transform/transform_convert_node.c
+++ b/source/blender/editors/transform/transform_convert_node.c
@@ -42,7 +42,6 @@
/* -------------------------------------------------------------------- */
/** \name Node Transform Creation
- *
* \{ */
/* transcribe given node into TransData2D for Transforming */
@@ -145,7 +144,6 @@ void createTransNodeData(TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Node Transform Creation
- *
* \{ */
void flushTransNodes(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_object.c b/source/blender/editors/transform/transform_convert_object.c
index 90ffccfdd7b..b546f1d0b4c 100644
--- a/source/blender/editors/transform/transform_convert_object.c
+++ b/source/blender/editors/transform/transform_convert_object.c
@@ -21,12 +21,8 @@
* \ingroup edtransform
*/
-#include "DNA_mesh_types.h"
-
#include "MEM_guardedalloc.h"
-#include "BLI_compiler_compat.h"
-#include "BLI_ghash.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
@@ -46,11 +42,11 @@
#include "DEG_depsgraph_query.h"
#include "transform.h"
+#include "transform_orientations.h"
#include "transform_snap.h"
/* Own include. */
#include "transform_convert.h"
-#include "transform_orientations.h"
/* -------------------------------------------------------------------- */
/** \name Object Mode Custom Data
@@ -713,66 +709,6 @@ void createTransObject(bContext *C, TransInfo *t)
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Texture Space Transform Creation
- *
- * Instead of transforming the selection, move the 2D/3D cursor.
- *
- * \{ */
-
-void createTransTexspace(TransInfo *t)
-{
- ViewLayer *view_layer = t->view_layer;
- TransData *td;
- Object *ob;
- ID *id;
- short *texflag;
-
- ob = OBACT(view_layer);
-
- if (ob == NULL) { /* Shouldn't logically happen, but still. */
- return;
- }
-
- id = ob->data;
- if (id == NULL || !ELEM(GS(id->name), ID_ME, ID_CU, ID_MB)) {
- BKE_report(t->reports, RPT_ERROR, "Unsupported object type for text-space transform");
- return;
- }
-
- if (BKE_object_obdata_is_libdata(ob)) {
- BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform");
- return;
- }
-
- {
- BLI_assert(t->data_container_len == 1);
- TransDataContainer *tc = t->data_container;
- tc->data_len = 1;
- td = tc->data = MEM_callocN(sizeof(TransData), "TransTexspace");
- td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransTexspace");
- }
-
- td->flag = TD_SELECTED;
- copy_v3_v3(td->center, ob->obmat[3]);
- td->ob = ob;
-
- copy_m3_m4(td->mtx, ob->obmat);
- copy_m3_m4(td->axismtx, ob->obmat);
- normalize_m3(td->axismtx);
- pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON);
-
- if (BKE_object_obdata_texspace_get(ob, &texflag, &td->loc, &td->ext->size)) {
- ob->dtx |= OB_TEXSPACE;
- *texflag &= ~ME_AUTOSPACE;
- }
-
- copy_v3_v3(td->iloc, td->loc);
- copy_v3_v3(td->ext->isize, td->ext->size);
-}
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
/** \name Transform (Auto-Keyframing)
* \{ */
@@ -924,7 +860,6 @@ static bool motionpath_need_update_object(Scene *scene, Object *ob)
/* -------------------------------------------------------------------- */
/** \name Recalc Data object
- *
* \{ */
/* helper for recalcData() - for object transforms, typically in the 3D view */
@@ -962,10 +897,6 @@ void recalcData_objects(TransInfo *t)
* otherwise proxies don't function correctly
*/
DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM);
-
- if (t->flag & T_TEXTURE) {
- DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
- }
}
}
@@ -991,7 +922,7 @@ void recalcData_objects(TransInfo *t)
void special_aftertrans_update__object(bContext *C, TransInfo *t)
{
- BLI_assert(t->flag & (T_OBJECT | T_TEXTURE));
+ BLI_assert(t->options & CTX_OBJECT);
Object *ob;
const bool canceled = (t->state == TRANS_CANCEL);
diff --git a/source/blender/editors/transform/transform_convert_object_texspace.c b/source/blender/editors/transform/transform_convert_object_texspace.c
new file mode 100644
index 00000000000..371a5b48818
--- /dev/null
+++ b/source/blender/editors/transform/transform_convert_object_texspace.c
@@ -0,0 +1,125 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup edtransform
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+
+#include "BKE_animsys.h"
+#include "BKE_context.h"
+#include "BKE_object.h"
+#include "BKE_report.h"
+
+#include "DNA_mesh_types.h"
+
+#include "transform.h"
+#include "transform_snap.h"
+
+/* Own include. */
+#include "transform_convert.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Texture Space Transform Creation
+ *
+ * Instead of transforming the selection, move the 2D/3D cursor.
+ *
+ * \{ */
+
+void createTransTexspace(TransInfo *t)
+{
+ ViewLayer *view_layer = t->view_layer;
+ TransData *td;
+ Object *ob;
+ ID *id;
+ short *texflag;
+
+ ob = OBACT(view_layer);
+
+ if (ob == NULL) { /* Shouldn't logically happen, but still. */
+ return;
+ }
+
+ id = ob->data;
+ if (id == NULL || !ELEM(GS(id->name), ID_ME, ID_CU, ID_MB)) {
+ BKE_report(t->reports, RPT_ERROR, "Unsupported object type for text-space transform");
+ return;
+ }
+
+ if (BKE_object_obdata_is_libdata(ob)) {
+ BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform");
+ return;
+ }
+
+ {
+ BLI_assert(t->data_container_len == 1);
+ TransDataContainer *tc = t->data_container;
+ tc->data_len = 1;
+ td = tc->data = MEM_callocN(sizeof(TransData), "TransTexspace");
+ td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransTexspace");
+ }
+
+ td->flag = TD_SELECTED;
+ copy_v3_v3(td->center, ob->obmat[3]);
+ td->ob = ob;
+
+ copy_m3_m4(td->mtx, ob->obmat);
+ copy_m3_m4(td->axismtx, ob->obmat);
+ normalize_m3(td->axismtx);
+ pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON);
+
+ if (BKE_object_obdata_texspace_get(ob, &texflag, &td->loc, &td->ext->size)) {
+ ob->dtx |= OB_TEXSPACE;
+ *texflag &= ~ME_AUTOSPACE;
+ }
+
+ copy_v3_v3(td->iloc, td->loc);
+ copy_v3_v3(td->ext->isize, td->ext->size);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Recalc Data object
+ * \{ */
+
+/* helper for recalcData() - for object transforms, typically in the 3D view */
+void recalcData_texspace(TransInfo *t)
+{
+
+ if (t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+
+ FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+ TransData *td = tc->data;
+
+ for (int i = 0; i < tc->data_len; i++, td++) {
+ if (td->flag & TD_SKIP) {
+ continue;
+ }
+ DEG_id_tag_update(&td->ob->id, ID_RECALC_GEOMETRY);
+ }
+ }
+}
+
+/** \} */
diff --git a/source/blender/editors/transform/transform_convert_paintcurve.c b/source/blender/editors/transform/transform_convert_paintcurve.c
index 47859896673..560298bd99b 100644
--- a/source/blender/editors/transform/transform_convert_paintcurve.c
+++ b/source/blender/editors/transform/transform_convert_paintcurve.c
@@ -40,7 +40,6 @@ typedef struct TransDataPaintCurve {
/* -------------------------------------------------------------------- */
/** \name Paint Curve Transform Creation
- *
* \{ */
#define PC_IS_ANY_SEL(pc) (((pc)->bez.f1 | (pc)->bez.f2 | (pc)->bez.f3) & SELECT)
@@ -203,7 +202,6 @@ void createTransPaintCurveVerts(bContext *C, TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Paint Curve Transform Flush
- *
* \{ */
void flushTransPaintCurve(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_particle.c b/source/blender/editors/transform/transform_convert_particle.c
index 6366eff2f4c..cb4df28d94b 100644
--- a/source/blender/editors/transform/transform_convert_particle.c
+++ b/source/blender/editors/transform/transform_convert_particle.c
@@ -42,7 +42,6 @@
/* -------------------------------------------------------------------- */
/** \name Particle Edit Transform Creation
- *
* \{ */
void createTransParticleVerts(TransInfo *t)
@@ -193,7 +192,6 @@ void createTransParticleVerts(TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Node Transform Creation
- *
* \{ */
static void flushTransParticles(TransInfo *t)
@@ -251,7 +249,6 @@ static void flushTransParticles(TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Recalc Transform Particles Data
- *
* \{ */
void recalcData_particles(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_sculpt.c b/source/blender/editors/transform/transform_convert_sculpt.c
index 70fec49d77d..d9c29ddbcf7 100644
--- a/source/blender/editors/transform/transform_convert_sculpt.c
+++ b/source/blender/editors/transform/transform_convert_sculpt.c
@@ -36,7 +36,6 @@
/* -------------------------------------------------------------------- */
/** \name Sculpt Transform Creation
- *
* \{ */
void createTransSculpt(bContext *C, TransInfo *t)
@@ -108,7 +107,6 @@ void createTransSculpt(bContext *C, TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name Recalc Data object
- *
* \{ */
void recalcData_sculpt(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c
index ebb0b6823a3..4ab52b78002 100644
--- a/source/blender/editors/transform/transform_convert_sequencer.c
+++ b/source/blender/editors/transform/transform_convert_sequencer.c
@@ -25,6 +25,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BKE_context.h"
@@ -64,11 +65,12 @@ typedef struct TransSeq {
int min;
int max;
bool snap_left;
+ int selection_channel_range_min;
+ int selection_channel_range_max;
} TransSeq;
/* -------------------------------------------------------------------- */
/** \name Sequencer Transform Creation
- *
* \{ */
/* This function applies the rules for transforming a strip so duplicate
@@ -623,6 +625,14 @@ void createTransSeqData(TransInfo *t)
}
}
+ ts->selection_channel_range_min = MAXSEQ + 1;
+ LISTBASE_FOREACH (Sequence *, seq, SEQ_active_seqbase_get(ed)) {
+ if ((seq->flag & SELECT) != 0) {
+ ts->selection_channel_range_min = min_ii(ts->selection_channel_range_min, seq->machine);
+ ts->selection_channel_range_max = max_ii(ts->selection_channel_range_max, seq->machine);
+ }
+ }
+
#undef XXX_DURIAN_ANIM_TX_HACK
}
@@ -630,7 +640,6 @@ void createTransSeqData(TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name UVs Transform Flush
- *
* \{ */
/* commented _only_ because the meta may have animation data which
@@ -834,7 +843,7 @@ void special_aftertrans_update__sequencer(bContext *UNUSED(C), TransInfo *t)
/* 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) {
- /* cant use TFM_TIME_EXTEND
+ /* 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) {
@@ -850,6 +859,21 @@ void special_aftertrans_update__sequencer(bContext *UNUSED(C), TransInfo *t)
}
}
+void transform_convert_sequencer_channel_clamp(TransInfo *t)
+{
+ const TransSeq *ts = (TransSeq *)TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->custom.type.data;
+ const int channel_offset = round_fl_to_int(t->values[1]);
+ const int min_channel_after_transform = ts->selection_channel_range_min + channel_offset;
+ const int max_channel_after_transform = ts->selection_channel_range_max + channel_offset;
+
+ if (max_channel_after_transform > MAXSEQ) {
+ t->values[1] -= max_channel_after_transform - MAXSEQ;
+ }
+ if (min_channel_after_transform < 1) {
+ t->values[1] -= min_channel_after_transform - 1;
+ }
+}
+
int transform_convert_sequencer_get_snap_bound(TransInfo *t)
{
TransSeq *ts = TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->custom.type.data;
diff --git a/source/blender/editors/transform/transform_convert_tracking.c b/source/blender/editors/transform/transform_convert_tracking.c
index c3f48adca68..211dec3c4e8 100644
--- a/source/blender/editors/transform/transform_convert_tracking.c
+++ b/source/blender/editors/transform/transform_convert_tracking.c
@@ -52,6 +52,7 @@ typedef struct TransDataTracking {
float (*smarkers)[2];
int markersnr;
+ int framenr;
MovieTrackingMarker *markers;
/* marker transformation from curves editor */
@@ -70,12 +71,27 @@ enum transDataTracking_Mode {
/* -------------------------------------------------------------------- */
/** \name Clip Editor Motion Tracking Transform Creation
- *
* \{ */
-static void markerToTransDataInit(TransData *td,
- TransData2D *td2d,
- TransDataTracking *tdt,
+typedef struct TransformInitContext {
+ SpaceClip *space_clip;
+
+ TransInfo *t;
+ TransDataContainer *tc;
+
+ /* NOTE: These pointers will be `nullptr` during counting step.
+ * This means, that the transformation data initialization functions are to increment
+ * `tc->data_len` instead of filling in the transformation data when these pointers are
+ * `nullptr`. For simplicity, check the `current.td` against `nullptr`.
+ * Do not `tc->data_len` when filling in the transformation data. */
+ struct {
+ TransData *td;
+ TransData2D *td2d;
+ TransDataTracking *tdt;
+ } current;
+} TransformInitContext;
+
+static void markerToTransDataInit(TransformInitContext *init_context,
MovieTrackingTrack *track,
MovieTrackingMarker *marker,
int area,
@@ -84,8 +100,19 @@ static void markerToTransDataInit(TransData *td,
const float off[2],
const float aspect[2])
{
+ TransData *td = init_context->current.td;
+ TransData2D *td2d = init_context->current.td2d;
+ TransDataTracking *tdt = init_context->current.tdt;
+
+ if (td == NULL) {
+ init_context->tc->data_len++;
+ return;
+ }
+
int anchor = area == TRACK_AREA_POINT && off;
+ tdt->flag = marker->flag;
+ tdt->framenr = marker->framenr;
tdt->mode = transDataTracking_ModeTracks;
if (anchor) {
@@ -143,23 +170,20 @@ static void markerToTransDataInit(TransData *td,
unit_m3(td->mtx);
unit_m3(td->smtx);
+
+ init_context->current.td++;
+ init_context->current.td2d++;
+ init_context->current.tdt++;
}
-static void trackToTransData(const int framenr,
- TransData *td,
- TransData2D *td2d,
- TransDataTracking *tdt,
+static void trackToTransData(TransformInitContext *init_context,
+ const int framenr,
MovieTrackingTrack *track,
const float aspect[2])
{
MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr);
- tdt->flag = marker->flag;
- marker->flag &= ~(MARKER_DISABLED | MARKER_TRACKED);
-
- markerToTransDataInit(td++,
- td2d++,
- tdt++,
+ markerToTransDataInit(init_context,
track,
marker,
TRACK_AREA_POINT,
@@ -170,16 +194,14 @@ static void trackToTransData(const int framenr,
if (track->flag & SELECT) {
markerToTransDataInit(
- td++, td2d++, tdt++, track, marker, TRACK_AREA_POINT, marker->pos, NULL, NULL, aspect);
+ init_context, track, marker, TRACK_AREA_POINT, marker->pos, NULL, NULL, aspect);
}
if (track->pat_flag & SELECT) {
int a;
for (a = 0; a < 4; a++) {
- markerToTransDataInit(td++,
- td2d++,
- tdt++,
+ markerToTransDataInit(init_context,
track,
marker,
TRACK_AREA_PAT,
@@ -191,9 +213,7 @@ static void trackToTransData(const int framenr,
}
if (track->search_flag & SELECT) {
- markerToTransDataInit(td++,
- td2d++,
- tdt++,
+ markerToTransDataInit(init_context,
track,
marker,
TRACK_AREA_SEARCH,
@@ -202,9 +222,7 @@ static void trackToTransData(const int framenr,
NULL,
aspect);
- markerToTransDataInit(td++,
- td2d++,
- tdt++,
+ markerToTransDataInit(init_context,
track,
marker,
TRACK_AREA_SEARCH,
@@ -213,15 +231,43 @@ static void trackToTransData(const int framenr,
NULL,
aspect);
}
+
+ if (init_context->current.td != NULL) {
+ marker->flag &= ~(MARKER_DISABLED | MARKER_TRACKED);
+ }
}
-static void planeMarkerToTransDataInit(TransData *td,
- TransData2D *td2d,
- TransDataTracking *tdt,
+static void trackToTransDataIfNeeded(TransformInitContext *init_context,
+ const int framenr,
+ MovieTrackingTrack *track,
+ const float aspect[2])
+{
+ if (!TRACK_VIEW_SELECTED(init_context->space_clip, track)) {
+ return;
+ }
+ if (track->flag & TRACK_LOCKED) {
+ return;
+ }
+ trackToTransData(init_context, framenr, track, aspect);
+}
+
+static void planeMarkerToTransDataInit(TransformInitContext *init_context,
MovieTrackingPlaneTrack *plane_track,
+ MovieTrackingPlaneMarker *plane_marker,
float corner[2],
const float aspect[2])
{
+ TransData *td = init_context->current.td;
+ TransData2D *td2d = init_context->current.td2d;
+ TransDataTracking *tdt = init_context->current.tdt;
+
+ if (td == NULL) {
+ init_context->tc->data_len++;
+ return;
+ }
+
+ tdt->flag = plane_marker->flag;
+ tdt->framenr = plane_marker->framenr;
tdt->mode = transDataTracking_ModePlaneTracks;
tdt->plane_track = plane_track;
@@ -247,24 +293,38 @@ static void planeMarkerToTransDataInit(TransData *td,
unit_m3(td->mtx);
unit_m3(td->smtx);
+
+ init_context->current.td++;
+ init_context->current.td2d++;
+ init_context->current.tdt++;
}
-static void planeTrackToTransData(const int framenr,
- TransData *td,
- TransData2D *td2d,
- TransDataTracking *tdt,
+static void planeTrackToTransData(TransformInitContext *init_context,
+ const int framenr,
MovieTrackingPlaneTrack *plane_track,
const float aspect[2])
{
MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_ensure(plane_track, framenr);
- int i;
- tdt->flag = plane_marker->flag;
- plane_marker->flag &= ~PLANE_MARKER_TRACKED;
+ for (int i = 0; i < 4; i++) {
+ planeMarkerToTransDataInit(
+ init_context, plane_track, plane_marker, plane_marker->corners[i], aspect);
+ }
- for (i = 0; i < 4; i++) {
- planeMarkerToTransDataInit(td++, td2d++, tdt++, plane_track, plane_marker->corners[i], aspect);
+ if (init_context->current.td != NULL) {
+ plane_marker->flag &= ~PLANE_MARKER_TRACKED;
+ }
+}
+
+static void planeTrackToTransDataIfNeeded(TransformInitContext *init_context,
+ const int framenr,
+ MovieTrackingPlaneTrack *plane_track,
+ const float aspect[2])
+{
+ if (!PLANE_TRACK_VIEW_SELECTED(plane_track)) {
+ return;
}
+ planeTrackToTransData(init_context, framenr, plane_track, aspect);
}
static void transDataTrackingFree(TransInfo *UNUSED(t),
@@ -284,101 +344,53 @@ static void transDataTrackingFree(TransInfo *UNUSED(t),
static void createTransTrackingTracksData(bContext *C, TransInfo *t)
{
- TransData *td;
- TransData2D *td2d;
- SpaceClip *sc = CTX_wm_space_clip(C);
- MovieClip *clip = ED_space_clip_get_clip(sc);
- ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
- ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(&clip->tracking);
- MovieTrackingTrack *track;
- MovieTrackingPlaneTrack *plane_track;
- TransDataTracking *tdt;
- int framenr = ED_space_clip_get_clip_frame_number(sc);
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+ MovieClip *clip = ED_space_clip_get_clip(space_clip);
+ const ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
+ const ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(&clip->tracking);
+ const int framenr = ED_space_clip_get_clip_frame_number(space_clip);
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
- /* count */
- tc->data_len = 0;
-
- track = tracksbase->first;
- while (track) {
- if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
- tc->data_len++; /* offset */
+ TransformInitContext init_context = {NULL};
+ init_context.space_clip = space_clip;
+ init_context.t = t;
+ init_context.tc = tc;
- if (track->flag & SELECT) {
- tc->data_len++;
- }
+ /* Count required transformation data. */
- if (track->pat_flag & SELECT) {
- tc->data_len += 4;
- }
-
- if (track->search_flag & SELECT) {
- tc->data_len += 2;
- }
- }
+ tc->data_len = 0;
- track = track->next;
+ LISTBASE_FOREACH (MovieTrackingTrack *, track, tracksbase) {
+ trackToTransDataIfNeeded(&init_context, framenr, track, t->aspect);
}
- for (plane_track = plane_tracks_base->first; plane_track; plane_track = plane_track->next) {
- if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
- tc->data_len += 4;
- }
+ LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, plane_tracks_base) {
+ planeTrackToTransDataIfNeeded(&init_context, framenr, plane_track, t->aspect);
}
if (tc->data_len == 0) {
return;
}
- td = tc->data = MEM_callocN(tc->data_len * sizeof(TransData), "TransTracking TransData");
- td2d = tc->data_2d = MEM_callocN(tc->data_len * sizeof(TransData2D),
- "TransTracking TransData2D");
- tdt = tc->custom.type.data = MEM_callocN(tc->data_len * sizeof(TransDataTracking),
- "TransTracking TransDataTracking");
-
+ tc->data = MEM_callocN(tc->data_len * sizeof(TransData), "TransTracking TransData");
+ tc->data_2d = MEM_callocN(tc->data_len * sizeof(TransData2D), "TransTracking TransData2D");
+ tc->custom.type.data = MEM_callocN(tc->data_len * sizeof(TransDataTracking),
+ "TransTracking TransDataTracking");
tc->custom.type.free_cb = transDataTrackingFree;
- /* create actual data */
- track = tracksbase->first;
- while (track) {
- if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
- trackToTransData(framenr, td, td2d, tdt, track, t->aspect);
+ init_context.current.td = tc->data;
+ init_context.current.td2d = tc->data_2d;
+ init_context.current.tdt = tc->custom.type.data;
- /* offset */
- td++;
- td2d++;
- tdt++;
+ /* Create actual transformation data. */
- if (track->flag & SELECT) {
- td++;
- td2d++;
- tdt++;
- }
-
- if (track->pat_flag & SELECT) {
- td += 4;
- td2d += 4;
- tdt += 4;
- }
-
- if (track->search_flag & SELECT) {
- td += 2;
- td2d += 2;
- tdt += 2;
- }
- }
-
- track = track->next;
+ LISTBASE_FOREACH (MovieTrackingTrack *, track, tracksbase) {
+ trackToTransDataIfNeeded(&init_context, framenr, track, t->aspect);
}
- for (plane_track = plane_tracks_base->first; plane_track; plane_track = plane_track->next) {
- if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
- planeTrackToTransData(framenr, td, td2d, tdt, plane_track, t->aspect);
- td += 4;
- td2d += 4;
- tdt += 4;
- }
+ LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, plane_tracks_base) {
+ planeTrackToTransDataIfNeeded(&init_context, framenr, plane_track, t->aspect);
}
}
@@ -554,23 +566,22 @@ void createTransTrackingData(bContext *C, TransInfo *t)
/* -------------------------------------------------------------------- */
/** \name recalc Motion Tracking TransData
- *
* \{ */
static void cancelTransTracking(TransInfo *t)
{
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
- SpaceClip *sc = t->area->spacedata.first;
- int i, framenr = ED_space_clip_get_clip_frame_number(sc);
TransDataTracking *tdt_array = tc->custom.type.data;
- i = 0;
+ int i = 0;
while (i < tc->data_len) {
TransDataTracking *tdt = &tdt_array[i];
if (tdt->mode == transDataTracking_ModeTracks) {
MovieTrackingTrack *track = tdt->track;
- MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
+ MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, tdt->framenr);
+
+ BLI_assert(marker != NULL);
marker->flag = tdt->flag;
@@ -606,7 +617,10 @@ static void cancelTransTracking(TransInfo *t)
}
else if (tdt->mode == transDataTracking_ModePlaneTracks) {
MovieTrackingPlaneTrack *plane_track = tdt->plane_track;
- MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, framenr);
+ MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get_exact(plane_track,
+ tdt->framenr);
+
+ BLI_assert(plane_marker != NULL);
plane_marker->flag = tdt->flag;
i += 3;
diff --git a/source/blender/editors/transform/transform_data.h b/source/blender/editors/transform/transform_data.h
index b59197fcd39..5b01433c96b 100644
--- a/source/blender/editors/transform/transform_data.h
+++ b/source/blender/editors/transform/transform_data.h
@@ -122,11 +122,11 @@ typedef struct TransDataCurveHandleFlags {
typedef struct TransData {
TRANSDATABASIC;
- /** Distance needed to affect element (for Proportionnal Editing). */
+ /** Distance needed to affect element (for Proportional Editing). */
float dist;
- /** Distance to the nearest element (for Proportionnal Editing). */
+ /** Distance to the nearest element (for Proportional Editing). */
float rdist;
- /** Factor of the transformation (for Proportionnal Editing). */
+ /** Factor of the transformation (for Proportional Editing). */
float factor;
/** Value pointer for special transforms. */
float *val;
@@ -141,11 +141,11 @@ typedef struct TransData {
struct Object *ob;
/** For objects/bones, the first constraint in its constraint stack. */
struct bConstraint *con;
- /** For objects, poses. 1 single malloc per TransInfo! */
+ /** For objects, poses. 1 single allocation per #TransInfo! */
TransDataExtension *ext;
/** for curves, stores handle flags for modification/cancel. */
TransDataCurveHandleFlags *hdata;
- /** If set, copy of Object or PoseChannel protection. */
+ /** If set, copy of Object or #bPoseChannel protection. */
short protectflag;
} TransData;
diff --git a/source/blender/editors/transform/transform_draw_cursors.c b/source/blender/editors/transform/transform_draw_cursors.c
index 84fc45e2b45..ead8eae0997 100644
--- a/source/blender/editors/transform/transform_draw_cursors.c
+++ b/source/blender/editors/transform/transform_draw_cursors.c
@@ -45,99 +45,45 @@ enum eArrowDirection {
RIGHT,
};
-struct ArrowDims {
- int offset;
- int length;
- int size;
-};
-
-#define POS_INDEX 0
-/* NOTE: this --^ is a bit hackish, but simplifies GPUVertFormat usage among functions
- * private to this file - merwin
- */
+#define ARROW_WIDTH (2.0f * U.pixelsize)
+#define DASH_WIDTH (1.0f)
+#define DASH_LENGTH (8.0f * DASH_WIDTH * U.pixelsize)
-static void drawArrow(enum eArrowDirection dir, const struct ArrowDims *arrow_dims)
+static void drawArrow(const uint pos_id, const enum eArrowDirection dir)
{
- int offset = arrow_dims->offset;
- int length = arrow_dims->length;
- int size = arrow_dims->size;
-
- immBegin(GPU_PRIM_LINES, 6);
-
- switch (dir) {
- case LEFT:
- offset = -offset;
- length = -length;
- size = -size;
- ATTR_FALLTHROUGH;
- case RIGHT:
- immVertex2f(POS_INDEX, offset, 0);
- immVertex2f(POS_INDEX, offset + length, 0);
- immVertex2f(POS_INDEX, offset + length, 0);
- immVertex2f(POS_INDEX, offset + length - size, -size);
- immVertex2f(POS_INDEX, offset + length, 0);
- immVertex2f(POS_INDEX, offset + length - size, size);
- break;
-
- case DOWN:
- offset = -offset;
- length = -length;
- size = -size;
- ATTR_FALLTHROUGH;
- case UP:
- immVertex2f(POS_INDEX, 0, offset);
- immVertex2f(POS_INDEX, 0, offset + length);
- immVertex2f(POS_INDEX, 0, offset + length);
- immVertex2f(POS_INDEX, -size, offset + length - size);
- immVertex2f(POS_INDEX, 0, offset + length);
- immVertex2f(POS_INDEX, size, offset + length - size);
- break;
+ int offset = 5.0f * UI_DPI_FAC;
+ int length = (6.0f * UI_DPI_FAC) + (4.0f * U.pixelsize);
+ int size = (3.0f * UI_DPI_FAC) + (2.0f * U.pixelsize);
+
+ /* To line up the arrow point nicely, one end has to be extended by half its width. But
+ * being on a 45 degree angle, Pythagoras says a movement of sqrt(2)/2 * (line width /2) */
+ float adjust = (M_SQRT2 * ARROW_WIDTH / 4.0f);
+
+ if (ELEM(dir, LEFT, DOWN)) {
+ offset = -offset;
+ length = -length;
+ size = -size;
+ adjust = -adjust;
}
- immEnd();
-}
-
-static void drawArrowHead(enum eArrowDirection dir, int size)
-{
- immBegin(GPU_PRIM_LINES, 4);
-
- switch (dir) {
- case LEFT:
- size = -size;
- ATTR_FALLTHROUGH;
- case RIGHT:
- immVertex2f(POS_INDEX, 0, 0);
- immVertex2f(POS_INDEX, -size, -size);
- immVertex2f(POS_INDEX, 0, 0);
- immVertex2f(POS_INDEX, -size, size);
- break;
+ immBegin(GPU_PRIM_LINES, 6);
- case DOWN:
- size = -size;
- ATTR_FALLTHROUGH;
- case UP:
- immVertex2f(POS_INDEX, 0, 0);
- immVertex2f(POS_INDEX, -size, -size);
- immVertex2f(POS_INDEX, 0, 0);
- immVertex2f(POS_INDEX, size, -size);
- break;
+ if (ELEM(dir, LEFT, RIGHT)) {
+ immVertex2f(pos_id, offset, 0);
+ immVertex2f(pos_id, offset + length, 0);
+ immVertex2f(pos_id, offset + length + adjust, adjust);
+ immVertex2f(pos_id, offset + length - size, -size);
+ immVertex2f(pos_id, offset + length, 0);
+ immVertex2f(pos_id, offset + length - size, size);
}
-
- immEnd();
-}
-
-static void drawArc(float angle_start, float angle_end, int segments, float size)
-{
- float delta = (angle_end - angle_start) / segments;
- float angle;
- int a;
-
- immBegin(GPU_PRIM_LINE_STRIP, segments + 1);
-
- for (angle = angle_start, a = 0; a < segments; angle += delta, a++) {
- immVertex2f(POS_INDEX, cosf(angle) * size, sinf(angle) * size);
+ else {
+ immVertex2f(pos_id, 0, offset);
+ immVertex2f(pos_id, 0, offset + length);
+ immVertex2f(pos_id, adjust, offset + length + adjust);
+ immVertex2f(pos_id, -size, offset + length - size);
+ immVertex2f(pos_id, 0, offset + length);
+ immVertex2f(pos_id, size, offset + length - size);
}
- immVertex2f(POS_INDEX, cosf(angle_end) * size, sinf(angle_end) * size);
immEnd();
}
@@ -149,11 +95,7 @@ static void drawArc(float angle_start, float angle_end, int segments, float size
bool transform_draw_cursor_poll(bContext *C)
{
ARegion *region = CTX_wm_region(C);
-
- if (region && region->regiontype == RGN_TYPE_WINDOW) {
- return 1;
- }
- return 0;
+ return (region && region->regiontype == RGN_TYPE_WINDOW) ? 1 : 0;
}
/**
@@ -164,181 +106,117 @@ void transform_draw_cursor_draw(bContext *UNUSED(C), int x, int y, void *customd
{
TransInfo *t = (TransInfo *)customdata;
- if (t->helpline != HLP_NONE) {
- struct ArrowDims arrow_dims = {
- .offset = 5 * UI_DPI_FAC,
- .length = 10 * UI_DPI_FAC,
- .size = 5 * UI_DPI_FAC,
- };
-
- float cent[2];
- const float mval[3] = {x, y, 0.0f};
- float tmval[2] = {
- (float)t->mval[0],
- (float)t->mval[1],
- };
-
- projectFloatViewEx(t, t->center_global, cent, V3D_PROJ_TEST_CLIP_ZERO);
- /* Offset the values for the area region. */
- const float offset[2] = {
- t->region->winrct.xmin,
- t->region->winrct.ymin,
- };
-
- for (int i = 0; i < 2; i++) {
- cent[i] += offset[i];
- tmval[i] += offset[i];
- }
-
- GPU_line_smooth(true);
- GPU_blend(GPU_BLEND_ALPHA);
-
- GPU_matrix_push();
-
- /* Dashed lines first. */
- if (ELEM(t->helpline, HLP_SPRING, HLP_ANGLE)) {
- const uint shdr_pos = GPU_vertformat_attr_add(
- immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-
- UNUSED_VARS_NDEBUG(shdr_pos); /* silence warning */
- BLI_assert(shdr_pos == POS_INDEX);
+ if (t->helpline == HLP_NONE) {
+ return;
+ }
- GPU_line_width(1.0f);
+ float cent[2];
+ const float mval[3] = {x, y, 0.0f};
+ float tmval[2] = {
+ (float)t->mval[0],
+ (float)t->mval[1],
+ };
+
+ projectFloatViewEx(t, t->center_global, cent, V3D_PROJ_TEST_CLIP_ZERO);
+ /* Offset the values for the area region. */
+ const float offset[2] = {
+ t->region->winrct.xmin,
+ t->region->winrct.ymin,
+ };
+
+ for (int i = 0; i < 2; i++) {
+ cent[i] += offset[i];
+ tmval[i] += offset[i];
+ }
- immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR);
+ float viewport_size[4];
+ GPU_viewport_size_get_f(viewport_size);
+
+ GPU_line_smooth(true);
+ GPU_blend(GPU_BLEND_ALPHA);
+ const uint pos_id = GPU_vertformat_attr_add(
+ immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
+ /* Dashed lines first. */
+ if (ELEM(t->helpline, HLP_SPRING, HLP_ANGLE)) {
+ GPU_line_width(DASH_WIDTH);
+ immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR);
+ immUniform2f("viewport_size", viewport_size[2], viewport_size[3]);
+ immUniform1i("colors_len", 0); /* "simple" mode */
+ immUniformThemeColor3(TH_VIEW_OVERLAY);
+ immUniform1f("dash_width", DASH_LENGTH);
+ immUniform1f("dash_factor", 0.5f);
+ immBegin(GPU_PRIM_LINES, 2);
+ immVertex2fv(pos_id, cent);
+ immVertex2f(pos_id, tmval[0], tmval[1]);
+ immEnd();
+ immUnbindProgram();
+ }
- float viewport_size[4];
- GPU_viewport_size_get_f(viewport_size);
- immUniform2f("viewport_size", viewport_size[2], viewport_size[3]);
+ /* And now, solid lines. */
- immUniform1i("colors_len", 0); /* "simple" mode */
- immUniformThemeColor3(TH_VIEW_OVERLAY);
- immUniform1f("dash_width", 6.0f * UI_DPI_FAC);
- immUniform1f("dash_factor", 0.5f);
+ immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_UNIFORM_COLOR);
+ immUniformThemeColor3(TH_VIEW_OVERLAY);
+ immUniform2fv("viewportSize", &viewport_size[2]);
+ immUniform1f("lineWidth", ARROW_WIDTH);
- immBegin(GPU_PRIM_LINES, 2);
- immVertex2fv(POS_INDEX, cent);
- immVertex2f(POS_INDEX, tmval[0], tmval[1]);
- immEnd();
+ GPU_matrix_push();
+ GPU_matrix_translate_3fv(mval);
- immUnbindProgram();
+ switch (t->helpline) {
+ case HLP_SPRING:
+ GPU_matrix_rotate_axis(-RAD2DEGF(atan2f(cent[0] - tmval[0], cent[1] - tmval[1])), 'Z');
+ drawArrow(pos_id, UP);
+ drawArrow(pos_id, DOWN);
+ break;
+ case HLP_HARROW:
+ drawArrow(pos_id, RIGHT);
+ drawArrow(pos_id, LEFT);
+ break;
+ case HLP_VARROW:
+ drawArrow(pos_id, UP);
+ drawArrow(pos_id, DOWN);
+ break;
+ case HLP_CARROW: {
+ /* Draw arrow based on direction defined by custom-points. */
+ const int *data = t->mouse.data;
+ const float angle = -atan2f(data[2] - data[0], data[3] - data[1]);
+ GPU_matrix_rotate_axis(RAD2DEGF(angle), 'Z');
+ drawArrow(pos_id, UP);
+ drawArrow(pos_id, DOWN);
+ break;
}
-
- /* And now, solid lines. */
- uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- UNUSED_VARS_NDEBUG(pos); /* silence warning */
- BLI_assert(pos == POS_INDEX);
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-
- switch (t->helpline) {
- case HLP_SPRING:
- immUniformThemeColor3(TH_VIEW_OVERLAY);
-
- GPU_matrix_translate_3fv(mval);
- GPU_matrix_rotate_axis(-RAD2DEGF(atan2f(cent[0] - tmval[0], cent[1] - tmval[1])), 'Z');
-
- GPU_line_width(3.0f);
- drawArrow(UP, &arrow_dims);
- drawArrow(DOWN, &arrow_dims);
- break;
- case HLP_HARROW:
- immUniformThemeColor3(TH_VIEW_OVERLAY);
- GPU_matrix_translate_3fv(mval);
-
- GPU_line_width(3.0f);
- drawArrow(RIGHT, &arrow_dims);
- drawArrow(LEFT, &arrow_dims);
- break;
- case HLP_VARROW:
- immUniformThemeColor3(TH_VIEW_OVERLAY);
-
- GPU_matrix_translate_3fv(mval);
-
- GPU_line_width(3.0f);
- drawArrow(UP, &arrow_dims);
- drawArrow(DOWN, &arrow_dims);
- break;
- case HLP_CARROW: {
- /* Draw arrow based on direction defined by custom-points. */
- immUniformThemeColor3(TH_VIEW_OVERLAY);
-
- GPU_matrix_translate_3fv(mval);
-
- GPU_line_width(3.0f);
-
- const int *data = t->mouse.data;
- const float dx = data[2] - data[0], dy = data[3] - data[1];
- const float angle = -atan2f(dx, dy);
-
- GPU_matrix_push();
-
- GPU_matrix_rotate_axis(RAD2DEGF(angle), 'Z');
-
- drawArrow(UP, &arrow_dims);
- drawArrow(DOWN, &arrow_dims);
-
- GPU_matrix_pop();
- break;
- }
- case HLP_ANGLE: {
- float dx = tmval[0] - cent[0], dy = tmval[1] - cent[1];
- float angle = atan2f(dy, dx);
- float dist = hypotf(dx, dy);
- float delta_angle = min_ff(15.0f / (dist / UI_DPI_FAC), (float)M_PI / 4.0f);
- float spacing_angle = min_ff(5.0f / (dist / UI_DPI_FAC), (float)M_PI / 12.0f);
-
- immUniformThemeColor3(TH_VIEW_OVERLAY);
-
- GPU_matrix_translate_3f(cent[0] - tmval[0] + mval[0], cent[1] - tmval[1] + mval[1], 0);
-
- GPU_line_width(3.0f);
- drawArc(angle - delta_angle, angle - spacing_angle, 10, dist);
- drawArc(angle + spacing_angle, angle + delta_angle, 10, dist);
-
- GPU_matrix_push();
-
- GPU_matrix_translate_3f(
- cosf(angle - delta_angle) * dist, sinf(angle - delta_angle) * dist, 0);
- GPU_matrix_rotate_axis(RAD2DEGF(angle - delta_angle), 'Z');
-
- drawArrowHead(DOWN, arrow_dims.size);
-
- GPU_matrix_pop();
-
- GPU_matrix_translate_3f(
- cosf(angle + delta_angle) * dist, sinf(angle + delta_angle) * dist, 0);
- GPU_matrix_rotate_axis(RAD2DEGF(angle + delta_angle), 'Z');
-
- drawArrowHead(UP, arrow_dims.size);
- break;
- }
- case HLP_TRACKBALL: {
- uchar col[3], col2[3];
- UI_GetThemeColor3ubv(TH_GRID, col);
-
- GPU_matrix_translate_3fv(mval);
-
- GPU_line_width(3.0f);
-
- UI_make_axis_color(col, col2, 'X');
- immUniformColor3ubv(col2);
-
- drawArrow(RIGHT, &arrow_dims);
- drawArrow(LEFT, &arrow_dims);
-
- UI_make_axis_color(col, col2, 'Y');
- immUniformColor3ubv(col2);
-
- drawArrow(UP, &arrow_dims);
- drawArrow(DOWN, &arrow_dims);
- break;
- }
+ case HLP_ANGLE: {
+ GPU_matrix_push();
+ float angle = atan2f(tmval[1] - cent[1], tmval[0] - cent[0]);
+ GPU_matrix_translate_3f(cosf(angle), sinf(angle), 0);
+ GPU_matrix_rotate_axis(RAD2DEGF(angle), 'Z');
+ drawArrow(pos_id, DOWN);
+ GPU_matrix_pop();
+ GPU_matrix_translate_3f(cosf(angle), sinf(angle), 0);
+ GPU_matrix_rotate_axis(RAD2DEGF(angle), 'Z');
+ drawArrow(pos_id, UP);
+ break;
}
-
- immUnbindProgram();
- GPU_matrix_pop();
-
- GPU_line_smooth(false);
- GPU_blend(GPU_BLEND_NONE);
+ case HLP_TRACKBALL: {
+ uchar col[3], col2[3];
+ UI_GetThemeColor3ubv(TH_GRID, col);
+ UI_make_axis_color(col, col2, 'X');
+ immUniformColor3ubv(col2);
+ drawArrow(pos_id, RIGHT);
+ drawArrow(pos_id, LEFT);
+ UI_make_axis_color(col, col2, 'Y');
+ immUniformColor3ubv(col2);
+ drawArrow(pos_id, UP);
+ drawArrow(pos_id, DOWN);
+ break;
+ }
+ case HLP_NONE:
+ break;
}
+
+ GPU_matrix_pop();
+ immUnbindProgram();
+ GPU_line_smooth(false);
+ GPU_blend(GPU_BLEND_NONE);
}
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index b092b3e3e0b..6fca49495e9 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -26,7 +26,6 @@
#include "MEM_guardedalloc.h"
#include "DNA_gpencil_types.h"
-#include "DNA_mesh_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -44,6 +43,7 @@
#include "BKE_context.h"
#include "BKE_layer.h"
#include "BKE_mask.h"
+#include "BKE_modifier.h"
#include "BKE_paint.h"
#include "ED_clip.h"
@@ -119,79 +119,6 @@ void resetTransRestrictions(TransInfo *t)
t->flag &= ~T_ALL_RESTRICTIONS;
}
-void initTransDataContainers_FromObjectData(TransInfo *t,
- Object *obact,
- Object **objects,
- uint objects_len)
-{
- const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT;
- const short object_type = obact ? obact->type : -1;
-
- if ((object_mode & OB_MODE_EDIT) || (t->options & CTX_GPENCIL_STROKES) ||
- ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) {
- if (t->data_container) {
- MEM_freeN(t->data_container);
- }
-
- bool free_objects = false;
- if (objects == NULL) {
- objects = BKE_view_layer_array_from_objects_in_mode(
- t->view_layer,
- (t->spacetype == SPACE_VIEW3D) ? t->view : NULL,
- &objects_len,
- {
- .object_mode = object_mode,
- .no_dup_data = true,
- });
- free_objects = true;
- }
-
- t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__);
- t->data_container_len = objects_len;
-
- for (int i = 0; i < objects_len; i++) {
- TransDataContainer *tc = &t->data_container[i];
- if (((t->flag & T_NO_MIRROR) == 0) && ((t->options & CTX_NO_MIRROR) == 0) &&
- (objects[i]->type == OB_MESH)) {
- tc->use_mirror_axis_x = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_X) != 0;
- tc->use_mirror_axis_y = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Y) != 0;
- tc->use_mirror_axis_z = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Z) != 0;
- }
-
- if (object_mode & OB_MODE_EDIT) {
- tc->obedit = objects[i];
- /* Check needed for UV's */
- if ((t->flag & T_2D_EDIT) == 0) {
- tc->use_local_mat = true;
- }
- }
- else if (object_mode & OB_MODE_POSE) {
- tc->poseobj = objects[i];
- tc->use_local_mat = true;
- }
- else if (t->options & CTX_GPENCIL_STROKES) {
- tc->use_local_mat = true;
- }
-
- if (tc->use_local_mat) {
- BLI_assert((t->flag & T_2D_EDIT) == 0);
- copy_m4_m4(tc->mat, objects[i]->obmat);
- copy_m3_m4(tc->mat3, tc->mat);
- /* for non-invertible scale matrices, invert_m4_m4_fallback()
- * can still provide a valid pivot */
- invert_m4_m4_fallback(tc->imat, tc->mat);
- invert_m3_m3(tc->imat3, tc->mat3);
- normalize_m3_m3(tc->mat3_unit, tc->mat3);
- }
- /* Otherwise leave as zero. */
- }
-
- if (free_objects) {
- MEM_freeN(objects);
- }
- }
-}
-
/**
* Setup internal data, mouse, vectors
*
@@ -225,7 +152,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
t->flag = 0;
- if (obact && !(t->options & (CTX_CURSOR | CTX_TEXTURE)) &&
+ if (obact && !(t->options & (CTX_CURSOR | CTX_TEXTURE_SPACE)) &&
ELEM(object_mode, OB_MODE_EDIT, OB_MODE_EDIT_GPENCIL)) {
t->obedit_type = obact->type;
}
@@ -272,7 +199,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
/* Crease needs edge flag */
if (ELEM(t->mode, TFM_CREASE, TFM_BWEIGHT)) {
- t->options |= CTX_EDGE;
+ t->options |= CTX_EDGE_DATA;
}
t->remove_on_cancel = false;
@@ -1110,7 +1037,7 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3])
return true;
}
}
- else if (t->flag & T_POSE) {
+ else if (t->options & CTX_POSE_BONE) {
ViewLayer *view_layer = t->view_layer;
Object *ob = OBACT(view_layer);
if (ED_object_calc_active_center_for_posemode(ob, select_only, r_center)) {
@@ -1184,20 +1111,13 @@ void calculateCenter(TransInfo *t)
}
calculateCenterLocal(t, t->center_global);
- /* avoid calculating again */
- {
- TransCenterData *cd = &t->center_cache[t->around];
- copy_v3_v3(cd->global, t->center_global);
- cd->is_set = true;
- }
-
calculateCenter2D(t);
- /* for panning from cameraview */
- if ((t->flag & T_OBJECT) && (t->flag & T_OVERRIDE_CENTER) == 0) {
+ /* For panning from the camera-view. */
+ if ((t->options & CTX_OBJECT) && (t->flag & T_OVERRIDE_CENTER) == 0) {
if (t->spacetype == SPACE_VIEW3D && t->region && t->region->regiontype == RGN_TYPE_WINDOW) {
- if (t->flag & T_CAMERA) {
+ if (t->options & CTX_CAMERA) {
float axis[3];
/* persinv is nasty, use viewinv instead, always right */
copy_v3_v3(axis, t->viewinv[2]);
@@ -1237,23 +1157,6 @@ void calculateCenter(TransInfo *t)
}
}
-BLI_STATIC_ASSERT(ARRAY_SIZE(((TransInfo *)NULL)->center_cache) == (V3D_AROUND_ACTIVE + 1),
- "test size");
-
-/**
- * Lazy initialize transform center data, when we need to access center values from other types.
- */
-const TransCenterData *transformCenter_from_type(TransInfo *t, int around)
-{
- BLI_assert(around <= V3D_AROUND_ACTIVE);
- TransCenterData *cd = &t->center_cache[around];
- if (cd->is_set == false) {
- calculateCenter_FromAround(t, around, cd->global);
- cd->is_set = true;
- }
- return cd;
-}
-
void calculatePropRatio(TransInfo *t)
{
int i;
@@ -1416,7 +1319,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot)
if (td->ext->rotOrder == ROT_MODE_QUAT) {
float quat[4];
- /* calculate the total rotatation */
+ /* Calculate the total rotation. */
quat_to_mat3(obmat, td->ext->iquat);
if (use_drot) {
mul_m3_m3m3(obmat, dmat, obmat);
@@ -1437,7 +1340,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot)
else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
float axis[3], angle;
- /* calculate the total rotatation */
+ /* Calculate the total rotation. */
axis_angle_to_mat3(obmat, td->ext->irotAxis, td->ext->irotAngle);
if (use_drot) {
mul_m3_m3m3(obmat, dmat, obmat);
@@ -1459,7 +1362,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot)
else {
float eul[3];
- /* calculate the total rotatation */
+ /* Calculate the total rotation. */
eulO_to_mat3(obmat, td->ext->irot, td->ext->rotOrder);
if (use_drot) {
mul_m3_m3m3(obmat, dmat, obmat);
@@ -1478,3 +1381,23 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot)
copy_v3_v3(td->ext->rot, eul);
}
}
+
+Object *transform_object_deform_pose_armature_get(const TransInfo *t, Object *ob)
+{
+ if (!(ob->mode & OB_MODE_ALL_WEIGHT_PAINT)) {
+ return NULL;
+ }
+ /* Important that ob_armature can be set even when its not selected T23412.
+ * Lines below just check is also visible. */
+ Object *ob_armature = BKE_modifiers_is_deformed_by_armature(ob);
+ if (ob_armature && ob_armature->mode & OB_MODE_POSE) {
+ Base *base_arm = BKE_view_layer_base_find(t->view_layer, ob_armature);
+ if (base_arm) {
+ View3D *v3d = t->view;
+ if (BASE_VISIBLE(v3d, base_arm)) {
+ return ob_armature;
+ }
+ }
+ }
+ return NULL;
+}
diff --git a/source/blender/editors/transform/transform_gizmo_3d.c b/source/blender/editors/transform/transform_gizmo_3d.c
index 9c08159cf07..27df29afd8d 100644
--- a/source/blender/editors/transform/transform_gizmo_3d.c
+++ b/source/blender/editors/transform/transform_gizmo_3d.c
@@ -532,7 +532,7 @@ static void protectflag_to_drawflags_ebone(RegionView3D *rv3d, const EditBone *e
/* could move into BLI_math 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 axies, most importantly Z is the axis of rotation */
+ /* X/Y are arbitrary axes, most importantly Z is the axis of rotation. */
float cross_vec[3];
float quat[4];
@@ -704,7 +704,7 @@ int ED_transform_calc_gizmo_stats(const bContext *C,
if (BKE_gpencil_layer_is_editable(gpl) && (gpl->actframe != NULL)) {
/* calculate difference matrix */
- BKE_gpencil_parent_matrix_get(depsgraph, ob, gpl, diff_mat);
+ 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 */
diff --git a/source/blender/editors/transform/transform_gizmo_extrude_3d.c b/source/blender/editors/transform/transform_gizmo_extrude_3d.c
index ae7cda0bd03..63c8efdd475 100644
--- a/source/blender/editors/transform/transform_gizmo_extrude_3d.c
+++ b/source/blender/editors/transform/transform_gizmo_extrude_3d.c
@@ -151,7 +151,7 @@ static void gizmo_mesh_extrude_setup(const bContext *C, wmGizmoGroup *gzgroup)
{
const char *op_idname = NULL;
- /* grease pencil does not use obedit */
+ /* Grease pencil does not use `obedit`. */
/* GPXX: Remove if OB_MODE_EDIT_GPENCIL is merged with OB_MODE_EDIT */
const Object *obact = CTX_data_active_object(C);
if (obact->type == OB_GPENCIL) {
diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index 70ef5fcde7a..bfeb96d18c4 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -499,28 +499,4 @@ void applyMouseInput(TransInfo *t, MouseInput *mi, const int mval[2], float outp
}
}
-eRedrawFlag handleMouseInput(TransInfo *t, MouseInput *mi, const wmEvent *event)
-{
- eRedrawFlag redraw = TREDRAW_NOTHING;
-
- switch (event->type) {
- case EVT_LEFTSHIFTKEY:
- case EVT_RIGHTSHIFTKEY:
- if (event->val == KM_PRESS) {
- t->modifiers |= MOD_PRECISION;
- /* shift is modifier for higher precision transforn */
- mi->precision = 1;
- redraw = TREDRAW_HARD;
- }
- else if (event->val == KM_RELEASE) {
- t->modifiers &= ~MOD_PRECISION;
- mi->precision = 0;
- redraw = TREDRAW_HARD;
- }
- break;
- }
-
- return redraw;
-}
-
/** \} */
diff --git a/source/blender/editors/transform/transform_mode.c b/source/blender/editors/transform/transform_mode.c
index a4d999b868d..9e6e4d8807e 100644
--- a/source/blender/editors/transform/transform_mode.c
+++ b/source/blender/editors/transform/transform_mode.c
@@ -70,7 +70,7 @@ int transform_mode_really_used(bContext *C, int mode)
bool transdata_check_local_center(TransInfo *t, short around)
{
return ((around == V3D_AROUND_LOCAL_ORIGINS) &&
- ((t->flag & (T_OBJECT | T_POSE)) ||
+ ((t->options & (CTX_OBJECT | CTX_POSE_BONE)) ||
/* implicit: (t->flag & T_EDIT) */
(ELEM(t->obedit_type, OB_MESH, OB_CURVE, OB_MBALL, OB_ARMATURE, OB_GPENCIL)) ||
(t->spacetype == SPACE_GRAPH) ||
@@ -513,7 +513,7 @@ void constraintSizeLim(TransInfo *t, TransData *td)
return;
}
- /* extrace scale from matrix and apply back sign */
+ /* Extract scale from matrix and apply back sign. */
mat4_to_size(td->ext->size, cob.matrix);
mul_v3_v3(td->ext->size, size_sign);
}
@@ -629,7 +629,7 @@ void ElementRotation_ex(TransInfo *t,
* matrix (and inverse). That is not all though. Once the proper translation
* has been computed, it has to be converted back into the bone's space.
*/
- else if (t->flag & T_POSE) {
+ else if (t->options & CTX_POSE_BONE) {
/* Extract and invert armature object matrix */
if ((td->flag & TD_NO_LOC) == 0) {
@@ -705,7 +705,7 @@ void ElementRotation_ex(TransInfo *t,
mul_m3_m3m3(totmat, mat, td->ext->r_mtx);
mul_m3_m3m3(smat, td->ext->r_smtx, totmat);
- /* calculate the total rotatation in eulers */
+ /* Calculate the total rotation in eulers. */
copy_v3_v3(eul, td->ext->irot);
eulO_to_mat3(eulmat, eul, td->ext->rotOrder);
@@ -778,7 +778,7 @@ void ElementRotation_ex(TransInfo *t,
mul_m3_m3m3(totmat, mat, td->mtx);
mul_m3_m3m3(smat, td->smtx, totmat);
- /* calculate the total rotatation in eulers */
+ /* Calculate the total rotation in eulers. */
add_v3_v3v3(eul, td->ext->irot, td->ext->drot); /* correct for delta rot */
eulO_to_mat3(obmat, eul, td->ext->rotOrder);
/* mat = transform, obmat = object rotation */
@@ -902,7 +902,7 @@ static void TransMat3ToSize(const float mat[3][3], const float smat[3][3], float
mat3_to_rot_size(rmat, size, mat);
- /* first tried with dotproduct... but the sign flip is crucial */
+ /* First tried with dot-product... but the sign flip is crucial. */
if (dot_v3v3(rmat[0], smat[0]) < 0.0f) {
size[0] = -size[0];
}
@@ -1026,7 +1026,7 @@ void ElementResize(TransInfo *t, TransDataContainer *tc, TransData *td, float ma
mul_v3_fl(vec, td->factor);
}
- if (t->flag & (T_OBJECT | T_POSE)) {
+ if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) {
mul_m3_v3(td->smtx, vec);
}
diff --git a/source/blender/editors/transform/transform_mode_align.c b/source/blender/editors/transform/transform_mode_align.c
index f16021914f1..5bc2aa68443 100644
--- a/source/blender/editors/transform/transform_mode_align.c
+++ b/source/blender/editors/transform/transform_mode_align.c
@@ -55,7 +55,7 @@ static void applyAlign(TransInfo *t, const int UNUSED(mval[2]))
}
/* around local centers */
- if (t->flag & (T_OBJECT | T_POSE)) {
+ if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) {
copy_v3_v3(tc->center_local, td->center);
}
else {
diff --git a/source/blender/editors/transform/transform_mode_edge_seq_slide.c b/source/blender/editors/transform/transform_mode_edge_seq_slide.c
index 7ccfd0149bd..4330d5e79be 100644
--- a/source/blender/editors/transform/transform_mode_edge_seq_slide.c
+++ b/source/blender/editors/transform/transform_mode_edge_seq_slide.c
@@ -35,10 +35,12 @@
#include "WM_types.h"
#include "UI_interface.h"
+#include "UI_view2d.h"
#include "BLT_translation.h"
#include "transform.h"
+#include "transform_convert.h"
#include "transform_mode.h"
#include "transform_snap.h"
@@ -49,9 +51,9 @@
static eRedrawFlag seq_slide_handleEvent(struct TransInfo *t, const wmEvent *event)
{
BLI_assert(t->mode == TFM_SEQ_SLIDE);
- wmKeyMapItem *kmi = t->custom.mode.data;
+ const wmKeyMapItem *kmi = t->custom.mode.data;
if (kmi && event->type == kmi->type && event->val == kmi->val) {
- /* Allows the 'Expand to fit' effect to be enabled as a toogle. */
+ /* Allows the "Expand to Fit" effect to be enabled as a toggle. */
t->flag ^= T_ALT_TRANSFORM;
return TREDRAW_HARD;
}
@@ -73,7 +75,7 @@ static void headerSeqSlide(TransInfo *t, const float val[2], char str[UI_MAX_DRA
ofs += BLI_snprintf(
str + ofs, UI_MAX_DRAW_STR - ofs, TIP_("Sequence Slide: %s%s, ("), &tvec[0], t->con.text);
- wmKeyMapItem *kmi = t->custom.mode.data;
+ const wmKeyMapItem *kmi = t->custom.mode.data;
if (kmi) {
ofs += WM_keymap_item_to_string(kmi, false, str + ofs, UI_MAX_DRAW_STR - ofs);
}
@@ -106,6 +108,7 @@ static void applySeqSlide(TransInfo *t, const int mval[2])
float values_final[3] = {0.0f};
snapSequenceBounds(t, mval);
+ transform_convert_sequencer_channel_clamp(t);
if (applyNumInput(&t->num, values_final)) {
if (t->con.mode & CON_APPLY) {
if (t->con.mode & CON_AXIS0) {
@@ -158,7 +161,7 @@ void initSeqSlide(TransInfo *t)
if (t->keymap) {
/* Workaround to use the same key as the modal keymap. */
- t->custom.mode.data = WM_modalkeymap_find_propvalue(t->keymap, TFM_MODAL_TRANSLATE);
+ t->custom.mode.data = (void *)WM_modalkeymap_find_propvalue(t->keymap, TFM_MODAL_TRANSLATE);
}
}
/** \} */
diff --git a/source/blender/editors/transform/transform_mode_edge_slide.c b/source/blender/editors/transform/transform_mode_edge_slide.c
index dae3fe6f7b4..dff9ded6b29 100644
--- a/source/blender/editors/transform/transform_mode_edge_slide.c
+++ b/source/blender/editors/transform/transform_mode_edge_slide.c
@@ -143,7 +143,7 @@ static BMEdge *get_other_edge(BMVert *v, BMEdge *e)
return NULL;
}
-/* interpoaltes along a line made up of 2 segments (used for edge slide) */
+/* 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)
{
diff --git a/source/blender/editors/transform/transform_mode_mirror.c b/source/blender/editors/transform/transform_mode_mirror.c
index 3aa99975fda..9891af8b9a4 100644
--- a/source/blender/editors/transform/transform_mode_mirror.c
+++ b/source/blender/editors/transform/transform_mode_mirror.c
@@ -152,7 +152,7 @@ static void ElementMirror(TransInfo *t, TransDataContainer *tc, TransData *td, i
sub_v3_v3(vec, td->center);
}
- if (t->flag & (T_OBJECT | T_POSE)) {
+ if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) {
mul_m3_v3(td->smtx, vec);
}
diff --git a/source/blender/editors/transform/transform_mode_resize.c b/source/blender/editors/transform/transform_mode_resize.c
index 62a4fbd6f04..4d0bb7fbe9c 100644
--- a/source/blender/editors/transform/transform_mode_resize.c
+++ b/source/blender/editors/transform/transform_mode_resize.c
@@ -132,7 +132,7 @@ static void applyResize(TransInfo *t, const int UNUSED(mval[2]))
}
}
- /* evil hack - redo resize if cliping needed */
+ /* Evil hack - redo resize if clipping needed. */
if (t->flag & T_CLIP_UV && clipUVTransform(t, t->values_final, 1)) {
size_to_mat3(mat, t->values_final);
diff --git a/source/blender/editors/transform/transform_mode_shrink_fatten.c b/source/blender/editors/transform/transform_mode_shrink_fatten.c
index ba5b1229f3e..6e497d85417 100644
--- a/source/blender/editors/transform/transform_mode_shrink_fatten.c
+++ b/source/blender/editors/transform/transform_mode_shrink_fatten.c
@@ -49,9 +49,9 @@
static eRedrawFlag shrinkfatten_handleEvent(struct TransInfo *t, const wmEvent *event)
{
BLI_assert(t->mode == TFM_SHRINKFATTEN);
- wmKeyMapItem *kmi = t->custom.mode.data;
+ const wmKeyMapItem *kmi = t->custom.mode.data;
if (kmi && event->type == kmi->type && event->val == kmi->val) {
- /* Allows the 'Even Thickness' effect to be enabled as a toogle. */
+ /* Allows the "Even Thickness" effect to be enabled as a toggle. */
t->flag ^= T_ALT_TRANSFORM;
return TREDRAW_HARD;
}
@@ -84,8 +84,13 @@ static void applyShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
else {
/* default header print */
if (unit != NULL) {
- ofs += BKE_unit_value_as_string(
- str + ofs, sizeof(str) - ofs, distance * unit->scale_length, 4, B_UNIT_LENGTH, unit, true);
+ ofs += BKE_unit_value_as_string(str + ofs,
+ sizeof(str) - ofs,
+ distance * unit->scale_length,
+ 4,
+ B_UNIT_LENGTH,
+ unit,
+ true);
}
else {
ofs += BLI_snprintf(str + ofs, sizeof(str) - ofs, "%.4f", distance);
@@ -97,7 +102,7 @@ static void applyShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
}
ofs += BLI_strncpy_rlen(str + ofs, ", (", sizeof(str) - ofs);
- wmKeyMapItem *kmi = t->custom.mode.data;
+ const wmKeyMapItem *kmi = t->custom.mode.data;
if (kmi) {
ofs += WM_keymap_item_to_string(kmi, false, str + ofs, sizeof(str) - ofs);
}
@@ -157,7 +162,7 @@ void initShrinkFatten(TransInfo *t)
if (t->keymap) {
/* Workaround to use the same key as the modal keymap. */
- t->custom.mode.data = WM_modalkeymap_find_propvalue(t->keymap, TFM_MODAL_RESIZE);
+ t->custom.mode.data = (void *)WM_modalkeymap_find_propvalue(t->keymap, TFM_MODAL_RESIZE);
}
}
}
diff --git a/source/blender/editors/transform/transform_mode_translate.c b/source/blender/editors/transform/transform_mode_translate.c
index 851e0feb5f5..41fc6ee0aaf 100644
--- a/source/blender/editors/transform/transform_mode_translate.c
+++ b/source/blender/editors/transform/transform_mode_translate.c
@@ -294,7 +294,7 @@ static void applyTranslationValue(TransInfo *t, const float vec[3])
const float *original_normal;
/* In pose mode, we want to align normals with Y axis of bones... */
- if (t->flag & T_POSE) {
+ if (t->options & CTX_POSE_BONE) {
original_normal = td->axismtx[1];
}
else {
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 15c215c426d..01c00247a7a 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -411,7 +411,7 @@ static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event)
int exit_code;
TransInfo *t = op->customdata;
- const enum TfmMode mode_prev = t->mode;
+ const eTfmMode mode_prev = t->mode;
#if defined(WITH_INPUT_NDOF) && 0
/* Stable 2D mouse coords map to different 3D coords while the 3D mouse is active
@@ -432,7 +432,7 @@ static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event)
* since we're not reading from 'td->center' in this case. see: T40241 */
if (t->tsnap.target == SCE_SNAP_TARGET_ACTIVE) {
/* In camera view, tsnap callback is not set
- * (see initSnappingMode() in transfrom_snap.c, and T40348). */
+ * (see #initSnappingMode() in transform_snap.c, and T40348). */
if (t->tsnap.targetSnap && ((t->tsnap.status & TARGET_INIT) == 0)) {
t->tsnap.targetSnap(t);
}
@@ -444,7 +444,7 @@ static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event)
if ((exit_code & OPERATOR_RUNNING_MODAL) == 0) {
transformops_exit(C, op);
- exit_code &= ~OPERATOR_PASS_THROUGH; /* preventively remove passthrough */
+ exit_code &= ~OPERATOR_PASS_THROUGH; /* Preventively remove pass-through. */
}
else {
if (mode_prev != t->mode) {
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index 3b39f4d06ad..1470d3b7059 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -521,23 +521,19 @@ short ED_transform_calc_orientation_from_type_ex(const bContext *C,
const int pivot_point)
{
switch (orientation_type) {
- case V3D_ORIENT_GLOBAL: {
- unit_m3(r_mat);
- return V3D_ORIENT_GLOBAL;
- }
case V3D_ORIENT_GIMBAL: {
if (ob && gimbal_axis(ob, r_mat)) {
- return V3D_ORIENT_GIMBAL;
+ break;
}
- /* if not gimbal, fall through to normal */
+ /* If not gimbal, fall through to normal. */
ATTR_FALLTHROUGH;
}
case V3D_ORIENT_NORMAL: {
if (obedit || (ob && ob->mode & OB_MODE_POSE)) {
ED_getTransformOrientationMatrix(C, ob, obedit, pivot_point, r_mat);
- return V3D_ORIENT_NORMAL;
+ break;
}
- /* no break we define 'normal' as 'local' in Object mode */
+ /* No break we define 'normal' as 'local' in Object mode. */
ATTR_FALLTHROUGH;
}
case V3D_ORIENT_LOCAL: {
@@ -552,10 +548,14 @@ short ED_transform_calc_orientation_from_type_ex(const bContext *C,
else {
transform_orientations_create_from_axis(r_mat, UNPACK3(ob->obmat));
}
- return V3D_ORIENT_LOCAL;
+ break;
}
+ /* If not local, fall through to global. */
+ ATTR_FALLTHROUGH;
+ }
+ case V3D_ORIENT_GLOBAL: {
unit_m3(r_mat);
- return V3D_ORIENT_GLOBAL;
+ break;
}
case V3D_ORIENT_VIEW: {
if (rv3d != NULL) {
@@ -565,11 +565,11 @@ short ED_transform_calc_orientation_from_type_ex(const bContext *C,
else {
unit_m3(r_mat);
}
- return V3D_ORIENT_VIEW;
+ break;
}
case V3D_ORIENT_CURSOR: {
BKE_scene_cursor_rot_to_mat3(&scene->cursor, r_mat);
- return V3D_ORIENT_CURSOR;
+ break;
}
case V3D_ORIENT_CUSTOM_MATRIX: {
/* Do nothing. */;
@@ -609,6 +609,12 @@ short transform_orientation_matrix_get(
orientation_index_custom = orientation - V3D_ORIENT_CUSTOM;
orientation = V3D_ORIENT_CUSTOM;
}
+ else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) {
+ Object *ob_armature = transform_object_deform_pose_armature_get(t, ob);
+ if (ob_armature) {
+ ob = ob_armature;
+ }
+ }
if ((t->spacetype == SPACE_VIEW3D) && t->region && (t->region->regiontype == RGN_TYPE_WINDOW)) {
rv3d = t->region->regiondata;
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index c19dd4598cf..d0f91802fff 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -235,7 +235,7 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
}
else if (t->spacetype == SPACE_IMAGE) {
if (validSnap(t)) {
- /* This will not draw, and Im nor sure why - campbell */
+ /* This will not draw, and I'm nor sure why - campbell */
/* TODO: see 2.7x for non-working code */
}
}
@@ -299,83 +299,93 @@ eRedrawFlag handleSnapping(TransInfo *t, const wmEvent *event)
void applyProject(TransInfo *t)
{
- /* XXX FLICKER IN OBJECT MODE */
- if ((t->tsnap.project) && activeSnap(t) && (t->flag & T_NO_PROJECT) == 0) {
- float tvec[3];
- int i;
+ if (!t->tsnap.project) {
+ return;
+ }
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- TransData *td = tc->data;
- for (i = 0; i < tc->data_len; i++, td++) {
- float iloc[3], loc[3], no[3];
- float mval_fl[2];
- if (td->flag & TD_SKIP) {
- continue;
- }
+ if (!activeSnap(t) || (t->flag & T_NO_PROJECT)) {
+ return;
+ }
- if ((t->flag & T_PROP_EDIT) && (td->factor == 0.0f)) {
- continue;
- }
+ if (doForceIncrementSnap(t)) {
+ return;
+ }
- copy_v3_v3(iloc, td->loc);
- if (tc->use_local_mat) {
- mul_m4_v3(tc->mat, iloc);
- }
- else if (t->flag & T_OBJECT) {
- BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob);
- copy_v3_v3(iloc, td->ob->obmat[3]);
- }
+ float tvec[3];
+ int i;
- if (ED_view3d_project_float_global(t->region, iloc, mval_fl, V3D_PROJ_TEST_NOP) ==
- V3D_PROJ_RET_OK) {
- if (ED_transform_snap_object_project_view3d(
- t->tsnap.object_context,
- t->depsgraph,
- SCE_SNAP_MODE_FACE,
- &(const struct SnapObjectParams){
- .snap_select = t->tsnap.modeSelect,
- .use_object_edit_cage = (t->flag & T_EDIT) != 0,
- .use_occlusion_test = false,
- .use_backface_culling = t->tsnap.use_backface_culling,
- },
- mval_fl,
- NULL,
- 0,
- loc,
- no)) {
+ /* XXX FLICKER IN OBJECT MODE */
+ FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+ TransData *td = tc->data;
+ for (i = 0; i < tc->data_len; i++, td++) {
+ float iloc[3], loc[3], no[3];
+ float mval_fl[2];
+ if (td->flag & TD_SKIP) {
+ continue;
+ }
+
+ if ((t->flag & T_PROP_EDIT) && (td->factor == 0.0f)) {
+ continue;
+ }
+
+ copy_v3_v3(iloc, td->loc);
+ if (tc->use_local_mat) {
+ mul_m4_v3(tc->mat, iloc);
+ }
+ else if (t->options & CTX_OBJECT) {
+ BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob);
+ copy_v3_v3(iloc, td->ob->obmat[3]);
+ }
+
+ if (ED_view3d_project_float_global(t->region, iloc, mval_fl, V3D_PROJ_TEST_NOP) ==
+ V3D_PROJ_RET_OK) {
+ if (ED_transform_snap_object_project_view3d(
+ t->tsnap.object_context,
+ t->depsgraph,
+ SCE_SNAP_MODE_FACE,
+ &(const struct SnapObjectParams){
+ .snap_select = t->tsnap.modeSelect,
+ .use_object_edit_cage = (t->flag & T_EDIT) != 0,
+ .use_occlusion_test = false,
+ .use_backface_culling = t->tsnap.use_backface_culling,
+ },
+ mval_fl,
+ NULL,
+ 0,
+ loc,
+ no)) {
#if 0
if (tc->use_local_mat) {
mul_m4_v3(tc->imat, loc);
}
#endif
- sub_v3_v3v3(tvec, loc, iloc);
+ sub_v3_v3v3(tvec, loc, iloc);
- mul_m3_v3(td->smtx, tvec);
+ mul_m3_v3(td->smtx, tvec);
- add_v3_v3(td->loc, tvec);
+ add_v3_v3(td->loc, tvec);
- if (t->tsnap.align && (t->flag & T_OBJECT)) {
- /* handle alignment as well */
- const float *original_normal;
- float mat[3][3];
+ if (t->tsnap.align && (t->options & CTX_OBJECT)) {
+ /* handle alignment as well */
+ const float *original_normal;
+ float mat[3][3];
- /* In pose mode, we want to align normals with Y axis of bones... */
- original_normal = td->axismtx[2];
+ /* In pose mode, we want to align normals with Y axis of bones... */
+ original_normal = td->axismtx[2];
- rotation_between_vecs_to_mat3(mat, original_normal, no);
+ rotation_between_vecs_to_mat3(mat, original_normal, no);
- transform_data_ext_rotate(td, mat, true);
+ transform_data_ext_rotate(td, mat, true);
- /* TODO support constraints for rotation too? see ElementRotation */
- }
+ /* TODO support constraints for rotation too? see ElementRotation */
}
}
+ }
-#if 0 /* TODO: sipport this? */
+#if 0 /* TODO: support this? */
constraintTransLim(t, td);
#endif
- }
}
}
}
@@ -412,7 +422,7 @@ void applyGridAbsolute(TransInfo *t)
if (tc->use_local_mat) {
mul_m4_v3(tc->mat, iloc);
}
- else if (t->flag & T_OBJECT) {
+ else if (t->options & CTX_OBJECT) {
BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob);
copy_v3_v3(iloc, td->ob->obmat[3]);
}
@@ -451,7 +461,7 @@ void applySnapping(TransInfo *t, float *vec)
activeSnap(t)) {
double current = PIL_check_seconds_timer();
- /* Time base quirky code to go around findnearest slowness */
+ /* Time base quirky code to go around find-nearest slowness. */
/* TODO: add exception for object mode, no need to slow it down then. */
if (current - t->tsnap.last >= 0.01) {
t->tsnap.calcSnap(t, vec);
@@ -561,7 +571,8 @@ static void initSnappingMode(TransInfo *t)
}
}
- if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && (t->flag & T_CAMERA) == 0) {
+ if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) &&
+ (t->options & CTX_CAMERA) == 0) {
/* Only 3D view or UV. */
/* Not with camera selected in camera view. */
@@ -916,6 +927,64 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
/** \name Target
* \{ */
+static void snap_target_median_impl(TransInfo *t, float r_median[3])
+{
+ int i_accum = 0;
+
+ zero_v3(r_median);
+
+ FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+ TransData *td = tc->data;
+ int i;
+ float v[3];
+ zero_v3(v);
+
+ for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) {
+ add_v3_v3(v, td->center);
+ }
+
+ if (i == 0) {
+ /* Is this possible? */
+ continue;
+ }
+
+ mul_v3_fl(v, 1.0 / i);
+
+ if (tc->use_local_mat) {
+ mul_m4_v3(tc->mat, v);
+ }
+
+ add_v3_v3(r_median, v);
+ i_accum++;
+ }
+
+ mul_v3_fl(r_median, 1.0 / i_accum);
+
+ // TargetSnapOffset(t, NULL);
+}
+
+static void snap_target_grid_ensure(TransInfo *t)
+{
+ /* Only need to calculate once. */
+ if ((t->tsnap.status & TARGET_GRID_INIT) == 0) {
+ if (t->data_type == TC_CURSOR_VIEW3D) {
+ /* Use a fallback when transforming the cursor.
+ * In this case the center is _not_ derived from the cursor which is being transformed. */
+ copy_v3_v3(t->tsnap.snapTargetGrid, TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->data->iloc);
+ }
+ else if (t->around == V3D_AROUND_CURSOR) {
+ /* Use a fallback for cursor selection,
+ * this isn't useful as a global center for absolute grid snapping
+ * since its not based on the position of the selection. */
+ snap_target_median_impl(t, t->tsnap.snapTargetGrid);
+ }
+ else {
+ copy_v3_v3(t->tsnap.snapTargetGrid, t->center_global);
+ }
+ t->tsnap.status |= TARGET_GRID_INIT;
+ }
+}
+
static void TargetSnapOffset(TransInfo *t, TransData *td)
{
if (t->spacetype == SPACE_NODE && td != NULL) {
@@ -987,41 +1056,7 @@ static void TargetSnapMedian(TransInfo *t)
{
/* Only need to calculate once. */
if ((t->tsnap.status & TARGET_INIT) == 0) {
- int i_accum = 0;
-
- t->tsnap.snapTarget[0] = 0;
- t->tsnap.snapTarget[1] = 0;
- t->tsnap.snapTarget[2] = 0;
-
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- TransData *td = tc->data;
- int i;
- float v[3];
- zero_v3(v);
-
- for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) {
- add_v3_v3(v, td->center);
- }
-
- if (i == 0) {
- /* Is this possible? */
- continue;
- }
-
- mul_v3_fl(v, 1.0 / i);
-
- if (tc->use_local_mat) {
- mul_m4_v3(tc->mat, v);
- }
-
- add_v3_v3(t->tsnap.snapTarget, v);
- i_accum++;
- }
-
- mul_v3_fl(t->tsnap.snapTarget, 1.0 / i_accum);
-
- TargetSnapOffset(t, NULL);
-
+ snap_target_median_impl(t, t->tsnap.snapTarget);
t->tsnap.status |= TARGET_INIT;
}
}
@@ -1034,7 +1069,7 @@ static void TargetSnapClosest(TransInfo *t)
TransData *closest = NULL;
/* Object mode */
- if (t->flag & T_OBJECT) {
+ if (t->options & CTX_OBJECT) {
int i;
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
TransData *td = tc->data;
@@ -1421,28 +1456,10 @@ static void snap_grid_apply(
TransInfo *t, const int max_index, const float grid_dist, const float loc[3], float r_out[3])
{
BLI_assert(max_index <= 2);
- const float *center_global = t->center_global;
+ snap_target_grid_ensure(t);
+ const float *center_global = t->tsnap.snapTargetGrid;
const float *asp = t->aspect;
- if (t->options & CTX_CURSOR) {
- /* Note that we must already have called #transformCenter_from_type, otherwise
- * we would be lazy-initializing data which is being transformed,
- * causing the transformed cursor location to be used instead of it's initial location. */
- BLI_assert(t->center_cache[V3D_AROUND_CURSOR].is_set);
-
- /* Use a fallback when transforming the cursor.
- * In this case the center is _not_ derived from the cursor which is being transformed. */
- const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CURSOR);
- center_global = cd->global;
- }
- else if (t->around == V3D_AROUND_CURSOR) {
- /* Use a fallback for cursor selection,
- * this isn't useful as a global center for absolute grid snapping
- * since its not based on the position of the selection. */
- const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CENTER_MEDIAN);
- center_global = cd->global;
- }
-
float in[3];
if (t->con.mode & CON_APPLY) {
BLI_assert(t->tsnap.snapElem == 0);
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index b610369f82d..58198f21ba2 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -1959,7 +1959,7 @@ static short snapCurve(SnapData *snapdata,
int clip_plane_len = snapdata->clip_plane_len;
if (snapdata->has_occlusion_plane) {
- /* We snap to vertices even if coccluded. */
+ /* We snap to vertices even if occluded. */
clip_planes++;
clip_plane_len--;
}
diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c
index 533416bf85e..baa178a6a94 100644
--- a/source/blender/editors/undo/ed_undo.c
+++ b/source/blender/editors/undo/ed_undo.c
@@ -169,16 +169,16 @@ void ED_undo_push(bContext *C, const char *str)
}
/**
- * \note Also check #undo_history_exec in bottom if you change notifiers.
+ * Common pre management of undo/redo (killing all running jobs, calling pre handlers, etc.).
*/
-static int ed_undo_step_impl(
- bContext *C, int step, const char *undoname, int undo_index, ReportList *reports)
+static void ed_undo_step_pre(bContext *C,
+ wmWindowManager *wm,
+ const enum eUndoStepDir undo_dir,
+ ReportList *reports)
{
- /* Mutually exclusives, ensure correct input. */
- BLI_assert(((undoname || undo_index != -1) && !step) ||
- (!(undoname || undo_index != -1) && step));
- CLOG_INFO(&LOG, 1, "name='%s', step=%d", undoname, step);
- wmWindowManager *wm = CTX_wm_manager(C);
+ BLI_assert(ELEM(undo_dir, STEP_UNDO, STEP_REDO));
+
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
ScrArea *area = CTX_wm_area(C);
@@ -187,18 +187,12 @@ static int ed_undo_step_impl(
WM_jobs_kill_all(wm);
if (G.debug & G_DEBUG_IO) {
- Main *bmain = CTX_data_main(C);
if (bmain->lock != NULL) {
BKE_report(reports, RPT_INFO, "Checking sanity of current .blend file *BEFORE* undo step");
BLO_main_validate_libraries(bmain, reports);
}
}
- /* TODO(campbell): undo_system: use undo system */
- /* grease pencil can be can be used in plenty of spaces, so check it first */
- if (ED_gpencil_session_active()) {
- return ED_undo_gpencil_step(C, step, undoname);
- }
if (area && (area->spacetype == SPACE_VIEW3D)) {
Object *obact = CTX_data_active_object(C);
if (obact && (obact->type == OB_GPENCIL)) {
@@ -206,89 +200,40 @@ static int ed_undo_step_impl(
}
}
- UndoStep *step_data_from_name = NULL;
- int step_for_callback = step;
- if (undoname != NULL) {
- step_data_from_name = BKE_undosys_step_find_by_name(wm->undo_stack, undoname);
- if (step_data_from_name == NULL) {
- return OPERATOR_CANCELLED;
- }
-
- /* TODO(campbell), could use simple optimization. */
- /* Pointers match on redo. */
- step_for_callback = (BLI_findindex(&wm->undo_stack->steps, step_data_from_name) <
- BLI_findindex(&wm->undo_stack->steps, wm->undo_stack->step_active)) ?
- 1 :
- -1;
- }
- else if (undo_index != -1) {
- step_for_callback = (undo_index <
- BLI_findindex(&wm->undo_stack->steps, wm->undo_stack->step_active)) ?
- 1 :
- -1;
- }
-
/* App-Handlers (pre). */
{
/* Note: ignore grease pencil for now. */
- Main *bmain = CTX_data_main(C);
wm->op_undo_depth++;
BKE_callback_exec_id(
- bmain, &scene->id, (step_for_callback > 0) ? BKE_CB_EVT_UNDO_PRE : BKE_CB_EVT_REDO_PRE);
+ bmain, &scene->id, (undo_dir == STEP_UNDO) ? BKE_CB_EVT_UNDO_PRE : BKE_CB_EVT_REDO_PRE);
wm->op_undo_depth--;
}
+}
- /* Undo System */
- {
- if (undoname) {
- BKE_undosys_step_undo_with_data(wm->undo_stack, C, step_data_from_name);
- }
- else if (undo_index != -1) {
- BKE_undosys_step_undo_from_index(wm->undo_stack, C, undo_index);
- }
- else {
- if (step == 1) {
- BKE_undosys_step_undo(wm->undo_stack, C);
- }
- else {
- BKE_undosys_step_redo(wm->undo_stack, C);
- }
- }
+/**
+ * Common post management of undo/redo (calling post handlers, adding notifiers etc.).
+ *
+ * \note Also check #undo_history_exec in bottom if you change notifiers.
+ */
+static void ed_undo_step_post(bContext *C,
+ wmWindowManager *wm,
+ const enum eUndoStepDir undo_dir,
+ ReportList *reports)
+{
+ BLI_assert(ELEM(undo_dir, STEP_UNDO, STEP_REDO));
- /* Set special modes for grease pencil */
- if (area && (area->spacetype == SPACE_VIEW3D)) {
- Object *obact = CTX_data_active_object(C);
- if (obact && (obact->type == OB_GPENCIL)) {
- /* set cursor */
- if (ELEM(obact->mode,
- OB_MODE_PAINT_GPENCIL,
- OB_MODE_SCULPT_GPENCIL,
- OB_MODE_WEIGHT_GPENCIL,
- OB_MODE_VERTEX_GPENCIL)) {
- ED_gpencil_toggle_brush_cursor(C, true, NULL);
- }
- else {
- ED_gpencil_toggle_brush_cursor(C, false, NULL);
- }
- /* set workspace mode */
- Base *basact = CTX_data_active_base(C);
- ED_object_base_activate(C, basact);
- }
- }
- }
+ Main *bmain = CTX_data_main(C);
+ Scene *scene = CTX_data_scene(C);
/* App-Handlers (post). */
{
- Main *bmain = CTX_data_main(C);
- scene = CTX_data_scene(C);
wm->op_undo_depth++;
BKE_callback_exec_id(
- bmain, &scene->id, step_for_callback > 0 ? BKE_CB_EVT_UNDO_POST : BKE_CB_EVT_REDO_POST);
+ bmain, &scene->id, (undo_dir == STEP_UNDO) ? BKE_CB_EVT_UNDO_POST : BKE_CB_EVT_REDO_POST);
wm->op_undo_depth--;
}
if (G.debug & G_DEBUG_IO) {
- Main *bmain = CTX_data_main(C);
if (bmain->lock != NULL) {
BKE_report(reports, RPT_INFO, "Checking sanity of current .blend file *AFTER* undo step");
BLO_main_validate_libraries(bmain, reports);
@@ -299,30 +244,123 @@ static int ed_undo_step_impl(
WM_event_add_notifier(C, NC_WM | ND_UNDO, NULL);
WM_toolsystem_refresh_active(C);
-
- Main *bmain = CTX_data_main(C);
WM_toolsystem_refresh_screen_all(bmain);
if (CLOG_CHECK(&LOG, 1)) {
BKE_undosys_print(wm->undo_stack);
}
-
- return OPERATOR_FINISHED;
}
-static int ed_undo_step_direction(bContext *C, int step, ReportList *reports)
+/** Undo or redo one step from current active one.
+ * May undo or redo several steps at once only if the target step is a 'skipped' one.
+ * The target step will be the one immediately before or after the active one. */
+static int ed_undo_step_direction(bContext *C, enum eUndoStepDir step, ReportList *reports)
{
- return ed_undo_step_impl(C, step, NULL, -1, reports);
+ BLI_assert(ELEM(step, STEP_UNDO, STEP_REDO));
+
+ CLOG_INFO(&LOG, 1, "direction=%s", (step == STEP_UNDO) ? "STEP_UNDO" : "STEP_REDO");
+
+ /* TODO(campbell): undo_system: use undo system */
+ /* grease pencil can be can be used in plenty of spaces, so check it first */
+ /* FIXME: This gpencil undo effectively only supports the one step undo/redo, undo based on name
+ * or index is fully not implemented.
+ * FIXME: However, it seems to never be used in current code (`ED_gpencil_session_active` seems
+ * to always return false). */
+ if (ED_gpencil_session_active()) {
+ return ED_undo_gpencil_step(C, step);
+ }
+
+ wmWindowManager *wm = CTX_wm_manager(C);
+
+ ed_undo_step_pre(C, wm, step, reports);
+
+ if (step == STEP_UNDO) {
+ BKE_undosys_step_undo(wm->undo_stack, C);
+ }
+ else {
+ BKE_undosys_step_redo(wm->undo_stack, C);
+ }
+
+ ed_undo_step_post(C, wm, step, reports);
+
+ return OPERATOR_FINISHED;
}
+/** Undo the step matching given name.
+ * May undo several steps at once.
+ * The target step will be the one immediately before given named one. */
static int ed_undo_step_by_name(bContext *C, const char *undo_name, ReportList *reports)
{
- return ed_undo_step_impl(C, 0, undo_name, -1, reports);
+ BLI_assert(undo_name != NULL);
+
+ /* FIXME: See comments in `ed_undo_step_direction`. */
+ if (ED_gpencil_session_active()) {
+ BLI_assert(!"Not implemented currently.");
+ }
+
+ wmWindowManager *wm = CTX_wm_manager(C);
+ UndoStep *undo_step_from_name = BKE_undosys_step_find_by_name(wm->undo_stack, undo_name);
+ if (undo_step_from_name == NULL) {
+ CLOG_ERROR(&LOG, "Step name='%s' not found in current undo stack", undo_name);
+
+ return OPERATOR_CANCELLED;
+ }
+
+ UndoStep *undo_step_target = undo_step_from_name->prev;
+ if (undo_step_target == NULL) {
+ CLOG_ERROR(&LOG, "Step name='%s' cannot be undone", undo_name);
+
+ return OPERATOR_CANCELLED;
+ }
+
+ const int undo_dir_i = BKE_undosys_step_calc_direction(wm->undo_stack, undo_step_target, NULL);
+ BLI_assert(ELEM(undo_dir_i, -1, 1));
+ const enum eUndoStepDir undo_dir = (undo_dir_i == -1) ? STEP_UNDO : STEP_REDO;
+
+ CLOG_INFO(&LOG,
+ 1,
+ "name='%s', found direction=%s",
+ undo_name,
+ (undo_dir == STEP_UNDO) ? "STEP_UNDO" : "STEP_REDO");
+
+ ed_undo_step_pre(C, wm, undo_dir, reports);
+
+ BKE_undosys_step_load_data_ex(wm->undo_stack, C, undo_step_target, NULL, true);
+
+ ed_undo_step_post(C, wm, undo_dir, reports);
+
+ return OPERATOR_FINISHED;
}
-static int ed_undo_step_by_index(bContext *C, int index, ReportList *reports)
+/** Load the step matching given index in the stack.
+ * May undo or redo several steps at once.
+ * The target step will be the one indicated by the given index. */
+static int ed_undo_step_by_index(bContext *C, const int undo_index, ReportList *reports)
{
- return ed_undo_step_impl(C, 0, NULL, index, reports);
+ BLI_assert(undo_index >= 0);
+
+ /* FIXME: See comments in `ed_undo_step_direction`. */
+ if (ED_gpencil_session_active()) {
+ BLI_assert(!"Not implemented currently.");
+ }
+
+ wmWindowManager *wm = CTX_wm_manager(C);
+ const int active_step_index = BLI_findindex(&wm->undo_stack->steps, wm->undo_stack->step_active);
+ const enum eUndoStepDir undo_dir = (undo_index < active_step_index) ? STEP_UNDO : STEP_REDO;
+
+ CLOG_INFO(&LOG,
+ 1,
+ "index='%d', found direction=%s",
+ undo_index,
+ (undo_dir == STEP_UNDO) ? "STEP_UNDO" : "STEP_REDO");
+
+ ed_undo_step_pre(C, wm, undo_dir, reports);
+
+ BKE_undosys_step_load_from_index(wm->undo_stack, C, undo_index);
+
+ ed_undo_step_post(C, wm, undo_dir, reports);
+
+ return OPERATOR_FINISHED;
}
void ED_undo_grouped_push(bContext *C, const char *str)
@@ -340,11 +378,11 @@ void ED_undo_grouped_push(bContext *C, const char *str)
void ED_undo_pop(bContext *C)
{
- ed_undo_step_direction(C, 1, NULL);
+ ed_undo_step_direction(C, STEP_UNDO, NULL);
}
void ED_undo_redo(bContext *C)
{
- ed_undo_step_direction(C, -1, NULL);
+ ed_undo_step_direction(C, STEP_REDO, NULL);
}
void ED_undo_push_op(bContext *C, wmOperator *op)
@@ -448,7 +486,7 @@ static int ed_undo_exec(bContext *C, wmOperator *op)
{
/* "last operator" should disappear, later we can tie this with undo stack nicer */
WM_operator_stack_clear(CTX_wm_manager(C));
- int ret = ed_undo_step_direction(C, 1, op->reports);
+ int ret = ed_undo_step_direction(C, STEP_UNDO, op->reports);
if (ret & OPERATOR_FINISHED) {
/* Keep button under the cursor active. */
WM_event_add_mousemove(CTX_wm_window(C));
@@ -477,7 +515,7 @@ static int ed_undo_push_exec(bContext *C, wmOperator *op)
static int ed_redo_exec(bContext *C, wmOperator *op)
{
- int ret = ed_undo_step_direction(C, -1, op->reports);
+ int ret = ed_undo_step_direction(C, STEP_REDO, op->reports);
if (ret & OPERATOR_FINISHED) {
/* Keep button under the cursor active. */
WM_event_add_mousemove(CTX_wm_window(C));
diff --git a/source/blender/editors/undo/memfile_undo.c b/source/blender/editors/undo/memfile_undo.c
index eea0f29d295..4fd8c180a4b 100644
--- a/source/blender/editors/undo/memfile_undo.c
+++ b/source/blender/editors/undo/memfile_undo.c
@@ -145,19 +145,18 @@ static int memfile_undosys_step_id_reused_cb(LibraryIDLinkCallbackData *cb_data)
static void memfile_undosys_step_decode(struct bContext *C,
struct Main *bmain,
UndoStep *us_p,
- int undo_direction,
+ const eUndoStepDir undo_direction,
bool UNUSED(is_final))
{
- BLI_assert(undo_direction != 0);
+ BLI_assert(undo_direction != STEP_INVALID);
bool use_old_bmain_data = true;
if (USER_EXPERIMENTAL_TEST(&U, use_undo_legacy)) {
use_old_bmain_data = false;
}
- else if (undo_direction > 0) {
- /* Redo case.
- * The only time we should have to force a complete redo is when current step is tagged as a
+ else if (undo_direction == STEP_REDO) {
+ /* The only time we should have to force a complete redo is when current step is tagged as a
* redo barrier.
* If previous step was not a memfile one should not matter here, current data in old bmain
* should still always be valid for unchanged data-blocks. */
@@ -165,9 +164,8 @@ static void memfile_undosys_step_decode(struct bContext *C,
use_old_bmain_data = false;
}
}
- else {
- /* Undo case.
- * Here we do not care whether current step is an undo barrier, since we are coming from
+ else if (undo_direction == STEP_UNDO) {
+ /* Here we do not care whether current step is an undo barrier, since we are coming from
* 'the future' we can still re-use old data. However, if *next* undo step
* (i.e. the one immediately in the future, the one we are coming from)
* is a barrier, then we have to force a complete undo.
@@ -316,8 +314,8 @@ struct MemFile *ED_undosys_stack_memfile_get_active(UndoStack *ustack)
* If the last undo step is a memfile one, find the first #MemFileChunk matching given ID
* (using its session UUID), and tag it as "changed in the future".
*
- * Since non-memfile undos cannot automatically set this flag in the previous step as done with
- * memfile ones, this has to be called manually by relevant undo code.
+ * Since non-memfile undo-steps cannot automatically set this flag in the previous step as done
+ * with memfile ones, this has to be called manually by relevant undo code.
*
* \note Only current known case for this is undoing a switch from Object to Sculpt mode (see
* T82388).
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt
index 0aab3810254..38655b8490e 100644
--- a/source/blender/editors/util/CMakeLists.txt
+++ b/source/blender/editors/util/CMakeLists.txt
@@ -39,7 +39,7 @@ set(SRC
ed_transverts.c
ed_util.c
ed_util_imbuf.c
- ed_util_ops.c
+ ed_util_ops.cc
gizmo_utils.c
numinput.c
select_utils.c
diff --git a/source/blender/editors/util/ed_transverts.c b/source/blender/editors/util/ed_transverts.c
index 1075f256a09..d0234dee856 100644
--- a/source/blender/editors/util/ed_transverts.c
+++ b/source/blender/editors/util/ed_transverts.c
@@ -495,8 +495,8 @@ void ED_transverts_create_from_obedit(TransVertStore *tvs, Object *obedit, const
}
if (!tvs->transverts_tot && tvs->transverts) {
- /* prevent memory leak. happens for curves/latticies due to */
- /* difficult condition of adding points to trans data */
+ /* Prevent memory leak. happens for curves/lattices due to
+ * difficult condition of adding points to trans data. */
MEM_freeN(tvs->transverts);
tvs->transverts = NULL;
}
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index c59fbbe1646..695db9ba246 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -183,7 +183,7 @@ void ED_editors_exit(Main *bmain, bool do_undo_system)
return;
}
- /* frees all editmode undos */
+ /* Frees all edit-mode undo-steps. */
if (do_undo_system && G_MAIN->wm.first) {
wmWindowManager *wm = G_MAIN->wm.first;
/* normally we don't check for NULL undo stack,
diff --git a/source/blender/editors/util/ed_util_ops.c b/source/blender/editors/util/ed_util_ops.cc
index bb531b11b12..5b2e1a16bc2 100644
--- a/source/blender/editors/util/ed_util_ops.c
+++ b/source/blender/editors/util/ed_util_ops.cc
@@ -20,7 +20,10 @@
* Utility operators for UI data or for the UI to use.
*/
-#include <string.h>
+#include <cstring>
+
+#include "DNA_space_types.h"
+#include "DNA_windowmanager_types.h"
#include "BLI_fileops.h"
#include "BLI_utildefines.h"
@@ -33,9 +36,6 @@
#include "BLT_translation.h"
-#include "DNA_space_types.h"
-#include "DNA_windowmanager_types.h"
-
#include "ED_render.h"
#include "ED_undo.h"
#include "ED_util.h"
@@ -56,7 +56,7 @@ static bool lib_id_preview_editing_poll(bContext *C)
const PointerRNA idptr = CTX_data_pointer_get(C, "id");
BLI_assert(!idptr.data || RNA_struct_is_ID(idptr.type));
- const ID *id = idptr.data;
+ const ID *id = (ID *)idptr.data;
if (!id) {
return false;
}
@@ -88,11 +88,11 @@ static int lib_id_load_custom_preview_exec(bContext *C, wmOperator *op)
}
PointerRNA idptr = CTX_data_pointer_get(C, "id");
- ID *id = idptr.data;
+ ID *id = (ID *)idptr.data;
BKE_previewimg_id_custom_set(id, path);
- WM_event_add_notifier(C, NC_ASSET, NULL);
+ WM_event_add_notifier(C, NC_ASSET, nullptr);
return OPERATOR_FINISHED;
}
@@ -123,7 +123,7 @@ static void ED_OT_lib_id_load_custom_preview(wmOperatorType *ot)
static int lib_id_generate_preview_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA idptr = CTX_data_pointer_get(C, "id");
- ID *id = idptr.data;
+ ID *id = (ID *)idptr.data;
ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
@@ -131,9 +131,9 @@ static int lib_id_generate_preview_exec(bContext *C, wmOperator *UNUSED(op))
if (preview) {
BKE_previewimg_clear(preview);
}
- UI_icon_render_id(C, NULL, id, ICON_SIZE_PREVIEW, true);
+ UI_icon_render_id(C, nullptr, id, ICON_SIZE_PREVIEW, true);
- WM_event_add_notifier(C, NC_ASSET, NULL);
+ WM_event_add_notifier(C, NC_ASSET, nullptr);
return OPERATOR_FINISHED;
}
@@ -169,15 +169,15 @@ static int lib_id_fake_user_toggle_exec(bContext *C, wmOperator *op)
idptr = RNA_property_pointer_get(&pprop.ptr, pprop.prop);
}
- if ((pprop.prop == NULL) || RNA_pointer_is_null(&idptr) || !RNA_struct_is_ID(idptr.type)) {
+ if ((pprop.prop == nullptr) || RNA_pointer_is_null(&idptr) || !RNA_struct_is_ID(idptr.type)) {
BKE_report(
op->reports, RPT_ERROR, "Incorrect context for running data-block fake user toggling");
return OPERATOR_CANCELLED;
}
- ID *id = idptr.data;
+ ID *id = (ID *)idptr.data;
- if ((id->lib != NULL) || (ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB, ID_WS))) {
+ if ((id->lib != nullptr) || (ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB, ID_WS))) {
BKE_report(op->reports, RPT_ERROR, "Data-block type does not support fake user");
return OPERATOR_CANCELLED;
}
@@ -217,14 +217,14 @@ static int lib_id_unlink_exec(bContext *C, wmOperator *op)
idptr = RNA_property_pointer_get(&pprop.ptr, pprop.prop);
}
- if ((pprop.prop == NULL) || RNA_pointer_is_null(&idptr) || !RNA_struct_is_ID(idptr.type)) {
+ if ((pprop.prop == nullptr) || RNA_pointer_is_null(&idptr) || !RNA_struct_is_ID(idptr.type)) {
BKE_report(
op->reports, RPT_ERROR, "Incorrect context for running data-block fake user toggling");
return OPERATOR_CANCELLED;
}
memset(&idptr, 0, sizeof(idptr));
- RNA_property_pointer_set(&pprop.ptr, pprop.prop, idptr, NULL);
+ RNA_property_pointer_set(&pprop.ptr, pprop.prop, idptr, nullptr);
RNA_property_update(C, &pprop.ptr, pprop.prop);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c
index ba22bcca0e1..91ec8546225 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -508,7 +508,7 @@ bool handleNumInput(bContext *C, NumInput *n, const wmEvent *event)
#endif
case EVT_CKEY:
if (event->ctrl) {
- /* Copy current str to the copypaste buffer. */
+ /* Copy current `str` to the copy/paste buffer. */
WM_clipboard_text_set(n->str, 0);
updated = true;
}
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index ed9e5053f10..e94aaa49839 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -978,7 +978,7 @@ static int p_connect_pairs(PHandle *handle, PBool topology_from_uvs)
PChart *chart = handle->construction_chart;
int ncharts = 0;
- /* connect pairs, count edges, set vertex-edge pointer to a pairless edge */
+ /* Connect pairs, count edges, set vertex-edge pointer to a pair-less edge. */
for (first = chart->faces; first; first = first->nextlink) {
if (first->flag & PFACE_CONNECTED) {
continue;
@@ -1974,7 +1974,7 @@ static PBool p_collapse_allowed_geometric(PEdge *edge, PEdge *pair)
b[1] = p_vec_angle(v2->co, v1->co, keepv->co);
b[2] = M_PI - b[0] - b[1];
- /* abf criterion 1: avoid sharp and obtuse angles */
+ /* ABF criterion 1: avoid sharp and obtuse angles. */
minangle = 15.0f * M_PI / 180.0f;
maxangle = M_PI - minangle;
@@ -1991,7 +1991,7 @@ static PBool p_collapse_allowed_geometric(PEdge *edge, PEdge *pair)
} while (e && (e != oldv->edge));
if (p_vert_interior(oldv)) {
- /* hlscm criterion: angular defect smaller than threshold */
+ /* HLSCM criterion: angular defect smaller than threshold. */
if (fabsf(angulardefect) > (float)(M_PI * 30.0 / 180.0)) {
return P_FALSE;
}
@@ -2000,12 +2000,12 @@ static PBool p_collapse_allowed_geometric(PEdge *edge, PEdge *pair)
PVert *v1 = p_boundary_edge_next(oldv->edge)->vert;
PVert *v2 = p_boundary_edge_prev(oldv->edge)->vert;
- /* abf++ criterion 2: avoid collapsing verts inwards */
+ /* ABF++ criterion 2: avoid collapsing verts inwards. */
if (p_vert_interior(keepv)) {
return P_FALSE;
}
- /* don't collapse significant boundary changes */
+ /* Don't collapse significant boundary changes. */
angle = p_vec_angle(v1->co, oldv->co, v2->co);
if (angle < (M_PI * 160.0 / 180.0)) {
return P_FALSE;
@@ -3837,7 +3837,7 @@ static void p_chart_rotate_fit_aabb(PChart *chart)
/* Area Smoothing */
-/* 2d bsp tree for inverse mapping - that's a bit silly */
+/* 2d BSP tree for inverse mapping - that's a bit silly. */
typedef struct SmoothTriangle {
float co1[2], co2[2], co3[2];
@@ -4288,7 +4288,7 @@ static void p_smooth(PChart *chart)
MEM_freeN(hedges);
MEM_freeN(vedges);
- /* create bsp */
+ /* Create BSP. */
t = triangles = MEM_mallocN(sizeof(SmoothTriangle) * esize * 2, "PSmoothTris");
trip = tri = MEM_mallocN(sizeof(SmoothTriangle *) * esize * 2, "PSmoothTriP");
diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c
index 7b27bb570cc..8ebf000baaa 100644
--- a/source/blender/editors/uvedit/uvedit_smart_stitch.c
+++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c
@@ -129,8 +129,10 @@ typedef struct UvEdge {
/** general use flag
* (Used to check if edge is boundary here, and propagates to adjacency elements) */
uchar flag;
- /** element that guarantees element->face
- * has the edge on element->tfindex and element->tfindex+1 is the second uv */
+ /**
+ * Element that guarantees `element.l` has the edge on
+ * `element.loop_of_poly_index` and `element->loop_of_poly_index + 1` is the second UV.
+ */
UvElement *element;
/** next uv edge with the same exact vertices as this one.
* Calculated at startup to save time */
@@ -224,13 +226,13 @@ enum StitchModes {
STITCH_EDGE,
};
-/* UvElement identification. */
+/** #UvElement identification. */
typedef struct UvElementID {
int faceIndex;
int elementIndex;
} UvElementID;
-/* StitchState initializition. */
+/** #StitchState initialization. */
typedef struct StitchStateInit {
int uv_selected_count;
UvElementID *to_select;
@@ -2050,7 +2052,7 @@ static StitchState *stitch_init(bContext *C,
BLI_ghash_free(edge_hash, NULL, NULL);
- /* refill an edge hash to create edge connnectivity data */
+ /* Refill an edge hash to create edge connectivity data. */
state->edge_hash = edge_hash = BLI_ghash_new(uv_edge_hash, uv_edge_compare, "stitch_edge_hash");
for (i = 0; i < total_edges; i++) {
BLI_ghash_insert(edge_hash, edges + i, edges + i);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index be54df1ce9e..fc5f41e8ed5 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -1336,9 +1336,9 @@ static void uv_map_rotation_matrix_ex(float result[4][4],
zero_m4(rotup);
zero_m4(rotside);
- /* compensate front/side.. against opengl x,y,z world definition */
- /* this is "kanonen gegen spatzen", a few plus minus 1 will do here */
- /* i wanted to keep the reason here, so we're rotating*/
+ /* Compensate front/side.. against opengl x,y,z world definition.
+ * This is "a sledgehammer to crack a nut" (overkill), a few plus minus 1 will do here.
+ * I wanted to keep the reason here, so we're rotating. */
sideangle = (float)M_PI * (sideangledeg + 180.0f) / 180.0f;
rotside[0][0] = cosf(sideangle);
rotside[0][1] = -sinf(sideangle);
diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp
index ddd11729e67..9c675c93a2e 100644
--- a/source/blender/freestyle/intern/application/Controller.cpp
+++ b/source/blender/freestyle/intern/application/Controller.cpp
@@ -580,7 +580,7 @@ void Controller::ComputeViewMap()
vmBuilder.setRenderMonitor(_pRenderMonitor);
#if 0
- // Builds a tesselated form of the silhouette for display purpose:
+ // Builds a tessellated form of the silhouette for display purpose:
//---------------------------------------------------------------
ViewMapTesselator3D sTesselator3d;
ViewMapTesselator2D sTesselator2d;
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
index 930da3ef471..a16479873e7 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
@@ -56,11 +56,6 @@ NodeGroup *BlenderFileLoader::Load()
// creation of the scene root node
_Scene = new NodeGroup;
- _viewplane_left = _re->viewplane.xmin;
- _viewplane_right = _re->viewplane.xmax;
- _viewplane_bottom = _re->viewplane.ymin;
- _viewplane_top = _re->viewplane.ymax;
-
if (_re->clip_start < 0.0f) {
// Adjust clipping start/end and set up a Z offset when the viewport preview
// is used with the orthographic view. In this case, _re->clip_start is negative,
@@ -76,14 +71,6 @@ NodeGroup *BlenderFileLoader::Load()
_z_offset = 0.0f;
}
-#if 0
- if (G.debug & G_DEBUG_FREESTYLE) {
- cout << "Frustum: l " << _viewplane_left << " r " << _viewplane_right << " b "
- << _viewplane_bottom << " t " << _viewplane_top << " n " << _z_near << " f " << _z_far
- << endl;
- }
-#endif
-
int id = 0;
const eEvaluationMode eval_mode = DEG_get_mode(_depsgraph);
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
index 50834db3c5c..1be2fc3bc99 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
@@ -152,10 +152,6 @@ class BlenderFileLoader {
real _minEdgeSize;
#endif
bool _smooth; /* if true, face smoothness is taken into account */
- float _viewplane_left;
- float _viewplane_right;
- float _viewplane_bottom;
- float _viewplane_top;
float _z_near, _z_far;
float _z_offset;
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
index f761b1f6243..4f6ffc451c8 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
@@ -628,7 +628,7 @@ void BlenderStrokeRenderer::GenerateStrokeMesh(StrokeGroup *group, bool hasTex)
mesh->mloopcol = colors;
mesh->mat = (Material **)MEM_mallocN(sizeof(Material *) * mesh->totcol, "MaterialList");
- for (const auto &item : group->materials.items()) {
+ for (const auto item : group->materials.items()) {
Material *material = item.key;
const int matnr = item.value;
mesh->mat[matnr] = material;
diff --git a/source/blender/freestyle/intern/geometry/FitCurve.cpp b/source/blender/freestyle/intern/geometry/FitCurve.cpp
index 5768f88e95f..7c0b3bf0224 100644
--- a/source/blender/freestyle/intern/geometry/FitCurve.cpp
+++ b/source/blender/freestyle/intern/geometry/FitCurve.cpp
@@ -134,7 +134,7 @@ static BezierCurve GenerateBezier(
double alpha_l; /* Alpha values, left and right */
double alpha_r;
Vector2 tmp; /* Utility variable */
- BezierCurve bezCurve; /* RETURN bezier curve ctl pts */
+ BezierCurve bezCurve; /* RETURN bezier curve control points. */
bezCurve = (Vector2 *)malloc(4 * sizeof(Vector2));
nPts = last - first + 1;
diff --git a/source/blender/freestyle/intern/geometry/GeomUtils.cpp b/source/blender/freestyle/intern/geometry/GeomUtils.cpp
index 51727fd2288..d3a3d8bc76e 100644
--- a/source/blender/freestyle/intern/geometry/GeomUtils.cpp
+++ b/source/blender/freestyle/intern/geometry/GeomUtils.cpp
@@ -435,12 +435,12 @@ bool overlapTriangleBox(Vec3r &boxcenter, Vec3r &boxhalfsize, Vec3r triverts[3])
// Tomas Möller
// Prosolvia Clarus AB
// Sweden
-// tompa@clarus.se
+// <tompa@clarus.se>
//
// Ben Trumbore
// Cornell University
// Ithaca, New York
-// wbt@graphics.cornell.edu
+// <wbt@graphics.cornell.edu>
bool intersectRayTriangle(const Vec3r &orig,
const Vec3r &dir,
const Vec3r &v0,
diff --git a/source/blender/freestyle/intern/geometry/matrix_util.cpp b/source/blender/freestyle/intern/geometry/matrix_util.cpp
index 5b5d9582e8f..95a24d85677 100644
--- a/source/blender/freestyle/intern/geometry/matrix_util.cpp
+++ b/source/blender/freestyle/intern/geometry/matrix_util.cpp
@@ -17,7 +17,7 @@
* GXML/Graphite: Geometry and Graphics Programming Library + Utilities
* Copyright (C) 2000 Bruno Levy
* Contact: Bruno Levy
- * levy@loria.fr
+ * <levy@loria.fr>
* ISA Project
* LORIA, INRIA Lorraine,
* Campus Scientifique, BP 239
diff --git a/source/blender/freestyle/intern/geometry/matrix_util.h b/source/blender/freestyle/intern/geometry/matrix_util.h
index 8a20cb31300..8c2eb799d13 100644
--- a/source/blender/freestyle/intern/geometry/matrix_util.h
+++ b/source/blender/freestyle/intern/geometry/matrix_util.h
@@ -17,7 +17,7 @@
* GXML/Graphite: Geometry and Graphics Programming Library + Utilities
* Copyright (C) 2000 Bruno Levy
* Contact: Bruno Levy
- * levy@loria.fr
+ * <levy@loria.fr>
* ISA Project
* LORIA, INRIA Lorraine,
* Campus Scientifique, BP 239
diff --git a/source/blender/freestyle/intern/geometry/normal_cycle.cpp b/source/blender/freestyle/intern/geometry/normal_cycle.cpp
index 01d52646eb0..2310525a1e1 100644
--- a/source/blender/freestyle/intern/geometry/normal_cycle.cpp
+++ b/source/blender/freestyle/intern/geometry/normal_cycle.cpp
@@ -17,7 +17,7 @@
* OGF/Graphite: Geometry and Graphics Programming Library + Utilities
* Copyright (C) 2000 Bruno Levy
* Contact: Bruno Levy
- * levy@loria.fr
+ * <levy@loria.fr>
* ISA Project
* LORIA, INRIA Lorraine,
* Campus Scientifique, BP 239
diff --git a/source/blender/freestyle/intern/geometry/normal_cycle.h b/source/blender/freestyle/intern/geometry/normal_cycle.h
index 6ac9779e7c2..5adef773be1 100644
--- a/source/blender/freestyle/intern/geometry/normal_cycle.h
+++ b/source/blender/freestyle/intern/geometry/normal_cycle.h
@@ -17,7 +17,7 @@
* OGF/Graphite: Geometry and Graphics Programming Library + Utilities
* Copyright (C) 2000 Bruno Levy
* Contact: Bruno Levy
- * levy@loria.fr
+ * <levy@loria.fr>
* ISA Project
* LORIA, INRIA Lorraine,
* Campus Scientifique, BP 239
diff --git a/source/blender/freestyle/intern/python/BPy_BBox.cpp b/source/blender/freestyle/intern/python/BPy_BBox.cpp
index d66a74bc83f..78431aa6728 100644
--- a/source/blender/freestyle/intern/python/BPy_BBox.cpp
+++ b/source/blender/freestyle/intern/python/BPy_BBox.cpp
@@ -24,6 +24,9 @@
extern "C" {
#endif
+using namespace Freestyle;
+using namespace Freestyle::Geometry;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -80,11 +83,7 @@ PyTypeObject BBox_Type = {
sizeof(BPy_BBox), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)BBox_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
+ 0, /* tp_vectorcall_offset */
nullptr, /* tp_getattr */
nullptr, /* tp_setattr */
nullptr, /* tp_reserved */
diff --git a/source/blender/freestyle/intern/python/BPy_BBox.h b/source/blender/freestyle/intern/python/BPy_BBox.h
index a284deed10c..889dbc62a41 100644
--- a/source/blender/freestyle/intern/python/BPy_BBox.h
+++ b/source/blender/freestyle/intern/python/BPy_BBox.h
@@ -27,9 +27,6 @@ extern "C" {
#include "../geometry/BBox.h"
#include "../geometry/Geom.h"
-using namespace Freestyle;
-using namespace Freestyle::Geometry;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -42,7 +39,7 @@ extern PyTypeObject BBox_Type;
/*---------------------------Python BPy_BBox structure definition----------*/
typedef struct {
- PyObject_HEAD BBox<Vec3r> *bb;
+ PyObject_HEAD Freestyle::BBox<Freestyle::Geometry::Vec3r> *bb;
} BPy_BBox;
/*---------------------------Python BPy_BBox visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp
index 2359d79f7d0..652b576852d 100644
--- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -153,43 +155,39 @@ PyTypeObject BinaryPredicate0D_Type = {
sizeof(BPy_BinaryPredicate0D), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)BinaryPredicate0D___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)BinaryPredicate0D___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)BinaryPredicate0D___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- BinaryPredicate0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_BinaryPredicate0D_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)BinaryPredicate0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)BinaryPredicate0D___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)BinaryPredicate0D___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ BinaryPredicate0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_BinaryPredicate0D_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)BinaryPredicate0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h
index cdf81f3e4fc..a368d4cd47e 100644
--- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h
+++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../stroke/Predicates0D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,7 +39,7 @@ extern PyTypeObject BinaryPredicate0D_Type;
/*---------------------------Python BPy_BinaryPredicate0D structure definition----------*/
typedef struct {
- PyObject_HEAD BinaryPredicate0D *bp0D;
+ PyObject_HEAD Freestyle::BinaryPredicate0D *bp0D;
} BPy_BinaryPredicate0D;
/*---------------------------Python BPy_BinaryPredicate0D visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp
index 7d554e0abe1..37762f1b8b3 100644
--- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp
@@ -33,6 +33,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -187,43 +189,39 @@ PyTypeObject BinaryPredicate1D_Type = {
sizeof(BPy_BinaryPredicate1D), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)BinaryPredicate1D___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)BinaryPredicate1D___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)BinaryPredicate1D___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- BinaryPredicate1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_BinaryPredicate1D_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)BinaryPredicate1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)BinaryPredicate1D___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)BinaryPredicate1D___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ BinaryPredicate1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_BinaryPredicate1D_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)BinaryPredicate1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h
index b761f6f6ace..b34fad9e213 100644
--- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h
+++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../stroke/Predicates1D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,7 +39,7 @@ extern PyTypeObject BinaryPredicate1D_Type;
/*---------------------------Python BPy_BinaryPredicate1D structure definition----------*/
typedef struct {
- PyObject_HEAD BinaryPredicate1D *bp1D;
+ PyObject_HEAD Freestyle::BinaryPredicate1D *bp1D;
} BPy_BinaryPredicate1D;
/*---------------------------Python BPy_BinaryPredicate1D visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_Convert.cpp b/source/blender/freestyle/intern/python/BPy_Convert.cpp
index f1d7a242a93..99ba3090137 100644
--- a/source/blender/freestyle/intern/python/BPy_Convert.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Convert.cpp
@@ -61,6 +61,9 @@
extern "C" {
#endif
+using namespace Freestyle;
+using namespace Freestyle::Geometry;
+
///////////////////////////////////////////////////////////////////////////////////////////
//==============================
diff --git a/source/blender/freestyle/intern/python/BPy_Convert.h b/source/blender/freestyle/intern/python/BPy_Convert.h
index 5a1c11ec086..e0916196808 100644
--- a/source/blender/freestyle/intern/python/BPy_Convert.h
+++ b/source/blender/freestyle/intern/python/BPy_Convert.h
@@ -28,9 +28,6 @@ extern "C" {
#include "../geometry/Geom.h"
-using namespace Freestyle;
-using namespace Freestyle::Geometry;
-
// BBox
#include "../geometry/BBox.h"
@@ -94,76 +91,81 @@ extern "C" {
//==============================
PyObject *PyBool_from_bool(bool b);
-PyObject *Vector_from_Vec2f(Vec2f &v);
-PyObject *Vector_from_Vec3f(Vec3f &v);
-PyObject *Vector_from_Vec3r(Vec3r &v);
-
-PyObject *Any_BPy_Interface0D_from_Interface0D(Interface0D &if0D);
-PyObject *Any_BPy_Interface1D_from_Interface1D(Interface1D &if1D);
-PyObject *Any_BPy_FEdge_from_FEdge(FEdge &fe);
-PyObject *Any_BPy_ViewVertex_from_ViewVertex(ViewVertex &vv);
-
-PyObject *BPy_BBox_from_BBox(const BBox<Vec3r> &bb);
-PyObject *BPy_CurvePoint_from_CurvePoint(CurvePoint &cp);
-PyObject *BPy_directedViewEdge_from_directedViewEdge(ViewVertex::directedViewEdge &dve);
-PyObject *BPy_FEdge_from_FEdge(FEdge &fe);
-PyObject *BPy_FEdgeSharp_from_FEdgeSharp(FEdgeSharp &fes);
-PyObject *BPy_FEdgeSmooth_from_FEdgeSmooth(FEdgeSmooth &fes);
-PyObject *BPy_Id_from_Id(Id &id);
-PyObject *BPy_Interface0D_from_Interface0D(Interface0D &if0D);
-PyObject *BPy_Interface1D_from_Interface1D(Interface1D &if1D);
-PyObject *BPy_IntegrationType_from_IntegrationType(IntegrationType i);
-PyObject *BPy_FrsMaterial_from_FrsMaterial(const FrsMaterial &m);
+PyObject *Vector_from_Vec2f(Freestyle::Geometry::Vec2f &v);
+PyObject *Vector_from_Vec3f(Freestyle::Geometry::Vec3f &v);
+PyObject *Vector_from_Vec3r(Freestyle::Geometry::Vec3r &v);
+
+PyObject *Any_BPy_Interface0D_from_Interface0D(Freestyle::Interface0D &if0D);
+PyObject *Any_BPy_Interface1D_from_Interface1D(Freestyle::Interface1D &if1D);
+PyObject *Any_BPy_FEdge_from_FEdge(Freestyle::FEdge &fe);
+PyObject *Any_BPy_ViewVertex_from_ViewVertex(Freestyle::ViewVertex &vv);
+
+PyObject *BPy_BBox_from_BBox(const Freestyle::BBox<Freestyle::Geometry::Vec3r> &bb);
+PyObject *BPy_CurvePoint_from_CurvePoint(Freestyle::CurvePoint &cp);
+PyObject *BPy_directedViewEdge_from_directedViewEdge(Freestyle::ViewVertex::directedViewEdge &dve);
+PyObject *BPy_FEdge_from_FEdge(Freestyle::FEdge &fe);
+PyObject *BPy_FEdgeSharp_from_FEdgeSharp(Freestyle::FEdgeSharp &fes);
+PyObject *BPy_FEdgeSmooth_from_FEdgeSmooth(Freestyle::FEdgeSmooth &fes);
+PyObject *BPy_Id_from_Id(Freestyle::Id &id);
+PyObject *BPy_Interface0D_from_Interface0D(Freestyle::Interface0D &if0D);
+PyObject *BPy_Interface1D_from_Interface1D(Freestyle::Interface1D &if1D);
+PyObject *BPy_IntegrationType_from_IntegrationType(Freestyle::IntegrationType i);
+PyObject *BPy_FrsMaterial_from_FrsMaterial(const Freestyle::FrsMaterial &m);
PyObject *BPy_Nature_from_Nature(unsigned short n);
-PyObject *BPy_MediumType_from_MediumType(Stroke::MediumType n);
-PyObject *BPy_SShape_from_SShape(SShape &ss);
-PyObject *BPy_Stroke_from_Stroke(Stroke &s);
-PyObject *BPy_StrokeAttribute_from_StrokeAttribute(StrokeAttribute &sa);
-PyObject *BPy_StrokeVertex_from_StrokeVertex(StrokeVertex &sv);
-PyObject *BPy_SVertex_from_SVertex(SVertex &sv);
-PyObject *BPy_ViewVertex_from_ViewVertex(ViewVertex &vv);
-PyObject *BPy_NonTVertex_from_NonTVertex(NonTVertex &ntv);
-PyObject *BPy_TVertex_from_TVertex(TVertex &tv);
-PyObject *BPy_ViewEdge_from_ViewEdge(ViewEdge &ve);
-PyObject *BPy_Chain_from_Chain(Chain &c);
-PyObject *BPy_ViewShape_from_ViewShape(ViewShape &vs);
-
-PyObject *BPy_AdjacencyIterator_from_AdjacencyIterator(AdjacencyIterator &a_it);
-PyObject *BPy_Interface0DIterator_from_Interface0DIterator(Interface0DIterator &if0D_it,
+PyObject *BPy_MediumType_from_MediumType(Freestyle::Stroke::MediumType n);
+PyObject *BPy_SShape_from_SShape(Freestyle::SShape &ss);
+PyObject *BPy_Stroke_from_Stroke(Freestyle::Stroke &s);
+PyObject *BPy_StrokeAttribute_from_StrokeAttribute(Freestyle::StrokeAttribute &sa);
+PyObject *BPy_StrokeVertex_from_StrokeVertex(Freestyle::StrokeVertex &sv);
+PyObject *BPy_SVertex_from_SVertex(Freestyle::SVertex &sv);
+PyObject *BPy_ViewVertex_from_ViewVertex(Freestyle::ViewVertex &vv);
+PyObject *BPy_NonTVertex_from_NonTVertex(Freestyle::NonTVertex &ntv);
+PyObject *BPy_TVertex_from_TVertex(Freestyle::TVertex &tv);
+PyObject *BPy_ViewEdge_from_ViewEdge(Freestyle::ViewEdge &ve);
+PyObject *BPy_Chain_from_Chain(Freestyle::Chain &c);
+PyObject *BPy_ViewShape_from_ViewShape(Freestyle::ViewShape &vs);
+
+PyObject *BPy_AdjacencyIterator_from_AdjacencyIterator(Freestyle::AdjacencyIterator &a_it);
+PyObject *BPy_Interface0DIterator_from_Interface0DIterator(Freestyle::Interface0DIterator &if0D_it,
bool reversed);
-PyObject *BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator &cp_it);
+PyObject *BPy_CurvePointIterator_from_CurvePointIterator(
+ Freestyle::CurveInternal::CurvePointIterator &cp_it);
PyObject *BPy_StrokeVertexIterator_from_StrokeVertexIterator(
- StrokeInternal::StrokeVertexIterator &sv_it, bool reversed);
-PyObject *BPy_SVertexIterator_from_SVertexIterator(ViewEdgeInternal::SVertexIterator &sv_it);
+ Freestyle::StrokeInternal::StrokeVertexIterator &sv_it, bool reversed);
+PyObject *BPy_SVertexIterator_from_SVertexIterator(
+ Freestyle::ViewEdgeInternal::SVertexIterator &sv_it);
PyObject *BPy_orientedViewEdgeIterator_from_orientedViewEdgeIterator(
- ViewVertexInternal::orientedViewEdgeIterator &ove_it, bool reversed);
-PyObject *BPy_ViewEdgeIterator_from_ViewEdgeIterator(ViewEdgeInternal::ViewEdgeIterator &ve_it);
-PyObject *BPy_ChainingIterator_from_ChainingIterator(ChainingIterator &c_it);
-PyObject *BPy_ChainPredicateIterator_from_ChainPredicateIterator(ChainPredicateIterator &cp_it);
-PyObject *BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator(ChainSilhouetteIterator &cs_it);
+ Freestyle::ViewVertexInternal::orientedViewEdgeIterator &ove_it, bool reversed);
+PyObject *BPy_ViewEdgeIterator_from_ViewEdgeIterator(
+ Freestyle::ViewEdgeInternal::ViewEdgeIterator &ve_it);
+PyObject *BPy_ChainingIterator_from_ChainingIterator(Freestyle::ChainingIterator &c_it);
+PyObject *BPy_ChainPredicateIterator_from_ChainPredicateIterator(
+ Freestyle::ChainPredicateIterator &cp_it);
+PyObject *BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator(
+ Freestyle::ChainSilhouetteIterator &cs_it);
//==============================
// Python => C++
//==============================
bool bool_from_PyBool(PyObject *b);
-IntegrationType IntegrationType_from_BPy_IntegrationType(PyObject *obj);
-Stroke::MediumType MediumType_from_BPy_MediumType(PyObject *obj);
-Nature::EdgeNature EdgeNature_from_BPy_Nature(PyObject *obj);
-bool Vec2f_ptr_from_PyObject(PyObject *obj, Vec2f &vec);
-bool Vec3f_ptr_from_PyObject(PyObject *obj, Vec3f &vec);
-bool Vec3r_ptr_from_PyObject(PyObject *obj, Vec3r &vec);
-bool Vec2f_ptr_from_Vector(PyObject *obj, Vec2f &vec);
-bool Vec3f_ptr_from_Vector(PyObject *obj, Vec3f &vec);
-bool Vec3r_ptr_from_Vector(PyObject *obj, Vec3r &vec);
-bool Vec3f_ptr_from_Color(PyObject *obj, Vec3f &vec);
-bool Vec3r_ptr_from_Color(PyObject *obj, Vec3r &vec);
-bool Vec2f_ptr_from_PyList(PyObject *obj, Vec2f &vec);
-bool Vec3f_ptr_from_PyList(PyObject *obj, Vec3f &vec);
-bool Vec3r_ptr_from_PyList(PyObject *obj, Vec3r &vec);
-bool Vec2f_ptr_from_PyTuple(PyObject *obj, Vec2f &vec);
-bool Vec3f_ptr_from_PyTuple(PyObject *obj, Vec3f &vec);
-bool Vec3r_ptr_from_PyTuple(PyObject *obj, Vec3r &vec);
+Freestyle::IntegrationType IntegrationType_from_BPy_IntegrationType(PyObject *obj);
+Freestyle::Stroke::MediumType MediumType_from_BPy_MediumType(PyObject *obj);
+Freestyle::Nature::EdgeNature EdgeNature_from_BPy_Nature(PyObject *obj);
+bool Vec2f_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec2f &vec);
+bool Vec3f_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec3f &vec);
+bool Vec3r_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec3r &vec);
+bool Vec2f_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec2f &vec);
+bool Vec3f_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec3f &vec);
+bool Vec3r_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec3r &vec);
+bool Vec3f_ptr_from_Color(PyObject *obj, Freestyle::Geometry::Vec3f &vec);
+bool Vec3r_ptr_from_Color(PyObject *obj, Freestyle::Geometry::Vec3r &vec);
+bool Vec2f_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec2f &vec);
+bool Vec3f_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec3f &vec);
+bool Vec3r_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec3r &vec);
+bool Vec2f_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec2f &vec);
+bool Vec3f_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec3f &vec);
+bool Vec3r_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec3r &vec);
bool float_array_from_PyObject(PyObject *obj, float *v, int n);
diff --git a/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp b/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp
index 2aa08ec3ab5..48b2ad767d2 100644
--- a/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp
+++ b/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp
@@ -28,6 +28,8 @@ extern "C" {
#include "BLI_hash_mm2a.h"
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -538,43 +540,39 @@ PyTypeObject FrsMaterial_Type = {
sizeof(BPy_FrsMaterial), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)FrsMaterial_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)FrsMaterial_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- (hashfunc)FrsMaterial_hash, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FrsMaterial_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- (richcmpfunc)BPy_FrsMaterial_richcmpr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_FrsMaterial_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FrsMaterial_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)FrsMaterial_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ (hashfunc)FrsMaterial_hash, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FrsMaterial_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ (richcmpfunc)BPy_FrsMaterial_richcmpr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_FrsMaterial_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FrsMaterial_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_FrsMaterial.h b/source/blender/freestyle/intern/python/BPy_FrsMaterial.h
index 13a116d7ef2..084fcef9a62 100644
--- a/source/blender/freestyle/intern/python/BPy_FrsMaterial.h
+++ b/source/blender/freestyle/intern/python/BPy_FrsMaterial.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../scene_graph/FrsMaterial.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,7 +39,7 @@ extern PyTypeObject FrsMaterial_Type;
/*---------------------------Python BPy_FrsMaterial structure definition----------*/
typedef struct {
- PyObject_HEAD FrsMaterial *m;
+ PyObject_HEAD Freestyle::FrsMaterial *m;
} BPy_FrsMaterial;
/*---------------------------Python BPy_FrsMaterial visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp
index 943a9ca0e64..40127064875 100644
--- a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp
+++ b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -330,43 +332,39 @@ PyTypeObject FrsNoise_Type = {
sizeof(BPy_FrsNoise), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)FrsNoise_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)FrsNoise_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FrsNoise_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_FrsNoise_methods, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FrsNoise_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)FrsNoise_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FrsNoise_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_FrsNoise_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FrsNoise_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_FrsNoise.h b/source/blender/freestyle/intern/python/BPy_FrsNoise.h
index 09bcc82ae94..0f8f2d3242c 100644
--- a/source/blender/freestyle/intern/python/BPy_FrsNoise.h
+++ b/source/blender/freestyle/intern/python/BPy_FrsNoise.h
@@ -27,8 +27,6 @@ extern "C" {
#include "../geometry/Noise.h"
#include "../system/PseudoNoise.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,8 +39,8 @@ extern PyTypeObject FrsNoise_Type;
/*---------------------------Python BPy_FrsNoise structure definition----------*/
typedef struct {
- PyObject_HEAD Noise *n;
- PseudoNoise *pn;
+ PyObject_HEAD Freestyle::Noise *n;
+ Freestyle::PseudoNoise *pn;
} BPy_FrsNoise;
/*---------------------------Python BPy_FrsNoise visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_Id.cpp b/source/blender/freestyle/intern/python/BPy_Id.cpp
index 323e76fe249..752bea16fb1 100644
--- a/source/blender/freestyle/intern/python/BPy_Id.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Id.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -167,15 +169,11 @@ static PyGetSetDef BPy_Id_getseters[] = {
/*-----------------------BPy_Id type definition ------------------------------*/
PyTypeObject Id_Type = {
- PyVarObject_HEAD_INIT(nullptr, 0) "Id", /* tp_name */
- sizeof(BPy_Id), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)Id_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
+ PyVarObject_HEAD_INIT(nullptr, 0) "Id", /* tp_name */
+ sizeof(BPy_Id), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)Id_dealloc, /* tp_dealloc */
+ 0, /* tp_vectorcall_offset */
nullptr, /* tp_getattr */
nullptr, /* tp_setattr */
nullptr, /* tp_reserved */
diff --git a/source/blender/freestyle/intern/python/BPy_Id.h b/source/blender/freestyle/intern/python/BPy_Id.h
index f5952297c66..51a70a391b1 100644
--- a/source/blender/freestyle/intern/python/BPy_Id.h
+++ b/source/blender/freestyle/intern/python/BPy_Id.h
@@ -26,12 +26,8 @@ extern "C" {
#include <iostream>
-using namespace std;
-
#include "../system/Id.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -44,7 +40,7 @@ extern PyTypeObject Id_Type;
/*---------------------------Python BPy_Id structure definition----------*/
typedef struct {
- PyObject_HEAD Id *id;
+ PyObject_HEAD Freestyle::Id *id;
} BPy_Id;
/*---------------------------Python BPy_Id visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
index 25f3c54ea7d..2af019e8fe2 100644
--- a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
+++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------ MODULE FUNCTIONS ----------------------------------
@@ -153,43 +155,39 @@ PyTypeObject IntegrationType_Type = {
sizeof(PyLongObject), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- IntegrationType_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &PyLong_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- nullptr, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ IntegrationType_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &PyLong_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ nullptr, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
/*-----------------------BPy_IntegrationType instance definitions -------------------------*/
diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.h b/source/blender/freestyle/intern/python/BPy_IntegrationType.h
index be815c6c95a..9176a504b24 100644
--- a/source/blender/freestyle/intern/python/BPy_IntegrationType.h
+++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../view_map/Interface1D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp
index 3d0c57d5509..9a86e61e623 100644
--- a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp
@@ -34,6 +34,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -313,43 +315,39 @@ PyTypeObject Interface0D_Type = {
sizeof(BPy_Interface0D), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)Interface0D_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)Interface0D_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Interface0D_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_Interface0D_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_Interface0D_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Interface0D_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)Interface0D_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Interface0D_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_Interface0D_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_Interface0D_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Interface0D_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_Interface0D.h b/source/blender/freestyle/intern/python/BPy_Interface0D.h
index 7e41a8888e1..9734378f446 100644
--- a/source/blender/freestyle/intern/python/BPy_Interface0D.h
+++ b/source/blender/freestyle/intern/python/BPy_Interface0D.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../view_map/Interface0D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,7 +39,7 @@ extern PyTypeObject Interface0D_Type;
/*---------------------------Python BPy_Interface0D structure definition----------*/
typedef struct {
- PyObject_HEAD Interface0D *if0D;
+ PyObject_HEAD Freestyle::Interface0D *if0D;
bool borrowed; /* true if *if0D is a borrowed object */
} BPy_Interface0D;
diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
index 8a4a6eb61db..61884ee63e5 100644
--- a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
@@ -35,6 +35,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -341,43 +343,39 @@ PyTypeObject Interface1D_Type = {
sizeof(BPy_Interface1D), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)Interface1D_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)Interface1D_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Interface1D_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_Interface1D_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_Interface1D_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Interface1D_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)Interface1D_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Interface1D_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_Interface1D_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_Interface1D_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Interface1D_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.h b/source/blender/freestyle/intern/python/BPy_Interface1D.h
index 20a4af0b4d0..4ed562c24f7 100644
--- a/source/blender/freestyle/intern/python/BPy_Interface1D.h
+++ b/source/blender/freestyle/intern/python/BPy_Interface1D.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../view_map/Interface1D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,7 +39,7 @@ extern PyTypeObject Interface1D_Type;
/*---------------------------Python BPy_Interface1D structure definition----------*/
typedef struct {
- PyObject_HEAD Interface1D *if1D;
+ PyObject_HEAD Freestyle::Interface1D *if1D;
bool borrowed; /* true if *if1D is a borrowed object */
} BPy_Interface1D;
diff --git a/source/blender/freestyle/intern/python/BPy_Iterator.cpp b/source/blender/freestyle/intern/python/BPy_Iterator.cpp
index bee30aa9e8c..bc6d8032ea2 100644
--- a/source/blender/freestyle/intern/python/BPy_Iterator.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Iterator.cpp
@@ -36,6 +36,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -228,43 +230,39 @@ PyTypeObject Iterator_Type = {
sizeof(BPy_Iterator), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)Iterator_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)Iterator_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Iterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_Iterator_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_Iterator_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Iterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)Iterator_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Iterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_Iterator_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_Iterator_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Iterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_Iterator.h b/source/blender/freestyle/intern/python/BPy_Iterator.h
index 5d1e8422976..7094384140f 100644
--- a/source/blender/freestyle/intern/python/BPy_Iterator.h
+++ b/source/blender/freestyle/intern/python/BPy_Iterator.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../system/Iterator.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -40,7 +38,7 @@ extern PyTypeObject Iterator_Type;
/*---------------------------Python BPy_Iterator structure definition----------*/
typedef struct {
- PyObject_HEAD Iterator *it;
+ PyObject_HEAD Freestyle::Iterator *it;
} BPy_Iterator;
/*---------------------------Python BPy_Iterator visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_MediumType.cpp b/source/blender/freestyle/intern/python/BPy_MediumType.cpp
index 547f46839b8..d9d5e683c4f 100644
--- a/source/blender/freestyle/intern/python/BPy_MediumType.cpp
+++ b/source/blender/freestyle/intern/python/BPy_MediumType.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*-----------------------BPy_MediumType type definition ------------------------------*/
@@ -45,43 +47,39 @@ PyTypeObject MediumType_Type = {
sizeof(PyLongObject), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- MediumType_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &PyLong_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- nullptr, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ MediumType_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &PyLong_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ nullptr, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
/*-----------------------BPy_IntegrationType instance definitions -------------------------*/
diff --git a/source/blender/freestyle/intern/python/BPy_MediumType.h b/source/blender/freestyle/intern/python/BPy_MediumType.h
index 854f826291e..e34edc45f42 100644
--- a/source/blender/freestyle/intern/python/BPy_MediumType.h
+++ b/source/blender/freestyle/intern/python/BPy_MediumType.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../stroke/Stroke.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/freestyle/intern/python/BPy_Nature.cpp b/source/blender/freestyle/intern/python/BPy_Nature.cpp
index b0a620803d1..45335f27619 100644
--- a/source/blender/freestyle/intern/python/BPy_Nature.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Nature.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
static PyObject *BPy_Nature_and(PyObject *a, PyObject *b);
@@ -107,43 +109,39 @@ PyTypeObject Nature_Type = {
sizeof(PyLongObject), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- &nature_as_number, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- Nature_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &PyLong_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- nullptr, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ &nature_as_number, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Nature_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &PyLong_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ nullptr, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
/*-----------------------BPy_Nature instance definitions ----------------------------------*/
diff --git a/source/blender/freestyle/intern/python/BPy_Nature.h b/source/blender/freestyle/intern/python/BPy_Nature.h
index 48d15c8e796..a105db22b2a 100644
--- a/source/blender/freestyle/intern/python/BPy_Nature.h
+++ b/source/blender/freestyle/intern/python/BPy_Nature.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../winged_edge/Nature.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/freestyle/intern/python/BPy_Operators.cpp b/source/blender/freestyle/intern/python/BPy_Operators.cpp
index 5fd02e4a9dd..004fa118cf6 100644
--- a/source/blender/freestyle/intern/python/BPy_Operators.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Operators.cpp
@@ -36,6 +36,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -260,8 +262,8 @@ PyDoc_STRVAR(Operators_sequential_split_doc,
"\n"
" .. tip::\n"
"\n"
- " By specifiying a starting and stopping predicate allows\n"
- " the chains to overlapp rather than chains partitioning.\n"
+ " By specifying a starting and stopping predicate allows\n"
+ " the chains to overlap rather than chains partitioning.\n"
"\n"
" :arg starting_pred: The predicate on a point that expresses the\n"
" starting condition. Each time this condition is verified, a new chain begins\n"
@@ -770,43 +772,39 @@ PyTypeObject Operators_Type = {
sizeof(BPy_Operators), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)Operators_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- Operators_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_Operators_methods, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- nullptr, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Operators_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_Operators_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ nullptr, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_Operators.h b/source/blender/freestyle/intern/python/BPy_Operators.h
index 3b060d63f3c..9ed6bc2305d 100644
--- a/source/blender/freestyle/intern/python/BPy_Operators.h
+++ b/source/blender/freestyle/intern/python/BPy_Operators.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../stroke/Operators.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/freestyle/intern/python/BPy_SShape.cpp b/source/blender/freestyle/intern/python/BPy_SShape.cpp
index ed83e76559f..0ea02d8a3f6 100644
--- a/source/blender/freestyle/intern/python/BPy_SShape.cpp
+++ b/source/blender/freestyle/intern/python/BPy_SShape.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -199,7 +201,7 @@ static int SShape_name_set(BPy_SShape *self, PyObject *value, void *UNUSED(closu
PyErr_SetString(PyExc_TypeError, "value must be a string");
return -1;
}
- const char *name = _PyUnicode_AsString(value);
+ const char *name = PyUnicode_AsUTF8(value);
self->ss->setName(name);
return 0;
}
@@ -281,43 +283,39 @@ PyTypeObject SShape_Type = {
sizeof(BPy_SShape), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SShape_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)SShape_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- SShape_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_SShape_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_SShape_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)SShape_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)SShape_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ SShape_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_SShape_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_SShape_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)SShape_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_SShape.h b/source/blender/freestyle/intern/python/BPy_SShape.h
index 9741a10f69e..a6fb090a537 100644
--- a/source/blender/freestyle/intern/python/BPy_SShape.h
+++ b/source/blender/freestyle/intern/python/BPy_SShape.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../view_map/Silhouette.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -40,7 +38,7 @@ extern PyTypeObject SShape_Type;
/*---------------------------Python BPy_SShape structure definition----------*/
typedef struct {
- PyObject_HEAD SShape *ss;
+ PyObject_HEAD Freestyle::SShape *ss;
bool borrowed; /* true if *ss is a borrowed object */
} BPy_SShape;
diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
index 8f706f56f7d..256fa5be290 100644
--- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
+++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -677,43 +679,39 @@ PyTypeObject StrokeAttribute_Type = {
sizeof(BPy_StrokeAttribute), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)StrokeAttribute_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)StrokeAttribute_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- StrokeAttribute_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_StrokeAttribute_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_StrokeAttribute_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)StrokeAttribute_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)StrokeAttribute_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ StrokeAttribute_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_StrokeAttribute_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_StrokeAttribute_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)StrokeAttribute_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h
index 9068eb4c7a3..9c0a7368dcb 100644
--- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h
+++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../stroke/Stroke.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,7 +39,7 @@ extern PyTypeObject StrokeAttribute_Type;
/*---------------------------Python BPy_StrokeAttribute structure definition----------*/
typedef struct {
- PyObject_HEAD StrokeAttribute *sa;
+ PyObject_HEAD Freestyle::StrokeAttribute *sa;
bool borrowed; /* true if *sa is a borrowed reference */
} BPy_StrokeAttribute;
diff --git a/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp b/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp
index b55da256c22..9ce91b8a486 100644
--- a/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp
+++ b/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp
@@ -46,6 +46,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -282,43 +284,39 @@ PyTypeObject StrokeShader_Type = {
sizeof(BPy_StrokeShader), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)StrokeShader___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)StrokeShader___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- StrokeShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_StrokeShader_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_StrokeShader_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)StrokeShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)StrokeShader___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ StrokeShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_StrokeShader_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_StrokeShader_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)StrokeShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_StrokeShader.h b/source/blender/freestyle/intern/python/BPy_StrokeShader.h
index 04fff8e8052..74c5df52312 100644
--- a/source/blender/freestyle/intern/python/BPy_StrokeShader.h
+++ b/source/blender/freestyle/intern/python/BPy_StrokeShader.h
@@ -26,12 +26,8 @@ extern "C" {
#include "../system/FreestyleConfig.h"
-using namespace std;
-
#include "../stroke/StrokeShader.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -45,7 +41,7 @@ extern PyTypeObject StrokeShader_Type;
/*---------------------------Python BPy_StrokeShader structure definition----------*/
typedef struct {
- PyObject_HEAD StrokeShader *ss;
+ PyObject_HEAD Freestyle::StrokeShader *ss;
} BPy_StrokeShader;
/*---------------------------Python BPy_StrokeShader visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp
index 78c93ddce31..1bc569860aa 100644
--- a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp
@@ -35,6 +35,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -124,43 +126,39 @@ PyTypeObject UnaryFunction0D_Type = {
sizeof(BPy_UnaryFunction0D), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0D___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0D___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction0D_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- nullptr, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0D___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction0D_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ nullptr, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h
index 1319cabe94a..ef3021faf48 100644
--- a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h
+++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../view_map/Functions0D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp
index 365850b748c..c11640aa136 100644
--- a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp
@@ -33,6 +33,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -118,43 +120,39 @@ PyTypeObject UnaryFunction1D_Type = {
sizeof(BPy_UnaryFunction1D), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1D___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1D___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1D_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- nullptr, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1D___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1D_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ nullptr, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h
index 331c3b4aaa1..4613d58c2b7 100644
--- a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h
+++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../view_map/Functions1D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp
index e3076d4615f..cc9f666fbdd 100644
--- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -167,43 +169,39 @@ PyTypeObject UnaryPredicate0D_Type = {
sizeof(BPy_UnaryPredicate0D), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryPredicate0D___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryPredicate0D___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryPredicate0D___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryPredicate0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryPredicate0D_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryPredicate0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryPredicate0D___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryPredicate0D___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryPredicate0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryPredicate0D_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryPredicate0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h
index 2460b1f028b..3d45c2fc701 100644
--- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h
+++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../stroke/Predicates0D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,7 +39,7 @@ extern PyTypeObject UnaryPredicate0D_Type;
/*---------------------------Python BPy_UnaryPredicate0D structure definition----------*/
typedef struct {
- PyObject_HEAD UnaryPredicate0D *up0D;
+ PyObject_HEAD Freestyle::UnaryPredicate0D *up0D;
} BPy_UnaryPredicate0D;
/*---------------------------Python BPy_UnaryPredicate0D visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp
index 4b5269a1434..41c0acc088c 100644
--- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp
@@ -38,6 +38,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -225,43 +227,39 @@ PyTypeObject UnaryPredicate1D_Type = {
sizeof(BPy_UnaryPredicate1D), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryPredicate1D___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryPredicate1D___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryPredicate1D___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryPredicate1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryPredicate1D_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryPredicate1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryPredicate1D___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryPredicate1D___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryPredicate1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryPredicate1D_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryPredicate1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h
index 8fad7f94caf..0139ed8af77 100644
--- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h
+++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../stroke/Predicates1D.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,7 +39,7 @@ extern PyTypeObject UnaryPredicate1D_Type;
/*---------------------------Python BPy_UnaryPredicate1D structure definition----------*/
typedef struct {
- PyObject_HEAD UnaryPredicate1D *up1D;
+ PyObject_HEAD Freestyle::UnaryPredicate1D *up1D;
} BPy_UnaryPredicate1D;
/*---------------------------Python BPy_UnaryPredicate1D visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_ViewMap.cpp b/source/blender/freestyle/intern/python/BPy_ViewMap.cpp
index 8565a95fc1a..269959a19c3 100644
--- a/source/blender/freestyle/intern/python/BPy_ViewMap.cpp
+++ b/source/blender/freestyle/intern/python/BPy_ViewMap.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -184,43 +186,39 @@ PyTypeObject ViewMap_Type = {
sizeof(BPy_ViewMap), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)ViewMap_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)ViewMap_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ViewMap_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_ViewMap_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_ViewMap_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ViewMap_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)ViewMap_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ViewMap_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_ViewMap_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_ViewMap_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ViewMap_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_ViewMap.h b/source/blender/freestyle/intern/python/BPy_ViewMap.h
index 59738b6dce9..2222b327dc2 100644
--- a/source/blender/freestyle/intern/python/BPy_ViewMap.h
+++ b/source/blender/freestyle/intern/python/BPy_ViewMap.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../view_map/ViewMap.h"
-using namespace Freestyle;
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -40,7 +38,7 @@ extern PyTypeObject ViewMap_Type;
/*---------------------------Python BPy_ViewMap structure definition----------*/
typedef struct {
- PyObject_HEAD ViewMap *vm;
+ PyObject_HEAD Freestyle::ViewMap *vm;
} BPy_ViewMap;
/*---------------------------Python BPy_ViewMap visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp
index 6c8551867fd..dd9d169dac2 100644
--- a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp
+++ b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -352,43 +354,39 @@ PyTypeObject ViewShape_Type = {
sizeof(BPy_ViewShape), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)ViewShape_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)ViewShape_repr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ViewShape_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_ViewShape_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_ViewShape_getseters, /* tp_getset */
- nullptr, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ViewShape_init, /* tp_init */
- nullptr, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)ViewShape_repr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ViewShape_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_ViewShape_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_ViewShape_getseters, /* tp_getset */
+ nullptr, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ViewShape_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_ViewShape.h b/source/blender/freestyle/intern/python/BPy_ViewShape.h
index bd51fd0d5cb..8401c4378f0 100644
--- a/source/blender/freestyle/intern/python/BPy_ViewShape.h
+++ b/source/blender/freestyle/intern/python/BPy_ViewShape.h
@@ -26,8 +26,6 @@ extern "C" {
#include "../view_map/ViewMap.h"
-using namespace Freestyle;
-
#include "BPy_SShape.h"
#ifdef __cplusplus
@@ -42,7 +40,7 @@ extern PyTypeObject ViewShape_Type;
/*---------------------------Python BPy_ViewShape structure definition----------*/
typedef struct {
- PyObject_HEAD ViewShape *vs;
+ PyObject_HEAD Freestyle::ViewShape *vs;
bool borrowed; /* true if *vs a borrowed object */
BPy_SShape *py_ss;
} BPy_ViewShape;
diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp
index e284f28cd0b..ed09025a45e 100644
--- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp
+++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -59,43 +61,39 @@ PyTypeObject FalseBP1D_Type = {
sizeof(BPy_FalseBP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FalseBP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &BinaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FalseBP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FalseBP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &BinaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FalseBP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp
index 2c84f69dd6e..9d4f0693af9 100644
--- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp
+++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -61,43 +63,39 @@ PyTypeObject Length2DBP1D_Type = {
sizeof(BPy_Length2DBP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Length2DBP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &BinaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Length2DBP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Length2DBP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &BinaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Length2DBP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp
index ab79ae4e209..372d250c628 100644
--- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp
+++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -60,43 +62,39 @@ PyTypeObject SameShapeIdBP1D_Type = {
sizeof(BPy_SameShapeIdBP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- SameShapeIdBP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &BinaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)SameShapeIdBP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ SameShapeIdBP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &BinaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)SameShapeIdBP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp
index 47c3c6b53aa..04bd36738d1 100644
--- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp
+++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -60,43 +62,39 @@ PyTypeObject TrueBP1D_Type = {
sizeof(BPy_TrueBP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- TrueBP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &BinaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)TrueBP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ TrueBP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &BinaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)TrueBP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp
index 9d69b1c902c..337d0fa3020 100644
--- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp
+++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -90,43 +92,39 @@ PyTypeObject ViewMapGradientNormBP1D_Type = {
sizeof(BPy_ViewMapGradientNormBP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ViewMapGradientNormBP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &BinaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ViewMapGradientNormBP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ViewMapGradientNormBP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &BinaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ViewMapGradientNormBP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Director.cpp b/source/blender/freestyle/intern/python/Director.cpp
index ff1d63f5f58..4dd3f732be9 100644
--- a/source/blender/freestyle/intern/python/Director.cpp
+++ b/source/blender/freestyle/intern/python/Director.cpp
@@ -56,6 +56,8 @@
#include "UnaryFunction1D/BPy_UnaryFunction1DVec3f.h"
#include "UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h"
+using namespace Freestyle;
+
// BinaryPredicate0D: __call__
int Director_BPy_BinaryPredicate0D___call__(BinaryPredicate0D *bp0D,
Interface0D &i1,
diff --git a/source/blender/freestyle/intern/python/Director.h b/source/blender/freestyle/intern/python/Director.h
index 468150524f1..0894911fe14 100644
--- a/source/blender/freestyle/intern/python/Director.h
+++ b/source/blender/freestyle/intern/python/Director.h
@@ -34,31 +34,34 @@ class Stroke;
class StrokeShader;
} // namespace Freestyle
-using namespace Freestyle;
-
// BinaryPredicate0D: __call__
-int Director_BPy_BinaryPredicate0D___call__(BinaryPredicate0D *bp0D,
- Interface0D &i1,
- Interface0D &i2);
+int Director_BPy_BinaryPredicate0D___call__(Freestyle::BinaryPredicate0D *bp0D,
+ Freestyle::Interface0D &i1,
+ Freestyle::Interface0D &i2);
// BinaryPredicate1D: __call__
-int Director_BPy_BinaryPredicate1D___call__(BinaryPredicate1D *bp1D,
- Interface1D &i1,
- Interface1D &i2);
+int Director_BPy_BinaryPredicate1D___call__(Freestyle::BinaryPredicate1D *bp1D,
+ Freestyle::Interface1D &i1,
+ Freestyle::Interface1D &i2);
// UnaryFunction{0D,1D}: __call__
-int Director_BPy_UnaryFunction0D___call__(void *uf0D, void *py_uf0D, Interface0DIterator &if0D_it);
-int Director_BPy_UnaryFunction1D___call__(void *uf1D, void *py_uf1D, Interface1D &if1D);
+int Director_BPy_UnaryFunction0D___call__(void *uf0D,
+ void *py_uf0D,
+ Freestyle::Interface0DIterator &if0D_it);
+int Director_BPy_UnaryFunction1D___call__(void *uf1D, void *py_uf1D, Freestyle::Interface1D &if1D);
// UnaryPredicate0D: __call__
-int Director_BPy_UnaryPredicate0D___call__(UnaryPredicate0D *up0D, Interface0DIterator &if0D_it);
+int Director_BPy_UnaryPredicate0D___call__(Freestyle::UnaryPredicate0D *up0D,
+ Freestyle::Interface0DIterator &if0D_it);
// UnaryPredicate1D: __call__
-int Director_BPy_UnaryPredicate1D___call__(UnaryPredicate1D *up1D, Interface1D &if1D);
+int Director_BPy_UnaryPredicate1D___call__(Freestyle::UnaryPredicate1D *up1D,
+ Freestyle::Interface1D &if1D);
// StrokeShader: shade
-int Director_BPy_StrokeShader_shade(StrokeShader *ss, Stroke &s);
+int Director_BPy_StrokeShader_shade(Freestyle::StrokeShader *ss, Freestyle::Stroke &s);
// ChainingIterator: init, traverse
-int Director_BPy_ChainingIterator_init(ChainingIterator *c_it);
-int Director_BPy_ChainingIterator_traverse(ChainingIterator *c_it, AdjacencyIterator &a_it);
+int Director_BPy_ChainingIterator_init(Freestyle::ChainingIterator *c_it);
+int Director_BPy_ChainingIterator_traverse(Freestyle::ChainingIterator *c_it,
+ Freestyle::AdjacencyIterator &a_it);
diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp
index f70f70275df..2367c3f9cb5 100644
--- a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp
+++ b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------CurvePoint methods----------------------------*/
@@ -242,43 +244,39 @@ PyTypeObject CurvePoint_Type = {
sizeof(BPy_CurvePoint), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- CurvePoint_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_CurvePoint_getseters, /* tp_getset */
- &Interface0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)CurvePoint_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ CurvePoint_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_CurvePoint_getseters, /* tp_getset */
+ &Interface0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)CurvePoint_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h
index 6a550085817..0def155d22b 100644
--- a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h
+++ b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h
@@ -37,7 +37,7 @@ extern PyTypeObject CurvePoint_Type;
/*---------------------------Python BPy_CurvePoint structure definition----------*/
typedef struct {
BPy_Interface0D py_if0D;
- CurvePoint *cp;
+ Freestyle::CurvePoint *cp;
} BPy_CurvePoint;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp
index b245ecd81f1..4f1b57915b2 100644
--- a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp
+++ b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------SVertex methods ----------------------------*/
@@ -455,43 +457,39 @@ PyTypeObject SVertex_Type = {
sizeof(BPy_SVertex), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- SVertex_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_SVertex_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_SVertex_getseters, /* tp_getset */
- &Interface0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)SVertex_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ SVertex_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_SVertex_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_SVertex_getseters, /* tp_getset */
+ &Interface0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)SVertex_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h
index 8d24576a98f..d2fa48d17d8 100644
--- a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h
+++ b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h
@@ -37,7 +37,7 @@ extern PyTypeObject SVertex_Type;
/*---------------------------Python BPy_SVertex structure definition----------*/
typedef struct {
BPy_Interface0D py_if0D;
- SVertex *sv;
+ Freestyle::SVertex *sv;
} BPy_SVertex;
/*---------------------------Python BPy_SVertex visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp
index 696b3022e85..600ee37aa55 100644
--- a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp
+++ b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------ViewVertex methods----------------------------*/
@@ -164,43 +166,39 @@ PyTypeObject ViewVertex_Type = {
sizeof(BPy_ViewVertex), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ViewVertex_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_ViewVertex_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_ViewVertex_getseters, /* tp_getset */
- &Interface0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ViewVertex_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ViewVertex_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_ViewVertex_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_ViewVertex_getseters, /* tp_getset */
+ &Interface0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ViewVertex_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h
index cb9815fb3d4..b5881dcafb5 100644
--- a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h
+++ b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h
@@ -37,7 +37,7 @@ extern PyTypeObject ViewVertex_Type;
/*---------------------------Python BPy_ViewVertex structure definition----------*/
typedef struct {
BPy_Interface0D py_if0D;
- ViewVertex *vv;
+ Freestyle::ViewVertex *vv;
} BPy_ViewVertex;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp
index 5e63e190356..79e537d48c0 100644
--- a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp
+++ b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -361,43 +363,39 @@ PyTypeObject StrokeVertex_Type = {
sizeof(BPy_StrokeVertex), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- StrokeVertex_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_StrokeVertex_getseters, /* tp_getset */
- &CurvePoint_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)StrokeVertex_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ StrokeVertex_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_StrokeVertex_getseters, /* tp_getset */
+ &CurvePoint_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)StrokeVertex_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h
index 44da0ed212a..d635a8541db 100644
--- a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h
+++ b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h
@@ -38,7 +38,7 @@ extern PyTypeObject StrokeVertex_Type;
/*---------------------------Python BPy_StrokeVertex structure definition----------*/
typedef struct {
BPy_CurvePoint py_cp;
- StrokeVertex *sv;
+ Freestyle::StrokeVertex *sv;
} BPy_StrokeVertex;
/*---------------------------Python BPy_StrokeVertex visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp
index ed10f3e0af5..7b782b513b6 100644
--- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp
+++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------NonTVertex methods ----------------------------*/
@@ -109,43 +111,39 @@ PyTypeObject NonTVertex_Type = {
sizeof(BPy_NonTVertex), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- NonTVertex_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_NonTVertex_getseters, /* tp_getset */
- &ViewVertex_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)NonTVertex_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ NonTVertex_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_NonTVertex_getseters, /* tp_getset */
+ &ViewVertex_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)NonTVertex_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h
index 43f2c2b4a5c..6d84533aa6b 100644
--- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h
+++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h
@@ -37,7 +37,7 @@ extern PyTypeObject NonTVertex_Type;
/*---------------------------Python BPy_NonTVertex structure definition----------*/
typedef struct {
BPy_ViewVertex py_vv;
- NonTVertex *ntv;
+ Freestyle::NonTVertex *ntv;
} BPy_NonTVertex;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp
index 596eec7a4e5..eecede4f1f3 100644
--- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp
+++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------TVertex methods ----------------------------*/
@@ -219,43 +221,39 @@ PyTypeObject TVertex_Type = {
sizeof(BPy_TVertex), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- TVertex_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_TVertex_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_TVertex_getseters, /* tp_getset */
- &ViewVertex_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)TVertex_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ TVertex_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_TVertex_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_TVertex_getseters, /* tp_getset */
+ &ViewVertex_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)TVertex_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h
index 253934bb4e7..009ba24d1e8 100644
--- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h
+++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h
@@ -37,7 +37,7 @@ extern PyTypeObject TVertex_Type;
/*---------------------------Python BPy_TVertex structure definition----------*/
typedef struct {
BPy_ViewVertex py_vv;
- TVertex *tv;
+ Freestyle::TVertex *tv;
} BPy_TVertex;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp
index 0438abfd38c..e8f80f515df 100644
--- a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------FEdge methods ----------------------------*/
@@ -358,43 +360,39 @@ PyTypeObject FEdge_Type = {
sizeof(BPy_FEdge), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- &BPy_FEdge_as_sequence, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FEdge_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_FEdge_getseters, /* tp_getset */
- &Interface1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FEdge_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ &BPy_FEdge_as_sequence, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FEdge_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_FEdge_getseters, /* tp_getset */
+ &Interface1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FEdge_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h
index 25b1bc99860..3c259d77a44 100644
--- a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h
+++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h
@@ -37,7 +37,7 @@ extern PyTypeObject FEdge_Type;
/*---------------------------Python BPy_FEdge structure definition----------*/
typedef struct {
BPy_Interface1D py_if1D;
- FEdge *fe;
+ Freestyle::FEdge *fe;
} BPy_FEdge;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp
index d77a8007b1a..bf7feb7be27 100644
--- a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------CurvePoint methods ----------------------------*/
@@ -190,43 +192,39 @@ PyTypeObject FrsCurve_Type = {
sizeof(BPy_FrsCurve), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FrsCurve_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_FrsCurve_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_FrsCurve_getseters, /* tp_getset */
- &Interface1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FrsCurve_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FrsCurve_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_FrsCurve_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_FrsCurve_getseters, /* tp_getset */
+ &Interface1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FrsCurve_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h
index 9bdc3919a38..be3e98edefe 100644
--- a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h
+++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h
@@ -37,7 +37,7 @@ extern PyTypeObject FrsCurve_Type;
/*---------------------------Python BPy_FrsCurve structure definition----------*/
typedef struct {
BPy_Interface1D py_if1D;
- Curve *c;
+ Freestyle::Curve *c;
} BPy_FrsCurve;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp
index 90cc3e4f1ab..8df40087f9b 100644
--- a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp
@@ -31,6 +31,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------Stroke methods ----------------------------*/
@@ -501,43 +503,39 @@ PyTypeObject Stroke_Type = {
sizeof(BPy_Stroke), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- &BPy_Stroke_as_sequence, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Stroke_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- (getiterfunc)Stroke_iter, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_Stroke_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_Stroke_getseters, /* tp_getset */
- &Interface1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Stroke_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ &BPy_Stroke_as_sequence, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Stroke_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)Stroke_iter, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_Stroke_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_Stroke_getseters, /* tp_getset */
+ &Interface1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Stroke_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h
index 33c6aa70f91..eb919b4a376 100644
--- a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h
+++ b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h
@@ -37,7 +37,7 @@ extern PyTypeObject Stroke_Type;
/*---------------------------Python BPy_Stroke structure definition----------*/
typedef struct {
BPy_Interface1D py_if1D;
- Stroke *s;
+ Freestyle::Stroke *s;
} BPy_Stroke;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp
index c416d860c77..eee5dc095a6 100644
--- a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp
@@ -32,6 +32,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------ViewEdge methods ----------------------------*/
@@ -386,43 +388,39 @@ PyTypeObject ViewEdge_Type = {
sizeof(BPy_ViewEdge), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ViewEdge_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_ViewEdge_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_ViewEdge_getseters, /* tp_getset */
- &Interface1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ViewEdge_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ViewEdge_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_ViewEdge_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_ViewEdge_getseters, /* tp_getset */
+ &Interface1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ViewEdge_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h
index 519081cedbd..ffcdb46cff6 100644
--- a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h
+++ b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h
@@ -37,7 +37,7 @@ extern PyTypeObject ViewEdge_Type;
/*---------------------------Python BPy_ViewEdge structure definition----------*/
typedef struct {
BPy_Interface1D py_if1D;
- ViewEdge *ve;
+ Freestyle::ViewEdge *ve;
} BPy_ViewEdge;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp
index dcf6c149b7d..5de2f435469 100644
--- a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------Chain methods ----------------------------*/
@@ -150,43 +152,39 @@ PyTypeObject Chain_Type = {
sizeof(BPy_Chain), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Chain_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_Chain_methods, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &FrsCurve_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Chain_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Chain_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_Chain_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &FrsCurve_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Chain_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h
index 73da253688c..279a9cdc945 100644
--- a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h
+++ b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h
@@ -37,7 +37,7 @@ extern PyTypeObject Chain_Type;
/*---------------------------Python BPy_Chain structure definition----------*/
typedef struct {
BPy_FrsCurve py_c;
- Chain *c;
+ Freestyle::Chain *c;
} BPy_Chain;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp
index 454a2bb1c0f..538e5d3bf85 100644
--- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------FEdgeSharp methods ----------------------------*/
@@ -408,43 +410,39 @@ PyTypeObject FEdgeSharp_Type = {
sizeof(BPy_FEdgeSharp), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FEdgeSharp_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_FEdgeSharp_getseters, /* tp_getset */
- &FEdge_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FEdgeSharp_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FEdgeSharp_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_FEdgeSharp_getseters, /* tp_getset */
+ &FEdge_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FEdgeSharp_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h
index 2b8b09a5990..c3d0298bc5c 100644
--- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h
+++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h
@@ -37,7 +37,7 @@ extern PyTypeObject FEdgeSharp_Type;
/*---------------------------Python BPy_FEdgeSharp structure definition----------*/
typedef struct {
BPy_FEdge py_fe;
- FEdgeSharp *fes;
+ Freestyle::FEdgeSharp *fes;
} BPy_FEdgeSharp;
/*---------------------------Python BPy_FEdgeSharp visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp
index c0d56ec949c..8f244fb203d 100644
--- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
/*----------------------FEdgeSmooth methods ----------------------------*/
@@ -253,43 +255,39 @@ PyTypeObject FEdgeSmooth_Type = {
sizeof(BPy_FEdgeSmooth), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FEdgeSmooth_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_FEdgeSmooth_getseters, /* tp_getset */
- &FEdge_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FEdgeSmooth_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FEdgeSmooth_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_FEdgeSmooth_getseters, /* tp_getset */
+ &FEdge_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FEdgeSmooth_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h
index 97497281310..d8ddd6c573f 100644
--- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h
+++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h
@@ -38,7 +38,7 @@ extern PyTypeObject FEdgeSmooth_Type;
/*---------------------------Python BPy_FEdgeSmooth structure definition----------*/
typedef struct {
BPy_FEdge py_fe;
- FEdgeSmooth *fes;
+ Freestyle::FEdgeSmooth *fes;
} BPy_FEdgeSmooth;
/*---------------------------Python BPy_FEdgeSmooth visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
index 9f5f8d07e26..6945e3f2b51 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -186,43 +188,39 @@ PyTypeObject AdjacencyIterator_Type = {
sizeof(BPy_AdjacencyIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- AdjacencyIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- (getiterfunc)AdjacencyIterator_iter, /* tp_iter */
- (iternextfunc)AdjacencyIterator_iternext, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_AdjacencyIterator_getseters, /* tp_getset */
- &Iterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)AdjacencyIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ AdjacencyIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)AdjacencyIterator_iter, /* tp_iter */
+ (iternextfunc)AdjacencyIterator_iternext, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_AdjacencyIterator_getseters, /* tp_getset */
+ &Iterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)AdjacencyIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
index e5332e0d180..1de73dad015 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject AdjacencyIterator_Type;
/*---------------------------Python BPy_AdjacencyIterator structure definition----------*/
typedef struct {
BPy_Iterator py_it;
- AdjacencyIterator *a_it;
+ Freestyle::AdjacencyIterator *a_it;
bool at_start;
} BPy_AdjacencyIterator;
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp
index e4cd1cd073b..94d8952ef42 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -167,43 +169,39 @@ PyTypeObject ChainPredicateIterator_Type = {
sizeof(BPy_ChainPredicateIterator), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)ChainPredicateIterator_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ChainPredicateIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &ChainingIterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ChainPredicateIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ChainPredicateIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &ChainingIterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ChainPredicateIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h
index ece8018d285..ae6f7307e3c 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject ChainPredicateIterator_Type;
/*---------------------------Python BPy_ChainPredicateIterator structure definition----------*/
typedef struct {
BPy_ChainingIterator py_c_it;
- ChainPredicateIterator *cp_it;
+ Freestyle::ChainPredicateIterator *cp_it;
PyObject *upred;
PyObject *bpred;
} BPy_ChainPredicateIterator;
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp
index 9aa8984f4af..36c251bb916 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -121,43 +123,39 @@ PyTypeObject ChainSilhouetteIterator_Type = {
sizeof(BPy_ChainSilhouetteIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ChainSilhouetteIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &ChainingIterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ChainSilhouetteIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ChainSilhouetteIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &ChainingIterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ChainSilhouetteIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h
index f91d0fb2585..7eb5ca8d70c 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject ChainSilhouetteIterator_Type;
/*---------------------------Python BPy_ChainSilhouetteIterator structure definition----------*/
typedef struct {
BPy_ChainingIterator py_c_it;
- ChainSilhouetteIterator *cs_it;
+ Freestyle::ChainSilhouetteIterator *cs_it;
} BPy_ChainSilhouetteIterator;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp
index f2441fa9d18..10b3ccdc496 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -255,43 +257,39 @@ PyTypeObject ChainingIterator_Type = {
sizeof(BPy_ChainingIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ChainingIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_ChainingIterator_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_ChainingIterator_getseters, /* tp_getset */
- &ViewEdgeIterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ChainingIterator___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ChainingIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_ChainingIterator_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_ChainingIterator_getseters, /* tp_getset */
+ &ViewEdgeIterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ChainingIterator___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h
index e950824764c..54fd6e08f05 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject ChainingIterator_Type;
/*---------------------------Python BPy_ChainingIterator structure definition----------*/
typedef struct {
BPy_ViewEdgeIterator py_ve_it;
- ChainingIterator *c_it;
+ Freestyle::ChainingIterator *c_it;
} BPy_ChainingIterator;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp
index ff710e931d4..4c93b8337cf 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -135,43 +137,39 @@ PyTypeObject CurvePointIterator_Type = {
sizeof(BPy_CurvePointIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- CurvePointIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_CurvePointIterator_getseters, /* tp_getset */
- &Iterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)CurvePointIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ CurvePointIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_CurvePointIterator_getseters, /* tp_getset */
+ &Iterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)CurvePointIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h
index db36bf386ec..2de21178e95 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject CurvePointIterator_Type;
/*---------------------------Python BPy_CurvePointIterator structure definition----------*/
typedef struct {
BPy_Iterator py_it;
- CurveInternal::CurvePointIterator *cp_it;
+ Freestyle::CurveInternal::CurvePointIterator *cp_it;
} BPy_CurvePointIterator;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
index d0de53fa424..2ac3857375a 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -210,43 +212,39 @@ PyTypeObject Interface0DIterator_Type = {
sizeof(BPy_Interface0DIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Interface0DIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- (getiterfunc)Interface0DIterator_iter, /* tp_iter */
- (iternextfunc)Interface0DIterator_iternext, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_Interface0DIterator_getseters, /* tp_getset */
- &Iterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Interface0DIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Interface0DIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)Interface0DIterator_iter, /* tp_iter */
+ (iternextfunc)Interface0DIterator_iternext, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_Interface0DIterator_getseters, /* tp_getset */
+ &Iterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Interface0DIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
index 663193bedee..82e44218634 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject Interface0DIterator_Type;
/*---------------------------Python BPy_Interface0DIterator structure definition----------*/
typedef struct {
BPy_Iterator py_it;
- Interface0DIterator *if0D_it;
+ Freestyle::Interface0DIterator *if0D_it;
bool reversed;
bool at_start;
} BPy_Interface0DIterator;
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp
index c0db79858b7..ffb90281442 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -162,43 +164,39 @@ PyTypeObject SVertexIterator_Type = {
sizeof(BPy_SVertexIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- SVertexIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_SVertexIterator_getseters, /* tp_getset */
- &Iterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)SVertexIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ SVertexIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_SVertexIterator_getseters, /* tp_getset */
+ &Iterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)SVertexIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h
index a34dc7a63c5..c7b18db8e48 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject SVertexIterator_Type;
/*---------------------------Python BPy_SVertexIterator structure definition----------*/
typedef struct {
BPy_Iterator py_it;
- ViewEdgeInternal::SVertexIterator *sv_it;
+ Freestyle::ViewEdgeInternal::SVertexIterator *sv_it;
} BPy_SVertexIterator;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
index ceb0d2a7546..f94ab4d3b8f 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -293,43 +295,39 @@ PyTypeObject StrokeVertexIterator_Type = {
sizeof(BPy_StrokeVertexIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- StrokeVertexIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- (getiterfunc)StrokeVertexIterator_iter, /* tp_iter */
- (iternextfunc)StrokeVertexIterator_iternext, /* tp_iternext */
- BPy_StrokeVertexIterator_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_StrokeVertexIterator_getseters, /* tp_getset */
- &Iterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)StrokeVertexIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ StrokeVertexIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)StrokeVertexIterator_iter, /* tp_iter */
+ (iternextfunc)StrokeVertexIterator_iternext, /* tp_iternext */
+ BPy_StrokeVertexIterator_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_StrokeVertexIterator_getseters, /* tp_getset */
+ &Iterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)StrokeVertexIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h
index 629471a664c..d7ad3d99a54 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject StrokeVertexIterator_Type;
/*---------------------------Python BPy_StrokeVertexIterator structure definition----------*/
typedef struct {
BPy_Iterator py_it;
- StrokeInternal::StrokeVertexIterator *sv_it;
+ Freestyle::StrokeInternal::StrokeVertexIterator *sv_it;
bool reversed;
/* attribute to make next() work correctly */
bool at_start;
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp
index e01bbe928ce..c878178f9ca 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -240,43 +242,39 @@ PyTypeObject ViewEdgeIterator_Type = {
sizeof(BPy_ViewEdgeIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ViewEdgeIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- BPy_ViewEdgeIterator_methods, /* tp_methods */
- nullptr, /* tp_members */
- BPy_ViewEdgeIterator_getseters, /* tp_getset */
- &Iterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ViewEdgeIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ViewEdgeIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ BPy_ViewEdgeIterator_methods, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_ViewEdgeIterator_getseters, /* tp_getset */
+ &Iterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ViewEdgeIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h
index 7169a13f328..782f20c8884 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject ViewEdgeIterator_Type;
/*---------------------------Python BPy_ViewEdgeIterator structure definition----------*/
typedef struct {
BPy_Iterator py_it;
- ViewEdgeInternal::ViewEdgeIterator *ve_it;
+ Freestyle::ViewEdgeInternal::ViewEdgeIterator *ve_it;
} BPy_ViewEdgeIterator;
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp
index 735746e33be..5da124ce40a 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -144,43 +146,39 @@ PyTypeObject orientedViewEdgeIterator_Type = {
sizeof(BPy_orientedViewEdgeIterator), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- orientedViewEdgeIterator_doc, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- (getiterfunc)orientedViewEdgeIterator_iter, /* tp_iter */
- (iternextfunc)orientedViewEdgeIterator_iternext, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_orientedViewEdgeIterator_getseters, /* tp_getset */
- &Iterator_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)orientedViewEdgeIterator_init, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ orientedViewEdgeIterator_doc, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)orientedViewEdgeIterator_iter, /* tp_iter */
+ (iternextfunc)orientedViewEdgeIterator_iternext, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_orientedViewEdgeIterator_getseters, /* tp_getset */
+ &Iterator_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)orientedViewEdgeIterator_init, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h
index 7a13f6d2c72..c6b1a123324 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h
@@ -38,7 +38,7 @@ extern PyTypeObject orientedViewEdgeIterator_Type;
/*---------------------------Python BPy_orientedViewEdgeIterator structure definition----------*/
typedef struct {
BPy_Iterator py_it;
- ViewVertexInternal::orientedViewEdgeIterator *ove_it;
+ Freestyle::ViewVertexInternal::orientedViewEdgeIterator *ove_it;
bool reversed;
bool at_start;
} BPy_orientedViewEdgeIterator;
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp
index c3b98d12918..2171b7bb2b9 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -71,43 +73,39 @@ PyTypeObject BackboneStretcherShader_Type = {
sizeof(BPy_BackboneStretcherShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- BackboneStretcherShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)BackboneStretcherShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ BackboneStretcherShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)BackboneStretcherShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp
index 50fc9938a87..69f1814e38e 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -71,43 +73,39 @@ PyTypeObject BezierCurveShader_Type = {
sizeof(BPy_BezierCurveShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- BezierCurveShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)BezierCurveShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ BezierCurveShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)BezierCurveShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp
index e1198266a98..06785ca5617 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp
@@ -28,6 +28,8 @@ extern "C" {
#include "../../../../python/generic/py_capi_utils.h"
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -91,43 +93,39 @@ PyTypeObject BlenderTextureShader_Type = {
sizeof(BPy_BlenderTextureShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- BlenderTextureShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)BlenderTextureShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ BlenderTextureShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)BlenderTextureShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp
index e8790df2dd0..a5aa5e188ff 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -89,43 +91,39 @@ PyTypeObject CalligraphicShader_Type = {
sizeof(BPy_CalligraphicShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- CalligraphicShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)CalligraphicShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ CalligraphicShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)CalligraphicShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp
index 8fb6e26d8d7..2642f109acf 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -70,43 +72,39 @@ PyTypeObject ColorNoiseShader_Type = {
sizeof(BPy_ColorNoiseShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ColorNoiseShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ColorNoiseShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ColorNoiseShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ColorNoiseShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp
index 2b108226e90..a1e20542acf 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -76,43 +78,39 @@ PyTypeObject ConstantColorShader_Type = {
sizeof(BPy_ConstantColorShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ConstantColorShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ConstantColorShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ConstantColorShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ConstantColorShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp
index 0174107f27f..6e338a5f6be 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -70,43 +72,39 @@ PyTypeObject ConstantThicknessShader_Type = {
sizeof(BPy_ConstantThicknessShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ConstantThicknessShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ConstantThicknessShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ConstantThicknessShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ConstantThicknessShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp
index b5c200c17b1..db4b6df6cb4 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -76,11 +78,7 @@ PyTypeObject ConstrainedIncreasingThicknessShader_Type = {
sizeof(BPy_ConstrainedIncreasingThicknessShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
+ 0, /* tp_vectorcall_offset */
nullptr, /* tp_getattr */
nullptr, /* tp_setattr */
nullptr, /* tp_reserved */
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp
index d1c3219b079..7365c369fb3 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -78,43 +80,39 @@ PyTypeObject GuidingLinesShader_Type = {
sizeof(BPy_GuidingLinesShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GuidingLinesShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GuidingLinesShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GuidingLinesShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GuidingLinesShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp
index 7d1efebe71f..d6f33c3a295 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -98,43 +100,39 @@ PyTypeObject IncreasingColorShader_Type = {
sizeof(BPy_IncreasingColorShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- IncreasingColorShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)IncreasingColorShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ IncreasingColorShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)IncreasingColorShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp
index f13930bd4b3..296d3fb0713 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -76,43 +78,39 @@ PyTypeObject IncreasingThicknessShader_Type = {
sizeof(BPy_IncreasingThicknessShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- IncreasingThicknessShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)IncreasingThicknessShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ IncreasingThicknessShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)IncreasingThicknessShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp
index 48c63554f06..68c14e1151c 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -41,7 +43,7 @@ static char PolygonalizationShader___doc__[] =
"\n"
" :arg error: The error we want our polygonal approximation to have\n"
" with respect to the original geometry. The smaller, the closer\n"
- " the new stroke is to the orinal one. This error corresponds to\n"
+ " the new stroke is to the original one. This error corresponds to\n"
" the maximum distance between the new stroke and the old one.\n"
" :type error: float\n"
"\n"
@@ -77,43 +79,39 @@ PyTypeObject PolygonalizationShader_Type = {
sizeof(BPy_PolygonalizationShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- PolygonalizationShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)PolygonalizationShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ PolygonalizationShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)PolygonalizationShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp
index 5f0a0bfb305..e4aeb612cc4 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -68,43 +70,39 @@ PyTypeObject SamplingShader_Type = {
sizeof(BPy_SamplingShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- SamplingShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)SamplingShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ SamplingShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)SamplingShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp
index 3d30fb4e11b..55aee8b8a56 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -100,43 +102,39 @@ PyTypeObject SmoothingShader_Type = {
sizeof(BPy_SmoothingShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- SmoothingShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)SmoothingShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ SmoothingShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)SmoothingShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp
index 876dd5f2f63..85e49b51f47 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp
@@ -27,6 +27,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -94,43 +96,39 @@ PyTypeObject SpatialNoiseShader_Type = {
sizeof(BPy_SpatialNoiseShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- SpatialNoiseShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)SpatialNoiseShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ SpatialNoiseShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)SpatialNoiseShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp
index bd70d41717b..d914b180f6f 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -70,43 +72,39 @@ PyTypeObject StrokeTextureStepShader_Type = {
sizeof(BPy_StrokeTextureStepShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- StrokeTextureStepShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)StrokeTextureStepShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ StrokeTextureStepShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)StrokeTextureStepShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp
index fd7f5fabe77..db1e634f91e 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -72,43 +74,39 @@ PyTypeObject ThicknessNoiseShader_Type = {
sizeof(BPy_ThicknessNoiseShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ThicknessNoiseShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ThicknessNoiseShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ThicknessNoiseShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ThicknessNoiseShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp
index ed575b12b8d..ee1ac7697db 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -69,43 +71,39 @@ PyTypeObject TipRemoverShader_Type = {
sizeof(BPy_TipRemoverShader), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- TipRemoverShader___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &StrokeShader_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)TipRemoverShader___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ TipRemoverShader___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &StrokeShader_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)TipRemoverShader___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp
index 5ce96212031..d2f138dc176 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp
@@ -38,6 +38,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -187,43 +189,39 @@ PyTypeObject UnaryFunction0DDouble_Type = {
sizeof(BPy_UnaryFunction0DDouble), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DDouble___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DDouble___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DDouble___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DDouble___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DDouble___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DDouble___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DDouble___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DDouble___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DDouble___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h
index 60ebc646d74..abfc2609523 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h
@@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DDouble_Type;
/*---------------------------Python BPy_UnaryFunction0DDouble structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<double> *uf0D_double;
+ Freestyle::UnaryFunction0D<double> *uf0D_double;
} BPy_UnaryFunction0DDouble;
/*---------------------------Python BPy_UnaryFunction0DDouble visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp
index 8c988d55c91..6e55b7d9bcc 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -126,43 +128,39 @@ PyTypeObject UnaryFunction0DEdgeNature_Type = {
sizeof(BPy_UnaryFunction0DEdgeNature), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DEdgeNature___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DEdgeNature___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DEdgeNature___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DEdgeNature___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DEdgeNature___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DEdgeNature___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DEdgeNature___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DEdgeNature___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DEdgeNature___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h
index 9ce4b3bfd0b..83abc003393 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h
@@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DEdgeNature_Type;
/*---------------------------Python BPy_UnaryFunction0DEdgeNature structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<Nature::EdgeNature> *uf0D_edgenature;
+ Freestyle::UnaryFunction0D<Freestyle::Nature::EdgeNature> *uf0D_edgenature;
} BPy_UnaryFunction0DEdgeNature;
/*---------------------------Python BPy_UnaryFunction0DEdgeNature visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp
index 25b19e84b60..23aece94c39 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp
@@ -34,6 +34,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -163,43 +165,39 @@ PyTypeObject UnaryFunction0DFloat_Type = {
sizeof(BPy_UnaryFunction0DFloat), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DFloat___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DFloat___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DFloat___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DFloat___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DFloat___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DFloat___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DFloat___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DFloat___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DFloat___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h
index fd221201d99..a4c401f3dcd 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h
@@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DFloat_Type;
/*---------------------------Python BPy_UnaryFunction0DFloat structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<float> *uf0D_float;
+ Freestyle::UnaryFunction0D<float> *uf0D_float;
} BPy_UnaryFunction0DFloat;
/*---------------------------Python BPy_UnaryFunction0DFloat visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp
index b2426cab572..6f904898458 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -122,43 +124,39 @@ PyTypeObject UnaryFunction0DId_Type = {
sizeof(BPy_UnaryFunction0DId), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DId___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DId___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DId___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DId___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DId___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DId___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DId___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DId___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DId___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h
index 14e5d48ce43..b13c976f0ac 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h
@@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DId_Type;
/*---------------------------Python BPy_UnaryFunction0DId structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<Id> *uf0D_id;
+ Freestyle::UnaryFunction0D<Freestyle::Id> *uf0D_id;
} BPy_UnaryFunction0DId;
/*---------------------------Python BPy_UnaryFunction0DId visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp
index 77f89265ba4..92dc5901b5c 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -125,43 +127,39 @@ PyTypeObject UnaryFunction0DMaterial_Type = {
sizeof(BPy_UnaryFunction0DMaterial), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DMaterial___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DMaterial___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DMaterial___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DMaterial___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DMaterial___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DMaterial___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DMaterial___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DMaterial___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DMaterial___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h
index bbd53c409eb..72054713a66 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h
@@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DMaterial_Type;
/*---------------------------Python BPy_UnaryFunction0DMaterial structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<FrsMaterial> *uf0D_material;
+ Freestyle::UnaryFunction0D<Freestyle::FrsMaterial> *uf0D_material;
} BPy_UnaryFunction0DMaterial;
/*---------------------------Python BPy_UnaryFunction0DMaterial visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp
index 52f990502ef..829c9d0b7c1 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -126,43 +128,39 @@ PyTypeObject UnaryFunction0DUnsigned_Type = {
sizeof(BPy_UnaryFunction0DUnsigned), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DUnsigned___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DUnsigned___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DUnsigned___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DUnsigned___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DUnsigned___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DUnsigned___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DUnsigned___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DUnsigned___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DUnsigned___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h
index 1a466ffc673..2958d10994c 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h
@@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DUnsigned_Type;
/*---------------------------Python BPy_UnaryFunction0DUnsigned structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<unsigned int> *uf0D_unsigned;
+ Freestyle::UnaryFunction0D<unsigned int> *uf0D_unsigned;
} BPy_UnaryFunction0DUnsigned;
/*---------------------------Python BPy_UnaryFunction0DUnsigned visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp
index 45e1144cd32..a7248eebae2 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -131,43 +133,39 @@ PyTypeObject UnaryFunction0DVec2f_Type = {
sizeof(BPy_UnaryFunction0DVec2f), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DVec2f___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DVec2f___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DVec2f___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DVec2f___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DVec2f___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DVec2f___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DVec2f___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DVec2f___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DVec2f___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h
index 6c3d5fc85cc..2e570adbaee 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h
@@ -23,7 +23,6 @@
#include "../BPy_UnaryFunction0D.h"
#include "../../geometry/Geom.h"
-using namespace Geometry;
#ifdef __cplusplus
extern "C" {
@@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction0DVec2f_Type;
/*---------------------------Python BPy_UnaryFunction0DVec2f structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<Vec2f> *uf0D_vec2f;
+ Freestyle::UnaryFunction0D<Freestyle::Geometry::Vec2f> *uf0D_vec2f;
} BPy_UnaryFunction0DVec2f;
/*---------------------------Python BPy_UnaryFunction0DVec2f visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp
index 18eeae86dd7..1810648b0b0 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -124,43 +126,39 @@ PyTypeObject UnaryFunction0DVec3f_Type = {
sizeof(BPy_UnaryFunction0DVec3f), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DVec3f___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DVec3f___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DVec3f___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DVec3f___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DVec3f___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DVec3f___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DVec3f___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DVec3f___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DVec3f___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h
index 4be9b170311..6334988a0ef 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h
@@ -23,7 +23,6 @@
#include "../BPy_UnaryFunction0D.h"
#include "../../geometry/Geom.h"
-using namespace Geometry;
#ifdef __cplusplus
extern "C" {
@@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction0DVec3f_Type;
/*---------------------------Python BPy_UnaryFunction0DVec3f structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<Vec3f> *uf0D_vec3f;
+ Freestyle::UnaryFunction0D<Freestyle::Geometry::Vec3f> *uf0D_vec3f;
} BPy_UnaryFunction0DVec3f;
/*---------------------------Python BPy_UnaryFunction0DVec3f visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp
index 28c4425b2a4..4c015cec410 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp
@@ -29,6 +29,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -135,43 +137,39 @@ PyTypeObject UnaryFunction0DVectorViewShape_Type = {
sizeof(BPy_UnaryFunction0DVectorViewShape), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DVectorViewShape___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DVectorViewShape___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DVectorViewShape___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DVectorViewShape___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DVectorViewShape___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DVectorViewShape___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DVectorViewShape___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DVectorViewShape___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DVectorViewShape___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h
index 2a36ae21002..4e49374273f 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h
@@ -40,7 +40,7 @@ extern PyTypeObject UnaryFunction0DVectorViewShape_Type;
* definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<std::vector<ViewShape *>> *uf0D_vectorviewshape;
+ Freestyle::UnaryFunction0D<std::vector<Freestyle::ViewShape *>> *uf0D_vectorviewshape;
} BPy_UnaryFunction0DVectorViewShape;
/*---------------------------Python BPy_UnaryFunction0DVectorViewShape visible
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp
index 75773aaa8d0..c2f0df9798c 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -133,43 +135,39 @@ PyTypeObject UnaryFunction0DViewShape_Type = {
sizeof(BPy_UnaryFunction0DViewShape), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction0DViewShape___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction0DViewShape___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction0DViewShape___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction0DViewShape___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction0DViewShape___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction0DViewShape___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction0DViewShape___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction0DViewShape___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction0DViewShape___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h
index 8a8dcdceb1f..7a3c27a30c1 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h
@@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DViewShape_Type;
/*---------------------------Python BPy_UnaryFunction0DViewShape structure definition----------*/
typedef struct {
BPy_UnaryFunction0D py_uf0D;
- UnaryFunction0D<ViewShape *> *uf0D_viewshape;
+ Freestyle::UnaryFunction0D<Freestyle::ViewShape *> *uf0D_viewshape;
} BPy_UnaryFunction0DViewShape;
/*---------------------------Python BPy_UnaryFunction0DViewShape visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp
index b59e72e23d2..4aed82a14d3 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject ShapeIdF0D_Type = {
sizeof(BPy_ShapeIdF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ShapeIdF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DId_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ShapeIdF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ShapeIdF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DId_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ShapeIdF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp
index 9f7f2b234f7..6b6e06d6efd 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -77,43 +79,39 @@ PyTypeObject MaterialF0D_Type = {
sizeof(BPy_MaterialF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- MaterialF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DMaterial_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)MaterialF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ MaterialF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DMaterial_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)MaterialF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp
index 1cd1a4ab8ac..c6fb66270f7 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -68,43 +70,39 @@ PyTypeObject CurveNatureF0D_Type = {
sizeof(BPy_CurveNatureF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- CurveNatureF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DEdgeNature_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)CurveNatureF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ CurveNatureF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DEdgeNature_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)CurveNatureF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp
index 60cfed83713..66c0243727d 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -70,43 +72,39 @@ PyTypeObject Normal2DF0D_Type = {
sizeof(BPy_Normal2DF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Normal2DF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DVec2f_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Normal2DF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Normal2DF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DVec2f_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Normal2DF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp
index 063f1651486..4ade0e2e995 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -72,43 +74,39 @@ PyTypeObject VertexOrientation2DF0D_Type = {
sizeof(BPy_VertexOrientation2DF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- VertexOrientation2DF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DVec2f_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)VertexOrientation2DF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ VertexOrientation2DF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DVec2f_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)VertexOrientation2DF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp
index b0188cd0244..f634eaa0327 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -72,43 +74,39 @@ PyTypeObject VertexOrientation3DF0D_Type = {
sizeof(BPy_VertexOrientation3DF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- VertexOrientation3DF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DVec3f_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)VertexOrientation3DF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ VertexOrientation3DF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DVec3f_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)VertexOrientation3DF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp
index ba890477782..c624e3eb136 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetOccludeeF0D_Type = {
sizeof(BPy_GetOccludeeF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetOccludeeF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DViewShape_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetOccludeeF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetOccludeeF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DViewShape_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetOccludeeF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp
index 531020dc32a..8234e7f4351 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetShapeF0D_Type = {
sizeof(BPy_GetShapeF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetShapeF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DViewShape_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetShapeF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetShapeF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DViewShape_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetShapeF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp
index cb36e388306..217fe1cb55a 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -72,43 +74,39 @@ PyTypeObject Curvature2DAngleF0D_Type = {
sizeof(BPy_Curvature2DAngleF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Curvature2DAngleF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Curvature2DAngleF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Curvature2DAngleF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Curvature2DAngleF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp
index ca306a55d1e..b0777adb311 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -77,43 +79,39 @@ PyTypeObject DensityF0D_Type = {
sizeof(BPy_DensityF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- DensityF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)DensityF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ DensityF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)DensityF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp
index 6a688212239..6c230a1207d 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetProjectedXF0D_Type = {
sizeof(BPy_GetProjectedXF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetProjectedXF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetProjectedXF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetProjectedXF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetProjectedXF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp
index 8efaaf1b699..43913316567 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetProjectedYF0D_Type = {
sizeof(BPy_GetProjectedYF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetProjectedYF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetProjectedYF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetProjectedYF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetProjectedYF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp
index e13c990685f..a7d1d05c3ca 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetProjectedZF0D_Type = {
sizeof(BPy_GetProjectedZF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetProjectedZF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetProjectedZF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetProjectedZF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetProjectedZF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp
index 43cbb433bdd..94abd089db1 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetXF0D_Type = {
sizeof(BPy_GetXF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetXF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetXF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetXF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetXF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp
index 24bfe3be985..fc4edb9eb1a 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetYF0D_Type = {
sizeof(BPy_GetYF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetYF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetYF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetYF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetYF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp
index 84a985a134d..3729f7bcb66 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetZF0D_Type = {
sizeof(BPy_GetZF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetZF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetZF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetZF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetZF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp
index 247473dcb41..64f86653922 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -75,43 +77,39 @@ PyTypeObject LocalAverageDepthF0D_Type = {
sizeof(BPy_LocalAverageDepthF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- LocalAverageDepthF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)LocalAverageDepthF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ LocalAverageDepthF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)LocalAverageDepthF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp
index e82b5f1c557..2b2dba80f04 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -72,43 +74,39 @@ PyTypeObject ZDiscontinuityF0D_Type = {
sizeof(BPy_ZDiscontinuityF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ZDiscontinuityF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ZDiscontinuityF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ZDiscontinuityF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ZDiscontinuityF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp
index b4760d10b2c..092f78c584c 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -70,43 +72,39 @@ PyTypeObject GetCurvilinearAbscissaF0D_Type = {
sizeof(BPy_GetCurvilinearAbscissaF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetCurvilinearAbscissaF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DFloat_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetCurvilinearAbscissaF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetCurvilinearAbscissaF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DFloat_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetCurvilinearAbscissaF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp
index d4c735e3572..28be409b8fb 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -66,43 +68,39 @@ PyTypeObject GetParameterF0D_Type = {
sizeof(BPy_GetParameterF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetParameterF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DFloat_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetParameterF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetParameterF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DFloat_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetParameterF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp
index 6d5f1ed80c3..3f6667af843 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -75,43 +77,39 @@ PyTypeObject GetViewMapGradientNormF0D_Type = {
sizeof(BPy_GetViewMapGradientNormF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetViewMapGradientNormF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DFloat_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetViewMapGradientNormF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetViewMapGradientNormF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DFloat_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetViewMapGradientNormF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp
index bbf2aee5204..98cd37f5fea 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -73,43 +75,39 @@ PyTypeObject ReadCompleteViewMapPixelF0D_Type = {
sizeof(BPy_ReadCompleteViewMapPixelF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ReadCompleteViewMapPixelF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DFloat_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ReadCompleteViewMapPixelF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ReadCompleteViewMapPixelF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DFloat_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ReadCompleteViewMapPixelF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp
index 54401153d37..07bbcfed102 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject ReadMapPixelF0D_Type = {
sizeof(BPy_ReadMapPixelF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ReadMapPixelF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DFloat_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ReadMapPixelF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ReadMapPixelF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DFloat_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ReadMapPixelF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp
index 88ca0579870..4d2da133b5f 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -77,43 +79,39 @@ PyTypeObject ReadSteerableViewMapPixelF0D_Type = {
sizeof(BPy_ReadSteerableViewMapPixelF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ReadSteerableViewMapPixelF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DFloat_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ReadSteerableViewMapPixelF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ReadSteerableViewMapPixelF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DFloat_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ReadSteerableViewMapPixelF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp
index d6e00988e68..30e5ea4a1f8 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -75,43 +77,39 @@ PyTypeObject QuantitativeInvisibilityF0D_Type = {
sizeof(BPy_QuantitativeInvisibilityF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- QuantitativeInvisibilityF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DUnsigned_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)QuantitativeInvisibilityF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ QuantitativeInvisibilityF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DUnsigned_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)QuantitativeInvisibilityF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp
index ddff11d7916..a8461e006b0 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -68,43 +70,39 @@ PyTypeObject GetOccludersF0D_Type = {
sizeof(BPy_GetOccludersF0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetOccludersF0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction0DVectorViewShape_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetOccludersF0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetOccludersF0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction0DVectorViewShape_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetOccludersF0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp
index 57b2d61d5c1..0ce6e099ed3 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp
@@ -43,6 +43,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -268,43 +270,39 @@ PyTypeObject UnaryFunction1DDouble_Type = {
sizeof(BPy_UnaryFunction1DDouble), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1DDouble___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1DDouble___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction1DDouble___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1DDouble___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1DDouble_getseters, /* tp_getset */
- &UnaryFunction1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction1DDouble___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1DDouble___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction1DDouble___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1DDouble___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1DDouble_getseters, /* tp_getset */
+ &UnaryFunction1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction1DDouble___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h
index 1fb42a18337..a57e42ce528 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h
@@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DDouble_Type;
/*---------------------------Python BPy_UnaryFunction1DDouble structure definition----------*/
typedef struct {
BPy_UnaryFunction1D py_uf1D;
- UnaryFunction1D<double> *uf1D_double;
+ Freestyle::UnaryFunction1D<double> *uf1D_double;
} BPy_UnaryFunction1DDouble;
/*---------------------------Python BPy_UnaryFunction1DDouble visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp
index a987dbb67f5..83a502de548 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -175,43 +177,39 @@ PyTypeObject UnaryFunction1DEdgeNature_Type = {
sizeof(BPy_UnaryFunction1DEdgeNature), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1DEdgeNature___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1DEdgeNature___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction1DEdgeNature___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1DEdgeNature___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1DEdgeNature_getseters, /* tp_getset */
- &UnaryFunction1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction1DEdgeNature___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1DEdgeNature___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction1DEdgeNature___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1DEdgeNature___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1DEdgeNature_getseters, /* tp_getset */
+ &UnaryFunction1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction1DEdgeNature___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h
index 886eb469d51..4227cc47efa 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h
@@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction1DEdgeNature_Type;
/*---------------------------Python BPy_UnaryFunction1DEdgeNature structure definition----------*/
typedef struct {
BPy_UnaryFunction1D py_uf1D;
- UnaryFunction1D<Nature::EdgeNature> *uf1D_edgenature;
+ Freestyle::UnaryFunction1D<Freestyle::Nature::EdgeNature> *uf1D_edgenature;
} BPy_UnaryFunction1DEdgeNature;
/*---------------------------Python BPy_UnaryFunction1DEdgeNature visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp
index 66499c68c65..7ba80c58256 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -164,43 +166,39 @@ PyTypeObject UnaryFunction1DFloat_Type = {
sizeof(BPy_UnaryFunction1DFloat), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1DFloat___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1DFloat___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction1DFloat___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1DFloat___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1DFloat_getseters, /* tp_getset */
- &UnaryFunction1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction1DFloat___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1DFloat___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction1DFloat___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1DFloat___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1DFloat_getseters, /* tp_getset */
+ &UnaryFunction1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction1DFloat___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h
index 8b977c9c96a..8be928eba77 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h
@@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DFloat_Type;
/*---------------------------Python BPy_UnaryFunction1DFloat structure definition----------*/
typedef struct {
BPy_UnaryFunction1D py_uf1D;
- UnaryFunction1D<float> *uf1D_float;
+ Freestyle::UnaryFunction1D<float> *uf1D_float;
} BPy_UnaryFunction1DFloat;
/*---------------------------Python BPy_UnaryFunction1DFloat visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp
index 54c5c786367..ed8790fcd89 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -175,43 +177,39 @@ PyTypeObject UnaryFunction1DUnsigned_Type = {
sizeof(BPy_UnaryFunction1DUnsigned), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1DUnsigned___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1DUnsigned___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction1DUnsigned___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1DUnsigned___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1DUnsigned_getseters, /* tp_getset */
- &UnaryFunction1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction1DUnsigned___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1DUnsigned___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction1DUnsigned___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1DUnsigned___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1DUnsigned_getseters, /* tp_getset */
+ &UnaryFunction1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction1DUnsigned___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h
index 9149275b610..30fe050c2ad 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h
@@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DUnsigned_Type;
/*---------------------------Python BPy_UnaryFunction1DUnsigned structure definition----------*/
typedef struct {
BPy_UnaryFunction1D py_uf1D;
- UnaryFunction1D<unsigned int> *uf1D_unsigned;
+ Freestyle::UnaryFunction1D<unsigned int> *uf1D_unsigned;
} BPy_UnaryFunction1DUnsigned;
/*---------------------------Python BPy_UnaryFunction1DUnsigned visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp
index 8b23163fc95..0f288faea4e 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp
@@ -31,6 +31,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -179,43 +181,39 @@ PyTypeObject UnaryFunction1DVec2f_Type = {
sizeof(BPy_UnaryFunction1DVec2f), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1DVec2f___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1DVec2f___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction1DVec2f___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1DVec2f___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1DVec2f_getseters, /* tp_getset */
- &UnaryFunction1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction1DVec2f___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1DVec2f___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction1DVec2f___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1DVec2f___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1DVec2f_getseters, /* tp_getset */
+ &UnaryFunction1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction1DVec2f___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h
index b55f9af7c4d..2decb723a33 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h
@@ -23,7 +23,6 @@
#include "../BPy_UnaryFunction1D.h"
#include "../../geometry/Geom.h"
-using namespace Geometry;
#ifdef __cplusplus
extern "C" {
@@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction1DVec2f_Type;
/*---------------------------Python BPy_UnaryFunction1DVec2f structure definition----------*/
typedef struct {
BPy_UnaryFunction1D py_uf1D;
- UnaryFunction1D<Vec2f> *uf1D_vec2f;
+ Freestyle::UnaryFunction1D<Freestyle::Geometry::Vec2f> *uf1D_vec2f;
} BPy_UnaryFunction1DVec2f;
/*---------------------------Python BPy_UnaryFunction1DVec2f visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp
index 9b6a2445588..fbdefd891be 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp
@@ -30,6 +30,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -172,43 +174,39 @@ PyTypeObject UnaryFunction1DVec3f_Type = {
sizeof(BPy_UnaryFunction1DVec3f), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1DVec3f___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1DVec3f___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction1DVec3f___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1DVec3f___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1DVec3f_getseters, /* tp_getset */
- &UnaryFunction1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction1DVec3f___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1DVec3f___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction1DVec3f___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1DVec3f___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1DVec3f_getseters, /* tp_getset */
+ &UnaryFunction1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction1DVec3f___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h
index 9e4342979e4..9e7a899a371 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h
@@ -23,7 +23,6 @@
#include "../BPy_UnaryFunction1D.h"
#include "../../geometry/Geom.h"
-using namespace Geometry;
#ifdef __cplusplus
extern "C" {
@@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction1DVec3f_Type;
/*---------------------------Python BPy_UnaryFunction1DVec3f structure definition----------*/
typedef struct {
BPy_UnaryFunction1D py_uf1D;
- UnaryFunction1D<Vec3f> *uf1D_vec3f;
+ Freestyle::UnaryFunction1D<Freestyle::Geometry::Vec3f> *uf1D_vec3f;
} BPy_UnaryFunction1DVec3f;
/*---------------------------Python BPy_UnaryFunction1DVec3f visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp
index c95595dc953..09b9e303fa0 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp
@@ -32,6 +32,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -200,43 +202,39 @@ PyTypeObject UnaryFunction1DVectorViewShape_Type = {
sizeof(BPy_UnaryFunction1DVectorViewShape), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1DVectorViewShape___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1DVectorViewShape___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction1DVectorViewShape___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1DVectorViewShape___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1DVectorViewShape_getseters, /* tp_getset */
- &UnaryFunction1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction1DVectorViewShape___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1DVectorViewShape___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction1DVectorViewShape___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1DVectorViewShape___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1DVectorViewShape_getseters, /* tp_getset */
+ &UnaryFunction1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction1DVectorViewShape___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h
index bfbcf5e451d..a8dfee7f9aa 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h
@@ -40,7 +40,7 @@ extern PyTypeObject UnaryFunction1DVectorViewShape_Type;
* definition----------*/
typedef struct {
BPy_UnaryFunction1D py_uf1D;
- UnaryFunction1D<std::vector<ViewShape *>> *uf1D_vectorviewshape;
+ Freestyle::UnaryFunction1D<std::vector<Freestyle::ViewShape *>> *uf1D_vectorviewshape;
} BPy_UnaryFunction1DVectorViewShape;
/*---------------------------Python BPy_UnaryFunction1DVectorViewShape visible
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp
index b258b0b27f7..9ab3de8bf79 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp
@@ -32,6 +32,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//-------------------MODULE INITIALIZATION--------------------------------
@@ -187,43 +189,39 @@ PyTypeObject UnaryFunction1DVoid_Type = {
sizeof(BPy_UnaryFunction1DVoid), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)UnaryFunction1DVoid___dealloc__, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- (reprfunc)UnaryFunction1DVoid___repr__, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- (ternaryfunc)UnaryFunction1DVoid___call__, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- UnaryFunction1DVoid___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- BPy_UnaryFunction1DVoid_getseters, /* tp_getset */
- &UnaryFunction1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)UnaryFunction1DVoid___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ (reprfunc)UnaryFunction1DVoid___repr__, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ (ternaryfunc)UnaryFunction1DVoid___call__, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ UnaryFunction1DVoid___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ BPy_UnaryFunction1DVoid_getseters, /* tp_getset */
+ &UnaryFunction1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)UnaryFunction1DVoid___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h
index 3a821bc2083..520ccc29c99 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h
@@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DVoid_Type;
/*---------------------------Python BPy_UnaryFunction1DVoid structure definition----------*/
typedef struct {
BPy_UnaryFunction1D py_uf1D;
- UnaryFunction1D_void *uf1D_void;
+ Freestyle::UnaryFunction1D_void *uf1D_void;
} BPy_UnaryFunction1DVoid;
/*---------------------------Python BPy_UnaryFunction1DVoid visible prototypes-----------*/
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp
index 205820d9a92..141758bfe48 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -80,43 +82,39 @@ PyTypeObject CurveNatureF1D_Type = {
sizeof(BPy_CurveNatureF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- CurveNatureF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DEdgeNature_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)CurveNatureF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ CurveNatureF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DEdgeNature_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)CurveNatureF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp
index d22a1ec99ef..7fa596d4bbe 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject Normal2DF1D_Type = {
sizeof(BPy_Normal2DF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Normal2DF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVec2f_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Normal2DF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Normal2DF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVec2f_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Normal2DF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp
index f66bd4c668f..69ab07a2829 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject Orientation2DF1D_Type = {
sizeof(BPy_Orientation2DF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Orientation2DF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVec2f_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Orientation2DF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Orientation2DF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVec2f_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Orientation2DF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp
index 2f408d45b74..9866968e068 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject Orientation3DF1D_Type = {
sizeof(BPy_Orientation3DF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Orientation3DF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVec3f_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Orientation3DF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Orientation3DF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVec3f_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Orientation3DF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp
index 13455eb3a4c..3bd9bf8abce 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -75,43 +77,39 @@ PyTypeObject Curvature2DAngleF1D_Type = {
sizeof(BPy_Curvature2DAngleF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- Curvature2DAngleF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)Curvature2DAngleF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Curvature2DAngleF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Curvature2DAngleF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp
index fcf2bebc161..12237f6a5e5 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -88,43 +90,39 @@ PyTypeObject DensityF1D_Type = {
sizeof(BPy_DensityF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- DensityF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)DensityF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ DensityF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)DensityF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp
index 5c352c670c1..49f7c019222 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -92,43 +94,39 @@ PyTypeObject GetCompleteViewMapDensityF1D_Type = {
sizeof(BPy_GetCompleteViewMapDensityF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetCompleteViewMapDensityF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetCompleteViewMapDensityF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetCompleteViewMapDensityF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetCompleteViewMapDensityF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp
index 45c6a1b0fb7..240e632b433 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -99,43 +101,39 @@ PyTypeObject GetDirectionalViewMapDensityF1D_Type = {
sizeof(BPy_GetDirectionalViewMapDensityF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetDirectionalViewMapDensityF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetDirectionalViewMapDensityF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetDirectionalViewMapDensityF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetDirectionalViewMapDensityF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp
index 0c7276a13ec..ce111f81c9d 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject GetProjectedXF1D_Type = {
sizeof(BPy_GetProjectedXF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetProjectedXF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetProjectedXF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetProjectedXF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetProjectedXF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp
index 1f1c01a5344..31dc72f8d0d 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject GetProjectedYF1D_Type = {
sizeof(BPy_GetProjectedYF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetProjectedYF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetProjectedYF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetProjectedYF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetProjectedYF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp
index cfa06f9d8fd..e16a0c01942 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject GetProjectedZF1D_Type = {
sizeof(BPy_GetProjectedZF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetProjectedZF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetProjectedZF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetProjectedZF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetProjectedZF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp
index 985e10f2b83..78d74bf3399 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -89,43 +91,39 @@ PyTypeObject GetSteerableViewMapDensityF1D_Type = {
sizeof(BPy_GetSteerableViewMapDensityF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetSteerableViewMapDensityF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetSteerableViewMapDensityF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetSteerableViewMapDensityF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetSteerableViewMapDensityF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp
index 441ea2f5833..a158969c00c 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -89,43 +91,39 @@ PyTypeObject GetViewMapGradientNormF1D_Type = {
sizeof(BPy_GetViewMapGradientNormF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetViewMapGradientNormF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetViewMapGradientNormF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetViewMapGradientNormF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetViewMapGradientNormF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp
index 716cfbfe37a..9dfb5aa8793 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject GetXF1D_Type = {
sizeof(BPy_GetXF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetXF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetXF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetXF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetXF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp
index 693c2453db2..239079e8472 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -73,43 +75,39 @@ PyTypeObject GetYF1D_Type = {
sizeof(BPy_GetYF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetYF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetYF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetYF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetYF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp
index e9030625b10..8f973adc3f0 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject GetZF1D_Type = {
sizeof(BPy_GetZF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetZF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetZF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetZF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetZF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp
index 4ae2cd054e2..53eaf9b9596 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -84,43 +86,39 @@ PyTypeObject LocalAverageDepthF1D_Type = {
sizeof(BPy_LocalAverageDepthF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- LocalAverageDepthF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)LocalAverageDepthF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ LocalAverageDepthF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)LocalAverageDepthF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp
index 9feb07552ca..8d1d43bc4de 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -78,43 +80,39 @@ PyTypeObject ZDiscontinuityF1D_Type = {
sizeof(BPy_ZDiscontinuityF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ZDiscontinuityF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DDouble_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ZDiscontinuityF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ZDiscontinuityF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DDouble_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ZDiscontinuityF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp
index 400b5a95fcf..da5140c4459 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -80,43 +82,39 @@ PyTypeObject QuantitativeInvisibilityF1D_Type = {
sizeof(BPy_QuantitativeInvisibilityF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- QuantitativeInvisibilityF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DUnsigned_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)QuantitativeInvisibilityF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ QuantitativeInvisibilityF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DUnsigned_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)QuantitativeInvisibilityF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp
index 7637153017f..57dc15d4a55 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetOccludeeF1D_Type = {
sizeof(BPy_GetOccludeeF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetOccludeeF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVectorViewShape_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetOccludeeF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetOccludeeF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVectorViewShape_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetOccludeeF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp
index d532268b294..ec8556eee96 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetOccludersF1D_Type = {
sizeof(BPy_GetOccludersF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetOccludersF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVectorViewShape_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetOccludersF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetOccludersF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVectorViewShape_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetOccludersF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp
index dd1492e940e..95e7afe66fe 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject GetShapeF1D_Type = {
sizeof(BPy_GetShapeF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- GetShapeF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVectorViewShape_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)GetShapeF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ GetShapeF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVectorViewShape_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)GetShapeF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp
index c3750734efc..906b23d03d2 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject ChainingTimeStampF1D_Type = {
sizeof(BPy_ChainingTimeStampF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ChainingTimeStampF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVoid_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ChainingTimeStampF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ChainingTimeStampF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVoid_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ChainingTimeStampF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp
index 85738684e44..487af7dca70 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -67,43 +69,39 @@ PyTypeObject IncrementChainingTimeStampF1D_Type = {
sizeof(BPy_IncrementChainingTimeStampF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- IncrementChainingTimeStampF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVoid_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)IncrementChainingTimeStampF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ IncrementChainingTimeStampF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVoid_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)IncrementChainingTimeStampF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp
index 1f577820da4..ba21c98b0b0 100644
--- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp
@@ -28,6 +28,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -65,43 +67,39 @@ PyTypeObject TimeStampF1D_Type = {
sizeof(BPy_TimeStampF1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- TimeStampF1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryFunction1DVoid_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)TimeStampF1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ TimeStampF1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryFunction1DVoid_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)TimeStampF1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp
index 227aca2b5c6..300a9d66f07 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -58,43 +60,39 @@ PyTypeObject FalseUP0D_Type = {
sizeof(BPy_FalseUP0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FalseUP0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FalseUP0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FalseUP0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FalseUP0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp
index 5f5c756b28d..6ff6ad03c1e 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -58,43 +60,39 @@ PyTypeObject TrueUP0D_Type = {
sizeof(BPy_TrueUP0D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- TrueUP0D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate0D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)TrueUP0D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ TrueUP0D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate0D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)TrueUP0D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp
index b3f9c225931..b42573c1fbe 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -59,43 +61,39 @@ PyTypeObject ContourUP1D_Type = {
sizeof(BPy_ContourUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ContourUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ContourUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ContourUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ContourUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp
index f865fe5013d..bcea039087c 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp
@@ -26,6 +26,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -75,43 +77,39 @@ PyTypeObject DensityLowerThanUP1D_Type = {
sizeof(BPy_DensityLowerThanUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- DensityLowerThanUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)DensityLowerThanUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ DensityLowerThanUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)DensityLowerThanUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp
index 154b44ff81a..7ac09d4a644 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -70,43 +72,39 @@ PyTypeObject EqualToChainingTimeStampUP1D_Type = {
sizeof(BPy_EqualToChainingTimeStampUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- EqualToChainingTimeStampUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)EqualToChainingTimeStampUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ EqualToChainingTimeStampUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)EqualToChainingTimeStampUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp
index 2bb9dbaf484..af98a277bad 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -69,43 +71,39 @@ PyTypeObject EqualToTimeStampUP1D_Type = {
sizeof(BPy_EqualToTimeStampUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- EqualToTimeStampUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)EqualToTimeStampUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ EqualToTimeStampUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)EqualToTimeStampUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp
index 7b9923d7b6c..4c21d1ea54e 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -63,43 +65,39 @@ PyTypeObject ExternalContourUP1D_Type = {
sizeof(BPy_ExternalContourUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ExternalContourUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ExternalContourUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ExternalContourUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ExternalContourUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp
index ec1a02e13aa..87c1ea918d0 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -58,43 +60,39 @@ PyTypeObject FalseUP1D_Type = {
sizeof(BPy_FalseUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- FalseUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)FalseUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ FalseUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)FalseUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp
index b9a76f91c21..7fa00295887 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -74,43 +76,39 @@ PyTypeObject QuantitativeInvisibilityUP1D_Type = {
sizeof(BPy_QuantitativeInvisibilityUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- QuantitativeInvisibilityUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)QuantitativeInvisibilityUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ QuantitativeInvisibilityUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)QuantitativeInvisibilityUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp
index 68f0ea7a913..2f097c5a6fe 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -70,43 +72,39 @@ PyTypeObject ShapeUP1D_Type = {
sizeof(BPy_ShapeUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- ShapeUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)ShapeUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ ShapeUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)ShapeUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp
index 362bcc4cea8..d589f621a4d 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -58,43 +60,39 @@ PyTypeObject TrueUP1D_Type = {
sizeof(BPy_TrueUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- TrueUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)TrueUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ TrueUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)TrueUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp
index 9329e3a7628..32882ac3c20 100644
--- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp
+++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp
@@ -24,6 +24,8 @@
extern "C" {
#endif
+using namespace Freestyle;
+
///////////////////////////////////////////////////////////////////////////////////////////
//------------------------INSTANCE METHODS ----------------------------------
@@ -71,43 +73,39 @@ PyTypeObject WithinImageBoundaryUP1D_Type = {
sizeof(BPy_WithinImageBoundaryUP1D), /* tp_basicsize */
0, /* tp_itemsize */
nullptr, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- nullptr, /* tp_print */
-#endif
- nullptr, /* tp_getattr */
- nullptr, /* tp_setattr */
- nullptr, /* tp_reserved */
- nullptr, /* tp_repr */
- nullptr, /* tp_as_number */
- nullptr, /* tp_as_sequence */
- nullptr, /* tp_as_mapping */
- nullptr, /* tp_hash */
- nullptr, /* tp_call */
- nullptr, /* tp_str */
- nullptr, /* tp_getattro */
- nullptr, /* tp_setattro */
- nullptr, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- WithinImageBoundaryUP1D___doc__, /* tp_doc */
- nullptr, /* tp_traverse */
- nullptr, /* tp_clear */
- nullptr, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- nullptr, /* tp_iter */
- nullptr, /* tp_iternext */
- nullptr, /* tp_methods */
- nullptr, /* tp_members */
- nullptr, /* tp_getset */
- &UnaryPredicate1D_Type, /* tp_base */
- nullptr, /* tp_dict */
- nullptr, /* tp_descr_get */
- nullptr, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)WithinImageBoundaryUP1D___init__, /* tp_init */
- nullptr, /* tp_alloc */
- nullptr, /* tp_new */
+ 0, /* tp_vectorcall_offset */
+ nullptr, /* tp_getattr */
+ nullptr, /* tp_setattr */
+ nullptr, /* tp_reserved */
+ nullptr, /* tp_repr */
+ nullptr, /* tp_as_number */
+ nullptr, /* tp_as_sequence */
+ nullptr, /* tp_as_mapping */
+ nullptr, /* tp_hash */
+ nullptr, /* tp_call */
+ nullptr, /* tp_str */
+ nullptr, /* tp_getattro */
+ nullptr, /* tp_setattro */
+ nullptr, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ WithinImageBoundaryUP1D___doc__, /* tp_doc */
+ nullptr, /* tp_traverse */
+ nullptr, /* tp_clear */
+ nullptr, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ nullptr, /* tp_iter */
+ nullptr, /* tp_iternext */
+ nullptr, /* tp_methods */
+ nullptr, /* tp_members */
+ nullptr, /* tp_getset */
+ &UnaryPredicate1D_Type, /* tp_base */
+ nullptr, /* tp_dict */
+ nullptr, /* tp_descr_get */
+ nullptr, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)WithinImageBoundaryUP1D___init__, /* tp_init */
+ nullptr, /* tp_alloc */
+ nullptr, /* tp_new */
};
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/view_map/ViewMap.h b/source/blender/freestyle/intern/view_map/ViewMap.h
index 1c959c43481..47a2e98418a 100644
--- a/source/blender/freestyle/intern/view_map/ViewMap.h
+++ b/source/blender/freestyle/intern/view_map/ViewMap.h
@@ -228,7 +228,7 @@ class ViewMap {
*/
ViewVertex *InsertViewVertex(SVertex *iVertex, vector<ViewEdge *> &newViewEdges);
- /* connects a FEdge to the graph trough a SVertex */
+ /* connects a FEdge to the graph through a SVertex */
// FEdge *Connect(FEdge *ioEdge, SVertex *ioVertex);
/* Clean temporary FEdges created by chaining */
@@ -1085,13 +1085,13 @@ class ViewEdge : public Interface1D {
return __B;
}
- /*! Returns the first FEdge that constitues this ViewEdge. */
+ /*! Returns the first FEdge that constitutes this ViewEdge. */
inline FEdge *fedgeA()
{
return _FEdgeA;
}
- /*! Returns the last FEdge that constitues this ViewEdge. */
+ /*! Returns the last FEdge that constitutes this ViewEdge. */
inline FEdge *fedgeB()
{
return _FEdgeB;
diff --git a/source/blender/freestyle/intern/winged_edge/Curvature.cpp b/source/blender/freestyle/intern/winged_edge/Curvature.cpp
index 0ee491a071c..1984aceb51c 100644
--- a/source/blender/freestyle/intern/winged_edge/Curvature.cpp
+++ b/source/blender/freestyle/intern/winged_edge/Curvature.cpp
@@ -19,7 +19,7 @@
* and:
* OGF/Graphite: Geometry and Graphics Programming Library + Utilities
* Copyright (C) 2000-2003 Bruno Levy
- * Contact: Bruno Levy levy@loria.fr
+ * Contact: Bruno Levy <levy@loria.fr>
* ISA Project
* LORIA, INRIA Lorraine,
* Campus Scientifique, BP 239
diff --git a/source/blender/freestyle/intern/winged_edge/Curvature.h b/source/blender/freestyle/intern/winged_edge/Curvature.h
index d73674d02cd..0eefc57c3a2 100644
--- a/source/blender/freestyle/intern/winged_edge/Curvature.h
+++ b/source/blender/freestyle/intern/winged_edge/Curvature.h
@@ -19,7 +19,7 @@
* and:
* OGF/Graphite: Geometry and Graphics Programming Library + Utilities
* Copyright (C) 2000-2003 Bruno Levy
- * Contact: Bruno Levy levy@loria.fr
+ * Contact: Bruno Levy <levy@loria.fr>
* ISA Project
* LORIA, INRIA Lorraine,
* Campus Scientifique, BP 239
diff --git a/source/blender/functions/FN_cpp_type.hh b/source/blender/functions/FN_cpp_type.hh
index 5a7dfadf537..a854e63288d 100644
--- a/source/blender/functions/FN_cpp_type.hh
+++ b/source/blender/functions/FN_cpp_type.hh
@@ -929,4 +929,9 @@ inline std::unique_ptr<const CPPType> create_cpp_type(StringRef name, const T &d
static std::unique_ptr<const CPPType> cpp_type = blender::fn::create_cpp_type<TYPE_NAME>( \
STRINGIFY(IDENTIFIER), default_value); \
return *cpp_type; \
+ } \
+ /* Support using `CPPType::get<const T>()`. Otherwise the caller would have to remove const. */ \
+ template<> const blender::fn::CPPType &blender::fn::CPPType::get<const TYPE_NAME>() \
+ { \
+ return blender::fn::CPPType::get<TYPE_NAME>(); \
}
diff --git a/source/blender/functions/FN_generic_value_map.hh b/source/blender/functions/FN_generic_value_map.hh
index a9f2dc8a868..68cb945f1af 100644
--- a/source/blender/functions/FN_generic_value_map.hh
+++ b/source/blender/functions/FN_generic_value_map.hh
@@ -104,14 +104,12 @@ template<typename Key> class GValueMap {
return return_value;
}
- template<typename T, typename ForwardKey> T lookup(const ForwardKey &key) const
+ template<typename T, typename ForwardKey> const T &lookup(const ForwardKey &key) const
{
GMutablePointer value = values_.lookup_as(key);
- const CPPType &type = *value.type();
- BLI_assert(type.is<T>());
- T return_value;
- type.copy_to_initialized(value.get(), &return_value);
- return return_value;
+ BLI_assert(value.is_type<T>());
+ BLI_assert(value.get() != nullptr);
+ return *(const T *)value.get();
}
template<typename ForwardKey> bool contains(const ForwardKey &key) const
diff --git a/source/blender/functions/intern/multi_function_network_optimization.cc b/source/blender/functions/intern/multi_function_network_optimization.cc
index e24f157d4f9..6c418dee2c1 100644
--- a/source/blender/functions/intern/multi_function_network_optimization.cc
+++ b/source/blender/functions/intern/multi_function_network_optimization.cc
@@ -36,7 +36,6 @@ namespace blender::fn::mf_network_optimization {
/* -------------------------------------------------------------------- */
/** \name Utility functions to find nodes in a network.
- *
* \{ */
static bool set_tag_and_check_if_modified(bool &tag, bool new_value)
@@ -122,7 +121,6 @@ static Vector<MFNode *> find_nodes_based_on_mask(MFNetwork &network,
/* -------------------------------------------------------------------- */
/** \name Dead Node Removal
- *
* \{ */
/**
@@ -140,7 +138,6 @@ void dead_node_removal(MFNetwork &network)
/* -------------------------------------------------------------------- */
/** \name Constant Folding
- *
* \{ */
static bool function_node_can_be_constant(MFFunctionNode *node)
@@ -330,7 +327,6 @@ void constant_folding(MFNetwork &network, ResourceCollector &resources)
/* -------------------------------------------------------------------- */
/** \name Common Sub-network Elimination
- *
* \{ */
static uint64_t compute_node_hash(MFFunctionNode &node, RNG *rng, Span<uint64_t> node_hashes)
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
index e2f4d34ff40..686bd8c38e5 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
@@ -110,11 +110,11 @@ static bool dependsOnTime(GpencilModifierData *md)
return (mmd->flag & GP_NOISE_USE_RANDOM) != 0;
}
-static float *noise_table(int len, int seed)
+static float *noise_table(int len, int offset, int seed)
{
float *table = MEM_callocN(sizeof(float) * len, __func__);
for (int i = 0; i < len; i++) {
- table[i] = BLI_hash_int_01(BLI_hash_int_2d(seed, i + 1));
+ table[i] = BLI_hash_int_01(BLI_hash_int_2d(seed, i + offset + 1));
}
return table;
}
@@ -124,7 +124,9 @@ BLI_INLINE float table_sample(float *table, float x)
return interpf(table[(int)ceilf(x)], table[(int)floor(x)], fractf(x));
}
-/* aply noise effect based on stroke direction */
+/**
+ * Apply noise effect based on stroke direction.
+ */
static void deformStroke(GpencilModifierData *md,
Depsgraph *depsgraph,
Object *ob,
@@ -172,11 +174,19 @@ static void deformStroke(GpencilModifierData *md,
/* Sanitize as it can create out of bound reads. */
float noise_scale = clamp_f(mmd->noise_scale, 0.0f, 1.0f);
- int len = ceilf(gps->totpoints * noise_scale) + 1;
- float *noise_table_position = (mmd->factor > 0.0f) ? noise_table(len, seed + 2) : NULL;
- float *noise_table_strength = (mmd->factor_strength > 0.0f) ? noise_table(len, seed + 3) : NULL;
- float *noise_table_thickness = (mmd->factor_thickness > 0.0f) ? noise_table(len, seed) : NULL;
- float *noise_table_uvs = (mmd->factor_uvs > 0.0f) ? noise_table(len, seed + 4) : NULL;
+ int len = ceilf(gps->totpoints * noise_scale) + 2;
+ float *noise_table_position = (mmd->factor > 0.0f) ?
+ noise_table(len, (int)floor(mmd->noise_offset), seed + 2) :
+ NULL;
+ float *noise_table_strength = (mmd->factor_strength > 0.0f) ?
+ noise_table(len, (int)floor(mmd->noise_offset), seed + 3) :
+ NULL;
+ float *noise_table_thickness = (mmd->factor_thickness > 0.0f) ?
+ noise_table(len, (int)floor(mmd->noise_offset), seed) :
+ NULL;
+ float *noise_table_uvs = (mmd->factor_uvs > 0.0f) ?
+ noise_table(len, (int)floor(mmd->noise_offset), seed + 4) :
+ NULL;
/* Calculate stroke normal. */
if (gps->totpoints > 2) {
@@ -225,24 +235,27 @@ static void deformStroke(GpencilModifierData *md,
cross_v3_v3v3(vec2, vec1, normal);
normalize_v3(vec2);
- float noise = table_sample(noise_table_position, i * noise_scale);
+ float noise = table_sample(noise_table_position,
+ i * noise_scale + fractf(mmd->noise_offset));
madd_v3_v3fl(&pt->x, vec2, (noise * 2.0f - 1.0f) * weight * mmd->factor * 0.1f);
}
if (mmd->factor_thickness > 0.0f) {
- float noise = table_sample(noise_table_thickness, i * noise_scale);
+ float noise = table_sample(noise_table_thickness,
+ i * noise_scale + fractf(mmd->noise_offset));
pt->pressure *= max_ff(1.0f + (noise * 2.0f - 1.0f) * weight * mmd->factor_thickness, 0.0f);
CLAMP_MIN(pt->pressure, GPENCIL_STRENGTH_MIN);
}
if (mmd->factor_strength > 0.0f) {
- float noise = table_sample(noise_table_strength, i * noise_scale);
+ float noise = table_sample(noise_table_strength,
+ i * noise_scale + fractf(mmd->noise_offset));
pt->strength *= max_ff(1.0f - noise * weight * mmd->factor_strength, 0.0f);
CLAMP(pt->strength, GPENCIL_STRENGTH_MIN, 1.0f);
}
if (mmd->factor_uvs > 0.0f) {
- float noise = table_sample(noise_table_uvs, i * noise_scale);
+ float noise = table_sample(noise_table_uvs, i * noise_scale + fractf(mmd->noise_offset));
pt->uv_rot += (noise * 2.0f - 1.0f) * weight * mmd->factor_uvs * M_PI_2;
CLAMP(pt->uv_rot, -M_PI_2, M_PI_2);
}
@@ -292,6 +305,8 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
uiItemR(col, ptr, "factor_thickness", 0, IFACE_("Thickness"), ICON_NONE);
uiItemR(col, ptr, "factor_uvs", 0, IFACE_("UV"), ICON_NONE);
uiItemR(col, ptr, "noise_scale", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "noise_offset", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "seed", 0, NULL, ICON_NONE);
gpencil_modifier_panel_end(layout, ptr);
}
@@ -316,7 +331,6 @@ static void random_panel_draw(const bContext *UNUSED(C), Panel *panel)
uiLayoutSetActive(layout, RNA_boolean_get(ptr, "random"));
uiItemR(layout, ptr, "step", 0, NULL, ICON_NONE);
- uiItemR(layout, ptr, "seed", 0, NULL, ICON_NONE);
}
static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c
index df2c838140e..54ff8d21633 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c
@@ -83,7 +83,9 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
tgmd->curve_intensity = BKE_curvemapping_copy(gmd->curve_intensity);
}
-/* aply smooth effect based on stroke direction */
+/**
+ * Apply smooth effect based on stroke direction.
+ */
static void deformStroke(GpencilModifierData *md,
Depsgraph *UNUSED(depsgraph),
Object *ob,
diff --git a/source/blender/gpu/GPU_batch.h b/source/blender/gpu/GPU_batch.h
index 85981ac8043..018e192bf37 100644
--- a/source/blender/gpu/GPU_batch.h
+++ b/source/blender/gpu/GPU_batch.h
@@ -84,7 +84,7 @@ typedef struct GPUBatch {
GPUVertBuf *inst[GPU_BATCH_INST_VBO_MAX_LEN];
/** NULL if element list not needed */
GPUIndexBuf *elem;
- /** Bookeeping. */
+ /** Bookkeeping. */
eGPUBatchFlag flag;
/** Type of geometry to draw. */
GPUPrimType prim_type;
@@ -128,7 +128,7 @@ void GPU_batch_program_set_builtin_with_config(GPUBatch *batch,
eGPUShaderConfig sh_cfg);
/* Will only work after setting the batch program. */
-/* TODO(fclem): Theses needs to be replaced by GPU_shader_uniform_* with explicit shader. */
+/* TODO(fclem): These need to be replaced by GPU_shader_uniform_* with explicit shader. */
#define GPU_batch_uniform_1i(batch, name, x) GPU_shader_uniform_1i((batch)->shader, name, x);
#define GPU_batch_uniform_1b(batch, name, x) GPU_shader_uniform_1b((batch)->shader, name, x);
#define GPU_batch_uniform_1f(batch, name, x) GPU_shader_uniform_1f((batch)->shader, name, x);
diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h
index c0f91756bf6..af94c1fb0e6 100644
--- a/source/blender/gpu/GPU_framebuffer.h
+++ b/source/blender/gpu/GPU_framebuffer.h
@@ -20,7 +20,7 @@
/** \file
* \ingroup gpu
*
- * GPU Framebuffer
+ * GPU Frame-buffer
* - this is a wrapper for an OpenGL framebuffer object (FBO). in practice
* multiple FBO's may be created.
* - actual FBO creation & config is deferred until GPU_framebuffer_bind or
@@ -79,7 +79,7 @@ GPUFrameBuffer *GPU_framebuffer_back_get(void);
} \
} while (0)
-/* Framebuffer setup : You need to call GPU_framebuffer_bind for these
+/* Frame-buffer setup: You need to call #GPU_framebuffer_bind for these
* to be effective. */
void GPU_framebuffer_texture_attach_ex(GPUFrameBuffer *gpu_fb, GPUAttachment attachment, int slot);
@@ -154,7 +154,7 @@ void GPU_framebuffer_texture_layer_attach(
void GPU_framebuffer_texture_cubeface_attach(
GPUFrameBuffer *fb, GPUTexture *tex, int slot, int face, int mip);
-/* Framebuffer operations */
+/* Frame-buffer operations. */
void GPU_framebuffer_viewport_set(GPUFrameBuffer *fb, int x, int y, int w, int h);
void GPU_framebuffer_viewport_get(GPUFrameBuffer *fb, int r_viewport[4]);
@@ -209,6 +209,10 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *fb,
void (*callback)(void *userData, int level),
void *userData);
+void GPU_framebuffer_push(GPUFrameBuffer *fb);
+GPUFrameBuffer *GPU_framebuffer_pop(void);
+uint GPU_framebuffer_stack_level_get(void);
+
/* GPU OffScreen
* - wrapper around frame-buffer and texture for simple off-screen drawing
*/
diff --git a/source/blender/gpu/GPU_index_buffer.h b/source/blender/gpu/GPU_index_buffer.h
index 0c71dd539a6..76aab3c196b 100644
--- a/source/blender/gpu/GPU_index_buffer.h
+++ b/source/blender/gpu/GPU_index_buffer.h
@@ -70,7 +70,7 @@ void GPU_indexbuf_set_tri_restart(GPUIndexBufBuilder *builder, uint elem);
GPUIndexBuf *GPU_indexbuf_build(GPUIndexBufBuilder *);
void GPU_indexbuf_build_in_place(GPUIndexBufBuilder *, GPUIndexBuf *);
-/* Create a subrange of an existing indexbuffer. */
+/* Create a sub-range of an existing index-buffer. */
GPUIndexBuf *GPU_indexbuf_create_subrange(GPUIndexBuf *elem_src, uint start, uint length);
void GPU_indexbuf_create_subrange_in_place(GPUIndexBuf *elem,
GPUIndexBuf *elem_src,
diff --git a/source/blender/gpu/GPU_platform.h b/source/blender/gpu/GPU_platform.h
index bb7e1d58041..c457b829bf7 100644
--- a/source/blender/gpu/GPU_platform.h
+++ b/source/blender/gpu/GPU_platform.h
@@ -34,6 +34,7 @@ typedef enum eGPUDeviceType {
GPU_DEVICE_ATI = (1 << 1),
GPU_DEVICE_INTEL = (1 << 2),
GPU_DEVICE_INTEL_UHD = (1 << 3),
+ GPU_DEVICE_APPLE = (1 << 3),
GPU_DEVICE_SOFTWARE = (1 << 4),
GPU_DEVICE_UNKNOWN = (1 << 5),
GPU_DEVICE_ANY = (0xff),
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 55716b584c3..9824c7016dc 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -29,7 +29,7 @@ extern "C" {
struct GPUVertBuf;
-/** Opaque type hidding blender::gpu::Shader */
+/** Opaque type hiding #blender::gpu::Shader */
typedef struct GPUShader GPUShader;
typedef enum eGPUShaderTFBType {
diff --git a/source/blender/gpu/GPU_state.h b/source/blender/gpu/GPU_state.h
index f5a1ccbc40b..0687f271670 100644
--- a/source/blender/gpu/GPU_state.h
+++ b/source/blender/gpu/GPU_state.h
@@ -46,7 +46,7 @@ ENUM_OPERATORS(eGPUBarrier, GPU_BARRIER_TEXTURE_FETCH)
/**
* Defines the fixed pipeline blending equation.
* SRC is the output color from the shader.
- * DST is the color from the framebuffer.
+ * DST is the color from the frame-buffer.
* The blending equation is :
* (SRC * A) + (DST * B).
* The blend mode will modify the A and B parameters.
@@ -64,7 +64,7 @@ typedef enum eGPUBlend {
* NOTE: Does not modify alpha. */
GPU_BLEND_INVERT,
/** Order independent transparency.
- * NOTE: Cannot be used as is. Needs special setup (framebuffer, shader ...). */
+ * NOTE: Cannot be used as is. Needs special setup (frame-buffer, shader ...). */
GPU_BLEND_OIT,
/** Special blend to add color under and multiply dst color by src alpha. */
GPU_BLEND_BACKGROUND,
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index 91119bd05a1..d9a01663de0 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -77,12 +77,12 @@ void GPU_samplers_update(void);
*/
/* Wrapper to supported OpenGL/Vulkan texture internal storage
- * If you need a type just uncomment it. Be aware that some formats
- * are not supported by renderbuffers. All of the following formats
+ * If you need a type just un-comment it. Be aware that some formats
+ * are not supported by render-buffers. All of the following formats
* are part of the OpenGL 3.3 core
* specification. */
typedef enum eGPUTextureFormat {
- /* Formats texture & renderbuffer */
+ /* Formats texture & render-buffer. */
GPU_RGBA8UI,
GPU_RGBA8I,
GPU_RGBA8,
@@ -114,15 +114,15 @@ typedef enum eGPUTextureFormat {
GPU_R16F,
GPU_R16, /* Max texture buffer format. */
-/* Special formats texture & renderbuffer */
-#if 0
+ /* Special formats texture & renderbuffer */
GPU_RGB10_A2,
- GPU_RGB10_A2UI,
-#endif
GPU_R11F_G11F_B10F,
GPU_DEPTH32F_STENCIL8,
GPU_DEPTH24_STENCIL8,
GPU_SRGB8_A8,
+#if 0
+ GPU_RGB10_A2UI,
+#endif
/* Texture only format */
GPU_RGB16F,
@@ -171,10 +171,11 @@ typedef enum eGPUTextureFormat {
typedef enum eGPUDataFormat {
GPU_DATA_FLOAT,
GPU_DATA_INT,
- GPU_DATA_UNSIGNED_INT,
- GPU_DATA_UNSIGNED_BYTE,
- GPU_DATA_UNSIGNED_INT_24_8,
+ GPU_DATA_UINT,
+ GPU_DATA_UBYTE,
+ GPU_DATA_UINT_24_8,
GPU_DATA_10_11_11_REV,
+ GPU_DATA_2_10_10_10_REV,
} eGPUDataFormat;
unsigned int GPU_texture_memory_usage_get(void);
@@ -272,6 +273,10 @@ int GPU_texture_opengl_bindcode(const GPUTexture *tex);
void GPU_texture_get_mipmap_size(GPUTexture *tex, int lvl, int *size);
+/* utilities */
+size_t GPU_texture_component_len(eGPUTextureFormat format);
+size_t GPU_texture_dataformat_size(eGPUDataFormat data_format);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/gpu/GPU_vertex_buffer.h b/source/blender/gpu/GPU_vertex_buffer.h
index eeaebd3fae5..aae58de533b 100644
--- a/source/blender/gpu/GPU_vertex_buffer.h
+++ b/source/blender/gpu/GPU_vertex_buffer.h
@@ -34,7 +34,7 @@ typedef enum {
GPU_VERTBUF_INVALID = 0,
/** Was init with a vertex format. */
GPU_VERTBUF_INIT = (1 << 0),
- /** Data has been touched and need to be reuploaded. */
+ /** Data has been touched and need to be re-uploaded. */
GPU_VERTBUF_DATA_DIRTY = (1 << 1),
/** The buffer has been created inside GPU memory. */
GPU_VERTBUF_DATA_UPLOADED = (1 << 2),
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 84da95f6fee..a2072e504fd 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -109,7 +109,7 @@ static GPUPass *gpu_pass_cache_resolve_collision(GPUPass *pass,
uint32_t hash)
{
BLI_spin_lock(&pass_cache_spin);
- /* Collision, need to strcmp the whole shader. */
+ /* Collision, need to `strcmp` the whole shader. */
for (; pass && (pass->hash == hash); pass = pass->next) {
if ((defs != NULL) && (!STREQ(pass->defines, defs))) { /* Pass */
}
diff --git a/source/blender/gpu/intern/gpu_context_private.hh b/source/blender/gpu/intern/gpu_context_private.hh
index ffa7a38faa6..82753b44c51 100644
--- a/source/blender/gpu/intern/gpu_context_private.hh
+++ b/source/blender/gpu/intern/gpu_context_private.hh
@@ -93,7 +93,7 @@ class Context {
bool is_active_on_thread(void);
};
-/* Syntacting suggar. */
+/* Syntactic sugar. */
static inline GPUContext *wrap(Context *ctx)
{
return reinterpret_cast<GPUContext *>(ctx);
diff --git a/source/blender/gpu/intern/gpu_drawlist_private.hh b/source/blender/gpu/intern/gpu_drawlist_private.hh
index 98603299d62..393307e6ee5 100644
--- a/source/blender/gpu/intern/gpu_drawlist_private.hh
+++ b/source/blender/gpu/intern/gpu_drawlist_private.hh
@@ -42,7 +42,7 @@ class DrawList {
virtual void submit() = 0;
};
-/* Syntacting suggar. */
+/* Syntactic sugar. */
static inline GPUDrawList *wrap(DrawList *vert)
{
return reinterpret_cast<GPUDrawList *>(vert);
diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc
index d5d7994a154..1e3cf479462 100644
--- a/source/blender/gpu/intern/gpu_framebuffer.cc
+++ b/source/blender/gpu/intern/gpu_framebuffer.cc
@@ -359,7 +359,7 @@ void GPU_framebuffer_viewport_reset(GPUFrameBuffer *gpu_fb)
unwrap(gpu_fb)->viewport_reset();
}
-/* ---------- Framebuffer Operations ----------- */
+/* ---------- Frame-buffer Operations ----------- */
void GPU_framebuffer_clear(GPUFrameBuffer *gpu_fb,
eGPUFrameBufferBits buffers,
@@ -476,10 +476,9 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *gpu_fb,
/** \} */
/* -------------------------------------------------------------------- */
-/** \name GPUOffScreen
+/** \name Frame-Buffer Stack
*
- * Container that holds a frame-buffer and its textures.
- * Might be bound to multiple contexts.
+ * Keeps track of frame-buffer binding operation to restore previously bound frame-buffers.
* \{ */
#define FRAMEBUFFER_STACK_DEPTH 16
@@ -489,22 +488,36 @@ static struct {
uint top;
} FrameBufferStack = {{nullptr}};
-static void gpuPushFrameBuffer(GPUFrameBuffer *fb)
+void GPU_framebuffer_push(GPUFrameBuffer *fb)
{
BLI_assert(FrameBufferStack.top < FRAMEBUFFER_STACK_DEPTH);
FrameBufferStack.framebuffers[FrameBufferStack.top] = fb;
FrameBufferStack.top++;
}
-static GPUFrameBuffer *gpuPopFrameBuffer()
+GPUFrameBuffer *GPU_framebuffer_pop(void)
{
BLI_assert(FrameBufferStack.top > 0);
FrameBufferStack.top--;
return FrameBufferStack.framebuffers[FrameBufferStack.top];
}
+uint GPU_framebuffer_stack_level_get(void)
+{
+ return FrameBufferStack.top;
+}
+
#undef FRAMEBUFFER_STACK_DEPTH
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name GPUOffScreen
+ *
+ * Container that holds a frame-buffer and its textures.
+ * Might be bound to multiple contexts.
+ * \{ */
+
#define MAX_CTX_FB_LEN 3
struct GPUOffScreen {
@@ -614,7 +627,7 @@ void GPU_offscreen_bind(GPUOffScreen *ofs, bool save)
{
if (save) {
GPUFrameBuffer *fb = GPU_framebuffer_active_get();
- gpuPushFrameBuffer(fb);
+ GPU_framebuffer_push(fb);
}
unwrap(gpu_offscreen_fb_get(ofs))->bind(false);
}
@@ -623,7 +636,7 @@ void GPU_offscreen_unbind(GPUOffScreen *UNUSED(ofs), bool restore)
{
GPUFrameBuffer *fb = nullptr;
if (restore) {
- fb = gpuPopFrameBuffer();
+ fb = GPU_framebuffer_pop();
}
if (fb) {
@@ -643,7 +656,7 @@ void GPU_offscreen_draw_to_screen(GPUOffScreen *ofs, int x, int y)
void GPU_offscreen_read_pixels(GPUOffScreen *ofs, eGPUDataFormat format, void *pixels)
{
- BLI_assert(ELEM(format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT));
+ BLI_assert(ELEM(format, GPU_DATA_UBYTE, GPU_DATA_FLOAT));
const int w = GPU_texture_width(ofs->color);
const int h = GPU_texture_height(ofs->color);
diff --git a/source/blender/gpu/intern/gpu_framebuffer_private.hh b/source/blender/gpu/intern/gpu_framebuffer_private.hh
index 7afa56bfe3d..d63d72cf4f7 100644
--- a/source/blender/gpu/intern/gpu_framebuffer_private.hh
+++ b/source/blender/gpu/intern/gpu_framebuffer_private.hh
@@ -20,12 +20,7 @@
/** \file
* \ingroup gpu
*
- * GPU Framebuffer
- * - this is a wrapper for an OpenGL framebuffer object (FBO). in practice
- * multiple FBO's may be created.
- * - actual FBO creation & config is deferred until GPU_framebuffer_bind or
- * GPU_framebuffer_check_valid to allow creation & config while another
- * opengl context is bound (since FBOs are not shared between ogl contexts).
+ * Private frame buffer API.
*/
#pragma once
@@ -210,7 +205,7 @@ class FrameBuffer {
};
};
-/* Syntacting suggar. */
+/* Syntactic sugar. */
static inline GPUFrameBuffer *wrap(FrameBuffer *vert)
{
return reinterpret_cast<GPUFrameBuffer *>(vert);
diff --git a/source/blender/gpu/intern/gpu_immediate_private.hh b/source/blender/gpu/intern/gpu_immediate_private.hh
index 9fcbe2bdc0b..98399897ea9 100644
--- a/source/blender/gpu/intern/gpu_immediate_private.hh
+++ b/source/blender/gpu/intern/gpu_immediate_private.hh
@@ -34,7 +34,7 @@ namespace blender::gpu {
class Immediate {
public:
- /** Pointer to the mapped buffer data for the currect vertex. */
+ /** Pointer to the mapped buffer data for the current vertex. */
uchar *vertex_data = NULL;
/** Current vertex index. */
uint vertex_idx = 0;
@@ -49,10 +49,10 @@ class Immediate {
GPUPrimType prim_type = GPU_PRIM_NONE;
GPUVertFormat vertex_format = {};
GPUShader *shader = NULL;
- /** Enforce strict vertex count (disabled when using immBeginAtMost). */
+ /** Enforce strict vertex count (disabled when using #immBeginAtMost). */
bool strict_vertex_len = true;
- /** Batch in construction when using immBeginBatch. */
+ /** Batch in construction when using #immBeginBatch. */
GPUBatch *batch = NULL;
/** Wide Line workaround. */
@@ -61,7 +61,7 @@ class Immediate {
GPUShader *prev_shader = NULL;
/** Builtin shader index. Used to test if the workaround can be done. */
eGPUBuiltinShader builtin_shader_bound = GPU_SHADER_TEXT;
- /** Uniform color: Kept here to update the wideline shader just before immBegin. */
+ /** Uniform color: Kept here to update the wide-line shader just before #immBegin. */
float uniform_color[4];
public:
diff --git a/source/blender/gpu/intern/gpu_index_buffer_private.hh b/source/blender/gpu/intern/gpu_index_buffer_private.hh
index 7054360d07f..2405db8664a 100644
--- a/source/blender/gpu/intern/gpu_index_buffer_private.hh
+++ b/source/blender/gpu/intern/gpu_index_buffer_private.hh
@@ -57,7 +57,7 @@ class IndexBuf {
uint32_t index_len_ = 0;
/** Base index: Added to all indices after fetching. Allows index compression. */
uint32_t index_base_ = 0;
- /** Bookeeping. */
+ /** Bookkeeping. */
bool is_init_ = false;
/** Is this object only a reference to a subrange of another IndexBuf. */
bool is_subrange_ = false;
@@ -96,7 +96,7 @@ class IndexBuf {
inline uint index_range(uint *r_min, uint *r_max);
};
-/* Syntacting suggar. */
+/* Syntactic sugar. */
static inline GPUIndexBuf *wrap(IndexBuf *indexbuf)
{
return reinterpret_cast<GPUIndexBuf *>(indexbuf);
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index 496988c4ba9..64cd375d466 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -755,6 +755,10 @@ static void gpu_parse_material_library(GHash *hash, GPUMaterialLibrary *library)
/* get parameters */
while (*code && *code != ')') {
+ if (BLI_str_startswith(code, "const ")) {
+ code = gpu_str_skip_token(code, NULL, 0);
+ }
+
/* test if it's an input or output */
qual = FUNCTION_QUAL_IN;
if (BLI_str_startswith(code, "out ")) {
diff --git a/source/blender/gpu/intern/gpu_matrix.cc b/source/blender/gpu/intern/gpu_matrix.cc
index 4ccb28fedbd..24cdea74347 100644
--- a/source/blender/gpu/intern/gpu_matrix.cc
+++ b/source/blender/gpu/intern/gpu_matrix.cc
@@ -732,7 +732,7 @@ float GPU_polygon_offset_calc(const float (*winmat)[4], float viewdist, float di
#else
static float depth_fac = 0.0f;
if (depth_fac == 0.0f) {
- /* Hardcode for 24 bit precision. */
+ /* Hard-code for 24 bit precision. */
int depthbits = 24;
depth_fac = 1.0f / (float)((1 << depthbits) - 1);
}
diff --git a/source/blender/gpu/intern/gpu_node_graph.c b/source/blender/gpu/intern/gpu_node_graph.c
index 08da49c3475..bf91a5bbb4d 100644
--- a/source/blender/gpu/intern/gpu_node_graph.c
+++ b/source/blender/gpu/intern/gpu_node_graph.c
@@ -132,7 +132,7 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, const eGPUType
case GPU_NODE_LINK_ATTR:
input->source = GPU_SOURCE_ATTR;
input->attr = link->attr;
- /* Failsafe handling if the same attribute is used with different datatypes for
+ /* Fail-safe handling if the same attribute is used with different data-types for
* some reason (only really makes sense with float/vec2/vec3/vec4 though). This
* can happen if mixing the generic Attribute node with specialized ones. */
CLAMP_MIN(input->attr->gputype, type);
diff --git a/source/blender/gpu/intern/gpu_select_pick.c b/source/blender/gpu/intern/gpu_select_pick.c
index 66748b4146a..89c94fd3ba5 100644
--- a/source/blender/gpu/intern/gpu_select_pick.c
+++ b/source/blender/gpu/intern/gpu_select_pick.c
@@ -269,7 +269,7 @@ typedef struct GPUPickState {
ListBase bufs;
} cache;
- /* Pickign methods */
+ /* Picking methods. */
union {
/* GPU_SELECT_PICK_ALL */
struct {
@@ -483,7 +483,7 @@ bool gpu_select_pick_load_id(uint id, bool end)
const uint rect_len = ps->src.rect_len;
GPUFrameBuffer *fb = GPU_framebuffer_active_get();
GPU_framebuffer_read_depth(
- fb, UNPACK4(ps->gl.clip_readpixels), GPU_DATA_UNSIGNED_INT, ps->gl.rect_depth_test->buf);
+ fb, UNPACK4(ps->gl.clip_readpixels), GPU_DATA_UINT, ps->gl.rect_depth_test->buf);
/* perform initial check since most cases the array remains unchanged */
bool do_pass = false;
diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc
index d47ad5e0100..bb657ff1645 100644
--- a/source/blender/gpu/intern/gpu_shader.cc
+++ b/source/blender/gpu/intern/gpu_shader.cc
@@ -106,7 +106,7 @@ void Shader::print_log(Span<const char *> sources, char *log, const char *stage,
error_line = error_char = -1;
if (log_line[0] >= '0' && log_line[0] <= '9') {
error_line = (int)strtol(log_line, &error_line_number_end, 10);
- /* Try to fetch the error caracter (not always available). */
+ /* Try to fetch the error character (not always available). */
if (ELEM(error_line_number_end[0], '(', ':') && error_line_number_end[1] != ' ') {
error_char = (int)strtol(error_line_number_end + 1, &log_line, 10);
}
@@ -166,6 +166,11 @@ void Shader::print_log(Span<const char *> sources, char *log, const char *stage,
found_line_id = true;
break;
}
+/* TODO(fclem) Make this an option to display N lines before error. */
+#if 0 /* Uncomment to print shader file up to the error line to have more context. */
+ BLI_dynstr_appendf(dynstr, "%5d | ", src_line_index);
+ BLI_dynstr_nappend(dynstr, src_line, (src_line_end + 1) - src_line);
+#endif
/* Continue to next line. */
src_line = src_line_end + 1;
src_line_index++;
diff --git a/source/blender/gpu/intern/gpu_shader_interface.hh b/source/blender/gpu/intern/gpu_shader_interface.hh
index 62513ffb8a7..aec58544111 100644
--- a/source/blender/gpu/intern/gpu_shader_interface.hh
+++ b/source/blender/gpu/intern/gpu_shader_interface.hh
@@ -41,7 +41,7 @@ typedef struct ShaderInput {
uint32_t name_offset;
uint32_t name_hash;
int32_t location;
- /** Defined at interface creation or in shader. Only for Samplers, UBOs and Vertex Attribs. */
+ /** Defined at interface creation or in shader. Only for Samplers, UBOs and Vertex Attributes. */
int32_t binding;
} ShaderInput;
@@ -60,7 +60,7 @@ class ShaderInterface {
uint attr_len_ = 0;
uint ubo_len_ = 0;
uint uniform_len_ = 0;
- /** Enabled bindpoints that needs to be fed with data. */
+ /** Enabled bind-points that needs to be fed with data. */
uint16_t enabled_attr_mask_ = 0;
uint16_t enabled_ubo_mask_ = 0;
uint8_t enabled_ima_mask_ = 0;
@@ -226,7 +226,7 @@ inline const ShaderInput *ShaderInterface::input_lookup(const ShaderInput *const
for (int i = inputs_len - 1; i >= 0; i--) {
if (inputs[i].name_hash == name_hash) {
if ((i > 0) && UNLIKELY(inputs[i - 1].name_hash == name_hash)) {
- /* Hash colision resolve. */
+ /* Hash collision resolve. */
for (; i >= 0 && inputs[i].name_hash == name_hash; i--) {
if (STREQ(name, name_buffer_ + inputs[i].name_offset)) {
return inputs + i; /* not found */
diff --git a/source/blender/gpu/intern/gpu_shader_private.hh b/source/blender/gpu/intern/gpu_shader_private.hh
index 85427372559..d9327bbc0f4 100644
--- a/source/blender/gpu/intern/gpu_shader_private.hh
+++ b/source/blender/gpu/intern/gpu_shader_private.hh
@@ -76,7 +76,7 @@ class Shader {
void print_log(Span<const char *> sources, char *log, const char *stage, const bool error);
};
-/* Syntacting suggar. */
+/* Syntactic sugar. */
static inline GPUShader *wrap(Shader *vert)
{
return reinterpret_cast<GPUShader *>(vert);
diff --git a/source/blender/gpu/intern/gpu_state.cc b/source/blender/gpu/intern/gpu_state.cc
index e158601a25c..782d25747bb 100644
--- a/source/blender/gpu/intern/gpu_state.cc
+++ b/source/blender/gpu/intern/gpu_state.cc
@@ -165,6 +165,11 @@ void GPU_depth_range(float near, float far)
copy_v2_fl2(state.depth_range, near, far);
}
+/**
+ * \note By convention, this is set as needed and not reset back to 1.0.
+ * This means code that draws lines must always set the line width beforehand,
+ * but is not expected to restore it's previous value.
+ */
void GPU_line_width(float width)
{
width = max_ff(1.0f, width * PIXELSIZE);
diff --git a/source/blender/gpu/intern/gpu_state_private.hh b/source/blender/gpu/intern/gpu_state_private.hh
index cda1b591bb1..b79350a6506 100644
--- a/source/blender/gpu/intern/gpu_state_private.hh
+++ b/source/blender/gpu/intern/gpu_state_private.hh
@@ -101,16 +101,16 @@ union GPUStateMutable {
/** Positive if using program point size. */
/* TODO(fclem): should be passed as uniform to all shaders. */
float point_size;
- /** Not supported on every platform. Prefer using wideline shader. */
+ /** Not supported on every platform. Prefer using wide-line shader. */
float line_width;
/** Mutable stencil states. */
uint8_t stencil_write_mask;
uint8_t stencil_compare_mask;
uint8_t stencil_reference;
uint8_t _pad0;
- /* IMPORTANT: ensure x64 stuct alignment. */
+ /* IMPORTANT: ensure x64 struct alignment. */
};
- /* Here to allow fast bitwise ops. */
+ /* Here to allow fast bit-wise ops. */
uint64_t data[9];
};
diff --git a/source/blender/gpu/intern/gpu_texture.cc b/source/blender/gpu/intern/gpu_texture.cc
index d134d718cbe..c3e9058c6c7 100644
--- a/source/blender/gpu/intern/gpu_texture.cc
+++ b/source/blender/gpu/intern/gpu_texture.cc
@@ -608,3 +608,19 @@ void GPU_samplers_update(void)
}
/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name GPU texture utilities
+ * \{ */
+
+size_t GPU_texture_component_len(eGPUTextureFormat tex_format)
+{
+ return to_component_len(tex_format);
+}
+
+size_t GPU_texture_dataformat_size(eGPUDataFormat data_format)
+{
+ return to_bytesize(data_format);
+}
+
+/** \} */
diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh
index 4197d5c55fc..3d808bce152 100644
--- a/source/blender/gpu/intern/gpu_texture_private.hh
+++ b/source/blender/gpu/intern/gpu_texture_private.hh
@@ -83,11 +83,11 @@ class Texture {
protected:
/* ---- Texture format (immutable after init). ---- */
- /** Width & Height & Depth. For cubemap arrays, d is number of facelayers. */
+ /** Width & Height & Depth. For cube-map arrays, d is number of face-layers. */
int w_, h_, d_;
/** Internal data format. */
eGPUTextureFormat format_;
- /** Format caracteristics. */
+ /** Format characteristics. */
eGPUTextureFormatFlag format_flag_;
/** Texture type. */
eGPUTextureType type_;
@@ -101,7 +101,7 @@ class Texture {
/** For debugging */
char name_[DEBUG_NAME_LEN];
- /** Framebuffer references to update on deletion. */
+ /** Frame-buffer references to update on deletion. */
GPUAttachmentType fb_attachment_[GPU_TEX_MAX_FBO_ATTACHED];
FrameBuffer *fb_[GPU_TEX_MAX_FBO_ATTACHED];
@@ -245,7 +245,7 @@ class Texture {
virtual bool init_internal(GPUVertBuf *vbo) = 0;
};
-/* Syntacting suggar. */
+/* Syntactic sugar. */
static inline GPUTexture *wrap(Texture *vert)
{
return reinterpret_cast<GPUTexture *>(vert);
@@ -283,6 +283,7 @@ inline size_t to_bytesize(eGPUTextureFormat format)
case GPU_RGBA8UI:
case GPU_RGBA8:
case GPU_SRGB8_A8:
+ case GPU_RGB10_A2:
case GPU_R11F_G11F_B10F:
case GPU_R32F:
case GPU_R32UI:
@@ -368,6 +369,7 @@ inline int to_component_len(eGPUTextureFormat format)
case GPU_RGBA16:
case GPU_RGBA32F:
case GPU_SRGB8_A8:
+ case GPU_RGB10_A2:
return 4;
case GPU_RGB16F:
case GPU_R11F_G11F_B10F:
@@ -384,17 +386,18 @@ inline int to_component_len(eGPUTextureFormat format)
}
}
-inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_format)
+inline size_t to_bytesize(eGPUDataFormat data_format)
{
switch (data_format) {
- case GPU_DATA_UNSIGNED_BYTE:
- return 1 * to_component_len(tex_format);
+ case GPU_DATA_UBYTE:
+ return 1;
case GPU_DATA_FLOAT:
case GPU_DATA_INT:
- case GPU_DATA_UNSIGNED_INT:
- return 4 * to_component_len(tex_format);
- case GPU_DATA_UNSIGNED_INT_24_8:
+ case GPU_DATA_UINT:
+ return 4;
+ case GPU_DATA_UINT_24_8:
case GPU_DATA_10_11_11_REV:
+ case GPU_DATA_2_10_10_10_REV:
return 4;
default:
BLI_assert(!"Data format incorrect or unsupported\n");
@@ -402,6 +405,11 @@ inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_form
}
}
+inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_format)
+{
+ return to_component_len(tex_format) * to_bytesize(data_format);
+}
+
/* Definitely not complete, edit according to the gl specification. */
inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat data_format)
{
@@ -412,12 +420,12 @@ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat da
return data_format == GPU_DATA_FLOAT;
case GPU_DEPTH24_STENCIL8:
case GPU_DEPTH32F_STENCIL8:
- return data_format == GPU_DATA_UNSIGNED_INT_24_8;
+ return data_format == GPU_DATA_UINT_24_8;
case GPU_R8UI:
case GPU_R16UI:
case GPU_RG16UI:
case GPU_R32UI:
- return data_format == GPU_DATA_UNSIGNED_INT;
+ return data_format == GPU_DATA_UINT;
case GPU_RG16I:
case GPU_R16I:
return data_format == GPU_DATA_INT;
@@ -426,7 +434,9 @@ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat da
case GPU_RGBA8:
case GPU_RGBA8UI:
case GPU_SRGB8_A8:
- return ELEM(data_format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT);
+ return ELEM(data_format, GPU_DATA_UBYTE, GPU_DATA_FLOAT);
+ case GPU_RGB10_A2:
+ return ELEM(data_format, GPU_DATA_2_10_10_10_REV, GPU_DATA_FLOAT);
case GPU_R11F_G11F_B10F:
return ELEM(data_format, GPU_DATA_10_11_11_REV, GPU_DATA_FLOAT);
default:
@@ -444,12 +454,12 @@ inline eGPUDataFormat to_data_format(eGPUTextureFormat tex_format)
return GPU_DATA_FLOAT;
case GPU_DEPTH24_STENCIL8:
case GPU_DEPTH32F_STENCIL8:
- return GPU_DATA_UNSIGNED_INT_24_8;
+ return GPU_DATA_UINT_24_8;
case GPU_R8UI:
case GPU_R16UI:
case GPU_RG16UI:
case GPU_R32UI:
- return GPU_DATA_UNSIGNED_INT;
+ return GPU_DATA_UINT;
case GPU_RG16I:
case GPU_R16I:
return GPU_DATA_INT;
@@ -458,7 +468,9 @@ inline eGPUDataFormat to_data_format(eGPUTextureFormat tex_format)
case GPU_RGBA8:
case GPU_RGBA8UI:
case GPU_SRGB8_A8:
- return GPU_DATA_UNSIGNED_BYTE;
+ return GPU_DATA_UBYTE;
+ case GPU_RGB10_A2:
+ return GPU_DATA_2_10_10_10_REV;
case GPU_R11F_G11F_B10F:
return GPU_DATA_10_11_11_REV;
default:
diff --git a/source/blender/gpu/intern/gpu_uniform_buffer_private.hh b/source/blender/gpu/intern/gpu_uniform_buffer_private.hh
index 826bdd9f8d5..e8fc1343eaf 100644
--- a/source/blender/gpu/intern/gpu_uniform_buffer_private.hh
+++ b/source/blender/gpu/intern/gpu_uniform_buffer_private.hh
@@ -65,7 +65,7 @@ class UniformBuf {
}
};
-/* Syntacting suggar. */
+/* Syntactic sugar. */
static inline GPUUniformBuf *wrap(UniformBuf *vert)
{
return reinterpret_cast<GPUUniformBuf *>(vert);
diff --git a/source/blender/gpu/intern/gpu_vertex_buffer_private.hh b/source/blender/gpu/intern/gpu_vertex_buffer_private.hh
index da8b02c5c66..67a09f6f83c 100644
--- a/source/blender/gpu/intern/gpu_vertex_buffer_private.hh
+++ b/source/blender/gpu/intern/gpu_vertex_buffer_private.hh
@@ -62,7 +62,7 @@ class VertBuf {
void init(const GPUVertFormat *format, GPUUsageType usage);
void clear(void);
- /* Data manament */
+ /* Data management. */
void allocate(uint vert_len);
void resize(uint vert_len);
void upload(void);
@@ -105,7 +105,7 @@ class VertBuf {
virtual void duplicate_data(VertBuf *dst) = 0;
};
-/* Syntacting suggar. */
+/* Syntactic sugar. */
static inline GPUVertBuf *wrap(VertBuf *vert)
{
return reinterpret_cast<GPUVertBuf *>(vert);
diff --git a/source/blender/gpu/intern/gpu_vertex_format.cc b/source/blender/gpu/intern/gpu_vertex_format.cc
index 014c70033fc..8498da11507 100644
--- a/source/blender/gpu/intern/gpu_vertex_format.cc
+++ b/source/blender/gpu/intern/gpu_vertex_format.cc
@@ -105,7 +105,7 @@ uint vertex_buffer_size(const GPUVertFormat *format, uint vertex_len)
static uchar copy_attr_name(GPUVertFormat *format, const char *name)
{
- /* strncpy does 110% of what we need; let's do exactly 100% */
+ /* `strncpy` does 110% of what we need; let's do exactly 100% */
uchar name_offset = format->name_offset;
char *name_copy = format->names + name_offset;
uint available = GPU_VERT_ATTR_NAMES_BUF_LEN - name_offset;
@@ -162,7 +162,7 @@ uint GPU_vertformat_attr_add(GPUVertFormat *format,
assert(comp_len != 8 && comp_len != 12 && comp_len != 16);
}
#endif
- format->name_len++; /* multiname support */
+ format->name_len++; /* Multi-name support. */
const uint attr_id = format->attr_len++;
GPUVertAttr *attr = &format->attrs[attr_id];
@@ -186,7 +186,7 @@ void GPU_vertformat_alias_add(GPUVertFormat *format, const char *alias)
assert(format->name_len < GPU_VERT_FORMAT_MAX_NAMES); /* there's room for more */
assert(attr->name_len < GPU_VERT_ATTR_MAX_NAMES);
#endif
- format->name_len++; /* multiname support */
+ format->name_len++; /* Multi-name support. */
attr->names[attr->name_len++] = copy_attr_name(format, alias);
}
@@ -200,7 +200,7 @@ void GPU_vertformat_alias_add(GPUVertFormat *format, const char *alias)
*
* WARNING: this function creates a lot of aliases/attributes, make sure to keep the attribute
* name short to avoid overflowing the name-buffer.
- * */
+ */
void GPU_vertformat_multiload_enable(GPUVertFormat *format, int load_count)
{
/* Sanity check. Maximum can be upgraded if needed. */
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index 205ba1d06d6..c118145ebd6 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -86,10 +86,10 @@ struct GPUViewport {
int size[2];
int flag;
- /* Set the active view (for stereoscoptic viewport rendering). */
+ /* Set the active view (for stereoscopic viewport rendering). */
int active_view;
- /* If engine_handles mismatch we free all ViewportEngineData in this viewport. */
+ /* If engine_handles mismatch we free all #ViewportEngineData in this viewport. */
struct {
void *handle;
ViewportEngineData *data;
@@ -589,7 +589,7 @@ void GPU_viewport_colorspace_set(GPUViewport *viewport,
/* Restore. */
view_settings->curve_mapping = tmp_curve_mapping;
viewport->view_settings.curve_mapping = tmp_curve_mapping_vp;
- /* Only copy curvemapping if needed. Avoid uneeded OCIO cache miss. */
+ /* Only copy curve-mapping if needed. Avoid unneeded OCIO cache miss. */
if (tmp_curve_mapping && viewport->view_settings.curve_mapping == NULL) {
BKE_color_managed_view_settings_free(&viewport->view_settings);
viewport->view_settings.curve_mapping = BKE_curvemapping_copy(tmp_curve_mapping);
@@ -820,7 +820,7 @@ void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
const float w = (float)GPU_texture_width(color);
const float h = (float)GPU_texture_height(color);
- /* We allow rects with min/max swapped, but we also need coorectly assigned coordinates. */
+ /* We allow rects with min/max swapped, but we also need correctly assigned coordinates. */
rcti sanitized_rect = *rect;
BLI_rcti_sanitize(&sanitized_rect);
@@ -974,7 +974,7 @@ static void gpu_viewport_passes_free(PassList *psl, int psl_len)
memset(psl->passes, 0, sizeof(*psl->passes) * psl_len);
}
-/* Must be executed inside Drawmanager Opengl Context. */
+/* Must be executed inside Draw-manager OpenGL Context. */
void GPU_viewport_free(GPUViewport *viewport)
{
gpu_viewport_engines_data_free(viewport);
diff --git a/source/blender/gpu/opengl/gl_backend.cc b/source/blender/gpu/opengl/gl_backend.cc
index 1d76b07c966..ef7788194a1 100644
--- a/source/blender/gpu/opengl/gl_backend.cc
+++ b/source/blender/gpu/opengl/gl_backend.cc
@@ -96,6 +96,11 @@ void GLBackend::platform_init()
GPG.device = GPU_DEVICE_SOFTWARE;
GPG.driver = GPU_DRIVER_SOFTWARE;
}
+ else if (strstr(vendor, "Apple")) {
+ /* Apple Silicon. */
+ GPG.device = GPU_DEVICE_APPLE;
+ GPG.driver = GPU_DRIVER_OFFICIAL;
+ }
else if (strstr(renderer, "Apple Software Renderer")) {
GPG.device = GPU_DEVICE_SOFTWARE;
GPG.driver = GPU_DRIVER_SOFTWARE;
@@ -244,15 +249,16 @@ static void detect_workarounds()
if (!GLEW_VERSION_4_0) {
GLContext::base_instance_support = false;
}
- /* The renderers include:
- * Mobility Radeon HD 5000;
- * Radeon HD 7500M;
- * Radeon HD 7570M;
- * Radeon HD 7600M;
- * And many others... */
if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_WIN, GPU_DRIVER_OFFICIAL) &&
(strstr(version, "4.5.13399") || strstr(version, "4.5.13417") ||
- strstr(version, "4.5.13422"))) {
+ strstr(version, "4.5.13422") || strstr(version, "4.5.13467"))) {
+ /* The renderers include:
+ * Radeon HD 5000;
+ * Radeon HD 7500M;
+ * Radeon HD 7570M;
+ * Radeon HD 7600M;
+ * Radeon R5 Graphics;
+ * And others... */
GLContext::unused_fb_slot_workaround = true;
GCaps.mip_render_workaround = true;
GCaps.shader_image_load_store_support = false;
@@ -302,7 +308,7 @@ static void detect_workarounds()
if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_WIN, GPU_DRIVER_OFFICIAL) && !GLEW_VERSION_4_5) {
GLContext::copy_image_support = false;
}
- /* Special fix for theses specific GPUs.
+ /* Special fix for these specific GPUs.
* Without this workaround, blender crashes on startup. (see T72098) */
if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_WIN, GPU_DRIVER_OFFICIAL) &&
(strstr(renderer, "HD Graphics 620") || strstr(renderer, "HD Graphics 630"))) {
@@ -361,14 +367,14 @@ static void detect_workarounds()
}
}
- /* Some Intel drivers have issues with using mips as framebuffer targets if
- * GL_TEXTURE_MAX_LEVEL is higher than the target mip.
+ /* Some Intel drivers have issues with using mips as frame-buffer targets if
+ * GL_TEXTURE_MAX_LEVEL is higher than the target MIP.
* Only check at the end after all other workarounds because this uses the drawing code.
* Also after device/driver flags to avoid the check that causes pre GCN Radeon to crash. */
if (GCaps.mip_render_workaround == false) {
GCaps.mip_render_workaround = detect_mip_render_workaround();
}
- /* Disable multidraw if the base instance cannot be read. */
+ /* Disable multi-draw if the base instance cannot be read. */
if (GLContext::shader_draw_parameters_support == false) {
GLContext::multi_draw_indirect_support = false;
}
diff --git a/source/blender/gpu/opengl/gl_batch.hh b/source/blender/gpu/opengl/gl_batch.hh
index 0fadde7a70d..218b9ffe4b7 100644
--- a/source/blender/gpu/opengl/gl_batch.hh
+++ b/source/blender/gpu/opengl/gl_batch.hh
@@ -52,9 +52,9 @@ class GLVaoCache {
GLContext *context_ = NULL;
/** Last interface this batch was drawn with. */
GLShaderInterface *interface_ = NULL;
- /** Cached vao for the last interface. */
+ /** Cached VAO for the last interface. */
GLuint vao_id_ = 0;
- /** Used whend arb_base_instance is not supported. */
+ /** Used when arb_base_instance is not supported. */
GLuint vao_base_instance_ = 0;
int base_instance_ = 0;
diff --git a/source/blender/gpu/opengl/gl_context.cc b/source/blender/gpu/opengl/gl_context.cc
index d766e6f0828..6c9c6e10774 100644
--- a/source/blender/gpu/opengl/gl_context.cc
+++ b/source/blender/gpu/opengl/gl_context.cc
@@ -108,7 +108,7 @@ GLContext::~GLContext()
BLI_assert(orphaned_vertarrays_.is_empty());
/* For now don't allow GPUFrameBuffers to be reuse in another context. */
BLI_assert(framebuffers_.is_empty());
- /* Delete vaos so the batch can be reused in another context. */
+ /* Delete VAO's so the batch can be reused in another context. */
for (GLVaoCache *cache : vao_caches_) {
cache->clear();
}
@@ -312,7 +312,7 @@ void GLContext::memory_statistics_get(int *r_total_mem, int *r_free_mem)
{
/* TODO(merwin): use Apple's platform API to get this info. */
if (GLEW_NVX_gpu_memory_info) {
- /* Teturned value in Kb. */
+ /* Returned value in Kb. */
glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, r_total_mem);
glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, r_free_mem);
}
diff --git a/source/blender/gpu/opengl/gl_context.hh b/source/blender/gpu/opengl/gl_context.hh
index 66a3fdd3355..0222adaba25 100644
--- a/source/blender/gpu/opengl/gl_context.hh
+++ b/source/blender/gpu/opengl/gl_context.hh
@@ -43,7 +43,7 @@ class GLVaoCache;
class GLSharedOrphanLists {
public:
- /** Mutex for the bellow structures. */
+ /** Mutex for the below structures. */
std::mutex lists_mutex;
/** Buffers and textures are shared across context. Any context can free them. */
Vector<GLuint> textures;
@@ -87,17 +87,17 @@ class GLContext : public Context {
private:
/**
- * GPUBatch & GPUFramebuffer have references to the context they are from, in the case the
+ * #GPUBatch & #GPUFramebuffer have references to the context they are from, in the case the
* context is destroyed, we need to remove any reference to it.
*/
Set<GLVaoCache *> vao_caches_;
Set<GPUFrameBuffer *> framebuffers_;
- /** Mutex for the bellow structures. */
+ /** Mutex for the below structures. */
std::mutex lists_mutex_;
/** VertexArrays and framebuffers are not shared across context. */
Vector<GLuint> orphaned_vertarrays_;
Vector<GLuint> orphaned_framebuffers_;
- /** GLBackend onws this data. */
+ /** #GLBackend owns this data. */
GLSharedOrphanLists &shared_orphan_list_;
public:
diff --git a/source/blender/gpu/opengl/gl_debug.cc b/source/blender/gpu/opengl/gl_debug.cc
index 0914c117241..ac42a950945 100644
--- a/source/blender/gpu/opengl/gl_debug.cc
+++ b/source/blender/gpu/opengl/gl_debug.cc
@@ -363,7 +363,7 @@ namespace blender::gpu {
void GLContext::debug_group_begin(const char *name, int index)
{
if ((G.debug & G_DEBUG_GPU) && (GLEW_VERSION_4_3 || GLEW_KHR_debug)) {
- /* Add 10 to avoid conlision with other indices from other possible callback layers. */
+ /* Add 10 to avoid collision with other indices from other possible callback layers. */
index += 10;
glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, index, -1, name);
}
diff --git a/source/blender/gpu/opengl/gl_framebuffer.cc b/source/blender/gpu/opengl/gl_framebuffer.cc
index cbb332388dc..920dac407d7 100644
--- a/source/blender/gpu/opengl/gl_framebuffer.cc
+++ b/source/blender/gpu/opengl/gl_framebuffer.cc
@@ -142,13 +142,13 @@ bool GLFrameBuffer::check(char err_out[256])
#undef FORMAT_STATUS
- const char *format = "GPUFrameBuffer: frame-buffer status %s\n";
+ const char *format = "GPUFrameBuffer: %s status %s\n";
if (err_out) {
- BLI_snprintf(err_out, 256, format, err);
+ BLI_snprintf(err_out, 256, format, this->name_, err);
}
else {
- fprintf(stderr, format, err);
+ fprintf(stderr, format, this->name_, err);
}
return false;
@@ -365,7 +365,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type,
context_->state_manager->apply_state();
if (type == GPU_FB_DEPTH_STENCIL_ATTACHMENT) {
- BLI_assert(data_format == GPU_DATA_UNSIGNED_INT_24_8);
+ BLI_assert(data_format == GPU_DATA_UINT_24_8);
float depth = ((*(uint32_t *)clear_value) & 0x00FFFFFFu) / (float)0x00FFFFFFu;
int stencil = ((*(uint32_t *)clear_value) >> 24);
glClearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);
@@ -374,7 +374,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type,
if (data_format == GPU_DATA_FLOAT) {
glClearBufferfv(GL_DEPTH, 0, (GLfloat *)clear_value);
}
- else if (data_format == GPU_DATA_UNSIGNED_INT) {
+ else if (data_format == GPU_DATA_UINT) {
float depth = *(uint32_t *)clear_value / (float)0xFFFFFFFFu;
glClearBufferfv(GL_DEPTH, 0, &depth);
}
@@ -388,7 +388,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type,
case GPU_DATA_FLOAT:
glClearBufferfv(GL_COLOR, slot, (GLfloat *)clear_value);
break;
- case GPU_DATA_UNSIGNED_INT:
+ case GPU_DATA_UINT:
glClearBufferuiv(GL_COLOR, slot, (GLuint *)clear_value);
break;
case GPU_DATA_INT:
diff --git a/source/blender/gpu/opengl/gl_framebuffer.hh b/source/blender/gpu/opengl/gl_framebuffer.hh
index 95e67f5973c..7b2c73d7042 100644
--- a/source/blender/gpu/opengl/gl_framebuffer.hh
+++ b/source/blender/gpu/opengl/gl_framebuffer.hh
@@ -20,7 +20,7 @@
/** \file
* \ingroup gpu
*
- * Encapsulation of Framebuffer states (attached textures, viewport, scissors).
+ * Encapsulation of Frame-buffer states (attached textures, viewport, scissors).
*/
#pragma once
@@ -45,22 +45,22 @@ class GLFrameBuffer : public FrameBuffer {
private:
/** OpenGL handle. */
GLuint fbo_id_ = 0;
- /** Context the handle is from. Framebuffers are not shared accros contexts. */
+ /** Context the handle is from. Frame-buffers are not shared across contexts. */
GLContext *context_ = NULL;
/** State Manager of the same contexts. */
GLStateManager *state_manager_ = NULL;
/** Copy of the GL state. Contains ONLY color attachments enums for slot binding. */
GLenum gl_attachments_[GPU_FB_MAX_COLOR_ATTACHMENT];
- /** Internal framebuffers are immutable. */
+ /** Internal frame-buffers are immutable. */
bool immutable_;
- /** True is the framebuffer has its first color target using the GPU_SRGB8_A8 format. */
+ /** True is the frame-buffer has its first color target using the GPU_SRGB8_A8 format. */
bool srgb_;
- /** True is the framebuffer has been bound using the GL_FRAMEBUFFER_SRGB feature. */
+ /** True is the frame-buffer has been bound using the GL_FRAMEBUFFER_SRGB feature. */
bool enabled_srgb_ = false;
public:
/**
- * Create a conventional framebuffer to attach texture to.
+ * Create a conventional frame-buffer to attach texture to.
*/
GLFrameBuffer(const char *name);
diff --git a/source/blender/gpu/opengl/gl_primitive.hh b/source/blender/gpu/opengl/gl_primitive.hh
index 7cd0654bc2c..05a15017c66 100644
--- a/source/blender/gpu/opengl/gl_primitive.hh
+++ b/source/blender/gpu/opengl/gl_primitive.hh
@@ -20,7 +20,7 @@
/** \file
* \ingroup gpu
*
- * Encapsulation of Framebuffer states (attached textures, viewport, scissors).
+ * Encapsulation of Frame-buffer states (attached textures, viewport, scissors).
*/
#pragma once
diff --git a/source/blender/gpu/opengl/gl_shader_interface.cc b/source/blender/gpu/opengl/gl_shader_interface.cc
index 9533639b133..5870c645bf4 100644
--- a/source/blender/gpu/opengl/gl_shader_interface.cc
+++ b/source/blender/gpu/opengl/gl_shader_interface.cc
@@ -51,7 +51,7 @@ static inline int sampler_binding(int32_t program,
int32_t uniform_location,
int *sampler_len)
{
- /* Identify sampler uniforms and asign sampler units to them. */
+ /* Identify sampler uniforms and assign sampler units to them. */
GLint type;
glGetActiveUniformsiv(program, 1, &uniform_index, GL_UNIFORM_TYPE, &type);
@@ -106,7 +106,7 @@ static inline int image_binding(int32_t program,
int32_t uniform_location,
int *image_len)
{
- /* Identify image uniforms and asign image units to them. */
+ /* Identify image uniforms and assign image units to them. */
GLint type;
glGetActiveUniformsiv(program, 1, &uniform_index, GL_UNIFORM_TYPE, &type);
@@ -133,7 +133,7 @@ static inline int image_binding(int32_t program,
GLShaderInterface::GLShaderInterface(GLuint program)
{
- /* Necessary to make glUniform works. */
+ /* Necessary to make #glUniform works. */
glUseProgram(program);
GLint max_attr_name_len = 0, attr_len = 0;
diff --git a/source/blender/gpu/opengl/gl_state.hh b/source/blender/gpu/opengl/gl_state.hh
index 643e46acc2d..651c3c22afa 100644
--- a/source/blender/gpu/opengl/gl_state.hh
+++ b/source/blender/gpu/opengl/gl_state.hh
@@ -42,7 +42,7 @@ class GLTexture;
*/
class GLStateManager : public StateManager {
public:
- /** Anothter reference to the active framebuffer. */
+ /** Another reference to the active frame-buffer. */
GLFrameBuffer *active_fb = nullptr;
private:
diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc
index 2e8d9dd6e1c..51cfcd20a6c 100644
--- a/source/blender/gpu/opengl/gl_texture.cc
+++ b/source/blender/gpu/opengl/gl_texture.cc
@@ -32,7 +32,7 @@
#include "gl_backend.hh"
#include "gl_debug.hh"
#include "gl_state.hh"
-#include "gpu_vertex_buffer_private.hh" /* TODO shoud be gl_vertex_buffer.hh */
+#include "gpu_vertex_buffer_private.hh" /* TODO should be `gl_vertex_buffer.hh` */
#include "gl_texture.hh"
@@ -297,15 +297,15 @@ void GLTexture::update_sub(
void GLTexture::generate_mipmap()
{
this->ensure_mipmaps(9999);
- /* Some drivers have bugs when using glGenerateMipmap with depth textures (see T56789).
+ /* Some drivers have bugs when using #glGenerateMipmap with depth textures (see T56789).
* In this case we just create a complete texture with mipmaps manually without
* down-sampling. You must initialize the texture levels using other methods like
- * GPU_framebuffer_recursive_downsample(). */
+ * #GPU_framebuffer_recursive_downsample(). */
if (format_flag_ & GPU_FORMAT_DEPTH) {
return;
}
- /* Downsample from mip 0 using implementation. */
+ /* Down-sample from mip 0 using implementation. */
if (GLContext::direct_state_access_support) {
glGenerateTextureMipmap(tex_id_);
}
diff --git a/source/blender/gpu/opengl/gl_texture.hh b/source/blender/gpu/opengl/gl_texture.hh
index e686a7defca..9da27056269 100644
--- a/source/blender/gpu/opengl/gl_texture.hh
+++ b/source/blender/gpu/opengl/gl_texture.hh
@@ -1,4 +1,3 @@
-
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -20,13 +19,6 @@
/** \file
* \ingroup gpu
- *
- * GPU Framebuffer
- * - this is a wrapper for an OpenGL framebuffer object (FBO). in practice
- * multiple FBO's may be created.
- * - actual FBO creation & config is deferred until GPU_framebuffer_bind or
- * GPU_framebuffer_check_valid to allow creation & config while another
- * opengl context is bound (since FBOs are not shared between ogl contexts).
*/
#pragma once
@@ -166,6 +158,8 @@ inline GLenum to_gl_internal_format(eGPUTextureFormat format)
case GPU_R16:
return GL_R16;
/* Special formats texture & renderbuffer */
+ case GPU_RGB10_A2:
+ return GL_RGB10_A2;
case GPU_R11F_G11F_B10F:
return GL_R11F_G11F_B10F;
case GPU_DEPTH32F_STENCIL8:
@@ -282,12 +276,14 @@ inline GLenum to_gl(eGPUDataFormat format)
return GL_FLOAT;
case GPU_DATA_INT:
return GL_INT;
- case GPU_DATA_UNSIGNED_INT:
+ case GPU_DATA_UINT:
return GL_UNSIGNED_INT;
- case GPU_DATA_UNSIGNED_BYTE:
+ case GPU_DATA_UBYTE:
return GL_UNSIGNED_BYTE;
- case GPU_DATA_UNSIGNED_INT_24_8:
+ case GPU_DATA_UINT_24_8:
return GL_UNSIGNED_INT_24_8;
+ case GPU_DATA_2_10_10_10_REV:
+ return GL_UNSIGNED_INT_2_10_10_10_REV;
case GPU_DATA_10_11_11_REV:
return GL_UNSIGNED_INT_10F_11F_11F_REV;
default:
@@ -341,6 +337,7 @@ inline GLenum to_gl_data_format(eGPUTextureFormat format)
case GPU_RGBA16:
case GPU_RGBA16F:
case GPU_RGBA32F:
+ case GPU_RGB10_A2:
return GL_RGBA;
case GPU_DEPTH24_STENCIL8:
case GPU_DEPTH32F_STENCIL8:
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
index fb512a1f00e..81e0965fad3 100644
--- a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
@@ -57,7 +57,7 @@ in float dummy;
vec2 do_widget(void)
{
- /* Offset to avoid loosing pixels (mimics conservative rasterization). */
+ /* Offset to avoid losing pixels (mimics conservative rasterization). */
const vec2 ofs = vec2(0.5, -0.5);
lineWidth = abs(rect.x - recti.x);
vec2 emboss_ofs = vec2(0.0, -lineWidth);
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl
index eea8d19efce..0231aeca04b 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl
@@ -1,13 +1,24 @@
#ifndef VOLUMETRICS
-void node_ambient_occlusion(
- vec4 color, float distance, vec3 normal, out vec4 result_color, out float result_ao)
+void node_ambient_occlusion(vec4 color,
+ float dist,
+ vec3 normal,
+ const float inverted,
+ out vec4 result_color,
+ out float result_ao)
{
vec3 bent_normal;
vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy);
- result_ao = occlusion_compute(normalize(normal), viewPosition, 1.0, rand, bent_normal);
+ OcclusionData data = occlusion_search(viewPosition, maxzBuffer, dist, inverted, 8.0);
+
+ vec3 V = cameraVec(worldPosition);
+ vec3 N = normalize(normal);
+ vec3 Ng = safe_normalize(cross(dFdx(worldPosition), dFdy(worldPosition)));
+
+ vec3 unused;
+ occlusion_eval(data, V, N, Ng, inverted, result_ao, unused);
result_color = result_ao * color;
}
#else
/* Stub ambient occlusion because it is not compatible with volumetrics. */
-# define node_ambient_occlusion(a, b, c, d, e) (e = CLOSURE_DEFAULT)
+# define node_ambient_occlusion(a, b, c, d, e, f) (e = vec4(0); f = 0.0)
#endif
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl
index d7b6143d2a1..01a16e194ca 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl
@@ -1,12 +1,27 @@
#ifndef VOLUMETRICS
+
+CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_diffuse, Diffuse)
+
void node_bsdf_diffuse(vec4 color, float roughness, vec3 N, out Closure result)
{
- N = normalize(N);
+ CLOSURE_VARS_DECLARE_1(Diffuse);
+
+ in_Diffuse_0.N = N; /* Normalized during eval. */
+ in_Diffuse_0.albedo = color.rgb;
+
+ CLOSURE_EVAL_FUNCTION_1(node_bsdf_diffuse, Diffuse);
+
result = CLOSURE_DEFAULT;
- eevee_closure_diffuse(N, color.rgb, 1.0, true, result.radiance);
- result.radiance = render_pass_diffuse_mask(color.rgb, result.radiance * color.rgb);
- closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result);
+
+ out_Diffuse_0.radiance = render_pass_diffuse_mask(vec3(1.0), out_Diffuse_0.radiance);
+ out_Diffuse_0.radiance *= color.rgb;
+
+ result.radiance = out_Diffuse_0.radiance;
+
+ /* TODO(fclem) Try to not use this. */
+ closure_load_ssr_data(vec3(0.0), 0.0, in_Diffuse_0.N, -1.0, result);
}
+
#else
/* Stub diffuse because it is not compatible with volumetrics. */
# define node_bsdf_diffuse(a, b, c, d) (d = CLOSURE_DEFAULT)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl
index 443bab7529b..d5623c890e4 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl
@@ -1,4 +1,7 @@
#ifndef VOLUMETRICS
+
+CLOSURE_EVAL_FUNCTION_DECLARE_3(node_eevee_specular, Diffuse, Glossy, Glossy)
+
void node_eevee_specular(vec4 diffuse,
vec4 specular,
float roughness,
@@ -12,34 +15,65 @@ void node_eevee_specular(vec4 diffuse,
float ssr_id,
out Closure result)
{
- normal = normalize(normal);
-
- vec3 out_diff, out_spec, ssr_spec;
- eevee_closure_default_clearcoat(normal,
- diffuse.rgb,
- specular.rgb,
- vec3(1.0),
- int(ssr_id),
- roughness,
- clearcoat_normal,
- clearcoat * 0.25,
- clearcoat_roughness,
- occlusion,
- true,
- out_diff,
- out_spec,
- ssr_spec);
-
- float alpha = 1.0 - transp;
+ CLOSURE_VARS_DECLARE_3(Diffuse, Glossy, Glossy);
+
+ in_common.occlusion = occlusion;
+
+ in_Diffuse_0.N = normal; /* Normalized during eval. */
+ in_Diffuse_0.albedo = diffuse.rgb;
+
+ in_Glossy_1.N = normal; /* Normalized during eval. */
+ in_Glossy_1.roughness = roughness;
+
+ in_Glossy_2.N = clearcoat_normal; /* Normalized during eval. */
+ in_Glossy_2.roughness = clearcoat_roughness;
+
+ CLOSURE_EVAL_FUNCTION_3(node_eevee_specular, Diffuse, Glossy, Glossy);
+
result = CLOSURE_DEFAULT;
- result.radiance = render_pass_diffuse_mask(diffuse.rgb, out_diff * diffuse.rgb);
- result.radiance += render_pass_glossy_mask(vec3(1.0), out_spec);
- result.radiance += render_pass_emission_mask(emissive.rgb);
- result.radiance *= alpha;
- result.transmittance = vec3(transp);
- closure_load_ssr_data(ssr_spec * alpha, roughness, normal, viewCameraVec, int(ssr_id), result);
+ vec3 V = cameraVec(worldPosition);
+
+ {
+ /* Diffuse. */
+ out_Diffuse_0.radiance = render_pass_diffuse_mask(vec3(1), out_Diffuse_0.radiance);
+ out_Diffuse_0.radiance *= in_Diffuse_0.albedo;
+ result += out_Diffuse_0.radiance;
+ }
+ {
+ /* Glossy. */
+ float NV = dot(in_Glossy_1.N, V);
+ vec2 split_sum = brdf_lut(NV, in_Glossy_1.roughness);
+ vec3 brdf = F_brdf_single_scatter(specular.rgb, vec3(1.0), split_sum);
+
+ out_Glossy_1.radiance = closure_mask_ssr_radiance(out_Glossy_1.radiance, ssr_id);
+ out_Glossy_1.radiance *= brdf;
+ out_Glossy_1.radiance = render_pass_glossy_mask(spec_color, out_Glossy_1.radiance);
+ closure_load_ssr_data(
+ out_Glossy_1.radiance, in_Glossy_1.roughness, in_Glossy_1.N, ssr_id, result);
+ }
+ {
+ /* Clearcoat. */
+ float NV = dot(in_Glossy_2.N, V);
+ vec2 split_sum = brdf_lut(NV, in_Glossy_2.roughness);
+ vec3 brdf = F_brdf_single_scatter(vec3(0.04), vec3(1.0), split_sum);
+
+ out_Glossy_2.radiance *= brdf * clearcoat * 0.25;
+ out_Glossy_2.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_2.radiance);
+ result.radiance += out_Glossy_2.radiance;
+ }
+ {
+ /* Emission. */
+ vec3 out_emission_radiance = render_pass_emission_mask(emission.rgb);
+ result.radiance += out_emission_radiance;
+ }
+
+ float trans = 1.0 - trans;
+ result.transmittance = vec3(trans);
+ result.radiance *= alpha;
+ result.ssr_data.rgb *= alpha;
}
+
#else
/* Stub specular because it is not compatible with volumetrics. */
# define node_eevee_specular(a, b, c, d, e, f, g, h, i, j, k, result) (result = CLOSURE_DEFAULT)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl
index 502bc7f92d6..f2de7c2da39 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl
@@ -3,7 +3,7 @@ void node_emission(vec4 color, float strength, vec3 vN, out Closure result)
result = CLOSURE_DEFAULT;
#ifndef VOLUMETRICS
result.radiance = render_pass_emission_mask(color.rgb) * strength;
- result.ssr_normal = normal_encode(vN, viewCameraVec);
+ result.ssr_normal = normal_encode(vN, viewCameraVec(viewPosition));
#else
result.emission = color.rgb * strength;
#endif
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl
index c328b4800bc..aa0a8873596 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl
@@ -1,38 +1,56 @@
#ifndef VOLUMETRICS
+
+CLOSURE_EVAL_FUNCTION_DECLARE_2(node_bsdf_glass, Glossy, Refraction)
+
void node_bsdf_glass(vec4 color,
float roughness,
float ior,
vec3 N,
- float use_multiscatter,
- float ssr_id,
+ const float do_multiscatter,
+ const float ssr_id,
out Closure result)
{
- N = normalize(N);
- vec3 out_spec, out_refr, ssr_spec;
- vec3 refr_color = (refractionDepth > 0.0) ? color.rgb * color.rgb :
- color.rgb; /* Simulate 2 transmission event */
- eevee_closure_glass(N,
- vec3(1.0),
- /* HACK: Pass the multiscatter flag as the sign to not add closure
- * variations or increase register usage. */
- (use_multiscatter != 0.0) ? vec3(1.0) : -vec3(1.0),
- int(ssr_id),
- roughness,
- 1.0,
- ior,
- true,
- out_spec,
- out_refr,
- ssr_spec);
- float fresnel = F_eta(ior, dot(N, cameraVec));
- vec3 vN = mat3(ViewMatrix) * N;
+ CLOSURE_VARS_DECLARE_2(Glossy, Refraction);
+
+ in_Glossy_0.N = N; /* Normalized during eval. */
+ in_Glossy_0.roughness = roughness;
+
+ in_Refraction_1.N = N; /* Normalized during eval. */
+ in_Refraction_1.roughness = roughness;
+ in_Refraction_1.ior = ior;
+
+ CLOSURE_EVAL_FUNCTION_2(node_bsdf_glass, Glossy, Refraction);
+
result = CLOSURE_DEFAULT;
- result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color) * (1.0 - fresnel);
- result.radiance += render_pass_glossy_mask(color.rgb, out_spec * color.rgb) * fresnel;
+ float NV = dot(in_Refraction_1.N, cameraVec(worldPosition));
+
+ float fresnel = (do_multiscatter != 0.0) ?
+ btdf_lut(NV, in_Refraction_1.roughness, in_Refraction_1.ior).y :
+ F_eta(in_Refraction_1.ior, NV);
+
+ vec2 split_sum = brdf_lut(NV, in_Glossy_0.roughness);
+ vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) :
+ F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum);
+
+ out_Glossy_0.radiance = closure_mask_ssr_radiance(out_Glossy_0.radiance, ssr_id);
+ out_Glossy_0.radiance *= brdf;
+ out_Glossy_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Glossy_0.radiance);
+ out_Glossy_0.radiance *= color.rgb * fresnel;
closure_load_ssr_data(
- ssr_spec * color.rgb * fresnel, roughness, N, viewCameraVec, int(ssr_id), result);
+ out_Glossy_0.radiance, in_Glossy_0.roughness, in_Glossy_0.N, ssr_id, result);
+
+ float btdf = (do_multiscatter != 0.0) ?
+ 1.0 :
+ btdf_lut(NV, in_Refraction_1.roughness, in_Refraction_1.ior).x;
+ out_Refraction_1.radiance *= btdf;
+ out_Refraction_1.radiance = render_pass_glossy_mask(vec3(1.0), out_Refraction_1.radiance);
+ out_Refraction_1.radiance *= color.rgb * (1.0 - fresnel);
+ /* Simulate 2nd absorption event. */
+ out_Refraction_1.radiance *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0);
+ result.radiance += out_Refraction_1.radiance;
}
+
#else
/* Stub glass because it is not compatible with volumetrics. */
# define node_bsdf_glass(a, b, c, d, e, f, result) (result = CLOSURE_DEFAULT)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl
index 36675cf720d..fa83bfb6c7a 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl
@@ -1,23 +1,32 @@
#ifndef VOLUMETRICS
+
+CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_glossy, Glossy)
+
void node_bsdf_glossy(
vec4 color, float roughness, vec3 N, float use_multiscatter, float ssr_id, out Closure result)
{
- N = normalize(N);
- vec3 out_spec, ssr_spec;
- eevee_closure_glossy(N,
- vec3(1.0),
- use_multiscatter != 0.0 ? vec3(1.0) : vec3(-1.0), /* HACK */
- int(ssr_id),
- roughness,
- 1.0,
- true,
- out_spec,
- ssr_spec);
- vec3 vN = mat3(ViewMatrix) * N;
+ bool do_ssr = (ssrToggle && int(ssr_id) == outputSsrId);
+
+ CLOSURE_VARS_DECLARE_1(Glossy);
+
+ in_Glossy_0.N = N; /* Normalized during eval. */
+ in_Glossy_0.roughness = roughness;
+
+ CLOSURE_EVAL_FUNCTION_1(node_bsdf_glossy, Glossy);
+
result = CLOSURE_DEFAULT;
- result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec) * color.rgb;
- closure_load_ssr_data(ssr_spec * color.rgb, roughness, N, viewCameraVec, int(ssr_id), result);
+
+ vec2 split_sum = brdf_lut(dot(in_Glossy_0.N, cameraVec(worldPosition)), in_Glossy_0.roughness);
+ vec3 brdf = (use_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) :
+ F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum);
+ out_Glossy_0.radiance = closure_mask_ssr_radiance(out_Glossy_0.radiance, ssr_id);
+ out_Glossy_0.radiance *= brdf;
+ out_Glossy_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Glossy_0.radiance);
+ out_Glossy_0.radiance *= color.rgb;
+ closure_load_ssr_data(
+ out_Glossy_0.radiance, in_Glossy_0.roughness, in_Glossy_0.N, ssr_id, result);
}
+
#else
/* Stub glossy because it is not compatible with volumetrics. */
# define node_bsdf_glossy(a, b, c, d, e, result) (result = CLOSURE_DEFAULT)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl
index 3bd578e1ffc..49c8973a8ce 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl
@@ -1,41 +1,20 @@
#ifndef VOLUMETRICS
vec3 tint_from_color(vec3 color)
{
- float lum = dot(color, vec3(0.3, 0.6, 0.1)); /* luminance approx. */
- return (lum > 0) ? color / lum : vec3(1.0); /* normalize lum. to isolate hue+sat */
+ float lum = dot(color, vec3(0.3, 0.6, 0.1)); /* luminance approx. */
+ return (lum > 0.0) ? color / lum : vec3(1.0); /* normalize lum. to isolate hue+sat */
}
-void convert_metallic_to_specular_tinted(vec3 basecol,
- vec3 basecol_tint,
- float metallic,
- float specular_fac,
- float specular_tint,
- out vec3 diffuse,
- out vec3 f0)
-{
- vec3 tmp_col = mix(vec3(1.0), basecol_tint, specular_tint);
- f0 = mix((0.08 * specular_fac) * tmp_col, basecol, metallic);
- diffuse = basecol * (1.0 - metallic);
-}
-
-/* Output sheen is to be multiplied by sheen_color. */
-void principled_sheen(float NV,
- vec3 basecol_tint,
- float sheen,
- float sheen_tint,
- out float out_sheen,
- out vec3 sheen_color)
+float principled_sheen(float NV)
{
float f = 1.0 - NV;
- /* Temporary fix for T59784. Normal map seems to contain NaNs for tangent space normal maps,
- * therefore we need to clamp value. */
- f = clamp(f, 0.0, 1.0);
/* Empirical approximation (manual curve fitting). Can be refined. */
- out_sheen = f * f * f * 0.077 + f * 0.01 + 0.00026;
-
- sheen_color = sheen * mix(vec3(1.0), basecol_tint, sheen_tint);
+ float sheen = f * f * f * 0.077 + f * 0.01 + 0.00026;
+ return sheen;
}
+CLOSURE_EVAL_FUNCTION_DECLARE_4(node_bsdf_principled, Diffuse, Glossy, Glossy, Refraction)
+
void node_bsdf_principled(vec4 base_color,
float subsurface,
vec3 subsurface_radius,
@@ -59,434 +38,168 @@ void node_bsdf_principled(vec4 base_color,
vec3 N,
vec3 CN,
vec3 T,
- vec3 I,
- float use_multiscatter,
+ const float do_diffuse,
+ const float do_clearcoat,
+ const float do_refraction,
+ const float do_multiscatter,
float ssr_id,
float sss_id,
vec3 sss_scale,
out Closure result)
{
- N = normalize(N);
- ior = max(ior, 1e-5);
- metallic = saturate(metallic);
- transmission = saturate(transmission);
- float m_transmission = 1.0 - transmission;
-
- float dielectric = 1.0 - metallic;
- transmission *= dielectric;
- sheen *= dielectric;
- subsurface_color *= dielectric;
-
- vec3 diffuse, f0, out_diff, out_spec, out_refr, ssr_spec, sheen_color;
- float out_sheen;
- vec3 ctint = tint_from_color(base_color.rgb);
- convert_metallic_to_specular_tinted(
- base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0);
-
- float NV = dot(N, cameraVec);
- principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color);
-
- vec3 f90 = mix(vec3(1.0), f0, (1.0 - specular) * metallic);
-
- /* Far from being accurate, but 2 glossy evaluation is too expensive.
- * Most noticeable difference is at grazing angles since the bsdf lut
- * f0 color interpolation is done on top of this interpolation. */
- vec3 f0_glass = mix(vec3(1.0), base_color.rgb, specular_tint);
- float fresnel = F_eta(ior, NV);
- vec3 spec_col = F_color_blend(ior, fresnel, f0_glass) * fresnel;
- f0 = mix(f0, spec_col, transmission);
- f90 = mix(f90, spec_col, transmission);
-
- /* Really poor approximation but needed to workaround issues with renderpasses. */
- spec_col = mix(vec3(1.0), spec_col, transmission);
/* Match cycles. */
- spec_col += float(clearcoat > 1e-5);
-
- vec3 mixed_ss_base_color = mix(diffuse, subsurface_color.rgb, subsurface);
-
- float sss_scalef = avg(sss_scale) * subsurface;
- eevee_closure_principled(N,
- mixed_ss_base_color,
- f0,
- /* HACK: Pass the multiscatter flag as the sign to not add closure
- * variations or increase register usage. */
- (use_multiscatter != 0.0) ? f90 : -f90,
- int(ssr_id),
- roughness,
- CN,
- clearcoat * 0.25,
- clearcoat_roughness,
- 1.0,
- sss_scalef,
- ior,
- true,
- out_diff,
- out_spec,
- out_refr,
- ssr_spec);
-
- vec3 refr_color = base_color.rgb;
- refr_color *= (refractionDepth > 0.0) ? refr_color :
- vec3(1.0); /* Simulate 2 transmission event */
- refr_color *= saturate(1.0 - fresnel) * transmission;
-
- sheen_color *= m_transmission;
- mixed_ss_base_color *= m_transmission;
-
- result = CLOSURE_DEFAULT;
- result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color);
- result.radiance += render_pass_glossy_mask(spec_col, out_spec);
- /* Coarse approx. */
- result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color);
- result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
- result.radiance *= alpha;
- closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
-
- mixed_ss_base_color *= alpha;
- closure_load_sss_data(sss_scalef, out_diff, mixed_ss_base_color, int(sss_id), result);
- result.transmittance = vec3(1.0 - alpha);
-}
-
-void node_bsdf_principled_dielectric(vec4 base_color,
- float subsurface,
- vec3 subsurface_radius,
- vec4 subsurface_color,
- float metallic,
- float specular,
- float specular_tint,
- float roughness,
- float anisotropic,
- float anisotropic_rotation,
- float sheen,
- float sheen_tint,
- float clearcoat,
- float clearcoat_roughness,
- float ior,
- float transmission,
- float transmission_roughness,
- vec4 emission,
- float emission_strength,
- float alpha,
- vec3 N,
- vec3 CN,
- vec3 T,
- vec3 I,
- float use_multiscatter,
- float ssr_id,
- float sss_id,
- vec3 sss_scale,
- out Closure result)
-{
- N = normalize(N);
metallic = saturate(metallic);
- float dielectric = 1.0 - metallic;
-
- vec3 diffuse, f0, out_diff, out_spec, ssr_spec, sheen_color;
- float out_sheen;
- vec3 ctint = tint_from_color(base_color.rgb);
- convert_metallic_to_specular_tinted(
- base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0);
-
- vec3 f90 = mix(vec3(1.0), f0, (1.0 - specular) * metallic);
-
- float NV = dot(N, cameraVec);
- principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color);
-
- eevee_closure_default(N,
- diffuse,
- f0,
- /* HACK: Pass the multiscatter flag as the sign to not add closure
- * variations or increase register usage. */
- (use_multiscatter != 0.0) ? f90 : -f90,
- int(ssr_id),
- roughness,
- 1.0,
- true,
- out_diff,
- out_spec,
- ssr_spec);
+ transmission = saturate(transmission);
+ float diffuse_weight = (1.0 - transmission) * (1.0 - metallic);
+ transmission *= (1.0 - metallic);
+ float specular_weight = (1.0 - transmission);
+ clearcoat = max(clearcoat, 0.0);
+ transmission_roughness = 1.0 - (1.0 - roughness) * (1.0 - transmission_roughness);
- result = CLOSURE_DEFAULT;
- result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec);
- result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color);
- result.radiance += render_pass_diffuse_mask(diffuse, out_diff * diffuse);
- result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
- result.radiance *= alpha;
- closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
+ CLOSURE_VARS_DECLARE_4(Diffuse, Glossy, Glossy, Refraction);
- result.transmittance = vec3(1.0 - alpha);
-}
+ in_Diffuse_0.N = N; /* Normalized during eval. */
+ in_Diffuse_0.albedo = mix(base_color.rgb, subsurface_color.rgb, subsurface);
-void node_bsdf_principled_metallic(vec4 base_color,
- float subsurface,
- vec3 subsurface_radius,
- vec4 subsurface_color,
- float metallic,
- float specular,
- float specular_tint,
- float roughness,
- float anisotropic,
- float anisotropic_rotation,
- float sheen,
- float sheen_tint,
- float clearcoat,
- float clearcoat_roughness,
- float ior,
- float transmission,
- float transmission_roughness,
- vec4 emission,
- float emission_strength,
- float alpha,
- vec3 N,
- vec3 CN,
- vec3 T,
- vec3 I,
- float use_multiscatter,
- float ssr_id,
- float sss_id,
- vec3 sss_scale,
- out Closure result)
-{
- N = normalize(N);
- vec3 out_spec, ssr_spec;
-
- vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic);
-
- eevee_closure_glossy(N,
- base_color.rgb,
- /* HACK: Pass the multiscatter flag as the sign to not add closure
- * variations or increase register usage. */
- (use_multiscatter != 0.0) ? f90 : -f90,
- int(ssr_id),
- roughness,
- 1.0,
- true,
- out_spec,
- ssr_spec);
+ in_Glossy_1.N = N; /* Normalized during eval. */
+ in_Glossy_1.roughness = roughness;
- result = CLOSURE_DEFAULT;
- result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec);
- result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
- result.radiance *= alpha;
- closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
+ in_Glossy_2.N = CN; /* Normalized during eval. */
+ in_Glossy_2.roughness = clearcoat_roughness;
- result.transmittance = vec3(1.0 - alpha);
-}
+ in_Refraction_3.N = N; /* Normalized during eval. */
+ in_Refraction_3.roughness = do_multiscatter != 0.0 ? roughness : transmission_roughness;
+ in_Refraction_3.ior = ior;
-void node_bsdf_principled_clearcoat(vec4 base_color,
- float subsurface,
- vec3 subsurface_radius,
- vec4 subsurface_color,
- float metallic,
- float specular,
- float specular_tint,
- float roughness,
- float anisotropic,
- float anisotropic_rotation,
- float sheen,
- float sheen_tint,
- float clearcoat,
- float clearcoat_roughness,
- float ior,
- float transmission,
- float transmission_roughness,
- vec4 emission,
- float emission_strength,
- float alpha,
- vec3 N,
- vec3 CN,
- vec3 T,
- vec3 I,
- float use_multiscatter,
- float ssr_id,
- float sss_id,
- vec3 sss_scale,
- out Closure result)
-{
- vec3 out_spec, ssr_spec;
- N = normalize(N);
-
- vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic);
-
- eevee_closure_clearcoat(N,
- base_color.rgb,
- /* HACK: Pass the multiscatter flag as the sign to not add closure
- * variations or increase register usage. */
- (use_multiscatter != 0.0) ? f90 : -f90,
- int(ssr_id),
- roughness,
- CN,
- clearcoat * 0.25,
- clearcoat_roughness,
- 1.0,
- true,
- out_spec,
- ssr_spec);
- /* Match cycles. */
- float spec_col = 1.0 + float(clearcoat > 1e-5);
+ CLOSURE_EVAL_FUNCTION_4(node_bsdf_principled, Diffuse, Glossy, Glossy, Refraction);
result = CLOSURE_DEFAULT;
- result.radiance = render_pass_glossy_mask(vec3(spec_col), out_spec);
- result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
- result.radiance *= alpha;
- closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
+ /* This will tag the whole eval for optimisation. */
+ if (do_diffuse == 0.0) {
+ out_Diffuse_0.radiance = vec3(0);
+ }
+ if (do_clearcoat == 0.0) {
+ out_Glossy_2.radiance = vec3(0);
+ }
+ if (do_refraction == 0.0) {
+ out_Refraction_3.radiance = vec3(0);
+ }
+
+ vec3 V = cameraVec(worldPosition);
+
+ /* Glossy_1 will always be evaluated. */
+ float NV = dot(in_Glossy_1.N, V);
+
+ vec3 base_color_tint = tint_from_color(base_color.rgb);
+
+ float fresnel = (do_multiscatter != 0.0) ?
+ btdf_lut(NV, in_Glossy_1.roughness, in_Refraction_3.ior).y :
+ F_eta(in_Refraction_3.ior, NV);
+
+ {
+ /* Glossy reflections.
+ * Separate Glass reflections and main specular reflections to match Cycles renderpasses. */
+ out_Glossy_1.radiance = closure_mask_ssr_radiance(out_Glossy_1.radiance, ssr_id);
+
+ vec2 split_sum = brdf_lut(NV, roughness);
+
+ vec3 glossy_radiance_final = vec3(0.0);
+ if (transmission > 1e-5) {
+ /* Glass Reflection: Reuse radiance from Glossy1. */
+ vec3 out_glass_refl_radiance = out_Glossy_1.radiance;
+
+ /* Poor approximation since we baked the LUT using a fixed IOR. */
+ vec3 f0 = mix(vec3(1.0), base_color.rgb, specular_tint);
+ vec3 f90 = vec3(1);
+
+ vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(f0, f90, split_sum) :
+ F_brdf_single_scatter(f0, f90, split_sum);
+
+ out_glass_refl_radiance *= brdf;
+ out_glass_refl_radiance = render_pass_glossy_mask(vec3(1), out_glass_refl_radiance);
+ out_glass_refl_radiance *= fresnel * transmission;
+ glossy_radiance_final += out_glass_refl_radiance;
+ }
+ if (specular_weight > 1e-5) {
+ vec3 dielectric_f0_color = mix(vec3(1.0), base_color_tint, specular_tint);
+ vec3 metallic_f0_color = base_color.rgb;
+ vec3 f0 = mix((0.08 * specular) * dielectric_f0_color, metallic_f0_color, metallic);
+ /* Cycles does this blending using the microfacet fresnel factor. However, our fresnel
+ * is already baked inside the split sum LUT. We approximate using by modifying the
+ * changing the f90 color directly in a non linear fashion. */
+ vec3 f90 = mix(f0, vec3(1), fast_sqrt(specular));
+
+ vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(f0, f90, split_sum) :
+ F_brdf_single_scatter(f0, f90, split_sum);
+
+ out_Glossy_1.radiance *= brdf;
+ out_Glossy_1.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_1.radiance);
+ out_Glossy_1.radiance *= specular_weight;
+ glossy_radiance_final += out_Glossy_1.radiance;
+ }
+
+ closure_load_ssr_data(
+ glossy_radiance_final, in_Glossy_1.roughness, in_Glossy_1.N, ssr_id, result);
+ }
+
+ if (diffuse_weight > 1e-5) {
+ /* Mask over all diffuse radiance. */
+ out_Diffuse_0.radiance *= diffuse_weight;
+
+ /* Sheen Coarse approximation: We reuse the diffuse radiance and just scale it. */
+ vec3 sheen_color = mix(vec3(1), base_color_tint, sheen_tint);
+ vec3 out_sheen_radiance = out_Diffuse_0.radiance * principled_sheen(NV);
+ out_sheen_radiance = render_pass_diffuse_mask(vec3(1), out_sheen_radiance);
+ out_sheen_radiance *= sheen * sheen_color;
+ result.radiance += out_sheen_radiance;
+
+ /* Diffuse / Subsurface. */
+ float scale = avg(sss_scale) * subsurface;
+ closure_load_sss_data(scale, out_Diffuse_0.radiance, in_Diffuse_0.albedo, int(sss_id), result);
+ }
+
+ if (transmission > 1e-5) {
+ float btdf = (do_multiscatter != 0.0) ?
+ 1.0 :
+ btdf_lut(NV, in_Refraction_3.roughness, in_Refraction_3.ior).x;
+ /* TODO(fclem) This could be going to a transmission render pass instead. */
+ out_Refraction_3.radiance *= btdf;
+ out_Refraction_3.radiance = render_pass_glossy_mask(vec3(1), out_Refraction_3.radiance);
+ out_Refraction_3.radiance *= base_color.rgb;
+ /* Simulate 2nd transmission event. */
+ out_Refraction_3.radiance *= (refractionDepth > 0.0) ? base_color.rgb : vec3(1);
+ out_Refraction_3.radiance *= (1.0 - fresnel) * transmission;
+ result.radiance += out_Refraction_3.radiance;
+ }
+
+ if (clearcoat > 1e-5) {
+ float NV = dot(in_Glossy_2.N, V);
+ vec2 split_sum = brdf_lut(NV, in_Glossy_2.roughness);
+ vec3 brdf = F_brdf_single_scatter(vec3(0.04), vec3(1.0), split_sum);
+
+ out_Glossy_2.radiance *= brdf * clearcoat * 0.25;
+ out_Glossy_2.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_2.radiance);
+ result.radiance += out_Glossy_2.radiance;
+ }
+
+ {
+ vec3 out_emission_radiance = render_pass_emission_mask(emission.rgb);
+ out_emission_radiance *= emission_strength;
+ result.radiance += out_emission_radiance;
+ }
result.transmittance = vec3(1.0 - alpha);
-}
-
-void node_bsdf_principled_subsurface(vec4 base_color,
- float subsurface,
- vec3 subsurface_radius,
- vec4 subsurface_color,
- float metallic,
- float specular,
- float specular_tint,
- float roughness,
- float anisotropic,
- float anisotropic_rotation,
- float sheen,
- float sheen_tint,
- float clearcoat,
- float clearcoat_roughness,
- float ior,
- float transmission,
- float transmission_roughness,
- vec4 emission,
- float emission_strength,
- float alpha,
- vec3 N,
- vec3 CN,
- vec3 T,
- vec3 I,
- float use_multiscatter,
- float ssr_id,
- float sss_id,
- vec3 sss_scale,
- out Closure result)
-{
- metallic = saturate(metallic);
- N = normalize(N);
-
- vec3 diffuse, f0, out_diff, out_spec, ssr_spec, sheen_color;
- float out_sheen;
- vec3 ctint = tint_from_color(base_color.rgb);
- convert_metallic_to_specular_tinted(
- base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0);
-
- subsurface_color = subsurface_color * (1.0 - metallic);
- vec3 mixed_ss_base_color = mix(diffuse, subsurface_color.rgb, subsurface);
- float sss_scalef = avg(sss_scale) * subsurface;
-
- float NV = dot(N, cameraVec);
- principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color);
-
- vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic);
-
- eevee_closure_skin(N,
- mixed_ss_base_color,
- f0,
- /* HACK: Pass the multiscatter flag as the sign to not add closure variations
- * or increase register usage. */
- (use_multiscatter != 0.0) ? f90 : -f90,
- int(ssr_id),
- roughness,
- 1.0,
- sss_scalef,
- true,
- out_diff,
- out_spec,
- ssr_spec);
-
- result = CLOSURE_DEFAULT;
- result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec);
- result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color);
- result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
result.radiance *= alpha;
-
- closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
-
- mixed_ss_base_color *= alpha;
- closure_load_sss_data(sss_scalef, out_diff, mixed_ss_base_color, int(sss_id), result);
-
- result.transmittance = vec3(1.0 - alpha);
+ result.ssr_data.rgb *= alpha;
+# ifdef USE_SSS
+ result.sss_irradiance *= alpha;
+# endif
}
-void node_bsdf_principled_glass(vec4 base_color,
- float subsurface,
- vec3 subsurface_radius,
- vec4 subsurface_color,
- float metallic,
- float specular,
- float specular_tint,
- float roughness,
- float anisotropic,
- float anisotropic_rotation,
- float sheen,
- float sheen_tint,
- float clearcoat,
- float clearcoat_roughness,
- float ior,
- float transmission,
- float transmission_roughness,
- vec4 emission,
- float emission_strength,
- float alpha,
- vec3 N,
- vec3 CN,
- vec3 T,
- vec3 I,
- float use_multiscatter,
- float ssr_id,
- float sss_id,
- vec3 sss_scale,
- out Closure result)
-{
- ior = max(ior, 1e-5);
- N = normalize(N);
-
- vec3 f0, out_spec, out_refr, ssr_spec;
- f0 = mix(vec3(1.0), base_color.rgb, specular_tint);
-
- eevee_closure_glass(N,
- vec3(1.0),
- vec3((use_multiscatter != 0.0) ? 1.0 : -1.0),
- int(ssr_id),
- roughness,
- 1.0,
- ior,
- true,
- out_spec,
- out_refr,
- ssr_spec);
-
- vec3 refr_color = base_color.rgb;
- refr_color *= (refractionDepth > 0.0) ? refr_color :
- vec3(1.0); /* Simulate 2 transmission events */
-
- float fresnel = F_eta(ior, dot(N, cameraVec));
- vec3 spec_col = F_color_blend(ior, fresnel, f0);
- spec_col *= fresnel;
- refr_color *= (1.0 - fresnel);
-
- ssr_spec *= spec_col;
-
- result = CLOSURE_DEFAULT;
- result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color);
- result.radiance += render_pass_glossy_mask(spec_col, out_spec * spec_col);
- result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
- result.radiance *= alpha;
- closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
- result.transmittance = vec3(1.0 - alpha);
-}
#else
/* clang-format off */
/* Stub principled because it is not compatible with volumetrics. */
-# define node_bsdf_principled(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT)
-# define node_bsdf_principled_dielectric(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT)
-# define node_bsdf_principled_metallic(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT)
-# define node_bsdf_principled_clearcoat(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT)
-# define node_bsdf_principled_subsurface(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT)
-# define node_bsdf_principled_glass(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT)
+# define node_bsdf_principled(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, cc, dd, result) (result = CLOSURE_DEFAULT)
/* clang-format on */
#endif
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl
index cd043020a7f..7cbc7218f5c 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl
@@ -1,15 +1,31 @@
#ifndef VOLUMETRICS
+
+CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_refraction, Refraction)
+
void node_bsdf_refraction(vec4 color, float roughness, float ior, vec3 N, out Closure result)
{
- N = normalize(N);
- vec3 out_refr;
- color.rgb *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); /* Simulate 2 absorption event. */
- eevee_closure_refraction(N, roughness, ior, true, out_refr);
- vec3 vN = mat3(ViewMatrix) * N;
+ CLOSURE_VARS_DECLARE_1(Refraction);
+
+ in_Refraction_0.N = N; /* Normalized during eval. */
+ in_Refraction_0.roughness = roughness;
+ in_Refraction_0.ior = ior;
+
+ CLOSURE_EVAL_FUNCTION_1(node_bsdf_refraction, Refraction);
+
result = CLOSURE_DEFAULT;
- result.ssr_normal = normal_encode(vN, viewCameraVec);
- result.radiance = render_pass_glossy_mask(color.rgb, out_refr * color.rgb);
+
+ out_Refraction_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Refraction_0.radiance);
+ out_Refraction_0.radiance *= color.rgb;
+ /* Simulate 2nd absorption event. */
+ out_Refraction_0.radiance *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0);
+
+ result.radiance = out_Refraction_0.radiance;
+
+ /* TODO(fclem) Try to not use this. */
+ result.ssr_normal = normal_encode(mat3(ViewMatrix) * in_Refraction_0.N,
+ viewCameraVec(viewPosition));
}
+
#else
/* Stub refraction because it is not compatible with volumetrics. */
# define node_bsdf_refraction(a, b, c, d, e) (e = CLOSURE_DEFAULT)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl
index f495157f6e1..a5fdc7a2337 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl
@@ -3,8 +3,8 @@ void node_shader_to_rgba(Closure cl, out vec4 outcol, out float outalpha)
{
vec4 spec_accum = vec4(0.0);
if (ssrToggle && FLAG_TEST(cl.flag, CLOSURE_SSR_FLAG)) {
- vec3 V = cameraVec;
- vec3 vN = normal_decode(cl.ssr_normal, viewCameraVec);
+ vec3 V = cameraVec(worldPosition);
+ vec3 vN = normal_decode(cl.ssr_normal, viewCameraVec(viewPosition));
vec3 N = transform_direction(ViewMatrixInverse, vN);
float roughness = cl.ssr_data.a;
float roughnessSquared = max(1e-3, roughness * roughness);
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl
index c13b55513da..5a68f802659 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl
@@ -1,4 +1,7 @@
#ifndef VOLUMETRICS
+
+CLOSURE_EVAL_FUNCTION_DECLARE_1(node_subsurface_scattering, Diffuse)
+
void node_subsurface_scattering(vec4 color,
float scale,
vec3 radius,
@@ -8,20 +11,29 @@ void node_subsurface_scattering(vec4 color,
float sss_id,
out Closure result)
{
- N = normalize(N);
- vec3 out_diff;
- vec3 vN = mat3(ViewMatrix) * N;
+ CLOSURE_VARS_DECLARE_1(Diffuse);
+
+ in_Diffuse_0.N = N; /* Normalized during eval. */
+ in_Diffuse_0.albedo = color.rgb;
+
+ CLOSURE_EVAL_FUNCTION_1(node_subsurface_scattering, Diffuse);
+
result = CLOSURE_DEFAULT;
- closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result);
- eevee_closure_subsurface(N, color.rgb, 1.0, scale, true, out_diff);
+ /* Not perfect for texture_blur values between 0.0 and 1.0.
+ * Interpolate between separated color and color applied on irradiance. */
+ float one_minus_texture_blur = 1.0 - texture_blur;
+ vec3 sss_albedo = color.rgb * texture_blur + one_minus_texture_blur;
+ vec3 radiance_tint = color.rgb * one_minus_texture_blur + texture_blur;
+ /* Consider output radiance as irradiance. */
+ out_Diffuse_0.radiance *= radiance_tint;
+
+ closure_load_sss_data(scale, out_Diffuse_0.radiance, sss_albedo, int(sss_id), result);
- /* Not perfect for texture_blur not exactly equal to 0.0 or 1.0. */
- vec3 sss_albedo = mix(color.rgb, vec3(1.0), texture_blur);
- out_diff *= mix(vec3(1.0), color.rgb, texture_blur);
- result.radiance = render_pass_sss_mask(sss_albedo);
- closure_load_sss_data(scale, out_diff, sss_albedo, int(sss_id), result);
+ /* TODO(fclem) Try to not use this. */
+ closure_load_ssr_data(vec3(0.0), 0.0, in_Diffuse_0.N, -1.0, result);
}
+
#else
/* Stub subsurface scattering because it is not compatible with volumetrics. */
# define node_subsurface_scattering(a, b, c, d, e, f, g, h) (h = CLOSURE_DEFAULT)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl
index 24276156d55..08d566224bf 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl
@@ -50,7 +50,7 @@ void node_tex_coord(vec3 I,
camera = vec3(I.xy, -I.z);
vec4 projvec = ProjectionMatrix * vec4(I, 1.0);
window = vec3(mtex_2d_mapping(projvec.xyz / projvec.w).xy * camerafac.xy + camerafac.zw, 0.0);
- reflection = -reflect(cameraVec, normalize(wN));
+ reflection = -reflect(cameraVec(worldPosition), normalize(wN));
}
void node_tex_coord_background(vec3 I,
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl
index 79bfd9b24bb..80bd3941b22 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl
@@ -1,12 +1,20 @@
#ifndef VOLUMETRICS
+
+CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_translucent, Translucent)
+
void node_bsdf_translucent(vec4 color, vec3 N, out Closure result)
{
- N = normalize(N);
+ CLOSURE_VARS_DECLARE_1(Translucent);
+
+ in_Translucent_0.N = -N; /* Normalized during eval. */
+
+ CLOSURE_EVAL_FUNCTION_1(node_bsdf_translucent, Translucent);
+
result = CLOSURE_DEFAULT;
- eevee_closure_diffuse(-N, color.rgb, 1.0, false, result.radiance);
- closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result);
- result.radiance = render_pass_diffuse_mask(color.rgb, result.radiance * color.rgb);
+ closure_load_ssr_data(vec3(0.0), 0.0, -in_Translucent_0.N, -1.0, result);
+ result.radiance = render_pass_diffuse_mask(color.rgb, out_Translucent_0.radiance * color.rgb);
}
+
#else
/* Stub translucent because it is not compatible with volumetrics. */
# define node_bsdf_translucent(a, b, c) (c = CLOSURE_DEFAULT)
diff --git a/source/blender/ikplugin/intern/itasc_plugin.cpp b/source/blender/ikplugin/intern/itasc_plugin.cpp
index 3f444172499..eb31b0e9f87 100644
--- a/source/blender/ikplugin/intern/itasc_plugin.cpp
+++ b/source/blender/ikplugin/intern/itasc_plugin.cpp
@@ -1878,7 +1878,7 @@ static void execute_scene(struct Depsgraph *depsgraph,
/*---------------------------------------------------
* plugin interface
- * */
+ */
void itasc_initialize_tree(struct Depsgraph *depsgraph,
struct Scene *scene,
Object *ob,
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 8866a8a8600..d131e4dacdc 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -27,7 +27,7 @@
* This module offers import/export of several graphical file formats.
* \ingroup imbuf
*
- * \page IMB Imbuf module external interface
+ * \page IMB ImBuf module external interface
* \section imb_about About the IMB module
*
* External interface of the IMage Buffer module. This module offers
diff --git a/source/blender/imbuf/IMB_metadata.h b/source/blender/imbuf/IMB_metadata.h
index 501bf9dfba1..652ce913ee5 100644
--- a/source/blender/imbuf/IMB_metadata.h
+++ b/source/blender/imbuf/IMB_metadata.h
@@ -35,7 +35,7 @@ struct anim;
* The metadata is a list of key/value pairs (both char *) that can me
* saved in the header of several image formats.
* Apart from some common keys like
- * 'Software' and 'Description' (png standard) we'll use keys within the
+ * 'Software' and 'Description' (PNG standard) we'll use keys within the
* Blender namespace, so should be called 'Blender::StampInfo' or 'Blender::FrameNum'
* etc...
*
diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h
index a013e7e38dd..9dd0cbe895f 100644
--- a/source/blender/imbuf/IMB_thumbs.h
+++ b/source/blender/imbuf/IMB_thumbs.h
@@ -80,7 +80,6 @@ void IMB_thumb_makedirs(void);
struct ImBuf *IMB_thumb_load_blend(const char *blen_path,
const char *blen_group,
const char *blen_id);
-void IMB_thumb_overlay_blend(unsigned int *thumb, int width, int height, float aspect);
/* special function for previewing fonts */
struct ImBuf *IMB_thumb_load_font(const char *filename, unsigned int x, unsigned int y);
diff --git a/source/blender/imbuf/intern/IMB_allocimbuf.h b/source/blender/imbuf/intern/IMB_allocimbuf.h
index 08aa1936a6f..c92d764a104 100644
--- a/source/blender/imbuf/intern/IMB_allocimbuf.h
+++ b/source/blender/imbuf/intern/IMB_allocimbuf.h
@@ -32,7 +32,7 @@ struct ImBuf;
void imb_refcounter_lock_init(void);
void imb_refcounter_lock_exit(void);
-#ifdef WIN32
+#ifndef WIN32
void imb_mmap_lock_init(void);
void imb_mmap_lock_exit(void);
void imb_mmap_lock(void);
diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.h b/source/blender/imbuf/intern/IMB_colormanagement_intern.h
index 6b505a7171a..31dca888732 100644
--- a/source/blender/imbuf/intern/IMB_colormanagement_intern.h
+++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.h
@@ -31,6 +31,7 @@ extern "C" {
#endif
struct ImBuf;
+struct OCIO_ConstCPUProcessorRcPtr;
struct OCIO_ConstProcessorRcPtr;
extern float imbuf_luma_coefficients[3];
@@ -46,8 +47,8 @@ typedef struct ColorSpace {
char name[MAX_COLORSPACE_NAME];
char description[MAX_COLORSPACE_DESCRIPTION];
- struct OCIO_ConstProcessorRcPtr *to_scene_linear;
- struct OCIO_ConstProcessorRcPtr *from_scene_linear;
+ struct OCIO_ConstCPUProcessorRcPtr *to_scene_linear;
+ struct OCIO_ConstCPUProcessorRcPtr *from_scene_linear;
bool is_invertible;
bool is_data;
@@ -66,8 +67,8 @@ typedef struct ColorManagedDisplay {
char name[MAX_COLORSPACE_NAME];
ListBase views; /* LinkData.data -> ColorManagedView */
- struct OCIO_ConstProcessorRcPtr *to_scene_linear;
- struct OCIO_ConstProcessorRcPtr *from_scene_linear;
+ struct OCIO_ConstCPUProcessorRcPtr *to_scene_linear;
+ struct OCIO_ConstCPUProcessorRcPtr *from_scene_linear;
} ColorManagedDisplay;
typedef struct ColorManagedView {
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 8dfb3ada7d6..90c863878ff 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -53,7 +53,7 @@ void imb_refcounter_lock_exit(void)
BLI_spin_end(&refcounter_spin);
}
-#ifdef WIN32
+#ifndef WIN32
static SpinLock mmap_spin;
void imb_mmap_lock_init(void)
@@ -197,7 +197,7 @@ void IMB_freezbuffloatImBuf(ImBuf *ibuf)
ibuf->mall &= ~IB_zbuffloat;
}
-/** Free all pixel data (assosiated with image size). */
+/** Free all pixel data (associated with image size). */
void imb_freerectImbuf_all(ImBuf *ibuf)
{
imb_freerectImBuf(ibuf);
diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c
index c40e65b1c5c..28bf26aa343 100644
--- a/source/blender/imbuf/intern/anim_movie.c
+++ b/source/blender/imbuf/intern/anim_movie.c
@@ -55,6 +55,7 @@
#include "BLI_path_util.h"
#include "BLI_string.h"
+#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "MEM_guardedalloc.h"
@@ -573,6 +574,9 @@ static int startffmpeg(struct anim *anim)
pCodecCtx->workaround_bugs = 1;
+ pCodecCtx->thread_count = BLI_system_thread_count();
+ pCodecCtx->thread_type = FF_THREAD_SLICE;
+
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
avformat_close_input(&pFormatCtx);
return -1;
@@ -1050,7 +1054,7 @@ static ImBuf *ffmpeg_fetchibuf(struct anim *anim, int position, IMB_Timecode_Typ
int64_t pts_to_search = 0;
double frame_rate;
double pts_time_base;
- long long st_time;
+ int64_t st_time;
struct anim_index *tc_index = 0;
AVStream *v_st;
int new_frame_index = 0; /* To quiet gcc barking... */
@@ -1121,7 +1125,7 @@ static ImBuf *ffmpeg_fetchibuf(struct anim *anim, int position, IMB_Timecode_Typ
ffmpeg_decode_video_frame_scan(anim, pts_to_search);
}
else if (position != anim->curposition + 1) {
- long long pos;
+ int64_t pos;
int ret;
if (tc_index) {
@@ -1145,7 +1149,7 @@ static ImBuf *ffmpeg_fetchibuf(struct anim *anim, int position, IMB_Timecode_Typ
}
}
else {
- pos = (long long)(position - anim->preseek) * AV_TIME_BASE / frame_rate;
+ pos = (int64_t)(position - anim->preseek) * AV_TIME_BASE / frame_rate;
av_log(anim->pFormatCtx,
AV_LOG_DEBUG,
diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c
index 046e233fd05..fc0b99a82fa 100644
--- a/source/blender/imbuf/intern/colormanagement.c
+++ b/source/blender/imbuf/intern/colormanagement.c
@@ -101,40 +101,26 @@ static float imbuf_linear_srgb_to_xyz[3][3] = {{0.0f}};
static pthread_mutex_t processor_lock = BLI_MUTEX_INITIALIZER;
typedef struct ColormanageProcessor {
- OCIO_ConstProcessorRcPtr *processor;
+ OCIO_ConstCPUProcessorRcPtr *cpu_processor;
CurveMapping *curve_mapping;
bool is_data_result;
} ColormanageProcessor;
-static struct global_glsl_state {
- /* Actual processor used for GLSL baked LUTs. */
- /* UI colorspace here refers to the display linear color space,
- * i.e: The linear color space w.r.t. display chromaticity and radiometry.
- * We separate the colormanagement process into two steps to be able to
- * merge UI using alpha blending in the correct color space. */
- OCIO_ConstProcessorRcPtr *processor_scene_to_ui;
- OCIO_ConstProcessorRcPtr *processor_ui_to_display;
-
- /* Settings of processor for comparison. */
- char look[MAX_COLORSPACE_NAME];
- char view[MAX_COLORSPACE_NAME];
- char display[MAX_COLORSPACE_NAME];
- char input[MAX_COLORSPACE_NAME];
- float exposure, gamma;
+static struct global_gpu_state {
+ /* GPU shader currently bound. */
+ bool gpu_shader_bound;
+ /* Curve mapping. */
CurveMapping *curve_mapping, *orig_curve_mapping;
bool use_curve_mapping;
int curve_mapping_timestamp;
OCIO_CurveMappingSettings curve_mapping_settings;
-
- /* Container for GLSL state needed for OCIO module. */
- struct OCIO_GLSLDrawState *ocio_glsl_state;
-} global_glsl_state = {NULL};
+} global_gpu_state = {false};
static struct global_color_picking_state {
/* Cached processor for color picking conversion. */
- OCIO_ConstProcessorRcPtr *processor_to;
- OCIO_ConstProcessorRcPtr *processor_from;
+ OCIO_ConstCPUProcessorRcPtr *cpu_processor_to;
+ OCIO_ConstCPUProcessorRcPtr *cpu_processor_from;
bool failed;
} global_color_picking_state = {NULL};
@@ -609,11 +595,10 @@ static void colormanage_free_config(void)
/* free precomputer processors */
if (colorspace->to_scene_linear) {
- OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)colorspace->to_scene_linear);
+ OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)colorspace->to_scene_linear);
}
-
if (colorspace->from_scene_linear) {
- OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)colorspace->from_scene_linear);
+ OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)colorspace->from_scene_linear);
}
/* free color space itself */
@@ -631,11 +616,10 @@ static void colormanage_free_config(void)
/* free precomputer processors */
if (display->to_scene_linear) {
- OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)display->to_scene_linear);
+ OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)display->to_scene_linear);
}
-
if (display->from_scene_linear) {
- OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)display->from_scene_linear);
+ OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)display->from_scene_linear);
}
/* free list of views */
@@ -727,35 +711,25 @@ void colormanagement_init(void)
void colormanagement_exit(void)
{
- if (global_glsl_state.processor_scene_to_ui) {
- OCIO_processorRelease(global_glsl_state.processor_scene_to_ui);
- }
-
- if (global_glsl_state.processor_ui_to_display) {
- OCIO_processorRelease(global_glsl_state.processor_ui_to_display);
- }
-
- if (global_glsl_state.curve_mapping) {
- BKE_curvemapping_free(global_glsl_state.curve_mapping);
- }
+ OCIO_gpuCacheFree();
- if (global_glsl_state.curve_mapping_settings.lut) {
- MEM_freeN(global_glsl_state.curve_mapping_settings.lut);
+ if (global_gpu_state.curve_mapping) {
+ BKE_curvemapping_free(global_gpu_state.curve_mapping);
}
- if (global_glsl_state.ocio_glsl_state) {
- OCIO_freeOGLState(global_glsl_state.ocio_glsl_state);
+ if (global_gpu_state.curve_mapping_settings.lut) {
+ MEM_freeN(global_gpu_state.curve_mapping_settings.lut);
}
- if (global_color_picking_state.processor_to) {
- OCIO_processorRelease(global_color_picking_state.processor_to);
+ if (global_color_picking_state.cpu_processor_to) {
+ OCIO_cpuProcessorRelease(global_color_picking_state.cpu_processor_to);
}
- if (global_color_picking_state.processor_from) {
- OCIO_processorRelease(global_color_picking_state.processor_from);
+ if (global_color_picking_state.cpu_processor_from) {
+ OCIO_cpuProcessorRelease(global_color_picking_state.cpu_processor_from);
}
- memset(&global_glsl_state, 0, sizeof(global_glsl_state));
+ memset(&global_gpu_state, 0, sizeof(global_gpu_state));
memset(&global_color_picking_state, 0, sizeof(global_color_picking_state));
colormanage_free_config();
@@ -777,6 +751,12 @@ static bool colormanage_compatible_look(ColorManagedLook *look, const char *view
return (look->view[0] == 0 || (view_name && STREQ(look->view, view_name)));
}
+static bool colormanage_use_look(const char *look, const char *view_name)
+{
+ ColorManagedLook *look_descr = colormanage_look_get_named(look);
+ return (look_descr->is_noop == false && colormanage_compatible_look(look_descr, view_name));
+}
+
void colormanage_cache_free(ImBuf *ibuf)
{
if (ibuf->display_buffer_flags) {
@@ -852,95 +832,31 @@ static ColorSpace *display_transform_get_colorspace(
return NULL;
}
-static OCIO_ConstProcessorRcPtr *create_display_buffer_processor(const char *look,
- const char *view_transform,
- const char *display,
- float exposure,
- float gamma,
- const char *from_colorspace,
- const bool linear_output)
+static OCIO_ConstCPUProcessorRcPtr *create_display_buffer_processor(const char *look,
+ const char *view_transform,
+ const char *display,
+ float exposure,
+ float gamma,
+ const char *from_colorspace)
{
OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig();
- OCIO_DisplayTransformRcPtr *dt;
- OCIO_ConstProcessorRcPtr *processor;
- ColorManagedLook *look_descr = colormanage_look_get_named(look);
-
- dt = OCIO_createDisplayTransform();
-
- OCIO_displayTransformSetInputColorSpaceName(dt, from_colorspace);
- OCIO_displayTransformSetView(dt, view_transform);
- OCIO_displayTransformSetDisplay(dt, display);
-
- if (look_descr->is_noop == false && colormanage_compatible_look(look_descr, view_transform)) {
- OCIO_displayTransformSetLooksOverrideEnabled(dt, true);
- OCIO_displayTransformSetLooksOverride(dt, look);
- }
-
- /* fstop exposure control */
- if (exposure != 0.0f) {
- OCIO_MatrixTransformRcPtr *mt;
- float gain = powf(2.0f, exposure);
- const float scale4f[] = {gain, gain, gain, 1.0f};
- float m44[16], offset4[4];
-
- OCIO_matrixTransformScale(m44, offset4, scale4f);
- mt = OCIO_createMatrixTransform();
- OCIO_matrixTransformSetValue(mt, m44, offset4);
- OCIO_displayTransformSetLinearCC(dt, (OCIO_ConstTransformRcPtr *)mt);
-
- OCIO_matrixTransformRelease(mt);
- }
-
- /* post-display gamma transform */
- if (gamma != 1.0f) {
- OCIO_ExponentTransformRcPtr *et;
- float exponent = 1.0f / MAX2(FLT_EPSILON, gamma);
- const float exponent4f[] = {exponent, exponent, exponent, exponent};
+ const bool use_look = colormanage_use_look(look, view_transform);
+ const float scale = (exposure == 0.0f) ? 1.0f : powf(2.0f, exposure);
+ const float exponent = (gamma == 1.0f) ? 1.0f : 1.0f / max_ff(FLT_EPSILON, gamma);
- et = OCIO_createExponentTransform();
- OCIO_exponentTransformSetValue(et, exponent4f);
- OCIO_displayTransformSetDisplayCC(dt, (OCIO_ConstTransformRcPtr *)et);
+ OCIO_ConstProcessorRcPtr *processor = OCIO_createDisplayProcessor(
+ config, from_colorspace, view_transform, display, (use_look) ? look : "", scale, exponent);
- OCIO_exponentTransformRelease(et);
- }
-
- OCIO_GroupTransformRcPtr *gt = OCIO_createGroupTransform();
- OCIO_groupTransformSetDirection(gt, true);
- OCIO_groupTransformPushBack(gt, (OCIO_ConstTransformRcPtr *)dt);
-
- if (linear_output) {
- /* TODO use correct function display. */
- OCIO_ExponentTransformRcPtr *et = OCIO_createExponentTransform();
- OCIO_exponentTransformSetValue(et, (float[4]){2.2f, 2.2f, 2.2f, 1.0f});
- OCIO_groupTransformPushBack(gt, (OCIO_ConstTransformRcPtr *)et);
- OCIO_exponentTransformRelease(et);
- }
-
- processor = OCIO_configGetProcessor(config, (OCIO_ConstTransformRcPtr *)gt);
-
- OCIO_groupTransformRelease(gt);
- OCIO_displayTransformRelease(dt);
OCIO_configRelease(config);
- return processor;
-}
-
-static OCIO_ConstProcessorRcPtr *create_display_encoded_buffer_processor(
- const char *UNUSED(display))
-{
- OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig();
- OCIO_ConstProcessorRcPtr *processor;
-
- /* TODO use correct function display. */
- OCIO_ExponentTransformRcPtr *et = OCIO_createExponentTransform();
- OCIO_exponentTransformSetValue(et, (float[4]){1.0f / 2.2f, 1.0f / 2.2f, 1.0f / 2.2f, 1.0f});
-
- processor = OCIO_configGetProcessor(config, (OCIO_ConstTransformRcPtr *)et);
+ if (processor == NULL) {
+ return NULL;
+ }
- OCIO_exponentTransformRelease(et);
- OCIO_configRelease(config);
+ OCIO_ConstCPUProcessorRcPtr *cpu_processor = OCIO_processorGetCPUProcessor(processor);
+ OCIO_processorRelease(processor);
- return processor;
+ return cpu_processor;
}
static OCIO_ConstProcessorRcPtr *create_colorspace_transform_processor(const char *from_colorspace,
@@ -956,43 +872,54 @@ static OCIO_ConstProcessorRcPtr *create_colorspace_transform_processor(const cha
return processor;
}
-static OCIO_ConstProcessorRcPtr *colorspace_to_scene_linear_processor(ColorSpace *colorspace)
+static OCIO_ConstCPUProcessorRcPtr *colorspace_to_scene_linear_cpu_processor(
+ ColorSpace *colorspace)
{
if (colorspace->to_scene_linear == NULL) {
BLI_mutex_lock(&processor_lock);
if (colorspace->to_scene_linear == NULL) {
- OCIO_ConstProcessorRcPtr *to_scene_linear;
- to_scene_linear = create_colorspace_transform_processor(colorspace->name,
- global_role_scene_linear);
- colorspace->to_scene_linear = (struct OCIO_ConstProcessorRcPtr *)to_scene_linear;
+ OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor(
+ colorspace->name, global_role_scene_linear);
+
+ if (processor != NULL) {
+ colorspace->to_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *)
+ OCIO_processorGetCPUProcessor(processor);
+ OCIO_processorRelease(processor);
+ }
}
BLI_mutex_unlock(&processor_lock);
}
- return (OCIO_ConstProcessorRcPtr *)colorspace->to_scene_linear;
+ return (OCIO_ConstCPUProcessorRcPtr *)colorspace->to_scene_linear;
}
-static OCIO_ConstProcessorRcPtr *colorspace_from_scene_linear_processor(ColorSpace *colorspace)
+static OCIO_ConstCPUProcessorRcPtr *colorspace_from_scene_linear_cpu_processor(
+ ColorSpace *colorspace)
{
if (colorspace->from_scene_linear == NULL) {
BLI_mutex_lock(&processor_lock);
if (colorspace->from_scene_linear == NULL) {
- OCIO_ConstProcessorRcPtr *from_scene_linear;
- from_scene_linear = create_colorspace_transform_processor(global_role_scene_linear,
- colorspace->name);
- colorspace->from_scene_linear = (struct OCIO_ConstProcessorRcPtr *)from_scene_linear;
+ OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor(
+ global_role_scene_linear, colorspace->name);
+
+ if (processor != NULL) {
+ colorspace->from_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *)
+ OCIO_processorGetCPUProcessor(processor);
+ OCIO_processorRelease(processor);
+ }
}
BLI_mutex_unlock(&processor_lock);
}
- return (OCIO_ConstProcessorRcPtr *)colorspace->from_scene_linear;
+ return (OCIO_ConstCPUProcessorRcPtr *)colorspace->from_scene_linear;
}
-static OCIO_ConstProcessorRcPtr *display_from_scene_linear_processor(ColorManagedDisplay *display)
+static OCIO_ConstCPUProcessorRcPtr *display_from_scene_linear_processor(
+ ColorManagedDisplay *display)
{
if (display->from_scene_linear == NULL) {
BLI_mutex_lock(&processor_lock);
@@ -1011,16 +938,20 @@ static OCIO_ConstProcessorRcPtr *display_from_scene_linear_processor(ColorManage
OCIO_configRelease(config);
}
- display->from_scene_linear = (struct OCIO_ConstProcessorRcPtr *)processor;
+ if (processor != NULL) {
+ display->from_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *)
+ OCIO_processorGetCPUProcessor(processor);
+ OCIO_processorRelease(processor);
+ }
}
BLI_mutex_unlock(&processor_lock);
}
- return (OCIO_ConstProcessorRcPtr *)display->from_scene_linear;
+ return (OCIO_ConstCPUProcessorRcPtr *)display->from_scene_linear;
}
-static OCIO_ConstProcessorRcPtr *display_to_scene_linear_processor(ColorManagedDisplay *display)
+static OCIO_ConstCPUProcessorRcPtr *display_to_scene_linear_processor(ColorManagedDisplay *display)
{
if (display->to_scene_linear == NULL) {
BLI_mutex_lock(&processor_lock);
@@ -1039,13 +970,17 @@ static OCIO_ConstProcessorRcPtr *display_to_scene_linear_processor(ColorManagedD
OCIO_configRelease(config);
}
- display->to_scene_linear = (struct OCIO_ConstProcessorRcPtr *)processor;
+ if (processor != NULL) {
+ display->to_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *)
+ OCIO_processorGetCPUProcessor(processor);
+ OCIO_processorRelease(processor);
+ }
}
BLI_mutex_unlock(&processor_lock);
}
- return (OCIO_ConstProcessorRcPtr *)display->to_scene_linear;
+ return (OCIO_ConstCPUProcessorRcPtr *)display->to_scene_linear;
}
void IMB_colormanagement_init_default_view_settings(
@@ -2168,7 +2103,7 @@ void IMB_colormanagement_transform_v4(float pixel[4],
*/
void IMB_colormanagement_colorspace_to_scene_linear_v3(float pixel[3], ColorSpace *colorspace)
{
- OCIO_ConstProcessorRcPtr *processor;
+ OCIO_ConstCPUProcessorRcPtr *processor;
if (!colorspace) {
/* should never happen */
@@ -2176,17 +2111,17 @@ void IMB_colormanagement_colorspace_to_scene_linear_v3(float pixel[3], ColorSpac
return;
}
- processor = colorspace_to_scene_linear_processor(colorspace);
+ processor = colorspace_to_scene_linear_cpu_processor(colorspace);
- if (processor) {
- OCIO_processorApplyRGB(processor, pixel);
+ if (processor != NULL) {
+ OCIO_cpuProcessorApplyRGB(processor, pixel);
}
}
/* same as above, but converts colors in opposite direction */
void IMB_colormanagement_scene_linear_to_colorspace_v3(float pixel[3], ColorSpace *colorspace)
{
- OCIO_ConstProcessorRcPtr *processor;
+ OCIO_ConstCPUProcessorRcPtr *processor;
if (!colorspace) {
/* should never happen */
@@ -2194,10 +2129,10 @@ void IMB_colormanagement_scene_linear_to_colorspace_v3(float pixel[3], ColorSpac
return;
}
- processor = colorspace_from_scene_linear_processor(colorspace);
+ processor = colorspace_from_scene_linear_cpu_processor(colorspace);
- if (processor) {
- OCIO_processorApplyRGB(processor, pixel);
+ if (processor != NULL) {
+ OCIO_cpuProcessorApplyRGB(processor, pixel);
}
}
@@ -2205,7 +2140,7 @@ void IMB_colormanagement_colorspace_to_scene_linear_v4(float pixel[4],
bool predivide,
ColorSpace *colorspace)
{
- OCIO_ConstProcessorRcPtr *processor;
+ OCIO_ConstCPUProcessorRcPtr *processor;
if (!colorspace) {
/* should never happen */
@@ -2213,14 +2148,14 @@ void IMB_colormanagement_colorspace_to_scene_linear_v4(float pixel[4],
return;
}
- processor = colorspace_to_scene_linear_processor(colorspace);
+ processor = colorspace_to_scene_linear_cpu_processor(colorspace);
- if (processor) {
+ if (processor != NULL) {
if (predivide) {
- OCIO_processorApplyRGBA_predivide(processor, pixel);
+ OCIO_cpuProcessorApplyRGBA_predivide(processor, pixel);
}
else {
- OCIO_processorApplyRGBA(processor, pixel);
+ OCIO_cpuProcessorApplyRGBA(processor, pixel);
}
}
}
@@ -2232,7 +2167,7 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer,
struct ColorSpace *colorspace,
bool predivide)
{
- OCIO_ConstProcessorRcPtr *processor;
+ OCIO_ConstCPUProcessorRcPtr *processor;
if (!colorspace) {
/* should never happen */
@@ -2240,9 +2175,9 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer,
return;
}
- processor = colorspace_to_scene_linear_processor(colorspace);
+ processor = colorspace_to_scene_linear_cpu_processor(colorspace);
- if (processor) {
+ if (processor != NULL) {
OCIO_PackedImageDesc *img;
img = OCIO_createOCIO_PackedImageDesc(buffer,
@@ -2254,10 +2189,10 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer,
(size_t)channels * sizeof(float) * width);
if (predivide) {
- OCIO_processorApply_predivide(processor, img);
+ OCIO_cpuProcessorApply_predivide(processor, img);
}
else {
- OCIO_processorApply(processor, img);
+ OCIO_cpuProcessorApply(processor, img);
}
OCIO_PackedImageDescRelease(img);
@@ -2278,10 +2213,10 @@ void IMB_colormanagement_imbuf_to_byte_texture(unsigned char *out_buffer,
* without precision or performance loss at minimal memory usage. */
BLI_assert(ibuf->rect && ibuf->rect_float == NULL);
- OCIO_ConstProcessorRcPtr *processor = NULL;
+ OCIO_ConstCPUProcessorRcPtr *processor = NULL;
if (compress_as_srgb && ibuf->rect_colorspace &&
!IMB_colormanagement_space_is_srgb(ibuf->rect_colorspace)) {
- processor = colorspace_to_scene_linear_processor(ibuf->rect_colorspace);
+ processor = colorspace_to_scene_linear_cpu_processor(ibuf->rect_colorspace);
}
/* TODO(brecht): make this multi-threaded, or at least process in batches. */
@@ -2294,12 +2229,12 @@ void IMB_colormanagement_imbuf_to_byte_texture(unsigned char *out_buffer,
const unsigned char *in = in_buffer + in_offset * 4;
unsigned char *out = out_buffer + out_offset * 4;
- if (processor) {
+ if (processor != NULL) {
/* Convert to scene linear, to sRGB and premultiply. */
for (int x = 0; x < width; x++, in += 4, out += 4) {
float pixel[4];
rgba_uchar_to_float(pixel, in);
- OCIO_processorApplyRGB(processor, pixel);
+ OCIO_cpuProcessorApplyRGB(processor, pixel);
linearrgb_to_srgb_v3_v3(pixel, pixel);
if (use_premultiply) {
mul_v3_fl(pixel, pixel[3]);
@@ -2390,15 +2325,19 @@ void IMB_colormanagement_imbuf_to_float_texture(float *out_buffer,
*/
void IMB_colormanagement_scene_linear_to_color_picking_v3(float pixel[3])
{
- if (!global_color_picking_state.processor_to && !global_color_picking_state.failed) {
+ if (!global_color_picking_state.cpu_processor_to && !global_color_picking_state.failed) {
/* Create processor if none exists. */
BLI_mutex_lock(&processor_lock);
- if (!global_color_picking_state.processor_to && !global_color_picking_state.failed) {
- global_color_picking_state.processor_to = create_colorspace_transform_processor(
+ if (!global_color_picking_state.cpu_processor_to && !global_color_picking_state.failed) {
+ OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor(
global_role_scene_linear, global_role_color_picking);
- if (!global_color_picking_state.processor_to) {
+ if (processor != NULL) {
+ global_color_picking_state.cpu_processor_to = OCIO_processorGetCPUProcessor(processor);
+ OCIO_processorRelease(processor);
+ }
+ else {
global_color_picking_state.failed = true;
}
}
@@ -2406,22 +2345,26 @@ void IMB_colormanagement_scene_linear_to_color_picking_v3(float pixel[3])
BLI_mutex_unlock(&processor_lock);
}
- if (global_color_picking_state.processor_to) {
- OCIO_processorApplyRGB(global_color_picking_state.processor_to, pixel);
+ if (global_color_picking_state.cpu_processor_to) {
+ OCIO_cpuProcessorApplyRGB(global_color_picking_state.cpu_processor_to, pixel);
}
}
void IMB_colormanagement_color_picking_to_scene_linear_v3(float pixel[3])
{
- if (!global_color_picking_state.processor_from && !global_color_picking_state.failed) {
+ if (!global_color_picking_state.cpu_processor_from && !global_color_picking_state.failed) {
/* Create processor if none exists. */
BLI_mutex_lock(&processor_lock);
- if (!global_color_picking_state.processor_from && !global_color_picking_state.failed) {
- global_color_picking_state.processor_from = create_colorspace_transform_processor(
+ if (!global_color_picking_state.cpu_processor_from && !global_color_picking_state.failed) {
+ OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor(
global_role_color_picking, global_role_scene_linear);
- if (!global_color_picking_state.processor_from) {
+ if (processor != NULL) {
+ global_color_picking_state.cpu_processor_from = OCIO_processorGetCPUProcessor(processor);
+ OCIO_processorRelease(processor);
+ }
+ else {
global_color_picking_state.failed = true;
}
}
@@ -2429,8 +2372,8 @@ void IMB_colormanagement_color_picking_to_scene_linear_v3(float pixel[3])
BLI_mutex_unlock(&processor_lock);
}
- if (global_color_picking_state.processor_from) {
- OCIO_processorApplyRGB(global_color_picking_state.processor_from, pixel);
+ if (global_color_picking_state.cpu_processor_from) {
+ OCIO_cpuProcessorApplyRGB(global_color_picking_state.cpu_processor_from, pixel);
}
}
@@ -2456,24 +2399,20 @@ void IMB_colormanagement_srgb_to_scene_linear_v3(float pixel[3])
*/
void IMB_colormanagement_scene_linear_to_display_v3(float pixel[3], ColorManagedDisplay *display)
{
- OCIO_ConstProcessorRcPtr *processor;
-
- processor = display_from_scene_linear_processor(display);
+ OCIO_ConstCPUProcessorRcPtr *processor = display_from_scene_linear_processor(display);
- if (processor) {
- OCIO_processorApplyRGB(processor, pixel);
+ if (processor != NULL) {
+ OCIO_cpuProcessorApplyRGB(processor, pixel);
}
}
/* same as above, but converts color in opposite direction */
void IMB_colormanagement_display_to_scene_linear_v3(float pixel[3], ColorManagedDisplay *display)
{
- OCIO_ConstProcessorRcPtr *processor;
+ OCIO_ConstCPUProcessorRcPtr *processor = display_to_scene_linear_processor(display);
- processor = display_to_scene_linear_processor(display);
-
- if (processor) {
- OCIO_processorApplyRGB(processor, pixel);
+ if (processor != NULL) {
+ OCIO_cpuProcessorApplyRGB(processor, pixel);
}
}
@@ -3833,13 +3772,13 @@ ColormanageProcessor *IMB_colormanagement_display_processor_new(
cm_processor->is_data_result = display_space->is_data;
}
- cm_processor->processor = create_display_buffer_processor(applied_view_settings->look,
- applied_view_settings->view_transform,
- display_settings->display_device,
- applied_view_settings->exposure,
- applied_view_settings->gamma,
- global_role_scene_linear,
- false);
+ cm_processor->cpu_processor = create_display_buffer_processor(
+ applied_view_settings->look,
+ applied_view_settings->view_transform,
+ display_settings->display_device,
+ applied_view_settings->exposure,
+ applied_view_settings->gamma,
+ global_role_scene_linear);
if (applied_view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) {
cm_processor->curve_mapping = BKE_curvemapping_copy(applied_view_settings->curve_mapping);
@@ -3860,7 +3799,12 @@ ColormanageProcessor *IMB_colormanagement_colorspace_processor_new(const char *f
color_space = colormanage_colorspace_get_named(to_colorspace);
cm_processor->is_data_result = color_space->is_data;
- cm_processor->processor = create_colorspace_transform_processor(from_colorspace, to_colorspace);
+ OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor(from_colorspace,
+ to_colorspace);
+ if (processor != NULL) {
+ cm_processor->cpu_processor = OCIO_processorGetCPUProcessor(processor);
+ }
+ OCIO_processorRelease(processor);
return cm_processor;
}
@@ -3871,8 +3815,8 @@ void IMB_colormanagement_processor_apply_v4(ColormanageProcessor *cm_processor,
BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel);
}
- if (cm_processor->processor) {
- OCIO_processorApplyRGBA(cm_processor->processor, pixel);
+ if (cm_processor->cpu_processor) {
+ OCIO_cpuProcessorApplyRGBA(cm_processor->cpu_processor, pixel);
}
}
@@ -3883,8 +3827,8 @@ void IMB_colormanagement_processor_apply_v4_predivide(ColormanageProcessor *cm_p
BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel);
}
- if (cm_processor->processor) {
- OCIO_processorApplyRGBA_predivide(cm_processor->processor, pixel);
+ if (cm_processor->cpu_processor) {
+ OCIO_cpuProcessorApplyRGBA_predivide(cm_processor->cpu_processor, pixel);
}
}
@@ -3894,8 +3838,8 @@ void IMB_colormanagement_processor_apply_v3(ColormanageProcessor *cm_processor,
BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel);
}
- if (cm_processor->processor) {
- OCIO_processorApplyRGB(cm_processor->processor, pixel);
+ if (cm_processor->cpu_processor) {
+ OCIO_cpuProcessorApplyRGB(cm_processor->cpu_processor, pixel);
}
}
@@ -3940,7 +3884,7 @@ void IMB_colormanagement_processor_apply(ColormanageProcessor *cm_processor,
}
}
- if (cm_processor->processor && channels >= 3) {
+ if (cm_processor->cpu_processor && channels >= 3) {
OCIO_PackedImageDesc *img;
/* apply OCIO processor */
@@ -3953,10 +3897,10 @@ void IMB_colormanagement_processor_apply(ColormanageProcessor *cm_processor,
(size_t)channels * sizeof(float) * width);
if (predivide) {
- OCIO_processorApply_predivide(cm_processor->processor, img);
+ OCIO_cpuProcessorApply_predivide(cm_processor->cpu_processor, img);
}
else {
- OCIO_processorApply(cm_processor->processor, img);
+ OCIO_cpuProcessorApply(cm_processor->cpu_processor, img);
}
OCIO_PackedImageDescRelease(img);
@@ -3986,8 +3930,8 @@ void IMB_colormanagement_processor_free(ColormanageProcessor *cm_processor)
if (cm_processor->curve_mapping) {
BKE_curvemapping_free(cm_processor->curve_mapping);
}
- if (cm_processor->processor) {
- OCIO_processorRelease(cm_processor->processor);
+ if (cm_processor->cpu_processor) {
+ OCIO_cpuProcessorRelease(cm_processor->cpu_processor);
}
MEM_freeN(cm_processor);
@@ -3995,19 +3939,6 @@ void IMB_colormanagement_processor_free(ColormanageProcessor *cm_processor)
/* **** OpenGL drawing routines using GLSL for color space transform ***** */
-static bool check_glsl_display_processor_changed(
- const ColorManagedViewSettings *view_settings,
- const ColorManagedDisplaySettings *display_settings,
- const char *from_colorspace)
-{
- return !(global_glsl_state.exposure == view_settings->exposure &&
- global_glsl_state.gamma == view_settings->gamma &&
- STREQ(global_glsl_state.look, view_settings->look) &&
- STREQ(global_glsl_state.view, view_settings->view_transform) &&
- STREQ(global_glsl_state.display, display_settings->display_device) &&
- STREQ(global_glsl_state.input, from_colorspace));
-}
-
static void curve_mapping_to_ocio_settings(CurveMapping *curve_mapping,
OCIO_CurveMappingSettings *curve_mapping_settings)
{
@@ -4041,94 +3972,60 @@ static void curve_mapping_to_ocio_settings(CurveMapping *curve_mapping,
curve_mapping_settings->cache_id = (size_t)curve_mapping + curve_mapping->changed_timestamp;
}
-static void update_glsl_display_processor(const ColorManagedViewSettings *view_settings,
- const ColorManagedDisplaySettings *display_settings,
- const char *from_colorspace)
+static OCIO_CurveMappingSettings *update_glsl_curve_mapping(
+ const ColorManagedViewSettings *view_settings)
{
- bool use_curve_mapping = (view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) != 0;
- bool need_update = false;
-
- need_update = global_glsl_state.processor_scene_to_ui == NULL ||
- check_glsl_display_processor_changed(
- view_settings, display_settings, from_colorspace) ||
- use_curve_mapping != global_glsl_state.use_curve_mapping;
-
- if (use_curve_mapping && need_update == false) {
- need_update |= view_settings->curve_mapping->changed_timestamp !=
- global_glsl_state.curve_mapping_timestamp ||
- view_settings->curve_mapping != global_glsl_state.orig_curve_mapping;
+ /* Using curve mapping? */
+ const bool use_curve_mapping = (view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) != 0;
+ if (!use_curve_mapping) {
+ return NULL;
}
- /* Update state if there's no processor yet or
- * processor settings has been changed.
- */
- if (need_update) {
- OCIO_CurveMappingSettings *curve_mapping_settings = &global_glsl_state.curve_mapping_settings;
- CurveMapping *new_curve_mapping = NULL;
-
- /* Store settings of processor for further comparison. */
- BLI_strncpy(global_glsl_state.look, view_settings->look, MAX_COLORSPACE_NAME);
- BLI_strncpy(global_glsl_state.view, view_settings->view_transform, MAX_COLORSPACE_NAME);
- BLI_strncpy(global_glsl_state.display, display_settings->display_device, MAX_COLORSPACE_NAME);
- BLI_strncpy(global_glsl_state.input, from_colorspace, MAX_COLORSPACE_NAME);
- global_glsl_state.exposure = view_settings->exposure;
- global_glsl_state.gamma = view_settings->gamma;
-
- /* We're using curve mapping's address as a cache ID,
- * so we need to make sure re-allocation gives new address here.
- * We do this by allocating new curve mapping before freeing old one. */
- if (use_curve_mapping) {
- new_curve_mapping = BKE_curvemapping_copy(view_settings->curve_mapping);
- }
-
- if (global_glsl_state.curve_mapping) {
- BKE_curvemapping_free(global_glsl_state.curve_mapping);
- MEM_freeN(curve_mapping_settings->lut);
- global_glsl_state.curve_mapping = NULL;
- curve_mapping_settings->lut = NULL;
- }
-
- /* Fill in OCIO's curve mapping settings. */
- if (use_curve_mapping) {
- curve_mapping_to_ocio_settings(new_curve_mapping, &global_glsl_state.curve_mapping_settings);
+ /* Already up to date? */
+ OCIO_CurveMappingSettings *curve_mapping_settings = &global_gpu_state.curve_mapping_settings;
+ if (view_settings->curve_mapping->changed_timestamp ==
+ global_gpu_state.curve_mapping_timestamp &&
+ view_settings->curve_mapping == global_gpu_state.orig_curve_mapping) {
+ return curve_mapping_settings;
+ }
- global_glsl_state.curve_mapping = new_curve_mapping;
- global_glsl_state.curve_mapping_timestamp = view_settings->curve_mapping->changed_timestamp;
- global_glsl_state.orig_curve_mapping = view_settings->curve_mapping;
- global_glsl_state.use_curve_mapping = true;
- }
- else {
- global_glsl_state.orig_curve_mapping = NULL;
- global_glsl_state.use_curve_mapping = false;
- }
+ /* Need to update. */
+ CurveMapping *new_curve_mapping = NULL;
- /* Free old processor, if any. */
- if (global_glsl_state.processor_scene_to_ui) {
- OCIO_processorRelease(global_glsl_state.processor_scene_to_ui);
- }
+ /* We're using curve mapping's address as a cache ID,
+ * so we need to make sure re-allocation gives new address here.
+ * We do this by allocating new curve mapping before freeing old one. */
+ if (use_curve_mapping) {
+ new_curve_mapping = BKE_curvemapping_copy(view_settings->curve_mapping);
+ }
- if (global_glsl_state.processor_ui_to_display) {
- OCIO_processorRelease(global_glsl_state.processor_ui_to_display);
- }
+ if (global_gpu_state.curve_mapping) {
+ BKE_curvemapping_free(global_gpu_state.curve_mapping);
+ MEM_freeN(curve_mapping_settings->lut);
+ global_gpu_state.curve_mapping = NULL;
+ curve_mapping_settings->lut = NULL;
+ }
- /* We're using display OCIO processor, no RGB curves yet. */
- global_glsl_state.processor_scene_to_ui = create_display_buffer_processor(
- global_glsl_state.look,
- global_glsl_state.view,
- global_glsl_state.display,
- global_glsl_state.exposure,
- global_glsl_state.gamma,
- global_glsl_state.input,
- true);
+ /* Fill in OCIO's curve mapping settings. */
+ if (use_curve_mapping) {
+ curve_mapping_to_ocio_settings(new_curve_mapping, &global_gpu_state.curve_mapping_settings);
- global_glsl_state.processor_ui_to_display = create_display_encoded_buffer_processor(
- global_glsl_state.display);
+ global_gpu_state.curve_mapping = new_curve_mapping;
+ global_gpu_state.curve_mapping_timestamp = view_settings->curve_mapping->changed_timestamp;
+ global_gpu_state.orig_curve_mapping = view_settings->curve_mapping;
+ global_gpu_state.use_curve_mapping = true;
}
+ else {
+ global_gpu_state.orig_curve_mapping = NULL;
+ global_gpu_state.use_curve_mapping = false;
+ }
+
+ return curve_mapping_settings;
}
bool IMB_colormanagement_support_glsl_draw(const ColorManagedViewSettings *UNUSED(view_settings))
{
- return OCIO_supportGLSLDraw();
+ return OCIO_supportGPUShader();
}
/**
@@ -4165,27 +4062,40 @@ bool IMB_colormanagement_setup_glsl_draw_from_space(
applied_view_settings = &default_view_settings;
}
- /* Make sure OCIO processor is up-to-date. */
- update_glsl_display_processor(applied_view_settings,
- display_settings,
- from_colorspace ? from_colorspace->name :
- global_role_scene_linear);
+ /* Ensure curve mapping is up to data. */
+ OCIO_CurveMappingSettings *curve_mapping_settings = update_glsl_curve_mapping(
+ applied_view_settings);
- if (global_glsl_state.processor_scene_to_ui == NULL) {
- /* Happens when requesting non-existing color space or LUT in the
- * configuration file does not exist.
- */
- return false;
- }
+ /* GPU shader parameters. */
+ const char *input = from_colorspace ? from_colorspace->name : global_role_scene_linear;
+ const char *view = applied_view_settings->view_transform;
+ const char *display = display_settings->display_device;
+ const bool use_look = colormanage_use_look(applied_view_settings->look,
+ applied_view_settings->view_transform);
+ const char *look = (use_look) ? applied_view_settings->look : "";
+ const float exposure = applied_view_settings->exposure;
+ const float gamma = applied_view_settings->gamma;
+ const float scale = (exposure == 0.0f) ? 1.0f : powf(2.0f, exposure);
+ const float exponent = (gamma == 1.0f) ? 1.0f : 1.0f / max_ff(FLT_EPSILON, gamma);
+
+ OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig();
+
+ /* Bind shader. Internally GPU shaders are created and cached on demand. */
+ global_gpu_state.gpu_shader_bound = OCIO_gpuDisplayShaderBind(config,
+ input,
+ view,
+ display,
+ look,
+ curve_mapping_settings,
+ scale,
+ exponent,
+ dither,
+ predivide,
+ do_overlay_merge);
+
+ OCIO_configRelease(config);
- return OCIO_setupGLSLDraw(
- &global_glsl_state.ocio_glsl_state,
- global_glsl_state.processor_scene_to_ui,
- global_glsl_state.processor_ui_to_display,
- global_glsl_state.use_curve_mapping ? &global_glsl_state.curve_mapping_settings : NULL,
- dither,
- predivide,
- do_overlay_merge);
+ return global_gpu_state.gpu_shader_bound;
}
/* Configures GLSL shader for conversion from scene linear to display space */
@@ -4225,8 +4135,9 @@ bool IMB_colormanagement_setup_glsl_draw_ctx(const bContext *C, float dither, bo
/* Finish GLSL-based display space conversion */
void IMB_colormanagement_finish_glsl_draw(void)
{
- if (global_glsl_state.ocio_glsl_state != NULL) {
- OCIO_finishGLSLDraw(global_glsl_state.ocio_glsl_state);
+ if (global_gpu_state.gpu_shader_bound) {
+ OCIO_gpuDisplayShaderUnbind();
+ global_gpu_state.gpu_shader_bound = false;
}
}
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.cpp b/source/blender/imbuf/intern/dds/ColorBlock.cpp
index 00fa0111d1c..3b1b970fb3c 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.cpp
+++ b/source/blender/imbuf/intern/dds/ColorBlock.cpp
@@ -400,7 +400,7 @@ void ColorBlock::boundsRangeAlpha(Color32 *start, Color32 *end) const
#endif
#if 0
-/** Sort colors by abosolute value in their 16 bit representation. */
+/** Sort colors by absolute value in their 16 bit representation. */
void ColorBlock::sortColorsByAbsoluteValue()
{
/* Dummy selection sort. */
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.h b/source/blender/imbuf/intern/dds/ColorBlock.h
index 0271c7964b8..9c3d73bbb0d 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.h
+++ b/source/blender/imbuf/intern/dds/ColorBlock.h
@@ -25,7 +25,7 @@
* Original license from NVIDIA follows.
*/
-// This code is in the public domain -- castanyo@yahoo.es
+// This code is in the public domain -- <castanyo@yahoo.es>
#pragma once
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index cce264624ce..343c8cd8f64 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -425,7 +425,7 @@ static int check_pixel_assigned(
*
* When a mask is given, only effect pixels with a mask value of 1,
* defined as #BAKE_MASK_MARGIN in rendercore.c
- * */
+ */
void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter)
{
const int width = ibuf->x;
diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c
index f8029c08bad..7ada0130059 100644
--- a/source/blender/imbuf/intern/imageprocess.c
+++ b/source/blender/imbuf/intern/imageprocess.c
@@ -115,7 +115,7 @@ void bicubic_interpolation(ImBuf *in, ImBuf *out, float u, float v, int xout, in
return;
}
- /* gcc warns these could be uninitialized, but its ok. */
+ /* GCC warns these could be uninitialized, but its ok. */
pixel_from_buffer(out, &outI, &outF, xout, yout);
bicubic_interpolation_color(in, outI, outF, u, v);
diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c
index 20e1febedd7..c9581c108c0 100644
--- a/source/blender/imbuf/intern/indexer.c
+++ b/source/blender/imbuf/intern/indexer.c
@@ -29,6 +29,7 @@
#include "BLI_ghash.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
+#include "BLI_threads.h"
#include "BLI_utildefines.h"
#ifdef _WIN32
# include "BLI_winstuff.h"
@@ -495,6 +496,8 @@ static struct proxy_output_ctx *alloc_proxy_output_ffmpeg(
rv->st->id = 0;
rv->c = rv->st->codec;
+ rv->c->thread_count = BLI_system_thread_count();
+ rv->c->thread_type = FF_THREAD_SLICE;
rv->c->codec_type = AVMEDIA_TYPE_VIDEO;
rv->c->codec_id = AV_CODEC_ID_MJPEG;
rv->c->width = width;
diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c
index fb8c361d94b..cf27557d043 100644
--- a/source/blender/imbuf/intern/jp2.c
+++ b/source/blender/imbuf/intern/jp2.c
@@ -476,7 +476,7 @@ static ImBuf *imb_load_jp2_stream(opj_stream_t *stream,
r = image->comps[0].data;
a = (use_alpha) ? image->comps[1].data : NULL;
- /* grayscale 12bits+ */
+ /* Gray-scale 12bits+ */
if (use_alpha) {
a = image->comps[1].data;
PIXEL_LOOPER_BEGIN (rect_float) {
@@ -500,7 +500,7 @@ static ImBuf *imb_load_jp2_stream(opj_stream_t *stream,
g = image->comps[1].data;
b = image->comps[2].data;
- /* rgb or rgba 12bits+ */
+ /* RGB or RGBA 12bits+ */
if (use_alpha) {
a = image->comps[3].data;
PIXEL_LOOPER_BEGIN (rect_float) {
@@ -551,7 +551,7 @@ static ImBuf *imb_load_jp2_stream(opj_stream_t *stream,
g = image->comps[1].data;
b = image->comps[2].data;
- /* 8bit rgb or rgba */
+ /* 8bit RGB or RGBA */
if (use_alpha) {
a = image->comps[3].data;
PIXEL_LOOPER_BEGIN (rect_uchar) {
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index 979e7703e81..2a9cb9af891 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -1108,7 +1108,7 @@ void IMB_exr_write_channels(void *handle)
const size_t num_pixels = ((size_t)data->width) * data->height;
half *rect_half = nullptr, *current_rect_half = nullptr;
- /* We allocate teporary storage for half pixels for all the channels at once. */
+ /* We allocate temporary storage for half pixels for all the channels at once. */
if (data->num_half_channels != 0) {
rect_half = (half *)MEM_mallocN(sizeof(half) * data->num_half_channels * num_pixels,
__func__);
@@ -1235,7 +1235,7 @@ void IMB_exr_read_channels(void *handle)
Header header = in.header();
Box2i dw = header.dataWindow();
- /* Insert all matching channel into framebuffer. */
+ /* Insert all matching channel into frame-buffer. */
FrameBuffer frameBuffer;
ExrChannel *echan;
diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c
index f0daa4543e1..50210650f05 100644
--- a/source/blender/imbuf/intern/readimage.c
+++ b/source/blender/imbuf/intern/readimage.c
@@ -23,13 +23,13 @@
*/
#ifdef _WIN32
-# include "mmap_win.h"
# include <io.h>
# include <stddef.h>
# include <sys/types.h>
#endif
#include "BLI_fileops.h"
+#include "BLI_mmap.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
@@ -186,20 +186,19 @@ ImBuf *IMB_loadifffile(
size = BLI_file_descriptor_size(file);
imb_mmap_lock();
- mem = mmap(NULL, size, PROT_READ, MAP_SHARED, file, 0);
+ BLI_mmap_file *mmap_file = BLI_mmap_open(file);
imb_mmap_unlock();
-
- if (mem == (unsigned char *)-1) {
+ if (mmap_file == NULL) {
fprintf(stderr, "%s: couldn't get mapping %s\n", __func__, descr);
return NULL;
}
+ mem = BLI_mmap_get_pointer(mmap_file);
+
ibuf = IMB_ibImageFromMemory(mem, size, flags, colorspace, descr);
imb_mmap_lock();
- if (munmap(mem, size)) {
- fprintf(stderr, "%s: couldn't unmap file %s\n", __func__, descr);
- }
+ BLI_mmap_free(mmap_file);
imb_mmap_unlock();
return ibuf;
@@ -292,14 +291,15 @@ static void imb_loadtilefile(ImBuf *ibuf, int file, int tx, int ty, unsigned int
size = BLI_file_descriptor_size(file);
imb_mmap_lock();
- mem = mmap(NULL, size, PROT_READ, MAP_SHARED, file, 0);
+ BLI_mmap_file *mmap_file = BLI_mmap_open(file);
imb_mmap_unlock();
-
- if (mem == (unsigned char *)-1) {
+ if (mmap_file == NULL) {
fprintf(stderr, "Couldn't get memory mapping for %s\n", ibuf->cachename);
return;
}
+ mem = BLI_mmap_get_pointer(mmap_file);
+
const ImFileType *type = IMB_file_type_from_ibuf(ibuf);
if (type != NULL) {
if (type->load_tile != NULL) {
@@ -308,9 +308,7 @@ static void imb_loadtilefile(ImBuf *ibuf, int file, int tx, int ty, unsigned int
}
imb_mmap_lock();
- if (munmap(mem, size)) {
- fprintf(stderr, "Couldn't unmap memory for %s.\n", ibuf->cachename);
- }
+ BLI_mmap_free(mmap_file);
imb_mmap_unlock();
}
diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c
index a9833623250..d7cefbbd077 100644
--- a/source/blender/imbuf/intern/targa.c
+++ b/source/blender/imbuf/intern/targa.c
@@ -713,7 +713,7 @@ ImBuf *imb_loadtarga(const unsigned char *mem,
return ibuf;
}
- if (!ELEM(tga.imgtyp, 1, 9)) { /* happens sometimes (beuh) */
+ if (!ELEM(tga.imgtyp, 1, 9)) { /* happens sometimes (ugh) */
if (cmap) {
MEM_freeN(cmap);
cmap = NULL;
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index 038c9950968..0d2080b5f0a 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -63,7 +63,7 @@
* because 'near' is disabled through BLI_windstuff */
# include "BLI_winstuff.h"
# include "utfconv.h"
-# include <direct.h> /* chdir */
+# include <direct.h> /* #chdir */
# include <shlobj.h>
#endif
diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c
index 486db07597f..106e4618847 100644
--- a/source/blender/imbuf/intern/thumbs_blend.c
+++ b/source/blender/imbuf/intern/thumbs_blend.c
@@ -57,7 +57,7 @@ ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const
/* Note: we should handle all previews for a same group at once, would avoid reopening
* `.blend` file for each and every ID. However, this adds some complexity,
* so keep it for later. */
- names = BLO_blendhandle_get_datablock_names(libfiledata, idcode, &nnames);
+ names = BLO_blendhandle_get_datablock_names(libfiledata, idcode, false, &nnames);
previews = BLO_blendhandle_get_previews(libfiledata, idcode, &nprevs);
BLO_blendhandle_close(libfiledata);
@@ -100,61 +100,3 @@ ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const
return ima;
}
-
-/* add a fake passepartout overlay to a byte buffer, use for blend file thumbnails */
-#define MARGIN 2
-
-void IMB_thumb_overlay_blend(unsigned int *thumb, int width, int height, float aspect)
-{
- unsigned char *px = (unsigned char *)thumb;
- int margin_l = MARGIN;
- int margin_b = MARGIN;
- int margin_r = width - MARGIN;
- int margin_t = height - MARGIN;
-
- if (aspect < 1.0f) {
- margin_l = (int)((width - ((float)width * aspect)) / 2.0f);
- margin_l += MARGIN;
- CLAMP(margin_l, MARGIN, (width / 2));
- margin_r = width - margin_l;
- }
- else if (aspect > 1.0f) {
- margin_b = (int)((height - ((float)height / aspect)) / 2.0f);
- margin_b += MARGIN;
- CLAMP(margin_b, MARGIN, (height / 2));
- margin_t = height - margin_b;
- }
-
- {
- int x, y;
- int stride_x = (margin_r - margin_l) - 2;
-
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++, px += 4) {
- int hline = 0, vline = 0;
- if ((x > margin_l && x < margin_r) && (y > margin_b && y < margin_t)) {
- /* interior. skip */
- x += stride_x;
- px += stride_x * 4;
- }
- else if ((hline = (((x == margin_l || x == margin_r)) && y >= margin_b &&
- y <= margin_t)) ||
- (vline = (((y == margin_b || y == margin_t)) && x >= margin_l &&
- x <= margin_r))) {
- /* dashed line */
- if ((hline && y % 2) || (vline && x % 2)) {
- px[0] = px[1] = px[2] = 0;
- px[3] = 255;
- }
- }
- else {
- /* outside, fill in alpha, like passepartout */
- px[0] *= 0.5f;
- px[1] *= 0.5f;
- px[2] *= 0.5f;
- px[3] = (px[3] * 0.5f) + 96;
- }
- }
- }
- }
-}
diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c
index 587d6ad9e7e..2fb14e40d9d 100644
--- a/source/blender/imbuf/intern/tiff.c
+++ b/source/blender/imbuf/intern/tiff.c
@@ -512,7 +512,7 @@ static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image)
}
if (success) {
- /* Code seems to be not needed for 16 bits tif, on PPC G5 OSX (ton) */
+ /* Code seems to be not needed for 16 bits TIFF, on PPC G5 OSX (ton) */
if (bitspersample < 16) {
if (ENDIAN_ORDER == B_ENDIAN) {
IMB_convert_rgba_to_abgr(tmpibuf);
@@ -806,7 +806,7 @@ bool imb_savetiff(ImBuf *ibuf, const char *filepath, int flags)
/* open TIFF file for writing */
if (flags & IB_mem) {
- /* bork at the creation of a TIFF in memory */
+ /* Failed to allocate TIFF in memory. */
fprintf(stderr,
"imb_savetiff: creation of in-memory TIFF files is "
"not yet supported.\n");
diff --git a/source/blender/imbuf/intern/util_gpu.c b/source/blender/imbuf/intern/util_gpu.c
index 8bedf8eb93c..2b99a0aa81d 100644
--- a/source/blender/imbuf/intern/util_gpu.c
+++ b/source/blender/imbuf/intern/util_gpu.c
@@ -49,7 +49,7 @@ static void imb_gpu_get_format(const ImBuf *ibuf,
!IMB_colormanagement_space_is_scene_linear(ibuf->rect_colorspace));
high_bitdepth = (!(ibuf->flags & IB_halffloat) && high_bitdepth);
- *r_data_format = (float_rect) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE;
+ *r_data_format = (float_rect) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE;
if (float_rect) {
*r_texture_format = high_bitdepth ? GPU_RGBA32F : GPU_RGBA16F;
diff --git a/source/blender/io/alembic/exporter/abc_archive.cc b/source/blender/io/alembic/exporter/abc_archive.cc
index 68ad2089a3e..e066704cd24 100644
--- a/source/blender/io/alembic/exporter/abc_archive.cc
+++ b/source/blender/io/alembic/exporter/abc_archive.cc
@@ -112,7 +112,7 @@ static OArchive *create_archive(std::ofstream *abc_ostream,
*
* If 'time_relative' is true, samples are returned as time (in seconds) from params.frame_start.
* If 'time_relative' is false, samples are returned as fractional frames from 0.
- * */
+ */
static void get_shutter_samples(double scene_fps,
const AlembicExportParams &params,
int nr_of_samples,
@@ -141,13 +141,13 @@ static TimeSamplingPtr create_time_sampling(double scene_fps,
std::vector<double> samples;
if (params.frame_start == params.frame_end) {
- return TimeSamplingPtr(new TimeSampling());
+ return TimeSamplingPtr(new TimeSampling()); // NOLINT: modernize-make-shared
}
get_shutter_samples(scene_fps, params, nr_of_samples, true, samples);
TimeSamplingType ts(static_cast<uint32_t>(samples.size()), 1.0 / scene_fps);
- return TimeSamplingPtr(new TimeSampling(ts, samples));
+ return TimeSamplingPtr(new TimeSampling(ts, samples)); // NOLINT: modernize-make-shared
}
static void get_frames(double scene_fps,
diff --git a/source/blender/io/alembic/exporter/abc_writer_mesh.h b/source/blender/io/alembic/exporter/abc_writer_mesh.h
index fdf2d3cc1e3..ed4fb4e4514 100644
--- a/source/blender/io/alembic/exporter/abc_writer_mesh.h
+++ b/source/blender/io/alembic/exporter/abc_writer_mesh.h
@@ -32,7 +32,7 @@ namespace blender::io::alembic {
/* Writer for Alembic geometry. Does not assume the object is a mesh object. */
class ABCGenericMeshWriter : public ABCAbstractWriter {
private:
- /* Either polymesh or subd is used, depending on is_subd_.
+ /* Either poly-mesh or subdivision-surface is used, depending on is_subd_.
* References to the schema must be kept, or Alembic will not properly write. */
Alembic::AbcGeom::OPolyMesh abc_poly_mesh_;
Alembic::AbcGeom::OPolyMeshSchema abc_poly_mesh_schema_;
diff --git a/source/blender/io/alembic/exporter/abc_writer_transform.cc b/source/blender/io/alembic/exporter/abc_writer_transform.cc
index 7fe9fd933c5..eff042d036d 100644
--- a/source/blender/io/alembic/exporter/abc_writer_transform.cc
+++ b/source/blender/io/alembic/exporter/abc_writer_transform.cc
@@ -94,7 +94,7 @@ void ABCTransformWriter::do_write(HierarchyContext &context)
scale_mat[3][3] = args_.export_params->global_scale; /* also scale translation */
mul_m4_m4m4(parent_relative_matrix, parent_relative_matrix, scale_mat);
parent_relative_matrix[3][3] /=
- args_.export_params->global_scale; /* normalise the homogeneous component */
+ args_.export_params->global_scale; /* Normalize the homogeneous component. */
}
XformSample xform_sample;
diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.cc b/source/blender/io/alembic/intern/abc_reader_mesh.cc
index 0b9636ffb70..8133f615080 100644
--- a/source/blender/io/alembic/intern/abc_reader_mesh.cc
+++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc
@@ -521,7 +521,7 @@ static bool has_animated_geom_params(const ICompoundProperty arbGeomParams)
return false;
}
-/* Specialisation of has_animations() as defined in abc_reader_object.h. */
+/* Specialization of #has_animations() as defined in abc_reader_object.h. */
template<> bool has_animations(Alembic::AbcGeom::IPolyMeshSchema &schema, ImportSettings *settings)
{
if (settings->is_sequence || !schema.isConstant()) {
diff --git a/source/blender/io/alembic/intern/abc_util.cc b/source/blender/io/alembic/intern/abc_util.cc
index aa7beb37dc5..3d3ba0347c5 100644
--- a/source/blender/io/alembic/intern/abc_util.cc
+++ b/source/blender/io/alembic/intern/abc_util.cc
@@ -135,7 +135,7 @@ bool has_property(const Alembic::Abc::ICompoundProperty &prop, const std::string
return prop.getPropertyHeader(name) != nullptr;
}
-typedef std::pair<Alembic::AbcCoreAbstract::index_t, float> index_time_pair_t;
+using index_time_pair_t = std::pair<Alembic::AbcCoreAbstract::index_t, float>;
float get_weight_and_index(float time,
const Alembic::AbcCoreAbstract::TimeSamplingPtr &time_sampling,
diff --git a/source/blender/io/collada/AnimationImporter.cpp b/source/blender/io/collada/AnimationImporter.cpp
index 9f54bf2aa28..49f28325257 100644
--- a/source/blender/io/collada/AnimationImporter.cpp
+++ b/source/blender/io/collada/AnimationImporter.cpp
@@ -120,12 +120,12 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
COLLADAFW::FloatOrDoubleArray &intan = curve->getInTangentValues();
COLLADAFW::FloatOrDoubleArray &outtan = curve->getOutTangentValues();
- /* intangent */
+ /* In-tangent. */
unsigned int index = 2 * (j * dim + i);
bez.vec[0][0] = bc_get_float_value(intan, index) * fps;
bez.vec[0][1] = bc_get_float_value(intan, index + 1);
- /* outtangent */
+ /* Out-tangent. */
bez.vec[2][0] = bc_get_float_value(outtan, index) * fps;
bez.vec[2][1] = bc_get_float_value(outtan, index + 1);
if (curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER) {
diff --git a/source/blender/io/collada/ArmatureExporter.cpp b/source/blender/io/collada/ArmatureExporter.cpp
index 9bf1a4ae830..28f5f9d40bc 100644
--- a/source/blender/io/collada/ArmatureExporter.cpp
+++ b/source/blender/io/collada/ArmatureExporter.cpp
@@ -197,7 +197,7 @@ void ArmatureExporter::add_bone_node(Bone *bone,
add_bone_transform(ob_arm, bone, node);
- /* Write nodes of childobjects, remove written objects from list */
+ /* Write nodes of child-objects, remove written objects from list. */
std::vector<Object *>::iterator iter = child_objects.begin();
while (iter != child_objects.end()) {
@@ -219,7 +219,7 @@ void ArmatureExporter::add_bone_node(Bone *bone,
* single matrix the tweak must be applied
* to the result. */
if (export_settings.get_open_sim()) {
- /* Tweak objects parentinverse to match compatibility. */
+ /* Tweak objects parent-inverse to match compatibility. */
float temp[4][4];
copy_m4_m4(temp, bone->arm_mat);
diff --git a/source/blender/io/collada/ArmatureImporter.cpp b/source/blender/io/collada/ArmatureImporter.cpp
index 7eef5c3f5fb..5c3d6be589a 100644
--- a/source/blender/io/collada/ArmatureImporter.cpp
+++ b/source/blender/io/collada/ArmatureImporter.cpp
@@ -1108,7 +1108,7 @@ BoneExtended &ArmatureImporter::add_bone_extended(EditBone *bone,
}
if (!has_connect && this->import_settings->auto_connect) {
- /* auto connect only whyen parent has exactly one child*/
+ /* Auto connect only when parent has exactly one child. */
connect_type = sibcount == 1;
}
diff --git a/source/blender/io/collada/BCAnimationCurve.h b/source/blender/io/collada/BCAnimationCurve.h
index 27856dd55f4..a1597cd47be 100644
--- a/source/blender/io/collada/BCAnimationCurve.h
+++ b/source/blender/io/collada/BCAnimationCurve.h
@@ -133,7 +133,7 @@ class BCAnimationCurve {
void get_frames(BCFrames &frames) const;
- /* Curve edit functions create a copy of the underlaying FCurve */
+ /* Curve edit functions create a copy of the underlying #FCurve. */
FCurve *get_edit_fcurve();
bool add_value_from_rna(const int frame);
bool add_value_from_matrix(const BCSample &sample, const int frame);
diff --git a/source/blender/io/collada/BCAnimationSampler.cpp b/source/blender/io/collada/BCAnimationSampler.cpp
index a6ee0b8bee6..b2a9027380e 100644
--- a/source/blender/io/collada/BCAnimationSampler.cpp
+++ b/source/blender/io/collada/BCAnimationSampler.cpp
@@ -536,7 +536,7 @@ const BCMatrix *BCSampleFrame::get_sample_matrix(Object *ob) const
return &sample->get_matrix();
}
-/* Get the matrix for the given Bone, returns Unity when the Objewct is not sampled */
+/* Get the matrix for the given Bone, returns Unity when the Object is not sampled. */
const BCMatrix *BCSampleFrame::get_sample_matrix(Object *ob, Bone *bone) const
{
BCSampleMap::const_iterator it = sampleMap.find(ob);
diff --git a/source/blender/io/collada/DocumentImporter.cpp b/source/blender/io/collada/DocumentImporter.cpp
index 10c1a90576c..214b5207a96 100644
--- a/source/blender/io/collada/DocumentImporter.cpp
+++ b/source/blender/io/collada/DocumentImporter.cpp
@@ -275,15 +275,15 @@ void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node,
COLLADAFW::Node *par = nullptr,
Object *parob = nullptr)
{
- /* The split in T29246, rootmap must point at actual root when
+ /* The split in T29246, root_map must point at actual root when
* calculating bones in apply_curves_as_matrix. - actual root is the root node.
* This has to do with inverse bind poses being world space
- * (the sources for skinned bones' restposes) and the way
- * non-skinning nodes have their "restpose" recursively calculated.
+ * (the sources for skinned bones' rest-poses) and the way
+ * non-skinning nodes have their "rest-pose" recursively calculated.
* XXX TODO: design issue, how to support unrelated joints taking
* part in skinning. */
if (par) { // && par->getType() == COLLADAFW::Node::JOINT) {
- /* par is root if there's no corresp. key in root_map */
+ /* If par is root if there's no corresponding key in root_map. */
if (root_map.find(par->getUniqueId()) == root_map.end()) {
root_map[node->getUniqueId()] = node;
}
@@ -657,7 +657,7 @@ std::vector<Object *> *DocumentImporter::write_node(COLLADAFW::Node *node,
}
}
- /* XXX: if there're multiple instances, only one is stored */
+ /* XXX: if there are multiple instances, only one is stored. */
if (!ob) {
goto finally;
@@ -942,7 +942,7 @@ bool DocumentImporter::writeCamera(const COLLADAFW::Camera *camera)
case CAM_PERSP:
default: {
double x = camera->getXFov().getValue();
- /* x is in degrees, cam->lens is in millimiters */
+ /* X is in degrees, cam->lens is in millimeters. */
cam->lens = fov_to_focallength(DEG2RADF(x), cam->sensor_x);
} break;
}
@@ -955,7 +955,7 @@ bool DocumentImporter::writeCamera(const COLLADAFW::Camera *camera)
case CAM_PERSP:
default: {
double yfov = camera->getYFov().getValue();
- /* yfov is in degrees, cam->lens is in millimiters */
+ /* yfov is in degrees, cam->lens is in millimeters. */
cam->lens = fov_to_focallength(DEG2RADF(yfov), cam->sensor_x);
} break;
}
diff --git a/source/blender/io/collada/DocumentImporter.h b/source/blender/io/collada/DocumentImporter.h
index a23e983940e..a6ed014a33c 100644
--- a/source/blender/io/collada/DocumentImporter.h
+++ b/source/blender/io/collada/DocumentImporter.h
@@ -125,7 +125,7 @@ class DocumentImporter : COLLADAFW::IWriter {
/** Add element and data for UniqueId */
bool addExtraTags(const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags);
- /** Get an extisting ExtraTags for uid */
+ /** Get an existing #ExtraTags for uid */
ExtraTags *getExtraTags(const COLLADAFW::UniqueId &uid);
bool is_armature(COLLADAFW::Node *node);
diff --git a/source/blender/io/collada/GeometryExporter.h b/source/blender/io/collada/GeometryExporter.h
index 51879f43272..948aafa760d 100644
--- a/source/blender/io/collada/GeometryExporter.h
+++ b/source/blender/io/collada/GeometryExporter.h
@@ -90,7 +90,6 @@ class GeometryExporter : COLLADASW::LibraryGeometries {
/* creates <source> for texcoords */
void createTexcoordsSource(std::string geom_id, Mesh *me);
- void createTesselatedTexcoordsSource(std::string geom_id, Mesh *me);
/* creates <source> for normals */
void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal> &nor);
diff --git a/source/blender/io/collada/MeshImporter.cpp b/source/blender/io/collada/MeshImporter.cpp
index 2934ea1caa6..172f9a468b4 100644
--- a/source/blender/io/collada/MeshImporter.cpp
+++ b/source/blender/io/collada/MeshImporter.cpp
@@ -693,7 +693,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, Mesh *me)
set_poly_indices(mpoly, mloop, loop_index, triangle_vertex_indices, 3);
if (mp_has_normals) { /* vertex normals, same implementation as for the triangles */
- /* the same for vertces normals */
+ /* The same for vertices normals. */
unsigned int vertex_normal_indices[3] = {
first_normal, normal_indices[1], normal_indices[2]};
if (!is_flat_face(vertex_normal_indices, nor, 3)) {
diff --git a/source/blender/io/common/IO_dupli_persistent_id.hh b/source/blender/io/common/IO_dupli_persistent_id.hh
index 6fabafd9d51..afc539636ac 100644
--- a/source/blender/io/common/IO_dupli_persistent_id.hh
+++ b/source/blender/io/common/IO_dupli_persistent_id.hh
@@ -41,7 +41,7 @@ class PersistentID {
PersistentID();
explicit PersistentID(const DupliObject *dupli_ob);
- /* Return true iff the persistent IDs are the same, ignoring the first digit. */
+ /* Return true if the persistent IDs are the same, ignoring the first digit. */
bool is_from_same_instancer_as(const PersistentID &other) const;
/* Construct the persistent ID of this instance's instancer. */
diff --git a/source/blender/io/common/intern/abstract_hierarchy_iterator.cc b/source/blender/io/common/intern/abstract_hierarchy_iterator.cc
index eaa4d2fdde7..a33d636500f 100644
--- a/source/blender/io/common/intern/abstract_hierarchy_iterator.cc
+++ b/source/blender/io/common/intern/abstract_hierarchy_iterator.cc
@@ -400,7 +400,7 @@ static bool remove_weak_subtrees(const HierarchyContext *context,
void AbstractHierarchyIterator::export_graph_prune()
{
- /* Take a copy of the map so that we can modify while recursing. */
+ /* Take a copy of the map so that we can modify while recusing. */
ExportGraph unpruned_export_graph = export_graph_;
remove_weak_subtrees(HierarchyContext::root(), export_graph_, unpruned_export_graph);
}
diff --git a/source/blender/io/common/intern/object_identifier_test.cc b/source/blender/io/common/intern/object_identifier_test.cc
index 30e1e43d076..8d0800ce2cb 100644
--- a/source/blender/io/common/intern/object_identifier_test.cc
+++ b/source/blender/io/common/intern/object_identifier_test.cc
@@ -129,7 +129,7 @@ TEST_F(ObjectIdentifierOrderTest, duplicated_objects)
EXPECT_FALSE(id_different_dupli_b < id_dupli_b);
}
-TEST_F(ObjectIdentifierOrderTest, behaviour_as_map_keys)
+TEST_F(ObjectIdentifierOrderTest, behavior_as_map_keys)
{
ObjectIdentifier id_root = ObjectIdentifier::for_graph_root();
ObjectIdentifier id_another_root = ObjectIdentifier::for_graph_root();
diff --git a/source/blender/io/usd/CMakeLists.txt b/source/blender/io/usd/CMakeLists.txt
index 79b15c60b94..6ea30f48a13 100644
--- a/source/blender/io/usd/CMakeLists.txt
+++ b/source/blender/io/usd/CMakeLists.txt
@@ -30,6 +30,9 @@ if(WIN32)
endif()
add_definitions(-DPXR_STATIC)
+# USD headers use deprecated TBB headers, silence warning.
+add_definitions(-DTBB_SUPPRESS_DEPRECATED_MESSAGES=1)
+
set(INC
.
../common
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 263ce2203e9..9d01617905f 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -24,6 +24,7 @@
#pragma once
+#include "DNA_ID_enums.h"
#include "DNA_defs.h"
#include "DNA_listBase.h"
@@ -193,6 +194,10 @@ enum {
IDOVERRIDE_LIBRARY_FLAG_MANDATORY = 1 << 0,
/** User cannot change that override operation. */
IDOVERRIDE_LIBRARY_FLAG_LOCKED = 1 << 1,
+
+ /** For overrides of ID pointers: this override still matches (follows) the hierarchy of the
+ * reference linked data. */
+ IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE = 1 << 8,
};
/** A single overridden property, contain all operations on this one. */
@@ -254,7 +259,7 @@ typedef struct IDOverrideLibrary {
/**
* ID is the first thing included in all serializable types. It
* provides a common handle to place all data in double-linked lists.
- * */
+ */
/* 2 characters for ID code and 64 for actual name */
#define MAX_ID_NAME 66
@@ -363,13 +368,6 @@ typedef struct Library {
short versionfile, subversionfile;
} Library;
-enum eIconSizes {
- ICON_SIZE_ICON = 0,
- ICON_SIZE_PREVIEW = 1,
-
- NUM_ICON_SIZES,
-};
-
/* for PreviewImage->flag */
enum ePreviewImage_Flag {
PRV_CHANGED = (1 << 0),
@@ -407,87 +405,6 @@ typedef struct PreviewImage {
BLI_assert((prv)->tag & PRV_TAG_DEFFERED), \
(void *)((prv) + 1))
-/**
- * Defines for working with IDs.
- *
- * The tags represent types! This is a dirty way of enabling RTTI. The
- * sig_byte end endian defines aren't really used much.
- */
-
-#ifdef __BIG_ENDIAN__
-/* big endian */
-# define MAKE_ID2(c, d) ((c) << 8 | (d))
-#else
-/* little endian */
-# define MAKE_ID2(c, d) ((d) << 8 | (c))
-#endif
-
-/**
- * ID from database.
- *
- * Written to #BHead.code (for file IO)
- * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro).
- */
-typedef enum ID_Type {
- ID_SCE = MAKE_ID2('S', 'C'), /* Scene */
- ID_LI = MAKE_ID2('L', 'I'), /* Library */
- ID_OB = MAKE_ID2('O', 'B'), /* Object */
- ID_ME = MAKE_ID2('M', 'E'), /* Mesh */
- ID_CU = MAKE_ID2('C', 'U'), /* Curve */
- ID_MB = MAKE_ID2('M', 'B'), /* MetaBall */
- ID_MA = MAKE_ID2('M', 'A'), /* Material */
- ID_TE = MAKE_ID2('T', 'E'), /* Tex (Texture) */
- ID_IM = MAKE_ID2('I', 'M'), /* Image */
- ID_LT = MAKE_ID2('L', 'T'), /* Lattice */
- ID_LA = MAKE_ID2('L', 'A'), /* Light */
- ID_CA = MAKE_ID2('C', 'A'), /* Camera */
- ID_IP = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */
- ID_KE = MAKE_ID2('K', 'E'), /* Key (shape key) */
- ID_WO = MAKE_ID2('W', 'O'), /* World */
- ID_SCR = MAKE_ID2('S', 'R'), /* Screen */
- ID_VF = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */
- ID_TXT = MAKE_ID2('T', 'X'), /* Text */
- ID_SPK = MAKE_ID2('S', 'K'), /* Speaker */
- ID_SO = MAKE_ID2('S', 'O'), /* Sound */
- ID_GR = MAKE_ID2('G', 'R'), /* Group */
- ID_AR = MAKE_ID2('A', 'R'), /* bArmature */
- ID_AC = MAKE_ID2('A', 'C'), /* bAction */
- ID_NT = MAKE_ID2('N', 'T'), /* bNodeTree */
- ID_BR = MAKE_ID2('B', 'R'), /* Brush */
- ID_PA = MAKE_ID2('P', 'A'), /* ParticleSettings */
- ID_GD = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */
- ID_WM = MAKE_ID2('W', 'M'), /* WindowManager */
- ID_MC = MAKE_ID2('M', 'C'), /* MovieClip */
- ID_MSK = MAKE_ID2('M', 'S'), /* Mask */
- ID_LS = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */
- ID_PAL = MAKE_ID2('P', 'L'), /* Palette */
- ID_PC = MAKE_ID2('P', 'C'), /* PaintCurve */
- ID_CF = MAKE_ID2('C', 'F'), /* CacheFile */
- ID_WS = MAKE_ID2('W', 'S'), /* WorkSpace */
- ID_LP = MAKE_ID2('L', 'P'), /* LightProbe */
- ID_HA = MAKE_ID2('H', 'A'), /* Hair */
- ID_PT = MAKE_ID2('P', 'T'), /* PointCloud */
- ID_VO = MAKE_ID2('V', 'O'), /* Volume */
- ID_SIM = MAKE_ID2('S', 'I'), /* Simulation (currently unused) */
-} ID_Type;
-
-/* Only used as 'placeholder' in .blend files for directly linked data-blocks. */
-#define ID_LINK_PLACEHOLDER MAKE_ID2('I', 'D') /* (internal use only) */
-
-/* Deprecated. */
-#define ID_SCRN MAKE_ID2('S', 'N')
-
-/* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
-#define ID_SEQ MAKE_ID2('S', 'Q')
-/* constraint */
-#define ID_CO MAKE_ID2('C', 'O')
-/* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */
-#define ID_PO MAKE_ID2('A', 'C')
-/* used in outliner... */
-#define ID_NLA MAKE_ID2('N', 'L')
-/* fluidsim Ipo */
-#define ID_FLUIDSIM MAKE_ID2('F', 'S')
-
#define ID_FAKE_USERS(id) ((((const ID *)id)->flag & LIB_FAKEUSER) ? 1 : 0)
#define ID_REAL_USERS(id) (((const ID *)id)->us - ID_FAKE_USERS(id))
#define ID_EXTRA_USERS(id) (((const ID *)id)->tag & LIB_TAG_EXTRAUSER ? 1 : 0)
@@ -510,6 +427,10 @@ typedef enum ID_Type {
(ID_IS_LINKED(_id) && !ID_MISSING(_id) && (((const ID *)(_id))->tag & LIB_TAG_EXTERN) != 0 && \
(BKE_idtype_get_info_from_id((const ID *)(_id))->flags & IDTYPE_FLAGS_NO_LIBLINKING) == 0)
+/* NOTE: The three checks below do not take into account whether given ID is linked or not (when
+ * chaining overrides over several libraries). User must ensure the ID is not linked itself
+ * currently. */
+/* TODO: add `_EDITABLE` versions of those macros (that would check if ID is linked or not)? */
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id) \
(((const ID *)(_id))->override_library != NULL && \
((const ID *)(_id))->override_library->reference != NULL)
@@ -546,7 +467,7 @@ typedef enum ID_Type {
} \
((void)0)
-/** id->flag (persitent). */
+/** id->flag (persistent). */
enum {
/** Don't delete the datablock even if unused. */
LIB_FAKEUSER = 1 << 9,
@@ -613,7 +534,7 @@ enum {
/* tag data-block as having an extra user. */
LIB_TAG_EXTRAUSER = 1 << 2,
- /* tag data-block as having actually increased usercount for the extra virtual user. */
+ /* tag data-block as having actually increased user-count for the extra virtual user. */
LIB_TAG_EXTRAUSER_SET = 1 << 7,
/* RESET_AFTER_USE tag newly duplicated/copied IDs.
@@ -685,7 +606,7 @@ typedef enum IDRecalcFlag {
* redraw update in that case. */
/* Selection of the ID itself or its components (for example, vertices) did
- * change, and all the drawing data is to eb updated. */
+ * change, and all the drawing data is to be updated. */
ID_RECALC_SELECT = (1 << 9),
/* Flags on the base did change, and is to be copied onto all the copies of
* corresponding objects. */
diff --git a/source/blender/makesdna/DNA_ID_enums.h b/source/blender/makesdna/DNA_ID_enums.h
new file mode 100644
index 00000000000..04cbf51dd62
--- /dev/null
+++ b/source/blender/makesdna/DNA_ID_enums.h
@@ -0,0 +1,118 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup DNA
+ * \brief Enumerations for `DNA_ID.h`.
+ */
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum eIconSizes {
+ ICON_SIZE_ICON = 0,
+ ICON_SIZE_PREVIEW = 1,
+
+ NUM_ICON_SIZES,
+};
+
+/**
+ * Defines for working with IDs.
+ *
+ * The tags represent types! This is a dirty way of enabling RTTI. The
+ * sig_byte end endian defines aren't really used much.
+ */
+
+#ifdef __BIG_ENDIAN__
+/* big endian */
+# define MAKE_ID2(c, d) ((c) << 8 | (d))
+#else
+/* little endian */
+# define MAKE_ID2(c, d) ((d) << 8 | (c))
+#endif
+
+/**
+ * ID from database.
+ *
+ * Written to #BHead.code (for file IO)
+ * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro).
+ */
+typedef enum ID_Type {
+ ID_SCE = MAKE_ID2('S', 'C'), /* Scene */
+ ID_LI = MAKE_ID2('L', 'I'), /* Library */
+ ID_OB = MAKE_ID2('O', 'B'), /* Object */
+ ID_ME = MAKE_ID2('M', 'E'), /* Mesh */
+ ID_CU = MAKE_ID2('C', 'U'), /* Curve */
+ ID_MB = MAKE_ID2('M', 'B'), /* MetaBall */
+ ID_MA = MAKE_ID2('M', 'A'), /* Material */
+ ID_TE = MAKE_ID2('T', 'E'), /* Tex (Texture) */
+ ID_IM = MAKE_ID2('I', 'M'), /* Image */
+ ID_LT = MAKE_ID2('L', 'T'), /* Lattice */
+ ID_LA = MAKE_ID2('L', 'A'), /* Light */
+ ID_CA = MAKE_ID2('C', 'A'), /* Camera */
+ ID_IP = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */
+ ID_KE = MAKE_ID2('K', 'E'), /* Key (shape key) */
+ ID_WO = MAKE_ID2('W', 'O'), /* World */
+ ID_SCR = MAKE_ID2('S', 'R'), /* Screen */
+ ID_VF = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */
+ ID_TXT = MAKE_ID2('T', 'X'), /* Text */
+ ID_SPK = MAKE_ID2('S', 'K'), /* Speaker */
+ ID_SO = MAKE_ID2('S', 'O'), /* Sound */
+ ID_GR = MAKE_ID2('G', 'R'), /* Collection */
+ ID_AR = MAKE_ID2('A', 'R'), /* bArmature */
+ ID_AC = MAKE_ID2('A', 'C'), /* bAction */
+ ID_NT = MAKE_ID2('N', 'T'), /* bNodeTree */
+ ID_BR = MAKE_ID2('B', 'R'), /* Brush */
+ ID_PA = MAKE_ID2('P', 'A'), /* ParticleSettings */
+ ID_GD = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */
+ ID_WM = MAKE_ID2('W', 'M'), /* WindowManager */
+ ID_MC = MAKE_ID2('M', 'C'), /* MovieClip */
+ ID_MSK = MAKE_ID2('M', 'S'), /* Mask */
+ ID_LS = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */
+ ID_PAL = MAKE_ID2('P', 'L'), /* Palette */
+ ID_PC = MAKE_ID2('P', 'C'), /* PaintCurve */
+ ID_CF = MAKE_ID2('C', 'F'), /* CacheFile */
+ ID_WS = MAKE_ID2('W', 'S'), /* WorkSpace */
+ ID_LP = MAKE_ID2('L', 'P'), /* LightProbe */
+ ID_HA = MAKE_ID2('H', 'A'), /* Hair */
+ ID_PT = MAKE_ID2('P', 'T'), /* PointCloud */
+ ID_VO = MAKE_ID2('V', 'O'), /* Volume */
+ ID_SIM = MAKE_ID2('S', 'I'), /* Simulation (geometry node groups) */
+} ID_Type;
+
+/* Only used as 'placeholder' in .blend files for directly linked data-blocks. */
+#define ID_LINK_PLACEHOLDER MAKE_ID2('I', 'D') /* (internal use only) */
+
+/* Deprecated. */
+#define ID_SCRN MAKE_ID2('S', 'N')
+
+/* NOTE: Fake IDs, needed for `g.sipo->blocktype` or outliner. */
+#define ID_SEQ MAKE_ID2('S', 'Q')
+/* constraint */
+#define ID_CO MAKE_ID2('C', 'O')
+/* pose (action channel, used to be ID_AC in code, so we keep code for backwards compatible). */
+#define ID_PO MAKE_ID2('A', 'C')
+/* used in outliner... */
+#define ID_NLA MAKE_ID2('N', 'L')
+/* fluidsim Ipo */
+#define ID_FLUIDSIM MAKE_ID2('F', 'S')
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index 790a7a36288..27374c451e9 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -290,13 +290,13 @@ typedef struct bPoseChannel {
/** Matrix result of loc/quat/size, and where we put deform in, see next line */
float chan_mat[4][4];
/**
- * Constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat
+ * Constraints accumulate here. in the end, `pose_mat = bone->arm_mat * chan_mat`
* this matrix is object space.
*/
float pose_mat[4][4];
/** For display, pose_mat with bone length applied. */
float disp_mat[4][4];
- /** For display, pose_mat with bone length applied and translated to tai.l*/
+ /** For display, pose_mat with bone length applied and translated to tail. */
float disp_tail_mat[4][4];
/**
* Inverse result of constraints.
@@ -653,7 +653,7 @@ typedef enum eActionGroup_Flag {
* that affects a group of related settings (as defined by the user).
*/
typedef struct bAction {
- /** ID-serialisation for relinking. */
+ /** ID-serialization for relinking. */
ID id;
/** Function-curves (FCurve). */
@@ -676,6 +676,8 @@ typedef struct bAction {
*/
int idroot;
char _pad[4];
+
+ PreviewImage *preview;
} bAction;
/* Flags for the action */
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index 1eafa655195..dffb3588de4 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -57,6 +57,13 @@ typedef struct FModifier {
short type;
/** Settings for the modifier. */
short flag;
+ /**
+ * Expansion state for the modifier panel and its sub-panels, stored as a bit-field
+ * in depth-first order. (Maximum of `sizeof(short)` total panels).
+ */
+ short ui_expand_flag;
+
+ char _pad[6];
/** The amount that the modifier should influence the value. */
float influence;
@@ -82,7 +89,7 @@ typedef enum eFModifier_Types {
FMODIFIER_TYPE_ENVELOPE = 3,
FMODIFIER_TYPE_CYCLES = 4,
FMODIFIER_TYPE_NOISE = 5,
- /** Unimplemented - for applying: fft, high/low pass filters, etc. */
+ /** Unimplemented - for applying: FFT, high/low pass filters, etc. */
FMODIFIER_TYPE_FILTER = 6,
FMODIFIER_TYPE_PYTHON = 7,
FMODIFIER_TYPE_LIMITS = 8,
@@ -96,8 +103,10 @@ typedef enum eFModifier_Types {
typedef enum eFModifier_Flags {
/** Modifier is not able to be evaluated for some reason, and should be skipped (internal). */
FMODIFIER_FLAG_DISABLED = (1 << 0),
- /** Modifier's data is expanded (in UI). */
+#ifdef DNA_DEPRECATED_ALLOW
+ /** Modifier's data is expanded (in UI). Deprecated, use `ui_expand_flag`. */
FMODIFIER_FLAG_EXPANDED = (1 << 1),
+#endif
/** Modifier is active one (in UI) for editing purposes. */
FMODIFIER_FLAG_ACTIVE = (1 << 2),
/** User wants modifier to be skipped. */
@@ -438,9 +447,10 @@ typedef enum eDriverVar_Types {
/** 'final' transform for object/bones */
DVAR_TYPE_TRANSFORM_CHAN,
- /** Maximum number of variable types.
+ /**
+ * Maximum number of variable types.
*
- * \note This must always be th last item in this list,
+ * \note This must always be the last item in this list,
* so add new types above this line.
*/
MAX_DVAR_TYPES,
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index de2d56bb264..09304ce09f2 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -42,23 +42,23 @@ struct AnimData;
*/
typedef struct Bone {
- /** Next/prev elements within this list. */
+ /** Next/previous elements within this list. */
struct Bone *next, *prev;
/** User-Defined Properties on this Bone. */
IDProperty *prop;
- /** Parent (ik parent if appropriate flag is set. */
+ /** Parent (IK parent if appropriate flag is set). */
struct Bone *parent;
- /** Children . */
+ /** Children. */
ListBase childbase;
- /** Name of the bone - must be unique within the armature, MAXBONENAME. */
+ /** Name of the bone - must be unique within the armature, MAXBONENAME. */
char name[64];
- /** roll is input for editmode, length calculated. */
+ /** Roll is input for edit-mode, length calculated. */
float roll;
float head[3];
- /** head/tail and roll in Bone Space . */
+ /** Head/tail and roll in Bone Space. */
float tail[3];
- /** rotation derived from head/tail/roll. */
+ /** Rotation derived from head/tail/roll. */
float bone_mat[3][3];
int flag;
@@ -67,21 +67,24 @@ typedef struct Bone {
char _pad[7];
float arm_head[3];
- /** head/tail in Armature Space (rest pos). */
+ /** Head/tail in Armature Space (rest pose). */
float arm_tail[3];
- /** matrix: (bonemat(b)+head(b))*arm_mat(b-1), rest po.s*/
+ /** Matrix: `(bonemat(b)+head(b))*arm_mat(b-1)`, rest pose. */
float arm_mat[4][4];
- /** Roll in Armature Space (rest pos). */
+ /** Roll in Armature Space (rest pose). */
float arm_roll;
- /** dist, weight: for non-deformgroup deforms. */
+ /** dist, weight: for non-deformgroup deforms. */
float dist, weight;
- /** width: for block bones. keep in this order, transform!. */
+ /** width: for block bones. keep in this order, transform!. */
float xwidth, length, zwidth;
- /** Radius for head/tail sphere, defining deform as well, parent->rad_tip overrides rad_head. */
+ /**
+ * Radius for head/tail sphere, defining deform as well,
+ * `parent->rad_tip` overrides `rad_head`.
+ */
float rad_head, rad_tail;
- /** Curved bones settings - these define the "restpose" for a curved bone. */
+ /** Curved bones settings - these define the "rest-pose" for a curved bone. */
float roll1, roll2;
float curve_in_x, curve_in_y;
float curve_out_x, curve_out_y;
@@ -90,11 +93,11 @@ typedef struct Bone {
float scale_in_x, scale_in_y;
float scale_out_x, scale_out_y;
- /** patch for upward compat, UNUSED!. */
+ /** Patch for upward compatibility, UNUSED! */
float size[3];
/** Layers that bone appears on. */
int layer;
- /** for B-bones. */
+ /** For B-bones. */
short segments;
/** Type of next/prev bone handles. */
@@ -126,7 +129,7 @@ typedef struct bArmature {
/** Active bone. */
Bone *act_bone;
- /** Active editbone (in editmode). */
+ /** Active edit-bone (in edit-mode). */
struct EditBone *act_edbone;
/** ID data is older than edit-mode data (TODO: move to edit-mode struct). */
diff --git a/source/blender/makesdna/DNA_boid_types.h b/source/blender/makesdna/DNA_boid_types.h
index 7e010f27ce6..882d4eb1b3b 100644
--- a/source/blender/makesdna/DNA_boid_types.h
+++ b/source/blender/makesdna/DNA_boid_types.h
@@ -35,7 +35,7 @@ typedef enum eBoidRuleType {
eBoidRuleType_Goal = 1,
/** get away from assigned object or loudest assigned signal source */
eBoidRuleType_Avoid = 2,
- /** manoeuver to avoid collisions with other boids and deflector object in near future */
+ /** Maneuver to avoid collisions with other boids and deflector object in near future. */
eBoidRuleType_AvoidCollision = 3,
/** keep from going through other boids */
eBoidRuleType_Separate = 4,
diff --git a/source/blender/makesdna/DNA_brush_enums.h b/source/blender/makesdna/DNA_brush_enums.h
index f12934c9104..093a1a00ece 100644
--- a/source/blender/makesdna/DNA_brush_enums.h
+++ b/source/blender/makesdna/DNA_brush_enums.h
@@ -75,6 +75,10 @@ typedef enum eGPDbrush_Flag {
GP_BRUSH_USE_STRENGTH_PRESSURE = (1 << 1),
/* brush use pressure for alpha factor */
GP_BRUSH_USE_JITTER_PRESSURE = (1 << 2),
+ /* Disable automatic zoom for filling. */
+ GP_BRUSH_FILL_FIT_DISABLE = (1 << 3),
+ /* Show extend fill help lines. */
+ GP_BRUSH_FILL_SHOW_EXTENDLINES = (1 << 4),
/* fill hide transparent */
GP_BRUSH_FILL_HIDE = (1 << 6),
/* show fill help lines */
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 4b020019062..a11e7d77c67 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -50,7 +50,8 @@ typedef struct BrushClone {
typedef struct BrushGpencilSettings {
/** Amount of smoothing to apply to newly created strokes. */
float draw_smoothfac;
- char _pad2[4];
+ /** Fill zoom factor */
+ float fill_factor;
/** Amount of alpha strength to apply to newly created strokes. */
float draw_strength;
/** Amount of jitter to apply to newly created strokes. */
@@ -75,8 +76,8 @@ typedef struct BrushGpencilSettings {
float fill_threshold;
/** Number of pixel to consider the leak is too small (x 2). */
short fill_leak;
- /** Fill zoom factor */
- short fill_factor;
+ char _pad2[2];
+
int flag2;
/** Number of simplify steps. */
@@ -130,6 +131,10 @@ typedef struct BrushGpencilSettings {
/** Randomness for Value. */
float random_value;
+ /** Factor to extend stroke extremes using fill tool. */
+ float fill_extend_fac;
+ char _pad3[4];
+
struct CurveMapping *curve_sensitivity;
struct CurveMapping *curve_strength;
struct CurveMapping *curve_jitter;
@@ -286,7 +291,7 @@ typedef struct Brush {
int curve_preset;
- /* Maximun distance to search fake neighbors from a vertex. */
+ /* Maximum distance to search fake neighbors from a vertex. */
float disconnected_distance_max;
int deform_target;
diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h
index 467174c4f32..aae29e5fddc 100644
--- a/source/blender/makesdna/DNA_cloth_types.h
+++ b/source/blender/makesdna/DNA_cloth_types.h
@@ -52,7 +52,7 @@ typedef struct ClothSimSettings {
float Cvi;
/** Gravity/external force vector. */
float gravity[3];
- /** This is the duration of our time step, computed.. */
+ /** This is the duration of our time step, computed. */
float dt;
/** The mass of the entire cloth. */
float mass;
@@ -78,9 +78,9 @@ typedef struct ClothSimSettings {
float time_scale;
/** See SB. */
float maxgoal;
- /** Scaling of effector forces (see softbody_calc_forces)..*/
+ /** Scaling of effector forces (see #softbody_calc_forces). */
float eff_force_scale;
- /** Scaling of effector wind (see softbody_calc_forces).. */
+ /** Scaling of effector wind (see #softbody_calc_forces). */
float eff_wind_scale;
float sim_time_old;
float defgoal;
@@ -104,16 +104,19 @@ typedef struct ClothSimSettings {
float shrink_max;
/* Air pressure */
- /* The uniform pressure that is constanty applied to the mesh. Can be negative */
+ /** The uniform pressure that is constantly applied to the mesh. Can be negative. */
float uniform_pressure_force;
- /* User set volume. This is the volume the mesh wants to expand to (the equilibrium volume). */
+ /** User set volume. This is the volume the mesh wants to expand to (the equilibrium volume). */
float target_volume;
- /* The scaling factor to apply to the actual pressure.
- * pressure=( (current_volume/target_volume) - 1 + uniform_pressure_force) *
- * pressure_factor */
+ /**
+ * The scaling factor to apply to the actual pressure.
+ * `pressure = ((current_volume/target_volume) - 1 + uniform_pressure_force) * pressure_factor`
+ */
float pressure_factor;
- /* Density of the fluid inside or outside the object for use in the hydrostatic pressure
- * gradient. */
+ /**
+ * Density of the fluid inside or outside the object
+ * for use in the hydro-static pressure gradient.
+ */
float fluid_density;
short vgroup_pressure;
char _pad7[6];
@@ -166,9 +169,9 @@ typedef struct ClothSimSettings {
/** Mechanical damping of shear springs. */
float shear_damp;
- /** The maximum lenght an internal spring can have during creation. */
+ /** The maximum length an internal spring can have during creation. */
float internal_spring_max_length;
- /** How much the interal spring can diverge from the vertex normal during creation. */
+ /** How much the internal spring can diverge from the vertex normal during creation. */
float internal_spring_max_diversion;
/** Vertex group for scaling structural stiffness. */
short vgroup_intern;
diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h
index bcebbf32ebd..e4f6a1eea41 100644
--- a/source/blender/makesdna/DNA_color_types.h
+++ b/source/blender/makesdna/DNA_color_types.h
@@ -196,7 +196,7 @@ typedef struct ColorManagedViewSettings {
char look[64];
/** View transform which is being applied when displaying buffer on the screen. */
char view_transform[64];
- /** Fstop exposure. */
+ /** F-stop exposure. */
float exposure;
/** Post-display gamma transform. */
float gamma;
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index ddc1b3bd9d7..07fbf263d80 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -72,9 +72,9 @@ typedef struct bConstraint {
/** Constraint name, MAX_NAME. */
char name[64];
- /** Amount of influence exherted by constraint (0.0-1.0). */
+ /** Amount of influence exerted by constraint (0.0-1.0). */
float enforce;
- /** Point along subtarget bone where the actual target is. 0=head (default for all), 1=tail. */
+ /** Point along `subtarget` bone where the actual target is. 0=head (default for all), 1=tail. */
float headtail;
/* old animation system, deprecated for 2.5. */
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index 3bf58203bef..b3f0708539a 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -600,10 +600,10 @@ enum {
CU_CHINFO_BOLD = 1 << 0,
CU_CHINFO_ITALIC = 1 << 1,
CU_CHINFO_UNDERLINE = 1 << 2,
- /** wordwrap occurred here */
+ /** Word-wrap occurred here. */
CU_CHINFO_WRAP = 1 << 3,
CU_CHINFO_SMALLCAPS = 1 << 4,
- /** set at runtime, checks if case switching is needed */
+ /** Set at runtime, checks if case switching is needed. */
CU_CHINFO_SMALLCAPS_CHECK = 1 << 5,
/** Set at runtime, indicates char that doesn't fit in text boxes. */
CU_CHINFO_OVERFLOW = 1 << 6,
diff --git a/source/blender/makesdna/DNA_dynamicpaint_types.h b/source/blender/makesdna/DNA_dynamicpaint_types.h
index c8e09225432..e3dcd283efa 100644
--- a/source/blender/makesdna/DNA_dynamicpaint_types.h
+++ b/source/blender/makesdna/DNA_dynamicpaint_types.h
@@ -242,10 +242,12 @@ typedef struct DynamicPaintBrushSettings {
/** For fast RNA access. */
struct DynamicPaintModifierData *pmd;
- /* NOTE: Storing the particle system pointer here is very weak, as it prevents modfiers' data
+ /**
+ * \note Storing the particle system pointer here is very weak, as it prevents modifiers' data
* copying to be self-sufficient (extra external code needs to ensure the pointer remains valid
* when the modifier data is copied from one object to another). See e.g.
- * `BKE_object_copy_particlesystems` or `BKE_object_copy_modifier`. */
+ * `BKE_object_copy_particlesystems` or `BKE_object_copy_modifier`.
+ */
struct ParticleSystem *psys;
int flags;
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h
index fdb77bfd196..11d4ee1b2cd 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h
@@ -20,7 +20,7 @@
#pragma once
-/* Note that some struct members for colormapping and colorbands are not initialized here. */
+/* Note that some struct members for color-mapping and color-bands are not initialized here. */
/* Struct members on own line. */
/* clang-format off */
@@ -152,6 +152,7 @@
.factor_thickness = 0.0f, \
.factor_uvs = 0.0f, \
.noise_scale = 0.0f, \
+ .noise_offset = 0.0f, \
.step = 4, \
.layer_pass = 0, \
.seed = 1, \
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index 9ac40495887..b2d62e0a5f6 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -107,6 +107,8 @@ typedef struct NoiseGpencilModifierData {
float factor_uvs;
/** Noise Frequency scaling */
float noise_scale;
+ float noise_offset;
+ char _pad[4];
/** How many frames before recalculate randoms. */
int step;
/** Custom index for passes. */
@@ -180,7 +182,7 @@ typedef struct ThickGpencilModifierData {
int flag;
/** Relative thickness factor. */
float thickness_fac;
- /** Absolute thickness overide. */
+ /** Absolute thickness override. */
int thickness;
/** Custom index for passes. */
int layer_pass;
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 949b0bb5bf5..9d969a29add 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -45,6 +45,9 @@ struct MDeformVert;
#define GP_DEFAULT_CURVE_ERROR 0.1f
#define GP_DEFAULT_CURVE_EDIT_CORNER_ANGLE M_PI_2
+#define GPENCIL_MIN_FILL_FAC 0.05f
+#define GPENCIL_MAX_FILL_FAC 5.0f
+
/* ***************************************** */
/* GP Stroke Points */
@@ -99,7 +102,7 @@ typedef struct bGPDspoint {
bGPDspoint_Runtime runtime;
} bGPDspoint;
-/* bGPDspoint->flag */
+/** #bGPDspoint.flag */
typedef enum eGPDspoint_Flag {
/* stroke point is selected (for editing) */
GP_SPOINT_SELECT = (1 << 0),
@@ -141,7 +144,7 @@ typedef struct bGPDpalettecolor {
char _pad[6];
} bGPDpalettecolor;
-/* bGPDpalettecolor->flag */
+/** #bGPDpalettecolor.flag */
typedef enum eGPDpalettecolor_Flag {
/* color is active */
/* PC_COLOR_ACTIVE = (1 << 0), */ /* UNUSED */
@@ -168,7 +171,7 @@ typedef struct bGPDpalette {
char _pad[6];
} bGPDpalette;
-/* bGPDpalette->flag */
+/** #bGPDpalette.flag */
typedef enum eGPDpalette_Flag {
/* palette is active */
PL_PALETTE_ACTIVE = (1 << 0),
@@ -303,6 +306,10 @@ typedef struct bGPDstroke {
float uv_translation[2];
float uv_scale;
+ /** Stroke selection index.*/
+ int select_index;
+ char _pad4[4];
+
/** Vertex weight data. */
struct MDeformVert *dvert;
void *_pad3;
@@ -316,7 +323,7 @@ typedef struct bGPDstroke {
bGPDstroke_Runtime runtime;
} bGPDstroke;
-/* bGPDstroke->flag */
+/** #bGPDstroke.flag */
typedef enum eGPDstroke_Flag {
/* stroke is in 3d-space */
GP_STROKE_3DSPACE = (1 << 0),
@@ -344,19 +351,19 @@ typedef enum eGPDstroke_Flag {
GP_STROKE_ERASER = (1 << 15),
} eGPDstroke_Flag;
-/* bGPDstroke->caps */
+/** #bGPDstroke.caps */
typedef enum eGPDstroke_Caps {
/* type of extreme */
GP_STROKE_CAP_ROUND = 0,
GP_STROKE_CAP_FLAT = 1,
- /* Keeo last. */
+ /* Keep last. */
GP_STROKE_CAP_MAX,
} GPDstroke_Caps;
/* Arrows ----------------------- */
-/* bGPDataRuntime.arrowstyle */
+/** #bGPDataRuntime.arrowstyle */
typedef enum eGPDstroke_Arrowstyle {
GP_STROKE_ARROWSTYLE_NONE = 0,
GP_STROKE_ARROWSTYLE_SEGMENT = 2,
@@ -512,6 +519,11 @@ typedef struct bGPDlayer {
int act_mask;
char _pad2[4];
+ /** Layer transforms. */
+ float location[3], rotation[3], scale[3];
+ float layer_mat[4][4], layer_invmat[4][4];
+ char _pad3[4];
+
bGPDlayer_Runtime runtime;
} bGPDlayer;
@@ -545,13 +557,13 @@ typedef enum eGPDlayer_Flag {
GP_LAYER_IS_RULER = (1 << 14),
} eGPDlayer_Flag;
-/* bGPDlayer->onion_flag */
+/** #bGPDlayer.onion_flag */
typedef enum eGPDlayer_OnionFlag {
/* do onion skinning */
GP_LAYER_ONIONSKIN = (1 << 0),
} eGPDlayer_OnionFlag;
-/* layer blend_mode */
+/** #bGPDlayer.blend_mode */
typedef enum eGPLayerBlendModes {
eGplBlendMode_Regular = 0,
eGplBlendMode_HardLight = 1,
@@ -574,7 +586,9 @@ typedef struct bGPdata_Runtime {
/** Temp stroke used for drawing. */
struct bGPDstroke *sbuffer_gps;
- char _pad[2];
+ /** Animation playing flag. */
+ short playing;
+
/** Material index of the stroke. */
short matid;
@@ -691,13 +705,19 @@ typedef struct bGPdata {
/** Keyframe type for onion filter (eBezTriple_KeyframeType plus All option) */
short onion_keytype;
+ /** Stroke selection last index. Used to generate a unique selection index. */
+ int select_last_index;
+ char _pad3[4];
+
bGPgrid grid;
bGPdata_Runtime runtime;
} bGPdata;
-/* bGPdata->flag */
-/* NOTE: A few flags have been deprecated since early 2.5,
+/**
+ * #bGPdata.flag
+ *
+ * NOTE: A few flags have been deprecated since early 2.5,
* since they have been made redundant by interaction
* changes made during the porting process.
*/
@@ -802,8 +822,9 @@ typedef enum eGP_DrawMode {
/* Check if 'multiedit sessions' is enabled */
#define GPENCIL_MULTIEDIT_SESSIONS_ON(gpd) \
((gpd) && \
- ((gpd)->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE | \
- GP_DATA_STROKE_WEIGHTMODE | GP_DATA_STROKE_VERTEXMODE)) && \
+ ((gpd)->flag & \
+ (GP_DATA_STROKE_PAINTMODE | GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE | \
+ GP_DATA_STROKE_WEIGHTMODE | GP_DATA_STROKE_VERTEXMODE)) && \
((gpd)->flag & GP_DATA_STROKE_MULTIEDIT))
#define GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd) \
@@ -840,6 +861,8 @@ typedef enum eGP_DrawMode {
((flag & (GP_VERTEX_MASK_SELECTMODE_POINT | GP_VERTEX_MASK_SELECTMODE_STROKE | \
GP_VERTEX_MASK_SELECTMODE_SEGMENT)))
+#define GPENCIL_PLAY_ON(gpd) ((gpd) && ((gpd)->runtime.playing == 1))
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesdna/DNA_lightprobe_types.h b/source/blender/makesdna/DNA_lightprobe_types.h
index 3830919bfd3..48e3c44e2c9 100644
--- a/source/blender/makesdna/DNA_lightprobe_types.h
+++ b/source/blender/makesdna/DNA_lightprobe_types.h
@@ -141,7 +141,7 @@ typedef struct LightGridCache {
float visibility_bias, visibility_bleed, visibility_range, _pad5;
} LightGridCache;
-/* These are used as ubo data. They need to be aligned to size of vec4. */
+/* These are used as UBO data. They need to be aligned to size of vec4. */
BLI_STATIC_ASSERT_ALIGN(LightProbeCache, 16)
BLI_STATIC_ASSERT_ALIGN(LightGridCache, 16)
@@ -185,7 +185,7 @@ typedef struct LightCache {
} LightCache;
/* Bump the version number for lightcache data structure changes. */
-#define LIGHTCACHE_STATIC_VERSION 1
+#define LIGHTCACHE_STATIC_VERSION 2
/* LightCache->type */
enum {
diff --git a/source/blender/makesdna/DNA_mask_types.h b/source/blender/makesdna/DNA_mask_types.h
index 79ac655300e..8868ac1ea12 100644
--- a/source/blender/makesdna/DNA_mask_types.h
+++ b/source/blender/makesdna/DNA_mask_types.h
@@ -131,7 +131,7 @@ typedef struct MaskLayerShape {
/** U coordinate along spline segment and weight of this point. */
float *data;
- /** To ensure no buffer overruns's: alloc size is (tot_vert * MASK_OBJECT_SHAPE_ELEM_SIZE). */
+ /** To ensure no buffer overrun's: alloc size is `(tot_vert * MASK_OBJECT_SHAPE_ELEM_SIZE)`. */
int tot_vert;
/** Different flags of this point. */
int frame;
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 919bd18be80..884c2df6480 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -45,11 +45,11 @@ struct bNodeTree;
typedef struct TexPaintSlot {
/** Image to be painted on. */
struct Image *ima;
- /** Customdata index for uv layer, MAX_NAM.E*/
+ /** Custom-data index for uv layer, #MAX_NAME. */
char *uvname;
/** Do we have a valid image and UV map. */
int valid;
- /** Copy of node inteporlation setting. */
+ /** Copy of node interpolation setting. */
int interp;
} TexPaintSlot;
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index 780115a31be..05be31262a6 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -271,6 +271,9 @@ typedef struct MIntProperty {
typedef struct MStringProperty {
char s[255], s_len;
} MStringProperty;
+typedef struct MBoolProperty {
+ uint8_t b;
+} MBoolProperty;
/** \} */
@@ -414,7 +417,6 @@ typedef struct OrigSpaceLoop {
typedef struct FreestyleEdge {
char flag;
- char _pad[3];
} FreestyleEdge;
/** #FreestyleEdge.flag */
@@ -424,7 +426,6 @@ enum {
typedef struct FreestyleFace {
char flag;
- char _pad[3];
} FreestyleFace;
/** #FreestyleFace.flag */
diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h
index a827003a9a0..a991f654b09 100644
--- a/source/blender/makesdna/DNA_meta_types.h
+++ b/source/blender/makesdna/DNA_meta_types.h
@@ -128,9 +128,9 @@ typedef struct MetaBall {
/* ml->type */
#define MB_BALL 0
-#define MB_TUBEX 1 /* depercated */
-#define MB_TUBEY 2 /* depercated */
-#define MB_TUBEZ 3 /* depercated */
+#define MB_TUBEX 1 /* deprecated. */
+#define MB_TUBEY 2 /* deprecated. */
+#define MB_TUBEZ 3 /* deprecated. */
#define MB_TUBE 4
#define MB_PLANE 5
#define MB_ELIPSOID 6
diff --git a/source/blender/makesdna/DNA_modifier_defaults.h b/source/blender/makesdna/DNA_modifier_defaults.h
index 8601dcf76ac..9335c360363 100644
--- a/source/blender/makesdna/DNA_modifier_defaults.h
+++ b/source/blender/makesdna/DNA_modifier_defaults.h
@@ -236,7 +236,7 @@
.flag = 0, \
}
-/* Defines are scattered accross too many files, they need to be moved to DNA. */
+/* Defines are scattered across too many files, they need to be moved to DNA. */
#if 0
#define _DNA_DEFAULT_DataTransferModifierData \
{ \
@@ -440,7 +440,7 @@
.renderlvl = 0, \
.totlvl = 0, \
.flags = eMultiresModifierFlag_UseCrease | eMultiresModifierFlag_ControlEdges, \
- .uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_CORNERS, \
+ .uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES, \
.quality = 4, \
.boundary_smooth = SUBSURF_BOUNDARY_SMOOTH_ALL, \
}
@@ -622,7 +622,7 @@
.levels = 1, \
.renderLevels = 2, \
.flags = eSubsurfModifierFlag_UseCrease | eSubsurfModifierFlag_ControlEdges, \
- .uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_CORNERS, \
+ .uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES, \
.quality = 3, \
.boundary_smooth = SUBSURF_BOUNDARY_SMOOTH_ALL, \
.emCache = NULL, \
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 3de4299e0bd..dbcb6ce45ea 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -984,10 +984,12 @@ enum {
typedef struct ParticleSystemModifierData {
ModifierData modifier;
- /* NOTE: Storing the particle system pointer here is very weak, as it prevents modfiers' data
+ /**
+ * \note Storing the particle system pointer here is very weak, as it prevents modifiers' data
* copying to be self-sufficient (extra external code needs to ensure the pointer remains valid
* when the modifier data is copied from one object to another). See e.g.
- * `BKE_object_copy_particlesystems` or `BKE_object_copy_modifier`. */
+ * `BKE_object_copy_particlesystems` or `BKE_object_copy_modifier`.
+ */
struct ParticleSystem *psys;
/** Final Mesh - its topology may differ from orig mesh. */
struct Mesh *mesh_final;
@@ -1228,12 +1230,14 @@ typedef struct SolidifyModifierData {
char defgrp_name[64];
char shell_defgrp_name[64];
char rim_defgrp_name[64];
- /** New surface offset leve.l*/
+ /** New surface offset level. */
float offset;
- /** Midpoint of the offset . */
+ /** Midpoint of the offset. */
float offset_fac;
- /** factor for the minimum weight to use when vgroups are used,
- * avoids 0.0 weights giving duplicate geometry */
+ /**
+ * Factor for the minimum weight to use when vertex-groups are used,
+ * avoids 0.0 weights giving duplicate geometry.
+ */
float offset_fac_vg;
/** Clamp offset based on surrounding geometry. */
float offset_clamp;
@@ -1717,7 +1721,7 @@ typedef enum eRemeshModifierMode {
typedef struct RemeshModifierData {
ModifierData modifier;
- /* floodfill option, controls how small components can be before they are removed */
+ /** Flood-fill option, controls how small components can be before they are removed. */
float threshold;
/* ratio between size of model and grid */
diff --git a/source/blender/makesdna/DNA_movieclip_types.h b/source/blender/makesdna/DNA_movieclip_types.h
index 11cdb48edf0..8e01a9e1f1f 100644
--- a/source/blender/makesdna/DNA_movieclip_types.h
+++ b/source/blender/makesdna/DNA_movieclip_types.h
@@ -144,19 +144,19 @@ typedef struct MovieClipScopes {
struct ImBuf *track_search;
/** #ImBuf displayed in track preview. */
struct ImBuf *track_preview;
- /** Sub-pizel position of marker in track ImBuf. */
+ /** Sub-pixel position of marker in track ImBuf. */
float track_pos[2];
/** Active track is disabled, special notifier should be drawn. */
short track_disabled;
/** Active track is locked, no transformation should be allowed. */
short track_locked;
- /** Frame number scopes are created for. */
- int framenr;
+ /** Frame number scopes are created for (measured in scene frames). */
+ int scene_framenr;
/** Track scopes are created for. */
struct MovieTrackingTrack *track;
/** Marker scopes are created for. */
struct MovieTrackingMarker *marker;
- /** Scale used for sliding from previewe area. */
+ /** Scale used for sliding from preview area. */
float slide_scale[2];
} MovieClipScopes;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 7d18ff3ed58..8b0bc235861 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -37,6 +37,7 @@ struct Collection;
struct ID;
struct Image;
struct ListBase;
+struct NodeTreeUIStorage;
struct bGPdata;
struct bNodeInstanceHash;
struct bNodeLink;
@@ -118,7 +119,9 @@ typedef struct bNodeSocket {
/* XXX deprecated, kept for forward compatibility */
short stack_type DNA_DEPRECATED;
char display_shape;
- char _pad[3];
+ char _pad[1];
+ /* Runtime-only cache of the number of input links, for multi-input sockets. */
+ short total_inputs;
/** Custom dynamic defined label, MAX_NAME. */
char label[64];
@@ -200,6 +203,8 @@ typedef enum eNodeSocketFlag {
SOCK_NO_INTERNAL_LINK = (1 << 9),
/** Draw socket in a more compact form. */
SOCK_COMPACT = (1 << 10),
+ /** Make the input socket accept multiple incoming links in the UI. */
+ SOCK_MULTI_INPUT = (1 << 11),
} eNodeSocketFlag;
/* limit data in bNode to what we want to see saved? */
@@ -389,13 +394,15 @@ typedef struct bNodeLink {
bNodeSocket *fromsock, *tosock;
int flag;
- char _pad[4];
+ /* A runtime storage for automatically sorted links to multi-input sockets. */
+ int multi_input_socket_index;
} bNodeLink;
/* link->flag */
#define NODE_LINKFLAG_HILITE (1 << 0) /* link has been successfully validated */
#define NODE_LINK_VALID (1 << 1)
-#define NODE_LINK_TEST (1 << 2) /* free test flag, undefined */
+#define NODE_LINK_TEST (1 << 2) /* free test flag, undefined */
+#define NODE_LINK_TEMP_HIGHLIGHT (1 << 3) /* Link is highlighted for picking. */
/* tree->edit_quality/tree->render_quality */
#define NTREE_QUALITY_HIGH 0
@@ -495,6 +502,8 @@ typedef struct bNodeTree {
int (*test_break)(void *);
void (*update_draw)(void *);
void *tbh, *prh, *sdh, *udh;
+
+ struct NodeTreeUIStorage *ui_storage;
} bNodeTree;
/* ntree->type, index */
@@ -549,7 +558,6 @@ typedef struct bNodeSocketValueFloat {
typedef struct bNodeSocketValueBoolean {
char value;
- char _pad[3];
} bNodeSocketValueBoolean;
typedef struct bNodeSocketValueVector {
@@ -829,7 +837,6 @@ typedef struct NodeColorspill {
typedef struct NodeDilateErode {
char falloff;
- char _pad[7];
} NodeDilateErode;
typedef struct NodeMask {
@@ -838,7 +845,6 @@ typedef struct NodeMask {
typedef struct NodeSetAlpha {
char mode;
- char _pad[7];
} NodeSetAlpha;
typedef struct NodeTexBase {
@@ -995,7 +1001,6 @@ typedef struct NodeTrackPosData {
typedef struct NodeTranslateData {
char wrap_axis;
char relative;
- char _pad[6];
} NodeTranslateData;
typedef struct NodePlaneTrackDeformData {
@@ -1074,7 +1079,6 @@ typedef struct NodeCryptomatte {
typedef struct NodeDenoise {
char hdr;
- char _pad[7];
} NodeDenoise;
typedef struct NodeAttributeCompare {
@@ -1089,14 +1093,13 @@ typedef struct NodeAttributeCompare {
} NodeAttributeCompare;
typedef struct NodeAttributeMath {
- /* e.g. NODE_MATH_ADD. */
+ /* NodeMathOperation. */
uint8_t operation;
/* GeometryNodeAttributeInputMode */
uint8_t input_type_a;
uint8_t input_type_b;
-
- char _pad[5];
+ uint8_t input_type_c;
} NodeAttributeMath;
typedef struct NodeAttributeMix {
@@ -1109,6 +1112,16 @@ typedef struct NodeAttributeMix {
uint8_t input_type_b;
} NodeAttributeMix;
+typedef struct NodeAttributeRandomize {
+ /* CustomDataType. */
+ uint8_t data_type;
+ /* AttributeDomain. */
+ uint8_t domain;
+ /* GeometryNodeAttributeRandomizeMode. */
+ uint8_t operation;
+ char _pad[1];
+} NodeAttributeRandomize;
+
typedef struct NodeAttributeVectorMath {
/* NodeVectorMathOperation */
uint8_t operation;
@@ -1117,8 +1130,6 @@ typedef struct NodeAttributeVectorMath {
uint8_t input_type_a;
uint8_t input_type_b;
uint8_t input_type_c;
-
- char _pad[4];
} NodeAttributeVectorMath;
typedef struct NodeAttributeColorRamp {
@@ -1129,6 +1140,10 @@ typedef struct NodeInputVector {
float vector[3];
} NodeInputVector;
+typedef struct NodeInputString {
+ char *string;
+} NodeInputString;
+
typedef struct NodeGeometryRotatePoints {
/* GeometryNodeRotatePointsType */
uint8_t type;
@@ -1145,35 +1160,72 @@ typedef struct NodeGeometryRotatePoints {
typedef struct NodeGeometryAlignRotationToVector {
/* GeometryNodeAlignRotationToVectorAxis */
uint8_t axis;
+ /* GeometryNodeAlignRotationToVectorPivotAxis */
+ uint8_t pivot_axis;
/* GeometryNodeAttributeInputMode */
uint8_t input_type_factor;
uint8_t input_type_vector;
-
- char _pad[5];
} NodeGeometryAlignRotationToVector;
typedef struct NodeGeometryPointScale {
/* GeometryNodeAttributeInputMode */
uint8_t input_type;
-
- char _pad[7];
} NodeGeometryPointScale;
typedef struct NodeGeometryPointTranslate {
/* GeometryNodeAttributeInputMode */
uint8_t input_type;
-
- char _pad[7];
} NodeGeometryPointTranslate;
typedef struct NodeGeometryObjectInfo {
/* GeometryNodeTransformSpace. */
uint8_t transform_space;
-
- char _pad[7];
} NodeGeometryObjectInfo;
+typedef struct NodeGeometryPointInstance {
+ /* GeometryNodePointInstanceType. */
+ uint8_t instance_type;
+ /* GeometryNodePointInstanceFlag. */
+ uint8_t flag;
+} NodeGeometryPointInstance;
+
+typedef struct NodeGeometryPointsToVolume {
+ /* GeometryNodePointsToVolumeResolutionMode */
+ uint8_t resolution_mode;
+ /* GeometryNodeAttributeInputMode */
+ uint8_t input_type_radius;
+} NodeGeometryPointsToVolume;
+
+typedef struct NodeGeometryCollectionInfo {
+ /* GeometryNodeTransformSpace. */
+ uint8_t transform_space;
+} NodeGeometryCollectionInfo;
+
+typedef struct NodeGeometryAttributeProximity {
+ /* GeometryNodeAttributeProximityTargetType. */
+ uint8_t target_geometry_element;
+} NodeGeometryAttributeProximity;
+
+typedef struct NodeGeometryVolumeToMesh {
+ /* VolumeToMeshResolutionMode */
+ uint8_t resolution_mode;
+} NodeGeometryVolumeToMesh;
+
+typedef struct NodeAttributeCombineXYZ {
+ /* GeometryNodeAttributeInputMode. */
+ uint8_t input_type_x;
+ uint8_t input_type_y;
+ uint8_t input_type_z;
+
+ char _pad[1];
+} NodeAttributeCombineXYZ;
+
+typedef struct NodeAttributeSeparateXYZ {
+ /* GeometryNodeAttributeInputMode. */
+ uint8_t input_type;
+} NodeAttributeSeparateXYZ;
+
/* script node mode */
#define NODE_SCRIPT_INTERNAL 0
#define NODE_SCRIPT_EXTERNAL 1
@@ -1181,7 +1233,7 @@ typedef struct NodeGeometryObjectInfo {
/* script node flag */
#define NODE_SCRIPT_AUTO_UPDATE 1
-/* ies node mode */
+/* IES node mode. */
#define NODE_IES_INTERNAL 0
#define NODE_IES_EXTERNAL 1
@@ -1369,7 +1421,7 @@ enum {
#define SHD_MATH_CLAMP 1
/* Math node operations. */
-enum {
+typedef enum NodeMathOperation {
NODE_MATH_ADD = 0,
NODE_MATH_SUBTRACT = 1,
NODE_MATH_MULTIPLY = 2,
@@ -1410,7 +1462,7 @@ enum {
NODE_MATH_PINGPONG = 37,
NODE_MATH_SMOOTH_MIN = 38,
NODE_MATH_SMOOTH_MAX = 39,
-};
+} NodeMathOperation;
/* Vector Math node operations. */
typedef enum NodeVectorMathOperation {
@@ -1505,7 +1557,7 @@ enum {
/* image */
#define CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT 1
-/* viewer and cmposite output */
+/* viewer and composite output. */
#define CMP_NODE_OUTPUT_IGNORE_ALPHA 1
/* Plane track deform node */
@@ -1561,6 +1613,12 @@ typedef enum NodeShaderOutputTarget {
/* Geometry Nodes */
+typedef enum GeometryNodeAttributeProximityTargetType {
+ GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS = 0,
+ GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_EDGES = 1,
+ GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES = 2,
+} GeometryNodeAttributeProximityTargetType;
+
/* Boolean Node */
typedef enum GeometryNodeBooleanOperation {
GEO_NODE_BOOLEAN_INTERSECT = 0,
@@ -1586,24 +1644,36 @@ typedef enum GeometryNodePointInstanceType {
GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION = 1,
} GeometryNodePointInstanceType;
+typedef enum GeometryNodePointInstanceFlag {
+ GEO_NODE_POINT_INSTANCE_WHOLE_COLLECTION = (1 << 0),
+} GeometryNodePointInstanceFlag;
+
typedef enum GeometryNodeAttributeInputMode {
GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE = 0,
GEO_NODE_ATTRIBUTE_INPUT_FLOAT = 1,
GEO_NODE_ATTRIBUTE_INPUT_VECTOR = 2,
GEO_NODE_ATTRIBUTE_INPUT_COLOR = 3,
GEO_NODE_ATTRIBUTE_INPUT_BOOLEAN = 4,
+ GEO_NODE_ATTRIBUTE_INPUT_INTEGER = 5,
} GeometryNodeAttributeInputMode;
-typedef enum GeometryNodePointDistributeMethod {
+typedef enum GeometryNodePointDistributeMode {
GEO_NODE_POINT_DISTRIBUTE_RANDOM = 0,
GEO_NODE_POINT_DISTRIBUTE_POISSON = 1,
-} GeometryNodePointDistributeMethod;
+} GeometryNodePointDistributeMode;
typedef enum GeometryNodeRotatePointsType {
GEO_NODE_POINT_ROTATE_TYPE_EULER = 0,
GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE = 1,
} GeometryNodeRotatePointsType;
+typedef enum GeometryNodeAttributeRandomizeMode {
+ GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE = 0,
+ GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD = 1,
+ GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT = 2,
+ GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY = 3,
+} GeometryNodeAttributeRandomizeMode;
+
typedef enum GeometryNodeRotatePointsSpace {
GEO_NODE_POINT_ROTATE_SPACE_OBJECT = 0,
GEO_NODE_POINT_ROTATE_SPACE_POINT = 1,
@@ -1615,11 +1685,23 @@ typedef enum GeometryNodeAlignRotationToVectorAxis {
GEO_NODE_ALIGN_ROTATION_TO_VECTOR_AXIS_Z = 2,
} GeometryNodeAlignRotationToVectorAxis;
+typedef enum GeometryNodeAlignRotationToVectorPivotAxis {
+ GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_AUTO = 0,
+ GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_X = 1,
+ GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_Y = 2,
+ GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_Z = 3,
+} GeometryNodeAlignRotationToVectorPivotAxis;
+
typedef enum GeometryNodeTransformSpace {
GEO_NODE_TRANSFORM_SPACE_ORIGINAL = 0,
GEO_NODE_TRANSFORM_SPACE_RELATIVE = 1,
} GeometryNodeTransformSpace;
+typedef enum GeometryNodePointsToVolumeResolutionMode {
+ GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_AMOUNT = 0,
+ GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_SIZE = 1,
+} GeometryNodePointsToVolumeResolutionMode;
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h
index 3bd11d02b7a..37013f5b4d6 100644
--- a/source/blender/makesdna/DNA_object_force_types.h
+++ b/source/blender/makesdna/DNA_object_force_types.h
@@ -224,7 +224,7 @@ typedef struct SoftBody {
* rather find them by name tag to find it -> jow20090613.
* MAX_VGROUP_NAME */
char namedVG_Mass[64];
- /** Softbody amount of gravitaion to apply. */
+ /** Softbody amount of gravitation to apply. */
float grav;
/** Friction to env. */
float mediafrict;
@@ -310,7 +310,7 @@ typedef struct SoftBody {
struct Collection *collision_group;
struct EffectorWeights *effector_weights;
- /* reverse esimated obmatrix .. no need to store in blend file .. how ever who cares */
+ /* Reverse estimated object-matrix (run-time data, no need to store in the file). */
float lcom[3];
float lrot[3][3];
float lscale[3][3];
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 8b13db8a012..5f414aa2bdd 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -38,6 +38,7 @@ extern "C" {
struct AnimData;
struct BoundBox;
+struct Curve;
struct FluidsimSettings;
struct GeometrySet;
struct Ipo;
@@ -186,6 +187,12 @@ typedef struct Object_Runtime {
*/
struct Mesh *object_as_temp_mesh;
+ /**
+ * This is a curve representation of corresponding object.
+ * It created when Python calls `object.to_curve()`.
+ */
+ struct Curve *object_as_temp_curve;
+
/** Runtime evaluated curve-specific data, not stored in the file. */
struct CurveCache *curve_cache;
@@ -623,7 +630,7 @@ enum {
*/
#define BA_TRANSFORM_LOCKED_IN_PLACE (1 << 7)
-#define BA_TRANSFORM_CHILD (1 << 8) /* child of a transformed object */
+#define BA_TRANSFORM_CHILD (1 << 8) /* child of a transformed object */
#define BA_TRANSFORM_PARENT (1 << 13) /* parent of a transformed object */
#define OB_FROMDUPLI (1 << 9)
diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h
index 8a8a40a5069..16129768b60 100644
--- a/source/blender/makesdna/DNA_outliner_types.h
+++ b/source/blender/makesdna/DNA_outliner_types.h
@@ -72,53 +72,55 @@ enum {
};
/** #TreeStoreElem.types */
-#define TSE_NLA 1 /* NO ID */
-#define TSE_NLA_ACTION 2
-#define TSE_DEFGROUP_BASE 3
-#define TSE_DEFGROUP 4
-#define TSE_BONE 5
-#define TSE_EBONE 6
-#define TSE_CONSTRAINT_BASE 7
-#define TSE_CONSTRAINT 8
-#define TSE_MODIFIER_BASE 9
-#define TSE_MODIFIER 10
-#define TSE_LINKED_OB 11
-/* #define TSE_SCRIPT_BASE 12 */ /* UNUSED */
-#define TSE_POSE_BASE 13
-#define TSE_POSE_CHANNEL 14
-#define TSE_ANIM_DATA 15
-#define TSE_DRIVER_BASE 16 /* NO ID */
-/* #define TSE_DRIVER 17 */ /* UNUSED */
+typedef enum eTreeStoreElemType {
+ TSE_NLA = 1, /* NO ID */
+ TSE_NLA_ACTION = 2,
+ TSE_DEFGROUP_BASE = 3,
+ TSE_DEFGROUP = 4,
+ TSE_BONE = 5,
+ TSE_EBONE = 6,
+ TSE_CONSTRAINT_BASE = 7,
+ TSE_CONSTRAINT = 8,
+ TSE_MODIFIER_BASE = 9,
+ TSE_MODIFIER = 10,
+ TSE_LINKED_OB = 11,
+ /* TSE_SCRIPT_BASE = 12, */ /* UNUSED */
+ TSE_POSE_BASE = 13,
+ TSE_POSE_CHANNEL = 14,
+ TSE_ANIM_DATA = 15,
+ TSE_DRIVER_BASE = 16, /* NO ID */
+ /* TSE_DRIVER = 17, */ /* UNUSED */
-#define TSE_PROXY 18
-#define TSE_R_LAYER_BASE 19
-#define TSE_R_LAYER 20
-/* #define TSE_R_PASS 21 */ /* UNUSED */
-#define TSE_LINKED_MAT 22
-/* NOTE, is used for light group */
-#define TSE_LINKED_LAMP 23
-#define TSE_POSEGRP_BASE 24
-#define TSE_POSEGRP 25
-#define TSE_SEQUENCE 26 /* NO ID */
-#define TSE_SEQ_STRIP 27 /* NO ID */
-#define TSE_SEQUENCE_DUP 28 /* NO ID */
-#define TSE_LINKED_PSYS 29
-#define TSE_RNA_STRUCT 30 /* NO ID */
-#define TSE_RNA_PROPERTY 31 /* NO ID */
-#define TSE_RNA_ARRAY_ELEM 32 /* NO ID */
-#define TSE_NLA_TRACK 33 /* NO ID */
-#define TSE_KEYMAP 34 /* NO ID */
-#define TSE_KEYMAP_ITEM 35 /* NO ID */
-#define TSE_ID_BASE 36 /* NO ID */
-#define TSE_GP_LAYER 37 /* NO ID */
-#define TSE_LAYER_COLLECTION 38
-#define TSE_SCENE_COLLECTION_BASE 39
-#define TSE_VIEW_COLLECTION_BASE 40
-#define TSE_SCENE_OBJECTS_BASE 41
-#define TSE_GPENCIL_EFFECT_BASE 42
-#define TSE_GPENCIL_EFFECT 43
-#define TSE_LIBRARY_OVERRIDE_BASE 44
-#define TSE_LIBRARY_OVERRIDE 45
+ TSE_PROXY = 18,
+ TSE_R_LAYER_BASE = 19,
+ TSE_R_LAYER = 20,
+ /* TSE_R_PASS = 21, */ /* UNUSED */
+ /* TSE_LINKED_MAT = 22, */
+ /* NOTE, is used for light group */
+ /* TSE_LINKED_LAMP = 23, */
+ TSE_POSEGRP_BASE = 24,
+ TSE_POSEGRP = 25,
+ TSE_SEQUENCE = 26, /* NO ID */
+ TSE_SEQ_STRIP = 27, /* NO ID */
+ TSE_SEQUENCE_DUP = 28, /* NO ID */
+ TSE_LINKED_PSYS = 29,
+ TSE_RNA_STRUCT = 30, /* NO ID */
+ TSE_RNA_PROPERTY = 31, /* NO ID */
+ TSE_RNA_ARRAY_ELEM = 32, /* NO ID */
+ TSE_NLA_TRACK = 33, /* NO ID */
+ /* TSE_KEYMAP = 34, */ /* UNUSED */
+ /* TSE_KEYMAP_ITEM = 35, */ /* UNUSED */
+ TSE_ID_BASE = 36, /* NO ID */
+ TSE_GP_LAYER = 37, /* NO ID */
+ TSE_LAYER_COLLECTION = 38,
+ TSE_SCENE_COLLECTION_BASE = 39,
+ TSE_VIEW_COLLECTION_BASE = 40,
+ TSE_SCENE_OBJECTS_BASE = 41,
+ TSE_GPENCIL_EFFECT_BASE = 42,
+ TSE_GPENCIL_EFFECT = 43,
+ TSE_LIBRARY_OVERRIDE_BASE = 44,
+ TSE_LIBRARY_OVERRIDE = 45,
+} eTreeStoreElemType;
/** Check whether given #TreeStoreElem should have a real ID in #TreeStoreElem.id member. */
#define TSE_IS_REAL_ID(_tse) \
@@ -132,8 +134,6 @@ enum {
TSE_RNA_STRUCT, \
TSE_RNA_PROPERTY, \
TSE_RNA_ARRAY_ELEM, \
- TSE_KEYMAP, \
- TSE_KEYMAP_ITEM, \
TSE_ID_BASE, \
TSE_GP_LAYER))
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index 10fcca734b2..cc40e26b92b 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -118,10 +118,10 @@ typedef struct ParticleData {
/** Boids data. */
BoidParticle *boid;
- /** Amount of hair or keyed key.s*/
+ /** Amount of hair or keyed keys. */
int totkey;
- /** Dietime is not necessarily time+lifetime as. */
+ /** Die-time is not necessarily time+lifetime as. */
float time, lifetime;
/** Particles can die unnaturally (collision). */
float dietime;
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h
index 48f183e1e28..740dc35517a 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -45,7 +45,7 @@ typedef struct RigidBodyWorld_Shared {
struct ListBase ptcaches;
/* References to Physics Sim objects. Exist at runtime only ---------------------- */
- /** Physics sim world (i.e. btDiscreteDynamicsWorld). */
+ /** Physics sim world (i.e. #btDiscreteDynamicsWorld). */
void *physics_world;
} RigidBodyWorld_Shared;
@@ -63,7 +63,7 @@ typedef struct RigidBodyWorld {
/** Array to access group objects by index, only used at runtime. */
struct Object **objects;
- /** Group containing objects to use for Rigid Body Constraint.s*/
+ /** Group containing objects to use for Rigid Body Constraints. */
struct Collection *constraints;
char _pad[4];
@@ -72,19 +72,19 @@ typedef struct RigidBodyWorld {
/** This pointer is shared between all evaluated copies. */
struct RigidBodyWorld_Shared *shared;
- /** Moved to shared->pointcache. */
+ /** Moved to `shared->pointcache`. */
struct PointCache *pointcache DNA_DEPRECATED;
- /** Moved to shared->ptcaches. */
+ /** Moved to `shared->ptcaches`. */
struct ListBase ptcaches DNA_DEPRECATED;
/** Number of objects in rigid body group. */
int numbodies;
- /** Number of simulation substeps steps taken per frame. */
+ /** Number of simulation sub-steps steps taken per frame. */
short substeps_per_frame;
/** Number of constraint solver iterations made per simulation step. */
short num_solver_iterations;
- /** (eRigidBodyWorld_Flag) settings for this RigidBodyWorld. */
+ /** (#eRigidBodyWorld_Flag) settings for this RigidBodyWorld. */
int flag;
/** Used to speed up or slow down the simulation. */
float time_scale;
@@ -96,7 +96,7 @@ typedef enum eRigidBodyWorld_Flag {
RBW_FLAG_MUTED = (1 << 0),
/* sim data needs to be rebuilt */
/* RBW_FLAG_NEEDS_REBUILD = (1 << 1), */ /* UNUSED */
- /* usse split impulse when stepping the simulation */
+ /** Use split impulse when stepping the simulation. */
RBW_FLAG_USE_SPLIT_IMPULSE = (1 << 2),
} eRigidBodyWorld_Flag;
@@ -312,7 +312,7 @@ typedef enum eRigidBodyCon_Type {
RBC_TYPE_HINGE = 1,
/** simulates wheel suspension */
/* RBC_TYPE_HINGE2 = 2, */ /* UNUSED */
- /** restricts movent to a specified axis */
+ /** Restricts moment to a specified axis. */
RBC_TYPE_SLIDER = 3,
/** lets object rotate within a specified cone */
/* RBC_TYPE_CONE_TWIST = 4, */ /* UNUSED */
@@ -329,7 +329,7 @@ typedef enum eRigidBodyCon_Type {
/** Simplified spring constraint with only once axis that's
* automatically placed between the connected bodies */
/* RBC_TYPE_SPRING = 10, */ /* UNUSED */
- /** dirves bodies by applying linear and angular forces */
+ /** Drives bodies by applying linear and angular forces. */
RBC_TYPE_MOTOR = 11,
} eRigidBodyCon_Type;
diff --git a/source/blender/makesdna/DNA_scene_defaults.h b/source/blender/makesdna/DNA_scene_defaults.h
index ae02ac5ee35..3e1b2ef56a1 100644
--- a/source/blender/makesdna/DNA_scene_defaults.h
+++ b/source/blender/makesdna/DNA_scene_defaults.h
@@ -208,8 +208,11 @@
.gtao_factor = 1.0f, \
.gtao_quality = 0.25f, \
\
+ .bokeh_overblur = 5.0f, \
.bokeh_max_size = 100.0f, \
.bokeh_threshold = 1.0f, \
+ .bokeh_neighbor_max = 10.0f, \
+ .bokeh_denoise_fac = 0.75f, \
\
.bloom_color = {1.0f, 1.0f, 1.0f}, \
.bloom_threshold = 0.8f, \
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 472b2e9fa7f..c7f7e610a1a 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -231,7 +231,7 @@ typedef struct SceneRenderLayer {
struct FreestyleConfig freestyleConfig DNA_DEPRECATED;
} SceneRenderLayer;
-/* SceneRenderLayer.layflag */
+/** #SceneRenderLayer.layflag */
#define SCE_LAY_SOLID (1 << 0)
#define SCE_LAY_ZTRA (1 << 1)
#define SCE_LAY_HALO (1 << 2)
@@ -249,7 +249,7 @@ typedef struct SceneRenderLayer {
#define SCE_LAY_ZMASK (1 << 18)
#define SCE_LAY_NEG_ZMASK (1 << 19)
-/* SceneRenderLayer.passflag */
+/** #SceneRenderLayer.passflag */
typedef enum eScenePassType {
SCE_PASS_COMBINED = (1 << 0),
SCE_PASS_Z = (1 << 1),
@@ -334,16 +334,16 @@ typedef struct SceneRenderView {
} SceneRenderView;
-/* SceneRenderView.viewflag */
+/** #SceneRenderView.viewflag */
#define SCE_VIEW_DISABLE (1 << 0)
-/* RenderData.views_format */
+/** #RenderData.views_format */
enum {
SCE_VIEWS_FORMAT_STEREO_3D = 0,
SCE_VIEWS_FORMAT_MULTIVIEW = 1,
};
-/* ImageFormatData.views_format (also used for Sequence.views_format) */
+/** #ImageFormatData.views_format (also used for #Sequence.views_format) */
enum {
R_IMF_VIEWS_INDIVIDUAL = 0,
R_IMF_VIEWS_STEREO_3D = 1,
@@ -361,7 +361,7 @@ typedef struct Stereo3dFormat {
char _pad[3];
} Stereo3dFormat;
-/* Stereo3dFormat.display_mode */
+/** #Stereo3dFormat.display_mode */
typedef enum eStereoDisplayMode {
S3D_DISPLAY_ANAGLYPH = 0,
S3D_DISPLAY_INTERLACE = 1,
@@ -370,21 +370,21 @@ typedef enum eStereoDisplayMode {
S3D_DISPLAY_TOPBOTTOM = 4,
} eStereoDisplayMode;
-/* Stereo3dFormat.flag */
+/** #Stereo3dFormat.flag */
typedef enum eStereo3dFlag {
S3D_INTERLACE_SWAP = (1 << 0),
S3D_SIDEBYSIDE_CROSSEYED = (1 << 1),
S3D_SQUEEZED_FRAME = (1 << 2),
} eStereo3dFlag;
-/* Stereo3dFormat.anaglyph_type */
+/** #Stereo3dFormat.anaglyph_type */
typedef enum eStereo3dAnaglyphType {
S3D_ANAGLYPH_REDCYAN = 0,
S3D_ANAGLYPH_GREENMAGENTA = 1,
S3D_ANAGLYPH_YELLOWBLUE = 2,
} eStereo3dAnaglyphType;
-/* Stereo3dFormat.interlace_type */
+/** #Stereo3dFormat.interlace_type */
typedef enum eStereo3dInterlaceType {
S3D_INTERLACE_ROW = 0,
S3D_INTERLACE_COLUMN = 1,
@@ -449,26 +449,26 @@ typedef struct ImageFormatData {
ColorManagedDisplaySettings display_settings;
} ImageFormatData;
-/* ImageFormatData.imtype */
+/** #ImageFormatData.imtype */
#define R_IMF_IMTYPE_TARGA 0
#define R_IMF_IMTYPE_IRIS 1
-/* #define R_HAMX 2 */ /* hamx is nomore */
-/* #define R_FTYPE 3 */ /* ftype is nomore */
+/* #define R_HAMX 2 */ /* DEPRECATED */
+/* #define R_FTYPE 3 */ /* DEPRECATED */
#define R_IMF_IMTYPE_JPEG90 4
-/* #define R_MOVIE 5 */ /* movie is nomore */
+/* #define R_MOVIE 5 */ /* DEPRECATED */
#define R_IMF_IMTYPE_IRIZ 7
#define R_IMF_IMTYPE_RAWTGA 14
#define R_IMF_IMTYPE_AVIRAW 15
#define R_IMF_IMTYPE_AVIJPEG 16
#define R_IMF_IMTYPE_PNG 17
-/* #define R_IMF_IMTYPE_AVICODEC 18 */ /* avicodec is nomore */
-/* #define R_IMF_IMTYPE_QUICKTIME 19 */ /* quicktime is nomore */
+/* #define R_IMF_IMTYPE_AVICODEC 18 */ /* DEPRECATED */
+/* #define R_IMF_IMTYPE_QUICKTIME 19 */ /* DEPRECATED */
#define R_IMF_IMTYPE_BMP 20
#define R_IMF_IMTYPE_RADHDR 21
#define R_IMF_IMTYPE_TIFF 22
#define R_IMF_IMTYPE_OPENEXR 23
#define R_IMF_IMTYPE_FFMPEG 24
-/* #define R_IMF_IMTYPE_FRAMESERVER 25 */ /* frame server is nomore */
+/* #define R_IMF_IMTYPE_FRAMESERVER 25 */ /* DEPRECATED */
#define R_IMF_IMTYPE_CINEON 26
#define R_IMF_IMTYPE_DPX 27
#define R_IMF_IMTYPE_MULTILAYER 28
@@ -481,12 +481,12 @@ typedef struct ImageFormatData {
#define R_IMF_IMTYPE_INVALID 255
-/* ImageFormatData.flag */
+/** #ImageFormatData.flag */
#define R_IMF_FLAG_ZBUF (1 << 0) /* was R_OPENEXR_ZBUF */
#define R_IMF_FLAG_PREVIEW_JPG (1 << 1) /* was R_PREVIEW_JPG */
-/* return values from BKE_imtype_valid_depths, note this is depts per channel */
-/* ImageFormatData.depth */
+/* Return values from #BKE_imtype_valid_depths, note this is depths per channel. */
+/** #ImageFormatData.depth */
typedef enum eImageFormatDepth {
/* 1bits (unused) */
R_IMF_CHAN_DEPTH_1 = (1 << 0),
@@ -504,12 +504,12 @@ typedef enum eImageFormatDepth {
R_IMF_CHAN_DEPTH_32 = (1 << 6),
} eImageFormatDepth;
-/* ImageFormatData.planes */
+/** #ImageFormatData.planes */
#define R_IMF_PLANES_RGB 24
#define R_IMF_PLANES_RGBA 32
#define R_IMF_PLANES_BW 8
-/* ImageFormatData.exr_codec */
+/** #ImageFormatData.exr_codec */
#define R_IMF_EXR_CODEC_NONE 0
#define R_IMF_EXR_CODEC_PXR24 1
#define R_IMF_EXR_CODEC_ZIP 2
@@ -522,19 +522,19 @@ typedef enum eImageFormatDepth {
#define R_IMF_EXR_CODEC_DWAB 9
#define R_IMF_EXR_CODEC_MAX 10
-/* ImageFormatData.jp2_flag */
+/** #ImageFormatData.jp2_flag */
#define R_IMF_JP2_FLAG_YCC (1 << 0) /* when disabled use RGB */ /* was R_JPEG2K_YCC */
#define R_IMF_JP2_FLAG_CINE_PRESET (1 << 1) /* was R_JPEG2K_CINE_PRESET */
#define R_IMF_JP2_FLAG_CINE_48 (1 << 2) /* was R_JPEG2K_CINE_48FPS */
-/* ImageFormatData.jp2_codec */
+/** #ImageFormatData.jp2_codec */
#define R_IMF_JP2_CODEC_JP2 0
#define R_IMF_JP2_CODEC_J2K 1
-/* ImageFormatData.cineon_flag */
+/** #ImageFormatData.cineon_flag */
#define R_IMF_CINEON_FLAG_LOG (1 << 0) /* was R_CINEON_LOG */
-/* ImageFormatData.tiff_codec */
+/** #ImageFormatData.tiff_codec */
enum {
R_IMF_TIFF_CODEC_DEFLATE = 0,
R_IMF_TIFF_CODEC_LZW = 1,
@@ -565,7 +565,7 @@ typedef struct BakeData {
struct Object *cage_object;
} BakeData;
-/* BakeData.normal_swizzle (char) */
+/** #BakeData.normal_swizzle (char) */
typedef enum eBakeNormalSwizzle {
R_BAKE_POSX = 0,
R_BAKE_POSY = 1,
@@ -575,19 +575,19 @@ typedef enum eBakeNormalSwizzle {
R_BAKE_NEGZ = 5,
} eBakeNormalSwizzle;
-/* BakeData.target (char) */
+/** #BakeData.target (char) */
typedef enum eBakeTarget {
R_BAKE_TARGET_IMAGE_TEXTURES = 0,
R_BAKE_TARGET_VERTEX_COLORS = 1,
} eBakeTarget;
-/* BakeData.save_mode (char) */
+/** #BakeData.save_mode (char) */
typedef enum eBakeSaveMode {
R_BAKE_SAVE_INTERNAL = 0,
R_BAKE_SAVE_EXTERNAL = 1,
} eBakeSaveMode;
-/* BakeData.pass_filter */
+/** #BakeData.pass_filter */
typedef enum eBakePassFilter {
R_BAKE_PASS_FILTER_NONE = 0,
R_BAKE_PASS_FILTER_AO = (1 << 0),
@@ -794,7 +794,7 @@ typedef enum eHairType {
} eHairType;
/* *************************************************************** */
-/* Render Conversion/Simplfication Settings */
+/* Render Conversion/Simplification Settings */
/* control render convert and shading engine */
typedef struct RenderProfile {
@@ -812,11 +812,11 @@ typedef struct RenderProfile {
} RenderProfile;
/* UV Paint */
-/* ToolSettings.uv_sculpt_settings */
+/** #ToolSettings.uv_sculpt_settings */
#define UV_SCULPT_LOCK_BORDERS 1
#define UV_SCULPT_ALL_ISLANDS 2
-/* ToolSettings.uv_relax_method */
+/** #ToolSettings.uv_relax_method */
#define UV_SCULPT_TOOL_RELAX_LAPLACIAN 1
#define UV_SCULPT_TOOL_RELAX_HC 2
@@ -1010,7 +1010,7 @@ typedef struct GpPaint {
int mode;
} GpPaint;
-/* GpPaint.flag */
+/** #GpPaint.flag */
enum {
GPPAINT_FLAG_USE_MATERIAL = 0,
GPPAINT_FLAG_USE_VERTEXCOLOR = 1,
@@ -1049,7 +1049,7 @@ typedef struct VPaint {
int radial_symm[3];
} VPaint;
-/* VPaint.flag */
+/** #VPaint.flag */
enum {
/* weight paint only */
VP_FLAG_VGROUP_RESTRICT = (1 << 7),
@@ -1100,59 +1100,43 @@ typedef struct GP_Sculpt_Settings {
struct GP_Sculpt_Guide guide;
} GP_Sculpt_Settings;
-/* GP_Sculpt_Settings.flag */
+/** #GP_Sculpt_Settings.flag */
typedef enum eGP_Sculpt_SettingsFlag {
- /* enable falloff for multiframe editing */
+ /** Enable falloff for multi-frame editing. */
GP_SCULPT_SETT_FLAG_FRAME_FALLOFF = (1 << 0),
- /* apply primitive curve */
+ /** Apply primitive curve. */
GP_SCULPT_SETT_FLAG_PRIMITIVE_CURVE = (1 << 1),
- /* Scale thickness. */
+ /** Scale thickness. */
GP_SCULPT_SETT_FLAG_SCALE_THICKNESS = (1 << 3),
} eGP_Sculpt_SettingsFlag;
-/* GP_Sculpt_Settings.gpencil_selectmode_sculpt */
+/** #GP_Sculpt_Settings.gpencil_selectmode_sculpt */
typedef enum eGP_Sculpt_SelectMaskFlag {
- /* only affect selected points */
+ /** Only affect selected points. */
GP_SCULPT_MASK_SELECTMODE_POINT = (1 << 0),
- /* only affect selected strokes */
+ /** Only affect selected strokes. */
GP_SCULPT_MASK_SELECTMODE_STROKE = (1 << 1),
- /* only affect selected segmenst */
+ /** only affect selected segments. */
GP_SCULPT_MASK_SELECTMODE_SEGMENT = (1 << 2),
} eGP_Sculpt_SelectMaskFlag;
-/* GP_Sculpt_Settings.gpencil_selectmode_vertex */
+/** #GP_Sculpt_Settings.gpencil_selectmode_vertex */
typedef enum eGP_vertex_SelectMaskFlag {
- /* only affect selected points */
+ /** Only affect selected points. */
GP_VERTEX_MASK_SELECTMODE_POINT = (1 << 0),
- /* only affect selected strokes */
+ /** Only affect selected strokes. */
GP_VERTEX_MASK_SELECTMODE_STROKE = (1 << 1),
- /* only affect selected segmenst */
+ /** Only affect selected segments. */
GP_VERTEX_MASK_SELECTMODE_SEGMENT = (1 << 2),
} eGP_Vertex_SelectMaskFlag;
/* Settings for GP Interpolation Operators */
typedef struct GP_Interpolate_Settings {
- /** #eGP_Interpolate_SettingsFlag. */
- short flag;
-
- /** #eGP_Interpolate_Type - Interpolation Mode. */
- char type;
- /** #eBezTriple_Easing - Easing mode (if easing equation used). */
- char easing;
-
- /** BEZT_IPO_BACK. */
- float back;
- /** BEZT_IPO_ELASTIC. */
- float amplitude, period;
- /* Step between sequence interpolated frames. */
- int step;
- char _pad[4];
-
/** Custom interpolation curve (for use with GP_IPO_CURVEMAP). */
struct CurveMapping *custom_ipo;
} GP_Interpolate_Settings;
-/* GP_Interpolate_Settings.flag */
+/** #GP_Interpolate_Settings.flag */
typedef enum eGP_Interpolate_SettingsFlag {
/* apply interpolation to all layers */
GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS = (1 << 0),
@@ -1160,7 +1144,7 @@ typedef enum eGP_Interpolate_SettingsFlag {
GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED = (1 << 1),
} eGP_Interpolate_SettingsFlag;
-/* GP_Interpolate_Settings.type */
+/** #GP_Interpolate_Settings.type */
typedef enum eGP_Interpolate_Type {
/* Traditional Linear Interpolation */
GP_IPO_LINEAR = 0,
@@ -1295,7 +1279,7 @@ typedef struct CurvePaintSettings {
float corner_angle;
} CurvePaintSettings;
-/* CurvePaintSettings.flag */
+/** #CurvePaintSettings.flag */
enum {
CURVE_PAINT_FLAG_CORNERS_DETECT = (1 << 0),
CURVE_PAINT_FLAG_PRESSURE_RADIUS = (1 << 1),
@@ -1303,19 +1287,19 @@ enum {
CURVE_PAINT_FLAG_DEPTH_STROKE_OFFSET_ABS = (1 << 3),
};
-/* CurvePaintSettings.fit_method */
+/** #CurvePaintSettings.fit_method */
enum {
CURVE_PAINT_FIT_METHOD_REFIT = 0,
CURVE_PAINT_FIT_METHOD_SPLIT = 1,
};
-/* CurvePaintSettings.depth_mode */
+/** #CurvePaintSettings.depth_mode */
enum {
CURVE_PAINT_PROJECT_CURSOR = 0,
CURVE_PAINT_PROJECT_SURFACE = 1,
};
-/* CurvePaintSettings.surface_plane */
+/** #CurvePaintSettings.surface_plane */
enum {
CURVE_PAINT_SURFACE_PLANE_NORMAL_VIEW = 0,
CURVE_PAINT_SURFACE_PLANE_NORMAL_SURFACE = 1,
@@ -1361,7 +1345,7 @@ typedef enum eSeqImageFitMethod {
/* *************************************************************** */
/* Tool Settings */
-/* CurvePaintSettings.surface_plane */
+/** #CurvePaintSettings.surface_plane */
enum {
AUTO_MERGE = 1 << 0,
AUTO_MERGE_AND_SPLIT = 1 << 1,
@@ -1642,8 +1626,11 @@ typedef struct SceneEEVEE {
float gtao_factor;
float gtao_quality;
+ float bokeh_overblur;
float bokeh_max_size;
float bokeh_threshold;
+ float bokeh_neighbor_max;
+ float bokeh_denoise_fac;
float bloom_color[3];
float bloom_threshold;
@@ -1658,7 +1645,6 @@ typedef struct SceneEEVEE {
int motion_blur_position;
float motion_blur_shutter;
float motion_blur_depth_scale;
- char _pad0[4];
int shadow_method DNA_DEPRECATED;
int shadow_cube_size;
@@ -1936,7 +1922,7 @@ enum {
};
/* bake_mode: same as RE_BAKE_xxx defines */
-/* RenderData.bake_flag */
+/** #RenderData.bake_flag */
#define R_BAKE_CLEAR (1 << 0)
/* #define R_BAKE_OSA (1 << 1) */ /* deprecated */
#define R_BAKE_TO_ACTIVE (1 << 2)
@@ -1949,19 +1935,19 @@ enum {
#define R_BAKE_SPLIT_MAT (1 << 9)
#define R_BAKE_AUTO_NAME (1 << 10)
-/* RenderData.bake_normal_space */
+/** #RenderData.bake_normal_space */
#define R_BAKE_SPACE_CAMERA 0
#define R_BAKE_SPACE_WORLD 1
#define R_BAKE_SPACE_OBJECT 2
#define R_BAKE_SPACE_TANGENT 3
-/* RenderData.line_thickness_mode */
+/** #RenderData.line_thickness_mode */
#define R_LINE_THICKNESS_ABSOLUTE 1
#define R_LINE_THICKNESS_RELATIVE 2
/* sequencer seq_prev_type seq_rend_type */
-/* RenderData.engine (scene.c) */
+/** #RenderData.engine (scene.c) */
extern const char *RE_engine_id_BLENDER_EEVEE;
extern const char *RE_engine_id_BLENDER_WORKBENCH;
extern const char *RE_engine_id_CYCLES;
@@ -2023,25 +2009,25 @@ extern const char *RE_engine_id_CYCLES;
/* Base.flag is in DNA_object_types.h */
-/* ToolSettings.transform_flag */
+/** #ToolSettings.transform_flag */
enum {
SCE_XFORM_AXIS_ALIGN = (1 << 0),
SCE_XFORM_DATA_ORIGIN = (1 << 1),
SCE_XFORM_SKIP_CHILDREN = (1 << 2),
};
-/* ToolSettings.object_flag */
+/** #ToolSettings.object_flag */
enum {
SCE_OBJECT_MODE_LOCK = (1 << 0),
};
-/* ToolSettings.workspace_tool_flag */
+/** #ToolSettings.workspace_tool_flag */
enum {
SCE_WORKSPACE_TOOL_FALLBACK = 0,
SCE_WORKSPACE_TOOL_DEFAULT = 1,
};
-/* ToolSettings.snap_flag */
+/** #ToolSettings.snap_flag */
#define SCE_SNAP (1 << 0)
#define SCE_SNAP_ROTATE (1 << 1)
#define SCE_SNAP_PEEL_OBJECT (1 << 2)
@@ -2050,13 +2036,13 @@ enum {
#define SCE_SNAP_ABS_GRID (1 << 5)
#define SCE_SNAP_BACKFACE_CULLING (1 << 6)
-/* ToolSettings.snap_target */
+/** #ToolSettings.snap_target */
#define SCE_SNAP_TARGET_CLOSEST 0
#define SCE_SNAP_TARGET_CENTER 1
#define SCE_SNAP_TARGET_MEDIAN 2
#define SCE_SNAP_TARGET_ACTIVE 3
-/* ToolSettings.snap_mode */
+/** #ToolSettings.snap_mode */
#define SCE_SNAP_MODE_VERTEX (1 << 0)
#define SCE_SNAP_MODE_EDGE (1 << 1)
#define SCE_SNAP_MODE_FACE (1 << 2)
@@ -2065,11 +2051,11 @@ enum {
#define SCE_SNAP_MODE_EDGE_MIDPOINT (1 << 5)
#define SCE_SNAP_MODE_EDGE_PERPENDICULAR (1 << 6)
-/* ToolSettings.snap_node_mode */
+/** #ToolSettings.snap_node_mode */
#define SCE_SNAP_MODE_NODE_X (1 << 5)
#define SCE_SNAP_MODE_NODE_Y (1 << 6)
-/* ToolSettings.snap_mode and ToolSettings.snap_node_mode */
+/** #ToolSettings.snap_mode and #ToolSettings.snap_node_mode */
#define SCE_SNAP_MODE_GRID (1 << 7)
/** #ToolSettings.snap_transform_mode_flag */
@@ -2079,24 +2065,24 @@ enum {
SCE_SNAP_TRANSFORM_MODE_SCALE = (1 << 2),
};
-/* ToolSettings.selectmode */
+/** #ToolSettings.selectmode */
#define SCE_SELECT_VERTEX (1 << 0) /* for mesh */
#define SCE_SELECT_EDGE (1 << 1)
#define SCE_SELECT_FACE (1 << 2)
-/* MeshStatVis.type */
+/** #MeshStatVis.type */
#define SCE_STATVIS_OVERHANG 0
#define SCE_STATVIS_THICKNESS 1
#define SCE_STATVIS_INTERSECT 2
#define SCE_STATVIS_DISTORT 3
#define SCE_STATVIS_SHARP 4
-/* ParticleEditSettings.selectmode for particles */
+/** #ParticleEditSettings.selectmode for particles */
#define SCE_SELECT_PATH (1 << 0)
#define SCE_SELECT_POINT (1 << 1)
#define SCE_SELECT_END (1 << 2)
-/* ToolSettings.prop_mode (proportional falloff) */
+/** #ToolSettings.prop_mode (proportional falloff) */
#define PROP_SMOOTH 0
#define PROP_SPHERE 1
#define PROP_ROOT 2
@@ -2114,7 +2100,7 @@ enum {
PROP_EDIT_PROJECTED = (1 << 2),
};
-/* ToolSettings.weightuser */
+/** #ToolSettings.weightuser */
enum {
OB_DRAW_GROUPUSER_NONE = 0,
OB_DRAW_GROUPUSER_ACTIVE = 1,
@@ -2122,7 +2108,7 @@ enum {
};
/* object_vgroup.c */
-/* ToolSettings.vgroupsubset */
+/** #ToolSettings.vgroupsubset */
typedef enum eVGroupSelect {
WT_VGROUP_ALL = 0,
WT_VGROUP_ACTIVE = 1,
@@ -2135,7 +2121,7 @@ typedef enum eVGroupSelect {
((1 << WT_VGROUP_ACTIVE) | (1 << WT_VGROUP_BONE_SELECT) | (1 << WT_VGROUP_BONE_DEFORM) | \
(1 << WT_VGROUP_BONE_DEFORM_OFF) | (1 << WT_VGROUP_ALL))
-/* Scene.flag */
+/** #Scene.flag */
#define SCE_DS_SELECTED (1 << 0)
#define SCE_DS_COLLAPSED (1 << 1)
#define SCE_NLA_EDIT_ON (1 << 2)
@@ -2149,13 +2135,13 @@ typedef enum eVGroupSelect {
#define F_SCENE 1
#define F_DUPLI 3
-/* AudioData.flag */
+/** #AudioData.flag */
#define AUDIO_MUTE (1 << 0)
#define AUDIO_SYNC (1 << 1)
#define AUDIO_SCRUB (1 << 2)
#define AUDIO_VOLUME_ANIMATED (1 << 3)
-/* FFMpegCodecData.flags */
+/** #FFMpegCodecData.flags */
enum {
#ifdef DNA_DEPRECATED_ALLOW
FFMPEG_MULTIPLEX_AUDIO = (1 << 0), /* deprecated, you can choose none as audiocodec now */
@@ -2165,7 +2151,7 @@ enum {
FFMPEG_USE_MAX_B_FRAMES = (1 << 3),
};
-/* Paint.flags */
+/** #Paint.flags */
typedef enum ePaintFlags {
PAINT_SHOW_BRUSH = (1 << 0),
PAINT_FAST_NAVIGATE = (1 << 1),
@@ -2174,8 +2160,10 @@ typedef enum ePaintFlags {
PAINT_SCULPT_DELAY_UPDATES = (1 << 4),
} ePaintFlags;
-/* Paint.symmetry_flags
- * (for now just a duplicate of sculpt symmetry flags) */
+/**
+ * #Paint.symmetry_flags
+ * (for now just a duplicate of sculpt symmetry flags).
+ */
typedef enum ePaintSymmetryFlags {
PAINT_SYMM_X = (1 << 0),
PAINT_SYMM_Y = (1 << 1),
@@ -2188,8 +2176,10 @@ typedef enum ePaintSymmetryFlags {
#define PAINT_SYMM_AXIS_ALL (PAINT_SYMM_X | PAINT_SYMM_Y | PAINT_SYMM_Z)
-/* Sculpt.flags */
-/* These can eventually be moved to paint flags? */
+/**
+ * #Sculpt.flags
+ * These can eventually be moved to paint flags?
+ */
typedef enum eSculptFlags {
SCULPT_FLAG_UNUSED_0 = (1 << 0), /* cleared */
SCULPT_FLAG_UNUSED_1 = (1 << 1), /* cleared */
@@ -2226,25 +2216,25 @@ typedef enum eSculptFlags {
SCULPT_HIDE_FACE_SETS = (1 << 17),
} eSculptFlags;
-/* ImagePaintSettings.mode */
+/** #ImagePaintSettings.mode */
typedef enum eImagePaintMode {
IMAGEPAINT_MODE_MATERIAL = 0, /* detect texture paint slots from the material */
IMAGEPAINT_MODE_IMAGE = 1, /* select texture paint image directly */
} eImagePaintMode;
-/* ImagePaintSettings.interp */
+/** #ImagePaintSettings.interp */
enum {
IMAGEPAINT_INTERP_LINEAR = 0,
IMAGEPAINT_INTERP_CLOSEST = 1,
};
-/* ImagePaintSettings.flag */
+/** #ImagePaintSettings.flag */
#define IMAGEPAINT_DRAWING (1 << 0)
// #define IMAGEPAINT_DRAW_TOOL (1 << 1) /* deprecated */
// #define IMAGEPAINT_DRAW_TOOL_DRAWING (1 << 2) /* deprecated */
/* projection painting only */
-/* ImagePaintSettings.flag */
+/** #ImagePaintSettings.flag */
#define IMAGEPAINT_PROJECT_XRAY (1 << 4)
#define IMAGEPAINT_PROJECT_BACKFACE (1 << 5)
#define IMAGEPAINT_PROJECT_FLAT (1 << 6)
@@ -2252,13 +2242,13 @@ enum {
#define IMAGEPAINT_PROJECT_LAYER_STENCIL (1 << 8)
#define IMAGEPAINT_PROJECT_LAYER_STENCIL_INV (1 << 9)
-/* ImagePaintSettings.missing_data */
+/** #ImagePaintSettings.missing_data */
#define IMAGEPAINT_MISSING_UVS (1 << 0)
#define IMAGEPAINT_MISSING_MATERIAL (1 << 1)
#define IMAGEPAINT_MISSING_TEX (1 << 2)
#define IMAGEPAINT_MISSING_STENCIL (1 << 3)
-/* ToolSettings.uvcalc_flag */
+/** #ToolSettings.uvcalc_flag */
#define UVCALC_FILLHOLES (1 << 0)
/** would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */
#define UVCALC_NO_ASPECT_CORRECT (1 << 1)
@@ -2271,17 +2261,17 @@ enum {
/** Keep equal values merged while correcting custom-data. */
#define UVCALC_TRANSFORM_CORRECT_KEEP_CONNECTED (1 << 5)
-/* ToolSettings.uv_flag */
+/** #ToolSettings.uv_flag */
#define UV_SYNC_SELECTION 1
#define UV_SHOW_SAME_IMAGE 2
-/* ToolSettings.uv_selectmode */
+/** #ToolSettings.uv_selectmode */
#define UV_SELECT_VERTEX 1
#define UV_SELECT_EDGE 2
#define UV_SELECT_FACE 4
#define UV_SELECT_ISLAND 8
-/* ToolSettings.gpencil_flags */
+/** #ToolSettings.gpencil_flags */
typedef enum eGPencil_Flags {
/* When creating new frames, the last frame gets used as the basis for the new one */
GP_TOOL_FLAG_RETAIN_LAST = (1 << 1),
@@ -2295,7 +2285,7 @@ typedef enum eGPencil_Flags {
GP_TOOL_FLAG_AUTOMERGE_STROKE = (1 << 5),
} eGPencil_Flags;
-/* scene->r.simplify_gpencil */
+/** #Scene.r.simplify_gpencil */
typedef enum eGPencil_SimplifyFlags {
/* Simplify */
SIMPLIFY_GPENCIL_ENABLE = (1 << 0),
@@ -2313,7 +2303,7 @@ typedef enum eGPencil_SimplifyFlags {
SIMPLIFY_GPENCIL_AA = (1 << 8),
} eGPencil_SimplifyFlags;
-/* ToolSettings.gpencil_*_align - Stroke Placement mode flags */
+/** `ToolSettings.gpencil_*_align` - Stroke Placement mode flags */
typedef enum eGPencil_Placement_Flags {
/* New strokes are added in viewport/data space (i.e. not screen space) */
GP_PROJECT_VIEWSPACE = (1 << 0),
@@ -2331,14 +2321,14 @@ typedef enum eGPencil_Placement_Flags {
GP_PROJECT_DEPTH_STROKE_FIRST = (1 << 6),
} eGPencil_Placement_Flags;
-/* ToolSettings.gpencil_selectmode */
+/** #ToolSettings.gpencil_selectmode */
typedef enum eGPencil_Selectmode_types {
GP_SELECTMODE_POINT = 0,
GP_SELECTMODE_STROKE = 1,
GP_SELECTMODE_SEGMENT = 2,
} eGPencil_Selectmode_types;
-/* ToolSettings.gpencil_guide_types */
+/** #ToolSettings.gpencil_guide_types */
typedef enum eGPencil_GuideTypes {
GP_GUIDE_CIRCULAR = 0,
GP_GUIDE_RADIAL = 1,
@@ -2347,14 +2337,14 @@ typedef enum eGPencil_GuideTypes {
GP_GUIDE_ISO = 4,
} eGPencil_GuideTypes;
-/* ToolSettings.gpencil_guide_references */
+/** #ToolSettings.gpencil_guide_references */
typedef enum eGPencil_Guide_Reference {
GP_GUIDE_REF_CURSOR = 0,
GP_GUIDE_REF_CUSTOM = 1,
GP_GUIDE_REF_OBJECT = 2,
} eGPencil_Guide_Reference;
-/* ToolSettings.particle flag */
+/** #ToolSettings.particle flag */
#define PE_KEEP_LENGTHS (1 << 0)
#define PE_LOCK_FIRST (1 << 1)
#define PE_DEFLECT_EMITTER (1 << 2)
@@ -2364,7 +2354,7 @@ typedef enum eGPencil_Guide_Reference {
#define PE_FADE_TIME (1 << 7)
#define PE_AUTO_VELOCITY (1 << 8)
-/* ParticleEditSettings.brushtype */
+/** #ParticleEditSettings.brushtype */
#define PE_BRUSH_NONE -1
#define PE_BRUSH_COMB 0
#define PE_BRUSH_CUT 1
@@ -2374,15 +2364,15 @@ typedef enum eGPencil_Guide_Reference {
#define PE_BRUSH_SMOOTH 5
#define PE_BRUSH_WEIGHT 6
-/* ParticleBrushData.flag */
+/** #ParticleBrushData.flag */
#define PE_BRUSH_DATA_PUFF_VOLUME 1
-/* ParticleBrushData.edittype */
+/** #ParticleBrushData.edittype */
#define PE_TYPE_PARTICLES 0
#define PE_TYPE_SOFTBODY 1
#define PE_TYPE_CLOTH 2
-/* PhysicsSettings.flag */
+/** #PhysicsSettings.flag */
#define PHYS_GLOBAL_GRAVITY 1
/* UnitSettings */
@@ -2396,7 +2386,7 @@ typedef enum eGPencil_Guide_Reference {
#define USER_UNIT_OPT_SPLIT 1
#define USER_UNIT_ROT_RADIANS 2
-/* SceneEEVEE->flag */
+/** #SceneEEVEE.flag */
enum {
// SCE_EEVEE_VOLUMETRIC_ENABLED = (1 << 0), /* Unused */
SCE_EEVEE_VOLUMETRIC_LIGHTS = (1 << 1),
@@ -2420,23 +2410,25 @@ enum {
SCE_EEVEE_GI_AUTOBAKE = (1 << 19),
SCE_EEVEE_SHADOW_SOFT = (1 << 20),
SCE_EEVEE_OVERSCAN = (1 << 21),
+ SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS = (1 << 22),
+ SCE_EEVEE_DOF_JITTER = (1 << 23),
};
-/* SceneEEVEE->shadow_method */
+/** #SceneEEVEE.shadow_method */
enum {
SHADOW_ESM = 1,
/* SHADOW_VSM = 2, */ /* UNUSED */
/* SHADOW_METHOD_MAX = 3, */ /* UNUSED */
};
-/* SceneEEVEE->motion_blur_position */
+/** #SceneEEVEE.motion_blur_position */
enum {
SCE_EEVEE_MB_CENTER = 0,
SCE_EEVEE_MB_START = 1,
SCE_EEVEE_MB_END = 2,
};
-/* SceneDisplay->render_aa, SceneDisplay->viewport_aa */
+/** #SceneDisplay->render_aa and #SceneDisplay->viewport_aa */
enum {
SCE_DISPLAY_AA_OFF = 0,
SCE_DISPLAY_AA_FXAA = 1,
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 3a99a6f4ee8..8d3ac3a7814 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -285,7 +285,7 @@ typedef struct uiList { /* some list UI data need to be saved in file */
/** Defined as UI_MAX_NAME_STR. */
char list_id[64];
- /** How items are layedout in the list. */
+ /** How items are laid out in the list. */
int layout_type;
int flag;
@@ -319,7 +319,7 @@ typedef struct TransformOrientation {
typedef struct uiPreview {
struct uiPreview *next, *prev;
- /** Defined as UI_MAX_NAME_STR. */
+ /** Defined as #UI_MAX_NAME_STR. */
char preview_id[64];
short height;
char _pad1[6];
@@ -360,7 +360,7 @@ typedef struct ScrArea_Runtime {
typedef struct ScrArea {
struct ScrArea *next, *prev;
- /** Ordered (bl, tl, tr, br). */
+ /** Ordered (bottom-left, top-left, top-right, bottom-right). */
ScrVert *v1, *v2, *v3, *v4;
/** If area==full, this is the parent. */
bScreen *full;
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 13989467db3..dc1775b09c6 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -63,6 +63,9 @@ struct wmTimer;
/* Defined in `buttons_intern.h`. */
typedef struct SpaceProperties_Runtime SpaceProperties_Runtime;
+/* Defined in `node_intern.h`. */
+typedef struct SpaceNode_Runtime SpaceNode_Runtime;
+
/* -------------------------------------------------------------------- */
/** \name SpaceLink (Base)
* \{ */
@@ -1084,6 +1087,8 @@ typedef struct FileDirEntry {
struct FileDirEntry *next, *prev;
int uuid[4];
+ /* Name needs freeing if FILE_ENTRY_NAME_FREE is set. Otherwise this is a direct pointer to a
+ * name buffer. */
char *name;
char *description;
@@ -1162,6 +1167,7 @@ enum {
/* FileDirEntry.flags */
enum {
FILE_ENTRY_INVALID_PREVIEW = 1 << 0, /* The preview for this entry could not be generated. */
+ FILE_ENTRY_NAME_FREE = 1 << 1,
};
/** \} */
@@ -1518,19 +1524,17 @@ typedef struct SpaceNode {
/** Context, no need to save in file? well... pinning... */
struct ID *id, *from;
- /** Menunr: browse id block in header. */
+
short flag;
- char _pad1[2];
- /** Internal state variables. */
- float aspect;
- char _pad2[4];
+
+ /** Direction for offsetting nodes on insertion. */
+ char insert_ofs_dir;
+ char _pad1;
/** Offset for drawing the backdrop. */
float xof, yof;
/** Zoom for backdrop. */
float zoom;
- /** Mouse pos for drawing socketless link and adding nodes. */
- float cursor[2];
/**
* XXX nodetree pointer info is all in the path stack now,
@@ -1541,33 +1545,25 @@ typedef struct SpaceNode {
*/
ListBase treepath;
- struct bNodeTree *nodetree, *edittree;
+ /* The tree farthest down in the group hierarchy. */
+ struct bNodeTree *edittree;
+
+ struct bNodeTree *nodetree;
/* tree type for the current node tree */
char tree_idname[64];
/** Treetype: as same nodetree->type. */
int treetype DNA_DEPRECATED;
- char _pad3[4];
/** Texfrom object, world or brush. */
short texfrom;
/** Shader from object or world. */
short shaderfrom;
- /** Currently on 0/1, for auto compo. */
- short recalc;
-
- /** Direction for offsetting nodes on insertion. */
- char insert_ofs_dir;
- char _pad4;
-
- /** Temporary data for modal linking operator. */
- ListBase linkdrag;
- /* XXX hack for translate_attach op-macros to pass data from transform op to insert_offset op */
- /** Temporary data for node insert offset (in UI called Auto-offset). */
- struct NodeInsertOfsData *iofsd;
/** Grease-pencil data. */
struct bGPdata *gpd;
+
+ SpaceNode_Runtime *runtime;
} SpaceNode;
/* SpaceNode.flag */
diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h
index 5b6b706c83c..0e673aaec66 100644
--- a/source/blender/makesdna/DNA_tracking_types.h
+++ b/source/blender/makesdna/DNA_tracking_types.h
@@ -141,7 +141,7 @@ typedef struct MovieTrackingTrack {
/** Count of markers in track. */
int markersnr;
/** Most recently used marker. */
- int last_marker;
+ int _pad;
/** Markers in track. */
MovieTrackingMarker *markers;
@@ -251,8 +251,6 @@ typedef struct MovieTrackingPlaneTrack {
} MovieTrackingPlaneTrack;
typedef struct MovieTrackingSettings {
- int flag;
-
/* ** default tracker settings */
/** Model of the motion for this track. */
short default_motion_model;
@@ -309,8 +307,6 @@ typedef struct MovieTrackingSettings {
/* set object scale */
/** Distance between two bundles used for object scaling. */
float object_distance;
-
- char _pad3[4];
} MovieTrackingSettings;
typedef struct MovieTrackingStabilization {
@@ -332,7 +328,7 @@ typedef struct MovieTrackingStabilization {
float target_pos[2];
/** Expected target rotation of frame after raw stabilization, will be compensated. */
float target_rot;
- /** Zoom factor known to be present on original footage. Also used for autoscale. */
+ /** Zoom factor known to be present on original footage. Also used for auto-scale. */
float scale;
/** Influence on location, scale and rotation. */
@@ -526,12 +522,6 @@ typedef enum eTrackFrameMatch {
TRACK_MATCH_PREVIOS_FRAME = 1,
} eTrackFrameMatch;
-/* MovieTrackingSettings->flag */
-enum {
- TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED = (1 << 0),
- TRACKING_SETTINGS_SHOW_EXTRA_EXPANDED = (1 << 1),
-};
-
/* MovieTrackingSettings->motion_flag */
enum {
TRACKING_MOTION_TRIPOD = (1 << 0),
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index f620602f051..d304641e112 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -673,6 +673,21 @@ typedef struct UserDef {
/** 768 = FILE_MAXDIR. */
char render_cachedir[768];
char textudir[768];
+ /**
+ * Optional user location for scripts.
+ *
+ * This supports the same layout as Blender's scripts directory `release/scripts`.
+ *
+ * \note Unlike most paths, changing this is not fully supported at run-time,
+ * requiring a restart to properly take effect. Supporting this would cause complications as
+ * the script path can contain `startup`, `addons` & `modules` etc. properly unwinding the
+ * Python environment to the state it _would_ have been in gets complicated.
+ *
+ * Although this is partially supported as the `sys.path` is refreshed when loading preferences.
+ * This is done to support #PREFERENCES_OT_copy_prev which is available to the user when they
+ * launch with a new version of Blender. In this case setting the script path on top of
+ * factory settings will work without problems.
+ */
char pythondir[768];
char sounddir[768];
char i18ndir[768];
@@ -762,8 +777,12 @@ typedef struct UserDef {
char _pad13[4];
struct SolidLight light_param[4];
float light_ambient[3];
- char _pad3[4];
- short gizmo_flag, gizmo_size;
+ char gizmo_flag;
+ /** Generic gizmo size. */
+ char gizmo_size;
+ /** Navigate gizmo size. */
+ char gizmo_size_navigate_v3d;
+ char _pad3[5];
short edit_studio_light;
short lookdev_sphere_size;
short vbotimeout, vbocollectrate;
@@ -1009,8 +1028,11 @@ typedef enum ePathCompare_Flag {
/** #UserDef.viewzoom */
typedef enum eViewZoom_Style {
- USER_ZOOM_CONT = 0,
+ /** Update zoom continuously with a timer while dragging the cursor. */
+ USER_ZOOM_CONTINUE = 0,
+ /** Map changes in distance from the view center to zoom. */
USER_ZOOM_SCALE = 1,
+ /** Map horizontal/vertical motion to zoom. */
USER_ZOOM_DOLLY = 2,
} eViewZoom_Style;
@@ -1200,7 +1222,7 @@ typedef enum eDupli_ID_Flags {
USER_DUP_OBDATA = (~0) & ((1 << 24) - 1),
- /* Those are not exposed as user preferences, only used internaly. */
+ /* Those are not exposed as user preferences, only used internally. */
USER_DUP_OBJECT = (1 << 24),
/* USER_DUP_COLLECTION = (1 << 25), */ /* UNUSED, keep because we may implement. */
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index f07af2c14a0..1635aa7646b 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -215,7 +215,7 @@ enum {
(WM_OUTLINER_SYNC_SELECT_FROM_OBJECT | WM_OUTLINER_SYNC_SELECT_FROM_EDIT_BONE | \
WM_OUTLINER_SYNC_SELECT_FROM_POSE_BONE | WM_OUTLINER_SYNC_SELECT_FROM_SEQUENCE)
-#define WM_KEYCONFIG_STR_DEFAULT "blender"
+#define WM_KEYCONFIG_STR_DEFAULT "Blender"
/* IME is win32 only! */
#if !defined(WIN32) && !defined(DNA_DEPRECATED)
@@ -472,7 +472,7 @@ typedef struct wmKeyConfig {
/** Unique name. */
char idname[64];
- /** Idname of configuration this is derives from, "" if none. */
+ /** ID-name of configuration this is derives from, "" if none. */
char basename[64];
ListBase keymaps;
diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt
index eb7779213fd..db34cf83fa9 100644
--- a/source/blender/makesdna/intern/CMakeLists.txt
+++ b/source/blender/makesdna/intern/CMakeLists.txt
@@ -48,12 +48,6 @@ set(SRC
../../../../intern/guardedalloc/intern/mallocn_lockfree_impl.c
)
-if(WIN32 AND NOT UNIX)
- list(APPEND SRC
- ../../../../intern/guardedalloc/intern/mmap_win.c
- )
-endif()
-
# SRC_DNA_INC is defined in the parent dir
add_cc_flags_custom_test(makesdna)
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 54d2bc88d16..7624649bf78 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -397,13 +397,11 @@ static int add_type(const char *str, int size)
}
/**
- *
* Because of the weird way of tokenizing, we have to 'cast' function
* pointers to ... (*f)(), whatever the original signature. In fact,
* we add name and type at the same time... There are two special
* cases, unfortunately. These are explicitly checked.
- *
- * */
+ */
static int add_name(const char *str)
{
char buf[255]; /* stupid limit, change it :) */
@@ -479,17 +477,16 @@ static int add_name(const char *str)
}
/*
- * Put )(void) at the end? Maybe )(). Should check this with
- * old sdna. Actually, sometimes )(), sometimes )(void...)
+ * Put `)(void)` at the end? Maybe `)()`. Should check this with
+ * old `sdna`. Actually, sometimes `)()`, sometimes `)(void...)`
* Alas.. such is the nature of brain-damage :(
*
- * Sorted it out: always do )(), except for headdraw and
- * windraw, part of ScrArea. This is important, because some
+ * Sorted it out: always do )(), except for `headdraw` and
+ * `windraw`, part of #ScrArea. This is important, because some
* linkers will treat different fp's differently when called
* !!! This has to do with interference in byte-alignment and
- * the way args are pushed on the stack.
- *
- * */
+ * the way arguments are pushed on the stack.
+ */
buf[i] = 0;
DEBUG_PRINTF(3, "Name before chomping: %s\n", buf);
if ((strncmp(buf, "(*headdraw", 10) == 0) || (strncmp(buf, "(*windraw", 9) == 0)) {
@@ -1077,7 +1074,7 @@ static int calculate_struct_sizes(int firststruct, FILE *file_verify, const char
}
}
- if (size_native % 4) {
+ if (size_native % 4 && !ELEM(size_native, 1, 2)) {
fprintf(stderr,
"Sizeerror 4 in struct: %s (add %d bytes)\n",
types[structtype],
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 35b174f0da8..eecac8ca19e 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -91,6 +91,7 @@ extern StructRNA RNA_BoidSettings;
extern StructRNA RNA_BoidState;
extern StructRNA RNA_Bone;
extern StructRNA RNA_BoneGroup;
+extern StructRNA RNA_BoolAttribute;
extern StructRNA RNA_BoolProperty;
extern StructRNA RNA_BooleanModifier;
extern StructRNA RNA_Brush;
@@ -264,6 +265,7 @@ extern StructRNA RNA_FloatAttributeValue;
extern StructRNA RNA_FloatColorAttribute;
extern StructRNA RNA_FloatColorAttributeValue;
extern StructRNA RNA_FloatProperty;
+extern StructRNA RNA_Float2Attribute;
extern StructRNA RNA_FloorConstraint;
extern StructRNA RNA_FluidDomainSettings;
extern StructRNA RNA_FluidEffectorSettings;
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 72cdaecb2c3..94cfd8464ae 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -189,7 +189,6 @@ set(SRC
../../../../intern/guardedalloc/intern/mallocn.c
../../../../intern/guardedalloc/intern/mallocn_guarded_impl.c
../../../../intern/guardedalloc/intern/mallocn_lockfree_impl.c
- ../../../../intern/guardedalloc/intern/mmap_win.c
# Needed for defaults.
../../../../release/datafiles/userdef/userdef_default.c
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index e9e00ff6f71..bec3db10905 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -4758,8 +4758,14 @@ static const char *cpp_classes =
"class CollectionIterator {\n"
"public:\n"
" CollectionIterator() : iter(), t(iter.ptr), init(false) { iter.valid = false; }\n"
+ " CollectionIterator(const PointerRNA &ptr) : CollectionIterator() { this->begin(ptr); }\n"
" ~CollectionIterator(void) { if (init) Tend(&iter); };\n"
"\n"
+ " CollectionIterator(const CollectionIterator &other) = delete;\n"
+ " CollectionIterator(CollectionIterator &&other) = delete;\n"
+ " CollectionIterator &operator=(const CollectionIterator &other) = delete;\n"
+ " CollectionIterator &operator=(CollectionIterator &&other) = delete;\n"
+ "\n"
" operator bool(void)\n"
" { return iter.valid != 0; }\n"
" const CollectionIterator<T, Tbegin, Tnext, Tend>& operator++() { Tnext(&iter); t = "
@@ -4777,9 +4783,6 @@ static const char *cpp_classes =
"true; }\n"
"\n"
"private:\n"
- " const CollectionIterator<T, Tbegin, Tnext, Tend>& operator = "
- "(const CollectionIterator<T, Tbegin, Tnext, Tend>& /*copy*/) {}\n"
- ""
" CollectionPropertyIterator iter;\n"
" T t;\n"
" bool init;\n"
@@ -4794,6 +4797,8 @@ static const char *cpp_classes =
"\n"
" void begin(CollectionIterator<T, Tbegin, Tnext, Tend>& iter)\n"
" { iter.begin(ptr); }\n"
+ " CollectionIterator<T, Tbegin, Tnext, Tend> begin()\n"
+ " { return CollectionIterator<T, Tbegin, Tnext, Tend>(ptr); }\n"
" CollectionIterator<T, Tbegin, Tnext, Tend> end()\n"
" { return CollectionIterator<T, Tbegin, Tnext, Tend>(); } /* test */ \n"
""
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index ae23e0b9109..d8c91cb2923 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -3704,7 +3704,7 @@ void RNA_property_pointer_set(PointerRNA *ptr,
}
}
else {
- /* Assigning to an IDProperty desguised as RNA one. */
+ /* Assigning to an IDProperty disguised as RNA one. */
if (ptr_value.type != NULL && !RNA_struct_is_a(ptr_value.type, &RNA_ID)) {
BKE_reportf(reports,
RPT_ERROR,
@@ -3741,7 +3741,7 @@ void RNA_property_pointer_set(PointerRNA *ptr,
pprop->set(ptr, ptr_value, reports);
}
}
- /* IDProperty desguised as RNA property (and not yet defined in ptr). */
+ /* IDProperty disguised as RNA property (and not yet defined in ptr). */
else if (prop->flag & PROP_EDITABLE) {
IDPropertyTemplate val = {0};
IDProperty *group;
@@ -6174,7 +6174,7 @@ char *RNA_path_full_property_py_ex(
}
else {
if (use_fallback) {
- /* fuzzy fallback. be explicit in our ignoranc. */
+ /* Fuzzy fallback. Be explicit in our ignorance. */
data_path = RNA_property_identifier(prop);
data_delim = " ... ";
}
diff --git a/source/blender/makesrna/intern/rna_access_compare_override.c b/source/blender/makesrna/intern/rna_access_compare_override.c
index 1e7f5e841ba..d6305388cf9 100644
--- a/source/blender/makesrna/intern/rna_access_compare_override.c
+++ b/source/blender/makesrna/intern/rna_access_compare_override.c
@@ -42,6 +42,7 @@
#include "BKE_armature.h"
#include "BKE_idprop.h"
+#include "BKE_idtype.h"
#include "BKE_lib_override.h"
#include "BKE_main.h"
@@ -133,7 +134,7 @@ bool RNA_property_overridable_get(PointerRNA *ptr, PropertyRNA *prop)
/* Special handling for insertions of constraints or modifiers... */
/* TODO Note We may want to add a more generic system to RNA
* (like a special property in struct of items)
- * if we get more overrideable collections,
+ * if we get more overridable collections,
* for now we can live with those special-cases handling I think. */
if (RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
bConstraint *con = ptr->data;
@@ -1178,6 +1179,17 @@ void RNA_struct_override_apply(Main *bmain,
#endif
}
}
+
+ /* Some cases (like point caches) may require additional post-processing. */
+ if (RNA_struct_is_a(ptr_dst->type, &RNA_ID)) {
+ ID *id_dst = ptr_dst->data;
+ ID *id_src = ptr_src->data;
+ const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(id_dst);
+ if (id_type->lib_override_apply_post != NULL) {
+ id_type->lib_override_apply_post(id_dst, id_src);
+ }
+ }
+
#ifdef DEBUG_OVERRIDE_TIMEIT
TIMEIT_END_AVERAGED(RNA_struct_override_apply);
#endif
diff --git a/source/blender/makesrna/intern/rna_animviz.c b/source/blender/makesrna/intern/rna_animviz.c
index 06215e16965..8e95388fe2b 100644
--- a/source/blender/makesrna/intern/rna_animviz.c
+++ b/source/blender/makesrna/intern/rna_animviz.c
@@ -61,7 +61,7 @@ static void rna_AnimViz_path_start_frame_set(PointerRNA *ptr, int value)
{
bAnimVizSettings *data = (bAnimVizSettings *)ptr->data;
- /* XXX: watchit! Path Start > MAXFRAME/2 could be a problem... */
+ /* XXX: Watch it! Path Start > MAXFRAME/2 could be a problem. */
data->path_sf = value;
FRAMENUMBER_MIN_CLAMP(data->path_sf);
diff --git a/source/blender/makesrna/intern/rna_attribute.c b/source/blender/makesrna/intern/rna_attribute.c
index 7cd6e375a82..b99b6891d3d 100644
--- a/source/blender/makesrna/intern/rna_attribute.c
+++ b/source/blender/makesrna/intern/rna_attribute.c
@@ -45,6 +45,7 @@ const EnumPropertyItem rna_enum_attribute_type_items[] = {
{CD_MLOOPCOL, "BYTE_COLOR", 0, "Byte Color", "RGBA color with 8-bit precision"},
{CD_PROP_STRING, "STRING", 0, "String", "Text string"},
{CD_PROP_BOOL, "BOOLEAN", 0, "Boolean", "True or false"},
+ {CD_PROP_FLOAT2, "FLOAT2", 0, "2D Vector", "2D vector with floating-point values"},
{0, NULL, 0, NULL, NULL},
};
@@ -79,6 +80,36 @@ static char *rna_Attribute_path(PointerRNA *ptr)
return BLI_sprintfN("attributes['%s']", layer->name);
}
+static StructRNA *srna_by_custom_data_layer_type(const CustomDataType type)
+{
+ switch (type) {
+ case CD_PROP_FLOAT:
+ return &RNA_FloatAttribute;
+ case CD_PROP_INT32:
+ return &RNA_IntAttribute;
+ case CD_PROP_FLOAT3:
+ return &RNA_FloatVectorAttribute;
+ case CD_PROP_COLOR:
+ return &RNA_FloatColorAttribute;
+ case CD_MLOOPCOL:
+ return &RNA_ByteColorAttribute;
+ case CD_PROP_STRING:
+ return &RNA_StringAttribute;
+ case CD_PROP_BOOL:
+ return &RNA_BoolAttribute;
+ case CD_PROP_FLOAT2:
+ return &RNA_Float2Attribute;
+ default:
+ return NULL;
+ }
+}
+
+static StructRNA *rna_Attribute_refine(PointerRNA *ptr)
+{
+ CustomDataLayer *layer = ptr->data;
+ return srna_by_custom_data_layer_type(layer->type);
+}
+
static void rna_Attribute_name_set(PointerRNA *ptr, const char *value)
{
BKE_id_attribute_rename(ptr->owner_id, ptr->data, value, NULL);
@@ -169,6 +200,12 @@ static void rna_Attribute_data_begin(CollectionPropertyIterator *iter, PointerRN
case CD_PROP_STRING:
struct_size = sizeof(MStringProperty);
break;
+ case CD_PROP_BOOL:
+ struct_size = sizeof(MBoolProperty);
+ break;
+ case CD_PROP_FLOAT2:
+ struct_size = sizeof(float[2]);
+ break;
default:
struct_size = 0;
length = 0;
@@ -277,32 +314,11 @@ void rna_AttributeGroup_iterator_next(CollectionPropertyIterator *iter)
PointerRNA rna_AttributeGroup_iterator_get(CollectionPropertyIterator *iter)
{
/* refine to the proper type */
- StructRNA *type;
CustomDataLayer *layer = rna_iterator_array_get(iter);
-
- switch (layer->type) {
- case CD_PROP_FLOAT:
- type = &RNA_FloatAttribute;
- break;
- case CD_PROP_INT32:
- type = &RNA_IntAttribute;
- break;
- case CD_PROP_FLOAT3:
- type = &RNA_FloatVectorAttribute;
- break;
- case CD_PROP_COLOR:
- type = &RNA_FloatColorAttribute;
- break;
- case CD_MLOOPCOL:
- type = &RNA_ByteColorAttribute;
- break;
- case CD_PROP_STRING:
- type = &RNA_StringAttribute;
- break;
- default:
- return PointerRNA_NULL;
+ StructRNA *type = srna_by_custom_data_layer_type(layer->type);
+ if (type == NULL) {
+ return PointerRNA_NULL;
}
-
return rna_pointer_inherit_refine(&iter->parent, type, layer);
}
@@ -555,6 +571,69 @@ static void rna_def_attribute_string(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Attribute_update_data");
}
+static void rna_def_attribute_bool(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "BoolAttribute", "Attribute");
+ RNA_def_struct_sdna(srna, "CustomDataLayer");
+ RNA_def_struct_ui_text(srna, "Bool Attribute", "Bool geometry attribute");
+
+ prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoolAttributeValue");
+ RNA_def_property_collection_funcs(prop,
+ "rna_Attribute_data_begin",
+ "rna_iterator_array_next",
+ "rna_iterator_array_end",
+ "rna_iterator_array_get",
+ "rna_Attribute_data_length",
+ NULL,
+ NULL,
+ NULL);
+
+ srna = RNA_def_struct(brna, "BoolAttributeValue", NULL);
+ RNA_def_struct_sdna(srna, "MBoolProperty");
+ RNA_def_struct_ui_text(srna, "Bool Attribute Value", "Bool value in geometry attribute");
+ prop = RNA_def_property(srna, "value", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "b", 0x01);
+}
+
+static void rna_def_attribute_float2(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ /* Float2 Attribute */
+ srna = RNA_def_struct(brna, "Float2Attribute", "Attribute");
+ RNA_def_struct_sdna(srna, "CustomDataLayer");
+ RNA_def_struct_ui_text(
+ srna, "Float2 Attribute", "2D vector geometry attribute, with floating-point precision");
+
+ prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Float2AttributeValue");
+ RNA_def_property_collection_funcs(prop,
+ "rna_Attribute_data_begin",
+ "rna_iterator_array_next",
+ "rna_iterator_array_end",
+ "rna_iterator_array_get",
+ "rna_Attribute_data_length",
+ NULL,
+ NULL,
+ NULL);
+
+ /* Float2 Attribute Value */
+ srna = RNA_def_struct(brna, "Float2AttributeValue", NULL);
+ RNA_def_struct_sdna(srna, "vec2f");
+ RNA_def_struct_ui_text(srna, "Float2 Attribute Value", "2D Vector value in geometry attribute");
+
+ prop = RNA_def_property(srna, "vector", PROP_FLOAT, PROP_DIRECTION);
+ RNA_def_property_ui_text(prop, "Vector", "2D vector");
+ RNA_def_property_float_sdna(prop, NULL, "x");
+ RNA_def_property_array(prop, 2);
+ RNA_def_property_update(prop, 0, "rna_Attribute_update_data");
+}
+
static void rna_def_attribute(BlenderRNA *brna)
{
PropertyRNA *prop;
@@ -564,6 +643,7 @@ static void rna_def_attribute(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "CustomDataLayer");
RNA_def_struct_ui_text(srna, "Attribute", "Geometry attribute");
RNA_def_struct_path_func(srna, "rna_Attribute_path");
+ RNA_def_struct_refine_func(srna, "rna_Attribute_refine");
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Attribute_name_set");
@@ -592,6 +672,8 @@ static void rna_def_attribute(BlenderRNA *brna)
rna_def_attribute_byte_color(brna);
rna_def_attribute_int(brna);
rna_def_attribute_string(brna);
+ rna_def_attribute_bool(brna);
+ rna_def_attribute_float2(brna);
}
/* Mesh/PointCloud/Hair.attributes */
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 2af6c04147c..3dcc9471906 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -1304,7 +1304,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
- /* Randomnes factor for pressure */
+ /* Randomness factor for pressure */
prop = RNA_def_property(srna, "random_pressure", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "draw_random_press");
RNA_def_property_range(prop, 0.0f, 1.0f);
@@ -1313,7 +1313,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
- /* Randomnes factor for strength */
+ /* Randomness factor for strength */
prop = RNA_def_property(srna, "random_strength", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "draw_random_strength");
RNA_def_property_range(prop, 0.0f, 1.0f);
@@ -1446,7 +1446,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
- /* fill threshold for transparence */
+ /* Fill threshold for transparency. */
prop = RNA_def_property(srna, "fill_threshold", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "fill_threshold");
RNA_def_property_range(prop, 0.0f, 1.0f);
@@ -1464,13 +1464,13 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
/* fill factor size */
- prop = RNA_def_property(srna, "fill_factor", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "fill_factor");
- RNA_def_property_range(prop, 1, 8);
+ prop = RNA_def_property(srna, "fill_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fill_factor");
+ RNA_def_property_range(prop, GPENCIL_MIN_FILL_FAC, GPENCIL_MAX_FILL_FAC);
RNA_def_property_ui_text(
prop,
- "Resolution",
- "Multiplier for fill resolution, higher resolution is more accurate but slower");
+ "Precision",
+ "Factor for fill boundary accuracy, higher values are more accurate but slower");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
@@ -1608,6 +1608,15 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Value", "Random factor to modify original value");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+ /* Factor to extend stroke extremes in Fill tool. */
+ prop = RNA_def_property(srna, "extend_stroke_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fill_extend_fac");
+ RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_float_default(prop, 0.0f);
+ RNA_def_property_ui_text(
+ prop, "Stroke Extension", "Strokes end extension for closing gaps, use zero to disable");
+ RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+
/* Flags */
prop = RNA_def_property(srna, "use_pressure", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_USE_PRESSURE);
@@ -1827,6 +1836,12 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Lines", "Show help lines for filling to see boundaries");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ prop = RNA_def_property(srna, "show_fill_extend", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_SHOW_EXTENDLINES);
+ RNA_def_property_boolean_default(prop, true);
+ RNA_def_property_ui_text(prop, "Show Extend Lines", "Show help lines for stroke extension");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+
prop = RNA_def_property(srna, "show_fill", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_BRUSH_FILL_HIDE);
RNA_def_property_boolean_default(prop, true);
@@ -1834,6 +1849,12 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
prop, "Show Fill", "Show transparent lines to use as boundary for filling");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ prop = RNA_def_property(srna, "use_fill_limit", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_FIT_DISABLE);
+ RNA_def_property_boolean_default(prop, true);
+ RNA_def_property_ui_text(prop, "Limit to Viewport", "Fill only visible areas in viewport");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+
prop = RNA_def_property(srna, "use_default_eraser", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_DEFAULT_ERASER);
RNA_def_property_boolean_default(prop, true);
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index 4f5828311d8..843cb326be2 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -3032,7 +3032,7 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna)
prop, "Use Original Scale", "Apply volume preservation over the original scaling");
RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
- /* volume presevation for "volumetric" scale mode */
+ /* Volume preservation for "volumetric" scale mode. */
prop = RNA_def_property(srna, "bulge", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0, 100.0f);
RNA_def_property_ui_text(
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index a46026fd08f..50c18cf1dae 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -75,6 +75,10 @@ const EnumPropertyItem rna_enum_keyframe_handle_type_items[] = {
{0, NULL, 0, NULL, NULL},
};
+/**
+ * \note this is a near exact duplicate of `gpencil_interpolation_type_items`,
+ * Changes here will likely apply there too.
+ */
const EnumPropertyItem rna_enum_beztriple_interpolation_mode_items[] = {
/* interpolation */
{0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"},
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index cec6a50d170..df3bd0cca29 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -1298,7 +1298,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_,
dcont = rna_find_container_def(cont);
- /* XXX - toto, detect supertype collisions */
+ /* TODO: detect super-type collisions. */
if (rna_findlink(&dcont->properties, identifier)) {
CLOG_ERROR(&LOG, "duplicate identifier \"%s.%s\"", CONTAINER_RNA_ID(cont), identifier);
DefRNA.error = true;
@@ -4111,6 +4111,16 @@ PropertyRNA *RNA_def_float_percentage(StructOrFunctionRNA *cont_,
ASSERT_SOFT_HARD_LIMITS;
+#ifdef DEBUG
+ /* Properties with PROP_PERCENTAGE should use a range like 0 to 100, unlike PROP_FACTOR. */
+ if (hardmax < 2.0f) {
+ CLOG_WARN(&LOG,
+ "Percentage property with incorrect range: %s.%s",
+ CONTAINER_RNA_ID(cont),
+ identifier);
+ }
+#endif
+
prop = RNA_def_property(cont, identifier, PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_float_default(prop, default_value);
if (hardmin != hardmax) {
diff --git a/source/blender/makesrna/intern/rna_depsgraph.c b/source/blender/makesrna/intern/rna_depsgraph.c
index cbb642577e1..aab81b2bd1f 100644
--- a/source/blender/makesrna/intern/rna_depsgraph.c
+++ b/source/blender/makesrna/intern/rna_depsgraph.c
@@ -684,7 +684,7 @@ static void rna_def_depsgraph(BlenderRNA *brna)
"This invalidates all references to evaluated data-blocks from this dependency graph.");
RNA_def_function_flag(func, FUNC_USE_MAIN | FUNC_USE_REPORTS);
- /* Queries for original datablockls (the ones depsgraph is built for). */
+ /* Queries for original data-blocks (the ones depsgraph is built for). */
prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Scene");
@@ -699,7 +699,7 @@ static void rna_def_depsgraph(BlenderRNA *brna)
RNA_def_property_ui_text(
prop, "View Layer", "Original view layer dependency graph is built for");
- /* Queries for evaluated datablockls (the ones depsgraph is evaluating). */
+ /* Queries for evaluated data-blocks (the ones depsgraph is evaluating). */
func = RNA_def_function(srna, "id_eval_get", "rna_Depsgraph_id_eval_get");
parm = RNA_def_pointer(
diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.c b/source/blender/makesrna/intern/rna_dynamicpaint.c
index 7c4762aa3a3..83df997b3d4 100644
--- a/source/blender/makesrna/intern/rna_dynamicpaint.c
+++ b/source/blender/makesrna/intern/rna_dynamicpaint.c
@@ -625,7 +625,7 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_OUT1);
RNA_def_property_ui_text(prop, "Use Output", "Save this output layer");
- /* output for secondary sufrace data */
+ /* Output for secondary surface data. */
prop = RNA_def_property(srna, "output_name_b", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "output_name2");
RNA_def_property_ui_text(prop, "Output Name", "Name used to save output from this surface");
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index b4e864eb4e1..989a41b9ad6 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -1129,6 +1129,12 @@ static void rna_Keyframe_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *p
rna_tag_animation_update(bmain, ptr->owner_id);
}
+static void rna_FModifier_show_expanded_set(PointerRNA *ptr, bool value)
+{
+ FModifier *fcm = ptr->data;
+ SET_FLAG_FROM_TEST(fcm->ui_expand_flag, value, UI_PANEL_DATA_EXPAND_ROOT);
+}
+
#else
static void rna_def_fmodifier_generator(BlenderRNA *brna)
@@ -1187,6 +1193,8 @@ static void rna_def_fmodifier_generator(BlenderRNA *brna)
NULL);
RNA_def_property_ui_text(
prop, "Coefficients", "Coefficients for 'x' (starting from lowest power of x^0)");
+ RNA_def_property_update(
+ prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_FModifier_verify_data_update");
}
/* --------- */
@@ -1219,7 +1227,7 @@ static void rna_def_fmodifier_function_generator(BlenderRNA *brna)
prop = RNA_def_property(srna, "phase_multiplier", PROP_FLOAT, PROP_NONE);
RNA_def_property_ui_text(
- prop, "Phase Multiplier", "Scale factor determining the 'speed' of the function");
+ prop, "Phase Multiple", "Scale factor determining the 'speed' of the function");
RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_FModifier_update");
prop = RNA_def_property(srna, "phase_offset", PROP_FLOAT, PROP_NONE);
@@ -1632,13 +1640,14 @@ static void rna_def_fmodifier(BlenderRNA *brna)
/* settings */
prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_EXPANDED);
+ RNA_def_property_boolean_sdna(prop, NULL, "ui_expand_flag", 0);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_FModifier_show_expanded_set");
RNA_def_property_ui_text(prop, "Expanded", "F-Curve Modifier's panel is expanded in UI");
RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1);
prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_MUTED);
- RNA_def_property_ui_text(prop, "Muted", "Disable F-Curve Modifier evaluation");
+ RNA_def_property_ui_text(prop, "Enabled", "Enable F-Curve modifier evaluation");
RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update");
RNA_def_property_ui_icon(prop, ICON_CHECKBOX_HLT, -1);
@@ -1652,7 +1661,7 @@ static void rna_def_fmodifier(BlenderRNA *brna)
/* TODO: setting this to true must ensure that all others in stack are turned off too... */
prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_ACTIVE);
- RNA_def_property_ui_text(prop, "Active", "F-Curve Modifier is the one being edited");
+ RNA_def_property_ui_text(prop, "Active", "F-Curve modifier will show settings in the editor");
RNA_def_property_boolean_funcs(prop, NULL, "rna_FModifier_active_set");
RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_active_update");
RNA_def_property_ui_icon(prop, ICON_RADIOBUT_OFF, 1);
@@ -1666,8 +1675,6 @@ static void rna_def_fmodifier(BlenderRNA *brna)
"F-Curve Modifier is only applied for the specified frame range to help "
"mask off effects in order to chain them");
RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update");
- RNA_def_property_ui_icon(
- prop, ICON_DISCLOSURE_TRI_RIGHT, 1); /* XXX: depends on UI implementation */
prop = RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sfra");
@@ -1709,8 +1716,6 @@ static void rna_def_fmodifier(BlenderRNA *brna)
RNA_def_property_ui_text(
prop, "Use Influence", "F-Curve Modifier's effects will be tempered by a default factor");
RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update");
- RNA_def_property_ui_icon(
- prop, ICON_DISCLOSURE_TRI_RIGHT, 1); /* XXX: depends on UI implementation */
prop = RNA_def_property(srna, "influence", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "influence");
diff --git a/source/blender/makesrna/intern/rna_fluid.c b/source/blender/makesrna/intern/rna_fluid.c
index 3ea98d610f4..a34c3c7b536 100644
--- a/source/blender/makesrna/intern/rna_fluid.c
+++ b/source/blender/makesrna/intern/rna_fluid.c
@@ -1964,7 +1964,7 @@ static void rna_def_fluid_domain_settings(BlenderRNA *brna)
RNA_def_property_ui_text(
prop,
"Tension",
- "Surface tension of liquid (higher value results in greater hydrophobic behaviour)");
+ "Surface tension of liquid (higher value results in greater hydrophobic behavior)");
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_datacache_reset");
prop = RNA_def_property(srna, "viscosity_base", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index 81e20003d8f..f9caa746dac 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -168,6 +168,7 @@ static const EnumPropertyItem rna_enum_gpencil_caps_modes_items[] = {
# include "BKE_action.h"
# include "BKE_animsys.h"
+# include "BKE_deform.h"
# include "BKE_gpencil.h"
# include "BKE_gpencil_curve.h"
# include "BKE_gpencil_geom.h"
@@ -182,6 +183,16 @@ static void rna_GPencil_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Pointe
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
}
+static void rna_GpencilLayerMatrix_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bGPDlayer *gpl = (bGPDlayer *)ptr->data;
+
+ loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale);
+ invert_m4_m4(gpl->layer_invmat, gpl->layer_mat);
+
+ rna_GPencil_update(bmain, scene, ptr);
+}
+
static void rna_GPencil_curve_edit_mode_toggle(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ToolSettings *ts = scene->toolsettings;
@@ -706,7 +717,7 @@ static void rna_GPencil_stroke_point_select_set(PointerRNA *ptr, const bool valu
}
/* Check if the stroke should be selected or not... */
- BKE_gpencil_stroke_sync_selection(gps);
+ BKE_gpencil_stroke_sync_selection(gpd, gps);
}
}
@@ -806,6 +817,74 @@ static void rna_GPencil_stroke_point_pop(ID *id,
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
}
+static void rna_GPencil_stroke_point_update(ID *id, bGPDstroke *stroke)
+{
+ bGPdata *gpd = (bGPdata *)id;
+
+ /* Calc geometry data. */
+ if (stroke) {
+ BKE_gpencil_stroke_geometry_update(gpd, stroke);
+
+ 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, NULL);
+ }
+}
+
+static float rna_GPencilStrokePoints_weight_get(bGPDstroke *stroke,
+ ReportList *reports,
+ int vertex_group_index,
+ int point_index)
+{
+ MDeformVert *dvert = stroke->dvert;
+ if (dvert == NULL) {
+ BKE_report(reports, RPT_ERROR, "Groups: No groups for this stroke");
+ return -1.0f;
+ }
+
+ if (dvert->totweight <= vertex_group_index || vertex_group_index < 0) {
+ BKE_report(reports, RPT_ERROR, "Groups: index out of range");
+ return -1.0f;
+ }
+
+ if (stroke->totpoints <= point_index || point_index < 0) {
+ BKE_report(reports, RPT_ERROR, "GPencilStrokePoints: index out of range");
+ return -1.0f;
+ }
+
+ MDeformVert *pt_dvert = stroke->dvert + point_index;
+ MDeformWeight *dw = BKE_defvert_find_index(pt_dvert, vertex_group_index);
+ if (dw) {
+ return dw->weight;
+ }
+
+ return -1.0f;
+}
+
+static void rna_GPencilStrokePoints_weight_set(
+ bGPDstroke *stroke, ReportList *reports, int vertex_group_index, int point_index, float weight)
+{
+ BKE_gpencil_dvert_ensure(stroke);
+
+ MDeformVert *dvert = stroke->dvert;
+ if (dvert == NULL) {
+ BKE_report(reports, RPT_ERROR, "Groups: No groups for this stroke");
+ return;
+ }
+
+ if (stroke->totpoints <= point_index || point_index < 0) {
+ BKE_report(reports, RPT_ERROR, "GPencilStrokePoints: index out of range");
+ return;
+ }
+
+ MDeformVert *pt_dvert = stroke->dvert + point_index;
+ MDeformWeight *dw = BKE_defvert_ensure_index(pt_dvert, vertex_group_index);
+ if (dw) {
+ dw->weight = weight;
+ }
+}
+
static bGPDstroke *rna_GPencil_stroke_new(bGPDframe *frame)
{
bGPDstroke *stroke = BKE_gpencil_stroke_new(0, 0, 1.0f);
@@ -854,6 +933,7 @@ static void rna_GPencil_stroke_close(ID *id,
static void rna_GPencil_stroke_select_set(PointerRNA *ptr, const bool value)
{
+ bGPdata *gpd = (bGPdata *)ptr->owner_id;
bGPDstroke *gps = ptr->data;
bGPDspoint *pt;
int i;
@@ -861,9 +941,11 @@ static void rna_GPencil_stroke_select_set(PointerRNA *ptr, const bool value)
/* set new value */
if (value) {
gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
}
else {
gps->flag &= ~GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_reset(gps);
}
/* ensure that the stroke's points are selected in the same way */
@@ -940,7 +1022,7 @@ static void rna_GPencil_frame_remove(bGPDlayer *layer, ReportList *reports, Poin
static bGPDframe *rna_GPencil_frame_copy(bGPDlayer *layer, bGPDframe *src)
{
- bGPDframe *frame = BKE_gpencil_frame_duplicate(src);
+ bGPDframe *frame = BKE_gpencil_frame_duplicate(src, true);
while (BKE_gpencil_layer_frame_find(layer, frame->framenum)) {
frame->framenum++;
@@ -1044,21 +1126,6 @@ static void rna_GPencil_clear(bGPdata *gpd)
WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
}
-static void rna_GpencilVertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
-{
- bGPDstroke *gps = ptr->data;
-
- if (gps->dvert) {
- MDeformVert *dvert = gps->dvert;
-
- rna_iterator_array_begin(
- iter, (void *)dvert->dw, sizeof(MDeformWeight), dvert->totweight, 0, NULL);
- }
- else {
- rna_iterator_array_begin(iter, NULL, 0, 0, 0, NULL);
- }
-}
-
static char *rna_GreasePencilGrid_path(PointerRNA *UNUSED(ptr))
{
return BLI_strdup("grid");
@@ -1264,6 +1331,58 @@ static void rna_def_gpencil_stroke_points_api(BlenderRNA *brna, PropertyRNA *cpr
RNA_def_function_ui_description(func, "Remove a grease pencil stroke point");
RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID);
RNA_def_int(func, "index", -1, INT_MIN, INT_MAX, "Index", "point index", INT_MIN, INT_MAX);
+
+ func = RNA_def_function(srna, "update", "rna_GPencil_stroke_point_update");
+ RNA_def_function_ui_description(func, "Recalculate internal triangulation data");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID);
+
+ func = RNA_def_function(srna, "weight_get", "rna_GPencilStrokePoints_weight_get");
+ RNA_def_function_ui_description(func, "Get vertex group point weight");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_int(func,
+ "vertex_group_index",
+ 0,
+ 0,
+ INT_MAX,
+ "Vertex Group Index",
+ "Index of Vertex Group in the array of groups",
+ 0,
+ INT_MAX);
+ RNA_def_int(func,
+ "point_index",
+ 0,
+ 0,
+ INT_MAX,
+ "Point Index",
+ "Index of the Point in the array",
+ 0,
+ INT_MAX);
+ parm = RNA_def_float(
+ func, "weight", 0, -FLT_MAX, FLT_MAX, "Weight", "Point Weight", -FLT_MAX, FLT_MAX);
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "weight_set", "rna_GPencilStrokePoints_weight_set");
+ RNA_def_function_ui_description(func, "Set vertex group point weight");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_int(func,
+ "vertex_group_index",
+ 0,
+ 0,
+ INT_MAX,
+ "Vertex Group Index",
+ "Index of Vertex Group in the array of groups",
+ 0,
+ INT_MAX);
+ RNA_def_int(func,
+ "point_index",
+ 0,
+ 0,
+ INT_MAX,
+ "Point Index",
+ "Index of the Point in the array",
+ 0,
+ INT_MAX);
+ RNA_def_float(func, "weight", 0, -FLT_MAX, FLT_MAX, "Weight", "Point Weight", -FLT_MAX, FLT_MAX);
}
/* This information is read only and it can be used by add-ons */
@@ -1491,21 +1610,6 @@ static void rna_def_gpencil_stroke(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Stroke Points", "Stroke data points");
rna_def_gpencil_stroke_points_api(brna, prop);
- /* vertex groups */
- prop = RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_funcs(prop,
- "rna_GpencilVertex_groups_begin",
- "rna_iterator_array_next",
- "rna_iterator_array_end",
- "rna_iterator_array_get",
- NULL,
- NULL,
- NULL,
- NULL);
- RNA_def_property_struct_type(prop, "GpencilVertexGroupElement");
- RNA_def_property_ui_text(
- prop, "Groups", "Weights for the vertex groups this vertex is member of");
-
/* Triangles */
prop = RNA_def_property(srna, "triangles", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "triangles", "tot_triangles");
@@ -1643,6 +1747,11 @@ static void rna_def_gpencil_stroke(BlenderRNA *brna)
RNA_def_property_ui_text(
prop, "Vertex Fill Color", "Color used to mix with fill color to get final color");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
+ /* Selection Index */
+ prop = RNA_def_property(srna, "select_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "select_index");
+ RNA_def_property_ui_text(prop, "Select Index", "Index of selection used for interpolation");
}
static void rna_def_gpencil_strokes_api(BlenderRNA *brna, PropertyRNA *cprop)
@@ -2012,6 +2121,45 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Blend Mode", "Blend mode");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+ /* Layer transforms. */
+ prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
+ RNA_def_property_float_sdna(prop, NULL, "location");
+ RNA_def_property_ui_text(prop, "Location", "Values for change location");
+ RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
+ RNA_def_property_update(prop, 0, "rna_GpencilLayerMatrix_update");
+
+ prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_EULER);
+ RNA_def_property_float_sdna(prop, NULL, "rotation");
+ RNA_def_property_ui_text(prop, "Rotation", "Values for changes in rotation");
+ RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
+ RNA_def_property_update(prop, 0, "rna_GpencilLayerMatrix_update");
+
+ prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
+ RNA_def_property_float_sdna(prop, NULL, "scale");
+ RNA_def_property_float_default(prop, 1.0f);
+ RNA_def_property_ui_text(prop, "Scale", "Values 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_GpencilLayerMatrix_update");
+
+ /* Layer matrix. */
+ prop = RNA_def_property(srna, "matrix_layer", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_float_sdna(prop, NULL, "layer_mat");
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_NO_COMPARISON);
+ RNA_def_property_override_clear_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+ RNA_def_property_ui_text(prop, "Matrix Layer", "Local Layer transformation matrix");
+
+ /* Layer inverse matrix. */
+ prop = RNA_def_property(srna, "matrix_inverse_layer", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_float_sdna(prop, NULL, "layer_invmat");
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_NO_COMPARISON);
+ RNA_def_property_override_clear_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+ RNA_def_property_ui_text(
+ prop, "Matrix Layer Inverse", "Local Layer transformation inverse matrix");
+
/* Flags */
prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE);
diff --git a/source/blender/makesrna/intern/rna_gpencil_modifier.c b/source/blender/makesrna/intern/rna_gpencil_modifier.c
index 89eb989a442..71d5a53adb2 100644
--- a/source/blender/makesrna/intern/rna_gpencil_modifier.c
+++ b/source/blender/makesrna/intern/rna_gpencil_modifier.c
@@ -489,7 +489,7 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_ui_text(prop, "Seed", "Random seed");
+ RNA_def_property_ui_text(prop, "Noise Seed", "Random seed");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_FACTOR);
@@ -498,6 +498,13 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Scale", "Scale the noise frequency");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "noise_offset", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "noise_offset");
+ RNA_def_property_range(prop, 0.0, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0, 100.0, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Noise Offset", "Offset the noise along the strokes");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
prop = RNA_def_property(srna, "use_custom_curve", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_CUSTOM_CURVE);
RNA_def_property_ui_text(
diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c
index 25472ce9520..319aeb69a2b 100644
--- a/source/blender/makesrna/intern/rna_lattice.c
+++ b/source/blender/makesrna/intern/rna_lattice.c
@@ -132,12 +132,12 @@ static void rna_Lattice_update_size(Main *bmain, Scene *scene, PointerRNA *ptr)
Object *ob;
int newu, newv, neww;
- /* we don't modify the actual pnts, but go through opnts instead */
+ /* We don't modify the actual `pnts`, but go through `opnts` instead. */
newu = (lt->opntsu > 0) ? lt->opntsu : lt->pntsu;
newv = (lt->opntsv > 0) ? lt->opntsv : lt->pntsv;
neww = (lt->opntsw > 0) ? lt->opntsw : lt->pntsw;
- /* BKE_lattice_resize needs an object, any object will have the same result */
+ /* #BKE_lattice_resize needs an object, any object will have the same result */
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
if (ob->data == lt) {
BKE_lattice_resize(lt, newu, newv, neww, ob);
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index d162917ea0c..f92a2932f06 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -288,7 +288,7 @@ void RNA_api_mesh(StructRNA *srna)
"Define custom split normals of this mesh "
"(use zero-vectors to keep auto ones)");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- /* TODO, see how array size of 0 works, this shouldnt be used */
+ /* TODO, see how array size of 0 works, this shouldn't be used */
parm = RNA_def_float_array(func, "normals", 1, NULL, -1.0f, 1.0f, "", "Normals", 0.0f, 0.0f);
RNA_def_property_multi_array(parm, 2, normals_array_dim);
RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED);
@@ -301,7 +301,7 @@ void RNA_api_mesh(StructRNA *srna)
"Define custom split normals of this mesh, from vertices' normals "
"(use zero-vectors to keep auto ones)");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- /* TODO, see how array size of 0 works, this shouldnt be used */
+ /* TODO, see how array size of 0 works, this shouldn't be used */
parm = RNA_def_float_array(func, "normals", 1, NULL, -1.0f, 1.0f, "", "Normals", 0.0f, 0.0f);
RNA_def_property_multi_array(parm, 2, normals_array_dim);
RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index e02e47745b0..ae10b637b30 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -681,7 +681,7 @@ static void rna_Modifier_is_active_set(PointerRNA *ptr, bool value)
ModifierData *md = ptr->data;
if (value) {
- /* Disable the active flag of all other modif-iers. */
+ /* Disable the active flag of all other modifiers. */
for (ModifierData *prev_md = md->prev; prev_md != NULL; prev_md = prev_md->prev) {
prev_md->flag &= ~eModifierFlag_Active;
}
@@ -1632,33 +1632,35 @@ static IDProperty *rna_NodesModifier_properties(PointerRNA *ptr, bool create)
static void rna_def_property_subdivision_common(StructRNA *srna)
{
static const EnumPropertyItem prop_uv_smooth_items[] = {
- {SUBSURF_UV_SMOOTH_NONE, "NONE", 0, "None", "UVs are not smoothed, boundaries are kept sharp"},
- {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS,
- "PRESERVE_CORNERS",
- 0,
- "Keep Corners",
- "UVs are smoothed, corners on discontinuous boundary are kept sharp"},
-# if 0
- {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS_AND_JUNCTIONS,
- "PRESERVE_CORNERS_AND_JUNCTIONS",
- 0,
- "Smooth, keep corners+junctions",
- "UVs are smoothed, corners on discontinuous boundary and "
- "junctions of 3 or more regions are kept sharp"},
- {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS_JUNCTIONS_AND_CONCAVE,
- "PRESERVE_CORNERS_JUNCTIONS_AND_CONCAVE",
- 0,
- "Smooth, keep corners+junctions+concave",
- "UVs are smoothed, corners on discontinuous boundary, "
- "junctions of 3 or more regions and darts and concave corners are kept sharp"},
- {SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES,
- "PRESERVE_BOUNDARIES",
- 0,
- "Smooth, keep corners",
- "UVs are smoothed, boundaries are kept sharp"},
-# endif
- {SUBSURF_UV_SMOOTH_ALL, "PRESERVE_BOUNDARIES", 0, "All", "UVs and boundaries are smoothed"},
- {0, NULL, 0, NULL, NULL},
+ {SUBSURF_UV_SMOOTH_NONE,
+ "NONE",
+ 0,
+ "None",
+ "UVs are not smoothed, boundaries are kept sharp"},
+ {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS,
+ "PRESERVE_CORNERS",
+ 0,
+ "Keep Corners",
+ "UVs are smoothed, corners on discontinuous boundary are kept sharp"},
+ {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS_AND_JUNCTIONS,
+ "PRESERVE_CORNERS_AND_JUNCTIONS",
+ 0,
+ "Keep Corners, Junctions",
+ "UVs are smoothed, corners on discontinuous boundary and "
+ "junctions of 3 or more regions are kept sharp"},
+ {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS_JUNCTIONS_AND_CONCAVE,
+ "PRESERVE_CORNERS_JUNCTIONS_AND_CONCAVE",
+ 0,
+ "Keep Corners, Junctions, Concave",
+ "UVs are smoothed, corners on discontinuous boundary, "
+ "junctions of 3 or more regions and darts and concave corners are kept sharp"},
+ {SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES,
+ "PRESERVE_BOUNDARIES",
+ 0,
+ "Keep Boundaries",
+ "UVs are smoothed, boundaries are kept sharp"},
+ {SUBSURF_UV_SMOOTH_ALL, "SMOOTH_ALL", 0, "All", "UVs and boundaries are smoothed"},
+ {0, NULL, 0, NULL, NULL},
};
static const EnumPropertyItem prop_boundary_smooth_items[] = {
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index f9b5041b1cf..46fdfe4a862 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -29,6 +29,7 @@
#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_particle_types.h"
@@ -354,6 +355,30 @@ const EnumPropertyItem rna_enum_node_filter_items[] = {
{0, NULL, 0, NULL, NULL},
};
+static const EnumPropertyItem rna_node_geometry_attribute_randomize_operation_items[] = {
+ {GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE,
+ "REPLACE_CREATE",
+ ICON_NONE,
+ "Replace/Create",
+ "Replace the value and data type of an existing attribute, or create a new one"},
+ {GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD,
+ "ADD",
+ ICON_NONE,
+ "Add",
+ "Add the random values to the existing attribute values"},
+ {GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT,
+ "SUBTRACT",
+ ICON_NONE,
+ "Subtract",
+ "Subtract random values from the existing attribute values"},
+ {GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY,
+ "MULTIPLY",
+ ICON_NONE,
+ "Multiply",
+ "Multiply the existing attribute values with the random values"},
+ {0, NULL, 0, NULL, NULL},
+};
+
#ifndef RNA_RUNTIME
static const EnumPropertyItem node_sampler_type_items[] = {
{0, "NEAREST", 0, "Nearest", ""},
@@ -373,74 +398,6 @@ static const EnumPropertyItem prop_shader_output_target_items[] = {
{0, NULL, 0, NULL, NULL},
};
-static const EnumPropertyItem rna_node_geometry_boolean_method_items[] = {
- {GEO_NODE_BOOLEAN_INTERSECT,
- "INTERSECT",
- 0,
- "Intersect",
- "Keep the part of the mesh that is common between all operands"},
- {GEO_NODE_BOOLEAN_UNION, "UNION", 0, "Union", "Combine meshes in an additive way"},
- {GEO_NODE_BOOLEAN_DIFFERENCE,
- "DIFFERENCE",
- 0,
- "Difference",
- "Combine meshes in a subtractive way"},
- {0, NULL, 0, NULL, NULL},
-};
-
-static const EnumPropertyItem rna_node_geometry_triangulate_quad_method_items[] = {
- {GEO_NODE_TRIANGULATE_QUAD_BEAUTY,
- "BEAUTY",
- 0,
- "Beauty",
- "Split the quads in nice triangles, slower method"},
- {GEO_NODE_TRIANGULATE_QUAD_FIXED,
- "FIXED",
- 0,
- "Fixed",
- "Split the quads on the first and third vertices"},
- {GEO_NODE_TRIANGULATE_QUAD_ALTERNATE,
- "FIXED_ALTERNATE",
- 0,
- "Fixed Alternate",
- "Split the quads on the 2nd and 4th vertices"},
- {GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE,
- "SHORTEST_DIAGONAL",
- 0,
- "Shortest Diagonal",
- "Split the quads based on the distance between the vertices"},
- {0, NULL, 0, NULL, NULL},
-};
-
-static const EnumPropertyItem rna_node_geometry_triangulate_ngon_method_items[] = {
- {GEO_NODE_TRIANGULATE_NGON_BEAUTY,
- "BEAUTY",
- 0,
- "Beauty",
- "Arrange the new triangles evenly (slow)"},
- {GEO_NODE_TRIANGULATE_NGON_EARCLIP,
- "CLIP",
- 0,
- "Clip",
- "Split the polygons with an ear clipping algorithm"},
- {0, NULL, 0, NULL, NULL},
-};
-
-static const EnumPropertyItem rna_node_geometry_point_distribute_method_items[] = {
- {GEO_NODE_POINT_DISTRIBUTE_RANDOM,
- "RANDOM",
- 0,
- "Random",
- "Distribute points randomly on the surface"},
- {GEO_NODE_POINT_DISTRIBUTE_POISSON,
- "POISSON",
- 0,
- "Poisson Disk",
- "Distribute the points randomly on the surface while taking a minimum distance between "
- "points into account"},
- {0, NULL, 0, NULL, NULL},
-};
-
#endif
#define ITEM_ATTRIBUTE \
@@ -1920,7 +1877,7 @@ static const EnumPropertyItem *itemf_function_check(
static bool attribute_random_type_supported(const EnumPropertyItem *item)
{
- return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_BOOL);
+ return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_BOOL, CD_PROP_INT32);
}
static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_type_itemf(
bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
@@ -1929,20 +1886,53 @@ static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_type_itemf(
return itemf_function_check(rna_enum_attribute_type_items, attribute_random_type_supported);
}
-static bool attribute_random_domain_supported(const EnumPropertyItem *item)
+static const EnumPropertyItem *rna_GeometryNodeAttributeRandomize_operation_itemf(
+ bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
{
- return item->value == ATTR_DOMAIN_POINT;
+ bNode *node = ptr->data;
+ const NodeAttributeRandomize *node_storage = (NodeAttributeRandomize *)node->storage;
+ const CustomDataType data_type = (CustomDataType)node_storage->data_type;
+
+ EnumPropertyItem *item_array = NULL;
+ int items_len = 0;
+ for (const EnumPropertyItem *item = rna_node_geometry_attribute_randomize_operation_items;
+ item->identifier != NULL;
+ item++) {
+ if (data_type == CD_PROP_BOOL) {
+ if (item->value == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) {
+ RNA_enum_item_add(&item_array, &items_len, item);
+ }
+ }
+ else {
+ RNA_enum_item_add(&item_array, &items_len, item);
+ }
+ }
+ RNA_enum_item_end(&item_array, &items_len);
+
+ *r_free = true;
+ return item_array;
}
-static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_domain_itemf(
- bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
+
+static void rna_GeometryNodeAttributeRandomize_data_type_update(Main *bmain,
+ Scene *scene,
+ PointerRNA *ptr)
{
- *r_free = true;
- return itemf_function_check(rna_enum_attribute_domain_items, attribute_random_domain_supported);
+ bNode *node = ptr->data;
+ NodeAttributeRandomize *node_storage = (NodeAttributeRandomize *)node->storage;
+
+ /* The boolean data type has no extra operations besides,
+ * replace, so make sure the enum value is set properly. */
+ if (node_storage->data_type == CD_PROP_BOOL) {
+ node_storage->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE;
+ }
+
+ rna_Node_socket_update(bmain, scene, ptr);
}
static bool attribute_fill_type_supported(const EnumPropertyItem *item)
{
- return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_COLOR, CD_PROP_BOOL);
+ return ELEM(
+ item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_COLOR, CD_PROP_BOOL, CD_PROP_INT32);
}
static const EnumPropertyItem *rna_GeometryNodeAttributeFill_type_itemf(bContext *UNUSED(C),
PointerRNA *UNUSED(ptr),
@@ -1964,22 +1954,6 @@ static const EnumPropertyItem *rna_GeometryNodeAttributeFill_domain_itemf(
return itemf_function_check(rna_enum_attribute_domain_items, attribute_fill_domain_supported);
}
-static bool attribute_math_operation_supported(const EnumPropertyItem *item)
-{
- return ELEM(item->value,
- NODE_MATH_ADD,
- NODE_MATH_SUBTRACT,
- NODE_MATH_MULTIPLY,
- NODE_MATH_DIVIDE) &&
- (item->identifier[0] != '\0');
-}
-static const EnumPropertyItem *rna_GeometryNodeAttributeMath_operation_itemf(
- bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
-{
- *r_free = true;
- return itemf_function_check(rna_enum_node_math_items, attribute_math_operation_supported);
-}
-
/**
* This bit of ugly code makes sure the float / attribute option shows up instead of
* vector / attribute if the node uses an operation that uses a float for input B.
@@ -4139,6 +4113,38 @@ void rna_ShaderNodePointDensity_density_minmax(bNode *self,
RE_point_density_minmax(depsgraph, pd, r_min, r_max);
}
+static void rna_NodeInputString_string_get(PointerRNA *ptr, char *value)
+{
+ bNode *node = (bNode *)ptr->data;
+ NodeInputString *storage = node->storage;
+
+ strcpy(value, (storage->string) ? storage->string : "");
+}
+
+static int rna_NodeInputString_string_length(PointerRNA *ptr)
+{
+ bNode *node = (bNode *)ptr->data;
+ NodeInputString *storage = node->storage;
+
+ return (storage->string) ? strlen(storage->string) : 0;
+}
+
+static void rna_NodeInputString_string_set(PointerRNA *ptr, const char *value)
+{
+ bNode *node = (bNode *)ptr->data;
+ NodeInputString *storage = node->storage;
+
+ if (storage->string) {
+ MEM_freeN(storage->string);
+ }
+
+ if (value && value[0]) {
+ storage->string = BLI_strdup(value);
+ }
+ else {
+ storage->string = NULL;
+ }
+}
#else
static const EnumPropertyItem prop_image_layer_items[] = {
@@ -4565,6 +4571,21 @@ static void def_fn_input_vector(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
+static void def_fn_input_string(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeInputString", "storage");
+
+ prop = RNA_def_property(srna, "string", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_funcs(prop,
+ "rna_NodeInputString_string_get",
+ "rna_NodeInputString_string_length",
+ "rna_NodeInputString_string_set");
+ RNA_def_property_ui_text(prop, "String", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+}
+
/* -- Shader Nodes ---------------------------------------------------------- */
static void def_sh_output(StructRNA *srna)
@@ -4741,9 +4762,10 @@ static void def_sh_tex_sky(StructRNA *srna)
RNA_def_property_float_default(prop, 0.0f);
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "altitude", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "altitude", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_ui_text(prop, "Altitude", "Height from sea level");
- RNA_def_property_range(prop, 0.0f, 60.0f);
+ RNA_def_property_range(prop, 0.0f, 60000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 60000.0f, 10, 1);
RNA_def_property_float_default(prop, 0.0f);
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
@@ -5395,7 +5417,7 @@ static void def_sh_tex_pointdensity(StructRNA *srna)
func = RNA_def_function(srna, "calc_point_density", "rna_ShaderNodePointDensity_density_calc");
RNA_def_function_ui_description(func, "Calculate point density");
RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
- /* TODO, See how array size of 0 works, this shouldnt be used. */
+ /* TODO, See how array size of 0 works, this shouldn't be used. */
parm = RNA_def_float_array(func, "rgba_values", 1, NULL, 0, 0, "", "RGBA Values", 0, 0);
RNA_def_parameter_flags(parm, PROP_DYNAMIC, 0);
RNA_def_function_output(func, parm);
@@ -8482,6 +8504,21 @@ static void def_geo_boolean(StructRNA *srna)
{
PropertyRNA *prop;
+ static const EnumPropertyItem rna_node_geometry_boolean_method_items[] = {
+ {GEO_NODE_BOOLEAN_INTERSECT,
+ "INTERSECT",
+ 0,
+ "Intersect",
+ "Keep the part of the mesh that is common between all operands"},
+ {GEO_NODE_BOOLEAN_UNION, "UNION", 0, "Union", "Combine meshes in an additive way"},
+ {GEO_NODE_BOOLEAN_DIFFERENCE,
+ "DIFFERENCE",
+ 0,
+ "Difference",
+ "Combine meshes in a subtractive way"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, rna_node_geometry_boolean_method_items);
@@ -8494,6 +8531,44 @@ static void def_geo_triangulate(StructRNA *srna)
{
PropertyRNA *prop;
+ static const EnumPropertyItem rna_node_geometry_triangulate_quad_method_items[] = {
+ {GEO_NODE_TRIANGULATE_QUAD_BEAUTY,
+ "BEAUTY",
+ 0,
+ "Beauty",
+ "Split the quads in nice triangles, slower method"},
+ {GEO_NODE_TRIANGULATE_QUAD_FIXED,
+ "FIXED",
+ 0,
+ "Fixed",
+ "Split the quads on the first and third vertices"},
+ {GEO_NODE_TRIANGULATE_QUAD_ALTERNATE,
+ "FIXED_ALTERNATE",
+ 0,
+ "Fixed Alternate",
+ "Split the quads on the 2nd and 4th vertices"},
+ {GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE,
+ "SHORTEST_DIAGONAL",
+ 0,
+ "Shortest Diagonal",
+ "Split the quads based on the distance between the vertices"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ static const EnumPropertyItem rna_node_geometry_triangulate_ngon_method_items[] = {
+ {GEO_NODE_TRIANGULATE_NGON_BEAUTY,
+ "BEAUTY",
+ 0,
+ "Beauty",
+ "Arrange the new triangles evenly (slow)"},
+ {GEO_NODE_TRIANGULATE_NGON_EARCLIP,
+ "CLIP",
+ 0,
+ "Clip",
+ "Split the polygons with an ear clipping algorithm"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
prop = RNA_def_property(srna, "quad_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, rna_node_geometry_triangulate_quad_method_items);
@@ -8542,9 +8617,27 @@ static void def_geo_attribute_create_common(StructRNA *srna,
static void def_geo_attribute_randomize(StructRNA *srna)
{
- def_geo_attribute_create_common(srna,
- "rna_GeometryNodeAttributeRandom_type_itemf",
- "rna_GeometryNodeAttributeRandom_domain_itemf");
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeAttributeRandomize", "storage");
+
+ prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "data_type");
+ RNA_def_property_enum_items(prop, rna_enum_attribute_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeRandom_type_itemf");
+ RNA_def_property_enum_default(prop, CD_PROP_FLOAT);
+ RNA_def_property_ui_text(prop, "Data Type", "Type of data stored in attribute");
+ RNA_def_property_update(
+ prop, NC_NODE | NA_EDITED, "rna_GeometryNodeAttributeRandomize_data_type_update");
+
+ prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "operation");
+ RNA_def_property_enum_items(prop, rna_node_geometry_attribute_randomize_operation_items);
+ RNA_def_property_enum_funcs(
+ prop, NULL, NULL, "rna_GeometryNodeAttributeRandomize_operation_itemf");
+ RNA_def_property_enum_default(prop, GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE);
+ RNA_def_property_ui_text(prop, "Operation", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
}
static void def_geo_attribute_fill(StructRNA *srna)
@@ -8563,10 +8656,9 @@ static void def_geo_attribute_math(StructRNA *srna)
prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "operation");
RNA_def_property_enum_items(prop, rna_enum_node_math_items);
- RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeMath_operation_itemf");
RNA_def_property_enum_default(prop, NODE_MATH_ADD);
RNA_def_property_ui_text(prop, "Operation", "");
- RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
prop = RNA_def_property(srna, "input_type_a", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "input_type_a");
@@ -8579,6 +8671,12 @@ static void def_geo_attribute_math(StructRNA *srna)
RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
RNA_def_property_ui_text(prop, "Input Type B", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+
+ prop = RNA_def_property(srna, "input_type_c", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "input_type_c");
+ RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
+ RNA_def_property_ui_text(prop, "Input Type C", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
}
static void def_geo_attribute_vector_math(StructRNA *srna)
@@ -8632,16 +8730,17 @@ static void def_geo_point_instance(StructRNA *srna)
};
PropertyRNA *prop;
+ RNA_def_struct_sdna_from(srna, "NodeGeometryPointInstance", "storage");
prop = RNA_def_property(srna, "instance_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "custom1");
+ RNA_def_property_enum_sdna(prop, NULL, "instance_type");
RNA_def_property_enum_items(prop, instance_type_items);
RNA_def_property_enum_default(prop, GEO_NODE_POINT_INSTANCE_TYPE_OBJECT);
RNA_def_property_ui_text(prop, "Instance Type", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
prop = RNA_def_property(srna, "use_whole_collection", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "custom2", 1);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GEO_NODE_POINT_INSTANCE_WHOLE_COLLECTION);
RNA_def_property_ui_text(prop, "Whole Collection", "Instance entire collection on each point");
RNA_def_property_update(prop, 0, "rna_Node_socket_update");
}
@@ -8682,7 +8781,7 @@ static void def_geo_attribute_attribute_compare(StructRNA *srna)
prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, rna_enum_node_float_compare_items);
- RNA_def_property_enum_default(prop, NODE_MATH_ADD);
+ RNA_def_property_enum_default(prop, NODE_FLOAT_COMPARE_GREATER_THAN);
RNA_def_property_ui_text(prop, "Operation", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
@@ -8701,6 +8800,21 @@ static void def_geo_point_distribute(StructRNA *srna)
{
PropertyRNA *prop;
+ static const EnumPropertyItem rna_node_geometry_point_distribute_method_items[] = {
+ {GEO_NODE_POINT_DISTRIBUTE_RANDOM,
+ "RANDOM",
+ 0,
+ "Random",
+ "Distribute points randomly on the surface"},
+ {GEO_NODE_POINT_DISTRIBUTE_POISSON,
+ "POISSON",
+ 0,
+ "Poisson Disk",
+ "Distribute the points randomly on the surface while taking a minimum distance between "
+ "points into account"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
prop = RNA_def_property(srna, "distribute_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, rna_node_geometry_point_distribute_method_items);
@@ -8802,6 +8916,30 @@ static void def_geo_align_rotation_to_vector(StructRNA *srna)
{0, NULL, 0, NULL, NULL},
};
+ static const EnumPropertyItem pivot_axis_items[] = {
+ {GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_AUTO,
+ "AUTO",
+ ICON_NONE,
+ "Auto",
+ "Automatically detect the best rotation axis to rotate towards the vector"},
+ {GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_X,
+ "X",
+ ICON_NONE,
+ "X",
+ "Rotate around the local X axis"},
+ {GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_Y,
+ "Y",
+ ICON_NONE,
+ "Y",
+ "Rotate around the local Y axis"},
+ {GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_Z,
+ "Z",
+ ICON_NONE,
+ "Z",
+ "Rotate around the local Z axis"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
PropertyRNA *prop;
RNA_def_struct_sdna_from(srna, "NodeGeometryAlignRotationToVector", "storage");
@@ -8811,6 +8949,11 @@ static void def_geo_align_rotation_to_vector(StructRNA *srna)
RNA_def_property_ui_text(prop, "Axis", "Axis to align to the vector");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+ prop = RNA_def_property(srna, "pivot_axis", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, pivot_axis_items);
+ RNA_def_property_ui_text(prop, "Pivot Axis", "Axis to rotate around");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+
prop = RNA_def_property(srna, "input_type_factor", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
RNA_def_property_ui_text(prop, "Input Type Factor", "");
@@ -8846,6 +8989,19 @@ static void def_geo_point_translate(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
}
+static void def_geo_attribute_sample_texture(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_struct_type(prop, "Texture");
+ RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+ RNA_def_property_ui_text(prop, "Texture", "Texture to sample values from");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
+}
+
static void def_geo_object_info(StructRNA *srna)
{
PropertyRNA *prop;
@@ -8876,6 +9032,162 @@ static void def_geo_object_info(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
+static void def_geo_points_to_volume(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ static EnumPropertyItem resolution_mode_items[] = {
+ {GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_AMOUNT,
+ "VOXEL_AMOUNT",
+ 0,
+ "Amount",
+ "Specify the approximate number of voxels along the diagonal"},
+ {GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_SIZE,
+ "VOXEL_SIZE",
+ 0,
+ "Size",
+ "Specify the voxel side length"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ RNA_def_struct_sdna_from(srna, "NodeGeometryPointsToVolume", "storage");
+
+ prop = RNA_def_property(srna, "resolution_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, resolution_mode_items);
+ RNA_def_property_ui_text(prop, "Resolution Mode", "How the voxel size is specified");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+
+ prop = RNA_def_property(srna, "input_type_radius", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
+ RNA_def_property_ui_text(prop, "Radius Input Type", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+}
+
+static void def_geo_collection_info(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ static const EnumPropertyItem rna_node_geometry_collection_info_transform_space_items[] = {
+ {GEO_NODE_TRANSFORM_SPACE_ORIGINAL,
+ "ORIGINAL",
+ 0,
+ "Original",
+ "Output the geometry relative to the collection offset"},
+ {GEO_NODE_TRANSFORM_SPACE_RELATIVE,
+ "RELATIVE",
+ 0,
+ "Relative",
+ "Bring the input collection geometry into the modified object, maintaining the relative "
+ "position between the objects in the scene"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ RNA_def_struct_sdna_from(srna, "NodeGeometryCollectionInfo", "storage");
+
+ prop = RNA_def_property(srna, "transform_space", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rna_node_geometry_collection_info_transform_space_items);
+ RNA_def_property_ui_text(prop, "Transform Space", "The transformation of the geometry output");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+}
+
+static void def_geo_attribute_proximity(StructRNA *srna)
+{
+ static const EnumPropertyItem target_geometry_element[] = {
+ {GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS,
+ "POINTS",
+ ICON_NONE,
+ "Points",
+ "Calculate proximity to the target's points (usually faster than the other two modes)"},
+ {GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_EDGES,
+ "EDGES",
+ ICON_NONE,
+ "Edges",
+ "Calculate proximity to the target's edges"},
+ {GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES,
+ "FACES",
+ ICON_NONE,
+ "Faces",
+ "Calculate proximity to the target's faces"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeGeometryAttributeProximity", "storage");
+
+ prop = RNA_def_property(srna, "target_geometry_element", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, target_geometry_element);
+ RNA_def_property_enum_default(prop, GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES);
+ RNA_def_property_ui_text(
+ prop, "Target Geometry", "Element of the target geometry to calculate the distance from");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+}
+
+static void def_geo_volume_to_mesh(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ static EnumPropertyItem resolution_mode_items[] = {
+ {VOLUME_TO_MESH_RESOLUTION_MODE_GRID,
+ "GRID",
+ 0,
+ "Grid",
+ "Use resolution of the volume grid"},
+ {VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_AMOUNT,
+ "VOXEL_AMOUNT",
+ 0,
+ "Voxel Amount",
+ "Desired number of voxels along one axis"},
+ {VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE,
+ "VOXEL_SIZE",
+ 0,
+ "Voxel Size",
+ "Desired voxel side length"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ RNA_def_struct_sdna_from(srna, "NodeGeometryVolumeToMesh", "storage");
+
+ prop = RNA_def_property(srna, "resolution_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, resolution_mode_items);
+ RNA_def_property_ui_text(prop, "Resolution Mode", "How the voxel size is specified");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+}
+
+static void def_geo_attribute_combine_xyz(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeAttributeCombineXYZ", "storage");
+
+ prop = RNA_def_property(srna, "input_type_x", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
+ RNA_def_property_ui_text(prop, "Input Type X", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+
+ prop = RNA_def_property(srna, "input_type_y", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
+ RNA_def_property_ui_text(prop, "Input Type Y", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+
+ prop = RNA_def_property(srna, "input_type_z", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
+ RNA_def_property_ui_text(prop, "Input Type Z", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+}
+
+static void def_geo_attribute_separate_xyz(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeAttributeSeparateXYZ", "storage");
+
+ prop = RNA_def_property(srna, "input_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector);
+ RNA_def_property_ui_text(prop, "Input Type", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
+}
+
/* -------------------------------------------------------------------------- */
static void rna_def_shader_node(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 6e534868120..799d1e8190c 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -85,16 +85,16 @@ const EnumPropertyItem rna_enum_object_mode_items[] = {
ICON_GREASEPENCIL,
"Draw",
"Paint Grease Pencil Strokes"},
- {OB_MODE_VERTEX_GPENCIL,
- "VERTEX_GPENCIL",
- ICON_VPAINT_HLT,
- "Vertex Paint",
- "Grease Pencil Vertex Paint Strokes"},
{OB_MODE_WEIGHT_GPENCIL,
"WEIGHT_GPENCIL",
ICON_WPAINT_HLT,
"Weight Paint",
"Grease Pencil Weight Paint Strokes"},
+ {OB_MODE_VERTEX_GPENCIL,
+ "VERTEX_GPENCIL",
+ ICON_VPAINT_HLT,
+ "Vertex Paint",
+ "Grease Pencil Vertex Paint Strokes"},
{0, NULL, 0, NULL, NULL},
};
@@ -1304,11 +1304,13 @@ static void rna_MaterialSlot_link_set(PointerRNA *ptr, int value)
if (value) {
ob->matbits[index] = 1;
- /* ob->colbits |= (1 << index); */ /* DEPRECATED */
+ /* DEPRECATED */
+ // ob->colbits |= (1 << index);
}
else {
ob->matbits[index] = 0;
- /* ob->colbits &= ~(1 << index); */ /* DEPRECATED */
+ /* DEPRECATED */
+ // ob->colbits &= ~(1 << index);
}
}
@@ -2125,8 +2127,8 @@ static void rna_def_vertex_group(BlenderRNA *brna)
func = RNA_def_function(srna, "add", "rna_VertexGroup_vertex_add");
RNA_def_function_ui_description(func, "Add vertices to the group");
RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID);
- /* TODO, see how array size of 0 works, this shouldnt be used */
- parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0);
+ /* TODO, see how array size of 0 works, this shouldn't be used */
+ parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0);
RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED);
parm = RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight", 0.0f, 1.0f);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
@@ -2134,10 +2136,10 @@ static void rna_def_vertex_group(BlenderRNA *brna)
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
func = RNA_def_function(srna, "remove", "rna_VertexGroup_vertex_remove");
- RNA_def_function_ui_description(func, "Remove a vertex from the group");
+ RNA_def_function_ui_description(func, "Remove vertices from the group");
RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID);
- /* TODO, see how array size of 0 works, this shouldnt be used */
- parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0);
+ /* TODO, see how array size of 0 works, this shouldn't be used */
+ parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0);
RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED);
func = RNA_def_function(srna, "weight", "rna_VertexGroup_weight");
@@ -2181,17 +2183,17 @@ static void rna_def_face_map(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Index", "Index number of the face map");
func = RNA_def_function(srna, "add", "rna_FaceMap_face_add");
- RNA_def_function_ui_description(func, "Add vertices to the group");
+ RNA_def_function_ui_description(func, "Add faces to the face-map");
RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID);
- /* TODO, see how array size of 0 works, this shouldnt be used */
- parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0);
+ /* TODO, see how array size of 0 works, this shouldn't be used */
+ parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0);
RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED);
func = RNA_def_function(srna, "remove", "rna_FaceMap_face_remove");
- RNA_def_function_ui_description(func, "Remove a vertex from the group");
+ RNA_def_function_ui_description(func, "Remove faces from the face-map");
RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID);
- /* TODO, see how array size of 0 works, this shouldnt be used */
- parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0);
+ /* TODO, see how array size of 0 works, this shouldn't be used */
+ parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0);
RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED);
}
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index 9fb883568c9..df628caa000 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -404,6 +404,29 @@ static void rna_Object_to_mesh_clear(Object *object)
BKE_object_to_mesh_clear(object);
}
+static Curve *rna_Object_to_curve(Object *object,
+ ReportList *reports,
+ Depsgraph *depsgraph,
+ bool apply_modifiers)
+{
+ if (!ELEM(object->type, OB_FONT, OB_CURVE)) {
+ BKE_report(reports, RPT_ERROR, "Object is not a curve or a text");
+ return NULL;
+ }
+
+ if (depsgraph == NULL) {
+ BKE_report(reports, RPT_ERROR, "Invalid depsgraph");
+ return NULL;
+ }
+
+ return BKE_object_to_curve(object, depsgraph, apply_modifiers);
+}
+
+static void rna_Object_to_curve_clear(Object *object)
+{
+ BKE_object_to_curve_clear(object);
+}
+
static PointerRNA rna_Object_shape_key_add(
Object *ob, bContext *C, ReportList *reports, const char *name, bool from_mix)
{
@@ -977,6 +1000,29 @@ void RNA_api_object(StructRNA *srna)
func = RNA_def_function(srna, "to_mesh_clear", "rna_Object_to_mesh_clear");
RNA_def_function_ui_description(func, "Clears mesh data-block created by to_mesh()");
+ /* curve */
+ func = RNA_def_function(srna, "to_curve", "rna_Object_to_curve");
+ RNA_def_function_ui_description(
+ func,
+ "Create a Curve data-block from the current state of the object. This only works for curve "
+ "and text objects. The object owns the data-block. To force free it, use to_curve_clear(). "
+ "The result is temporary and can not be used by objects from the main database");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm = RNA_def_pointer(
+ func, "depsgraph", "Depsgraph", "Dependency Graph", "Evaluated dependency graph");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+ RNA_def_boolean(func,
+ "apply_modifiers",
+ false,
+ "",
+ "Apply the deform modifiers on the control points of the curve. This is only "
+ "supported for curve objects");
+ parm = RNA_def_pointer(func, "curve", "Curve", "", "Curve created from object");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "to_curve_clear", "rna_Object_to_curve_clear");
+ RNA_def_function_ui_description(func, "Clears curve data-block created by to_curve()");
+
/* Armature */
func = RNA_def_function(srna, "find_armature", "BKE_modifiers_is_deformed_by_armature");
RNA_def_function_ui_description(
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index 89a6c7cdf9d..bd45990fe30 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -1142,6 +1142,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
prop = RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "rotmode");
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_enum_items(prop, rna_enum_object_rotation_mode_items);
RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL);
/* XXX... disabled, since proxy-locked layers are currently
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 5b1da32dff3..0411ef6d6ee 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -848,6 +848,14 @@ static void rna_def_render_engine(BlenderRNA *brna)
RNA_def_property_ui_text(
prop, "Use Eevee Viewport", "Uses Eevee for viewport shading in LookDev shading mode");
+ prop = RNA_def_property(srna, "bl_use_custom_freestyle", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_CUSTOM_FREESTYLE);
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+ RNA_def_property_ui_text(
+ prop,
+ "Use Custom Freestyle",
+ "Handles freestyle rendering on its own, instead of delegating it to EEVEE");
+
prop = RNA_def_property(srna, "bl_use_gpu_context", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_GPU_CONTEXT);
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index c929e3ab1aa..b0a942cd39e 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -1279,12 +1279,22 @@ static int rna_property_override_diff_propptr(Main *bmain,
0);
if (is_id) {
- /* For now, once we deal with nodetrees we'll want to get rid of that one. */
- // BLI_assert(no_ownership);
+ /* Owned IDs (the ones we want to actually compare in depth, instead of just comparing pointer
+ * values) should be always properly tagged as 'virtual' overrides. */
+ ID *id = propptr_a->owner_id;
+ if (id != NULL && !ID_IS_OVERRIDE_LIBRARY(id)) {
+ id = propptr_b->owner_id;
+ if (id != NULL && !ID_IS_OVERRIDE_LIBRARY(id)) {
+ id = NULL;
+ }
+ }
+
+ BLI_assert(no_ownership || id == NULL || ID_IS_OVERRIDE_LIBRARY_VIRTUAL(id));
+ UNUSED_VARS_NDEBUG(id);
}
if (override) {
- if (no_ownership /* || is_id */ || is_null || is_type_diff || !is_valid_for_diffing) {
+ if (no_ownership || is_null || is_type_diff || !is_valid_for_diffing) {
/* In case this pointer prop does not own its data (or one is NULL), do not compare structs!
* This is a quite safe path to infinite loop, among other nasty issues.
* Instead, just compare pointers themselves. */
@@ -1304,9 +1314,9 @@ static int rna_property_override_diff_propptr(Main *bmain,
BLI_assert(op->rna_prop_type == property_type);
}
+ IDOverrideLibraryPropertyOperation *opop = NULL;
if (created || rna_itemname_a != NULL || rna_itemname_b != NULL ||
rna_itemindex_a != -1 || rna_itemindex_b != -1) {
- IDOverrideLibraryPropertyOperation *opop;
opop = BKE_lib_override_library_property_operation_get(op,
IDOVERRIDE_LIBRARY_OP_REPLACE,
rna_itemname_b,
@@ -1327,6 +1337,38 @@ static int rna_property_override_diff_propptr(Main *bmain,
else {
BKE_lib_override_library_operations_tag(op, IDOVERRIDE_LIBRARY_TAG_UNUSED, false);
}
+
+ if (is_id && no_ownership) {
+ if (opop == NULL) {
+ opop = BKE_lib_override_library_property_operation_find(op,
+ rna_itemname_b,
+ rna_itemname_a,
+ rna_itemindex_b,
+ rna_itemindex_a,
+ true,
+ NULL);
+ BLI_assert(opop != NULL);
+ }
+
+ BLI_assert(propptr_a->data == propptr_a->owner_id);
+ BLI_assert(propptr_b->data == propptr_b->owner_id);
+ ID *id_a = propptr_a->data;
+ ID *id_b = propptr_b->data;
+ if (ELEM(NULL, id_a, id_b)) {
+ /* In case one of the pointer is NULL and not the other, we consider that the
+ * override is not matching its reference anymore. */
+ opop->flag &= ~IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE;
+ }
+ else if (id_a->override_library != NULL && id_a->override_library->reference == id_b) {
+ opop->flag |= IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE;
+ }
+ else if (id_b->override_library != NULL && id_b->override_library->reference == id_a) {
+ opop->flag |= IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE;
+ }
+ else {
+ opop->flag &= ~IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE;
+ }
+ }
}
}
@@ -1429,8 +1471,8 @@ static int rna_property_override_diff_propptr(Main *bmain,
}
}
else {
- /* We could also use is_diff_pointer, but then we potentially lose the gt/lt info -
- * and don't think performances are critical here for now anyway... */
+ /* We could also use is_diff_pointer, but then we potentially lose the greater-than/less-than
+ * info - and don't think performances are critical here for now anyway. */
return !RNA_struct_equals(bmain, propptr_a, propptr_b, mode);
}
}
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 93d25c383bb..0ad11aa9538 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -549,62 +549,6 @@ static const EnumPropertyItem rna_enum_view_layer_aov_type_items[] = {
{0, NULL, 0, NULL, NULL},
};
-#ifndef RNA_RUNTIME
-static const EnumPropertyItem rna_enum_gpencil_interpolation_mode_items[] = {
- /* interpolation */
- {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"},
- {GP_IPO_LINEAR,
- "LINEAR",
- ICON_IPO_LINEAR,
- "Linear",
- "Straight-line interpolation between A and B (i.e. no ease in/out)"},
- {GP_IPO_CURVEMAP,
- "CUSTOM",
- ICON_IPO_BEZIER,
- "Custom",
- "Custom interpolation defined using a curve map"},
-
- /* easing */
- {0,
- "",
- 0,
- N_("Easing (by strength)"),
- "Predefined inertial transitions, useful for motion graphics (from least to most "
- "''dramatic'')"},
- {GP_IPO_SINE,
- "SINE",
- ICON_IPO_SINE,
- "Sinusoidal",
- "Sinusoidal easing (weakest, almost linear but with a slight curvature)"},
- {GP_IPO_QUAD, "QUAD", ICON_IPO_QUAD, "Quadratic", "Quadratic easing"},
- {GP_IPO_CUBIC, "CUBIC", ICON_IPO_CUBIC, "Cubic", "Cubic easing"},
- {GP_IPO_QUART, "QUART", ICON_IPO_QUART, "Quartic", "Quartic easing"},
- {GP_IPO_QUINT, "QUINT", ICON_IPO_QUINT, "Quintic", "Quintic easing"},
- {GP_IPO_EXPO, "EXPO", ICON_IPO_EXPO, "Exponential", "Exponential easing (dramatic)"},
- {GP_IPO_CIRC,
- "CIRC",
- ICON_IPO_CIRC,
- "Circular",
- "Circular easing (strongest and most dynamic)"},
-
- {0, "", 0, N_("Dynamic Effects"), "Simple physics-inspired easing effects"},
- {GP_IPO_BACK, "BACK", ICON_IPO_BACK, "Back", "Cubic easing with overshoot and settle"},
- {GP_IPO_BOUNCE,
- "BOUNCE",
- ICON_IPO_BOUNCE,
- "Bounce",
- "Exponentially decaying parabolic bounce, like when objects collide"},
- {GP_IPO_ELASTIC,
- "ELASTIC",
- ICON_IPO_ELASTIC,
- "Elastic",
- "Exponentially decaying sine wave, like an elastic band"},
-
- {0, NULL, 0, NULL, NULL},
-};
-
-#endif
-
const EnumPropertyItem rna_enum_transform_pivot_items_full[] = {
{V3D_AROUND_CENTER_BOUNDS,
"BOUNDING_BOX_CENTER",
@@ -735,27 +679,6 @@ static void rna_GPencil_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UN
ED_gpencil_tag_scene_gpencil(scene);
}
-/* Grease Pencil Interpolation settings */
-static char *rna_GPencilInterpolateSettings_path(PointerRNA *UNUSED(ptr))
-{
- return BLI_strdup("tool_settings.gpencil_interpolate");
-}
-
-static void rna_GPencilInterpolateSettings_type_set(PointerRNA *ptr, int value)
-{
- GP_Interpolate_Settings *settings = (GP_Interpolate_Settings *)ptr->data;
-
- /* NOTE: This cast should be fine, as we have a small + finite set of values
- * (#eGP_Interpolate_Type) that should fit well within a char.
- */
- settings->type = (char)value;
-
- /* init custom interpolation curve here now the first time it's used */
- if ((settings->type == GP_IPO_CURVEMAP) && (settings->custom_ipo == NULL)) {
- settings->custom_ipo = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- }
-}
-
static void rna_Gpencil_extend_selection(bContext *C, PointerRNA *UNUSED(ptr))
{
/* Extend selection to all points in all selected strokes. */
@@ -1495,7 +1418,7 @@ static const EnumPropertyItem *rna_ImageFormatSettings_exr_codec_itemf(bContext
int i = 1, totitem = 0;
if (imf->depth == 16) {
- return rna_enum_exr_codec_items; /* All compression types are defined for halfs */
+ return rna_enum_exr_codec_items; /* All compression types are defined for half-float. */
}
for (i = 0; i < R_IMF_EXR_CODEC_MAX; i++) {
@@ -2102,7 +2025,7 @@ static char *rna_TransformOrientationSlot_path(PointerRNA *ptr)
}
}
- /* Should not happen, but in case, just return defqult path. */
+ /* Should not happen, but in case, just return default path. */
BLI_assert(0);
return BLI_strdup("transform_orientation_slots[0]");
}
@@ -2688,69 +2611,10 @@ static void rna_def_gpencil_interpolate(BlenderRNA *brna)
srna = RNA_def_struct(brna, "GPencilInterpolateSettings", NULL);
RNA_def_struct_sdna(srna, "GP_Interpolate_Settings");
- RNA_def_struct_path_func(srna, "rna_GPencilInterpolateSettings_path");
RNA_def_struct_ui_text(srna,
"Grease Pencil Interpolate Settings",
"Settings for Grease Pencil interpolation tools");
- /* flags */
- prop = RNA_def_property(srna, "interpolate_all_layers", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS);
- RNA_def_property_ui_text(
- prop, "Interpolate All Layers", "Interpolate all layers, not only active");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
- prop = RNA_def_property(srna, "interpolate_selected_only", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED);
- RNA_def_property_ui_text(prop,
- "Interpolate Selected Strokes",
- "Interpolate only selected strokes in the original frame");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
- /* interpolation type */
- prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "type");
- RNA_def_property_enum_items(prop, rna_enum_gpencil_interpolation_mode_items);
- RNA_def_property_enum_funcs(prop, NULL, "rna_GPencilInterpolateSettings_type_set", NULL);
- RNA_def_property_ui_text(
- prop, "Type", "Interpolation method to use the next time 'Interpolate Sequence' is run");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
- prop = RNA_def_property(srna, "step", PROP_INT, PROP_NONE);
- RNA_def_property_range(prop, 1, MAXFRAME);
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_ui_text(prop, "Step", "Number of frames between generated interpolated frames");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
- /* easing */
- prop = RNA_def_property(srna, "easing", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "easing");
- RNA_def_property_enum_items(prop, rna_enum_beztriple_interpolation_easing_items);
- RNA_def_property_ui_text(
- prop,
- "Easing",
- "Which ends of the segment between the preceding and following grease pencil frames "
- "easing interpolation is applied to");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
- /* easing options */
- prop = RNA_def_property(srna, "back", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "back");
- RNA_def_property_ui_text(prop, "Back", "Amount of overshoot for 'back' easing");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
- prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "amplitude");
- RNA_def_property_range(prop, 0.0f, FLT_MAX); /* only positive values... */
- RNA_def_property_ui_text(
- prop, "Amplitude", "Amount to boost elastic bounces for 'elastic' easing");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
- prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "period");
- RNA_def_property_ui_text(prop, "Period", "Time between bounces for elastic easing");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
/* custom curvemap */
prop = RNA_def_property(srna, "interpolation_curve", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "custom_ipo");
@@ -2759,7 +2623,6 @@ static void rna_def_gpencil_interpolate(BlenderRNA *brna)
prop,
"Interpolation Curve",
"Custom curve to control 'sequence' interpolation between Grease Pencil frames");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
}
static void rna_def_transform_orientation(BlenderRNA *brna)
@@ -7368,21 +7231,66 @@ static void rna_def_scene_eevee(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
/* Depth of Field */
+
prop = RNA_def_property(srna, "bokeh_max_size", PROP_FLOAT, PROP_PIXEL);
RNA_def_property_ui_text(
prop, "Max Size", "Max size of the bokeh shape for the depth of field (lower is faster)");
RNA_def_property_range(prop, 0.0f, 2000.0f);
- RNA_def_property_ui_range(prop, 2.0f, 200.0f, 1, 3);
+ RNA_def_property_ui_range(prop, 0.0f, 200.0f, 100.0f, 1);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
prop = RNA_def_property(srna, "bokeh_threshold", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_ui_text(
prop, "Sprite Threshold", "Brightness threshold for using sprite base depth of field");
RNA_def_property_range(prop, 0.0f, 100000.0f);
- RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 10, 2);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+ RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+ prop = RNA_def_property(srna, "bokeh_neighbor_max", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_ui_text(prop,
+ "Neighbor Rejection",
+ "Maximum brightness to consider when rejecting bokeh sprites "
+ "based on neighborhood (lower is faster)");
+ RNA_def_property_range(prop, 0.0f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 40.0f, 10, 2);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+ prop = RNA_def_property(srna, "bokeh_denoise_fac", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_ui_text(
+ prop, "Denoise Amount", "Amount of flicker removal applied to bokeh highlights");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 10, 2);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+ RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+ prop = RNA_def_property(srna, "use_bokeh_high_quality_slight_defocus", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS);
+ RNA_def_property_ui_text(prop,
+ "High Quality Slight Defocus",
+ "Sample all pixels in almost in-focus regions to eliminate noise");
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+ RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+ prop = RNA_def_property(srna, "use_bokeh_jittered", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_DOF_JITTER);
+ RNA_def_property_ui_text(prop,
+ "Jitter Camera",
+ "Jitter camera position to create accurate blurring "
+ "using render samples");
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+ RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+ prop = RNA_def_property(srna, "bokeh_overblur", PROP_FLOAT, PROP_PERCENTAGE);
+ RNA_def_property_ui_text(prop,
+ "Over-blur",
+ "Apply blur to each jittered sample to reduce "
+ "under-sampling artifacts");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_range(prop, 0.0f, 20.0f, 1, 1);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+
/* Bloom */
prop = RNA_def_property(srna, "use_bloom", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_BLOOM_ENABLED);
@@ -7731,7 +7639,7 @@ void RNA_def_scene(BlenderRNA *brna)
prop, "Preview Range End Frame", "Alternative end frame for UI playback");
RNA_def_property_update(prop, NC_SCENE | ND_FRAME, NULL);
- /* Subframe for moblur debug. */
+ /* Sub-frame for motion-blur debug. */
prop = RNA_def_property(srna, "show_subframe", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_boolean_sdna(prop, NULL, "r.flag", SCER_SHOW_SUBFRAME);
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index 08387077cea..4481555b931 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -896,7 +896,7 @@ static void rna_def_gp_paint(BlenderRNA *brna)
RNA_def_struct_path_func(srna, "rna_GpPaint_path");
RNA_def_struct_ui_text(srna, "Grease Pencil Paint", "");
- /* Use vertex color (main swith). */
+ /* Use vertex color (main switch). */
prop = RNA_def_property(srna, "color_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "mode");
RNA_def_property_enum_items(prop, rna_enum_gpencil_paint_mode);
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 38d0fa85555..38f5b65fbc2 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -439,7 +439,7 @@ const EnumPropertyItem rna_enum_clip_editor_mode_items[] = {
{0, NULL, 0, NULL, NULL},
};
-/* Actually populated dynamically trough a function,
+/* Actually populated dynamically through a function,
* but helps for context-less access (e.g. doc, i18n...). */
static const EnumPropertyItem buttons_context_items[] = {
{BCONTEXT_TOOL, "TOOL", ICON_TOOL_SETTINGS, "Tool", "Active Tool and Workspace settings"},
@@ -2279,6 +2279,20 @@ static bool rna_SpaceNodeEditor_tree_type_poll(void *Cv, bNodeTreeType *type)
}
}
+static void rna_SpaceNodeEditor_cursor_location_get(PointerRNA *ptr, float value[2])
+{
+ const SpaceNode *snode = (SpaceNode *)ptr->data;
+
+ ED_node_cursor_location_get(snode, value);
+}
+
+static void rna_SpaceNodeEditor_cursor_location_set(PointerRNA *ptr, const float value[2])
+{
+ SpaceNode *snode = (SpaceNode *)ptr->data;
+
+ ED_node_cursor_location_set(snode, value);
+}
+
const EnumPropertyItem *RNA_enum_node_tree_types_itemf_impl(bContext *C, bool *r_free)
{
return rna_node_tree_type_itemf(C, rna_SpaceNodeEditor_tree_type_poll, r_free);
@@ -2346,9 +2360,13 @@ static void rna_SpaceNodeEditor_cursor_location_from_region(SpaceNode *snode,
{
ARegion *region = CTX_wm_region(C);
- UI_view2d_region_to_view(&region->v2d, x, y, &snode->cursor[0], &snode->cursor[1]);
- snode->cursor[0] /= UI_DPI_FAC;
- snode->cursor[1] /= UI_DPI_FAC;
+ float cursor_location[2];
+
+ UI_view2d_region_to_view(&region->v2d, x, y, &cursor_location[0], &cursor_location[1]);
+ cursor_location[0] /= UI_DPI_FAC;
+ cursor_location[1] /= UI_DPI_FAC;
+
+ ED_node_cursor_location_set(snode, cursor_location);
}
static void rna_SpaceClipEditor_clip_set(PointerRNA *ptr,
@@ -2460,7 +2478,7 @@ static void rna_FileSelectPrams_filter_glob_set(PointerRNA *ptr, const char *val
BLI_strncpy(params->filter_glob, value, sizeof(params->filter_glob));
- /* Remove stupi things like last group being a wildcard-only one... */
+ /* Remove stupid things like last group being a wildcard-only one. */
BLI_path_extension_glob_validate(params->filter_glob);
}
@@ -4640,7 +4658,7 @@ static void rna_def_space_view3d(BlenderRNA *brna)
}
}
- /* Heper for drawing the icon. */
+ /* Helper for drawing the icon. */
prop = RNA_def_property(srna, "icon_from_show_object_viewport", PROP_INT, PROP_NONE);
RNA_def_property_int_funcs(
prop, "rna_SpaceView3D_icon_from_show_object_viewport_get", NULL, NULL);
@@ -5694,13 +5712,13 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pivot Point", "Pivot center for rotation/scaling");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, NULL);
- /* dopesheet */
+ /* Dope-sheet. */
prop = RNA_def_property(srna, "dopesheet", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "DopeSheet");
RNA_def_property_pointer_sdna(prop, NULL, "ads");
RNA_def_property_ui_text(prop, "Dope Sheet", "Settings for filtering animation data");
- /* autosnap */
+ /* Auto-snap. */
prop = RNA_def_property(srna, "auto_snap", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "autosnap");
RNA_def_property_enum_items(prop, autosnap_items);
@@ -5708,14 +5726,14 @@ static void rna_def_space_graph(BlenderRNA *brna)
prop, "Auto Snap", "Automatic time snapping settings for transformations");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, NULL);
- /* readonly state info */
+ /* Read-only state info. */
prop = RNA_def_property(srna, "has_ghost_curves", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_SpaceGraphEditor_has_ghost_curves_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(
prop, "Has Ghost Curves", "Graph Editor instance has some ghost curves stored");
- /* nromalize curves */
+ /* Normalize curves. */
prop = RNA_def_property(srna, "use_normalization", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_NORMALIZE);
RNA_def_property_ui_text(prop,
@@ -6828,11 +6846,13 @@ static void rna_def_space_node(BlenderRNA *brna)
RNA_def_property_enum_items(prop, backdrop_channels_items);
RNA_def_property_ui_text(prop, "Display Channels", "Channels of the image to draw");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_NODE_VIEW, NULL);
-
/* the mx/my "cursor" in the node editor is used only by operators to store the mouse position */
prop = RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ);
RNA_def_property_array(prop, 2);
- RNA_def_property_float_sdna(prop, NULL, "cursor");
+ RNA_def_property_float_funcs(prop,
+ "rna_SpaceNodeEditor_cursor_location_get",
+ "rna_SpaceNodeEditor_cursor_location_set",
+ NULL);
RNA_def_property_ui_text(prop, "Cursor Location", "Location for adding new nodes");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_NODE_VIEW, NULL);
diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c
index 1870c660efd..c4a44556cf4 100644
--- a/source/blender/makesrna/intern/rna_tracking.c
+++ b/source/blender/makesrna/intern/rna_tracking.c
@@ -976,22 +976,6 @@ static void rna_def_trackingSettings(BlenderRNA *brna)
RNA_def_property_enum_items(prop, cleanup_items);
RNA_def_property_ui_text(prop, "Action", "Cleanup action to execute");
- /* ** default tracker settings ** */
- prop = RNA_def_property(srna, "show_default_expanded", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED);
- RNA_def_property_ui_text(
- prop, "Show Expanded", "Show default options expanded in the user interface");
- RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1);
-
- /* ** extra tracker settings ** */
- prop = RNA_def_property(srna, "show_extra_expanded", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_SETTINGS_SHOW_EXTRA_EXPANDED);
- RNA_def_property_ui_text(
- prop, "Show Expanded", "Show extra options expanded in the user interface");
- RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1);
-
/* solver settings */
prop = RNA_def_property(srna, "use_tripod_solver", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
@@ -2017,7 +2001,7 @@ static void rna_def_trackingStabilization(BlenderRNA *brna)
"Explicitly scale resulting frame to compensate zoom of original shot");
RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_tracking_flushUpdate");
- /* autoscale */
+ /* Auto-scale. */
prop = RNA_def_property(srna, "use_autoscale", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_AUTOSCALE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index cfcd9aff759..5e5b3549986 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -261,9 +261,14 @@ static StructRNA *rna_Panel_register(Main *bmain,
Panel dummypanel = {NULL};
PointerRNA dummyptr;
int have_function[4];
+ size_t over_alloc = 0; /* Warning, if this becomes a mess, we better do another allocation. */
+ char _panel_descr[RNA_DYN_DESCR_MAX];
+ size_t description_size = 0;
/* setup dummy panel & panel type to store static properties in */
dummypanel.type = &dummypt;
+ _panel_descr[0] = '\0';
+ dummypanel.type->description = _panel_descr;
RNA_pointer_create(NULL, &RNA_Panel, &dummypanel, &dummyptr);
/* We have to set default context! Else we get a void string... */
@@ -355,9 +360,22 @@ static StructRNA *rna_Panel_register(Main *bmain,
}
/* create a new panel type */
- pt = MEM_mallocN(sizeof(PanelType), "python buttons panel");
+ if (_panel_descr[0]) {
+ description_size = strlen(_panel_descr) + 1;
+ over_alloc += description_size;
+ }
+ pt = MEM_callocN(sizeof(PanelType) + over_alloc, "python buttons panel");
memcpy(pt, &dummypt, sizeof(dummypt));
+ if (_panel_descr[0]) {
+ char *buf = (char *)(pt + 1);
+ memcpy(buf, _panel_descr, description_size);
+ pt->description = buf;
+ }
+ else {
+ pt->description = NULL;
+ }
+
pt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, pt->idname, &RNA_Panel);
RNA_def_struct_translation_context(pt->rna_ext.srna, pt->translation_context);
pt->rna_ext.data = data;
@@ -649,7 +667,7 @@ static StructRNA *rna_UIList_register(Main *bmain,
uiList dummyuilist = {NULL};
PointerRNA dummyul_ptr;
int have_function[3];
- size_t over_alloc = 0; /* warning, if this becomes a bess, we better do another alloc */
+ size_t over_alloc = 0; /* Warning, if this becomes a mess, we better do another allocation. */
/* setup dummy menu & menu type to store static properties in */
dummyuilist.type = &dummyult;
@@ -669,7 +687,7 @@ static StructRNA *rna_UIList_register(Main *bmain,
return NULL;
}
- /* check if we have registered this uilist type before, and remove it */
+ /* Check if we have registered this UI-list type before, and remove it. */
ult = WM_uilisttype_find(dummyult.idname, true);
if (ult && ult->rna_ext.srna) {
rna_UIList_unregister(bmain, ult->rna_ext.srna);
@@ -904,7 +922,7 @@ static StructRNA *rna_Menu_register(Main *bmain,
Menu dummymenu = {NULL};
PointerRNA dummymtr;
int have_function[2];
- size_t over_alloc = 0; /* warning, if this becomes a bess, we better do another alloc */
+ size_t over_alloc = 0; /* Warning, if this becomes a mess, we better do another allocation. */
size_t description_size = 0;
char _menu_descr[RNA_DYN_DESCR_MAX];
@@ -993,6 +1011,18 @@ static StructRNA *rna_Menu_refine(PointerRNA *mtr)
return (menu->type && menu->type->rna_ext.srna) ? menu->type->rna_ext.srna : &RNA_Menu;
}
+static void rna_Panel_bl_description_set(PointerRNA *ptr, const char *value)
+{
+ Panel *data = (Panel *)(ptr->data);
+ char *str = (char *)data->type->description;
+ if (!str[0]) {
+ BLI_strncpy(str, value, RNA_DYN_DESCR_MAX); /* utf8 already ensured */
+ }
+ else {
+ BLI_assert(!"setting the bl_description on a non-builtin panel");
+ }
+}
+
static void rna_Menu_bl_description_set(PointerRNA *ptr, const char *value)
{
Menu *data = (Menu *)(ptr->data);
@@ -1408,6 +1438,14 @@ static void rna_def_panel(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
RNA_define_verify_sdna(true);
+ prop = RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "type->description");
+ RNA_def_property_string_maxlength(prop, RNA_DYN_DESCR_MAX); /* else it uses the pointer size! */
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Panel_bl_description_set");
+ /* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+ RNA_def_property_clear_flag(prop, PROP_NEVER_NULL); /* check for NULL */
+
prop = RNA_def_property(srna, "bl_category", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->category");
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 447f5b4210b..f128719db19 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -595,7 +595,7 @@ static const char *rna_ui_get_enum_name(bContext *C,
const char *identifier)
{
PropertyRNA *prop = NULL;
- const EnumPropertyItem *items = NULL, *item;
+ const EnumPropertyItem *items = NULL;
bool free;
const char *name = "";
@@ -609,11 +609,9 @@ static const char *rna_ui_get_enum_name(bContext *C,
RNA_property_enum_items_gettexted(C, ptr, prop, &items, NULL, &free);
if (items) {
- for (item = items; item->identifier; item++) {
- if (item->identifier[0] && STREQ(item->identifier, identifier)) {
- name = item->name;
- break;
- }
+ const int index = RNA_enum_from_identifier(items, identifier);
+ if (index != -1) {
+ name = items[index].name;
}
if (free) {
MEM_freeN((void *)items);
@@ -629,7 +627,7 @@ static const char *rna_ui_get_enum_description(bContext *C,
const char *identifier)
{
PropertyRNA *prop = NULL;
- const EnumPropertyItem *items = NULL, *item;
+ const EnumPropertyItem *items = NULL;
bool free;
const char *desc = "";
@@ -643,11 +641,9 @@ static const char *rna_ui_get_enum_description(bContext *C,
RNA_property_enum_items_gettexted(C, ptr, prop, &items, NULL, &free);
if (items) {
- for (item = items; item->identifier; item++) {
- if (item->identifier[0] && STREQ(item->identifier, identifier)) {
- desc = item->description;
- break;
- }
+ const int index = RNA_enum_from_identifier(items, identifier);
+ if (index != -1) {
+ desc = items[index].description;
}
if (free) {
MEM_freeN((void *)items);
@@ -663,7 +659,7 @@ static int rna_ui_get_enum_icon(bContext *C,
const char *identifier)
{
PropertyRNA *prop = NULL;
- const EnumPropertyItem *items = NULL, *item;
+ const EnumPropertyItem *items = NULL;
bool free;
int icon = ICON_NONE;
@@ -677,11 +673,9 @@ static int rna_ui_get_enum_icon(bContext *C,
RNA_property_enum_items(C, ptr, prop, &items, NULL, &free);
if (items) {
- for (item = items; item->identifier; item++) {
- if (item->identifier[0] && STREQ(item->identifier, identifier)) {
- icon = item->icon;
- break;
- }
+ const int index = RNA_enum_from_identifier(items, identifier);
+ if (index != -1) {
+ icon = items[index].icon;
}
if (free) {
MEM_freeN((void *)items);
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 2994de69f1a..7f7adc69dd1 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -243,7 +243,7 @@ void rna_userdef_is_dirty_update(Main *UNUSED(bmain),
rna_userdef_is_dirty_update_impl();
}
-/** Take care not to use this if we expet 'is_dirty' to be tagged. */
+/** Take care not to use this if we expect 'is_dirty' to be tagged. */
static void rna_userdef_ui_update(Main *UNUSED(bmain),
Scene *UNUSED(scene),
PointerRNA *UNUSED(ptr))
@@ -863,7 +863,7 @@ static StructRNA *rna_AddonPref_register(Main *bmain,
PointerRNA dummy_ptr;
// int have_function[1];
- /* setup dummy addon-pref & addon-pref type to store static properties in */
+ /* Setup dummy add-on preference and it's type to store static properties in. */
RNA_pointer_create(NULL, &RNA_AddonPreferences, &dummy_addon, &dummy_ptr);
/* validate the python class */
@@ -881,13 +881,13 @@ static StructRNA *rna_AddonPref_register(Main *bmain,
return NULL;
}
- /* check if we have registered this addon-pref type before, and remove it */
+ /* Check if we have registered this add-on preference type before, and remove it. */
apt = BKE_addon_pref_type_find(dummy_addon.module, true);
if (apt && apt->rna_ext.srna) {
rna_AddonPref_unregister(bmain, apt->rna_ext.srna);
}
- /* create a new addon-pref type */
+ /* Create a new add-on preference type. */
apt = MEM_mallocN(sizeof(bAddonPrefType), "addonpreftype");
memcpy(apt, &dummy_apt, sizeof(dummy_apt));
BKE_addon_pref_type_add(apt);
@@ -4762,6 +4762,11 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Gizmo Size", "Diameter of the gizmo");
RNA_def_property_update(prop, 0, "rna_userdef_update");
+ prop = RNA_def_property(srna, "gizmo_size_navigate_v3d", PROP_INT, PROP_PIXEL);
+ RNA_def_property_range(prop, 30, 200);
+ RNA_def_property_ui_text(prop, "Navigate Gizmo Size", "The Navigate Gizmo size");
+ RNA_def_property_update(prop, 0, "rna_userdef_gizmo_update");
+
/* Lookdev */
prop = RNA_def_property(srna, "lookdev_sphere_size", PROP_INT, PROP_PIXEL);
RNA_def_property_int_sdna(prop, NULL, "lookdev_sphere_size");
@@ -4861,7 +4866,7 @@ static void rna_def_userdef_view(BlenderRNA *brna)
"Translate the names of new data-blocks (objects, materials...)");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- /* Statusbar. */
+ /* Status-bar. */
prop = RNA_def_property(srna, "show_statusbar_memory", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "statusbar_flag", STATUSBAR_SHOW_MEMORY);
@@ -5649,7 +5654,7 @@ static void rna_def_userdef_input(BlenderRNA *brna)
};
static const EnumPropertyItem view_zoom_styles[] = {
- {USER_ZOOM_CONT,
+ {USER_ZOOM_CONTINUE,
"CONTINUE",
0,
"Continue",
@@ -5734,10 +5739,11 @@ static void rna_def_userdef_input(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_mouse_continuous", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_CONTINUOUS_MOUSE);
- RNA_def_property_ui_text(prop,
- "Continuous Grab",
- "Allow moving the mouse outside the view on some manipulations "
- "(transform, ui control drag)");
+ RNA_def_property_ui_text(
+ prop,
+ "Continuous Grab",
+ "Let the mouse wrap around the view boundaries so mouse movements are not limited by the "
+ "screen size (used by transform, dragging of UI controls, etc.)");
prop = RNA_def_property(srna, "use_drag_immediately", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_RELEASECONFIRM);
diff --git a/source/blender/makesrna/intern/rna_vfont.c b/source/blender/makesrna/intern/rna_vfont.c
index a98a52c2252..214a32372dd 100644
--- a/source/blender/makesrna/intern/rna_vfont.c
+++ b/source/blender/makesrna/intern/rna_vfont.c
@@ -37,7 +37,7 @@
# include "WM_api.h"
-/* matching fnction in rna_ID.c */
+/* Matching function in rna_ID.c */
static int rna_VectorFont_filepath_editable(PointerRNA *ptr, const char **UNUSED(r_info))
{
VFont *vfont = (VFont *)ptr->owner_id;
diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c
index 3ebcb09a65d..6b96562b3f8 100644
--- a/source/blender/makesrna/intern/rna_wm_api.c
+++ b/source/blender/makesrna/intern/rna_wm_api.c
@@ -72,6 +72,12 @@ const EnumPropertyItem rna_enum_window_cursor_items[] = {
# include "WM_types.h"
+/* Needed since RNA doesn't use `const` in function signatures. */
+static bool rna_KeyMapItem_compare(struct wmKeyMapItem *k1, struct wmKeyMapItem *k2)
+{
+ return WM_keymap_item_compare(k1, k2);
+}
+
static void rna_KeyMapItem_to_string(wmKeyMapItem *kmi, bool compact, char *result)
{
WM_keymap_item_to_string(kmi, compact, result, UI_MAX_SHORTCUT_STR);
@@ -156,7 +162,7 @@ static void rna_gizmo_group_type_unlink_delayed(ReportList *reports, const char
}
}
-/* placeholder data for final implementation of a true progressbar */
+/* Placeholder data for final implementation of a true progress-bar. */
static struct wmStaticProgress {
float min;
float max;
@@ -1103,7 +1109,7 @@ void RNA_api_keymapitem(StructRNA *srna)
FunctionRNA *func;
PropertyRNA *parm;
- func = RNA_def_function(srna, "compare", "WM_keymap_item_compare");
+ func = RNA_def_function(srna, "compare", "rna_KeyMapItem_compare");
parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_boolean(func, "result", 0, "Comparison result", "");
diff --git a/source/blender/makesrna/intern/rna_wm_gizmo.c b/source/blender/makesrna/intern/rna_wm_gizmo.c
index 00d832e2eef..e61482c91e2 100644
--- a/source/blender/makesrna/intern/rna_wm_gizmo.c
+++ b/source/blender/makesrna/intern/rna_wm_gizmo.c
@@ -260,7 +260,7 @@ static wmGizmo *rna_GizmoProperties_find_operator(PointerRNA *ptr)
wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
# endif
- /* We could try workaruond this lookup, but not trivial. */
+ /* We could try workaround this lookup, but not trivial. */
for (bScreen *screen = G_MAIN->screens.first; screen; screen = screen->id.next) {
IDProperty *properties = ptr->data;
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
@@ -1089,7 +1089,7 @@ static void rna_def_gizmo(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_pointer(func, "event", "Event", "", "");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
- /* TODO, shuold be a enum-flag */
+ /* TODO, should be a enum-flag */
parm = RNA_def_enum_flag(func, "tweak", tweak_actions, 0, "Tweak", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_enum_flag(
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index 3a7addcba94..c19782df44b 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -185,7 +185,7 @@ endif()
if(WITH_OPENVDB)
list(APPEND INC
- ../../../intern/openvdb
+ ../../../intern/openvdb
)
list(APPEND INC_SYS
${OPENVDB_INCLUDE_DIRS}
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index 412d6b87d82..b48bf722526 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -68,7 +68,8 @@ static void initData(ModifierData *md)
MEMCPY_STRUCT_AFTER(amd, DNA_struct_default_get(ArrayModifierData), modifier);
- /* Open the first subpanel by default, it corresspnds to Relative offset which is enabled too. */
+ /* Open the first sub-panel by default,
+ * it corresponds to Relative offset which is enabled too. */
md->ui_expand_flag = UI_PANEL_DATA_EXPAND_ROOT | UI_SUBPANEL_DATA_EXPAND_1;
}
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index e290fd9dab7..070ba3a1bcf 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -49,6 +49,7 @@
#include "BKE_lib_query.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_boolean_convert.h"
#include "BKE_mesh_wrapper.h"
#include "BKE_modifier.h"
#include "BKE_screen.h"
@@ -70,12 +71,17 @@
#include "tools/bmesh_boolean.h"
#include "tools/bmesh_intersect.h"
-// #define DEBUG_TIME
#ifdef DEBUG_TIME
# include "PIL_time.h"
# include "PIL_time_utildefines.h"
#endif
+#ifdef WITH_GMP
+const bool bypass_bmesh = true;
+#else
+const bool bypass_bmesh = false;
+#endif
+
static void initData(ModifierData *md)
{
BooleanModifierData *bmd = (BooleanModifierData *)md;
@@ -600,6 +606,68 @@ static Mesh *collection_boolean_exact(BooleanModifierData *bmd,
return result;
}
+#ifdef WITH_GMP
+/* New method: bypass trip through BMesh. */
+static Mesh *exact_boolean_mesh(BooleanModifierData *bmd,
+ const ModifierEvalContext *ctx,
+ Mesh *mesh)
+{
+ Mesh *result;
+ Mesh *mesh_operand;
+ Mesh **meshes = NULL;
+ const float(**obmats)[4][4] = NULL;
+ BLI_array_declare(meshes);
+ BLI_array_declare(obmats);
+
+# ifdef DEBUG_TIME
+ TIMEIT_START(boolean_bmesh);
+# endif
+
+ BLI_array_append(meshes, mesh);
+ BLI_array_append(obmats, &ctx->object->obmat);
+ if (bmd->flag & eBooleanModifierFlag_Object) {
+ if (bmd->object == NULL) {
+ return mesh;
+ }
+ mesh_operand = BKE_modifier_get_evaluated_mesh_from_evaluated_object(bmd->object, false);
+ BKE_mesh_wrapper_ensure_mdata(mesh_operand);
+ BLI_array_append(meshes, mesh_operand);
+ BLI_array_append(obmats, &bmd->object->obmat);
+ }
+ else if (bmd->flag & eBooleanModifierFlag_Collection) {
+ Collection *collection = bmd->collection;
+ /* Allow collection to be empty: then target mesh will just removed self-intersections. */
+ if (collection) {
+ FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (collection, ob) {
+ if (ob->type == OB_MESH && ob != ctx->object) {
+ Mesh *collection_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob, false);
+ BKE_mesh_wrapper_ensure_mdata(collection_mesh);
+ BLI_array_append(meshes, collection_mesh);
+ BLI_array_append(obmats, &ob->obmat);
+ }
+ }
+ FOREACH_COLLECTION_OBJECT_RECURSIVE_END;
+ }
+ }
+
+ const bool use_self = (bmd->flag & eBooleanModifierFlag_Self) != 0;
+ result = BKE_mesh_boolean((const Mesh **)meshes,
+ (const float(**)[4][4])obmats,
+ BLI_array_len(meshes),
+ use_self,
+ bmd->operation);
+
+ BLI_array_free(meshes);
+ BLI_array_free(obmats);
+
+# ifdef DEBUG_TIME
+ TIMEIT_END(boolean_bmesh);
+# endif
+
+ return result;
+}
+#endif
+
static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
{
BooleanModifierData *bmd = (BooleanModifierData *)md;
@@ -607,12 +675,15 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
Mesh *result = mesh;
Mesh *mesh_operand_ob;
BMesh *bm;
- Collection *col = bmd->collection;
+ Collection *collection = bmd->collection;
bool is_flip = false;
const bool confirm_return = true;
#ifdef WITH_GMP
const bool use_exact = bmd->solver == eBooleanModifierSolver_Exact;
+ if (use_exact && bypass_bmesh) {
+ return exact_boolean_mesh(bmd, ctx, mesh);
+ }
#else
const bool use_exact = false;
#endif
@@ -692,12 +763,12 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
}
else {
- if (col == NULL && !use_exact) {
+ if (collection == NULL && !use_exact) {
return result;
}
/* Return result for certain errors. */
- if (BMD_error_messages(ctx->object, md, col) == confirm_return) {
+ if (BMD_error_messages(ctx->object, md, collection) == confirm_return) {
return result;
}
@@ -705,7 +776,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
result = collection_boolean_exact(bmd, ctx, mesh);
}
else {
- FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (col, operand_ob) {
+ FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (collection, operand_ob) {
if (operand_ob->type == OB_MESH && operand_ob != ctx->object) {
mesh_operand_ob = BKE_modifier_get_evaluated_mesh_from_evaluated_object(operand_ob,
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index 04b68a7a800..e72e0279263 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -222,7 +222,7 @@ static void deformVerts(ModifierData *md,
}
}
- /* happens on file load (ONLY when i decomment changes in readfile.c) */
+ /* Happens on file load (ONLY when I un-comment changes in readfile.c) */
if (!collmd->bvhtree) {
collmd->bvhtree = bvhtree_build_from_mvert(
collmd->current_x, collmd->tri, collmd->tri_num, ob->pd->pdef_sboft);
diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.c b/source/blender/modifiers/intern/MOD_correctivesmooth.c
index 15c4e8af6ce..001c7d8d098 100644
--- a/source/blender/modifiers/intern/MOD_correctivesmooth.c
+++ b/source/blender/modifiers/intern/MOD_correctivesmooth.c
@@ -423,11 +423,11 @@ static void calc_tangent_ortho(float ts[3][3])
cross_v3_v3v3(ts[1], ts[2], v_tan_a);
mul_v3_fl(ts[1], dot_v3v3(ts[1], v_tan_b) < 0.0f ? -1.0f : 1.0f);
- /* orthognalise tangent */
+ /* Orthogonalize tangent. */
mul_v3_v3fl(t_vec_a, ts[2], dot_v3v3(ts[2], v_tan_a));
sub_v3_v3v3(ts[0], v_tan_a, t_vec_a);
- /* orthognalise bitangent */
+ /* Orthogonalize bi-tangent. */
mul_v3_v3fl(t_vec_a, ts[2], dot_v3v3(ts[2], ts[1]));
mul_v3_v3fl(t_vec_b, ts[0], dot_v3v3(ts[0], ts[1]) / dot_v3v3(v_tan_a, v_tan_a));
sub_v3_v3(ts[1], t_vec_a);
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 4bd306e7679..a94dd6da477 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -24,6 +24,7 @@
#include "BLI_utildefines.h"
#include "BLI_math.h"
+#include "BLI_simd.h"
#include "BLI_task.h"
#include "BLT_translation.h"
@@ -61,10 +62,6 @@
#include "MOD_ui_common.h"
#include "MOD_util.h"
-#ifdef __SSE2__
-# include <emmintrin.h>
-#endif
-
static void initData(ModifierData *md)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData *)md;
@@ -188,7 +185,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3
float gridvec[3], dvec[3], ivec[3], wx, wy, wz;
float weight, cageweight, totweight, *cageco;
int i, j, a, x, y, z, size;
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
__m128 co = _mm_setzero_ps();
#else
float co[3] = {0.0f, 0.0f, 0.0f};
@@ -243,7 +240,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3
for (j = 0; j < cell->totinfluence; j++, inf++) {
cageco = dco[inf->vertex];
cageweight = weight * inf->weight;
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
{
__m128 cageweight_r = _mm_set1_ps(cageweight);
/* This will load one extra element, this is ok because
@@ -261,7 +258,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3
}
}
-#ifdef __SSE2__
+#ifdef BLI_HAVE_SSE2
copy_v3_v3(vec, (float *)&co);
#else
copy_v3_v3(vec, co);
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index f3d6cf49dd6..fe5a8bc59d4 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -50,6 +50,7 @@
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_node_ui_storage.hh"
#include "BKE_pointcloud.h"
#include "BKE_screen.h"
#include "BKE_simulation.h"
@@ -150,6 +151,40 @@ static void find_used_ids_from_settings(const NodesModifierSettings &settings, S
&ids);
}
+static void add_collection_object_relations_recursive(const ModifierUpdateDepsgraphContext *ctx,
+ Collection &collection);
+
+static void add_object_relation(const ModifierUpdateDepsgraphContext *ctx, Object &object)
+{
+ DEG_add_object_relation(ctx->node, &object, DEG_OB_COMP_TRANSFORM, "Nodes Modifier");
+ if (&(ID &)object != &ctx->object->id) {
+ if (object.type == OB_EMPTY) {
+ Collection *collection_instance = object.instance_collection;
+ if (collection_instance != nullptr) {
+ add_collection_object_relations_recursive(ctx, *collection_instance);
+ }
+ }
+ else {
+ DEG_add_object_relation(ctx->node, &object, DEG_OB_COMP_GEOMETRY, "Nodes Modifier");
+ }
+ }
+}
+
+static void add_collection_object_relations_recursive(const ModifierUpdateDepsgraphContext *ctx,
+ Collection &collection)
+{
+ LISTBASE_FOREACH (CollectionObject *, collection_object, &collection.gobject) {
+ BLI_assert(collection_object->ob != nullptr);
+ Object &object = *collection_object->ob;
+ add_object_relation(ctx, object);
+ }
+ LISTBASE_FOREACH (CollectionChild *, collection_child, &collection.children) {
+ BLI_assert(collection_child->collection != nullptr);
+ Collection &collection = *collection_child->collection;
+ add_collection_object_relations_recursive(ctx, collection);
+ }
+}
+
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
@@ -163,18 +198,16 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
for (ID *id : used_ids) {
if (GS(id->name) == ID_OB) {
Object *object = reinterpret_cast<Object *>(id);
- DEG_add_object_relation(ctx->node, object, DEG_OB_COMP_TRANSFORM, "Nodes Modifier");
- if (id != &ctx->object->id) {
- if (object->type != OB_EMPTY) {
- DEG_add_object_relation(
- ctx->node, (Object *)id, DEG_OB_COMP_GEOMETRY, "Nodes Modifier");
- }
- }
+ add_object_relation(ctx, *object);
+ }
+ if (GS(id->name) == ID_GR) {
+ Collection *collection = reinterpret_cast<Collection *>(id);
+ add_collection_object_relations_recursive(ctx, *collection);
}
}
}
- /* TODO: Add dependency for collection changes. */
+ /* TODO: Add dependency for adding and removing objects in collections. */
}
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
@@ -215,24 +248,30 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
class GeometryNodesEvaluator {
private:
blender::LinearAllocator<> allocator_;
- Map<const DInputSocket *, GMutablePointer> value_by_input_;
+ Map<std::pair<const DInputSocket *, const DOutputSocket *>, GMutablePointer> value_by_input_;
Vector<const DInputSocket *> group_outputs_;
blender::nodes::MultiFunctionByNode &mf_by_node_;
const blender::nodes::DataTypeConversions &conversions_;
const PersistentDataHandleMap &handle_map_;
const Object *self_object_;
+ const ModifierData *modifier_;
+ Depsgraph *depsgraph_;
public:
GeometryNodesEvaluator(const Map<const DOutputSocket *, GMutablePointer> &group_input_data,
Vector<const DInputSocket *> group_outputs,
blender::nodes::MultiFunctionByNode &mf_by_node,
const PersistentDataHandleMap &handle_map,
- const Object *self_object)
+ const Object *self_object,
+ const ModifierData *modifier,
+ Depsgraph *depsgraph)
: group_outputs_(std::move(group_outputs)),
mf_by_node_(mf_by_node),
conversions_(blender::nodes::get_implicit_type_conversions()),
handle_map_(handle_map),
- self_object_(self_object)
+ self_object_(self_object),
+ modifier_(modifier),
+ depsgraph_(depsgraph)
{
for (auto item : group_input_data.items()) {
this->forward_to_inputs(*item.key, item.value);
@@ -243,8 +282,8 @@ class GeometryNodesEvaluator {
{
Vector<GMutablePointer> results;
for (const DInputSocket *group_output : group_outputs_) {
- GMutablePointer result = this->get_input_value(*group_output);
- results.append(result);
+ Vector<GMutablePointer> result = this->get_input_values(*group_output);
+ results.append(result[0]);
}
for (GMutablePointer value : value_by_input_.values()) {
value.destruct();
@@ -253,38 +292,58 @@ class GeometryNodesEvaluator {
}
private:
- GMutablePointer get_input_value(const DInputSocket &socket_to_compute)
+ Vector<GMutablePointer> get_input_values(const DInputSocket &socket_to_compute)
{
- std::optional<GMutablePointer> value = value_by_input_.pop_try(&socket_to_compute);
- if (value.has_value()) {
- /* This input has been computed before, return it directly. */
- return *value;
- }
Span<const DOutputSocket *> from_sockets = socket_to_compute.linked_sockets();
Span<const DGroupInput *> from_group_inputs = socket_to_compute.linked_group_inputs();
const int total_inputs = from_sockets.size() + from_group_inputs.size();
- BLI_assert(total_inputs <= 1);
if (total_inputs == 0) {
/* The input is not connected, use the value from the socket itself. */
- return get_unlinked_input_value(socket_to_compute);
+ return {get_unlinked_input_value(socket_to_compute)};
}
+
if (from_group_inputs.size() == 1) {
- /* The input gets its value from the input of a group that is not further connected. */
- return get_unlinked_input_value(socket_to_compute);
+ return {get_unlinked_input_value(socket_to_compute)};
+ }
+
+ /* Multi-input sockets contain a vector of inputs. */
+ if (socket_to_compute.is_multi_input_socket()) {
+ Vector<GMutablePointer> values;
+ for (const DOutputSocket *from_socket : from_sockets) {
+ const std::pair<const DInputSocket *, const DOutputSocket *> key = std::make_pair(
+ &socket_to_compute, from_socket);
+ std::optional<GMutablePointer> value = value_by_input_.pop_try(key);
+ if (value.has_value()) {
+ values.append(*value);
+ }
+ else {
+ this->compute_output_and_forward(*from_socket);
+ GMutablePointer value = value_by_input_.pop(key);
+ values.append(value);
+ }
+ }
+ return values;
}
- /* Compute the socket now. */
const DOutputSocket &from_socket = *from_sockets[0];
+ const std::pair<const DInputSocket *, const DOutputSocket *> key = std::make_pair(
+ &socket_to_compute, &from_socket);
+ std::optional<GMutablePointer> value = value_by_input_.pop_try(key);
+ if (value.has_value()) {
+ /* This input has been computed before, return it directly. */
+ return {*value};
+ }
+
+ /* Compute the socket now. */
this->compute_output_and_forward(from_socket);
- return value_by_input_.pop(&socket_to_compute);
+ return {value_by_input_.pop(key)};
}
void compute_output_and_forward(const DOutputSocket &socket_to_compute)
{
const DNode &node = socket_to_compute.node();
- const bNode &bnode = *node.bnode();
if (!socket_to_compute.is_available()) {
/* If the output is not available, use a default value. */
@@ -299,14 +358,21 @@ class GeometryNodesEvaluator {
GValueMap<StringRef> node_inputs_map{allocator_};
for (const DInputSocket *input_socket : node.inputs()) {
if (input_socket->is_available()) {
- GMutablePointer value = this->get_input_value(*input_socket);
- node_inputs_map.add_new_direct(input_socket->identifier(), value);
+ Vector<GMutablePointer> values = this->get_input_values(*input_socket);
+ for (int i = 0; i < values.size(); ++i) {
+ /* Values from Multi Input Sockets are stored in input map with the format
+ * <identifier>[<index>]. */
+ blender::StringRefNull key = allocator_.copy_string(
+ input_socket->identifier() + (i > 0 ? ("[" + std::to_string(i)) + "]" : ""));
+ node_inputs_map.add_new_direct(key, std::move(values[i]));
+ }
}
}
/* Execute the node. */
GValueMap<StringRef> node_outputs_map{allocator_};
- GeoNodeExecParams params{bnode, node_inputs_map, node_outputs_map, handle_map_, self_object_};
+ GeoNodeExecParams params{
+ node, node_inputs_map, node_outputs_map, handle_map_, self_object_, modifier_, depsgraph_};
this->execute_node(node, params);
/* Forward computed outputs to linked input sockets. */
@@ -389,13 +455,15 @@ class GeometryNodesEvaluator {
void forward_to_inputs(const DOutputSocket &from_socket, GMutablePointer value_to_forward)
{
+ /* For all sockets that are linked with the from_socket push the value to their node. */
Span<const DInputSocket *> to_sockets_all = from_socket.linked_sockets();
const CPPType &from_type = *value_to_forward.type();
-
Vector<const DInputSocket *> to_sockets_same_type;
for (const DInputSocket *to_socket : to_sockets_all) {
const CPPType &to_type = *blender::nodes::socket_cpp_type_get(*to_socket->typeinfo());
+ const std::pair<const DInputSocket *, const DOutputSocket *> key = std::make_pair(
+ to_socket, &from_socket);
if (from_type == to_type) {
to_sockets_same_type.append(to_socket);
}
@@ -407,7 +475,7 @@ class GeometryNodesEvaluator {
else {
to_type.copy_to_uninitialized(to_type.default_value(), buffer);
}
- value_by_input_.add_new(to_socket, GMutablePointer{to_type, buffer});
+ add_value_to_input_socket(key, GMutablePointer{to_type, buffer});
}
}
@@ -418,23 +486,35 @@ class GeometryNodesEvaluator {
else if (to_sockets_same_type.size() == 1) {
/* This value is only used on one input socket, no need to copy it. */
const DInputSocket *to_socket = to_sockets_same_type[0];
- value_by_input_.add_new(to_socket, value_to_forward);
+ const std::pair<const DInputSocket *, const DOutputSocket *> key = std::make_pair(
+ to_socket, &from_socket);
+
+ add_value_to_input_socket(key, value_to_forward);
}
else {
/* Multiple inputs use the value, make a copy for every input except for one. */
const DInputSocket *first_to_socket = to_sockets_same_type[0];
Span<const DInputSocket *> other_to_sockets = to_sockets_same_type.as_span().drop_front(1);
const CPPType &type = *value_to_forward.type();
-
- value_by_input_.add_new(first_to_socket, value_to_forward);
+ const std::pair<const DInputSocket *, const DOutputSocket *> first_key = std::make_pair(
+ first_to_socket, &from_socket);
+ add_value_to_input_socket(first_key, value_to_forward);
for (const DInputSocket *to_socket : other_to_sockets) {
+ const std::pair<const DInputSocket *, const DOutputSocket *> key = std::make_pair(
+ to_socket, &from_socket);
void *buffer = allocator_.allocate(type.size(), type.alignment());
type.copy_to_uninitialized(value_to_forward.get(), buffer);
- value_by_input_.add_new(to_socket, GMutablePointer{type, buffer});
+ add_value_to_input_socket(key, GMutablePointer{type, buffer});
}
}
}
+ void add_value_to_input_socket(const std::pair<const DInputSocket *, const DOutputSocket *> key,
+ GMutablePointer value)
+ {
+ value_by_input_.add_new(key, value);
+ }
+
GMutablePointer get_unlinked_input_value(const DInputSocket &socket)
{
bNodeSocket *bsocket;
@@ -473,7 +553,7 @@ class GeometryNodesEvaluator {
* TODO(Hans): Codify this with some sort of table or refactor IDProperty use in RNA_access.c.
*/
struct SocketPropertyType {
- /* Create the actual propery used to store the data for the modifier. */
+ /* Create the actual property used to store the data for the modifier. */
IDProperty *(*create_prop)(const bNodeSocket &socket, const char *name);
/* Reused to build the "soft_min" property too. */
IDProperty *(*create_min_ui_prop)(const bNodeSocket &socket, const char *name);
@@ -879,6 +959,19 @@ static void fill_data_handle_map(const NodesModifierSettings &settings,
}
}
+static void reset_tree_ui_storage(Span<const blender::nodes::NodeTreeRef *> trees,
+ const Object &object,
+ const ModifierData &modifier)
+{
+ const NodeTreeEvaluationContext context = {object, modifier};
+
+ for (const blender::nodes::NodeTreeRef *tree : trees) {
+ bNodeTree *btree_cow = tree->btree();
+ bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow);
+ BKE_nodetree_ui_storage_free_for_context(*btree_original, context);
+ }
+}
+
/**
* Evaluate a node group to compute the output geometry.
* Currently, this uses a fairly basic and inefficient algorithm that might compute things more
@@ -925,8 +1018,14 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
Vector<const DInputSocket *> group_outputs;
group_outputs.append(&socket_to_compute);
- GeometryNodesEvaluator evaluator{
- group_inputs, group_outputs, mf_by_node, handle_map, ctx->object};
+ GeometryNodesEvaluator evaluator{group_inputs,
+ group_outputs,
+ mf_by_node,
+ handle_map,
+ ctx->object,
+ (ModifierData *)nmd,
+ ctx->depsgraph};
+
Vector<GMutablePointer> results = evaluator.execute();
BLI_assert(results.size() == 1);
GMutablePointer result = results[0];
@@ -1024,6 +1123,8 @@ static void modifyGeometry(ModifierData *md,
return;
}
+ reset_tree_ui_storage(tree.used_node_tree_refs(), *ctx->object, *md);
+
geometry_set = compute_geometry(
tree, group_inputs, *group_outputs[0], std::move(geometry_set), nmd, ctx);
}
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index ba370b401f3..84360caa345 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -486,9 +486,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
/*
* Normal Calculation (for face flipping)
* Sort edge verts for correct face flipping
- * NOT REALLY NEEDED but face flipping is nice.
- *
- * */
+ * NOT REALLY NEEDED but face flipping is nice. */
/* Notice!
*
@@ -780,7 +778,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
* use edge connectivity work this out */
if (SV_IS_VALID(vc->v[0])) {
if (SV_IS_VALID(vc->v[1])) {
- /* 2 edges connedted */
+ /* 2 edges connected. */
/* make 2 connecting vert locations relative to the middle vert */
sub_v3_v3v3(tmp_vec1, mvert_new[vc->v[0]].co, mvert_new[i].co);
sub_v3_v3v3(tmp_vec2, mvert_new[vc->v[1]].co, mvert_new[i].co);
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c
index e41e70864dc..ea31bdc6e31 100644
--- a/source/blender/modifiers/intern/MOD_simpledeform.c
+++ b/source/blender/modifiers/intern/MOD_simpledeform.c
@@ -256,7 +256,7 @@ static void SimpleDeformModifier_do(SimpleDeformModifierData *smd,
smd->limit[0] = min_ff(smd->limit[0], smd->limit[1]); /* Upper limit >= than lower limit */
- /* Calculate matrixs do convert between coordinate spaces */
+ /* Calculate matrix to convert between coordinate spaces. */
if (smd->origin != NULL) {
transf = &tmp_transf;
BLI_SPACE_TRANSFORM_SETUP(transf, ob, smd->origin);
@@ -314,7 +314,7 @@ static void SimpleDeformModifier_do(SimpleDeformModifierData *smd,
simpleDeform_callback = simpleDeform_stretch;
break;
default:
- return; /* No simpledeform mode? */
+ return; /* No simple-deform mode? */
}
if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) {
diff --git a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c
index f62980ec4fd..0f8503eddde 100644
--- a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c
+++ b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c
@@ -2434,9 +2434,9 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md,
vm[orig_mloop[loopstart + j].v]);
BLI_assert(flip ||
vm[orig_medge[new_edge->old_edge].v1] == vm[orig_mloop[loopstart + j].v]);
- /* The vert thats in the current loop. */
+ /* The vert that's in the current loop. */
const uint new_v1 = new_edge->link_edge_groups[flip]->new_vert;
- /* The vert thats in the next loop. */
+ /* The vert that's in the next loop. */
const uint new_v2 = new_edge->link_edge_groups[1 - flip]->new_vert;
if (k == 0 || face_verts[k - 1] != new_v1) {
face_loops[k] = loopstart + j;
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index 0fad78683eb..99011c5e351 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -104,7 +104,7 @@ typedef struct SDefBindCalcData {
* needed once when running bind, so optimizing this structure isn't a priority.
*/
typedef struct SDefBindPoly {
- /** Coordinates copied directly from the modifiers inptut. */
+ /** Coordinates copied directly from the modifiers input. */
float (*coords)[3];
/** Coordinates projected into 2D space using `normal`. */
float (*coords_v2)[2];
@@ -114,7 +114,12 @@ typedef struct SDefBindPoly {
float weight_dist_proj;
float weight_dist;
float weight;
+ /** Distances from the centroid to edges flanking the corner vertex, used to penalize
+ * small or long and narrow faces in favor of bigger and more square ones. */
float scales[2];
+ /** Distance weight from the corner vertex to the chord line, used to penalize
+ * cases with the three consecutive vertices being nearly in line. */
+ float scale_mid;
/** Center of `coords` */
float centroid[3];
/** Center of `coords_v2` */
@@ -123,15 +128,18 @@ typedef struct SDefBindPoly {
* The calculated normal of coords (could be shared between faces).
*/
float normal[3];
+ /** Vectors pointing from the centroid to the midpoints of the two edges
+ * flanking the corner vertex. */
float cent_edgemid_vecs_v2[2][2];
- /**
- * The unsigned angle of this face-corner in `[0.0 .. PI]` range,
- * where a small value is a thin corner. PI is a straight line.
- * Take care dividing by this value as it can approach zero.
- */
+ /** Angle between the cent_edgemid_vecs_v2 vectors. */
float edgemid_angle;
+ /** Angles between the centroid-to-point and cent_edgemid_vecs_v2 vectors.
+ * Positive values measured towards the corner; clamped non-negative. */
float point_edgemid_angles[2];
+ /** Angles between the centroid-to-corner and cent_edgemid_vecs_v2 vectors. */
float corner_edgemid_angles[2];
+ /** Weight of the bind mode based on the corner and two adjacent vertices,
+ * versus the one based on the centroid and the dominant edge. */
float dominant_angle_weight;
/** Index of the input polygon. */
uint index;
@@ -414,13 +422,14 @@ BLI_INLINE uint nearestVert(SDefBindCalcData *const data, const float point_co[3
BLI_INLINE int isPolyValid(const float coords[][2], const uint nr)
{
- float prev_co[2];
+ float prev_co[2], prev_prev_co[2];
float curr_vec[2], prev_vec[2];
if (!is_poly_convex_v2(coords, nr)) {
return MOD_SDEF_BIND_RESULT_CONCAVE_ERR;
}
+ copy_v2_v2(prev_prev_co, coords[nr - 2]);
copy_v2_v2(prev_co, coords[nr - 1]);
sub_v2_v2v2(prev_vec, prev_co, coords[nr - 2]);
normalize_v2(prev_vec);
@@ -428,15 +437,23 @@ BLI_INLINE int isPolyValid(const float coords[][2], const uint nr)
for (int i = 0; i < nr; i++) {
sub_v2_v2v2(curr_vec, coords[i], prev_co);
+ /* Check overlap between directly adjacent vertices. */
const float curr_len = normalize_v2(curr_vec);
if (curr_len < FLT_EPSILON) {
return MOD_SDEF_BIND_RESULT_OVERLAP_ERR;
}
+ /* Check overlap between vertices skipping one. */
+ if (len_squared_v2v2(prev_prev_co, coords[i]) < FLT_EPSILON * FLT_EPSILON) {
+ return MOD_SDEF_BIND_RESULT_OVERLAP_ERR;
+ }
+
+ /* Check for adjacent parallel edges. */
if (1.0f - dot_v2v2(prev_vec, curr_vec) < FLT_EPSILON) {
return MOD_SDEF_BIND_RESULT_CONCAVE_ERR;
}
+ copy_v2_v2(prev_prev_co, prev_co);
copy_v2_v2(prev_co, coords[i]);
copy_v2_v2(prev_vec, curr_vec);
}
@@ -460,9 +477,9 @@ static void freeBindData(SDefBindWeightData *const bwdata)
MEM_freeN(bwdata);
}
-BLI_INLINE float computeAngularWeight(const float point_angle)
+BLI_INLINE float computeAngularWeight(const float point_angle, const float edgemid_angle)
{
- return sinf(point_angle * M_PI_2);
+ return sinf(min_ff(point_angle / edgemid_angle, 1) * M_PI_2);
}
BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData *const data,
@@ -603,33 +620,51 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData *const data,
avg_point_dist += bpoly->weight_dist;
- /* Compute centroid to mid-edge vectors */
- mid_v2_v2v2(bpoly->cent_edgemid_vecs_v2[0],
- bpoly->coords_v2[bpoly->edge_vert_inds[0]],
- bpoly->coords_v2[bpoly->corner_ind]);
+ /* Common vertex coordinates. */
+ const float *const vert0_v2 = bpoly->coords_v2[bpoly->edge_vert_inds[0]];
+ const float *const vert1_v2 = bpoly->coords_v2[bpoly->edge_vert_inds[1]];
+ const float *const corner_v2 = bpoly->coords_v2[bpoly->corner_ind];
- mid_v2_v2v2(bpoly->cent_edgemid_vecs_v2[1],
- bpoly->coords_v2[bpoly->edge_vert_inds[1]],
- bpoly->coords_v2[bpoly->corner_ind]);
+ /* Compute centroid to mid-edge vectors */
+ mid_v2_v2v2(bpoly->cent_edgemid_vecs_v2[0], vert0_v2, corner_v2);
+ mid_v2_v2v2(bpoly->cent_edgemid_vecs_v2[1], vert1_v2, corner_v2);
sub_v2_v2(bpoly->cent_edgemid_vecs_v2[0], bpoly->centroid_v2);
sub_v2_v2(bpoly->cent_edgemid_vecs_v2[1], bpoly->centroid_v2);
- /* Compute poly scales with respect to mid-edges, and normalize the vectors */
- bpoly->scales[0] = normalize_v2(bpoly->cent_edgemid_vecs_v2[0]);
- bpoly->scales[1] = normalize_v2(bpoly->cent_edgemid_vecs_v2[1]);
+ normalize_v2(bpoly->cent_edgemid_vecs_v2[0]);
+ normalize_v2(bpoly->cent_edgemid_vecs_v2[1]);
- /* Compute the required polygon angles */
+ /* Compute poly scales with respect to the two edges. */
+ bpoly->scales[0] = dist_to_line_v2(bpoly->centroid_v2, vert0_v2, corner_v2);
+ bpoly->scales[1] = dist_to_line_v2(bpoly->centroid_v2, vert1_v2, corner_v2);
+
+ /* Compute the angle between the edge mid vectors. */
bpoly->edgemid_angle = angle_normalized_v2v2(bpoly->cent_edgemid_vecs_v2[0],
bpoly->cent_edgemid_vecs_v2[1]);
- sub_v2_v2v2(tmp_vec_v2, bpoly->coords_v2[bpoly->corner_ind], bpoly->centroid_v2);
+ /* Compute the angles between the corner and the edge mid vectors. The angles
+ * are computed signed in order to correctly clamp point_edgemid_angles later. */
+ float corner_angles[2];
+
+ sub_v2_v2v2(tmp_vec_v2, corner_v2, bpoly->centroid_v2);
normalize_v2(tmp_vec_v2);
- bpoly->corner_edgemid_angles[0] = angle_normalized_v2v2(tmp_vec_v2,
- bpoly->cent_edgemid_vecs_v2[0]);
- bpoly->corner_edgemid_angles[1] = angle_normalized_v2v2(tmp_vec_v2,
- bpoly->cent_edgemid_vecs_v2[1]);
+ corner_angles[0] = angle_signed_v2v2(tmp_vec_v2, bpoly->cent_edgemid_vecs_v2[0]);
+ corner_angles[1] = angle_signed_v2v2(tmp_vec_v2, bpoly->cent_edgemid_vecs_v2[1]);
+
+ bpoly->corner_edgemid_angles[0] = fabsf(corner_angles[0]);
+ bpoly->corner_edgemid_angles[1] = fabsf(corner_angles[1]);
+
+ /* Verify that the computed values are valid (the polygon isn't somehow
+ * degenerate despite having passed isPolyValid). */
+ if (bpoly->scales[0] < FLT_EPSILON || bpoly->scales[1] < FLT_EPSILON ||
+ bpoly->edgemid_angle < FLT_EPSILON || bpoly->corner_edgemid_angles[0] < FLT_EPSILON ||
+ bpoly->corner_edgemid_angles[1] < FLT_EPSILON) {
+ freeBindData(bwdata);
+ data->success = MOD_SDEF_BIND_RESULT_GENERIC_ERR;
+ return NULL;
+ }
/* Check for infinite weights, and compute angular data otherwise. */
if (bpoly->weight_dist < FLT_EPSILON) {
@@ -640,15 +675,54 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData *const data,
inf_weight_flags |= MOD_SDEF_INFINITE_WEIGHT_DIST_PROJ;
}
else {
- float cent_point_vec[2];
+ /* Compute angles between the point and the edge mid vectors. */
+ float cent_point_vec[2], point_angles[2];
sub_v2_v2v2(cent_point_vec, bpoly->point_v2, bpoly->centroid_v2);
normalize_v2(cent_point_vec);
- bpoly->point_edgemid_angles[0] = angle_normalized_v2v2(cent_point_vec,
- bpoly->cent_edgemid_vecs_v2[0]);
- bpoly->point_edgemid_angles[1] = angle_normalized_v2v2(cent_point_vec,
- bpoly->cent_edgemid_vecs_v2[1]);
+ point_angles[0] = angle_signed_v2v2(cent_point_vec, bpoly->cent_edgemid_vecs_v2[0]) *
+ signf(corner_angles[0]);
+ point_angles[1] = angle_signed_v2v2(cent_point_vec, bpoly->cent_edgemid_vecs_v2[1]) *
+ signf(corner_angles[1]);
+
+ if (point_angles[0] <= 0 && point_angles[1] <= 0) {
+ /* If the point is outside the corner formed by the edge mid vectors,
+ * choose to clamp the closest side and flip the other. */
+ if (point_angles[0] < point_angles[1]) {
+ point_angles[0] = bpoly->edgemid_angle - point_angles[1];
+ }
+ else {
+ point_angles[1] = bpoly->edgemid_angle - point_angles[0];
+ }
+ }
+
+ bpoly->point_edgemid_angles[0] = max_ff(0, point_angles[0]);
+ bpoly->point_edgemid_angles[1] = max_ff(0, point_angles[1]);
+
+ /* Compute the distance scale for the corner. The base value is the orthogonal
+ * distance from the corner to the chord, scaled by sqrt(2) to preserve the old
+ * values in case of a square grid. This doesn't use the centroid because the
+ * LOOPTRI method only uses these three vertices. */
+ bpoly->scale_mid = area_tri_v2(vert0_v2, corner_v2, vert1_v2) /
+ len_v2v2(vert0_v2, vert1_v2) * sqrtf(2);
+
+ if (bpoly->inside) {
+ /* When inside, interpolate to centroid-based scale close to the center. */
+ float min_dist = min_ff(bpoly->scales[0], bpoly->scales[1]);
+
+ bpoly->scale_mid = interpf(bpoly->scale_mid,
+ (bpoly->scales[0] + bpoly->scales[1]) / 2,
+ min_ff(bpoly->weight_dist_proj / min_dist, 1));
+ }
+
+ /* Verify that the additional computed values are valid. */
+ if (bpoly->scale_mid < FLT_EPSILON ||
+ bpoly->point_edgemid_angles[0] + bpoly->point_edgemid_angles[1] < FLT_EPSILON) {
+ freeBindData(bwdata);
+ data->success = MOD_SDEF_BIND_RESULT_GENERIC_ERR;
+ return NULL;
+ }
}
}
}
@@ -688,12 +762,15 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData *const data,
/* Compute angular weight component */
if (epolys->num == 1) {
- ang_weights[0] = computeAngularWeight(bpolys[0]->point_edgemid_angles[edge_on_poly[0]]);
+ ang_weights[0] = computeAngularWeight(bpolys[0]->point_edgemid_angles[edge_on_poly[0]],
+ bpolys[0]->edgemid_angle);
bpolys[0]->weight_angular *= ang_weights[0] * ang_weights[0];
}
else if (epolys->num == 2) {
- ang_weights[0] = computeAngularWeight(bpolys[0]->point_edgemid_angles[edge_on_poly[0]]);
- ang_weights[1] = computeAngularWeight(bpolys[1]->point_edgemid_angles[edge_on_poly[1]]);
+ ang_weights[0] = computeAngularWeight(bpolys[0]->point_edgemid_angles[edge_on_poly[0]],
+ bpolys[0]->edgemid_angle);
+ ang_weights[1] = computeAngularWeight(bpolys[1]->point_edgemid_angles[edge_on_poly[1]],
+ bpolys[1]->edgemid_angle);
bpolys[0]->weight_angular *= ang_weights[0] * ang_weights[1];
bpolys[1]->weight_angular *= ang_weights[0] * ang_weights[1];
@@ -731,6 +808,13 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData *const data,
bpoly->dominant_angle_weight = corner_angle_weights[1];
}
+ /* Check for invalid weights just in case computations fail. */
+ if (bpoly->dominant_angle_weight < 0 || bpoly->dominant_angle_weight > 1) {
+ freeBindData(bwdata);
+ data->success = MOD_SDEF_BIND_RESULT_GENERIC_ERR;
+ return NULL;
+ }
+
bpoly->dominant_angle_weight = sinf(bpoly->dominant_angle_weight * M_PI_2);
/* Compute quadratic angular scale interpolation weight */
@@ -748,10 +832,15 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData *const data,
inv_sqr *= inv_sqr;
scale_weight = sqr / (sqr + inv_sqr);
+ BLI_assert(scale_weight >= 0 && scale_weight <= 1);
+
/* Compute interpolated scale (no longer need the individual scales,
* so simply storing the result over the scale in index zero) */
- bpoly->scales[0] = bpoly->scales[bpoly->dominant_edge] * (1.0f - scale_weight) +
- bpoly->scales[!bpoly->dominant_edge] * scale_weight;
+ bpoly->scales[0] = interpf(bpoly->scale_mid,
+ interpf(bpoly->scales[!bpoly->dominant_edge],
+ bpoly->scales[bpoly->dominant_edge],
+ scale_weight),
+ bpoly->dominant_angle_weight);
/* Scale the point distance weights, and introduce falloff */
bpoly->weight_dist_proj /= bpoly->scales[0];
diff --git a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
index 941bc8409f7..41ed7ae983a 100644
--- a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
+++ b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
@@ -24,6 +24,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_volume.h"
+#include "BKE_volume_to_mesh.hh"
#include "MOD_modifiertypes.h"
#include "MOD_ui_common.h"
@@ -128,139 +129,6 @@ static void panelRegister(ARegionType *region_type)
modifier_panel_register(region_type, eModifierType_VolumeToMesh, panel_draw);
}
-#ifdef WITH_OPENVDB
-
-struct VolumeToMeshOp {
- const openvdb::GridBase &base_grid;
- VolumeToMeshModifierData &vmmd;
- const ModifierEvalContext &ctx;
- std::vector<openvdb::Vec3s> verts;
- std::vector<openvdb::Vec3I> tris;
- std::vector<openvdb::Vec4I> quads;
-
- template<typename GridType> bool operator()()
- {
- if constexpr (std::is_scalar_v<typename GridType::ValueType>) {
- this->generate_mesh_data<GridType>();
- return true;
- }
- else {
- return false;
- }
- }
-
- template<typename GridType> void generate_mesh_data()
- {
- /* Make a new transform from the index space into the mesh object space. */
- openvdb::math::Transform::Ptr transform = this->base_grid.transform().copy();
- transform->postMult(openvdb::Mat4d((float *)vmmd.object->obmat));
- openvdb::Mat4d imat = openvdb::Mat4d((float *)ctx.object->imat);
- /* `imat` had floating point issues and wasn't affine. */
- imat.setCol(3, openvdb::Vec4d(0, 0, 0, 1));
- transform->postMult(imat);
-
- /* Create a new grid with a different transform. The underlying tree is shared. */
- typename GridType::ConstPtr grid = openvdb::gridConstPtrCast<GridType>(
- this->base_grid.copyGridReplacingTransform(transform));
-
- if (this->vmmd.resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_GRID) {
- this->grid_to_mesh(*grid);
- return;
- }
-
- const float resolution_factor = this->compute_resolution_factor(*grid);
- typename GridType::Ptr temp_grid = this->create_grid_with_changed_resolution(
- *grid, resolution_factor);
- this->grid_to_mesh(*temp_grid);
- }
-
- template<typename GridType>
- typename GridType::Ptr create_grid_with_changed_resolution(const GridType &old_grid,
- const float resolution_factor)
- {
- BLI_assert(resolution_factor > 0.0f);
-
- openvdb::Mat4R xform;
- xform.setToScale(openvdb::Vec3d(resolution_factor));
- openvdb::tools::GridTransformer transformer{xform};
-
- typename GridType::Ptr new_grid = GridType::create();
- transformer.transformGrid<openvdb::tools::BoxSampler>(old_grid, *new_grid);
- new_grid->transform() = old_grid.transform();
- new_grid->transform().preScale(1.0f / resolution_factor);
- return new_grid;
- }
-
- float compute_resolution_factor(const openvdb::GridBase &grid) const
- {
- const openvdb::Vec3s voxel_size{grid.voxelSize()};
- const float current_voxel_size = std::max({voxel_size[0], voxel_size[1], voxel_size[2]});
- const float desired_voxel_size = this->compute_desired_voxel_size(grid);
- return current_voxel_size / desired_voxel_size;
- }
-
- float compute_desired_voxel_size(const openvdb::GridBase &grid) const
- {
- if (this->vmmd.resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE) {
- return this->vmmd.voxel_size;
- }
- const openvdb::CoordBBox coord_bbox = base_grid.evalActiveVoxelBoundingBox();
- const openvdb::BBoxd bbox = grid.transform().indexToWorld(coord_bbox);
- const float max_extent = bbox.extents()[bbox.maxExtent()];
- const float voxel_size = max_extent / this->vmmd.voxel_amount;
- return voxel_size;
- }
-
- template<typename GridType> void grid_to_mesh(const GridType &grid)
- {
- openvdb::tools::volumeToMesh(
- grid, this->verts, this->tris, this->quads, this->vmmd.threshold, this->vmmd.adaptivity);
- }
-};
-
-static Mesh *new_mesh_from_openvdb_data(Span<openvdb::Vec3s> verts,
- Span<openvdb::Vec3I> tris,
- Span<openvdb::Vec4I> quads)
-{
- const int tot_loops = 3 * tris.size() + 4 * quads.size();
- const int tot_polys = tris.size() + quads.size();
-
- Mesh *mesh = BKE_mesh_new_nomain(verts.size(), 0, 0, tot_loops, tot_polys);
-
- /* Write vertices. */
- for (const int i : verts.index_range()) {
- const blender::float3 co = blender::float3(verts[i].asV());
- copy_v3_v3(mesh->mvert[i].co, co);
- }
-
- /* Write triangles. */
- for (const int i : tris.index_range()) {
- mesh->mpoly[i].loopstart = 3 * i;
- mesh->mpoly[i].totloop = 3;
- for (int j = 0; j < 3; j++) {
- /* Reverse vertex order to get correct normals. */
- mesh->mloop[3 * i + j].v = tris[i][2 - j];
- }
- }
-
- /* Write quads. */
- const int poly_offset = tris.size();
- const int loop_offset = tris.size() * 3;
- for (const int i : quads.index_range()) {
- mesh->mpoly[poly_offset + i].loopstart = loop_offset + 4 * i;
- mesh->mpoly[poly_offset + i].totloop = 4;
- for (int j = 0; j < 4; j++) {
- /* Reverse vertex order to get correct normals. */
- mesh->mloop[loop_offset + 4 * i + j].v = quads[i][3 - j];
- }
- }
-
- BKE_mesh_calc_edges(mesh, false, false);
- BKE_mesh_calc_normals(mesh);
- return mesh;
-}
-#endif
-
static Mesh *create_empty_mesh(const Mesh *input_mesh)
{
Mesh *new_mesh = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
@@ -296,16 +164,35 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return create_empty_mesh(input_mesh);
}
- const openvdb::GridBase::ConstPtr grid = BKE_volume_grid_openvdb_for_read(volume, volume_grid);
+ const openvdb::GridBase::ConstPtr local_grid = BKE_volume_grid_openvdb_for_read(volume,
+ volume_grid);
+
+ openvdb::math::Transform::Ptr transform = local_grid->transform().copy();
+ transform->postMult(openvdb::Mat4d(((float *)vmmd->object->obmat)));
+ openvdb::Mat4d imat = openvdb::Mat4d((float *)ctx->object->imat);
+ /* `imat` had floating point issues and wasn't affine. */
+ imat.setCol(3, openvdb::Vec4d(0, 0, 0, 1));
+ transform->postMult(imat);
+
+ /* Create a temporary transformed grid. The underlying tree is shared. */
+ openvdb::GridBase::ConstPtr transformed_grid = local_grid->copyGridReplacingTransform(transform);
+
+ blender::bke::VolumeToMeshResolution resolution;
+ resolution.mode = (VolumeToMeshResolutionMode)vmmd->resolution_mode;
+ if (resolution.mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_AMOUNT) {
+ resolution.settings.voxel_amount = vmmd->voxel_amount;
+ }
+ if (resolution.mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE) {
+ resolution.settings.voxel_size = vmmd->voxel_size;
+ }
- const VolumeGridType grid_type = BKE_volume_grid_type(volume_grid);
- VolumeToMeshOp to_mesh_op{*grid, *vmmd, *ctx};
- if (!BKE_volume_grid_type_operation(grid_type, to_mesh_op)) {
- BKE_modifier_set_error(ctx->object, md, "Expected a scalar grid");
+ Mesh *mesh = blender::bke::volume_to_mesh(
+ *transformed_grid, resolution, vmmd->threshold, vmmd->adaptivity);
+ if (mesh == nullptr) {
+ BKE_modifier_set_error(ctx->object, md, "Could not generate mesh from grid");
return create_empty_mesh(input_mesh);
}
- Mesh *mesh = new_mesh_from_openvdb_data(to_mesh_op.verts, to_mesh_op.tris, to_mesh_op.quads);
BKE_mesh_copy_settings(mesh, input_mesh);
if (vmmd->flag & VOLUME_TO_MESH_USE_SMOOTH_SHADE) {
BKE_mesh_smooth_flag_set(mesh, true);
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index ed4d658eb4f..8c5081555fc 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -26,6 +26,7 @@ set(INC
intern
shader
texture
+ ../editors/include
../blenkernel
../blenlib
../blentranslation
@@ -134,6 +135,7 @@ set(SRC
function/nodes/node_fn_combine_strings.cc
function/nodes/node_fn_float_compare.cc
function/nodes/node_fn_group_instance_id.cc
+ function/nodes/node_fn_input_string.cc
function/nodes/node_fn_input_vector.cc
function/nodes/node_fn_object_transforms.cc
function/nodes/node_fn_random_float.cc
@@ -142,15 +144,21 @@ set(SRC
geometry/nodes/node_geo_align_rotation_to_vector.cc
geometry/nodes/node_geo_attribute_color_ramp.cc
+ geometry/nodes/node_geo_attribute_combine_xyz.cc
geometry/nodes/node_geo_attribute_compare.cc
geometry/nodes/node_geo_attribute_fill.cc
geometry/nodes/node_geo_attribute_math.cc
geometry/nodes/node_geo_attribute_mix.cc
+ geometry/nodes/node_geo_attribute_proximity.cc
geometry/nodes/node_geo_attribute_randomize.cc
+ geometry/nodes/node_geo_attribute_sample_texture.cc
+ geometry/nodes/node_geo_attribute_separate_xyz.cc
geometry/nodes/node_geo_attribute_vector_math.cc
geometry/nodes/node_geo_boolean.cc
+ geometry/nodes/node_geo_collection_info.cc
geometry/nodes/node_geo_common.cc
geometry/nodes/node_geo_edge_split.cc
+ geometry/nodes/node_geo_is_viewport.cc
geometry/nodes/node_geo_join_geometry.cc
geometry/nodes/node_geo_object_info.cc
geometry/nodes/node_geo_point_distribute.cc
@@ -159,9 +167,12 @@ set(SRC
geometry/nodes/node_geo_point_scale.cc
geometry/nodes/node_geo_point_separate.cc
geometry/nodes/node_geo_point_translate.cc
+ geometry/nodes/node_geo_points_to_volume.cc
geometry/nodes/node_geo_subdivision_surface.cc
+ geometry/nodes/node_geo_subdivision_surface_simple.cc
geometry/nodes/node_geo_transform.cc
geometry/nodes/node_geo_triangulate.cc
+ geometry/nodes/node_geo_volume_to_mesh.cc
geometry/node_geometry_exec.cc
geometry/node_geometry_tree.cc
geometry/node_geometry_util.cc
@@ -347,6 +358,13 @@ if(WITH_INTERNATIONAL)
add_definitions(-DWITH_INTERNATIONAL)
endif()
+if(WITH_TBB)
+ list(APPEND INC_SYS
+ ${TBB_INCLUDE_DIRS}
+ )
+ add_definitions(-DWITH_TBB)
+endif()
+
if(WITH_IMAGE_OPENEXR)
add_definitions(-DWITH_OPENEXR)
endif()
@@ -366,4 +384,11 @@ if(WITH_OPENSUBDIV)
add_definitions(-DWITH_OPENSUBDIV)
endif()
+if(WITH_OPENVDB)
+ list(APPEND INC_SYS
+ ${OPENVDB_INCLUDE_DIRS}
+ )
+ add_definitions(-DWITH_OPENVDB ${OPENVDB_DEFINITIONS})
+endif()
+
blender_add_lib(bf_nodes "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
diff --git a/source/blender/nodes/NOD_derived_node_tree.hh b/source/blender/nodes/NOD_derived_node_tree.hh
index 4d594a77ebc..62affe43895 100644
--- a/source/blender/nodes/NOD_derived_node_tree.hh
+++ b/source/blender/nodes/NOD_derived_node_tree.hh
@@ -80,6 +80,7 @@ class DInputSocket : public DSocket {
private:
Vector<DOutputSocket *> linked_sockets_;
Vector<DGroupInput *> linked_group_inputs_;
+ bool is_multi_input_socket_;
friend DerivedNodeTree;
@@ -90,6 +91,7 @@ class DInputSocket : public DSocket {
Span<const DGroupInput *> linked_group_inputs() const;
bool is_linked() const;
+ bool is_multi_input_socket() const;
};
class DOutputSocket : public DSocket {
@@ -362,6 +364,11 @@ inline bool DInputSocket::is_linked() const
return linked_sockets_.size() > 0 || linked_group_inputs_.size() > 0;
}
+inline bool DInputSocket::is_multi_input_socket() const
+{
+ return is_multi_input_socket_;
+}
+
/* --------------------------------------------------------------------
* DOutputSocket inline methods.
*/
diff --git a/source/blender/nodes/NOD_function.h b/source/blender/nodes/NOD_function.h
index 75dd8f89bc8..6b184f04af7 100644
--- a/source/blender/nodes/NOD_function.h
+++ b/source/blender/nodes/NOD_function.h
@@ -21,13 +21,14 @@ extern "C" {
#endif
void register_node_type_fn_boolean_math(void);
+void register_node_type_fn_combine_strings(void);
void register_node_type_fn_float_compare(void);
-void register_node_type_fn_switch(void);
void register_node_type_fn_group_instance_id(void);
-void register_node_type_fn_combine_strings(void);
+void register_node_type_fn_input_string(void);
+void register_node_type_fn_input_vector(void);
void register_node_type_fn_object_transforms(void);
void register_node_type_fn_random_float(void);
-void register_node_type_fn_input_vector(void);
+void register_node_type_fn_switch(void);
#ifdef __cplusplus
}
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 523d0cfa24d..3ee8067e81a 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -26,27 +26,36 @@ void register_node_tree_type_geo(void);
void register_node_type_geo_group(void);
+void register_node_type_geo_align_rotation_to_vector(void);
+void register_node_type_geo_attribute_color_ramp(void);
+void register_node_type_geo_attribute_combine_xyz(void);
+void register_node_type_geo_attribute_compare(void);
void register_node_type_geo_attribute_fill(void);
+void register_node_type_geo_attribute_math(void);
+void register_node_type_geo_attribute_mix(void);
+void register_node_type_geo_attribute_proximity(void);
+void register_node_type_geo_attribute_randomize(void);
+void register_node_type_geo_attribute_separate_xyz(void);
void register_node_type_geo_attribute_vector_math(void);
void register_node_type_geo_boolean(void);
+void register_node_type_geo_collection_info(void);
void register_node_type_geo_edge_split(void);
-void register_node_type_geo_transform(void);
-void register_node_type_geo_subdivision_surface(void);
-void register_node_type_geo_triangulate(void);
+void register_node_type_geo_is_viewport(void);
+void register_node_type_geo_join_geometry(void);
+void register_node_type_geo_object_info(void);
void register_node_type_geo_point_distribute(void);
void register_node_type_geo_point_instance(void);
-void register_node_type_geo_object_info(void);
-void register_node_type_geo_attribute_randomize(void);
-void register_node_type_geo_attribute_math(void);
-void register_node_type_geo_join_geometry(void);
-void register_node_type_geo_point_separate(void);
+void register_node_type_geo_point_rotate(void);
void register_node_type_geo_point_scale(void);
+void register_node_type_geo_point_separate(void);
void register_node_type_geo_point_translate(void);
-void register_node_type_geo_attribute_compare(void);
-void register_node_type_geo_attribute_mix(void);
-void register_node_type_geo_attribute_color_ramp(void);
-void register_node_type_geo_point_rotate(void);
-void register_node_type_geo_align_rotation_to_vector(void);
+void register_node_type_geo_points_to_volume(void);
+void register_node_type_geo_sample_texture(void);
+void register_node_type_geo_subdivision_surface(void);
+void register_node_type_geo_subdivision_surface_simple(void);
+void register_node_type_geo_transform(void);
+void register_node_type_geo_triangulate(void);
+void register_node_type_geo_volume_to_mesh(void);
#ifdef __cplusplus
}
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index f278d6b4107..e648d77337b 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -20,20 +20,30 @@
#include "BKE_attribute_access.hh"
#include "BKE_geometry_set.hh"
+#include "BKE_geometry_set_instances.hh"
+#include "BKE_node_ui_storage.hh"
#include "BKE_persistent_data_handle.hh"
#include "DNA_node_types.h"
+#include "NOD_derived_node_tree.hh"
+
+struct Depsgraph;
+struct ModifierData;
+
namespace blender::nodes {
using bke::BooleanReadAttribute;
using bke::BooleanWriteAttribute;
using bke::Color4fReadAttribute;
using bke::Color4fWriteAttribute;
+using bke::Float2ReadAttribute;
+using bke::Float2WriteAttribute;
using bke::Float3ReadAttribute;
using bke::Float3WriteAttribute;
using bke::FloatReadAttribute;
using bke::FloatWriteAttribute;
+using bke::geometry_set_realize_instances;
using bke::Int32ReadAttribute;
using bke::Int32WriteAttribute;
using bke::PersistentDataHandleMap;
@@ -49,23 +59,29 @@ using fn::GValueMap;
class GeoNodeExecParams {
private:
- const bNode &node_;
+ const DNode &node_;
GValueMap<StringRef> &input_values_;
GValueMap<StringRef> &output_values_;
const PersistentDataHandleMap &handle_map_;
const Object *self_object_;
+ const ModifierData *modifier_;
+ Depsgraph *depsgraph_;
public:
- GeoNodeExecParams(const bNode &node,
+ GeoNodeExecParams(const DNode &node,
GValueMap<StringRef> &input_values,
GValueMap<StringRef> &output_values,
const PersistentDataHandleMap &handle_map,
- const Object *self_object)
+ const Object *self_object,
+ const ModifierData *modifier,
+ Depsgraph *depsgraph)
: node_(node),
input_values_(input_values),
output_values_(output_values),
handle_map_(handle_map),
- self_object_(self_object)
+ self_object_(self_object),
+ modifier_(modifier),
+ depsgraph_(depsgraph)
{
}
@@ -97,12 +113,28 @@ class GeoNodeExecParams {
}
/**
- * Get the input value for the input socket with the given identifier.
+ * Get input as vector for multi input socket with the given identifier.
*
- * This makes a copy of the value, which is fine for most types but should be avoided for
- * geometry sets.
+ * This method can only be called once for each identifier.
+ */
+ template<typename T> Vector<T> extract_multi_input(StringRef identifier)
+ {
+ Vector<T> values;
+ values.append(input_values_.extract<T>(identifier));
+ int i = 1;
+ std::string sub_identifier = identifier + "[1]";
+ while (input_values_.contains(sub_identifier)) {
+ values.append(input_values_.extract<T>(sub_identifier));
+ i++;
+ sub_identifier = identifier + "[" + std::to_string(i) + "]";
+ }
+ return values;
+ }
+
+ /**
+ * Get the input value for the input socket with the given identifier.
*/
- template<typename T> T get_input(StringRef identifier) const
+ template<typename T> const T &get_input(StringRef identifier) const
{
#ifdef DEBUG
this->check_extract_input(identifier, &CPPType::get<T>());
@@ -150,7 +182,7 @@ class GeoNodeExecParams {
*/
const bNode &node() const
{
- return node_;
+ return *node_.bnode();
}
const PersistentDataHandleMap &handle_map() const
@@ -163,9 +195,23 @@ class GeoNodeExecParams {
return self_object_;
}
+ Depsgraph *depsgraph() const
+ {
+ return depsgraph_;
+ }
+
+ /**
+ * Add an error message displayed at the top of the node when displaying the node tree,
+ * and potentially elsewhere in Blender.
+ */
+ void error_message_add(const NodeWarningType type, std::string message) const;
+
/**
* Creates a read-only attribute based on node inputs. The method automatically detects which
- * input with the given name is available.
+ * input socket with the given name is available.
+ *
+ * \note This will add an error message if the string socket is active and
+ * the input attribute does not exist.
*/
ReadAttributePtr get_input_attribute(const StringRef name,
const GeometryComponent &component,
@@ -191,6 +237,10 @@ class GeoNodeExecParams {
const GeometryComponent &component,
const CustomDataType default_type) const;
+ AttributeDomain get_highest_priority_input_domain(Span<std::string> names,
+ const GeometryComponent &component,
+ const AttributeDomain default_domain) const;
+
private:
/* Utilities for detecting common errors at when using this class. */
void check_extract_input(StringRef identifier, const CPPType *requested_type = nullptr) const;
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index e91b385a87e..35550bdec48 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -267,6 +267,7 @@ DefNode(FunctionNode, FN_NODE_COMBINE_STRINGS, 0, "COMBINE_STRINGS
DefNode(FunctionNode, FN_NODE_OBJECT_TRANSFORMS, 0, "OBJECT_TRANSFORMS", ObjectTransforms, "Object Transforms", "")
DefNode(FunctionNode, FN_NODE_RANDOM_FLOAT, 0, "RANDOM_FLOAT", RandomFloat, "Random Float", "")
DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", InputVector, "Vector", "")
+DefNode(FunctionNode, FN_NODE_INPUT_STRING, def_fn_input_string, "INPUT_STRING", InputString, "String", "")
DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "")
DefNode(GeometryNode, GEO_NODE_EDGE_SPLIT, 0, "EDGE_SPLIT", EdgeSplit, "Edge Split", "")
@@ -289,6 +290,15 @@ DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_VECTOR_MATH, def_geo_attribute_vector_m
DefNode(GeometryNode, GEO_NODE_ALIGN_ROTATION_TO_VECTOR, def_geo_align_rotation_to_vector, "ALIGN_ROTATION_TO_VECTOR", AlignRotationToVector, "Align Rotation to Vector", "")
DefNode(GeometryNode, GEO_NODE_POINT_SCALE, def_geo_point_scale, "POINT_SCALE", PointScale, "Point Scale", "")
DefNode(GeometryNode, GEO_NODE_POINT_TRANSLATE, def_geo_point_translate, "POINT_TRANSLATE", PointTranslate, "Point Translate", "")
+DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_SAMPLE_TEXTURE, def_geo_attribute_sample_texture, "ATTRIBUTE_SAMPLE_TEXTURE", AttributeSampleTexture, "Attribute Sample Texture", "")
+DefNode(GeometryNode, GEO_NODE_POINTS_TO_VOLUME, def_geo_points_to_volume, "POINTS_TO_VOLUME", PointsToVolume, "Points to Volume", "")
+DefNode(GeometryNode, GEO_NODE_COLLECTION_INFO, def_geo_collection_info, "COLLECTION_INFO", CollectionInfo, "Collection Info", "")
+DefNode(GeometryNode, GEO_NODE_IS_VIEWPORT, 0, "IS_VIEWPORT", IsViewport, "Is Viewport", "")
+DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_PROXIMITY, def_geo_attribute_proximity, "ATTRIBUTE_PROXIMITY", AttributeProximity, "Attribute Proximity", "")
+DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "")
+DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_COMBINE_XYZ, def_geo_attribute_combine_xyz, "ATTRIBUTE_COMBINE_XYZ", AttributeCombineXYZ, "Attribute Combine XYZ", "")
+DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_SEPARATE_XYZ, def_geo_attribute_separate_xyz, "ATTRIBUTE_SEPARATE_XYZ", AttributeSeparateXYZ, "Attribute Separate XYZ", "")
+DefNode(GeometryNode, GEO_NODE_SUBDIVISION_SURFACE_SIMPLE, 0, "SUBDIVISION_SURFACE_SIMPLE", SubdivisionSurfaceSimple, "Simple Subdivision Surface", "")
/* undefine macros */
#undef DefNode
diff --git a/source/blender/nodes/function/nodes/node_fn_boolean_math.cc b/source/blender/nodes/function/nodes/node_fn_boolean_math.cc
index 9148cef7805..7a83ff8e016 100644
--- a/source/blender/nodes/function/nodes/node_fn_boolean_math.cc
+++ b/source/blender/nodes/function/nodes/node_fn_boolean_math.cc
@@ -19,6 +19,9 @@
#include "RNA_enum_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "node_function_util.hh"
static bNodeSocketTemplate fn_node_boolean_math_in[] = {
@@ -32,6 +35,11 @@ static bNodeSocketTemplate fn_node_boolean_math_out[] = {
{-1, ""},
};
+static void fn_node_boolean_math_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
+}
+
static void node_boolean_math_update(bNodeTree *UNUSED(ntree), bNode *node)
{
bNodeSocket *sockB = (bNodeSocket *)BLI_findlink(&node->inputs, 1);
@@ -86,5 +94,6 @@ void register_node_type_fn_boolean_math()
node_type_label(&ntype, node_boolean_math_label);
node_type_update(&ntype, node_boolean_math_update);
ntype.expand_in_mf_network = node_boolean_expand_in_mf_network;
+ ntype.draw_buttons = fn_node_boolean_math_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/function/nodes/node_fn_float_compare.cc b/source/blender/nodes/function/nodes/node_fn_float_compare.cc
index 93c79a48571..6c8df8f2ea0 100644
--- a/source/blender/nodes/function/nodes/node_fn_float_compare.cc
+++ b/source/blender/nodes/function/nodes/node_fn_float_compare.cc
@@ -21,6 +21,9 @@
#include "RNA_enum_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "node_function_util.hh"
static bNodeSocketTemplate fn_node_float_compare_in[] = {
@@ -35,6 +38,11 @@ static bNodeSocketTemplate fn_node_float_compare_out[] = {
{-1, ""},
};
+static void geo_node_float_compare_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
+}
+
static void node_float_compare_update(bNodeTree *UNUSED(ntree), bNode *node)
{
bNodeSocket *sockEpsilon = (bNodeSocket *)BLI_findlink(&node->inputs, 2);
@@ -105,5 +113,6 @@ void register_node_type_fn_float_compare()
node_type_label(&ntype, node_float_compare_label);
node_type_update(&ntype, node_float_compare_update);
ntype.expand_in_mf_network = node_float_compare_expand_in_mf_network;
+ ntype.draw_buttons = geo_node_float_compare_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/function/nodes/node_fn_input_string.cc b/source/blender/nodes/function/nodes/node_fn_input_string.cc
new file mode 100644
index 00000000000..f16bdef2f38
--- /dev/null
+++ b/source/blender/nodes/function/nodes/node_fn_input_string.cc
@@ -0,0 +1,84 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "node_function_util.hh"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+static bNodeSocketTemplate fn_node_input_string_out[] = {
+ {SOCK_STRING, N_("String")},
+ {-1, ""},
+};
+
+static void fn_node_input_string_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "string", 0, "", ICON_NONE);
+}
+
+static void fn_node_input_string_expand_in_mf_network(
+ blender::nodes::NodeMFNetworkBuilder &builder)
+{
+ bNode &bnode = builder.bnode();
+ NodeInputString *node_storage = static_cast<NodeInputString *>(bnode.storage);
+ std::string string = std::string((node_storage->string) ? node_storage->string : "");
+
+ builder.construct_and_set_matching_fn<blender::fn::CustomMF_Constant<std::string>>(string);
+}
+
+static void fn_node_input_string_init(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ node->storage = MEM_callocN(sizeof(NodeInputString), __func__);
+}
+
+static void fn_node_input_string_free(bNode *node)
+{
+ NodeInputString *storage = (NodeInputString *)node->storage;
+ if (storage == nullptr) {
+ return;
+ }
+ if (storage->string != nullptr) {
+ MEM_freeN(storage->string);
+ }
+ MEM_freeN(storage);
+}
+
+static void fn_node_string_copy(bNodeTree *UNUSED(dest_ntree),
+ bNode *dest_node,
+ const bNode *src_node)
+{
+ NodeInputString *source_storage = (NodeInputString *)src_node->storage;
+ NodeInputString *destination_storage = (NodeInputString *)MEM_dupallocN(source_storage);
+
+ if (source_storage->string) {
+ destination_storage->string = (char *)MEM_dupallocN(source_storage->string);
+ }
+
+ dest_node->storage = destination_storage;
+}
+
+void register_node_type_fn_input_string()
+{
+ static bNodeType ntype;
+
+ fn_node_type_base(&ntype, FN_NODE_INPUT_STRING, "String", NODE_CLASS_INPUT, 0);
+ node_type_socket_templates(&ntype, nullptr, fn_node_input_string_out);
+ node_type_init(&ntype, fn_node_input_string_init);
+ node_type_storage(&ntype, "NodeInputString", fn_node_input_string_free, fn_node_string_copy);
+ ntype.expand_in_mf_network = fn_node_input_string_expand_in_mf_network;
+ ntype.draw_buttons = fn_node_input_string_layout;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/function/nodes/node_fn_input_vector.cc b/source/blender/nodes/function/nodes/node_fn_input_vector.cc
index c2707f6307a..2cd4eb1d9df 100644
--- a/source/blender/nodes/function/nodes/node_fn_input_vector.cc
+++ b/source/blender/nodes/function/nodes/node_fn_input_vector.cc
@@ -18,11 +18,20 @@
#include "BLI_hash.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
static bNodeSocketTemplate fn_node_input_vector_out[] = {
{SOCK_VECTOR, N_("Vector")},
{-1, ""},
};
+static void fn_node_input_vector_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiLayout *col = uiLayoutColumn(layout, true);
+ uiItemR(col, ptr, "vector", UI_ITEM_R_EXPAND, "", ICON_NONE);
+}
+
static void fn_node_vector_input_expand_in_mf_network(
blender::nodes::NodeMFNetworkBuilder &builder)
{
@@ -50,6 +59,6 @@ void register_node_type_fn_input_vector()
node_type_storage(
&ntype, "NodeInputVector", node_free_standard_storage, node_copy_standard_storage);
ntype.expand_in_mf_network = fn_node_vector_input_expand_in_mf_network;
-
+ ntype.draw_buttons = fn_node_input_vector_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/function/nodes/node_fn_switch.cc b/source/blender/nodes/function/nodes/node_fn_switch.cc
index 281ddb05c76..5187decbbe5 100644
--- a/source/blender/nodes/function/nodes/node_fn_switch.cc
+++ b/source/blender/nodes/function/nodes/node_fn_switch.cc
@@ -15,8 +15,17 @@
*/
#include "BLI_listbase.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "node_function_util.hh"
+static void fn_node_switch_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE);
+}
+
static bNodeSocketTemplate fn_node_switch_in[] = {
{SOCK_BOOLEAN, N_("Switch")},
@@ -72,5 +81,6 @@ void register_node_type_fn_switch()
fn_node_type_base(&ntype, FN_NODE_SWITCH, "Switch", 0, 0);
node_type_socket_templates(&ntype, fn_node_switch_in, fn_node_switch_out);
node_type_update(&ntype, fn_node_switch_update);
+ ntype.draw_buttons = fn_node_switch_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc
index 53af6073793..0f725ecf211 100644
--- a/source/blender/nodes/geometry/node_geometry_util.cc
+++ b/source/blender/nodes/geometry/node_geometry_util.cc
@@ -17,8 +17,17 @@
#include "node_geometry_util.hh"
#include "node_util.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
+#include "BKE_pointcloud.h"
+
namespace blender::nodes {
+using bke::GeometryInstanceGroup;
+
/**
* Update the availability of a group of input sockets with the same name,
* used for switching between attribute inputs or single values.
@@ -45,48 +54,6 @@ void update_attribute_input_socket_availabilities(bNode &node,
}
}
-static int attribute_data_type_complexity(const CustomDataType data_type)
-{
- switch (data_type) {
- case CD_PROP_BOOL:
- return 0;
- case CD_PROP_INT32:
- return 1;
- case CD_PROP_FLOAT:
- return 2;
- case CD_PROP_FLOAT3:
- return 4;
- case CD_PROP_COLOR:
- return 5;
-#if 0 /* These attribute types are not supported yet. */
- case CD_MLOOPCOL:
- return 3;
- case CD_PROP_STRING:
- return 6;
-#endif
- default:
- /* Only accept "generic" custom data types used by the attribute system. */
- BLI_assert(false);
- return 0;
- }
-}
-
-CustomDataType attribute_data_type_highest_complexity(Span<CustomDataType> data_types)
-{
- int highest_complexity = INT_MIN;
- CustomDataType most_complex_type = CD_PROP_COLOR;
-
- for (const CustomDataType data_type : data_types) {
- const int complexity = attribute_data_type_complexity(data_type);
- if (complexity > highest_complexity) {
- highest_complexity = complexity;
- most_complex_type = data_type;
- }
- }
-
- return most_complex_type;
-}
-
} // namespace blender::nodes
bool geo_node_poll_default(bNodeType *UNUSED(ntype), bNodeTree *ntree)
diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh
index b7b2afeefcb..271e3771006 100644
--- a/source/blender/nodes/geometry/node_geometry_util.hh
+++ b/source/blender/nodes/geometry/node_geometry_util.hh
@@ -44,8 +44,6 @@ void update_attribute_input_socket_availabilities(bNode &node,
const GeometryNodeAttributeInputMode mode,
const bool name_is_available = true);
-CustomDataType attribute_data_type_highest_complexity(Span<CustomDataType>);
-
Array<uint32_t> get_geometry_element_ids_as_uints(const GeometryComponent &component,
const AttributeDomain domain);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc
index eac77b25bd6..fca460e3566 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc
@@ -18,6 +18,9 @@
#include "BLI_math_rotation.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
static bNodeSocketTemplate geo_node_align_rotation_to_vector_in[] = {
{SOCK_GEOMETRY, N_("Geometry")},
{SOCK_STRING, N_("Factor")},
@@ -32,32 +35,27 @@ static bNodeSocketTemplate geo_node_align_rotation_to_vector_out[] = {
{-1, ""},
};
-namespace blender::nodes {
-
-static void align_rotations_on_component(GeometryComponent &component,
- const GeoNodeExecParams &params)
+static void geo_node_align_rotation_to_vector_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
{
- const bNode &node = params.node();
- const NodeGeometryAlignRotationToVector &storage = *(const NodeGeometryAlignRotationToVector *)
- node.storage;
-
- OutputAttributePtr rotation_attribute = component.attribute_try_get_for_output(
- "rotation", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3);
- if (!rotation_attribute) {
- return;
- }
- MutableSpan<float3> rotations = rotation_attribute->get_span<float3>();
-
- FloatReadAttribute factors = params.get_input_attribute<float>(
- "Factor", component, ATTR_DOMAIN_POINT, 1.0f);
- Float3ReadAttribute vectors = params.get_input_attribute<float3>(
- "Vector", component, ATTR_DOMAIN_POINT, {0, 0, 1});
+ uiItemR(layout, ptr, "axis", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "pivot_axis", 0, IFACE_("Pivot"), ICON_NONE);
+ uiLayout *col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE);
+ uiItemR(col, ptr, "input_type_vector", 0, IFACE_("Vector"), ICON_NONE);
+}
- float3 main_axis{0, 0, 0};
- main_axis[storage.axis] = 1;
+namespace blender::nodes {
- const int domain_size = component.attribute_domain_size(ATTR_DOMAIN_POINT);
- for (const int i : IndexRange(domain_size)) {
+static void align_rotations_auto_pivot(const Float3ReadAttribute &vectors,
+ const FloatReadAttribute &factors,
+ const float3 local_main_axis,
+ MutableSpan<float3> rotations)
+{
+ for (const int i : IndexRange(vectors.size())) {
const float3 vector = vectors[i];
if (is_zero_v3(vector)) {
continue;
@@ -66,10 +64,19 @@ static void align_rotations_on_component(GeometryComponent &component,
float old_rotation[3][3];
eul_to_mat3(old_rotation, rotations[i]);
float3 old_axis;
- mul_v3_m3v3(old_axis, old_rotation, main_axis);
+ mul_v3_m3v3(old_axis, old_rotation, local_main_axis);
const float3 new_axis = vector.normalized();
- const float3 rotation_axis = float3::cross_high_precision(old_axis, new_axis);
+ float3 rotation_axis = float3::cross_high_precision(old_axis, new_axis);
+ if (is_zero_v3(rotation_axis)) {
+ /* The vectors are linearly dependent, so we fall back to another axis. */
+ rotation_axis = float3::cross_high_precision(old_axis, float3(1, 0, 0));
+ if (is_zero_v3(rotation_axis)) {
+ /* This is now guaranteed to not be zero. */
+ rotation_axis = float3::cross_high_precision(old_axis, float3(0, 1, 0));
+ }
+ }
+
const float full_angle = angle_normalized_v3v3(old_axis, new_axis);
const float angle = factors[i] * full_angle;
@@ -84,6 +91,81 @@ static void align_rotations_on_component(GeometryComponent &component,
rotations[i] = new_rotation;
}
+}
+
+static void align_rotations_fixed_pivot(const Float3ReadAttribute &vectors,
+ const FloatReadAttribute &factors,
+ const float3 local_main_axis,
+ const float3 local_pivot_axis,
+ MutableSpan<float3> rotations)
+{
+ if (local_main_axis == local_pivot_axis) {
+ /* Can't compute any meaningful rotation angle in this case. */
+ return;
+ }
+
+ for (const int i : IndexRange(vectors.size())) {
+ const float3 vector = vectors[i];
+ if (is_zero_v3(vector)) {
+ continue;
+ }
+
+ float old_rotation[3][3];
+ eul_to_mat3(old_rotation, rotations[i]);
+ float3 old_axis;
+ mul_v3_m3v3(old_axis, old_rotation, local_main_axis);
+ float3 pivot_axis;
+ mul_v3_m3v3(pivot_axis, old_rotation, local_pivot_axis);
+
+ float full_angle = angle_signed_on_axis_v3v3_v3(vector, old_axis, pivot_axis);
+ if (full_angle > M_PI) {
+ /* Make sure the point is rotated as little as possible. */
+ full_angle -= 2.0f * M_PI;
+ }
+ const float angle = factors[i] * full_angle;
+
+ float rotation[3][3];
+ axis_angle_to_mat3(rotation, pivot_axis, angle);
+
+ float new_rotation_matrix[3][3];
+ mul_m3_m3m3(new_rotation_matrix, rotation, old_rotation);
+
+ float3 new_rotation;
+ mat3_to_eul(new_rotation, new_rotation_matrix);
+
+ rotations[i] = new_rotation;
+ }
+}
+
+static void align_rotations_on_component(GeometryComponent &component,
+ const GeoNodeExecParams &params)
+{
+ const bNode &node = params.node();
+ const NodeGeometryAlignRotationToVector &storage = *(const NodeGeometryAlignRotationToVector *)
+ node.storage;
+
+ OutputAttributePtr rotation_attribute = component.attribute_try_get_for_output(
+ "rotation", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3);
+ if (!rotation_attribute) {
+ return;
+ }
+ MutableSpan<float3> rotations = rotation_attribute->get_span<float3>();
+
+ FloatReadAttribute factors = params.get_input_attribute<float>(
+ "Factor", component, ATTR_DOMAIN_POINT, 1.0f);
+ Float3ReadAttribute vectors = params.get_input_attribute<float3>(
+ "Vector", component, ATTR_DOMAIN_POINT, {0, 0, 1});
+
+ float3 local_main_axis{0, 0, 0};
+ local_main_axis[storage.axis] = 1;
+ if (storage.pivot_axis == GEO_NODE_ALIGN_ROTATION_TO_VECTOR_PIVOT_AXIS_AUTO) {
+ align_rotations_auto_pivot(vectors, factors, local_main_axis, rotations);
+ }
+ else {
+ float3 local_pivot_axis{0, 0, 0};
+ local_pivot_axis[storage.pivot_axis - 1] = 1;
+ align_rotations_fixed_pivot(vectors, factors, local_main_axis, local_pivot_axis, rotations);
+ }
rotation_attribute.apply_span_and_save();
}
@@ -92,6 +174,8 @@ static void geo_node_align_rotation_to_vector_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
align_rotations_on_component(geometry_set.get_component_for_write<MeshComponent>(), params);
}
@@ -145,5 +229,6 @@ void register_node_type_geo_align_rotation_to_vector()
node_free_standard_storage,
node_copy_standard_storage);
ntype.geometry_node_execute = blender::nodes::geo_node_align_rotation_to_vector_exec;
+ ntype.draw_buttons = geo_node_align_rotation_to_vector_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc
index 9b0900e19ab..98bf612f589 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc
@@ -18,6 +18,9 @@
#include "BKE_colorband.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
static bNodeSocketTemplate geo_node_attribute_color_ramp_in[] = {
{SOCK_GEOMETRY, N_("Geometry")},
{SOCK_STRING, N_("Attribute")},
@@ -30,29 +33,53 @@ static bNodeSocketTemplate geo_node_attribute_color_ramp_out[] = {
{-1, ""},
};
+static void geo_node_attribute_color_ramp_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiTemplateColorRamp(layout, ptr, "color_ramp", false);
+}
+
namespace blender::nodes {
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ StringRef input_name,
+ StringRef result_name)
+{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the input attribute's domain if it exists. */
+ ReadAttributePtr input_attribute = component.attribute_try_get_for_read(input_name);
+ if (input_attribute) {
+ return input_attribute->domain();
+ }
+
+ return ATTR_DOMAIN_POINT;
+}
+
static void execute_on_component(const GeoNodeExecParams &params, GeometryComponent &component)
{
const bNode &bnode = params.node();
NodeAttributeColorRamp *node_storage = (NodeAttributeColorRamp *)bnode.storage;
+ const std::string result_name = params.get_input<std::string>("Result");
+ const std::string input_name = params.get_input<std::string>("Attribute");
/* Always output a color attribute for now. We might want to allow users to customize.
* Using the type of an existing attribute could work, but does not have a real benefit
* currently. */
const CustomDataType result_type = CD_PROP_COLOR;
+ const AttributeDomain result_domain = get_result_domain(component, input_name, result_name);
- const std::string result_name = params.get_input<std::string>("Result");
- /* Once we support more domains at the user level, we have to decide how the result domain is
- * chosen. */
- const AttributeDomain result_domain = ATTR_DOMAIN_POINT;
OutputAttributePtr attribute_result = component.attribute_try_get_for_output(
result_name, result_domain, result_type);
if (!attribute_result) {
return;
}
- const std::string input_name = params.get_input<std::string>("Attribute");
FloatReadAttribute attribute_in = component.attribute_get_for_read<float>(
input_name, result_domain, 0.0f);
@@ -71,6 +98,8 @@ static void geo_node_attribute_color_ramp_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
execute_on_component(params, geometry_set.get_component_for_write<MeshComponent>());
}
@@ -104,5 +133,6 @@ void register_node_type_geo_attribute_color_ramp()
node_type_init(&ntype, blender::nodes::geo_node_attribute_color_ramp_init);
node_type_size_preset(&ntype, NODE_SIZE_LARGE);
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_color_ramp_exec;
+ ntype.draw_buttons = geo_node_attribute_color_ramp_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc
new file mode 100644
index 00000000000..564668af274
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc
@@ -0,0 +1,151 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "node_geometry_util.hh"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+static bNodeSocketTemplate geo_node_attribute_combine_xyz_in[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_STRING, N_("X")},
+ {SOCK_FLOAT, N_("X"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX},
+ {SOCK_STRING, N_("Y")},
+ {SOCK_FLOAT, N_("Y"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX},
+ {SOCK_STRING, N_("Z")},
+ {SOCK_FLOAT, N_("Z"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX},
+ {SOCK_STRING, N_("Result")},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_attribute_combine_xyz_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+static void geo_node_attribute_combine_xyz_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiLayout *col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "input_type_x", 0, IFACE_("X"), ICON_NONE);
+ uiItemR(col, ptr, "input_type_y", 0, IFACE_("Y"), ICON_NONE);
+ uiItemR(col, ptr, "input_type_z", 0, IFACE_("Z"), ICON_NONE);
+}
+
+namespace blender::nodes {
+
+static void geo_node_attribute_combine_xyz_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+ NodeAttributeCombineXYZ *data = (NodeAttributeCombineXYZ *)MEM_callocN(
+ sizeof(NodeAttributeCombineXYZ), __func__);
+
+ data->input_type_x = GEO_NODE_ATTRIBUTE_INPUT_FLOAT;
+ data->input_type_y = GEO_NODE_ATTRIBUTE_INPUT_FLOAT;
+ data->input_type_z = GEO_NODE_ATTRIBUTE_INPUT_FLOAT;
+ node->storage = data;
+}
+
+static void geo_node_attribute_combine_xyz_update(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ NodeAttributeCombineXYZ *node_storage = (NodeAttributeCombineXYZ *)node->storage;
+ update_attribute_input_socket_availabilities(
+ *node, "X", (GeometryNodeAttributeInputMode)node_storage->input_type_x);
+ update_attribute_input_socket_availabilities(
+ *node, "Y", (GeometryNodeAttributeInputMode)node_storage->input_type_y);
+ update_attribute_input_socket_availabilities(
+ *node, "Z", (GeometryNodeAttributeInputMode)node_storage->input_type_z);
+}
+
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ StringRef result_name)
+{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the highest priority domain from existing input attributes, or the default. */
+ return params.get_highest_priority_input_domain({"X", "Y", "Z"}, component, ATTR_DOMAIN_POINT);
+}
+
+static void combine_attributes(GeometryComponent &component, const GeoNodeExecParams &params)
+{
+ const std::string result_name = params.get_input<std::string>("Result");
+ if (result_name.empty()) {
+ return;
+ }
+ const AttributeDomain result_domain = get_result_domain(component, params, result_name);
+
+ OutputAttributePtr attribute_result = component.attribute_try_get_for_output(
+ result_name, result_domain, CD_PROP_FLOAT3);
+ if (!attribute_result) {
+ return;
+ }
+ FloatReadAttribute attribute_x = params.get_input_attribute<float>(
+ "X", component, result_domain, 0.0f);
+ FloatReadAttribute attribute_y = params.get_input_attribute<float>(
+ "Y", component, result_domain, 0.0f);
+ FloatReadAttribute attribute_z = params.get_input_attribute<float>(
+ "Z", component, result_domain, 0.0f);
+
+ MutableSpan<float3> results = attribute_result->get_span_for_write_only<float3>();
+ for (const int i : results.index_range()) {
+ const float x = attribute_x[i];
+ const float y = attribute_y[i];
+ const float z = attribute_z[i];
+ const float3 result = float3(x, y, z);
+ results[i] = result;
+ }
+ attribute_result.apply_span_and_save();
+}
+
+static void geo_node_attribute_combine_xyz_exec(GeoNodeExecParams params)
+{
+ GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+
+ if (geometry_set.has<MeshComponent>()) {
+ combine_attributes(geometry_set.get_component_for_write<MeshComponent>(), params);
+ }
+ if (geometry_set.has<PointCloudComponent>()) {
+ combine_attributes(geometry_set.get_component_for_write<PointCloudComponent>(), params);
+ }
+
+ params.set_output("Geometry", geometry_set);
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_attribute_combine_xyz()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(
+ &ntype, GEO_NODE_ATTRIBUTE_COMBINE_XYZ, "Attribute Combine XYZ", NODE_CLASS_ATTRIBUTE, 0);
+ node_type_socket_templates(
+ &ntype, geo_node_attribute_combine_xyz_in, geo_node_attribute_combine_xyz_out);
+ node_type_init(&ntype, blender::nodes::geo_node_attribute_combine_xyz_init);
+ node_type_update(&ntype, blender::nodes::geo_node_attribute_combine_xyz_update);
+ node_type_storage(
+ &ntype, "NodeAttributeCombineXYZ", node_free_standard_storage, node_copy_standard_storage);
+ ntype.geometry_node_execute = blender::nodes::geo_node_attribute_combine_xyz_exec;
+ ntype.draw_buttons = geo_node_attribute_combine_xyz_layout;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc
index 20a2b2127c2..db1a5d18744 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc
@@ -26,6 +26,9 @@
#include "DNA_mesh_types.h"
#include "DNA_pointcloud_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "NOD_math_functions.hh"
static bNodeSocketTemplate geo_node_attribute_compare_in[] = {
@@ -48,10 +51,21 @@ static bNodeSocketTemplate geo_node_attribute_compare_out[] = {
{-1, ""},
};
+static void geo_node_attribute_compare_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE);
+ uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE);
+}
+
static void geo_node_attribute_compare_init(bNodeTree *UNUSED(tree), bNode *node)
{
NodeAttributeCompare *data = (NodeAttributeCompare *)MEM_callocN(sizeof(NodeAttributeCompare),
- "attribute mix node");
+ __func__);
data->operation = NODE_FLOAT_COMPARE_GREATER_THAN;
data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
@@ -218,7 +232,7 @@ static CustomDataType get_data_type(GeometryComponent &component,
if (operation_tests_equality(node_storage)) {
/* Convert the input attributes to the same data type for the equality tests. Use the higher
* complexity attribute type, otherwise information necessary to the comparison may be lost. */
- return attribute_data_type_highest_complexity({
+ return bke::attribute_data_type_highest_complexity({
params.get_input_attribute_data_type("A", component, CD_PROP_FLOAT),
params.get_input_attribute_data_type("B", component, CD_PROP_FLOAT),
});
@@ -228,20 +242,31 @@ static CustomDataType get_data_type(GeometryComponent &component,
return CD_PROP_FLOAT;
}
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ StringRef result_name)
+{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the highest priority domain from existing input attributes, or the default. */
+ return params.get_highest_priority_input_domain({"A", "B"}, component, ATTR_DOMAIN_POINT);
+}
+
static void attribute_compare_calc(GeometryComponent &component, const GeoNodeExecParams &params)
{
const bNode &node = params.node();
NodeAttributeCompare *node_storage = (NodeAttributeCompare *)node.storage;
const FloatCompareOperation operation = static_cast<FloatCompareOperation>(
node_storage->operation);
+ const std::string result_name = params.get_input<std::string>("Result");
- /* The result type of this node is always float. */
const CustomDataType result_type = CD_PROP_BOOL;
- /* The result domain is always point for now. */
- const AttributeDomain result_domain = ATTR_DOMAIN_POINT;
+ const AttributeDomain result_domain = get_result_domain(component, params, result_name);
- /* Get result attribute first, in case it has to overwrite one of the existing attributes. */
- const std::string result_name = params.get_input<std::string>("Result");
OutputAttributePtr attribute_result = component.attribute_try_get_for_output(
result_name, result_domain, result_type);
if (!attribute_result) {
@@ -306,6 +331,8 @@ static void geo_node_attribute_compare_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
attribute_compare_calc(geometry_set.get_component_for_write<MeshComponent>(), params);
}
@@ -327,6 +354,7 @@ void register_node_type_geo_attribute_compare()
node_type_socket_templates(
&ntype, geo_node_attribute_compare_in, geo_node_attribute_compare_out);
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_compare_exec;
+ ntype.draw_buttons = geo_node_attribute_compare_layout;
node_type_update(&ntype, blender::nodes::geo_node_attribute_compare_update);
node_type_storage(
&ntype, "NodeAttributeCompare", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
index 9cec4070f89..f3bf69d567d 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
@@ -21,6 +21,9 @@
#include "DNA_mesh_types.h"
#include "DNA_pointcloud_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
static bNodeSocketTemplate geo_node_attribute_fill_in[] = {
{SOCK_GEOMETRY, N_("Geometry")},
{SOCK_STRING, N_("Attribute")},
@@ -28,6 +31,7 @@ static bNodeSocketTemplate geo_node_attribute_fill_in[] = {
{SOCK_FLOAT, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{SOCK_RGBA, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{SOCK_BOOLEAN, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
+ {SOCK_INT, N_("Value"), 0, 0, 0, 0, -10000000.0f, 10000000.0f},
{-1, ""},
};
@@ -36,6 +40,14 @@ static bNodeSocketTemplate geo_node_attribute_fill_out[] = {
{-1, ""},
};
+static void geo_node_attribute_fill_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE);
+ // uiItemR(layout, ptr, "domain", 0, "", ICON_NONE);
+}
+
static void geo_node_attribute_fill_init(bNodeTree *UNUSED(tree), bNode *node)
{
node->custom1 = CD_PROP_FLOAT;
@@ -47,6 +59,7 @@ static void geo_node_attribute_fill_update(bNodeTree *UNUSED(ntree), bNode *node
bNodeSocket *socket_value_float = socket_value_vector->next;
bNodeSocket *socket_value_color4f = socket_value_float->next;
bNodeSocket *socket_value_boolean = socket_value_color4f->next;
+ bNodeSocket *socket_value_int32 = socket_value_boolean->next;
const CustomDataType data_type = static_cast<CustomDataType>(node->custom1);
@@ -54,20 +67,37 @@ static void geo_node_attribute_fill_update(bNodeTree *UNUSED(ntree), bNode *node
nodeSetSocketAvailability(socket_value_float, data_type == CD_PROP_FLOAT);
nodeSetSocketAvailability(socket_value_color4f, data_type == CD_PROP_COLOR);
nodeSetSocketAvailability(socket_value_boolean, data_type == CD_PROP_BOOL);
+ nodeSetSocketAvailability(socket_value_int32, data_type == CD_PROP_INT32);
}
namespace blender::nodes {
-static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams &params)
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ StringRef attribute_name)
{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(attribute_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the input domain chosen in the interface. */
const bNode &node = params.node();
- const CustomDataType data_type = static_cast<CustomDataType>(node.custom1);
- const AttributeDomain domain = static_cast<AttributeDomain>(node.custom2);
+ return static_cast<AttributeDomain>(node.custom2);
+}
+
+static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams &params)
+{
const std::string attribute_name = params.get_input<std::string>("Attribute");
if (attribute_name.empty()) {
return;
}
+ const bNode &node = params.node();
+ const CustomDataType data_type = static_cast<CustomDataType>(node.custom1);
+ const AttributeDomain domain = get_result_domain(component, params, attribute_name);
+
OutputAttributePtr attribute = component.attribute_try_get_for_output(
attribute_name, domain, data_type);
if (!attribute) {
@@ -99,6 +129,11 @@ static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams
attribute_span.fill(value);
break;
}
+ case CD_PROP_INT32: {
+ const int value = params.get_input<int>("Value_004");
+ MutableSpan<int> attribute_span = attribute->get_span_for_write_only<int>();
+ attribute_span.fill(value);
+ }
default:
break;
}
@@ -110,6 +145,8 @@ static void geo_node_attribute_fill_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
fill_attribute(geometry_set.get_component_for_write<MeshComponent>(), params);
}
@@ -131,5 +168,6 @@ void register_node_type_geo_attribute_fill()
node_type_init(&ntype, geo_node_attribute_fill_init);
node_type_update(&ntype, geo_node_attribute_fill_update);
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_fill_exec;
+ ntype.draw_buttons = geo_node_attribute_fill_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc
index f8ec9124db3..c8cfcb1c24f 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc
@@ -26,6 +26,9 @@
#include "DNA_mesh_types.h"
#include "DNA_pointcloud_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "NOD_math_functions.hh"
static bNodeSocketTemplate geo_node_attribute_math_in[] = {
@@ -34,6 +37,8 @@ static bNodeSocketTemplate geo_node_attribute_math_in[] = {
{SOCK_FLOAT, N_("A"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{SOCK_STRING, N_("B")},
{SOCK_FLOAT, N_("B"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
+ {SOCK_STRING, N_("C")},
+ {SOCK_FLOAT, N_("C"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{SOCK_STRING, N_("Result")},
{-1, ""},
};
@@ -43,14 +48,93 @@ static bNodeSocketTemplate geo_node_attribute_math_out[] = {
{-1, ""},
};
+static bool operation_use_input_c(const NodeMathOperation operation)
+{
+ return ELEM(operation,
+ NODE_MATH_MULTIPLY_ADD,
+ NODE_MATH_SMOOTH_MIN,
+ NODE_MATH_SMOOTH_MAX,
+ NODE_MATH_WRAP,
+ NODE_MATH_COMPARE);
+}
+
+static bool operation_use_input_b(const NodeMathOperation operation)
+{
+ switch (operation) {
+ case NODE_MATH_ADD:
+ case NODE_MATH_SUBTRACT:
+ case NODE_MATH_MULTIPLY:
+ case NODE_MATH_DIVIDE:
+ case NODE_MATH_POWER:
+ case NODE_MATH_LOGARITHM:
+ case NODE_MATH_MINIMUM:
+ case NODE_MATH_MAXIMUM:
+ case NODE_MATH_LESS_THAN:
+ case NODE_MATH_GREATER_THAN:
+ case NODE_MATH_MODULO:
+ case NODE_MATH_ARCTAN2:
+ case NODE_MATH_SNAP:
+ case NODE_MATH_WRAP:
+ case NODE_MATH_COMPARE:
+ case NODE_MATH_MULTIPLY_ADD:
+ case NODE_MATH_PINGPONG:
+ case NODE_MATH_SMOOTH_MIN:
+ case NODE_MATH_SMOOTH_MAX:
+ return true;
+ case NODE_MATH_SINE:
+ case NODE_MATH_COSINE:
+ case NODE_MATH_TANGENT:
+ case NODE_MATH_ARCSINE:
+ case NODE_MATH_ARCCOSINE:
+ case NODE_MATH_ARCTANGENT:
+ case NODE_MATH_ROUND:
+ case NODE_MATH_ABSOLUTE:
+ case NODE_MATH_FLOOR:
+ case NODE_MATH_CEIL:
+ case NODE_MATH_FRACTION:
+ case NODE_MATH_SQRT:
+ case NODE_MATH_INV_SQRT:
+ case NODE_MATH_SIGN:
+ case NODE_MATH_EXPONENT:
+ case NODE_MATH_RADIANS:
+ case NODE_MATH_DEGREES:
+ case NODE_MATH_SINH:
+ case NODE_MATH_COSH:
+ case NODE_MATH_TANH:
+ case NODE_MATH_TRUNC:
+ return false;
+ }
+ BLI_assert(false);
+ return false;
+}
+
+static void geo_node_attribute_math_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ bNode *node = (bNode *)ptr->data;
+ NodeAttributeMath *node_storage = (NodeAttributeMath *)node->storage;
+ NodeMathOperation operation = (NodeMathOperation)node_storage->operation;
+
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE);
+ if (operation_use_input_b(operation)) {
+ uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE);
+ }
+ if (operation_use_input_c(operation)) {
+ uiItemR(layout, ptr, "input_type_c", 0, IFACE_("C"), ICON_NONE);
+ }
+}
+
static void geo_node_attribute_math_init(bNodeTree *UNUSED(tree), bNode *node)
{
- NodeAttributeMath *data = (NodeAttributeMath *)MEM_callocN(sizeof(NodeAttributeMath),
- "NodeAttributeMath");
+ NodeAttributeMath *data = (NodeAttributeMath *)MEM_callocN(sizeof(NodeAttributeMath), __func__);
data->operation = NODE_MATH_ADD;
data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
+ data->input_type_c = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
node->storage = data;
}
@@ -58,55 +142,102 @@ namespace blender::nodes {
static void geo_node_attribute_math_update(bNodeTree *UNUSED(ntree), bNode *node)
{
- NodeAttributeMath *node_storage = (NodeAttributeMath *)node->storage;
+ NodeAttributeMath &node_storage = *(NodeAttributeMath *)node->storage;
+ NodeMathOperation operation = static_cast<NodeMathOperation>(node_storage.operation);
update_attribute_input_socket_availabilities(
- *node, "A", (GeometryNodeAttributeInputMode)node_storage->input_type_a);
+ *node, "A", (GeometryNodeAttributeInputMode)node_storage.input_type_a);
+ update_attribute_input_socket_availabilities(
+ *node,
+ "B",
+ (GeometryNodeAttributeInputMode)node_storage.input_type_b,
+ operation_use_input_b(operation));
update_attribute_input_socket_availabilities(
- *node, "B", (GeometryNodeAttributeInputMode)node_storage->input_type_b);
+ *node,
+ "C",
+ (GeometryNodeAttributeInputMode)node_storage.input_type_c,
+ operation_use_input_c(operation));
}
-static void do_math_operation(const FloatReadAttribute &input_a,
- const FloatReadAttribute &input_b,
- FloatWriteAttribute result,
- const int operation)
+static void do_math_operation(Span<float> span_a,
+ Span<float> span_b,
+ Span<float> span_c,
+ MutableSpan<float> span_result,
+ const NodeMathOperation operation)
{
- const int size = input_a.size();
-
- Span<float> span_a = input_a.get_span();
- Span<float> span_b = input_b.get_span();
- MutableSpan<float> span_result = result.get_span_for_write_only();
+ bool success = try_dispatch_float_math_fl_fl_fl_to_fl(
+ operation, [&](auto math_function, const FloatMathOperationInfo &UNUSED(info)) {
+ for (const int i : IndexRange(span_result.size())) {
+ span_result[i] = math_function(span_a[i], span_b[i], span_c[i]);
+ }
+ });
+ BLI_assert(success);
+ UNUSED_VARS_NDEBUG(success);
+}
+static void do_math_operation(Span<float> span_a,
+ Span<float> span_b,
+ MutableSpan<float> span_result,
+ const NodeMathOperation operation)
+{
bool success = try_dispatch_float_math_fl_fl_to_fl(
operation, [&](auto math_function, const FloatMathOperationInfo &UNUSED(info)) {
- for (const int i : IndexRange(size)) {
- const float in1 = span_a[i];
- const float in2 = span_b[i];
- const float out = math_function(in1, in2);
- span_result[i] = out;
+ for (const int i : IndexRange(span_result.size())) {
+ span_result[i] = math_function(span_a[i], span_b[i]);
}
});
+ BLI_assert(success);
+ UNUSED_VARS_NDEBUG(success);
+}
- result.apply_span();
-
- /* The operation is not supported by this node currently. */
+static void do_math_operation(Span<float> span_input,
+ MutableSpan<float> span_result,
+ const NodeMathOperation operation)
+{
+ bool success = try_dispatch_float_math_fl_to_fl(
+ operation, [&](auto math_function, const FloatMathOperationInfo &UNUSED(info)) {
+ for (const int i : IndexRange(span_result.size())) {
+ span_result[i] = math_function(span_input[i]);
+ }
+ });
BLI_assert(success);
UNUSED_VARS_NDEBUG(success);
}
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ const NodeMathOperation operation,
+ StringRef result_name)
+{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the highest priority domain from existing input attributes, or the default. */
+ const AttributeDomain default_domain = ATTR_DOMAIN_POINT;
+ if (operation_use_input_b(operation)) {
+ if (operation_use_input_c(operation)) {
+ return params.get_highest_priority_input_domain({"A", "B", "C"}, component, default_domain);
+ }
+ return params.get_highest_priority_input_domain({"A", "B"}, component, default_domain);
+ }
+ return params.get_highest_priority_input_domain({"A"}, component, default_domain);
+}
+
static void attribute_math_calc(GeometryComponent &component, const GeoNodeExecParams &params)
{
const bNode &node = params.node();
const NodeAttributeMath *node_storage = (const NodeAttributeMath *)node.storage;
- const int operation = node_storage->operation;
+ const NodeMathOperation operation = static_cast<NodeMathOperation>(node_storage->operation);
+ const std::string result_name = params.get_input<std::string>("Result");
/* The result type of this node is always float. */
const CustomDataType result_type = CD_PROP_FLOAT;
- /* The result domain is always point for now. */
- const AttributeDomain result_domain = ATTR_DOMAIN_POINT;
+ const AttributeDomain result_domain = get_result_domain(
+ component, params, operation, result_name);
- /* Get result attribute first, in case it has to overwrite one of the existing attributes. */
- const std::string result_name = params.get_input<std::string>("Result");
OutputAttributePtr attribute_result = component.attribute_try_get_for_output(
result_name, result_domain, result_type);
if (!attribute_result) {
@@ -115,21 +246,52 @@ static void attribute_math_calc(GeometryComponent &component, const GeoNodeExecP
ReadAttributePtr attribute_a = params.get_input_attribute(
"A", component, result_domain, result_type, nullptr);
- ReadAttributePtr attribute_b = params.get_input_attribute(
- "B", component, result_domain, result_type, nullptr);
- if (!attribute_a || !attribute_b) {
- /* Attribute wasn't found. */
+ if (!attribute_a) {
return;
}
- do_math_operation(*attribute_a, *attribute_b, *attribute_result, operation);
- attribute_result.save();
+ /* Note that passing the data with `get_span<float>()` works
+ * because the attributes were accessed with #CD_PROP_FLOAT. */
+ if (operation_use_input_b(operation)) {
+ ReadAttributePtr attribute_b = params.get_input_attribute(
+ "B", component, result_domain, result_type, nullptr);
+ if (!attribute_b) {
+ return;
+ }
+ if (operation_use_input_c(operation)) {
+ ReadAttributePtr attribute_c = params.get_input_attribute(
+ "C", component, result_domain, result_type, nullptr);
+ if (!attribute_c) {
+ return;
+ }
+ do_math_operation(attribute_a->get_span<float>(),
+ attribute_b->get_span<float>(),
+ attribute_c->get_span<float>(),
+ attribute_result->get_span_for_write_only<float>(),
+ operation);
+ }
+ else {
+ do_math_operation(attribute_a->get_span<float>(),
+ attribute_b->get_span<float>(),
+ attribute_result->get_span_for_write_only<float>(),
+ operation);
+ }
+ }
+ else {
+ do_math_operation(attribute_a->get_span<float>(),
+ attribute_result->get_span_for_write_only<float>(),
+ operation);
+ }
+
+ attribute_result.apply_span_and_save();
}
static void geo_node_attribute_math_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
attribute_math_calc(geometry_set.get_component_for_write<MeshComponent>(), params);
}
@@ -149,9 +311,10 @@ void register_node_type_geo_attribute_math()
geo_node_type_base(&ntype, GEO_NODE_ATTRIBUTE_MATH, "Attribute Math", NODE_CLASS_ATTRIBUTE, 0);
node_type_socket_templates(&ntype, geo_node_attribute_math_in, geo_node_attribute_math_out);
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_math_exec;
+ ntype.draw_buttons = geo_node_attribute_math_layout;
node_type_update(&ntype, blender::nodes::geo_node_attribute_math_update);
node_type_init(&ntype, geo_node_attribute_math_init);
node_type_storage(
- &ntype, "NodeAttributeCompare", node_free_standard_storage, node_copy_standard_storage);
+ &ntype, "NodeAttributeMath", node_free_standard_storage, node_copy_standard_storage);
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc
index 58d67145e75..9d8cd3dfa82 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc
@@ -18,6 +18,9 @@
#include "DNA_material_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "node_geometry_util.hh"
static bNodeSocketTemplate geo_node_attribute_mix_in[] = {
@@ -41,6 +44,17 @@ static bNodeSocketTemplate geo_node_mix_attribute_out[] = {
{-1, ""},
};
+static void geo_node_attribute_mix_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "blend_type", 0, "", ICON_NONE);
+ uiLayout *col = uiLayoutColumn(layout, false);
+ uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE);
+ uiItemR(col, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE);
+ uiItemR(col, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE);
+}
+
namespace blender::nodes {
static void do_mix_operation_float(const int blend_mode,
@@ -113,28 +127,36 @@ static void do_mix_operation(const CustomDataType result_type,
}
}
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ StringRef result_name)
+{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the highest priority domain from existing input attributes, or the default. */
+ return params.get_highest_priority_input_domain({"A", "B"}, component, ATTR_DOMAIN_POINT);
+}
+
static void attribute_mix_calc(GeometryComponent &component, const GeoNodeExecParams &params)
{
const bNode &node = params.node();
const NodeAttributeMix *node_storage = (const NodeAttributeMix *)node.storage;
+ const std::string result_name = params.get_input<std::string>("Result");
/* Use the highest complexity data type among the inputs and outputs, that way the node will
* never "remove information". Use CD_PROP_BOOL as the lowest complexity data type, but in any
* real situation it won't be returned. */
- const CustomDataType result_type = attribute_data_type_highest_complexity({
+ const CustomDataType result_type = bke::attribute_data_type_highest_complexity({
params.get_input_attribute_data_type("A", component, CD_PROP_BOOL),
params.get_input_attribute_data_type("B", component, CD_PROP_BOOL),
params.get_input_attribute_data_type("Result", component, CD_PROP_BOOL),
});
- /* Once we support more domains at the user level, we have to decide how the result domain is
- * chosen. */
- AttributeDomain result_domain = ATTR_DOMAIN_POINT;
- const std::string result_name = params.get_input<std::string>("Result");
- const ReadAttributePtr result_attribute_read = component.attribute_try_get_for_read(result_name);
- if (result_attribute_read) {
- result_domain = result_attribute_read->domain();
- }
+ const AttributeDomain result_domain = get_result_domain(component, params, result_name);
OutputAttributePtr attribute_result = component.attribute_try_get_for_output(
result_name, result_domain, result_type);
@@ -162,6 +184,8 @@ static void geo_node_attribute_mix_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
attribute_mix_calc(geometry_set.get_component_for_write<MeshComponent>(), params);
}
@@ -204,6 +228,7 @@ void register_node_type_geo_attribute_mix()
node_type_socket_templates(&ntype, geo_node_attribute_mix_in, geo_node_mix_attribute_out);
node_type_init(&ntype, blender::nodes::geo_node_attribute_mix_init);
node_type_update(&ntype, blender::nodes::geo_node_attribute_mix_update);
+ ntype.draw_buttons = geo_node_attribute_mix_layout;
node_type_storage(
&ntype, "NodeAttributeMix", node_free_standard_storage, node_copy_standard_storage);
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_mix_exec;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
new file mode 100644
index 00000000000..51f208ed07d
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
@@ -0,0 +1,244 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "BLI_kdopbvh.h"
+#include "BLI_kdtree.h"
+#include "BLI_task.hh"
+#include "BLI_timeit.hh"
+
+#include "DNA_mesh_types.h"
+
+#include "BKE_bvhutils.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "node_geometry_util.hh"
+
+static bNodeSocketTemplate geo_node_attribute_proximity_in[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_GEOMETRY, N_("Target")},
+ {SOCK_STRING, N_("Result")},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_attribute_proximity_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+static void geo_node_attribute_proximity_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "target_geometry_element", 0, "", ICON_NONE);
+}
+
+static void geo_attribute_proximity_init(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ NodeGeometryAttributeProximity *node_storage = (NodeGeometryAttributeProximity *)MEM_callocN(
+ sizeof(NodeGeometryAttributeProximity), __func__);
+
+ node_storage->target_geometry_element =
+ GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES;
+ node->storage = node_storage;
+}
+
+namespace blender::nodes {
+
+static void proximity_calc(MutableSpan<float> distance_span,
+ Span<float3> positions,
+ BVHTreeFromMesh &tree_data_mesh,
+ BVHTreeFromPointCloud &tree_data_pointcloud,
+ const bool bvh_mesh_success,
+ const bool bvh_pointcloud_success)
+{
+ /* The pointcloud loop uses the values already in the span,
+ * which is only set if the mesh BVH is used (because it's first). */
+ if (!bvh_mesh_success) {
+ distance_span.fill(FLT_MAX);
+ }
+
+ IndexRange range = positions.index_range();
+ parallel_for(range, 512, [&](IndexRange range) {
+ BVHTreeNearest nearest;
+
+ if (bvh_mesh_success) {
+ copy_v3_fl(nearest.co, FLT_MAX);
+ nearest.index = -1;
+
+ for (int i : range) {
+ nearest.dist_sq = len_squared_v3v3(nearest.co, positions[i]);
+ BLI_bvhtree_find_nearest(tree_data_mesh.tree,
+ positions[i],
+ &nearest,
+ tree_data_mesh.nearest_callback,
+ &tree_data_mesh);
+ distance_span[i] = sqrtf(nearest.dist_sq);
+ }
+ }
+
+ if (bvh_pointcloud_success) {
+ copy_v3_fl(nearest.co, FLT_MAX);
+ nearest.index = -1;
+
+ for (int i : range) {
+ /* Use the distance to the last found point as upper bound to speedup the bvh lookup. */
+ nearest.dist_sq = len_squared_v3v3(nearest.co, positions[i]);
+ BLI_bvhtree_find_nearest(tree_data_pointcloud.tree,
+ positions[i],
+ &nearest,
+ tree_data_pointcloud.nearest_callback,
+ &tree_data_pointcloud);
+ distance_span[i] = std::min(distance_span[i], sqrtf(nearest.dist_sq));
+ }
+ }
+ });
+}
+
+static bool bvh_from_mesh(const Mesh *target_mesh,
+ int target_geometry_element,
+ BVHTreeFromMesh &r_tree_data_mesh)
+{
+ BVHCacheType bvh_type = BVHTREE_FROM_LOOPTRI;
+ switch (target_geometry_element) {
+ case GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS:
+ bvh_type = BVHTREE_FROM_VERTS;
+ break;
+ case GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_EDGES:
+ bvh_type = BVHTREE_FROM_EDGES;
+ break;
+ case GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES:
+ bvh_type = BVHTREE_FROM_LOOPTRI;
+ break;
+ }
+
+ /* This only updates a cache and can be considered to be logically const. */
+ BKE_bvhtree_from_mesh_get(&r_tree_data_mesh, const_cast<Mesh *>(target_mesh), bvh_type, 2);
+ if (r_tree_data_mesh.tree == nullptr) {
+ return false;
+ }
+ return true;
+}
+
+static bool bvh_from_pointcloud(const PointCloud *target_pointcloud,
+ BVHTreeFromPointCloud &r_tree_data_pointcloud)
+{
+ BKE_bvhtree_from_pointcloud_get(&r_tree_data_pointcloud, target_pointcloud, 2);
+ if (r_tree_data_pointcloud.tree == nullptr) {
+ return false;
+ }
+ return true;
+}
+
+static void attribute_calc_proximity(GeometryComponent &component,
+ GeometrySet &geometry_set_target,
+ GeoNodeExecParams &params)
+{
+ /* This node works on the "point" domain, since that is where positions are stored. */
+ const AttributeDomain result_domain = ATTR_DOMAIN_POINT;
+
+ const std::string result_attribute_name = params.get_input<std::string>("Result");
+ OutputAttributePtr distance_attribute = component.attribute_try_get_for_output(
+ result_attribute_name, result_domain, CD_PROP_FLOAT);
+
+ ReadAttributePtr position_attribute = component.attribute_try_get_for_read("position");
+ BLI_assert(position_attribute->custom_data_type() == CD_PROP_FLOAT3);
+
+ if (!distance_attribute || !position_attribute) {
+ return;
+ }
+
+ const bNode &node = params.node();
+ const NodeGeometryAttributeProximity &storage = *(const NodeGeometryAttributeProximity *)
+ node.storage;
+
+ BVHTreeFromMesh tree_data_mesh;
+ BVHTreeFromPointCloud tree_data_pointcloud;
+ bool bvh_mesh_success = false;
+ bool bvh_pointcloud_success = false;
+
+ if (geometry_set_target.has_mesh()) {
+ bvh_mesh_success = bvh_from_mesh(
+ geometry_set_target.get_mesh_for_read(), storage.target_geometry_element, tree_data_mesh);
+ }
+
+ if (geometry_set_target.has_pointcloud() &&
+ storage.target_geometry_element ==
+ GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS) {
+ bvh_pointcloud_success = bvh_from_pointcloud(geometry_set_target.get_pointcloud_for_read(),
+ tree_data_pointcloud);
+ }
+
+ proximity_calc(distance_attribute->get_span_for_write_only<float>(),
+ position_attribute->get_span<float3>(),
+ tree_data_mesh,
+ tree_data_pointcloud,
+ bvh_mesh_success,
+ bvh_pointcloud_success);
+
+ if (bvh_mesh_success) {
+ free_bvhtree_from_mesh(&tree_data_mesh);
+ }
+ if (bvh_pointcloud_success) {
+ free_bvhtree_from_pointcloud(&tree_data_pointcloud);
+ }
+
+ distance_attribute.apply_span_and_save();
+}
+
+static void geo_node_attribute_proximity_exec(GeoNodeExecParams params)
+{
+ GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ GeometrySet geometry_set_target = params.extract_input<GeometrySet>("Target");
+
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
+ /* This isn't required. This node should be rewritten to handle instances
+ * for the target geometry set. However, the generic BVH API complicates this. */
+ geometry_set_target = geometry_set_realize_instances(geometry_set_target);
+
+ if (geometry_set.has<MeshComponent>()) {
+ attribute_calc_proximity(
+ geometry_set.get_component_for_write<MeshComponent>(), geometry_set_target, params);
+ }
+ if (geometry_set.has<PointCloudComponent>()) {
+ attribute_calc_proximity(
+ geometry_set.get_component_for_write<PointCloudComponent>(), geometry_set_target, params);
+ }
+
+ params.set_output("Geometry", geometry_set);
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_attribute_proximity()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(
+ &ntype, GEO_NODE_ATTRIBUTE_PROXIMITY, "Attribute Proximity", NODE_CLASS_ATTRIBUTE, 0);
+ node_type_socket_templates(
+ &ntype, geo_node_attribute_proximity_in, geo_node_attribute_proximity_out);
+ node_type_init(&ntype, geo_attribute_proximity_init);
+ node_type_storage(&ntype,
+ "NodeGeometryAttributeProximity",
+ node_free_standard_storage,
+ node_copy_standard_storage);
+ ntype.geometry_node_execute = blender::nodes::geo_node_attribute_proximity_exec;
+ ntype.draw_buttons = geo_node_attribute_proximity_layout;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
index 0e7bb25e659..bb5b5073c32 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
@@ -19,6 +19,9 @@
#include "BLI_hash.h"
#include "BLI_rand.hh"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "DNA_mesh_types.h"
#include "DNA_pointcloud_types.h"
@@ -29,6 +32,8 @@ static bNodeSocketTemplate geo_node_attribute_randomize_in[] = {
{SOCK_VECTOR, N_("Max"), 1.0f, 1.0f, 1.0f, 0.0f, -FLT_MAX, FLT_MAX},
{SOCK_FLOAT, N_("Min"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{SOCK_FLOAT, N_("Max"), 1.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
+ {SOCK_INT, N_("Min"), 0.0f, 0.0f, 0.0f, 0.0f, -100000, 100000},
+ {SOCK_INT, N_("Max"), 100.0f, 0.0f, 0.0f, 0.0f, -100000, 100000},
{SOCK_INT, N_("Seed"), 0, 0, 0, 0, -10000, 10000},
{-1, ""},
};
@@ -38,9 +43,22 @@ static bNodeSocketTemplate geo_node_attribute_randomize_out[] = {
{-1, ""},
};
+static void geo_node_attribute_random_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE);
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
+}
+
static void geo_node_attribute_randomize_init(bNodeTree *UNUSED(tree), bNode *node)
{
- node->custom1 = CD_PROP_FLOAT;
+ NodeAttributeRandomize *data = (NodeAttributeRandomize *)MEM_callocN(
+ sizeof(NodeAttributeRandomize), __func__);
+ data->data_type = CD_PROP_FLOAT;
+ data->domain = ATTR_DOMAIN_POINT;
+ data->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE;
+ node->storage = data;
}
static void geo_node_attribute_randomize_update(bNodeTree *UNUSED(ntree), bNode *node)
@@ -49,66 +67,107 @@ static void geo_node_attribute_randomize_update(bNodeTree *UNUSED(ntree), bNode
bNodeSocket *sock_max_vector = sock_min_vector->next;
bNodeSocket *sock_min_float = sock_max_vector->next;
bNodeSocket *sock_max_float = sock_min_float->next;
+ bNodeSocket *sock_min_int = sock_max_float->next;
+ bNodeSocket *sock_max_int = sock_min_int->next;
- const int data_type = node->custom1;
-
+ const NodeAttributeRandomize &storage = *(const NodeAttributeRandomize *)node->storage;
+ const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
nodeSetSocketAvailability(sock_min_vector, data_type == CD_PROP_FLOAT3);
nodeSetSocketAvailability(sock_max_vector, data_type == CD_PROP_FLOAT3);
nodeSetSocketAvailability(sock_min_float, data_type == CD_PROP_FLOAT);
nodeSetSocketAvailability(sock_max_float, data_type == CD_PROP_FLOAT);
+ nodeSetSocketAvailability(sock_min_int, data_type == CD_PROP_INT32);
+ nodeSetSocketAvailability(sock_max_int, data_type == CD_PROP_INT32);
}
namespace blender::nodes {
-/** Rehash to combine the seed with the "id" hash and a mutator for each dimension. */
-static float noise_from_index_and_mutator(const int seed, const int hash, const int mutator)
+template<typename T>
+T random_value_in_range(const uint32_t id, const uint32_t seed, const T min, const T max);
+
+template<>
+inline float random_value_in_range(const uint32_t id,
+ const uint32_t seed,
+ const float min,
+ const float max)
{
- const int combined_hash = BLI_hash_int_3d(seed, hash, mutator);
- return BLI_hash_int_01(combined_hash);
+ return BLI_hash_int_2d_to_float(id, seed) * (max - min) + min;
}
-/** Rehash to combine the seed with the "id" hash. */
-static float noise_from_index(const int seed, const int hash)
+template<>
+inline int random_value_in_range(const uint32_t id,
+ const uint32_t seed,
+ const int min,
+ const int max)
{
- const int combined_hash = BLI_hash_int_2d(seed, hash);
- return BLI_hash_int_01(combined_hash);
+ return round_fl_to_int(
+ random_value_in_range<float>(id, seed, static_cast<float>(min), static_cast<float>(max)));
}
-static void randomize_attribute_bool(BooleanWriteAttribute attribute,
- Span<uint32_t> hashes,
- const int seed)
+template<>
+inline float3 random_value_in_range(const uint32_t id,
+ const uint32_t seed,
+ const float3 min,
+ const float3 max)
{
- MutableSpan<bool> attribute_span = attribute.get_span();
- for (const int i : IndexRange(attribute.size())) {
- const bool value = noise_from_index(seed, (int)hashes[i]) > 0.5f;
- attribute_span[i] = value;
- }
- attribute.apply_span();
+ const float x = BLI_hash_int_3d_to_float(seed, id, 435109);
+ const float y = BLI_hash_int_3d_to_float(seed, id, 380867);
+ const float z = BLI_hash_int_3d_to_float(seed, id, 1059217);
+
+ return float3(x, y, z) * (max - min) + min;
}
-static void randomize_attribute_float(
- FloatWriteAttribute attribute, float min, float max, Span<uint32_t> hashes, const int seed)
+template<typename T>
+static void randomize_attribute(MutableSpan<T> span,
+ const T min,
+ const T max,
+ Span<uint32_t> ids,
+ const uint32_t seed,
+ const GeometryNodeAttributeRandomizeMode operation)
{
- MutableSpan<float> attribute_span = attribute.get_span();
- for (const int i : IndexRange(attribute.size())) {
- const float value = noise_from_index(seed, (int)hashes[i]) * (max - min) + min;
- attribute_span[i] = value;
+ /* The operations could be templated too, but it doesn't make the code much shorter. */
+ switch (operation) {
+ case GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE:
+ for (const int i : span.index_range()) {
+ const T random_value = random_value_in_range<T>(ids[i], seed, min, max);
+ span[i] = random_value;
+ }
+ break;
+ case GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD:
+ for (const int i : span.index_range()) {
+ const T random_value = random_value_in_range<T>(ids[i], seed, min, max);
+ span[i] = span[i] + random_value;
+ }
+ break;
+ case GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT:
+ for (const int i : span.index_range()) {
+ const T random_value = random_value_in_range<T>(ids[i], seed, min, max);
+ span[i] = span[i] - random_value;
+ }
+ break;
+ case GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY:
+ for (const int i : span.index_range()) {
+ const T random_value = random_value_in_range<T>(ids[i], seed, min, max);
+ span[i] = span[i] * random_value;
+ }
+ break;
+ default:
+ BLI_assert(false);
+ break;
}
- attribute.apply_span();
}
-static void randomize_attribute_float3(
- Float3WriteAttribute attribute, float3 min, float3 max, Span<uint32_t> hashes, const int seed)
+static void randomize_attribute_bool(MutableSpan<bool> span,
+ Span<uint32_t> ids,
+ const uint32_t seed,
+ const GeometryNodeAttributeRandomizeMode operation)
{
- MutableSpan<float3> attribute_span = attribute.get_span();
- for (const int i : IndexRange(attribute.size())) {
- const float x = noise_from_index_and_mutator(seed, (int)hashes[i], 47);
- const float y = noise_from_index_and_mutator(seed, (int)hashes[i], 8);
- const float z = noise_from_index_and_mutator(seed, (int)hashes[i], 64);
- const float3 value = float3(x, y, z) * (max - min) + min;
- attribute_span[i] = value;
+ BLI_assert(operation == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE);
+ UNUSED_VARS_NDEBUG(operation);
+ for (const int i : span.index_range()) {
+ const bool random_value = BLI_hash_int_2d_to_float(ids[i], seed) > 0.5f;
+ span[i] = random_value;
}
- attribute.apply_span();
}
Array<uint32_t> get_geometry_element_ids_as_uints(const GeometryComponent &component,
@@ -129,8 +188,7 @@ Array<uint32_t> get_geometry_element_ids_as_uints(const GeometryComponent &compo
}
else {
/* If there is no "id" attribute for per-point variation, just create it here. */
- RandomNumberGenerator rng;
- rng.seed(0);
+ RandomNumberGenerator rng(0);
for (const int i : hashes.index_range()) {
hashes[i] = rng.get_uint32();
}
@@ -139,60 +197,115 @@ Array<uint32_t> get_geometry_element_ids_as_uints(const GeometryComponent &compo
return hashes;
}
-static void randomize_attribute(GeometryComponent &component,
- const GeoNodeExecParams &params,
- const int seed)
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ StringRef attribute_name)
{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(attribute_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the input domain chosen in the interface. */
const bNode &node = params.node();
- const CustomDataType data_type = static_cast<CustomDataType>(node.custom1);
- const AttributeDomain domain = static_cast<AttributeDomain>(node.custom2);
- const std::string attribute_name = params.get_input<std::string>("Attribute");
- if (attribute_name.empty()) {
- return;
+ return static_cast<AttributeDomain>(node.custom2);
+}
+
+static void randomize_attribute_on_component(GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ StringRef attribute_name,
+ const CustomDataType data_type,
+ const GeometryNodeAttributeRandomizeMode operation,
+ const int seed)
+{
+ /* If the node is not in "replace / create" mode and the attribute
+ * doesn't already exist, don't do the operation. */
+ if (operation != GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) {
+ if (!component.attribute_exists(attribute_name)) {
+ params.error_message_add(NodeWarningType::Error,
+ "No attribute with name '" + attribute_name + "'.");
+ return;
+ }
}
+ const AttributeDomain domain = get_result_domain(component, params, attribute_name);
+
OutputAttributePtr attribute = component.attribute_try_get_for_output(
attribute_name, domain, data_type);
if (!attribute) {
return;
}
+ fn::GMutableSpan span = (operation == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) ?
+ attribute->get_span_for_write_only() :
+ attribute->get_span();
+
Array<uint32_t> hashes = get_geometry_element_ids_as_uints(component, domain);
switch (data_type) {
- case CD_PROP_FLOAT: {
- const float min_value = params.get_input<float>("Min_001");
- const float max_value = params.get_input<float>("Max_001");
- randomize_attribute_float(*attribute, min_value, max_value, hashes, seed);
+ case CD_PROP_FLOAT3: {
+ const float3 min = params.get_input<float3>("Min");
+ const float3 max = params.get_input<float3>("Max");
+ randomize_attribute<float3>(span.typed<float3>(), min, max, hashes, seed, operation);
break;
}
- case CD_PROP_FLOAT3: {
- const float3 min_value = params.get_input<float3>("Min");
- const float3 max_value = params.get_input<float3>("Max");
- randomize_attribute_float3(*attribute, min_value, max_value, hashes, seed);
+ case CD_PROP_FLOAT: {
+ const float min = params.get_input<float>("Min_001");
+ const float max = params.get_input<float>("Max_001");
+ randomize_attribute<float>(span.typed<float>(), min, max, hashes, seed, operation);
break;
}
case CD_PROP_BOOL: {
- randomize_attribute_bool(*attribute, hashes, seed);
+ randomize_attribute_bool(span.typed<bool>(), hashes, seed, operation);
break;
}
- default:
+ case CD_PROP_INT32: {
+ const int min = params.get_input<int>("Min_002");
+ const int max = params.get_input<int>("Max_002");
+ randomize_attribute<int>(span.typed<int>(), min, max, hashes, seed, operation);
break;
+ }
+ default: {
+ BLI_assert(false);
+ break;
+ }
}
- attribute.save();
-}
+ attribute.apply_span_and_save();
+} // namespace blender::nodes
static void geo_node_random_attribute_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ const std::string attribute_name = params.get_input<std::string>("Attribute");
+ if (attribute_name.empty()) {
+ params.set_output("Geometry", geometry_set);
+ return;
+ }
const int seed = params.get_input<int>("Seed");
+ const NodeAttributeRandomize &storage = *(const NodeAttributeRandomize *)params.node().storage;
+ const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
+ const GeometryNodeAttributeRandomizeMode operation =
+ static_cast<GeometryNodeAttributeRandomizeMode>(storage.operation);
+
+ geometry_set = geometry_set_realize_instances(geometry_set);
if (geometry_set.has<MeshComponent>()) {
- randomize_attribute(geometry_set.get_component_for_write<MeshComponent>(), params, seed);
+ randomize_attribute_on_component(geometry_set.get_component_for_write<MeshComponent>(),
+ params,
+ attribute_name,
+ data_type,
+ operation,
+ seed);
}
if (geometry_set.has<PointCloudComponent>()) {
- randomize_attribute(geometry_set.get_component_for_write<PointCloudComponent>(), params, seed);
+ randomize_attribute_on_component(geometry_set.get_component_for_write<PointCloudComponent>(),
+ params,
+ attribute_name,
+ data_type,
+ operation,
+ seed);
}
params.set_output("Geometry", geometry_set);
@@ -211,5 +324,8 @@ void register_node_type_geo_attribute_randomize()
node_type_init(&ntype, geo_node_attribute_randomize_init);
node_type_update(&ntype, geo_node_attribute_randomize_update);
ntype.geometry_node_execute = blender::nodes::geo_node_random_attribute_exec;
+ ntype.draw_buttons = geo_node_attribute_random_layout;
+ node_type_storage(
+ &ntype, "NodeAttributeRandomize", node_free_standard_storage, node_copy_standard_storage);
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc
new file mode 100644
index 00000000000..d0b2595b5b9
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc
@@ -0,0 +1,142 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "BLI_compiler_attrs.h"
+
+#include "DNA_texture_types.h"
+
+#include "BKE_texture.h"
+
+#include "RE_texture.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "node_geometry_util.hh"
+
+static bNodeSocketTemplate geo_node_attribute_sample_texture_in[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_STRING, N_("Mapping")},
+ {SOCK_STRING, N_("Result")},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_attribute_sample_texture_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+static void geo_node_attribute_sample_texture_layout(uiLayout *layout,
+ bContext *C,
+ PointerRNA *ptr)
+{
+ uiTemplateID(layout, C, ptr, "texture", "texture.new", nullptr, nullptr, 0, ICON_NONE, nullptr);
+}
+
+namespace blender::nodes {
+
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ StringRef result_attribute_name,
+ StringRef map_attribute_name)
+{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_attribute_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the name of the map attribute. */
+ ReadAttributePtr map_attribute = component.attribute_try_get_for_read(map_attribute_name);
+ if (map_attribute) {
+ return map_attribute->domain();
+ }
+
+ /* The node won't execute in this case, but we still have to return a value. */
+ return ATTR_DOMAIN_POINT;
+}
+
+static void execute_on_component(GeometryComponent &component, const GeoNodeExecParams &params)
+{
+ const bNode &node = params.node();
+ Tex *texture = reinterpret_cast<Tex *>(node.id);
+ if (texture == nullptr) {
+ return;
+ }
+
+ const std::string result_attribute_name = params.get_input<std::string>("Result");
+ const std::string mapping_name = params.get_input<std::string>("Mapping");
+ if (!component.attribute_exists(mapping_name)) {
+ return;
+ }
+
+ const AttributeDomain result_domain = get_result_domain(
+ component, result_attribute_name, mapping_name);
+
+ OutputAttributePtr attribute_out = component.attribute_try_get_for_output(
+ result_attribute_name, result_domain, CD_PROP_COLOR);
+ if (!attribute_out) {
+ return;
+ }
+
+ Float3ReadAttribute mapping_attribute = component.attribute_get_for_read<float3>(
+ mapping_name, result_domain, {0, 0, 0});
+
+ MutableSpan<Color4f> colors = attribute_out->get_span<Color4f>();
+ for (const int i : IndexRange(mapping_attribute.size())) {
+ TexResult texture_result = {0};
+ const float3 position = mapping_attribute[i];
+ /* For legacy reasons we have to map [0, 1] to [-1, 1] to support uv mappings. */
+ const float3 remapped_position = position * 2.0f - float3(1.0f);
+ BKE_texture_get_value(nullptr, texture, remapped_position, &texture_result, false);
+ colors[i] = {texture_result.tr, texture_result.tg, texture_result.tb, texture_result.ta};
+ }
+ attribute_out.apply_span_and_save();
+}
+
+static void geo_node_attribute_sample_texture_exec(GeoNodeExecParams params)
+{
+ GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
+ if (geometry_set.has<MeshComponent>()) {
+ execute_on_component(geometry_set.get_component_for_write<MeshComponent>(), params);
+ }
+ if (geometry_set.has<PointCloudComponent>()) {
+ execute_on_component(geometry_set.get_component_for_write<PointCloudComponent>(), params);
+ }
+
+ params.set_output("Geometry", geometry_set);
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_sample_texture()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(&ntype,
+ GEO_NODE_ATTRIBUTE_SAMPLE_TEXTURE,
+ "Attribute Sample Texture",
+ NODE_CLASS_ATTRIBUTE,
+ 0);
+ node_type_size_preset(&ntype, NODE_SIZE_LARGE);
+ node_type_socket_templates(
+ &ntype, geo_node_attribute_sample_texture_in, geo_node_attribute_sample_texture_out);
+ ntype.geometry_node_execute = blender::nodes::geo_node_attribute_sample_texture_exec;
+ ntype.draw_buttons = geo_node_attribute_sample_texture_layout;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc
new file mode 100644
index 00000000000..0ba89562ec1
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc
@@ -0,0 +1,177 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "DNA_material_types.h"
+
+#include "node_geometry_util.hh"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+static bNodeSocketTemplate geo_node_attribute_separate_xyz_in[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_STRING, N_("Vector")},
+ {SOCK_VECTOR, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
+ {SOCK_STRING, N_("Result X")},
+ {SOCK_STRING, N_("Result Y")},
+ {SOCK_STRING, N_("Result Z")},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_attribute_separate_xyz_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+static void geo_node_attribute_separate_xyz_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE);
+}
+
+namespace blender::nodes {
+
+static void geo_node_attribute_separate_xyz_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+ NodeAttributeSeparateXYZ *data = (NodeAttributeSeparateXYZ *)MEM_callocN(
+ sizeof(NodeAttributeSeparateXYZ), __func__);
+ data->input_type = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
+ node->storage = data;
+}
+
+static void geo_node_attribute_separate_xyz_update(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ NodeAttributeSeparateXYZ *node_storage = (NodeAttributeSeparateXYZ *)node->storage;
+ update_attribute_input_socket_availabilities(
+ *node, "Vector", (GeometryNodeAttributeInputMode)node_storage->input_type);
+}
+
+static void extract_input(const int index, const Span<float3> &input, MutableSpan<float> result)
+{
+ for (const int i : result.index_range()) {
+ /* Get the component of the float3. (0: X, 1: Y, 2: Z). */
+ const float component = input[i][index];
+ result[i] = component;
+ }
+}
+
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ StringRef result_name_x,
+ StringRef result_name_y,
+ StringRef result_name_z)
+{
+ /* Use the highest priority domain from any existing attribute outputs. */
+ Vector<AttributeDomain, 3> output_domains;
+ ReadAttributePtr attribute_x = component.attribute_try_get_for_read(result_name_x);
+ ReadAttributePtr attribute_y = component.attribute_try_get_for_read(result_name_y);
+ ReadAttributePtr attribute_z = component.attribute_try_get_for_read(result_name_z);
+ if (attribute_x) {
+ output_domains.append(attribute_x->domain());
+ }
+ if (attribute_y) {
+ output_domains.append(attribute_y->domain());
+ }
+ if (attribute_z) {
+ output_domains.append(attribute_z->domain());
+ }
+ if (output_domains.size() > 0) {
+ return bke::attribute_domain_highest_priority(output_domains);
+ }
+
+ /* Otherwise use the domain of the input attribute, or the default. */
+ return params.get_highest_priority_input_domain({"Vector"}, component, ATTR_DOMAIN_POINT);
+}
+
+static void separate_attribute(GeometryComponent &component, const GeoNodeExecParams &params)
+{
+ const std::string result_name_x = params.get_input<std::string>("Result X");
+ const std::string result_name_y = params.get_input<std::string>("Result Y");
+ const std::string result_name_z = params.get_input<std::string>("Result Z");
+ if (result_name_x.empty() && result_name_y.empty() && result_name_z.empty()) {
+ return;
+ }
+
+ /* The node is only for float3 to float conversions. */
+ const CustomDataType input_type = CD_PROP_FLOAT3;
+ const CustomDataType result_type = CD_PROP_FLOAT;
+ const AttributeDomain result_domain = get_result_domain(
+ component, params, result_name_x, result_name_y, result_name_z);
+
+ ReadAttributePtr attribute_input = params.get_input_attribute(
+ "Vector", component, result_domain, input_type, nullptr);
+ if (!attribute_input) {
+ return;
+ }
+ const Span<float3> input_span = attribute_input->get_span<float3>();
+
+ OutputAttributePtr attribute_result_x = component.attribute_try_get_for_output(
+ result_name_x, result_domain, result_type);
+ OutputAttributePtr attribute_result_y = component.attribute_try_get_for_output(
+ result_name_y, result_domain, result_type);
+ OutputAttributePtr attribute_result_z = component.attribute_try_get_for_output(
+ result_name_z, result_domain, result_type);
+
+ /* Only extract the components for the outputs with a given attribute. */
+ if (attribute_result_x) {
+ extract_input(0, input_span, attribute_result_x->get_span_for_write_only<float>());
+ attribute_result_x.apply_span_and_save();
+ }
+ if (attribute_result_y) {
+ extract_input(1, input_span, attribute_result_y->get_span_for_write_only<float>());
+ attribute_result_y.apply_span_and_save();
+ }
+ if (attribute_result_z) {
+ extract_input(2, input_span, attribute_result_z->get_span_for_write_only<float>());
+ attribute_result_z.apply_span_and_save();
+ }
+}
+
+static void geo_node_attribute_separate_xyz_exec(GeoNodeExecParams params)
+{
+ GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+
+ if (geometry_set.has<MeshComponent>()) {
+ separate_attribute(geometry_set.get_component_for_write<MeshComponent>(), params);
+ }
+ if (geometry_set.has<PointCloudComponent>()) {
+ separate_attribute(geometry_set.get_component_for_write<PointCloudComponent>(), params);
+ }
+
+ params.set_output("Geometry", geometry_set);
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_attribute_separate_xyz()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(
+ &ntype, GEO_NODE_ATTRIBUTE_SEPARATE_XYZ, "Attribute Separate XYZ", NODE_CLASS_ATTRIBUTE, 0);
+ node_type_socket_templates(
+ &ntype, geo_node_attribute_separate_xyz_in, geo_node_attribute_separate_xyz_out);
+ node_type_init(&ntype, blender::nodes::geo_node_attribute_separate_xyz_init);
+ node_type_update(&ntype, blender::nodes::geo_node_attribute_separate_xyz_update);
+ node_type_storage(
+ &ntype, "NodeAttributeSeparateXYZ", node_free_standard_storage, node_copy_standard_storage);
+ ntype.geometry_node_execute = blender::nodes::geo_node_attribute_separate_xyz_exec;
+ ntype.draw_buttons = geo_node_attribute_separate_xyz_layout;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc
index 529906a35e7..aa207860f32 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc
@@ -26,6 +26,9 @@
#include "DNA_mesh_types.h"
#include "DNA_pointcloud_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "NOD_math_functions.hh"
static bNodeSocketTemplate geo_node_attribute_vector_math_in[] = {
@@ -46,25 +49,6 @@ static bNodeSocketTemplate geo_node_attribute_vector_math_out[] = {
{-1, ""},
};
-static void geo_node_attribute_vector_math_init(bNodeTree *UNUSED(tree), bNode *node)
-{
- NodeAttributeVectorMath *data = (NodeAttributeVectorMath *)MEM_callocN(
- sizeof(NodeAttributeVectorMath), __func__);
-
- data->operation = NODE_VECTOR_MATH_ADD;
- data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
- data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
- node->storage = data;
-}
-
-static CustomDataType operation_get_read_type_b(const NodeVectorMathOperation operation)
-{
- if (operation == NODE_VECTOR_MATH_SCALE) {
- return CD_PROP_FLOAT;
- }
- return CD_PROP_FLOAT3;
-}
-
static bool operation_use_input_b(const NodeVectorMathOperation operation)
{
return !ELEM(operation,
@@ -84,6 +68,46 @@ static bool operation_use_input_c(const NodeVectorMathOperation operation)
return operation == NODE_VECTOR_MATH_WRAP;
}
+static void geo_node_attribute_vector_math_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ bNode *node = (bNode *)ptr->data;
+ const NodeAttributeVectorMath &node_storage = *(NodeAttributeVectorMath *)node->storage;
+ const NodeVectorMathOperation operation = (const NodeVectorMathOperation)node_storage.operation;
+
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE);
+ if (operation_use_input_b(operation)) {
+ uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE);
+ }
+ if (operation_use_input_c(operation)) {
+ uiItemR(layout, ptr, "input_type_c", 0, IFACE_("C"), ICON_NONE);
+ }
+}
+
+static CustomDataType operation_get_read_type_b(const NodeVectorMathOperation operation)
+{
+ if (operation == NODE_VECTOR_MATH_SCALE) {
+ return CD_PROP_FLOAT;
+ }
+ return CD_PROP_FLOAT3;
+}
+
+static void geo_node_attribute_vector_math_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+ NodeAttributeVectorMath *data = (NodeAttributeVectorMath *)MEM_callocN(
+ sizeof(NodeAttributeVectorMath), __func__);
+
+ data->operation = NODE_VECTOR_MATH_ADD;
+ data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
+ data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
+ node->storage = data;
+}
+
static CustomDataType operation_get_result_type(const NodeVectorMathOperation operation)
{
switch (operation) {
@@ -305,12 +329,35 @@ static void do_math_operation_fl3_to_fl(const Float3ReadAttribute &input_a,
UNUSED_VARS_NDEBUG(success);
}
+static AttributeDomain get_result_domain(const GeometryComponent &component,
+ const GeoNodeExecParams &params,
+ const NodeVectorMathOperation operation,
+ StringRef result_name)
+{
+ /* Use the domain of the result attribute if it already exists. */
+ ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name);
+ if (result_attribute) {
+ return result_attribute->domain();
+ }
+
+ /* Otherwise use the highest priority domain from existing input attributes, or the default. */
+ const AttributeDomain default_domain = ATTR_DOMAIN_POINT;
+ if (operation_use_input_b(operation)) {
+ if (operation_use_input_c(operation)) {
+ return params.get_highest_priority_input_domain({"A", "B", "C"}, component, default_domain);
+ }
+ return params.get_highest_priority_input_domain({"A", "B"}, component, default_domain);
+ }
+ return params.get_highest_priority_input_domain({"A"}, component, default_domain);
+}
+
static void attribute_vector_math_calc(GeometryComponent &component,
const GeoNodeExecParams &params)
{
const bNode &node = params.node();
const NodeAttributeVectorMath *node_storage = (const NodeAttributeVectorMath *)node.storage;
const NodeVectorMathOperation operation = (NodeVectorMathOperation)node_storage->operation;
+ const std::string result_name = params.get_input<std::string>("Result");
/* The number and type of the input attribute depend on the operation. */
const CustomDataType read_type_a = CD_PROP_FLOAT3;
@@ -321,7 +368,8 @@ static void attribute_vector_math_calc(GeometryComponent &component,
/* The result domain is always point for now. */
const CustomDataType result_type = operation_get_result_type(operation);
- const AttributeDomain result_domain = ATTR_DOMAIN_POINT;
+ const AttributeDomain result_domain = get_result_domain(
+ component, params, operation, result_name);
ReadAttributePtr attribute_a = params.get_input_attribute(
"A", component, result_domain, read_type_a, nullptr);
@@ -344,7 +392,6 @@ static void attribute_vector_math_calc(GeometryComponent &component,
}
/* Get result attribute first, in case it has to overwrite one of the existing attributes. */
- const std::string result_name = params.get_input<std::string>("Result");
OutputAttributePtr attribute_result = component.attribute_try_get_for_output(
result_name, result_domain, result_type);
if (!attribute_result) {
@@ -397,6 +444,8 @@ static void geo_node_attribute_vector_math_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
attribute_vector_math_calc(geometry_set.get_component_for_write<MeshComponent>(), params);
}
@@ -419,6 +468,7 @@ void register_node_type_geo_attribute_vector_math()
node_type_socket_templates(
&ntype, geo_node_attribute_vector_math_in, geo_node_attribute_vector_math_out);
ntype.geometry_node_execute = blender::nodes::geo_node_attribute_vector_math_exec;
+ ntype.draw_buttons = geo_node_attribute_vector_math_layout;
node_type_update(&ntype, blender::nodes::geo_node_attribute_vector_math_update);
node_type_init(&ntype, geo_node_attribute_vector_math_init);
node_type_storage(
diff --git a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc
index 19178546e40..38215b54640 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc
@@ -24,6 +24,9 @@
#include "RNA_enum_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "BKE_mesh.h"
#include "bmesh.h"
@@ -42,6 +45,11 @@ static bNodeSocketTemplate geo_node_boolean_out[] = {
{-1, ""},
};
+static void geo_node_boolean_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
+}
+
static int bm_face_isect_pair(BMFace *f, void *UNUSED(user_data))
{
return BM_elem_flag_test(f, BM_ELEM_DRAW) ? 1 : 0;
@@ -116,6 +124,12 @@ static void geo_node_boolean_exec(GeoNodeExecParams params)
return;
}
+ /* TODO: Boolean does support an input of multiple meshes. Currently they must all be
+ * converted to BMesh before running the operation though. D9957 will make it possible
+ * to use the mesh structure directly. */
+ geometry_set_in_a = geometry_set_realize_instances(geometry_set_in_a);
+ geometry_set_in_b = geometry_set_realize_instances(geometry_set_in_b);
+
const Mesh *mesh_in_a = geometry_set_in_a.get_mesh_for_read();
const Mesh *mesh_in_b = geometry_set_in_b.get_mesh_for_read();
@@ -147,6 +161,7 @@ void register_node_type_geo_boolean()
geo_node_type_base(&ntype, GEO_NODE_BOOLEAN, "Boolean", NODE_CLASS_GEOMETRY, 0);
node_type_socket_templates(&ntype, geo_node_boolean_in, geo_node_boolean_out);
+ ntype.draw_buttons = geo_node_boolean_layout;
ntype.geometry_node_execute = blender::nodes::geo_node_boolean_exec;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc
new file mode 100644
index 00000000000..8991a26ba4b
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc
@@ -0,0 +1,105 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "node_geometry_util.hh"
+
+#include "BLI_math_matrix.h"
+
+#include "DNA_collection_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+static bNodeSocketTemplate geo_node_collection_info_in[] = {
+ {SOCK_COLLECTION, N_("Collection")},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_collection_info_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+static void geo_node_collection_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
+}
+
+namespace blender::nodes {
+
+static void geo_node_collection_info_exec(GeoNodeExecParams params)
+{
+ bke::PersistentCollectionHandle collection_handle =
+ params.extract_input<bke::PersistentCollectionHandle>("Collection");
+ Collection *collection = params.handle_map().lookup(collection_handle);
+
+ GeometrySet geometry_set_out;
+
+ if (collection == nullptr) {
+ params.set_output("Geometry", geometry_set_out);
+ return;
+ }
+
+ const bNode &bnode = params.node();
+ NodeGeometryCollectionInfo *node_storage = (NodeGeometryCollectionInfo *)bnode.storage;
+ const bool transform_space_relative = (node_storage->transform_space ==
+ GEO_NODE_TRANSFORM_SPACE_RELATIVE);
+
+ InstancedData instance;
+ instance.type = INSTANCE_DATA_TYPE_COLLECTION;
+ instance.data.collection = collection;
+
+ InstancesComponent &instances = geometry_set_out.get_component_for_write<InstancesComponent>();
+
+ float transform_mat[4][4];
+ unit_m4(transform_mat);
+ const Object *self_object = params.self_object();
+
+ if (transform_space_relative) {
+ copy_v3_v3(transform_mat[3], collection->instance_offset);
+
+ mul_m4_m4_pre(transform_mat, self_object->imat);
+ }
+ instances.add_instance(instance, transform_mat, -1);
+
+ params.set_output("Geometry", geometry_set_out);
+}
+
+static void geo_node_collection_info_node_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+ NodeGeometryCollectionInfo *data = (NodeGeometryCollectionInfo *)MEM_callocN(
+ sizeof(NodeGeometryCollectionInfo), __func__);
+ data->transform_space = GEO_NODE_TRANSFORM_SPACE_ORIGINAL;
+ node->storage = data;
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_collection_info()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(&ntype, GEO_NODE_COLLECTION_INFO, "Collection Info", NODE_CLASS_INPUT, 0);
+ node_type_socket_templates(&ntype, geo_node_collection_info_in, geo_node_collection_info_out);
+ node_type_init(&ntype, blender::nodes::geo_node_collection_info_node_init);
+ node_type_storage(&ntype,
+ "NodeGeometryCollectionInfo",
+ node_free_standard_storage,
+ node_copy_standard_storage);
+ ntype.geometry_node_execute = blender::nodes::geo_node_collection_info_exec;
+ ntype.draw_buttons = geo_node_collection_info_layout;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
index 48ff8f2f683..1c794d1f43e 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
@@ -51,6 +51,8 @@ static void geo_node_edge_split_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (!geometry_set.has_mesh()) {
params.set_output("Geometry", std::move(geometry_set));
return;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc b/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc
new file mode 100644
index 00000000000..667beaa1722
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc
@@ -0,0 +1,47 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "node_geometry_util.hh"
+
+#include "DEG_depsgraph_query.h"
+
+static bNodeSocketTemplate geo_node_is_viewport_out[] = {
+ {SOCK_BOOLEAN, N_("Is Viewport")},
+ {-1, ""},
+};
+
+namespace blender::nodes {
+
+static void geo_node_is_viewport_exec(GeoNodeExecParams params)
+{
+ const Depsgraph *depsgraph = params.depsgraph();
+ const eEvaluationMode mode = DEG_get_mode(depsgraph);
+ const bool is_viewport = mode == DAG_EVAL_VIEWPORT;
+
+ params.set_output("Is Viewport", is_viewport);
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_is_viewport()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(&ntype, GEO_NODE_IS_VIEWPORT, "Is Viewport", NODE_CLASS_INPUT, 0);
+ node_type_socket_templates(&ntype, nullptr, geo_node_is_viewport_out);
+ ntype.geometry_node_execute = blender::nodes::geo_node_is_viewport_exec;
+ nodeRegisterType(&ntype);
+}
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 42402e23fa5..4e15f232934 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc
@@ -24,8 +24,16 @@
#include "node_geometry_util.hh"
static bNodeSocketTemplate geo_node_join_geometry_in[] = {
- {SOCK_GEOMETRY, N_("Geometry")},
- {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_GEOMETRY,
+ N_("Geometry"),
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ -1.0f,
+ 1.0f,
+ PROP_NONE,
+ SOCK_MULTI_INPUT},
{-1, ""},
};
@@ -138,17 +146,18 @@ static void determine_final_data_type_and_domain(Span<const GeometryComponent *>
CustomDataType *r_type,
AttributeDomain *r_domain)
{
+ Vector<CustomDataType> data_types;
+ Vector<AttributeDomain> domains;
for (const GeometryComponent *component : components) {
ReadAttributePtr attribute = component->attribute_try_get_for_read(attribute_name);
if (attribute) {
- /* TODO: Use data type with most information. */
- *r_type = bke::cpp_type_to_custom_data_type(attribute->cpp_type());
- /* TODO: Use highest priority domain. */
- *r_domain = attribute->domain();
- return;
+ data_types.append(attribute->custom_data_type());
+ domains.append(attribute->domain());
}
}
- BLI_assert(false);
+
+ *r_type = bke::attribute_data_type_highest_complexity(data_types);
+ *r_domain = bke::attribute_domain_highest_priority(domains);
}
static void fill_new_attribute(Span<const GeometryComponent *> src_components,
@@ -192,8 +201,8 @@ static void join_attributes(Span<const GeometryComponent *> src_components,
AttributeDomain domain;
determine_final_data_type_and_domain(src_components, attribute_name, &data_type, &domain);
- result.attribute_try_create(attribute_name, domain, data_type);
- WriteAttributePtr write_attribute = result.attribute_try_get_for_write(attribute_name);
+ OutputAttributePtr write_attribute = result.attribute_try_get_for_output(
+ attribute_name, domain, data_type);
if (!write_attribute ||
&write_attribute->cpp_type() != bke::custom_data_type_to_cpp_type(data_type) ||
write_attribute->domain() != domain) {
@@ -201,7 +210,7 @@ static void join_attributes(Span<const GeometryComponent *> src_components,
}
fn::GMutableSpan dst_span = write_attribute->get_span_for_write_only();
fill_new_attribute(src_components, attribute_name, data_type, domain, dst_span);
- write_attribute->apply_span();
+ write_attribute.apply_span_and_save();
}
}
@@ -212,8 +221,9 @@ static void join_components(Span<const MeshComponent *> src_components, Geometry
MeshComponent &dst_component = result.get_component_for_write<MeshComponent>();
dst_component.replace(new_mesh);
- /* The position attribute is handled above already. */
- join_attributes(to_base_components(src_components), dst_component, {"position"});
+ /* Don't copy attributes that are stored directly in the mesh data structs. */
+ join_attributes(
+ to_base_components(src_components), dst_component, {"position", "material_index"});
}
static void join_components(Span<const PointCloudComponent *> src_components, GeometrySet &result)
@@ -243,12 +253,20 @@ static void join_components(Span<const InstancesComponent *> src_components, Geo
}
}
+static void join_components(Span<const VolumeComponent *> src_components, GeometrySet &result)
+{
+ /* Not yet supported. Joining volume grids with the same name requires resampling of at least one
+ * of the grids. The cell size of the resulting volume has to be determined somehow. */
+ VolumeComponent &dst_component = result.get_component_for_write<VolumeComponent>();
+ UNUSED_VARS(src_components, dst_component);
+}
+
template<typename Component>
-static void join_component_type(Span<const GeometrySet *> src_geometry_sets, GeometrySet &result)
+static void join_component_type(Span<GeometrySet> src_geometry_sets, GeometrySet &result)
{
Vector<const Component *> components;
- for (const GeometrySet *geometry_set : src_geometry_sets) {
- const Component *component = geometry_set->get_component_for_read<Component>();
+ for (const GeometrySet &geometry_set : src_geometry_sets) {
+ const Component *component = geometry_set.get_component_for_read<Component>();
if (component != nullptr && !component->is_empty()) {
components.append(component);
}
@@ -266,15 +284,13 @@ static void join_component_type(Span<const GeometrySet *> src_geometry_sets, Geo
static void geo_node_join_geometry_exec(GeoNodeExecParams params)
{
- GeometrySet geometry_set_a = params.extract_input<GeometrySet>("Geometry");
- GeometrySet geometry_set_b = params.extract_input<GeometrySet>("Geometry_001");
- GeometrySet geometry_set_result;
+ Vector<GeometrySet> geometry_sets = params.extract_multi_input<GeometrySet>("Geometry");
- std::array<const GeometrySet *, 2> src_geometry_sets = {&geometry_set_a, &geometry_set_b};
-
- join_component_type<MeshComponent>(src_geometry_sets, geometry_set_result);
- join_component_type<PointCloudComponent>(src_geometry_sets, geometry_set_result);
- join_component_type<InstancesComponent>(src_geometry_sets, geometry_set_result);
+ GeometrySet geometry_set_result;
+ join_component_type<MeshComponent>(geometry_sets, geometry_set_result);
+ join_component_type<PointCloudComponent>(geometry_sets, geometry_set_result);
+ join_component_type<InstancesComponent>(geometry_sets, geometry_set_result);
+ join_component_type<VolumeComponent>(geometry_sets, geometry_set_result);
params.set_output("Geometry", std::move(geometry_set_result));
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc
index ab5e4f8964a..54ecb20dae7 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc
@@ -19,9 +19,13 @@
#include "BKE_mesh.h"
#include "BKE_mesh_wrapper.h"
#include "BKE_modifier.h"
+#include "BKE_volume.h"
#include "BLI_math_matrix.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
static bNodeSocketTemplate geo_node_object_info_in[] = {
{SOCK_OBJECT, N_("Object")},
{-1, ""},
@@ -35,6 +39,11 @@ static bNodeSocketTemplate geo_node_object_info_out[] = {
{-1, ""},
};
+static void geo_node_object_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
+}
+
namespace blender::nodes {
static void geo_node_object_info_exec(GeoNodeExecParams params)
{
@@ -68,23 +77,15 @@ static void geo_node_object_info_exec(GeoNodeExecParams params)
quat_to_eul(rotation, quaternion);
if (object != self_object) {
- if (object->type == OB_MESH) {
- Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(object, false);
- if (mesh != nullptr) {
- BKE_mesh_wrapper_ensure_mdata(mesh);
-
- /* Make a copy because the life time of the other mesh might be shorter. */
- Mesh *copied_mesh = BKE_mesh_copy_for_eval(mesh, false);
-
- if (transform_space_relative) {
- /* Transform into the local space of the object that is being modified. */
- BKE_mesh_transform(copied_mesh, transform, true);
- }
-
- MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
- mesh_component.replace(copied_mesh);
- mesh_component.copy_vertex_group_names_from_object(*object);
- }
+ InstancesComponent &instances = geometry_set.get_component_for_write<InstancesComponent>();
+
+ if (transform_space_relative) {
+ instances.add_instance(object, transform);
+ }
+ else {
+ float unit_transform[4][4];
+ unit_m4(unit_transform);
+ instances.add_instance(object, unit_transform);
}
}
}
@@ -115,5 +116,6 @@ void register_node_type_geo_object_info()
node_type_storage(
&ntype, "NodeGeometryObjectInfo", node_free_standard_storage, node_copy_standard_storage);
ntype.geometry_node_execute = blender::nodes::geo_node_object_info_exec;
+ ntype.draw_buttons = geo_node_object_info_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
index 2f1aa276532..553b8ea364f 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
@@ -26,12 +26,16 @@
#include "DNA_meshdata_types.h"
#include "DNA_pointcloud_types.h"
+#include "BKE_attribute_math.hh"
#include "BKE_bvhutils.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_pointcloud.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "node_geometry_util.hh"
static bNodeSocketTemplate geo_node_point_distribute_in[] = {
@@ -48,6 +52,13 @@ static bNodeSocketTemplate geo_node_point_distribute_out[] = {
{-1, ""},
};
+static void geo_node_point_distribute_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "distribute_method", 0, "", ICON_NONE);
+}
+
static void node_point_distribute_update(bNodeTree *UNUSED(ntree), bNode *node)
{
bNodeSocket *sock_min_dist = (bNodeSocket *)BLI_findlink(&node->inputs, 1);
@@ -89,18 +100,21 @@ static void sample_mesh_surface(const Mesh &mesh,
for (const int looptri_index : looptris.index_range()) {
const MLoopTri &looptri = looptris[looptri_index];
- const int v0_index = mesh.mloop[looptri.tri[0]].v;
- const int v1_index = mesh.mloop[looptri.tri[1]].v;
- const int v2_index = mesh.mloop[looptri.tri[2]].v;
+ const int v0_loop = looptri.tri[0];
+ const int v1_loop = looptri.tri[1];
+ const int v2_loop = looptri.tri[2];
+ const int v0_index = mesh.mloop[v0_loop].v;
+ const int v1_index = mesh.mloop[v1_loop].v;
+ const int v2_index = mesh.mloop[v2_loop].v;
const float3 v0_pos = mesh.mvert[v0_index].co;
const float3 v1_pos = mesh.mvert[v1_index].co;
const float3 v2_pos = mesh.mvert[v2_index].co;
float looptri_density_factor = 1.0f;
if (density_factors != nullptr) {
- const float v0_density_factor = std::max(0.0f, (*density_factors)[v0_index]);
- const float v1_density_factor = std::max(0.0f, (*density_factors)[v1_index]);
- const float v2_density_factor = std::max(0.0f, (*density_factors)[v2_index]);
+ const float v0_density_factor = std::max(0.0f, (*density_factors)[v0_loop]);
+ const float v1_density_factor = std::max(0.0f, (*density_factors)[v1_loop]);
+ const float v2_density_factor = std::max(0.0f, (*density_factors)[v2_loop]);
looptri_density_factor = (v0_density_factor + v1_density_factor + v2_density_factor) / 3.0f;
}
const float area = area_tri_v3(v0_pos, v1_pos, v2_pos);
@@ -185,13 +199,13 @@ BLI_NOINLINE static void update_elimination_mask_based_on_density_factors(
const MLoopTri &looptri = looptris[looptri_indices[i]];
const float3 bary_coord = bary_coords[i];
- const int v0_index = mesh.mloop[looptri.tri[0]].v;
- const int v1_index = mesh.mloop[looptri.tri[1]].v;
- const int v2_index = mesh.mloop[looptri.tri[2]].v;
+ const int v0_loop = looptri.tri[0];
+ const int v1_loop = looptri.tri[1];
+ const int v2_loop = looptri.tri[2];
- const float v0_density_factor = std::max(0.0f, density_factors[v0_index]);
- const float v1_density_factor = std::max(0.0f, density_factors[v1_index]);
- const float v2_density_factor = std::max(0.0f, density_factors[v2_index]);
+ const float v0_density_factor = std::max(0.0f, density_factors[v0_loop]);
+ const float v1_density_factor = std::max(0.0f, density_factors[v1_loop]);
+ const float v2_density_factor = std::max(0.0f, density_factors[v2_loop]);
const float probablity = v0_density_factor * bary_coord.x + v1_density_factor * bary_coord.y +
v2_density_factor * bary_coord.z;
@@ -217,13 +231,141 @@ BLI_NOINLINE static void eliminate_points_based_on_mask(Span<bool> elimination_m
}
}
-BLI_NOINLINE static void compute_remaining_point_data(const Mesh &mesh,
- Span<float3> bary_coords,
- Span<int> looptri_indices,
- MutableSpan<float3> r_normals,
- MutableSpan<int> r_ids,
- MutableSpan<float3> r_rotations)
+template<typename T>
+BLI_NOINLINE static void interpolate_attribute_point(const Mesh &mesh,
+ const Span<float3> bary_coords,
+ const Span<int> looptri_indices,
+ const Span<T> data_in,
+ MutableSpan<T> data_out)
{
+ BLI_assert(data_in.size() == mesh.totvert);
+ Span<MLoopTri> looptris = get_mesh_looptris(mesh);
+
+ for (const int i : bary_coords.index_range()) {
+ const int looptri_index = looptri_indices[i];
+ const MLoopTri &looptri = looptris[looptri_index];
+ const float3 &bary_coord = bary_coords[i];
+
+ const int v0_index = mesh.mloop[looptri.tri[0]].v;
+ const int v1_index = mesh.mloop[looptri.tri[1]].v;
+ const int v2_index = mesh.mloop[looptri.tri[2]].v;
+
+ const T &v0 = data_in[v0_index];
+ const T &v1 = data_in[v1_index];
+ const T &v2 = data_in[v2_index];
+
+ const T interpolated_value = attribute_math::mix3(bary_coord, v0, v1, v2);
+ data_out[i] = interpolated_value;
+ }
+}
+
+template<typename T>
+BLI_NOINLINE static void interpolate_attribute_corner(const Mesh &mesh,
+ const Span<float3> bary_coords,
+ const Span<int> looptri_indices,
+ const Span<T> data_in,
+ MutableSpan<T> data_out)
+{
+ BLI_assert(data_in.size() == mesh.totloop);
+ Span<MLoopTri> looptris = get_mesh_looptris(mesh);
+
+ for (const int i : bary_coords.index_range()) {
+ const int looptri_index = looptri_indices[i];
+ const MLoopTri &looptri = looptris[looptri_index];
+ const float3 &bary_coord = bary_coords[i];
+
+ const int loop_index_0 = looptri.tri[0];
+ const int loop_index_1 = looptri.tri[1];
+ const int loop_index_2 = looptri.tri[2];
+
+ const T &v0 = data_in[loop_index_0];
+ const T &v1 = data_in[loop_index_1];
+ const T &v2 = data_in[loop_index_2];
+
+ const T interpolated_value = attribute_math::mix3(bary_coord, v0, v1, v2);
+ data_out[i] = interpolated_value;
+ }
+}
+
+BLI_NOINLINE static void interpolate_attribute(const Mesh &mesh,
+ Span<float3> bary_coords,
+ Span<int> looptri_indices,
+ const StringRef attribute_name,
+ const ReadAttribute &attribute_in,
+ GeometryComponent &component)
+{
+ const CustomDataType data_type = attribute_in.custom_data_type();
+ const AttributeDomain domain = attribute_in.domain();
+ if (!ELEM(domain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_CORNER)) {
+ /* Not supported currently. */
+ return;
+ }
+
+ OutputAttributePtr attribute_out = component.attribute_try_get_for_output(
+ attribute_name, ATTR_DOMAIN_POINT, data_type);
+ if (!attribute_out) {
+ return;
+ }
+
+ attribute_math::convert_to_static_type(data_type, [&](auto dummy) {
+ using T = decltype(dummy);
+
+ Span data_in = attribute_in.get_span<T>();
+ MutableSpan data_out = attribute_out->get_span_for_write_only<T>();
+
+ switch (domain) {
+ case ATTR_DOMAIN_POINT: {
+ interpolate_attribute_point<T>(mesh, bary_coords, looptri_indices, data_in, data_out);
+ break;
+ }
+ case ATTR_DOMAIN_CORNER: {
+ interpolate_attribute_corner<T>(mesh, bary_coords, looptri_indices, data_in, data_out);
+ break;
+ }
+ default: {
+ BLI_assert(false);
+ break;
+ }
+ }
+ });
+ attribute_out.apply_span_and_save();
+}
+
+BLI_NOINLINE static void interpolate_existing_attributes(const MeshComponent &mesh_component,
+ GeometryComponent &component,
+ Span<float3> bary_coords,
+ Span<int> looptri_indices)
+{
+ const Mesh &mesh = *mesh_component.get_for_read();
+
+ Set<std::string> attribute_names = mesh_component.attribute_names();
+ for (StringRefNull attribute_name : attribute_names) {
+ if (ELEM(attribute_name, "position", "normal", "id")) {
+ continue;
+ }
+
+ ReadAttributePtr attribute_in = mesh_component.attribute_try_get_for_read(attribute_name);
+ interpolate_attribute(
+ mesh, bary_coords, looptri_indices, attribute_name, *attribute_in, component);
+ }
+}
+
+BLI_NOINLINE static void compute_special_attributes(const Mesh &mesh,
+ GeometryComponent &component,
+ Span<float3> bary_coords,
+ Span<int> looptri_indices)
+{
+ OutputAttributePtr id_attribute = component.attribute_try_get_for_output(
+ "id", ATTR_DOMAIN_POINT, CD_PROP_INT32);
+ OutputAttributePtr normal_attribute = component.attribute_try_get_for_output(
+ "normal", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3);
+ OutputAttributePtr rotation_attribute = component.attribute_try_get_for_output(
+ "rotation", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3);
+
+ MutableSpan<int> ids = id_attribute->get_span_for_write_only<int>();
+ MutableSpan<float3> normals = normal_attribute->get_span_for_write_only<float3>();
+ MutableSpan<float3> rotations = rotation_attribute->get_span_for_write_only<float3>();
+
Span<MLoopTri> looptris = get_mesh_looptris(mesh);
for (const int i : bary_coords.index_range()) {
const int looptri_index = looptri_indices[i];
@@ -237,10 +379,24 @@ BLI_NOINLINE static void compute_remaining_point_data(const Mesh &mesh,
const float3 v1_pos = mesh.mvert[v1_index].co;
const float3 v2_pos = mesh.mvert[v2_index].co;
- r_ids[i] = (int)(bary_coord.hash()) + looptri_index;
- normal_tri_v3(r_normals[i], v0_pos, v1_pos, v2_pos);
- r_rotations[i] = normal_to_euler_rotation(r_normals[i]);
+ ids[i] = (int)(bary_coord.hash()) + looptri_index;
+ normal_tri_v3(normals[i], v0_pos, v1_pos, v2_pos);
+ rotations[i] = normal_to_euler_rotation(normals[i]);
}
+
+ id_attribute.apply_span_and_save();
+ normal_attribute.apply_span_and_save();
+ rotation_attribute.apply_span_and_save();
+}
+
+BLI_NOINLINE static void add_remaining_point_attributes(const MeshComponent &mesh_component,
+ GeometryComponent &component,
+ Span<float3> bary_coords,
+ Span<int> looptri_indices)
+{
+ interpolate_existing_attributes(mesh_component, component, bary_coords, looptri_indices);
+ compute_special_attributes(
+ *mesh_component.get_for_read(), component, bary_coords, looptri_indices);
}
static void sample_mesh_surface_with_minimum_distance(const Mesh &mesh,
@@ -266,10 +422,14 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
GeometrySet geometry_set_out;
- GeometryNodePointDistributeMethod distribute_method =
- static_cast<GeometryNodePointDistributeMethod>(params.node().custom1);
+ /* TODO: This node only needs read-only access to input instances. */
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
+ GeometryNodePointDistributeMode distribute_method = static_cast<GeometryNodePointDistributeMode>(
+ params.node().custom1);
if (!geometry_set.has_mesh()) {
+ params.error_message_add(NodeWarningType::Error, "Geometry must contain a mesh.");
params.set_output("Geometry", std::move(geometry_set_out));
return;
}
@@ -285,13 +445,14 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
const MeshComponent &mesh_component = *geometry_set.get_component_for_read<MeshComponent>();
const Mesh *mesh_in = mesh_component.get_for_read();
- if (mesh_in == nullptr || mesh_in->mpoly == nullptr) {
+ if (mesh_in->mpoly == nullptr) {
+ params.error_message_add(NodeWarningType::Error, "Mesh has no faces.");
params.set_output("Geometry", std::move(geometry_set_out));
return;
}
const FloatReadAttribute density_factors = mesh_component.attribute_get_for_read<float>(
- density_attribute, ATTR_DOMAIN_POINT, 1.0f);
+ density_attribute, ATTR_DOMAIN_CORNER, 1.0f);
const int seed = params.get_input<int>("Seed");
Vector<float3> positions;
@@ -315,11 +476,6 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
break;
}
const int tot_points = positions.size();
- Array<float3> normals(tot_points);
- Array<int> stable_ids(tot_points);
- Array<float3> rotations(tot_points);
- compute_remaining_point_data(
- *mesh_in, bary_coords, looptri_indices, normals, stable_ids, rotations);
PointCloud *pointcloud = BKE_pointcloud_new_nomain(tot_points);
memcpy(pointcloud->co, positions.data(), sizeof(float3) * tot_points);
@@ -332,29 +488,7 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
geometry_set_out.get_component_for_write<PointCloudComponent>();
point_component.replace(pointcloud);
- {
- OutputAttributePtr stable_id_attribute = point_component.attribute_try_get_for_output(
- "id", ATTR_DOMAIN_POINT, CD_PROP_INT32);
- MutableSpan<int> stable_ids_span = stable_id_attribute->get_span<int>();
- stable_ids_span.copy_from(stable_ids);
- stable_id_attribute.apply_span_and_save();
- }
-
- {
- OutputAttributePtr normals_attribute = point_component.attribute_try_get_for_output(
- "normal", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3);
- MutableSpan<float3> normals_span = normals_attribute->get_span<float3>();
- normals_span.copy_from(normals);
- normals_attribute.apply_span_and_save();
- }
-
- {
- OutputAttributePtr rotations_attribute = point_component.attribute_try_get_for_output(
- "rotation", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3);
- MutableSpan<float3> rotations_span = rotations_attribute->get_span<float3>();
- rotations_span.copy_from(rotations);
- rotations_attribute.apply_span_and_save();
- }
+ add_remaining_point_attributes(mesh_component, point_component, bary_coords, looptri_indices);
params.set_output("Geometry", std::move(geometry_set_out));
}
@@ -369,5 +503,6 @@ void register_node_type_geo_point_distribute()
node_type_socket_templates(&ntype, geo_node_point_distribute_in, geo_node_point_distribute_out);
node_type_update(&ntype, node_point_distribute_update);
ntype.geometry_node_execute = blender::nodes::geo_node_point_distribute_exec;
+ ntype.draw_buttons = geo_node_point_distribute_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
index a96dc710427..669b5ee4614 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
@@ -24,6 +24,9 @@
#include "BLI_hash.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "node_geometry_util.hh"
static bNodeSocketTemplate geo_node_point_instance_in[] = {
@@ -39,6 +42,14 @@ static bNodeSocketTemplate geo_node_point_instance_out[] = {
{-1, ""},
};
+static void geo_node_point_instance_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "instance_type", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
+ if (RNA_enum_get(ptr, "instance_type") == GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION) {
+ uiItemR(layout, ptr, "use_whole_collection", 0, nullptr, ICON_NONE);
+ }
+}
+
namespace blender::nodes {
static void geo_node_point_instance_update(bNodeTree *UNUSED(tree), bNode *node)
@@ -47,8 +58,10 @@ static void geo_node_point_instance_update(bNodeTree *UNUSED(tree), bNode *node)
bNodeSocket *collection_socket = object_socket->next;
bNodeSocket *seed_socket = collection_socket->next;
- GeometryNodePointInstanceType type = (GeometryNodePointInstanceType)node->custom1;
- const bool use_whole_collection = node->custom2 == 0;
+ NodeGeometryPointInstance *node_storage = (NodeGeometryPointInstance *)node->storage;
+ GeometryNodePointInstanceType type = (GeometryNodePointInstanceType)node_storage->instance_type;
+ const bool use_whole_collection = (node_storage->flag &
+ GEO_NODE_POINT_INSTANCE_WHOLE_COLLECTION) != 0;
nodeSetSocketAvailability(object_socket, type == GEO_NODE_POINT_INSTANCE_TYPE_OBJECT);
nodeSetSocketAvailability(collection_socket, type == GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION);
@@ -79,6 +92,8 @@ static void get_instanced_data__collection(
MutableSpan<std::optional<InstancedData>> r_instances_data)
{
const bNode &node = params.node();
+ NodeGeometryPointInstance *node_storage = (NodeGeometryPointInstance *)node.storage;
+
bke::PersistentCollectionHandle collection_handle =
params.get_input<bke::PersistentCollectionHandle>("Collection");
Collection *collection = params.handle_map().lookup(collection_handle);
@@ -86,7 +101,14 @@ static void get_instanced_data__collection(
return;
}
- const bool use_whole_collection = node.custom2 == 0;
+ if (BLI_listbase_is_empty(&collection->children) &&
+ BLI_listbase_is_empty(&collection->gobject)) {
+ params.error_message_add(NodeWarningType::Info, "Collection is empty.");
+ return;
+ }
+
+ const bool use_whole_collection = (node_storage->flag &
+ GEO_NODE_POINT_INSTANCE_WHOLE_COLLECTION) != 0;
if (use_whole_collection) {
InstancedData instance;
instance.type = INSTANCE_DATA_TYPE_COLLECTION;
@@ -128,8 +150,9 @@ static Array<std::optional<InstancedData>> get_instanced_data(const GeoNodeExecP
const int amount)
{
const bNode &node = params.node();
- const GeometryNodePointInstanceType type = (GeometryNodePointInstanceType)node.custom1;
-
+ NodeGeometryPointInstance *node_storage = (NodeGeometryPointInstance *)node.storage;
+ const GeometryNodePointInstanceType type = (GeometryNodePointInstanceType)
+ node_storage->instance_type;
Array<std::optional<InstancedData>> instances_data(amount);
switch (type) {
@@ -177,6 +200,10 @@ static void geo_node_point_instance_exec(GeoNodeExecParams params)
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
GeometrySet geometry_set_out;
+ /* TODO: This node should be able to instance on the input instances component
+ * rather than making the entire input geometry set real. */
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
InstancesComponent &instances = geometry_set_out.get_component_for_write<InstancesComponent>();
if (geometry_set.has<MeshComponent>()) {
add_instances_from_geometry_component(
@@ -189,6 +216,16 @@ static void geo_node_point_instance_exec(GeoNodeExecParams params)
params.set_output("Geometry", std::move(geometry_set_out));
}
+
+static void geo_node_point_instance_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+ NodeGeometryPointInstance *data = (NodeGeometryPointInstance *)MEM_callocN(
+ sizeof(NodeGeometryPointInstance), __func__);
+ data->instance_type = GEO_NODE_POINT_INSTANCE_TYPE_OBJECT;
+ data->flag |= GEO_NODE_POINT_INSTANCE_WHOLE_COLLECTION;
+ node->storage = data;
+}
+
} // namespace blender::nodes
void register_node_type_geo_point_instance()
@@ -197,6 +234,10 @@ void register_node_type_geo_point_instance()
geo_node_type_base(&ntype, GEO_NODE_POINT_INSTANCE, "Point Instance", NODE_CLASS_GEOMETRY, 0);
node_type_socket_templates(&ntype, geo_node_point_instance_in, geo_node_point_instance_out);
+ node_type_init(&ntype, blender::nodes::geo_node_point_instance_init);
+ node_type_storage(
+ &ntype, "NodeGeometryPointInstance", node_free_standard_storage, node_copy_standard_storage);
+ ntype.draw_buttons = geo_node_point_instance_layout;
node_type_update(&ntype, blender::nodes::geo_node_point_instance_update);
ntype.geometry_node_execute = blender::nodes::geo_node_point_instance_exec;
nodeRegisterType(&ntype);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc
index b1451dfb89e..5eef2fabce0 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc
@@ -18,6 +18,9 @@
#include "BLI_math_rotation.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
static bNodeSocketTemplate geo_node_point_rotate_in[] = {
{SOCK_GEOMETRY, N_("Geometry")},
{SOCK_STRING, N_("Axis")},
@@ -34,6 +37,26 @@ static bNodeSocketTemplate geo_node_point_rotate_out[] = {
{-1, ""},
};
+static void geo_node_point_rotate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ NodeGeometryRotatePoints *storage = (NodeGeometryRotatePoints *)((bNode *)ptr->data)->storage;
+
+ uiItemR(layout, ptr, "type", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
+ uiItemR(layout, ptr, "space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+
+ uiLayout *col = uiLayoutColumn(layout, false);
+ if (storage->type == GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE) {
+ uiItemR(col, ptr, "input_type_axis", 0, IFACE_("Axis"), ICON_NONE);
+ uiItemR(col, ptr, "input_type_angle", 0, IFACE_("Angle"), ICON_NONE);
+ }
+ else {
+ uiItemR(col, ptr, "input_type_rotation", 0, IFACE_("Rotation"), ICON_NONE);
+ }
+}
+
namespace blender::nodes {
static void point_rotate__axis_angle__object_space(const int domain_size,
@@ -145,6 +168,8 @@ static void geo_node_point_rotate_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
point_rotate_on_component(geometry_set.get_component_for_write<MeshComponent>(), params);
}
@@ -202,5 +227,6 @@ void register_node_type_geo_point_rotate()
node_type_storage(
&ntype, "NodeGeometryRotatePoints", node_free_standard_storage, node_copy_standard_storage);
ntype.geometry_node_execute = blender::nodes::geo_node_point_rotate_exec;
+ ntype.draw_buttons = geo_node_point_rotate_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc
index 47fca93d2ab..e28013a8bfc 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc
@@ -18,6 +18,9 @@
#include "BKE_colorband.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
static bNodeSocketTemplate geo_node_point_scale_in[] = {
{SOCK_GEOMETRY, N_("Geometry")},
{SOCK_STRING, N_("Factor")},
@@ -30,6 +33,13 @@ static bNodeSocketTemplate geo_node_point_scale_out[] = {
{-1, ""},
};
+static void geo_node_point_scale_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE);
+}
+
namespace blender::nodes {
static void execute_on_component(GeoNodeExecParams params, GeometryComponent &component)
@@ -56,6 +66,8 @@ static void geo_node_point_scale_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
execute_on_component(params, geometry_set.get_component_for_write<MeshComponent>());
}
@@ -96,5 +108,6 @@ void register_node_type_geo_point_scale()
node_type_storage(
&ntype, "NodeGeometryPointScale", node_free_standard_storage, node_copy_standard_storage);
ntype.geometry_node_execute = blender::nodes::geo_node_point_scale_exec;
+ ntype.draw_buttons = geo_node_point_scale_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
index 5f9d208a440..53d0fe1e112 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
@@ -178,6 +178,10 @@ static void geo_node_point_separate_exec(GeoNodeExecParams params)
GeometrySet out_set_a(geometry_set);
GeometrySet out_set_b;
+ /* TODO: This is not necessary-- the input geometry set can be read only,
+ * but it must be rewritten to handle instance groups. */
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<PointCloudComponent>()) {
separate_point_cloud(*geometry_set.get_component_for_read<PointCloudComponent>(),
params,
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc
index 72176b11fdb..cb3cd012c77 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc
@@ -18,6 +18,9 @@
#include "BKE_colorband.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
static bNodeSocketTemplate geo_node_point_translate_in[] = {
{SOCK_GEOMETRY, N_("Geometry")},
{SOCK_STRING, N_("Translation")},
@@ -30,6 +33,13 @@ static bNodeSocketTemplate geo_node_point_translate_out[] = {
{-1, ""},
};
+static void geo_node_point_translate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE);
+}
+
namespace blender::nodes {
static void execute_on_component(GeoNodeExecParams params, GeometryComponent &component)
@@ -55,6 +65,8 @@ static void geo_node_point_translate_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (geometry_set.has<MeshComponent>()) {
execute_on_component(params, geometry_set.get_component_for_write<MeshComponent>());
}
@@ -97,5 +109,6 @@ void register_node_type_geo_point_translate()
node_free_standard_storage,
node_copy_standard_storage);
ntype.geometry_node_execute = blender::nodes::geo_node_point_translate_exec;
+ ntype.draw_buttons = geo_node_point_translate_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
new file mode 100644
index 00000000000..b79ca0a6197
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
@@ -0,0 +1,276 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifdef WITH_OPENVDB
+# include <openvdb/openvdb.h>
+# include <openvdb/tools/LevelSetUtil.h>
+# include <openvdb/tools/ParticlesToLevelSet.h>
+#endif
+
+#include "node_geometry_util.hh"
+
+#include "BKE_lib_id.h"
+#include "BKE_volume.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+static bNodeSocketTemplate geo_node_points_to_volume_in[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_FLOAT, N_("Density"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
+ {SOCK_FLOAT, N_("Voxel Size"), 0.3f, 0.0f, 0.0f, 0.0f, 0.01f, FLT_MAX},
+ {SOCK_FLOAT, N_("Voxel Amount"), 64.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
+ {SOCK_STRING, N_("Radius")},
+ {SOCK_FLOAT, N_("Radius"), 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_point_translate_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+static void geo_node_points_to_volume_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "resolution_mode", 0, IFACE_("Resolution"), ICON_NONE);
+ uiItemR(layout, ptr, "input_type_radius", 0, IFACE_("Radius"), ICON_NONE);
+}
+
+namespace blender::nodes {
+
+#ifdef WITH_OPENVDB
+namespace {
+/* Implements the interface required by #openvdb::tools::ParticlesToLevelSet. */
+struct ParticleList {
+ using PosType = openvdb::Vec3R;
+
+ Span<float3> positions;
+ Span<float> radii;
+
+ size_t size() const
+ {
+ return (size_t)positions.size();
+ }
+
+ void getPos(size_t n, openvdb::Vec3R &xyz) const
+ {
+ xyz = &positions[n].x;
+ }
+
+ void getPosRad(size_t n, openvdb::Vec3R &xyz, openvdb::Real &radius) const
+ {
+ xyz = &positions[n].x;
+ radius = radii[n];
+ }
+};
+} // namespace
+
+static openvdb::FloatGrid::Ptr generate_volume_from_points(const Span<float3> positions,
+ const Span<float> radii,
+ const float density)
+{
+ /* Create a new grid that will be filled. #ParticlesToLevelSet requires the background value to
+ * be positive. It will be set to zero later on. */
+ openvdb::FloatGrid::Ptr new_grid = openvdb::FloatGrid::create(1.0f);
+
+ /* Create a narrow-band level set grid based on the positions and radii. */
+ openvdb::tools::ParticlesToLevelSet op{*new_grid};
+ /* Don't ignore particles based on their radius. */
+ op.setRmin(0.0f);
+ op.setRmax(FLT_MAX);
+ ParticleList particles{positions, radii};
+ op.rasterizeSpheres(particles);
+ op.finalize();
+
+ /* Convert the level set to a fog volume. This also sets the background value to zero. Inside the
+ * fog there will be a density of 1. */
+ openvdb::tools::sdfToFogVolume(*new_grid);
+
+ /* Take the desired density into account. */
+ openvdb::tools::foreach (new_grid->beginValueOn(),
+ [&](const openvdb::FloatGrid::ValueOnIter &iter) {
+ iter.modifyValue([&](float &value) { value *= density; });
+ });
+ return new_grid;
+}
+
+static float compute_voxel_size(const GeoNodeExecParams &params,
+ Span<float3> positions,
+ const float radius)
+{
+ const NodeGeometryPointsToVolume &storage =
+ *(const NodeGeometryPointsToVolume *)params.node().storage;
+
+ if (storage.resolution_mode == GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_SIZE) {
+ return params.get_input<float>("Voxel Size");
+ }
+
+ if (positions.is_empty()) {
+ return 0.0f;
+ }
+
+ float3 min, max;
+ INIT_MINMAX(min, max);
+ minmax_v3v3_v3_array(min, max, (float(*)[3])positions.data(), positions.size());
+
+ const float voxel_amount = params.get_input<float>("Voxel Amount");
+ if (voxel_amount <= 1) {
+ return 0.0f;
+ }
+
+ /* The voxel size adapts to the final size of the volume. */
+ const float diagonal = float3::distance(min, max);
+ const float extended_diagonal = diagonal + 2.0f * radius;
+ const float voxel_size = extended_diagonal / voxel_amount;
+ return voxel_size;
+}
+
+static void gather_point_data_from_component(const GeoNodeExecParams &params,
+ const GeometryComponent &component,
+ Vector<float3> &r_positions,
+ Vector<float> &r_radii)
+{
+ Float3ReadAttribute positions = component.attribute_get_for_read<float3>(
+ "position", ATTR_DOMAIN_POINT, {0, 0, 0});
+ FloatReadAttribute radii = params.get_input_attribute<float>(
+ "Radius", component, ATTR_DOMAIN_POINT, 0.0f);
+
+ r_positions.extend(positions.get_span());
+ r_radii.extend(radii.get_span());
+}
+
+static void convert_to_grid_index_space(const float voxel_size,
+ MutableSpan<float3> positions,
+ MutableSpan<float> 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;
+ }
+}
+
+static void initialize_volume_component_from_points(const GeometrySet &geometry_set_in,
+ GeometrySet &geometry_set_out,
+ const GeoNodeExecParams &params)
+{
+ Vector<float3> positions;
+ Vector<float> radii;
+
+ if (geometry_set_in.has<MeshComponent>()) {
+ gather_point_data_from_component(
+ params, *geometry_set_in.get_component_for_read<MeshComponent>(), positions, radii);
+ }
+ if (geometry_set_in.has<PointCloudComponent>()) {
+ gather_point_data_from_component(
+ params, *geometry_set_in.get_component_for_read<PointCloudComponent>(), positions, radii);
+ }
+
+ const float max_radius = *std::max_element(radii.begin(), radii.end());
+ const float voxel_size = compute_voxel_size(params, positions, max_radius);
+ if (voxel_size == 0.0f || positions.is_empty()) {
+ return;
+ }
+
+ Volume *volume = (Volume *)BKE_id_new_nomain(ID_VO, nullptr);
+ BKE_volume_init_grids(volume);
+
+ VolumeGrid *c_density_grid = BKE_volume_grid_add(volume, "density", VOLUME_GRID_FLOAT);
+ openvdb::FloatGrid::Ptr density_grid = openvdb::gridPtrCast<openvdb::FloatGrid>(
+ BKE_volume_grid_openvdb_for_write(volume, c_density_grid, false));
+
+ const float density = params.get_input<float>("Density");
+ convert_to_grid_index_space(voxel_size, positions, radii);
+ openvdb::FloatGrid::Ptr new_grid = generate_volume_from_points(positions, radii, density);
+ /* This merge is cheap, because the #density_grid is empty. */
+ density_grid->merge(*new_grid);
+ density_grid->transform().postScale(voxel_size);
+
+ VolumeComponent &volume_component = geometry_set_out.get_component_for_write<VolumeComponent>();
+ volume_component.replace(volume);
+}
+#endif
+
+static void geo_node_points_to_volume_exec(GeoNodeExecParams params)
+{
+ GeometrySet geometry_set_in = params.extract_input<GeometrySet>("Geometry");
+ GeometrySet geometry_set_out;
+
+ /* TODO: Read-only access to instances should be supported here, for now they are made real. */
+ geometry_set_in = geometry_set_realize_instances(geometry_set_in);
+
+#ifdef WITH_OPENVDB
+ initialize_volume_component_from_points(geometry_set_in, geometry_set_out, params);
+#endif
+
+ params.set_output("Geometry", std::move(geometry_set_out));
+}
+
+static void geo_node_points_to_volume_init(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ NodeGeometryPointsToVolume *data = (NodeGeometryPointsToVolume *)MEM_callocN(
+ sizeof(NodeGeometryPointsToVolume), __func__);
+ data->resolution_mode = GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_AMOUNT;
+ data->input_type_radius = GEO_NODE_ATTRIBUTE_INPUT_FLOAT;
+ node->storage = data;
+
+ bNodeSocket *radius_attribute_socket = nodeFindSocket(node, SOCK_IN, "Radius");
+ bNodeSocketValueString *radius_attribute_socket_value =
+ (bNodeSocketValueString *)radius_attribute_socket->default_value;
+ STRNCPY(radius_attribute_socket_value->value, "radius");
+}
+
+static void geo_node_points_to_volume_update(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ NodeGeometryPointsToVolume *data = (NodeGeometryPointsToVolume *)node->storage;
+ bNodeSocket *voxel_size_socket = nodeFindSocket(node, SOCK_IN, "Voxel Size");
+ bNodeSocket *voxel_amount_socket = nodeFindSocket(node, SOCK_IN, "Voxel Amount");
+ nodeSetSocketAvailability(voxel_amount_socket,
+ data->resolution_mode ==
+ GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_AMOUNT);
+ nodeSetSocketAvailability(
+ voxel_size_socket, data->resolution_mode == GEO_NODE_POINTS_TO_VOLUME_RESOLUTION_MODE_SIZE);
+
+ update_attribute_input_socket_availabilities(
+ *node, "Radius", (GeometryNodeAttributeInputMode)data->input_type_radius);
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_points_to_volume()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(
+ &ntype, GEO_NODE_POINTS_TO_VOLUME, "Points to Volume", NODE_CLASS_GEOMETRY, 0);
+ node_type_socket_templates(&ntype, geo_node_points_to_volume_in, geo_node_point_translate_out);
+ node_type_storage(&ntype,
+ "NodeGeometryPointsToVolume",
+ node_free_standard_storage,
+ node_copy_standard_storage);
+ node_type_size(&ntype, 170, 120, 700);
+ node_type_init(&ntype, blender::nodes::geo_node_points_to_volume_init);
+ node_type_update(&ntype, blender::nodes::geo_node_points_to_volume_update);
+ ntype.geometry_node_execute = blender::nodes::geo_node_points_to_volume_exec;
+ ntype.draw_buttons = geo_node_points_to_volume_layout;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc
index 543859aef3f..47304a0de68 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc
@@ -20,6 +20,9 @@
#include "BKE_subdiv.h"
#include "BKE_subdiv_mesh.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "node_geometry_util.hh"
static bNodeSocketTemplate geo_node_subdivision_surface_in[] = {
@@ -36,11 +39,24 @@ static bNodeSocketTemplate geo_node_subdivision_surface_out[] = {
{-1, ""},
};
+static void geo_node_subdivision_surface_layout(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *UNUSED(ptr))
+{
+#ifndef WITH_OPENSUBDIV
+ uiItemL(layout, IFACE_("Disabled, built without OpenSubdiv"), ICON_ERROR);
+#else
+ UNUSED_VARS(layout);
+#endif
+}
+
namespace blender::nodes {
static void geo_node_subdivision_surface_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
if (!geometry_set.has_mesh()) {
params.set_output("Geometry", geometry_set);
return;
@@ -93,7 +109,8 @@ static void geo_node_subdivision_surface_exec(GeoNodeExecParams params)
Mesh *mesh_out = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh_in);
BKE_mesh_calc_normals(mesh_out);
- geometry_set.replace_mesh(mesh_out);
+ MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+ mesh_component.replace_mesh_but_keep_vertex_group_names(mesh_out);
// BKE_subdiv_stats_print(&subdiv->stats);
BKE_subdiv_free(subdiv);
@@ -112,5 +129,6 @@ void register_node_type_geo_subdivision_surface()
node_type_socket_templates(
&ntype, geo_node_subdivision_surface_in, geo_node_subdivision_surface_out);
ntype.geometry_node_execute = blender::nodes::geo_node_subdivision_surface_exec;
+ ntype.draw_buttons = geo_node_subdivision_surface_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc
new file mode 100644
index 00000000000..2a0cb727cd6
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc
@@ -0,0 +1,115 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BKE_mesh.h"
+#include "BKE_subdiv.h"
+#include "BKE_subdiv_mesh.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "node_geometry_util.hh"
+
+static bNodeSocketTemplate geo_node_subdivision_surface_simple_in[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_INT, N_("Level"), 1, 0, 0, 0, 0, 6},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_subdivision_surface_simple_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+namespace blender::nodes {
+
+static void geo_node_subdivision_surface_simple_exec(GeoNodeExecParams params)
+{
+ GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+
+ if (!geometry_set.has_mesh()) {
+ params.set_output("Geometry", geometry_set);
+ return;
+ }
+
+#ifndef WITH_OPENSUBDIV
+ params.error_message_add(NodeWarningType::Error,
+ "Disabled, Blender was built without OpenSubdiv");
+ params.set_output("Geometry", std::move(geometry_set));
+ return;
+#endif
+
+ /* See CCGSUBSURF_LEVEL_MAX for max limit. */
+ const int subdiv_level = clamp_i(params.extract_input<int>("Level"), 0, 11);
+
+ if (subdiv_level == 0) {
+ params.set_output("Geometry", std::move(geometry_set));
+ return;
+ }
+
+ const Mesh *mesh_in = geometry_set.get_mesh_for_read();
+
+ /* Initialize mesh settings. */
+ SubdivToMeshSettings mesh_settings;
+ mesh_settings.resolution = (1 << subdiv_level) + 1;
+ mesh_settings.use_optimal_display = false;
+
+ /* Initialize subdivision settings. */
+ SubdivSettings subdiv_settings;
+ subdiv_settings.is_simple = true;
+ subdiv_settings.is_adaptive = false;
+ subdiv_settings.use_creases = false;
+ subdiv_settings.level = 1;
+ subdiv_settings.vtx_boundary_interpolation = BKE_subdiv_vtx_boundary_interpolation_from_subsurf(
+ 0);
+ subdiv_settings.fvar_linear_interpolation = BKE_subdiv_fvar_interpolation_from_uv_smooth(0);
+
+ /* Apply subdivision from mesh. */
+ Subdiv *subdiv = BKE_subdiv_update_from_mesh(nullptr, &subdiv_settings, mesh_in);
+
+ /* In case of bad topology, skip to input mesh. */
+ if (subdiv == nullptr) {
+ params.set_output("Geometry", std::move(geometry_set));
+ return;
+ }
+
+ Mesh *mesh_out = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh_in);
+ BKE_mesh_calc_normals(mesh_out);
+
+ geometry_set.replace_mesh(mesh_out);
+
+ BKE_subdiv_free(subdiv);
+
+ params.set_output("Geometry", std::move(geometry_set));
+}
+} // namespace blender::nodes
+
+void register_node_type_geo_subdivision_surface_simple()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(&ntype,
+ GEO_NODE_SUBDIVISION_SURFACE_SIMPLE,
+ "Simple Subdivision Surface",
+ NODE_CLASS_GEOMETRY,
+ 0);
+ node_type_socket_templates(
+ &ntype, geo_node_subdivision_surface_simple_in, geo_node_subdivision_surface_simple_out);
+ ntype.geometry_node_execute = blender::nodes::geo_node_subdivision_surface_simple_exec;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_transform.cc b/source/blender/nodes/geometry/nodes/node_geo_transform.cc
index 1fcd1063993..539a7551be9 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_transform.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_transform.cc
@@ -14,11 +14,19 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#ifdef WITH_OPENVDB
+# include <openvdb/openvdb.h>
+#endif
+
#include "BLI_math_matrix.h"
#include "DNA_pointcloud_types.h"
+#include "DNA_volume_types.h"
#include "BKE_mesh.h"
+#include "BKE_volume.h"
+
+#include "DEG_depsgraph_query.h"
#include "node_geometry_util.hh"
@@ -109,6 +117,43 @@ static void transform_instances(InstancesComponent &instances,
}
}
+static void transform_volume(Volume *volume,
+ const float3 translation,
+ const float3 rotation,
+ const float3 scale,
+ GeoNodeExecParams &params)
+{
+#ifdef WITH_OPENVDB
+ /* Scaling an axis to zero is not supported for volumes. */
+ const float3 limited_scale = {
+ (scale.x == 0.0f) ? FLT_EPSILON : scale.x,
+ (scale.y == 0.0f) ? FLT_EPSILON : scale.y,
+ (scale.z == 0.0f) ? FLT_EPSILON : scale.z,
+ };
+
+ Main *bmain = DEG_get_bmain(params.depsgraph());
+ BKE_volume_load(volume, bmain);
+
+ float matrix[4][4];
+ loc_eul_size_to_mat4(matrix, translation, rotation, limited_scale);
+
+ openvdb::Mat4s vdb_matrix;
+ memcpy(vdb_matrix.asPointer(), matrix, sizeof(float[4][4]));
+ openvdb::Mat4d vdb_matrix_d{vdb_matrix};
+
+ const int num_grids = BKE_volume_num_grids(volume);
+ for (const int i : IndexRange(num_grids)) {
+ VolumeGrid *volume_grid = BKE_volume_grid_get(volume, i);
+
+ openvdb::GridBase::Ptr grid = BKE_volume_grid_openvdb_for_write(volume, volume_grid, false);
+ openvdb::math::Transform &grid_transform = grid->transform();
+ grid_transform.postMult(vdb_matrix_d);
+ }
+#else
+ UNUSED_VARS(volume, translation, rotation, scale, params);
+#endif
+}
+
static void geo_node_transform_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
@@ -131,6 +176,11 @@ static void geo_node_transform_exec(GeoNodeExecParams params)
transform_instances(instances, translation, rotation, scale);
}
+ if (geometry_set.has_volume()) {
+ Volume *volume = geometry_set.get_volume_for_write();
+ transform_volume(volume, translation, rotation, scale, params);
+ }
+
params.set_output("Geometry", std::move(geometry_set));
}
} // namespace blender::nodes
diff --git a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc
index c224731ad9f..0c754ad3b37 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc
@@ -18,6 +18,9 @@
#include "RNA_enum_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
#include "node_geometry_util.hh"
extern "C" {
@@ -39,6 +42,12 @@ static bNodeSocketTemplate geo_node_triangulate_out[] = {
{-1, ""},
};
+static void geo_node_triangulate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "quad_method", 0, "", ICON_NONE);
+ uiItemR(layout, ptr, "ngon_method", 0, "", ICON_NONE);
+}
+
static void geo_triangulate_init(bNodeTree *UNUSED(ntree), bNode *node)
{
node->custom1 = GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE;
@@ -56,6 +65,8 @@ static void geo_node_triangulate_exec(GeoNodeExecParams params)
GeometryNodeTriangulateNGons ngon_method = static_cast<GeometryNodeTriangulateNGons>(
params.node().custom2);
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
/* #triangulate_mesh might modify the input mesh currently. */
Mesh *mesh_in = geometry_set.get_mesh_for_write();
if (mesh_in != nullptr) {
@@ -75,5 +86,6 @@ void register_node_type_geo_triangulate()
node_type_socket_templates(&ntype, geo_node_triangulate_in, geo_node_triangulate_out);
node_type_init(&ntype, geo_triangulate_init);
ntype.geometry_node_execute = blender::nodes::geo_node_triangulate_exec;
+ ntype.draw_buttons = geo_node_triangulate_layout;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
new file mode 100644
index 00000000000..54dccb613a1
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
@@ -0,0 +1,171 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "DEG_depsgraph_query.h"
+#ifdef WITH_OPENVDB
+# include <openvdb/tools/GridTransformer.h>
+# include <openvdb/tools/VolumeToMesh.h>
+#endif
+
+#include "node_geometry_util.hh"
+
+#include "BKE_lib_id.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
+#include "BKE_volume.h"
+#include "BKE_volume_to_mesh.hh"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+static bNodeSocketTemplate geo_node_volume_to_mesh_in[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_STRING, N_("Grid")},
+ {SOCK_FLOAT, N_("Voxel Size"), 0.3f, 0.0f, 0.0f, 0.0f, 0.01f, FLT_MAX},
+ {SOCK_FLOAT, N_("Voxel Amount"), 64.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
+ {SOCK_FLOAT, N_("Threshold"), 0.1f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
+ {SOCK_FLOAT, N_("Adaptivity"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_volume_to_mesh_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+static void geo_node_volume_to_mesh_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiLayoutSetPropSep(layout, true);
+ uiLayoutSetPropDecorate(layout, false);
+ uiItemR(layout, ptr, "resolution_mode", 0, IFACE_("Resolution"), ICON_NONE);
+}
+
+namespace blender::nodes {
+
+static void geo_node_volume_to_mesh_init(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ NodeGeometryVolumeToMesh *data = (NodeGeometryVolumeToMesh *)MEM_callocN(
+ sizeof(NodeGeometryVolumeToMesh), __func__);
+ data->resolution_mode = VOLUME_TO_MESH_RESOLUTION_MODE_GRID;
+
+ bNodeSocket *grid_socket = nodeFindSocket(node, SOCK_IN, "Grid");
+ bNodeSocketValueString *grid_socket_value = (bNodeSocketValueString *)grid_socket->default_value;
+ STRNCPY(grid_socket_value->value, "density");
+
+ node->storage = data;
+}
+
+static void geo_node_volume_to_mesh_update(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ NodeGeometryVolumeToMesh *data = (NodeGeometryVolumeToMesh *)node->storage;
+
+ bNodeSocket *voxel_size_socket = nodeFindSocket(node, SOCK_IN, "Voxel Size");
+ bNodeSocket *voxel_amount_socket = nodeFindSocket(node, SOCK_IN, "Voxel Amount");
+ nodeSetSocketAvailability(voxel_amount_socket,
+ data->resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_AMOUNT);
+ nodeSetSocketAvailability(voxel_size_socket,
+ data->resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE);
+}
+
+#ifdef WITH_OPENVDB
+
+static void create_mesh_from_volume(GeometrySet &geometry_set_in,
+ GeometrySet &geometry_set_out,
+ GeoNodeExecParams &params)
+{
+ if (!geometry_set_in.has<VolumeComponent>()) {
+ return;
+ }
+
+ const NodeGeometryVolumeToMesh &storage =
+ *(const NodeGeometryVolumeToMesh *)params.node().storage;
+
+ bke::VolumeToMeshResolution resolution;
+ resolution.mode = (VolumeToMeshResolutionMode)storage.resolution_mode;
+ if (resolution.mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_AMOUNT) {
+ resolution.settings.voxel_amount = params.get_input<float>("Voxel Amount");
+ if (resolution.settings.voxel_amount <= 0.0f) {
+ return;
+ }
+ }
+ else if (resolution.mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE) {
+ resolution.settings.voxel_size = params.get_input<float>("Voxel Size");
+ if (resolution.settings.voxel_size <= 0.0f) {
+ return;
+ }
+ }
+
+ const VolumeComponent *component = geometry_set_in.get_component_for_read<VolumeComponent>();
+ const Volume *volume = component->get_for_read();
+ if (volume == nullptr) {
+ return;
+ }
+
+ Main *bmain = DEG_get_bmain(params.depsgraph());
+ BKE_volume_load(const_cast<Volume *>(volume), bmain);
+
+ const std::string grid_name = params.get_input<std::string>("Grid");
+ VolumeGrid *volume_grid = BKE_volume_grid_find(volume, grid_name.c_str());
+ if (volume_grid == nullptr) {
+ return;
+ }
+
+ float threshold = params.get_input<float>("Threshold");
+ float adaptivity = params.get_input<float>("Adaptivity");
+
+ const openvdb::GridBase::ConstPtr grid = BKE_volume_grid_openvdb_for_read(volume, volume_grid);
+ Mesh *mesh = bke::volume_to_mesh(*grid, resolution, threshold, adaptivity);
+ if (mesh == nullptr) {
+ return;
+ }
+ MeshComponent &dst_component = geometry_set_out.get_component_for_write<MeshComponent>();
+ dst_component.replace(mesh);
+}
+
+#endif /* WITH_OPENVDB */
+
+static void geo_node_volume_to_mesh_exec(GeoNodeExecParams params)
+{
+ GeometrySet geometry_set_in = params.extract_input<GeometrySet>("Geometry");
+ GeometrySet geometry_set_out;
+
+#ifdef WITH_OPENVDB
+ create_mesh_from_volume(geometry_set_in, geometry_set_out, params);
+#endif
+
+ params.set_output("Geometry", geometry_set_out);
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_volume_to_mesh()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(&ntype, GEO_NODE_VOLUME_TO_MESH, "Volume to Mesh", NODE_CLASS_GEOMETRY, 0);
+ node_type_socket_templates(&ntype, geo_node_volume_to_mesh_in, geo_node_volume_to_mesh_out);
+ node_type_storage(
+ &ntype, "NodeGeometryVolumeToMesh", node_free_standard_storage, node_copy_standard_storage);
+ node_type_size(&ntype, 200, 120, 700);
+ node_type_init(&ntype, blender::nodes::geo_node_volume_to_mesh_init);
+ node_type_update(&ntype, blender::nodes::geo_node_volume_to_mesh_update);
+ ntype.geometry_node_execute = blender::nodes::geo_node_volume_to_mesh_exec;
+ ntype.draw_buttons = geo_node_volume_to_mesh_layout;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/nodes/intern/derived_node_tree.cc b/source/blender/nodes/intern/derived_node_tree.cc
index c693047ff40..f5a0e14f18b 100644
--- a/source/blender/nodes/intern/derived_node_tree.cc
+++ b/source/blender/nodes/intern/derived_node_tree.cc
@@ -91,7 +91,7 @@ DNode &DerivedNodeTree::create_node(const NodeRef &node_ref,
for (int i : node.inputs_.index_range()) {
const InputSocketRef &socket_ref = node_ref.input(i);
DInputSocket &socket = *node.inputs_[i];
-
+ socket.is_multi_input_socket_ = socket_ref.bsocket()->flag & SOCK_MULTI_INPUT;
socket.id_ = UNINITIALIZED_ID;
socket.node_ = &node;
socket.socket_ref_ = &socket_ref;
diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc
index eef2c6c9125..532f9955a62 100644
--- a/source/blender/nodes/intern/node_geometry_exec.cc
+++ b/source/blender/nodes/intern/node_geometry_exec.cc
@@ -14,19 +14,40 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include "DNA_modifier_types.h"
+
+#include "BKE_node_ui_storage.hh"
+
+#include "DEG_depsgraph_query.h"
+
+#include "NOD_derived_node_tree.hh"
#include "NOD_geometry_exec.hh"
#include "NOD_type_callbacks.hh"
+#include "node_geometry_util.hh"
+
namespace blender::nodes {
+void GeoNodeExecParams::error_message_add(const NodeWarningType type, std::string message) const
+{
+ bNodeTree *btree_cow = node_.node_ref().tree().btree();
+ BLI_assert(btree_cow != nullptr);
+ if (btree_cow == nullptr) {
+ return;
+ }
+ bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow);
+
+ const NodeTreeEvaluationContext context(*self_object_, *modifier_);
+
+ BKE_nodetree_error_message_add(
+ *btree_original, context, *node_.bnode(), type, std::move(message));
+}
+
const bNodeSocket *GeoNodeExecParams::find_available_socket(const StringRef name) const
{
- LISTBASE_FOREACH (const bNodeSocket *, socket, &node_.inputs) {
- if ((socket->flag & SOCK_UNAVAIL) != 0) {
- continue;
- }
- if (name == socket->name) {
- return socket;
+ for (const DSocket *socket : node_.inputs()) {
+ if (socket->is_available() && socket->name() == name) {
+ return socket->bsocket();
}
}
@@ -47,7 +68,19 @@ ReadAttributePtr GeoNodeExecParams::get_input_attribute(const StringRef name,
if (found_socket->type == SOCK_STRING) {
const std::string name = this->get_input<std::string>(found_socket->identifier);
- return component.attribute_get_for_read(name, domain, type, default_value);
+ /* Try getting the attribute without the default value. */
+ ReadAttributePtr attribute = component.attribute_try_get_for_read(name, domain, type);
+ if (attribute) {
+ return attribute;
+ }
+
+ /* If the attribute doesn't exist, use the default value and output an error message
+ * (except when the field is empty, to avoid spamming error messages). */
+ if (!name.empty()) {
+ this->error_message_add(NodeWarningType::Error,
+ std::string("No attribute with name '") + name + "'.");
+ }
+ return component.attribute_get_constant_for_read(domain, type, default_value);
}
if (found_socket->type == SOCK_FLOAT) {
const float value = this->get_input<float>(found_socket->identifier);
@@ -104,22 +137,57 @@ CustomDataType GeoNodeExecParams::get_input_attribute_data_type(
return default_type;
}
+/**
+ * If any of the corresponding input sockets are attributes instead of single values,
+ * use the highest priority attribute domain from among them.
+ * Otherwise return the default domain.
+ */
+AttributeDomain GeoNodeExecParams::get_highest_priority_input_domain(
+ Span<std::string> names,
+ const GeometryComponent &component,
+ const AttributeDomain default_domain) const
+{
+ Vector<AttributeDomain, 8> input_domains;
+ for (const std::string &name : names) {
+ const bNodeSocket *found_socket = this->find_available_socket(name);
+ BLI_assert(found_socket != nullptr); /* A socket should be available socket for the name. */
+ if (found_socket == nullptr) {
+ continue;
+ }
+
+ if (found_socket->type == SOCK_STRING) {
+ const std::string name = this->get_input<std::string>(found_socket->identifier);
+ ReadAttributePtr attribute = component.attribute_try_get_for_read(name);
+ if (attribute) {
+ input_domains.append(attribute->domain());
+ }
+ }
+ }
+
+ if (input_domains.size() > 0) {
+ return bke::attribute_domain_highest_priority(input_domains);
+ }
+
+ return default_domain;
+}
+
void GeoNodeExecParams::check_extract_input(StringRef identifier,
const CPPType *requested_type) const
{
bNodeSocket *found_socket = nullptr;
- LISTBASE_FOREACH (bNodeSocket *, socket, &node_.inputs) {
- if (identifier == socket->identifier) {
- found_socket = socket;
+ for (const DSocket *socket : node_.inputs()) {
+ if (socket->identifier() == identifier) {
+ found_socket = socket->bsocket();
break;
}
}
+
if (found_socket == nullptr) {
std::cout << "Did not find an input socket with the identifier '" << identifier << "'.\n";
std::cout << "Possible identifiers are: ";
- LISTBASE_FOREACH (bNodeSocket *, socket, &node_.inputs) {
- if ((socket->flag & SOCK_UNAVAIL) == 0) {
- std::cout << "'" << socket->identifier << "', ";
+ for (const DSocket *socket : node_.inputs()) {
+ if (socket->is_available()) {
+ std::cout << "'" << socket->identifier() << "', ";
}
}
std::cout << "\n";
@@ -149,18 +217,19 @@ void GeoNodeExecParams::check_extract_input(StringRef identifier,
void GeoNodeExecParams::check_set_output(StringRef identifier, const CPPType &value_type) const
{
bNodeSocket *found_socket = nullptr;
- LISTBASE_FOREACH (bNodeSocket *, socket, &node_.outputs) {
- if (identifier == socket->identifier) {
- found_socket = socket;
+ for (const DSocket *socket : node_.outputs()) {
+ if (socket->identifier() == identifier) {
+ found_socket = socket->bsocket();
break;
}
}
+
if (found_socket == nullptr) {
std::cout << "Did not find an output socket with the identifier '" << identifier << "'.\n";
std::cout << "Possible identifiers are: ";
- LISTBASE_FOREACH (bNodeSocket *, socket, &node_.outputs) {
- if ((socket->flag & SOCK_UNAVAIL) == 0) {
- std::cout << "'" << socket->identifier << "', ";
+ for (const DSocket *socket : node_.outputs()) {
+ if (socket->is_available()) {
+ std::cout << "'" << socket->identifier() << "', ";
}
}
std::cout << "\n";
diff --git a/source/blender/nodes/intern/node_tree_multi_function.cc b/source/blender/nodes/intern/node_tree_multi_function.cc
index 2e4196af156..c2391667e86 100644
--- a/source/blender/nodes/intern/node_tree_multi_function.cc
+++ b/source/blender/nodes/intern/node_tree_multi_function.cc
@@ -19,6 +19,7 @@
#include "FN_multi_function_network_evaluation.hh"
#include "BLI_color.hh"
+#include "BLI_float2.hh"
#include "BLI_float3.hh"
namespace blender::nodes {
@@ -191,27 +192,58 @@ static void add_implicit_conversion(DataTypeConversions &conversions,
static DataTypeConversions create_implicit_conversions()
{
DataTypeConversions conversions;
- add_implicit_conversion<float, int32_t>(conversions);
+ add_implicit_conversion<float, float2>(conversions);
add_implicit_conversion<float, float3>(conversions);
- add_implicit_conversion<int32_t, float>(conversions);
+ add_implicit_conversion<float, int32_t>(conversions);
add_implicit_conversion<float, bool>(conversions);
- add_implicit_conversion<bool, float>(conversions);
- add_implicit_conversion<float3, float>(
- conversions, "Vector Length", [](float3 a) { return a.length(); });
- add_implicit_conversion<int32_t, float3>(
- conversions, "int32 to float3", [](int32_t a) { return float3((float)a); });
- add_implicit_conversion<float3, Color4f>(
- conversions, "float3 to Color4f", [](float3 a) { return Color4f(a.x, a.y, a.z, 1.0f); });
- add_implicit_conversion<Color4f, float3>(
- conversions, "Color4f to float3", [](Color4f a) { return float3(a.r, a.g, a.b); });
add_implicit_conversion<float, Color4f>(
conversions, "float to Color4f", [](float a) { return Color4f(a, a, a, 1.0f); });
- add_implicit_conversion<Color4f, float>(
- conversions, "Color4f to float", [](Color4f a) { return rgb_to_grayscale(a); });
+
+ add_implicit_conversion<float2, float3>(
+ conversions, "float2 to float3", [](float2 a) { return float3(a.x, a.y, 0.0f); });
+ add_implicit_conversion<float2, float>(
+ conversions, "float2 to float", [](float2 a) { return a.length(); });
+ add_implicit_conversion<float2, int32_t>(
+ conversions, "float2 to int32_t", [](float2 a) { return (int32_t)a.length(); });
+ add_implicit_conversion<float2, bool>(
+ conversions, "float2 to bool", [](float2 a) { return a.length_squared() == 0.0f; });
+ add_implicit_conversion<float2, Color4f>(
+ conversions, "float2 to Color4f", [](float2 a) { return Color4f(a.x, a.y, 0.0f, 1.0f); });
+
add_implicit_conversion<float3, bool>(
conversions, "float3 to boolean", [](float3 a) { return a.length_squared() == 0.0f; });
+ add_implicit_conversion<float3, float>(
+ conversions, "Vector Length", [](float3 a) { return a.length(); });
+ add_implicit_conversion<float3, int32_t>(
+ conversions, "float3 to int32_t", [](float3 a) { return (int)a.length(); });
+ add_implicit_conversion<float3, float2>(conversions);
+ add_implicit_conversion<float3, Color4f>(
+ conversions, "float3 to Color4f", [](float3 a) { return Color4f(a.x, a.y, a.z, 1.0f); });
+
+ add_implicit_conversion<int32_t, bool>(conversions);
+ add_implicit_conversion<int32_t, float>(conversions);
+ add_implicit_conversion<int32_t, float2>(
+ conversions, "int32 to float2", [](int32_t a) { return float2((float)a); });
+ add_implicit_conversion<int32_t, float3>(
+ conversions, "int32 to float3", [](int32_t a) { return float3((float)a); });
+
+ add_implicit_conversion<bool, float>(conversions);
+ add_implicit_conversion<bool, int32_t>(conversions);
+ add_implicit_conversion<bool, float2>(
+ conversions, "boolean to float2", [](bool a) { return (a) ? float2(1.0f) : float2(0.0f); });
add_implicit_conversion<bool, float3>(
conversions, "boolean to float3", [](bool a) { return (a) ? float3(1.0f) : float3(0.0f); });
+ add_implicit_conversion<bool, Color4f>(conversions, "boolean to Color4f", [](bool a) {
+ return (a) ? Color4f(1.0f, 1.0f, 1.0f, 1.0f) : Color4f(0.0f, 0.0f, 0.0f, 1.0f);
+ });
+
+ add_implicit_conversion<Color4f, float>(
+ conversions, "Color4f to float", [](Color4f a) { return rgb_to_grayscale(a); });
+ add_implicit_conversion<Color4f, float2>(
+ conversions, "Color4f to float2", [](Color4f a) { return float2(a.r, a.g); });
+ add_implicit_conversion<Color4f, float3>(
+ conversions, "Color4f to float3", [](Color4f a) { return float3(a.r, a.g, a.b); });
+
return conversions;
}
diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c
index 9669dc6496b..c7c3ced4e56 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -281,25 +281,30 @@ static int node_count_links(bNodeTree *ntree, bNodeSocket *sock)
return count;
}
-/* find an eligible socket for linking */
+/* Find an eligible socket for linking. */
static bNodeSocket *node_find_linkable_socket(bNodeTree *ntree, bNode *node, bNodeSocket *cur)
{
- /* link swapping: try to find a free slot with a matching name */
-
bNodeSocket *first = cur->in_out == SOCK_IN ? node->inputs.first : node->outputs.first;
bNodeSocket *sock;
- sock = cur->next ? cur->next : first; /* wrap around the list end */
+ /* Iterate over all sockets of the target node, to find one that matches the same socket type.
+ * The idea behind this is: When a user connects an input to a socket that is
+ * already linked (and if its not an Multi Input Socket), we try to find a replacement socket for
+ * the link that we try to overwrite and connect that previous link to the new socket. */
+ sock = cur->next ? cur->next : first; /* Wrap around the list end. */
while (sock != cur) {
if (!nodeSocketIsHidden(sock) && node_link_socket_match(sock, cur)) {
- int link_count = node_count_links(ntree, sock);
- /* take +1 into account since we would add a new link */
- if (link_count + 1 <= nodeSocketLinkLimit(sock)) {
- return sock; /* found a valid free socket we can swap to */
- }
+ break;
}
+ sock = sock->next ? sock->next : first; /* Wrap around the list end. */
+ }
- sock = sock->next ? sock->next : first; /* wrap around the list end */
+ if (!nodeSocketIsHidden(sock) && node_link_socket_match(sock, cur)) {
+ int link_count = node_count_links(ntree, sock);
+ /* Take +1 into account since we would add a new link. */
+ if (link_count + 1 <= nodeSocketLinkLimit(sock)) {
+ return sock; /* Found a valid free socket we can swap to. */
+ }
}
return NULL;
}
@@ -309,7 +314,6 @@ void node_insert_link_default(bNodeTree *ntree, bNode *node, bNodeLink *link)
bNodeSocket *sock = link->tosock;
bNodeLink *tlink, *tlink_next;
- /* inputs can have one link only, outputs can have unlimited links */
if (node != link->tonode) {
return;
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c
index 5d3a9dfc025..36971d4e799 100644
--- a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c
+++ b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c
@@ -46,7 +46,9 @@ static int node_shader_gpu_ambient_occlusion(GPUMaterial *mat,
GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE);
- return GPU_stack_link(mat, node, "node_ambient_occlusion", in, out);
+ float inverted = node->custom2 ? 1.0f : 0.0f;
+
+ return GPU_stack_link(mat, node, "node_ambient_occlusion", in, out, GPU_constant(&inverted));
}
static void node_shader_init_ambient_occlusion(bNodeTree *UNUSED(ntree), bNode *node)
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
index e0fcce6f617..5fc946e3509 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
@@ -49,6 +49,10 @@ static int node_shader_gpu_bsdf_glass(GPUMaterial *mat,
GPU_link(mat, "world_normals_get", &in[3].link);
}
+ if (node->custom1 == SHD_GLOSSY_SHARP) {
+ GPU_link(mat, "set_value_zero", &in[1].link);
+ }
+
GPU_material_flag_set(mat, GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT);
float use_multi_scatter = (node->custom1 == SHD_GLOSSY_MULTI_GGX) ? 1.0f : 0.0f;
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
index b9f0e793a61..f601f3e9fd0 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
@@ -134,54 +134,32 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat,
GPU_link(mat, "set_rgb_one", &sss_scale);
}
- /* Due to the manual effort done per config, we only optimize the most common permutations. */
- char *node_name;
- uint flag = 0;
- if (!use_subsurf && use_diffuse && !use_refract && !use_clear) {
- static char name[] = "node_bsdf_principled_dielectric";
- node_name = name;
- flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY;
+ uint flag = GPU_MATFLAG_GLOSSY;
+ if (use_diffuse) {
+ flag |= GPU_MATFLAG_DIFFUSE;
}
- else if (!use_subsurf && !use_diffuse && !use_refract && !use_clear) {
- static char name[] = "node_bsdf_principled_metallic";
- node_name = name;
- flag = GPU_MATFLAG_GLOSSY;
+ if (use_refract) {
+ flag |= GPU_MATFLAG_REFRACT;
}
- else if (!use_subsurf && !use_diffuse && !use_refract && use_clear) {
- static char name[] = "node_bsdf_principled_clearcoat";
- node_name = name;
- flag = GPU_MATFLAG_GLOSSY;
- }
- else if (use_subsurf && use_diffuse && !use_refract && !use_clear) {
- static char name[] = "node_bsdf_principled_subsurface";
- node_name = name;
- flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY;
- }
- else if (!use_subsurf && !use_diffuse && use_refract && !use_clear && !socket_not_zero(4)) {
- static char name[] = "node_bsdf_principled_glass";
- node_name = name;
- flag = GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT;
- }
- else {
- static char name[] = "node_bsdf_principled";
- node_name = name;
- flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT;
- }
-
if (use_subsurf) {
flag |= GPU_MATFLAG_SSS;
}
+ float f_use_diffuse = use_diffuse ? 1.0f : 0.0f;
+ float f_use_clearcoat = use_clear ? 1.0f : 0.0f;
+ float f_use_refraction = use_refract ? 1.0f : 0.0f;
float use_multi_scatter = (node->custom1 == SHD_GLOSSY_MULTI_GGX) ? 1.0f : 0.0f;
GPU_material_flag_set(mat, flag);
return GPU_stack_link(mat,
node,
- node_name,
+ "node_bsdf_principled",
in,
out,
- GPU_builtin(GPU_VIEW_POSITION),
+ GPU_constant(&f_use_diffuse),
+ GPU_constant(&f_use_clearcoat),
+ GPU_constant(&f_use_refraction),
GPU_constant(&use_multi_scatter),
GPU_constant(&node->ssr_id),
GPU_constant(&node->sss_id),
diff --git a/source/blender/nodes/texture/node_texture_util.c b/source/blender/nodes/texture/node_texture_util.c
index 96a0be6babc..2091a8bf10e 100644
--- a/source/blender/nodes/texture/node_texture_util.c
+++ b/source/blender/nodes/texture/node_texture_util.c
@@ -146,7 +146,7 @@ void tex_output(bNode *node,
}
if (!out->data) {
- /* Freed in tex_end_exec (node.c) */
+ /* Freed in tex_end_exec (node.cc) */
dg = out->data = MEM_mallocN(sizeof(TexDelegate), "tex delegate");
}
else {
diff --git a/source/blender/python/bmesh/bmesh_py_ops.c b/source/blender/python/bmesh/bmesh_py_ops.c
index 03a890d315c..b23891ca1fe 100644
--- a/source/blender/python/bmesh/bmesh_py_ops.c
+++ b/source/blender/python/bmesh/bmesh_py_ops.c
@@ -167,11 +167,7 @@ static PyTypeObject bmesh_op_Type = {
0, /* tp_itemsize */
/* methods */
NULL, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
+ 0, /* tp_vectorcall_offset */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL,
@@ -249,7 +245,7 @@ static PyTypeObject bmesh_op_Type = {
static PyObject *bpy_bmesh_ops_module_getattro(PyObject *UNUSED(self), PyObject *pyname)
{
- const char *opname = _PyUnicode_AsString(pyname);
+ const char *opname = PyUnicode_AsUTF8(pyname);
if (BMO_opcode_from_opname(opname) != -1) {
return bpy_bmesh_op_CreatePyObject(opname);
diff --git a/source/blender/python/bmesh/bmesh_py_ops_call.c b/source/blender/python/bmesh/bmesh_py_ops_call.c
index d0676ec1947..28daf08507d 100644
--- a/source/blender/python/bmesh/bmesh_py_ops_call.c
+++ b/source/blender/python/bmesh/bmesh_py_ops_call.c
@@ -184,7 +184,7 @@ static int bpy_slot_from_py(BMesh *bm,
if (slot->slot_subtype.intg == BMO_OP_SLOT_SUBTYPE_INT_ENUM) {
int enum_val = -1;
PyC_FlagSet *items = (PyC_FlagSet *)slot->data.enum_data.flags;
- const char *enum_str = _PyUnicode_AsString(value);
+ const char *enum_str = PyUnicode_AsUTF8(value);
if (enum_str == NULL) {
PyErr_Format(PyExc_TypeError,
@@ -787,7 +787,7 @@ PyObject *BPy_BMO_call(BPy_BMeshOpFunc *self, PyObject *args, PyObject *kw)
PyObject *key, *value;
Py_ssize_t pos = 0;
while (PyDict_Next(kw, &pos, &key, &value)) {
- const char *slot_name = _PyUnicode_AsString(key);
+ const char *slot_name = PyUnicode_AsUTF8(key);
BMOpSlot *slot;
if (!BMO_slot_exists(bmop.slots_in, slot_name)) {
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c
index 38122c45ef1..5fca6f4cec6 100644
--- a/source/blender/python/bmesh/bmesh_py_types.c
+++ b/source/blender/python/bmesh/bmesh_py_types.c
@@ -293,7 +293,7 @@ static int bpy_bmesh_select_mode_set(BPy_BMesh *self, PyObject *value)
return -1;
}
if (flag == 0) {
- PyErr_SetString(PyExc_TypeError, "bm.select_mode: cant assignt an empty value");
+ PyErr_SetString(PyExc_TypeError, "bm.select_mode: can't assign an empty value");
return -1;
}
@@ -1079,7 +1079,12 @@ PyDoc_STRVAR(
" :arg cage: Get the mesh as a deformed cage.\n"
" :type cage: boolean\n"
" :arg face_normals: Calculate face normals.\n"
- " :type face_normals: boolean\n");
+ " :type face_normals: boolean\n"
+ "\n"
+ " .. deprecated:: 2.93\n"
+ "\n"
+ " The deform parameter is deprecated, assumed to be True, and will be removed in version "
+ "3.0.\n");
static PyObject *bpy_bmesh_from_object(BPy_BMesh *self, PyObject *args, PyObject *kw)
{
static const char *kwlist[] = {"object", "depsgraph", "deform", "cage", "face_normals", NULL};
@@ -1120,45 +1125,36 @@ static PyObject *bpy_bmesh_from_object(BPy_BMesh *self, PyObject *args, PyObject
return NULL;
}
+ if (use_deform == false) {
+ PyErr_WarnEx(PyExc_FutureWarning,
+ "from_object(...): the deform parameter is deprecated, assumed to be True, and "
+ "will be removed in version 3.0",
+ 1);
+ }
+
const bool use_render = DEG_get_mode(depsgraph) == DAG_EVAL_RENDER;
scene_eval = DEG_get_evaluated_scene(depsgraph);
ob_eval = DEG_get_evaluated_object(depsgraph, ob);
bool need_free = false;
/* Write the display mesh into the dummy mesh */
- if (use_deform) {
- if (use_render) {
- if (use_cage) {
- PyErr_SetString(PyExc_ValueError,
- "from_object(...): cage arg is unsupported when dependency graph "
- "evaluation mode is RENDER");
- return NULL;
- }
-
- me_eval = BKE_mesh_new_from_object(depsgraph, ob_eval, true);
- need_free = true;
- }
- else {
- if (use_cage) {
- me_eval = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, &data_masks);
- }
- else {
- me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, &data_masks);
- }
- }
- }
- else {
- /* !use_deform */
+ if (use_render) {
if (use_cage) {
PyErr_SetString(PyExc_ValueError,
- "from_object(...): cage arg is unsupported when deform=False");
+ "from_object(...): cage arg is unsupported when dependency graph "
+ "evaluation mode is RENDER");
return NULL;
}
- if (use_render) {
- me_eval = mesh_create_eval_no_deform_render(depsgraph, scene_eval, ob, &data_masks);
+
+ me_eval = BKE_mesh_new_from_object(depsgraph, ob_eval, true);
+ need_free = true;
+ }
+ else {
+ if (use_cage) {
+ me_eval = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, &data_masks);
}
else {
- me_eval = mesh_create_eval_no_deform(depsgraph, scene_eval, ob, &data_masks);
+ me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, &data_masks);
}
}
@@ -3758,37 +3754,31 @@ PyObject *BPyInit_bmesh_types(void)
submodule = PyModule_Create(&BPy_BM_types_module_def);
-#define MODULE_TYPE_ADD(s, t) \
- PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \
- Py_INCREF((PyObject *)&t)
-
/* bmesh_py_types.c */
- MODULE_TYPE_ADD(submodule, BPy_BMesh_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMVert_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMEdge_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMFace_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMLoop_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMElemSeq_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMVertSeq_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMEdgeSeq_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMFaceSeq_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMLoopSeq_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMIter_Type);
+ PyModule_AddType(submodule, &BPy_BMesh_Type);
+ PyModule_AddType(submodule, &BPy_BMVert_Type);
+ PyModule_AddType(submodule, &BPy_BMEdge_Type);
+ PyModule_AddType(submodule, &BPy_BMFace_Type);
+ PyModule_AddType(submodule, &BPy_BMLoop_Type);
+ PyModule_AddType(submodule, &BPy_BMElemSeq_Type);
+ PyModule_AddType(submodule, &BPy_BMVertSeq_Type);
+ PyModule_AddType(submodule, &BPy_BMEdgeSeq_Type);
+ PyModule_AddType(submodule, &BPy_BMFaceSeq_Type);
+ PyModule_AddType(submodule, &BPy_BMLoopSeq_Type);
+ PyModule_AddType(submodule, &BPy_BMIter_Type);
/* bmesh_py_types_select.c */
- MODULE_TYPE_ADD(submodule, BPy_BMEditSelSeq_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMEditSelIter_Type);
+ PyModule_AddType(submodule, &BPy_BMEditSelSeq_Type);
+ PyModule_AddType(submodule, &BPy_BMEditSelIter_Type);
/* bmesh_py_types_customdata.c */
- MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessVert_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessEdge_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessFace_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessLoop_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMLayerCollection_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMLayerItem_Type);
+ PyModule_AddType(submodule, &BPy_BMLayerAccessVert_Type);
+ PyModule_AddType(submodule, &BPy_BMLayerAccessEdge_Type);
+ PyModule_AddType(submodule, &BPy_BMLayerAccessFace_Type);
+ PyModule_AddType(submodule, &BPy_BMLayerAccessLoop_Type);
+ PyModule_AddType(submodule, &BPy_BMLayerCollection_Type);
+ PyModule_AddType(submodule, &BPy_BMLayerItem_Type);
/* bmesh_py_types_meshdata.c */
- MODULE_TYPE_ADD(submodule, BPy_BMLoopUV_Type);
- MODULE_TYPE_ADD(submodule, BPy_BMDeformVert_Type);
-
-#undef MODULE_TYPE_ADD
+ PyModule_AddType(submodule, &BPy_BMLoopUV_Type);
+ PyModule_AddType(submodule, &BPy_BMDeformVert_Type);
return submodule;
}
diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c
index 96c36f2d788..471a311c411 100644
--- a/source/blender/python/bmesh/bmesh_py_types_customdata.c
+++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c
@@ -804,7 +804,7 @@ static PyObject *bpy_bmlayercollection_subscript(BPy_BMLayerCollection *self, Py
{
/* don't need error check here */
if (PyUnicode_Check(key)) {
- return bpy_bmlayercollection_subscript_str(self, _PyUnicode_AsString(key));
+ return bpy_bmlayercollection_subscript_str(self, PyUnicode_AsUTF8(key));
}
if (PyIndex_Check(key)) {
const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
@@ -862,7 +862,7 @@ static PyObject *bpy_bmlayercollection_subscript(BPy_BMLayerCollection *self, Py
static int bpy_bmlayercollection_contains(BPy_BMLayerCollection *self, PyObject *value)
{
- const char *keyname = _PyUnicode_AsString(value);
+ const char *keyname = PyUnicode_AsUTF8(value);
CustomData *data;
int index;
diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c
index fd996c8a1a2..c329ea7965c 100644
--- a/source/blender/python/generic/idprop_py_api.c
+++ b/source/blender/python/generic/idprop_py_api.c
@@ -189,13 +189,13 @@ static int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject
st = (char *)PyC_UnicodeAsByte(value, &value_coerce);
alloc_len = strlen(st) + 1;
- st = _PyUnicode_AsString(value);
+ st = PyUnicode_AsUTF8(value);
IDP_ResizeArray(prop, alloc_len);
memcpy(IDP_Array(prop), st, alloc_len);
Py_XDECREF(value_coerce);
}
# else
- st = _PyUnicode_AsString(value);
+ st = PyUnicode_AsUTF8(value);
IDP_ResizeArray(prop, strlen(st) + 1);
strcpy(IDP_Array(prop), st);
# endif
@@ -253,7 +253,7 @@ static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *UNUS
return -1;
}
- name = _PyUnicode_AsStringAndSize(value, &name_size);
+ name = PyUnicode_AsUTF8AndSize(value, &name_size);
if (name_size >= MAX_IDPROP_NAME) {
PyErr_SetString(PyExc_TypeError, "string length cannot exceed 63 characters!");
@@ -300,7 +300,7 @@ static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
return NULL;
}
- name = _PyUnicode_AsString(item);
+ name = PyUnicode_AsUTF8(item);
if (name == NULL) {
PyErr_SetString(PyExc_TypeError, "only strings are allowed as keys of ID properties");
@@ -358,7 +358,7 @@ static const char *idp_try_read_name(PyObject *name_obj)
const char *name = NULL;
if (name_obj) {
Py_ssize_t name_size;
- name = _PyUnicode_AsStringAndSize(name_obj, &name_size);
+ name = PyUnicode_AsUTF8AndSize(name_obj, &name_size);
if (name == NULL) {
PyErr_Format(PyExc_KeyError,
@@ -420,7 +420,7 @@ static IDProperty *idp_from_PyUnicode(const char *name, PyObject *ob)
prop = IDP_New(IDP_STRING, &val, name);
Py_XDECREF(value_coerce);
#else
- val.str = _PyUnicode_AsString(ob);
+ val.str = PyUnicode_AsUTF8(ob);
prop = IDP_New(IDP_STRING, val, name);
#endif
return prop;
@@ -722,7 +722,7 @@ int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val)
if (val == NULL) { /* del idprop[key] */
IDProperty *pkey;
- const char *name = _PyUnicode_AsString(key);
+ const char *name = PyUnicode_AsUTF8(key);
if (name == NULL) {
PyErr_Format(PyExc_KeyError, "expected a string, not %.200s", Py_TYPE(key)->tp_name);
@@ -1050,7 +1050,7 @@ static PyObject *BPy_IDGroup_items(BPy_IDProperty *self)
static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value)
{
- const char *name = _PyUnicode_AsString(value);
+ const char *name = PyUnicode_AsUTF8(value);
if (!name) {
PyErr_Format(PyExc_TypeError, "expected a string, not a %.200s", Py_TYPE(value)->tp_name);
@@ -1192,12 +1192,8 @@ PyTypeObject BPy_IDGroup_Type = {
/* Methods to implement standard operations */
- NULL, /* destructor tp_dealloc; */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
+ NULL, /* destructor tp_dealloc; */
+ 0, /* tp_vectorcall_offset */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL, /* cmpfunc tp_compare; */
@@ -1605,12 +1601,8 @@ PyTypeObject BPy_IDArray_Type = {
/* Methods to implement standard operations */
- NULL, /* destructor tp_dealloc; */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
+ NULL, /* destructor tp_dealloc; */
+ 0, /* tp_vectorcall_offset */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL, /* cmpfunc tp_compare; */
@@ -1726,12 +1718,8 @@ PyTypeObject BPy_IDGroup_Iter_Type = {
/* Methods to implement standard operations */
- NULL, /* destructor tp_dealloc; */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
+ NULL, /* destructor tp_dealloc; */
+ 0, /* tp_vectorcall_offset */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL, /* cmpfunc tp_compare; */
@@ -1811,16 +1799,10 @@ static PyObject *BPyInit_idprop_types(void)
IDProp_Init_Types();
-#define MODULE_TYPE_ADD(s, t) \
- PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \
- Py_INCREF((PyObject *)&t)
-
/* bmesh_py_types.c */
- MODULE_TYPE_ADD(submodule, BPy_IDGroup_Type);
- MODULE_TYPE_ADD(submodule, BPy_IDGroup_Iter_Type);
- MODULE_TYPE_ADD(submodule, BPy_IDArray_Type);
-
-#undef MODULE_TYPE_ADD
+ PyModule_AddType(submodule, &BPy_IDGroup_Type);
+ PyModule_AddType(submodule, &BPy_IDGroup_Iter_Type);
+ PyModule_AddType(submodule, &BPy_IDArray_Type);
return submodule;
}
diff --git a/source/blender/python/generic/imbuf_py_api.c b/source/blender/python/generic/imbuf_py_api.c
index 24029f0ca12..fe72f267a5d 100644
--- a/source/blender/python/generic/imbuf_py_api.c
+++ b/source/blender/python/generic/imbuf_py_api.c
@@ -267,7 +267,7 @@ static int py_imbuf_filepath_set(Py_ImBuf *self, PyObject *value, void *UNUSED(c
ImBuf *ibuf = self->ibuf;
const Py_ssize_t value_str_len_max = sizeof(ibuf->name);
Py_ssize_t value_str_len;
- const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len);
+ const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len);
if (value_str_len >= value_str_len_max) {
PyErr_Format(PyExc_TypeError, "filepath length over %zd", value_str_len_max - 1);
return -1;
@@ -347,15 +347,11 @@ PyTypeObject Py_ImBuf_Type = {
/* Methods to implement standard operations */
(destructor)py_imbuf_dealloc, /* destructor tp_dealloc; */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
- NULL, /* cmpfunc tp_compare; */
- (reprfunc)py_imbuf_repr, /* reprfunc tp_repr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* cmpfunc tp_compare; */
+ (reprfunc)py_imbuf_repr, /* reprfunc tp_repr; */
/* Method suites for standard classes */
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index d944cb435d0..82e65505147 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -257,7 +257,7 @@ int PyC_ParseBool(PyObject *o, void *p)
int PyC_ParseStringEnum(PyObject *o, void *p)
{
struct PyC_StringEnum *e = p;
- const char *value = _PyUnicode_AsString(o);
+ const char *value = PyUnicode_AsUTF8(o);
if (value == NULL) {
PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name);
return 0;
@@ -282,6 +282,17 @@ int PyC_ParseStringEnum(PyObject *o, void *p)
return 0;
}
+const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items,
+ const int value)
+{
+ for (int i = 0; items[i].id; i++) {
+ if (items[i].value == value) {
+ return items[i].id;
+ }
+ }
+ return NULL;
+}
+
/* silly function, we dont use arg. just check its compatible with __deepcopy__ */
int PyC_CheckArgs_DeepCopy(PyObject *args)
{
@@ -343,7 +354,7 @@ void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var)
(int)var->ob_refcnt,
(void *)var,
type ? type->tp_name : null_str,
- var_str ? _PyUnicode_AsString(var_str) : "<error>");
+ var_str ? PyUnicode_AsUTF8(var_str) : "<error>");
if (var_str != NULL) {
Py_DECREF(var_str);
}
@@ -405,7 +416,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno)
/* when executing a script */
if (r_filename) {
- *r_filename = _PyUnicode_AsString(frame->f_code->co_filename);
+ *r_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
}
/* when executing a module */
@@ -418,7 +429,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno)
if (mod) {
PyObject *mod_file = PyModule_GetFilenameObject(mod);
if (mod_file) {
- *r_filename = _PyUnicode_AsString(mod_name);
+ *r_filename = PyUnicode_AsUTF8(mod_name);
Py_DECREF(mod_file);
}
else {
@@ -428,7 +439,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno)
/* unlikely, fallback */
if (*r_filename == NULL) {
- *r_filename = _PyUnicode_AsString(mod_name);
+ *r_filename = PyUnicode_AsUTF8(mod_name);
}
}
}
@@ -569,9 +580,9 @@ void PyC_Err_PrintWithFunc(PyObject *py_func)
/* use py style error */
fprintf(stderr,
"File \"%s\", line %d, in %s\n",
- _PyUnicode_AsString(f_code->co_filename),
+ PyUnicode_AsUTF8(f_code->co_filename),
f_code->co_firstlineno,
- _PyUnicode_AsString(((PyFunctionObject *)py_func)->func_name));
+ PyUnicode_AsUTF8(((PyFunctionObject *)py_func)->func_name));
}
/** \} */
@@ -740,7 +751,7 @@ const char *PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObjec
{
const char *result;
- result = _PyUnicode_AsStringAndSize(py_str, size);
+ result = PyUnicode_AsUTF8AndSize(py_str, size);
if (result) {
/* 99% of the time this is enough but we better support non unicode
@@ -767,7 +778,7 @@ const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
{
const char *result;
- result = _PyUnicode_AsString(py_str);
+ result = PyUnicode_AsUTF8(py_str);
if (result) {
/* 99% of the time this is enough but we better support non unicode
@@ -865,11 +876,11 @@ bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[])
}
/* restore MUST be called after this */
-void PyC_MainModule_Backup(PyObject **main_mod)
+void PyC_MainModule_Backup(PyObject **r_main_mod)
{
PyObject *modules = PyImport_GetModuleDict();
- *main_mod = PyDict_GetItemString(modules, "__main__");
- Py_XINCREF(*main_mod); /* don't free */
+ *r_main_mod = PyDict_GetItemString(modules, "__main__");
+ Py_XINCREF(*r_main_mod); /* don't free */
}
void PyC_MainModule_Restore(PyObject *main_mod)
@@ -879,40 +890,6 @@ void PyC_MainModule_Restore(PyObject *main_mod)
Py_XDECREF(main_mod);
}
-/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name #Py_SetPythonHome Wrapper
- * \{ */
-
-/**
- * - Must be called before #Py_Initialize.
- * - Expects output of `BKE_appdir_folder_id(BLENDER_PYTHON, NULL)`.
- * - Note that the `PYTHONPATH` environment variable isn't reliable, see T31506.
- * Use #Py_SetPythonHome instead.
- */
-void PyC_SetHomePath(const char *py_path_bundle)
-{
-# ifdef __APPLE__
- /* OSX allow file/directory names to contain : character (represented as / in the Finder)
- * but current Python lib (release 3.1.1) doesn't handle these correctly */
- if (strchr(py_path_bundle, ':')) {
- fprintf(stderr,
- "Warning! Blender application is located in a path containing ':' or '/' chars\n"
- "This may make python import function fail\n");
- }
-# endif
-
- /* Set the environment path. */
- wchar_t py_path_bundle_wchar[1024];
-
- /* Can't use `mbstowcs` on linux gives bug: T23018. */
- BLI_strncpy_wchar_from_utf8(
- py_path_bundle_wchar, py_path_bundle, ARRAY_SIZE(py_path_bundle_wchar));
-
- Py_SetPythonHome(py_path_bundle_wchar);
-}
-
bool PyC_IsInterpreterActive(void)
{
/* instead of PyThreadState_Get, which calls Py_FatalError */
@@ -1180,7 +1157,7 @@ int PyC_FlagSet_ToBitfield(PyC_FlagSet *items,
*r_value = 0;
while (_PySet_NextEntry(value, &pos, &key, &hash)) {
- const char *param = _PyUnicode_AsString(key);
+ const char *param = PyUnicode_AsUTF8(key);
if (param == NULL) {
PyErr_Format(PyExc_TypeError,
@@ -1358,7 +1335,7 @@ bool PyC_RunString_AsStringAndSize(const char *imports[],
const char *val;
Py_ssize_t val_len;
- val = _PyUnicode_AsStringAndSize(retval, &val_len);
+ val = PyUnicode_AsUTF8AndSize(retval, &val_len);
if (val == NULL && PyErr_Occurred()) {
ok = false;
}
@@ -1483,7 +1460,6 @@ uint32_t PyC_Long_AsU32(PyObject *value)
/* -------------------------------------------------------------------- */
/** \name Py_buffer Utils
- *
* \{ */
char PyC_StructFmt_type_from_str(const char *typestr)
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index f0875b82c3c..842e1482c06 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -85,11 +85,9 @@ PyObject *PyC_DefaultNameSpace(const char *filename);
void PyC_RunQuicky(const char *filepath, int n, ...);
bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[]);
-void PyC_MainModule_Backup(PyObject **main_mod);
+void PyC_MainModule_Backup(PyObject **r_main_mod);
void PyC_MainModule_Restore(PyObject *main_mod);
-void PyC_SetHomePath(const char *py_path_bundle);
-
bool PyC_IsInterpreterActive(void);
void *PyC_RNA_AsPointer(PyObject *value, const char *type_name);
@@ -142,6 +140,8 @@ struct PyC_StringEnum {
};
int PyC_ParseStringEnum(PyObject *o, void *p);
+const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items,
+ const int value);
int PyC_CheckArgs_DeepCopy(PyObject *args);
diff --git a/source/blender/python/gpu/CMakeLists.txt b/source/blender/python/gpu/CMakeLists.txt
index 7f6fd9eefab..fe5c559fcc0 100644
--- a/source/blender/python/gpu/CMakeLists.txt
+++ b/source/blender/python/gpu/CMakeLists.txt
@@ -33,25 +33,37 @@ set(INC_SYS
)
set(SRC
+ gpu_py.c
gpu_py_api.c
gpu_py_batch.c
+ gpu_py_buffer.c
gpu_py_element.c
+ gpu_py_framebuffer.c
gpu_py_matrix.c
gpu_py_offscreen.c
gpu_py_select.c
gpu_py_shader.c
+ gpu_py_state.c
+ gpu_py_texture.c
gpu_py_types.c
+ gpu_py_uniformbuffer.c
gpu_py_vertex_buffer.c
gpu_py_vertex_format.c
+ gpu_py.h
gpu_py_api.h
gpu_py_batch.h
+ gpu_py_buffer.h
gpu_py_element.h
+ gpu_py_framebuffer.h
gpu_py_matrix.h
gpu_py_offscreen.h
gpu_py_select.h
gpu_py_shader.h
+ gpu_py_state.h
+ gpu_py_texture.h
gpu_py_types.h
+ gpu_py_uniformbuffer.h
gpu_py_vertex_buffer.h
gpu_py_vertex_format.h
)
diff --git a/source/blender/python/gpu/gpu_py.c b/source/blender/python/gpu/gpu_py.c
new file mode 100644
index 00000000000..2c5daaf1962
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py.c
@@ -0,0 +1,60 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "GPU_primitive.h"
+#include "GPU_texture.h"
+
+#include "../generic/py_capi_utils.h"
+
+#include "gpu_py.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+/** \name GPU Enums
+ * \{ */
+
+struct PyC_StringEnumItems bpygpu_primtype_items[] = {
+ {GPU_PRIM_POINTS, "POINTS"},
+ {GPU_PRIM_LINES, "LINES"},
+ {GPU_PRIM_TRIS, "TRIS"},
+ {GPU_PRIM_LINE_STRIP, "LINE_STRIP"},
+ {GPU_PRIM_LINE_LOOP, "LINE_LOOP"},
+ {GPU_PRIM_TRI_STRIP, "TRI_STRIP"},
+ {GPU_PRIM_TRI_FAN, "TRI_FAN"},
+ {GPU_PRIM_LINES_ADJ, "LINES_ADJ"},
+ {GPU_PRIM_TRIS_ADJ, "TRIS_ADJ"},
+ {GPU_PRIM_LINE_STRIP_ADJ, "LINE_STRIP_ADJ"},
+ {0, NULL},
+};
+
+struct PyC_StringEnumItems bpygpu_dataformat_items[] = {
+ {GPU_DATA_FLOAT, "FLOAT"},
+ {GPU_DATA_INT, "INT"},
+ {GPU_DATA_UINT, "UINT"},
+ {GPU_DATA_UBYTE, "UBYTE"},
+ {GPU_DATA_UINT_24_8, "UINT_24_8"},
+ {GPU_DATA_10_11_11_REV, "10_11_11_REV"},
+ {0, NULL},
+};
+/** \} */
diff --git a/source/blender/python/gpu/gpu_py.h b/source/blender/python/gpu/gpu_py.h
new file mode 100644
index 00000000000..28b3e41a08f
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py.h
@@ -0,0 +1,24 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ */
+
+#pragma once
+
+extern struct PyC_StringEnumItems bpygpu_primtype_items[];
+extern struct PyC_StringEnumItems bpygpu_dataformat_items[];
diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c
index 33130291162..7213dc59886 100644
--- a/source/blender/python/gpu/gpu_py_api.c
+++ b/source/blender/python/gpu/gpu_py_api.c
@@ -31,10 +31,10 @@
#include "../generic/python_utildefines.h"
#include "GPU_init_exit.h"
-#include "GPU_primitive.h"
#include "gpu_py_matrix.h"
#include "gpu_py_select.h"
+#include "gpu_py_state.h"
#include "gpu_py_types.h"
#include "gpu_py_api.h" /* own include */
@@ -58,60 +58,16 @@ bool bpygpu_is_init_or_error(void)
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Primitive Type Utils
- * \{ */
-
-int bpygpu_ParsePrimType(PyObject *o, void *p)
-{
- Py_ssize_t mode_id_len;
- const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len);
- if (mode_id == NULL) {
- PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name);
- return 0;
- }
-#define MATCH_ID(id) \
- if (mode_id_len == strlen(STRINGIFY(id))) { \
- if (STREQ(mode_id, STRINGIFY(id))) { \
- mode = GPU_PRIM_##id; \
- goto success; \
- } \
- } \
- ((void)0)
-
- GPUPrimType mode;
- MATCH_ID(POINTS);
- MATCH_ID(LINES);
- MATCH_ID(TRIS);
- MATCH_ID(LINE_STRIP);
- MATCH_ID(LINE_LOOP);
- MATCH_ID(TRI_STRIP);
- MATCH_ID(TRI_FAN);
- MATCH_ID(LINES_ADJ);
- MATCH_ID(TRIS_ADJ);
- MATCH_ID(LINE_STRIP_ADJ);
-
-#undef MATCH_ID
- PyErr_Format(PyExc_ValueError, "unknown type literal: '%s'", mode_id);
- return 0;
-
-success:
- (*(GPUPrimType *)p) = mode;
- return 1;
-}
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
/** \name GPU Module
* \{ */
-PyDoc_STRVAR(GPU_doc,
+PyDoc_STRVAR(pygpu_doc,
"This module provides Python wrappers for the GPU implementation in Blender.\n"
"Some higher level functions can be found in the `gpu_extras` module.");
-static struct PyModuleDef GPU_module_def = {
+static struct PyModuleDef pygpu_module_def = {
PyModuleDef_HEAD_INIT,
.m_name = "gpu",
- .m_doc = GPU_doc,
+ .m_doc = pygpu_doc,
};
PyObject *BPyInit_gpu(void)
@@ -120,18 +76,21 @@ PyObject *BPyInit_gpu(void)
PyObject *submodule;
PyObject *mod;
- mod = PyModule_Create(&GPU_module_def);
+ mod = PyModule_Create(&pygpu_module_def);
+
+ PyModule_AddObject(mod, "types", (submodule = bpygpu_types_init()));
+ PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types()));
+ PyModule_AddObject(mod, "matrix", (submodule = bpygpu_matrix_init()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix()));
+ PyModule_AddObject(mod, "select", (submodule = bpygpu_select_init()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select()));
+ PyModule_AddObject(mod, "shader", (submodule = bpygpu_shader_init()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader()));
+ PyModule_AddObject(mod, "state", (submodule = bpygpu_state_init()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
return mod;
diff --git a/source/blender/python/gpu/gpu_py_api.h b/source/blender/python/gpu/gpu_py_api.h
index b8f0cde129f..5e399a233aa 100644
--- a/source/blender/python/gpu/gpu_py_api.h
+++ b/source/blender/python/gpu/gpu_py_api.h
@@ -20,7 +20,9 @@
#pragma once
-int bpygpu_ParsePrimType(PyObject *o, void *p);
+/* Each type object could have a method for free GPU resources.
+ * However, it is currently of little use. */
+// #define BPYGPU_USE_GPUOBJ_FREE_METHOD
PyObject *BPyInit_gpu(void);
diff --git a/source/blender/python/gpu/gpu_py_batch.c b/source/blender/python/gpu/gpu_py_batch.c
index 9fb7aea162a..9989077670b 100644
--- a/source/blender/python/gpu/gpu_py_batch.c
+++ b/source/blender/python/gpu/gpu_py_batch.c
@@ -38,17 +38,19 @@
#include "../generic/py_capi_utils.h"
+#include "gpu_py.h"
#include "gpu_py_api.h"
-#include "gpu_py_batch.h" /* own include */
#include "gpu_py_element.h"
#include "gpu_py_shader.h"
#include "gpu_py_vertex_buffer.h"
+#include "gpu_py_batch.h" /* own include */
+
/* -------------------------------------------------------------------- */
/** \name Utility Functions
* \{ */
-static bool py_batch_is_program_or_error(BPyGPUBatch *self)
+static bool pygpu_batch_is_program_or_error(BPyGPUBatch *self)
{
if (!self->batch->shader) {
PyErr_SetString(PyExc_RuntimeError, "batch does not have any program assigned to it");
@@ -63,56 +65,50 @@ static bool py_batch_is_program_or_error(BPyGPUBatch *self)
/** \name GPUBatch Type
* \{ */
-static PyObject *py_Batch_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+static PyObject *pygpu_batch__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
{
BPYGPU_IS_INIT_OR_ERROR_OBJ;
const char *exc_str_missing_arg = "GPUBatch.__new__() missing required argument '%s' (pos %d)";
- struct {
- GPUPrimType type_id;
- BPyGPUVertBuf *py_vertbuf;
- BPyGPUIndexBuf *py_indexbuf;
- } params = {GPU_PRIM_NONE, NULL, NULL};
+ struct PyC_StringEnum prim_type = {bpygpu_primtype_items, GPU_PRIM_NONE};
+ BPyGPUVertBuf *py_vertbuf = NULL;
+ BPyGPUIndexBuf *py_indexbuf = NULL;
static const char *_keywords[] = {"type", "buf", "elem", NULL};
static _PyArg_Parser _parser = {"|$O&O!O!:GPUBatch.__new__", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(args,
kwds,
&_parser,
- bpygpu_ParsePrimType,
- &params.type_id,
+ PyC_ParseStringEnum,
+ &prim_type,
&BPyGPUVertBuf_Type,
- &params.py_vertbuf,
+ &py_vertbuf,
&BPyGPUIndexBuf_Type,
- &params.py_indexbuf)) {
+ &py_indexbuf)) {
return NULL;
}
- if (params.type_id == GPU_PRIM_NONE) {
- PyErr_Format(PyExc_TypeError, exc_str_missing_arg, _keywords[0], 1);
- return NULL;
- }
+ BLI_assert(prim_type.value_found != GPU_PRIM_NONE);
- if (params.py_vertbuf == NULL) {
+ if (py_vertbuf == NULL) {
PyErr_Format(PyExc_TypeError, exc_str_missing_arg, _keywords[1], 2);
return NULL;
}
- GPUBatch *batch = GPU_batch_create(params.type_id,
- params.py_vertbuf->buf,
- params.py_indexbuf ? params.py_indexbuf->elem : NULL);
+ GPUBatch *batch = GPU_batch_create(
+ prim_type.value_found, py_vertbuf->buf, py_indexbuf ? py_indexbuf->elem : NULL);
BPyGPUBatch *ret = (BPyGPUBatch *)BPyGPUBatch_CreatePyObject(batch);
#ifdef USE_GPU_PY_REFERENCES
- ret->references = PyList_New(params.py_indexbuf ? 2 : 1);
- PyList_SET_ITEM(ret->references, 0, (PyObject *)params.py_vertbuf);
- Py_INCREF(params.py_vertbuf);
+ ret->references = PyList_New(py_indexbuf ? 2 : 1);
+ PyList_SET_ITEM(ret->references, 0, (PyObject *)py_vertbuf);
+ Py_INCREF(py_vertbuf);
- if (params.py_indexbuf != NULL) {
- PyList_SET_ITEM(ret->references, 1, (PyObject *)params.py_indexbuf);
- Py_INCREF(params.py_indexbuf);
+ if (py_indexbuf != NULL) {
+ PyList_SET_ITEM(ret->references, 1, (PyObject *)py_indexbuf);
+ Py_INCREF(py_indexbuf);
}
PyObject_GC_Track(ret);
@@ -121,7 +117,7 @@ static PyObject *py_Batch_new(PyTypeObject *UNUSED(type), PyObject *args, PyObje
return (PyObject *)ret;
}
-PyDoc_STRVAR(py_Batch_vertbuf_add_doc,
+PyDoc_STRVAR(pygpu_batch_vertbuf_add_doc,
".. method:: vertbuf_add(buf)\n"
"\n"
" Add another vertex buffer to the Batch.\n"
@@ -134,7 +130,7 @@ PyDoc_STRVAR(py_Batch_vertbuf_add_doc,
" :param buf: The vertex buffer that will be added to the batch.\n"
" :type buf: :class:`gpu.types.GPUVertBuf`\n"
);
-static PyObject *py_Batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf)
+static PyObject *pygpu_batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf)
{
if (!BPyGPUVertBuf_Check(py_buf)) {
PyErr_Format(PyExc_TypeError, "Expected a GPUVertBuf, got %s", Py_TYPE(py_buf)->tp_name);
@@ -167,7 +163,7 @@ static PyObject *py_Batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf)
}
PyDoc_STRVAR(
- py_Batch_program_set_doc,
+ pygpu_batch_program_set_doc,
".. method:: program_set(program)\n"
"\n"
" Assign a shader to this batch that will be used for drawing when not overwritten later.\n"
@@ -177,7 +173,7 @@ PyDoc_STRVAR(
"\n"
" :param program: The program/shader the batch will use in future draw calls.\n"
" :type program: :class:`gpu.types.GPUShader`\n");
-static PyObject *py_Batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader)
+static PyObject *pygpu_batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader)
{
if (!BPyGPUShader_Check(py_shader)) {
PyErr_Format(PyExc_TypeError, "Expected a GPUShader, got %s", Py_TYPE(py_shader)->tp_name);
@@ -208,7 +204,7 @@ static PyObject *py_Batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_Batch_draw_doc,
+PyDoc_STRVAR(pygpu_batch_draw_doc,
".. method:: draw(program=None)\n"
"\n"
" Run the drawing program with the parameters assigned to the batch.\n"
@@ -216,7 +212,7 @@ PyDoc_STRVAR(py_Batch_draw_doc,
" :param program: Program that performs the drawing operations.\n"
" If ``None`` is passed, the last program set to this batch will run.\n"
" :type program: :class:`gpu.types.GPUShader`\n");
-static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args)
+static PyObject *pygpu_batch_draw(BPyGPUBatch *self, PyObject *args)
{
BPyGPUShader *py_program = NULL;
@@ -224,7 +220,7 @@ static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args)
return NULL;
}
if (py_program == NULL) {
- if (!py_batch_is_program_or_error(self)) {
+ if (!pygpu_batch_is_program_or_error(self)) {
return NULL;
}
}
@@ -236,42 +232,42 @@ static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args)
Py_RETURN_NONE;
}
-static PyObject *py_Batch_program_use_begin(BPyGPUBatch *self)
+static PyObject *pygpu_batch_program_use_begin(BPyGPUBatch *self)
{
- if (!py_batch_is_program_or_error(self)) {
+ if (!pygpu_batch_is_program_or_error(self)) {
return NULL;
}
GPU_shader_bind(self->batch->shader);
Py_RETURN_NONE;
}
-static PyObject *py_Batch_program_use_end(BPyGPUBatch *self)
+static PyObject *pygpu_batch_program_use_end(BPyGPUBatch *self)
{
- if (!py_batch_is_program_or_error(self)) {
+ if (!pygpu_batch_is_program_or_error(self)) {
return NULL;
}
GPU_shader_unbind();
Py_RETURN_NONE;
}
-static struct PyMethodDef py_Batch_methods[] = {
- {"vertbuf_add", (PyCFunction)py_Batch_vertbuf_add, METH_O, py_Batch_vertbuf_add_doc},
- {"program_set", (PyCFunction)py_Batch_program_set, METH_O, py_Batch_program_set_doc},
- {"draw", (PyCFunction)py_Batch_draw, METH_VARARGS, py_Batch_draw_doc},
- {"_program_use_begin", (PyCFunction)py_Batch_program_use_begin, METH_NOARGS, ""},
- {"_program_use_end", (PyCFunction)py_Batch_program_use_end, METH_NOARGS, ""},
+static struct PyMethodDef pygpu_batch__tp_methods[] = {
+ {"vertbuf_add", (PyCFunction)pygpu_batch_vertbuf_add, METH_O, pygpu_batch_vertbuf_add_doc},
+ {"program_set", (PyCFunction)pygpu_batch_program_set, METH_O, pygpu_batch_program_set_doc},
+ {"draw", (PyCFunction)pygpu_batch_draw, METH_VARARGS, pygpu_batch_draw_doc},
+ {"_program_use_begin", (PyCFunction)pygpu_batch_program_use_begin, METH_NOARGS, ""},
+ {"_program_use_end", (PyCFunction)pygpu_batch_program_use_end, METH_NOARGS, ""},
{NULL, NULL, 0, NULL},
};
#ifdef USE_GPU_PY_REFERENCES
-static int py_Batch_traverse(BPyGPUBatch *self, visitproc visit, void *arg)
+static int pygpu_batch__tp_traverse(BPyGPUBatch *self, visitproc visit, void *arg)
{
Py_VISIT(self->references);
return 0;
}
-static int py_Batch_clear(BPyGPUBatch *self)
+static int pygpu_batch__tp_clear(BPyGPUBatch *self)
{
Py_CLEAR(self->references);
return 0;
@@ -279,14 +275,14 @@ static int py_Batch_clear(BPyGPUBatch *self)
#endif
-static void py_Batch_dealloc(BPyGPUBatch *self)
+static void pygpu_batch__tp_dealloc(BPyGPUBatch *self)
{
GPU_batch_discard(self->batch);
#ifdef USE_GPU_PY_REFERENCES
if (self->references) {
PyObject_GC_UnTrack(self);
- py_Batch_clear(self);
+ pygpu_batch__tp_clear(self);
Py_XDECREF(self->references);
}
#endif
@@ -295,7 +291,7 @@ static void py_Batch_dealloc(BPyGPUBatch *self)
}
PyDoc_STRVAR(
- py_gpu_batch_doc,
+ pygpu_batch__tp_doc,
".. class:: GPUBatch(type, buf, elem=None)\n"
"\n"
" Reusable container for drawable geometry.\n"
@@ -319,17 +315,17 @@ PyDoc_STRVAR(
PyTypeObject BPyGPUBatch_Type = {
PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUBatch",
.tp_basicsize = sizeof(BPyGPUBatch),
- .tp_dealloc = (destructor)py_Batch_dealloc,
+ .tp_dealloc = (destructor)pygpu_batch__tp_dealloc,
#ifdef USE_GPU_PY_REFERENCES
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
- .tp_doc = py_gpu_batch_doc,
- .tp_traverse = (traverseproc)py_Batch_traverse,
- .tp_clear = (inquiry)py_Batch_clear,
+ .tp_doc = pygpu_batch__tp_doc,
+ .tp_traverse = (traverseproc)pygpu_batch__tp_traverse,
+ .tp_clear = (inquiry)pygpu_batch__tp_clear,
#else
.tp_flags = Py_TPFLAGS_DEFAULT,
#endif
- .tp_methods = py_Batch_methods,
- .tp_new = py_Batch_new,
+ .tp_methods = pygpu_batch__tp_methods,
+ .tp_new = pygpu_batch__tp_new,
};
/** \} */
diff --git a/source/blender/python/gpu/gpu_py_buffer.c b/source/blender/python/gpu/gpu_py_buffer.c
new file mode 100644
index 00000000000..b89d2c6a69f
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_buffer.c
@@ -0,0 +1,667 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ *
+ * This file defines the gpu.state API.
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "BLI_utildefines.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "GPU_texture.h"
+
+#include "../generic/py_capi_utils.h"
+
+#include "gpu_py.h"
+
+#include "gpu_py_buffer.h"
+
+// #define PYGPU_BUFFER_PROTOCOL
+
+/* -------------------------------------------------------------------- */
+/** \name Utility Functions
+ * \{ */
+
+static bool pygpu_buffer_dimensions_compare(int ndim,
+ const Py_ssize_t *shape_a,
+ const Py_ssize_t *shape_b)
+{
+ return (bool)memcmp(shape_a, shape_b, ndim * sizeof(Py_ssize_t));
+}
+
+static const char *pygpu_buffer_formatstr(eGPUDataFormat data_format)
+{
+ switch (data_format) {
+ case GPU_DATA_FLOAT:
+ return "f";
+ case GPU_DATA_INT:
+ return "i";
+ case GPU_DATA_UINT:
+ return "I";
+ case GPU_DATA_UBYTE:
+ return "B";
+ case GPU_DATA_UINT_24_8:
+ case GPU_DATA_10_11_11_REV:
+ return "I";
+ default:
+ break;
+ }
+ return NULL;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name BPyGPUBuffer API
+ * \{ */
+
+static BPyGPUBuffer *pygpu_buffer_make_from_data(PyObject *parent,
+ const eGPUDataFormat format,
+ const int shape_len,
+ const Py_ssize_t *shape,
+ void *buf)
+{
+ BPyGPUBuffer *buffer = (BPyGPUBuffer *)_PyObject_GC_New(&BPyGPU_BufferType);
+
+ buffer->parent = NULL;
+ buffer->format = format;
+ buffer->shape_len = shape_len;
+ buffer->shape = MEM_mallocN(shape_len * sizeof(*buffer->shape), "BPyGPUBuffer shape");
+ memcpy(buffer->shape, shape, shape_len * sizeof(*buffer->shape));
+ buffer->buf.as_void = buf;
+
+ if (parent) {
+ Py_INCREF(parent);
+ buffer->parent = parent;
+ PyObject_GC_Track(buffer);
+ }
+ return buffer;
+}
+
+static PyObject *pygpu_buffer__sq_item(BPyGPUBuffer *self, int i)
+{
+ if (i >= self->shape[0] || i < 0) {
+ PyErr_SetString(PyExc_IndexError, "array index out of range");
+ return NULL;
+ }
+
+ const char *formatstr = pygpu_buffer_formatstr(self->format);
+
+ if (self->shape_len == 1) {
+ switch (self->format) {
+ case GPU_DATA_FLOAT:
+ return Py_BuildValue(formatstr, self->buf.as_float[i]);
+ case GPU_DATA_INT:
+ return Py_BuildValue(formatstr, self->buf.as_int[i]);
+ case GPU_DATA_UBYTE:
+ return Py_BuildValue(formatstr, self->buf.as_byte[i]);
+ case GPU_DATA_UINT:
+ case GPU_DATA_UINT_24_8:
+ case GPU_DATA_10_11_11_REV:
+ return Py_BuildValue(formatstr, self->buf.as_uint[i]);
+ }
+ }
+ else {
+ int offset = i * GPU_texture_dataformat_size(self->format);
+ for (int j = 1; j < self->shape_len; j++) {
+ offset *= self->shape[j];
+ }
+
+ return (PyObject *)pygpu_buffer_make_from_data((PyObject *)self,
+ self->format,
+ self->shape_len - 1,
+ self->shape + 1,
+ self->buf.as_byte + offset);
+ }
+
+ return NULL;
+}
+
+static PyObject *pygpu_buffer_to_list(BPyGPUBuffer *self)
+{
+ int i, len = self->shape[0];
+ PyObject *list = PyList_New(len);
+
+ for (i = 0; i < len; i++) {
+ PyList_SET_ITEM(list, i, pygpu_buffer__sq_item(self, i));
+ }
+
+ return list;
+}
+
+static PyObject *pygpu_buffer_to_list_recursive(BPyGPUBuffer *self)
+{
+ PyObject *list;
+
+ if (self->shape_len > 1) {
+ int i, len = self->shape[0];
+ list = PyList_New(len);
+
+ for (i = 0; i < len; i++) {
+ /* "BPyGPUBuffer *sub_tmp" is a temporary object created just to be read for nested lists.
+ * That is why it is decremented/freed soon after.
+ * TODO: For efficiency, avoid creating #BPyGPUBuffer when creating nested lists. */
+ BPyGPUBuffer *sub_tmp = (BPyGPUBuffer *)pygpu_buffer__sq_item(self, i);
+ PyList_SET_ITEM(list, i, pygpu_buffer_to_list_recursive(sub_tmp));
+ Py_DECREF(sub_tmp);
+ }
+ }
+ else {
+ list = pygpu_buffer_to_list(self);
+ }
+
+ return list;
+}
+
+static PyObject *pygpu_buffer_dimensions(BPyGPUBuffer *self, void *UNUSED(arg))
+{
+ PyObject *list = PyList_New(self->shape_len);
+ int i;
+
+ for (i = 0; i < self->shape_len; i++) {
+ PyList_SET_ITEM(list, i, PyLong_FromLong(self->shape[i]));
+ }
+
+ return list;
+}
+
+static int pygpu_buffer__tp_traverse(BPyGPUBuffer *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->parent);
+ return 0;
+}
+
+static int pygpu_buffer__tp_clear(BPyGPUBuffer *self)
+{
+ Py_CLEAR(self->parent);
+ return 0;
+}
+
+static void pygpu_buffer__tp_dealloc(BPyGPUBuffer *self)
+{
+ if (self->parent) {
+ PyObject_GC_UnTrack(self);
+ pygpu_buffer__tp_clear(self);
+ Py_XDECREF(self->parent);
+ }
+ else {
+ MEM_freeN(self->buf.as_void);
+ }
+
+ MEM_freeN(self->shape);
+
+ PyObject_GC_Del(self);
+}
+
+static PyObject *pygpu_buffer__tp_repr(BPyGPUBuffer *self)
+{
+ PyObject *repr;
+
+ PyObject *list = pygpu_buffer_to_list_recursive(self);
+ const char *typestr = PyC_StringEnum_FindIDFromValue(bpygpu_dataformat_items, self->format);
+
+ repr = PyUnicode_FromFormat("Buffer(%s, %R)", typestr, list);
+ Py_DECREF(list);
+
+ return repr;
+}
+
+static int pygpu_buffer__sq_ass_item(BPyGPUBuffer *self, int i, PyObject *v);
+
+static int pygpu_buffer_ass_slice(BPyGPUBuffer *self,
+ Py_ssize_t begin,
+ Py_ssize_t end,
+ PyObject *seq)
+{
+ PyObject *item;
+ int count, err = 0;
+
+ if (begin < 0) {
+ begin = 0;
+ }
+ if (end > self->shape[0]) {
+ end = self->shape[0];
+ }
+ if (begin > end) {
+ begin = end;
+ }
+
+ if (!PySequence_Check(seq)) {
+ PyErr_Format(PyExc_TypeError,
+ "buffer[:] = value, invalid assignment. "
+ "Expected a sequence, not an %.200s type",
+ Py_TYPE(seq)->tp_name);
+ return -1;
+ }
+
+ /* re-use count var */
+ if ((count = PySequence_Size(seq)) != (end - begin)) {
+ PyErr_Format(PyExc_TypeError,
+ "buffer[:] = value, size mismatch in assignment. "
+ "Expected: %d (given: %d)",
+ count,
+ end - begin);
+ return -1;
+ }
+
+ for (count = begin; count < end; count++) {
+ item = PySequence_GetItem(seq, count - begin);
+ if (item) {
+ err = pygpu_buffer__sq_ass_item(self, count, item);
+ Py_DECREF(item);
+ }
+ else {
+ err = -1;
+ }
+ if (err) {
+ break;
+ }
+ }
+ return err;
+}
+
+#define MAX_DIMENSIONS 64
+static PyObject *pygpu_buffer__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+{
+ PyObject *length_ob, *init = NULL;
+ BPyGPUBuffer *buffer = NULL;
+ Py_ssize_t shape[MAX_DIMENSIONS];
+
+ Py_ssize_t i, shape_len = 0;
+
+ if (kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "Buffer(): takes no keyword args");
+ return NULL;
+ }
+
+ const struct PyC_StringEnum pygpu_dataformat = {bpygpu_dataformat_items, GPU_DATA_FLOAT};
+ if (!PyArg_ParseTuple(
+ args, "O&O|O: Buffer", PyC_ParseStringEnum, &pygpu_dataformat, &length_ob, &init)) {
+ return NULL;
+ }
+
+ if (PyLong_Check(length_ob)) {
+ shape_len = 1;
+ if (((shape[0] = PyLong_AsLong(length_ob)) < 1)) {
+ PyErr_SetString(PyExc_AttributeError, "dimension must be greater than or equal to 1");
+ return NULL;
+ }
+ }
+ else if (PySequence_Check(length_ob)) {
+ shape_len = PySequence_Size(length_ob);
+ if (shape_len > MAX_DIMENSIONS) {
+ PyErr_SetString(PyExc_AttributeError,
+ "too many dimensions, max is " STRINGIFY(MAX_DIMENSIONS));
+ return NULL;
+ }
+ if (shape_len < 1) {
+ PyErr_SetString(PyExc_AttributeError, "sequence must have at least one dimension");
+ return NULL;
+ }
+
+ for (i = 0; i < shape_len; i++) {
+ PyObject *ob = PySequence_GetItem(length_ob, i);
+ if (!PyLong_Check(ob)) {
+ PyErr_Format(PyExc_TypeError,
+ "invalid dimension %i, expected an int, not a %.200s",
+ i,
+ Py_TYPE(ob)->tp_name);
+ Py_DECREF(ob);
+ return NULL;
+ }
+ shape[i] = PyLong_AsLong(ob);
+ Py_DECREF(ob);
+
+ if (shape[i] < 1) {
+ PyErr_SetString(PyExc_AttributeError, "dimension must be greater than or equal to 1");
+ return NULL;
+ }
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "invalid second argument argument expected a sequence "
+ "or an int, not a %.200s",
+ Py_TYPE(length_ob)->tp_name);
+ return NULL;
+ }
+
+ if (init && PyObject_CheckBuffer(init)) {
+ Py_buffer pybuffer;
+
+ if (PyObject_GetBuffer(init, &pybuffer, PyBUF_ND | PyBUF_FORMAT) == -1) {
+ /* PyObject_GetBuffer raise a PyExc_BufferError */
+ return NULL;
+ }
+
+ if (shape_len != pybuffer.ndim ||
+ !pygpu_buffer_dimensions_compare(shape_len, shape, pybuffer.shape)) {
+ PyErr_Format(PyExc_TypeError, "array size does not match");
+ }
+ else {
+ buffer = pygpu_buffer_make_from_data(
+ init, pygpu_dataformat.value_found, pybuffer.ndim, shape, pybuffer.buf);
+ }
+
+ PyBuffer_Release(&pybuffer);
+ }
+ else {
+ buffer = BPyGPU_Buffer_CreatePyObject(pygpu_dataformat.value_found, shape, shape_len, NULL);
+ if (init && pygpu_buffer_ass_slice(buffer, 0, shape[0], init)) {
+ Py_DECREF(buffer);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)buffer;
+}
+
+/* BPyGPUBuffer sequence methods */
+
+static int pygpu_buffer__sq_length(BPyGPUBuffer *self)
+{
+ return self->shape[0];
+}
+
+static PyObject *pygpu_buffer_slice(BPyGPUBuffer *self, Py_ssize_t begin, Py_ssize_t end)
+{
+ PyObject *list;
+ Py_ssize_t count;
+
+ if (begin < 0) {
+ begin = 0;
+ }
+ if (end > self->shape[0]) {
+ end = self->shape[0];
+ }
+ if (begin > end) {
+ begin = end;
+ }
+
+ list = PyList_New(end - begin);
+
+ for (count = begin; count < end; count++) {
+ PyList_SET_ITEM(list, count - begin, pygpu_buffer__sq_item(self, count));
+ }
+ return list;
+}
+
+static int pygpu_buffer__sq_ass_item(BPyGPUBuffer *self, int i, PyObject *v)
+{
+ if (i >= self->shape[0] || i < 0) {
+ PyErr_SetString(PyExc_IndexError, "array assignment index out of range");
+ return -1;
+ }
+
+ if (self->shape_len != 1) {
+ BPyGPUBuffer *row = (BPyGPUBuffer *)pygpu_buffer__sq_item(self, i);
+
+ if (row) {
+ const int ret = pygpu_buffer_ass_slice(row, 0, self->shape[1], v);
+ Py_DECREF(row);
+ return ret;
+ }
+
+ return -1;
+ }
+
+ switch (self->format) {
+ case GPU_DATA_FLOAT:
+ return PyArg_Parse(v, "f:Expected floats", &self->buf.as_float[i]) ? 0 : -1;
+ case GPU_DATA_INT:
+ return PyArg_Parse(v, "i:Expected ints", &self->buf.as_int[i]) ? 0 : -1;
+ case GPU_DATA_UBYTE:
+ return PyArg_Parse(v, "b:Expected ints", &self->buf.as_byte[i]) ? 0 : -1;
+ case GPU_DATA_UINT:
+ case GPU_DATA_UINT_24_8:
+ case GPU_DATA_10_11_11_REV:
+ return PyArg_Parse(v, "b:Expected ints", &self->buf.as_uint[i]) ? 0 : -1;
+ default:
+ return 0; /* should never happen */
+ }
+}
+
+static PyObject *pygpu_buffer__mp_subscript(BPyGPUBuffer *self, PyObject *item)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i;
+ i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ if (i < 0) {
+ i += self->shape[0];
+ }
+ return pygpu_buffer__sq_item(self, i);
+ }
+ if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx(item, self->shape[0], &start, &stop, &step, &slicelength) < 0) {
+ return NULL;
+ }
+
+ if (slicelength <= 0) {
+ return PyTuple_New(0);
+ }
+ if (step == 1) {
+ return pygpu_buffer_slice(self, start, stop);
+ }
+
+ PyErr_SetString(PyExc_IndexError, "slice steps not supported with vectors");
+ return NULL;
+ }
+
+ PyErr_Format(
+ PyExc_TypeError, "buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
+ return NULL;
+}
+
+static int pygpu_buffer__mp_ass_subscript(BPyGPUBuffer *self, PyObject *item, PyObject *value)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+ if (i < 0) {
+ i += self->shape[0];
+ }
+ return pygpu_buffer__sq_ass_item(self, i, value);
+ }
+ if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx(item, self->shape[0], &start, &stop, &step, &slicelength) < 0) {
+ return -1;
+ }
+
+ if (step == 1) {
+ return pygpu_buffer_ass_slice(self, start, stop, value);
+ }
+
+ PyErr_SetString(PyExc_IndexError, "slice steps not supported with vectors");
+ return -1;
+ }
+
+ PyErr_Format(
+ PyExc_TypeError, "buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
+ return -1;
+}
+
+static PyMethodDef pygpu_buffer__tp_methods[] = {
+ {"to_list",
+ (PyCFunction)pygpu_buffer_to_list_recursive,
+ METH_NOARGS,
+ "return the buffer as a list"},
+ {NULL, NULL, 0, NULL},
+};
+
+static PyGetSetDef pygpu_buffer_getseters[] = {
+ {"dimensions", (getter)pygpu_buffer_dimensions, NULL, NULL, NULL},
+ {NULL, NULL, NULL, NULL, NULL},
+};
+
+static PySequenceMethods pygpu_buffer__tp_as_sequence = {
+ (lenfunc)pygpu_buffer__sq_length, /*sq_length */
+ (binaryfunc)NULL, /*sq_concat */
+ (ssizeargfunc)NULL, /*sq_repeat */
+ (ssizeargfunc)pygpu_buffer__sq_item, /*sq_item */
+ (ssizessizeargfunc)NULL, /*sq_slice, deprecated, handled in pygpu_buffer__sq_item */
+ (ssizeobjargproc)pygpu_buffer__sq_ass_item, /*sq_ass_item */
+ (ssizessizeobjargproc)NULL, /* sq_ass_slice, deprecated handled in pygpu_buffer__sq_ass_item */
+ (objobjproc)NULL, /* sq_contains */
+ (binaryfunc)NULL, /* sq_inplace_concat */
+ (ssizeargfunc)NULL, /* sq_inplace_repeat */
+};
+
+static PyMappingMethods pygpu_buffer__tp_as_mapping = {
+ (lenfunc)pygpu_buffer__sq_length,
+ (binaryfunc)pygpu_buffer__mp_subscript,
+ (objobjargproc)pygpu_buffer__mp_ass_subscript,
+};
+
+#ifdef PYGPU_BUFFER_PROTOCOL
+static void pygpu_buffer_strides_calc(const eGPUDataFormat format,
+ const int shape_len,
+ const Py_ssize_t *shape,
+ Py_ssize_t *r_strides)
+{
+ r_strides[0] = GPU_texture_dataformat_size(format);
+ for (int i = 1; i < shape_len; i++) {
+ r_strides[i] = r_strides[i - 1] * shape[i - 1];
+ }
+}
+
+/* Here is the buffer interface function */
+static int pygpu_buffer__bf_getbuffer(BPyGPUBuffer *self, Py_buffer *view, int flags)
+{
+ if (view == NULL) {
+ PyErr_SetString(PyExc_ValueError, "NULL view in getbuffer");
+ return -1;
+ }
+
+ view->obj = (PyObject *)self;
+ view->buf = (void *)self->buf.as_void;
+ view->len = bpygpu_Buffer_size(self);
+ view->readonly = 0;
+ view->itemsize = GPU_texture_dataformat_size(self->format);
+ view->format = pygpu_buffer_formatstr(self->format);
+ view->ndim = self->shape_len;
+ view->shape = self->shape;
+ view->strides = MEM_mallocN(view->ndim * sizeof(*view->strides), "BPyGPUBuffer strides");
+ pygpu_buffer_strides_calc(self->format, view->ndim, view->shape, view->strides);
+ view->suboffsets = NULL;
+ view->internal = NULL;
+
+ Py_INCREF(self);
+ return 0;
+}
+
+static void pygpu_buffer__bf_releasebuffer(PyObject *UNUSED(exporter), Py_buffer *view)
+{
+ MEM_SAFE_FREE(view->strides);
+}
+
+static PyBufferProcs pygpu_buffer__tp_as_buffer = {
+ (getbufferproc)pygpu_buffer__bf_getbuffer,
+ (releasebufferproc)pygpu_buffer__bf_releasebuffer,
+};
+#endif
+
+PyDoc_STRVAR(pygpu_buffer__tp_doc,
+ ".. class:: Buffer(format, dimensions, data)\n"
+ "\n"
+ " For Python access to GPU functions requiring a pointer.\n"
+ "\n"
+ " :arg format: One of these primitive types: {\n"
+ " `FLOAT`,\n"
+ " `INT`,\n"
+ " `UINT`,\n"
+ " `UBYTE`,\n"
+ " `UINT_24_8`,\n"
+ " `10_11_11_REV`,\n"
+ " :type type: `str`\n"
+ " :arg dimensions: Array describing the dimensions.\n"
+ " :type dimensions: `int`\n"
+ " :arg data: Optional data array.\n"
+ " :type data: `array`\n");
+PyTypeObject BPyGPU_BufferType = {
+ PyVarObject_HEAD_INIT(NULL, 0).tp_name = "Buffer",
+ .tp_basicsize = sizeof(BPyGPUBuffer),
+ .tp_dealloc = (destructor)pygpu_buffer__tp_dealloc,
+ .tp_repr = (reprfunc)pygpu_buffer__tp_repr,
+ .tp_as_sequence = &pygpu_buffer__tp_as_sequence,
+ .tp_as_mapping = &pygpu_buffer__tp_as_mapping,
+#ifdef PYGPU_BUFFER_PROTOCOL
+ .tp_as_buffer = &pygpu_buffer__tp_as_buffer,
+#endif
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+ .tp_doc = pygpu_buffer__tp_doc,
+ .tp_traverse = (traverseproc)pygpu_buffer__tp_traverse,
+ .tp_clear = (inquiry)pygpu_buffer__tp_clear,
+ .tp_methods = pygpu_buffer__tp_methods,
+ .tp_getset = pygpu_buffer_getseters,
+ .tp_new = pygpu_buffer__tp_new,
+};
+
+static size_t pygpu_buffer_calc_size(const int format,
+ const int shape_len,
+ const Py_ssize_t *shape)
+{
+ size_t r_size = GPU_texture_dataformat_size(format);
+
+ for (int i = 0; i < shape_len; i++) {
+ r_size *= shape[i];
+ }
+
+ return r_size;
+}
+
+size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer)
+{
+ return pygpu_buffer_calc_size(buffer->format, buffer->shape_len, buffer->shape);
+}
+
+/**
+ * Create a buffer object
+ *
+ * \param shape: An array of `shape_len` integers representing the size of each dimension.
+ * \param buffer: When not NULL holds a contiguous buffer
+ * with the correct format from which the buffer will be initialized
+ */
+BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format,
+ const Py_ssize_t *shape,
+ const int shape_len,
+ void *buffer)
+{
+ if (buffer == NULL) {
+ size_t size = pygpu_buffer_calc_size(format, shape_len, shape);
+ buffer = MEM_callocN(size, "BPyGPUBuffer buffer");
+ }
+
+ return pygpu_buffer_make_from_data(NULL, format, shape_len, shape, buffer);
+}
+
+/** \} */
diff --git a/source/blender/python/gpu/gpu_py_buffer.h b/source/blender/python/gpu/gpu_py_buffer.h
new file mode 100644
index 00000000000..5eac5e3d309
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_buffer.h
@@ -0,0 +1,53 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ */
+
+#pragma once
+
+extern PyTypeObject BPyGPU_BufferType;
+
+#define BPyGPU_Buffer_Check(v) (Py_TYPE(v) == &BPyGPU_BufferType)
+
+/**
+ * Buffer Object
+ *
+ * For Python access to GPU functions requiring a pointer.
+ */
+typedef struct BPyGPUBuffer {
+ PyObject_VAR_HEAD PyObject *parent;
+
+ int format;
+ int shape_len;
+ Py_ssize_t *shape;
+
+ union {
+ char *as_byte;
+ int *as_int;
+ uint *as_uint;
+ float *as_float;
+
+ void *as_void;
+ } buf;
+} BPyGPUBuffer;
+
+size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer);
+BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format,
+ const Py_ssize_t *shape,
+ const int shape_len,
+ void *buffer);
diff --git a/source/blender/python/gpu/gpu_py_element.c b/source/blender/python/gpu/gpu_py_element.c
index 0a1aecde986..0e5094cbbc0 100644
--- a/source/blender/python/gpu/gpu_py_element.c
+++ b/source/blender/python/gpu/gpu_py_element.c
@@ -32,6 +32,7 @@
#include "../generic/py_capi_utils.h"
#include "../generic/python_utildefines.h"
+#include "gpu_py.h"
#include "gpu_py_api.h"
#include "gpu_py_element.h" /* own include */
@@ -39,17 +40,15 @@
/** \name IndexBuf Type
* \{ */
-static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
{
BPYGPU_IS_INIT_OR_ERROR_OBJ;
const char *error_prefix = "IndexBuf.__new__";
bool ok = true;
- struct {
- GPUPrimType type_id;
- PyObject *seq;
- } params;
+ struct PyC_StringEnum prim_type = {bpygpu_primtype_items, GPU_PRIM_NONE};
+ PyObject *seq;
uint verts_per_prim;
uint index_len;
@@ -58,11 +57,11 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO
static const char *_keywords[] = {"type", "seq", NULL};
static _PyArg_Parser _parser = {"$O&O:IndexBuf.__new__", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(
- args, kwds, &_parser, bpygpu_ParsePrimType, &params.type_id, &params.seq)) {
+ args, kwds, &_parser, PyC_ParseStringEnum, &prim_type, &seq)) {
return NULL;
}
- verts_per_prim = GPU_indexbuf_primitive_len(params.type_id);
+ verts_per_prim = GPU_indexbuf_primitive_len(prim_type.value_found);
if (verts_per_prim == -1) {
PyErr_Format(PyExc_ValueError,
"The argument 'type' must be "
@@ -70,10 +69,10 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO
return NULL;
}
- if (PyObject_CheckBuffer(params.seq)) {
+ if (PyObject_CheckBuffer(seq)) {
Py_buffer pybuffer;
- if (PyObject_GetBuffer(params.seq, &pybuffer, PyBUF_FORMAT | PyBUF_ND) == -1) {
+ if (PyObject_GetBuffer(seq, &pybuffer, PyBUF_FORMAT | PyBUF_ND) == -1) {
/* PyObject_GetBuffer already handles error messages. */
return NULL;
}
@@ -97,7 +96,7 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO
/* The `vertex_len` parameter is only used for asserts in the Debug build. */
/* Not very useful in python since scripts are often tested in Release build. */
/* Use `INT_MAX` instead of the actual number of vertices. */
- GPU_indexbuf_init(&builder, params.type_id, index_len, INT_MAX);
+ GPU_indexbuf_init(&builder, prim_type.value_found, index_len, INT_MAX);
#if 0
uint *buf = pybuffer.buf;
@@ -111,7 +110,7 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO
PyBuffer_Release(&pybuffer);
}
else {
- PyObject *seq_fast = PySequence_Fast(params.seq, error_prefix);
+ PyObject *seq_fast = PySequence_Fast(seq, error_prefix);
if (seq_fast == NULL) {
return false;
@@ -126,7 +125,7 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO
/* The `vertex_len` parameter is only used for asserts in the Debug build. */
/* Not very useful in python since scripts are often tested in Release build. */
/* Use `INT_MAX` instead of the actual number of vertices. */
- GPU_indexbuf_init(&builder, params.type_id, index_len, INT_MAX);
+ GPU_indexbuf_init(&builder, prim_type.value_found, index_len, INT_MAX);
if (verts_per_prim == 1) {
for (uint i = 0; i < seq_len; i++) {
@@ -175,13 +174,13 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO
return BPyGPUIndexBuf_CreatePyObject(GPU_indexbuf_build(&builder));
}
-static void py_IndexBuf_dealloc(BPyGPUIndexBuf *self)
+static void pygpu_IndexBuf__tp_dealloc(BPyGPUIndexBuf *self)
{
GPU_indexbuf_discard(self->elem);
Py_TYPE(self)->tp_free(self);
}
-PyDoc_STRVAR(py_gpu_element_doc,
+PyDoc_STRVAR(pygpu_IndexBuf__tp_doc,
".. class:: GPUIndexBuf(type, seq)\n"
"\n"
" Contains an index buffer.\n"
@@ -199,10 +198,10 @@ PyDoc_STRVAR(py_gpu_element_doc,
PyTypeObject BPyGPUIndexBuf_Type = {
PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUIndexBuf",
.tp_basicsize = sizeof(BPyGPUIndexBuf),
- .tp_dealloc = (destructor)py_IndexBuf_dealloc,
+ .tp_dealloc = (destructor)pygpu_IndexBuf__tp_dealloc,
.tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_doc = py_gpu_element_doc,
- .tp_new = py_IndexBuf_new,
+ .tp_doc = pygpu_IndexBuf__tp_doc,
+ .tp_new = pygpu_IndexBuf__tp_new,
};
/** \} */
diff --git a/source/blender/python/gpu/gpu_py_framebuffer.c b/source/blender/python/gpu/gpu_py_framebuffer.c
new file mode 100644
index 00000000000..04d49a9f15d
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_framebuffer.c
@@ -0,0 +1,546 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ *
+ * This file defines the framebuffer functionalities of the 'gpu' module
+ * used for off-screen OpenGL rendering.
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "GPU_context.h"
+#include "GPU_framebuffer.h"
+#include "GPU_init_exit.h"
+
+#include "../generic/py_capi_utils.h"
+#include "../generic/python_utildefines.h"
+#include "../mathutils/mathutils.h"
+
+#include "gpu_py_api.h"
+#include "gpu_py_texture.h"
+
+#include "gpu_py_framebuffer.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+/** \name GPUFrameBuffer Common Utilities
+ * \{ */
+
+static int pygpu_framebuffer_valid_check(BPyGPUFrameBuffer *bpygpu_fb)
+{
+ if (UNLIKELY(bpygpu_fb->fb == NULL)) {
+ PyErr_SetString(PyExc_ReferenceError,
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+ "GPU framebuffer was freed, no further access is valid"
+#else
+ "GPU framebuffer: internal error"
+#endif
+ );
+ return -1;
+ }
+ return 0;
+}
+
+#define PYGPU_FRAMEBUFFER_CHECK_OBJ(bpygpu) \
+ { \
+ if (UNLIKELY(pygpu_framebuffer_valid_check(bpygpu) == -1)) { \
+ return NULL; \
+ } \
+ } \
+ ((void)0)
+
+static void pygpu_framebuffer_free_if_possible(GPUFrameBuffer *fb)
+{
+ if (!fb) {
+ return;
+ }
+
+ if (GPU_is_init()) {
+ GPU_framebuffer_free(fb);
+ }
+ else {
+ printf("PyFramebuffer freed after the context has been destroyed.\n");
+ }
+}
+
+/* Keep less than or equal to #FRAMEBUFFER_STACK_DEPTH */
+#define GPU_PY_FRAMEBUFFER_STACK_LEN 16
+
+static bool pygpu_framebuffer_stack_push_and_bind_or_error(GPUFrameBuffer *fb)
+{
+ if (GPU_framebuffer_stack_level_get() >= GPU_PY_FRAMEBUFFER_STACK_LEN) {
+ PyErr_SetString(
+ PyExc_RuntimeError,
+ "Maximum framebuffer stack depth " STRINGIFY(GPU_PY_FRAMEBUFFER_STACK_LEN) " reached");
+ return false;
+ }
+ GPU_framebuffer_push(GPU_framebuffer_active_get());
+ GPU_framebuffer_bind(fb);
+ return true;
+}
+
+static bool pygpu_framebuffer_stack_pop_and_restore_or_error(GPUFrameBuffer *fb)
+{
+ if (GPU_framebuffer_stack_level_get() == 0) {
+ PyErr_SetString(PyExc_RuntimeError, "Minimum framebuffer stack depth reached");
+ return false;
+ }
+
+ if (fb && !GPU_framebuffer_bound(fb)) {
+ PyErr_SetString(PyExc_RuntimeError, "Framebuffer is not bound");
+ return false;
+ }
+
+ GPUFrameBuffer *fb_prev = GPU_framebuffer_pop();
+ GPU_framebuffer_bind(fb_prev);
+ return true;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Stack (Context Manager)
+ *
+ * Safer alternative to ensure balanced push/pop calls.
+ *
+ * \{ */
+
+typedef struct {
+ PyObject_HEAD /* required python macro */
+ BPyGPUFrameBuffer *py_fb;
+ int level;
+} PyFrameBufferStackContext;
+
+static void pygpu_framebuffer_stack_context__tp_dealloc(PyFrameBufferStackContext *self)
+{
+ Py_DECREF(self->py_fb);
+ PyObject_DEL(self);
+}
+
+static PyObject *pygpu_framebuffer_stack_context_enter(PyFrameBufferStackContext *self)
+{
+ PYGPU_FRAMEBUFFER_CHECK_OBJ(self->py_fb);
+
+ /* sanity - should never happen */
+ if (self->level != -1) {
+ PyErr_SetString(PyExc_RuntimeError, "Already in use");
+ return NULL;
+ }
+
+ if (!pygpu_framebuffer_stack_push_and_bind_or_error(self->py_fb->fb)) {
+ return NULL;
+ }
+
+ self->level = GPU_framebuffer_stack_level_get();
+ Py_RETURN_NONE;
+}
+
+static PyObject *pygpu_framebuffer_stack_context_exit(PyFrameBufferStackContext *self,
+ PyObject *UNUSED(args))
+{
+ PYGPU_FRAMEBUFFER_CHECK_OBJ(self->py_fb);
+
+ /* sanity - should never happen */
+ if (self->level == -1) {
+ fprintf(stderr, "Not yet in use\n");
+ return NULL;
+ }
+
+ const int level = GPU_framebuffer_stack_level_get();
+ if (level != self->level) {
+ fprintf(stderr, "Level of bind mismatch, expected %d, got %d\n", self->level, level);
+ }
+
+ if (!pygpu_framebuffer_stack_pop_and_restore_or_error(self->py_fb->fb)) {
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef pygpu_framebuffer_stack_context__tp_methods[] = {
+ {"__enter__", (PyCFunction)pygpu_framebuffer_stack_context_enter, METH_NOARGS},
+ {"__exit__", (PyCFunction)pygpu_framebuffer_stack_context_exit, METH_VARARGS},
+ {NULL},
+};
+
+static PyTypeObject FramebufferStackContext_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBufferStackContext",
+ .tp_basicsize = sizeof(PyFrameBufferStackContext),
+ .tp_dealloc = (destructor)pygpu_framebuffer_stack_context__tp_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_methods = pygpu_framebuffer_stack_context__tp_methods,
+};
+
+PyDoc_STRVAR(pygpu_framebuffer_bind_doc,
+ ".. function:: bind()\n"
+ "\n"
+ " Context manager to ensure balanced bind calls, even in the case of an error.\n");
+static PyObject *pygpu_framebuffer_bind(BPyGPUFrameBuffer *self)
+{
+ PyFrameBufferStackContext *ret = PyObject_New(PyFrameBufferStackContext,
+ &FramebufferStackContext_Type);
+ ret->py_fb = self;
+ ret->level = -1;
+ Py_INCREF(self);
+ return (PyObject *)ret;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name GPUFramebuffer Type
+ * \{ */
+
+/* Fill in the GPUAttachment according to the PyObject parameter.
+ * PyObject *o can be NULL, Py_None, BPyGPUTexture or a dictionary containing the keyword "texture"
+ * and the optional keywords "layer" and "mip".
+ * Returns false on error. In this case, a python message will be raised and GPUAttachment will not
+ * be touched. */
+static bool pygpu_framebuffer_new_parse_arg(PyObject *o, GPUAttachment *r_attach)
+{
+ GPUAttachment tmp_attach = GPU_ATTACHMENT_NONE;
+
+ if (!o || o == Py_None) {
+ /* Pass. */;
+ }
+ else if (BPyGPUTexture_Check(o)) {
+ if (!bpygpu_ParseTexture(o, &tmp_attach.tex)) {
+ return false;
+ }
+ }
+ else {
+ const char *c_texture = "texture";
+ const char *c_layer = "layer";
+ const char *c_mip = "mip";
+ PyObject *key, *value;
+ Py_ssize_t pos = 0;
+ while (PyDict_Next(o, &pos, &key, &value)) {
+ if (!PyUnicode_Check(key)) {
+ PyErr_SetString(PyExc_TypeError, "keywords must be strings");
+ return false;
+ }
+
+ if (c_texture && _PyUnicode_EqualToASCIIString(key, c_texture)) {
+ /* Compare only once. */
+ c_texture = NULL;
+ if (!bpygpu_ParseTexture(value, &tmp_attach.tex)) {
+ return false;
+ }
+ }
+ else if (c_layer && _PyUnicode_EqualToASCIIString(key, c_layer)) {
+ /* Compare only once. */
+ c_layer = NULL;
+ tmp_attach.layer = PyLong_AsLong(value);
+ if (tmp_attach.layer == -1 && PyErr_Occurred()) {
+ return false;
+ }
+ }
+ else if (c_mip && _PyUnicode_EqualToASCIIString(key, c_mip)) {
+ /* Compare only once. */
+ c_mip = NULL;
+ tmp_attach.mip = PyLong_AsLong(value);
+ if (tmp_attach.mip == -1 && PyErr_Occurred()) {
+ return false;
+ }
+ }
+ else {
+ PyErr_Format(
+ PyExc_TypeError, "'%U' is an invalid keyword argument for this attribute", key);
+ return false;
+ }
+ }
+ }
+
+ *r_attach = tmp_attach;
+ return true;
+}
+
+static PyObject *pygpu_framebuffer__tp_new(PyTypeObject *UNUSED(self),
+ PyObject *args,
+ PyObject *kwds)
+{
+ BPYGPU_IS_INIT_OR_ERROR_OBJ;
+ if (!GPU_context_active_get()) {
+ PyErr_SetString(PyExc_RuntimeError, "No active GPU context found");
+ return NULL;
+ }
+
+ PyObject *depth_attachment = NULL;
+ PyObject *color_attachements = NULL;
+ static const char *_keywords[] = {"depth_slot", "color_slots", NULL};
+ static _PyArg_Parser _parser = {"|$OO:GPUFrameBuffer.__new__", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(
+ args, kwds, &_parser, &depth_attachment, &color_attachements)) {
+ return NULL;
+ }
+
+ /* Keep in sync with #GPU_FB_MAX_COLOR_ATTACHMENT.
+ * TODO: share the define. */
+#define BPYGPU_FB_MAX_COLOR_ATTACHMENT 6
+
+ GPUAttachment config[BPYGPU_FB_MAX_COLOR_ATTACHMENT + 1];
+
+ if (!pygpu_framebuffer_new_parse_arg(depth_attachment, &config[0])) {
+ return NULL;
+ }
+ if (config[0].tex && !GPU_texture_depth(config[0].tex)) {
+ PyErr_SetString(PyExc_ValueError, "Depth texture with incompatible format");
+ return NULL;
+ }
+
+ int color_attachements_len = 0;
+ if (color_attachements && color_attachements != Py_None) {
+ if (PySequence_Check(color_attachements)) {
+ color_attachements_len = PySequence_Size(color_attachements);
+ if (color_attachements_len > BPYGPU_FB_MAX_COLOR_ATTACHMENT) {
+ PyErr_SetString(
+ PyExc_AttributeError,
+ "too many attachements, max is " STRINGIFY(BPYGPU_FB_MAX_COLOR_ATTACHMENT));
+ return NULL;
+ }
+
+ for (int i = 1; i <= color_attachements_len; i++) {
+ PyObject *o = PySequence_GetItem(color_attachements, i);
+ bool ok = pygpu_framebuffer_new_parse_arg(o, &config[i]);
+ Py_DECREF(o);
+ if (!ok) {
+ return NULL;
+ }
+ }
+ }
+ else {
+ if (!pygpu_framebuffer_new_parse_arg(color_attachements, &config[1])) {
+ return NULL;
+ }
+ color_attachements_len = 1;
+ }
+ }
+
+ GPUFrameBuffer *fb_python = GPU_framebuffer_create("fb_python");
+ GPU_framebuffer_config_array(fb_python, config, color_attachements_len + 1);
+
+ return BPyGPUFrameBuffer_CreatePyObject(fb_python);
+}
+
+PyDoc_STRVAR(pygpu_framebuffer_is_bound_doc,
+ "Checks if this is the active framebuffer in the context.");
+static PyObject *pygpu_framebuffer_is_bound(BPyGPUFrameBuffer *self, void *UNUSED(type))
+{
+ PYGPU_FRAMEBUFFER_CHECK_OBJ(self);
+ return PyBool_FromLong(GPU_framebuffer_bound(self->fb));
+}
+
+PyDoc_STRVAR(pygpu_framebuffer_clear_doc,
+ ".. method:: clear(color=None, depth=None, stencil=None)\n"
+ "\n"
+ " Fill color, depth and stencil textures with specific value.\n"
+ " Common values: color=(0.0, 0.0, 0.0, 1.0), depth=1.0, stencil=0.\n"
+ "\n"
+ " :arg color: float sequence each representing ``(r, g, b, a)``.\n"
+ " :type color: sequence of 3 or 4 floats\n"
+ " :arg depth: depth value.\n"
+ " :type depth: `float`\n"
+ " :arg stencil: stencil value.\n"
+ " :type stencil: `int`\n");
+static PyObject *pygpu_framebuffer_clear(BPyGPUFrameBuffer *self, PyObject *args, PyObject *kwds)
+{
+ PYGPU_FRAMEBUFFER_CHECK_OBJ(self);
+
+ if (!GPU_framebuffer_bound(self->fb)) {
+ return NULL;
+ }
+
+ PyObject *py_col = NULL;
+ PyObject *py_depth = NULL;
+ PyObject *py_stencil = NULL;
+
+ static const char *_keywords[] = {"color", "depth", "stencil", NULL};
+ static _PyArg_Parser _parser = {"|$OOO:clear", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &py_col, &py_depth, &py_stencil)) {
+ return NULL;
+ }
+
+ eGPUFrameBufferBits buffers = 0;
+ float col[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ float depth = 1.0f;
+ uint stencil = 0;
+
+ if (py_col && py_col != Py_None) {
+ if (mathutils_array_parse(col, 3, 4, py_col, "GPUFrameBuffer.clear(), invalid 'color' arg") ==
+ -1) {
+ return NULL;
+ }
+ buffers |= GPU_COLOR_BIT;
+ }
+
+ if (py_depth && py_depth != Py_None) {
+ depth = PyFloat_AsDouble(py_depth);
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+ buffers |= GPU_DEPTH_BIT;
+ }
+
+ if (py_stencil && py_stencil != Py_None) {
+ if ((stencil = PyC_Long_AsU32(py_stencil)) == (uint)-1) {
+ return NULL;
+ }
+ buffers |= GPU_STENCIL_BIT;
+ }
+
+ GPU_framebuffer_clear(self->fb, buffers, col, depth, stencil);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_framebuffer_viewport_set_doc,
+ ".. function:: viewport_set(x, y, xsize, ysize)\n"
+ "\n"
+ " Set the viewport for this framebuffer object.\n"
+ " Note: The viewport state is not saved upon framebuffer rebind.\n"
+ "\n"
+ " :param x, y: lower left corner of the viewport_set rectangle, in pixels.\n"
+ " :param xsize, ysize: width and height of the viewport_set.\n"
+ " :type x, y, xsize, ysize: `int`\n");
+static PyObject *pygpu_framebuffer_viewport_set(BPyGPUFrameBuffer *self,
+ PyObject *args,
+ void *UNUSED(type))
+{
+ int x, y, xsize, ysize;
+ if (!PyArg_ParseTuple(args, "iiii:viewport_set", &x, &y, &xsize, &ysize)) {
+ return NULL;
+ }
+
+ GPU_framebuffer_viewport_set(self->fb, x, y, xsize, ysize);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_framebuffer_viewport_get_doc,
+ ".. function:: viewport_get()\n"
+ "\n"
+ " Returns position and dimension to current viewport.\n");
+static PyObject *pygpu_framebuffer_viewport_get(BPyGPUFrameBuffer *self, void *UNUSED(type))
+{
+ PYGPU_FRAMEBUFFER_CHECK_OBJ(self);
+ int viewport[4];
+ GPU_framebuffer_viewport_get(self->fb, viewport);
+
+ PyObject *ret = PyTuple_New(4);
+ PyTuple_SET_ITEMS(ret,
+ PyLong_FromLong(viewport[0]),
+ PyLong_FromLong(viewport[1]),
+ PyLong_FromLong(viewport[2]),
+ PyLong_FromLong(viewport[3]));
+ return ret;
+}
+
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+PyDoc_STRVAR(pygpu_framebuffer_free_doc,
+ ".. method:: free()\n"
+ "\n"
+ " Free the framebuffer object.\n"
+ " The framebuffer will no longer be accessible.\n");
+static PyObject *pygpu_framebuffer_free(BPyGPUFrameBuffer *self)
+{
+ PYGPU_FRAMEBUFFER_CHECK_OBJ(self);
+ pygpu_framebuffer_free_if_possible(self->fb);
+ self->fb = NULL;
+ Py_RETURN_NONE;
+}
+#endif
+
+static void BPyGPUFrameBuffer__tp_dealloc(BPyGPUFrameBuffer *self)
+{
+ pygpu_framebuffer_free_if_possible(self->fb);
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static PyGetSetDef pygpu_framebuffer__tp_getseters[] = {
+ {"is_bound",
+ (getter)pygpu_framebuffer_is_bound,
+ (setter)NULL,
+ pygpu_framebuffer_is_bound_doc,
+ NULL},
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+static struct PyMethodDef pygpu_framebuffer__tp_methods[] = {
+ {"bind", (PyCFunction)pygpu_framebuffer_bind, METH_NOARGS, pygpu_framebuffer_bind_doc},
+ {"clear",
+ (PyCFunction)pygpu_framebuffer_clear,
+ METH_VARARGS | METH_KEYWORDS,
+ pygpu_framebuffer_clear_doc},
+ {"viewport_set",
+ (PyCFunction)pygpu_framebuffer_viewport_set,
+ METH_NOARGS,
+ pygpu_framebuffer_viewport_set_doc},
+ {"viewport_get",
+ (PyCFunction)pygpu_framebuffer_viewport_get,
+ METH_VARARGS,
+ pygpu_framebuffer_viewport_get_doc},
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+ {"free", (PyCFunction)pygpu_framebuffer_free, METH_NOARGS, pygpu_framebuffer_free_doc},
+#endif
+ {NULL, NULL, 0, NULL},
+};
+
+PyDoc_STRVAR(pygpu_framebuffer__tp_doc,
+ ".. class:: GPUFrameBuffer(depth_slot=None, color_slots=None)\n"
+ "\n"
+ " This object gives access to framebuffer functionallities.\n"
+ " When a 'layer' is specified in a argument, a single layer of a 3D or array "
+ "texture is attached to the frame-buffer.\n"
+ " For cube map textures, layer is translated into a cube map face.\n"
+ "\n"
+ " :arg depth_slot: GPUTexture to attach or a `dict` containing keywords: "
+ "'texture', 'layer' and 'mip'.\n"
+ " :type depth_slot: :class:`gpu.types.GPUTexture`, `dict` or `Nonetype`\n"
+ " :arg color_slots: Tuple where each item can be a GPUTexture or a `dict` "
+ "containing keywords: 'texture', 'layer' and 'mip'.\n"
+ " :type color_slots: `tuple` or `Nonetype`\n");
+PyTypeObject BPyGPUFrameBuffer_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBuffer",
+ .tp_basicsize = sizeof(BPyGPUFrameBuffer),
+ .tp_dealloc = (destructor)BPyGPUFrameBuffer__tp_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_doc = pygpu_framebuffer__tp_doc,
+ .tp_methods = pygpu_framebuffer__tp_methods,
+ .tp_getset = pygpu_framebuffer__tp_getseters,
+ .tp_new = pygpu_framebuffer__tp_new,
+};
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Public API
+ * \{ */
+
+PyObject *BPyGPUFrameBuffer_CreatePyObject(GPUFrameBuffer *fb)
+{
+ BPyGPUFrameBuffer *self;
+
+ self = PyObject_New(BPyGPUFrameBuffer, &BPyGPUFrameBuffer_Type);
+ self->fb = fb;
+
+ return (PyObject *)self;
+}
+
+/** \} */
+
+#undef PYGPU_FRAMEBUFFER_CHECK_OBJ
diff --git a/source/blender/python/gpu/gpu_py_framebuffer.h b/source/blender/python/gpu/gpu_py_framebuffer.h
new file mode 100644
index 00000000000..7113e7c35aa
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_framebuffer.h
@@ -0,0 +1,33 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ */
+
+#pragma once
+
+#include "BLI_compiler_attrs.h"
+
+extern PyTypeObject BPyGPUFrameBuffer_Type;
+
+#define BPyGPUFrameBuffer_Check(v) (Py_TYPE(v) == &BPyGPUFrameBuffer_Type)
+
+typedef struct BPyGPUFrameBuffer {
+ PyObject_HEAD struct GPUFrameBuffer *fb;
+} BPyGPUFrameBuffer;
+
+PyObject *BPyGPUFrameBuffer_CreatePyObject(struct GPUFrameBuffer *fb) ATTR_NONNULL(1);
diff --git a/source/blender/python/gpu/gpu_py_matrix.c b/source/blender/python/gpu/gpu_py_matrix.c
index a479f270770..df7c82379b3 100644
--- a/source/blender/python/gpu/gpu_py_matrix.c
+++ b/source/blender/python/gpu/gpu_py_matrix.c
@@ -44,7 +44,7 @@
/** \name Helper Functions
* \{ */
-static bool py_stack_is_push_model_view_ok_or_error(void)
+static bool pygpu_stack_is_push_model_view_ok_or_error(void)
{
if (GPU_matrix_stack_level_get_model_view() >= GPU_PY_MATRIX_STACK_LEN) {
PyErr_SetString(
@@ -55,7 +55,7 @@ static bool py_stack_is_push_model_view_ok_or_error(void)
return true;
}
-static bool py_stack_is_push_projection_ok_or_error(void)
+static bool pygpu_stack_is_push_projection_ok_or_error(void)
{
if (GPU_matrix_stack_level_get_projection() >= GPU_PY_MATRIX_STACK_LEN) {
PyErr_SetString(
@@ -66,7 +66,7 @@ static bool py_stack_is_push_projection_ok_or_error(void)
return true;
}
-static bool py_stack_is_pop_model_view_ok_or_error(void)
+static bool pygpu_stack_is_pop_model_view_ok_or_error(void)
{
if (GPU_matrix_stack_level_get_model_view() == 0) {
PyErr_SetString(PyExc_RuntimeError, "Minimum model-view stack depth reached");
@@ -75,7 +75,7 @@ static bool py_stack_is_pop_model_view_ok_or_error(void)
return true;
}
-static bool py_stack_is_pop_projection_ok_or_error(void)
+static bool pygpu_stack_is_pop_projection_ok_or_error(void)
{
if (GPU_matrix_stack_level_get_projection() == 0) {
PyErr_SetString(PyExc_RuntimeError, "Minimum projection stack depth reached");
@@ -90,52 +90,52 @@ static bool py_stack_is_pop_projection_ok_or_error(void)
/** \name Manage Stack
* \{ */
-PyDoc_STRVAR(py_matrix_push_doc,
+PyDoc_STRVAR(pygpu_matrix_push_doc,
".. function:: push()\n"
"\n"
" Add to the model-view matrix stack.\n");
-static PyObject *py_matrix_push(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_push(PyObject *UNUSED(self))
{
- if (!py_stack_is_push_model_view_ok_or_error()) {
+ if (!pygpu_stack_is_push_model_view_ok_or_error()) {
return NULL;
}
GPU_matrix_push();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_pop_doc,
+PyDoc_STRVAR(pygpu_matrix_pop_doc,
".. function:: pop()\n"
"\n"
" Remove the last model-view matrix from the stack.\n");
-static PyObject *py_matrix_pop(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_pop(PyObject *UNUSED(self))
{
- if (!py_stack_is_pop_model_view_ok_or_error()) {
+ if (!pygpu_stack_is_pop_model_view_ok_or_error()) {
return NULL;
}
GPU_matrix_pop();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_push_projection_doc,
+PyDoc_STRVAR(pygpu_matrix_push_projection_doc,
".. function:: push_projection()\n"
"\n"
" Add to the projection matrix stack.\n");
-static PyObject *py_matrix_push_projection(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_push_projection(PyObject *UNUSED(self))
{
- if (!py_stack_is_push_projection_ok_or_error()) {
+ if (!pygpu_stack_is_push_projection_ok_or_error()) {
return NULL;
}
GPU_matrix_push_projection();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_pop_projection_doc,
+PyDoc_STRVAR(pygpu_matrix_pop_projection_doc,
".. function:: pop_projection()\n"
"\n"
" Remove the last projection matrix from the stack.\n");
-static PyObject *py_matrix_pop_projection(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_pop_projection(PyObject *UNUSED(self))
{
- if (!py_stack_is_pop_projection_ok_or_error()) {
+ if (!pygpu_stack_is_pop_projection_ok_or_error()) {
return NULL;
}
GPU_matrix_pop_projection();
@@ -162,23 +162,23 @@ enum {
PYGPU_MATRIX_TYPE_PROJECTION = 2,
};
-static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self);
-static PyObject *py_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, PyObject *args);
+static PyObject *pygpu_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self);
+static PyObject *pygpu_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, PyObject *args);
-static PyMethodDef py_matrix_stack_context_methods[] = {
- {"__enter__", (PyCFunction)py_matrix_stack_context_enter, METH_NOARGS},
- {"__exit__", (PyCFunction)py_matrix_stack_context_exit, METH_VARARGS},
+static PyMethodDef pygpu_matrix_stack_context__tp_methods[] = {
+ {"__enter__", (PyCFunction)pygpu_matrix_stack_context_enter, METH_NOARGS},
+ {"__exit__", (PyCFunction)pygpu_matrix_stack_context_exit, METH_VARARGS},
{NULL},
};
-static PyTypeObject BPyGPU_matrix_stack_context_Type = {
+static PyTypeObject PyGPUMatrixStackContext_Type = {
PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUMatrixStackContext",
.tp_basicsize = sizeof(BPyGPU_MatrixStackContext),
.tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_methods = py_matrix_stack_context_methods,
+ .tp_methods = pygpu_matrix_stack_context__tp_methods,
};
-static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self)
+static PyObject *pygpu_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self)
{
/* sanity - should never happen */
if (self->level != -1) {
@@ -187,14 +187,14 @@ static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self)
}
if (self->type == PYGPU_MATRIX_TYPE_MODEL_VIEW) {
- if (!py_stack_is_push_model_view_ok_or_error()) {
+ if (!pygpu_stack_is_push_model_view_ok_or_error()) {
return NULL;
}
GPU_matrix_push();
self->level = GPU_matrix_stack_level_get_model_view();
}
else if (self->type == PYGPU_MATRIX_TYPE_PROJECTION) {
- if (!py_stack_is_push_projection_ok_or_error()) {
+ if (!pygpu_stack_is_push_projection_ok_or_error()) {
return NULL;
}
GPU_matrix_push_projection();
@@ -206,8 +206,8 @@ static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self)
Py_RETURN_NONE;
}
-static PyObject *py_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self,
- PyObject *UNUSED(args))
+static PyObject *pygpu_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self,
+ PyObject *UNUSED(args))
{
/* sanity - should never happen */
if (self->level == -1) {
@@ -240,33 +240,33 @@ finally:
Py_RETURN_NONE;
}
-static PyObject *py_matrix_push_pop_impl(int type)
+static PyObject *pygpu_matrix_push_pop_impl(int type)
{
BPyGPU_MatrixStackContext *ret = PyObject_New(BPyGPU_MatrixStackContext,
- &BPyGPU_matrix_stack_context_Type);
+ &PyGPUMatrixStackContext_Type);
ret->type = type;
ret->level = -1;
return (PyObject *)ret;
}
PyDoc_STRVAR(
- py_matrix_push_pop_doc,
+ pygpu_matrix_push_pop_doc,
".. function:: push_pop()\n"
"\n"
" Context manager to ensure balanced push/pop calls, even in the case of an error.\n");
-static PyObject *py_matrix_push_pop(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_push_pop(PyObject *UNUSED(self))
{
- return py_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_MODEL_VIEW);
+ return pygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_MODEL_VIEW);
}
PyDoc_STRVAR(
- py_matrix_push_pop_projection_doc,
+ pygpu_matrix_push_pop_projection_doc,
".. function:: push_pop_projection()\n"
"\n"
" Context manager to ensure balanced push/pop calls, even in the case of an error.\n");
-static PyObject *py_matrix_push_pop_projection(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_push_pop_projection(PyObject *UNUSED(self))
{
- return py_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_PROJECTION);
+ return pygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_PROJECTION);
}
/** \} */
@@ -275,14 +275,14 @@ static PyObject *py_matrix_push_pop_projection(PyObject *UNUSED(self))
/** \name Manipulate State
* \{ */
-PyDoc_STRVAR(py_matrix_multiply_matrix_doc,
+PyDoc_STRVAR(pygpu_matrix_multiply_matrix_doc,
".. function:: multiply_matrix(matrix)\n"
"\n"
" Multiply the current stack matrix.\n"
"\n"
" :param matrix: A 4x4 matrix.\n"
" :type matrix: :class:`mathutils.Matrix`\n");
-static PyObject *py_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *value)
+static PyObject *pygpu_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *value)
{
MatrixObject *pymat;
if (!Matrix_Parse4x4(value, &pymat)) {
@@ -292,14 +292,14 @@ static PyObject *py_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *val
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_scale_doc,
+PyDoc_STRVAR(pygpu_matrix_scale_doc,
".. function:: scale(scale)\n"
"\n"
" Scale the current stack matrix.\n"
"\n"
" :param scale: Scale the current stack matrix.\n"
" :type scale: sequence of 2 or 3 floats\n");
-static PyObject *py_matrix_scale(PyObject *UNUSED(self), PyObject *value)
+static PyObject *pygpu_matrix_scale(PyObject *UNUSED(self), PyObject *value)
{
float scale[3];
int len;
@@ -316,12 +316,12 @@ static PyObject *py_matrix_scale(PyObject *UNUSED(self), PyObject *value)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_scale_uniform_doc,
+PyDoc_STRVAR(pygpu_matrix_scale_uniform_doc,
".. function:: scale_uniform(scale)\n"
"\n"
" :param scale: Scale the current stack matrix.\n"
" :type scale: float\n");
-static PyObject *py_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value)
+static PyObject *pygpu_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value)
{
float scalar;
if ((scalar = PyFloat_AsDouble(value)) == -1.0f && PyErr_Occurred()) {
@@ -332,14 +332,14 @@ static PyObject *py_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_translate_doc,
+PyDoc_STRVAR(pygpu_matrix_translate_doc,
".. function:: translate(offset)\n"
"\n"
" Scale the current stack matrix.\n"
"\n"
" :param offset: Translate the current stack matrix.\n"
" :type offset: sequence of 2 or 3 floats\n");
-static PyObject *py_matrix_translate(PyObject *UNUSED(self), PyObject *value)
+static PyObject *pygpu_matrix_translate(PyObject *UNUSED(self), PyObject *value)
{
float offset[3];
int len;
@@ -362,34 +362,34 @@ static PyObject *py_matrix_translate(PyObject *UNUSED(self), PyObject *value)
/** \name Write State
* \{ */
-PyDoc_STRVAR(py_matrix_reset_doc,
+PyDoc_STRVAR(pygpu_matrix_reset_doc,
".. function:: reset()\n"
"\n"
" Empty stack and set to identity.\n");
-static PyObject *py_matrix_reset(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_reset(PyObject *UNUSED(self))
{
GPU_matrix_reset();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_load_identity_doc,
+PyDoc_STRVAR(pygpu_matrix_load_identity_doc,
".. function:: load_identity()\n"
"\n"
" Empty stack and set to identity.\n");
-static PyObject *py_matrix_load_identity(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_load_identity(PyObject *UNUSED(self))
{
GPU_matrix_identity_set();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_load_matrix_doc,
+PyDoc_STRVAR(pygpu_matrix_load_matrix_doc,
".. function:: load_matrix(matrix)\n"
"\n"
" Load a matrix into the stack.\n"
"\n"
" :param matrix: A 4x4 matrix.\n"
" :type matrix: :class:`mathutils.Matrix`\n");
-static PyObject *py_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value)
+static PyObject *pygpu_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value)
{
MatrixObject *pymat;
if (!Matrix_Parse4x4(value, &pymat)) {
@@ -399,14 +399,14 @@ static PyObject *py_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_matrix_load_projection_matrix_doc,
+PyDoc_STRVAR(pygpu_matrix_load_projection_matrix_doc,
".. function:: load_projection_matrix(matrix)\n"
"\n"
" Load a projection matrix into the stack.\n"
"\n"
" :param matrix: A 4x4 matrix.\n"
" :type matrix: :class:`mathutils.Matrix`\n");
-static PyObject *py_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObject *value)
+static PyObject *pygpu_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObject *value)
{
MatrixObject *pymat;
if (!Matrix_Parse4x4(value, &pymat)) {
@@ -422,42 +422,42 @@ static PyObject *py_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObje
/** \name Read State
* \{ */
-PyDoc_STRVAR(py_matrix_get_projection_matrix_doc,
+PyDoc_STRVAR(pygpu_matrix_get_projection_matrix_doc,
".. function:: get_projection_matrix()\n"
"\n"
" Return a copy of the projection matrix.\n"
"\n"
" :return: A 4x4 projection matrix.\n"
" :rtype: :class:`mathutils.Matrix`\n");
-static PyObject *py_matrix_get_projection_matrix(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_get_projection_matrix(PyObject *UNUSED(self))
{
float matrix[4][4];
GPU_matrix_projection_get(matrix);
return Matrix_CreatePyObject(&matrix[0][0], 4, 4, NULL);
}
-PyDoc_STRVAR(py_matrix_get_model_view_matrix_doc,
+PyDoc_STRVAR(pygpu_matrix_get_model_view_matrix_doc,
".. function:: get_model_view_matrix()\n"
"\n"
" Return a copy of the model-view matrix.\n"
"\n"
" :return: A 4x4 view matrix.\n"
" :rtype: :class:`mathutils.Matrix`\n");
-static PyObject *py_matrix_get_model_view_matrix(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_get_model_view_matrix(PyObject *UNUSED(self))
{
float matrix[4][4];
GPU_matrix_model_view_get(matrix);
return Matrix_CreatePyObject(&matrix[0][0], 4, 4, NULL);
}
-PyDoc_STRVAR(py_matrix_get_normal_matrix_doc,
+PyDoc_STRVAR(pygpu_matrix_get_normal_matrix_doc,
".. function:: get_normal_matrix()\n"
"\n"
" Return a copy of the normal matrix.\n"
"\n"
" :return: A 3x3 normal matrix.\n"
" :rtype: :class:`mathutils.Matrix`\n");
-static PyObject *py_matrix_get_normal_matrix(PyObject *UNUSED(self))
+static PyObject *pygpu_matrix_get_normal_matrix(PyObject *UNUSED(self))
{
float matrix[3][3];
GPU_matrix_normal_get(matrix);
@@ -470,87 +470,90 @@ static PyObject *py_matrix_get_normal_matrix(PyObject *UNUSED(self))
/** \name Module
* \{ */
-static struct PyMethodDef py_matrix_methods[] = {
+static struct PyMethodDef pygpu_matrix__tp_methods[] = {
/* Manage Stack */
- {"push", (PyCFunction)py_matrix_push, METH_NOARGS, py_matrix_push_doc},
- {"pop", (PyCFunction)py_matrix_pop, METH_NOARGS, py_matrix_pop_doc},
+ {"push", (PyCFunction)pygpu_matrix_push, METH_NOARGS, pygpu_matrix_push_doc},
+ {"pop", (PyCFunction)pygpu_matrix_pop, METH_NOARGS, pygpu_matrix_pop_doc},
{"push_projection",
- (PyCFunction)py_matrix_push_projection,
+ (PyCFunction)pygpu_matrix_push_projection,
METH_NOARGS,
- py_matrix_push_projection_doc},
+ pygpu_matrix_push_projection_doc},
{"pop_projection",
- (PyCFunction)py_matrix_pop_projection,
+ (PyCFunction)pygpu_matrix_pop_projection,
METH_NOARGS,
- py_matrix_pop_projection_doc},
+ pygpu_matrix_pop_projection_doc},
/* Stack (Context Manager) */
- {"push_pop", (PyCFunction)py_matrix_push_pop, METH_NOARGS, py_matrix_push_pop_doc},
+ {"push_pop", (PyCFunction)pygpu_matrix_push_pop, METH_NOARGS, pygpu_matrix_push_pop_doc},
{"push_pop_projection",
- (PyCFunction)py_matrix_push_pop_projection,
+ (PyCFunction)pygpu_matrix_push_pop_projection,
METH_NOARGS,
- py_matrix_push_pop_projection_doc},
+ pygpu_matrix_push_pop_projection_doc},
/* Manipulate State */
{"multiply_matrix",
- (PyCFunction)py_matrix_multiply_matrix,
+ (PyCFunction)pygpu_matrix_multiply_matrix,
METH_O,
- py_matrix_multiply_matrix_doc},
- {"scale", (PyCFunction)py_matrix_scale, METH_O, py_matrix_scale_doc},
- {"scale_uniform", (PyCFunction)py_matrix_scale_uniform, METH_O, py_matrix_scale_uniform_doc},
- {"translate", (PyCFunction)py_matrix_translate, METH_O, py_matrix_translate_doc},
+ pygpu_matrix_multiply_matrix_doc},
+ {"scale", (PyCFunction)pygpu_matrix_scale, METH_O, pygpu_matrix_scale_doc},
+ {"scale_uniform",
+ (PyCFunction)pygpu_matrix_scale_uniform,
+ METH_O,
+ pygpu_matrix_scale_uniform_doc},
+ {"translate", (PyCFunction)pygpu_matrix_translate, METH_O, pygpu_matrix_translate_doc},
/* TODO */
#if 0
- {"rotate", (PyCFunction)py_matrix_rotate, METH_O, py_matrix_rotate_doc},
- {"rotate_axis", (PyCFunction)py_matrix_rotate_axis, METH_O, py_matrix_rotate_axis_doc},
- {"look_at", (PyCFunction)py_matrix_look_at, METH_O, py_matrix_look_at_doc},
+ {"rotate", (PyCFunction)pygpu_matrix_rotate, METH_O, pygpu_matrix_rotate_doc},
+ {"rotate_axis", (PyCFunction)pygpu_matrix_rotate_axis, METH_O, pygpu_matrix_rotate_axis_doc},
+ {"look_at", (PyCFunction)pygpu_matrix_look_at, METH_O, pygpu_matrix_look_at_doc},
#endif
/* Write State */
- {"reset", (PyCFunction)py_matrix_reset, METH_NOARGS, py_matrix_reset_doc},
+ {"reset", (PyCFunction)pygpu_matrix_reset, METH_NOARGS, pygpu_matrix_reset_doc},
{"load_identity",
- (PyCFunction)py_matrix_load_identity,
+ (PyCFunction)pygpu_matrix_load_identity,
METH_NOARGS,
- py_matrix_load_identity_doc},
- {"load_matrix", (PyCFunction)py_matrix_load_matrix, METH_O, py_matrix_load_matrix_doc},
+ pygpu_matrix_load_identity_doc},
+ {"load_matrix", (PyCFunction)pygpu_matrix_load_matrix, METH_O, pygpu_matrix_load_matrix_doc},
{"load_projection_matrix",
- (PyCFunction)py_matrix_load_projection_matrix,
+ (PyCFunction)pygpu_matrix_load_projection_matrix,
METH_O,
- py_matrix_load_projection_matrix_doc},
+ pygpu_matrix_load_projection_matrix_doc},
/* Read State */
{"get_projection_matrix",
- (PyCFunction)py_matrix_get_projection_matrix,
+ (PyCFunction)pygpu_matrix_get_projection_matrix,
METH_NOARGS,
- py_matrix_get_projection_matrix_doc},
+ pygpu_matrix_get_projection_matrix_doc},
{"get_model_view_matrix",
- (PyCFunction)py_matrix_get_model_view_matrix,
+ (PyCFunction)pygpu_matrix_get_model_view_matrix,
METH_NOARGS,
- py_matrix_get_model_view_matrix_doc},
+ pygpu_matrix_get_model_view_matrix_doc},
{"get_normal_matrix",
- (PyCFunction)py_matrix_get_normal_matrix,
+ (PyCFunction)pygpu_matrix_get_normal_matrix,
METH_NOARGS,
- py_matrix_get_normal_matrix_doc},
+ pygpu_matrix_get_normal_matrix_doc},
{NULL, NULL, 0, NULL},
};
-PyDoc_STRVAR(py_matrix_doc, "This module provides access to the matrix stack.");
-static PyModuleDef BPyGPU_matrix_module_def = {
+PyDoc_STRVAR(pygpu_matrix__tp_doc, "This module provides access to the matrix stack.");
+static PyModuleDef pygpu_matrix_module_def = {
PyModuleDef_HEAD_INIT,
.m_name = "gpu.matrix",
- .m_doc = py_matrix_doc,
- .m_methods = py_matrix_methods,
+ .m_doc = pygpu_matrix__tp_doc,
+ .m_methods = pygpu_matrix__tp_methods,
};
-PyObject *BPyInit_gpu_matrix(void)
+PyObject *bpygpu_matrix_init(void)
{
PyObject *submodule;
- submodule = PyModule_Create(&BPyGPU_matrix_module_def);
+ submodule = PyModule_Create(&pygpu_matrix_module_def);
- if (PyType_Ready(&BPyGPU_matrix_stack_context_Type) < 0) {
+ if (PyType_Ready(&PyGPUMatrixStackContext_Type) < 0) {
return NULL;
}
diff --git a/source/blender/python/gpu/gpu_py_matrix.h b/source/blender/python/gpu/gpu_py_matrix.h
index 38a7f398b30..6af687f60ed 100644
--- a/source/blender/python/gpu/gpu_py_matrix.h
+++ b/source/blender/python/gpu/gpu_py_matrix.h
@@ -20,4 +20,4 @@
#pragma once
-PyObject *BPyInit_gpu_matrix(void);
+PyObject *bpygpu_matrix_init(void);
diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c
index 8d2df826722..a98d9649f6f 100644
--- a/source/blender/python/gpu/gpu_py_offscreen.c
+++ b/source/blender/python/gpu/gpu_py_offscreen.c
@@ -30,6 +30,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_string.h"
#include "BLI_utildefines.h"
#include "BKE_global.h"
@@ -54,14 +55,23 @@
#include "gpu_py_api.h"
#include "gpu_py_offscreen.h" /* own include */
+/* Define the free method to avoid breakage. */
+#define BPYGPU_USE_GPUOBJ_FREE_METHOD
+
/* -------------------------------------------------------------------- */
/** \name GPUOffScreen Common Utilities
* \{ */
-static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs)
+static int pygpu_offscreen_valid_check(BPyGPUOffScreen *py_ofs)
{
if (UNLIKELY(py_ofs->ofs == NULL)) {
- PyErr_SetString(PyExc_ReferenceError, "GPU offscreen was freed, no further access is valid");
+ PyErr_SetString(PyExc_ReferenceError,
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+ "GPU offscreen was freed, no further access is valid"
+#else
+ "GPU offscreen: internal error"
+#endif
+ );
return -1;
}
return 0;
@@ -69,7 +79,7 @@ static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs)
#define BPY_GPU_OFFSCREEN_CHECK_OBJ(bpygpu) \
{ \
- if (UNLIKELY(py_offscreen_valid_check(bpygpu) == -1)) { \
+ if (UNLIKELY(pygpu_offscreen_valid_check(bpygpu) == -1)) { \
return NULL; \
} \
} \
@@ -78,10 +88,129 @@ static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs)
/** \} */
/* -------------------------------------------------------------------- */
+/** \name Stack (Context Manager)
+ *
+ * Safer alternative to ensure balanced push/pop calls.
+ *
+ * \{ */
+
+typedef struct {
+ PyObject_HEAD /* required python macro */
+ BPyGPUOffScreen *py_offs;
+ int level;
+ bool is_explicitly_bound; /* Bound by "bind" method. */
+} OffScreenStackContext;
+
+static void pygpu_offscreen_stack_context__tp_dealloc(OffScreenStackContext *self)
+{
+ Py_DECREF(self->py_offs);
+ PyObject_DEL(self);
+}
+
+static PyObject *pygpu_offscreen_stack_context_enter(OffScreenStackContext *self)
+{
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self->py_offs);
+
+ if (!self->is_explicitly_bound) {
+ if (self->level != -1) {
+ PyErr_SetString(PyExc_RuntimeError, "Already in use");
+ return NULL;
+ }
+
+ GPU_offscreen_bind(self->py_offs->ofs, true);
+ self->level = GPU_framebuffer_stack_level_get();
+ }
+
+ Py_RETURN_NONE;
+}
+
+static PyObject *pygpu_offscreen_stack_context_exit(OffScreenStackContext *self,
+ PyObject *UNUSED(args))
+{
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self->py_offs);
+
+ if (self->level == -1) {
+ PyErr_SetString(PyExc_RuntimeError, "Not yet in use\n");
+ return NULL;
+ }
+
+ const int level = GPU_framebuffer_stack_level_get();
+ if (level != self->level) {
+ PyErr_Format(
+ PyExc_RuntimeError, "Level of bind mismatch, expected %d, got %d\n", self->level, level);
+ }
+
+ GPU_offscreen_unbind(self->py_offs->ofs, true);
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef pygpu_offscreen_stack_context__tp_methods[] = {
+ {"__enter__", (PyCFunction)pygpu_offscreen_stack_context_enter, METH_NOARGS},
+ {"__exit__", (PyCFunction)pygpu_offscreen_stack_context_exit, METH_VARARGS},
+ {NULL},
+};
+
+static PyTypeObject PyGPUOffscreenStackContext_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBufferStackContext",
+ .tp_basicsize = sizeof(OffScreenStackContext),
+ .tp_dealloc = (destructor)pygpu_offscreen_stack_context__tp_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_methods = pygpu_offscreen_stack_context__tp_methods,
+};
+
+PyDoc_STRVAR(pygpu_offscreen_bind_doc,
+ ".. function:: bind()\n"
+ "\n"
+ " Context manager to ensure balanced bind calls, even in the case of an error.\n");
+static PyObject *pygpu_offscreen_bind(BPyGPUOffScreen *self)
+{
+ OffScreenStackContext *ret = PyObject_New(OffScreenStackContext,
+ &PyGPUOffscreenStackContext_Type);
+ ret->py_offs = self;
+ ret->level = -1;
+ ret->is_explicitly_bound = false;
+ Py_INCREF(self);
+
+ pygpu_offscreen_stack_context_enter(ret);
+ ret->is_explicitly_bound = true;
+
+ return (PyObject *)ret;
+}
+
+PyDoc_STRVAR(pygpu_offscreen_unbind_doc,
+ ".. method:: unbind(restore=True)\n"
+ "\n"
+ " Unbind the offscreen object.\n"
+ "\n"
+ " :arg restore: Restore the OpenGL state, can only be used when the state has been "
+ "saved before.\n"
+ " :type restore: `bool`\n");
+static PyObject *pygpu_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds)
+{
+ bool restore = true;
+
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
+
+ static const char *_keywords[] = {"restore", NULL};
+ static _PyArg_Parser _parser = {"|O&:unbind", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, PyC_ParseBool, &restore)) {
+ return NULL;
+ }
+
+ GPU_offscreen_unbind(self->ofs, restore);
+ GPU_apply_state();
+ Py_RETURN_NONE;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
/** \name GPUOffscreen Type
* \{ */
-static PyObject *py_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds)
+static PyObject *pygpu_offscreen__tp_new(PyTypeObject *UNUSED(self),
+ PyObject *args,
+ PyObject *kwds)
{
BPYGPU_IS_INIT_OR_ERROR_OBJ;
@@ -90,7 +219,7 @@ static PyObject *py_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, Py
char err_out[256];
static const char *_keywords[] = {"width", "height", NULL};
- static _PyArg_Parser _parser = {"ii|i:GPUOffScreen.__new__", _keywords, 0};
+ static _PyArg_Parser _parser = {"ii:GPUOffScreen.__new__", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &width, &height)) {
return NULL;
}
@@ -99,7 +228,7 @@ static PyObject *py_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, Py
ofs = GPU_offscreen_create(width, height, true, false, err_out);
}
else {
- strncpy(err_out, "No active GPU context found", 256);
+ STRNCPY(err_out, "No active GPU context found");
}
if (ofs == NULL) {
@@ -112,23 +241,23 @@ static PyObject *py_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, Py
return BPyGPUOffScreen_CreatePyObject(ofs);
}
-PyDoc_STRVAR(py_offscreen_width_doc, "Width of the texture.\n\n:type: `int`");
-static PyObject *py_offscreen_width_get(BPyGPUOffScreen *self, void *UNUSED(type))
+PyDoc_STRVAR(pygpu_offscreen_width_doc, "Width of the texture.\n\n:type: `int`");
+static PyObject *pygpu_offscreen_width_get(BPyGPUOffScreen *self, void *UNUSED(type))
{
BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
return PyLong_FromLong(GPU_offscreen_width(self->ofs));
}
-PyDoc_STRVAR(py_offscreen_height_doc, "Height of the texture.\n\n:type: `int`");
-static PyObject *py_offscreen_height_get(BPyGPUOffScreen *self, void *UNUSED(type))
+PyDoc_STRVAR(pygpu_offscreen_height_doc, "Height of the texture.\n\n:type: `int`");
+static PyObject *pygpu_offscreen_height_get(BPyGPUOffScreen *self, void *UNUSED(type))
{
BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
return PyLong_FromLong(GPU_offscreen_height(self->ofs));
}
-PyDoc_STRVAR(py_offscreen_color_texture_doc,
+PyDoc_STRVAR(pygpu_offscreen_color_texture_doc,
"OpenGL bindcode for the color texture.\n\n:type: `int`");
-static PyObject *py_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNUSED(type))
+static PyObject *pygpu_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNUSED(type))
{
BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
GPUTexture *texture = GPU_offscreen_color_texture(self->ofs);
@@ -136,62 +265,7 @@ static PyObject *py_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNU
}
PyDoc_STRVAR(
- py_offscreen_bind_doc,
- ".. method:: bind(save=True)\n"
- "\n"
- " Bind the offscreen object.\n"
- " To make sure that the offscreen gets unbind whether an exception occurs or not,\n"
- " pack it into a `with` statement.\n"
- "\n"
- " :arg save: Save the current OpenGL state, so that it can be restored when unbinding.\n"
- " :type save: `bool`\n");
-static PyObject *py_offscreen_bind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds)
-{
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
- bool save = true;
-
- static const char *_keywords[] = {"save", NULL};
- static _PyArg_Parser _parser = {"|O&:bind", _keywords, 0};
- if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, PyC_ParseBool, &save)) {
- return NULL;
- }
-
- GPU_offscreen_bind(self->ofs, save);
- GPU_apply_state();
-
- self->is_saved = save;
- Py_INCREF(self);
-
- return (PyObject *)self;
-}
-
-PyDoc_STRVAR(py_offscreen_unbind_doc,
- ".. method:: unbind(restore=True)\n"
- "\n"
- " Unbind the offscreen object.\n"
- "\n"
- " :arg restore: Restore the OpenGL state, can only be used when the state has been "
- "saved before.\n"
- " :type restore: `bool`\n");
-static PyObject *py_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds)
-{
- bool restore = true;
-
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
-
- static const char *_keywords[] = {"restore", NULL};
- static _PyArg_Parser _parser = {"|O&:unbind", _keywords, 0};
- if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, PyC_ParseBool, &restore)) {
- return NULL;
- }
-
- GPU_offscreen_unbind(self->ofs, restore);
- GPU_apply_state();
- Py_RETURN_NONE;
-}
-
-PyDoc_STRVAR(
- py_offscreen_draw_view3d_doc,
+ pygpu_offscreen_draw_view3d_doc,
".. method:: draw_view3d(scene, view_layer, view3d, region, view_matrix, projection_matrix)\n"
"\n"
" Draw the 3d viewport in the offscreen object.\n"
@@ -208,7 +282,7 @@ PyDoc_STRVAR(
" :type view_matrix: :class:`mathutils.Matrix`\n"
" :arg projection_matrix: Projection Matrix (e.g. ``camera.calc_matrix_camera(...)``).\n"
" :type projection_matrix: :class:`mathutils.Matrix`\n");
-static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds)
+static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds)
{
MatrixObject *py_mat_view, *py_mat_projection;
PyObject *py_scene, *py_view_layer, *py_region, *py_view3d;
@@ -281,12 +355,13 @@ static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args,
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_offscreen_free_doc,
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+PyDoc_STRVAR(pygpu_offscreen_free_doc,
".. method:: free()\n"
"\n"
" Free the offscreen object.\n"
" The framebuffer, texture and render objects will no longer be accessible.\n");
-static PyObject *py_offscreen_free(BPyGPUOffScreen *self)
+static PyObject *pygpu_offscreen_free(BPyGPUOffScreen *self)
{
BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
@@ -294,17 +369,7 @@ static PyObject *py_offscreen_free(BPyGPUOffScreen *self)
self->ofs = NULL;
Py_RETURN_NONE;
}
-
-static PyObject *py_offscreen_bind_context_enter(BPyGPUOffScreen *UNUSED(self))
-{
- Py_RETURN_NONE;
-}
-
-static PyObject *py_offscreen_bind_context_exit(BPyGPUOffScreen *self, PyObject *UNUSED(args))
-{
- GPU_offscreen_unbind(self->ofs, self->is_saved);
- Py_RETURN_NONE;
-}
+#endif
static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self)
{
@@ -314,34 +379,34 @@ static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self)
Py_TYPE(self)->tp_free((PyObject *)self);
}
-static PyGetSetDef py_offscreen_getseters[] = {
+static PyGetSetDef pygpu_offscreen__tp_getseters[] = {
{"color_texture",
- (getter)py_offscreen_color_texture_get,
+ (getter)pygpu_offscreen_color_texture_get,
(setter)NULL,
- py_offscreen_color_texture_doc,
+ pygpu_offscreen_color_texture_doc,
NULL},
- {"width", (getter)py_offscreen_width_get, (setter)NULL, py_offscreen_width_doc, NULL},
- {"height", (getter)py_offscreen_height_get, (setter)NULL, py_offscreen_height_doc, NULL},
+ {"width", (getter)pygpu_offscreen_width_get, (setter)NULL, pygpu_offscreen_width_doc, NULL},
+ {"height", (getter)pygpu_offscreen_height_get, (setter)NULL, pygpu_offscreen_height_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
-static struct PyMethodDef py_offscreen_methods[] = {
- {"bind", (PyCFunction)py_offscreen_bind, METH_VARARGS | METH_KEYWORDS, py_offscreen_bind_doc},
+static struct PyMethodDef pygpu_offscreen__tp_methods[] = {
+ {"bind", (PyCFunction)pygpu_offscreen_bind, METH_NOARGS, pygpu_offscreen_bind_doc},
{"unbind",
- (PyCFunction)py_offscreen_unbind,
+ (PyCFunction)pygpu_offscreen_unbind,
METH_VARARGS | METH_KEYWORDS,
- py_offscreen_unbind_doc},
+ pygpu_offscreen_unbind_doc},
{"draw_view3d",
- (PyCFunction)py_offscreen_draw_view3d,
+ (PyCFunction)pygpu_offscreen_draw_view3d,
METH_VARARGS | METH_KEYWORDS,
- py_offscreen_draw_view3d_doc},
- {"free", (PyCFunction)py_offscreen_free, METH_NOARGS, py_offscreen_free_doc},
- {"__enter__", (PyCFunction)py_offscreen_bind_context_enter, METH_NOARGS},
- {"__exit__", (PyCFunction)py_offscreen_bind_context_exit, METH_VARARGS},
+ pygpu_offscreen_draw_view3d_doc},
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+ {"free", (PyCFunction)pygpu_offscreen_free, METH_NOARGS, pygpu_offscreen_free_doc},
+#endif
{NULL, NULL, 0, NULL},
};
-PyDoc_STRVAR(py_offscreen_doc,
+PyDoc_STRVAR(pygpu_offscreen__tp_doc,
".. class:: GPUOffScreen(width, height)\n"
"\n"
" This object gives access to off screen buffers.\n"
@@ -355,10 +420,10 @@ PyTypeObject BPyGPUOffScreen_Type = {
.tp_basicsize = sizeof(BPyGPUOffScreen),
.tp_dealloc = (destructor)BPyGPUOffScreen__tp_dealloc,
.tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_doc = py_offscreen_doc,
- .tp_methods = py_offscreen_methods,
- .tp_getset = py_offscreen_getseters,
- .tp_new = py_offscreen_new,
+ .tp_doc = pygpu_offscreen__tp_doc,
+ .tp_methods = pygpu_offscreen__tp_methods,
+ .tp_getset = pygpu_offscreen__tp_getseters,
+ .tp_new = pygpu_offscreen__tp_new,
};
/** \} */
diff --git a/source/blender/python/gpu/gpu_py_offscreen.h b/source/blender/python/gpu/gpu_py_offscreen.h
index efe5b57b22e..f551730cf54 100644
--- a/source/blender/python/gpu/gpu_py_offscreen.h
+++ b/source/blender/python/gpu/gpu_py_offscreen.h
@@ -28,7 +28,6 @@ extern PyTypeObject BPyGPUOffScreen_Type;
typedef struct BPyGPUOffScreen {
PyObject_HEAD struct GPUOffScreen *ofs;
- bool is_saved;
} BPyGPUOffScreen;
PyObject *BPyGPUOffScreen_CreatePyObject(struct GPUOffScreen *ofs) ATTR_NONNULL(1);
diff --git a/source/blender/python/gpu/gpu_py_select.c b/source/blender/python/gpu/gpu_py_select.c
index 4fa9d5ebc7a..b72aca6a792 100644
--- a/source/blender/python/gpu/gpu_py_select.c
+++ b/source/blender/python/gpu/gpu_py_select.c
@@ -40,14 +40,14 @@
/** \name Methods
* \{ */
-PyDoc_STRVAR(py_select_load_id_doc,
+PyDoc_STRVAR(pygpu_select_load_id_doc,
".. function:: load_id(id)\n"
"\n"
" Set the selection ID.\n"
"\n"
" :param id: Number (32-bit uint).\n"
" :type select: int\n");
-static PyObject *py_select_load_id(PyObject *UNUSED(self), PyObject *value)
+static PyObject *pygpu_select_load_id(PyObject *UNUSED(self), PyObject *value)
{
uint id;
if ((id = PyC_Long_AsU32(value)) == (uint)-1) {
@@ -62,25 +62,25 @@ static PyObject *py_select_load_id(PyObject *UNUSED(self), PyObject *value)
/** \name Module
* \{ */
-static struct PyMethodDef py_select_methods[] = {
+static struct PyMethodDef pygpu_select__tp_methods[] = {
/* Manage Stack */
- {"load_id", (PyCFunction)py_select_load_id, METH_O, py_select_load_id_doc},
+ {"load_id", (PyCFunction)pygpu_select_load_id, METH_O, pygpu_select_load_id_doc},
{NULL, NULL, 0, NULL},
};
-PyDoc_STRVAR(py_select_doc, "This module provides access to selection.");
-static PyModuleDef BPyGPU_select_module_def = {
+PyDoc_STRVAR(pygpu_select__tp_doc, "This module provides access to selection.");
+static PyModuleDef pygpu_select_module_def = {
PyModuleDef_HEAD_INIT,
.m_name = "gpu.select",
- .m_doc = py_select_doc,
- .m_methods = py_select_methods,
+ .m_doc = pygpu_select__tp_doc,
+ .m_methods = pygpu_select__tp_methods,
};
-PyObject *BPyInit_gpu_select(void)
+PyObject *bpygpu_select_init(void)
{
PyObject *submodule;
- submodule = PyModule_Create(&BPyGPU_select_module_def);
+ submodule = PyModule_Create(&pygpu_select_module_def);
return submodule;
}
diff --git a/source/blender/python/gpu/gpu_py_select.h b/source/blender/python/gpu/gpu_py_select.h
index 857cd7bb7f8..12152c82909 100644
--- a/source/blender/python/gpu/gpu_py_select.h
+++ b/source/blender/python/gpu/gpu_py_select.h
@@ -20,4 +20,4 @@
#pragma once
-PyObject *BPyInit_gpu_select(void);
+PyObject *bpygpu_select_init(void);
diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c
index 526b96f8584..2f9b67bdb6a 100644
--- a/source/blender/python/gpu/gpu_py_shader.c
+++ b/source/blender/python/gpu/gpu_py_shader.c
@@ -26,20 +26,25 @@
#include "BLI_utildefines.h"
#include "GPU_shader.h"
+#include "GPU_texture.h"
+#include "GPU_uniform_buffer.h"
#include "../generic/py_capi_utils.h"
#include "../generic/python_utildefines.h"
#include "../mathutils/mathutils.h"
#include "gpu_py_api.h"
-#include "gpu_py_shader.h" /* own include */
+#include "gpu_py_texture.h"
+#include "gpu_py_uniformbuffer.h"
#include "gpu_py_vertex_format.h"
+#include "gpu_py_shader.h" /* own include */
+
/* -------------------------------------------------------------------- */
/** \name Enum Conversion.
* \{ */
-static const struct PyC_StringEnumItems pygpu_bultinshader_items[] = {
+static const struct PyC_StringEnumItems pygpu_shader_builtin_items[] = {
{GPU_SHADER_2D_UNIFORM_COLOR, "2D_UNIFORM_COLOR"},
{GPU_SHADER_2D_FLAT_COLOR, "2D_FLAT_COLOR"},
{GPU_SHADER_2D_SMOOTH_COLOR, "2D_SMOOTH_COLOR"},
@@ -51,7 +56,9 @@ static const struct PyC_StringEnumItems pygpu_bultinshader_items[] = {
{0, NULL},
};
-static int py_uniform_location_get(GPUShader *shader, const char *name, const char *error_prefix)
+static int pygpu_shader_uniform_location_get(GPUShader *shader,
+ const char *name,
+ const char *error_prefix)
{
const int uniform = GPU_shader_get_uniform(shader, name);
@@ -68,7 +75,7 @@ static int py_uniform_location_get(GPUShader *shader, const char *name, const ch
/** \name Shader Type
* \{ */
-static PyObject *py_shader_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+static PyObject *pygpu_shader__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
{
BPYGPU_IS_INIT_OR_ERROR_OBJ;
@@ -107,17 +114,17 @@ static PyObject *py_shader_new(PyTypeObject *UNUSED(type), PyObject *args, PyObj
}
PyDoc_STRVAR(
- py_shader_bind_doc,
+ pygpu_shader_bind_doc,
".. method:: bind()\n"
"\n"
" Bind the shader object. Required to be able to change uniforms of this shader.\n");
-static PyObject *py_shader_bind(BPyGPUShader *self)
+static PyObject *pygpu_shader_bind(BPyGPUShader *self)
{
GPU_shader_bind(self->shader);
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_shader_uniform_from_name_doc,
+PyDoc_STRVAR(pygpu_shader_uniform_from_name_doc,
".. method:: uniform_from_name(name)\n"
"\n"
" Get uniform location by name.\n"
@@ -126,14 +133,15 @@ PyDoc_STRVAR(py_shader_uniform_from_name_doc,
" :type name: `str`\n"
" :return: Location of the uniform variable.\n"
" :rtype: `int`\n");
-static PyObject *py_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg)
+static PyObject *pygpu_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg)
{
const char *name = PyUnicode_AsUTF8(arg);
if (name == NULL) {
return NULL;
}
- const int uniform = py_uniform_location_get(self->shader, name, "GPUShader.get_uniform");
+ const int uniform = pygpu_shader_uniform_location_get(
+ self->shader, name, "GPUShader.get_uniform");
if (uniform == -1) {
return NULL;
@@ -143,7 +151,7 @@ static PyObject *py_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg)
}
PyDoc_STRVAR(
- py_shader_uniform_block_from_name_doc,
+ pygpu_shader_uniform_block_from_name_doc,
".. method:: uniform_block_from_name(name)\n"
"\n"
" Get uniform block location by name.\n"
@@ -152,7 +160,7 @@ PyDoc_STRVAR(
" :type name: `str`\n"
" :return: The location of the uniform block variable.\n"
" :rtype: `int`\n");
-static PyObject *py_shader_uniform_block_from_name(BPyGPUShader *self, PyObject *arg)
+static PyObject *pygpu_shader_uniform_block_from_name(BPyGPUShader *self, PyObject *arg)
{
const char *name = PyUnicode_AsUTF8(arg);
if (name == NULL) {
@@ -169,12 +177,12 @@ static PyObject *py_shader_uniform_block_from_name(BPyGPUShader *self, PyObject
return PyLong_FromLong(uniform);
}
-static bool py_shader_uniform_vector_imp(PyObject *args,
- int elem_size,
- int *r_location,
- int *r_length,
- int *r_count,
- Py_buffer *r_pybuffer)
+static bool pygpu_shader_uniform_vector_impl(PyObject *args,
+ int elem_size,
+ int *r_location,
+ int *r_length,
+ int *r_count,
+ Py_buffer *r_pybuffer)
{
PyObject *buffer;
@@ -197,7 +205,7 @@ static bool py_shader_uniform_vector_imp(PyObject *args,
return true;
}
-PyDoc_STRVAR(py_shader_uniform_vector_float_doc,
+PyDoc_STRVAR(pygpu_shader_uniform_vector_float_doc,
".. method:: uniform_vector_float(location, buffer, length, count)\n"
"\n"
" Set the buffer to fill the uniform.\n"
@@ -217,13 +225,14 @@ PyDoc_STRVAR(py_shader_uniform_vector_float_doc,
" :param count: Specifies the number of elements, vector or matrices that are to "
"be modified.\n"
" :type count: int\n");
-static PyObject *py_shader_uniform_vector_float(BPyGPUShader *self, PyObject *args)
+static PyObject *pygpu_shader_uniform_vector_float(BPyGPUShader *self, PyObject *args)
{
int location, length, count;
Py_buffer pybuffer;
- if (!py_shader_uniform_vector_imp(args, sizeof(float), &location, &length, &count, &pybuffer)) {
+ if (!pygpu_shader_uniform_vector_impl(
+ args, sizeof(float), &location, &length, &count, &pybuffer)) {
return NULL;
}
@@ -234,17 +243,18 @@ static PyObject *py_shader_uniform_vector_float(BPyGPUShader *self, PyObject *ar
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_shader_uniform_vector_int_doc,
+PyDoc_STRVAR(pygpu_shader_uniform_vector_int_doc,
".. method:: uniform_vector_int(location, buffer, length, count)\n"
"\n"
" See GPUShader.uniform_vector_float(...) description.\n");
-static PyObject *py_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args)
+static PyObject *pygpu_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args)
{
int location, length, count;
Py_buffer pybuffer;
- if (!py_shader_uniform_vector_imp(args, sizeof(int), &location, &length, &count, &pybuffer)) {
+ if (!pygpu_shader_uniform_vector_impl(
+ args, sizeof(int), &location, &length, &count, &pybuffer)) {
return NULL;
}
@@ -255,7 +265,7 @@ static PyObject *py_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_shader_uniform_bool_doc,
+PyDoc_STRVAR(pygpu_shader_uniform_bool_doc,
".. method:: uniform_bool(name, seq)\n"
"\n"
" Specify the value of a uniform variable for the current program object.\n"
@@ -264,7 +274,7 @@ PyDoc_STRVAR(py_shader_uniform_bool_doc,
" :type name: str\n"
" :param seq: Value that will be used to update the specified uniform variable.\n"
" :type seq: sequence of bools\n");
-static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args)
+static PyObject *pygpu_shader_uniform_bool(BPyGPUShader *self, PyObject *args)
{
const char *error_prefix = "GPUShader.uniform_bool";
@@ -308,7 +318,7 @@ static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args)
return NULL;
}
- const int location = py_uniform_location_get(self->shader, params.id, error_prefix);
+ const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix);
if (location == -1) {
return NULL;
@@ -319,7 +329,7 @@ static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_shader_uniform_float_doc,
+PyDoc_STRVAR(pygpu_shader_uniform_float_doc,
".. method:: uniform_float(name, value)\n"
"\n"
" Specify the value of a uniform variable for the current program object.\n"
@@ -328,7 +338,7 @@ PyDoc_STRVAR(py_shader_uniform_float_doc,
" :type name: str\n"
" :param value: Value that will be used to update the specified uniform variable.\n"
" :type value: single number or sequence of numbers\n");
-static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args)
+static PyObject *pygpu_shader_uniform_float(BPyGPUShader *self, PyObject *args)
{
const char *error_prefix = "GPUShader.uniform_float";
@@ -377,7 +387,7 @@ static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args)
return NULL;
}
- const int location = py_uniform_location_get(self->shader, params.id, error_prefix);
+ const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix);
if (location == -1) {
return NULL;
@@ -388,7 +398,7 @@ static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_shader_uniform_int_doc,
+PyDoc_STRVAR(pygpu_shader_uniform_int_doc,
".. method:: uniform_int(name, seq)\n"
"\n"
" Specify the value of a uniform variable for the current program object.\n"
@@ -397,7 +407,7 @@ PyDoc_STRVAR(py_shader_uniform_int_doc,
" :type name: str\n"
" :param seq: Value that will be used to update the specified uniform variable.\n"
" :type seq: sequence of numbers\n");
-static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args)
+static PyObject *pygpu_shader_uniform_int(BPyGPUShader *self, PyObject *args)
{
const char *error_prefix = "GPUShader.uniform_int";
@@ -447,7 +457,7 @@ static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args)
return NULL;
}
- const int location = py_uniform_location_get(self->shader, params.id, error_prefix);
+ const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix);
if (location == -1) {
return NULL;
@@ -458,8 +468,66 @@ static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args)
Py_RETURN_NONE;
}
+PyDoc_STRVAR(pygpu_shader_uniform_sampler_doc,
+ ".. method:: uniform_sampler(name, texture)\n"
+ "\n"
+ " Specify the value of a texture uniform variable for the current GPUShader.\n"
+ "\n"
+ " :param name: name of the uniform variable whose texture is to be specified.\n"
+ " :type name: str\n"
+ " :param texture: Texture to attach.\n"
+ " :type texture: :class:`gpu.types.GPUTexture`\n");
+static PyObject *pygpu_shader_uniform_sampler(BPyGPUShader *self, PyObject *args)
+{
+ const char *name;
+ BPyGPUTexture *py_texture;
+ if (!PyArg_ParseTuple(
+ args, "sO!:GPUShader.uniform_sampler", &name, &BPyGPUTexture_Type, &py_texture)) {
+ return NULL;
+ }
+
+ int slot = GPU_shader_get_texture_binding(self->shader, name);
+ GPU_texture_bind(py_texture->tex, slot);
+ GPU_shader_uniform_1i(self->shader, name, slot);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(
+ pygpu_shader_uniform_block_doc,
+ ".. method:: uniform_block(name, ubo)\n"
+ "\n"
+ " Specify the value of an uniform buffer object variable for the current GPUShader.\n"
+ "\n"
+ " :param name: name of the uniform variable whose UBO is to be specified.\n"
+ " :type name: str\n"
+ " :param ubo: Uniform Buffer to attach.\n"
+ " :type texture: :class:`gpu.types.GPUUniformBuf`\n");
+static PyObject *pygpu_shader_uniform_block(BPyGPUShader *self, PyObject *args)
+{
+ const char *name;
+ BPyGPUUniformBuf *py_ubo;
+ if (!PyArg_ParseTuple(
+ args, "sO!:GPUShader.uniform_block", &name, &BPyGPUUniformBuf_Type, &py_ubo)) {
+ return NULL;
+ }
+
+ int slot = GPU_shader_get_uniform_block(self->shader, name);
+ if (slot == -1) {
+ PyErr_SetString(
+ PyExc_BufferError,
+ "GPUShader.uniform_buffer: uniform block not found, make sure the name is correct");
+ return NULL;
+ }
+
+ GPU_uniformbuf_bind(py_ubo->ubo, slot);
+ GPU_shader_uniform_1i(self->shader, name, slot);
+
+ Py_RETURN_NONE;
+}
+
PyDoc_STRVAR(
- py_shader_attr_from_name_doc,
+ pygpu_shader_attr_from_name_doc,
".. method:: attr_from_name(name)\n"
"\n"
" Get attribute location by name.\n"
@@ -468,7 +536,7 @@ PyDoc_STRVAR(
" :type name: str\n"
" :return: The location of an attribute variable.\n"
" :rtype: int\n");
-static PyObject *py_shader_attr_from_name(BPyGPUShader *self, PyObject *arg)
+static PyObject *pygpu_shader_attr_from_name(BPyGPUShader *self, PyObject *arg)
{
const char *name = PyUnicode_AsUTF8(arg);
if (name == NULL) {
@@ -485,69 +553,83 @@ static PyObject *py_shader_attr_from_name(BPyGPUShader *self, PyObject *arg)
return PyLong_FromLong(attr);
}
-PyDoc_STRVAR(py_shader_calc_format_doc,
+PyDoc_STRVAR(pygpu_shader_calc_format_doc,
".. method:: calc_format()\n"
"\n"
" Build a new format based on the attributes of the shader.\n"
"\n"
" :return: vertex attribute format for the shader\n"
" :rtype: GPUVertFormat\n");
-static PyObject *py_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg))
+static PyObject *pygpu_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg))
{
BPyGPUVertFormat *ret = (BPyGPUVertFormat *)BPyGPUVertFormat_CreatePyObject(NULL);
GPU_vertformat_from_shader(&ret->fmt, self->shader);
return (PyObject *)ret;
}
-static struct PyMethodDef py_shader_methods[] = {
- {"bind", (PyCFunction)py_shader_bind, METH_NOARGS, py_shader_bind_doc},
+static struct PyMethodDef pygpu_shader__tp_methods[] = {
+ {"bind", (PyCFunction)pygpu_shader_bind, METH_NOARGS, pygpu_shader_bind_doc},
{"uniform_from_name",
- (PyCFunction)py_shader_uniform_from_name,
+ (PyCFunction)pygpu_shader_uniform_from_name,
METH_O,
- py_shader_uniform_from_name_doc},
+ pygpu_shader_uniform_from_name_doc},
{"uniform_block_from_name",
- (PyCFunction)py_shader_uniform_block_from_name,
+ (PyCFunction)pygpu_shader_uniform_block_from_name,
METH_O,
- py_shader_uniform_block_from_name_doc},
+ pygpu_shader_uniform_block_from_name_doc},
{"uniform_vector_float",
- (PyCFunction)py_shader_uniform_vector_float,
+ (PyCFunction)pygpu_shader_uniform_vector_float,
METH_VARARGS,
- py_shader_uniform_vector_float_doc},
+ pygpu_shader_uniform_vector_float_doc},
{"uniform_vector_int",
- (PyCFunction)py_shader_uniform_vector_int,
+ (PyCFunction)pygpu_shader_uniform_vector_int,
METH_VARARGS,
- py_shader_uniform_vector_int_doc},
+ pygpu_shader_uniform_vector_int_doc},
{"uniform_bool",
- (PyCFunction)py_shader_uniform_bool,
+ (PyCFunction)pygpu_shader_uniform_bool,
METH_VARARGS,
- py_shader_uniform_bool_doc},
+ pygpu_shader_uniform_bool_doc},
{"uniform_float",
- (PyCFunction)py_shader_uniform_float,
+ (PyCFunction)pygpu_shader_uniform_float,
+ METH_VARARGS,
+ pygpu_shader_uniform_float_doc},
+ {"uniform_int",
+ (PyCFunction)pygpu_shader_uniform_int,
METH_VARARGS,
- py_shader_uniform_float_doc},
- {"uniform_int", (PyCFunction)py_shader_uniform_int, METH_VARARGS, py_shader_uniform_int_doc},
+ pygpu_shader_uniform_int_doc},
+ {"uniform_sampler",
+ (PyCFunction)pygpu_shader_uniform_sampler,
+ METH_VARARGS,
+ pygpu_shader_uniform_sampler_doc},
+ {"uniform_block",
+ (PyCFunction)pygpu_shader_uniform_block,
+ METH_VARARGS,
+ pygpu_shader_uniform_block_doc},
{"attr_from_name",
- (PyCFunction)py_shader_attr_from_name,
+ (PyCFunction)pygpu_shader_attr_from_name,
METH_O,
- py_shader_attr_from_name_doc},
- {"format_calc", (PyCFunction)py_shader_calc_format, METH_NOARGS, py_shader_calc_format_doc},
+ pygpu_shader_attr_from_name_doc},
+ {"format_calc",
+ (PyCFunction)pygpu_shader_calc_format,
+ METH_NOARGS,
+ pygpu_shader_calc_format_doc},
{NULL, NULL, 0, NULL},
};
PyDoc_STRVAR(
- py_shader_program_doc,
+ pygpu_shader_program_doc,
"The name of the program object for use by the OpenGL API (read-only).\n\n:type: int");
-static PyObject *py_shader_program_get(BPyGPUShader *self, void *UNUSED(closure))
+static PyObject *pygpu_shader_program_get(BPyGPUShader *self, void *UNUSED(closure))
{
return PyLong_FromLong(GPU_shader_get_program(self->shader));
}
-static PyGetSetDef py_shader_getseters[] = {
- {"program", (getter)py_shader_program_get, (setter)NULL, py_shader_program_doc, NULL},
+static PyGetSetDef pygpu_shader__tp_getseters[] = {
+ {"program", (getter)pygpu_shader_program_get, (setter)NULL, pygpu_shader_program_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
-static void py_shader_dealloc(BPyGPUShader *self)
+static void pygpu_shader__tp_dealloc(BPyGPUShader *self)
{
if (self->is_builtin == false) {
GPU_shader_free(self->shader);
@@ -556,7 +638,7 @@ static void py_shader_dealloc(BPyGPUShader *self)
}
PyDoc_STRVAR(
- py_shader_doc,
+ pygpu_shader__tp_doc,
".. class:: GPUShader(vertexcode, fragcode, geocode=None, libcode=None, defines=None)\n"
"\n"
" GPUShader combines multiple GLSL shaders into a program used for drawing.\n"
@@ -570,9 +652,6 @@ PyDoc_STRVAR(
" ``GL_ARB_texture_gather``, ``GL_ARB_texture_cube_map_array``\n"
" and ``GL_ARB_shader_draw_parameters``.\n"
"\n"
- " To debug shaders, use the ``--debug-gpu-shaders`` command line option\n"
- " to see full GLSL shader compilation and linking errors.\n"
- "\n"
" For drawing user interface elements and gizmos, use\n"
" ``fragOutput = blender_srgb_to_framebuffer_space(fragOutput)``\n"
" to transform the output sRGB colors to the frame-buffer color-space.\n"
@@ -590,12 +669,12 @@ PyDoc_STRVAR(
PyTypeObject BPyGPUShader_Type = {
PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUShader",
.tp_basicsize = sizeof(BPyGPUShader),
- .tp_dealloc = (destructor)py_shader_dealloc,
+ .tp_dealloc = (destructor)pygpu_shader__tp_dealloc,
.tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_doc = py_shader_doc,
- .tp_methods = py_shader_methods,
- .tp_getset = py_shader_getseters,
- .tp_new = py_shader_new,
+ .tp_doc = pygpu_shader__tp_doc,
+ .tp_methods = pygpu_shader__tp_methods,
+ .tp_getset = pygpu_shader__tp_getseters,
+ .tp_new = pygpu_shader__tp_new,
};
/** \} */
@@ -604,18 +683,18 @@ PyTypeObject BPyGPUShader_Type = {
/** \name gpu.shader Module API
* \{ */
-PyDoc_STRVAR(py_shader_unbind_doc,
+PyDoc_STRVAR(pygpu_shader_unbind_doc,
".. function:: unbind()\n"
"\n"
" Unbind the bound shader object.\n");
-static PyObject *py_shader_unbind(BPyGPUShader *UNUSED(self))
+static PyObject *pygpu_shader_unbind(BPyGPUShader *UNUSED(self))
{
GPU_shader_unbind();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(py_shader_from_builtin_doc,
- ".. function:: from_builtin(shader_name)\n"
+PyDoc_STRVAR(pygpu_shader_from_builtin_doc,
+ ".. function:: from_builtin(pygpu_shader_name)\n"
"\n"
" Shaders that are embedded in the blender internal code.\n"
" They all read the uniform ``mat4 ModelViewProjectionMatrix``,\n"
@@ -623,7 +702,7 @@ PyDoc_STRVAR(py_shader_from_builtin_doc,
" For more details, you can check the shader code with the\n"
" :func:`gpu.shader.code_from_builtin` function.\n"
"\n"
- " :param shader_name: One of these builtin shader names:\n\n"
+ " :param pygpu_shader_name: One of these builtin shader names:\n\n"
" - ``2D_UNIFORM_COLOR``\n"
" - ``2D_FLAT_COLOR``\n"
" - ``2D_SMOOTH_COLOR``\n"
@@ -631,14 +710,14 @@ PyDoc_STRVAR(py_shader_from_builtin_doc,
" - ``3D_UNIFORM_COLOR``\n"
" - ``3D_FLAT_COLOR``\n"
" - ``3D_SMOOTH_COLOR``\n"
- " :type shader_name: str\n"
+ " :type pygpu_shader_name: str\n"
" :return: Shader object corresponding to the given name.\n"
" :rtype: :class:`bpy.types.GPUShader`\n");
-static PyObject *py_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg)
+static PyObject *pygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg)
{
BPYGPU_IS_INIT_OR_ERROR_OBJ;
- struct PyC_StringEnum pygpu_bultinshader = {pygpu_bultinshader_items};
+ struct PyC_StringEnum pygpu_bultinshader = {pygpu_shader_builtin_items};
if (!PyC_ParseStringEnum(arg, &pygpu_bultinshader)) {
return NULL;
}
@@ -648,12 +727,12 @@ static PyObject *py_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg)
return BPyGPUShader_CreatePyObject(shader, true);
}
-PyDoc_STRVAR(py_shader_code_from_builtin_doc,
- ".. function:: code_from_builtin(shader_name)\n"
+PyDoc_STRVAR(pygpu_shader_code_from_builtin_doc,
+ ".. function:: code_from_builtin(pygpu_shader_name)\n"
"\n"
" Exposes the internal shader code for query.\n"
"\n"
- " :param shader_name: One of these builtin shader names:\n\n"
+ " :param pygpu_shader_name: One of these builtin shader names:\n\n"
" - ``2D_UNIFORM_COLOR``\n"
" - ``2D_FLAT_COLOR``\n"
" - ``2D_SMOOTH_COLOR``\n"
@@ -661,10 +740,10 @@ PyDoc_STRVAR(py_shader_code_from_builtin_doc,
" - ``3D_UNIFORM_COLOR``\n"
" - ``3D_FLAT_COLOR``\n"
" - ``3D_SMOOTH_COLOR``\n"
- " :type shader_name: str\n"
+ " :type pygpu_shader_name: str\n"
" :return: Vertex, fragment and geometry shader codes.\n"
" :rtype: dict\n");
-static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg)
+static PyObject *pygpu_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg)
{
const char *vert;
const char *frag;
@@ -673,7 +752,7 @@ static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObjec
PyObject *item, *r_dict;
- struct PyC_StringEnum pygpu_bultinshader = {pygpu_bultinshader_items};
+ struct PyC_StringEnum pygpu_bultinshader = {pygpu_shader_builtin_items};
if (!PyC_ParseStringEnum(arg, &pygpu_bultinshader)) {
return NULL;
}
@@ -700,17 +779,20 @@ static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObjec
return r_dict;
}
-static struct PyMethodDef py_shader_module_methods[] = {
- {"unbind", (PyCFunction)py_shader_unbind, METH_NOARGS, py_shader_unbind_doc},
- {"from_builtin", (PyCFunction)py_shader_from_builtin, METH_O, py_shader_from_builtin_doc},
+static struct PyMethodDef pygpu_shader_module__tp_methods[] = {
+ {"unbind", (PyCFunction)pygpu_shader_unbind, METH_NOARGS, pygpu_shader_unbind_doc},
+ {"from_builtin",
+ (PyCFunction)pygpu_shader_from_builtin,
+ METH_O,
+ pygpu_shader_from_builtin_doc},
{"code_from_builtin",
- (PyCFunction)py_shader_code_from_builtin,
+ (PyCFunction)pygpu_shader_code_from_builtin,
METH_O,
- py_shader_code_from_builtin_doc},
+ pygpu_shader_code_from_builtin_doc},
{NULL, NULL, 0, NULL},
};
-PyDoc_STRVAR(py_shader_module_doc,
+PyDoc_STRVAR(pygpu_shader_module__tp_doc,
"This module provides access to GPUShader internal functions.\n"
"\n"
".. rubric:: Built-in shaders\n"
@@ -739,11 +821,11 @@ PyDoc_STRVAR(py_shader_module_doc,
"3D_SMOOTH_COLOR\n"
" :Attributes: vec3 pos, vec4 color\n"
" :Uniforms: none\n");
-static PyModuleDef BPyGPU_shader_module_def = {
+static PyModuleDef pygpu_shader_module_def = {
PyModuleDef_HEAD_INIT,
.m_name = "gpu.shader",
- .m_doc = py_shader_module_doc,
- .m_methods = py_shader_module_methods,
+ .m_doc = pygpu_shader_module__tp_doc,
+ .m_methods = pygpu_shader_module__tp_methods,
};
/** \} */
@@ -763,11 +845,11 @@ PyObject *BPyGPUShader_CreatePyObject(GPUShader *shader, bool is_builtin)
return (PyObject *)self;
}
-PyObject *BPyInit_gpu_shader(void)
+PyObject *bpygpu_shader_init(void)
{
PyObject *submodule;
- submodule = PyModule_Create(&BPyGPU_shader_module_def);
+ submodule = PyModule_Create(&pygpu_shader_module_def);
return submodule;
}
diff --git a/source/blender/python/gpu/gpu_py_shader.h b/source/blender/python/gpu/gpu_py_shader.h
index ee26c26acd4..745b9351649 100644
--- a/source/blender/python/gpu/gpu_py_shader.h
+++ b/source/blender/python/gpu/gpu_py_shader.h
@@ -30,4 +30,4 @@ typedef struct BPyGPUShader {
} BPyGPUShader;
PyObject *BPyGPUShader_CreatePyObject(struct GPUShader *shader, bool is_builtin);
-PyObject *BPyInit_gpu_shader(void);
+PyObject *bpygpu_shader_init(void);
diff --git a/source/blender/python/gpu/gpu_py_state.c b/source/blender/python/gpu/gpu_py_state.c
new file mode 100644
index 00000000000..d1b3a01e2e4
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_state.c
@@ -0,0 +1,423 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ *
+ * This file defines the gpu.state API.
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "GPU_state.h"
+
+#include "../generic/py_capi_utils.h"
+#include "../generic/python_utildefines.h"
+
+#include "gpu_py_state.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+/** \name Helper Functions
+ * \{ */
+
+static const struct PyC_StringEnumItems pygpu_state_blend_items[] = {
+ {GPU_BLEND_NONE, "NONE"},
+ {GPU_BLEND_ALPHA, "ALPHA"},
+ {GPU_BLEND_ALPHA_PREMULT, "ALPHA_PREMULT"},
+ {GPU_BLEND_ADDITIVE, "ADDITIVE"},
+ {GPU_BLEND_ADDITIVE_PREMULT, "ADDITIVE_PREMULT"},
+ {GPU_BLEND_MULTIPLY, "MULTIPLY"},
+ {GPU_BLEND_SUBTRACT, "SUBTRACT"},
+ {GPU_BLEND_INVERT, "INVERT"},
+ /**
+ * These are quite special cases used inside the draw manager.
+ * {GPU_BLEND_OIT, "OIT"},
+ * {GPU_BLEND_BACKGROUND, "BACKGROUND"},
+ * {GPU_BLEND_CUSTOM, "CUSTOM"},
+ */
+ {0, NULL},
+};
+
+static const struct PyC_StringEnumItems pygpu_state_depthtest_items[] = {
+ {GPU_DEPTH_NONE, "NONE"},
+ {GPU_DEPTH_ALWAYS, "ALWAYS"},
+ {GPU_DEPTH_LESS, "LESS"},
+ {GPU_DEPTH_LESS_EQUAL, "LESS_EQUAL"},
+ {GPU_DEPTH_EQUAL, "EQUAL"},
+ {GPU_DEPTH_GREATER, "GREATER"},
+ {GPU_DEPTH_GREATER_EQUAL, "GREATER_EQUAL"},
+ {0, NULL},
+};
+
+static const struct PyC_StringEnumItems pygpu_state_faceculling_items[] = {
+ {GPU_CULL_NONE, "NONE"},
+ {GPU_CULL_FRONT, "FRONT"},
+ {GPU_CULL_BACK, "BACK"},
+ {0, NULL},
+};
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Manage Stack
+ * \{ */
+
+PyDoc_STRVAR(pygpu_state_blend_set_doc,
+ ".. function:: blend_set(mode)\n"
+ "\n"
+ " Defines the fixed pipeline blending equation.\n"
+ "\n"
+ " :param mode: One of these modes: {\n"
+ " `NONE`,\n"
+ " `ALPHA`,\n"
+ " `ALPHA_PREMULT`,\n"
+ " `ADDITIVE`,\n"
+ " `ADDITIVE_PREMULT`,\n"
+ " `MULTIPLY`,\n"
+ " `SUBTRACT`,\n"
+ " `INVERT`,\n"
+ //" `OIT`,\n"
+ //" `BACKGROUND`,\n"
+ //" `CUSTOM`,\n"
+ " :type mode: `str`\n");
+static PyObject *pygpu_state_blend_set(PyObject *UNUSED(self), PyObject *value)
+{
+ struct PyC_StringEnum pygpu_blend = {pygpu_state_blend_items};
+ if (!PyC_ParseStringEnum(value, &pygpu_blend)) {
+ return NULL;
+ }
+ GPU_blend(pygpu_blend.value_found);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_blend_get_doc,
+ ".. function:: blend_get()\n"
+ "\n"
+ " Current blending equation.\n"
+ "\n");
+static PyObject *pygpu_state_blend_get(PyObject *UNUSED(self))
+{
+ eGPUBlend blend = GPU_blend_get();
+ return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_state_blend_items, blend));
+}
+
+PyDoc_STRVAR(pygpu_state_depth_test_set_doc,
+ ".. function:: depth_test_set(mode)\n"
+ "\n"
+ " Defines the depth_test equation.\n"
+ "\n"
+ " :param mode: One of these modes: {\n"
+ " `NONE`,\n"
+ " `ALWAYS`,\n"
+ " `LESS`,\n"
+ " `LESS_EQUAL`,\n"
+ " `EQUAL`,\n"
+ " `GREATER`,\n"
+ " `GREATER_EQUAL`,\n"
+ " :type mode: `str`\n");
+static PyObject *pygpu_state_depth_test_set(PyObject *UNUSED(self), PyObject *value)
+{
+ struct PyC_StringEnum pygpu_depth_test = {pygpu_state_depthtest_items};
+ if (!PyC_ParseStringEnum(value, &pygpu_depth_test)) {
+ return NULL;
+ }
+ GPU_depth_test(pygpu_depth_test.value_found);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_depth_test_get_doc,
+ ".. function:: blend_depth_test_get()\n"
+ "\n"
+ " Current depth_test equation.\n"
+ "\n");
+static PyObject *pygpu_state_depth_test_get(PyObject *UNUSED(self))
+{
+ eGPUDepthTest test = GPU_depth_test_get();
+ return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_state_depthtest_items, test));
+}
+
+PyDoc_STRVAR(pygpu_state_depth_mask_set_doc,
+ ".. function:: depth_mask_set(value)\n"
+ "\n"
+ " Write to depth component.\n"
+ "\n"
+ " :param value: True for writing to the depth component.\n"
+ " :type near: `bool`\n");
+static PyObject *pygpu_state_depth_mask_set(PyObject *UNUSED(self), PyObject *value)
+{
+ bool write_to_depth;
+ if (!PyC_ParseBool(value, &write_to_depth)) {
+ return NULL;
+ }
+ GPU_depth_mask(write_to_depth);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_depth_mask_get_doc,
+ ".. function:: depth_mask_set_get()\n"
+ "\n"
+ " Writing status in the depth component.\n");
+static PyObject *pygpu_state_depth_mask_get(PyObject *UNUSED(self))
+{
+ return PyBool_FromLong(GPU_depth_mask_get());
+}
+
+PyDoc_STRVAR(pygpu_state_viewport_set_doc,
+ ".. function:: viewport_set(x, y, xsize, ysize)\n"
+ "\n"
+ " Specifies the viewport of the active framebuffer.\n"
+ " Note: The viewport state is not saved upon framebuffer rebind.\n"
+ "\n"
+ " :param x, y: lower left corner of the viewport_set rectangle, in pixels.\n"
+ " :param width, height: width and height of the viewport_set.\n"
+ " :type x, y, xsize, ysize: `int`\n");
+static PyObject *pygpu_state_viewport_set(PyObject *UNUSED(self), PyObject *args)
+{
+ int x, y, xsize, ysize;
+ if (!PyArg_ParseTuple(args, "iiii:viewport_set", &x, &y, &xsize, &ysize)) {
+ return NULL;
+ }
+
+ GPU_viewport(x, y, xsize, ysize);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_viewport_get_doc,
+ ".. function:: viewport_get()\n"
+ "\n"
+ " Viewport of the active framebuffer.\n");
+static PyObject *pygpu_state_viewport_get(PyObject *UNUSED(self), PyObject *UNUSED(args))
+{
+ int viewport[4];
+ GPU_viewport_size_get_i(viewport);
+
+ PyObject *ret = PyTuple_New(4);
+ PyTuple_SET_ITEMS(ret,
+ PyLong_FromLong(viewport[0]),
+ PyLong_FromLong(viewport[1]),
+ PyLong_FromLong(viewport[2]),
+ PyLong_FromLong(viewport[3]));
+ return ret;
+}
+
+PyDoc_STRVAR(pygpu_state_line_width_set_doc,
+ ".. function:: line_width_set(width)\n"
+ "\n"
+ " Specify the width of rasterized lines.\n"
+ "\n"
+ " :param size: New width.\n"
+ " :type mode: `float`\n");
+static PyObject *pygpu_state_line_width_set(PyObject *UNUSED(self), PyObject *value)
+{
+ float width = (float)PyFloat_AsDouble(value);
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+
+ GPU_line_width(width);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_line_width_get_doc,
+ ".. function:: line_width_get()\n"
+ "\n"
+ " Current width of rasterized lines.\n");
+static PyObject *pygpu_state_line_width_get(PyObject *UNUSED(self))
+{
+ float width = GPU_line_width_get();
+ return PyFloat_FromDouble((double)width);
+}
+
+PyDoc_STRVAR(pygpu_state_point_size_set_doc,
+ ".. function:: point_size_set(size)\n"
+ "\n"
+ " Specify the diameter of rasterized points.\n"
+ "\n"
+ " :param size: New diameter.\n"
+ " :type mode: `float`\n");
+static PyObject *pygpu_state_point_size_set(PyObject *UNUSED(self), PyObject *value)
+{
+ float size = (float)PyFloat_AsDouble(value);
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+
+ GPU_point_size(size);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_color_mask_set_doc,
+ ".. function:: color_mask_set(r, g, b, a)\n"
+ "\n"
+ " Enable or disable writing of frame buffer color components.\n"
+ "\n"
+ " :param r, g, b, a: components red, green, blue, and alpha.\n"
+ " :type r, g, b, a: `bool`\n");
+static PyObject *pygpu_state_color_mask_set(PyObject *UNUSED(self), PyObject *args)
+{
+ int r, g, b, a;
+ if (!PyArg_ParseTuple(args, "pppp:color_mask_set", &r, &g, &b, &a)) {
+ return NULL;
+ }
+
+ GPU_color_mask((bool)r, (bool)g, (bool)b, (bool)a);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_face_culling_set_doc,
+ ".. function:: face_culling_set(culling)\n"
+ "\n"
+ " Specify whether none, front-facing or back-facing facets can be culled.\n"
+ "\n"
+ " :param mode: One of these modes: {\n"
+ " `NONE`,\n"
+ " `FRONT`,\n"
+ " `BACK`,\n"
+ " :type mode: `str`\n");
+static PyObject *pygpu_state_face_culling_set(PyObject *UNUSED(self), PyObject *value)
+{
+ struct PyC_StringEnum pygpu_faceculling = {pygpu_state_faceculling_items};
+ if (!PyC_ParseStringEnum(value, &pygpu_faceculling)) {
+ return NULL;
+ }
+
+ GPU_face_culling(pygpu_faceculling.value_found);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_front_facing_set_doc,
+ ".. function:: front_facing_set(invert)\n"
+ "\n"
+ " Specifies the orientation of front-facing polygons.\n"
+ "\n"
+ " :param invert: True for clockwise polygons as front-facing.\n"
+ " :type mode: `bool`\n");
+static PyObject *pygpu_state_front_facing_set(PyObject *UNUSED(self), PyObject *value)
+{
+ bool invert;
+ if (!PyC_ParseBool(value, &invert)) {
+ return NULL;
+ }
+
+ GPU_front_facing(invert);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_state_program_point_size_set_doc,
+ ".. function:: use_program_point_size(enable)\n"
+ "\n"
+ " If enabled, the derived point size is taken from the (potentially clipped) "
+ "shader builtin gl_PointSize.\n"
+ "\n"
+ " :param enable: True for shader builtin gl_PointSize.\n"
+ " :type enable: `bool`\n");
+static PyObject *pygpu_state_program_point_size_set(PyObject *UNUSED(self), PyObject *value)
+{
+ bool enable;
+ if (!PyC_ParseBool(value, &enable)) {
+ return NULL;
+ }
+
+ GPU_program_point_size(enable);
+ Py_RETURN_NONE;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Module
+ * \{ */
+
+static struct PyMethodDef pygpu_state__tp_methods[] = {
+ /* Manage Stack */
+ {"blend_set", (PyCFunction)pygpu_state_blend_set, METH_O, pygpu_state_blend_set_doc},
+ {"blend_get", (PyCFunction)pygpu_state_blend_get, METH_NOARGS, pygpu_state_blend_get_doc},
+ {"depth_test_set",
+ (PyCFunction)pygpu_state_depth_test_set,
+ METH_O,
+ pygpu_state_depth_test_set_doc},
+ {"depth_test_get",
+ (PyCFunction)pygpu_state_depth_test_get,
+ METH_NOARGS,
+ pygpu_state_depth_test_get_doc},
+ {"depth_mask_set",
+ (PyCFunction)pygpu_state_depth_mask_set,
+ METH_O,
+ pygpu_state_depth_mask_set_doc},
+ {"depth_mask_get",
+ (PyCFunction)pygpu_state_depth_mask_get,
+ METH_NOARGS,
+ pygpu_state_depth_mask_get_doc},
+ {"viewport_set",
+ (PyCFunction)pygpu_state_viewport_set,
+ METH_VARARGS,
+ pygpu_state_viewport_set_doc},
+ {"viewport_get",
+ (PyCFunction)pygpu_state_viewport_get,
+ METH_NOARGS,
+ pygpu_state_viewport_get_doc},
+ {"line_width_set",
+ (PyCFunction)pygpu_state_line_width_set,
+ METH_O,
+ pygpu_state_line_width_set_doc},
+ {"line_width_get",
+ (PyCFunction)pygpu_state_line_width_get,
+ METH_NOARGS,
+ pygpu_state_line_width_get_doc},
+ {"point_size_set",
+ (PyCFunction)pygpu_state_point_size_set,
+ METH_O,
+ pygpu_state_point_size_set_doc},
+ {"color_mask_set",
+ (PyCFunction)pygpu_state_color_mask_set,
+ METH_VARARGS,
+ pygpu_state_color_mask_set_doc},
+ {"face_culling_set",
+ (PyCFunction)pygpu_state_face_culling_set,
+ METH_O,
+ pygpu_state_face_culling_set_doc},
+ {"front_facing_set",
+ (PyCFunction)pygpu_state_front_facing_set,
+ METH_O,
+ pygpu_state_front_facing_set_doc},
+ {"program_point_size_set",
+ (PyCFunction)pygpu_state_program_point_size_set,
+ METH_O,
+ pygpu_state_program_point_size_set_doc},
+ {NULL, NULL, 0, NULL},
+};
+
+PyDoc_STRVAR(pygpu_state__tp_doc, "This module provides access to the gpu state.");
+static PyModuleDef pygpu_state_module_def = {
+ PyModuleDef_HEAD_INIT,
+ .m_name = "gpu.state",
+ .m_doc = pygpu_state__tp_doc,
+ .m_methods = pygpu_state__tp_methods,
+};
+
+PyObject *bpygpu_state_init(void)
+{
+ PyObject *submodule;
+
+ submodule = PyModule_Create(&pygpu_state_module_def);
+
+ return submodule;
+}
+
+/** \} */
diff --git a/source/blender/python/gpu/gpu_py_state.h b/source/blender/python/gpu/gpu_py_state.h
new file mode 100644
index 00000000000..415c5ede822
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_state.h
@@ -0,0 +1,23 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ */
+
+#pragma once
+
+PyObject *bpygpu_state_init(void);
diff --git a/source/blender/python/gpu/gpu_py_texture.c b/source/blender/python/gpu/gpu_py_texture.c
new file mode 100644
index 00000000000..85246bffac7
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_texture.c
@@ -0,0 +1,556 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ *
+ * This file defines the texture functionalities of the 'gpu' module
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "BLI_string.h"
+
+#include "GPU_context.h"
+#include "GPU_texture.h"
+
+#include "../generic/py_capi_utils.h"
+
+#include "gpu_py.h"
+#include "gpu_py_api.h"
+#include "gpu_py_buffer.h"
+
+#include "gpu_py_texture.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+/** \name GPUTexture Common Utilities
+ * \{ */
+
+static const struct PyC_StringEnumItems pygpu_textureformat_items[] = {
+ {GPU_RGBA8UI, "RGBA8UI"},
+ {GPU_RGBA8I, "RGBA8I"},
+ {GPU_RGBA8, "RGBA8"},
+ {GPU_RGBA32UI, "RGBA32UI"},
+ {GPU_RGBA32I, "RGBA32I"},
+ {GPU_RGBA32F, "RGBA32F"},
+ {GPU_RGBA16UI, "RGBA16UI"},
+ {GPU_RGBA16I, "RGBA16I"},
+ {GPU_RGBA16F, "RGBA16F"},
+ {GPU_RGBA16, "RGBA16"},
+ {GPU_RG8UI, "RG8UI"},
+ {GPU_RG8I, "RG8I"},
+ {GPU_RG8, "RG8"},
+ {GPU_RG32UI, "RG32UI"},
+ {GPU_RG32I, "RG32I"},
+ {GPU_RG32F, "RG32F"},
+ {GPU_RG16UI, "RG16UI"},
+ {GPU_RG16I, "RG16I"},
+ {GPU_RG16F, "RG16F"},
+ {GPU_RG16, "RG16"},
+ {GPU_R8UI, "R8UI"},
+ {GPU_R8I, "R8I"},
+ {GPU_R8, "R8"},
+ {GPU_R32UI, "R32UI"},
+ {GPU_R32I, "R32I"},
+ {GPU_R32F, "R32F"},
+ {GPU_R16UI, "R16UI"},
+ {GPU_R16I, "R16I"},
+ {GPU_R16F, "R16F"},
+ {GPU_R16, "R16"},
+ {GPU_R11F_G11F_B10F, "R11F_G11F_B10F"},
+ {GPU_DEPTH32F_STENCIL8, "DEPTH32F_STENCIL8"},
+ {GPU_DEPTH24_STENCIL8, "DEPTH24_STENCIL8"},
+ {GPU_SRGB8_A8, "SRGB8_A8"},
+ {GPU_RGB16F, "RGB16F"},
+ {GPU_SRGB8_A8_DXT1, "SRGB8_A8_DXT1"},
+ {GPU_SRGB8_A8_DXT3, "SRGB8_A8_DXT3"},
+ {GPU_SRGB8_A8_DXT5, "SRGB8_A8_DXT5"},
+ {GPU_RGBA8_DXT1, "RGBA8_DXT1"},
+ {GPU_RGBA8_DXT3, "RGBA8_DXT3"},
+ {GPU_RGBA8_DXT5, "RGBA8_DXT5"},
+ {GPU_DEPTH_COMPONENT32F, "DEPTH_COMPONENT32F"},
+ {GPU_DEPTH_COMPONENT24, "DEPTH_COMPONENT24"},
+ {GPU_DEPTH_COMPONENT16, "DEPTH_COMPONENT16"},
+ {0, NULL},
+};
+
+static int pygpu_texture_valid_check(BPyGPUTexture *bpygpu_tex)
+{
+ if (UNLIKELY(bpygpu_tex->tex == NULL)) {
+ PyErr_SetString(PyExc_ReferenceError,
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+ "GPU texture was freed, no further access is valid"
+#else
+ "GPU texture: internal error"
+#endif
+ );
+
+ return -1;
+ }
+ return 0;
+}
+
+#define BPYGPU_TEXTURE_CHECK_OBJ(bpygpu) \
+ { \
+ if (UNLIKELY(pygpu_texture_valid_check(bpygpu) == -1)) { \
+ return NULL; \
+ } \
+ } \
+ ((void)0)
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name GPUTexture Type
+ * \{ */
+
+static PyObject *pygpu_texture__tp_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds)
+{
+ BPYGPU_IS_INIT_OR_ERROR_OBJ;
+
+ PyObject *py_size;
+ int size[3] = {1, 1, 1};
+ int layers = 0;
+ int is_cubemap = false;
+ struct PyC_StringEnum pygpu_textureformat = {pygpu_textureformat_items, GPU_RGBA8};
+ BPyGPUBuffer *pybuffer_obj = NULL;
+ char err_out[256] = "unknown error. See console";
+
+ static const char *_keywords[] = {"size", "layers", "is_cubemap", "format", "data", NULL};
+ static _PyArg_Parser _parser = {"O|$ipO&O!:GPUTexture.__new__", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args,
+ kwds,
+ &_parser,
+ &py_size,
+ &layers,
+ &is_cubemap,
+ PyC_ParseStringEnum,
+ &pygpu_textureformat,
+ &BPyGPU_BufferType,
+ &pybuffer_obj)) {
+ return NULL;
+ }
+
+ int len = 1;
+ if (PySequence_Check(py_size)) {
+ len = PySequence_Size(py_size);
+ if (PyC_AsArray(size, py_size, len, &PyLong_Type, false, "GPUTexture.__new__") == -1) {
+ return NULL;
+ }
+ }
+ else if (PyLong_Check(py_size)) {
+ size[0] = PyLong_AsLong(py_size);
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "GPUTexture.__new__: Expected an int or tuple as first arg");
+ return NULL;
+ }
+
+ void *data = NULL;
+ if (pybuffer_obj) {
+ if (pybuffer_obj->format != GPU_DATA_FLOAT) {
+ PyErr_SetString(PyExc_ValueError,
+ "GPUTexture.__new__: Only Buffer of format `FLOAT` is currently supported");
+ return NULL;
+ }
+
+ int component_len = GPU_texture_component_len(pygpu_textureformat.value_found);
+ int component_size_expected = sizeof(float);
+ size_t data_space_expected = (size_t)size[0] * size[1] * size[2] * max_ii(1, layers) *
+ component_len * component_size_expected;
+ if (is_cubemap) {
+ data_space_expected *= 6 * size[0];
+ }
+
+ if (bpygpu_Buffer_size(pybuffer_obj) < data_space_expected) {
+ PyErr_SetString(PyExc_ValueError, "GPUTexture.__new__: Buffer size smaller than requested");
+ return NULL;
+ }
+ data = pybuffer_obj->buf.as_void;
+ }
+
+ GPUTexture *tex = NULL;
+ if (is_cubemap && len != 1) {
+ STRNCPY(err_out,
+ "In cubemaps the same dimension represents height, width and depth. No tuple needed");
+ }
+ else if (size[0] < 1 || size[1] < 1 || size[2] < 1) {
+ STRNCPY(err_out, "Values less than 1 are not allowed in dimensions");
+ }
+ else if (layers && len == 3) {
+ STRNCPY(err_out, "3D textures have no layers");
+ }
+ else if (!GPU_context_active_get()) {
+ STRNCPY(err_out, "No active GPU context found");
+ }
+ else {
+ const char *name = "python_texture";
+ if (is_cubemap) {
+ if (layers) {
+ tex = GPU_texture_create_cube_array(
+ name, size[0], layers, 1, pygpu_textureformat.value_found, data);
+ }
+ else {
+ tex = GPU_texture_create_cube(name, size[0], 1, pygpu_textureformat.value_found, data);
+ }
+ }
+ else if (layers) {
+ if (len == 2) {
+ tex = GPU_texture_create_2d_array(
+ name, size[0], size[1], layers, 1, pygpu_textureformat.value_found, data);
+ }
+ else {
+ tex = GPU_texture_create_1d_array(
+ name, size[0], layers, 1, pygpu_textureformat.value_found, data);
+ }
+ }
+ else if (len == 3) {
+ tex = GPU_texture_create_3d(name,
+ size[0],
+ size[1],
+ size[2],
+ 1,
+ pygpu_textureformat.value_found,
+ GPU_DATA_FLOAT,
+ NULL);
+ }
+ else if (len == 2) {
+ tex = GPU_texture_create_2d(
+ name, size[0], size[1], 1, pygpu_textureformat.value_found, data);
+ }
+ else {
+ tex = GPU_texture_create_1d(name, size[0], 1, pygpu_textureformat.value_found, data);
+ }
+ }
+
+ if (tex == NULL) {
+ PyErr_Format(PyExc_RuntimeError, "gpu.texture.new(...) failed with '%s'", err_out);
+ return NULL;
+ }
+
+ return BPyGPUTexture_CreatePyObject(tex);
+}
+
+PyDoc_STRVAR(pygpu_texture_width_doc, "Width of the texture.\n\n:type: `int`");
+static PyObject *pygpu_texture_width_get(BPyGPUTexture *self, void *UNUSED(type))
+{
+ BPYGPU_TEXTURE_CHECK_OBJ(self);
+ return PyLong_FromLong(GPU_texture_width(self->tex));
+}
+
+PyDoc_STRVAR(pygpu_texture_height_doc, "Height of the texture.\n\n:type: `int`");
+static PyObject *pygpu_texture_height_get(BPyGPUTexture *self, void *UNUSED(type))
+{
+ BPYGPU_TEXTURE_CHECK_OBJ(self);
+ return PyLong_FromLong(GPU_texture_height(self->tex));
+}
+
+PyDoc_STRVAR(pygpu_texture_format_doc, "Format of the texture.\n\n:type: `str`");
+static PyObject *pygpu_texture_format_get(BPyGPUTexture *self, void *UNUSED(type))
+{
+ BPYGPU_TEXTURE_CHECK_OBJ(self);
+ eGPUTextureFormat format = GPU_texture_format(self->tex);
+ return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_textureformat_items, format));
+}
+
+PyDoc_STRVAR(pygpu_texture_clear_doc,
+ ".. method:: clear(format='FLOAT', value=(0.0, 0.0, 0.0, 1.0))\n"
+ "\n"
+ " Fill texture with specific value.\n"
+ "\n"
+ " :param format: One of these primitive types: {\n"
+ " `FLOAT`,\n"
+ " `INT`,\n"
+ " `UINT`,\n"
+ " `UBYTE`,\n"
+ " `UINT_24_8`,\n"
+ " `10_11_11_REV`,\n"
+ " :type type: `str`\n"
+ " :arg value: sequence each representing the value to fill.\n"
+ " :type value: sequence of 1, 2, 3 or 4 values\n");
+static PyObject *pygpu_texture_clear(BPyGPUTexture *self, PyObject *args, PyObject *kwds)
+{
+ BPYGPU_TEXTURE_CHECK_OBJ(self);
+ struct PyC_StringEnum pygpu_dataformat = {bpygpu_dataformat_items};
+ union {
+ int i[4];
+ float f[4];
+ char c[4];
+ } values;
+
+ PyObject *py_values;
+
+ static const char *_keywords[] = {"format", "value", NULL};
+ static _PyArg_Parser _parser = {"$O&O:clear", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(
+ args, kwds, &_parser, PyC_ParseStringEnum, &pygpu_dataformat, &py_values)) {
+ return NULL;
+ }
+
+ int shape = PySequence_Size(py_values);
+ if (shape == -1) {
+ return NULL;
+ }
+
+ if (shape > 4) {
+ PyErr_SetString(PyExc_AttributeError, "too many dimensions, max is 4");
+ return NULL;
+ }
+
+ if (shape != 1 &&
+ ELEM(pygpu_dataformat.value_found, GPU_DATA_UINT_24_8, GPU_DATA_10_11_11_REV)) {
+ PyErr_SetString(PyExc_AttributeError,
+ "`UINT_24_8` and `10_11_11_REV` only support single values");
+ return NULL;
+ }
+
+ memset(&values, 0, sizeof(values));
+ if (PyC_AsArray(&values,
+ py_values,
+ shape,
+ pygpu_dataformat.value_found == GPU_DATA_FLOAT ? &PyFloat_Type : &PyLong_Type,
+ false,
+ "clear") == -1) {
+ return NULL;
+ }
+
+ if (pygpu_dataformat.value_found == GPU_DATA_UBYTE) {
+ /* Convert to byte. */
+ values.c[0] = values.i[0];
+ values.c[1] = values.i[1];
+ values.c[2] = values.i[2];
+ values.c[3] = values.i[3];
+ }
+
+ GPU_texture_clear(self->tex, pygpu_dataformat.value_found, &values);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(pygpu_texture_read_doc,
+ ".. method:: read()\n"
+ "\n"
+ " Creates a buffer with the value of all pixels.\n"
+ "\n");
+static PyObject *pygpu_texture_read(BPyGPUTexture *self)
+{
+ BPYGPU_TEXTURE_CHECK_OBJ(self);
+
+ /* #GPU_texture_read is restricted in combining 'data_format' with 'tex_format'.
+ * So choose data_format here. */
+ eGPUDataFormat best_data_format;
+ switch (GPU_texture_format(self->tex)) {
+ case GPU_DEPTH_COMPONENT24:
+ case GPU_DEPTH_COMPONENT16:
+ case GPU_DEPTH_COMPONENT32F:
+ best_data_format = GPU_DATA_FLOAT;
+ break;
+ case GPU_DEPTH24_STENCIL8:
+ case GPU_DEPTH32F_STENCIL8:
+ best_data_format = GPU_DATA_UINT_24_8;
+ break;
+ case GPU_R8UI:
+ case GPU_R16UI:
+ case GPU_RG16UI:
+ case GPU_R32UI:
+ best_data_format = GPU_DATA_UINT;
+ break;
+ case GPU_RG16I:
+ case GPU_R16I:
+ best_data_format = GPU_DATA_INT;
+ break;
+ case GPU_R8:
+ case GPU_RG8:
+ case GPU_RGBA8:
+ case GPU_RGBA8UI:
+ case GPU_SRGB8_A8:
+ best_data_format = GPU_DATA_UBYTE;
+ break;
+ case GPU_R11F_G11F_B10F:
+ best_data_format = GPU_DATA_10_11_11_REV;
+ break;
+ default:
+ best_data_format = GPU_DATA_FLOAT;
+ break;
+ }
+
+ void *buf = GPU_texture_read(self->tex, best_data_format, 0);
+ const Py_ssize_t shape[2] = {GPU_texture_height(self->tex), GPU_texture_width(self->tex)};
+ return (PyObject *)BPyGPU_Buffer_CreatePyObject(best_data_format, shape, ARRAY_SIZE(shape), buf);
+}
+
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+PyDoc_STRVAR(pygpu_texture_free_doc,
+ ".. method:: free()\n"
+ "\n"
+ " Free the texture object.\n"
+ " The texture object will no longer be accessible.\n");
+static PyObject *pygpu_texture_free(BPyGPUTexture *self)
+{
+ BPYGPU_TEXTURE_CHECK_OBJ(self);
+
+ GPU_texture_free(self->tex);
+ self->tex = NULL;
+ Py_RETURN_NONE;
+}
+#endif
+
+static void BPyGPUTexture__tp_dealloc(BPyGPUTexture *self)
+{
+ if (self->tex) {
+ GPU_texture_free(self->tex);
+ }
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static PyGetSetDef pygpu_texture__tp_getseters[] = {
+ {"width", (getter)pygpu_texture_width_get, (setter)NULL, pygpu_texture_width_doc, NULL},
+ {"height", (getter)pygpu_texture_height_get, (setter)NULL, pygpu_texture_height_doc, NULL},
+ {"format", (getter)pygpu_texture_format_get, (setter)NULL, pygpu_texture_format_doc, NULL},
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+static struct PyMethodDef pygpu_texture__tp_methods[] = {
+ {"clear",
+ (PyCFunction)pygpu_texture_clear,
+ METH_VARARGS | METH_KEYWORDS,
+ pygpu_texture_clear_doc},
+ {"read", (PyCFunction)pygpu_texture_read, METH_NOARGS, pygpu_texture_read_doc},
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+ {"free", (PyCFunction)pygpu_texture_free, METH_NOARGS, pygpu_texture_free_doc},
+#endif
+ {NULL, NULL, 0, NULL},
+};
+
+PyDoc_STRVAR(
+ pygpu_texture__tp_doc,
+ ".. class:: GPUTexture(size, layers=0, is_cubemap=False, format='RGBA8', data=None)\n"
+ "\n"
+ " This object gives access to off GPU textures.\n"
+ "\n"
+ " :arg size: Dimensions of the texture 1D, 2D, 3D or cubemap.\n"
+ " :type size: `tuple` or `int`\n"
+ " :arg layers: Number of layers in texture array or number of cubemaps in cubemap array\n"
+ " :type layers: `int`\n"
+ " :arg is_cubemap: Indicates the creation of a cubemap texture.\n"
+ " :type is_cubemap: `int`\n"
+ " :arg format: One of these primitive types: {\n"
+ " `RGBA8UI`,\n"
+ " `RGBA8I`,\n"
+ " `RGBA8`,\n"
+ " `RGBA32UI`,\n"
+ " `RGBA32I`,\n"
+ " `RGBA32F`,\n"
+ " `RGBA16UI`,\n"
+ " `RGBA16I`,\n"
+ " `RGBA16F`,\n"
+ " `RGBA16`,\n"
+ " `RG8UI`,\n"
+ " `RG8I`,\n"
+ " `RG8`,\n"
+ " `RG32UI`,\n"
+ " `RG32I`,\n"
+ " `RG32F`,\n"
+ " `RG16UI`,\n"
+ " `RG16I`,\n"
+ " `RG16F`,\n"
+ " `RG16`,\n"
+ " `R8UI`,\n"
+ " `R8I`,\n"
+ " `R8`,\n"
+ " `R32UI`,\n"
+ " `R32I`,\n"
+ " `R32F`,\n"
+ " `R16UI`,\n"
+ " `R16I`,\n"
+ " `R16F`,\n"
+ " `R16`,\n"
+ " `R11F_G11F_B10F`,\n"
+ " `DEPTH32F_STENCIL8`,\n"
+ " `DEPTH24_STENCIL8`,\n"
+ " `SRGB8_A8`,\n"
+ " `RGB16F`,\n"
+ " `SRGB8_A8_DXT1`,\n"
+ " `SRGB8_A8_DXT3`,\n"
+ " `SRGB8_A8_DXT5`,\n"
+ " `RGBA8_DXT1`,\n"
+ " `RGBA8_DXT3`,\n"
+ " `RGBA8_DXT5`,\n"
+ " `DEPTH_COMPONENT32F`,\n"
+ " `DEPTH_COMPONENT24`,\n"
+ " `DEPTH_COMPONENT16`,\n"
+ " :type format: `str`\n"
+ " :arg data: Buffer object to fill the texture.\n"
+ " :type data: `Buffer`\n");
+PyTypeObject BPyGPUTexture_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUTexture",
+ .tp_basicsize = sizeof(BPyGPUTexture),
+ .tp_dealloc = (destructor)BPyGPUTexture__tp_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_doc = pygpu_texture__tp_doc,
+ .tp_methods = pygpu_texture__tp_methods,
+ .tp_getset = pygpu_texture__tp_getseters,
+ .tp_new = pygpu_texture__tp_new,
+};
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Local API
+ * \{ */
+
+int bpygpu_ParseTexture(PyObject *o, void *p)
+{
+ if (o == Py_None) {
+ *(GPUTexture **)p = NULL;
+ return 1;
+ }
+
+ if (!BPyGPUTexture_Check(o)) {
+ PyErr_Format(
+ PyExc_ValueError, "expected a texture or None object, got %s", Py_TYPE(o)->tp_name);
+ return 0;
+ }
+
+ if (UNLIKELY(pygpu_texture_valid_check((BPyGPUTexture *)o) == -1)) {
+ return 0;
+ }
+
+ *(GPUTexture **)p = ((BPyGPUTexture *)o)->tex;
+ return 1;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Public API
+ * \{ */
+
+PyObject *BPyGPUTexture_CreatePyObject(GPUTexture *tex)
+{
+ BPyGPUTexture *self;
+
+ self = PyObject_New(BPyGPUTexture, &BPyGPUTexture_Type);
+ self->tex = tex;
+
+ return (PyObject *)self;
+}
+
+/** \} */
+
+#undef BPYGPU_TEXTURE_CHECK_OBJ
diff --git a/source/blender/python/gpu/gpu_py_texture.h b/source/blender/python/gpu/gpu_py_texture.h
new file mode 100644
index 00000000000..be7348b2bd4
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_texture.h
@@ -0,0 +1,34 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ */
+
+#pragma once
+
+#include "BLI_compiler_attrs.h"
+
+extern PyTypeObject BPyGPUTexture_Type;
+
+#define BPyGPUTexture_Check(v) (Py_TYPE(v) == &BPyGPUTexture_Type)
+
+typedef struct BPyGPUTexture {
+ PyObject_HEAD struct GPUTexture *tex;
+} BPyGPUTexture;
+
+int bpygpu_ParseTexture(PyObject *o, void *p);
+PyObject *BPyGPUTexture_CreatePyObject(struct GPUTexture *tex) ATTR_NONNULL(1);
diff --git a/source/blender/python/gpu/gpu_py_types.c b/source/blender/python/gpu/gpu_py_types.c
index 165af47b4b8..fdd589d788e 100644
--- a/source/blender/python/gpu/gpu_py_types.c
+++ b/source/blender/python/gpu/gpu_py_types.c
@@ -32,17 +32,20 @@
/** \name GPU Types Module
* \{ */
-static struct PyModuleDef BPyGPU_types_module_def = {
+static struct PyModuleDef pygpu_types_module_def = {
PyModuleDef_HEAD_INIT,
.m_name = "gpu.types",
};
-PyObject *BPyInit_gpu_types(void)
+PyObject *bpygpu_types_init(void)
{
PyObject *submodule;
- submodule = PyModule_Create(&BPyGPU_types_module_def);
+ submodule = PyModule_Create(&pygpu_types_module_def);
+ if (PyType_Ready(&BPyGPU_BufferType) < 0) {
+ return NULL;
+ }
if (PyType_Ready(&BPyGPUVertFormat_Type) < 0) {
return NULL;
}
@@ -61,19 +64,26 @@ PyObject *BPyInit_gpu_types(void)
if (PyType_Ready(&BPyGPUShader_Type) < 0) {
return NULL;
}
+ if (PyType_Ready(&BPyGPUTexture_Type) < 0) {
+ return NULL;
+ }
+ if (PyType_Ready(&BPyGPUFrameBuffer_Type) < 0) {
+ return NULL;
+ }
+ if (PyType_Ready(&BPyGPUUniformBuf_Type) < 0) {
+ return NULL;
+ }
-#define MODULE_TYPE_ADD(s, t) \
- PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \
- Py_INCREF((PyObject *)&t)
-
- MODULE_TYPE_ADD(submodule, BPyGPUVertFormat_Type);
- MODULE_TYPE_ADD(submodule, BPyGPUVertBuf_Type);
- MODULE_TYPE_ADD(submodule, BPyGPUIndexBuf_Type);
- MODULE_TYPE_ADD(submodule, BPyGPUBatch_Type);
- MODULE_TYPE_ADD(submodule, BPyGPUOffScreen_Type);
- MODULE_TYPE_ADD(submodule, BPyGPUShader_Type);
-
-#undef MODULE_TYPE_ADD
+ PyModule_AddType(submodule, &BPyGPU_BufferType);
+ PyModule_AddType(submodule, &BPyGPUVertFormat_Type);
+ PyModule_AddType(submodule, &BPyGPUVertBuf_Type);
+ PyModule_AddType(submodule, &BPyGPUIndexBuf_Type);
+ PyModule_AddType(submodule, &BPyGPUBatch_Type);
+ PyModule_AddType(submodule, &BPyGPUOffScreen_Type);
+ PyModule_AddType(submodule, &BPyGPUShader_Type);
+ PyModule_AddType(submodule, &BPyGPUTexture_Type);
+ PyModule_AddType(submodule, &BPyGPUFrameBuffer_Type);
+ PyModule_AddType(submodule, &BPyGPUUniformBuf_Type);
return submodule;
}
diff --git a/source/blender/python/gpu/gpu_py_types.h b/source/blender/python/gpu/gpu_py_types.h
index 56f73b8a504..eb72c04d53e 100644
--- a/source/blender/python/gpu/gpu_py_types.h
+++ b/source/blender/python/gpu/gpu_py_types.h
@@ -20,11 +20,16 @@
#pragma once
+#include "gpu_py_buffer.h"
+
#include "gpu_py_batch.h"
#include "gpu_py_element.h"
+#include "gpu_py_framebuffer.h"
#include "gpu_py_offscreen.h"
#include "gpu_py_shader.h"
+#include "gpu_py_texture.h"
+#include "gpu_py_uniformbuffer.h"
#include "gpu_py_vertex_buffer.h"
#include "gpu_py_vertex_format.h"
-PyObject *BPyInit_gpu_types(void);
+PyObject *bpygpu_types_init(void);
diff --git a/source/blender/python/gpu/gpu_py_uniformbuffer.c b/source/blender/python/gpu/gpu_py_uniformbuffer.c
new file mode 100644
index 00000000000..d1b86455918
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_uniformbuffer.c
@@ -0,0 +1,195 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ *
+ * This file defines the uniform buffer functionalities of the 'gpu' module
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "BLI_string.h"
+
+#include "GPU_context.h"
+#include "GPU_texture.h"
+#include "GPU_uniform_buffer.h"
+
+#include "../generic/py_capi_utils.h"
+
+#include "gpu_py.h"
+#include "gpu_py_api.h"
+#include "gpu_py_buffer.h"
+
+#include "gpu_py_uniformbuffer.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+/** \name GPUUniformBuf Common Utilities
+ * \{ */
+
+static int pygpu_uniformbuffer_valid_check(BPyGPUUniformBuf *bpygpu_ub)
+{
+ if (UNLIKELY(bpygpu_ub->ubo == NULL)) {
+ PyErr_SetString(PyExc_ReferenceError,
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+ "GPU uniform buffer was freed, no further access is valid");
+#else
+
+ "GPU uniform buffer: internal error");
+#endif
+ return -1;
+ }
+ return 0;
+}
+
+#define BPYGPU_UNIFORMBUF_CHECK_OBJ(bpygpu) \
+ { \
+ if (UNLIKELY(pygpu_uniformbuffer_valid_check(bpygpu) == -1)) { \
+ return NULL; \
+ } \
+ } \
+ ((void)0)
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name GPUUniformBuf Type
+ * \{ */
+
+static PyObject *pygpu_uniformbuffer__tp_new(PyTypeObject *UNUSED(self),
+ PyObject *args,
+ PyObject *kwds)
+{
+ BPYGPU_IS_INIT_OR_ERROR_OBJ;
+
+ GPUUniformBuf *ubo = NULL;
+ BPyGPUBuffer *pybuffer_obj;
+ char err_out[256] = "unknown error. See console";
+
+ static const char *_keywords[] = {"data", NULL};
+ static _PyArg_Parser _parser = {"O!:GPUUniformBuf.__new__", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &BPyGPU_BufferType, &pybuffer_obj)) {
+ return NULL;
+ }
+
+ if (GPU_context_active_get()) {
+ ubo = GPU_uniformbuf_create_ex(
+ bpygpu_Buffer_size(pybuffer_obj), pybuffer_obj->buf.as_void, "python_uniformbuffer");
+ }
+ else {
+ STRNCPY(err_out, "No active GPU context found");
+ }
+
+ if (ubo == NULL) {
+ PyErr_Format(PyExc_RuntimeError, "GPUUniformBuf.__new__(...) failed with '%s'", err_out);
+ return NULL;
+ }
+
+ return BPyGPUUniformBuf_CreatePyObject(ubo);
+}
+
+PyDoc_STRVAR(pygpu_uniformbuffer_update_doc,
+ ".. method::update(data)\n"
+ "\n"
+ " Update the data of the uniform buffer object.\n");
+static PyObject *pygpu_uniformbuffer_update(BPyGPUUniformBuf *self, PyObject *obj)
+{
+ BPYGPU_UNIFORMBUF_CHECK_OBJ(self);
+
+ if (!BPyGPU_Buffer_Check(obj)) {
+ return NULL;
+ }
+
+ GPU_uniformbuf_update(self->ubo, ((BPyGPUBuffer *)obj)->buf.as_void);
+ Py_RETURN_NONE;
+}
+
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+PyDoc_STRVAR(pygpu_uniformbuffer_free_doc,
+ ".. method::free()\n"
+ "\n"
+ " Free the uniform buffer object.\n"
+ " The uniform buffer object will no longer be accessible.\n");
+static PyObject *pygpu_uniformbuffer_free(BPyGPUUniformBuf *self)
+{
+ BPYGPU_UNIFORMBUF_CHECK_OBJ(self);
+
+ GPU_uniformbuf_free(self->ubo);
+ self->ubo = NULL;
+ Py_RETURN_NONE;
+}
+#endif
+
+static void BPyGPUUniformBuf__tp_dealloc(BPyGPUUniformBuf *self)
+{
+ if (self->ubo) {
+ GPU_uniformbuf_free(self->ubo);
+ }
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static PyGetSetDef pygpu_uniformbuffer__tp_getseters[] = {
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+static struct PyMethodDef pygpu_uniformbuffer__tp_methods[] = {
+ {"update", (PyCFunction)pygpu_uniformbuffer_update, METH_O, pygpu_uniformbuffer_update_doc},
+#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
+ {"free", (PyCFunction)pygpu_uniformbuffer_free, METH_NOARGS, pygpu_uniformbuffer_free_doc},
+#endif
+ {NULL, NULL, 0, NULL},
+};
+
+PyDoc_STRVAR(pygpu_uniformbuffer__tp_doc,
+ ".. class:: GPUUniformBuf(data)\n"
+ "\n"
+ " This object gives access to off uniform buffers.\n"
+ "\n"
+ " :arg data: Buffer object.\n"
+ " :type data: `Buffer`\n");
+PyTypeObject BPyGPUUniformBuf_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUUniformBuf",
+ .tp_basicsize = sizeof(BPyGPUUniformBuf),
+ .tp_dealloc = (destructor)BPyGPUUniformBuf__tp_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_doc = pygpu_uniformbuffer__tp_doc,
+ .tp_methods = pygpu_uniformbuffer__tp_methods,
+ .tp_getset = pygpu_uniformbuffer__tp_getseters,
+ .tp_new = pygpu_uniformbuffer__tp_new,
+};
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Public API
+ * \{ */
+
+PyObject *BPyGPUUniformBuf_CreatePyObject(GPUUniformBuf *ubo)
+{
+ BPyGPUUniformBuf *self;
+
+ self = PyObject_New(BPyGPUUniformBuf, &BPyGPUUniformBuf_Type);
+ self->ubo = ubo;
+
+ return (PyObject *)self;
+}
+
+/** \} */
+
+#undef BPYGPU_UNIFORMBUF_CHECK_OBJ
diff --git a/source/blender/python/gpu/gpu_py_uniformbuffer.h b/source/blender/python/gpu/gpu_py_uniformbuffer.h
new file mode 100644
index 00000000000..a13c33ae78a
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_uniformbuffer.h
@@ -0,0 +1,33 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup bpygpu
+ */
+
+#pragma once
+
+#include "BLI_compiler_attrs.h"
+
+extern PyTypeObject BPyGPUUniformBuf_Type;
+
+#define BPyGPUUniformBuf_Check(v) (Py_TYPE(v) == &BPyGPUUniformBuf_Type)
+
+typedef struct BPyGPUUniformBuf {
+ PyObject_HEAD struct GPUUniformBuf *ubo;
+} BPyGPUUniformBuf;
+
+PyObject *BPyGPUUniformBuf_CreatePyObject(struct GPUUniformBuf *ubo) ATTR_NONNULL(1);
diff --git a/source/blender/python/gpu/gpu_py_vertex_buffer.c b/source/blender/python/gpu/gpu_py_vertex_buffer.c
index 8e19eac76d0..dcea57e78dc 100644
--- a/source/blender/python/gpu/gpu_py_vertex_buffer.c
+++ b/source/blender/python/gpu/gpu_py_vertex_buffer.c
@@ -39,7 +39,7 @@
/** \name Utility Functions
* \{ */
-#define PY_AS_NATIVE_SWITCH(attr) \
+#define PYGPU_AS_NATIVE_SWITCH(attr) \
switch (attr->comp_type) { \
case GPU_COMP_I8: { \
PY_AS_NATIVE(int8_t, PyC_Long_AsI8); \
@@ -75,7 +75,7 @@
((void)0)
/* No error checking, callers must run PyErr_Occurred */
-static void fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr)
+static void pygpu_fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr)
{
#define PY_AS_NATIVE(ty_dst, py_as_native) \
{ \
@@ -84,15 +84,15 @@ static void fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVer
} \
((void)0)
- PY_AS_NATIVE_SWITCH(attr);
+ PYGPU_AS_NATIVE_SWITCH(attr);
#undef PY_AS_NATIVE
}
/* No error checking, callers must run PyErr_Occurred */
-static void fill_format_sequence(void *data_dst_void,
- PyObject *py_seq_fast,
- const GPUVertAttr *attr)
+static void pygpu_fill_format_sequence(void *data_dst_void,
+ PyObject *py_seq_fast,
+ const GPUVertAttr *attr)
{
const uint len = attr->comp_len;
PyObject **value_fast_items = PySequence_Fast_ITEMS(py_seq_fast);
@@ -107,19 +107,19 @@ static void fill_format_sequence(void *data_dst_void,
} \
((void)0)
- PY_AS_NATIVE_SWITCH(attr);
+ PYGPU_AS_NATIVE_SWITCH(attr);
#undef PY_AS_NATIVE
}
-#undef PY_AS_NATIVE_SWITCH
+#undef PYGPU_AS_NATIVE_SWITCH
#undef WARN_TYPE_LIMIT_PUSH
#undef WARN_TYPE_LIMIT_POP
-static bool py_vertbuf_fill_impl(GPUVertBuf *vbo,
- uint data_id,
- PyObject *seq,
- const char *error_prefix)
+static bool pygpu_vertbuf_fill_impl(GPUVertBuf *vbo,
+ uint data_id,
+ PyObject *seq,
+ const char *error_prefix)
{
const char *exc_str_size_mismatch = "Expected a %s of size %d, got %u";
@@ -173,7 +173,7 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo,
for (uint i = 0; i < seq_len; i++) {
uchar *data = (uchar *)GPU_vertbuf_raw_step(&data_step);
PyObject *item = seq_items[i];
- fill_format_elem(data, item, attr);
+ pygpu_fill_format_elem(data, item, attr);
}
}
else {
@@ -197,7 +197,7 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo,
}
/* May trigger error, check below */
- fill_format_sequence(data, seq_fast_item, attr);
+ pygpu_fill_format_sequence(data, seq_fast_item, attr);
Py_DECREF(seq_fast_item);
}
}
@@ -213,7 +213,10 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo,
return ok;
}
-static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const char *error_prefix)
+static int pygpu_vertbuf_fill(GPUVertBuf *buf,
+ int id,
+ PyObject *py_seq_data,
+ const char *error_prefix)
{
if (id < 0 || id >= GPU_vertbuf_get_format(buf)->attr_len) {
PyErr_Format(PyExc_ValueError, "Format id %d out of range", id);
@@ -225,7 +228,7 @@ static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const ch
return 0;
}
- if (!py_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) {
+ if (!pygpu_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) {
return 0;
}
@@ -238,7 +241,7 @@ static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const ch
/** \name VertBuf Type
* \{ */
-static PyObject *py_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+static PyObject *pygpu_vertbuf__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
{
struct {
PyObject *py_fmt;
@@ -260,7 +263,7 @@ static PyObject *py_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyOb
return BPyGPUVertBuf_CreatePyObject(vbo);
}
-PyDoc_STRVAR(py_VertBuf_attr_fill_doc,
+PyDoc_STRVAR(pygpu_vertbuf_attr_fill_doc,
".. method:: attr_fill(id, data)\n"
"\n"
" Insert data into the buffer for a single attribute.\n"
@@ -269,7 +272,7 @@ PyDoc_STRVAR(py_VertBuf_attr_fill_doc,
" :type id: int or str\n"
" :param data: Sequence of data that should be stored in the buffer\n"
" :type data: sequence of values or tuples\n");
-static PyObject *py_VertBuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObject *kwds)
+static PyObject *pygpu_vertbuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObject *kwds)
{
PyObject *data;
PyObject *identifier;
@@ -299,28 +302,28 @@ static PyObject *py_VertBuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObj
return NULL;
}
- if (!py_attr_fill(self->buf, id, data, "GPUVertBuf.attr_fill")) {
+ if (!pygpu_vertbuf_fill(self->buf, id, data, "GPUVertBuf.attr_fill")) {
return NULL;
}
Py_RETURN_NONE;
}
-static struct PyMethodDef py_VertBuf_methods[] = {
+static struct PyMethodDef pygpu_vertbuf__tp_methods[] = {
{"attr_fill",
- (PyCFunction)py_VertBuf_attr_fill,
+ (PyCFunction)pygpu_vertbuf_attr_fill,
METH_VARARGS | METH_KEYWORDS,
- py_VertBuf_attr_fill_doc},
+ pygpu_vertbuf_attr_fill_doc},
{NULL, NULL, 0, NULL},
};
-static void py_VertBuf_dealloc(BPyGPUVertBuf *self)
+static void pygpu_vertbuf__tp_dealloc(BPyGPUVertBuf *self)
{
GPU_vertbuf_discard(self->buf);
Py_TYPE(self)->tp_free(self);
}
-PyDoc_STRVAR(py_gpu_vertex_buffer_doc,
+PyDoc_STRVAR(pygpu_vertbuf__tp_doc,
".. class:: GPUVertBuf(len, format)\n"
"\n"
" Contains a VBO.\n"
@@ -332,11 +335,11 @@ PyDoc_STRVAR(py_gpu_vertex_buffer_doc,
PyTypeObject BPyGPUVertBuf_Type = {
PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUVertBuf",
.tp_basicsize = sizeof(BPyGPUVertBuf),
- .tp_dealloc = (destructor)py_VertBuf_dealloc,
+ .tp_dealloc = (destructor)pygpu_vertbuf__tp_dealloc,
.tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_doc = py_gpu_vertex_buffer_doc,
- .tp_methods = py_VertBuf_methods,
- .tp_new = py_VertBuf_new,
+ .tp_doc = pygpu_vertbuf__tp_doc,
+ .tp_methods = pygpu_vertbuf__tp_methods,
+ .tp_new = pygpu_vertbuf__tp_new,
};
/** \} */
diff --git a/source/blender/python/gpu/gpu_py_vertex_format.c b/source/blender/python/gpu/gpu_py_vertex_format.c
index 7d1e4ee4868..343cf06b20a 100644
--- a/source/blender/python/gpu/gpu_py_vertex_format.c
+++ b/source/blender/python/gpu/gpu_py_vertex_format.c
@@ -32,115 +32,31 @@
#include "gpu_py_vertex_format.h" /* own include */
-#ifdef __BIG_ENDIAN__
-/* big endian */
-# define MAKE_ID2(c, d) ((c) << 8 | (d))
-# define MAKE_ID3(a, b, c) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8)
-# define MAKE_ID4(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d))
-#else
-/* little endian */
-# define MAKE_ID2(c, d) ((d) << 8 | (c))
-# define MAKE_ID3(a, b, c) ((int)(c) << 16 | (b) << 8 | (a))
-# define MAKE_ID4(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a))
-#endif
-
/* -------------------------------------------------------------------- */
/** \name Enum Conversion
*
* Use with PyArg_ParseTuple's "O&" formatting.
* \{ */
-static int py_parse_component_type(const char *str, int length)
-{
- if (length == 2) {
- switch (*((ushort *)str)) {
- case MAKE_ID2('I', '8'):
- return GPU_COMP_I8;
- case MAKE_ID2('U', '8'):
- return GPU_COMP_U8;
- default:
- break;
- }
- }
- else if (length == 3) {
- switch (*((uint *)str)) {
- case MAKE_ID3('I', '1', '6'):
- return GPU_COMP_I16;
- case MAKE_ID3('U', '1', '6'):
- return GPU_COMP_U16;
- case MAKE_ID3('I', '3', '2'):
- return GPU_COMP_I32;
- case MAKE_ID3('U', '3', '2'):
- return GPU_COMP_U32;
- case MAKE_ID3('F', '3', '2'):
- return GPU_COMP_F32;
- case MAKE_ID3('I', '1', '0'):
- return GPU_COMP_I10;
- default:
- break;
- }
- }
- return -1;
-}
-
-static int py_parse_fetch_mode(const char *str, int length)
-{
-#define MATCH_ID(id) \
- if (length == strlen(STRINGIFY(id))) { \
- if (STREQ(str, STRINGIFY(id))) { \
- return GPU_FETCH_##id; \
- } \
- } \
- ((void)0)
-
- MATCH_ID(FLOAT);
- MATCH_ID(INT);
- MATCH_ID(INT_TO_FLOAT_UNIT);
- MATCH_ID(INT_TO_FLOAT);
-#undef MATCH_ID
-
- return -1;
-}
-
-static int py_ParseVertCompType(PyObject *o, void *p)
-{
- Py_ssize_t length;
- const char *str = _PyUnicode_AsStringAndSize(o, &length);
-
- if (str == NULL) {
- PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name);
- return 0;
- }
-
- const int comp_type = py_parse_component_type(str, length);
- if (comp_type == -1) {
- PyErr_Format(PyExc_ValueError, "unknown component type: '%s", str);
- return 0;
- }
-
- *((GPUVertCompType *)p) = comp_type;
- return 1;
-}
-
-static int py_ParseVertFetchMode(PyObject *o, void *p)
-{
- Py_ssize_t length;
- const char *str = _PyUnicode_AsStringAndSize(o, &length);
-
- if (str == NULL) {
- PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name);
- return 0;
- }
-
- const int fetch_mode = py_parse_fetch_mode(str, length);
- if (fetch_mode == -1) {
- PyErr_Format(PyExc_ValueError, "unknown type literal: '%s'", str);
- return 0;
- }
+static struct PyC_StringEnumItems pygpu_vertcomptype_items[] = {
+ {GPU_COMP_I8, "I8"},
+ {GPU_COMP_U8, "U8"},
+ {GPU_COMP_I16, "I16"},
+ {GPU_COMP_U16, "U16"},
+ {GPU_COMP_I32, "I32"},
+ {GPU_COMP_U32, "U32"},
+ {GPU_COMP_F32, "F32"},
+ {GPU_COMP_I10, "I10"},
+ {0, NULL},
+};
- (*(GPUVertFetchMode *)p) = fetch_mode;
- return 1;
-}
+static struct PyC_StringEnumItems pygpu_vertfetchmode_items[] = {
+ {GPU_FETCH_FLOAT, "FLOAT"},
+ {GPU_FETCH_INT, "INT"},
+ {GPU_FETCH_INT_TO_FLOAT_UNIT, "INT_TO_FLOAT_UNIT"},
+ {GPU_FETCH_INT_TO_FLOAT, "INT_TO_FLOAT"},
+ {0, NULL},
+};
/** \} */
@@ -148,7 +64,9 @@ static int py_ParseVertFetchMode(PyObject *o, void *p)
/** \name VertFormat Type
* \{ */
-static PyObject *py_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+static PyObject *pygpu_vertformat__tp_new(PyTypeObject *UNUSED(type),
+ PyObject *args,
+ PyObject *kwds)
{
if (PyTuple_GET_SIZE(args) || (kwds && PyDict_Size(kwds))) {
PyErr_SetString(PyExc_ValueError, "This function takes no arguments");
@@ -158,7 +76,7 @@ static PyObject *py_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, P
}
PyDoc_STRVAR(
- py_VertFormat_attr_add_doc,
+ pygpu_vertformat_attr_add_doc,
".. method:: attr_add(id, comp_type, len, fetch_mode)\n"
"\n"
" Add a new attribute to the format.\n"
@@ -177,14 +95,12 @@ PyDoc_STRVAR(
" converted to a normal 4 byte float when used.\n"
" Possible values are `FLOAT`, `INT`, `INT_TO_FLOAT_UNIT` and `INT_TO_FLOAT`.\n"
" :type fetch_mode: `str`\n");
-static PyObject *py_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds)
+static PyObject *pygpu_vertformat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds)
{
- struct {
- const char *id;
- GPUVertCompType comp_type;
- uint len;
- GPUVertFetchMode fetch_mode;
- } params;
+ const char *id;
+ uint len;
+ struct PyC_StringEnum comp_type = {pygpu_vertcomptype_items, GPU_COMP_I8};
+ struct PyC_StringEnum fetch_mode = {pygpu_vertfetchmode_items, GPU_FETCH_FLOAT};
if (self->fmt.attr_len == GPU_VERT_ATTR_MAX_LEN) {
PyErr_SetString(PyExc_ValueError, "Maximum attr reached " STRINGIFY(GPU_VERT_ATTR_MAX_LEN));
@@ -196,45 +112,45 @@ static PyObject *py_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args,
if (!_PyArg_ParseTupleAndKeywordsFast(args,
kwds,
&_parser,
- &params.id,
- py_ParseVertCompType,
- &params.comp_type,
- &params.len,
- py_ParseVertFetchMode,
- &params.fetch_mode)) {
+ &id,
+ PyC_ParseStringEnum,
+ &comp_type,
+ &len,
+ PyC_ParseStringEnum,
+ &fetch_mode)) {
return NULL;
}
uint attr_id = GPU_vertformat_attr_add(
- &self->fmt, params.id, params.comp_type, params.len, params.fetch_mode);
+ &self->fmt, id, comp_type.value_found, len, fetch_mode.value_found);
return PyLong_FromLong(attr_id);
}
-static struct PyMethodDef py_VertFormat_methods[] = {
+static struct PyMethodDef pygpu_vertformat__tp_methods[] = {
{"attr_add",
- (PyCFunction)py_VertFormat_attr_add,
+ (PyCFunction)pygpu_vertformat_attr_add,
METH_VARARGS | METH_KEYWORDS,
- py_VertFormat_attr_add_doc},
+ pygpu_vertformat_attr_add_doc},
{NULL, NULL, 0, NULL},
};
-static void py_VertFormat_dealloc(BPyGPUVertFormat *self)
+static void pygpu_vertformat__tp_dealloc(BPyGPUVertFormat *self)
{
Py_TYPE(self)->tp_free(self);
}
-PyDoc_STRVAR(py_VertFormat_doc,
+PyDoc_STRVAR(pygpu_vertformat__tp_doc,
".. class:: GPUVertFormat()\n"
"\n"
" This object contains information about the structure of a vertex buffer.\n");
PyTypeObject BPyGPUVertFormat_Type = {
PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUVertFormat",
.tp_basicsize = sizeof(BPyGPUVertFormat),
- .tp_dealloc = (destructor)py_VertFormat_dealloc,
+ .tp_dealloc = (destructor)pygpu_vertformat__tp_dealloc,
.tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_doc = py_VertFormat_doc,
- .tp_methods = py_VertFormat_methods,
- .tp_new = py_VertFormat_new,
+ .tp_doc = pygpu_vertformat__tp_doc,
+ .tp_methods = pygpu_vertformat__tp_methods,
+ .tp_new = pygpu_vertformat__tp_new,
};
/** \} */
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
index 6462f8320d7..74fc8bcfec9 100644
--- a/source/blender/python/intern/bpy.c
+++ b/source/blender/python/intern/bpy.c
@@ -261,7 +261,7 @@ PyDoc_STRVAR(bpy_escape_identifier_doc,
static PyObject *bpy_escape_identifier(PyObject *UNUSED(self), PyObject *value)
{
Py_ssize_t value_str_len;
- const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len);
+ const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len);
if (value_str == NULL) {
PyErr_SetString(PyExc_TypeError, "expected a string");
@@ -299,7 +299,7 @@ PyDoc_STRVAR(bpy_unescape_identifier_doc,
static PyObject *bpy_unescape_identifier(PyObject *UNUSED(self), PyObject *value)
{
Py_ssize_t value_str_len;
- const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len);
+ const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len);
if (value_str == NULL) {
PyErr_SetString(PyExc_TypeError, "expected a string");
diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c
index 02ab001dbf6..c7e195b586d 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -424,11 +424,6 @@ static PyGetSetDef bpy_app_getsets[] = {
bpy_app_debug_set,
bpy_app_debug_doc,
(void *)G_DEBUG_SIMDATA},
- {"debug_gpumem",
- bpy_app_debug_get,
- bpy_app_debug_set,
- bpy_app_debug_doc,
- (void *)G_DEBUG_GPU_MEM},
{"debug_io", bpy_app_debug_get, bpy_app_debug_set, bpy_app_debug_doc, (void *)G_DEBUG_IO},
{"use_event_simulate",
diff --git a/source/blender/python/intern/bpy_app_handlers.c b/source/blender/python/intern/bpy_app_handlers.c
index 1e81621246e..8ecee9b3f2e 100644
--- a/source/blender/python/intern/bpy_app_handlers.c
+++ b/source/blender/python/intern/bpy_app_handlers.c
@@ -286,7 +286,7 @@ void BPY_app_handlers_reset(const short do_all)
}
else {
/* remove */
- /* PySequence_DelItem(ls, i); */ /* more obvious buw slower */
+ /* PySequence_DelItem(ls, i); */ /* more obvious but slower */
PyList_SetSlice(ls, i, i + 1, NULL);
}
}
diff --git a/source/blender/python/intern/bpy_app_translations.c b/source/blender/python/intern/bpy_app_translations.c
index ee64d0a409c..d00f205ddc0 100644
--- a/source/blender/python/intern/bpy_app_translations.c
+++ b/source/blender/python/intern/bpy_app_translations.c
@@ -211,7 +211,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale)
msgctxt = BLT_I18NCONTEXT_DEFAULT_BPYRNA;
}
else if (PyUnicode_Check(tmp)) {
- msgctxt = _PyUnicode_AsString(tmp);
+ msgctxt = PyUnicode_AsUTF8(tmp);
}
else {
invalid_key = true;
@@ -219,7 +219,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale)
tmp = PyTuple_GET_ITEM(pykey, 1);
if (PyUnicode_Check(tmp)) {
- msgid = _PyUnicode_AsString(tmp);
+ msgid = PyUnicode_AsUTF8(tmp);
}
else {
invalid_key = true;
@@ -250,7 +250,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale)
/* Do not overwrite existing keys! */
if (BPY_app_translations_py_pgettext(msgctxt, msgid) == msgid) {
GHashKey *key = _ghashutil_keyalloc(msgctxt, msgid);
- BLI_ghash_insert(_translations_cache, key, BLI_strdup(_PyUnicode_AsString(trans)));
+ BLI_ghash_insert(_translations_cache, key, BLI_strdup(PyUnicode_AsUTF8(trans)));
}
}
}
@@ -341,7 +341,7 @@ static PyObject *app_translations_py_messages_register(BlenderAppTranslations *s
PyExc_ValueError,
"bpy.app.translations.register: translations message cache already contains some data for "
"addon '%s'",
- (const char *)_PyUnicode_AsString(module_name));
+ (const char *)PyUnicode_AsUTF8(module_name));
return NULL;
}
@@ -795,11 +795,7 @@ static PyTypeObject BlenderAppTranslationsType = {
/* methods */
/* No destructor, this is a singleton! */
NULL, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
+ 0, /* tp_vectorcall_offset */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL,
diff --git a/source/blender/python/intern/bpy_capi_utils.c b/source/blender/python/intern/bpy_capi_utils.c
index 57dc4c0a679..b2670161d92 100644
--- a/source/blender/python/intern/bpy_capi_utils.c
+++ b/source/blender/python/intern/bpy_capi_utils.c
@@ -136,7 +136,7 @@ bool BPy_errors_to_report_ex(ReportList *reports,
RPT_ERROR,
TIP_("%s: %s\nlocation: %s:%d\n"),
error_prefix,
- _PyUnicode_AsString(pystring),
+ PyUnicode_AsUTF8(pystring),
filename,
lineno);
@@ -144,12 +144,12 @@ bool BPy_errors_to_report_ex(ReportList *reports,
fprintf(stderr,
TIP_("%s: %s\nlocation: %s:%d\n"),
error_prefix,
- _PyUnicode_AsString(pystring),
+ PyUnicode_AsUTF8(pystring),
filename,
lineno);
}
else {
- BKE_reportf(reports, RPT_ERROR, "%s: %s", error_prefix, _PyUnicode_AsString(pystring));
+ BKE_reportf(reports, RPT_ERROR, "%s: %s", error_prefix, PyUnicode_AsUTF8(pystring));
}
Py_DECREF(pystring);
diff --git a/source/blender/python/intern/bpy_capi_utils.h b/source/blender/python/intern/bpy_capi_utils.h
index 55f8a291410..0854713982d 100644
--- a/source/blender/python/intern/bpy_capi_utils.h
+++ b/source/blender/python/intern/bpy_capi_utils.h
@@ -20,8 +20,8 @@
#pragma once
-#if PY_VERSION_HEX < 0x03070000
-# error "Python 3.7 or greater is required, you'll need to update your Python."
+#if PY_VERSION_HEX < 0x03090000
+# error "Python 3.9 or greater is required, you'll need to update your Python."
#endif
#ifdef __cplusplus
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index c0536693f38..5102aa17250 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -163,7 +163,7 @@ int bpy_pydriver_create_dict(void)
PyObject *arg_key, *arg_value;
Py_ssize_t arg_pos = 0;
while (PyDict_Next(mod_math_dict, &arg_pos, &arg_key, &arg_value)) {
- const char *arg_str = _PyUnicode_AsString(arg_key);
+ const char *arg_str = PyUnicode_AsUTF8(arg_key);
if (arg_str[0] && arg_str[1] != '_') {
PyDict_SetItem(bpy_pydriver_Dict__whitelist, arg_key, Py_None);
}
@@ -363,7 +363,7 @@ static bool bpy_driver_secure_bytecode_validate(PyObject *expr_code, PyObject *d
fprintf(stderr,
"\tBPY_driver_eval() - restricted access disallows name '%s', "
"enable auto-execution to support\n",
- _PyUnicode_AsString(name));
+ PyUnicode_AsUTF8(name));
return false;
}
}
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 64e992bd76f..c5f5e9c71b8 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -304,92 +304,153 @@ static struct _inittab bpy_internal_modules[] = {
{NULL, NULL},
};
+/**
+ * Convenience function for #BPY_python_start.
+ *
+ * These should happen so rarely that having comprehensive errors isn't needed.
+ * For example if `sys.argv` fails to allocate memory.
+ *
+ * Show an error just to avoid silent failure in the unlikely event something goes wrong,
+ * in this case a developer will need to track down the root cause.
+ */
+static void pystatus_exit_on_error(PyStatus status)
+{
+ if (UNLIKELY(PyStatus_Exception(status))) {
+ fputs("Internal error initializing Python!\n", stderr);
+ /* This calls `exit`. */
+ Py_ExitStatusException(status);
+ }
+}
+
/* call BPY_context_set first */
void BPY_python_start(bContext *C, int argc, const char **argv)
{
#ifndef WITH_PYTHON_MODULE
- PyThreadState *py_tstate = NULL;
- /* Needed for Python's initialization for portable Python installations.
- * We could use #Py_SetPath, but this overrides Python's internal logic
- * for calculating it's own module search paths.
- *
- * `sys.executable` is overwritten after initialization to the Python binary. */
+ /* #PyPreConfig (early-configuration). */
{
- const char *program_path = BKE_appdir_program_path();
- wchar_t program_path_wchar[FILE_MAX];
- BLI_strncpy_wchar_from_utf8(program_path_wchar, program_path, ARRAY_SIZE(program_path_wchar));
- Py_SetProgramName(program_path_wchar);
- }
+ PyPreConfig preconfig;
+ PyStatus status;
- /* must run before python initializes */
- PyImport_ExtendInittab(bpy_internal_modules);
-
- /* Allow to use our own included Python. `py_path_bundle` may be NULL. */
- {
- const char *py_path_bundle = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, NULL);
- if (py_path_bundle != NULL) {
- PyC_SetHomePath(py_path_bundle);
+ if (py_use_system_env) {
+ PyPreConfig_InitPythonConfig(&preconfig);
}
else {
- /* Common enough to use the system Python on Linux/Unix, warn on other systems. */
-# if defined(__APPLE__) || defined(_WIN32)
- fprintf(stderr,
- "Bundled Python not found and is expected on this platform "
- "(the 'install' target may have not been built)\n");
-# endif
+ /* Only use the systems environment variables and site when explicitly requested.
+ * Since an incorrect 'PYTHONPATH' causes difficult to debug errors, see: T72807.
+ * An alternative to setting `preconfig.use_environment = 0` */
+ PyPreConfig_InitIsolatedConfig(&preconfig);
}
- }
- /* Without this the `sys.stdout` may be set to 'ascii'
- * (it is on my system at least), where printing unicode values will raise
- * an error, this is highly annoying, another stumbling block for developers,
- * so use a more relaxed error handler and enforce utf-8 since the rest of
- * Blender is utf-8 too - campbell */
- Py_SetStandardStreamEncoding("utf-8", "surrogateescape");
+ /* Force `utf-8` on all platforms, since this is what's used for Blender's internal strings,
+ * providing consistent encoding behavior across all Blender installations.
+ *
+ * This also uses the `surrogateescape` error handler ensures any unexpected bytes are escaped
+ * instead of raising an error.
+ *
+ * Without this `sys.getfilesystemencoding()` and `sys.stdout` for example may be set to ASCII
+ * or some other encoding - where printing some `utf-8` values will raise an error.
+ *
+ * This can cause scripts to fail entirely on some systems.
+ *
+ * This assignment is the equivalent of enabling the `PYTHONUTF8` environment variable.
+ * See `PEP-540` for details on exactly what this changes. */
+ preconfig.utf8_mode = true;
+
+ /* Note that there is no reason to call #Py_PreInitializeFromBytesArgs here
+ * as this is only used so that command line arguments can be handled by Python itself,
+ * not for setting `sys.argv` (handled below). */
+ status = Py_PreInitialize(&preconfig);
+ pystatus_exit_on_error(status);
+ }
+
+ /* Must run before python initializes, but after #PyPreConfig. */
+ PyImport_ExtendInittab(bpy_internal_modules);
- /* Suppress error messages when calculating the module search path.
- * While harmless, it's noisy. */
- Py_FrozenFlag = 1;
+ /* #PyConfig (initialize Python). */
+ {
+ PyConfig config;
+ PyStatus status;
+ bool has_python_executable = false;
+
+ PyConfig_InitPythonConfig(&config);
+
+ /* Suppress error messages when calculating the module search path.
+ * While harmless, it's noisy. */
+ config.pathconfig_warnings = 0;
+
+ /* When using the system's Python, allow the site-directory as well. */
+ config.user_site_directory = py_use_system_env;
+
+ /* While `sys.argv` is set, we don't want Python to interpret it. */
+ config.parse_argv = 0;
+ status = PyConfig_SetBytesArgv(&config, argc, (char *const *)argv);
+ pystatus_exit_on_error(status);
+
+ /* Needed for Python's initialization for portable Python installations.
+ * We could use #Py_SetPath, but this overrides Python's internal logic
+ * for calculating it's own module search paths.
+ *
+ * `sys.executable` is overwritten after initialization to the Python binary. */
+ {
+ const char *program_path = BKE_appdir_program_path();
+ status = PyConfig_SetBytesString(&config, &config.program_name, program_path);
+ pystatus_exit_on_error(status);
+ }
- /* Only use the systems environment variables and site when explicitly requested.
- * Since an incorrect 'PYTHONPATH' causes difficult to debug errors, see: T72807. */
- Py_IgnoreEnvironmentFlag = !py_use_system_env;
- Py_NoUserSiteDirectory = !py_use_system_env;
+ /* Setting the program name is important so the 'multiprocessing' module
+ * can launch new Python instances. */
+ {
+ char program_path[FILE_MAX];
+ if (BKE_appdir_program_python_search(
+ program_path, sizeof(program_path), PY_MAJOR_VERSION, PY_MINOR_VERSION)) {
+ status = PyConfig_SetBytesString(&config, &config.executable, program_path);
+ pystatus_exit_on_error(status);
+ has_python_executable = true;
+ }
+ else {
+ /* Set to `sys.executable = None` below (we can't do before Python is initialized). */
+ fprintf(stderr,
+ "Unable to find the python binary, "
+ "the multiprocessing module may not be functional!\n");
+ }
+ }
- /* Initialize Python (also acquires lock). */
- Py_Initialize();
+ /* Allow to use our own included Python. `py_path_bundle` may be NULL. */
+ {
+ const char *py_path_bundle = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, NULL);
+ if (py_path_bundle != NULL) {
+
+# ifdef __APPLE__
+ /* Mac-OS allows file/directory names to contain `:` character
+ * (represented as `/` in the Finder) but current Python lib (as of release 3.1.1)
+ * doesn't handle these correctly. */
+ if (strchr(py_path_bundle, ':')) {
+ fprintf(stderr,
+ "Warning! Blender application is located in a path containing ':' or '/' chars\n"
+ "This may make python import function fail\n");
+ }
+# endif /* __APPLE__ */
- /* We could convert to #wchar_t then pass to #PySys_SetArgv (or use #PyConfig in Python 3.8+).
- * However this risks introducing subtle changes in encoding that are hard to track down.
- *
- * So rely on #PyC_UnicodeFromByte since it's a tried & true way of getting paths
- * that include non `utf-8` compatible characters, see: T20021. */
- {
- PyObject *py_argv = PyList_New(argc);
- for (int i = 0; i < argc; i++) {
- PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i]));
+ status = PyConfig_SetBytesString(&config, &config.home, py_path_bundle);
+ pystatus_exit_on_error(status);
+ }
+ else {
+ /* Common enough to use the system Python on Linux/Unix, warn on other systems. */
+# if defined(__APPLE__) || defined(_WIN32)
+ fprintf(stderr,
+ "Bundled Python not found and is expected on this platform "
+ "(the 'install' target may have not been built)\n");
+# endif
+ }
}
- PySys_SetObject("argv", py_argv);
- Py_DECREF(py_argv);
- }
- /* Setting the program name is important so the 'multiprocessing' module
- * can launch new Python instances. */
- {
- const char *sys_variable = "executable";
- char program_path[FILE_MAX];
- if (BKE_appdir_program_python_search(
- program_path, sizeof(program_path), PY_MAJOR_VERSION, PY_MINOR_VERSION)) {
- PyObject *py_program_path = PyC_UnicodeFromByte(program_path);
- PySys_SetObject(sys_variable, py_program_path);
- Py_DECREF(py_program_path);
- }
- else {
- fprintf(stderr,
- "Unable to find the python binary, "
- "the multiprocessing module may not be functional!\n");
- PySys_SetObject(sys_variable, Py_None);
+ /* Initialize Python (also acquires lock). */
+ status = Py_InitializeFromConfig(&config);
+ pystatus_exit_on_error(status);
+
+ if (!has_python_executable) {
+ PySys_SetObject("executable", Py_None);
}
}
@@ -439,8 +500,9 @@ void BPY_python_start(bContext *C, int argc, const char **argv)
/* py module runs atexit when bpy is freed */
BPY_atexit_register(); /* this can init any time */
- py_tstate = PyGILState_GetThisThreadState();
- PyEval_ReleaseThread(py_tstate);
+ /* Free the lock acquired (implicitly) when Python is initialized. */
+ PyEval_ReleaseThread(PyGILState_GetThisThreadState());
+
#endif
#ifdef WITH_PYTHON_MODULE
@@ -526,8 +588,8 @@ void BPY_python_backtrace(FILE *fp)
PyFrameObject *frame = tstate->frame;
do {
const int line = PyCode_Addr2Line(frame->f_code, frame->f_lasti);
- const char *filename = _PyUnicode_AsString(frame->f_code->co_filename);
- const char *funcname = _PyUnicode_AsString(frame->f_code->co_name);
+ const char *filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
+ const char *funcname = PyUnicode_AsUTF8(frame->f_code->co_name);
fprintf(fp, " File \"%s\", line %d in %s\n", filename, line, funcname);
} while ((frame = frame->f_back));
}
@@ -719,7 +781,7 @@ static void bpy_module_delay_init(PyObject *bpy_proxy)
/* updating the module dict below will lose the reference to __file__ */
PyObject *filename_obj = PyModule_GetFilenameObject(bpy_proxy);
- const char *filename_rel = _PyUnicode_AsString(filename_obj); /* can be relative */
+ const char *filename_rel = PyUnicode_AsUTF8(filename_obj); /* can be relative */
char filename_abs[1024];
BLI_strncpy(filename_abs, filename_rel, sizeof(filename_abs));
diff --git a/source/blender/python/intern/bpy_interface_atexit.c b/source/blender/python/intern/bpy_interface_atexit.c
index 8e5a6dc530b..03d51b2fd59 100644
--- a/source/blender/python/intern/bpy_interface_atexit.c
+++ b/source/blender/python/intern/bpy_interface_atexit.c
@@ -42,7 +42,7 @@ static PyObject *bpy_atexit(PyObject *UNUSED(self), PyObject *UNUSED(args), PyOb
}
static PyMethodDef meth_bpy_atexit = {"bpy_atexit", (PyCFunction)bpy_atexit, METH_NOARGS, NULL};
-static PyObject *func_bpy_atregister = NULL; /* borrowed referebce, atexit holds */
+static PyObject *func_bpy_atregister = NULL; /* borrowed reference, `atexit` holds. */
static void atexit_func_call(const char *func_name, PyObject *atexit_func_arg)
{
diff --git a/source/blender/python/intern/bpy_library_load.c b/source/blender/python/intern/bpy_library_load.c
index c6f0fbd3a2b..020c8f7ea49 100644
--- a/source/blender/python/intern/bpy_library_load.c
+++ b/source/blender/python/intern/bpy_library_load.c
@@ -94,13 +94,9 @@ static PyTypeObject bpy_lib_Type = {
0, /* tp_itemsize */
/* methods */
(destructor)bpy_lib_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
NULL,
/* tp_compare */ /* DEPRECATED in python 3.0! */
NULL, /* tp_repr */
@@ -173,7 +169,7 @@ static PyTypeObject bpy_lib_Type = {
PyDoc_STRVAR(
bpy_lib_load_doc,
- ".. method:: load(filepath, link=False, relative=False)\n"
+ ".. method:: load(filepath, link=False, relative=False, assets_only=False)\n"
"\n"
" Returns a context manager which exposes 2 library objects on entering.\n"
" Each object has attributes matching bpy.data which are lists of strings to be linked.\n"
@@ -183,18 +179,28 @@ PyDoc_STRVAR(
" :arg link: When False reference to the original file is lost.\n"
" :type link: bool\n"
" :arg relative: When True the path is stored relative to the open blend file.\n"
- " :type relative: bool\n");
+ " :type relative: bool\n"
+ " :arg assets_only: If True, only list data-blocks marked as assets.\n"
+ " :type assets_only: bool\n");
static PyObject *bpy_lib_load(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
Main *bmain = CTX_data_main(BPY_context_get());
BPy_Library *ret;
const char *filename = NULL;
- bool is_rel = false, is_link = false;
-
- static const char *_keywords[] = {"filepath", "link", "relative", NULL};
- static _PyArg_Parser _parser = {"s|O&O&:load", _keywords, 0};
- if (!_PyArg_ParseTupleAndKeywordsFast(
- args, kw, &_parser, &filename, PyC_ParseBool, &is_link, PyC_ParseBool, &is_rel)) {
+ bool is_rel = false, is_link = false, use_assets_only = false;
+
+ static const char *_keywords[] = {"filepath", "link", "relative", "assets_only", NULL};
+ static _PyArg_Parser _parser = {"s|O&O&O&:load", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args,
+ kw,
+ &_parser,
+ &filename,
+ PyC_ParseBool,
+ &is_link,
+ PyC_ParseBool,
+ &is_rel,
+ PyC_ParseBool,
+ &use_assets_only)) {
return NULL;
}
@@ -205,7 +211,8 @@ static PyObject *bpy_lib_load(PyObject *UNUSED(self), PyObject *args, PyObject *
BLI_path_abs(ret->abspath, BKE_main_blendfile_path(bmain));
ret->blo_handle = NULL;
- ret->flag = ((is_link ? FILE_LINK : 0) | (is_rel ? FILE_RELPATH : 0));
+ ret->flag = ((is_link ? FILE_LINK : 0) | (is_rel ? FILE_RELPATH : 0) |
+ (use_assets_only ? FILE_ASSETS_ONLY : 0));
ret->dict = _PyDict_NewPresized(MAX_LIBARRAY);
@@ -218,7 +225,8 @@ static PyObject *_bpy_names(BPy_Library *self, int blocktype)
LinkNode *l, *names;
int totnames;
- names = BLO_blendhandle_get_datablock_names(self->blo_handle, blocktype, &totnames);
+ names = BLO_blendhandle_get_datablock_names(
+ self->blo_handle, blocktype, (self->flag & FILE_ASSETS_ONLY) != 0, &totnames);
list = PyList_New(totnames);
if (names) {
@@ -353,7 +361,7 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
for (i = 0; i < size; i++) {
PyObject *item_src = PyList_GET_ITEM(ls, i);
PyObject *item_dst; /* must be set below */
- const char *item_idname = _PyUnicode_AsString(item_src);
+ const char *item_idname = PyUnicode_AsUTF8(item_src);
// printf(" %s\n", item_idname);
diff --git a/source/blender/python/intern/bpy_msgbus.c b/source/blender/python/intern/bpy_msgbus.c
index df45007b68f..7cc7f864c9c 100644
--- a/source/blender/python/intern/bpy_msgbus.c
+++ b/source/blender/python/intern/bpy_msgbus.c
@@ -118,7 +118,7 @@ static int py_msgbus_rna_key_from_py(PyObject *py_sub,
PointerRNA data_type_ptr = {
.type = data_type,
};
- const char *data_prop_str = _PyUnicode_AsString(data_prop_py);
+ const char *data_prop_str = PyUnicode_AsUTF8(data_prop_py);
PropertyRNA *data_prop = RNA_struct_find_property(&data_type_ptr, data_prop_str);
if (data_prop == NULL) {
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c
index 5ac76ab9ac1..967eece4bcb 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -58,7 +58,7 @@
static wmOperatorType *ot_lookup_from_py_string(PyObject *value, const char *py_fn_id)
{
- const char *opname = _PyUnicode_AsString(value);
+ const char *opname = PyUnicode_AsUTF8(value);
if (opname == NULL) {
PyErr_Format(PyExc_TypeError, "%s() expects a string argument", py_fn_id);
return NULL;
diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c
index 9fb25d41844..5137f41d43a 100644
--- a/source/blender/python/intern/bpy_operator_wrap.c
+++ b/source/blender/python/intern/bpy_operator_wrap.c
@@ -68,7 +68,7 @@ static void operator_properties_init(wmOperatorType *ot)
if (bl_property) {
if (PyUnicode_Check(bl_property)) {
/* since the property is explicitly given, raise an error if its not found */
- prop_id = _PyUnicode_AsString(bl_property);
+ prop_id = PyUnicode_AsUTF8(bl_property);
prop_raise_error = true;
}
else {
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index 354086ef4c3..b2812e0eba7 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -193,6 +193,126 @@ static const EnumPropertyItem property_subtype_array_items[] = {
"'XYZ', 'XYZ_LENGTH', 'COLOR_GAMMA', 'COORDINATES', 'LAYER', 'LAYER_MEMBER', 'NONE'].\n" \
" :type subtype: string\n"
+/* -------------------------------------------------------------------- */
+/** \name Deferred Property Type
+ *
+ * Operators and classes use this so it can store the arguments given but defer
+ * running it until the operator runs where these values are used to setup
+ * the default arguments for that operator instance.
+ * \{ */
+
+static void bpy_prop_deferred_dealloc(BPy_PropDeferred *self)
+{
+ if (self->kw) {
+ PyObject_GC_UnTrack(self);
+ Py_CLEAR(self->kw);
+ }
+ PyObject_GC_Del(self);
+}
+
+static int bpy_prop_deferred_traverse(BPy_PropDeferred *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->kw);
+ return 0;
+}
+
+static int bpy_prop_deferred_clear(BPy_PropDeferred *self)
+{
+ Py_CLEAR(self->kw);
+ return 0;
+}
+
+static PyObject *bpy_prop_deferred_repr(BPy_PropDeferred *self)
+{
+ return PyUnicode_FromFormat("<%.200s, %R, %R>", Py_TYPE(self)->tp_name, self->fn, self->kw);
+}
+
+/**
+ * HACK: needed by `typing.get_type_hints`
+ * with `from __future__ import annotations` enabled or when using Python 3.10 or newer.
+ *
+ * When callable this object type passes the test for being an acceptable annotation.
+ */
+static PyObject *bpy_prop_deferred_call(BPy_PropDeferred *UNUSED(self),
+ PyObject *UNUSED(args),
+ PyObject *UNUSED(kw))
+{
+ /* Dummy value. */
+ Py_RETURN_NONE;
+}
+
+/* Get/Set Items. */
+
+/**
+ * Expose the function in case scripts need to introspect this information
+ * (not currently used by Blender it's self).
+ */
+static PyObject *bpy_prop_deferred_function_get(BPy_PropDeferred *self, void *UNUSED(closure))
+{
+ PyObject *ret = self->fn;
+ Py_IncRef(ret);
+ return ret;
+}
+
+/**
+ * Expose keywords in case scripts need to introspect this information
+ * (not currently used by Blender it's self).
+ */
+static PyObject *bpy_prop_deferred_keywords_get(BPy_PropDeferred *self, void *UNUSED(closure))
+{
+ PyObject *ret = self->kw;
+ Py_IncRef(ret);
+ return ret;
+}
+
+static PyGetSetDef bpy_prop_deferred_getset[] = {
+ {"function", (getter)bpy_prop_deferred_function_get, (setter)NULL, NULL, NULL},
+ {"keywords", (getter)bpy_prop_deferred_keywords_get, (setter)NULL, NULL, NULL},
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+PyDoc_STRVAR(bpy_prop_deferred_doc,
+ "Intermediate storage for properties before registration.\n"
+ "\n"
+ ".. note::\n"
+ "\n"
+ " This is not part of the stable API and may change between releases.");
+
+PyTypeObject bpy_prop_deferred_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+
+ .tp_name = "_PropertyDeferred",
+ .tp_basicsize = sizeof(BPy_PropDeferred),
+ .tp_dealloc = (destructor)bpy_prop_deferred_dealloc,
+ .tp_repr = (reprfunc)bpy_prop_deferred_repr,
+ .tp_call = (ternaryfunc)bpy_prop_deferred_call,
+
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+
+ .tp_doc = bpy_prop_deferred_doc,
+ .tp_traverse = (traverseproc)bpy_prop_deferred_traverse,
+ .tp_clear = (inquiry)bpy_prop_deferred_clear,
+
+ .tp_getset = bpy_prop_deferred_getset,
+};
+
+static PyObject *bpy_prop_deferred_data_CreatePyObject(PyObject *fn, PyObject *kw)
+{
+ BPy_PropDeferred *self = PyObject_GC_New(BPy_PropDeferred, &bpy_prop_deferred_Type);
+ self->fn = fn;
+ if (kw == NULL) {
+ kw = PyDict_New();
+ }
+ else {
+ Py_INCREF(kw);
+ }
+ self->kw = kw;
+ PyObject_GC_Track(self);
+ return (PyObject *)self;
+}
+
+/** \} */
+
/* PyObject's */
static PyObject *pymeth_BoolProperty = NULL;
static PyObject *pymeth_BoolVectorProperty = NULL;
@@ -248,27 +368,6 @@ static void bpy_prop_assign_flag_override(PropertyRNA *prop, const int flag_over
RNA_def_property_override_flag(prop, flag_override);
}
-/* operators and classes use this so it can store the args given but defer
- * running it until the operator runs where these values are used to setup
- * the default args for that operator instance */
-static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
-{
- PyObject *ret = PyTuple_New(2);
- PyTuple_SET_ITEM(ret, 0, func);
- Py_INCREF(func);
-
- if (kw == NULL) {
- kw = PyDict_New();
- }
- else {
- Py_INCREF(kw);
- }
-
- PyTuple_SET_ITEM(ret, 1, kw);
-
- return ret;
-}
-
/* callbacks */
static void bpy_prop_update_cb(struct bContext *C,
struct PointerRNA *ptr,
@@ -1152,7 +1251,7 @@ static void bpy_prop_string_get_cb(struct PointerRNA *ptr, struct PropertyRNA *p
}
else {
Py_ssize_t length;
- const char *buffer = _PyUnicode_AsStringAndSize(ret, &length);
+ const char *buffer = PyUnicode_AsUTF8AndSize(ret, &length);
memcpy(value, buffer, length + 1);
Py_DECREF(ret);
}
@@ -1213,7 +1312,7 @@ static int bpy_prop_string_length_cb(struct PointerRNA *ptr, struct PropertyRNA
}
else {
Py_ssize_t length_ssize_t = 0;
- _PyUnicode_AsStringAndSize(ret, &length_ssize_t);
+ PyUnicode_AsUTF8AndSize(ret, &length_ssize_t);
length = length_ssize_t;
Py_DECREF(ret);
}
@@ -1488,7 +1587,7 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast,
else {
if (def) {
if (!py_long_as_int(def, &def_int_cmp)) {
- def_string_cmp = _PyUnicode_AsString(def);
+ def_string_cmp = PyUnicode_AsUTF8(def);
if (def_string_cmp == NULL) {
PyErr_Format(PyExc_TypeError,
"EnumProperty(...): default option must be a 'str' or 'int' "
@@ -1517,14 +1616,13 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast,
if ((PyTuple_CheckExact(item)) && (item_size = PyTuple_GET_SIZE(item)) &&
(item_size >= 3 && item_size <= 5) &&
- (tmp.identifier = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) &&
- (tmp.name = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) &&
- (tmp.description = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 2),
- &desc_str_size)) &&
+ (tmp.identifier = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) &&
+ (tmp.name = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) &&
+ (tmp.description = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 2), &desc_str_size)) &&
/* TODO, number isn't ensured to be unique from the script author */
(item_size != 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value)) &&
(item_size != 5 || ((py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.icon) ||
- (tmp_icon = _PyUnicode_AsString(PyTuple_GET_ITEM(item, 3)))) &&
+ (tmp_icon = PyUnicode_AsUTF8(PyTuple_GET_ITEM(item, 3)))) &&
py_long_as_int(PyTuple_GET_ITEM(item, 4), &tmp.value)))) {
if (is_enum_flag) {
if (item_size < 4) {
@@ -1998,7 +2096,7 @@ static void bpy_prop_callback_assign_enum(struct PropertyRNA *prop,
if (PyErr_Occurred()) { \
return NULL; \
} \
- return bpy_prop_deferred_return(pymeth_##_func, kw); \
+ return bpy_prop_deferred_data_CreatePyObject(pymeth_##_func, kw); \
} \
(void)0
@@ -3301,7 +3399,7 @@ StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix)
if (!srna) {
if (PyErr_Occurred()) {
PyObject *msg = PyC_ExceptionBuffer();
- const char *msg_char = _PyUnicode_AsString(msg);
+ const char *msg_char = PyUnicode_AsUTF8(msg);
PyErr_Format(
PyExc_TypeError, "%.200s expected an RNA type, failed with: %s", error_prefix, msg_char);
Py_DECREF(msg);
@@ -3669,5 +3767,10 @@ PyObject *BPY_rna_props(void)
ASSIGN_STATIC(CollectionProperty);
ASSIGN_STATIC(RemoveProperty);
+ if (PyType_Ready(&bpy_prop_deferred_Type) < 0) {
+ return NULL;
+ }
+ PyModule_AddType(submodule, &bpy_prop_deferred_Type);
+
return submodule;
}
diff --git a/source/blender/python/intern/bpy_props.h b/source/blender/python/intern/bpy_props.h
index 3d7860dcdd8..6cebf82d373 100644
--- a/source/blender/python/intern/bpy_props.h
+++ b/source/blender/python/intern/bpy_props.h
@@ -30,6 +30,16 @@ PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw);
PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw);
StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix);
+typedef struct {
+ PyObject_HEAD
+ /* This isn't GC tracked, it's a function from `bpy.props` so it's not going away. */
+ void *fn;
+ PyObject *kw;
+} BPy_PropDeferred;
+
+extern PyTypeObject bpy_prop_deferred_Type;
+#define BPy_PropDeferred_CheckTypeExact(v) (Py_TYPE(v) == &bpy_prop_deferred_Type)
+
#define PYRNA_STACK_ARRAY RNA_STACK_ARRAY
#ifdef __cplusplus
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index a2125a5dff9..189d8308c14 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -80,6 +80,15 @@
#define USE_MATHUTILS
#define USE_STRING_COERCE
+/**
+ * This _must_ be enabled to support Python 3.10's postponed annotations,
+ * `from __future__ import annotations`.
+ *
+ * This has the disadvantage of evaluating strings at run-time, in the future we might be able to
+ * reinstate the older, more efficient logic using descriptors, see: pep-0649
+ */
+#define USE_POSTPONED_ANNOTATIONS
+
/* Unfortunately Python needs to hold a global reference to the context.
* If we remove this is means `bpy.context` won't be usable from some parts of the code:
* `bpy.app.handler` callbacks for example.
@@ -90,6 +99,9 @@ BPy_StructRNA *bpy_context_module = NULL; /* for fast access */
static PyObject *pyrna_struct_Subtype(PointerRNA *ptr);
static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self);
+static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class);
+static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class);
+
#define BPY_DOC_ID_PROP_TYPE_NOTE \
" .. note::\n" \
"\n" \
@@ -323,7 +335,7 @@ static bool rna_id_write_error(PointerRNA *ptr, PyObject *key)
const char *idtype = BKE_idtype_idcode_to_name(idcode);
const char *pyname;
if (key && PyUnicode_Check(key)) {
- pyname = _PyUnicode_AsString(key);
+ pyname = PyUnicode_AsUTF8(key);
}
else {
pyname = "<UNKNOWN>";
@@ -605,7 +617,7 @@ static short pyrna_rotation_euler_order_get(PointerRNA *ptr,
if (*r_prop_eul_order) {
const short order = RNA_property_enum_get(ptr, *r_prop_eul_order);
- /* Could be quat or axisangle. */
+ /* Could be quaternion or axis-angle. */
if (order >= EULER_ORDER_XYZ && order <= EULER_ORDER_ZYX) {
return order;
}
@@ -1252,7 +1264,7 @@ static const char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
static int pyrna_string_to_enum(
PyObject *item, PointerRNA *ptr, PropertyRNA *prop, int *r_value, const char *error_prefix)
{
- const char *param = _PyUnicode_AsString(item);
+ const char *param = PyUnicode_AsUTF8(item);
if (param == NULL) {
PyErr_Format(PyExc_TypeError,
@@ -1299,7 +1311,7 @@ BLI_bitmap *pyrna_set_to_enum_bitmap(const EnumPropertyItem *items,
BLI_bitmap *bitmap = BLI_BITMAP_NEW(bitmap_size, __func__);
while (_PySet_NextEntry(value, &pos, &key, &hash)) {
- const char *param = _PyUnicode_AsString(key);
+ const char *param = PyUnicode_AsUTF8(key);
if (param == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s expected a string, not %.200s",
@@ -1364,7 +1376,7 @@ int pyrna_set_to_enum_bitfield(const EnumPropertyItem *items,
*r_value = 0;
while (_PySet_NextEntry(value, &pos, &key, &hash)) {
- const char *param = _PyUnicode_AsString(key);
+ const char *param = PyUnicode_AsUTF8(key);
if (param == NULL) {
PyErr_Format(PyExc_TypeError,
@@ -1662,7 +1674,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr,
Py_ssize_t pos = 0;
while (PyDict_Next(kw, &pos, &key, &value)) {
- arg_name = _PyUnicode_AsString(key);
+ arg_name = PyUnicode_AsUTF8(key);
if (RNA_struct_find_property(ptr, arg_name) == NULL) {
break;
}
@@ -1871,10 +1883,10 @@ static int pyrna_py_to_prop(
param = PyC_UnicodeAsByte(value, &value_coerce);
}
else {
- param = _PyUnicode_AsString(value);
+ param = PyUnicode_AsUTF8(value);
}
#else /* USE_STRING_COERCE */
- param = _PyUnicode_AsString(value);
+ param = PyUnicode_AsUTF8(value);
#endif /* USE_STRING_COERCE */
if (param == NULL) {
@@ -2186,7 +2198,7 @@ static int pyrna_py_to_prop(
if (pyrna_pydict_to_props(
&itemptr, item, true, "Converting a Python list to an RNA collection") == -1) {
PyObject *msg = PyC_ExceptionBuffer();
- const char *msg_char = _PyUnicode_AsString(msg);
+ const char *msg_char = PyUnicode_AsUTF8(msg);
PyErr_Format(PyExc_TypeError,
"%.200s %.200s.%.200s error converting a member of a collection "
@@ -2490,7 +2502,7 @@ static int pyrna_prop_collection_subscript_str_lib_pair_ptr(BPy_PropertyRNA *sel
RNA_struct_identifier(self->ptr.type));
return -1;
}
- if ((keyname = _PyUnicode_AsString(PyTuple_GET_ITEM(key, 0))) == NULL) {
+ if ((keyname = PyUnicode_AsUTF8(PyTuple_GET_ITEM(key, 0))) == NULL) {
PyErr_Format(PyExc_KeyError,
"%s: id must be a string, not %.200s",
err_prefix,
@@ -2507,7 +2519,7 @@ static int pyrna_prop_collection_subscript_str_lib_pair_ptr(BPy_PropertyRNA *sel
}
else if (PyUnicode_Check(keylib)) {
Main *bmain = self->ptr.data;
- const char *keylib_str = _PyUnicode_AsString(keylib);
+ const char *keylib_str = PyUnicode_AsUTF8(keylib);
lib = BLI_findstring(&bmain->libraries, keylib_str, offsetof(Library, filepath));
if (lib == NULL) {
if (err_not_found) {
@@ -2711,7 +2723,7 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject
PYRNA_PROP_CHECK_OBJ(self);
if (PyUnicode_Check(key)) {
- return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key));
+ return pyrna_prop_collection_subscript_str(self, PyUnicode_AsUTF8(key));
}
if (PyIndex_Check(key)) {
const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
@@ -2838,7 +2850,7 @@ static int pyrna_prop_collection_ass_subscript(BPy_PropertyRNA *self,
#if 0
if (PyUnicode_Check(key)) {
- return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key));
+ return pyrna_prop_collection_subscript_str(self, PyUnicode_AsUTF8(key));
}
else
#endif
@@ -2910,7 +2922,7 @@ static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject
#if 0
if (PyUnicode_Check(key)) {
- return pyrna_prop_array_subscript_str(self, _PyUnicode_AsString(key));
+ return pyrna_prop_array_subscript_str(self, PyUnicode_AsUTF8(key));
}
else
#endif
@@ -3359,7 +3371,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *key)
}
/* Key in dict style check. */
- const char *keyname = _PyUnicode_AsString(key);
+ const char *keyname = PyUnicode_AsUTF8(key);
if (keyname == NULL) {
PyErr_SetString(PyExc_TypeError,
@@ -3377,7 +3389,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *key)
static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
{
IDProperty *group;
- const char *name = _PyUnicode_AsString(value);
+ const char *name = PyUnicode_AsUTF8(value);
PYRNA_STRUCT_CHECK_INT(self);
@@ -3447,7 +3459,7 @@ static PyObject *pyrna_struct_subscript(BPy_StructRNA *self, PyObject *key)
{
/* Mostly copied from BPy_IDGroup_Map_GetItem. */
IDProperty *group, *idprop;
- const char *name = _PyUnicode_AsString(key);
+ const char *name = PyUnicode_AsUTF8(key);
PYRNA_STRUCT_CHECK_OBJ(self);
@@ -4231,7 +4243,7 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
/* ---------------getattr-------------------------------------------- */
static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
{
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name = PyUnicode_AsUTF8(pyname);
PyObject *ret;
PropertyRNA *prop;
FunctionRNA *func;
@@ -4353,12 +4365,6 @@ static int pyrna_struct_pydict_contains(PyObject *self, PyObject *pyname)
#endif
/* --------------- setattr------------------------------------------- */
-static bool pyrna_is_deferred_prop(const PyObject *value)
-{
- return PyTuple_CheckExact(value) && PyTuple_GET_SIZE(value) == 2 &&
- PyCFunction_Check(PyTuple_GET_ITEM(value, 0)) &&
- PyDict_CheckExact(PyTuple_GET_ITEM(value, 1));
-}
#if 0
static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr)
@@ -4370,15 +4376,15 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
* >>> bpy.types.Scene.foo
* <bpy_struct, BoolProperty("foo")>
* ...rather than returning the deferred class register tuple
- * as checked by pyrna_is_deferred_prop()
+ * as checked by BPy_PropDeferred_CheckTypeExact()
*
* Disable for now,
* this is faking internal behavior in a way that's too tricky to maintain well. */
# if 0
- if ((ret == NULL) /* || pyrna_is_deferred_prop(ret) */ ) {
+ if ((ret == NULL) /* || BPy_PropDeferred_CheckTypeExact(ret) */ ) {
StructRNA *srna = srna_from_self(cls, "StructRNA.__getattr__");
if (srna) {
- PropertyRNA *prop = RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr));
+ PropertyRNA *prop = RNA_struct_type_find_property(srna, PyUnicode_AsUTF8(attr));
if (prop) {
PointerRNA tptr;
PyErr_Clear(); /* Clear error from tp_getattro. */
@@ -4396,8 +4402,8 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value)
{
StructRNA *srna = srna_from_self(cls, "StructRNA.__setattr__");
- const bool is_deferred_prop = (value && pyrna_is_deferred_prop(value));
- const char *attr_str = _PyUnicode_AsString(attr);
+ const bool is_deferred_prop = (value && BPy_PropDeferred_CheckTypeExact(value));
+ const char *attr_str = PyUnicode_AsUTF8(attr);
if (srna && !pyrna_write_check() &&
(is_deferred_prop || RNA_struct_type_find_property(srna, attr_str))) {
@@ -4458,7 +4464,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject *value)
{
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name = PyUnicode_AsUTF8(pyname);
PropertyRNA *prop = NULL;
PYRNA_STRUCT_CHECK_INT(self);
@@ -4550,7 +4556,7 @@ static PyObject *pyrna_prop_array_getattro(BPy_PropertyRNA *self, PyObject *pyna
static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject *pyname)
{
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name = PyUnicode_AsUTF8(pyname);
if (name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_prop_collection: __getattr__ must be a string");
@@ -4618,7 +4624,7 @@ static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject
/* --------------- setattr------------------------------------------- */
static int pyrna_prop_collection_setattro(BPy_PropertyRNA *self, PyObject *pyname, PyObject *value)
{
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name = PyUnicode_AsUTF8(pyname);
PropertyRNA *prop;
PointerRNA r_ptr;
@@ -5015,7 +5021,7 @@ static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args
}
if (PyUnicode_Check(key_ob)) {
- const char *key = _PyUnicode_AsString(key_ob);
+ const char *key = PyUnicode_AsUTF8(key_ob);
if (RNA_property_collection_lookup_string(&self->ptr, self->prop, key, &newptr)) {
return pyrna_struct_CreatePyObject(&newptr);
@@ -5050,8 +5056,8 @@ PyDoc_STRVAR(pyrna_prop_collection_find_doc,
static PyObject *pyrna_prop_collection_find(BPy_PropertyRNA *self, PyObject *key_ob)
{
Py_ssize_t key_len_ssize_t;
- const char *key = _PyUnicode_AsStringAndSize(key_ob, &key_len_ssize_t);
- const int key_len = (int)key_len_ssize_t; /* Comare with same type. */
+ const char *key = PyUnicode_AsUTF8AndSize(key_ob, &key_len_ssize_t);
+ const int key_len = (int)key_len_ssize_t; /* Compare with same type. */
char name[256], *nameptr;
int namelen;
@@ -5094,7 +5100,7 @@ static bool foreach_attr_type(BPy_PropertyRNA *self,
*r_attr_tot = 0;
*r_attr_signed = false;
- /* Note: this is fail with zero length lists, so don't let this get caled in that case. */
+ /* NOTE: this is fail with zero length lists, so don't let this get called in that case. */
RNA_PROP_BEGIN (&self->ptr, itemptr, self->prop) {
prop = RNA_struct_find_property(&itemptr, attr);
if (prop) {
@@ -6035,7 +6041,7 @@ static PyObject *small_dict_get_item_string(PyObject *dict, const char *key_look
while (PyDict_Next(dict, &pos, &key, &value)) {
if (PyUnicode_Check(key)) {
- if (STREQ(key_lookup, _PyUnicode_AsString(key))) {
+ if (STREQ(key_lookup, PyUnicode_AsUTF8(key))) {
return value;
}
}
@@ -6189,7 +6195,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
#ifdef DEBUG_STRING_FREE
if (item) {
if (PyUnicode_Check(item)) {
- PyList_APPEND(string_free_ls, PyUnicode_FromString(_PyUnicode_AsString(item)));
+ PyList_APPEND(string_free_ls, PyUnicode_FromString(PyUnicode_AsUTF8(item)));
}
}
#endif
@@ -6245,7 +6251,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
while (PyDict_Next(kw, &pos, &key, &value)) {
- arg_name = _PyUnicode_AsString(key);
+ arg_name = PyUnicode_AsUTF8(key);
found = false;
if (arg_name == NULL) { /* Unlikely the argname is not a string, but ignore if it is. */
@@ -6404,11 +6410,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type = {
0, /* tp_itemsize */
/* methods */
NULL, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
+ 0, /* tp_vectorcall_offset */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL,
@@ -6460,7 +6462,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type = {
#if defined(_MSC_VER)
NULL, /* defer assignment */
#else
- &PyType_Type, /* struct _typeobject *tp_base; */
+ &PyType_Type, /* struct _typeobject *tp_base; */
#endif
NULL, /* PyObject *tp_dict; */
NULL, /* descrgetfunc tp_descr_get; */
@@ -6489,13 +6491,9 @@ PyTypeObject pyrna_struct_Type = {
0, /* tp_itemsize */
/* methods */
(destructor)pyrna_struct_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
NULL,
/* tp_compare */ /* DEPRECATED in Python 3.0! */
(reprfunc)pyrna_struct_repr, /* tp_repr */
@@ -6529,7 +6527,7 @@ PyTypeObject pyrna_struct_Type = {
/* delete references to contained objects */
(inquiry)pyrna_struct_clear, /* inquiry tp_clear; */
#else
- NULL, /* traverseproc tp_traverse; */
+ NULL, /* traverseproc tp_traverse; */
/* delete references to contained objects */
NULL, /* inquiry tp_clear; */
@@ -6582,13 +6580,9 @@ PyTypeObject pyrna_prop_Type = {
0, /* tp_itemsize */
/* methods */
(destructor)pyrna_prop_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
NULL,
/* tp_compare */ /* DEPRECATED in Python 3.0! */
(reprfunc)pyrna_prop_repr, /* tp_repr */
@@ -6670,13 +6664,9 @@ PyTypeObject pyrna_prop_array_Type = {
0, /* tp_itemsize */
/* methods */
(destructor)pyrna_prop_array_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
NULL,
/* tp_compare */ /* DEPRECATED in Python 3.0! */
(reprfunc)pyrna_prop_array_repr, /* tp_repr */
@@ -6757,13 +6747,9 @@ PyTypeObject pyrna_prop_collection_Type = {
0, /* tp_itemsize */
/* methods */
(destructor)pyrna_prop_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
NULL,
/* tp_compare */ /* DEPRECATED in Python 3.0! */
NULL,
@@ -6847,13 +6833,9 @@ static PyTypeObject pyrna_prop_collection_idprop_Type = {
0, /* tp_itemsize */
/* methods */
(destructor)pyrna_prop_dealloc, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
NULL,
/* tp_compare */ /* DEPRECATED in Python 3.0! */
NULL,
@@ -6937,11 +6919,7 @@ PyTypeObject pyrna_func_Type = {
0, /* tp_itemsize */
/* methods */
NULL, /* tp_dealloc */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
+ 0, /* tp_vectorcall_offset */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL,
@@ -7037,13 +7015,9 @@ static PyTypeObject pyrna_prop_collection_iter_Type = {
0, /* tp_itemsize */
/* methods */
(destructor)pyrna_prop_collection_iter_dealloc, /* tp_dealloc */
-# if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-# else
- (printfunc)NULL, /* printfunc tp_print */
-# endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
NULL,
/* tp_compare */ /* DEPRECATED in Python 3.0! */
NULL,
@@ -7689,32 +7663,47 @@ PyObject *BPY_rna_doc(void)
}
#endif
-/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a different type
- * the self->ptr and self->prop are always set to the "structs" collection */
-/* ---------------getattr-------------------------------------------- */
-static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname)
+/* -------------------------------------------------------------------- */
+/** \name RNA Types Module `bpy.types`
+ * \{ */
+
+/**
+ * This could be a static variable as we only have one `bpy.types` module,
+ * it just keeps the data isolated to store in the module it's self.
+ *
+ * This data doesn't change one initialized.
+ */
+struct BPy_TypesModule_State {
+ /** `RNA_BlenderRNA`. */
+ PointerRNA ptr;
+ /** `RNA_BlenderRNA.structs`, exposed as `bpy.types` */
+ PropertyRNA *prop;
+};
+
+static PyObject *bpy_types_module_getattro(PyObject *self, PyObject *pyname)
{
+ struct BPy_TypesModule_State *state = PyModule_GetState(self);
PointerRNA newptr;
PyObject *ret;
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name = PyUnicode_AsUTF8(pyname);
if (name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy.types: __getattr__ must be a string");
ret = NULL;
}
- else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) {
+ else if (RNA_property_collection_lookup_string(&state->ptr, state->prop, name, &newptr)) {
ret = pyrna_struct_Subtype(&newptr);
if (ret == NULL) {
PyErr_Format(PyExc_RuntimeError,
"bpy.types.%.200s subtype could not be generated, this is a bug!",
- _PyUnicode_AsString(pyname));
+ PyUnicode_AsUTF8(pyname));
}
}
else {
#if 0
PyErr_Format(PyExc_AttributeError,
"bpy.types.%.200s RNA_Struct does not exist",
- _PyUnicode_AsString(pyname));
+ PyUnicode_AsUTF8(pyname));
return NULL;
#endif
/* The error raised here will be displayed. */
@@ -7724,79 +7713,60 @@ static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname
return ret;
}
-static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self);
-static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class);
-static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class);
-
-static struct PyMethodDef pyrna_basetype_methods[] = {
- {"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""},
- {NULL, NULL, 0, NULL},
-};
-
-/* Used to call ..._keys() direct, but we need to filter out operator subclasses. */
-#if 0
-static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
-{
- PyObject *list;
-# if 0
- PyMethodDef *meth;
-# endif
-
- list = pyrna_prop_collection_keys(self); /* Like calling structs.keys(), avoids looping here. */
-
-# if 0 /* For now only contains __dir__. */
- for (meth = pyrna_basetype_methods; meth->ml_name; meth++) {
- PyList_APPEND(list, PyUnicode_FromString(meth->ml_name));
- }
-# endif
- return list;
-}
-
-#else
-
-static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
+static PyObject *bpy_types_module_dir(PyObject *self)
{
+ struct BPy_TypesModule_State *state = PyModule_GetState(self);
PyObject *ret = PyList_New(0);
- RNA_PROP_BEGIN (&self->ptr, itemptr, self->prop) {
+ RNA_PROP_BEGIN (&state->ptr, itemptr, state->prop) {
StructRNA *srna = itemptr.data;
PyList_APPEND(ret, PyUnicode_FromString(RNA_struct_identifier(srna)));
}
RNA_PROP_END;
+ /* Include the modules `__dict__` for Python only types. */
+ PyObject *submodule_dict = PyModule_GetDict(self);
+ PyObject *key, *value;
+ Py_ssize_t pos = 0;
+ while (PyDict_Next(submodule_dict, &pos, &key, &value)) {
+ PyList_Append(ret, key);
+ }
return ret;
}
-#endif
+static struct PyMethodDef bpy_types_module_methods[] = {
+ {"__getattr__", (PyCFunction)bpy_types_module_getattro, METH_O, NULL},
+ {"__dir__", (PyCFunction)bpy_types_module_dir, METH_NOARGS, NULL},
+ {NULL, NULL, 0, NULL},
+};
-static PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE;
+PyDoc_STRVAR(bpy_types_module_doc, "Access to internal Blender types");
+static struct PyModuleDef bpy_types_module_def = {
+ PyModuleDef_HEAD_INIT,
+ "bpy.types", /* m_name */
+ bpy_types_module_doc, /* m_doc */
+ sizeof(struct BPy_TypesModule_State), /* m_size */
+ bpy_types_module_methods, /* m_methods */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
+};
/**
* Accessed from Python as 'bpy.types'
*/
PyObject *BPY_rna_types(void)
{
- BPy_BaseTypeRNA *self;
-
- if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY) == 0) {
- pyrna_basetype_Type.tp_name = "RNA_Types";
- pyrna_basetype_Type.tp_basicsize = sizeof(BPy_BaseTypeRNA);
- pyrna_basetype_Type.tp_getattro = (getattrofunc)pyrna_basetype_getattro;
- pyrna_basetype_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- pyrna_basetype_Type.tp_methods = pyrna_basetype_methods;
-
- if (PyType_Ready(&pyrna_basetype_Type) < 0) {
- return NULL;
- }
- }
+ PyObject *submodule = PyModule_Create(&bpy_types_module_def);
+ struct BPy_TypesModule_State *state = PyModule_GetState(submodule);
- /* Static members for the base class. */
- /* Add __name__ since help() expects it. */
- PyDict_SetItem(pyrna_basetype_Type.tp_dict, bpy_intern_str___name__, bpy_intern_str_bpy_types);
+ RNA_blender_rna_pointer_create(&state->ptr);
+ state->prop = RNA_struct_find_property(&state->ptr, "structs");
/* Internal base types we have no other accessors for. */
{
- PyTypeObject *pyrna_types[] = {
+ static PyTypeObject *pyrna_types[] = {
&pyrna_struct_meta_idprop_Type,
&pyrna_struct_Type,
&pyrna_prop_Type,
@@ -7805,23 +7775,17 @@ PyObject *BPY_rna_types(void)
&pyrna_func_Type,
};
+ PyObject *submodule_dict = PyModule_GetDict(submodule);
for (int i = 0; i < ARRAY_SIZE(pyrna_types); i += 1) {
- PyDict_SetItemString(
- pyrna_basetype_Type.tp_dict, pyrna_types[i]->tp_name, (PyObject *)pyrna_types[i]);
+ PyDict_SetItemString(submodule_dict, pyrna_types[i]->tp_name, (PyObject *)pyrna_types[i]);
}
}
- self = (BPy_BaseTypeRNA *)PyObject_NEW(BPy_BaseTypeRNA, &pyrna_basetype_Type);
-
- /* Avoid doing this lookup for every getattr. */
- RNA_blender_rna_pointer_create(&self->ptr);
- self->prop = RNA_struct_find_property(&self->ptr, "structs");
-#ifdef USE_WEAKREFS
- self->in_weakreflist = NULL;
-#endif
- return (PyObject *)self;
+ return submodule;
}
+/** \} */
+
StructRNA *pyrna_struct_as_srna(PyObject *self, const bool parent, const char *error_prefix)
{
BPy_StructRNA *py_srna = NULL;
@@ -7912,81 +7876,131 @@ StructRNA *srna_from_self(PyObject *self, const char *error_prefix)
static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item)
{
+ if (!BPy_PropDeferred_CheckTypeExact(item)) {
+ /* No error, ignoring. */
+ return 0;
+ }
+
/* We only care about results from C which
* are for sure types, save some time with error */
- if (pyrna_is_deferred_prop(item)) {
+ PyObject *py_func = ((BPy_PropDeferred *)item)->fn;
+ PyObject *py_kw = ((BPy_PropDeferred *)item)->kw;
+ PyObject *py_srna_cobject, *py_ret;
- PyObject *py_func, *py_kw, *py_srna_cobject, *py_ret;
+ PyObject *args_fake;
- if (PyArg_ParseTuple(item, "OO!", &py_func, &PyDict_Type, &py_kw)) {
- PyObject *args_fake;
+ if (*PyUnicode_AsUTF8(key) == '_') {
+ PyErr_Format(PyExc_ValueError,
+ "bpy_struct \"%.200s\" registration error: "
+ "%.200s could not register because the property starts with an '_'\n",
+ RNA_struct_identifier(srna),
+ PyUnicode_AsUTF8(key));
+ return -1;
+ }
+ py_srna_cobject = PyCapsule_New(srna, NULL, NULL);
- if (*_PyUnicode_AsString(key) == '_') {
- PyErr_Format(PyExc_ValueError,
- "bpy_struct \"%.200s\" registration error: "
- "%.200s could not register because the property starts with an '_'\n",
- RNA_struct_identifier(srna),
- _PyUnicode_AsString(key));
- return -1;
- }
- py_srna_cobject = PyCapsule_New(srna, NULL, NULL);
+ /* Not 100% nice :/, modifies the dict passed, should be ok. */
+ PyDict_SetItem(py_kw, bpy_intern_str_attr, key);
- /* Not 100% nice :/, modifies the dict passed, should be ok. */
- PyDict_SetItem(py_kw, bpy_intern_str_attr, key);
+ args_fake = PyTuple_New(1);
+ PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject);
- args_fake = PyTuple_New(1);
- PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject);
+ PyObject *type = PyDict_GetItemString(py_kw, "type");
+ StructRNA *type_srna = srna_from_self(type, "");
+ if (type_srna) {
+ if (!RNA_struct_idprops_datablock_allowed(srna) &&
+ (*(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_PointerProperty ||
+ *(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_CollectionProperty) &&
+ RNA_struct_idprops_contains_datablock(type_srna)) {
+ PyErr_Format(PyExc_ValueError,
+ "bpy_struct \"%.200s\" doesn't support datablock properties\n",
+ RNA_struct_identifier(srna));
+ return -1;
+ }
+ }
- PyObject *type = PyDict_GetItemString(py_kw, "type");
- StructRNA *type_srna = srna_from_self(type, "");
- if (type_srna) {
- if (!RNA_struct_idprops_datablock_allowed(srna) &&
- (*(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_PointerProperty ||
- *(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) ==
- BPy_CollectionProperty) &&
- RNA_struct_idprops_contains_datablock(type_srna)) {
- PyErr_Format(PyExc_ValueError,
- "bpy_struct \"%.200s\" doesn't support datablock properties\n",
- RNA_struct_identifier(srna));
- return -1;
- }
- }
+ py_ret = PyObject_Call(py_func, args_fake, py_kw);
- py_ret = PyObject_Call(py_func, args_fake, py_kw);
+ if (py_ret) {
+ Py_DECREF(py_ret);
+ Py_DECREF(args_fake); /* Free's py_srna_cobject too. */
+ }
+ else {
+ /* _must_ print before decreffing args_fake. */
+ PyErr_Print();
+ PyErr_Clear();
- if (py_ret) {
- Py_DECREF(py_ret);
- Py_DECREF(args_fake); /* Free's py_srna_cobject too. */
- }
- else {
- /* _must_ print before decreffing args_fake. */
- PyErr_Print();
- PyErr_Clear();
+ Py_DECREF(args_fake); /* Free's py_srna_cobject too. */
+
+ // PyC_LineSpit();
+ PyErr_Format(PyExc_ValueError,
+ "bpy_struct \"%.200s\" registration error: "
+ "%.200s could not register\n",
+ RNA_struct_identifier(srna),
+ PyUnicode_AsUTF8(key));
+ return -1;
+ }
- Py_DECREF(args_fake); /* Free's py_srna_cobject too. */
+ return 0;
+}
- // PyC_LineSpit();
- PyErr_Format(PyExc_ValueError,
- "bpy_struct \"%.200s\" registration error: "
- "%.200s could not register\n",
- RNA_struct_identifier(srna),
- _PyUnicode_AsString(key));
- return -1;
+/**
+ * Extract `__annotations__` using `typing.get_type_hints` which handles the delayed evaluation.
+ */
+static int pyrna_deferred_register_class_from_type_hints(StructRNA *srna, PyTypeObject *py_class)
+{
+ PyObject *annotations_dict = NULL;
+
+ /* `typing.get_type_hints(py_class)` */
+ {
+ PyObject *typing_mod = PyImport_ImportModuleLevel("typing", NULL, NULL, NULL, 0);
+ if (typing_mod != NULL) {
+ PyObject *get_type_hints_fn = PyObject_GetAttrString(typing_mod, "get_type_hints");
+ if (get_type_hints_fn != NULL) {
+ PyObject *args = PyTuple_New(1);
+
+ PyTuple_SET_ITEM(args, 0, (PyObject *)py_class);
+ Py_INCREF(py_class);
+
+ annotations_dict = PyObject_CallObject(get_type_hints_fn, args);
+
+ Py_DECREF(args);
+ Py_DECREF(get_type_hints_fn);
}
+ Py_DECREF(typing_mod);
}
- else {
- /* Since this is a class dict, ignore args that can't be passed. */
+ }
- /* For testing only. */
-#if 0
- PyC_ObSpit("Why doesn't this work??", item);
- PyErr_Print();
-#endif
- PyErr_Clear();
+ int ret = 0;
+ if (annotations_dict != NULL) {
+ if (PyDict_CheckExact(annotations_dict)) {
+ PyObject *item, *key;
+ Py_ssize_t pos = 0;
+
+ while (PyDict_Next(annotations_dict, &pos, &key, &item)) {
+ ret = deferred_register_prop(srna, key, item);
+ if (ret != 0) {
+ break;
+ }
+ }
+ }
+ else {
+ /* Should never happen, an error wont have been raised, so raise one. */
+ PyErr_Format(PyExc_TypeError,
+ "typing.get_type_hints returned: %.200s, expected dict\n",
+ Py_TYPE(annotations_dict)->tp_name);
+ ret = -1;
}
+
+ Py_DECREF(annotations_dict);
+ }
+ else {
+ BLI_assert(PyErr_Occurred());
+ fprintf(stderr, "typing.get_type_hints failed with: %.200s\n", py_class->tp_name);
+ ret = -1;
}
- return 0;
+ return ret;
}
static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
@@ -8009,31 +8023,6 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
}
}
- if (ret == 0) {
- /* This block can be removed once 2.8x is released and annotations are in use. */
- bool has_warning = false;
- while (PyDict_Next(class_dict, &pos, &key, &item)) {
- if (pyrna_is_deferred_prop(item)) {
- if (!has_warning) {
- printf(
- "Warning: class %.200s "
- "contains a property which should be an annotation!\n",
- RNA_struct_identifier(srna));
- PyC_LineSpit();
- has_warning = true;
- }
- printf(" assign as a type annotation: %.200s.%.200s\n",
- RNA_struct_identifier(srna),
- _PyUnicode_AsString(key));
- }
- ret = deferred_register_prop(srna, key, item);
-
- if (ret != 0) {
- break;
- }
- }
- }
-
return ret;
}
@@ -8078,6 +8067,15 @@ int pyrna_deferred_register_class(StructRNA *srna, PyTypeObject *py_class)
return 0;
}
+#ifdef USE_POSTPONED_ANNOTATIONS
+ const bool use_postponed_annotations = true;
+#else
+ const bool use_postponed_annotations = false;
+#endif
+
+ if (use_postponed_annotations) {
+ return pyrna_deferred_register_class_from_type_hints(srna, py_class);
+ }
return pyrna_deferred_register_class_recursive(srna, py_class);
}
@@ -8737,15 +8735,17 @@ void pyrna_free_types(void)
RNA_PROP_END;
}
-/* Note! MemLeak XXX
+/**
+ * \warning memory leak!
*
* There is currently a bug where moving the registration of a Python class does
- * not properly manage reference-counts from the Python class. As the srna owns
+ * not properly manage reference-counts from the Python class. As the `srna` owns
* the Python class this should not be so tricky, but changing the references as
* you'd expect when changing ownership crashes blender on exit so I had to comment out
- * the decref. This is not so bad because the leak only happens when re-registering (hold F8)
+ * the #Py_DECREF. This is not so bad because the leak only happens when re-registering
+ * (continuously running `SCRIPT_OT_reload`).
* - Should still be fixed - Campbell
- * */
+ */
PyDoc_STRVAR(pyrna_register_class_doc,
".. method:: register_class(cls)\n"
"\n"
@@ -9118,7 +9118,7 @@ static PyObject *pyrna_bl_owner_id_set(PyObject *UNUSED(self), PyObject *value)
name = NULL;
}
else if (PyUnicode_Check(value)) {
- name = _PyUnicode_AsString(value);
+ name = PyUnicode_AsUTF8(value);
}
else {
PyErr_Format(PyExc_ValueError,
diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h
index a2c2171d151..e891f5c1fc1 100644
--- a/source/blender/python/intern/bpy_rna.h
+++ b/source/blender/python/intern/bpy_rna.h
@@ -177,9 +177,6 @@ typedef struct {
FunctionRNA *func;
} BPy_FunctionRNA;
-/* cheap trick */
-#define BPy_BaseTypeRNA BPy_PropertyRNA
-
StructRNA *srna_from_self(PyObject *self, const char *error_prefix);
StructRNA *pyrna_struct_as_srna(PyObject *self, const bool parent, const char *error_prefix);
diff --git a/source/blender/python/intern/bpy_traceback.c b/source/blender/python/intern/bpy_traceback.c
index e2c894e90f8..00b414e027e 100644
--- a/source/blender/python/intern/bpy_traceback.c
+++ b/source/blender/python/intern/bpy_traceback.c
@@ -149,7 +149,7 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset)
PyObject *filename_py, *text_py;
if (parse_syntax_error(value, &message, &filename_py, lineno, offset, &text_py)) {
- const char *filename = _PyUnicode_AsString(filename_py);
+ const char *filename = PyUnicode_AsUTF8(filename_py);
/* python adds a '/', prefix, so check for both */
if ((BLI_path_cmp(filename, filepath) == 0) ||
(ELEM(filename[0], '\\', '/') && BLI_path_cmp(filename + 1, filepath) == 0)) {
diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c
index 1616bbeeea9..3791a6c2d29 100644
--- a/source/blender/python/mathutils/mathutils.c
+++ b/source/blender/python/mathutils/mathutils.c
@@ -784,11 +784,11 @@ PyMODINIT_FUNC PyInit_mathutils(void)
mod = PyModule_Create(&M_Mathutils_module_def);
/* each type has its own new() function */
- PyModule_AddObject(mod, vector_Type.tp_name, (PyObject *)&vector_Type);
- PyModule_AddObject(mod, matrix_Type.tp_name, (PyObject *)&matrix_Type);
- PyModule_AddObject(mod, euler_Type.tp_name, (PyObject *)&euler_Type);
- PyModule_AddObject(mod, quaternion_Type.tp_name, (PyObject *)&quaternion_Type);
- PyModule_AddObject(mod, color_Type.tp_name, (PyObject *)&color_Type);
+ PyModule_AddType(mod, &vector_Type);
+ PyModule_AddType(mod, &matrix_Type);
+ PyModule_AddType(mod, &euler_Type);
+ PyModule_AddType(mod, &quaternion_Type);
+ PyModule_AddType(mod, &color_Type);
/* submodule */
PyModule_AddObject(mod, "geometry", (submodule = PyInit_mathutils_geometry()));
diff --git a/source/blender/python/mathutils/mathutils_Euler.c b/source/blender/python/mathutils/mathutils_Euler.c
index ebc71706bef..f2a8af18073 100644
--- a/source/blender/python/mathutils/mathutils_Euler.c
+++ b/source/blender/python/mathutils/mathutils_Euler.c
@@ -670,7 +670,7 @@ static int Euler_order_set(EulerObject *self, PyObject *value, void *UNUSED(clos
return -1;
}
- if (((order_str = _PyUnicode_AsString(value)) == NULL) ||
+ if (((order_str = PyUnicode_AsUTF8(value)) == NULL) ||
((order = euler_order_from_string(order_str, "euler.order")) == -1)) {
return -1;
}
diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c
index 87d16656d70..016ba462030 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.c
+++ b/source/blender/python/mathutils/mathutils_Matrix.c
@@ -499,7 +499,7 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
}
if (vec && PyUnicode_Check(vec)) {
- axis = _PyUnicode_AsString((PyObject *)vec);
+ axis = PyUnicode_AsUTF8((PyObject *)vec);
if (axis == NULL || axis[0] == '\0' || axis[1] != '\0' || axis[0] < 'X' || axis[0] > 'Z') {
PyErr_SetString(PyExc_ValueError,
"Matrix.Rotation(): "
@@ -768,7 +768,7 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
if (PyUnicode_Check(axis)) { /* ortho projection onto cardinal plane */
Py_ssize_t plane_len;
- const char *plane = _PyUnicode_AsStringAndSize(axis, &plane_len);
+ const char *plane = PyUnicode_AsUTF8AndSize(axis, &plane_len);
if (matSize == 2) {
if (plane_len == 1 && plane[0] == 'X') {
mat[0] = 1.0f;
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index 8d2ab614728..3bc60190d56 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -195,7 +195,7 @@ static PyObject *Quaternion_to_swing_twist(QuaternionObject *self, PyObject *axi
int axis;
if (axis_arg && PyUnicode_Check(axis_arg)) {
- axis_str = _PyUnicode_AsString(axis_arg);
+ axis_str = PyUnicode_AsUTF8(axis_arg);
}
if (axis_str && axis_str[0] >= 'X' && axis_str[0] <= 'Z' && axis_str[1] == 0) {
diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c
index 61487df1ab5..1766c7dea66 100644
--- a/source/blender/python/mathutils/mathutils_Vector.c
+++ b/source/blender/python/mathutils/mathutils_Vector.c
@@ -3042,15 +3042,11 @@ PyTypeObject vector_Type = {
/* Methods to implement standard operations */
(destructor)BaseMathObject_dealloc, /* destructor tp_dealloc; */
-#if PY_VERSION_HEX >= 0x03080000
- 0, /* tp_vectorcall_offset */
-#else
- (printfunc)NULL, /* printfunc tp_print */
-#endif
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
- NULL, /* cmpfunc tp_compare; */
- (reprfunc)Vector_repr, /* reprfunc tp_repr; */
+ 0, /* tp_vectorcall_offset */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* cmpfunc tp_compare; */
+ (reprfunc)Vector_repr, /* reprfunc tp_repr; */
/* Method suites for standard classes */
@@ -3065,7 +3061,7 @@ PyTypeObject vector_Type = {
#ifndef MATH_STANDALONE
(reprfunc)Vector_str, /* reprfunc tp_str; */
#else
- NULL, /* reprfunc tp_str; */
+ NULL, /* reprfunc tp_str; */
#endif
NULL, /* getattrofunc tp_getattro; */
NULL, /* setattrofunc tp_setattro; */
diff --git a/source/blender/python/mathutils/mathutils_bvhtree.c b/source/blender/python/mathutils/mathutils_bvhtree.c
index 1d477421e30..1acbcc006ca 100644
--- a/source/blender/python/mathutils/mathutils_bvhtree.c
+++ b/source/blender/python/mathutils/mathutils_bvhtree.c
@@ -333,8 +333,8 @@ PyDoc_STRVAR(py_bvhtree_ray_cast_doc,
"\n"
" Cast a ray onto the mesh.\n"
"\n"
- " :arg co: Start location of the ray in object space.\n"
- " :type co: :class:`Vector`\n"
+ " :arg origin: Start location of the ray in object space.\n"
+ " :type origin: :class:`Vector`\n"
" :arg direction: Direction of the ray in object space.\n"
" :type direction: :class:`Vector`\n" PYBVH_FIND_GENERIC_DISTANCE_DOC
PYBVH_FIND_GENERIC_RETURN_DOC);
@@ -1331,7 +1331,7 @@ PyMODINIT_FUNC PyInit_mathutils_bvhtree(void)
return NULL;
}
- PyModule_AddObject(m, "BVHTree", (PyObject *)&PyBVHTree_Type);
+ PyModule_AddType(m, &PyBVHTree_Type);
return m;
}
diff --git a/source/blender/python/mathutils/mathutils_kdtree.c b/source/blender/python/mathutils/mathutils_kdtree.c
index 1de3c23838f..fe8f9ec0334 100644
--- a/source/blender/python/mathutils/mathutils_kdtree.c
+++ b/source/blender/python/mathutils/mathutils_kdtree.c
@@ -459,7 +459,7 @@ PyMODINIT_FUNC PyInit_mathutils_kdtree(void)
if (PyType_Ready(&PyKDTree_Type)) {
return NULL;
}
- PyModule_AddObject(m, "KDTree", (PyObject *)&PyKDTree_Type);
+ PyModule_AddType(m, &PyKDTree_Type);
return m;
}
diff --git a/source/blender/render/RE_engine.h b/source/blender/render/RE_engine.h
index 1af40ac760b..c31a41f66d5 100644
--- a/source/blender/render/RE_engine.h
+++ b/source/blender/render/RE_engine.h
@@ -64,6 +64,7 @@ extern "C" {
#define RE_USE_SPHERICAL_STEREO 128
#define RE_USE_STEREO_VIEWPORT 256
#define RE_USE_GPU_CONTEXT 512
+#define RE_USE_CUSTOM_FREESTYLE 1024
/* RenderEngine.flag */
#define RE_ENGINE_ANIMATION 1
diff --git a/source/blender/render/RE_multires_bake.h b/source/blender/render/RE_multires_bake.h
index fd200e85719..42ee2c57fbb 100644
--- a/source/blender/render/RE_multires_bake.h
+++ b/source/blender/render/RE_multires_bake.h
@@ -53,7 +53,7 @@ typedef struct MultiresBakeRender {
int baked_objects, baked_faces;
int raytrace_structure; /* Optimization structure to be used for AO baking */
- int octree_resolution; /* Reslution of octotree when using octotree optimization structure */
+ int octree_resolution; /* Resolution of octree when using octree optimization structure */
int threads; /* Number of threads to be used for baking */
float user_scale; /* User scale used to scale displacement when baking derivative map. */
diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h
index 3e73ac77fc6..688709d55f3 100644
--- a/source/blender/render/RE_pipeline.h
+++ b/source/blender/render/RE_pipeline.h
@@ -252,13 +252,11 @@ void RE_ChangeModeFlag(struct Render *re, int flag, bool clear);
struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
void RE_SetOverrideCamera(struct Render *re, struct Object *cam_ob);
void RE_SetCamera(struct Render *re, struct Object *cam_ob);
-void RE_SetWindow(struct Render *re, const rctf *viewplane, float clip_start, float clip_end);
-void RE_SetOrtho(struct Render *re, const rctf *viewplane, float clip_start, float clip_end);
/* get current view and window transform */
void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect);
-/* set the render threads based on the command-line and autothreads setting */
+/* Set the render threads based on the command-line and auto-threads setting. */
void RE_init_threadcount(Render *re);
bool RE_WriteRenderViewsImage(struct ReportList *reports,
diff --git a/source/blender/render/intern/initrender.c b/source/blender/render/intern/initrender.c
index fb7f7270c13..3494aa06833 100644
--- a/source/blender/render/intern/initrender.c
+++ b/source/blender/render/intern/initrender.c
@@ -172,28 +172,16 @@ struct Object *RE_GetCamera(Render *re)
return BKE_camera_multiview_render(re->scene, camera, re->viewname);
}
-static void re_camera_params_get(Render *re, CameraParams *params)
-{
- copy_m4_m4(re->winmat, params->winmat);
-
- re->clip_start = params->clip_start;
- re->clip_end = params->clip_end;
-
- re->viewplane = params->viewplane;
-}
-
void RE_SetOverrideCamera(Render *re, Object *cam_ob)
{
re->camera_override = cam_ob;
}
-static void re_camera_params_stereo3d(Render *re, CameraParams *params, Object *cam_ob)
-{
- BKE_camera_multiview_params(&re->r, params, cam_ob, re->viewname);
-}
-
-/* call this after InitState() */
-/* per render, there's one persistent viewplane. Parts will set their own viewplanes */
+/**
+ * Per render, there's one persistent view-plane. Parts will set their own view-planes.
+ *
+ * \note call this after #RE_InitState().
+ */
void RE_SetCamera(Render *re, Object *cam_ob)
{
CameraParams params;
@@ -201,14 +189,17 @@ void RE_SetCamera(Render *re, Object *cam_ob)
/* setup parameters */
BKE_camera_params_init(&params);
BKE_camera_params_from_object(&params, cam_ob);
- re_camera_params_stereo3d(re, &params, cam_ob);
+ BKE_camera_multiview_params(&re->r, &params, cam_ob, re->viewname);
/* compute matrix, viewplane, .. */
BKE_camera_params_compute_viewplane(&params, re->winx, re->winy, re->r.xasp, re->r.yasp);
BKE_camera_params_compute_matrix(&params);
/* extract results */
- re_camera_params_get(re, &params);
+ copy_m4_m4(re->winmat, params.winmat);
+ re->clip_start = params.clip_start;
+ re->clip_end = params.clip_end;
+ re->viewplane = params.viewplane;
}
void RE_GetCameraWindow(struct Render *re, struct Object *camera, float r_winmat[4][4])
@@ -241,6 +232,19 @@ void RE_GetCameraModelMatrix(Render *re, struct Object *camera, float r_modelmat
BKE_camera_multiview_model_matrix(&re->r, camera, re->viewname, r_modelmat);
}
+void RE_GetViewPlane(Render *re, rctf *r_viewplane, rcti *r_disprect)
+{
+ *r_viewplane = re->viewplane;
+
+ /* make disprect zero when no border render, is needed to detect changes in 3d view render */
+ if (re->r.mode & R_BORDER) {
+ *r_disprect = re->disprect;
+ }
+ else {
+ BLI_rcti_init(r_disprect, 0, 0, 0, 0);
+ }
+}
+
/* ~~~~~~~~~~~~~~~~ part (tile) calculus ~~~~~~~~~~~~~~~~~~~~~~ */
void RE_parts_free(Render *re)
diff --git a/source/blender/render/intern/multires_bake.c b/source/blender/render/intern/multires_bake.c
index a4f68419c67..1859886f563 100644
--- a/source/blender/render/intern/multires_bake.c
+++ b/source/blender/render/intern/multires_bake.c
@@ -768,7 +768,7 @@ static void *init_heights_data(MultiresBakeRender *bkr, Image *ima)
if (ss_lvl > 0) {
smd.levels = smd.renderLevels = ss_lvl;
- smd.uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_CORNERS;
+ smd.uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES;
smd.quality = 3;
height_data->ssdm = subsurf_make_derived_from_derived(
diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c
index 4628a5a132b..0a8b8f24614 100644
--- a/source/blender/render/intern/pipeline.c
+++ b/source/blender/render/intern/pipeline.c
@@ -983,53 +983,6 @@ void render_update_anim_renderdata(Render *re, RenderData *rd, ListBase *render_
BLI_duplicatelist(&re->r.views, &rd->views);
}
-void RE_SetWindow(Render *re, const rctf *viewplane, float clip_start, float clip_end)
-{
- /* re->ok flag? */
-
- re->viewplane = *viewplane;
- re->clip_start = clip_start;
- re->clip_end = clip_end;
-
- perspective_m4(re->winmat,
- re->viewplane.xmin,
- re->viewplane.xmax,
- re->viewplane.ymin,
- re->viewplane.ymax,
- re->clip_start,
- re->clip_end);
-}
-
-void RE_SetOrtho(Render *re, const rctf *viewplane, float clip_start, float clip_end)
-{
- /* re->ok flag? */
-
- re->viewplane = *viewplane;
- re->clip_start = clip_start;
- re->clip_end = clip_end;
-
- orthographic_m4(re->winmat,
- re->viewplane.xmin,
- re->viewplane.xmax,
- re->viewplane.ymin,
- re->viewplane.ymax,
- re->clip_start,
- re->clip_end);
-}
-
-void RE_GetViewPlane(Render *re, rctf *r_viewplane, rcti *r_disprect)
-{
- *r_viewplane = re->viewplane;
-
- /* make disprect zero when no border render, is needed to detect changes in 3d view render */
- if (re->r.mode & R_BORDER) {
- *r_disprect = re->disprect;
- }
- else {
- BLI_rcti_init(r_disprect, 0, 0, 0, 0);
- }
-}
-
/* image and movie output has to move to either imbuf or kernel */
void RE_display_init_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr))
{
@@ -2018,7 +1971,7 @@ void RE_RenderFrame(Render *re,
if (write_still && !G.is_break) {
if (BKE_imtype_is_movie(rd.im_format.imtype)) {
/* operator checks this but in case its called from elsewhere */
- printf("Error: cant write single images with a movie format!\n");
+ printf("Error: can't write single images with a movie format!\n");
}
else {
char name[FILE_MAX];
@@ -2055,12 +2008,39 @@ void RE_RenderFrame(Render *re,
}
#ifdef WITH_FREESTYLE
+
+/* Not freestyle specific, currently only used by free-style. */
+static void change_renderdata_engine(Render *re, const char *new_engine)
+{
+ if (!STREQ(re->r.engine, new_engine)) {
+ if (re->engine) {
+ RE_engine_free(re->engine);
+ re->engine = NULL;
+ }
+ BLI_strncpy(re->r.engine, new_engine, sizeof(re->r.engine));
+ }
+}
+
+static bool use_eevee_for_freestyle_render(Render *re)
+{
+ RenderEngineType *type = RE_engines_find(re->r.engine);
+ return !(type->flag & RE_USE_CUSTOM_FREESTYLE);
+}
+
void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render)
{
re->result_ok = 0;
if (render_init_from_main(re, &scene->r, bmain, scene, NULL, NULL, 0, 0)) {
if (render) {
+ char scene_engine[32];
+ BLI_strncpy(scene_engine, re->r.engine, sizeof(scene_engine));
+ if (use_eevee_for_freestyle_render(re)) {
+ change_renderdata_engine(re, RE_engine_id_BLENDER_EEVEE);
+ }
+
do_render_3d(re);
+
+ change_renderdata_engine(re, scene_engine);
}
}
re->result_ok = 1;
@@ -2357,7 +2337,7 @@ static int do_write_image_or_movie(Render *re,
printf(" (Saving: %s)\n", name);
fputc('\n', stdout);
- fflush(stdout); /* needed for renderd !! (not anymore... (ton)) */
+ fflush(stdout);
return ok;
}
@@ -2757,7 +2737,7 @@ void RE_init_threadcount(Render *re)
void RE_layer_load_from_file(
RenderLayer *layer, ReportList *reports, const char *filename, int x, int y)
{
- /* OCIO_TODO: assume layer was saved in defaule color space */
+ /* OCIO_TODO: assume layer was saved in default color space */
ImBuf *ibuf = IMB_loadiffname(filename, IB_rect, NULL);
RenderPass *rpass = NULL;
diff --git a/source/blender/render/intern/render_result.c b/source/blender/render/intern/render_result.c
index f135adc9f05..f73a200f3c6 100644
--- a/source/blender/render/intern/render_result.c
+++ b/source/blender/render/intern/render_result.c
@@ -443,7 +443,7 @@ RenderResult *render_result_new(
}
FOREACH_VIEW_LAYER_TO_RENDER_END;
- /* previewrender doesn't do layers, so we make a default one */
+ /* Preview-render doesn't do layers, so we make a default one. */
if (BLI_listbase_is_empty(&rr->layers) && !(layername && layername[0])) {
rl = MEM_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
diff --git a/source/blender/render/intern/render_types.h b/source/blender/render/intern/render_types.h
index 6be5fb4792c..7a4374dcf7c 100644
--- a/source/blender/render/intern/render_types.h
+++ b/source/blender/render/intern/render_types.h
@@ -103,7 +103,7 @@ struct Render {
/* Camera transform, only used by Freestyle. */
float winmat[4][4];
- /* clippping */
+ /* Clipping. */
float clip_start;
float clip_end;
diff --git a/source/blender/render/intern/texture_image.c b/source/blender/render/intern/texture_image.c
index 5614318afbb..0299315beaf 100644
--- a/source/blender/render/intern/texture_image.c
+++ b/source/blender/render/intern/texture_image.c
@@ -630,7 +630,7 @@ static void boxsample(ImBuf *ibuf,
const short imapextend)
{
/* Sample box, performs clip. minx etc are in range 0.0 - 1.0 .
- * Enlarge with antialiased edges of pixels.
+ * Enlarge with anti-aliased edges of pixels.
* If variable 'imaprepeat' has been set, the
* clipped-away parts are sampled as well.
*/
diff --git a/source/blender/render/intern/texture_procedural.c b/source/blender/render/intern/texture_procedural.c
index a98f29a705d..b0ab20de10d 100644
--- a/source/blender/render/intern/texture_procedural.c
+++ b/source/blender/render/intern/texture_procedural.c
@@ -77,7 +77,7 @@ void RE_texture_rng_exit(void)
/* ------------------------------------------------------------------------- */
-/* this allows colorbanded textures to control normals as well */
+/* This allows color-banded textures to control normals as well. */
static void tex_normal_derivate(const Tex *tex, TexResult *texres)
{
if (tex->flag & TEX_COLORBAND) {
@@ -167,7 +167,7 @@ static int blend(const Tex *tex, const float texvec[3], TexResult *texres)
/* ------------------------------------------------------------------------- */
/* ************************************************************************* */
-/* newnoise: all noisebased types now have different noisebases to choose from */
+/* newnoise: all noise-based types now have different noise-bases to choose from. */
static int clouds(const Tex *tex, const float texvec[3], TexResult *texres)
{
@@ -1059,7 +1059,7 @@ static void do_2d_mapping(
dyt[2] *= 0.5f;
}
- /* if area, then reacalculate dxt[] and dyt[] */
+ /* If area, then recalculate `dxt[]` and `dyt[]` */
if (areaflag) {
fx = area[0];
fy = area[1];
diff --git a/source/blender/render/intern/zbuf.c b/source/blender/render/intern/zbuf.c
index d74ab330dc2..33af3bbaf29 100644
--- a/source/blender/render/intern/zbuf.c
+++ b/source/blender/render/intern/zbuf.c
@@ -166,7 +166,7 @@ static void zbuf_add_to_span(ZSpan *zspan, const float v1[2], const float v2[2])
}
for (y = my2; y >= my0; y--, xs0 += dx0) {
- /* xs0 is the xcoord! */
+ /* xs0 is the X-coordinate! */
span[y] = xs0;
}
}
diff --git a/source/blender/sequencer/SEQ_render.h b/source/blender/sequencer/SEQ_render.h
index 6f6d195126b..54584824da8 100644
--- a/source/blender/sequencer/SEQ_render.h
+++ b/source/blender/sequencer/SEQ_render.h
@@ -51,7 +51,7 @@ typedef struct SeqRenderData {
bool is_proxy_render;
bool is_prefetch_render;
int view_id;
- /* ID of task for asigning temp cache entries to particular task(thread, etc.) */
+ /* ID of task for assigning temp cache entries to particular task(thread, etc.) */
eSeqTaskId task_id;
/* special case for OpenGL render */
diff --git a/source/blender/sequencer/SEQ_select.h b/source/blender/sequencer/SEQ_select.h
index 5a65f9c0d8c..abd56ef3af7 100644
--- a/source/blender/sequencer/SEQ_select.h
+++ b/source/blender/sequencer/SEQ_select.h
@@ -32,8 +32,8 @@ struct Sequence;
struct Sequence *SEQ_select_active_get(struct Scene *scene);
int SEQ_select_active_get_pair(struct Scene *scene,
- struct Sequence **seq_act,
- struct Sequence **seq_other);
+ struct Sequence **r_seq_act,
+ struct Sequence **r_seq_other);
void SEQ_select_active_set(struct Scene *scene, struct Sequence *seq);
#ifdef __cplusplus
diff --git a/source/blender/sequencer/intern/image_cache.c b/source/blender/sequencer/intern/image_cache.c
index 344b5af26aa..290ee185865 100644
--- a/source/blender/sequencer/intern/image_cache.c
+++ b/source/blender/sequencer/intern/image_cache.c
@@ -166,7 +166,7 @@ typedef struct SeqCacheKey {
float timeline_frame; /* Only for reference - used for freeing when cache is full. */
float cost; /* In short: render time(s) divided by playback frame duration(s) */
bool is_temp_cache; /* this cache entry will be freed before rendering next frame */
- /* ID of task for asigning temp cache entries to particular task(thread, etc.) */
+ /* ID of task for assigning temp cache entries to particular task(thread, etc.) */
eSeqTaskId task_id;
int type;
} SeqCacheKey;
@@ -824,16 +824,59 @@ static void seq_cache_valfree(void *val)
BLI_mempool_free(item->cache_owner->items_pool, item);
}
-static void seq_cache_put_ex(SeqCache *cache, SeqCacheKey *key, ImBuf *ibuf)
+static int get_stored_types_flag(Scene *scene, SeqCacheKey *key)
{
+ int flag;
+ if (key->seq->cache_flag & SEQ_CACHE_OVERRIDE) {
+ flag = key->seq->cache_flag;
+ }
+ else {
+ flag = scene->ed->cache_flag;
+ }
+
+ /* SEQ_CACHE_STORE_FINAL_OUT can not be overridden by strip cache */
+ flag |= (scene->ed->cache_flag & SEQ_CACHE_STORE_FINAL_OUT);
+
+ return flag;
+}
+
+static void seq_cache_put_ex(Scene *scene, SeqCacheKey *key, ImBuf *ibuf)
+{
+ SeqCache *cache = seq_cache_get_from_scene(scene);
SeqCacheItem *item;
item = BLI_mempool_alloc(cache->items_pool);
item->cache_owner = cache;
item->ibuf = ibuf;
+ const int stored_types_flag = get_stored_types_flag(scene, key);
+
+ /* Item stored for later use. */
+ if (stored_types_flag & key->type) {
+ key->is_temp_cache = false;
+ key->link_prev = cache->last_key;
+ }
+
+ /* Store pointer to last cached key. */
+ SeqCacheKey *temp_last_key = cache->last_key;
+
if (BLI_ghash_reinsert(cache->hash, key, item, seq_cache_keyfree, seq_cache_valfree)) {
IMB_refImBuf(ibuf);
- cache->last_key = key;
+
+ if (!key->is_temp_cache) {
+ cache->last_key = key;
+ }
+ }
+
+ /* Set last_key's reference to this key so we can look up chain backwards.
+ * Item is already put in cache, so cache->last_key points to current key.
+ */
+ if (!key->is_temp_cache && temp_last_key) {
+ temp_last_key->link_next = cache->last_key;
+ }
+
+ /* Reset linking. */
+ if (key->type == SEQ_CACHE_STORE_FINAL_OUT) {
+ cache->last_key = NULL;
}
}
@@ -1095,6 +1138,35 @@ static void seq_cache_create(Main *bmain, Scene *scene)
BLI_mutex_unlock(&cache_create_lock);
}
+static void seq_cache_populate_key(SeqCacheKey *key,
+ const SeqRenderData *context,
+ Sequence *seq,
+ const float timeline_frame,
+ const int type)
+{
+ key->cache_owner = seq_cache_get_from_scene(context->scene);
+ key->seq = seq;
+ key->context = *context;
+ key->frame_index = seq_cache_timeline_frame_to_frame_index(seq, timeline_frame, type);
+ key->timeline_frame = timeline_frame;
+ key->type = type;
+ key->link_prev = NULL;
+ key->link_next = NULL;
+ key->is_temp_cache = true;
+ key->task_id = context->task_id;
+}
+
+static SeqCacheKey *seq_cache_allocate_key(SeqCache *cache,
+ const SeqRenderData *context,
+ Sequence *seq,
+ const float timeline_frame,
+ const int type)
+{
+ SeqCacheKey *key = BLI_mempool_alloc(cache->keys_pool);
+ seq_cache_populate_key(key, context, seq, timeline_frame, type);
+ return key;
+}
+
/* ***************************** API ****************************** */
void seq_cache_free_temp_cache(Scene *scene, short id, int timeline_frame)
@@ -1243,8 +1315,7 @@ void seq_cache_cleanup_sequence(Scene *scene,
struct ImBuf *seq_cache_get(const SeqRenderData *context,
Sequence *seq,
float timeline_frame,
- int type,
- bool skip_disk_cache)
+ int type)
{
if (context->skip_cache || context->is_proxy_render || !seq) {
@@ -1274,11 +1345,7 @@ struct ImBuf *seq_cache_get(const SeqRenderData *context,
/* Try RAM cache: */
if (cache && seq) {
- key.seq = seq;
- key.context = *context;
- key.frame_index = seq_cache_timeline_frame_to_frame_index(seq, timeline_frame, type);
- key.type = type;
-
+ seq_cache_populate_key(&key, context, seq, timeline_frame, type);
ibuf = seq_cache_get_ex(cache, &key);
}
seq_cache_unlock(scene);
@@ -1288,7 +1355,7 @@ struct ImBuf *seq_cache_get(const SeqRenderData *context,
}
/* Try disk cache: */
- if (!skip_disk_cache && seq_disk_cache_is_enabled(context->bmain)) {
+ if (seq_disk_cache_is_enabled(context->bmain)) {
if (cache->disk_cache == NULL) {
seq_disk_cache_create(context->bmain, context->scene);
}
@@ -1296,25 +1363,23 @@ struct ImBuf *seq_cache_get(const SeqRenderData *context,
BLI_mutex_lock(&cache->disk_cache->read_write_mutex);
ibuf = seq_disk_cache_read_file(cache->disk_cache, &key);
BLI_mutex_unlock(&cache->disk_cache->read_write_mutex);
- if (ibuf) {
- if (key.type == SEQ_CACHE_STORE_FINAL_OUT) {
- seq_cache_put_if_possible(context, seq, timeline_frame, type, ibuf, true);
- }
- else {
- seq_cache_put(context, seq, timeline_frame, type, ibuf, true);
- }
+
+ if (ibuf == NULL) {
+ return NULL;
+ }
+
+ /* Store read image in RAM. Only recycle item for final type. */
+ if (key.type != SEQ_CACHE_STORE_FINAL_OUT || seq_cache_recycle_item(scene)) {
+ SeqCacheKey *new_key = seq_cache_allocate_key(cache, context, seq, timeline_frame, type);
+ seq_cache_put_ex(scene, new_key, ibuf);
}
}
return ibuf;
}
-bool seq_cache_put_if_possible(const SeqRenderData *context,
- Sequence *seq,
- float timeline_frame,
- int type,
- ImBuf *ibuf,
- bool skip_disk_cache)
+bool seq_cache_put_if_possible(
+ const SeqRenderData *context, Sequence *seq, float timeline_frame, int type, ImBuf *ibuf)
{
Scene *scene = context->scene;
@@ -1329,7 +1394,7 @@ bool seq_cache_put_if_possible(const SeqRenderData *context,
}
if (seq_cache_recycle_item(scene)) {
- seq_cache_put(context, seq, timeline_frame, type, ibuf, skip_disk_cache);
+ seq_cache_put(context, seq, timeline_frame, type, ibuf);
return true;
}
@@ -1338,12 +1403,8 @@ bool seq_cache_put_if_possible(const SeqRenderData *context,
return false;
}
-void seq_cache_put(const SeqRenderData *context,
- Sequence *seq,
- float timeline_frame,
- int type,
- ImBuf *i,
- bool skip_disk_cache)
+void seq_cache_put(
+ const SeqRenderData *context, Sequence *seq, float timeline_frame, int type, ImBuf *i)
{
if (i == NULL || context->skip_cache || context->is_proxy_render || !seq) {
return;
@@ -1359,7 +1420,7 @@ void seq_cache_put(const SeqRenderData *context,
}
/* Prevent reinserting, it breaks cache key linking. */
- ImBuf *test = seq_cache_get(context, seq, timeline_frame, type, true);
+ ImBuf *test = seq_cache_get(context, seq, timeline_frame, type);
if (test) {
IMB_freeImBuf(test);
return;
@@ -1370,63 +1431,12 @@ void seq_cache_put(const SeqRenderData *context,
}
seq_cache_lock(scene);
-
SeqCache *cache = seq_cache_get_from_scene(scene);
- int flag;
-
- if (seq->cache_flag & SEQ_CACHE_OVERRIDE) {
- flag = seq->cache_flag;
- /* Final_out is invalid in context of sequence override. */
- flag -= seq->cache_flag & SEQ_CACHE_STORE_FINAL_OUT;
- /* If global setting is enabled however, use it. */
- flag |= scene->ed->cache_flag & SEQ_CACHE_STORE_FINAL_OUT;
- }
- else {
- flag = scene->ed->cache_flag;
- }
-
- SeqCacheKey *key;
- key = BLI_mempool_alloc(cache->keys_pool);
- key->cache_owner = cache;
- key->seq = seq;
- key->context = *context;
- key->frame_index = seq_cache_timeline_frame_to_frame_index(seq, timeline_frame, type);
- key->timeline_frame = timeline_frame;
- key->type = type;
- key->link_prev = NULL;
- key->link_next = NULL;
- key->is_temp_cache = true;
- key->task_id = context->task_id;
-
- /* Item stored for later use */
- if (flag & type) {
- key->is_temp_cache = false;
- key->link_prev = cache->last_key;
- }
-
- SeqCacheKey *temp_last_key = cache->last_key;
- seq_cache_put_ex(cache, key, i);
-
- /* Restore pointer to previous item as this one will be freed when stack is rendered. */
- if (key->is_temp_cache) {
- cache->last_key = temp_last_key;
- }
-
- /* Set last_key's reference to this key so we can look up chain backwards.
- * Item is already put in cache, so cache->last_key points to current key.
- */
- if (flag & type && temp_last_key) {
- temp_last_key->link_next = cache->last_key;
- }
-
- /* Reset linking. */
- if (key->type == SEQ_CACHE_STORE_FINAL_OUT) {
- cache->last_key = NULL;
- }
-
+ SeqCacheKey *key = seq_cache_allocate_key(cache, context, seq, timeline_frame, type);
+ seq_cache_put_ex(scene, key, i);
seq_cache_unlock(scene);
- if (!key->is_temp_cache && !skip_disk_cache) {
+ if (!key->is_temp_cache) {
if (seq_disk_cache_is_enabled(context->bmain)) {
if (cache->disk_cache == NULL) {
seq_disk_cache_create(context->bmain, context->scene);
diff --git a/source/blender/sequencer/intern/image_cache.h b/source/blender/sequencer/intern/image_cache.h
index 41e8c4d1d48..63c559caee9 100644
--- a/source/blender/sequencer/intern/image_cache.h
+++ b/source/blender/sequencer/intern/image_cache.h
@@ -40,20 +40,17 @@ struct Sequence;
struct ImBuf *seq_cache_get(const struct SeqRenderData *context,
struct Sequence *seq,
float timeline_frame,
- int type,
- bool skip_disk_cache);
+ int type);
void seq_cache_put(const struct SeqRenderData *context,
struct Sequence *seq,
float timeline_frame,
int type,
- struct ImBuf *i,
- bool skip_disk_cache);
+ struct ImBuf *i);
bool seq_cache_put_if_possible(const struct SeqRenderData *context,
struct Sequence *seq,
float timeline_frame,
int type,
- struct ImBuf *nval,
- bool skip_disk_cache);
+ struct ImBuf *nval);
bool seq_cache_recycle_item(struct Scene *scene);
void seq_cache_free_temp_cache(struct Scene *scene, short id, int timeline_frame);
void seq_cache_destruct(struct Scene *scene);
diff --git a/source/blender/sequencer/intern/iterator.c b/source/blender/sequencer/intern/iterator.c
index bb4982d1468..f99667dea04 100644
--- a/source/blender/sequencer/intern/iterator.c
+++ b/source/blender/sequencer/intern/iterator.c
@@ -75,31 +75,31 @@ static void seq_build_array(ListBase *seqbase, Sequence ***array, int depth)
}
static void seq_array(Editing *ed,
- Sequence ***seqarray,
- int *tot,
- const bool use_current_sequences)
+ const bool use_current_sequences,
+ Sequence ***r_seqarray,
+ int *r_seqarray_len)
{
Sequence **array;
- *seqarray = NULL;
- *tot = 0;
+ *r_seqarray = NULL;
+ *r_seqarray_len = 0;
if (ed == NULL) {
return;
}
if (use_current_sequences) {
- seq_count(ed->seqbasep, tot);
+ seq_count(ed->seqbasep, r_seqarray_len);
}
else {
- seq_count(&ed->seqbase, tot);
+ seq_count(&ed->seqbase, r_seqarray_len);
}
- if (*tot == 0) {
+ if (*r_seqarray_len == 0) {
return;
}
- *seqarray = array = MEM_mallocN(sizeof(Sequence *) * (*tot), "SeqArray");
+ *r_seqarray = array = MEM_mallocN(sizeof(Sequence *) * (*r_seqarray_len), "SeqArray");
if (use_current_sequences) {
seq_build_array(ed->seqbasep, &array, 0);
}
@@ -111,7 +111,7 @@ static void seq_array(Editing *ed,
void SEQ_iterator_begin(Editing *ed, SeqIterator *iter, const bool use_current_sequences)
{
memset(iter, 0, sizeof(*iter));
- seq_array(ed, &iter->array, &iter->tot, use_current_sequences);
+ seq_array(ed, use_current_sequences, &iter->array, &iter->tot);
if (iter->tot) {
iter->cur = 0;
diff --git a/source/blender/sequencer/intern/prefetch.c b/source/blender/sequencer/intern/prefetch.c
index b0e9e3c5003..4317fa3a850 100644
--- a/source/blender/sequencer/intern/prefetch.c
+++ b/source/blender/sequencer/intern/prefetch.c
@@ -379,28 +379,28 @@ static bool seq_prefetch_do_skip_frame(PrefetchJob *pfjob, ListBase *seqbase)
if (seq_arr[i]->type == SEQ_TYPE_SCENE && (seq_arr[i]->flag & SEQ_SCENE_STRIPS) == 0) {
int cached_types = 0;
- ibuf = seq_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_FINAL_OUT, false);
+ ibuf = seq_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_FINAL_OUT);
if (ibuf != NULL) {
cached_types |= SEQ_CACHE_STORE_FINAL_OUT;
IMB_freeImBuf(ibuf);
ibuf = NULL;
}
- ibuf = seq_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_COMPOSITE, false);
+ ibuf = seq_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_COMPOSITE);
if (ibuf != NULL) {
cached_types |= SEQ_CACHE_STORE_COMPOSITE;
IMB_freeImBuf(ibuf);
ibuf = NULL;
}
- ibuf = seq_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_PREPROCESSED, false);
+ ibuf = seq_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_PREPROCESSED);
if (ibuf != NULL) {
cached_types |= SEQ_CACHE_STORE_PREPROCESSED;
IMB_freeImBuf(ibuf);
ibuf = NULL;
}
- ibuf = seq_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_RAW, false);
+ ibuf = seq_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_RAW);
if (ibuf != NULL) {
cached_types |= SEQ_CACHE_STORE_RAW;
IMB_freeImBuf(ibuf);
diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c
index 0ab2a67e560..e9de73bc093 100644
--- a/source/blender/sequencer/intern/render.c
+++ b/source/blender/sequencer/intern/render.c
@@ -599,10 +599,12 @@ static void multibuf(ImBuf *ibuf, const float fmul)
}
}
-/* Effect, mask and scene in strip input strips are rendered in preview resolution. They are
- * already downscaled. input_preprocess() does not expect this to happen. Other strip types are
- * rendered with original media resolution, unless proxies are enabled for them. With proxies
- * is_proxy_image will be set correctly to true.*/
+/**
+ * Effect, mask and scene in strip input strips are rendered in preview resolution.
+ * They are already down-scaled. #input_preprocess() does not expect this to happen.
+ * Other strip types are rendered with original media resolution, unless proxies are
+ * enabled for them. With proxies `is_proxy_image` will be set correctly to true.
+ */
static bool seq_need_scale_to_render_size(const Sequence *seq, bool is_proxy_image)
{
if (is_proxy_image) {
@@ -762,14 +764,14 @@ static ImBuf *seq_render_preprocess_ibuf(const SeqRenderData *context,
/* 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, false);
+ seq_cache_put(context, seq, timeline_frame, SEQ_CACHE_STORE_RAW, ibuf);
}
if (use_preprocess) {
ibuf = input_preprocess(context, seq, timeline_frame, ibuf, is_proxy_image);
}
- seq_cache_put(context, seq, timeline_frame, SEQ_CACHE_STORE_PREPROCESSED, ibuf, false);
+ seq_cache_put(context, seq, timeline_frame, SEQ_CACHE_STORE_PREPROCESSED, ibuf);
return ibuf;
}
@@ -1637,8 +1639,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context,
}
if (view_id != context->view_id) {
- seq_cache_put(
- &localcontext, seq, timeline_frame, SEQ_CACHE_STORE_RAW, ibufs_arr[view_id], false);
+ seq_cache_put(&localcontext, seq, timeline_frame, SEQ_CACHE_STORE_RAW, ibufs_arr[view_id]);
}
RE_ReleaseResultImage(re);
@@ -1813,14 +1814,14 @@ ImBuf *seq_render_strip(const SeqRenderData *context,
bool use_preprocess = false;
bool is_proxy_image = false;
- ibuf = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_PREPROCESSED, false);
+ ibuf = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_PREPROCESSED);
if (ibuf != NULL) {
return ibuf;
}
/* Proxies are not stored in cache. */
if (!SEQ_can_use_proxy(seq, SEQ_rendersize_to_proxysize(context->preview_render_size))) {
- ibuf = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_RAW, false);
+ ibuf = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_RAW);
}
if (ibuf == NULL) {
@@ -1927,7 +1928,7 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
int early_out;
Sequence *seq = seq_arr[i];
- out = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_COMPOSITE, false);
+ out = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_COMPOSITE);
if (out) {
break;
@@ -1956,8 +1957,7 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
out = seq_render_strip_stack_apply_effect(context, seq, timeline_frame, ibuf1, ibuf2);
- seq_cache_put(
- context, seq_arr[i], timeline_frame, SEQ_CACHE_STORE_COMPOSITE, out, false);
+ seq_cache_put(context, seq_arr[i], timeline_frame, SEQ_CACHE_STORE_COMPOSITE, out);
IMB_freeImBuf(ibuf1);
IMB_freeImBuf(ibuf2);
@@ -1983,7 +1983,7 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
IMB_freeImBuf(ibuf2);
}
- seq_cache_put(context, seq_arr[i], timeline_frame, SEQ_CACHE_STORE_COMPOSITE, out, false);
+ seq_cache_put(context, seq_arr[i], timeline_frame, SEQ_CACHE_STORE_COMPOSITE, out);
}
return out;
@@ -2022,8 +2022,7 @@ ImBuf *SEQ_render_give_ibuf(const SeqRenderData *context, float timeline_frame,
count = seq_get_shown_sequences(seqbasep, timeline_frame, chanshown, seq_arr);
if (count) {
- out = seq_cache_get(
- context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, false);
+ out = seq_cache_get(context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT);
}
seq_cache_free_temp_cache(context->scene, context->task_id, timeline_frame);
@@ -2033,12 +2032,11 @@ ImBuf *SEQ_render_give_ibuf(const SeqRenderData *context, float timeline_frame,
out = seq_render_strip_stack(context, &state, seqbasep, timeline_frame, chanshown);
if (context->is_prefetch_render) {
- seq_cache_put(
- context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, out, false);
+ seq_cache_put(context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, out);
}
else {
seq_cache_put_if_possible(
- context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, out, false);
+ context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, out);
}
BLI_mutex_unlock(&seq_render_mutex);
}
diff --git a/source/blender/sequencer/intern/strip_select.c b/source/blender/sequencer/intern/strip_select.c
index 58ae281ead1..7cdd756e2d9 100644
--- a/source/blender/sequencer/intern/strip_select.c
+++ b/source/blender/sequencer/intern/strip_select.c
@@ -54,29 +54,29 @@ void SEQ_select_active_set(Scene *scene, Sequence *seq)
ed->act_seq = seq;
}
-int SEQ_select_active_get_pair(Scene *scene, Sequence **seq_act, Sequence **seq_other)
+int SEQ_select_active_get_pair(Scene *scene, Sequence **r_seq_act, Sequence **r_seq_other)
{
Editing *ed = SEQ_editing_get(scene, false);
- *seq_act = SEQ_select_active_get(scene);
+ *r_seq_act = SEQ_select_active_get(scene);
- if (*seq_act == NULL) {
+ if (*r_seq_act == NULL) {
return 0;
}
Sequence *seq;
- *seq_other = NULL;
+ *r_seq_other = NULL;
for (seq = ed->seqbasep->first; seq; seq = seq->next) {
- if (seq->flag & SELECT && (seq != (*seq_act))) {
- if (*seq_other) {
+ if (seq->flag & SELECT && (seq != (*r_seq_act))) {
+ if (*r_seq_other) {
return 0;
}
- *seq_other = seq;
+ *r_seq_other = seq;
}
}
- return (*seq_other != NULL);
+ return (*r_seq_other != NULL);
}
diff --git a/source/blender/simulation/intern/implicit_blender.c b/source/blender/simulation/intern/implicit_blender.c
index 4c4d3e8a821..cf092d7716a 100644
--- a/source/blender/simulation/intern/implicit_blender.c
+++ b/source/blender/simulation/intern/implicit_blender.c
@@ -1693,7 +1693,7 @@ BLI_INLINE void dfdx_damp(float to[3][3],
BLI_INLINE void dfdv_damp(float to[3][3], const float dir[3], float damping)
{
- /* derivative of force wrt velocity */
+ /* Derivative of force with regards to velocity. */
outerproduct(to, dir, dir);
mul_m3_fl(to, -damping);
}
@@ -1727,7 +1727,7 @@ BLI_INLINE float fbstar(float length, float L, float kb, float cb)
return tempfb_fl;
}
-/* function to calculae bending spring force (taken from Choi & Co) */
+/* Function to calculate bending spring force (taken from Choi & Co). */
BLI_INLINE float fbstar_jacobi(float length, float L, float kb, float cb)
{
float tempfb_fl = kb * fb(length, L);
diff --git a/source/blender/simulation/intern/implicit_eigen.cpp b/source/blender/simulation/intern/implicit_eigen.cpp
index ea1729589d6..8eb227d38ab 100644
--- a/source/blender/simulation/intern/implicit_eigen.cpp
+++ b/source/blender/simulation/intern/implicit_eigen.cpp
@@ -904,7 +904,7 @@ BLI_INLINE void dfdx_damp(float to[3][3],
BLI_INLINE void dfdv_damp(float to[3][3], const float dir[3], float damping)
{
- /* derivative of force wrt velocity */
+ /* Derivative of force with regards to velocity. */
outerproduct(to, dir, dir);
mul_m3_fl(to, -damping);
}
@@ -936,7 +936,7 @@ BLI_INLINE float fbstar(float length, float L, float kb, float cb)
}
}
-/* function to calculae bending spring force (taken from Choi & Co) */
+/* Function to calculate bending spring force (taken from Choi & Co). */
BLI_INLINE float fbstar_jacobi(float length, float L, float kb, float cb)
{
float tempfb_fl = kb * fb(length, L);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 540896664da..9eb4dd832cb 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -171,15 +171,24 @@ void WM_opengl_context_dispose(void *context);
void WM_opengl_context_activate(void *context);
void WM_opengl_context_release(void *context);
-struct wmWindow *WM_window_open(struct bContext *C, const struct rcti *rect);
-struct wmWindow *WM_window_open_temp(struct bContext *C,
- const char *title,
- int x,
- int y,
- int sizex,
- int sizey,
- int space_type,
- bool dialog);
+/* WM_window_open alignment */
+typedef enum WindowAlignment {
+ WIN_ALIGN_ABSOLUTE = 0,
+ WIN_ALIGN_LOCATION_CENTER,
+ WIN_ALIGN_PARENT_CENTER,
+} WindowAlignment;
+
+struct wmWindow *WM_window_open(struct bContext *C,
+ const char *title,
+ int x,
+ int y,
+ int sizex,
+ int sizey,
+ int space_type,
+ bool dialog,
+ bool temp,
+ WindowAlignment alignment);
+
void WM_window_set_dpi(const wmWindow *win);
bool WM_stereo3d_enabled(struct wmWindow *win, bool only_fullscreen_test);
@@ -678,17 +687,23 @@ struct wmDropBox *WM_dropbox_add(
ListBase *lb,
const char *idname,
bool (*poll)(struct bContext *, struct wmDrag *, const struct wmEvent *event, const char **),
- void (*copy)(struct wmDrag *, struct wmDropBox *));
+ void (*copy)(struct wmDrag *, struct wmDropBox *),
+ void (*cancel)(struct Main *, struct wmDrag *, struct wmDropBox *));
ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid);
/* ID drag and drop */
void WM_drag_add_local_ID(struct wmDrag *drag, struct ID *id, struct ID *from_parent);
struct ID *WM_drag_get_local_ID(const struct wmDrag *drag, short idcode);
struct ID *WM_drag_get_local_ID_from_event(const struct wmEvent *event, short idcode);
+bool WM_drag_is_ID_type(const struct wmDrag *drag, int idcode);
struct wmDragAsset *WM_drag_get_asset_data(const struct wmDrag *drag, int idcode);
struct ID *WM_drag_get_local_ID_or_import_from_asset(const struct wmDrag *drag, int idcode);
+void WM_drag_free_imported_drag_ID(struct Main *bmain,
+ struct wmDrag *drag,
+ struct wmDropBox *drop);
+
/* Set OpenGL viewport and scissor */
void wmViewport(const struct rcti *winrct);
void wmPartialViewport(rcti *drawrct, const rcti *winrct, const rcti *partialrct);
diff --git a/source/blender/windowmanager/WM_keymap.h b/source/blender/windowmanager/WM_keymap.h
index 15be21bdbc4..564afe084b9 100644
--- a/source/blender/windowmanager/WM_keymap.h
+++ b/source/blender/windowmanager/WM_keymap.h
@@ -59,7 +59,7 @@ wmKeyMapItem *WM_keymap_add_item(
wmKeyMapItem *WM_keymap_add_item_copy(struct wmKeyMap *keymap, wmKeyMapItem *kmi_src);
bool WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
-int WM_keymap_item_to_string(wmKeyMapItem *kmi,
+int WM_keymap_item_to_string(const wmKeyMapItem *kmi,
const bool compact,
char *result,
const int result_len);
@@ -86,7 +86,7 @@ bool WM_keymap_remove(struct wmKeyConfig *keyconfig, struct wmKeyMap *keymap);
bool WM_keymap_poll(struct bContext *C, struct wmKeyMap *keymap);
wmKeyMapItem *WM_keymap_item_find_id(struct wmKeyMap *keymap, int id);
-bool WM_keymap_item_compare(struct wmKeyMapItem *k1, struct wmKeyMapItem *k2);
+bool WM_keymap_item_compare(const struct wmKeyMapItem *k1, const struct wmKeyMapItem *k2);
/* keymap_utils.c */
@@ -111,13 +111,13 @@ void WM_keymap_add_context_enum_set_items(wmKeyMap *keymap,
wmKeyMap *WM_keymap_guess_from_context(const struct bContext *C);
wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, const char *opname);
-bool WM_keymap_uses_event_modifier(wmKeyMap *keymap, const int event_modifier);
+bool WM_keymap_uses_event_modifier(const wmKeyMap *keymap, const int event_modifier);
void WM_keymap_fix_linking(void);
/* Modal Keymap */
-int WM_modalkeymap_items_to_string(struct wmKeyMap *km,
+int WM_modalkeymap_items_to_string(const struct wmKeyMap *km,
const int propvalue,
const bool compact,
char *result,
@@ -142,7 +142,7 @@ wmKeyMapItem *WM_modalkeymap_add_item(
struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value);
wmKeyMapItem *WM_modalkeymap_add_item_str(
struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, const char *value);
-wmKeyMapItem *WM_modalkeymap_find_propvalue(wmKeyMap *km, const int propvalue);
+const wmKeyMapItem *WM_modalkeymap_find_propvalue(const wmKeyMap *km, const int propvalue);
void WM_modalkeymap_assign(struct wmKeyMap *km, const char *opname);
/* Keymap Editor */
diff --git a/source/blender/windowmanager/WM_toolsystem.h b/source/blender/windowmanager/WM_toolsystem.h
index 451f0ecd424..d2e2b9c8f3b 100644
--- a/source/blender/windowmanager/WM_toolsystem.h
+++ b/source/blender/windowmanager/WM_toolsystem.h
@@ -42,7 +42,7 @@ struct wmOperatorType;
#define WM_TOOLSYSTEM_SPACE_MASK \
((1 << SPACE_IMAGE) | (1 << SPACE_NODE) | (1 << SPACE_VIEW3D) | (1 << SPACE_SEQ))
-/* Values that define a categoey of active tool. */
+/* Values that define a category of active tool. */
typedef struct bToolKey {
int space_type;
int mode;
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 0a32d2f0405..d40c0715a09 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -549,7 +549,7 @@ typedef struct wmEvent {
/** Event code itself (short, is also in keymap). */
short type;
- /** Press, release, scrollvalue. */
+ /** Press, release, scroll-value. */
short val;
/** Mouse pointer position, screen coord. */
int x, y;
@@ -904,6 +904,12 @@ typedef struct wmDropBox {
void (*copy)(struct wmDrag *, struct wmDropBox *);
/**
+ * If the operator is cancelled (returns `OPERATOR_CANCELLED`), this can be used for cleanup of
+ * `copy()` resources.
+ */
+ void (*cancel)(struct Main *, struct wmDrag *, struct wmDropBox *);
+
+ /**
* If poll succeeds, operator is called.
* Not saved in file, so can be pointer.
*/
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_api.h b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
index 70ddae4d724..cf1a7628267 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_api.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
@@ -301,7 +301,7 @@ void WM_gizmomap_draw(struct wmGizmoMap *gzmap,
void WM_gizmomap_add_handlers(struct ARegion *region, struct wmGizmoMap *gzmap);
bool WM_gizmomap_select_all(struct bContext *C, struct wmGizmoMap *gzmap, const int action);
bool WM_gizmomap_cursor_set(const struct wmGizmoMap *gzmap, struct wmWindow *win);
-void WM_gizmomap_message_subscribe(struct bContext *C,
+void WM_gizmomap_message_subscribe(const struct bContext *C,
struct wmGizmoMap *gzmap,
struct ARegion *region,
struct wmMsgBus *mbus);
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_types.h b/source/blender/windowmanager/gizmo/WM_gizmo_types.h
index 8f84c02be12..fd7f9c2de7c 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_types.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_types.h
@@ -371,6 +371,14 @@ typedef struct wmGizmoType {
*/
wmGizmoFnMatrixBasisGet matrix_basis_get;
+ /**
+ * Returns screen-space bounding box in the window space
+ * (compatible with #wmEvent.x #wmEvent.y).
+ *
+ * Used for tool-tip placement (otherwise the cursor location is used).
+ */
+ wmGizmoFnScreenBoundsGet screen_bounds_get;
+
/** Activate a gizmo state when the user clicks on it. */
wmGizmoFnInvoke invoke;
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
index a56a506b1ab..cfedd67b2f0 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
@@ -378,7 +378,6 @@ void WM_gizmo_set_color_highlight(wmGizmo *gz, const float color_hi[4])
/* -------------------------------------------------------------------- */
/** \name Gizmo Callback Assignment
- *
* \{ */
void WM_gizmo_set_fn_custom_modal(struct wmGizmo *gz, wmGizmoFnModal fn)
@@ -758,7 +757,6 @@ void WM_gizmo_properties_free(PointerRNA *ptr)
/* -------------------------------------------------------------------- */
/** \name General Utilities
- *
* \{ */
bool WM_gizmo_context_check_drawstep(const struct bContext *C, eWM_GizmoFlagMapDrawStep step)
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
index e9a1b5e3df0..1e77ccd7a1c 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
@@ -61,7 +61,6 @@
/* -------------------------------------------------------------------- */
/** \name wmGizmoGroup
- *
* \{ */
/**
@@ -697,7 +696,6 @@ wmKeyMap *wm_gizmogroup_tweak_modal_keymap(wmKeyConfig *keyconf)
/* -------------------------------------------------------------------- */
/** \name wmGizmoGroup (Key-map callbacks)
- *
* \{ */
wmKeyMap *WM_gizmogroup_setup_keymap_generic(const wmGizmoGroupType *UNUSED(gzgt), wmKeyConfig *kc)
@@ -837,7 +835,6 @@ struct wmKeyMap *WM_gizmo_keymap_generic_maybe_drag(wmWindowManager *wm)
/* -------------------------------------------------------------------- */
/** \name wmGizmoGroupType
- *
* \{ */
struct wmGizmoGroupTypeRef *WM_gizmomaptype_group_find_ptr(struct wmGizmoMapType *gzmap_type,
@@ -1142,7 +1139,6 @@ void WM_gizmo_group_unlink_delayed_ptr_from_space(wmGizmoGroupType *gzgt,
/* -------------------------------------------------------------------- */
/** \name Gizmo Group Type Callback Wrappers
- *
* \{ */
bool WM_gizmo_group_type_poll(const bContext *C, const wmGizmoGroupType *gzgt)
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
index 479768c3536..051e3e4c1a9 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
@@ -158,7 +158,6 @@ void wm_gizmomap_select_array_remove(wmGizmoMap *gzmap, wmGizmo *gz)
/* -------------------------------------------------------------------- */
/** \name wmGizmoMap
- *
* \{ */
static wmGizmoMap *wm_gizmomap_new_from_type_ex(struct wmGizmoMapType *gzmap_type,
@@ -1156,7 +1155,7 @@ ListBase *wm_gizmomap_groups_get(wmGizmoMap *gzmap)
return &gzmap->groups;
}
-void WM_gizmomap_message_subscribe(bContext *C,
+void WM_gizmomap_message_subscribe(const bContext *C,
wmGizmoMap *gzmap,
ARegion *region,
struct wmMsgBus *mbus)
@@ -1182,7 +1181,6 @@ void WM_gizmomap_message_subscribe(bContext *C,
/* -------------------------------------------------------------------- */
/** \name Tooltip Handling
- *
* \{ */
struct ARegion *WM_gizmomap_tooltip_init(struct bContext *C,
@@ -1211,7 +1209,6 @@ struct ARegion *WM_gizmomap_tooltip_init(struct bContext *C,
/* -------------------------------------------------------------------- */
/** \name wmGizmoMapType
- *
* \{ */
wmGizmoMapType *WM_gizmomaptype_find(const struct wmGizmoMapType_Params *gzmap_params)
@@ -1277,7 +1274,6 @@ void wm_gizmos_keymap(wmKeyConfig *keyconf)
/* -------------------------------------------------------------------- */
/** \name Updates for Dynamic Type Registration
- *
* \{ */
void WM_gizmoconfig_update_tag_group_type_init(wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt)
diff --git a/source/blender/windowmanager/gizmo/wm_gizmo_fn.h b/source/blender/windowmanager/gizmo/wm_gizmo_fn.h
index 418e848e35b..84e6308223f 100644
--- a/source/blender/windowmanager/gizmo/wm_gizmo_fn.h
+++ b/source/blender/windowmanager/gizmo/wm_gizmo_fn.h
@@ -62,6 +62,9 @@ typedef void (*wmGizmoFnMatrixBasisGet)(const struct wmGizmo *, float[4][4]);
typedef int (*wmGizmoFnInvoke)(struct bContext *, struct wmGizmo *, const struct wmEvent *);
typedef void (*wmGizmoFnExit)(struct bContext *, struct wmGizmo *, const bool);
typedef int (*wmGizmoFnCursorGet)(struct wmGizmo *);
+typedef void (*wmGizmoFnScreenBoundsGet)(struct bContext *,
+ struct wmGizmo *,
+ rcti *r_bounding_box);
typedef void (*wmGizmoFnSelectRefresh)(struct wmGizmo *);
typedef void (*wmGizmoFnFree)(struct wmGizmo *);
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index a10284e9740..549b59e9e1d 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -279,6 +279,8 @@ IDTypeInfo IDType_ID_WM = {
.blend_read_expand = NULL,
.blend_read_undo_preserve = NULL,
+
+ .lib_override_apply_post = NULL,
};
#define MAX_OP_REGISTERED 32
diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c
index d50516dfab2..e32552063af 100644
--- a/source/blender/windowmanager/intern/wm_cursors.c
+++ b/source/blender/windowmanager/intern/wm_cursors.c
@@ -246,8 +246,7 @@ void WM_cursor_wait(bool val)
void WM_cursor_grab_enable(wmWindow *win, int wrap, bool hide, int bounds[4])
{
/* Only grab cursor when not running debug.
- * It helps not to get a stuck WM when hitting a breakpoint
- * */
+ * It helps not to get a stuck WM when hitting a break-point. */
GHOST_TGrabCursorMode mode = GHOST_kGrabNormal;
GHOST_TAxisFlag mode_axis = GHOST_kAxisX | GHOST_kGrabAxisY;
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index 08f60fef0d2..9684c21605a 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -39,6 +39,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_idtype.h"
+#include "BKE_lib_id.h"
#include "GPU_shader.h"
#include "GPU_state.h"
@@ -95,11 +96,13 @@ ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
wmDropBox *WM_dropbox_add(ListBase *lb,
const char *idname,
bool (*poll)(bContext *, wmDrag *, const wmEvent *, const char **),
- void (*copy)(wmDrag *, wmDropBox *))
+ void (*copy)(wmDrag *, wmDropBox *),
+ void (*cancel)(struct Main *, wmDrag *, wmDropBox *))
{
wmDropBox *drop = MEM_callocN(sizeof(wmDropBox), "wmDropBox");
drop->poll = poll;
drop->copy = copy;
+ drop->cancel = cancel;
drop->ot = WM_operatortype_find(idname, 0);
drop->opcontext = WM_OP_INVOKE_DEFAULT;
@@ -225,7 +228,8 @@ static const char *dropbox_active(bContext *C,
if (handler->dropboxes) {
LISTBASE_FOREACH (wmDropBox *, drop, handler->dropboxes) {
const char *tooltip = NULL;
- if (drop->poll(C, drag, event, &tooltip)) {
+ if (drop->poll(C, drag, event, &tooltip) &&
+ WM_operator_poll_context(C, drop->ot, drop->opcontext)) {
/* XXX Doing translation here might not be ideal, but later we have no more
* access to ot (and hence op context)... */
return (tooltip) ? tooltip : WM_operatortype_name(drop->ot, drop->ptr);
@@ -353,6 +357,14 @@ ID *WM_drag_get_local_ID_from_event(const wmEvent *event, short idcode)
return WM_drag_get_local_ID(lb->first, idcode);
}
+/**
+ * Check if the drag data is either a local ID or an external ID asset of type \a idcode.
+ */
+bool WM_drag_is_ID_type(const wmDrag *drag, int idcode)
+{
+ return WM_drag_get_local_ID(drag, idcode) || WM_drag_get_asset_data(drag, idcode);
+}
+
wmDragAsset *WM_drag_get_asset_data(const wmDrag *drag, int idcode)
{
if (drag->type != WM_DRAG_ASSET) {
@@ -373,6 +385,9 @@ static ID *wm_drag_asset_id_import(wmDragAsset *asset_drag)
/**
* When dragging a local ID, return that. Otherwise, if dragging an asset-handle, link or append
* that depending on what was chosen by the drag-box (currently append only in fact).
+ *
+ * Use #WM_drag_free_imported_drag_ID() as cancel callback of the drop-box, so that the asset
+ * import is rolled back if the drop operator fails.
*/
ID *WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode)
{
@@ -393,6 +408,39 @@ ID *WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode)
return wm_drag_asset_id_import(asset_drag);
}
+/**
+ * \brief Free asset ID imported for cancelled drop.
+ *
+ * If the asset was imported (linked/appended) using #WM_drag_get_local_ID_or_import_from_asset()`
+ * (typically via a #wmDropBox.copy() callback), we want the ID to be removed again if the drop
+ * operator cancels.
+ * This is for use as #wmDropBox.cancel() callback.
+ */
+void WM_drag_free_imported_drag_ID(struct Main *bmain, wmDrag *drag, wmDropBox *drop)
+{
+ if (drag->type != WM_DRAG_ASSET) {
+ return;
+ }
+
+ wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0);
+ if (!asset_drag) {
+ return;
+ }
+
+ /* Get name from property, not asset data - it may have changed after importing to ensure
+ * uniqueness (name is assumed to be set from the imported ID name). */
+ char name[MAX_ID_NAME - 2];
+ RNA_string_get(drop->ptr, "name", name);
+ if (!name[0]) {
+ return;
+ }
+
+ ID *id = BKE_libblock_find_name(bmain, asset_drag->id_type, name);
+ if (id) {
+ BKE_id_delete(bmain, id);
+ }
+}
+
/* ************** draw ***************** */
static void wm_drop_operator_draw(const char *name, int x, int y)
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index b11dae27d19..85611a0be93 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -346,7 +346,7 @@ static const char *wm_area_name(ScrArea *area)
SPACE_NAME(SPACE_TOPBAR);
SPACE_NAME(SPACE_STATUSBAR);
default:
- return "Unkown Space";
+ return "Unknown Space";
}
}
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 859336d0338..2406ba83bf4 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -543,13 +543,33 @@ void wm_event_do_notifiers(bContext *C)
ED_screen_do_listen(C, note);
LISTBASE_FOREACH (ARegion *, region, &screen->regionbase) {
- ED_region_do_listen(win, NULL, region, note, scene);
+ wmRegionListenerParams region_params = {
+ .window = win,
+ .area = NULL,
+ .region = region,
+ .scene = scene,
+ .notifier = note,
+ };
+ ED_region_do_listen(&region_params);
}
ED_screen_areas_iter (win, screen, area) {
- ED_area_do_listen(win, area, note, scene);
+ wmSpaceTypeListenerParams area_params = {
+ .window = win,
+ .area = area,
+ .notifier = note,
+ .scene = scene,
+ };
+ ED_area_do_listen(&area_params);
LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
- ED_region_do_listen(win, area, region, note, scene);
+ wmRegionListenerParams region_params = {
+ .window = win,
+ .area = area,
+ .region = region,
+ .scene = scene,
+ .notifier = note,
+ };
+ ED_region_do_listen(&region_params);
}
}
}
@@ -2079,7 +2099,7 @@ static int wm_handler_operator_call(bContext *C,
handler->op = NULL;
}
- /* Putting back screen context, reval can pass trough after modal failures! */
+ /* Putting back screen context, reval can pass through after modal failures! */
if ((retval & OPERATOR_PASS_THROUGH) || wm_event_always_pass(event)) {
CTX_wm_area_set(C, area);
CTX_wm_region_set(C, region);
@@ -2788,8 +2808,10 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
LISTBASE_FOREACH (wmDrag *, drag, lb) {
const char *tooltip = NULL;
if (drop->poll(C, drag, event, &tooltip)) {
- /* Optionally copy drag information to operator properties. */
- if (drop->copy) {
+ /* Optionally copy drag information to operator properties. Don't call it if the
+ * operator fails anyway, it might do more than just set properties (e.g.
+ * typically import an asset). */
+ if (drop->copy && WM_operator_poll_context(C, drop->ot, drop->opcontext)) {
drop->copy(drag, drop);
}
@@ -2798,8 +2820,14 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
ListBase single_lb = {drag, drag};
event->customdata = &single_lb;
- wm_operator_call_internal(
+ int op_retval = wm_operator_call_internal(
C, drop->ot, drop->ptr, NULL, drop->opcontext, false, event);
+ OPERATOR_RETVAL_CHECK(op_retval);
+
+ if ((op_retval & OPERATOR_CANCELLED) && drop->cancel) {
+ drop->cancel(CTX_data_main(C), drag, drop);
+ }
+
action |= WM_HANDLER_BREAK;
/* Free the drags. */
@@ -5113,7 +5141,6 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win)
/* -------------------------------------------------------------------- */
/** \name Modal Keymap Status
- *
* \{ */
bool WM_window_modal_keymap_status_draw(bContext *C, wmWindow *win, uiLayout *layout)
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 42d17387d77..d2d080a9a68 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -140,6 +140,7 @@
static RecentFile *wm_file_history_find(const char *filepath);
static void wm_history_file_free(RecentFile *recent);
+static void wm_history_files_free(void);
static void wm_history_file_update(void);
static void wm_history_file_write(void);
@@ -580,7 +581,10 @@ static void wm_file_read_post(bContext *C,
#ifdef WITH_PYTHON
if (is_startup_file) {
- /* possible python hasn't been initialized */
+ /* On startup (by default), Python won't have been initialized.
+ *
+ * The following block handles data & preferences being reloaded
+ * which requires resetting some internal variables. */
if (CTX_py_init_get(C)) {
bool reset_all = use_userdef;
if (use_userdef || reset_app_template) {
@@ -592,8 +596,16 @@ static void wm_file_read_post(bContext *C,
}
}
if (reset_all) {
- /* sync addons, these may have changed from the defaults */
- BPY_run_string_eval(C, (const char *[]){"addon_utils", NULL}, "addon_utils.reset_all()");
+ BPY_run_string_exec(
+ C,
+ (const char *[]){"bpy", "addon_utils", NULL},
+ /* Refresh scripts as the preferences may have changed the user-scripts path.
+ *
+ * This is needed when loading settings from the previous version,
+ * otherwise the script path stored in the preferences would be ignored. */
+ "bpy.utils.refresh_script_paths()\n"
+ /* Sync add-ons, these may have changed from the defaults. */
+ "addon_utils.reset_all()");
}
if (use_data) {
BPY_python_reset(C);
@@ -1177,7 +1189,7 @@ void wm_history_file_read(void)
lines = BLI_file_read_as_lines(name);
- BLI_listbase_clear(&G.recent_files);
+ wm_history_files_free();
/* read list of recent opened files from recent-files.txt to memory */
for (l = lines, num = 0; l && (num < U.recent_files); l = l->next) {
@@ -1208,6 +1220,13 @@ static void wm_history_file_free(RecentFile *recent)
BLI_freelinkN(&G.recent_files, recent);
}
+static void wm_history_files_free(void)
+{
+ LISTBASE_FOREACH_MUTABLE (RecentFile *, recent, &G.recent_files) {
+ wm_history_file_free(recent);
+ }
+}
+
static RecentFile *wm_file_history_find(const char *filepath)
{
return BLI_findstring_ptr(&G.recent_files, filepath, offsetof(RecentFile, filepath));
@@ -1379,14 +1398,8 @@ static ImBuf *blend_file_thumb(const bContext *C,
}
if (ibuf) {
- float aspect = (scene->r.xsch * scene->r.xasp) / (scene->r.ysch * scene->r.yasp);
-
/* dirty oversampling */
IMB_scaleImBuf(ibuf, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE);
-
- /* add pretty overlay */
- IMB_thumb_overlay_blend(ibuf->rect, ibuf->x, ibuf->y, aspect);
-
thumb = BKE_main_thumbnail_from_imbuf(NULL, ibuf);
}
else {
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 918836041df..56fd51ac6fd 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -624,13 +624,13 @@ void WM_exit_ex(bContext *C, const bool do_python)
#ifdef WITH_PYTHON
/* option not to close python so we can use 'atexit' */
if (do_python && ((C == NULL) || CTX_py_init_get(C))) {
- /* XXX - old note */
- /* before BKE_blender_free so py's gc happens while library still exists */
- /* needed at least for a rare sigsegv that can happen in pydrivers */
-
- /* Update for blender 2.5, move after BKE_blender_free because Blender now holds references to
- * PyObject's so decref'ing them after python ends causes bad problems every time
- * the py-driver bug can be fixed if it happens again we can deal with it then. */
+ /* NOTE: (old note)
+ * before BKE_blender_free so Python's garbage-collection happens while library still exists.
+ * Needed at least for a rare crash that can happen in python-drivers.
+ *
+ * Update for Blender 2.5, move after #BKE_blender_free because Blender now holds references
+ * to #PyObject's so #Py_DECREF'ing them after Python ends causes bad problems every time
+ * the python-driver bug can be fixed if it happens again we can deal with it then. */
BPY_python_end();
}
#else
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 8bfec0dc5c9..6cc9a4c9b64 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -949,9 +949,9 @@ wmKeyMapItem *WM_modalkeymap_add_item_str(
return kmi;
}
-static wmKeyMapItem *wm_modalkeymap_find_propvalue_iter(wmKeyMap *km,
- wmKeyMapItem *kmi,
- const int propvalue)
+static const wmKeyMapItem *wm_modalkeymap_find_propvalue_iter(const wmKeyMap *km,
+ const wmKeyMapItem *kmi,
+ const int propvalue)
{
if (km->flag & KEYMAP_MODAL) {
kmi = kmi ? kmi->next : km->items.first;
@@ -968,7 +968,7 @@ static wmKeyMapItem *wm_modalkeymap_find_propvalue_iter(wmKeyMap *km,
return NULL;
}
-wmKeyMapItem *WM_modalkeymap_find_propvalue(wmKeyMap *km, const int propvalue)
+const wmKeyMapItem *WM_modalkeymap_find_propvalue(const wmKeyMap *km, const int propvalue)
{
return wm_modalkeymap_find_propvalue_iter(km, NULL, propvalue);
}
@@ -1201,7 +1201,7 @@ int WM_keymap_item_raw_to_string(const short shift,
#undef ADD_SEP
}
-int WM_keymap_item_to_string(wmKeyMapItem *kmi,
+int WM_keymap_item_to_string(const wmKeyMapItem *kmi,
const bool compact,
char *result,
const int result_len)
@@ -1218,14 +1218,17 @@ int WM_keymap_item_to_string(wmKeyMapItem *kmi,
result_len);
}
-int WM_modalkeymap_items_to_string(
- wmKeyMap *km, const int propvalue, const bool compact, char *result, const int result_len)
+int WM_modalkeymap_items_to_string(const wmKeyMap *km,
+ const int propvalue,
+ const bool compact,
+ char *result,
+ const int result_len)
{
int totlen = 0;
bool add_sep = false;
if (km) {
- wmKeyMapItem *kmi;
+ const wmKeyMapItem *kmi;
/* Find all shortcuts related to that propvalue! */
for (kmi = WM_modalkeymap_find_propvalue(km, propvalue); kmi && totlen < (result_len - 2);
@@ -1330,7 +1333,7 @@ static wmKeyMapItem *wm_keymap_item_find_in_keymap(wmKeyMap *keymap,
if (IDP_EqualsProperties_ex(properties, properties_default, is_strict)) {
char kmi_str[128];
WM_keymap_item_to_string(kmi, false, kmi_str, sizeof(kmi_str));
- /* Note gievn properties could come from other things than menu entry... */
+ /* NOTE: given properties could come from other things than menu entry. */
printf(
"%s: Some set values in menu entry match default op values, "
"this might not be desired!\n",
@@ -1654,7 +1657,7 @@ wmKeyMapItem *WM_key_event_operator_from_keymap(wmKeyMap *keymap,
});
}
-bool WM_keymap_item_compare(wmKeyMapItem *k1, wmKeyMapItem *k2)
+bool WM_keymap_item_compare(const wmKeyMapItem *k1, const wmKeyMapItem *k2)
{
if (k1->flag & KMI_INACTIVE || k2->flag & KMI_INACTIVE) {
return 0;
diff --git a/source/blender/windowmanager/intern/wm_keymap_utils.c b/source/blender/windowmanager/intern/wm_keymap_utils.c
index 953fb9fed79..865889e7e64 100644
--- a/source/blender/windowmanager/intern/wm_keymap_utils.c
+++ b/source/blender/windowmanager/intern/wm_keymap_utils.c
@@ -477,7 +477,7 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
return km;
}
-static bool wm_keymap_item_uses_modifier(wmKeyMapItem *kmi, const int event_modifier)
+static bool wm_keymap_item_uses_modifier(const wmKeyMapItem *kmi, const int event_modifier)
{
if (kmi->ctrl != KM_ANY) {
if ((kmi->ctrl == KM_NOTHING) != ((event_modifier & KM_CTRL) == 0)) {
@@ -505,9 +505,9 @@ static bool wm_keymap_item_uses_modifier(wmKeyMapItem *kmi, const int event_modi
return true;
}
-bool WM_keymap_uses_event_modifier(wmKeyMap *keymap, const int event_modifier)
+bool WM_keymap_uses_event_modifier(const wmKeyMap *keymap, const int event_modifier)
{
- LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
+ LISTBASE_FOREACH (const wmKeyMapItem *, kmi, &keymap->items) {
if ((kmi->flag & KMI_INACTIVE) == 0) {
if (wm_keymap_item_uses_modifier(kmi, event_modifier)) {
return true;
diff --git a/source/blender/windowmanager/intern/wm_operator_props.c b/source/blender/windowmanager/intern/wm_operator_props.c
index 8dfe26fbf79..aeab1ee6fca 100644
--- a/source/blender/windowmanager/intern/wm_operator_props.c
+++ b/source/blender/windowmanager/intern/wm_operator_props.c
@@ -284,15 +284,15 @@ void WM_operator_properties_select_action_simple(wmOperatorType *ot,
*/
void WM_operator_properties_select_random(wmOperatorType *ot)
{
- RNA_def_float_percentage(ot->srna,
- "percent",
- 50.0f,
- 0.0f,
- 100.0f,
- "Percent",
- "Percentage of objects to select randomly",
- 0.0f,
- 100.0f);
+ RNA_def_float_factor(ot->srna,
+ "ratio",
+ 0.5f,
+ 0.0f,
+ 1.0f,
+ "Ratio",
+ "Portion of items to select randomly",
+ 0.f,
+ 1.0f);
RNA_def_int(ot->srna,
"seed",
0,
diff --git a/source/blender/windowmanager/intern/wm_operator_type.c b/source/blender/windowmanager/intern/wm_operator_type.c
index 4c4fd2b1a8e..0e57a92b685 100644
--- a/source/blender/windowmanager/intern/wm_operator_type.c
+++ b/source/blender/windowmanager/intern/wm_operator_type.c
@@ -424,9 +424,8 @@ static int wm_macro_modal(bContext *C, wmOperator *op, const wmEvent *event)
wm_event_free_handler(&handler->head);
}
- /* if operator is blocking, grab cursor
- * This may end up grabbing twice, but we don't care.
- * */
+ /* If operator is blocking, grab cursor.
+ * This may end up grabbing twice, but we don't care. */
if (op->opm->type->flag & OPTYPE_BLOCKING) {
int bounds[4] = {-1, -1, -1, -1};
int wrap = WM_CURSOR_WRAP_NONE;
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index e82f6cc9d76..297575e8dff 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -2087,6 +2087,7 @@ typedef struct {
bool use_secondary_tex;
void *cursor;
NumInput num_input;
+ int init_event;
} RadialControl;
static void radial_control_update_header(wmOperator *op, bContext *C)
@@ -2705,6 +2706,8 @@ static int radial_control_invoke(bContext *C, wmOperator *op, const wmEvent *eve
radial_control_set_initial_mouse(rc, event);
radial_control_set_tex(rc);
+ rc->init_event = WM_userdef_event_type_from_keymap_type(event->type);
+
/* temporarily disable other paint cursors */
wm = CTX_wm_manager(C);
rc->orig_paintcursors = wm->paintcursors;
@@ -2962,6 +2965,11 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even
return OPERATOR_RUNNING_MODAL;
}
+ if (!handled && (event->val == KM_RELEASE) && (rc->init_event == event->type) &&
+ RNA_boolean_get(op->ptr, "release_confirm")) {
+ ret = OPERATOR_FINISHED;
+ }
+
ED_region_tag_redraw(CTX_wm_region(C));
radial_control_update_header(op, C);
@@ -3070,6 +3078,10 @@ static void WM_OT_radial_control(wmOperatorType *ot)
prop = RNA_def_boolean(
ot->srna, "secondary_tex", false, "Secondary Texture", "Tweak brush secondary/mask texture");
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+
+ prop = RNA_def_boolean(
+ ot->srna, "release_confirm", false, "Confirm On Release", "Finish operation on key release");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
/** \} */
diff --git a/source/blender/windowmanager/intern/wm_playanim.c b/source/blender/windowmanager/intern/wm_playanim.c
index 60bcb687dbf..02a8951e60e 100644
--- a/source/blender/windowmanager/intern/wm_playanim.c
+++ b/source/blender/windowmanager/intern/wm_playanim.c
@@ -1097,6 +1097,7 @@ static void playanim_window_open(const char *title, int posx, int posy, int size
posy = (scr_h - posy - sizey);
g_WS.ghost_window = GHOST_CreateWindow(g_WS.ghost_system,
+ NULL,
title,
posx,
posy,
@@ -1104,6 +1105,7 @@ static void playanim_window_open(const char *title, int posx, int posy, int size
sizey,
/* could optionally start fullscreen */
GHOST_kWindowStateNormal,
+ false,
GHOST_kDrawingContextTypeOpenGL,
glsettings);
}
@@ -1144,7 +1146,6 @@ static char *wm_main_playanim_intern(int argc, const char **argv)
PlayState ps = {0};
- /* ps.doubleb = true;*/ /* UNUSED */
ps.go = true;
ps.direction = true;
ps.next_frame = 1;
@@ -1160,7 +1161,6 @@ static char *wm_main_playanim_intern(int argc, const char **argv)
ps.indicator = false;
ps.dropped_file[0] = 0;
ps.zoom = 1.0f;
- /* resetmap = false */
ps.draw_flip[0] = false;
ps.draw_flip[1] = false;
@@ -1421,7 +1421,7 @@ static char *wm_main_playanim_intern(int argc, const char **argv)
#endif
#ifdef USE_FRAME_CACHE_LIMIT
- /* really basic memory conservation scheme. Keep frames in a fifo queue */
+ /* Really basic memory conservation scheme. Keep frames in a FIFO queue. */
node = inmempicsbase.last;
while (node && added_images > PLAY_FRAME_CACHE_MAX) {
diff --git a/source/blender/windowmanager/intern/wm_splash_screen.c b/source/blender/windowmanager/intern/wm_splash_screen.c
index a3619a69152..ae726e73fe7 100644
--- a/source/blender/windowmanager/intern/wm_splash_screen.c
+++ b/source/blender/windowmanager/intern/wm_splash_screen.c
@@ -226,7 +226,26 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *region, void *UNUSE
0,
style);
- MenuType *mt = WM_menutype_find("WM_MT_splash", true);
+ MenuType *mt;
+ char userpref[FILE_MAX];
+ const char *const cfgdir = BKE_appdir_folder_id(BLENDER_USER_CONFIG, NULL);
+
+ if (cfgdir) {
+ BLI_path_join(userpref, sizeof(userpref), cfgdir, BLENDER_USERPREF_FILE, NULL);
+ }
+
+ /* Draw setup screen if no preferences have been saved yet. */
+ if (!BLI_exists(userpref)) {
+ mt = WM_menutype_find("WM_MT_splash_quick_setup", true);
+
+ /* The UI_BLOCK_QUICK_SETUP flag prevents the button text from being left-aligned,
+ as it is for all menus due to the UI_BLOCK_LOOP flag, see in 'ui_def_but'. */
+ UI_block_flag_enable(block, UI_BLOCK_QUICK_SETUP);
+ }
+ else {
+ mt = WM_menutype_find("WM_MT_splash", true);
+ }
+
if (mt) {
UI_menutype_draw(C, mt, layout);
}
diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c
index 5327062d9bb..5eaf026191f 100644
--- a/source/blender/windowmanager/intern/wm_toolsystem.c
+++ b/source/blender/windowmanager/intern/wm_toolsystem.c
@@ -620,7 +620,7 @@ bToolRef *WM_toolsystem_ref_set_by_id_ex(
bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *name, bool cycle)
{
wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_id", false);
- /* On startup, Python operatores are not yet loaded. */
+ /* On startup, Python operators are not yet loaded. */
if (ot == NULL) {
return NULL;
}
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 42fd214543f..ada4093080c 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -158,37 +158,16 @@ void wm_get_desktopsize(int *r_width, int *r_height)
*r_height = uiheight;
}
-/* keeps offset and size within monitor bounds */
-/* XXX solve dual screen... */
-static void wm_window_check_position(rcti *rect)
+/* keeps size within monitor bounds */
+static void wm_window_check_size(rcti *rect)
{
int width, height;
wm_get_screensize(&width, &height);
-
- if (rect->xmin < 0) {
- rect->xmax -= rect->xmin;
- rect->xmin = 0;
- }
- if (rect->ymin < 0) {
- rect->ymax -= rect->ymin;
- rect->ymin = 0;
- }
- if (rect->xmax > width) {
- int d = rect->xmax - width;
- rect->xmax -= d;
- rect->xmin -= d;
- }
- if (rect->ymax > height) {
- int d = rect->ymax - height;
- rect->ymax -= d;
- rect->ymin -= d;
- }
-
- if (rect->xmin < 0) {
- rect->xmin = 0;
+ if (BLI_rcti_size_x(rect) > width) {
+ BLI_rcti_resize_x(rect, width);
}
- if (rect->ymin < 0) {
- rect->ymin = 0;
+ if (BLI_rcti_size_y(rect) > height) {
+ BLI_rcti_resize_y(rect, height);
}
}
@@ -462,7 +441,7 @@ void wm_window_title(wmWindowManager *wm, wmWindow *win)
{
if (WM_window_is_temp_screen(win)) {
/* nothing to do for 'temp' windows,
- * because WM_window_open_temp always sets window title */
+ * because WM_window_open always sets window title */
}
else if (win->ghostwin) {
/* this is set to 1 if you don't have startup.blend open */
@@ -560,7 +539,6 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm,
wmWindow *win,
bool is_dialog)
{
-
/* a new window is created when pageflip mode is required for a window */
GHOST_GLSettings glSettings = {0};
if (win->stereo3d_format->display_mode == S3D_DISPLAY_PAGEFLIP) {
@@ -579,30 +557,17 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm,
wmWindow *prev_windrawable = wm->windrawable;
wm_window_clear_drawable(wm);
- GHOST_WindowHandle ghostwin;
- if (is_dialog && win->parent) {
- ghostwin = GHOST_CreateDialogWindow(g_system,
- win->parent->ghostwin,
- title,
- win->posx,
- posy,
- win->sizex,
- win->sizey,
- (GHOST_TWindowState)win->windowstate,
- GHOST_kDrawingContextTypeOpenGL,
- glSettings);
- }
- else {
- ghostwin = GHOST_CreateWindow(g_system,
- title,
- win->posx,
- posy,
- win->sizex,
- win->sizey,
- (GHOST_TWindowState)win->windowstate,
- GHOST_kDrawingContextTypeOpenGL,
- glSettings);
- }
+ GHOST_WindowHandle ghostwin = GHOST_CreateWindow(g_system,
+ (win->parent) ? win->parent->ghostwin : NULL,
+ title,
+ win->posx,
+ posy,
+ win->sizex,
+ win->sizey,
+ (GHOST_TWindowState)win->windowstate,
+ is_dialog,
+ GHOST_kDrawingContextTypeOpenGL,
+ glSettings);
if (ghostwin) {
win->gpuctx = GPU_context_create(ghostwin);
@@ -790,90 +755,77 @@ static bool wm_window_update_size_position(wmWindow *win)
}
/**
- * new window, no screen yet, but we open ghostwindow for it,
- * also gets the window level handlers
- * \note area-rip calls this.
- * \return the window or NULL.
- */
-wmWindow *WM_window_open(bContext *C, const rcti *rect)
-{
- wmWindowManager *wm = CTX_wm_manager(C);
- wmWindow *win_prev = CTX_wm_window(C);
- wmWindow *win = wm_window_new(CTX_data_main(C), wm, win_prev, false);
-
- const float native_pixel_size = GHOST_GetNativePixelSize(win_prev->ghostwin);
-
- win->posx = rect->xmin / native_pixel_size;
- win->posy = rect->ymin / native_pixel_size;
- win->sizex = BLI_rcti_size_x(rect) / native_pixel_size;
- win->sizey = BLI_rcti_size_y(rect) / native_pixel_size;
-
- WM_check(C);
-
- if (win->ghostwin) {
- return win;
- }
-
- wm_window_close(C, wm, win);
- CTX_wm_window_set(C, win_prev);
- return NULL;
-}
-
-/**
- * Uses `screen->temp` tag to define what to do, currently it limits
- * to only one "temp" window for render out, preferences, filewindow, etc...
- *
* \param space_type: SPACE_VIEW3D, SPACE_INFO, ... (eSpace_Type)
+ * \param dialog: whether this should be made as a dialog-style window
+ * \param temp: whether this is considered a short-lived window
+ * \param alignment: how this window is positioned relative to its parent
* \return the window or NULL in case of failure.
*/
-wmWindow *WM_window_open_temp(bContext *C,
- const char *title,
- int x,
- int y,
- int sizex,
- int sizey,
- int space_type,
- bool dialog)
+wmWindow *WM_window_open(bContext *C,
+ const char *title,
+ int x,
+ int y,
+ int sizex,
+ int sizey,
+ int space_type,
+ bool dialog,
+ bool temp,
+ WindowAlignment alignment)
{
Main *bmain = CTX_data_main(C);
wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win_prev = CTX_wm_window(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
+ rcti rect;
- /* convert to native OS window coordinates */
const float native_pixel_size = GHOST_GetNativePixelSize(win_prev->ghostwin);
- x /= native_pixel_size;
- y /= native_pixel_size;
+ /* convert to native OS window coordinates */
+ rect.xmin = win_prev->posx + (x / native_pixel_size);
+ rect.ymin = win_prev->posy + (y / native_pixel_size);
sizex /= native_pixel_size;
sizey /= native_pixel_size;
- /* calculate position */
- rcti rect;
- rect.xmin = x + win_prev->posx - sizex / 2;
- rect.ymin = y + win_prev->posy - sizey / 2;
+ if (alignment == WIN_ALIGN_LOCATION_CENTER) {
+ /* Window centered around x,y location. */
+ rect.xmin -= sizex / 2;
+ rect.ymin -= sizey / 2;
+ }
+ else if (alignment == WIN_ALIGN_PARENT_CENTER) {
+ /* Centered within parent. X,Y as offsets from there. */
+ rect.xmin += (win_prev->sizex - sizex) / 2;
+ rect.ymin += (win_prev->sizey - sizey) / 2;
+ }
+ else {
+ /* Positioned absolutely within parent bounds. */
+ }
+
rect.xmax = rect.xmin + sizex;
rect.ymax = rect.ymin + sizey;
/* changes rect to fit within desktop */
- wm_window_check_position(&rect);
+ wm_window_check_size(&rect);
- /* Reuse temporary or dialog window if one is open (but don't use a dialog for a regular
- * temporary window, or vice versa). */
+ /* Reuse temporary windows when they share the same title. */
wmWindow *win = NULL;
- LISTBASE_FOREACH (wmWindow *, win_iter, &wm->windows) {
- if (WM_window_is_temp_screen(win_iter) &&
- (dialog == GHOST_IsDialogWindow(win_iter->ghostwin))) {
- win = win_iter;
+ if (temp) {
+ LISTBASE_FOREACH (wmWindow *, win_iter, &wm->windows) {
+ if (WM_window_is_temp_screen(win_iter)) {
+ char *wintitle = GHOST_GetTitle(win_iter->ghostwin);
+ if (strcmp(title, wintitle) == 0) {
+ win = win_iter;
+ }
+ free(wintitle);
+ }
}
}
/* add new window? */
if (win == NULL) {
win = wm_window_new(bmain, wm, win_prev, dialog);
-
win->posx = rect.xmin;
win->posy = rect.ymin;
+ *win->stereo3d_format = *win_prev->stereo3d_format;
}
bScreen *screen = WM_window_get_active_screen(win);
@@ -901,7 +853,7 @@ wmWindow *WM_window_open_temp(bContext *C,
ED_screen_scene_change(C, win, scene);
}
- screen->temp = 1;
+ screen->temp = temp;
/* make window active, and validate/resize */
CTX_wm_window_set(C, win);
@@ -918,10 +870,11 @@ wmWindow *WM_window_open_temp(bContext *C,
*/
/* ensure it shows the right spacetype editor */
- ScrArea *area = screen->areabase.first;
- CTX_wm_area_set(C, area);
-
- ED_area_newspace(C, area, space_type, false);
+ if (space_type != SPACE_EMPTY) {
+ ScrArea *area = screen->areabase.first;
+ CTX_wm_area_set(C, area);
+ ED_area_newspace(C, area, space_type, false);
+ }
ED_screen_change(C, screen);
@@ -961,8 +914,18 @@ int wm_window_close_exec(bContext *C, wmOperator *UNUSED(op))
int wm_window_new_exec(bContext *C, wmOperator *UNUSED(op))
{
wmWindow *win_src = CTX_wm_window(C);
-
- bool ok = (wm_window_copy_test(C, win_src, true, true) != NULL);
+ ScrArea *area = BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_TYPE_ANY, 0);
+
+ bool ok = (WM_window_open(C,
+ IFACE_("Blender"),
+ 0,
+ 0,
+ win_src->sizex * 0.95f,
+ win_src->sizey * 0.9f,
+ area->spacetype,
+ false,
+ false,
+ WIN_ALIGN_PARENT_CENTER) != NULL);
return ok ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
@@ -1937,7 +1900,6 @@ bool wm_window_get_swap_interval(wmWindow *win, int *intervalOut)
/* -------------------------------------------------------------------- */
/** \name Find Window Utility
- *
* \{ */
static void wm_window_desktop_pos_get(const wmWindow *win,
const int screen_pos[2],
@@ -2038,7 +2000,7 @@ uint *WM_window_pixels_read(wmWindowManager *wm, wmWindow *win, int r_size[2])
const uint rect_len = r_size[0] * r_size[1];
uint *rect = MEM_mallocN(sizeof(*rect) * rect_len, __func__);
- GPU_frontbuffer_read_pixels(0, 0, r_size[0], r_size[1], 4, GPU_DATA_UNSIGNED_BYTE, rect);
+ GPU_frontbuffer_read_pixels(0, 0, r_size[0], r_size[1], 4, GPU_DATA_UBYTE, rect);
if (setup_context) {
if (wm->windrawable) {
diff --git a/source/blender/windowmanager/xr/intern/wm_xr.c b/source/blender/windowmanager/xr/intern/wm_xr.c
index 90f30809136..439d611b085 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr.c
@@ -138,7 +138,6 @@ bool wm_xr_events_handle(wmWindowManager *wm)
/* -------------------------------------------------------------------- */
/** \name XR Runtime Data
- *
* \{ */
wmXrRuntimeData *wm_xr_runtime_data_create(void)
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_draw.c b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
index 499ec136e03..cc4a7e41e82 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_draw.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
@@ -129,7 +129,7 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
/* Some systems have drawing glitches without this. */
GPU_clear_depth(1.0f);
- /* Draws the view into the surface_data->viewport's framebuffers */
+ /* Draws the view into the surface_data->viewport's frame-buffers. */
ED_view3d_draw_offscreen_simple(draw_data->depsgraph,
draw_data->scene,
&settings->shading,
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 7db936b3e51..c7b940d0012 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -74,7 +74,7 @@ endif()
if(WITH_TBB)
blender_include_dirs(${TBB_INCLUDE_DIRS})
if(NOT APPLE)
- # APPLE plaform uses full paths for linking libraries.
+ # APPLE platform uses full paths for linking libraries.
link_directories(${LIBDIR}/tbb/lib)
endif()
endif()
@@ -574,7 +574,7 @@ if(UNIX AND NOT APPLE)
DIRECTORY ${PYTHON_LIBPATH}/python${PYTHON_VERSION}
DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}
PATTERN "__pycache__" EXCLUDE # * any cache *
- PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib
+ PATTERN "config-${PYTHON_VERSION}/*.a" EXCLUDE # static lib
PATTERN "lib2to3" EXCLUDE # ./lib2to3
PATTERN "site-packages/*" EXCLUDE # ./site-packages/*
PATTERN "tkinter" EXCLUDE # ./tkinter
@@ -764,7 +764,7 @@ elseif(WIN32)
PATTERN "*.pyo" EXCLUDE # * any cache *
)
- install(
+ install(
DIRECTORY ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/lib
DESTINATION ${BLENDER_VERSION}/python/
CONFIGURATIONS Debug
@@ -772,7 +772,6 @@ elseif(WIN32)
PATTERN "__pycache__" EXCLUDE # * any cache *
PATTERN "*.pyc" EXCLUDE # * any cache *
PATTERN "*.pyo" EXCLUDE # * any cache *)
-
)
install(
@@ -804,13 +803,13 @@ elseif(WIN32)
if(WINDOWS_PYTHON_DEBUG)
install(
- FILES ${LIBDIR}/python/37/libs/python${_PYTHON_VERSION_NO_DOTS}.pdb
+ FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}.pdb
DESTINATION "."
CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel
)
install(
- FILES ${LIBDIR}/python/37/libs/python${_PYTHON_VERSION_NO_DOTS}_d.pdb
+ FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}_d.pdb
DESTINATION "."
CONFIGURATIONS Debug
)
@@ -945,7 +944,7 @@ elseif(APPLE)
PATTERN "__pycache__" EXCLUDE
PATTERN "__MACOSX" EXCLUDE
PATTERN ".DS_Store" EXCLUDE
- PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib
+ PATTERN "config-${PYTHON_VERSION}/*.a" EXCLUDE # static lib
PATTERN "lib2to3" EXCLUDE # ./lib2to3
PATTERN "tkinter" EXCLUDE # ./tkinter
PATTERN "lib-dynload/_tkinter.*" EXCLUDE # ./lib-dynload/_tkinter.co
diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c
index 6836cbec18c..e31be24ec7b 100644
--- a/source/creator/creator_args.c
+++ b/source/creator/creator_args.c
@@ -590,8 +590,6 @@ static int arg_handle_print_help(int UNUSED(argc), const char **UNUSED(argv), vo
BLI_args_print_arg_doc(ba, "--debug-ghost");
BLI_args_print_arg_doc(ba, "--debug-gpu");
BLI_args_print_arg_doc(ba, "--debug-gpu-force-workarounds");
- BLI_args_print_arg_doc(ba, "--debug-gpu-shaders");
- BLI_args_print_arg_doc(ba, "--debug-gpumem");
BLI_args_print_arg_doc(ba, "--debug-wm");
# ifdef WITH_XR_OPENXR
BLI_args_print_arg_doc(ba, "--debug-xr");
@@ -988,9 +986,9 @@ static const char arg_handle_debug_mode_generic_set_doc_depsgraph_no_threads[] =
static const char arg_handle_debug_mode_generic_set_doc_depsgraph_pretty[] =
"\n\t"
"Enable colors for dependency graph debug messages.";
-static const char arg_handle_debug_mode_generic_set_doc_gpumem[] =
+static const char arg_handle_debug_mode_generic_set_doc_gpu_force_workarounds[] =
"\n\t"
- "Enable GPU memory stats in status bar.";
+ "Enable workarounds for typical GPU issues and disable all GPU extensions.";
static int arg_handle_debug_mode_generic_set(int UNUSED(argc),
const char **UNUSED(argv),
@@ -1160,7 +1158,7 @@ static int arg_handle_env_system_set(int argc, const char **argv, void *UNUSED(d
}
for (; *ch_src; ch_src++, ch_dst++) {
- *ch_dst = (*ch_src == '-') ? '_' : (*ch_src) - 32; /* toupper() */
+ *ch_dst = (*ch_src == '-') ? '_' : (*ch_src) - 32; /* Inline #toupper() */
}
*ch_dst = '\0';
@@ -1958,7 +1956,7 @@ static int arg_handle_load_file(int UNUSED(argc), const char **argv, void *data)
if (success) {
if (G.background) {
- /* ensuer we use 'C->data.scene' for background render */
+ /* Ensure we use 'C->data.scene' for background render. */
CTX_wm_window_set(C, NULL);
}
}
@@ -2170,18 +2168,8 @@ void main_args_setup(bContext *C, bArgs *ba)
(void *)G_DEBUG_DEPSGRAPH_UUID);
BLI_args_add(ba,
NULL,
- "--debug-gpumem",
- CB_EX(arg_handle_debug_mode_generic_set, gpumem),
- (void *)G_DEBUG_GPU_MEM);
- BLI_args_add(ba,
- NULL,
- "--debug-gpu-shaders",
- CB_EX(arg_handle_debug_mode_generic_set, gpumem),
- (void *)G_DEBUG_GPU_SHADERS);
- BLI_args_add(ba,
- NULL,
"--debug-gpu-force-workarounds",
- CB_EX(arg_handle_debug_mode_generic_set, gpumem),
+ CB_EX(arg_handle_debug_mode_generic_set, gpu_force_workarounds),
(void *)G_DEBUG_GPU_FORCE_WORKAROUNDS);
BLI_args_add(ba, NULL, "--debug-exit-on-error", CB(arg_handle_debug_exit_on_error), NULL);
diff --git a/source/creator/creator_intern.h b/source/creator/creator_intern.h
index 0a13f45eef1..bcc8a15355a 100644
--- a/source/creator/creator_intern.h
+++ b/source/creator/creator_intern.h
@@ -73,7 +73,7 @@ enum {
/* for the callbacks: */
#ifndef WITH_PYTHON_MODULE
# define BLEND_VERSION_FMT "Blender %d.%02d.%d"
-# define BLEND_VERSION_ARG BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_VERSION_PATCH
+# define BLEND_VERSION_ARG (BLENDER_VERSION / 100), (BLENDER_VERSION % 100), BLENDER_VERSION_PATCH
#endif
#ifdef WITH_BUILDINFO_HEADER
diff --git a/source/tools b/source/tools
-Subproject dd131bc4f95103efa60ce11cafbf174efd7b3d4
+Subproject 42a86b05869c464c87185be378e668b4a9abec8